第7章 Debian パッケージ管理システムの基礎

目次

7.1. Debian パッケージとは何ですか?
7.2. Debian のバイナリパッケージはどんな形式ですか?
7.3. Debian パッケージのファイルが長いのは何故ですか?
7.4. Debian 制御ファイルとは何ですか?
7.5. Debian conffile とは何ですか?
7.6. Debian preinst、postinst、prerm、postrm スクリプトとは何ですか?
7.7. EssentialRequiredImportantStandardOptionalExtra パッケージとは何ですか?
7.8. 仮想パッケージとは何ですか?
7.9. あるパッケージが他のパッケージに DependsRecommendsSuggestsConflictsReplacesBreaksProvides しているというのはどういう意味ですか?
7.10. Pre-Depends とは何ですか?
7.11. パッケージ状態の unknowninstallremovepurgehold というのは何ですか?
7.12. パッケージを保留 (hold) しておく方法は?
7.13. ソースパッケージをインストールする方法は?
7.14. ソースパッケージからバイナリパッケージをビルドする方法は?
7.15. Debian パッケージを自分で作成する方法は?

この章では、Debian パッケージ管理内部のいくらか深いレベルまで触れます。関心が主に関連するツールの使い方であれば、8章Debian パッケージ管理ツール9章Debian システムを最新に保つ の章まで飛ばしてください。

7.1. Debian パッケージとは何ですか?

パッケージは通常関連するコマンド群や機能の実装に必要なファイルを全て収録します。Debian パッケージは2種類あります:

  • バイナリパッケージ。これは実行可能ファイルや設定ファイル、man/info ページ、著作権情報、その他の文書を収録します。この種のパッケージは Debian 固有の圧縮形式 (「Debian のバイナリパッケージはどんな形式ですか?」 参照) で配布されています。通常、ファイルの拡張子が「.deb」だという特徴があります。バイナリパッケージは Debian ユーティリティ dpkg を使って (あるいは aptitude のようなフロントエンド経由で) 展開することができます。詳細はそのマニュアルページにあります。

  • ソースパッケージ。ソースパッケージ (以下に示すファイルの名前も) について説明する .dsc ファイルや元の変更していないソースを tar 形式でまとめて gzip 圧縮で収録した .orig.tar.gz ファイルと通常、元のソースに対する Debian 固有の変更を収録する .diff.gz ファイルで構成されます。ユーティリティ dpkg-source が Debian ソースアーカイブの圧縮や展開を行います。詳細はマニュアルページで提供されています (プログラム apt-getdpkg-source のフロントエンドに利用することができます)。

Installation of software by the package system uses "dependencies" which are carefully designed by the package maintainers. These dependencies are documented in the control file associated with each package. For example, the package containing the GNU C compiler (gcc) "depends" on the package binutils which includes the linker and assembler. If a user attempts to install gcc without having first installed binutils, the package management system (dpkg) will send an error message that it also needs binutils, and stop installing gcc. (However, this facility can be overridden by the insistent user, see dpkg(8).) See more in 「あるパッケージが他のパッケージに DependsRecommendsSuggestsConflictsReplacesBreaksProvides しているというのはどういう意味ですか?」 below.

Debian のパッケージ用ツールは:

  • パッケージの操作や管理、

  • パッケージ内ファイルのローカルオーバーライド管理、

  • 開発者によるパッケージアーカイブの構成支援、

  • ユーザによるリモート FTP サイトにあるパッケージのインストール支援

7.2. Debian のバイナリパッケージはどんな形式ですか?

Debian の「パッケージ」あるいは Debian アーカイブファイルには実行可能ファイルやライブラリ、特定のプログラム集や関連プログラム群に関連する文書が収録されています。通常、Debian アーカイブファイルのファイル名は .deb で終わります。

The internals of this Debian binary packages format are described in the deb(5) manual page. This internal format is subject to change (between major releases of Debian GNU/Linux), therefore please always use dpkg-deb(1) if you need to do lowlevel manipulations on .deb files.

7.3. Debian パッケージのファイルが長いのは何故ですか?

Debian バイナリパッケージのファイル名は以下の慣例に従っています: <foo>_<バージョン番号>-<Debian改訂番号>_<Debianアーキテクチャ>.deb

