Vine Linux ドキュメント / RPM パッケージの作成方法 / スクリプト部で使用できるその他のセクション
スクリプト部に入れることができるセクションは、スクリプト部で説明したほかにもいろいろあります。
インストール時やアンインストール時に起動するセクションとして下の表のようなセクションがあります。
セクション名 | 概要 |
---|---|
%pre | RPM パッケージをインストールするときパッケージの展開前に行うことを書く |
%post | RPM パッケージをインストールするときパッケージの展開後に行うことを書く |
%preun | RPM パッケージをアンインストールするとき展開ファイルの削除前に行うことを書く |
%postun | RPM パッケージをアンインストールするとき各ファイルを削除した後に行うことを書く |
さらに、他のパッケージがインストールされた時に起動するスクリプトも記述できます。
セクション名 | 概要 |
---|---|
%triggerin | あるパッケージがインストールされていた、もしくは、された時に起動するスクリプト |
%triggerun | あるパッケージの削除前に起動するスクリプト |
%triggerpostun | あるパッケージの削除後に起動するスクリプト |
パッケージが正しくインストールされているかを検証するには、rpm コマンドで -V オプションを用いますが、-V オプションでできることを増やすためのセクションもあります。
セクション名 | 概要 |
---|---|
%verifyscript | RPM パッケージを検証するとき(rpm -V を実行した時)に追加して起動するスクリプト |
この章で説明するセクションは、SPEC ファイルから RPM パッケージを作るときには、実行されることはありません。
%pre, %post, %preun, %postun, %triggerin, %triggerun, %triggerpostun, といったセクションを使うのは、ちょっと注意が必要です。, 詳しくは、シンボリック・リンク等を%postとかで張らないを参照してください。
RPM パッケージをインストールするとき、パッケージの展開前に行うことを書く。 -pオプションについては%postの場合(以下)参照。
ここでの処理で必要となるパッケージ等は、Requires(pre): で指定します。
RPM パッケージをインストールするとき、パッケージの展開後に行うことを書く。
ここでの処理で必要となるパッケージ等は、Requires(post): で指定します。
%post if [ "$1" = 0 ] ; then %{_syssbindir}/install-info %{_infodir}/hoge.info.gz %{_infodir}/dir fi
として、info のメニューエントリに infoファイルを追加します。 if [ $1 = 0 ]; then と fi の行は、 アップグレード時には実行せず、インストール時だけに実行させるための記述です。シンボリック・リンク等を%postとかで張らないも参照してください。
%{_syssbindir}/install-info というコマンドが必要になるので、 Requires(post): %{_syssbindir}/install-info とします。
info ファイルは、アンインストール時にも処理が必要になります。シンボリック・リンク等を%postとかで張らないも参照してください。
%post %{_syssbindir}/ldconfig
とすると、ldconfigが実行される。また、代わりに
%post -p %{_syssbindir}/ldconfig
と、-pオプションを用いて書くと、 シェルを起動すること無く直接コマンドが実行される。 またこのコマンドはrpmパッケージのインストール時に必要なコマンドとして、 Requires(interp): %{_syssbindir}/install-info として登録される。
正確にいうと、タグに -pオプションをつけた場合は、 /bin/sh ではなく別のプログラムでスクリプト部分を解釈(interpret)させるということになります。 この場合には Requires(interp) として登録されます。(%postなので Requires(post) としても登録されます。)
%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 を実行、# 以下はコメントなので無視します。
RPM パッケージをアンインストールするとき、展開ファイルの削除前に行うことを書く。
ここでの処理で必要となるパッケージ等は、Requires(preun): で指定します。
-pオプションについては%postの場合と同様です。Requires(interp): と Requires(preun): に登録されます。
%preun if [ $1 = 0 ]; then %{_syssbindir}/install-info --delete %{_infodir}/hoge.info.gz %{_infodir}/dir fi
として、info のメニューエントリから削除します。 if [ $1 = 0 ]; then と fi の行は、 アップグレード時には実行せず、アンインストール時だけに実行させるための記述です。シンボリック・リンク等を%postとかで張らないも参照してください。
RPM パッケージをアンインストールするとき、各ファイルを削除した後に行うことを書く。
ここでの処理で必要となるパッケージ等は、Requires(postun): で指定します。
-pオプションについては%postの場合と同様です。Requires(interp): と Requires(postun): に登録されます。
あるパッケージがインストールされていた、もしくは、された時に起動するスクリプトを書く。
%triggerin -- hoge echo "hoge is installed"
と書いておくと、パッケージhogeをインストールしたときに、 上記メッセージが表示されます。以下のように、バージョン指定もできます。
%triggerin -- hoge > 3.0 echo "hoge is installed"
同様にして、あるパッケージの削除前に実行される %triggerun、あるパッケージの削除後に実行される %triggerpostun があります。このセクションについては、 /usr/share/doc/rpm-<version>/triggers に詳しい説明があります。
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 とします。