スクリプト部で使用できるその他のセクション

スクリプト部に入れることができるセクションは、セクション II.5.2 - スクリプト部で説明したほかにもいろいろあります。

表 III.11-1インストール時やアンインストール時に起動するセクション
セクション名 概要 詳細説明
%pre RPMパッケージをインストールするときパッケージの展開前に行うことを書く セクション III.11.1 - %preセクション
%post RPMパッケージをインストールするときパッケージの展開後に行うことを書く セクション III.11.2 - %postセクション
%preun RPMパッケージをアンインストールするとき展開ファイルの削除前に行うことを書く セクション III.11.3 - %preunセクション
%postun RPMパッケージをアンインストールするとき各ファイルを削除した後に行うことを書く セクション III.11.4 - %postunセクション

さらに、他のパッケージがインストールされた時に起動するスクリプトも記述できます。

表 III.11-2他のパッケージがインストールされた時に起動するセクション
セクション名 概要 詳細説明
%triggerin あるパッケージがインストールされていた、もしくは、された時に起動するスクリプト セクション III.11.5 - %triggerinセクション
%triggerun あるパッケージの削除前に起動するスクリプト セクション III.11.5 - %triggerinセクション参照
%triggerpostun あるパッケージの削除後に起動するスクリプト セクション III.11.5 - %triggerinセクション参照

パッケージが正しくインストールされているかを検証するには、rpm コマンドで -V オプションを用いますが、-V オプションでできることを増やすためのセクションもあります。

表 III.11-3パッケージの検証時に起動するセクション
セクション名 概要 詳細説明
%verifyscript RPMパッケージを検証するとき(rpm -Vを実行した時)に追加して起動するスクリプト セクション III.11.6 - %verifyscriptセクション

この章で説明するセクションは、SPECファイルからRPMパッケージを作るときには、実行されることはありません。

%pre %post %preun %postun %triggerin %triggerun %triggerpostun といったセクションを使うのは、ちょっと注意が必要です。 詳しくは、付録 A - RPMパッケージをつくるときの注意を参照してください。

III.11.1. %preセクション

RPMパッケージをインストールするとき、パッケージの展開前に行うことを書く。 -pオプションについては%postの場合(以下)参照。

ここでの処理で必要となるパッケージ等は、Requires(pre): で指定します。

III.11.2. %postセクション

RPMパッケージをインストールするとき、パッケージの展開後に行うことを書く。

ここでの処理で必要となるパッケージ等は、Requires(post): で指定します。

例 III.11-1%postセクションを利用してinfoファイルをインストールする例

%post
if [ "$1" = 0 ] ; then
%{_syssbindir}/install-info %{_infodir}/hoge.info.gz %{_infodir}/dir
fi
として、info のメニューエントリに infoファイルを追加します。 if [ $1 = 0 ]; then と fi の行は、 アップグレード時には実行せず、インストール時だけに実行させるための記述です。 セクション A.1 - シンボリック・リンク等を%postとかで張らないも参照してください。

%{_syssbindir}/install-info というコマンドが必要になるので、 Requires(post): %{_syssbindir}/install-info とします。

info ファイルは、アンインストール時にも処理が必要になります。 セクション III.11.3 - %preunセクション も参照してください。

例 III.11-2ライブラリをインストールする後にldconfigを実行する例

%post
%{_syssbindir}/ldconfig
とすると、ldconfigが実行される。また、代わりに
%post -p %{_syssbindir}/ldconfig
と、-pオプションを用いて書くと、 シェルを起動すること無く直接コマンドが実行される。 またこのコマンドはrpmパッケージのインストール時に必要なコマンドとして、 Requires(interp): %{_syssbindir}/install-info として登録される。

正確にいうと、タグに -pオプションをつけた場合は、 /bin/sh ではなく別のプログラムでスクリプト部分を解釈(interpret)させるということになります。 この場合には Requires(interp) として登録されます。(%postなので Requires(post) としても登録されます。)

