Product SiteDocumentation Site

5.4. dpkg を用いたパッケージの操作

dpkg はシステムの Debian パッケージを操作する基礎的なコマンドです。.deb パッケージがあれば、dpkg でパッケージ内容をインストールしたり解析したりする事が可能です。しかしこのプログラムは Debian 世界のある一方向だけを見ているに過ぎません: このプログラムは、システムインストール済みのパッケージとコマンドラインで与えられたパッケージについては理解していますが、他の利用可能なパッケージについては理解していません。このため、依存関係が満足されていなければパッケージを操作できません。これに対して、apt-get などのツールは、可能な限り自動的にすべてをインストールするために、依存関係のリストを作成します。

5.4.1. パッケージのインストール

中でも、dpkg は既に利用可能な Debian パッケージのインストールを担当する (ダウンロード機能はありません) ツールです。インストールを行うには、-i または --install オプションを使ってください。

例5.2 dpkg を使ったパッケージのインストール

# dpkg -i man-db_2.6.2-1_amd64.deb
(データベースを読み込んでいます ... 現在 96357 個のファイルとディレクトリがインストールされています。)
man-db 2.6.1-3 を (man-db_2.6.2-1_amd64.deb で) 置換するための準備をしています ...
man-db を展開し、置換しています...
man-db (2.6.2-1) を設定しています ...
Updating database of manual pages ...
dpkg の実行する各作業段階が見て取れます; このため、どの時点でエラーが起きたかを識別できます。インストールを 2 段階に分けて実行する事も可能です: 最初が解凍、その後設定です。apt-get はこれを上手に利用して、dpkg を呼び出す回数を減らしています (なぜなら呼び出される度にデータベース、特にインストール済みファイルのリスト、をメモリに読み込むため効率が悪いからです)。

例5.3 解凍と設定を分けて実行

# dpkg --unpack man-db_2.6.2-1_amd64.deb
(データベースを読み込んでいます ... 現在 96357 個のファイルとディレクトリがインストールされています。)
man-db 2.6.2-1 を (man-db_2.6.2-1_amd64.deb で) 置換するための準備をしています ...
man-db を展開し、置換しています...
#  dpkg --configure man-db
man-db (2.6.2-1) を設定しています ...
Updating database of manual pages ...
dpkg がパッケージのインストールに失敗し、エラーを返す事があります; ユーザが失敗を無視するように命令すれば、警告を表示するでしょう; これが異なる --force-* 系オプションがある理由です。このコマンドの文書によれば dpkg --force-help コマンドでこれらのオプションの完全なリストを見る事が可能です。最もよくあるエラーはファイルの衝突で、遅かれ早かれこのエラーに遭遇するのは避けられません。パッケージが他のパッケージによってインストール済みのファイルを含んでいる場合、dpkg はパッケージのインストールを拒否します。以下のメッセージが表示されます:
Unpacking libgdm (from .../libgdm_3.8.3-2_amd64.deb) ...
dpkg: error processing /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb (--unpack):
 trying to overwrite '/usr/bin/gdmflexiserver', which is also in package gdm3 3.4.1-9
この場合、ファイルを置き換えることでシステムの安定度が大きく阻害されない (通常は阻害されません) と考えるなら、--force-overwrite オプションを使うことで dpkg にこのエラーを無視してファイルを上書きするように伝えられます。
--force-* 系のオプションはたくさんありますが、日常的に使うのは --force-overwrite だけです。これらのオプションは例外的状況のためだけに用意されており、パッケージ化メカニズムの定める標準規則を尊重するためには、これらのオプションを使うことは可能な限り避けるべきです。これらの標準規則はシステムの一貫性と安定性を守るものである事を忘れないでください。

5.4.2. パッケージの削除

dpkg を実行する際に、-r または --remove オプションを付けてさらにパッケージの名前を続けると、パッケージを削除します。しかしながらこの削除は完璧ではありません: パッケージの取り扱うすべての設定ファイル、メンテナスクリプト、ログファイル (システムログ)、その他のユーザデータは残されたままです。プログラムを無効化するには、この方法でパッケージをアンインストールしてください。そうすれば、そのパッケージを同じ設定で再インストールして素早く利用可能な状態にする事もまだ可能です。パッケージに関連するすべてを完全に削除するには、-P または --purge オプションつけてさらにパッケージの名前を続けてください。

