オブジェクトクラスを使用すると、インストール時または削除時に、パッケージオブジェクトのグループに対して一連のアクションを実行できます。クラスへのオブジェクトの割り当ては、prototype ファイルで行います。すべてのパッケージオブジェクトにはクラスを指定する必要がありますが、特別なアクションを必要としないオブジェクトには、デフォルトで none クラスが使用されます。
pkginfo ファイルで定義されているインストールパラメータ CLASSES は、インストールするクラスのリストです ( none クラスを含みます)。
pkgmap ファイルで定義されていても、pkginfo ファイルのこのパラメータにリストされていないクラスに属するオブジェクトは、インストールされません。
CLASSES のリストで、インストールの順序が判定されます。none クラスがある場合は、常に最初にインストールされて、最後に削除されます。ディレクトリはほかのすべてのシステムオブジェクトに対する基礎となるサポート構造なので、すべてのディレクトリは none クラスに割り当てられるようにしてください。例外がある場合もありますが、一般的に none クラスが最も安全です。このようにすることで、ディレクトリに格納されるオブジェクトより前に、確実にディレクトリが作成されます。また、空になっていないディレクトリの削除が試みられることがありません。
次に、クラスのインストール時にシステムが実行するアクションについて説明します。アクションは、パッケージのボリュームごとに、そのボリュームのインストール時に 1 度行われます。
pkgadd コマンドは、アクションスクリプトの対象となるパス名のリストを作成します。このリストの各行には、ソースパス名とターゲットパス名がスペースで区切られて記述されています。ソースパス名は、インストールされるオブジェクトがインストールボリューム上で常駐する場所を示します。ターゲットパス名は、オブジェクトがインストールされるべきターゲットシステム上の場所を示します。リストの内容は、次の条件によって制限されます。
リストには、関連付けられたクラスに属するパス名のみが含まれます。
パッケージオブジェクトの作成が失敗すると、リストに含まれるディレクトリ、名前付きパイプ、文字デバイス、ブロックデバイス、およびシンボリックリンクには、/dev/null というソースパス名が設定されます。通常、これらのアイテムは pkgadd コマンドによって自動的に作成され (まだ存在しない場合)、pkgmap ファイルでの定義に従って適切な属性 (モード、所有者、グループ) が設定されます。
ファイルタイプが l のリンクファイルは、どのような場合にもリストには追加されません。特定のクラスのハードリンクは、以降の 4 番目のアクションで作成されます。
特定のクラスのインストールに対してクラスアクションスクリプトが提供されない場合は、生成されるリストのパス名が、ボリュームから適切なターゲットの場所にコピーされます。
クラスアクションスクリプトが存在する場合は実行されます。
クラスアクションスクリプトは、1 番目のアクションで生成されたリストを含む標準入力で呼び出されます。パッケージで最後のボリュームの場合、またはクラスで最後のオブジェクトの場合は、スクリプトは単一の引数 ENDOFCLASS を指定して実行されます。
このクラスの通常ファイルがパッケージ内に存在しない場合でも、クラスアクションスクリプトは、空のリストと ENDOFCLASS 引数で少なくとも 1 回は呼び出されます。
pkgadd コマンドがコンテンツと属性の監査を実行し、ハードリンクを作成します。
2 番目または 3 番目のアクションが正常に実行されたあと、pkgadd コマンドはパス名のリストについて内容と属性の情報を監査します。pkgadd コマンドは、クラスと関連付けられたリンクを自動的に作成します。生成されたリストのすべてのパス名について、検出された属性の不整合が修正されます。
オブジェクトはクラスごとに削除されます。パッケージに存在していても CLASSES パラメータに含まれないクラスが、最初に削除されます (たとえば、installf コマンドでインストールされたオブジェクト)。CLASSES パラメータにリストされているクラスが、逆の順序で削除されます。none クラスは、常に最後に削除されます。次に、クラスの削除時に行われるシステムのアクションについて説明します。
pkgrm コマンドが、パス名のリストを作成します。
pkgrm コマンドは、指定されたクラスに属するインストール済みのパス名のリストを作成します。別のパッケージによって参照されているパス名は、ファイルタイプが e であるものを除き、リストから除外されます。e というファイルタイプは、インストール時または削除時にファイルを編集するべきであることを意味します。
削除されるパッケージがインストール時にタイプ e のいずれかのファイルを変更していた場合は、そのときに追加した行だけを削除するようにしてください。空ではない編集可能なファイルは削除しないでください。パッケージが追加した行を削除します。
クラスアクションスクリプトが存在しない場合は、パス名が削除されます。
パッケージにクラスに対する削除クラスアクションスクリプトが存在しない場合は、pkgrm コマンドによって生成されたリストのすべてのパス名が削除されます。
ファイルタイプが e (編集可能) のファイルは、クラスおよび関連するクラスアクションスクリプトに割り当てられません。これらのファイルは、パス名がほかのパッケージと共有されている場合であっても、この時点で削除されます。
クラスアクションスクリプトが存在する場合は、実行されます。
pkgrm コマンドが、1 番目のアクションで生成されたリストを含む、スクリプトに対する標準入力でクラスアクションスクリプトを呼び出します。
pkgrm コマンドが監査を実行します。
クラスアクションスクリプトの実行に成功したあと、pkgrm コマンドは、パス名が別のパッケージによって参照されていない場合は、パッケージデータベースからパス名への参照を削除します。
クラスアクションスクリプトは、パッケージのインストールまたは削除時に実行される一連のアクションを定義しています。アクションは、クラス定義に基づいてパス名のグループに対して実行されます。クラスアクションスクリプトの例については、第 5 章パッケージ作成のケーススタディーを参照してください。
クラスアクションスクリプトの名前は、対象となるクラス、およびこれらの操作が、パッケージのインストール時や削除時に実行されるべきかどうかに基づきます。次の表では、2 種類の名前形式を示します。
名前の形式 |
説明 |
---|---|
i.class |
パッケージインストール時に、示されているクラスのパス名に対して実行されます。 |
r.class |
パッケージ削除時に、示されているクラスのパス名に対して実行されます。 |
たとえば、manpage という名前のクラスのインストールスクリプトの名前は、i.manpage となります。削除スクリプトは、r.manpage という名前になります。
このファイル名形式は、sed、awk、build の各システムクラスに属するファイルには使用されません。これらの特殊なクラスの詳細については、「特殊なシステムクラス」を参照してください。
スクリプトは、現在のボリューム上の指定されたクラスに含まれるすべてのファイルに対して実行されます。
pkgadd と pkgrm コマンドは、クラスに属する pkgmap ファイルにリストされているすべてのオブジェクトのリストを作成します。結果として、クラスアクションスクリプトは、特定のクラスに属する pkgmap で定義されているパス名に対してのみ実行できます。
クラスアクションスクリプトは、最後に実行されるときには (つまり、そのクラスに属しているクラスがそれ以上ないとき)、キーワード引数 ENDOFCLASS を指定して実行されます。
クラスアクションスクリプトの実行中は、管理者と対話することはできません。
パッケージが複数のボリュームに分かれている場合、クラスアクションスクリプトはクラスに属するファイルが 1 つでも含まれるボリュームごとに 1 回ずつ実行されます。したがって、各スクリプトは 2 回以上実行できるようになっている必要があります。つまり、あるスクリプトの実行結果は、同じ入力であれば何度実行しても同じになるということを意味します。
あるファイルがクラスアクションスクリプトを持つクラスの一部である場合、スクリプトはそのファイルをインストールする必要があります。pkgadd コマンドは、クラスアクションスクリプトが存在するファイルをインストールしませんが、インストールを検証します。
クラスアクションスクリプトでは、pkgadd コマンドで生成されるリストに出現しないパス名またはシステム属性を追加、削除、または変更してはいけません。このリストの詳細については、「パッケージインストール時のクラスの処理方法」の手順 1 を参照してください。
スクリプトで ENDOFCLASS 引数を検出した場合は、クリーンアップなどの事後処理アクションをスクリプトに組み込みます。
管理者との対話はすべて、request スクリプトに制限されます。クラスアクションスクリプトを使用して管理者から情報の取得を試みないでください。
パッケージのインストール時および削除時に sed 命令を使用してファイルを編集するための方法を提供します。
パッケージのインストール時および削除時に awk 命令を使用してファイルを編集するための方法を提供します。
Bourne シェルコマンドを使用してファイルを動的に作成または変更するための方法を提供します。
将来のパッケージのインストールによって上書きされるべきではないファイルを保持するための方法を提供します。
マニフェストに関連する SMF (サービス管理機能) サービスの自動的なインストールおよびアンインストールを提供します。パッケージ内のすべての SMF マニフェストに、manifest クラスが使用されなければなりません。
パッケージ内の複数のファイルで必要な特殊な処理が、sed、awk、または sh コマンドを使用して完全に定義できる場合は、システムクラスを使用すると、複数のクラスとそれに対応するクラスアクションスクリプトを使用するより、インストールの時間を短縮できます。
sed クラスは、ターゲットシステム上の既存オブジェクトを変更する方法を提供します。sed クラスアクションスクリプトは、sed クラスに属するファイルが存在する場合は、インストール時に自動的に実行されます。sed クラスアクションスクリプトの名前は、命令が実行される対象のファイルの名前と同じであるようにしてください。
sed クラスアクションスクリプトは、次の形式で sed 命令を提供します。
2 つのコマンドが、命令を実行する必要があるときを示します。!install コマンドに続く sed 命令は、パッケージのインストール時に実行されます。!remove コマンドに続く sed 命令は、パッケージの削除時に実行されます。ファイル内でこれらのコマンドが使用される順序は関係ありません。
sed 命令の詳細については、sed(1) のマニュアルページを参照してください。sed クラスアクションスクリプトの例については、第 5 章パッケージ作成のケーススタディーを参照してください。
awk クラスは、ターゲットシステム上の既存オブジェクトを変更する方法を提供します。変更は、awk クラスアクションスクリプト内の awk 命令として提供されます。
awk クラスアクションスクリプトは、awk クラスに属するファイルが存在する場合、インストール時に自動的に実行されます。このようなファイルには、awk クラススクリプトに対する命令が次の形式で含まれます。
2 つのコマンドが、命令を実行する必要があるときを示します。!install コマンドに続く awk 命令は、パッケージのインストール時に実行されます。!remove コマンドに続く命令は、パッケージの削除時に実行されます。これらのコマンドは、任意の順序で使用できます。
awk クラスアクションスクリプトの名前は、命令が実行される対象のファイルの名前と同じであるようにしてください。
変更対象のファイルは、awk コマンドに対する入力として使用され、スクリプトの出力は最終的に元のオブジェクトを置き換えます。この構文では、環境変数を awk コマンドに渡すことはできません。
awk 命令の詳細については、awk(1) のマニュアルページを参照してください。
build クラスは、Bourne シェルの命令を実行して、パッケージオブジェクトファイルを作成または変更します。これらの命令は、パッケージオブジェクトとして提供されます。パッケージオブジェクトが build クラスに属している場合は、インストール時に命令が自動的に実行されます。
build クラスアクションスクリプトの名前は、命令が実行される対象のファイルの名前と同じであるようにしてください。また、名前は sh コマンドで実行できる必要もあります。スクリプトの出力は、構築または変更されると新しいバージョンのファイルになります。スクリプトが出力を生成しない場合、ファイルは作成または変更されません。したがって、スクリプトはファイル自体を変更または作成できます。
たとえば、パッケージがデフォルトファイル /etc/randomtable を提供し、ファイルがターゲットシステム上にまだ存在しない場合は、prototype ファイルのエントリは次のような内容です。
e build /etc/randomtable ? ? ? |
また、パッケージオブジェクト /etc/randomtable は、次のような内容です。
!install # randomtable builder if [ -f $PKG_INSTALL_ROOT/etc/randomtable ]; then echo "/etc/randomtable is already in place."; else echo "# /etc/randomtable" > $PKG_INSTALL_ROOT/etc/randomtable echo "1121554 # first random number" >> $PKG_INSTALL_ROOT/etc/randomtable fi !remove # randomtable deconstructor if [ -f $PKG_INSTALL_ROOT/etc/randomtable ]; then # the file can be removed if it's unchanged if [ egrep "first random number" $PKG_INSTALL_ROOT/etc/randomtable ]; then rm $PKG_INSTALL_ROOT/etc/randomtable; fi fi |
build クラスを使用する別の例については、第 5 章パッケージ作成のケーススタディーを参照してください。
preserve クラスは、パッケージのインストール時に既存のファイルを上書きするべきかどうかを判定して、パッケージオブジェクトファイルを保持します。preserve クラススクリプトを使用する場合、2 つの可能なシナリオは次のとおりです。
インストールするファイルがターゲットディレクトリにまだ存在しない場合は、ファイルは正常にインストールされます。
インストールするファイルがターゲットディレクトリに存在する場合は、ファイルが存在することを示すメッセージが表示されて、ファイルはインストールされません。
どちらのシナリオの結果も、preserve スクリプトとしては成功と見なされます。失敗は、2 番目のシナリオでのみ発生し、ファイルをターゲットディレクトリにコピーできない場合です。
Solaris 7 リリース以降、i.preserve スクリプトおよびこのスクリプトのコピー i.CONFIG.prsv は、ほかのクラスアクションスクリプトとともに、/usr/sadm/install/scripts ディレクトリに置かれています。
保持するファイル名を含むには、スクリプトを変更します。
manifest クラスは、SMF マニフェストに関連する SMF (サービス管理機能) サービスを自動的にインストールおよびアンインストールします。SMF の詳細については、『Solaris のシステム管理 (基本編)』の第 16 章「サービスの管理 (概要)」で、SMF によるサービス管理の方法に関する情報を参照してください。
パッケージ内のすべてのサービスマニフェストは、クラス manifest によって識別されます。サービスマニフェストのインストールと削除を行うクラスアクションスクリプトは、パッケージ化サブシステムに含まれています。pkgadd(1M) が呼び出されると、サービスマニフェストがインポートされます。pkgrm(1M) が呼び出されると、無効になっているサービスマニフェスト内のインスタンスが削除されます。また、インスタンスが残っていないマニフェスト内のサービスもすべて削除されます。pkgadd(1M) または pkgrm(1M) に -R オプションを指定した場合、これらのサービスマニフェストアクションは、次にシステムが代替ルートパスでリブートしたときに実行されます。
次のパッケージ情報ファイルのコードの一部では、manifest クラスの使用が示されています。
# packaging files i pkginfo i copyright i depend i preinstall i postinstall i i.manifest i r.manifest # # source locations relative to the prototype file # d none var 0755 root sys d none var/svc 0755 root sys d none var/svc/manifest 0755 root sys d none var/svc/manifest/network 0755 root sys d none var/svc/manifest/network/rpc 0755 root sys f manifest var/svc/manifest/network/rpc/smserver.xml 0444 root sys