Red Hat Training

A Red Hat training course is available for Red Hat Satellite

第3章 カスタムのパッケージを構築する

ソフトウェアパッケージを構築する際、 失敗の原因となるものがたくさんあります。特に、 Red Hat Network を介してパッケージを配信しインストールする必要がある場合に顕著になります。 本章では Red Hat Network を介して正しく配信できるパッケージの構築方法の概要を記載しています。 RPM を使用する理由、 RHN 用のパッケージの構築方法、 パッケージの正しい署名法などについて説明しています。

3.1. Red Hat Network 用のパッケージを構築する

Red Hat Network は RPM パッケージマネージャ (RPM) の技術を使用して各クライアントシステムに対し適用可能なソフトウェアの追加や更新を確認します。Red Hat Network から取り込むパッケージは通常 RPM 形式になっています。 全 ISO イメージは Red Hat Network Web サイトの ソフトウェア タブでは入手できますが、RHN Satellite Server のインストールにはありません。Satellite で Solaris のサポートを有効にしている場合は RHN Push を使用して Solaris クライアント群で使用されるカスタムチャンネルに Solaris のパッケージ群をアップロードすることができます。
RPM はソフトウェアパッケージのインストール、 アンインストール、 アップグレード、 検証などをユーザーが簡単に行うことができるツールです。 また、 ソフトウェア開発者ならこのツールを使用してエンドユーザーと開発者用にコンパイルしたプログラムのバージョンとソースコードをパッケージ化することができます。

3.1.1. RPM の利点

RPM には次のような利点があります。
簡単なアップグレード
RPM を使用すると、 新たに再インストールを行わなくてもシステムの個別コンポーネントをアップグレードすることができます。 Red Hat から Red Hat Enterprise Linux の新しいバージョンがリリースされたとき、 ユーザーはアップグレードするために再インストールを行う必要はありません。 RPM によって知的で完全自動のシステムアップグレードがその場で可能になります。 パッケージ内の設定ファイルはアップグレード後も保持されているためカスタムの設定が失われることはありません。 パッケージのインストールおよびアップグレードには同じ RPM ファイルが使用されるため、 パッケージの更新に特別なアップグレードファイルは必要ありません。
パッケージのクエリ
RPM はクエリのオプションを用意していますので、 全パッケージまたは特定のファイルの検索を RPM データベース全体に対して行うことができます。 また、 任意のファイルの所属先またはパッケージの所属先を簡単に見つけることもできます。 パッケージに含まれているファイルは圧縮されたアーカイブに入っています。 そのカスタムバイナリヘッダには役に立つパッケージの情報やその内容が含まれています。 RPM によりヘッダのクエリを素早くそして簡単に行うことができます。
システムの検証
パッケージを検証する機能も備わっています。 パッケージに関連したファイルが削除されている可能性を懸念している場合、 パッケージの検証を行いパッケージが提供するファイルの状態を確認することができます。 この検証ではすべての異常が報告されます。 エラーが存在する場合はそのファイルを簡単に再インストールすることができます。 修正した設定ファイルは再インストールしても維持されます。
純粋なソース
RPM の重要な設計目標のひとつは、 オリジナルのソフトウェア著者により配布された通りの 純粋な ソフトウェアソースを使用できるようにすることです。 RPM を使用すると、純粋なソースに使用されたパッチや構築方法に関する詳細な解説を付けてパッケージ化することができます。 これは複数の理由で重要な利点となります。 例えば、 プログラムの新しいバージョンがリリースされた場合、 コンパイルを完全に最初から始める必要はなく、 パッチを見て何が 必要そうなのか を判定することができます。 ソフトウェアを正常に構築できるようコンパイルされているデフォルト設定や変更が全てこの技術を使用すると簡単に確認することができます。
ソースを純粋に保持することは開発者以外の他人にとっては重要には見えないかもしれませんが、 純粋なソースの維持は高品質なソフトウェアにつながるためエンドユーザーにとっても重要なものとなります。

