わからないなりに理解したい RPM

★★★ お知らせ ★★★

◆ エンジニア業務環境アンケート結果 ◆
エンジニアが自分の働き方にどういったことで満足していて、不満を感じているのか、働きたい会社像として何を求めているのか、業務環境調査を実施しました。ぜひご覧ください。
アンケート結果はこちらから

こんにちは。サイオステクノロジー OSS サポート担当 山本 です。

今回は RPM (RPM Package Manager) について、見ていきたいと思います。

■そもそもこれは何をするもの?

RPM はパッケージ管理システムと呼ばれるツールの一種です。
パッケージ管理システムの役割をざっくりと言うならば…

ソフトウェア等の管理やインストールなどをなんかいい感じにやってくれるやつ

です。
Linux の各 OS には、OS のインストール時に同時にインストールされる基礎的なソフトウェア・ライブラリのインストール・管理などもこのパッケージ管理システムで行われているものもあり、
そういった理由からかパッケージ管理システムは基礎的なソフトウェアの一つとしてデフォルトでインストールされている場合があります。
今回扱う RPM は主に RedHat 系の OS で使用されるもので、RedHat 系の OS には基本的にデフォルトでインストールされているハズです。
他に著名なパッケージ管理システムとしては、Debian 系 OS の dpkg などがあります。

パッケージ管理システムでは、ソフトウェア等を “パッケージ” という単位でインストール・管理などを行います。
また、RPM では後に確認したり後述の “依存性” の処理などを行うために、インストールしたパッケージの情報を保存する内部的なデータベースを持っています。

■パッケージ・パッケージファイルについて

パッケージは、パッケージ管理システムで管理されるソフトウェア等のことを指します。
パッケージには例えば RPM で言えば…

 ・ソフトウェア (postfix や httpd など)
 ・他のソフトウェアなどから使用されるライブラリ (glibc など)
 ・OS の標準機能っぽく見えるもの (vim や chrony など)
 ・OS 全体の動作の根幹を担うような機能など (kernel やファイルシステム関連など)

…などなど、多岐に渡る様々なものがあります。

パッケージのインストールや更新にはパッケージファイルと呼ばれる圧縮ファイルが必要になります。
原則として、1つのパッケージのインストール・更新には 1つのパッケージファイルが必要になります。
(RPM のパッケージファイルは “.rpm” という拡張子のファイルです。)

この “パッケージファイル” の中には一般的に、ソフトウェアに必要な各種ファイル (あるいはソースコードなど) や、そのソフトウェアを使うのにいい感じの状況 (ディレクトリの作成やパスの設定、ユーザ設定など) にしてくれるスクリプトやそのパッケージ自体の情報 (ファイルの配置先やバージョン情報など) などが含まれており、
パッケージ管理システムはこれらの情報を使ってパッケージをいい感じにインストールしてくれます。

■RPM の基本的な使い方

ここからは、RPM の使用方法の一部を見ていきたいと思います。

今回の例では RedHat Enterprise Linux 9 を使用しますが、先述のとおりこちらは OS インストール時にデフォルトで RPM が使用可能な状態になっているはずです。
RPM を使用する他の Linux のディストリビューションでも、基本的にはデフォルトで RPM が使用可能なハズです。

■パッケージのインストール:rpm -i

パッケージのインストールはパッケージ管理システムの最も重要な役割の一つと言えますが、
RPM にはより手軽に RPM でのパッケージのインストール処理をしてくれるツールがあるため、わざわざ RPM を直接使用してパッケージをインストールすることは稀であると思われます。
そのユーティリティツールについてはまた今度お話しする予定です。

今回は RPM を直接使用してインストールする場合の手順を見ておきたいと思います。
RPM でパッケージをインストール・アップデートする際のコマンドは以下のような形です。

$ sudo rpm -i <パッケージファイル>
 (進捗状況を可視化したい場合は以下)
$ sudo rpm -ivh <パッケージファイル>

