Linux における RPM を使用したパッケージ管理

Red Hat Enterprise LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、強力なコマンドラインユーティリティである rpm コマンドを使用して、RPM ベースの Linux ディストリビューションでソフトウェアパッケージを管理する基礎を学びます。詳細なパッケージ情報の照会、インストール済みパッケージの整合性検証、RPM ファイルの内容検査など、不可欠なパッケージ管理タスクの実践的な経験を積むことができます。

各ステップを通じて、特定の rpm コマンドを使用して、ファイルがどのパッケージに属しているかの特定、パッケージの依存関係や設定ファイルのリスト表示、逆依存関係(そのパッケージを必要としている他のパッケージ)の確認方法を習得します。また、パッケージ削除の影響を理解するために安全に削除をシミュレーションする方法や、インストール前に rpm2cpiocpio などのツールを使用して RPM パッケージファイルの内容を確認する方法についても学びます。

rpm -qirpm -qf による基本的なパッケージ情報の照会

このステップでは、Red Hat Package Manager (rpm) を使用して、インストールされているパッケージに関する情報を照会する方法を学びます。rpm は、CentOS、Fedora、RHEL などの RPM ベースの Linux ディストリビューションでソフトウェアを管理するための強力なコマンドラインユーティリティです。ここでは、2 つの基本的な照会オプションに焦点を当てます。詳細なパッケージ情報を取得する -qi と、特定のファイルがどのパッケージに属しているかを確認する -qf です。

まず、システムに既にインストールされているパッケージの詳細を確認しましょう。bash シェルはシステムのコアコンポーネントであり、格好の例です。-q フラグは「query(照会)」、i フラグは「information(情報)」を意味します。

ターミナルで次のコマンドを実行して、bash パッケージに関する情報を照会します。

rpm -qi bash

パッケージのさまざまな属性をリストした詳細な出力が表示されます。出力は次のようになります(バージョン番号や日付は異なる場合があります)。

Name        : bash
Version     : 4.4.20
Release     : 5.el8
Architecture: x86_64
Install Date: <some_date>
Group       : System Environment/Shells
Size        : 4989189
License     : GPLv3+
Signature   : RSA/SHA256, <some_date_and_time>, Key ID <some_key_id>
Source RPM  : bash-4.4.20-5.el8.src.rpm
Build Date  : <some_date>
Build Host  : <some_build_host>
Relocations : (not relocatable)
Vendor      : CentOS
URL         : http://www.gnu.org/software/bash
Summary     : The GNU Bourne-Again Shell
Description :
The GNU Bourne-Again Shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C
shell (csh).  Most sh scripts can be run by bash without
modification.

この出力には、パッケージのバージョン、目的の要約、より詳細な説明など、豊富な情報が含まれています。

次に、システム上にあるファイル(例えば /usr/bin/bash にある bash 実行ファイル)が、どのパッケージによってインストールされたかを知りたい場合を想定してください。これは、システムの監査やトラブルシューティングの際によく行われる作業です。これには -qf フラグを使用します。ここで f は「file(ファイル)」を意味します。

次のコマンドを実行して、/usr/bin/bash ファイルを所有しているパッケージを確認します。

rpm -qf /usr/bin/bash

コマンドはこのファイルを提供しているパッケージのフルネームを返します。

bash-5.1.8-9.el9.x86_64

ご覧の通り、システムは /usr/bin/bashbash パッケージに由来することを正しく識別しており、先ほど確認した情報と一致しています。rpm -qif /usr/bin/bash を実行することで、これらのフラグを組み合わせて、ファイルを所有するパッケージの情報を直接取得することも可能です。

rpm -qRrpm -qc によるパッケージの依存関係と設定ファイルのリスト表示

このステップでは、引き続き rpm を探索し、パッケージの依存関係(dependencies)と関連する設定ファイルのリストを表示する方法を学びます。ほとんどのソフトウェアは正しく動作するために他のパッケージに依存しているため、依存関係を理解することは非常に重要です。また、設定ファイルがどこにあるかを知ることは、システム管理やカスタマイズにおいて不可欠です。

まず、bash パッケージが他にどのようなパッケージや機能を必要としているかを確認しましょう。これには -qR(または --requires)フラグを使用します。R は「requires(必要条件)」を意味します。

次のコマンドを実行して、bash の依存関係を確認します。

rpm -qR bash

出力には、bash が依存しているパッケージやシステム機能のリストが表示されます。このリストはかなり長くなることがあります。

/bin/sh
config(bash) = 4.4.20-5.el8
filesystem >= 3
glibc
info
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
...
rtld(GNU_HASH)

この出力は、bashglibc パッケージ(C ライブラリ libc.so.6 を提供)、filesystem パッケージ、およびその他のシステムレベルのコンポーネントを必要としていることを示しています。