foo にはパッケージ名が入ることに注意してください。特定の Debian アーカイブファイル (.deb ファイル) に関連するパッケージの名前は以下のような方法で確認できます:

  • 置かれている Debian FTP アーカイブサイトのディレクトリの「Packages」ファイルを調べる。このファイルには各パッケージを説明する区切りが収録されています。区切った最初のフィールドは正式なパッケージ名です。

  • コマンド dpkg --info foo_VVV-RRR_AAA.deb を使う (VVV、RRR、AAA はそれぞれそのパッケージのバージョン、改訂番号、アーキテクチャを示します)。これで、例えば展開するアーカイブファイルに対応するパッケージ名がわかります。

VVV は上流の開発者により指定されるバージョン番号です。この形式には標準化されたものはないため、バージョン番号には「19990513」と「1.3.8pre1」のように異なる形式を使うことができます。

RRR は Debian 開発者 (そのパッケージを自分でビルドした場合はそのユーザ個人) により指定される Debian での改訂番号です。この番号は Debian パッケージの改訂レベルに対応するので、新しい改訂レベルは通常 Debian の Makefile (debian/rules) や Debian 制御ファイル (debian/control)、インストール用、削除用スクリプト (debian/p*)、パッケージで利用される設定ファイルに変更があることを示します。

The AAA component identifies the processor for which the package was built. This is commonly amd64, which refers to AMD64, Intel 64 or VIA Nano chips. For other possibilities review Debian's FTP directory structure at 「Debian FTP アーカイブにあるこのディレクトリ群は一体何ですか?」. For details, see the description of "Debian architecture" in the manual page dpkg-architecture(1).

7.4. Debian 制御ファイルとは何ですか?

Debian 制御ファイルの中身の仕様については Debian ポリシーマニュアルの5節で提供されています。「Debian システム上の、あるいは Debian システム用の文書は他にどんなものがありますか?」 を見てください。

見本として Debian パッケージ hello の制御ファイルを以下に示します。

Package: hello
Version: 2.9-2+deb8u1
Architecture: amd64
Maintainer: Santiago Vila <sanvila@debian.org>
Installed-Size: 145
Depends: libc6 (>= 2.14)
Conflicts: hello-traditional
Breaks: hello-debhelper (<< 2.9)
Replaces: hello-debhelper (<< 2.9), hello-traditional
Section: devel
Priority: optional
Homepage: https://www.gnu.org/software/hello/
Description: example package based on GNU hello
 The GNU hello program produces a familiar, friendly greeting.  It
 allows non-programmers to use a classic computer science tool which
 would otherwise be unavailable to them.
 .
 Seriously, though: this is an example of how to do a Debian package.
 It is the Debian version of the GNU Project's `hello world' program
 (which is itself an example for the GNU Project).

Package はパッケージ名を示します。この名前を使ってそのパッケージをパッケージツールにより操作できます。Debian アーカイブファイル名の最初の構成要素文字列と通常似ていますが必ずしも同一ではありません。

Version は 「Debian パッケージのファイルが長いのは何故ですか?」 で説明されているように、上流開発者のバージョン番号と (最後の構成要素で) このプログラムの Debian パッケージの改訂レベルの両方を示します。

Architecture はこの特定のバイナリがどのチップ用にコンパイルされたのかを示します。

Depends はこのパッケージをうまくインストールするためにインストールされている必要があるパッケージの一覧を示します。

Installed-Size はパッケージをインストールしたときにディスク容量をどれだけ消費するのかを示します。これはインストール用フロントエンドがプログラムをインストールするのに十分なディスク空き容量があるのか示すためによく利用されます。

Section 行は Debian FTP サイトにこの Debian パッケージが置かれるときの「区分」を示します。

Priority はこのパッケージをインストールすることがどれだけ重要かを示します。これを利用して apt や aptitude のような少し気の利いたソフトウェアがパッケージを、例えばオプションでインストールするパッケージの種類で仕分けることができます。EssentialRequiredImportantStandardOptionalExtra パッケージとは何ですか?」 を見てください。

Maintainer は現在このパッケージの保守を担当している人のメールアドレスを示します。

Description はパッケージの機能を簡単に説明します。

パッケージが保持できる全項目のさらなる情報については、Debian ポリシーマニュアルの5節「制御ファイルとその各フィールド」や 「Debian システム上の、あるいは Debian システム用の文書は他にどんなものがありますか?」 を見てください。

7.5. Debian conffile とは何ですか?

Conffiles は設定ファイル (通常 /etc に置かれます) の一覧で、パッケージをアップグレードするときにパッケージ管理システムが上書きしません。こうしてこういったファイルのローカル設定内容が保持されます。これは実行中のシステムにあるパッケージを適切にアップグレードできるようにする重要な機能です。

アップグレードで正確にどのファイルが保持されるか判断するには

dpkg --status package