例5.4 debian-cd パッケージの削除と完全消去

# dpkg -r debian-cd
(データベースを読み込んでいます ... 現在 97747 個のファイルとディレクトリがインストールされています。)
debian-cd を削除しています ...
# dpkg -P debian-cd
(データベースを読み込んでいます ... 現在 97401 個のファイルとディレクトリがインストールされています。)
debian-cd を削除しています ...
debian-cd の設定ファイルを削除しています ...

5.4.3. dpkg のデータベースへの問い合わせと .deb ファイルの調査

この節を締めくくる前に、内部データベースに問い合わせて情報を得る際に使う dpkg のオプションについて学びましょう。表記は最初に長いオプション、そのあとに対応する短いオプション (両者は同じ引数を取るのは明らかです) です。--listfiles package (または -L)、与えられたパッケージがインストールするファイルを表示します; --search file (または -S)、ファイルを含むパッケージを探します; --status package (または -s)、インストールされたパッケージのヘッダを表示します; --list (または -l)、システムが把握しているパッケージのリストとその状態を表示します; --contents file.deb (または -c)、与えられた Debian パッケージに含まれるファイルを表示します; --info file.deb (または -I) Debian パッケージのヘッダを表示します。

例5.5 dpkg に様々な情報を問い合わせる

$ dpkg -L base-passwd
/.
/usr
/usr/sbin
/usr/sbin/update-passwd
/usr/share
/usr/share/man
/usr/share/man/ru
/usr/share/man/ru/man8
/usr/share/man/ru/man8/update-passwd.8.gz
/usr/share/man/pl
/usr/share/man/pl/man8
/usr/share/man/pl/man8/update-passwd.8.gz
/usr/share/man/man8
/usr/share/man/man8/update-passwd.8.gz
/usr/share/man/fr
/usr/share/man/fr/man8
/usr/share/man/fr/man8/update-passwd.8.gz
/usr/share/doc-base
/usr/share/doc-base/users-and-groups
/usr/share/base-passwd
/usr/share/base-passwd/passwd.master
/usr/share/base-passwd/group.master
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/base-passwd
/usr/share/doc
/usr/share/doc/base-passwd
/usr/share/doc/base-passwd/copyright
/usr/share/doc/base-passwd/users-and-groups.html
/usr/share/doc/base-passwd/changelog.gz
/usr/share/doc/base-passwd/users-and-groups.txt.gz
/usr/share/doc/base-passwd/README
$ dpkg -S /bin/date
coreutils: /bin/date
$ dpkg -s coreutils
Package: coreutils
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 13822
Maintainer: Michael Stone <mstone@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 8.13-3.5
Replaces: mktemp, timeout
Depends: dpkg (>= 1.15.4) | install-info
Pre-Depends: libacl1 (>= 2.2.51-8), libattr1 (>= 1:2.4.46-8), libc6 (>= 2.7), libselinux1 (>= 1.32)
Conflicts: timeout
Description: GNU core utilities
 This package contains the basic file, shell and text manipulation
 utilities which are expected to exist on every operating system.
 .
 Specifically, this package includes:
 arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp
 csplit cut date dd df dir dircolors dirname du echo env expand expr
 factor false flock fmt fold groups head hostid id install join link ln
 logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc od
 paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir runcon
 sha*sum seq shred sleep sort split stat stty sum sync tac tail tee test
 timeout touch tr true truncate tsort tty uname unexpand uniq unlink
 users vdir wc who whoami yes
