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

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

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

前回まで2回に渡ってPlamo Linuxのビルドスクリプトの内部構造を紹介しました。今回は,このビルドスクリプトによって作成されるPlamo Linux用のパッケージと,そのパッケージを操作するパッケージ管理ツールについて紹介しましょう。

Plamo Linuxのパッケージ

Plamo Linuxのパッケージは,インストールしたいファイル類をルートディレクトリからの相対位置に配置した状態を作り,それらをtarコマンドで1つのアーカイブにまとめてgzipxzで圧縮しただけのシンプルな形式になっています。

この形式は,アーカイバであるtarとgzipやxzのような圧縮ツールのみで操作できるため,Slackware Linuxに代表される最初期のLinuxディストリビューションでは広く使われていました。

その後,Linuxが一般ユーザに広まるにつれ,ライブラリの依存関係の管理など,パッケージ管理に高度で複雑な機能が求められるようになり,専用ツールが必要なrpmやdebといったパッケージ形式が主流になっていきました。

Plamo Linuxでは,gzipで圧縮した場合の拡張子をtgz,xzで圧縮した場合の拡張子をtxzとしており,両者を合わせてtgz/txz形式と呼んでいます。これらは「パッケージ」とは呼んでいるものの,実質はtarアーカイブを圧縮したファイルに過ぎないので,圧縮したtar形式を認識できるless等を使えば,直接中身を見ることができます。

$ less zlib-1.2.6-x86_64-P1.txz 
drwxr-xr-x root/root         0 2012-02-03 23:53:46 usr/
drwxr-xr-x root/root         0 2012-02-03 23:53:46 usr/lib64/
drwxr-xr-x root/root         0 2012-02-03 23:53:46 usr/lib64/pkgconfig/
-rw-r--r-- root/root       244 2012-02-03 23:53:46 usr/lib64/pkgconfig/zlib.pc
-rw-r--r-- root/root    125154 2012-02-03 23:53:46 usr/lib64/libz.a
-rwxr-xr-x root/root     97292 2012-02-03 23:53:46 usr/lib64/libz.so.1.2.6
drwxr-xr-x root/root         0 2012-02-03 23:53:46 usr/share/
drwxr-xr-x root/root         0 2012-02-03 23:53:46 usr/share/man/
drwxr-xr-x root/root         0 2012-02-03 23:53:46 usr/share/man/man3/
-rw-r--r-- root/root      1984 2012-02-03 23:53:46 usr/share/man/man3/zlib.3.gz
drwxr-xr-x root/root         0 2012-02-03 23:53:46 usr/share/doc/
drwxr-xr-x root/root         0 2012-02-03 23:50:20 usr/share/doc/zlib-1.2.6/
-rw-r--r-- root/root     25109 2012-01-30 03:13:15 usr/share/doc/zlib-1.2.6/ChangeLog.gz
-rw-r--r-- root/root      2474 2012-01-17 09:44:29 usr/share/doc/zlib-1.2.6/README.gz
-rwxr-xr-x root/root      2913 2012-02-03 23:53:46 usr/share/doc/zlib-1.2.6/PlamoBuild.zlib-1.2.6.gz
drwxr-xr-x root/root         0 2012-02-03 23:53:46 usr/include/
-rw-r--r-- root/root     86076 2012-02-03 23:53:46 usr/include/zlib.h
-rw-r--r-- root/root     14351 2012-02-03 23:53:46 usr/include/zconf.h
drwxr-xr-x root/root         0 2012-02-03 23:53:46 install/
-rw-r--r-- root/root       168 2012-02-03 23:53:46 install/doinst.sh

また,txzの拡張子をtar+xzだと認識するためのパッチをあてたEmacsならば,Emacsのdired機能を用いて,パッケージ内部のファイルを直接開くことも可能です。

図1 Emacs-24.2からパッケージ内のファイルを開く

図1 Emacs-24.2からパッケージ内のファイルを開く

txzの拡張子をtar + xzだと認識するためのパッチは,Plamo-5.0用のemacs-24.2に適用しています。

このようにしてPlamo Linuxのパッケージをあれこれ眺めていると,複数のパッケージにinstall/doinst.shというファイルがあることに気づくでしょう。前述のように,Plamo Linuxのパッケージはインストールしたいファイルをtarで固めただけの単純な構造なので,同じ名前のファイルが複数のパッケージにあると,後からインストールしたパッケージが上書きしてしまうはずですし,そもそもinstall/doinst.shなんてファイルはソフトウェアをmake installした際には存在しなかったファイルです。

実はこのinstall/doinst.shというファイルは,Plamo Linuxのパッケージをインストールする際に,tarを使ってアーカイブを展開する以外の処理が必要な場合,その処理を記述するために用意されています。

このinstall/doinst.shは,パッケージを展開後にシェルによって実行されます。図1のEmacsの上のウィンドウに表示しているファイルが,"sysfsutils-2.1.0-x86_64-P2.txz"パッケージに含まれているinstall/doinst.shファイルで,この例では,libsysfs.so.2.0.1からlibsysfs.so.2とlibsysfs.soへのシンボリックリンクを作成する処理を行なっています。

実のところ,install/doinst.shファイルで行う処理は,9割以上,パッケージに含まれているシンボリックリンクの再作成です。

tarアーカイブの中にシンボリックリンクが含まれていると,展開する際に展開先のファイルを書き替えてしまったり,指定したディレクトリの外部にファイルを書き出してしまう場合があります。そのため,tarの実装によっては,明示的に指定しない限りシンボリックリンクをアーカイブに含めなかったり,アーカイブ中のシンボリックリンクは展開しないようになっていることがあります。

そのためtgz/txz形式では,シンボリックリンクを含むパッケージでは,安全のためにシンボリックリンクは後から張り直すことにしています。この処理は,パッケージを作成するmakepkgコマンドが担当しており,パッケージとしてまとめるディレクトリ階層内にシンボリックリンクがあれば,いったんそれを削除して,install/doinst.sh内で再作成するようになっています。

このあたりのtarの動作については「標準」仕様は無いようで,最近のGNU tarでは,tarアーカイブの中のファイルやシンボリックリンクと同名のファイルが展開先のディレクトリにあった場合,まず展開先のディレクトリにある同名のファイルを削除してからシンボリックリンクを展開する,というのがデフォルトの動作になっています。

install/doinst.shには,シンボリックリンクを再作成する以外に,"initpkg"と呼ばれるもうひとつ重要な機能がありますが, それについては回を改めて紹介しましょう。

著者プロフィール

こじまみつひろ

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

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

コメント

コメントの記入