を実行して「Conffiles:」のすぐ下を確認してください。

7.6. Debian preinst、postinst、prerm、postrm スクリプトとは何ですか?

このファイルはパッケージのインストールや削除の前後に自動的に実行される実行可能スクリプト群です。このファイル群は全て control というファイルと共に Debian アーカイブファイルの「制御ファイル」の一部です。

個々のファイルについて:

preinst

このスクリプトは Debian アーカイブ (「.deb」) ファイルからパッケージを展開する前に実行されます。多くの「preinst」スクリプトが、アップグレード中のパッケージのサービスをインストールやアップグレードが完了するまで (「postinst」スクリプトがうまく実行されるまで) 停止します。

postinst

このスクリプトは概して、Debian アーカイブ (「.deb」) ファイルから foo を展開した後にパッケージ foo で必要とする設定があればそれを完了させます。「postinst」スクリプトは状況により、デフォルト値を受け入れるかどうか、ユーザに入力を求めたり、忘れずに戻ってパッケージを再設定すべきであることをユーザに通告することもよくあります。新しいパッケージのインストールやアップグレードが完了すると、サービスを開始、再起動するのに必要なコマンドを多数の「postinst」スクリプトが実行します。

prerm

このスクリプトは概してパッケージに関連するデーモンを停止します。そのパッケージに関連するファイルを削除する前に実行されます。

postrm

このスクリプトは概して foo に関連するリンクやその他のファイルを変更、あるいはそのパッケージが作成したファイルを削除します (「仮想パッケージとは何ですか?」 も見てください)。

現在、制御ファイルは全てディレクトリ /var/lib/dpkg/info に置かれます。パッケージ foo に関連するファイルは名前が「foo」で始まりファイルの拡張子が必要に応じて「preinst」、「postinst」等となっています。そのディレクトリのファイル foo.list にはパッケージ foo でインストールされる全ファイルが列挙されています (このファイルは dpkg 内部にあることに注意してください。当てにすべきではありません)。

7.7. EssentialRequiredImportantStandardOptionalExtra パッケージとは何ですか?

各 Debian パッケージにはディストリビューションメンテナにより優先度が割り当てられ、パッケージ管理システムを支援します。この優先度には以下があります。

  • Required: システムが適切に機能するのに必要なパッケージ。

    これにはシステムの不具合を修復するのに必要なツールが全て属します。このパッケージを削除することはできず、削除した場合システムは全体が壊れ、恐らく dpkg を使って差し戻すこともできません。Required パッケージしかないシステムは恐らく使いものにはなりませんが、システム管理者がブートしてソフトウェアをさらにインストールできるだけの機能は十分にあります。

  • Important パッケージはどの Unix 類似システムにもあるはずです。

    それがないとシステムがうまく動作しないあるいは使い物にならないというその他のパッケージがここに属します。これには Emacs や X、TeX、その他の巨大なアプリケーションは含まれません。このパッケージ群は最低限の基盤を構成するだけです。

  • Standard パッケージはどの Linux システムでも標準的なもので、ある程度小さいものが属しますが文字モードのシステムだけに限定はしていません。メール送信 (mutt で) や FTP サーバからのファイルのダウンロードができるツールが属しています。

    これはユーザが他に何も選択しなかった場合にデフォルトでインストールされるものです。多数の巨大なアプリケーションは含まれませんが、Python インタープリタや、OpenSSH (リモート管理用) や Exim (メール配送用ですがローカル配送専用に設定することもできます) のようなサーバソフトウェアがあります。ほとんどのユーザにとって参考になるようなごく一般的な文書も属しています。

  • Optional パッケージには、よくわからない場合にある程度インストールされているようなもの、あるいは特殊な要求がないものが全て属します。

    X や TeX ディストリビューション一式、多くのアプリケーションがあります。

  • Extra: パッケージには、他の上位の優先度とは相容れないものや既にそれが何なのかわかっている場合にのみ有用と思われるもの、特殊な要求があるため「Optional」に適応しないものが属します。

Debian をデフォルトでインストールすると優先度が Standard かそれ以上の全パッケージがそのシステムにインストールされます。設定済みタスクを選択した場合は優先度の低いパッケージもインストールされます。

さらに、システムが適切に機能するためにはそれが絶対に必要だということで Essential に区分されているパッケージもあります。パッケージ管理ツールはこういったパッケージの削除を拒否します。

7.8. 仮想パッケージとは何ですか?

