dpkgで学ぶ！Ubuntuのソフト管理

# Ubuntu ソフトウェア管理 - dpkgの使い方

Debian ソフトウェアパッケージは通常、拡張子が「.deb」のプレコンパイルされたバイナリ形式であり、rpm ファイルに似ています。そのため、インストールが迅速で、ソフトウェアをコンパイルする必要はありません。パッケージファイルには、特定の機能やソフトウェアに必要なファイル、メタデータ、指示が含まれています。

dpkg：Debian 用のパッケージマネージャーであり、rpm のようなものです。dpkg は Debian ベースのシステムのパッケージマネージャであり、ソフトウェアパッケージのインストール、削除、構築が可能ですが、ソフトウェアパッケージやその依存関係を自動的にダウンロードおよびインストールすることはできません。

apt：Advanced Packaging Tool の略で、強力なソフトウェア管理ツールです。Ubuntu システム全体をアップグレードすることもできます。クライアント/サーバーアーキテクチャ (C/S) に基づいています。

### rhel シリーズと debianシリーズのパッケージ管理の比較

| オペレーティングシステム (OS) | パッケージファイル拡張子 | ローカルパッケージ管理 | ネットワークパッケージ管理 | ネットワークパッケージ管理作業モード | 設定ファイル |
|------------------------------|-------------------------|------------------------|----------------------------|----------------------------------------|------------------|
| RHEL                         | rpm                     | rpm                    | yum/dnf                     | C/S                                    | /etc/yum.repos.d/*.repo |
| Debian                       | deb                     | dpkg                   | apt                        | C/S                                    | /etc/apt/sources.list |

### 1.1 APTの動作原理

サーバー上でまずすべての DEB パッケージをコピーし、次に APT の分析ツール genbasedir を使用して、各 DEB パッケージのヘッダー情報に基づいてすべての DEB パッケージを分析し、その分析結果をフォルダー base 内の DEB インデックスリストファイルに記録します。 APT サーバー内の DEB に変更があると、genbasedir を使用して新しい DEB インデックスリストを生成します。

クライアントがインストールまたはアップグレードを行う場合、まず DEB インデックスリストを照会して、依存関係のあるすべてのソフトウェアパッケージを把握し、それらをクライアントにダウンロードしてインストールします。 クライアントが特定のソフトウェアパッケージをインストール、アップグレード、または削除する必要がある場合、クライアントコンピューターは DEB インデックスリストの圧縮ファイルを取得し、/var/cache/apt/ に解凍して配置します。クライアントが apt-get install または apt-get upgrade コマンドを実行する際に、このフォルダ内のデータとクライアントコンピューター内の DEB データベースを比較して、どの DEB がインストール済み、未インストール、またはアップグレード可能であるかを把握します。

### 1.2 dpkg パッケージマネージャ

```shell
dpkg [<option> ...] <command>
# よく使われるオプション
-i|--install package.deb        # パッケージのインストール
--unpack package.deb            # パッケージの解包
-r|--remove packageName         # パッケージの削除、依存関係のあるパッケージは自動的に削除しないため注意
-P|--purge packageName          # パッケージの削除（設定ファイルを含む）
-V|--verify packageName         # パッケージがインストールされているか確認
--get-selections pattern        # パターンに基づいてパッケージをリスト表示
--set-selections                # 標準入力からインストールするソフトウェアを選択
--clear-selections              # 不要なソフトウェアパッケージの選択を解除
--update-avail packageFile      # 現在のインストール可能なソフトウェアパッケージ情報を置き換える
--merge-avail packageFile       # ファイルの情報をシステムにマージ
--clear-avail                   # 現在のソフトウェアパッケージ情報をクリア
--forget-old-unavail            # アンインストールされたインストール不可能なソフトウェアパッケージを忘れる
-s|--status packageName         # 特定のソフトウェアパッケージの詳細な状態を表示 (rpm -qi に似ている)
-p|--print-avail packageName    # 現在のマシン上ですべてのインストール可能なパッケージを表示
-L|--listfiles packageName      # 指定したソフトウェアパッケージに属するファイルをリスト表示 (rpm -ql に似ている)
-l|--list [pattern]             # 現在インストールされているパッケージをリスト表示 (rpm -qa に似ている)
-S|--search pattern             # ファイルに基づいてソフトウェアパッケージを検索 (rpm -qf に似ている)
-C|--audit [pattern]            # ソフトウェアパッケージが損傷しているか確認
--yet-to-unpack                 # 待機中の解包パッケージをリスト表示
--predep-package                # 事前依存関係のある待機解包パッケージをリスト表示
--compare-versions v1 - b       # バージョン番号を比較
--force-help                    # 強制オプションのヘルプ情報を表示
-Dh|--debug=help                # エラーデバッグのヘルプ情報を表示
--info packageFile              # パッケージの関連情報をリスト表示
-c packageFile                  # パッケージ内のファイルをリスト表示 (rpm -qpl に似ている)
```

### 使用例

#### 例：パッケージがインストールされているか確認

```shell
root@ubuntu22:~# dpkg -V vim
root@ubuntu22:~# echo $?
0

root@ubuntu22:~# dpkg -V nginx
dpkg: package 'nginx' is not installed
root@ubuntu22:~# echo $?
1
```

#### 例：インストールとアンインストール

`dpkg` のソフトウェアインストールは解包と設定の 2 部に分かれます

```shell
# クエリ
root@ubuntu22:~# dpkg -V firmware-sof-signed
dpkg: package 'firmware-sof-signed' is not installed
# インストール
root@ubuntu22:~# dpkg -i /cdrom/pool/restricted/f/firmware-sof/firmware-sof-signed_2.0-1ubuntu2_all.deb
Selecting previously unselected package firmware-sof-signed.
(Reading database ... 108476 files and directories currently installed.)
Preparing to unpack .../firmware-sof-signed_2.0-1ubuntu2_all.deb ...
Unpacking firmware-sof-signed (2.0-1ubuntu2) ...
Setting up firmware-sof-signed (2.0-1ubuntu2) ...
# クエリ
root@ubuntu22:~# dpkg -l firmware-sof-signed
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name               Version     Architecture Description
+++-===================-============-============-
=================================
ii firmware-sof-signed 2.0-1ubuntu2 all         Intel SOF firmware - signed
# アンインストール
root@ubuntu22:~# dpkg -r firmware-sof-signed
(Reading database ... 108702 files and directories currently installed.)
Removing firmware-sof-signed (2.0-1ubuntu2) ...
```

#### 例：条件に基づいてインストール済みパッケージをリスト表示

```shell
root@ubuntu22:~# dpkg --get-selections v*
vim install
vim-common install
vim-runtime install
vim-tiny install
```

#### 例：すべてのインストール可能なパッケージを表示

```shell
root@ubuntu22:~# dpkg -p
......
# 特定のパッケージを表示
root@ubuntu22:~# dpkg -p mawk
Package: mawk
Priority: required
Section: utils
Installed-Size: 229
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
......
```

#### 例：インストール済みのリストを表示

```shell
mage@ubuntu22:~$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name               Version               Architecture Description
+++-====================-=====================-==========-
=============================>
ii adduser             3.118ubuntu5           all       add and remove users 
and groups
ii amd64-microcode     3.20191218.1ubuntu2   amd64     Processor microcode 
firmware for AMD CPUs
ii apparmor            3.0.4-2ubuntu2         amd64     user-space parser 
utility for AppArmor
ii apport-symptoms     0.24                 all       symptom scripts for
apport
ii apt                 2.4.5                 amd64     commandline package 
manager
ii apt-utils           2.4.5                 amd64     package management 
related utility programs
ii base-files         12ubuntu4             amd64     Debian base system 
miscellaneous files
ii base-passwd         3.5.52build1           amd64     Debian base system 
master password and group files
ii  bash                5.1-6ubuntu1           amd64     GNU Bourne Again SHell
ii bash-completion     1:2.11-5ubuntu1       all       programmable completion 
for the bash shell
```

#### 例：ワイルドカードを使用

```shell
mage@ubuntu22:~$ dpkg -l "vi*"
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name               Version             Architecture   Description
+++-====================-===================-=============-
=============================
ii  vim                 2:8.2.3995-1ubuntu2   amd64       Vi IMproved -
enhanced vi editor
un vim-athena         <none>                 <none>       (no description 
available)
ii vim-common          2:8.2.3995-1ubuntu2   all         Vi IMproved - Common 
files
un vim-doc             <none>                 <none>       (no description 
available)
un vim-gtk3           <none>                 <none>       (no description 
available)
un vim-nox             <none>                 <none>       (no description 
available)
ii vim-runtime         2:8.2.3995-1ubuntu2   all         Vi IMproved -
Runtime files
un vim-scripts         <none>                 <none>       (no description 
available)
ii vim-tiny            2:8.2.3995-1ubuntu2   amd64     Vi IMproved - enhanced 
vi editor - compact version
un virtualbox-guest-modules <none>           <none>       (no description 
available)
```

#### 例：具体的なパッケージ名

```shell
mage@ubuntu22:~$ dpkg -l vim
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                 Version             Architecture   Description
+++-======================-===================-==============-
=================================
ii  vim                   2:8.2.3995-1ubuntu2 amd64           Vi IMproved - enhanced vi editor
```

#### 例：リストの詳細

このリストには左から右に7列あります：

- Desired
- Status
- Err
- Name
- Version
- Architecture
- Description

`Desired` フィールドは、次のいずれかの値を取ることができます：

- u: 未知 (Unknown)
- i: インストールをリクエスト (Install)
- r: 削除をリクエスト (Remove)
- p: 全てを削除 (Purge)
- h: 保留 (Hold)

`Status` フィールドは、次のいずれかの値を取ることができます：

- n: インストールされていない (Not installed)
- i: インストールされ設定が完了 (Installed and configured)
- c: 削除済みだが設定ファイルが残っている (Config files remaining)
- u: 解凍されたが未設定 (Unpacked but not yet configured)
- f: 設定中にエラーが発生 (Configuration failed)
- h: インストール中にエラーが発生 (Installation failed)
- w: トリガー待機中 (Trigger await)
- t: トリガーが未解決 (Trigger pending)

`Err` フィールドには通常何も表示されませんが、次のいずれかが表示されることがあります：

- h: ロックされている (Locked)
- r: 再インストールが必要 (Reinstallation required)
- x: 損傷してロックされている (Damaged and locked)

#### 例：パッケージの詳細情報を表示

```shell
mage@ubuntu22:~$ dpkg -s vim
Package: vim
Status: install ok installed
Priority: optional
Section: editors
Installed-Size: 3916
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Version: 2:8.2.3995-1ubuntu2
Provides: editor
Depends: vim-common (= 2:8.2.3995-1ubuntu2), vim-runtime (= 2:8.2.3995-1ubuntu2), libacl1 (>= 2.2.23), libc6 (>= 2.34), libgpm2 (>= 1.20.7), libpython3.10 (>= 3.10.0), libselinux1 (>= 3.1~), libsodium23 (>= 1.0.14), libtinfo6 (>= 6)
Suggests: ctags, vim-doc, vim-scripts
Description: Vi IMproved - enhanced vi editor
 .....
```

#### 例：パッケージ内のすべてのファイルをリスト表示

```shell
root@ubuntu22:~# dpkg -L vim
/.
/usr
/usr/bin
/usr/bin/vim.basic
/usr/share
/usr/share/bug
/usr/share/bug/vim
......
```

#### 例：debパッケージファイルの情報を表示

```shell
root@ubuntu22:~# dpkg --info /cdrom/pool/main/a/amd64-microcode/amd64-microcode_3.20191218.1ubuntu2_amd64.deb
 new Debian package, version 2.0.
 size 32474 bytes: control archive=1720 bytes.
      76 bytes,     2 lines     conffiles            
     699 bytes,    17 lines     control              
     973 bytes,    12 lines     md5sums              
    1259 bytes,    46 lines   * postinst             #!/bin/sh
```

#### 例：debパッケージ内のすべてのファイルをリスト表示

```shell
root@ubuntu22:~# dpkg -c /cdrom/pool/main/a/amd64-microcode/amd64-microcode_3.20191218.1ubuntu2_amd64.deb
drwxr-xr-x root/root         0 2021-10-07 10:09 ./
drwxr-xr-x root/root         0 2021-10-07 10:09 ./etc/
drwxr-xr-x root/root         0 2021-10-07 10:09 ./etc/default/
-rw-r--r-- root/root       328 2019-12-21 04:12 ./etc/default/amd64-microcode
drwxr-xr-x root/root         0 2021-10-07 10:09 ./etc/modprobe.d/
-rw-r--r-- root/root       154 2021-10-07 10:09 ./etc/modprobe.d/amd64-
microcode-blacklist.conf
drwxr-xr-x root/root         0 2021-10-07 10:09 ./lib/
drwxr-xr-x root/root         0 2021-10-07 10:09 ./lib/firmware/
......
```

#### 例：ファイルがどのパッケージに属しているか
```shell
root@ubuntu22:~# dpkg -S "/etc/ssh/ssh_config"
openssh-client: /etc/ssh/ssh_config
```