第2章 Debian パッケージ管理

目次

2.1. Debian パッケージ管理の前提条件
2.1.1. パッケージ設定
2.1.2. 基本的な注意事項
2.1.3. 永遠のアップグレード人生
2.1.4. Debian アーカイブの基本
2.1.5. パッケージ依存関係
2.1.6. パッケージ管理のイベントの流れ
2.1.7. パッケージ管理のトラブルへの応急対処法
2.2. 基本的パッケージ管理操作
2.2.1. apt-get/apt-cacheaptitude の比較
2.2.2. コマンドラインによる基本的なパッケージ管理操作
2.2.3. aptitude のインタラクティブな使用
2.2.4. aptitude のキーバインディング
2.2.5. aptitude の下でのパッケージの表示
2.2.6. aptitude を使った探索方法
2.2.7. aptitude の regex 式
2.2.8. aptitude による依存関係の解決
2.2.9. パッケージアクティビティーログ
2.3. aptitude 操作例
2.3.1. regex にマッチするパッケージ名のパッケージをリスト
2.3.2. regex マッチをしての閲覧
2.3.3. パッケージの完全削除
2.3.4. 自動 / 手動インストール状態の整理
2.3.5. システム全体のアップグレード
2.4. 高度なパッケージ管理操作
2.4.1. コマンドラインによる高度なパッケージ管理操作
2.4.2. インストールされたパッケージファイルの検証
2.4.3. パッケージ問題からの防御
2.4.4. パッケージメタデーターの検索
2.5. Debian パッケージ管理の内部
2.5.1. アーカイブのメタデーター
2.5.2. トップレベルの "Release" ファイルと信憑性
2.5.3. アーカイブレベルの "Release" ファイル
2.5.4. パッケージメタデーターの取得
2.5.5. APT に関するパッケージ状態
2.5.6. aptitude に関するパッケージ状態
2.5.7. 取得したパッケージのローカルコピー
2.5.8. Debian パッケージファイル名
2.5.9. dpkg コマンド
2.5.10. update-alternative コマンド
2.5.11. dpkg-statoverride コマンド
2.5.12. dpkg-divert コマンド
2.6. 壊れたシステムからの復元
2.6.1. 古いユーザーの設定との非互換性
2.6.2. 重複するファイルを持つ相異なるパッケージ
2.6.3. 壊れたパッケージスクリプトの修正
2.6.4. dpkg コマンドを使っての救済
2.6.5. パッケージセレクションの復元
2.7. パッケージ管理のヒント
2.7.1. Debian パッケージの選択方法
2.7.2. 混合したアーカイブソースからのパッケージ
2.7.3. 候補バージョンの調整
2.7.4. Updates と Backports
2.7.5. パッケージの自動ダウンロードとアップグレード
2.7.6. APT のよるダウンロードバンド幅の制限
2.7.7. 緊急ダウングレード
2.7.8. 誰がパッケージをアップロードしたのか?
2.7.9. equivs パッケージ
2.7.10. 安定版システムへのパッケージ移植
2.7.11. APT のためのプロキシサーバー
2.7.12. 小さな公開パッケージアーカイブ
2.7.13. システム設定の記録とコピー
2.7.14. 外来のバイナリーパッケージの変換やインストール
2.7.15. dpkg を使わないパッケージの開梱
2.7.16. パッケージ管理の追加参考文書
[注記] 注記

本章は最新安定版リリースがコード名: squeeze と言う前提で書かれています。

Debian は、フリーソフトウエアーのコンパイル済みバイナリーパッケージからなる整合性あるディストリビューションを作り、そのアーカイブを通じてそれらを頒布するボランティア組織です。

Debian のアーカイブは、HTTP や FTP 法によるアクセスされるための多くのリモートのミラーサイトとして提供されています。それは、CD-ROM/DVD によっても提供されています。

Debian のパッケージ管理システムは、適正に使われればバイナリーパッケージの整合性ある組み合わせがアーカイブからシステムにインストールされるようになっています。現在、amd64 アーキテクチャーには 30552 つのパッケージがあります。

Debian のパッケージ管理システムは、多彩な歴史があり、使用されるフロントエンドのユーザープログラムやバックエンドのアーカイブへのアクセス方法に多くの選択肢があります。現在は以下を推薦します。

表2.1 Debian のパッケージ管理ツールのリスト

パッケージ ポプコン サイズ 説明
apt * V:90, I:99 5600 アドバンスドパッケージツール (APT)、"http" や "ftp" や "file" というアーカイブへのアクセス方法を dpkg に提供するフロントエンド (apt-get/apt-cache コマンドを含む)
aptitude * V:25, I:98 11916 aptitude(8) を使うインタラクティブなターミナルベースのパッケージマネージャー
update-manager-gnome * V:7, I:10 1221 update-manager(8) を使ってソフトウエアーの更新を管理する GNOME のアプリケーション
tasksel * V:5, I:93 904 Debian システムにタスクをインストールするための選択ツール (APT のフロントエンド)
unattended-upgrades * V:4, I:31 280 セキュリティーアップデートの自動インストールを可能にする APT の拡張パッケージ
dselect * V:2, I:30 2404 ターミナルベースのパッケージマネージャー (過去の標準、APT や他の旧式のアクセス法のフロントエンド)
dpkg * V:92, I:99 6804 Debian のためのパッケージ管理システム
synaptic * V:13, I:40 6464 グラフィカルなパッケージマネージャー (APT の GNOME フロントエンド)
apt-utils * V:51, I:99 516 APT ユーティリティープログラム: apt-extracttemplates(1) と apt-ftparchive(1) と apt-sortpkgs(1)
apt-listchanges * V:11, I:17 280 パッケージ変更履歴の通知ツール
apt-listbugs * V:1.4, I:2 508 APT による各インストール前にクリチカルバグをリストする
apt-file * V:2, I:9 188 APT パッケージ探索ユーティリティー -- コマンドラインインターフェース
apt-rdepends * V:0.13, I:0.9 92 パッケージの依存関係を再帰的にリスト

2.1. Debian パッケージ管理の前提条件

2.1.1. パッケージ設定

Debian システム上でのパッケージ設定の要点を次に記します。

  • システム管理者による手動の設定は尊重されます。言い換えれば、パッケージ設定システムは利便性のために勝手な設定をしません。
  • 各パッケージは、パッケージの初期インストールプロセスを助けるための debconf(7) と呼ばれる標準化されたユーザーインターフェースを使用し、それぞれ毎の設定スクリプトとともに提供されます。
  • Debian の開発者はパッケージの設定スクリプトによりユーザーのアップグレードが滞りなく進むように最大限の努力を行います。
  • システム管理者にはパッケージされたソフトウエアーの全機能が使用可能です。ただしセキュリティーリスクのある機能はデフォールトのインストール状態では無効にされています。
  • セキュリティーリスクのあるサービスを手動でアクティベートした場合は、リスクの封じ込めはあなたの責任です。
  • システム管理者は難解奇異な設定を手動で有効にできます。ただこんなことをすればポピュラーな一般の補助プログラムとは干渉してしまうかもしれません。

2.1.2. 基本的な注意事項

[警告] 警告

ランダムな混合のスイーツからパッケージをインストールしてはいけません。コンパイラーの ABI とかライブラリー のバージョンとかインタープリターの機能等のシステム管理に関する深い知見が必要なパッケージの整合性がきっと破壊されます。

初心者の Debian システム管理者は Debian の安定版 stable リリースをセキュリティーアップデートを適用しながら使うべきです。Debian システムを非常によく理解するまでは、用心として次の有効なアクションですら避けておくべきと考えます。次は留意点です。

  • "/etc/apt/sources.list" の中にテスト版 testing とか不安定版 unstable とかを含めません。
  • "/etc/apt/sources.list" の中に標準の Debian と Debian 以外の Ubuntu のようなアーカイブを混在させません。
  • "/etc/apt/preferences" を作成しません。
  • パッケージ管理ツールのデフォールトを影響を理解せずに変更しません。
  • ランダムなパッケージを "dpkg -i <random_package>" でインストールしません。
  • ランダムなパッケージを "dpkg --force-all -i <random_package>" で絶対インストールしません。
  • "/var/lib/dpkg/" の中のファイルを消去や改変しません。
  • ソースから直接コンパイルしたソフトウエアープログラムをインストールする際にシステムファイルを上書きしません。

    • 必要な場合は "/usr/local/" か "/opt/" 中にインストールします。

上記のアクションで起きる Debian パッケージシステムへのコンパチブルでない効果はシステムを使えなくするかもしれません。

ミッションクリティカルなサーバーを走らせる真剣な Debian システム管理者は更なる用心をすべきです。

  • 安全な条件下であなたの特定の設定で徹底的にテストすることなくセキュリティーアップデートをも含めた如何なるパッケージもインストールをしてはいけません。

    • システム管理者のあなたがシステムに対して最終責任があります。
    • Debian システムの長い安定性の歴史それ自体は何の保証でもありません。

2.1.3. 永遠のアップグレード人生

私が上記で警告したとはいえ、自分自身で管理するデスクトップ環境では Debian のテスト版 testing や不安定版 unstable のスイーツを自分のメインのシステムとして使おうと多くの本書の読者が望むことは分かっています。システムは非常に快調に動くし、頻繁に更新されるし、最新の機能が提供されるからです。

[注意] 注意

あなたの業務サーバーには、セキュリティーアップデートをした安定版 stable スイーツを推薦します。例えばあなたの母親の PC のように、管理に限られた時間しか割けないデスクトップ PC に関しても同様の事が言えます。

"/etc/apt/sources.list" の中のディストリビューション文字列を、"testing" とか "unstable" というスイーツ名、もしくは "wheezy とか "sid" というコード名に単に設定するだけで十分です。

testingunstable を使うことは大変楽しいけれど、リスクがついてきます。Debian システムの unstable スイーツさえおおむね非常に安定に見えますが、Debian システムの testingunstable スイーツでは過去パッケージ上の問題をいくつか経験して来てるし、その一部は簡単には解決できないものでした。結構痛い目に会うことになるかもしれませんよ。時々、壊れたパッケージや機能の欠損が数週間続くことが起こります。

Debian パッケージのバグからの早急かつ簡単な復元を確実にするいくつかのアイデアがここにあります。

  • Debian システムの安定版 stable スイーツを別のパーティションにインストールし、システムをヂュアルブータブル
  • レスキューブートのためのインストール用 CD を手元に確保
  • apt-listbugs をインストールしてアップグレードの前に Debian バグトラッキングシステム (BTS) をチェックを考慮
  • 問題回避するのに十分なだけのパッケージシステムの基盤を学習
  • chroot か類似の環境を作り事前に最新のシステムを実行 (「仮想化システム」参照)

(これらの用心のための方策の何れもできないなら、テスト版 testing や不安定版 unstable スイーツを使うのにはあなたはきっと準備不足です。)

以下に記すことにより悟りを開けば、アップグレード地獄という果てしない因果応報の葛藤から人は解脱し、Debian の涅槃の境地に到達できます。

2.1.4. Debian アーカイブの基本

Debian アーカイブをシステムユーザーの視点から見てみます。

[ティップ] ティップ

Debian アーカイブの正式のポリシーは Debian ポリシーマニュアル、第2章 - Debian アーカイブに規定されています。

典型的な HTTP アクセスの場合、現在の安定版 stable=squeeze システムを例にとると、次の様に "/etc/apt/sources.list" ファイルの中にアーカイブは規定されています。

deb http://ftp.XX.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.XX.debian.org/debian/ squeeze main contrib non-free

deb http://security.debian.org/ squeeze/updates main contrib
deb-src http://security.debian.org/ squeeze/updates main contrib

"ftp.XX.debian.org" はあなたの所在場所に合う、Debian の全世界ミラーサイトリスト中に見つかるミラーサイトの URL、例えば日本なら "ftp.jp.debian.org"、に置き換えなければいけません。これらのサーバーの状況は Debian ミラー確認サイトで確認できます。

上記で、次の安定版 stable がリリースされて驚かされ無いように、私はスイート名の "stable" でなくコード名の "squeeze" を使います。

"/etc/apt/sources.list" の意味は sources.list(5) に記載されていて、要点は以下です。

  • "deb" 行がバイナリーパッケージのための定義です。
  • "deb-src" 行がソースパッケージのための定義です。
  • 一番目の引数は、Debian アーカイブの root URL です。
  • 二番目の引数は、スイーツ名かコード名のどちらかで与えられるディストリビューション名です。
  • 三番目次の引数は、Debian アーカイブの中の有効なアーカイブのエリア名のリストです。

ソース関連のメタデーターにアクセスしない aptitude のためだけなら "deb-src" 行は安全に省略 (もしくは "#" を行頭に挿入してコメントアウト) することができます。こうするとアーカイブのメタデーターの更新速度が向上します。URL は "http://" や "ftp://" や "file://" 等々の何れも可能です。

[ティップ] ティップ

もし上記の例で "squeeze" ではなく "sid" が使われる場合には、セキュリティーアップデートのための "deb: http://security.debian.org/ ..." 行は不要です。安定版 stable とテスト版 testing (即ち squeezewheezy) にのみセキュリティーアップデートがあります。 "sid" (不安定版 unstable) のためにはセキュリティーアップデートのアーカイブが存在しません。

次は設定ファイル内に用いられる Debian アーカイブサイトの URL とスイーツ名もしくはコード名です。