パッケージのインストールには、先述のとおりパッケージファイルが必要になります。
このため、何らかの方法でパッケージファイルを確保する必要がありますが、今回の例では以下のコマンドで telnet パッケージファイルを入手してみます。

$ sudo dnf download telnet

上記コマンドを実行すると、カレントディレクトリにパッケージファイルが保存されているはずなので、あとはインストールを実行すれば OK です。
パッケージファイル名にはバージョン番号などの情報が付加されているため、実際に試す際には保存されたパッケージファイル名で試してください。

$ sudo rpm -ivh telnet-0.17-85.el9.x86_64.rpm
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:telnet-1:0.17-85.el9             ################################# [100%]
$
■パッケージの依存性について
error: Failed dependencies:
 :

RPM でパッケージのインストールをしようとした際に、このようなメッセージが表示されてインストールに失敗することがあります。
これはそのパッケージが別のパッケージの機能を必要としている場合に発生するもので、
この「別のパッケージを必要とする」というパッケージの設定は依存性と呼ばれています。

依存性によってパッケージのインストールが失敗した場合、メッセージに出てくる機能を提供する別パッケージをインストールした後に再度インストールを行なえば、無事インストールできるはずです。
(これは「依存性を解決する」などと呼ばれたりします。)

例えば、今回の例の環境で postfix パッケージをインストールしようとすると以下のようなメッセージが表示されました。

$ sudo rpm -ivh postfix-3.5.9-19.el9.x86_64.rpm
error: Failed dependencies:
        libicuuc.so.67()(64bit) is needed by postfix-2:3.5.9-19.el9.x86_64
$

この依存性を解決するには、”libicu” というパッケージが必要になります。

…が、見てのとおりメッセージから依存性の解決に必要となるパッケージ名がわからないことが少なくない上、「依存性の解決のために必要なパッケージ」の依存性の解決が必要になる場合もあるなど、自力で依存性を解決していくのはかなり面倒で厳しいものがあります。
これが先述の「RPM を直接使用してパッケージをインストールすることは稀」という話の大きな原因の一つと言えるでしょう。

ただし、この依存性はインストールしたパッケージが正常に動作できるようにするために必要なもの、パッケージがうまく動作しない状況を事前に防いでくれるものであり、無視してはならない重要な要素です。

■パッケージをインストールする際の注意点

先述のとおり、パッケージのインストールの際にはそのパッケージファイルに含まれるスクリプトが実行されます
そのため、万が一そのパッケージファイルに悪意あるスクリプトが含まれていた場合、システムに何らかの悪影響を及ぼす可能性が考えられます。

他方、パッケージファイルは通常インターネットなどを介して外部から入手することが多いはずです。

(パッケージファイルに限った話ではありませんが) 外部から入手したファイルについては、発行元の信頼性などに充分に注意するようにしてください。

■パッケージの情報を確認する:rpm -q

RPM では、インストール済みのパッケージやパッケージファイルに関する様々な情報を参照することができます。
パッケージの情報確認は、基本的には以下のコマンドに参照したい情報に応じたオプションを追加して実行します。

$ rpm -q

これで得られる情報は、パッケージファイルやインストール済みパッケージの情報を保持している RPM の内部データベースから取得されるものです。

■インストール済みパッケージの一覧:rpm -qa
$ rpm -qa

このコマンドにより、インストール済みパッケージの一覧を表示させることができます。

$ rpm -qa
libgcc-11.2.1-9.4.el9.x86_64
crypto-policies-20220223-1.git5203b41.el9_0.1.noarch
tzdata-2022a-1.el9_0.noarch
 :

パッケージ名を指定することで、指定したパッケージのみを表示させることもできます。

$ rpm -qa telnet
telnet-0.17-85.el9.x86_64
$

または、パッケージの “タグ” を元に絞り込みを行うこともできます。
(以下は名前が “gpg” で始まるパッケージの一覧を取得する例)