Homepage: http://gnu.org/software/coreutils
$ dpkg -l 'b*'
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前          バージョン    アーキテク     説明
+++-============-==============-==============-================================
un  backupninja  <なし>                        (説明 (description) がありません)
un  base         <なし>                        (説明 (description) がありません)
un  base-config  <なし>                        (説明 (description) がありません)
ii  base-files   7.1            amd64          Debian base system miscellaneous
ii  base-passwd  3.5.26         amd64          Debian base system master passwo
[...]
$ dpkg -c /var/cache/apt/archives/gnupg_1.4.12-7_amd64.deb
drwxr-xr-x root/root         0 2013-01-02 19:28 ./
drwxr-xr-x root/root         0 2013-01-02 19:28 ./usr/
drwxr-xr-x root/root         0 2013-01-02 19:28 ./usr/share/
drwxr-xr-x root/root         0 2013-01-02 19:28 ./usr/share/doc/
drwxr-xr-x root/root         0 2013-01-02 19:28 ./usr/share/doc/gnupg/
-rw-r--r-- root/root      3258 2012-01-20 10:51 ./usr/share/doc/gnupg/TODO
-rw-r--r-- root/root       308 2011-12-02 18:34 ./usr/share/doc/gnupg/FAQ
-rw-r--r-- root/root      3543 2012-02-20 18:41 ./usr/share/doc/gnupg/Upgrading_From_PGP.txt
-rw-r--r-- root/root       690 2012-02-20 18:41 ./usr/share/doc/gnupg/README.Debian
-rw-r--r-- root/root      1418 2012-02-20 18:41 ./usr/share/doc/gnupg/TODO.Debian
[...]
$ dpkg -I /var/cache/apt/archives/gnupg_1.4.12-7_amd64.deb

 新形式 debian パッケージ、バージョン 2.0。
 サイズ 1952176 バイト: コントロールアーカイブ = 3312 バイト。
    1449 バイト、   30 行      control              
    4521 バイト、   65 行      md5sums              
     479 バイト、   13 行   *  postinst             #!/bin/sh
     473 バイト、   13 行   *  preinst              #!/bin/sh
 Package: gnupg
 Version: 1.4.12-7
 Architecture: amd64
 Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
 Installed-Size: 4627
 Depends: libbz2-1.0, libc6 (>= 2.4), libreadline6 (>= 6.0), libusb-0.1-4 (>= 2:0.1.12), zlib1g (>= 1:1.1.4), dpkg (>= 1.15.4) | install-info, gpgv
 Recommends: libldap-2.4-2 (>= 2.4.7), gnupg-curl
 Suggests: gnupg-doc, xloadimage | imagemagick | eog, libpcsclite1
 Section: utils
 Priority: important
 Multi-Arch: foreign
 Homepage: http://www.gnupg.org
 Description: GNU privacy guard - a free PGP replacement
  GnuPG is GNU's tool for secure communication and data storage.
  It can be used to encrypt data and to create digital signatures.
  It includes an advanced key management facility and is compliant
  with the proposed OpenPGP Internet standard as described in RFC 4880.
[...]

5.4.4. dpkg のログファイル

dpkg/var/log/dpkg.log に作業のすべてを記録します。このログは極めて詳細です、なぜなら dpkg がパッケージに対して行った操作の各段階すべてを詳しく記録しているからです。dpkg の挙動を追跡する方法を提供することに加えて、これはシステムの変化の歴史を保存するのに役立ちます: パッケージがインストールされたり更新された正確な日時を探す事が可能ですし、この情報は最近の挙動変化を理解するのに極めて便利です。加えて、すべてのバージョンが記録されていますから、注目しているパッケージの changelog.Debian.gz またはオンラインバグ報告と情報を簡単に照合できます。

5.4.5. マルチアーキテクチャサポート

すべての Debian パッケージはArchitecture フィールドがあります。このフィールドでは、「all」(アーキテクチャに依存しないパッケージ) または対象のアーキテクチャの名前 (「amd64」、「armhf」、…) のどちらか一方を指定します。後者の場合、初期設定では、dpkgdpkg --print-architecture で返されるホストのアーキテクチャと一致するアーキテクチャ向けのパッケージのインストールだけを受け入れます。
この制約は、ユーザが異なるアーキテクチャ向けにコンパイルされたバイナリを使う羽目にならないようにしています。(一部の) コンピュータが複数のアーキテクチャのバイナリを実行できる場合、例えば元から可能な場合(「amd64」システムが「i386」バイナリを実行できる) やエミュレータを介す場合、を除けばこれが理想的です。

5.4.5.1. マルチアーキテクチャの有効化

