パッケージとは何かという話から導入して, Debianのパッケージシステムの意味を解説します. できるだけ,パッケージシステムというものを知らない人にも 分かるような内容を目的としています.
UNIX系のシステムを利用している方々で, ソースコードからコンパイルして, make install でソフトウェアをインストールしている人は多く居ると思います. make installを行わないと動作しないプログラム などがありますが,そうでないプログラムでも, make installを行うと,コンパイルしたプログラムが, パスを指定しなくても実行できるようになる というメリットがあります.
このように便利(というかむしろ常識)な make installですが, 欠点もあります.ここではその デメリットを列記してみます.
ここで,少しmake installの目的について考えます. make installは,一般的な動作として, プログラムを/usr/bin に,ライブラリを/usr/libに,インクルードファイルを /usr/include,説明書を/usr/share/doc/に コピーします. これがインストールの動作と一般的にいわれているものです. これには, プログラムのソースファイルから生成されたファイルを OS上の既知の場所に再配置し, ユーザが利用しやすくする,という意味があります. 例えば,/usr/binにプログラムを おくと,PATHに含まれているため, プログラムの名前だけを指定すると プログラムが実行できるようになります.
複数のLinuxディストリビューション, いくつかのUNIX系のオペレーティングシステム等で 利用されているシステムです. いくつかのWindowsのソフトウェア(ZIP形式なども含む)などで 利用されている形式も,この一種と考えることができるでしょう. 特徴としては
点でしょうか. また,自動設定ソフト等が含まれている時があります. Windows等でソフトウェアがあり,インストーラが起動するタイプ は,これに分類すると考えられます. 単純な考え方で,集中管理を必要としません.
make installで,/以外の 適当な一時ディレクトリにインストールさせます. 例えば,/home/dancer/files以下に /usr/bin/等を作成させます. これは,通常make install DESTDIR=/home/dancer/files 等で実現できます. そして,cd /home/dancer/files; tar cvfzp ../this.tar.gz * として.tar.gzを作成します. このように作成した.tar.gzは/ 以下に置かれるべきであったファイルを保持しています.
この「パッケージ」をインストールするには, cd / ; tar xvfz /home/dancer/this.tar.gz で インストールできます. これで通常のところにファイルが配置されます.
アンインストールするためにファイルを 削除するための情報は,.tar.gzのファイルの中にある 情報で十分です. (Windowsで失敗するのは,レジストリという,ファイルシステムの管理 の外に存在している情報があることに起因する物が多いと考えられます.)
このままだと.tar.gzが消えると情報も消えるので, 一定のところに パッケージに入っていた ファイルの一覧のファイルを置いておくというように決めている システムもある.
プログラムには実は依存関係が存在する. 何が何を要するのか,という情報は実は事前に分かっているのだが, .tar.gz形式ではその情報は十分表現されているとは 言い難い.
例えば,Windowsのシステムであったら「このソフトは DirectX バージョン○以上がないと動きません」 と書いてあるソフトウェアや,「Windows ○○ でないとうごきません」 と書いてあるソフトウェアが多くあります. その管理はそれぞれのソフトのインストーラが管理しているか, それとも,インストールしてから「実は動かなかった」という ことで発見することになります.
このような必要条件や,「このソフトがあるとうまく動きません」 というような情報が追加されていると便利です.
rpmは, cpio形式をもとに自己流に拡張したファイル形式であり, そういう追加の情報をヘッダ中に保持しています. debは, ar形式のアーカイブで,その中に data.tar.gzとcontrol.tar.gzというファイルを 保持していて,data.tar.gzは普通にtar.gz 形式でデータを保持し,control.tar.gz内には, 依存関係等の情報を持っています.
deb パッケージを作成するためのソースパッケージの構成について 解説します. まず,ソース(例えばdmachinemon-0.3/) のディレクトリに,debianというディレクトリ を作成します(dmachinemon-0.3/debianということになる). そしてその中にdebian/rules というMakefileを作成します.他にも,controlや changelogやcopyright等のファイルも 作成します.
debian/rulesは一般的にMakefileをよび, debian/tmp以下にmake installをするように なっています.ここからdpkg-debはdeb パッケージを作成します. この一連の処理はdebuildというプログラムで自動的に 行なうことができます.
また,GNU標準化の努力の成果なのか, Makefileや./confgureのシステムは 大抵の場合共通です.ソフトウェアのコンパイルをしたあとの インストールには,ほとんどのパッケージは ./configure -prefix=/usr && make && make install DESTDIR=${PWD}/debian/tmpとすると, debian/tmp以下にファイルがインストールされるように設計されています. その特性を利用して,dh_makeというプログラムが自動的に debian/以下のファイルの雛型を作成してくれます.
一般論として,
のようにしてパッケージは生成されます.
Debianは,debianディレクトリ等のDebian独自の物を diff.gzファイルに,もともとの内容を orig.tar.gzファイルに保持します. そして,ソースパッケージとしては,その二つのファイルが どれであるかということを保持している.dsc ファイルがあります. Debianのソースパッケージがある場合,それを 展開するのには, dpkg-source -x *.dscというようにします.
aptを利用する場合は,apt-get source packagename でソースをダウンロードできます.
普通の簡単なプログラムなら,どこで実行されても それ以上の設定が必要無いように設計する事ができますが, 一部のソフトウェアでは,設定が必要になることがあります. 例えば,自動的に起動時に実行されるように設定する事 などの事があります. 理想としては,パッケージのファイルをそのままインストール すれば動くようなシステムが理想なのですが, それ以外の設定が必要なものは現在でもあります.
Debianのシステムでは,そのような場合に対して, postinst,preinst,postrm, prermなどのスクリプトを用意しています. パッケージの中に postinstなどのスクリプトがあると, パッケージのインストールの適切な時期にそのスクリプトが実行 されます. 通常は,ソースパッケージの中で, debian/postinst等の名前であるもの, debian/packagename.postinst等の 名前であるものが,それにあたります.
スクリプト | 意味 |
---|---|
preinst | ファイルがインストールされる前に実行 |
postinst | ファイルが全部インストールされた後に実行 |
prerm | ファイルが削除される前に実行 |
postrm | ファイルが削除された後に実行 |
$Id: packaging-system.html.ja,v 1.12 2002/05/25 06:47:47 dancer Exp $