Ubuntu / インストール済みパッケージの確認方法
Ubuntuでインストールされたパッケージは、人が確認する場合はapt list --installed、正確な状態の確認やスクリプト出力にはdpkg-queryを使用する方が便利です。パッケージ名を知っているか、特定のファイルの所有パッケージを探すか、手動インストール項目だけが必要かによって、コマンドを選べば良いです。
インストール済みパッケージ全体の確認
APT(Advanced Package Tool)でインストールされたパッケージとバージョン、アーキテクチャ、リポジトリの状態を一目で確認するには、次のコマンドを実行します。
apt list --installed
リストが長い場合はlessでページ分けするか、パッケージ名のパターンを直接指定できます。
apt list --installed | less
apt list --installed 'nginx*'
aptは人が対話的に使うための表示です。スクリプトではdpkg-queryの出力形式を指定できますが、-Wだけでは設定ファイルしか残っていない項目も含み得ます。以下はdb:Status-Statusがinstalledの行をawkで選び、名前・版・アーキテクチャだけを出す例です。awkとsortも必要です。
dpkg-query -W -f='${db:Status-Status}\t${binary:Package}\t${Version}\t${Architecture}\n' \
| awk -F '\t' '$1 == "installed" {print $2 "\t" $3 "\t" $4}' | sort
特定のパッケージがインストールされているか確認
パッケージ名を正確に知っている場合
次のコマンドはnginxのdpkg状態データベースの項目を表示します。正常にインストールされているパッケージであればStatus: install ok installedが表示されます。
dpkg-query -s nginx
インストール状態だけを一行で確認したい場合は、状態フィールドを直接出力できます。
dpkg-query -W -f='${db:Status-Status}\n' nginx
現在状態がインストール済みならinstalledが出ます。これはエラーフラグなどを省いた1フィールドなので、正常性の確認には-sのStatus全体や略記の第3文字も確認します。データベースにない場合は0以外で終了しますが、問い合わせ成功の0だけでもインストール済みとは断定しないでください。
似た名前を一緒に探す場合
dpkg-query -l はシェルのワイルドカーパターンをサポートします。パターンはシェルが先に展開しないように、引用符で囲むのが安全です。
dpkg-query -l 'nginx*'
出力の最初の三文字は、希望する動作、現在の状態、エラー状態を順に示します。よく見かける ii は、インストールを希望しており、現在インストール済みであることを意味します。
| 表示 | 意味 |
|---|---|
ii |
インストール希望で、現在正常にインストールされている状態です。 |
rc |
パッケージファイルは削除されましたが、設定ファイルが残っている状態です。 |
iU |
圧縮は解凍されましたが、設定作業が完了していない状態です。 |
| 大文字状態 | 不完全または深刻な状態である可能性があるため、詳細な状態とパッケージ作業ログを確認する必要があります。 |
インストールされているバージョンとリポジトリ候補の確認
現在インストールされているバージョンのみを出力
dpkg-query -W -f='${binary:Package}\t${Version}\n' curl
この版表示は、前節で現在状態がinstalledであることを確認してから読みます。binary:PackageはMulti-Arch(複数アーキテクチャの併存)で必要に応じて名前へアーキテクチャを付けます。異なるアーキテクチャの同名パッケージを区別し、版文字列を単純な文字列順だけで比較しないでください。
インストールされているバージョンとアップデート候補の比較
apt-cache policy curl
Installedは現在のバージョン、Candidateはアクティブなリポジトリ設定で選択される候補バージョンです。リポジトリのメタデータが古くなっている可能性があるため、アップデート判断前にはsudo apt updateを実行します。
パッケージがインストールしたファイルの確認
パッケージに含まれるファイル一覧
dpkg-query -L nginx
このコマンドは、dpkgデータベースに記録されたファイルの一覧を表示します。インストール後にサービスが新しく作成したログ、キャッシュ、アップロードファイルやデータベースファイルまでをすべて表示するコマンドではありません。
特定のファイルの所有パッケージを確認
dpkg-query -S /usr/bin/curl
/usr/bin/python3が存在し、有効な参照先を持つ場合は実体のパスも確認します。リンクそのものと実体の所有パッケージは違うことがあるので、両方を区別してください。
readlink -f /usr/bin/python3
dpkg-query -S "$(readlink -f /usr/bin/python3)"
dpkg-query -Sは、インストールされたパッケージの記録のみを検索します。まだインストールされていないファイルを提供するリポジトリパッケージを探すには、apt-fileのような別のツールとインデックスが必要です。
手動インストールと自動インストールパッケージの区別
APTは、ユーザーが直接選択したパッケージと依存関係として自動インストールされたパッケージを区別して記録します。
apt-mark showmanual
apt-mark showauto
showmanualの結果には、ユーザーが後で直接インストールしたプログラムだけでなく、Ubuntuの基本インストールを構成するメタパッケージや初期イメージで手動で表示された項目も含まれる場合があります。したがって、この一覧だけを見てインストール場所や使用目的を断定してはいけません。
もはやどの手動パッケージも必要としない自動インストールの依存関係は、autoremoveの対象として提案されることがあります。削除前に候補と影響範囲を必ず確認してください。
sudo apt autoremove --dry-run
インストールパッケージのリストをファイルに保存
障害分析やサーバー比較に備えて、インストール済み状態の行だけをタブ区切りで保存します。出力先は既存ファイルを上書きするため、新しい名前を選びます。Bashのスクリプトならset -o pipefailなどで途中の問い合わせ失敗も検出し、標準エラーと保存内容を確認してください。
dpkg-query -W -f='${db:Status-Status}\t${binary:Package}\t${Version}\t${Architecture}\n' \
| awk -F '\t' '$1 == "installed" {print $2 "\t" $3 "\t" $4}' | sort > installed-packages.tsv
2台のサーバーまたは2つの時点のリストは、次のように比較します。
diff -u installed-packages-before.tsv installed-packages-after.tsv
このファイルは当時の状態を記録したインベントリであり、完全な復元手段ではありません。異なるUbuntuリリースでは同じバージョンが存在しない場合があり、リポジトリ・PPA・Snapパッケージ・ローカル設定およびアプリケーションデータは別途保管する必要があります。
DebパッケージとSnapパッケージの区別
aptおよびdpkg-queryはDebパッケージを参照します。Snapでインストールされたアプリケーションは別のコマンドで確認する必要があります。
snap list
サーバーの全ソフトウェアインベントリが必要な場合は、Deb、Snap、コンテナイメージ、言語別パッケージマネージャ、および手動インストールプログラムをそれぞれ確認する必要があります。
目的別コマンドの要約
| 確認目的 | 推奨コマンド |
|---|---|
| Debパッケージ全リスト | apt list --installed |
| 形式化された名前・バージョンを出力 | dpkg-query -W -f='出力 形式' |
| 特定パッケージの状態 | dpkg-query -s パッケージ名 |
| インストールバージョンと候補バージョン | apt-cache policy パッケージ名 |
| パッケージがインストールしたファイル | dpkg-query -L パッケージ名 |
| ファイルの所有パッケージ | dpkg-query -S ファイルパス |
| 手動インストール表示項目 | apt-mark showmanual |
| Snapパッケージのリスト | snap list |
確認する際の注意点
grepでパッケージを検索すると、名前の一部が同じ他のパッケージも一緒に表示されることがあります。正確なインストール判断にはdpkg-query -sや-Wを使用します。dpkg-query -lは現在インストールされているパッケージ以外に設定だけが残っている項目も表示することがあるため、状態列も併せて確認する必要があります。- パッケージ一覧だけではサービスの実行状況は分かりません。サービスの状態は
systemctl statusなど当該サービスの管理ツールで別途確認します。 - 不要と思われるパッケージを削除する前に、依存関係、メタパッケージ、運用機能への影響を確認します。




