ソースコード・リテラシーのススメ

第17回 バイナリパッケージを読む

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

cpioというのはar/tarと同等の機能を提供する書庫作成ソフトウェアです。現在ではar/tarもcpioもGNUプロジェクトが公開しているバージョンが広く用いられていますが,歴史的に見るとar/tarはBSD UNIXの世界でよく用いられ,cpioはSysV UNIXの世界でよく用いられていたという違いがあるようです。

機能的にはar/tarもcpioもそれほど大きな違いはありませんが,データの格納方式としてar/tarは書庫の先頭部分に管理情報をまとめて配置するのに対して,cpioではファイルごとに管理情報を分散配置するため,書庫ファイルが途中で壊れた場合はcpioの方が被害は少なくて済む,と言われています。もっとも,壊れていても何とかデータを取り出さねばならないバックアップとは異なり,インストール用のパッケージはたとえ一部でも壊れていれば使いものにならないので,両形式の差は無いといっても過言ではないでしょう。

なお,最近では起動時に使うinitrd(厳密にはinitramfs)にcpio形式が採用されているので,initrdを作成する際にもcpioの世話になります。

rpmパッケージではインストールするファイルやディレクトリこそcpio形式で収められていますが,パッケージの先頭部分には管理情報などがバイナリデータで記録されているため,通常のcpioコマンドでは読み書きすることはできず,パッケージの操作には専用のコマンドrpmが必要になります。

rpmコマンドは,パッケージ先頭部分の管理情報をBerkeley DBを用いたデータベースに記録し,依存関係のチェックやアンインストール処理を高速化しています。

もっとも,パッケージの先頭部分にある管理情報を取り除いてしまえば,残りはcpio形式の書庫ファイルなので,rpmコマンドが無くても操作することはできます。rpmパッケージの先頭部分の管理情報を取り除くにはrpm2cpioというコマンドを用います。rpm2cpioはPerlで書かれたスクリプトなので,rpmの無い環境でも利用可能です。

たとえば,以下のコマンドはrpm形式で配布されているOpenOffice.orgのパッケージを,rpmコマンドを使わずに展開した例です。

# rpm2cpio ../openoffice.org-base-2.4.1-9310.i586.rpm | cpio -ivd
CPIO archive found!
opt/openoffice.org2.4
opt/openoffice.org2.4/help
opt/openoffice.org2.4/help/ja
 ..

opt/openoffice.org2.4/share/xdg
opt/openoffice.org2.4/share/xdg/base.desktop
18453 blocks

cpioの-ivdオプションは,-iがコピーイン(取り出し)モード,-vが処理の冗長表示,-dが必要に応じてディレクトリを作成する,という指定です。

このようにして取り出したファイルは通常のファイルと変りありませんので,そのまま適切なディレクトリにコピーして使ったり,tgz形式にまとめ直してPlamo Linux用のパッケージにすることも可能です。

厳密に言うと,rpm のヘッダ部分に埋め込まれているファイルのパーミッション情報やインストール前後にすべき処理などは上記手法では再現できないので,そのような処理が必要な rpm ファイルは別途工夫する必要があります。

deb形式

deb形式はDebian GNU/Linuxが採用しているパッケージ形式で,rpm同様,インストールすべきファイル群と管理情報を分離し,事前に必要なライブラリやコマンドが揃っているかをチェックできるようになっています。

rpm形式がインストールすべきファイル群をcpioでまとめて先頭に管理情報を付加するという独自の形式を採用しているのに対し,deb形式ではインストールすべきファイル群と管理情報をそれぞれtar.gz形式でまとめた上で,それらを arで1つのファイルにまとめる,という形になっています。

# ar xv openoffice.org-base_2.4.1-17_i386.deb
x - debian-binary
x - control.tar.gz
x - data.tar.gz
# ls
control.tar.gz  data.tar.gz  debian-binary

このように,1つのdebパッケージの中には,control.tar.gzdata.tar.gzという2つのtar.gzファイルと,debian-binaryというテキストファイルが含まれています。

このうち,debian-binaryはdebパッケージのバージョン情報を示しており,最近のdebパッケージでは2.0になっています。

data.tar.gzはインストールすべきファイル群をまとめた書庫ファイルで,control.tar.gzにはその書庫ファイルが必要とするライブラリや外部コマンド,インストールやアンインストールの前後で行う処理を記したスクリプトが収められています。

#  tar tvf data.tar.gz
drwxrwxr-x root/root         0 2008-05-30 02:49 ./
drwxr-xr-x root/root         0 2008-05-30 02:49 ./opt/
drwxr-xr-x root/root         0 2008-05-30 02:49 ./opt/openoffice.org2.4/
drwxr-xr-x root/root         0 2008-05-30 02:49 ./opt/openoffice.org2.4/share/
 ...

# tar tvf control.tar.gz 
./
./conffiles
./postrm
./control
./postinst

control.tar.gzに含まれているファイルのうち,controlがライブラリ等の依存関係情報,postinstall, postrmがインストール/アンインストールの後に実行すべき処理を記したスクリプト,conffilesは設定ファイルの置き場等を示すファイルです。

debパッケージはrpmパッケージに比べて汎用的なツール(ar, tar, gzip)のみで操作できるため,バイナリを取り出したり,インストール前後の処理を調べることも容易でしょう。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたのが,いつの間にかミイラ取りがミイラになってOSSを仕事にするようになってしまいました。最近はスペシャリスト養成を目的とした専門職大学院で教壇に立ったりもしています。

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