RPM

はじめに

第6章はじめに

Red Hat Package Manager（RPM）は、Linuxシステムでのソフトウェアのインストール、検証、アップグレード、および削除を行うために、多くの主要なディストリビューション（およびそこから派生したもの）によって使用されています。低レベルのrpmプログラムはこれらのすべての処理を、1つのパッケージに対して実行することも、パッケージのリストに対して実行することもできます。問題を引き起こすような処理があれば、処理は中断されます（別のパッケージが依存しているパッケージの削除、または最初に他のソフトウェアをシステムにインストールする必要がある場合のパッケージのインストールなど）。


学習目標
この章の終わりまでに、次のことができるようになります。

RPMシステムがどのように構成され、rpmプログラムがどのような処理を実行するかを理解できます。
バイナリとソースの両方のrpmファイルに使用される命名規則を説明できます。
パッケージのクエリー、検証、インストール、アンインストール、アップグレード、更新ができます。
アップグレードするのではなく、新しいカーネルをインストールする理由を理解できます。
rpm2cpioを使用して、パッケージ化されたファイルをcpioアーカイブにコピーし、インストールすることなくファイルを抽出できます。


RPM

RPMを使用する利点
RPMは、Red Hatが開発したパッケージ管理ユーティリティです。名前はもともとRedhat Package Managerを表していました。特定のタスクまたはサブシステムに関連するすべてのファイルは、1つのファイルにパッケージ化されます。このファイルには、ファイルをインストールおよびアンインストールする方法とその場所に関する情報も含まれています。開発者がプログラムの新しいバージョンを作成すると、通常、新しいRPMパッケージがリリースされます。これらのファイルは、他のLinuxディストリビューションでは使用できない可能性があることに注意してください。また、特定のURLを指定しない限り、rpmはパッケージをネットワーク経由で取得せず、絶対パスまたは相対パスを使用してローカル マシンからインストールすることにも注意してください。

RPMによって、システム管理者はソフトウェア パッケージの管理が容易になります。特定のファイルがどのパッケージのものであるか、どのバージョンのパッケージがインストールされているか、それが正しくインストールされたかどうかを、簡単に判断することができます。FTPまたはHTTPを使用してパッケージをインストールできます。また、パッケージをすべて削除してディスク領域を解放することも簡単です。RPMはドキュメント ファイルをパッケージの他の部分と区別し、システムにドキュメントをインストールするかどうかを選択できるようにしています。

RPMにより、ソフトウェア開発者の仕事が簡単になります。多くの場合、開発者は、コードを変更し、別のオペレーティング システムで正しくコンパイルして実行できるようにする必要があります。しかしRPMを使用すると、構築する人は、Linuxでの構築に必要な変更を、元のソースとは別に持つことができます。このRPMは、構築関係の変更がすべて1か所にあるため、新しいバージョンのコードの組み込みが容易になります。また、さまざまなアーキテクチャ向けのLinuxバージョンの構築も容易になります。


パッケージ ファイル名
RPMパッケージ ファイル名は、RPMのドキュメントで文書化されているように、特定の情報を表すフィールドで構成されています。

バイナリ パッケージの標準の命名形式は次のとおりです。

<name>-<version>-<release>.<distro>.<architecture>.rpm
sed-4.5-1.e18.x86_64

ソース パッケージの標準の命名形式は次のとおりです。

<name>-<version>-<release>.<distro>.src.rpm
sed-4.5-1.e18.src.rpm

RPMで動作するyumとzypperのときに詳しく説明しますが、特定のインストールでは、複数の異なるパッケージ リポジトリを使用する可能性があるため、distroフィールドではパッケージの作成元のリポジトリを指定することに留意してください。


RPMデータベースと補助プログラム
/var/lib/rpmは、Berkeley DBハッシュ ファイル形式でRPMデータベース ファイルを保持する、デフォルトのシステム ディレクトリです。データベース ファイルは手動で変更しないでください。更新はrpmプログラムでのみ行う必要があります。

代替のデータベース ディレクトリは、rpmプログラムの--dbpathオプションで指定できます。たとえば、別のシステムからコピーされたRPMデータベースを調べるために、これを使うことができます。