次に、bash パッケージの一部としてインストールされた設定ファイルを探しましょう。これは、新しいユーザーに対するシェルのデフォルトの動作を変更したい場合に便利です。これには -qc フラグを使用します。ここで c は「configfiles(設定ファイル)」を意味します。

次のコマンドを実行して、bash の設定ファイルをリスト表示します。

rpm -qc bash

出力には、設定ファイルへのフルパスが表示されます。

/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc

/etc/skel にあるこれらのファイルは、ユーザーアカウントが作成されたときに新しいユーザーのホームディレクトリにコピーされるテンプレートファイルです。

また、フラグを組み合わせて、特定のコマンドに関連する設定ファイルを見つけることもできます。例えば、passwd コマンドで使用される設定ファイルを確認するには、-qcf を使用します。これにより、rpm はまずファイルのパッケージを特定し(-f /usr/bin/passwd)、次にその設定ファイルをリスト表示(-c)します。

rpm -qcf /usr/bin/passwd

このコマンドにより、passwd ユーティリティに関連付けられた設定ファイルが明らかになります。

/etc/pam.d/passwd

これは、コマンドの動作を変更するために編集が必要なファイルを素早く特定するための強力な方法です。

rpm -V によるパッケージの整合性とファイル変更の検証

このステップでは、rpm -V(または rpm --verify)を使用して、インストール済みパッケージの整合性を検証する方法を学びます。このコマンドは、セキュリティおよびトラブルシューティングにおいて極めて重要なツールです。インストールされたファイルを、ファイルサイズ、権限、チェックサムなど、RPM データベースに保存されている情報と照合します。これにより、システムファイルに対する不正な変更や偶発的な変更を検出できます。

まず、検証テストに使用するために、lsscsiat という 2 つのユーティリティパッケージがシステムにインストールされていることを確認しましょう。

sudo dnf install -y lsscsi at

次に、lsscsi パッケージを検証します。インストールしたばかりで何も変更を加えていないため、検証テストに合格するはずです。検証に成功した場合、出力は何も表示されません。

rpm -V lsscsi

予想通り、コマンドプロンプトは何のメッセージも出さずに戻ってきます。これは、lsscsi パッケージ内のすべてのファイルが元の状態であることを示しています。

次に、意図的に設定ファイルを変更して、rpm -V がどのように変更を報告するかを確認しましょう。at パッケージに属する /etc/at.deny ファイルに 1 行追加します。このファイルは、at コマンドの使用を許可しないユーザーを制御します。

echo "labex" | sudo tee -a /etc/at.deny

ファイルを変更したので、再度 at パッケージを検証してみましょう。

sudo rpm -V at

今回は、変更が検出されたことを示す出力が表示されます。

S.5....T.  c /etc/at.deny

この出力の内容を分解してみましょう。

  • S: ファイルサイズ(Size)が変更されました。
  • 5: MD5 チェックサムが変更されました。
  • T: 修正時刻(Time)が変更されました。
  • c: これが設定ファイル(configuration file)であることを示します。
  • /etc/at.deny: 変更されたファイルへのパス。

8 文字の文字列 S.5....T. の各文字位置は、異なるテストを表しています。. はテストに合格したことを意味します。この出力は、/etc/at.deny 設定ファイルがインストール時から変更されていることを明確に示しています。

また、-qVf フラグを使用して、特定のファイルを所有するパッケージを直接検証することもできます。

sudo rpm -qVf /etc/at.deny

このコマンドは、まず /etc/at.deny を所有するパッケージ(at)を見つけ、次にそれを検証するため、同じ出力が生成されます。

逆依存関係の確認と rpm -e --test によるパッケージ削除のシミュレーション

このステップでは、逆依存関係(reverse dependencies)を確認し、パッケージの削除を安全にシミュレーションする方法を学びます。rpm -qR コマンドがパッケージが「何を必要としているか(依存関係)」を示すのに対し、rpm -q --whatrequires は「他のどのパッケージがそれを必要としているか(逆依存関係)」を示します。パッケージを削除するとシステムの他の部分が壊れる可能性があるため、削除前にこれを知っておくことは非常に重要です。

パッケージ削除の影響を安全に確認するには、rpm -e --test コマンドを使用します。-e フラグは「erase(削除)」を意味し、--test フラグは実際にファイルを削除せずにドライラン(予行演習)を行うよう RPM に指示します。

まず、他の多くのパッケージが依存しているコアシステムパッケージを調べてみましょう。glibc パッケージは GNU C ライブラリを提供しており、Linux システム上のほぼすべてのプログラムの基礎となっています。どのパッケージが glibc を必要としているかを確認してみましょう。

rpm -q --whatrequires glibc

出力には、glibc に依存しているいくつかのパッケージが表示されます。