$ rpm -qa name="gpg*"
gpgme-1.15.1-6.el9.x86_64
gpg-pubkey-fd431d51-4ae0493b
gpg-pubkey-5a6340b3-6229229e
gpg-pubkey-f21541eb-4a5233e7
$
■パッケージの情報:rpm -qi
$ rpm -qi <パッケージ>
 または
$ rpm -qpi <パッケージファイル>

このコマンドにより、パッケージに関する情報を表示することができます。

$ rpm -qi telnet
Name        : telnet
Epoch       : 1
Version     : 0.17
Release     : 85.el9
Architecture: x86_64
Install Date: Wed 18 Jan 2023 06:27:40 AM UTC
Group       : Unspecified
Size        : 123930
License     : BSD
Signature   : RSA/SHA256, Sat 27 Nov 2021 08:12:16 PM UTC, Key ID 199e2f91fd431d51
Source RPM  : telnet-0.17-85.el9.src.rpm
 :
■パッケージの実行するスクリプト:rpm -q –scripts
$ rpm -q --scripts <パッケージ>
 または
$ rpm -qp --scripts <パッケージファイル>

このコマンドにより、パッケージのインストールの際に実行されるスクリプトを確認できます。

$ rpm -qp --scripts postfix-3.5.9-19.el9.x86_64.rpm
preinstall scriptlet (using /bin/sh):
# Add user and groups if necessary
/usr/sbin/groupadd -g 90 -r postdrop 2>/dev/null
/usr/sbin/groupadd -g 89 -r postfix 2>/dev/null
/usr/sbin/groupadd -g 12 -r mail 2>/dev/null
/usr/sbin/useradd -d /var/spool/postfix -s /sbin/nologin -g postfix -G mail -M -r -u 89 postfix 2>/dev/null
 :
■パッケージの更新履歴:rpm -q –changes
$ rpm -q --changes <パッケージ>
 または
$ rpm -qp --changes <パッケージファイル>

このコマンドにより、パッケージのバージョンアップ情報を表示することができます。

[ec2-user@ip-172-31-8-243 ~]$ rpm -q --changes telnet
 :
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
  Related: rhbz#1991688
 :
■パッケージの作成するファイル一覧:rpm -ql
$ rpm -ql <パッケージ>
 または
$ rpm -qpl <パッケージファイル>

このコマンドにより、そのパッケージが作成したファイルの一覧を確認できます。

$ rpm -ql telnet
/usr/bin/telnet
/usr/lib/.build-id
/usr/lib/.build-id/20
/usr/lib/.build-id/20/3d743c776ded75f2322056165a32bb52b74de9
/usr/share/doc/telnet
/usr/share/doc/telnet/README
 :
■ファイルがどのパッケージのものか調べる:rpm -qf
$ rpm -qf <ファイル/ディレクトリ>

このコマンドでは、”指定したファイル/ディレクトリ” が “あるパッケージの作成するファイル/ディレクトリ” と一致していた場合、そのパッケージが表示されます。

$ rpm -qf /usr/bin/telnet
telnet-0.17-85.el9.x86_64
$
■インストール後に変更されたファイル一覧:rpm -qV
$ rpm -qV <パッケージ>

このコマンドにより、そのパッケージが作成したファイルのうち、インストール後に何らかの変更が加えられたファイルの一覧を表示できます。
環境の移行などの際にも活用できるかと思います。

$ rpm -qV telnet
S.5....T.  d /usr/share/doc/telnet/README
$

※ 例示のために手動で “/usr/share/doc/telnet/README” に変更を加えた後に実行しています。

■最後に

今回はパッケージ管理システムの一種、RedHat 系の OS の基本機能の一つとも言える RPM について見てきました。

RedHat 系の OS を使ったことのある方なら恐らく特に意識せずとも利用しているものと思いますが、特にパッケージの情報確認ができることについては (今回紹介したもの以外にも多数あることも含めて) 頭の片隅に置いておくと、何か必要になった際や何かあった際に便利だったり解決の糸口にできたりするかもしれません。





ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!


ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる