いまさら聞けないrpmbuildことはじめ
CentOSなどrpmを使っているシステムで、欲しいツールのrpmが見つからない、使いたいツールのバージョンが古いときに、rpmbuildを使って望みのrpmを作成することが出来ます。
ウェブを探せば色々と情報はあるんですが、ざっとスタートするときに必要な流れをまとめて書いてみることにしました。
専用のビルド環境
専用の環境を準備た方が吉です。centXbuildXXみたいな名前でVMを作ってます。
- cent4build32.tnmt.local
- cent5build64.tnmt.local
とか。
パッケージの依存性もあるので、あまりサードパーティのyumリポジトリなどを追加しないか、実環境と同じリポジトリのみ有効にするとよいです。複数サービスがあったらそれごとにVMを作るのもありかと思います。
必要なパッケージ類のインストール
rpmbulidに必要なパッケージ類をインストールします。パッケージ名はハイフンつきに注意。
sudo yum install rpm-build
あとビルド専用の環境なんで、その他もろもろのライブラリやツールも一緒に入れておくと、ビルド時に足りないというシーンも少なくなるのでgroup installしておくと吉です。
sudo yum groupinstall "Development Tools"
専用のビルドユーザ
OfficialのHOW TOにもこう載ってます。
Building RPMs should NEVER be done with the root user. It should ALWAYS be done with an unprivileged user. Building RPMs as root might damage your system. You have been warned.
「rpmビルドはrootでやっちゃだめだぞ、システムにダメージ与える可能性あるからやるなよ、絶対やるなよ!」と書いてありますので、フリじゃなくてきちんとそれにしたがいましょう。
ユーザ作成
自分のアカウントでもいいですが、俺はrpmbuilderなユーザを作ってます。
sudo useradd rpmbuilder
ユーザの環境設定
作成したrpmbuilderにsu -して環境を設定します。必要なのはビルドに使用するディレクトリと、rpmbuildをコントロールする.rpmmacrosです。
ディレクトリ
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
内訳は
- BUILD: ビルド時に使われる一時ディレクトリ
- RPMS: ビルドされたrpmが格納されるディレクトリ、各アーキテクチャごとのサブフォルダに分かれる
- SOURCES: ビルドのもとになるソースやパッチを配置するディレクトリ
- SPECS: specファイルを配置するディレクトリ
- SRPMS: ビルドした際にsrc.rpmが出来るようにしていればそれが格納されるディレクトリ
.rpmmacros
rpmbuild時に参照される設定一覧です。さきほど作成したrpmbuild以下を使用するために、以下で新規作成を行います。
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
俺はあとdebugパッケージを作らないような設定とsmpの設定を入れてます。smpのj3はmakeの引数になる感じなので適宜自分の環境に合わせてですね。
%_topdir %(echo $HOME)/rpmbuild
%debug_package %{nil}
%_smp_mflags -j3
以上2つの作業はepelリポジトリにあるrpmdevtoolsの中のrpmdev-setuptreeで簡単に設定可能です。
参考: rpmdevtools | Carpe Diem
あとはビルド
よくやる2通りを書いておきます。
src.rpmをそのままビルド
バイナリが提供されていないパッケージが欲しかったり、少しバージョンが古かったりな時に使えます。
お目当てのsrc.rpmをダウンロードします。
cd ~/rpmbuild/SRPMS/
wget http://foo.var.com/foovar-1.0.src.rpm
rpmbuildします。src.rpm直接指定の時は --build オプションです。
rpmbuild --rebulid foovar-1.0.src.rpm
ひと手間加えてビルド
既存のパッケージにパッチをあてたり、configureオプションをいじったりするときに使う方法。yum-utilsパッケージ内のyumdownloaderが便利なので合わせて紹介します。入ってない場合は
sudo yum install yum-utils
ソースパッケージ取得
cd ~/rpmbuild/SRPMS/
yumdownloader --source foovar
src.rpmインストール
rpm -ivh foovar-1.0.src.rpm
これで ~/rpmbuild/SOURCES/ 以下にソース、パッチ類と、 ~/rpmbuild/SPECS/ 以下にrpm作成のもととなる パッケージ名.spec (今回はfoovar.spec) が配置されます。
このfoovar.specに色々と変更を加えます。
パッチあてる場合
- ~/rpmbuild/SOURCES/ 以下にあてたいパッチを作成する。例: buzz.patch
- ~/rpmbuild/SPECS/foovar.specのpatchセクションに buzz.patch を当てる設定を書く
- PatchXXでかぶらないナンバリングで PatchXX: buzz.patch 追記
- 同じナンバリングで%patchXX -p1 -b .foovar (foovarはバックアップ識別名で任意)
configureオプション変える場合
- ~/rpmbuild/SOURCES/foovar.spec のconfigureオプションを変更
こんな風にして修正したspecファイルをビルドします。修正を加えたspecファイルを含むsrc.rpmも同時に作成する -ba オプションで指定します。
rpmbuild -ba ~/rpmbuild/SPECS/foovar.spec
この後は
ビルドしたファイルは ~/rpmbuild/RPMS/i386/ や ~/rpmbuild/RPMS/x86_64/ などビルドしたマシンのアーキテクチャごとに配置されます。これらを独自yumリポジトリを作成して登録しておくと、各サーバーへのインストールも楽ちんです。
独自yumリポジトリ作成については、以下のエントリが参考になります。
RE: 独自/ミラー yum リポジトリを作ろう | Carpe Diem
Cobbler便利です。
まとめ
rpmbuildの始め方についてのざっとの流れでした。オレオレパッケージはあまり作らないに越したことはないですが、ソースインストールよりも管理のミスも減りますし、バージョン管理や展開が早く行えるメリットもあるので、今後も色々とやり方の効率化は探っていきたいと思います。