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など当該サービスの管理ツールで別途確認します。
  • 不要と思われるパッケージを削除する前に、依存関係、メタパッケージ、運用機能への影響を確認します。

参考文書