--rebuilddbオプションを使用すると、インストールされたパッケージ ヘッダーからデータベース インデックスを再構築できます。これはどちらかというと修復的なものであり、ゼロからの再構築ではありません。

RPMで使用される補助プログラムとスクリプトは、/usr/lib/rpmにあります。かなりの数があります。たとえば、RHEL 7システムの場合：

$ ls /usr/lib/rpm | wc -l
70

ここで使っているwcは、出力の行数を報告するものです。

また、あなたがrpmrcファイルを作成し、rpmのデフォルトに指定することができます。デフォルトでは、rpmは以下の順番で探します。

1. /usr/lib/rpm/rpmrc
2. /etc/rpmrc
3. ~/.rpmrc

 rpmはこれらのファイルをすべて読むことに注意してください。rpmは存在を検出してもすぐに停止することはしません。 --rcfileオプションを使用して、他のrpmrcファイルを指定することもできます。


クエリ
すべてのrpmの照会には-qオプションを使うことができ、多くのサブオプションと組み合わせることができます。

どのバージョンのパッケージがインストールされているかを知るには？

$ rpm -q bash

このファイルがどのパッケージから得たものかを知るには？

$ rpm -qf /bin/bash

このパッケージによって、どのファイルがインストールされたかを知るには？

$ rpm -ql bash

このパッケージに関する情報を表示すには？

$ rpm -qi bash

パッケージ データベースではなく、パッケージ ファイルからこのパッケージに関する情報を表示すには？

$ rpm -qip foo-1.0.0-1.noarch.rpm

このシステムにインストールされている、すべてのパッケージをリストするには？

$ rpm -qa

その他の便利なオプションとして、-requiresと--whatprovidesがあります。

--requiresオプションは、パッケージの前提条件のリストを返します。

$ rpm -qp --requires foo-1.0.0-1.noarch.rpm

--whatprovidesオプションは、インストールされたどのパッケージが特定の必須パッケージを提供しているかどうかを表示します。

$ rpm -q --whatprovides libc.so.6


パッケージの検証
rpmの-Vオプションを使用して、特定パッケージのファイルがシステムのRPMデータベースと一致しているかを確認することができます。システム上のすべてのパッケージを確認するには次を実行します。

$ rpm -Va
missing /var/run/pluto
....
S.5....T. c /etc/hba.conf
S.5....T. /usr/share/applications/defaults.list
....L.... c /etc/pam.d/fingerprint-auth
....L.... c /etc/pam.d/password-auth
....
.M....... /var/lib/nfs/rpc_pipefs
....
.....UG.. /usr/local/bin
.....UG.. /usr/local/etc

これは数アイテムを示しただけです。このコマンドは、すべてのパッケージが所有しているすべてのファイルを検査するため、時間がかかることに注意してください。

問題がある場合にのみ出力が表示されます。出力では、各文字は、ファイルの属性をデータベースに記録された属性と比較した結果を示しています。 単体の「.」（ピリオド）はテストを通過したことを、単体の「？」 （疑問符）はテストが実行できなかったことを意味しています（たとえば、ファイルのパーミッションが読み取り禁止だった場合など）。それ以外の文字は、対応する--verifyテストの失敗を意味しています。

S：ファイル サイズが異なる
M：ファイルのパーミッションや種類が異なる
5：MD5チェックサムが異なる
D：デバイスのメジャー/マイナー番号の不一致
L：シンボリックリンク パスの不一致
U：ユーザーの所有権が異なる
G：グループ所有権が異なる
T：修正時刻が異なる
P：機能が異なる

すべてが正常な場合、何も出力されません。

引数として1つ以上のパッケージ名を指定した合、次の例のように、そのパッケージのみを調べます。

すべてが正常で何も出力されない例です。
$ rpm -V bash

ファイルのサイズ、チェックサム、および修正時刻が変更されたことを出力する例です。
$ rpm -V talk
S.5....T in.ntalkd.8

ファイルが欠落していることを出力する例です。
$ rpm -V talk
missing /usr/bin/talk


パッケージのインストール方法
パッケージのインストールは次のように簡単です。

$ sudo rpm -ivh bash-4.4.19-8.el8_0.x86_64