表2.2 Debian アーカイブサイトのリスト

アーカイブの URL スイート名 (コード名) 目的
http://ftp.XX.debian.org/debian/ stable (squeeze) 安定版 (squeeze) のリリース
http://ftp.XX.debian.org/debian/ testing (wheezy) テスト版 (wheezy) のリリース
http://ftp.XX.debian.org/debian/ unstable (sid) 不安定版 (sid) のリリース
http://ftp.XX.debian.org/debian/ experimental 実験的プリリリース (任意、開発者専用)
http://ftp.XX.debian.org/debian/ stable-proposed-updates 次回安定版ポイントリリース用のアップデート (任意)
http://security.debian.org/ stable/updates 安定版用のセキュリティーアップデート (重要)
http://security.debian.org/ testing/updates テスト版用のセキュリティーアップデート (重要)
http://ftp.XX.debian.org/debian/ squeeze-updates squeeze のためのスパムフィルターや IM クライアント他用のコンパチブルなアップデート
http://backports.debian.org/debian-backports/ squeeze-backports squeeze のためのバックポートされたパッケージ (任意)

[注意] 注意

セキュリティーアップデートされた純粋な安定版 stable リリースのみが最善の安定性を提供します。一部 testingunstable 由来のパッケージを混用してほとんど stable リリースを走らせることは、純粋な unstable リリースを走らせるよりリスクがあります。stable リリースの下で最新バージョンのいくつかのプログラムが本当に必要なら、squeeze-updatesbackports.debian.org (「Updates と Backports」参照) サービスからのパッケージを使って下さい。これらのサービスは細心の注意を持って使う必要があります。

[注意] 注意

基本的に、stabletestingunstable のスイーツの内の1つだけを "deb" 行に書くべきです。もし、stabletestingunstable のスイーツの何らかの組み合わせを "deb" 行に書けば、APT プログラムは、最新のアーカイブのみが有効であるにもかかわらず、実行速度が低下します。"/etc/apt/preferences" ファイルがはっきりとした目的を持って使われている場合 (「候補バージョンの調整」) のみ複数のリストに意味があります。

[ティップ] ティップ

stabletesting スイーツの Debian システムでは、上記の例のようにセキュリティーアップデートを有効とするように "/etc/apt/sources.list" の中に "http://security.debian.org/" の行を含めることはいいことです。

[注記] 注記

stable アーカイブのセキュリティーバグは Debian のセキュリティーチームにより修正されます。本活動は非常に厳格で信頼できるものです。testing アーカイブのセキュリティーバグは Debian の testing セキュリティーチームにより修正されます。諸所の 事情で、本活動は stable ほどは厳格ではなく、修正された unstable パッケージの移行を待つ必要があるかもしれません。unstable アーカイブのセキュリティーバグは個別のメンテナにより修正されます。活発にメンテされている unstable パッケージはアップストリームのセキュリティー修正を使うことで通常比較的良い状態です。Debian がセキュリティーバグへ如何に対応するかに関しては Debian security FAQ を参照下さい。

表2.3 Debian アーカイブエリアのリスト

エリア パッケージ数 パッケージ構成要素のクライテリア
main 29887 DSFG に完全準拠し、non-free のパッケージに非依存 (main = 主要)
contrib 202 DSFG に完全準拠だが、non-free のパッケージに依存有り (contrib = 寄与)
non-free 463 非 DSFG 準拠

ここで、上記にあるパッケージ数は amd64 アーキテクチャーに関する数字です。厳密に言うなら、main エリアのアーカイブのみを Debian システムと考えるべきです。

Debian アーカイブの構成は、各アーカイブの URL の後ろに distspool をつけた URL にブラウザーを向ければ学習できます。

ディストリビューションは、スイーツとコード名の2つの方法で言及されます。この他にディストリビューションと言う言葉は多くの文書でスイーツの同義語としても使われています。スイーツとコード名の関係は次のようにまとめられます。

表2.4 スイーツとコード名の関係

タイミング スイーツ = 安定版 stable スイーツ = テスト版 testing スイーツ = 不安定版 unstable
squeeze リリース後 コード名 = squeeze コード名 = wheezy コード名 = sid
wheezy リリース後 コード名 = wheezy コード名 = wheezy+1 コード名 = sid

コード名の歴史は、Debian FAQ: 6.3.1 Which other codenames have been used in the past? に記載されています。

比較的厳格な Debian アーカイブの用語法では、"セクション" という言葉はアプリケーションの分野によるパッケージ分類に特化して使われます。(しかし、"main セクション" という言葉は main エリアを提供する Debian アーカイブ部分を表現するのにしばしば使われています。)

Debian デベロッパー (DD) が不安定版 unstable アーカイブに新たなアップロードを (incoming での処理を経由して) する度毎に、アップロードするパッケージが最新の不安定版 unstable アーカイブの最新のパッケージ集合とコンパチブルであるようにする義務が DD にはあります。

重要なライブラリーのアップグレード他の理由で DD がこのコンパチビリティーを壊す際には、debian-devel のメーリングリスト他に通常アナウンスがされます。

Debian のアーカイブ管理スクリプトによって非安定版 unstable アーカイブからテスト版 testing アーカイブへパッケージ集合が移動される前に、アーカイブ管理スクリプトはパッケージの成熟度 (約10日経過) と RC バグレポート状況を確認するばかりでなく、テスト版 testing アーカイブの最新パッケージ集合とのコンパチブルであるようにするように努めます。このプロセスがあるので、テスト版 testing アーカイブは非常に新しくかつ使いやすいのです。

リリースチームによる徐々のアーカイブ凍結過程を通じて、少々の手動の介入を伴いつつテスト版 testing アーカイブは完全に整合性をもったバグの無い状態へと徐々に熟成されます。そして、古いテスト版 testing アーカイブのコード名を新たな安定版 stable アーカイブへと割り当て、新たなコード名を新たなテスト版 testing アーカイブへと割り当てることで、新たな安定版 stable がリリースされます。新たなテスト版 testing アーカイブの当初の内容は、新たにリリースされた安定版 stable アーカイブとまったく同じです。

不安定版 unstable もテスト版 testing アーカイブもともにいくつかの要因で一時的に細かな問題発生があるかもしれません。

  • ブロークンなパッケージのアーカイブへのアップロード (主に unstable にて)
  • 新規パッケージをアーカイブに受け入れる際の遅延 (主に unstable にて)
  • アーカイブの同期のタイミング問題 (testingunstable の両方にて)。
  • パッケージの除去などのアーカイブへの手動の介入 (どちらかといえば testing にて)、等。

もしこれらのアーカイブを使おうと考えるなら、この種の細かな問題の修復や回避は必須技能です。

[注意] 注意

たとえいつも非安定版 unstable やテスト版 testing アーカイブを使っていようとも、ほとんどのデスクトップユーザーは新たな安定版 stable リリースの後約数ヶ月はセキュリティーアップデートされた安定版 stable アーカイブを使うべきです。この移行期は、非安定版 unstable もテスト版 testing アーカイブの何れももほとんどの人に良いものではありません。非安定版 unstable アーカイブを使おうとすると、核となるパッケージが大アップグレードの嵐に見舞われるので、あなたのシステムをうまく使える状態に保つのは困難です。テスト版 testing アーカイブを使おうとしても、安定版 stable アーカイブとほとんど同じ内容でセキュリティーサポートはありません (Debian testing-security-announce 2008-12)。1ヶ月ほど経てば、非安定版 unstable アーカイブなら注意を払えば使えるかもしれません。

[ティップ] ティップ

テスト版 testing アーカイブを追跡している際には、除去されたパッケージによって引き起こされる問題は該当するバグ修正のためにアップロードされたパッケージを非安定版 unstable アーカイブからインストールすれば通常回避できます。

アーカイブの定義は、Debian ポリシーマニュアルを参照下さい。

2.1.5. パッケージ依存関係

Debian システムはコントロールファイル中のバージョン情報付きのバイナリー依存関係宣言を通して整合性のあるバイナリーパッケージの集合を提供します。ここにその少々簡素化し過ぎの定義を示します。

  • "Depends"

    • これは絶対依存を宣言し、このフィールドにリストされた全てのパッケージは同時または事前にインストールされていなければいけません。
  • "Pre-Depends"

    • これは、リストされたパッケージが事前にインストールを完了している必要がある以外は、Depends と同様です。
  • "Recommends"

    • これは強いが絶対でない依存を宣言します。多くのユーザーはこのフィールドにリストされたパッケージ全てがインストールされていなければ、当該パッケージを望まないでしょう。
  • "Suggests"

    • これは弱い依存を宣言します。このパッケージの多くのユーザーはこのフィールドにリストされたパッケージをインストールすればメリットを享受できるとは言え、それら抜きでも十分な機能が得られます。
  • "Enhances"

    • これは Suggests 同様の弱い依存を宣言しますが、依存作用の方向が逆です。
  • "Breaks"

    • これは通常バージョン制約付きでパッケージのインコンパチビリティーを宣言します。一般的にこのフィールドにリストされた全てのパッケージをアップグレードすることで解決します。
  • "Conflicts"

    • これは絶対的排他関係を宣言します。このフィールドにリストされた全てのパッケージを除去しない限り当該パッケージをインストールできません。
  • "Replaces"

    • 当該パッケージによりインストールされるファイルがこのフィールドにリストされたパッケージのファイルを置き換える際にこれを宣言します。
  • "Provides"

    • 当該パッケージがこのフィールドにリストされたパッケージのファイルと機能の全てを提供する際にこれを宣言します。
[注記] 注記

正常な設定として "Provides" と "Conflicts" と "Replaces" とを単一バーチャルパッケージに対し同時宣言することがあります。こうするといかなる時にも当該バーチャルパッケージを提供する実パッケージのうち確実に一つだけがインストールされます。

ソースの依存関係をも含む正式の定義は the Policy Manual: Chapter 7 - Declaring relationships between packages にあります。

2.1.6. パッケージ管理のイベントの流れ

パッケージ管理の簡略化されたイベントの流れをまとめると次のようになります。

  • 更新 ("aptitude update" か "apt-get update"):

    1. アーカイブメタデーターをリモートアーカイブから取得
    2. APT が使えるようローカルメタデーターの再構築と更新
  • アップグレード ("aptitude safe-upgrade" と "aptitude full-upgrade" か、"apt-get upgrade" と "apt-get dist-upgrade"):

    1. 全てのインストール済みパッケージに関して、通常最新バージョンが選ばれる候補バージョンを選択 (例外については「候補バージョンの調整」参照)
    2. パッケージ依存関係解決の実行
    3. もし候補バージョンがインストール済みバージョンと異なる際には、選ばれたバイナリーパッケージをリモートアーカイブから取得
    4. 取得バイナリーパッケージの開梱
    5. preinst スクリプトの実行
    6. バイナリーファイルのインストール
    7. postinst スクリプトの実行
  • インストール ("aptitude install ..." か "apt-get install ..."):

    1. コマンドラインにリストされたパッケージの選択
    2. パッケージ依存関係解決の実行
    3. 選ばれたバイナリーパッケージをリモートアーカイブから取得
    4. 取得バイナリーパッケージの開梱
    5. preinst スクリプトの実行
    6. バイナリーファイルのインストール
    7. postinst スクリプトの実行
  • 削除 ("aptitude remove ..." か "apt-get remove ..."):

    1. コマンドラインにリストされたパッケージの選択
    2. パッケージ依存関係解決の実行
    3. prerm スクリプトの実行
    4. 設定ファイル以外のインストール済みファイルの削除
    5. postrm スクリプトの実行
  • 完全削除 ("aptitude purge ..." か "apt-get purge ..."):

    1. コマンドラインにリストされたパッケージの選択
    2. パッケージ依存関係解決の実行
    3. prerm スクリプトの実行
    4. 設定ファイルを含めたインストール済みファイルの削除
    5. postrm スクリプトの実行

上記では全体像の理解のためにわざと技術詳細を端折っています。

2.1.7. パッケージ管理のトラブルへの応急対処法

内容が正確な正式文書を読むように心がけるべきです。まず Debian に特定のことが記載された "/usr/share/doc/<package_name>/README.Debian" を最初に読むべきです。また "/usr/share/doc/<package_name>/" の中にある他の文書も参照すべきです。「Bash のカスタム化」に書かれたようなシェル設定がされていれば、次のようにタイプして下さい。

$ cd <package_name>
$ pager README.Debian
$ mc

さらに詳しい情報を得るには "-doc" というサフィクスを持った対応する文書パッケージをインストールする必要があるかもしれません。

特定パッケージに関する問題に出会った際には、Debian バグトラッキングシステム (BTS) サイトを必ず確認します。

表2.5 特定パッケージの問題解決のためのキーとなるウェッブサイトのリスト

ウェッブサイト コマンド
Debian バグトラッキングシステム (BTS) のホームページ sensible-browser "http://bugs.debian.org/"
既知のパッケージに関するバグレポート sensible-browser "http://bugs.debian.org/<package_name>"
既知のバグ番号に関するバグレポート sensible-browser "http://bugs.debian.org/<bug_number>"

"site:debian.org" や "site:wiki.debian.org" や "site:lists.debian.org" 等を含む検索語で Google を検索します。

バグ報告をする際には、reportbug(1) コマンドを使います。

2.2. 基本的パッケージ管理操作

