logo header
logo header
logo header
logo header
  • 2016.09.16
  • インフラ技術ブログ

RPMパッケージを作ってみよう③パッケージ作成環境構築

rpm logo

札幌は先週から急激に温度が下がりましたが、まだクローゼットに半袖しか入ってなくて衣替えが間に合っておらず、風邪をひいてしまったkirksenchoです、こんにちは。

さて、連載3回目の「RPMパッケージを作ってみよう」シリーズ。前回は様々なYUMリポジトリの紹介と利用方法について書いてみました。

▼前回の記事

RPMパッケージを作ってみよう②YUMリポジトリいろいろ

今回から、RPMパッケージを作成する為の環境構築に入っていきたいと思います。

ビルドを実行するOS環境

OSは今回CentOS7.2を使用しますが、CentOS6系でも基本は変わらないと思います。
OSインストール時には、開発向けのオプションを選択すると良いでしょう。
もし最小インストールにしていた場合は、以下のようなコマンドで開発用パッケージを一括インストールできます。

ビルドする為に必要なパッケージ

RPMのビルドにはrpmbuildコマンドを使用しますが、コマンドが使えない場合は以下のコマンドでパッケージをインストールすると使用できるようになります。

カスタムカーネルのリビルド等をしたい場合は、以下のコマンドでパッケージを追加する必要があります。

ビルド用ユーザの作成

ビルドは基本的にroot以外のユーザで実行します。
rpm公式サイトの説明では、root権限で実行した時の危険性を回避する為に、絶対にroot以外でやるように書かれていました。

ビルド用ディレクトリ等の作成

以下のコマンドでビルドに必要な.rpmmacrosファイルと、各ディレクトリが、ホームディレクトリの下に作成されます。

各ディレクトリの用途

BUILD
ビルド中の一時ファイルが展開されるディレクトリです。

RPMS
ビルドが完了したら、ここにRPMファイルが出力されます。

SOURCES
ビルドに必要なソースファイルやパッチファイル等を格納しておくディレクトリです。

SPECS
ビルドに必要なSPECファイルを格納しておくディレクトリです。

SRPMS
srpmファイルもビルドした場合は、ここに出力されます。

上記の他に、ビルドを実行すると「BUILDROOT」というディレクトリが出来上がりますが、これは完成したパッケージをインストールした時に展開されるファイルが、ルートからの階層そのままで再現される場所になります。
なので、どのディレクトリに何がインストールされるのかが、このディレクトリの中を見ていくと分かります。

ビルドの方法について

RPMパッケージをビルドする場合、大きく3つの方法に分かれます。

TARボールからビルドする場合

httpd等の既存のソースからビルドする場合、SPECファイルを含んだTARボールを公式などから入手して引数にしてRPMパッケージをビルドする事ができます。

httpdの場合のTARボール入手元
https://httpd.apache.org/download.cgi#apache24

コマンド実行例

上記のTARボールにSPECが含まれていて処理が進むと、まず依存関係のチェックが動きます。
YUM等では自動で依存関係を解決してくれますが、rpmbuildの場合は人間が解決する必要があります。
筆者のCentOS7.2環境では、以下が足りなかったようでエラーとなりました。

足りないと言われたパッケージは全て事前にインストールしておく必要があります。

ところが困った事に、distcacheはCentOS標準リポジトリに存在せず、以下のエラーとなりました。

更にdistcacheはremiもiusも扱っておらず、既にどこのリポジトリにも存在していないようです。
そこで過去のfedoraのSRPMを取ってきて、自分でRPMをビルドしてインストールするという手段しか無さそうです。

上記を実行して、うまくいくと以下が出力されます。

はい、できました、これで依存関係が解消できそうです。

これで漸くTARボールからのhttpdのRPMビルドが動く環境ができましたが、実行してみると再び問題が2つも発生しました。

前者のエラーはAPRパッケージの問題です。CentOS標準リポジトリからAPRをインストールしたのですが、標準ではeventのMPMのモジュールが作成できないので、ファイルが見つからずエラーとなるようです。
これを回避するにはAPRのソースを公式から入手してRPMパッケージをビルドしてインストールする必要があります。

後者のエラーは以下のメーリングリストを見ると、次のリリースバージョンから修正されるようです。

http://www.gossamer-threads.com/lists/apache/users/460486

そのため、現在はまだ解消できませんが、本ブログはhttpdのソースからビルドを通す事が目的では無いので、これ以上の追求はしないでおこうと思います。

SRPMからビルドする場合

ソースのTARボールにSPECファイルが含まれていない場合は、SRPMをディストリビューションなどから入手して引数にしてRPMパッケージをビルドする事ができます。

コマンド実行例

ソースの時と同様に依存関係のチェックが走りますが、上記のソースからのビルドで出た依存パッケージをインストール済の場合は以下が不足しました。

同様に不足パッケージは全て手動でインストールが必要です。

これで依存関係が解消できたので、SRPMからのRPMビルドが実行できるようになりました。

SRPMの場合はオブジェクトが無いというエラーは出ませんでした。
既に完成されているRPMパッケージの元となるCentOS7.2用の公式なSRPMパッケージなので、最後に.soが足りないという問題は発生しないようです。

SPECファイルを自作してビルドする場合

既存のソースもSRPMも無く、全く新規でオリジナルRPMパッケージを作る場合は、SPECファイルはもとより全部自作する必要があります。
SPECファイルが作成済みの場合は、以下の様なコマンドでビルドできます。

コマンド実行例

SPECファイルの自作には様々な知識が必要になり、あまり実施してる方も少ないので、解説しているサイトも少ないですが、次回は自分でSPECファイルを書いて簡単なファイルインストールを実施するパッケージの作り方を解説していきたいと思います。

ともに世界をアップグレードできる、そんな日を夢見て。
Upgrade the World!