EC2 などで動かしている Linux サーバーで「このパッケージは入っているか」「入っているならバージョンは何か」「このファイルはどのパッケージのものか」を確かめる方法を、rpm -q を軸にまとめます。-q(問い合わせ)に組み合わせるオプションを、調べたいこと別に整理しています。前提の環境は Amazon Linux 2023 です。rpm -q 系のオプションは RHEL・Rocky Linux・AlmaLinux など RPM を使うディストリビューションでも同じように使えます。
rpm -q で調べられること
rpm -q はローカルの RPM データベースに問い合わせるコマンドです。インストール済みのパッケージについて調べ、何も変更しません。調べたいことに合わせて、次のオプションを組み合わせます。
| 調べたいこと | コマンド |
|---|---|
| パッケージが入っているか、バージョンは何か | rpm -q <パッケージ名> |
| インストール済みのパッケージの一覧 | rpm -qa |
| パッケージの詳細(バージョン・インストール日時・説明) | rpm -qi <パッケージ名> |
| パッケージに含まれるファイルの一覧 | rpm -ql <パッケージ名> |
| パッケージに含まれる設定ファイルだけ | rpm -qc <パッケージ名> |
| パッケージに含まれるドキュメントだけ | rpm -qd <パッケージ名> |
| あるファイルがどのパッケージのものか | rpm -qf <ファイルのパス> |
| 最近インストールしたパッケージ | rpm -qa --last |
| 好きな形式で出力する | rpm -q --queryformat '<書式>' <パッケージ名> |
| まだ入れていない .rpm ファイルの中身 | rpm -qp<オプション> <ファイル名>.rpm |
-qa や -qi のように、-q の後ろにオプションの文字を続けて書けます。
インストール済みかを確かめる
1. パッケージ名で問い合わせる
パッケージ名だけを渡すと、入っていればバージョンとリリースを含めた名前が1行で返ります。
rpm -q openssh-server
入っていない場合は次のように表示され、終了コードが 0 以外になります。
package openssh-server is not installed
終了コードで判定できるので、シェルスクリプトで「入っていなければ入れる」と書くときにも使えます。
if ! rpm -q nginx > /dev/null 2>&1; then
sudo dnf install -y nginx
fi
複数のパッケージを一度に問い合わせることもできます。
rpm -q openssh-server openssh-clients chrony
2. インストール済みの一覧から探す
-a(--all)はインストール済みのすべてのパッケージを返します。数百件になるので、grep で絞り込むのが普通です。
rpm -qa | grep -i ssh
名前の順に並べたいときは sort を挟みます。
rpm -qa | sort
3. 最近インストールしたパッケージを見る
--last を付けると、インストールした日時の新しい順に並び、日時も一緒に表示されます。アップデートの後に何が入れ替わったかを確かめるときに使えます。
rpm -qa --last | head -20
パッケージの中身を確かめる
1. 詳細を表示する
-i(--info)は、名前・バージョン・リリース・アーキテクチャ・インストール日時・サイズ・ライセンス・説明などをまとめて表示します。
rpm -qi openssh-server
2. 含まれるファイルを一覧にする
-l(--list)は、そのパッケージが置いたファイルをフルパスで並べます。設定ファイルやバイナリの場所が分からないときに使います。
rpm -ql openssh-server
設定ファイルだけを見たいときは -c(--configfiles)、ドキュメントだけなら -d(--docfiles)を使います。どちらも -l の結果を絞り込んだものです。
rpm -qc openssh-server
rpm -qd openssh-server
3. ファイルから持ち主のパッケージを引く
-f(--file)は逆向きの問い合わせで、ファイルのパスからそのファイルを含むパッケージを返します。
rpm -qf /etc/ssh/sshd_config
コマンドがどのパッケージに入っているかを知りたいときは、command -v でパスを取ってから渡します。
rpm -qf "$(command -v ssh)"
4. まだ入れていない .rpm ファイルを調べる
-p(--package)を付けると、RPM データベースではなく手元の .rpm ファイルに問い合わせます。他のオプションと組み合わせて、入れる前に中身を確かめられます。
rpm -qpi ./example-1.0-1.amzn2023.x86_64.rpm
rpm -qpl ./example-1.0-1.amzn2023.x86_64.rpm
依存先を調べる -R(--requires)や、逆引きの --whatrequires は、rpm・dnfでパッケージの依存関係を確認する方法にまとめています。
出力の形式を変える
--queryformat(--qf)を使うと、出力を好きな形式にできます。%{タグ名} の形で、パッケージの情報(ヘッダのタグ)を埋め込みます。
rpm -qa --queryformat '%{NAME}\t%{VERSION}-%{RELEASE}\t%{ARCH}\n' | sort
日時のように数値で保存されているタグは、:date を付けると読める形になります。
rpm -q --queryformat '%{NAME} %{INSTALLTIME:date}\n' openssh-server
使えるタグの一覧は次のコマンドで確かめられます。
rpm --querytags
複数台のサーバーでインストール済みのパッケージを比べたいときは、名前とバージョンだけをタブ区切りで出してファイルに保存し、diff にかけると差分が分かります。
rpm -qa --queryformat '%{NAME}\t%{VERSION}-%{RELEASE}\n' | sort > packages-$(hostname).txt
動作を確認する
どのサーバーにも入っているパッケージで試すと、オプションが期待どおりに動いているかが分かります。
rpm -q bash
rpm -qf /bin/bash
rpm -qc bash
1つ目と2つ目で bash-<バージョン>-<リリース>.<アーキテクチャ> の形の同じ名前が返り、3つ目で /etc/skel/.bashrc などの設定ファイルのパスが並べば、正しく動いています。
うまくいかないとき
package xxx is not installed と出るが、入っているはず
パッケージ名がコマンド名と違うことがあります。rpm -qa | grep -i <名前の一部> で正しいパッケージ名を探すか、コマンドのパスが分かるなら rpm -qf "$(command -v <コマンド名>)" で持ち主のパッケージを引いてください。
rpm -qf で file xxx is not owned by any package と出る
そのファイルは RPM パッケージから入ったものではありません。手でコピーしたファイル、アプリケーションが実行時に作ったファイル、pip や npm などの別のパッケージ管理で入れたファイルが当てはまります。
rpm -qi にパッケージのファイル名を渡して何も出ない
rpm -q 系はインストール済みのパッケージをパッケージ名で引きます。.rpm ファイルを調べるときは -p を付けて rpm -qpi <ファイル名>.rpm としてください。
まだ入れていないパッケージを調べたい
rpm -q はローカルの RPM データベースしか見ません。リポジトリにあるパッケージの情報は dnf info <パッケージ名>、どのパッケージがあるファイルを提供するかは dnf provides <ファイルのパス> で調べます。


コメント