玩式草子─ソフトウェアとたわむれる日々

第42回 Plamo Linuxのビルドスクリプトとパッケージ管理ツール[その4]

この記事を読むのに必要な時間:およそ 4.5 分

makepkgとinitpkg

initpkgの処理は,パッケージ作成時にinstallディレクトリに用意するdoinst.shに直接書き込んでしまってもいいのですが,その際は処理の部分を"#%% begin"と"#%% end"で括る必要があります。

多数のビルドスクリプトを作っていると,ついこの手の指定は忘れがちになるので,最近のmakepkgコマンドではinstallディレクトリにinitpkgというファイルがあれば,自動的にそれを"#%% begin"と"#%% end"で括って,doinst.shに取り込むような処理を追加しています。この機能を使えば,ビルドスクリプトはinstall/initpkgというファイルに初期化時に行いたい処理を書き込むだけで済みます。たとえばgtk+_2のビルドスクリプトは,このような形でinitpkgを作っています。

195 ######################################################################
196 # * make install でコピーされないファイルがある場合はここに記述します。
197 ######################################################################
198   mkdir -p $docdir/$src
199   mkdir -p $P/install
200   cat <<"EOF" > $P/install/initpkg
201 gtk-query-immodules-2.0 > /etc/gtk-2.0/gtk.immodules
202 EOF

最終的にはマージされてinstall/doinst.shというファイルの一部になるものの,独立したinstall/initpkgを使えば,シンボリックリンクの再生成処理とパッケージの初期化処理を区別しやすくなるので,ビルドスクリプトのミスなどもチェックしやすくなります。

initpkgを導入する以前は,この手の初期化処理が必要なパッケージの場合,install/doinst.shの中で直接インストール先の環境にchrootして処理を行うような記述をしていました。そのためには,初期化に使うコマンドに必要なライブラリなどを事前に揃えておく必要があり,01_...や02_...といったプレフィックスをパッケージ名に付けて,インストールの順番を制御したりしていました。initpkgを使うことでそのような小細工は不要になり,ビルドスクリプトも初期化処理の部分を明示できるようになりました。

このように紹介するとinitpkgはずいぶん複雑な処理をしているように聞こえそうですが,実際は,/sbin/installpkgではsedでdoinst.shからinitpkgの部分を切り出し/etc/rc.d/rc.initpkgでは/var/log/initpkg/にファイルがあれば実行する/sbin/makepkgではinstall/initpkgをdoinst.shに取り込むといった単純な処理を組み合わせているに過ぎません。

自分のニーズを自力で解決できるのがOSSの魅力のひとつです。initpkgのように,パッケージ管理上の問題が,簡単,かつシンプルな形で解決できた時は,難しいパズルが解けたような爽快感を感じます。筆者にとっては,この感覚がOSSを使い続ける原動力になっているようです。

パッケージ管理の裏技

さて,今回でビルドスクリプトとパッケージ管理ツールに関する一連の話題は終了するので,最後に少し裏技的な機能を紹介しておきましょう。

Plamo Linuxの場合,紹介してきたように,パッケージの有無は/var/log/packages/にあるインストール済みパッケージのベース名でチェックしています。そのため,このファイルを別の名前に変えれば,インストール済みのパッケージを削除しなくても,同名のパッケージをインストールすることが可能です。

たとえばカーネルパッケージの場合,パッケージ名はkernel-3.7.1_plamo64-x86_64-P1.txzなので,/var/log/packages/kernelがインストール済みのパッケージ名になります。これを別の名前に変えてやると,このパッケージからインストールしたカーネルやモジュールを削除しなくても,異なるバージョンのカーネルやモジュールをインストールすることができます。

手元では,Plamo-5.0デフォルトの3.7.1カーネルはサスペンド回りが不安定な気がしたので,ほぼ同じ設定で3.6.11カーネルをパッケージ化して,比べてみることにしました。カーネルを更新する際,単純にupdatepkgでパッケージを更新すると,インストール済みのパッケージは削除されてしまうので両者の比較ができません。そこで/var/log/packages/kernelを/var/log/packages/kernel_3.7.1にリネームして,2つのカーネルを同時に使えるようにしてみました。

# mv /var/log/packages/kernel{,_3.7.1}
# installpkg kernel-3.6.11_plamo64-x86_64-P1.txz
...
# ls /boot
System.map@                config@                diag1.img  inside.bmp    vmlinuz@
System.map-3.6.11-plamo64  config-3.6.11-plamo64  diag2.img  onlyblue.bmp  vmlinuz-3.6.11-plamo64
System.map-3.7.1-plamo64   config-3.7.1-plamo64   grub/      tuxlogo.bmp   vmlinuz-3.7.1-plamo64
# ls /lib/modules/
3.6.11-plamo64/  3.7.1-plamo64/  fglrx/

こうしておいて,/boot/grub/grub.cfgに3.6.11カーネル用のエントリを追加すれば,2種のカーネルを必要に応じて切り替えることができます。

カーネルとそのモジュールは,カーネルのソースコードからmake modules_install等で直接インストールすることも可能です。しかし,make install等で直接インストールしてしまうと,不要になった際のアンインストール作業に苦労することがよくあります。それに対し,パッケージ化してからインストールすれば,アンインストールはremovepkgコマンドだけで済みます。

この裏技は,インストールするファイルがバージョン番号等で区別されていないと使えないので,利用する機会は多くないものの,古いバージョンの共有ライブラリを残しつつ,新しい共有ライブラリもインストールしたい,といった際にも応用できるでしょう。

Plamo Linuxのパッケージ管理は,専用のデータベースなどは使わず,平文のテキストファイルを組み合わせて実現した,よく言えば必要最低限でシンプル,悪く言えば低機能でルーズな仕組みになっています。面白い使い方を見つけた人は,ぜひ紹介してください。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html