Debian システム上での基本的なパッケージ管理は Debian システム上にあるどのパッケージ管理ツールを使ってもできます。ここでは、apt-get / apt-cacheaptitude といった基本的なパッケージ管理ツールを説明します。

パッケージをインストールしたりパッケージのメタデーターを更新するようなパッケージ管理操作には root 権限が必要です。

2.2.1. apt-get/apt-cacheaptitude の比較

apt-getapt-cache コマンドは最も基本的なパッケージ管理ツールです。

  • apt-get/apt-cache はコマンドラインのユーザーインターフェースのみを提供します。
  • apt-get はリリース間のような大掛かりなシステムアップグレードに最適です。
  • apt-get は共通のパッケージ状態データーを使う頑強で安定なパッケージリゾルバーを提供します。
  • apt-get は推薦パッケージの自動インストールと自動削除をサポートするように更新されています。
  • apt-get はパッケージ活動のログをサポートするように更新されています。
  • apt-cache はパッケージ名や説明に関して標準の regex を使った検索機能を提供します。
  • apt-getapt-cache/etc/apt/preferences を使って複数のバージョンのパッケージを管理できますが、それはとても面倒です。

aptitude コマンドは最も多芸なパッケージ管理ツールです。

  • aptitude はフルスクリーンのインタラクティブなテキストユーザーインターフェースを提供します。
  • aptitude はコマンドラインのユーザーインターフェースも提供します。
  • aptitude はインストールされたパッケージを検査したり入手可能なパッケージを探索したりするような日常のインタラクティブなパッケージ管理に最適です。
  • aptitudeaptitude のみにより使われる追加のパッケージ状態データーもまた使う拡張パッケージリゾルバーを提供します。
  • aptitude は推薦パッケージの自動インストールや自動削除をサポートします。
  • aptitude はパッケージ活動のログをサポートします。
  • aptitude はパッケージメタデータ全てに関する拡張されたregex を使った探索を提供します。
  • aptitude/etc/apt/preferences を使わずに複数のバージョンのパッケージを管理できますし、それは非常に直感的です。
[注記] 注記

aptitude コマンドはその拡張されたパッケージリゾルバーのような豊富なフィーチャーとともに提供されますが、この複雑さは Bug #411123Bug #514930Bug #570377 のようないくつかのリグレッションを引き起こしました (また起こしているかもしれません)。疑いのある場合には、aptitude コマンドに代えて apt-getapt-cache コマンドを使ってください。

2.2.2. コマンドラインによる基本的なパッケージ管理操作

aptitude(8) や apt-get(8) /apt-cache(8) を使うコマンドラインによるパッケージ管理操作を次に記します。

表2.6 aptitude(8) や apt-get(8) /apt-cache(8) を使うコマンドラインによる基本パッケージ管理操作

aptitude シンタックス apt-get/apt-cache シンタックス 説明
aptitude update apt-get update パッケージアーカイブメタデーター更新
aptitude install foo apt-get install foo "foo" パッケージの候補バージョンをその依存関係とともにインストール
aptitude safe-upgrade apt-get upgrade 他のパッケージを削除すること無くインストール済みパッケージの候補バージョンをインストール
aptitude full-upgrade apt-get dist-upgrade <パッケージ> 必要なら他のパッケージを削除しながらインストール済みパッケージの候補バージョンをインストール
aptitude remove foo apt-get remove foo 設定ファイルを残したまま "foo" パッケージを削除
N/A apt-get autoremove 既に必要なくなっている自動済みパッケージを削除
aptitude purge foo apt-get purge foo 設定ファイルを含めて "foo" パッケージを完全削除
aptitude clean apt-get clean 収集されローカルに貯蔵されたパッケージファイルを完全消去
aptitude autoclean apt-get autoclean 収集されローカルに貯蔵されたパッケージファイルのうち古くなったパッケージを消去
aptitude show foo apt-cache show <パッケージ> "foo"パッケージに関する詳細情報を表示
aptitude search <regex> apt-cache search <regex> <regex> とマッチするパッケージを検索
aptitude why <regex> N/A なぜ <regex> とマッチするパッケージがインストールされるのかを説明
aptitude why-not <regex> N/A なぜ <regex> とマッチするパッケージがインストールされないのかを説明

[注記] 注記