仮想パッケージはパッケージ群のうち任意の一つに適用できる総称的なもので、どれも同じような基本機能を提供します。例えば konquerorfirefox-esr プログラムはどちらもウェブサイトブラウザであるため、機能するあるいは役立つためにはシステムにウェブブラウザがあることを要求するプログラムの依存を満たすはずです。したがって、どちらも www-browser という「仮想パッケージ」を提供するということになります。

同様に、exim4sendmail はどちらもメール転送エージェントの機能を提供します。したがって、これは仮想パッケージ「mail-transport-agent」を提供するということになります。どちらかがインストールされていれば、任意のプログラムの mail-transport-agent がインストールされていることへの依存はこの仮想パッケージの存在により満たされます。

Debian では、同一の仮想パッケージを提供するパッケージが一つのシステムに複数インストールされている場合に、システム管理者が望ましいパッケージとしてその一つを選べる仕組みを提供しています。関連するコマンドは update-alternatives で、「あるユーザは mawk、別のユーザは gawk、あるユーザは vim、別のユーザは elvis、あるユーザは trn、別のユーザは tin を好みます。Debian は多様性をどのようにサポートしますか?」 で詳細に説明されています。

7.9. あるパッケージが他のパッケージに DependsRecommendsSuggestsConflictsReplacesBreaksProvides しているというのはどういう意味ですか?

Debian パッケージシステムには、システム上のプログラム B の存在とどれだけ独立してプログラム A が動作できるのかというレベルを (単一のフラグで) 示すように設計された、パッケージの様々な「依存関係」があります。

  • A を実行するためには B が絶対にインストールされていなければならないなら、パッケージ A はパッケージ B に依存 (depends) しています。状況によっては、A は B が存在するだけでは不足で、B のバージョンにも依存しているということがあります。この場合、バージョンの依存は通常下限で、指定されたバージョンと比べて B のもっと新しい任意のバージョンに A が依存しているという意味になります。

  • A には B により提供される機能もないとほとんどのユーザが使わないだろう、とパッケージメンテナが判断した場合、パッケージ A がパッケージ B を推奨 (recommends) します。

  • A の機能に関連する (通常、機能を拡張する) ファイルを B が収録している場合、パッケージ A がパッケージ B を提案 (suggests) します。

  • そのシステムに B がインストールされていると A が動作しない場合、パッケージ A がパッケージ B と衝突 (conflicts) しています。ほとんどの場合衝突は B にあるものをもっと改善したファイルを A が収録する場合です。「Conflicts」は「replaces」とよく組み合わされています。

  • B によりインストールされたファイルが削除されるあるいは (場合により) A のファイルで上書きされる場合、パッケージ A がパッケージ B を置き換え (replaces) ます。

  • 一つのシステム上で両方のパッケージを同時に設定することができないとき、パッケージ A はパッケージ B を壊し (breaks) ています。そのシステム上で他方が既にインストール、設定されているとパッケージ管理システムはインストールを拒否します。

  • B のファイルや機能が全て A に盛り込まれているとき、パッケージ A はパッケージ B を提供 (provides) しています。この仕組みにより、ディスク容量の限られているユーザにパッケージ A の実際に必要な部分だけを取得できる方法を提供しています。

各条件の使い方についてもっと詳細な情報が Debian ポリシーマニュアル 7.2 節「バイナリ依存」にあります。「Debian システム上の、あるいは Debian システム用の文書は他にどんなものがありますか?」 を見てください。

7.10. Pre-Depends とは何ですか?

「Pre-Depends」は特別な依存です。ほとんどのパッケージで dpkg は対象パッケージのアーカイブファイル (つまり .deb ファイル) をそのファイルがシステム上に存在する依存の有無とは無関係に展開します。展開というのは、簡単に言うと dpkg はファイルシステムにインストールしようとしたアーカイブファイルからファイルを抽出し、配置します。パッケージがシステム上の他のパッケージの存在に依存している場合、dpkg は他のパッケージがインストールされるまで (「configure」操作の実行による) インストールの完了を拒否します。

しかし、特定の依存が解決されるまで dpkg が展開すら拒否するパッケージもあります。こういったパッケージは何か他のパッケージの存在に「事前依存 (Pre-depend)」しているということになります。Debian プロジェクトはこの仕組みを提供して、パッケージを展開する順序が重要な場合にシステムを a.out 形式から ELF 形式に安全にアップグレードする方法をサポートしました。他に、例えば一定以上の優先度で LibC に依存しているパッケージ等で、規模の大きなアップグレードにおいてこの方法が有用な状況があります。

繰り返しになりますが、もっと詳細な情報がポリシーマニュアルにあります。