3.1.2. RHN RPM ガイドライン

RPM の長所は依存関係を定義し正確に競合を識別する能力にあります。 Red Hat Network は RPM のこうした側面に依存しています。 Red Hat Network は自動化した環境を提供することでパッケージインストール中に手動による介入が必要ないようにしています。 そのため、 Red Hat Network による配信用 RPM を構築する場合には次のルールに従うことが重要となります。
  1. RPM についてよく理解しておいてください。 パッケージを正しく構築するには RPM の重要な機能について基本的に理解しておくことが大切になります。 RPM に関する詳細については次のリソースをまずご覧ください。
  2. 子チャンネル用に RPM を構築する場合は子チャンネルのベースチャンネルと同じバージョンの Red Hat Enterprise Linux の新規インストール上でそのパッケージを構築します。 最初に Red Hat Network からのすべての更新を適用することを忘れないでください。
  3. RPM パッケージは --force または --nodeps のオプションを使わないでインストールしなければなりません。 ビルドシステムで RPM を正常にインストールできない場合は Red Hat Network はシステム上でその RPM を自動的にインストールできません。
  4. RPM パッケージのファイル名は NVR (名前、 バージョン、 リリース) 形式にしなければなりません。 また、 そのパッケージのアーキテクチャを含んでいる必要があります。 name-version-release.arch.rpm が正しい形式となります。 例えば、 有効な RPM パッケージのファイル名が pkgname-0.84-1.i386.rpm とすると、 パッケージ名は pkgname、 バージョンは 0.84、 リリースは 1、 アーキテクチャは i386 になります。
  5. RPM パッケージはパッケージのメンテナーが署名しなければなりません。 署名のないパッケージを Red Hat Network で配信することはできますが、 そのパッケージを受理するよう Red Hat Update Agent (up2date) を強制する必要があります。 パッケージに署名することを強く推奨します。 パッケージに署名する方法については 「RHN パッケージ用のデジタル署名」 に記載されています。
  6. 署名が変更されたり再コンパイルが行われたなど、 パッケージが何らかの形で変更された場合にはそのバージョンまたはリリースを増分させる必要があります。 つまり、 RHN から配信される各 RPM の NVRA (アーキテクチャを含む) は混乱を避けるため固有のビルドに対応させる必要があります。
  7. RPM はどれもそれ自身を旧態化することはありません。
  8. あるパッケージが複数のパッケージに分割された場合は依存関係に特に注意を払うようにしてください。 どうしても必要な理由がない限り、 既存のパッケージを分割しないようにしてください。
  9. インタラクティブなプレインストール、 ポストインストール、 プレアンインストール、 ポストアンインストールなどのスクリプトにパッケージを依存させることはできません。 インストール中にユーザーによる直接介入を必要とする場合は Red Hat Network で動作させることはできません。
  10. プレインストール、 ポストインストール、 プレアンインストール、 ポストアンインストールなどのいずれのスクリプトにも stderr や stdout に書き込みを絶対行わせないようにしてください。 必要なければ /dev/null にメッセージをリダイレクトします。 これ以外はファイルに書き込みを行います。
  11. spec ファイルを作成している場合は /usr/share/doc/rpm-<version>/GROUPS からのグループ定義を使用します。 完全に一致するものがない場合は二番目に適合するものを選択します。
  12. RPM の依存関係機能を使用して、 プログラムは必ず先にインストールされてから実行されるようにします。

重要

ファイルをアーカイブしてからポストインストールのスクリプトでアンアーカイブすることで RPM を作成することはしないでください。 RPM の目的が台無しになります。
アーカイブ内のファイルがファイル一覧に含まれていないと競合に関する検証や確認を行うことができません。 大半の場合、 RPM 自体が効率的にアーカイブを圧縮したり展開したりすることができます。 例えば、 %postun セクションでクリーンアップを行わない %post の中にはファイルを作成しないでください。