23.2. RPM の主な変更点
Red Hat Enterprise Linux 9 には RPM バージョン 4.16 が同梱されています。
ポスト量子 RPM 検証が利用可能です
新たな暗号化の脅威からインフラストラクチャーを保護するため、RHEL 9.7 では耐量子計算機暗号 (PQC) を使用して RPM パッケージを検証する機能が導入されました。マルチシグ DNF プラグインを使用すると 、ポスト量子 RPM 署名検証を有効に できます。
RPM パッケージが有効とみなされるためには、そのすべての署名が検証に合格する必要があります。ポスト量子署名を使用して RHEL RPM パッケージを検証する 場合、RHEL 署名の検証に必要なすべての OpenPGP 証明書がシステムによって信頼されていることを確認する必要があります。これは、ソフトウェアサプライチェーンの完全性と信頼性を維持するのに役立ちます。
新機能
RHEL 9 では、RPM は以前のバージョンに比べて複数の新しい SPEC 機能と機能強化を導入しており、特に注目すべき点は以下のとおりです。
高速なマクロベースの依存関係ジェネレータ
依存関係ジェネレーターを通常の RPM マクロとして定義できるようになりました。これは、組み込みの Lua インタープリター (
%{lua:…}) と組み合わせて使用すると特に便利です。これにより、洗練された高速なジェネレーターを作成し、冗長なフォークを回避してシェルスクリプトを実行できます。以下に例を示します。
%__foo_provides() %{basename:%{1}}動的ビルド依存関係の生成を可能にする
%generate_buildrequiresセクション追加のビルド依存関係は、RPM のビルド時に、新しく利用可能になった
%generate_buildrequiresを使用してプログラムで生成できるようになりました。これは、特殊なユーティリティーが、Rust、Golang、Node.js、Ruby、Python、Haskell などのランタイム依存関係またはビルド時依存関係を判断するために、一般的に使用される言語で記述されたソフトウェアをパッケージ化する場合に役立ちます。メタ (順不同) な依存関係
metaと呼ばれる新しい依存関係修飾子により、特にインストール時依存関係またはランタイム依存関係ではない依存関係を表現できます。これは、メタパッケージの依存関係を指定する場合など、通常の依存関係の順序付けにより発生する可能性のある不要な依存関係ループを回避するのに役立ちます。以下に例を示します。
Requires(meta): <pkgname>式でのネイティブなバージョン比較
新しく対応した
v"…"形式を使用することで、式内の任意のバージョン文字列を比較できるようになりました。以下に例を示します。
%if v"%{python_version}" < v"3.9"チルダとは異なるカレットバージョンの演算子
新しいキャレット (
^) 演算子を使用すると、ベースバージョンよりも高いバージョンを表すことができます。これは、逆の意味を持つ既存のチルダ (~) 演算子を補完するものです。-
%elif、%elifos、および%elifarchステートメント オプションの自動パッチとソースのナンバリング
番号のない
Patch:タグおよびSource:タグは、リスト表示されている順序に基づいて自動的に番号が付けられるようになりました。%autopatchがパッチの範囲を受け入れる%autopatchマクロで、適用する最小パッチ番号と最大パッチ番号をそれぞれ制限する-mパラメーターと-Mパラメーターが使用できるようになりました。%patchlistおよび%sourcelistセクション新しく追加した
%patchlistセクションおよび%sourcelistセクションを使用して、各項目の前に各Patch: タグおよびSource:タグを付けずに、パッチファイルおよびソースファイルのリストを表示できるようになりました。より直感的なビルド条件の宣言方法
RHEL 9.2 以降では、新しい
%bcondマクロをビルド条件に使用できます。%bcondマクロは、ビルド条件名とデフォルト値を引数として受け取ります。古い%bcond_withおよび%bcond_withoutマクロと比較して、%bcondは理解しやすく、ビルド時にデフォルト値を計算できます。デフォルト値には任意の数値式を指定できます。以下に例を示します。
gnutlsビルド条件 (デフォルトで有効) を作成するには、次のように指定します。%bcond gnutls 1bootstrapビルド条件 (デフォルトで無効) を作成するには、次のように指定します。%bcond bootstrap 0opensslビルド条件 (デフォルトでgnutlsの反対) を作成するには、次のように指定します。%bcond openssl %{without gnutls}
%patch Nがパッチ番号 0 を適用しなくなる以前は、
%patch N構文(Nはパッチ数)を使用すると、構文はNで指定されたパッチに加えて、パッチ番号 0 (Patch0)も適用していました。RHEL 9.6 では、
%patch N構文が修正され、パッチ番号Nのみが適用されるようになりました。重要パッチ番号を指定せずに
%patchディレクティブを使用すると、%patch 0の省略形としてPatch0が適用されます。ただし、明示的な構文(例:%patch 0または%patch -P 0)を使用して、ゼロのパッチを適用するという警告が表示されます。
SQLite ベースの RPM データベース
RPM データベースは sqlite ライブラリーに基づいています。BerkeleyDB データベースに対する読み取り専用のサポートは、移行および照会の目的で保持されています。
新しい rpm-plugin-audit プラグイン
今回のアップデートにより、以前は RPM 自体に組み込まれていたトランザクションの監査ログイベントを発行するための新しい rpm-plugin-audit プラグインを使用できるようになります。
パッケージビルドの並列性向上
パッケージビルドプロセスの並列化には改善が数多く行われています。この改善には、さまざまな buildroot ポリシースクリプトと、サニティーチェック、ファイル分類、サブパッケージの作成と順序付けが含まれます。その結果、パッケージは、特に大規模なパッケージ向けに、マルチプロセッサーシステムをベースに構築されるようになり、高速化と効率化が図られるようになりました。
ビルド時のヘッダーデータの UTF-8 検証の強制
今回のアップデートにより、ヘッダーデータの UTF-8 検証がビルド時に強制的に適用されるようになりました。
RPM は Zstandard (zstd) 圧縮アルゴリズムをサポートしています。
RHEL 9 では、デフォルトの RPM 圧縮アルゴリズムが Zstandard (zstd) に切り替わりました。その結果、パッケージのインストール時間が短縮されました。特に大規模なトランザクションなどで顕著になる可能性が高いです。
RPM がインストール中に元のパッケージのチェックサムを記録します
RHEL 9.7 以降、RPM はインストール時に .rpm パッケージ全体の SHA256 および SHA512 ダイジェストを記録します。そのため、ユーザーは、RPM データベースからこれらのダイジェストを取得し、インストールされたパッケージが特定の .rpm ファイルに対応していることを確認できます。その結果、インストールされたパッケージセットが、DNF リポジトリーで使用可能なパッケージなど、既知の .rpm パッケージセットとビット単位で一致することを遡及的に検証することで、RHEL システムの整合性を向上させることができます。インストールされたパッケージのパッケージダイジェストを出力するには、次のコマンドを使用します。
$ rpm -q --qf "[%{packagedigestalgos:hashalgo} %{packagedigests}\n]" <package-name>
新しい %_pkgverify_digests マクロを設定することで、データベースに記録されるダイジェストタイプをカスタマイズすることもできます。次に例を示します。
%_pkgverify_digests 8:10
RPM が spec ファイルローカルなファイル属性と依存関係ジェネレーターをサポートするようになりました
ファイル属性とその依存関係ジェネレーターは、通常、別々のパッケージに同梱されるため、これらの属性を使用するパッケージをビルドする前にインストールする必要があります。しかし、場合によっては、ファイル属性を同梱するパッケージのビルド中にこの属性を有効にする必要があります。また、パッケージをビルドするためだけにファイル属性が必要で、属性をパッケージに同梱せずに済ませたいという場合もあります。
RHEL 9.7 以降では、以下の手順を実行することで、spec -local ファイル属性とジェネレーターを登録できます。
-
%_local_file_attrsマクロを定義します。%_local_file_attrsは、specファイルに直接登録する新しい属性名のコロン区切りリストを受け入れます。 -
各属性に対して、
%__NAME_providesや%__NAME_pathなどの 1 つ以上の依存関係ジェネレーターマクロを定義します。NAMEはローカルファイル属性の名前です。
これにより、RPM が、spec ファイルのビルド時に、依存関係の生成にファイル属性を使用するようになります。その結果、必ずしもインストール用ではないビルド時のファイル属性を作成することが可能になります。
たとえば、次の spec ファイルスニペットは、パッケージのソースにバンドルされている foobar.sh スクリプトを使用して、パッケージ化される各ファイルの provides を生成します。
Source1: foobar.sh
[...]
%define _local_file_attrs foobar
%define foobar_provides %{SOURCE1} %define foobar_path .*