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

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

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

最近,ようやく朝夕が涼しくなってきました。今年の夏は全国的にも暑かったようですが,筆者の使っているPCには,最近の省電力志向のCPUが出てくる以前の,Xeon DualやAthlon64といった消費電力を気にしない世代のCPUが乗っているため,この夏の暑さは余計にこたえました。Plamo-4.5のリリースに向けた作業を進めているためPCを動かしている時間も長くなりがちで,余計に暑さが厳しかったように感じます。

筆者がまとめ役をやっているPlamo Linuxではパッケージ管理機能もごくシンプルなため,利用者自身が自前のバイナリパッケージを作成することも多いのですが,最近の大手ディストリビューションでは,洗練されたパッケージ管理システムが処理を自動的に行うため,ユーザがバイナリパッケージを調べたり,自前で作ったパッケージをインストールする機会はほとんど無いようです。

バイナリパッケージを表に出さないのは,一般ユーザへと裾野を広げるためには有効かも知れませんが,オープンソースソフトウェアの最大の魅力はソースコードが公開され,自由に設定を調整したり,改造したりできることなので,筆者のような人間から見ると,バイナリパッケージがブラックボックス化していくことには寂しさを感じます。

そこで今回は,代表的なバイナリパッケージの構造を簡単に紹介し,パッケージ管理ツールを介さずにバイナリパッケージの中身を調べる方法を紹介してみようと思います。

tgz形式

tgzは,Plamo Linuxやその元となったSlackwareが採用しているパッケージ形式で,パッケージの拡張子が .tgzになっていることからこの名前で呼ばれています。拡張子のtgzは,tar.gzの略で,tarコマンドで1つにまとめたファイルを,gzipコマンドで圧縮していることを示します。

tar(Tape ARchiver)とは,複数のファイルを一つにまとめる 書庫(アーカイブ)作成ソフトウェアの一種です。書庫作成ソフトウェアには ar(ARchiver)と呼ばれるソフトがあり,arを磁気テープにバックアップするために改造したバージョンがtarの起源のようです。tarはバックアップ用ソフトウェアとして広く普及し,gzipやbzipといった圧縮機能にも対応するようになる一方で,ar はバックアップの用途にはほとんど使われなくなり,最近では主に,複数のオブジェクトファイルを1つにまとめて静的ライブラリを作成する際に使われています。

なお,後述しますが,Debian系のディストリビューションが採用しているdeb形式では,パッケージをまとめる一番外側の枠組みとしてarを採用しています。

tgz形式は,インストールしたいファイルやディレクトリをtarコマンドで1つのファイルにまとめ,gzipコマンドで圧縮しただけの構造なので,「パッケージ形式」と呼ぶのもおこがましい感がありますが,tarやgzipといった,たいていのLinux/UNIX環境で利用可能なコマンドのみで操作できるので,インストールする前に中身を調べたり,テストのために必要なファイルを取り出すことも容易です。

tgz形式では,実体の存在するファイルはそのまま展開されますが,そのまま展開すると意図しないファイルの書き替えが生じる恐れがあるシンボリックリンクはパッケージ内には含めず,/install/doinst.shというシェルスクリプトで生成するようになっています。シンボリックリンクに限らず,インストール後にユーザの設定やサービスの追加といった処理が必要な場合も,/install/doinst.shスクリプトでそれらの処理を行うようになっています。

逆に言うと,tgz形式ではパッケージの展開がそのままインストールになっているため,インストール(=展開)後に何らかの操作を行うことは可能なものの,パッケージをインストールする前に(パッケージに含まれている情報を使って)何らかの操作を行うことは面倒です。このあたりが後述するrpmやdebといった専用のパッケージ形式に比べてやや見劣りする点でしょう。

Slackware/Plamo Linuxでは,installpkgというコマンドでtgz形式のパッケージをインストールするようになっています。

installpkg は指定したパッケージを /(ルート)を基点に展開して,展開後に/install/doinst.shを実行するだけのコマンドですが,展開したパッケージの情報を/var/log/packagesディレクトリに記録しておき,後日,不要になったパッケージをremovepkgコマンドで容易に削除できるようにしています。

rpm形式

最初期のLinuxでは,前述のtgz形式でパッケージを配布していましたが,Linuxが広く使われるようになるにつれ,tgz形式の欠点が明かになってきました。たとえば,あるコマンドが動作するために必要なライブラリや外部コマンドが揃っているかは,本来は事前にチェックして,揃っていなければインストールできないようにすべきですが,tgz形式ではそのような事前処理を組み込むことが容易ではありません。

そこで考案されたのが rpm(RPM Program Manager)形式と呼ばれるパッケージ形式です。

元々rpmはRed Hat社が開発したパッケージ形式で,当初はRedhat Package Managerの略とされていましたが,後にこの形式を広めるために仕様を公開して自由に利用可能にし,名称もRPM Package Managerに変更されました。

rpm形式では,ソフトウェアのバージョンや提供する機能,必要とする外部ライブラリやコマンドといった管理情報は,インストールするファイル群と分離してヘッダー部に記録し,実際のファイルやディレクトリは cpio(CoPy I/O)という書庫ソフトウェアを使って1つにまとめて圧縮し,管理情報の後ろに収める,という形式を取っています。このような形式にすることで,パッケージのヘッダ部分を調べるだけで動作に必要な環境が整っているかをチェックできるようにしています。

著者プロフィール

こじまみつひろ

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

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

コメント

コメントの記入