glibc-common-2.34-168.el9_6.19.x86_64
glibc-langpack-en-2.34-168.el9_6.19.x86_64
libstdc++-11.5.0-5.el9_5.x86_64
glibc-headers-2.34-168.el9_6.19.x86_64
pam-1.5.1-23.el9.x86_64
glibc-devel-2.34-168.el9_6.19.x86_64
nscd-2.34-168.el9_6.19.x86_64

ご覧の通り、多くの重要なシステムパッケージが glibc に依存しています。では、glibc を削除しようとするとどうなるか見てみましょう。システム全体が壊れてしまうのを防ぐため、必ず --test フラグを使用します。

sudo rpm -e --test glibc

非常に多くのパッケージが glibc を必要としているため、RPM は依存関係エラーを報告し、削除を阻止します。出力には、失敗した依存関係の長いリストが表示されます。

error: Failed dependencies:
 glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-common-2.34-168.el9_6.19.x86_64
 glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-langpack-en-2.34-168.el9_6.19.x86_64
 glibc >= 2.34 is needed by (installed) libstdc++-11.5.0-5.el9_5.x86_64
 ... (追加の依存関係エラー)

次に、依存関係が少ないパッケージを見てみましょう。先ほどインストールした lsscsi パッケージは、逆依存関係が少ないユーティリティパッケージです。何がこれを必要としているか確認します。

rpm -q --whatrequires lsscsi

lsscsi を必要とするパッケージはないという出力が表示されるはずです。

no package requires lsscsi

lsscsi に依存しているパッケージはないため、安全に削除をシミュレーションできます。

sudo rpm -e --test lsscsi

このコマンドはエラーなしで完了するはずです。これは、lsscsi を削除してもシステム上の他のパッケージを壊すことはないことを示しています。

これにより、逆依存関係を事前に確認することで、パッケージ削除の影響を予測し、システムを壊すのを避ける方法が理解できたはずです。

rpm2cpiocpio による RPM パッケージの内容検査

このステップでは、RPM パッケージファイルをインストールすることなく、その内容を検査する強力なテクニックを学びます。これは、インストール前にパッケージに含まれるファイルを確認したり、破損または削除されたファイルを復元するためにパッケージから単一のファイルを抽出したりする場合に便利です。このプロセスには、RPM ファイルを cpio アーカイブに変換する rpm2cpio と、そのアーカイブからファイルをリスト表示または抽出できる cpio の 2 つのコマンドを使用します。

まず、検査するための実際の .rpm ファイルが必要です。dnf パッケージマネージャーを使用して、bash のパッケージファイルを現在のディレクトリ (~/project) にダウンロードしましょう。download サブコマンドは、インストールせずにパッケージファイルのみを取得します。

sudo dnf download bash

ファイルが正常にダウンロードされたことを示す出力が表示されます。ファイル名にはバージョンとアーキテクチャが含まれます。

Last metadata expiration check: ...
bash-<version>.<arch>.rpm

次に、ls コマンドを使用して、.rpm ファイルが ~/project ディレクトリにあることを確認します。

ls bash-*.rpm

RPM ファイルの準備ができたら、rpm2cpiocpio コマンドを組み合わせて内容をリスト表示できます。rpm2cpio コマンドは RPM ファイルを読み取り、cpio アーカイブを標準出力に出力します。次に、この出力をパイプ (|) で cpio コマンドに渡し、標準入力からアーカイブを読み取ります。cpio-t フラグは、内容の一覧(table of contents)を表示するよう指示します。

rpm2cpio bash-*.rpm | cpio -t

これにより、bash パッケージに含まれるすべてのファイルとディレクトリの長いリストが表示されます。出力は次のようになります。

.
./etc
./etc/skel
./etc/skel/.bash_logout
./etc/skel/.bash_profile
./etc/skel/.bashrc
./usr
./usr/bin
./usr/bin/bash
./usr/bin/sh
./usr/share
./usr/share/doc
...

このテクニックにより、パッケージのペイロードを完全に把握でき、インストールした場合にシステムにどのようなファイルが配置されるかを正確に確認できます。

まとめ

この実験では、Linux 環境で RPM ユーティリティを使用してソフトウェアパッケージを管理および照会する方法を学びました。まず、rpm -qi でインストール済みパッケージの詳細情報を取得し、rpm -qf を使用して特定のファイルがどのパッケージに属しているかを特定することから始めました。また、rpm -qR でパッケージの依存関係をリスト表示し、rpm -qc で設定ファイルの場所を特定する練習を行い、パッケージがシステムにどのように統合されているかを包括的に理解しました。

これらの照会スキルを基に、rpm -V を使用してインストール済みパッケージのファイルの整合性を検証し、変更がないかを確認する方法を学びました。また、逆依存関係を安全に確認する方法や、rpm -e --test を使用して変更を加えることなく潜在的な影響を理解するためにパッケージの削除をシミュレーションする方法についても学びました。最後に、rpm2cpiocpio を使用して内容を抽出およびリスト表示することで、インストール前に RPM パッケージファイルの内容を検査する能力を習得しました。