ここで、-iはパッケージのインストール実施、-vは詳細情報表示、-hは進行状況をハッシュ マークをつけて出力することを意味します。

各ボックスをクリックして展開し、RPM がパッケージをインストールするときに実行するタスクの詳細をご覧ください。

タスク

依存関係チェックの実行
RPMは依存性のチェックを実行します。一部のパッケージでは1つ以上の他のパッケージもインストールしないと適切に動作しないため、このチェックは必要です。​​​​

競合チェックの実行
RPMは競合チェックを実行します。これは、すでにインストールされているパッケージをインストールする場合や、新しいバージョンの上に古いバージョンをインストールする場合も含みます。

インストール前に要求されるコマンドの実行
パッケージを作成する開発者は、インストールの前後に特定のタスクを実行するように指定できます。

構成ファイルの知的な処理
構成ファイルをインストールするときに、ファイルが存在し、以前のバージョンのパッケージがインストールされてから変更されている場合、RPMはサフィックス.rpmsaveを使って古いバージョンを保存します。これにより、古い構成ファイルに加えた変更を、新しいバージョンのファイルに統合できます。この機能を使うには、RPMパッケージが適切に作成されている必要があります。

パッケージからファイルを解凍し、正しい属性でインストール
RPMは、適切な場所にファイルをインストールすることに加えて、パーミッション、所有権、変更（ビルド）時刻などの属性も設定します。

インストール後に必要なコマンドの実行
RPMは、セットアップまたは初期化に必要な、インストール後のタスクを実行します。

システムのRPMデータベースの更新
RPMはパッケージをインストールするたびに、システム データベース内の情報を更新します。競合をチェックするときにこの情報を使用します。


RPMパッケージのアンインストール
-eオプションにより、rpmはパッケージをアンインストール（消去）します。通常、アンインストールしようとしているパッケージが実際にはインストールされていない、またはシステム上の他のパッケージで必要な場合、rpm -eはエラー メッセージを出力して失敗の形で終了します。アンインストールが成功しても何も出力されません。

$ sudo rpm -e system-config-lvm
package system-config-lvm is not installed

依存関係によるエラーの例は、RHEL 7システムでは以下のように表示されます。

$ sudo rpm -e xz
error: Failed dependencies:
  xz is needed by (installed) dracut-033-161.el7.x86_64
  xz is needed by (installed) sos-3.0-23.el7.noarch
  xz is needed by (installed) libvirt-daemon-driver-qemu-1.1.1-29.el7_0.1.x86_64
  xz is needed by (installed) rpm-build-4.11.1-16.el7.x86_64 /usr/bin/xz is needed by (installed) kmod-14-9.el7.x86_64

--eオプションとともに--testオプションを使用すると、実際にアンインストールを行うことなく、アンインストールが成功するか失敗するかを判断できます。操作が成功すると、rpmは何も出力しません。-vvオプションを追加すれば、詳細情報を取得できます。

削除する時のパッケージ引数はパッケージ名です。rpmファイル名ではないことに注意してください。

🚩
rpmパッケージ自体を削除（消去／アンインストール）しないでください。rpmを削除する唯一の方法は、オペレーティング システムを再インストールするか、レスキュー環境を起動することです。

RPMパッケージのアンインストール 

スクリーンショットの例は、openSUSEシステムで実行されたものとは多少異なる依存関係がありますので、注意してください。


デモ：rpmコマンドの使用

このビデオでは、低レベルのrpmコマンドを使用してパッケージを調べたり、パッケージを削除したりする方法を紹介します。


パッケージの更新(Upgrade)
次のようにアップグレードすると、元のパッケージが置き換えられます（インストールされている場合）。

$ rpm -Uvh bash-4.4.19-10.el8.x86_64.rpm

引数は1つだけでなく、パッケージ名のリストを指定できます。

アップグレードする場合、新しいバージョンがインストールされると、既にインストールされているパッケージは削除されます。唯一の例外は元のインストールの構成ファイルで、拡張子が.rpmsaveになって保存されます。

-Uオプションを使用し、かつパッケージがまだインストールされていない場合は、単純にインストールされエラーはありません。

