次のような特性を持つ、特定のアプリケーションの複数の実装を配布することが必要な場合があります。
すべて実装がイメージ内で使用できます。
検出しやすいように、/usr/bin などの共通ディレクトリからいずれかの実装が使用可能です。
管理者は、パッケージの追加や削除を行わずに、共通ディレクトリから使用可能な実装を容易に変更できます。
Oracle Solaris 11 には、Java や Python など各種アプリケーションの複数の実装が用意されています。/usr/bin などの共通ディレクトリから使用可能な実装を指定し、管理者がその選択を容易に変更できるようにするには、調停されたリンクを使用します。
調停されたリンクは、アプリケーションの複数の実装を 1 つのイメージで管理します。調停されたリンクは、mediator 属性が設定されたシンボリックリンクです (調停されたリンクの属性を参照)。mediator 属性を持つ link アクションでパッケージ化されたソフトウェアは、調停の参加要素です。/usr/bin などの共通ディレクトリから使用可能な調停参加要素は、優先バージョンと呼ばれます。調停の優先バージョンは、次のいずれかの方法で決定します。
調停の参加要素ごとに、バージョン (mediator-version) またはバージョン管理された実装 (mediator-implementation) を指定できます。競合が発生する場合に備えてオーバーライド優先度 (mediator-priority) を指定できます。
調停の参加要素に優先度が指定されている場合、優先度がもっとも高い参加要素が優先実装として選択されます。
優先度が指定されている調停の参加要素が存在せず、参加要素にバージョンが指定されている場合は、もっとも高い値のバージョンが指定されている参加要素が優先実装として選択されます。
調停の参加要素に優先度もバージョンも指定されていない場合、任意の参加要素が優先実装として選択されます。選択されている参加要素の mediator-implementation にバージョン文字列が含まれている場合、その mediator-implementation にもっとも高い値のバージョン文字列が指定されている参加要素が優先実装となります。
管理者は pkg set-mediator コマンドを使用して優先実装を設定できます。Oracle Solaris 11.3 ソフトウェアの追加と更新 の デフォルトのアプリケーション実装の指定を参照してください。
特定の調停のインスタンスが 1 つだけイメージにインストールされる場合、そのインスタンスはその調停の優先実装として自動的に選択されます。パッケージのインストール後に優先実装がシステム管理者により設定される場合、この同じ調停に追加の参加要素をインストールしても、管理者によって設定された優先実装は変更されません。
次の属性を link アクションで設定すると、調停されたリンクの配布方法を制御できます。
特定の調停グループに参加しているすべてのパス名で共有されている調停名前空間内のエントリを指定します。例としては、java、python、および ruby などがあります。
mediator 属性を持つすべてのリンクには、mediator-version 属性または mediator-implementation 属性も必要です。特定のパス名に対する仲介リンクはすべて、同じ mediator を指定する必要があります。ただし、すべてのメディエータバージョンおよび実装が、特定のパスでリンクを提供する必要はありません。調停参加要素がリンクを提供しない場合、その参加要素が優先実装として選択されるとそのリンクが削除されます。
mediator 属性によって記述されるインタフェースのバージョンを指定します。この属性は、mediator が指定され、mediator-implementation が指定されていない場合に必要です。mediator-version の値は、整数のドットで区切られた並びです。操作を容易にするため、指定する値は、そのリンクを配布するパッケージのバージョンに一致している必要があります。たとえば runtime/ruby-19 パッケージは mediator-version=1.9 を指定する必要があります。バージョン値を適切に設定することで、管理者は調停に参加しているソフトウェア、そのソフトウェアを配布するパッケージ、および優先バージョンとして現在設定されているソフトウェアのバージョンを判別できます。mediator-priority が設定されている調停の参加要素がない場合、IPS は、mediator-version の値がもっとも高い調停参加要素を優先実装として選択します。
mediator 属性によって記述されるインタフェースの実装を指定します。この属性は、mediator が指定され、mediator-version は指定されていない場合に必要です。実装の文字列は順序付けられているとはみなされません。mediator-version または mediator-priority 属性が設定されている調停の参加要素がない場合、IPS によって優先実装として任意の実装が選択されます。
mediator-implementation の値は、英数字と空白で構成された任意の長さの文字列にすることができます。実装自体をバージョン管理できる合は、文字列の最後の記号 (@) のあとにバージョンを指定します。このバージョンは、整数のドットで区切られた並びです。実装のバージョンが複数存在する場合は、最上位バージョンの実装が選択されます。たとえば値が 4DB@12 の mediator-implementation は、値が 4DB@11 の mediator-implementation よりも優先して選択されます。
mediator 属性によって記述されるインタフェースの優先度を指定します。mediator-version または mediator-implementation も指定する必要があります。たとえば、調停の 1 つの参加要素の mediator-version に値 1.6 が設定されており、別の参加要素の mediator-version に値 1.7 が設定されている場合、mediator-version の値が 1.6 の参加要素を優先実装として指定するには、mediator-priority 属性を割り当てます。
mediator-priority 属性は、次のいずれかの値を持ちます。
このリンクは、mediator-priority が指定されていないリンクより優先されます。
このリンクは、mediator-priority が指定されていないリンクと、mediator-priority の値が vendor であるリンクよりも優先されます。
次のコマンドは、現在選択されている Python、Ruby、および Secure Shell の優先実装を表示します。
$ pkg mediator python ruby ssh MEDIATOR VER. SRC. VERSION IMPL. SRC. IMPLEMENTATION python vendor 2.6 vendor ruby system 1.9 system ssh vendor vendor sunssh
次のコマンドは、各調停の参加要素をすべて表示します。
$ pkg mediator -a python ruby ssh MEDIATOR VER. SRC. VERSION IMPL. SRC. IMPLEMENTATION python vendor 2.6 vendor python system 2.7 system ruby system 1.9 system ruby system 1.8 system ssh vendor vendor sunssh
下位バージョンがシステムにより優先 Python 実装として選択されていますが、これは、VER. SRC. および IMPL. SRC. と次のコマンドによって示されるように、このバージョンには mediator-priority が指定されているためです。
$ pkg contents -Ho action.raw -t link -a path=usr/bin/python 'runtime/python*' link mediator=python mediator-version=2.7 path=usr/bin/python pkg.linted.pkglint .dupaction010.2=true target=python2.7 link mediator=python mediator-priority=vendor mediator-version=2.6 path=usr/bin/ python target=python2.6
-a オプションの引数として mediator=python を指定すると、出力では python 調停にさらに多くのリンクが表示されます。調停に必要なすべてのパスを含めることを忘れないでください。
$ pkg contents -Ho action.raw -t link -a mediator=python runtime/python-26 link mediator=python mediator-priority=vendor mediator-version=2.6 path=usr/bin/ 2to3 target=2to3-2.6 link mediator=python mediator-priority=vendor mediator-version=2.6 path=usr/bin/ python target=python2.6 link mediator=python mediator-priority=vendor mediator-version=2.6 path=usr/bin/ pydoc target=pydoc-2.6 link mediator=python mediator-priority=vendor mediator-version=2.6 path=usr/bin/ idle target=idle-2.6 link mediator=python mediator-priority=vendor mediator-version=2.6 path=usr/bin/ python-config target=python2.6-config link mediator=python mediator-priority=vendor mediator-version=2.6 path=usr/bin/ amd64/python target=python2.6 variant.arch=i386 link mediator=python mediator-priority=vendor mediator-version=2.6 path=usr/bin/ amd64/python-config target=python2.6-config variant.arch=i386 link facet.doc.man=all mediator=python mediator-priority=vendor mediator-version =2.6 path=usr/share/man/man1/python.1 target=python2.6.1
runtime/python-27 パッケージ内の調停されたリンク usr/bin/python の pkg.linted.pkglint.dupaction010.2=true 属性は、/usr/bin/python リンクが複数のパッケージによって配布されており、有効な調停されたリンクであることを示します。調停されたリンクは、アクションを配布できるのは 1 つのパッケージだけであるという規則の例外です。pkglint ユーティリティーが、重複するアクションの有無を確認します。pkg.linted.check.id を true に設定すると、そのアクションの check.id の確認が省略されます。パッケージを検証するおよびpkglint(1) のマニュアルページを参照してください。pkglint が実行するチェックの完全なリストを表示するには、pkglint -L コマンドを使用します。pkglint.dupaction010 チェックの説明は「調停されたリンクは有効である」です。
システムにより、上位バージョンが優先 Ruby 実装として選択されます。
$ pkg contents -Ho action.raw -t link -a path=usr/bin/ruby runtime/ruby-19 link mediator=ruby mediator-version=1.9 path=usr/bin/ruby pkg.linted.pkglint.dup action010.2=true target=./ruby19
ssh 調停の参加要素は 1 つだけです。追加のアプリケーション実装を配布することを予定している場合は、ほかの実装が配布される場合に元のパッケージが調停の参加要素となるように、元のパッケージで調停を定義します。このようにしないと、元のパッケージに対する更新を配布する必要が生じます。更新を配布しないと、ユーザーが元の実装を優先実装として選択できなくなります。
次のコマンドは、リンクアクションのほかに、このアクションが定義されているパッケージの名前も表示します。
$ pkg contents -o pkg.name,action.raw -t link -a path=usr/bin/ssh '*' PKG.NAME ACTION.RAW network/ssh link mediator=ssh mediator-implementation=sunssh mediator-priority= vendor path=usr/bin/ssh target=../lib/sunssh/bin/ssh
mediator-implementation を指定する調停されたリンクは、mediator-version、mediator-priority、またはこの両方も指定できます。調停のすべての参加要素が mediator-implementation だけを指定している場合、システムは優先実装を任意に選択します。選択された mediator-implementation がバージョン管理されている場合、次のコマンドに示すように最上位バージョンが選択されます。
$ pkg mediator -a myapp MEDIATOR VER. SRC. VERSION IMPL. SRC. IMPLEMENTATION myapp system system db@12 myapp system system db@11 myapp system system db $ pkg mediator myapp MEDIATOR VER. SRC. VERSION IMPL. SRC. IMPLEMENTATION myapp system system db@12
調停に別の実装が追加されると、次のコマンドにより示されるように、システムによってその実装が選択されることがあります。
$ pkg mediator -a myapp MEDIATOR VER. SRC. VERSION IMPL. SRC. IMPLEMENTATION myapp system system aa myapp system system db@12 myapp system system db@11 myapp system system db $ pkg mediator myapp MEDIATOR VER. SRC. VERSION IMPL. SRC. IMPLEMENTATION myapp system system aa
同じパスを、あるパッケージではリンクとして配布し、別のパッケージではディレクトリまたはファイルとして配布することはしないでください。一般に、同じパスを 2 回以上配布しないでください。同じリンクパスを 2 回以上配布する場合は、各インスタンスで異なるターゲットが指定され、各インスタンスが同じ調停に参加しているようにします。
調停に必要なすべてのパスを含めることを忘れないでください。ライブラリ、構成ファイル、マニュアルページ、およびその他のファイルシステムオブジェクトは、実装によって異なる可能性があります。
追加のアプリケーション実装を配布することを予定している場合は、ほかの実装が配布される場合に元のパッケージが調停の参加要素となるように、元のパッケージで調停を定義します。このようにしないと、元のパッケージに対する更新を配布する必要が生じます。更新を配布しないと、ユーザーが元の実装を優先実装として選択できなくなります。
調停に参加しているソフトウェアに対し、ほかのソフトウェアが依存関係を持つ場合、およびそのソフトウェアのいずれかのバージョンが依存関係を満たす場合は、require-any 依存関係を使用します。require-any 依存関係については、依存アクションを参照してください。
操作しやすいように、mediator-version には、リンクを配布するパッケージのバージョンと一致する値を指定してください。バージョン値を適切に設定することで、管理者は調停に参加しているソフトウェア、そのソフトウェアを配布するパッケージ、および優先バージョンとして現在設定されているソフトウェアのバージョンを判別できます。