7.11. パッケージ状態の unknowninstallremovepurgehold というのは何ですか?

こういった「要求 (want)」フラグはユーザがパッケージについてどう要求したのか (ユーザが直接 dpkg/apt/ aptitude を実行で示されます) を示します。

それぞれの意味は:

  • unknown - そのパッケージの要求をユーザが示したことがない

  • install - そのパッケージのインストールやアップグレードをユーザが要求した

  • remove - そのパッケージの削除をユーザが要求した。ただし、既存の設定の削除は望まなかった

  • purge - そのパッケージの設定も含めた完全削除をユーザが要求した

  • hold - そのパッケージを処理しないことをユーザが要求した、つまり現行バージョンを今の状態で維持することを望んでいる

7.12. パッケージを保留 (hold) しておく方法は?

パッケージを保留 (hold) しておく方法は dpkg、apt、aptitude で3つあります。

dpkg では、パッケージ選択一覧をエクスポートする必要があります:

dpkg --get-selections \* > selections.txt

それからできたファイル selections.txt を編集し、保留 (hold) したいパッケージがある行を変更します。例えば libc6 の場合

libc6                                           install

から

libc6                                           hold

に変更してファイルを保存し、dpkg データベースに読ませます:

dpkg --set-selections < selections.txt

apt では、パッケージの保留 (hold) は

apt-mark hold package_name

保留 (hold) の解除は

apt-mark unhold package_name

aptitude では、パッケージの保留 (hold) は

aptitude hold package_name

保留 (hold) の解除は

aptitude unhold package_name

7.13. ソースパッケージをインストールする方法は?

Debian ソースパッケージを実際に「インストール」することはできません、生成するバイナリパッケージをビルドしようとするディレクトリに展開するだけです。

Source packages are distributed on most of the same mirrors where you can obtain the binary packages. If you set up your APT's sources.list(5) to include the appropriate "deb-src" lines, you'll be able to easily download any source package by running

apt-get source foo

を実行することで任意のソースパッケージを簡単にダウンロードできます。ソースパッケージの実際のビルドを支援するため、Debian ソースパッケージはビルド依存 (Build-Dependencies) という仕組みを提供しています。これは、ソースパッケージのメンテナがそのパッケージをビルドするのに必要となる他のパッケージの一覧を維持しているということです。これがどれくらい有用なのか確認するには、ソースをビルドする前に

apt-get build-dep foo

を実行してください。

7.14. ソースパッケージからバイナリパッケージをビルドする方法は?

望ましいのは様々なラッパーツールを使う方法です。devscripts ツールを利用する方法を示します。このパッケージがインストールされていない場合はインストールしてください。

まずソースパッケージを取得します:

apt-get source foo

次にソースツリーを変更します:

cd foo-*

必要なビルド依存 (Build-Dependencies) があればインストールします:

sudo apt-get build-dep foo

自分のビルドに専用のバージョンを作成します (そうすることで今後 Debian 自体から新しいバージョンがリリースされたときに混乱を招かずに済みます):

dch -l local 'Blah blah blah'

それからパッケージをビルドします:

debuild -us -uc

全て予定通りに進んでいれば、これで

sudo dpkg -i ../*.deb

を実行することでパッケージをインストールできるようになっているはずです。手作業で行いたいけれども devscripts を使いたくない場合は以下の手順を追ってください。

ソースをコンパイルするには foo_*.dsc、foo_*.tar.gz、foo_*.diff.gz が全て必要となります (注意: Debian 生まれの一部のパッケージには .diff.gz がないものがあります)。

(「ソースパッケージをインストールする方法は?」 を) 取得できたら、dpkg-dev パッケージがインストールされていればコマンド

dpkg-source -x foo_version-revision.dsc

を実行するとパッケージを foo-バージョンというディレクトリに抽出します。

パッケージをただコンパイルしたいだけなら、foo-バージョンディレクトリに移動してコマンド

dpkg-buildpackage -rfakeroot -b

を実行してパッケージをビルドし (これには fakeroot パッケージも必要となることに注意してください)、

dpkg -i ../foo_version-revision_arch.deb

を実行して新しくビルドしたパッケージをインストールします。

7.15. Debian パッケージを自分で作成する方法は?

もっと詳細な説明については、maint-guide パッケージまたは https://www.debian.org/doc/devel-manuals#maint-guide から利用できる新メンテナガイドや debmake-doc パッケージまたは https://www.debian.org/doc/devel-manuals#debmake-doc から利用できる Debian メンテナ向けガイドを読んでください。