-iオプションはアップグレード用として設計されていません。古いRPMパッケージの上に新しいRPMパッケージをインストールしようとすると、既存のシステム ファイルを上書きしようとして、エラー メッセージを表示して失敗します。

ただし、パッケージの各バージョンに同じファイルが含まれていない場合、同じパッケージの異なるバージョンがインストールされる場合があります。カーネル パッケージとライブラリ パッケージは、代替アーキテクチャから複数回インストールされる唯一のパッケージです。

rpm -Uでダウングレードする（つまり、現在のバージョンを以前のバージョンに置き換える）場合は、コマンド ラインに--oldpackageオプションを追加する必要があります。


パッケージの更新（Freshen）
以下のコマンドを実行します。

$ sudo rpm -Fvh *.rpm

これは、現在のディレクトリにあるすべてのパッケージを更新しようとします。詳細は次のとおりです。

古いバージョンのパッケージがインストールされている場合、ディレクトリ内の新しいバージョンにアップグレードします。
システム上のバージョンがディレクトリ内のバージョンと同じ場合、何も行いません。
パッケージのバージョンがインストールされていない場合、ディレクトリ内のパッケージは無視されます。 

-Fオプションは、いくつかの新しいパッチをダウンロードして、すでにインストールされているパッケージをアップグレードし、新しいパッケージはインストールしない、という場合に便利です。

更新（-F）は、多数のパッチ（すなわちアップグレードされたパッケージ）を一度に適用するのに便利です。


Linuxカーネルのアップグレード
システムに新しいカーネルをインストールした場合、それを有効にするためには再起動（数少ないアップデートの1つ）が必要です。カーネルのアップグレード（-U）を実行しないでください。アップグレードを行うと、現在実行中の古いカーネルが削除されます。

これ自体はシステムを停止しませんが、再起動後に問題が発生した場合、システムから削除されているため、古いカーネルを再起動できなくなります。ただし、インストール（-i）すると両方のカーネルが共存し、どちらかを起動することを選択できます。つまり、必要に応じて古いものに戻すことができます。

Red Hatベースのシステムに新しいカーネルをインストールするには、次のようにします。

$ sudo rpm -ivh kernel-{version}.{arch}.rpm

ここでは、正しいバージョンとアーキテクチャ名を入力します。

これを行うと、GRUB構成ファイルが自動的に更新され、新しいバージョンが含まれます。他のことを行うためにシステムを再構成しない限り、ブート時のデフォルトの選択になります。

新しいカーネル バージョンをテストしたら、必要に応じて古いバージョンを削除できますが、これは必須ではありません。スペースが不足していない限り、1つ以上の古いカーネルを使用可能にしておくことをお勧めします。


dump2fsの使用
RPMパッケージ ファイルをcpioアーカイブに変換するには、rpm2cpioコマンドを使用します。さらに、このコマンドはRPMパッケージ ファイルからファイルを取り出すことができます。すべてのファイルは、現在のディレクトリを基準にして取り出されることに注意してください。したがって、ユーザーが/home/bobディレクトリにいてbin/bashファイルを展開した場合、それは/home/bob/bin/bashに保存されます。

以下を実行して、RPMパッケージ ファイルをcpioアーカイブに変換します。

$ rpm2cpio foobar.rpm > foobar.cpio

RPMパッケージ ファイル内のファイルを一覧表示する場合：

$ rpm2cpio bash-XXXX.rpm | cpio -t

もっと良い方法として以下があります。

$ rpm -qlp bash-XXXX.rpm

RPMパッケージ ファイルから１つ以上のファイルをシステムに展開する場合：

$ rpm2cpio bash-XXXX.rpm | cpio -ivd bin/bash

$ rpm2cpio logrotate-XXXX.rpm | cpio --extract --make-directories


演習の要件
次の演習を実行するためには、RHEL、CentOS、Fedora、SUSE、openSUSEなどのRPMベースのシステムにアクセスできることが必要です。


演習

課題 6.1:RPMを使う

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 6.1: Using RPM

Here we will just do a number of simple operations for querying and verifyingrpmpackages.This lab will work equally well onRed HatandSUSE-based systems.