lenny 以降、apt-getaptitude は自動インストールされたパッケージ状態を共有しているので (「APT に関するパッケージ状態」参照)、これらのツールを特段の問題なく混用できます (Bug #594490 参照)。

"safe-upgrade"/"upgrade" と "full-upgrade"/"dist-upgrade" の違いは新しいバージョンのパッケージが該当する古いバージョンと異なった依存関係がある場合にのみ起こります。"aptitude safe-upgrade" コマンドは新規のパッケージをインストールも削除もしません。

"aptitude why <regex>" は "aptitude -v why <regex>" とすることでさらに詳しい情報を表示します。同様の情報は "apt-cache rdepends <package>" とすることでも得られます。

aptitude コマンドが最初コマンドラインモードで実行されパッケージ間のコンフリクトのような問題に直面した場合は、プロンプトがでた際に "e" を押すことでフルスクリーンのインタラクティブモードに切り替えられます。

"aptitude" のすぐ後ろにコマンドオプションをつけられます。

表2.7 aptitude(8) に関する特記すべきコマンドオプション

コマンドオプション 説明
-s コマンド結果のシミュレート
-d インストール / アップグレード無しにダウンロードのみする
-D 自動的なインストールや削除の前に簡単な説明を表示

詳細は aptitude(8) や "/usr/share/doc/aptitude/README" にある "aptitude user's manual" を参照下さい。

[ティップ] ティップ

現在でも存続している dselect パッケージは、過去のリリースでは推薦されたフルスクリーンのインタラクティブなパッケージ管理ツールでした。

2.2.3. aptitude のインタラクティブな使用

インタラクティブなパッケージ管理のためには aptitude をインタラクティブモードでコンソールのシェルプロンプトから次のように立ち上げます。

$ sudo aptitude -u
Password:

これによりアーカイブ情報のローカルコピーは更新され、フルスクリーンのパッケージリストがメニュー付きで表示されます。Aptitude の設定ファイルは "~/.aptitude/config" にあります。

[ティップ] ティップ

user の設定ファイルでなく root の設定ファイルを使いたい際には、上記の例で "sudo aptitude ..." の代わりに "sudo -H aptitude ..." を使います。

[ティップ] ティップ

Aptitude はインタラクティブに起動されると次にするアクションを自動的に設定します。その設定が好ましくない場合はメニュー:"Action" → "Cancel pending actions" からリセットすることができます。

2.2.4. aptitude のキーバインディング

パッケージの状態を閲覧し、"予定のアクション" の設定をこのフルスクリーンモードで各パッケージするための重要なキーを次に記します。

表2.8 aptitude のキーバインディングのリスト

キー キーバインディング
F10 もしくくは Ctrl-t メニュー
? (より詳細な) キーの意味のヘルプの表示
F10 → ヘルプ → ユーザーマニュアル ユーザーマニュアルの表示
u パッケージアーカイブ情報の更新
+ パッケージをアップグレードまたはインストールするとマーク
- パッケージを削除するとマーク (設定ファイルは温存)
_ パッケージを完全削除するとマーク (設定ファイルも削除)
= パッケージをホールド
U 全てのアップグレード可能なパッケージをマーク (full-upgrade として機能)
g 選ばれたパッケージのダウンロードインストールをスタート
q 現在のスクリーンを終了し変更を保存
x 現在のスクリーンを終了し変更を廃棄
Enter パッケージに関する情報閲覧
C パッケージの変更履歴を閲覧
l 表示されるパッケージの制限を変更
/ 最初のマッチを検索
\ 最終検索の反復

コマンドラインのファイル名の規定や、"l" や "/" を押した後のメニュープロンプトは次に記す aptitude の regex (正規表現) が使われます。aptitude の regex は "~n" で始めそれにパッケージ名を続けた文字列を使うことで明示的にパッケージ名とマッチさせられます。

[ティップ] ティップ

ビジュアルインターフェースで全てのインストール済みパッケージを候補バージョンにアップグレードさせるには "U" を押さなければいけません。これをしないと選ばれたパッケージとそれにバージョン付きの依存関係のある特定のパッケージのみがアップグレードされます。

2.2.5. aptitude の下でのパッケージの表示

インタラクティブなフルスクリーンモードの aptitude(8) はパッケージリスト中のパッケージは次の例のように表示されます。

idA   libsmbclient                             -2220kB 3.0.25a-1  3.0.25a-2

上記の行は左から次に記すような意味です。

  • "現状" フラグ (1番目の文字)
  • "予定のアクション" フラグ (2番目の文字)
  • "自動" フラグ (3番目の文字)
  • パッケージ名
  • "予定のアクション" に帰属されるディスク空間の使用の変化
  • パッケージの現バージョン
  • パッケージの候補バージョン
[ティップ] ティップ

"?" を押して表示されるヘルプスクリーンの一番下に全フラグのリストがあります。

現在のローカルの環境設定によって候補バージョンは選ばれます (apt_preferences(5) と「候補バージョンの調整」を参照)。

"表示" メニューの下に数種のパッケージ表示があります。

表2.9 aptitude の表示のリスト

表示 状況 ビューの説明
パッケージ画面 良好 表2.10「標準パッケージ画面の分類」参照 (デフォールト)
推奨を監査 良好 何らかのインストール済みパッケージによって推薦されているがインストールされていないパッケージをリスト
平坦なパッケージリスト 良好 パッケージを分類せずにリスト (regex とともに使用)
Debtags 表示 十分使える パッケージの debtags のエントリーにより分類したパッケージをリスト
カテゴリー別表示 非推奨 パッケージのカテゴリー別に分類してパッケージをリスト (これに代えて Debtags 表示を利用しましょう)

標準 "パッケージ画面" はパッケージを dselect にいくつかの機能を加えた感じで分類します。

表2.10 標準パッケージ画面の分類

分類 ビューの説明
更新可能なパッケージ sectionareapackage と整理してパッケージをリスト
新規パッケージ , ,
インストール済みのパッケージ , ,
インストールされていないパッケージ , ,
廃止された、またはローカルで作成されたパッケージ , ,
仮想パッケージ 同一機能のパッケージをリスト
タスク タスクに一般的に必要な機能を持つパッケージのリスト

[ティップ] ティップ

Tasks ビューはあなたのタスクに使うパッケージをいいとこ取りするのに使えます。

2.2.6. aptitude を使った探索方法

Aptitude はその regex 式機能を通してパッケージを探索する方法をいくつか提供します。

  • シェルコマンドライン:

    • マッチするパッケージのインストール状態やパッケージ名や短い説明をリストをする、"aptitude search '<aptitude_regex>'"
    • パッケージの詳細説明のリストをする、"aptitude show '<package_name>'"
  • 対話型フルスクリーンモード:

    • マッチするパッケージにパッケージビューを絞る、"l"
    • マッチするパッケージを探す、"/"
    • マッチするパッケージを逆方向に探す、"\"
    • 次を探す、"n"
    • 次を逆方向に探す、"N"
[ティップ] ティップ

<package_name> という文字列は、"~" で始めて regex 式と明示されていない限り、パッケージ名との完全な一致検索として扱います。

2.2.7. aptitude の regex 式

aptitude の regex 式は mutt 的な拡張 ERE (「正規表現」参照) で aptitude に特定なマッチ規則の拡張は次に示すとおりです。

表2.11 aptitude の regex 式のリスト

拡張マッチ規則の説明 regex 式
パッケージ名とのマッチ ~n<名前のregex>
記述とのマッチ ~d<記述のregex>
タスク名とのマッチ ~t<タスクのregex>
debtag とのマッチ ~G<debtagのregex>
メンテナとのマッチ ~m<maintainerのregex>
パッケージセクションとのマッチ ~s<セクションのregex>
パッケージバージョンとのマッチ ~V<バージョンのregex>
アーカイブ (archive) とのマッチ ~A{sarge,etch,sid}
オリジン (origin) とのマッチ ~O{debian,…}
優先度 (priority) とのマッチ ~p{extra,important,optional,required,standard}
必須 (essential) パッケージとのマッチ ~E
仮想パッケージとのマッチ ~v
新規パッケージとのマッチ ~N
次のアクションとのマッチ ~a{install,upgrade,downgrade,remove,purge,hold,keep}
インストール済みパッケージとのマッチ ~i
A-マークのついたインストール済みパッケージとマッチ (自動インストール済みパッケージ) ~M
A-マークのついていないインストール済みパッケージとマッチ (管理者が選択したパッケージ) ~i!~M
インストール済みかつアップグレード可能なパッケージとマッチ ~U
削除済みだが完全削除されていないパッケージとマッチ ~c
削除済みか完全削除済みか削除可能なパッケージとマッチ ~g
パッケージ依存関係が壊れたパッケージとマッチ ~b
depends/predepends/conflict の依存関係が壊れたパッケージとマッチ ~B<type>
<term> パッケージに対して <type> の依存関係があるパッケージとマッチ ~D[<type>:]<term>
<term> パッケージに対して <type> の壊れた依存関係があるパッケージとマッチ ~DB[<type>:]<term>
<term> パッケージに対して <type> の依存関係があるパッケージとマッチ ~R[<type>:]<term>
<term> パッケージに対して <type> の壊れた依存関係があるパッケージとマッチ ~RB[<type>:]<term>
他のインストール済みパッケージが依存するパッケージとマッチ ~R~i
他のインストール済みパッケージが一切依存しないパッケージとマッチ !~R~i
他のインストール済みパッケージが依存もしくは推薦するパッケージとマッチ ~R~i|~Rrecommends:~i
フィルターされたバージョンの <term> とマッチ ~S filter <term>
常に全てのパッケージにマッチ (真) ~T
どのパッケージにもマッチしない (偽) ~F

  • regex 部分は、"^" や ".*" や "$" などを使う egrep(1) や awk(1) や perl(1) といった典型的な Unix 的テキストツールで使われる ERE と同様です。
  • 依存関係を表す <type> は (depends, predepends, recommends, suggests, conflicts, replaces, provides) の内の1つです。
  • デフォールトの依存関係は "depends" です。
[ティップ] ティップ

<regex_pattern> がヌル文字列の場合は "~T" をコマンドの直後に使って下さい。

次がショートカットです。

  • "~P<term>" == "~Dprovides:<term>"
  • "~C<term>" == "~Dconflicts:<term>"
  • "…~W term" == "(…|term)"

mutt が表現のお手本なので、mutt に慣れているユーザーはすぐ慣れるでしょう。"User's Manual" ("/usr/share/doc/aptitude/README") 中の "SEARCHING, LIMITING, AND EXPRESSIONS" を参照下さい。

[注記] 注記

lenny バージョンの aptitude(8) では、新規の "?broken" のような長形式の regex マッチ形式が、古い "~b" のような短形式のマッチ形式に代えて使えます。そのためチルダ文字 "~" に加えてスペース文字 " " も regex の終端文字として扱われます。新規の長形式のマッチ形式については "User's Manual" を参照下さい。

2.2.8. aptitude による依存関係の解決

aptitude によるパッケージの選択は、"F10 → Options → Dependency handling" のメニュー設定に従って、"Depends:" リストに規定されたパッケージばかりでは無く "Recommends:" リストに規定されたパッケージも引き込みます。このような自動的にインストールされたパッケージは不要になると aptitude が自動的に削除します。

[注記] 注記

lenny リリース以前は、apt-get 等の他の標準的な APT ツールは自動的削除機能がありませんでした。

2.2.9. パッケージアクティビティーログ

パッケージアクティビティーの履歴はログファイルで確認できます。

表2.12 パッケージアクティビティーのログファイル

ファイル 内容
/var/log/dpkg.log 全パッケージアクティビティの dpkg レベルのアクティビティーのログ
/var/log/apt/term.log APT アクティビティのログ
/var/log/aptitude aptitude コマンドアクティビティのログ

これらのログから意味のある理解を迅速に得るのは実際には難しいです。より簡単な方法については「設定ファイルの変更記録」を参照下さい。

2.3. aptitude 操作例

aptitude(8) 操作例を次に示します。

2.3.1. regex にマッチするパッケージ名のパッケージをリスト

次のコマンドはパッケージの名前が regex にマッチするパッケージをリストします。

$ aptitude search '~n(pam|nss).*ldap'
p libnss-ldap - NSS module for using LDAP as a naming service
p libpam-ldap - Pluggable Authentication Module allowing LDAP interfaces

これはパッケージの正確な名前を探すときに非常に便利です。

2.3.2. regex マッチをしての閲覧

"平坦なパッケージリスト" のビューで "l" のプロンプトに regex "~dipv6" を入れるとその意味にマッチするパッケージにビューが制限され、その情報をインタラクティブに閲覧できます。

2.3.3. パッケージの完全削除

削除したパッケージが残した全ての設定ファイルを次のようにして完全削除できます。

次のコマンドの結果をチェックします。

# aptitude search '~c'

もしリストされたパッケージが完全削除されても問題ないなら、次のコマンドを実行します。

# aptitude purge '~c'

同様のことをインタラクティブにすればよりきめの細かい結果が得られます。

"平坦なパッケージリスト" のビューで "l" のプロンプトに regex "~c" を入れると regex にマッチする "削除されたが完全駆除されていない" パッケージにビューが制限されます。トップレベルの見出しの上で "[" を押すと regex にマッチする全てのパッケージが表示されます。

次に "インストール済みのパッケージ" 等のトップレベルの見出しの上で "_" を押します。その見出しの下の regex にマッチするパッケージだけが完全削除と設定されます。インタラクティブに個々のパッケージの上で "=" を押せばそれらのパッケージを完全削除対象から外せます。

このテクニックは非常に便利で、他の多くのコマンドキーでも使えます。

2.3.4. 自動 / 手動インストール状態の整理

(非 aptitude のパッケージインストーラー等を使った後で) パッケージの自動 / 手動インストールの状態を整理する私の方法を次に記します。

  1. aptitude を root としてインタラクティブに起動します。
  2. "u" と "U" と "f" と "g" とタイプしてパッケージリストを更新しパッケージをアップグレードします。
  3. パッケージ表示制限を "~i(~R~i|~Rrecommends:~i)" と入力するために "l" とタイプし、自動インストールとなるよう "M" と "インストール済みのパッケージ" の上でタイプします。
  4. パッケージ表示制限を "~prequired|~pimportant|~pstandard|~E" と入力するために "l" とタイプし、手動インストールとなるよう "m" と "インストール済みのパッケージ" の上でタイプします。
  5. パッケージ表示制限を "~i!~M" と入力するために "l" とタイプし、"インストール済みのパッケージ" の上で "[" とタイプしてパッケージを見えるようにした後で個々のパッケージの上で "-" とタイプして使っていないパッケージを削除します。
  6. パッケージ表示制限を "~i(~R~i|~Rrecommends:~i)" と入力するように "l" とタイプし、"インストール済みのパッケージ" の上で自動インストールとなるよう "M" とタイプします。
  7. aptitude を終了します。
  8. "apt-get -s autoremove|less" と root から起動して何が使われていないのか確認します。
  9. aptitude とインタラクティブモードで再起動して必要なパッケージを "m" でマークします。
  10. "apt-get -s autoremove|less" と root から再起動して削除対象が期待にかなっていることを再確認します。
  11. "apt-get autoremove|less" と root から起動して使用していないパッケージを自動削除します。

"Tasks" の上で "m" を押すのも一案で、大量ファイル除去となる事態が回避できます。

2.3.5. システム全体のアップグレード

[注記] 注記

新規リリース等への移行は、Debian では下記のようにアップグレードできるのですが、新たなシステムをクリーンインストールすることを考えるべきです。こうすると溜めてきたゴミの除去ができる上に最新のパッケージの最良の組み合わせも分かります。もちろん安全な場所に完全なシステムのバックアップ (「バックアップと復元」参照) を事前にしなくてはいけません。異なったパーティションを使ったデュアルブート設定をすることをスムーズな移行をするためにお薦めします。

"/etc/apt/sources.list" ファイルの内容を新規リリースへと向けるように変更し、"apt-get update; apt-get dist-upgrade"コマンドを実行することでシステム全体のアップグレードができます。

安定版 stable からテスト版 testing や不安定版 unstable にアップグレードするには、「Debian アーカイブの基本」にある "/etc/apt/sources.list" 例の "squeeze" を "wheezy" か "sid" に置き換えます。

一部のパッケージで移行に関して支障をきたすことが実際には起こるかもしれません。これは大体パッケージ依存関係に起因します。アップグレードする差が大きければ大きいほど比較的大きな問題似合う可能性がより大きくなります。以前の安定版 stable からリリース後の新規安定版 stable への移行では新規リリースノートを読んでそこに記載された手続き通りに完全にすれば問題発生を防げます。

安定版 stable からテスト版 testing へ移行すると決めた時には頼りにするリリースノートはありません。前回の安定版 stable のリリースの後で安定版 stable とテスト版 testing の差がかなり大きくなっているかもしれません。そうだとアップグレードをする状況は複雑になっています。

メーリングリストから最新情報を収集するとか常識を使うといった予防措置をしながらフルアップグレードをするべきです。

  1. 前回の "リリースノート" を読みます。
  2. 全システム (特にデーターや設定情報) をバックアップします。
  3. ブートローダーが壊れたときのためにブートできるメディアを確保します。
  4. システムを使っているユーザーに十分事前に通告します。
  5. script(1) を使ってアップグレード活動を記録します。
  6. 削除をされないように "aptitude unmarkauto vim" 等として、"unmarkauto" を重要なパッケージに適用します。
  7. デスクトップタスクにあるパッケージ等を削除して、インストールされたパッケージを減らしてパッケージがコンフリクトする可能性を減らします。
  8. "/etc/apt/preferences" ファイルを削除します (apt-pinning を無効化)。
  9. 段階的にアップグレードしましょう: 旧安定版 oldstable → 安定版 stable → テスト版 testing → 不安定版 unstable
  10. "/etc/apt/sources.list" ファイルを更新して新アーカイブ対象に "aptitude update" を実行します。
  11. "aptitude install perl" 等として、先に新規の中核的パッケージを必要に応じてインストールします。
  12. "apt-get -s dist-upgrade" コマンドを実行して影響を確認します。
  13. 最後に "apt-get dist-upgrade" コマンドを実行します。
[注意] 注意

stable リリース間でアップグレードする際に Debian のメジャーリリースを飛ばすのは賢明ではありません。

[注意] 注意

過去の "リリースノート" ではシステム全体のアップグレードをするのに GCC や Linux カーネルや initrd-tools や Glibc や Perl や APT tool chain 等には特別な配慮が必要でした。

unstable での毎日のアップグレードは「パッケージ問題からの防御」を参照下さい。

2.4. 高度なパッケージ管理操作

2.4.1. コマンドラインによる高度なパッケージ管理操作

aptitude ではハイレベル過ぎるとか必要な機能を欠くという他のパッケージ管理操作のリストです。

表2.13 高度なパッケージ管理操作

コマンド アクション
COLUMNS=120 dpkg -l <パッケージ名パターン> バグレポートのためにインストールされたパッケージの状態をリスト
dpkg -L <パッケージ名> インストールされたパッケージの内容をリスト
dpkg -L <パッケージ名> | egrep '/usr/share/man/man.*/.+' インストールされたパッケージのマンページをリスト
dpkg -S <ファイル名パターン> マッチするファイル名があるインストールされたパッケージをリスト
apt-file search <ファイル名パターン> マッチするファイル名があるアーカイブ中のパッケージをリスト
apt-file list <パッケージ名パターン> アーカイブ中のマッチするパッケージをリスト
dpkg-reconfigure <パッケージ名> 特定パッケージを再設定
dpkg-reconfigure -p=low <パッケージ名> もっとも詳細な質問で特定パッケージを再設定
configure-debian フルスクリーンメニューからパッケージを再設定
dpkg --audit 部分的にインストールされたパッケージに関してシステムを監査
dpkg --configure -a 全ての部分的にインストールされたパッケージを設定
apt-cache policy <バイナリーパッケージ名> バイナリーパッケージに関して使用可能なバージョンやプライオリティーやアーカイブ情報を表示
apt-cache madison <パッケージ名> パッケージに関して使用可能なバージョンやアーカイブ情報を表示
apt-cache showsrc <バイナリーパッケージ名> バイナリーパッケージに関してソースパッケージの情報を表示
apt-get build-dep <パッケージ名> パッケージをビルドするのに必要なパッケージをインストール
apt-get source <パッケージ名> (標準アーカイブから) ソースをダウンロード
dget <dsc ファイルの URL> (他のアーカイブから) ソースをダウンロード
dpkg-source -x <パッケージ名>_<バージョン>-<debianバージョン>.dsc ソースパッケージの組 ("*.tar.gz" と "*.debian.tar.gz" / "*.diff.gz") からソースツリーをビルド
debuild binary ローカルのソースツリーからパッケージをビルド
make-kpkg kernel_image カーネルソースツリーからカーネルパッケージをビルド
make-kpkg --initrd kernel_image カーネルソースツリーから initramfs を有効にしてカーネルパッケージをビルド
dpkg -i <パッケージ名>_<バージョン>-<debian_バージョン>_<アーキテクチャー名>.deb ローカルパッケージをシステムにインストール
debi <パッケージ名>_<バージョン>-<debian_バージョン>_<アーキテクチャー名>.dsc ローカルパッケージ (複数) をシステムにインストール
dpkg --get-selections '*' >selection.txt dpkg レベルのパッケージ選択状態情報を保存
dpkg --set-selections <selection.txt dpkg レベルのパッケージ選択状態情報を設定
echo <package_name> hold | dpkg --set-selections 特定パッケージの dpkg レベルのパッケージ選択状態を hold にする ("aptitude hold <package_name>" と等価)

[注意] 注意

"dpkg -i …" や "debi …" といった低いレベルのパッケージツールはシステム管理者によって注意深く使われなければいけません。必要なパッケージ依存関係を自動的に面倒見てくれません。Dpkg の "--force-all" や類似のコマンドラインオプション (dpkg(1) 参照) はエキスパートだけが使うようにできています。十分にその影響を理解せずに使うとシステム全体を壊してしまうかもしれません。

以下に注意下さい。

  • 全てのシステム設定やインストールコマンドは root から実行なければいけません。
  • regex (「正規表現」参照) を使う aptitude と異なり、他のパッケージ管理コマンドはシェルグロブ (「シェルグロブ」参照) のようなパターンを使います。
  • apt-file パッケージに入っている apt-file(1) は事前に "apt-file update" を実行する必要があります。
  • configure-debian パッケージに入っている configure-debian(8) はそのバックエンドとして dpkg-reconfigure(8) を実行します。
  • dpkg-reconfigure(8) はそのバックエンドとして debconf(1) を利用するパッケージスクリプトを実行します。
  • "apt-get build-dep" や "apt-get source" や "apt-cache showsrc" コマンドは "/etc/apt/sources.list" の中に "deb-src" エントリーが必要です。
  • dget(1) や debuild(1) や debi(1) は devscripts パッケージが必要です。
  • "apt-get source" を使った (再)パッケージ化の手続きは「安定版システムへのパッケージ移植」を参照下さい。
  • make-kpkg コマンドは kernel-package パッケージが必要です (「カーネル」参照)。
  • 一般的なパッケージ化に関しては「Debian パッケージ作成」を参照下さい。

2.4.2. インストールされたパッケージファイルの検証

debsums をインストールすると debsums(1) を使って "/var/lib/dpkg/info/*.md5sums" ファイル中の MD5sum 値との比較でインストールされたパッケージファイルを検証できます。MD5sum がどのような仕組かは「MD5 和」参照下さい。

[注記] 注記

侵入者によって MD5sum のデーターベースが改竄されているかもしれないので debsums(1) はセキュリティーツールとしては限定的有用性しかありません。管理者によるローカルの変更や記憶メディアのエラーによる損傷を点検するぐらいには有用です。

2.4.3. パッケージ問題からの防御

多くのユーザーは新規機能やパッケージを求めて Debian システムの非安定版 unstable リリースを追いかけることを好みます。こういうことをするとクリティカルなパッケージのバグにシステムが遭遇しやすくなります。

apt-listbugs パッケージをインストールすれば、APT システムを使ってアップグレードする時に Debian の BTS を自動的にクリティカルなバグに関して点検することで、クリティカルなバグからあなたのシステムを防御できます。

apt-listchanges パッケージをインストールすれば、APT システムを使ってアップグレードする時に NEWS.Debian 中の重要ニュースを表示します。

2.4.4. パッケージメタデーターの検索

最近は Debian サイトの http://packages.debian.org/ を訪問するとパッケージメタデーターの検索を簡単に出きるようになっていますが、より伝統的な方法を見てみます。

grep-dctrl(1) や grep-status(1) や grep-available(1) コマンドは Debian のパッケージコントロールファイルの一般的フォーマットに従ういかなるファイルを検索するのにも使えます。

マッチする名前のファイルを含む dpkg でインストールされたパッケージ名を探索するのに "dpkg -S <ファイル名パターン>" が使えます。しかしメンテナスクリプトで生成されるファイルはこれでは見逃されます。

dpkg のメタデーターに関してより詳細な検索をする必要がある場合、"/var/lib/dpkg/info/" ディレクトリーで "grep -e regexパターン *" コマンドを実行しないといけません。こうすることでパッケージスクリプトやインストール時の質問テキスト中の言葉まで検索できます。

パッケージ依存関係を再帰的に検索したい際には、apt-rdepends(8) を使います。

2.5. Debian パッケージ管理の内部

Debian のパッケージ管理システムが内部的のどのように機能するのかを学びます。何らかのパッケージ問題が発生した際にあなた自身の解決を見出すのに役立つでしょう。

2.5.1. アーカイブのメタデーター

各ディストリビューションのメタデーターのファイルは例えば "http://ftp.us.debian.org/debian/" のような各 Debian ミラーサイトの "dist/<コード名>" の下に保存されています。そのアーカイブ構造はウェッブブラウザーで閲覧できます。6つのタイプの重要メタデーターがあります。

表2.14 Debian アーカイブのメタデーターの内容

ファイル 場所 内容
Release ディストリビューションのトップ アーカイブの説明との整合性情報
Release.gpg ディストリビューションのトップ アーカイブキーで署名された "Release" ファイルに関する署名ファイル
Contents-<アーキテクチャー> ディストリビューションのトップ 該当アーカイブ中全てのパッケージに関する全ファイルリスト
Release 各ディストリビューション / エリア / アーキテクチャーの組み合わせのトップ apt_preferences(5) のルールに利用されるアーカイブの記述。
Packages 各ディストリビューション / エリア / バイナリーアーキテクチャーの組み合わせのトップ バイナリーパッケージに関して debian/control を連結
Sources 各ディストリビューション / エリア / ソースの組み合わせのトップ ソースパッケージに関して debian/control を連結

最近のアーカイブではネットワークトラフィックを減らすべく圧縮された差分ファイルとしてこれらのメタデーターは保存されています。

2.5.2. トップレベルの "Release" ファイルと信憑性

[ティップ] ティップ

セキュアー APT システムではトップレベルの "Release" ファイルがアーカイブを署名するのに使われています。

Debian アーカイブの各スイーツには例えば次に示すような "http://ftp.us.debian.org/debian/dists/unstable/Release" のようなトップレベルの "Release" ファイルがあります。

Origin: Debian
Label: Debian
Suite: unstable
Codename: sid
Date: Sat, 26 Jan 2008 20:13:58 UTC
Architectures: alpha amd64 arm hppa hurd-i386 i386 ia64 m68k mips mipsel powerpc s390 sparc
Components: main contrib non-free
Description: Debian x.y Unstable - Not Released
MD5Sum:
 e9f11bc50b12af7927d6583de0a3bd06 22788722 main/binary-alpha/Packages
 43524d07f7fa21b10f472c426db66168  6561398 main/binary-alpha/Packages.gz
...
[注記] 注記

「Debian アーカイブの基本」の中で "スイーツ (suite)" や "コード名 (codename)" を使う理由はこれを見れば分かるでしょう。"ディストリビューション" は "スイーツ" と "コード名" との両方を指したい際に用いられます。アーカイブが提供する全アーカイブ "エリア (area)" 名が "Component" の下にリストされます。

トップレベルの "Release" ファイルの整合性は セキュアー apt という暗号学手法インフラストラクチャーによって検証されます。

  • 暗号手法による署名ファイル "Release.gpg" は真正のトップレベルの "Release" ファイルと秘密の Debian アーカイブキーから作成されます。
  • 公開の Debian アーカイブキーは "/etc/apt/trusted.gpg" に取り込むには次のようにします。

  • セキュアー APT システムはこの "Release.gpg" ファイルと "/etc/apt/trusted.gpg" 中の公開アーカイブキーを用いてダウンロードされたトップレベルの "Release" ファイルの整合性を暗号学手法を用いて検証します。

"全ての Packages" と "Sources ファイルの整合性はそのトップレベルの "Release" ファイル中の MD5sum 値を用いて検証します。"パッケージファイルの整合性は "Packages" や "Sources" ファイル中の MD5sum 値を用いて検証します。debsums(1) と「インストールされたパッケージファイルの検証」を参照下さい。

暗号学手法を用いた署名の検証は MD5sum 値の計算よりも非常に CPU を使うプロセスなので、トップレベルの "Release" ファイルには暗号学手法を用いた署名を使いつつ各パッケージには MD5sum 値を用いることでパーフォーマンスを保ったまま良好なセキュリティーが確保できます (「データーセキュリティーのインフラ」参照)。

2.5.3. アーカイブレベルの "Release" ファイル

[ティップ] ティップ

アーカイブレベルの "Release" ファイルが apt_preferences(5) のルールに使われます。

"http://ftp.us.debian.org/debian/dists/unstable/main/binary-amd64/Release" や "http://ftp.us.debian.org/debian/dists/sid/main/binary-amd64/Release" 等の "/etc/apt/sources.list" 中の "deb" 行で特定される全てのアーカイブロケーションにはアーカイブレベルの次に示すような "Release" ファイルがあります。

Archive: unstable
Component: main
Origin: Debian
Label: Debian
Architecture: amd64
[注意] 注意

"Archive:" スタンザには、Debian アーカイブではスイート名 ("stable" や "testing" や "unstable" 等) が使われますが、Ubuntu アーカイブではコード名 ("dapper" や "feisty" や "gutsy" や "hardy" や "intrepid" 等) が使われます。

experimentalsqueeze-backports のような自動的にインストールされるべきでないパッケージを含むような一部アーカイブでは次に示す "http://ftp.us.debian.org/debian/dists/experimental/main/binary-amd64/Release" のような追加の行があります。

Archive: experimental
Component: main
Origin: Debian
Label: Debian
NotAutomatic: yes
Architecture: amd64

"NotAutomatic: yes" となっていない通常のアーカイブではデフォールトの Pin-Priority 値は 500 ですが、"NotAutomatic: yes" となっている特別なアーカイブではデフォールトの Pin-Priority 値は 1 です (apt_preferences(5) と「候補バージョンの調整」参照)。

2.5.4. パッケージメタデーターの取得

aptitudeapt-getsynapticapt-fileauto-apt 等の APT ツールが使われる際には Debian アーカイブ情報を含むメタデーターのローカルコピーを更新する必要があります。この様なローカルのコピーは "/etc/apt/sources.list" 中のディストリビューション (distribution)エリア (area)アーキテクチャー (architecture) の名前に対応する次のファイル名です (「Debian アーカイブの基本」参照)。

  • "/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<ディストリビューション>_Release"
  • "/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<ディストリビューション>_Release.gpg"
  • "/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<ディストリビューション>_<エリア>_source_Sources"
  • "/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<ディストリビューション>_<エリア>_source_Sources"
  • "/var/cache/apt/apt-file/ftp.us.debian.org_debian_dists_<ディストリビューション>_Contents-<アーキテクチャー>.gz" (apt-file 用)

最初の4つのタイプのファイルは全ての適切な APT コマンド間で共有されておりコマンドラインから "apt-get update" や "aptitude update" によって更新されます。もし "/etc/apt/sources.list" 中に "deb" 行があれば "Packages" メタデーターが更新されます。もし "/etc/apt/sources.list" 中に "deb-src" 行があれば "Sources" メタデーターが更新されます。

"Packages" や "Sources" メタデーターはバイナリーやソースパッケージのファイルの場所を指している "Filename:" スタンザを含んでいます。現在、それらのパッケージはリリース間の移行を滞り無くするために "pool/" ディレクトリーツリーの下に置かれています。

"Packages" メタデーターのローカルコピーは aptitude を使ってインタラクティブに検索できます。grep-dctrl(1) という専用の検索コマンドを使うと "Packages" と "Sources" メタデーターのローカルコピーを検索できます。

"Contents-<アーキテクチャー>" メタデーターのローカルコピーは "apt-file update" で更新でき、他の4つと異なるところにあります。apt-file(1) を参照下さい。(auto-apt では "Contents-<アーキテクチャー>.gz" のローカルコピーがデフォールトでは異なるところにあります。)

2.5.5. APT に関するパッケージ状態

lenny 以降の APT ツールではリモートから取得したメタデーターに追加でローカルで生成されるインストール状態情報を "/var/lib/apt/extended_states" に保存して、自動インストールされた全パッケージを全ての APT ツールで追跡するのに用います。

2.5.6. aptitude に関するパッケージ状態

aptitude コマンドではリモートから取得したメタデーターに追加でローカルで生成されるインストール状態情報を "/var/lib/aptitude/pkgstates" に保存して用いています。

2.5.7. 取得したパッケージのローカルコピー

APT メカニズムでリモートから取得されたパッケージは消去されるまでは "/var/cache/apt/packages" に貯蔵されます。

2.5.8. Debian パッケージファイル名

Debian のパッケージファイルには特定の名前の構造があります。

表2.15 Debian パッケージの名前の構造

パッケージタイプ 名前の構造
バイナリーパッケージ (所謂 deb) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>-<アーキテクチャー>.deb
バイナリーパッケージ (所謂udeb) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>-<アーキテクチャー>.udeb
ソースパッケージ (アップストリームのソース) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.orig.tar.gz
1.0 ソースパッケージ (Debian の変更部分) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.diff.gz
3.0 (quilt) ソースパッケージ (Debian の変更部分) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.debian.tar.gz
ソースパッケージ (内容記述) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.dsc

[ティップ] ティップ

ここでは基本的なパッケージフォーマットのみが記述されています。詳細は dpkg-source(1) を参照下さい。

表2.16 Debian パッケージ名の各部分に使用可能な文字

名前の部分 使用可能文字 (regex) 存在
<パッケージ名> [a-z,A-Z,0-9,.,,-] 必須
<エポック>: [0-9]+: 任意
<アップストリームのバージョン> [a-z,A-Z,0-9,.,,-,:] 必須
<debianのバージョン> [a-z,A-Z,0-9,.,,~] 任意

[注記] 注記

パッケージバージョンの順位は dpkg(1) を使って、例えば "dpkg --compare-versions 7.0 gt 7.~pre1 ; echo $?" とすると確認できます。

[注記] 注記

Debian インストーラー (d-i) のバイナリーパッケージには、通常の deb ではなく udeb をファイル拡張子として使われます。udeb パッケージはポリシー条件を緩和しドキュメントのように必須でない内容を削除した減量 deb パッケージです。debudeb パッケージは同一のパッケージ構造を共有しています。"u" はマイクロと言う意味で使っています。

2.5.9. dpkg コマンド

dpkg(1) は Debian パッケージ管理の最も低レベルのツールです。非常に強力ですから気をつけて使う必要があります。

"<パッケージ名>"というパッケージをインストールする際に、dpkg は次に記す順番でパッケージを処理します。

  1. deb ファイルを解凍 ("ar -x" と等価)
  2. debconf(1) を使い "<package_name>.preinst" を実行
  3. システムにパッケージ内容をインストール ("tar -x" と等価)
  4. debconf(1) を使い "<package_name>.postinst" を実行

debconf システムによって I18N と L10N (8章I18N と L10N) のサポートのある標準化されたユーザーとの対話が実現できます。

表2.17 dpkg が作成する特記すべきファイル

ファイル 内容の説明
/var/lib/dpkg/info/<パッケージ名>.conffiles 設定ファイルのリスト。(ユーザー変更可能)
/var/lib/dpkg/info/<パッケージ名>.list パッケージによりインストールされるファイルやディレクトリーのリスト
/var/lib/dpkg/info/<パッケージ名>.md5sums パッケージによりインストールされるファイルの MD5 ハッシュ値のリスト
/var/lib/dpkg/info/<パッケージ名>.preinst パッケージインストールの前に実行するパッケージスクリプト
/var/lib/dpkg/info/<パッケージ名>.postinst パッケージインストールの後に実行するパッケージスクリプト
/var/lib/dpkg/info/<パッケージ名>.prerm パッケージ削除の前に実行するパッケージスクリプト
/var/lib/dpkg/info/<パッケージ名>.prerm パッケージ削除の前に実行するパッケージスクリプト
/var/lib/dpkg/info/<パッケージ名>.conffiles debconf システムのためのパッケージスクリプト
/var/lib/dpkg/alternatives/<パッケージ名> update-alternatives コマンドが用いる代替情報
/var/lib/dpkg/available すべてのパッケージの入手可能性情報
/var/lib/dpkg/diversions dpkg(1) に用いられ、dpkg-divert(8) が設定する迂回情報。
/var/lib/dpkg/statoverride dpkg(1) に用いられ、dpkg-statoverride(8) が設定する状態の上書き情報。
/var/lib/dpkg/status 全パッケージに関する状態情報
/var/lib/dpkg/status-old "var/lib/dpkg/status" ファイルの第一世代のバックアップ
/var/backups/dpkg.status* "var/lib/dpkg/status" ファイルの第二世代以前のバックアップ

"status" ファイルは dpkg(1) や "dselect update" や "apt-get -u dselect-upgrade" のようなツールによって使われます。

grep-dctrl(1) という専用の検索コマンドを使うと "status" と "available" メタデーターのローカルコピーを検索できます。

[ティップ] ティップ

デビアンインストーラー 環境下では、udpkg コマンドが udeb パッケージを開けるのに用いられます。udpkg コマンドはストリップダウンされたバージョンの dpkg コマンドです。

2.5.10. update-alternative コマンド

Debian システムには update-alternatives(8) を用いて何らかの重畳するプログラムを平和裏にインストールするメカニズムがあります。例えば vimnvi の両方のパッケージがインストールされた状況下で vi コマンドが vim を選択して実行するようにできます。

$ ls -l $(type -p vi)
lrwxrwxrwx 1 root root 20 2007-03-24 19:05 /usr/bin/vi -> /etc/alternatives/vi
$ sudo update-alternatives --display vi
...
$ sudo update-alternatives --config vi
  Selection    Command
 ----------------------------------------------
      1        /usr/bin/vim
*+    2        /usr/bin/nvi

Enter to keep the default[*], or type selection number: 1

Debian の代替 (alternatives) システムは、その選択を "/etc/alternatives/" の中のシムリンクとして保持します。選択プロセスには "/var/lib/dpkg/alternatives/" の中の対応するファイルが使われます。

2.5.11. dpkg-statoverride コマンド

dpkg-statoverride(8) コマンドで提供される状態の上書きは、パッケージをインストールする際にファイルに関して異なる所有者やモードを使うよう dpkg(1) に指示する方法です。もし "--update" が指定されファイルが存在すれば、即座に新たな所有者やモードに設定されます。

[注意] 注意

パッケージが所有するファイルの所有者やモードをシステム管理者が chmodchown コマンドを用いて直接変更しても次のパッケージアップグレードがリセットします。

[注記] 注記

ここでファイルと言いましたが、実際には dpkg が扱うディレクトリーやデバイス等のいかなるファイルシステムオブジェクトであってもいいです。

2.5.12. dpkg-divert コマンド

dpkg-divert(8) コマンドによって提供されるファイル迂回は、ファイルをデフォールトの場所ではなく迂回した場所にインストールするように dpkg(1) にさせます。dpkg-divert は本来パッケージメインテナンススクリプトのためのものです。システム管理者がこれを軽々に使うのはお薦めできません。

2.6. 壊れたシステムからの復元

非安定 (unstable) システムを動かす時には、管理者には壊れたパッケージ管理状況から復元できることが望まれます。

[注意] 注意

ここで説明するいくつかの方法は非常にリスクが高いアクションです。警告しましたよ!

2.6.1. 古いユーザーの設定との非互換性

もしデスクトップ GUI プログラムが上流の大きなバージョンアップグレードの後に不安定性を経験した際には、そのプログラムが作った古いローカル設定ファイルとの干渉を疑うべきです。もし新規作成したユーザーアカウントでそのプログラムが安定なら、この仮説が裏付けられます。(これはパッケージングのバグで、通常パッケージャーによって回避されます。)

安定性を復元するには、対応するローカル設定ファイルを移動し GUI プログラムを再スタートします。後日設定情報を回復するために古い設定ファイルの内容を読む必要があるかもしれません。(あまり慌てて消去しないようにしましょう。)

2.6.2. 重複するファイルを持つ相異なるパッケージ

aptitude(8) や apt-get(1) 等の、アーカイブレベルのパッケージ管理システムはパッケージの依存関係を使って重複するファイルを持つファイルのインストールしようとさえしません (「パッケージ依存関係」参照)。

パッケージメインテナによるエラーや、システム管理者による不整合な混合ソースのアーカイブの採用 (「混合したアーカイブソースからのパッケージ」参照) があった場合には、パッケージ依存関係が誤って定義される事態が発生するかもしれません。そういう状況下で重複するファイルを持つパッケージを aptitude(8) や apt-get(1) を使ってインストールしようとすると、パッケージを展開する dpkg(1) は既存ファイルを上書きすることなく呼ばれたプログラムにエラーを確実に返します。

[注意] 注意

第三者が作成したパッケージを使うと、root 権限で実行されるシステムに関して何でもできるメンテナスクリプトが実行されるので、システムが重大なリスクにさらされます。dpkg(1) はパッケージを展開するするさいに上書きする事を防止するだけです。

そのような壊れたインストール状況は、まず古い問題原因となっているパッケージ <old-package> を削除すれば回避できます。

$ sudo dpkg -P <old-package>

2.6.3. 壊れたパッケージスクリプトの修正

パッケージスクリプト内のコマンドが何らかの理由でエラーを返しスクリプトがエラーで終了した場合には、パッケージ管理システムは動作を途中終了するので部分的にインストールされたパッケージのある状況が生まれます。パッケージがその削除スクリプト内にバグを持つ場合には、パッケージが削除不能になりうるので大変厄介です。

"<パッケージ名>" のパッケージスクリプトの問題に関しては、次のパッケージスクリプトの内容を確認するべきです。

  • "/var/lib/dpkg/info/<パッケージ名>.preinst"
  • "/var/lib/dpkg/info/<パッケージ名>.postinst"
  • /var/lib/dpkg/info/<パッケージ名>.prerm
  • "/var/lib/dpkg/info/<パッケージ名>.prerm"

スクリプトの問題原因部分を次のようなテクニックを使い root から編集します。

  • 行頭に "#" を挿入し問題行を無効にする
  • 行末に "|| true" を挿入し成功を強制的に返さす

全ての部分的にインストールされたパッケージを次のコマンドで設定します。

# dpkg --configure -a

2.6.4. dpkg コマンドを使っての救済

dpkg は非常に低レベルのパッケージツールなのでネットワーク接続もないブート不能な非常に劣悪な状況下でも機能します。foo パッケージが壊れていて置き換える必要があると仮定します。

バグの無い古いバージョンの foo パッケージが "/var/cache/apt/archives/" にあるパッケージキャッシュの中に見つかるかもしれません。(ここにみつからなければ、http://snapshot.debian.net/ アーカイブからダウンロードしたり、機能している機器のパッケージキャッシュからコピーできます。)

もしブート不可能な場合には、次のコマンドを使ってインストールすることもできます。

# dpkg -i /path/to/foo_<old_version>_<arch>.deb
[ティップ] ティップ

システムがそれほど壊れていないなら、「緊急ダウングレード」に書かれているようにして、より高レベルの APT システムを通じてシステム全体をダウングレードする手もあります。

ハードディスクからブートできない場合は、他の方法でのブート方法を考えるべきです。

  1. Debian インストーラー (debian-installer) の CD を使ってレスキューモードでブートします。
  2. ブートできないハードディスク上のシステムを "/target" にマウントします。
  3. 古いバージョンの foo パッケージを次のようにしてインストールします。
# dpkg --root /target -i /path/to/foo_<old_version>_<arch>.deb

この例は、たとえハードディスク上の dpkg コマンドが壊れていても機能します。

[ティップ] ティップ

ハードディスク上の別のシステムであれ、GNU/Linux のライブ CD であれ、ブート可能な USB キードライブであれ、ネットブートであれ、どのように起動された GNU/Linux システムでも同様にして壊れたシステムを救済するのに使えます。

もしこの方法でパッケージをインストールしようとして何らかの依存関係違反のためにうまくいかなくてどうしようもなくなった場合には、dpkg の "--ignore-depends" や "--force-depends" や他のオプションを使って依存関係をオーバーライドすることができます。こうした場合には、後で適正な依存関係を修復するように真剣に取り組む必要があります。詳細は dpkg(8) を参照下さい。

[注記] 注記

システムがひどく壊れた場合には、システムを安全な場所に完全バックアップし (「バックアップと復元」参照)、クリーンインストールを実行するべきです。こうすることは時間の節約でもあり最終的に良い結果に結びつきます。

2.6.5. パッケージセレクションの復元

もし何らかの理由で "/var/lib/dpkg/status" の内容が腐った場合には、Debian システムはパッケージ選択データーが失われ大きな打撃を被ります。古い "/var/lib/dpkg/status" ファイルは、"/var/lib/dpkg/status-old" や "/var/backups/dpkg.status.*" としてあるので探します。

"/var/backups/" は多くの重要な情報を保持しているので、これを別のパーティション上に置くのも良い考えです。

ひどく壊れた場合には、システムのバックアップをした後フレッシュに再インストールすることをお薦めします。たとえ "/var/" ディレクトリーの中が完全に消去されても、"/usr/share/doc/" ディレクトリー中から新規インストールのガイドとなる情報を復元できます。

最低限の (デスクトップ) システムを再インストールします。

# mkdir -p /path/to/old/system

"/path/to/old/system/" に古いシステムをマウントします。

# cd /path/to/old/system/usr/share/doc
# ls -1 >~/ls1.txt
# cd /usr/share/doc
# ls -1 >>~/ls1.txt
# cd
# sort ls1.txt | uniq | less

こうすると、インストールすべきパッケージ名が表示されます。("texmf" のようなパッケージ名以外が一部あるかもしれません。)

2.7. パッケージ管理のヒント

2.7.1. Debian パッケージの選択方法

パッケージの説明や "Tasks" の下のリストを使ってあなたが必要なパッケージを aptitude で見つけることができます。

2つ以上の似たパッケージに出会い "試行錯誤" の努力無しにどのパッケージをインストールするか迷った際には、常識を使って下さい。次に示す点は好ましいパッケージの良い指標と考えます。

  • 必須 (essential): yes > no
  • コンポーネント (component): メイン (main) > contrib > non-free
  • 優先度 (priority): 必須 (required) > 重要 (important) > 標準 (standard) > 任意 (optional) > 特別 (extra)
  • タスク (tasks): "デスクトップ環境" のようなタスクにリストされたパッケージ
  • 依存パッケージにより選ばれたパッケージ (例えば、python による python2.4)
  • ポプコン: 投票やインストールの数が多い
  • changelog: メンテナによる定期的アップデート
  • BTS: RC bug が無いこと (critical も grave も serious もいずれのバグも無い)
  • BTS: バグレポートに反応の良いメンテナ
  • BTS: 最近修正されたバグの数が多い
  • BTS: wishlist 以外のバグが少ない

Debian は分散型の開発モデルのボランティアプロジェクトですので、そのアーカイブには目指すところや品質の異なる多くのパッケージがあります。これらをどうするかは自己判断をして下さい。

2.7.2. 混合したアーカイブソースからのパッケージ

[注意] 注意

安定版 (stable)security updatessqueeze-updates のような公式にサポートされた特定の組み合わせ以外は、混合したアーカイブソースからのパッケージをインストールすることを、公式には Debian ディストリビューションとしてサポートしていません。

testing を追跡しながら、unstable にある特定の新規アップストリームバージョンのパッケージを1回だけ取り入れる操作例を次に示します。

  1. "/etc/apt/sources.list" ファイルを変更し、単一の "unstable" エントリーのみにします。
  2. "aptitude update" を実行します。
  3. "aptitude install <パッケージ名>"の実行します。
  4. testing のためのオリジナルの "/etc/apt/sources.list" ファイルを復元します。
  5. "aptitude update" を実行します。

この様な手動のアプローチをすると "/etc/apt/preferences" ファイルを作ることもないし、また apt-pinning について悩むこともありません。でもこれではとても面倒です。

[注意] 注意

混合したアーカイブソースを使うことを Debian が保証していないので、その場合にはパッケージ間の互換性は自分自身で確保しなければいけません。もしパッケージに互換性がないと、システムを壊すことになるかもしれません。この様な技術的要件を判断できる必要があります。ランダムな混合したアーカイブソースを使うことは全く任意の操作ですが、私としてはこの操作はお薦めできません。

異なるアーカイブからパッケージをインストールするための一般ルールは以下です。

  • 非バイナリーパッケージのインストールは比較的安全です。

    • 文書パッケージ: 特段の要件無し
    • インタープリタプログラムパッケージ: 互換性あるインタープリタ環境が必要
  • バイナリーパッケージ (非 "Architecture: all") のインストールは、通常多くの障害があり、安全ではありません

    • ライブラリー ("libc" 等) のバージョン互換性
    • 関連ユーティリティープログラムのバージョン互換性
    • カーネル ABI 互換性
    • C++ の ABI 互換性
[注記] 注記

パッケージを比較的安全にインストールできるようにするために、一部の商用 non-free バイナリープログラムパッケージは完全に静的にリンクされたライブラリーとともに提供される事があります。そんなパッケージに関しても ABI 互換性等の問題は確認するべきです。

[注記] 注記

壊れたパッケージを短期的に避ける場合以外では、公式にサポートされていないアーカイブからバイナリーパッケージをインストールするのは一般的には賢明ではありません。たとえ apt-pinning (「候補バージョンの調整」参照) を使った場合にもこれは当てはまります。chroot や類似のテクニック (「仮想化システム」参照) 使って、他のアーカイブからのプログラムを実行するよう検討するべきです。

2.7.3. 候補バージョンの調整

"/etc/apt/preferences" ファイル無しだと、APT システムはバージョン文字列を用いて、最新バージョンを候補バージョンとします。これが通常状態で APT システムの最も推薦される使い方です。全ての公式にサポートされたアーカイブの組み合わせは、自動的にアップグレードするソースとすべきでないアーカイブは NotAutomatic とマークされ適正な扱いを受けるので、"/etc/apt/preferences" ファイルを必要としません。

[ティップ] ティップ

バージョン文字列比較ルールは、例えば "dpkg --compare-versions ver1.1 gt ver1.1~1; echo $?" とすれば確認できます (dpkg(1) 参照)。

パッケージを混合したアーカイブからのソース (「混合したアーカイブソースからのパッケージ」参照) から定常的にインストールする場合には、apt_preferences(5) に書かれたように適正な項目のある "/etc/apt/preferences" ファイルを作り候補バージョンに関するパッケージ選択ルールを操作することによってこういった複雑な操作を自動化できます。これを apt-pinning と呼びます。

[警告] 警告

初心者のユーザーによる apt-pinning の利用は大トラブル発生を間違いなく起こします。本当に必要な時以外は apt-pinning の利用は避けなければいけません。

[注意] 注意

apt-pinning を利用する際には、Debian はパッケージの互換性を保証しないので、ユーザー自身がパッケージの互換性を確保しなければいけません。apt-pinning は全く任意の操作で、著者が使うようにと勧めているわけではありません。

[注意] 注意

アーカイブレベルの Release ファイル (「アーカイブレベルの "Release" ファイル」参照) が apt_preferences(5) のルールに使われます。だから、apt-pinning は normal Debian archivessecurity Debian archives ではスイート ("suite") 名を使って機能します。(これは Ubuntu アーカイブとは異なります)。例えば "/etc/apt/preferences" ファイル中で、"Pin: release a=unstable" とはできますが、"Pin: release a=sid" とはできません。

[注意] 注意

非 Debian アーカイブを apt-pinning の一部に使う場合には、それが提供されている対象の確認とその信頼性の確認をします。例えば、Ubuntu と Debian は混合して使うようにはなっていません。

[注記] 注記

"/etc/apt/preferences" ファイルを作成することなしでも、かなり複雑なシステム操作 (「dpkg コマンドを使っての救済」「混合したアーカイブソースからのパッケージ」参照) が apt-pinning を使わずにできます。

単純化した apt-pinning テクニックの説明を次にします。

APT システムは "/etc/apt/sources.list" ファイル中に規定された使えるパッケージソースから最高の Pin-Priority でアップグレードするパッケージを候補バージョンパッケージとして選択します。パッケージの Pin-Priority が1000 より大きい場合には、このアップグレードするというバージョン制約が外れるのでダウングレードできるようになります (「緊急ダウングレード」参照)。

各パッケージの Pin-Priority 値は "/etc/apt/preferences" ファイル中の "Pin-Priority" 項目にて規定されるか、そのデフォールト値が使われます。

表2.18 各パッケージソースタイプ毎のデフォールト Pin-Priority 値のリスト

デフォールト Pin-Priority パッケージソースタイプ
990 ターゲットリリースアーカイブ
500 normal archive
100 installed package
1 NotAutomatic アーカイブ

ターゲットのリリースアーカイブは次のようにして設定できます。

  • "APT::Default-Release "stable";" 行を使う "/etc/apt/apt.conf" ファイル
  • "apt-get install -t testing some-package" 等の "-t" オプションの引数

アーカイブ中のアーカイブレベルの Release ファイル (「アーカイブレベルの "Release" ファイル」参照) に "NotAutomatic: yes" を含まれると NotAutomatic アーカイブが設定されます。

複数アーカイブソースの <package> に関する Pin-Priority 値は "apt-cache policy <package>" の出力で表示されます。

  • "Package pin:" で始まる行は、<package> のみとの関連付けが "Package pin: 0.190" 等と定義されている場合に、pin のパッケージバージョンを示します。
  • <package> とのみの関連付けが定義されていない場合には、"Package pin:" という行はありません。
  • <package> とのみの関連付けが定義されている場合の Pin-Priority 値は、全バージョン文字列の右側に "0.181 700" 等としてリストされます。
  • <package> とのみの関連付けが定義されていない場合には、全バージョン文字列の右側に "0" が"0.181 0" 等としてリストされます。
  • アーカイブの Pin-Priority 値 ("/etc/apt/preferences" ファイル中に "Package: *" として定義) はアーカイブへのパスの左側に、"200 http://backports.debian.org/debian-backports/ squeeze-backports/main Packages" 等としてリストされます。

testing を追跡しながら、unstable にある特定の新規アップストリームバージョンのパッケージが定常的にアップグレードされる、apt-pinning テクニックの例を次に示します。全ての必要なアーカイブを "/etc/apt/sources.list" ファイル中に次のようにリストします。

deb http://ftp.us.debian.org/debian/ testing main contrib non-free
deb http://ftp.us.debian.org/debian/ unstable main contrib non-free
deb http://security.debian.org/ testing/updates main contrib

"/etc/apt/preferences" を次のように設定します。

Package: *
Pin: release a=testing
Pin-Priority: 500

Package: *
Pin: release a=unstable
Pin-Priority: 200

"<package-name>" という名前のパッケージとその依存ファイルを unstable アーカイブからこの設定の下でインストールしたい場合、"-t" オプションを使ってターゲットリリースを切り替える (unstable の Pin-Priority が990 になる) 次のコマンドを実行します。

$ sudo apt-get install -t unstable <package-name>

この設定では、通常の "apt-get upgrade" や "apt-get dist-upgrade" ("aptitude safe-upgrade" や "aptitude full-upgrade") の実行は、testing アーカイブからインストールされたパッケージは最新の testing アーカイブを使ってアップグレードし、unstable アーカイブからインストールされたパッケージは最新の unstable アーカイブを使ってアップグレードします。

[注意] 注意

"/etc/apt/sources.list" ファイルから "testing" の項目を削除しないように注意します。"testing" 項目がその中にないと、APT システムは最新の unstable アーカイブを使ってアップグレードします。

[ティップ] ティップ

著者は上記操作のすぐ後に "/etc/apt/sources.list" ファイルを編集して "unstable" アーカイブ項目をコメントアウトします。こうすることで、最新の unstable アーカイブによって unstable からインストールされたパッケージをアップグレードしなくなりますが、"/etc/apt/sources.list" ファイル中に項目が多すぎてアップデートのプロセスが遅くなることをさけられます。

[ティップ] ティップ

もし "/etc/apt/preferences" ファイル中で "Pin-Priority: 200" の代わりに "Pin-Priority: 20" が用いられた場合は、"/etc/apt/sources.list" ファイルの中の "testing" 項目が削除されようと、Pin-Priority 値は100 のインストール済みパッケージは unstable アーカイブによってアップグレードされる事はありません。

最初の "-t unstable" によるインストール無しに、unstable の特定パッケージを自動的に追跡したい場合、"/etc/apt/preferences" ファイルを作りそのトップにこれらパッケージを明示的に次のようにリストします。

Package: <package-1>
Pin: release a=unstable
Pin-Priority: 700

Package: <package-2>
Pin: release a=unstable
Pin-Priority: 700

以上で、各特定パッケージに関して Pin-Priority 値が設定されます。例えば最新の unstable バージョンのこの "Debian リファレンス" を英語版で追跡するためには、"/etc/apt/preferences" ファイルに次の項目を設定します。

Package: debian-reference-en
Pin: release a=unstable
Pin-Priority: 700

Package: debian-reference-common
Pin: release a=unstable
Pin-Priority: 700
[ティップ] ティップ

この apt-pinning テクニックは stable アーカイブを追跡している際にも有効です。著者の経験では、文書パッケージは unstable アーカイブからインストールしても今までいつも安全でした。

次に unstable を追跡しながら experimental にある特定の新規アップストリームバージョンのパッケージを取り込む apt-pinning テクニックの例を示します。すべての必要なアーカイブを "/etc/apt/sources.list" ファイルに次のようにリストします。

deb http://ftp.us.debian.org/debian/ unstable main contrib non-free
deb http://ftp.us.debian.org/debian/ experimental main contrib non-free
deb http://security.debian.org/ testing/updates main contrib

experimental アーカイブのデフォールトの Pin-Priority 値は、NotAutomatic アーカイブ (「アーカイブレベルの "Release" ファイル」参照) なので、常に1 (<<100) です。experimental アーカイブにある特定パッケージを次回アップグレード時に自動的に追跡しようとしない限り、"/etc/apt/preferences" ファイル中で experimental アーカイブを使うために Pin-Priority 値を明示的に設定する必要はありません。

2.7.4. Updates と Backports

stable (squeeze) のためのアップグレードパッケージを提供する、squeeze-updatesbackports.debian.org アーカイブがあります。

[警告] 警告

squeeze-backports 等の NotAutomatic アーカイブの中にあるパッケージ全てを使ってはいけません。あなたの必要性に適合する選択されたパッケージだけを使います。

次に squeezesqueeze-updates を追跡しながら squeeze-backports にある特定の新規アップストリームバージョンのパッケージを取り込む apt-pinning テクニックの例を示します。すべての必要なアーカイブを "/etc/apt/sources.list" ファイルに次のようにリストします。

deb http://ftp.us.debian.org/debian/ squeeze main contrib non-free
deb http://security.debian.org/ squeeze/updates main contrib
deb http://ftp.us.debian.org/debian/ squeeze-updates main contrib non-free
deb http://backports.debian.org/debian-backports/ squeeze-backports main contrib non-free

backports.debian.org アーカイブのデフォールトの Pin-Priority 値は、NotAutomatic アーカイブ (「アーカイブレベルの "Release" ファイル」参照) なので、常に1 (<<100) です。backports.debian.org アーカイブにある特定パッケージを次回アップグレード時に自動的に追跡しようとしない限り、"/etc/apt/preferences" ファイル中で backports.debian.org アーカイブを使うために Pin-Priority 値を明示的に設定する必要はありません。

"<package-name>" という名前のパッケージをその依存関係ともども squeeze-backports アーカイブからインストールしたい時には、"-t" オプションでターゲットリリースを切り替えながら次のコマンドを使います。

$ sudo apt-get install -t squeeze-backports <package-name>

特定のパッケージをアップグレードしたいときには、"/etc/apt/preferences" ファイルを作成しその中に全てのパッケージを次のように明示的にリストしなければいけません。

Package: <package-1>
Pin: release o=Backports.org archive
Pin-Priority: 700

また、"/etc/apt/preferences" ファイルを次のようにしてもよい。

Package: *
Pin: release a=stable , o=Debian
Pin-Priority: 500

Package: *
Pin: release a=squeeze-updates, o=Debian
Pin-Priority: 500

Package: *
Pin: release a=squeeze-backports, o=Backports.org archive
Pin-Priority: 200

"apt-get upgrade" と "apt-get dist-upgrade" ("aptitude safe-upgrade" と "aptitude full-upgrade") の実行は、stable アーカイブからインストールされたパッケージを最新の stable アーカイブを使ってアップグレードし、他のアーカイブからインストールされたパッケージを最新の "/etc/apt/sources.list" ファイルに記載された全てのアーカイブの最新の対応するアーカイブを使ってアップグレードします。

2.7.5. パッケージの自動ダウンロードとアップグレード

apt パッケージには、パッケージの自動ダウンロードのサポートする専用の cron スクリプト "/etc/cron.daily/apt" が同梱されています。このスクリプトは unattended-upgrades パッケージをインストールすることで自動アップグレード実行の機能拡張をします。これらは、"/usr/share/doc/unattended-upgrades/README" に記述されているように、"/etc/apt/apt.conf.d/02backup" と "/etc/apt/apt.conf.d/50unattended-upgrades" の中のパラメーターでカスタム化できます。

unattended-upgrades パッケージは基本的に stable システムのセキュリティーアップグレードのためです。既存の stable システムが、自動アップグレードで壊される危険性が、セキュリティーアップグレードがすでに閉じたセキュリティーホールからの侵入者によりシステムが壊わされる危険性より小さいなら、パラメーターを次のように設定して自動アップグレードをするのも一計です。

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";

unstable システムを使っている場合には、自動アップグレードするとシステムはいつの日か確実に壊われるので、それはしたくないでしょう。そんな unstable の場合でも、次に記すような事前にパッケージをダウンロードするパラメーターを設定でインタラクティブなアップグレードをするための時間を節約したいでしょう。

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "0";

2.7.6. APT のよるダウンロードバンド幅の制限

APT によるダウンロードのバンド幅を例えば 800Kib/sec (=100kiB/sec) に制限したい場合には、APT のパラメーターを次のように設定します。

APT::Acquire::http::Dl-Limit "800";

2.7.7. 緊急ダウングレード

[注意] 注意

Debian では設計としてはダウングレードを正式にサポートしません。緊急の復元処置の一部としてのみ実行されるべきです。こういう状況であるにもかかわらず、多くの場合にうまく機能することが知られています。重要なシステムでは回復処置の後に全ての重要データーをバックアップし、最初から新規システムを再インストールします。

壊れたシステムアップグレードからの復元するために、候補バージョンを操作して新しいアーカイブから古いアーカイブにダウングレードすることがうまくいくかもしれません (「候補バージョンの調整」参照)。これは、何度も "dpkg -i <broken-package>_<old-version>.deb" コマンドを実行する退屈な作業をしないでよくする方法です (「dpkg コマンドを使っての救済」参照)。

次に記すような "unstable" を追跡する "/etc/apt/sources.list" ファイル中の行を探します。

deb http://ftp.us.debian.org/debian/ sid main contrib non-free

それを testing を追いかけるように次と交換します。

deb http://ftp.us.debian.org/debian/ wheezy main contrib non-free

"/etc/apt/preferences" を次のように設定します。

Package: *
Pin: release a=testing
Pin-Priority: 1010

そして、"apt-get dist-upgrade" を実行して、システム全体にわたってパッケージのダウングレードを強制します。

この緊急ダウングレードの後でこの特別の "/etc/apt/preferences" ファイルを削除します。

[ティップ] ティップ

依存関係の問題を最小限とすべく、できるだけ多くのパッケージを削除 (remove で、完全削除 purge ではありません!) します。システムのダウングレードのためには手動でいくつかのパッケージを削除とインストールしなければいけないかも知れません。Linux カーネルやブートローダーや udev や PAM や APT やネットワーク関係のパッケージやそれらの設定ファイルには特に注意が必要です。

2.7.8. 誰がパッケージをアップロードしたのか?

"/var/lib/dpkg/available" や "/usr/share/doc/package_name/changelog" の中にリストされたメンテナの名前は "誰がパッケージ化活動の背後にいるのか" に関していくばくかの情報を提供しますが、パッケージを実際にアップロードをした人がはっきりしません。devscripts パッケージ中の who-uploads(1) は Debian のソースパッケージを実際にアップロードした人を確定します。

2.7.9. equivs パッケージ

ソースからプログラムをコンパイルして Debian パッケージを置換えたい際には、それを実際にローカルで Debian 化してパッケージ (*.deb) して、私的アーカイブを使うのが好ましいです。

しかし、プログラムをソースからコンパイルして "/usr/local" にインストールすることを選んだ際には、パッケージ依存関係を満足させるための最後の手段として equivs を使う必要があるかもしれません。

Package: equivs
Priority: extra
Section: admin
Description: Circumventing Debian package dependencies
 This is a dummy package which can be used to create Debian
 packages, which only contain dependency information.

2.7.10. 安定版システムへのパッケージ移植

stable システムの部分アップグレードのためには、その環境内でソースパッケージを使ってパッケージをリビルドするのが好ましいです。こうすることでパッケージ依存関係による大掛かりなアップグレードをしないで済みます。

stable システムのための "/etc/apt/sources.list" ファイルに次のエントリーを追加します。

deb-src http://http.us.debian.org/debian unstable  main contrib non-free

コンパイルするのに必要なパッケージをインストールしソースパッケージをダウンロードをします。

# apt-get update
# apt-get dist-upgrade
# apt-get install fakeroot devscripts build-essential
$ apt-get build-dep foo
$ apt-get source foo
$ cd foo*

必要があればパッケージを調整しましょう

次を実行します。

$ dch -i

"+bp1" を後ろに付けるなどして、"debian/changelog" 中でパッケージバージョンを先に進める

次のようにしてパッケージをビルドしシステムにインストールします。

$ debuild
$ cd ..
# debi foo*.changes

2.7.11. APT のためのプロキシサーバー

Debian アーカイブの特定サブセクション全てをミラーするとディスク空間とネットワークのバンド幅の大いなる無駄遣いですので、LAN 上に多くのシステムを管理している際には APT のためのローカルのプロキシサーバーを設置することを考えるのは良いことです。APT は、apt.conf(5) とか "/usr/share/doc/apt/examples/configure-index.gz" に説明されたようにして、汎用の squid のような ウェッブ (http) プロキシサーバー (「他のネットワークアプリケーションサーバー」参照) を使うように設定できます。"$http_proxy" 環境変数による設定は、"/etc/apt/apt.conf" ファイル中の設定より優先します。

Debian アーカイブ専用のプロキシツールがあります。実際に使う前に BTS をチェック下さい。

表2.19 Debian アーカイブ専用のプロキシツールのリスト

パッケージ ポプコン サイズ 説明
approx * V:0.3, I:0.3 3896 Debian アーカイブファイルのキャッシュプロキシサーバー (コンパイルされた OCaml プログラム)
apt-cacher * V:0.3, I:0.4 308 Debian パッケージとソースファイルのキャッシュプロキシ (Perl プログラム)
apt-cacher-ng * V:0.3, I:0.4 1092 ソフトウエアーパッケージの頒布ためのキャッシュプロキシ (コンパイルされた C++ プログラム)
debtorrent * V:0.12, I:0.17 1185 Debian パッケージのための bittorrent プロキシ (Python プログラム)

[注意] 注意

Debian がそのアーカイブ構造を再編した際に、このような専用のプロキシツールはパッケージメンテナによるコードの修正が必要で、一定期間使えなくなることがあります。一方、汎用のウェッブ (http) プロキシは比較的堅牢ですしそのような変化に合わすのも簡単です。

2.7.12. 小さな公開パッケージアーカイブ

近代的なセキュアーAPT システム (「トップレベルの "Release" ファイルと信憑性」参照) と互換性のある小規模のパブリックアーカイブを作る例を次に示します。まず、いくつかの仮定をします。

  • アカウント名: "foo"
  • ホスト名: "www.example.com"
  • 必要なパッケージ: apt-utilsgnupg 等のパッケージ
  • URL: "http://www.example.com/~foo/" ( → "/home/foo/public_html/index.html")
  • パッケージのアーキテクチャ: "amd64"

サーバーシステム上で Foo のアーカイブキーを作成します。

$ ssh foo@www.example.com
$ gpg --gen-key
...
$ gpg -K
...
sec   1024D/3A3CB5A6 2008-08-14
uid                  Foo (ARCHIVE KEY) <foo@www.example.com>
ssb   2048g/6856F4A7 2008-08-14
$ gpg --export -a 3A3CB5A6 >foo.public.key

Foo に関するキー ID"3A3CB5A6" のアーカイブキーファイル "foo.public.key" を公開

"Origin: Foo" というアーカイブツリーを作成します。

$ umask 022
$ mkdir -p ~/public_html/debian/pool/main
$ mkdir -p ~/public_html/debian/dists/unstable/main/binary-amd64
$ mkdir -p ~/public_html/debian/dists/unstable/main/source
$ cd ~/public_html/debian
$ cat > dists/unstable/main/binary-amd64/Release << EOF
Archive: unstable
Version: 4.0
Component: main
Origin: Foo
Label: Foo
Architecture: amd64
EOF
$ cat > dists/unstable/main/source/Release << EOF
Archive: unstable
Version: 4.0
Component: main
Origin: Foo
Label: Foo
Architecture: source
EOF
$ cat >aptftp.conf <<EOF
APT::FTPArchive::Release {
  Origin "Foo";
  Label "Foo";
  Suite "unstable";
  Codename "sid";
  Architectures "amd64";
  Components "main";
  Description "Public archive for Foo";
};
EOF
$ cat >aptgenerate.conf <<EOF
Dir::ArchiveDir ".";
Dir::CacheDir ".";
TreeDefault::Directory "pool/";
TreeDefault::SrcDirectory "pool/";
Default::Packages::Extensions ".deb";
Default::Packages::Compress ". gzip bzip2";
Default::Sources::Compress "gzip bzip2";
Default::Contents::Compress "gzip bzip2";

BinDirectory "dists/unstable/main/binary-amd64" {
  Packages "dists/unstable/main/binary-amd64/Packages";
  Contents "dists/unstable/Contents-amd64";
  SrcPackages "dists/unstable/main/source/Sources";
};

Tree "dists/unstable" {
  Sections "main";
  Architectures "amd64 source";
};
EOF

あなたのサーバーシステム上の APT アーカイブ内容の繰り返しアップデートは dupload を設定することで自動化できます。

次に示す内容の "~/.dupload.conf" を設定したクライアントで "dupload -t foo changes_file" を実行して、全てのパッケージファイルを "~foo/public_html/debian/pool/main/" に設置します。

$cfg{'foo'} = {
  fqdn => "www.example.com",
  method => "scpb",
  incoming => "/home/foo/public_html/debian/pool/main",
  # The dinstall on ftp-master sends emails itself
  dinstall_runs => 1,
};

$cfg{'foo'}{postupload}{'changes'} = "
  echo 'cd public_html/debian ;
  apt-ftparchive generate -c=aptftp.conf aptgenerate.conf;
  apt-ftparchive release -c=aptftp.conf dists/unstable >dists/unstable/Release ;
  rm -f dists/unstable/Release.gpg ;
  gpg -u 3A3CB5A6 -bao dists/unstable/Release.gpg dists/unstable/Release'|
  ssh foo@www.example.com  2>/dev/null ;
  echo 'Package archive created!'";

dupload(1) が起動する postupload フックスクリプトがアップロード毎に更新されたアーカイブファイルを作成します。

この小規模のパブリックアーカイブをクライアントシステムの apt 行に追加できます。

$ sudo bash
# echo "deb http://www.example.com/~foo/debian/ unstable main" \
   >> /etc/apt/sources.list
# apt-key add foo.public.key
[ティップ] ティップ

もしローカルファイルシステム上にアーカイブがある場合には、上記の代わりに "deb file:///home/foo/debian/ …" が使えます。

2.7.13. システム設定の記録とコピー

パッケージと debconf の選択状態のローカルコピーは次に記すようにして作成できます。

# dpkg --get-selections '*' > selection.dpkg
# debconf-get-selections    > selection.debconf

ここで、"*" は"selection.dpkg" が"purge" に関するパッケージ項目も含めるようにします。

これら2ファイルを他のコンピューターに移動し、次のようにしてインストールします。

# dselect update
# debconf-set-selections < myselection.debconf
# dpkg --set-selections  < myselection.dpkg
# apt-get -u dselect-upgrade    # or dselect install

実質的に同じ設定でクラスターとなった多くのサーバーを管理することをお考えの場合には、専用パッケージである fai 等を使って全システムを管理することを考えます。

2.7.14. 外来のバイナリーパッケージの変換やインストール

alien(1) を使うと、Red Hat の rpm や Stampede の slp や Slackware の tgz や Solaris の pkg ファイルフォーマットを Debian の deb パッケージに変換できます。あなたのシステムにインストールしたパッケージに替えて他の Linux ディストリビューション由来のパッケージを使いたい際には、alien を使って変換しインストールします。alien は LSB パッケージをサポートします。

[警告] 警告

alien(1) は sysvinitlibc6libpam-modules 等の必須のシステムパッケージを置き換えるために使うべきではありません。実質的には alien(1) は、LSB 準拠か静的にリンクされた non-free のバイナリーのみで提供されるパッケージにのみ使われるべきです。フリーソフトの場合は、ソースパッケージを使い本物の Debian パッケージを作るべきです。

2.7.15. dpkg を使わないパッケージの開梱

現行の "*.deb" パッケージの内容は、どんな Unix 的環境でも標準の ar(1) と tar(1) を使うことで、dpkg(1) を使うこと無く開梱できます。

# ar x /path/to/dpkg_<version>_<arch>.deb
# ls
total 24
-rw-r--r-- 1 bozo bozo  1320 2007-05-07 00:11 control.tar.gz
-rw-r--r-- 1 bozo bozo 12837 2007-05-07 00:11 data.tar.gz
-rw-r--r-- 1 bozo bozo     4 2007-05-07 00:11 debian-binary
# mkdir control
# mkdir data
# tar xvzf control.tar.gz -C control
# tar xvzf data.tar.gz -C data

パッケージの内容は mc コマンドを使っても閲覧できます。

2.7.16. パッケージ管理の追加参考文書

パッケージ管理に関しては次の文書からさらに学習できます。