wiki:docs/making-rpm/other-section

Version 1 (modified by yasumichi, 11 years ago) (diff)

--

Vine Linux ドキュメント / RPM パッケージの作成方法 / スクリプト部で使用できるその他のセクション

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

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

インストール時やアンインストール時に起動するセクションとして下の表のようなセクションがあります。

セクション名 概要
%pre RPM パッケージをインストールするときパッケージの展開前に行うことを書く
%post RPM パッケージをインストールするときパッケージの展開後に行うことを書く
%preun RPM パッケージをアンインストールするとき展開ファイルの削除前に行うことを書く
%postun RPM パッケージをアンインストールするとき各ファイルを削除した後に行うことを書く

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

セクション名 概要
%triggerin あるパッケージがインストールされていた、もしくは、された時に起動するスクリプト
%triggerun あるパッケージの削除前に起動するスクリプト
%triggerpostun あるパッケージの削除後に起動するスクリプト

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

セクション名 概要
%verifyscriptRPM パッケージを検証するとき(rpm -V を実行した時)に追加して起動するスクリプト

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

%pre, %post, %preun, %postun, %triggerin, %triggerun, %triggerpostun, といったセクションを使うのは、ちょっと注意が必要です。, 詳しくは、シンボリック・リンク等を%postとかで張らないを参照してください。

インストール時やアンインストール時に起動するセクション

%pre セクション

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

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

%post セクション

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

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

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

%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とかで張らないも参照してください。

ライブラリをインストールする後に 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) としても登録されます。)

%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 を実行、# 以下はコメントなので無視します。

%preun セクション

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

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

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

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

%preun
if [ $1 = 0 ]; then
%{_syssbindir}/install-info --delete %{_infodir}/hoge.info.gz %{_infodir}/dir
fi

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

%postun セクション

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

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

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

他のパッケージがインストールされた時に起動するセクション

%triggerin セクション

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

%triggerin -- hoge
echo "hoge is installed"

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

%triggerin -- hoge > 3.0
echo "hoge is installed"

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

パッケージの検証時に起動するセクション

%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 とします。