dpkg のマルチアーキテクチャサポートのお陰で、ユーザは現在のシステムにインストール可能な「外来アーキテクチャ」を定義できます。これを行うには、以下に示す通り dpkg --add-architecture を使ってください。関連して、dpkg --remove-architecture は外来アーキテクチャのサポートを取り止めますが、取り止めたいアーキテクチャのパッケージが残っていた場合には失敗します。
# dpkg --print-architecture
amd64
# dpkg --print-foreign-architectures
# dpkg -i gcc-4.7-base_4.7.2-5_armhf.deb
dpkg: gcc-4.7-base_4.7.2-5_armhf.deb の処理中にエラーが発生しました (--install):
 パッケージアーキテクチャ (armhf) がシステム (amd64) と一致しません
処理中にエラーが発生しました:
 gcc-4.7-base_4.7.2-5_armhf.deb
# dpkg --add-architecture armhf
# dpkg --add-architecture armel
# dpkg --print-foreign-architectures
armhf
armel
# dpkg -i gcc-4.7-base_4.7.2-5_armhf.deb
(データベースを読み込んでいます ... 現在 97399 個のファイルとディレクトリがインストールされています。)
(gcc-4.7-base_4.7.2-5_armhf.deb から) gcc-4.7-base:armhf を展開しています...
gcc-4.7-base:armhf (4.7.2-5) を設定しています ...
# dpkg --remove-architecture armhf
dpkg: エラー: データベースで現在使用中のアーキテクチャ 'armhf' を削除できません
# dpkg --remove-architecture armel
# dpkg --print-foreign-architectures
armhf

5.4.5.2. マルチアーキテクチャ関連の変更

マルチアーキテクチャを実際に便利で使いやすいものにするためには、ライブラリを再パッケージ化しなければいけませんでした。さらに複数のコピー (対象の異なるアーキテクチャ) を同時にインストールできるようにするために、マルチアーキテクチャ専用のディレクトリにライブラリを移動しなければいけませんでした。このようにして更新されたパッケージには、このパッケージはアーキテクチャが違っても安全に同時インストールできること (そしてこのパッケージは自分と異なるアーキテクチャのパッケージの依存関係を満足することはできないこと) をパッケージ化システムに伝えるための「Multi-Arch: same」ヘッダフィールドが含まれていました。マルチアーキテクチャモードは Debian Wheezy で初登場しましたから、まだすべてのライブラリが変換されたわけではありません (ia32-libs に組み込まれていたライブラリはすべて変換されました)。
$ dpkg -s gcc-4.7-base
dpkg-query: エラー: --status は有効なパッケージ名を必要としますが、`gcc-4.7-base' はそうではありません: 1つ以上のインストール済み実体がある、あいまいなパッケージ名 'gcc-4.7-base' です

パッケージ照会についてのヘルプには、--help を使用してください。
$ dpkg -s gcc-4.7-base:amd64 gcc-4.7-base:armhf | grep ^Multi
Multi-Arch: same
Multi-Arch: same
$ dpkg -L libgcc1:amd64 |grep .so
/lib/x86_64-linux-gnu/libgcc_s.so.1
$ dpkg -S /usr/share/doc/gcc-4.7-base/copyright
gcc-4.7-base:armhf, gcc-4.7-base:amd64: /usr/share/doc/gcc-4.7-base/copyright
Multi-Arch: same パッケージの場合、自分の名前にアーキテクチャの限定詞を付けて明確に識別できるようにしなければいけないことは注目に値します。このようなパッケージはアーキテクチャが異なる同じパッケージ間でファイルを共有する可能性を持っています; dpkg は、共有されたファイルはアーキテクチャが異なる同じパッケージ間であってもビット単位で一致する、事を期待します。最後に大事な事ですが、パッケージはアーキテクチャ毎にバージョンが違ってはいけません。アーキテクチャが異なるパッケージも必ず同時にアップグレードされなければいけません。
マルチアーキテクチャサポートによって、依存関係の取り扱い方法にいくつかの興味深い挑戦がなされました。あるパッケージの依存関係を満足させるためには、必要とされる側のパッケージは「Multi-Arch: foreign」と宣言されているか、依存パッケージ群の 1 つのパッケージとアーキテクチャが一致しているかのどちらか一方、を必要とします (依存関係解決処理中、アーキテクチャに依存しないパッケージはホストと同じアーキテクチャと仮定されます)。依存関係は package:any 構文があれば、どんなアーキテクチャでも依存関係を満足できるように弱められましたが、外来パッケージを使ってこの構文で表記された依存関係を満足できるのは「Multi-Arch: allowed」と宣言されていた場合のみです。