例 III.11-3%postセクションで-pオプションを使用して問題が起こる例

%post -p %{_syssbindir}/ldconfig
# update ld.so.cache

%files
この場合は %post と %files の間の2行が、スクリプト部分になります。 一行目に
# update ld.so.cache
と書いてあります。 bash であれば、# で始まる行は コメントと解釈され無視されますが、 このスクリプト部分を読み、実行するのは /bin/sh ではなく %{_syssbindir}/ldconfig です。 ldconfig には # 以降をコメントとして無視するというルールは無いので、 そのまま実行しようとしてエラーになります。

エラーを起こさないようにするには

%post -p %{_syssbindir}/ldconfig


%files
とするか、
%post
%{_syssbindir}/ldconfig
# update ld.so.cache

%files
とします。

一つ目の例では、%{_syssbindir}/ldconfig がスクリプト部分を実行するために起動し(、起動した時点で ld.so.cache が更新されますが)、スクリプト部分については何も書かれていないので何もせずに終了します。

二つ目の例では、/bin/sh が起動し、スクリプト部分を解釈し %{_syssbindir}/ldconfig を実行、# 以下はコメントなので無視します。

III.11.3. %preunセクション

RPMパッケージをアンインストールするとき、展開ファイルの削除前に行うことを書く。

ここでの処理で必要となるパッケージ等は、Requires(preun): で指定します。

-pオプションについては%postの場合と同様です。Requires(interp): と Requires(preun): に登録されます。

例 III.11-4%preunセクションを利用してinfoファイルをアンインストールする例

%preun
if [ $1 = 0 ]; then
%{_syssbindir}/install-info --delete %{_infodir}/hoge.info.gz %{_infodir}/dir
fi
として、info のメニューエントリから削除します。 if [ $1 = 0 ]; then と fi の行は、 アップグレード時には実行せず、アンインストール時だけに実行させるための記述です。 セクション A.1 - シンボリック・リンク等を%postとかで張らないも参照してください。

III.11.4. %postunセクション

RPMパッケージをアンインストールするとき、各ファイルを削除した後に行うことを書く。

ここでの処理で必要となるパッケージ等は、Requires(postun): で指定します。

-pオプションについては%postの場合と同様です。Requires(interp): と Requires(postun): に登録されます。

III.11.5. %triggerinセクション

あるパッケージがインストールされていた、もしくは、された時に起動するスクリプトを書く。

例 III.11-5%triggerinセクションの使用例

%triggerin -- hoge
echo "hoge is installed"
と書いておくと、パッケージhogeをインストールしたときに、 上記メッセージが表示されます。以下のように、バージョン指定もできます。
%triggerin -- hoge > 3.0
echo "hoge is installed"

同様にして、あるパッケージの削除前に実行される%triggerun、 あるパッケージの削除後に実行される%triggerpostunがあります。このセクションについては、 /usr/share/doc/rpm-<version>/triggers に詳しい説明があります。

III.11.6. %verifyscriptセクション

RPMパッケージを検証するとき(rpm -Vを実行した時)に、追加して実行することを書く。

ここでの処理で必要となるパッケージ等は、Requires(verify): で指定します。

-pオプションについては%postの場合と同様です。Requires(interp): と Requires(verify): に登録されます。

このスクリプトの実行結果は、成功した場合には何も表示されず、エラーが発生したときにエラーメッセージのみが標準出力に出力されます。rpm -Vvv などのようにした場合には、標準出力への出力も確認できます。

たとえば、%pre で %{_sbindir}/useradd hoge などとしてユーザーを登録した場合には、

%verifyscript
%{_bindir}/id hoge
としておくと、hoge というユーザーが存在しているかどうかを確認することができます。

この場合、/usr/bin/id というコマンドは coreutils というパッケージに含まれているので、 Requires(verify): %{_bindir}/id あるいは、Requires(verify): coreutils とします。