1.  Find out what package the file/etc/logrotate.confbelongs to.
2.  List information about the package including all the files it contains.
3.  Verify the package installation.
4.  Try to remove the package.

Solution 6.1

1.$ rpm -qf /etc/logrotate.conf
logrotate-3.14.0-3.el8.x86_64
2.$ rpm -qil logrotate
...
Note a fancier form that combines these two steps would be:
$ rpm -qil $(rpm -qf /etc/logrotate.conf)
3.$ rpm -V logrotate..?......    /etc/cron.daily/logrotate
S.5....T.  c /etc/logrotate.conf

On RedHat
4.  OnRHEL 8:
$ sudo rpm -e logrotate
error: Failed dependencies:
logrotate is needed by (installed) vsftpd-3.0.3-28.el8.x86_64
logrotate >= 3.5.2 is needed by (installed) rsyslog-8.37.0-13.el8.x86_64

On openSUSE
OnOpenSUSE-Leap 15.1:
$ sudo  rpm -e logrotate
error: Failed dependencies:
logrotate is needed by (installed) xdm-1.1.11-lp151.13.2.x86_64
logrotate is needed by (installed) wpa_supplicant-2.6-lp151.4.4.x86_64
logrotate is needed by (installed) chrony-3.2-lp151.8.6.x86_64
logrotate is needed by (installed) net-snmp-5.7.3-lp151.7.5.x86_64
logrotate is needed by (installed) syslog-service-2.0-lp151.3.3.noarch
logrotate is needed by (installed) vsftpd-3.0.3-lp151.6.3.x86_64
logrotate is needed by (installed) libvirt-daemon-5.1.0-lp151.7.6.1.x86_64
logrotate is needed by (installed) iscsiuio-0.7.8.2-lp151.13.6.1.x86_64logrotate is needed by (installed) mcelog-1.60-lp151.2.3.1.x86_64

Note that the exact package dependency tree depends on both the distribution and choice of installed software.


課題 6.2:RPMデータベースの再構築

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 6.2: Rebuilding the RPM Database
There are conditions under which the RPM database stored in/var/lib/rpmcan be corrupted.   In this exercise we will construct a new one and verify its integrity.
This lab will work equally well on Red Hat and SUSE-based systems.
1.  Backup the contents of/var/lib/rpmas the rebuild process will overwrite the contents.  If you neglect to do this and something goes wrong you are in serious trouble.
2.  Rebuild the data base.
3.  Compare the new contents of the directory with the backed up contents; don’t examine the actual file contents as theyare binary data, but note the number and names of the files.
4.  Get a listing of allrpmson the system. You may want to compare this list with one generated before you actually do therebuild procedure. If the query command worked, your new database files should be fine.
5.  Compare again the two directory contents. Do they have the same files now?
6.  You could delete the backup (probably about 100 MB in size) but you may want to keep it around for a while to make sure your system is behaving properly before trashing it.

Solution 6.2
1.$ cd /var/lib$ sudo cp -a rpm rpm_BACKUP
2.$ sudo rpm --rebuilddb
3.$ ls -l rpm rpm_BACKUP
4.$ rpm -qa | tee /tmp/rpm-qa.output
5.$ ls -l rpm rpm_BACKUP
6.  Probably you should not do this until you are sure the system is fine!
$ sudo rm -rf rpm_BACKUP


知識チェック

「第6章 - RPM」を完遂しました。おめでとうございます。このクイズに答えて、これまでに学んだ概念の理解度をチェックしてください。

クイズ開始

問題 6.1
次の説明のうち、正しいものはどれですか。

A. yumは、主にローカル パッケージとやり取りする低レベル ツールです。
B. rpmは、リモート サーバー上のパッケージを含む、利用可能なすべてのパッケージを認識する高レベル ツールです。
C. rpm -qaは、システムにインストールされているすべてのパッケージをリストします。

問題 6.2
バイナリ/bin/lsが悪意のあるソフトウェアを含むように変更されたかどうかはわかりません。/bin/lsの整合性を確認するには、どのrpmコマンドを使用しますか？

注：/bin/lsは、coreutilsパッケージによって提供されます。

A. rpm -ivh coreutils
B. rpm -qp coreutils
C. rpm -V coreutils


