【Linux】rpm -qでインストール済みパッケージを調べる方法

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 <ファイルのパス> で調べます。

参考

この記事を書いた人

渋谷で働くよわよわエンジニア。TypeScript(Next.js/Node.js)/Golang/AWS/Flutterなど
LINE API Expert(2023/1~)

tokkuをフォローする
オススメ記事
在宅ワークが多くなって、デスクの配線周りに困っている方は、拡張デスクの導入がおすすめです。Windows/MacOS/Linuxの複数の機器をスッキリとデスク周りに収める事ができました!リモートからサーバーメンテを行うインフラエンジニアは必見です!
AWS
シェアする
tokkuをフォローする

コメント

タイトルとURLをコピーしました