dpkg
はシステムの Debian パッケージを操作する基礎的なコマンドです。.deb
パッケージがあれば、dpkg
でパッケージ内容をインストールしたり解析したりすることが可能です。しかし dpkg
は Debian 世界のある一部分だけを見ているに過ぎません。つまり、dpkg
は、システムにインストール済みのパッケージとコマンドラインで与えられたパッケージについては理解していますが、他の利用できるパッケージについては理解していません。このため、dpkg
は依存関係が満足されていなければパッケージを操作できません。これに対して、apt
などのツールは、可能な限り自動的にすべてをインストールするために、依存関係のリストを作成します。
dpkg
は既に利用できる Debian パッケージのインストールを担当しているツールです (ダウンロード機能を持っていません)。dpkg
を使ってパッケージをインストールするには、-i
または --install
オプションを使ってください。
例 5.2 dpkg
を使ったパッケージのインストール
#
dpkg -i man-db_2.7.6.1-2_amd64.deb
(データベースを読み込んでいます ... 現在 110431 個のファイルとディレクトリがインストールされています。) man-db_2.7.6.1-2_amd64.deb を展開する準備をしています ... man-db (2.7.6.1-2) で (2.7.6.1-1 に) 上書き展開しています ... man-db (2.7.6.1-2) を設定しています ... Updating database of manual pages ... mime-support (3.60) のトリガを処理しています ...
dpkg
の実行する各作業段階が見て取れます。このため、どの時点でエラーが起きたかを識別できます。インストールを 2 段階に分けて実行することも可能です。具体的に言えば、最初が展開、その後に設定です。apt-get
はこれをうまく利用して、dpkg
を呼び出す回数を減らしています (なぜなら dpkg
は呼び出される度にデータベース、特にインストール済みファイルのリスト、をメモリに読み込むため効率が悪いからです)。
例 5.3 展開と設定を分けて実行
#
dpkg --unpack man-db_2.7.6.1-2_amd64.deb
(データベースを読み込んでいます ... 現在 110431 個のファイルとディレクトリがインストールされています。) man-db_2.7.6.1-2_amd64.deb を展開する準備をしています ... man-db (2.7.6.1-2) で (2.7.6.1-2 に) 上書き展開しています ... mime-support (3.60) のトリガを処理しています ... #
dpkg --configure man-db
man-db (2.7.6.1-2) を設定しています ... Updating database of manual pages ...
dpkg
がパッケージのインストールに失敗し、エラーを返すことがあります。さらに、ユーザがインストールの失敗を無視するように命令すれば、警告が表示されるでしょう。すなわちこれが多くの --force-*
系オプションが用意されている理由です。dpkg
の文書によれば dpkg --force-help
コマンドでこれらのオプションの完全なリストを見ることが可能です。最もよく目にするエラーはファイルの衝突で、遅かれ早かれこのエラーに遭遇するのは避けられません。パッケージが他のパッケージによってインストール済みのファイルを含んでいる場合、dpkg
はパッケージのインストールを拒否します。その場合、以下のメッセージが表示されます。
libgdm (.../libgdm_3.8.3-2_amd64.deb) を展開しています...
パッケージ /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb の処理中にエラーが発生しました (--unpack):
'/usr/bin/gdmflexiserver' を上書きしようとしています。これはパッケージ gdm3 3.4.1-9 にも存在します
--force-overwrite
オプションを使うことで dpkg
はこのエラーを無視してファイルを上書きします。
--force-*
系のオプションはたくさんありますが、日常的に使うのは --force-overwrite
だけです。--force-*
系のオプションは例外的状況のためだけに用意されており、パッケージングメカニズムの定める標準規則を尊重するためには、これらのオプションを使うことは可能な限り避けるべきです。これらの標準規則はシステムの整合性と安定性を守るものであることを忘れないでください。
dpkg
に -r
または --remove
オプションを付け、さらにパッケージの名前を指定して実行すれば、指定したパッケージが削除されます。しかしながらこの削除は完璧ではありません。具体的に言えば、パッケージが取り扱うすべての設定ファイル、メンテナスクリプト、ログファイル (システムログ)、その他のユーザデータは残されたままです。プログラムを無効化するには、この方法でパッケージをアンインストールしてください。そうすれば、削除したパッケージを同じ設定で再インストールして素早く利用できる状態にすることもまだ可能です。パッケージに関連するすべてを完全に削除するには、dpkg
に -P
または --purge
オプションを付け、さらにパッケージの名前を指定して実行してください。
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/base-passwd /usr/share/base-passwd/group.master /usr/share/base-passwd/passwd.master /usr/share/doc /usr/share/doc/base-passwd /usr/share/doc/base-passwd/README /usr/share/doc/base-passwd/changelog.gz /usr/share/doc/base-passwd/copyright /usr/share/doc/base-passwd/users-and-groups.html /usr/share/doc/base-passwd/users-and-groups.txt.gz /usr/share/doc-base /usr/share/doc-base/users-and-groups /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/base-passwd /usr/share/man /usr/share/man/de /usr/share/man/de/man8 /usr/share/man/de/man8/update-passwd.8.gz /usr/share/man/es /usr/share/man/es/man8 /usr/share/man/es/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/man/ja /usr/share/man/ja/man8 /usr/share/man/ja/man8/update-passwd.8.gz /usr/share/man/man8 /usr/share/man/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/ru /usr/share/man/ru/man8 /usr/share/man/ru/man8/update-passwd.8.gz $
dpkg -S /bin/date
coreutils: /bin/date $
dpkg -s coreutils
Package: coreutils Essential: yes Status: install ok installed Priority: required Section: utils Installed-Size: 15103 Maintainer: Michael Stone <mstone@debian.org> Architecture: amd64 Multi-Arch: foreign Version: 8.26-3 Replaces: mktemp, realpath, timeout Pre-Depends: libacl1 (>= 2.2.51-8), libattr1 (>= 1:2.4.46-8), libc6 (>= 2.17), libselinux1 (>= 2.1.13) 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 numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink realpath 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 backuppc <なし> <なし> (説明 (description) がありません) un baekmuk-ttf <なし> <なし> (説明 (description) がありません) un base <なし> <なし> (説明 (description) がありません) un base-config <なし> <なし> (説明 (description) がありません) ii base-files 9.9+deb9u1 amd64 Debian base system miscellaneous files ii base-passwd 3.5.43 amd64 Debian base system master password and group ii bash 4.4-5 amd64 GNU Bourne Again SHell [...] $
dpkg -c /var/cache/apt/archives/gnupg_2.1.18-8~deb9u1_amd64.deb
drwxr-xr-x root/root 0 2017-09-19 05:41 ./ drwxr-xr-x root/root 0 2017-09-19 05:41 ./usr/ drwxr-xr-x root/root 0 2017-09-19 05:41 ./usr/bin/ -rwxr-xr-x root/root 996648 2017-09-19 05:41 ./usr/bin/gpg -rwxr-xr-x root/root 3444 2017-09-19 05:41 ./usr/bin/gpg-zip -rwxr-xr-x root/root 161192 2017-09-19 05:41 ./usr/bin/gpgconf -rwxr-xr-x root/root 26696 2017-09-19 05:41 ./usr/bin/gpgparsemail -rwxr-xr-x root/root 76112 2017-09-19 05:41 ./usr/bin/gpgsplit -rwxr-xr-x root/root 158344 2017-09-19 05:41 ./usr/bin/kbxutil -rwxr-xr-x root/root 1081 2014-06-26 01:17 ./usr/bin/lspgpot -rwxr-xr-x root/root 2194 2017-09-19 05:41 ./usr/bin/migrate-pubring-from-classic-gpg -rwxr-xr-x root/root 14328 2017-09-19 05:41 ./usr/bin/watchgnupg drwxr-xr-x root/root 0 2017-09-19 05:41 ./usr/sbin/ -rwxr-xr-x root/root 3078 2017-09-19 05:41 ./usr/sbin/addgnupghome -rwxr-xr-x root/root 2219 2017-09-19 05:41 ./usr/sbin/applygnupgdefaults drwxr-xr-x root/root 0 2017-09-19 05:41 ./usr/share/ drwxr-xr-x root/root 0 2017-09-19 05:41 ./usr/share/doc/ drwxr-xr-x root/root 0 2017-09-19 05:41 ./usr/share/doc/gnupg/ -rw-r--r-- root/root 18964 2017-01-24 03:39 ./usr/share/doc/gnupg/DETAILS.gz [...] $
dpkg -I /var/cache/apt/archives/gnupg_2.1.18-8~deb9u1_amd64.deb
新形式 debian パッケージ、バージョン 2.0。 サイズ 1124042 バイト: コントロールアーカイブ = 2221 バイト。 1388 バイト、 24 行 control 2764 バイト、 43 行 md5sums Package: gnupg Source: gnupg2 Version: 2.1.18-8~deb9u1 Architecture: amd64 Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org> Installed-Size: 2088 Depends: gnupg-agent (= 2.1.18-8~deb9u1), libassuan0 (>= 2.0.1), libbz2-1.0, libc6 (>= 2.15), libgcrypt20 (>= 1.7.0), libgpg-error0 (>= 1.14), libksba8 (>= 1.3.4), libreadline7 (>= 6.0), libsqlite3-0 (>= 3.7.15), zlib1g (>= 1:1.1.4) Recommends: dirmngr (= 2.1.18-8~deb9u1), gnupg-l10n (= 2.1.18-8~deb9u1) Suggests: parcimonie, xloadimage Breaks: debsig-verify (<< 0.15), dirmngr (<< 2.1.18-8~deb9u1), gnupg2 (<< 2.1.11-7+exp1), libgnupg-interface-perl (<< 0.52-3), libgnupg-perl (<= 0.19-1), libmail-gnupg-perl (<= 0.22-1), monkeysphere (<< 0.38~), php-crypt-gpg (<= 1.4.1-1), python-apt (<= 1.1.0~beta4), python-gnupg (<< 0.3.8-3), python3-apt (<= 1.1.0~beta4) Replaces: gnupg2 (<< 2.1.11-7+exp1) Provides: gpg Section: utils Priority: optional Multi-Arch: foreign Homepage: https://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 RFC4880. [...]
dpkg
は /var/log/dpkg.log
に作業のすべてを記録します。/var/log/dpkg.log
は極めて詳細です。なぜなら /var/log/dpkg.log
には dpkg
がパッケージに対して行った操作の各段階すべてが詳しく記録されているからです。dpkg の挙動を追跡する方法を提供することに加えて、/var/log/dpkg.log
はシステムの変化の履歴を保存するのに役立ちます。すなわち、パッケージがインストールされたり更新された正確な日時を探すことが可能ですし、この情報は最近の挙動変化を理解するのに極めて役立ちます。加えて、すべてのバージョンが記録されていますから、注目しているパッケージの changelog.Debian.gz
またはオンラインバグ報告と情報を簡単に照合できます。
Architecture
フィールドを持っています。Architecture
フィールドでは「all
」(アーキテクチャに依存しないパッケージ) または対象のアーキテクチャの名前 (「amd64」、「armhf」など) のどちらか一方を指定します。対象アーキテクチャの名前が指定されていた場合、初期設定では dpkg
は dpkg --print-architecture
で返されるホストのアーキテクチャと一致するアーキテクチャ向けのパッケージのインストールだけを受け入れます。
dpkg
のマルチアーキテクチャサポートのおかげで、ユーザは現在のシステムにインストールできる「外来アーキテクチャ」を定義できます。これを行うには、以下に示す通り dpkg --add-architecture
を使ってください。関連して、dpkg --remove-architecture
は外来アーキテクチャのサポートを取り消しますが、取り消したいアーキテクチャのパッケージが残っていた場合には失敗します。
#
dpkg --print-architecture
amd64 #
dpkg --print-foreign-architectures
#
dpkg -i gcc-6-base_6.3.0-18_armhf.deb
dpkg: アーカイブ gcc-6-base_6.3.0-18_armhf.deb の処理中にエラーが発生しました (--install): パッケージアーキテクチャ (armhf) がシステム (amd64) と一致しません 処理中にエラーが発生しました: gcc-6-base_6.3.0-18_armhf.deb #
dpkg --add-architecture armhf
#
dpkg --add-architecture armel
#
dpkg --print-foreign-architectures
armhf armel #
dpkg -i gcc-6-base_6.3.0-18_armhf.deb
以前に未選択のパッケージ gcc-6-base:armhf を選択しています。 (データベースを読み込んでいます ... 現在 112000 個のファイルとディレクトリがインストールされています。) gcc-6-base_6.3.0-18_armhf.deb を展開する準備をしています ... gcc-6-base:armhf (6.3.0-18) を展開しています... gcc-6-base:armhf (6.3.0-18) を設定しています ... #
dpkg --remove-architecture armhf
dpkg: エラー: データベースで現在使用中のアーキテクチャ 'armhf' を削除できません #
dpkg --remove-architecture armel
#
dpkg --print-foreign-architectures
armhf
Multi-Arch: same
」ヘッダフィールドが含まれています。マルチアーキテクチャが Debian に導入されたのは Wheezy の時ですから、最重要のライブラリは既にマルチアーキテクチャ対応が済んでいます。しかしながら、(バグ報告などの方法で) 要求しない限り絶対に対応されないライブラリが数多く存在することも事実です。
$
dpkg -s gcc-6-base
dpkg-query: エラー: --status は有効なパッケージ名を必要としますが、`gcc-6-base' はそうではありません: 1つ以上のインストール済み実体がある、あいまいなパッケー ジ名 'gcc-6-base' です パッケージ照会についてのヘルプには、--help を使用してください。 $
dpkg -s gcc-6-base:amd64 gcc-6-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-6-base/copyright
gcc-6-base:armhf, gcc-6-base:amd64: /usr/share/doc/gcc-6-base/copyright
Multi-Arch: same
パッケージを取り扱う際には、パッケージの名前にアーキテクチャの限定詞を付けて対象を明確に識別しなければいけない点は注目に値します。Multi-Arch: same
パッケージは対象アーキテクチャの異なる同じパッケージ間でファイルを共有しているかもしれません。さらに対象アーキテクチャの異なる同じパッケージ間でファイルが共有されている場合、dpkg
は共有されているファイルがビット単位で一致することを確認します。最後に重要なことですが、パッケージは対象アーキテクチャごとにバージョンが違ってはいけません。対象アーキテクチャの異なるパッケージも必ず同時にアップグレードされなければいけません。
Multi-Arch: foreign
」と宣言されているか、依存パッケージ群の 1 つのパッケージとアーキテクチャが一致しているかのどちらか一方を満足させる必要があります (依存関係解決処理中、アーキテクチャに依存しないパッケージはホストと同じアーキテクチャと仮定されます)。package:any
構文はどんなアーキテクチャでも依存関係を満足できることを意味しますが、外来パッケージを使って package:any
構文で表記された依存関係を満足できるのは「Multi-Arch: allowed
」と宣言されていた場合のみです。