独自のRPMパッケージやyumリポジトリを作ってみよう 3ページ
specファイルを元にパッケージをビルドする
specファイルからパッケージをビルドするには、specファイルを引数にしてrpmbuildコマンドを実行する。
$ rpmbuild -ba <specファイル>
なお、ここで指定している「-ba」オプションは、バイナリパッケージとソースコーパッケージの両方を生成させるためのオプションだ。もしバイナリパッケージのみが必要な場合は代わりに「-bb」を、ソースパッケージだけが必要な場合は「-bs」を指定する。
また、これらの代わりに「-bp」や「-bc」、「-bi」、「-bl」オプションを指定すると、specファイル中で定義された「prep」や「build」、「install」、「check」の処理までがそれぞれ実行される。これらはパッケージ作成作業のデバッグなどに有用だ。
rpmbuildコマンドを実行すると、指定したオプションに応じてファイルの展開やビルド、バイナリパッケージやソースパッケージの生成などが行われる。成果物はrpmbuildディレクトリ中のRPMSやSRPCS、BUILDROOTディレクトリなどに生成される。
RPMパッケージに署名を行う
RPMには作成者やパッケージの改変を検証するため、RPMパッケージに署名を行う機能が用意されている。署名が行われていないRPMパッケージでもインストールは可能だが、yumコマンドでRPMパッケージをインストールする場合、デフォルトでは署名されていないパッケージはインストールできない。そのため、パッケージに署名を行う方法についても解説しておこう。
RPMパッケージに署名を行うには、GnuPG(gpg)が必要だ。gpgはyumコマンドでインストールできる。
# yum install gpg
gpgをインストールしたら、続いて「gpg –gen-key」コマンドを実行して署名に必要な鍵を生成する。
$ gpg --gen-key
鍵の生成時、いくつかの質問に答える必要があるが、基本的にはデフォルトの設定(何も入力せずにEnterキーを入力)で構わない。生成した鍵の情報は、「gpg –list-keys」オプションで確認できる。
$ gpg --list-keys /home/hylom/.gnupg/pubring.gpg ------------------------------ pub 2048R/4924CD0B 2013-06-28 uid Hiromichi Matsushima <hylom@hylom.net> sub 2048R/0516826B 2013-06-28
作成した鍵の公開鍵は、「gpg –export -a ‘<鍵の所有者名>’」コマンドで適当なファイルにエクスポートできる。たとえば「Hiromichi Matsushima」の公開鍵をエクスポートして「RPM-GPG-KEY-hylom」というファイルに保存する場合、以下のようになる。
$ gpg --export -a 'Hiromichi Matsushima' > RPM-GPG-KEY-hylom
続いて、エクスポートした公開鍵を「rpm –import <公開鍵ファイル>」コマンドでRPMが使用するデータベースに登録する。たとえば先の例で「RPM-GPG-KEY-hylom」というファイルにエクスポートした鍵が保存されている場合、以下のようにする。
# rpm --import RPM-GPG-KEY-hylom
以上で鍵の準備は完了だ。なお、RPMのデータベースに登録されている公開鍵一覧は下記のようにして確認できる。
$ rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' gpg-pubkey-c105b9de-4e0fd3a3 --> gpg(CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>) gpg-pubkey-4924cd0b-51cd58e4 --> gpg(Hiromichi Matsushima <hylom@hylom.net>)
最後に、RPMのマクロ設定ファイルである~/.rpmmacrosに下記の内容を追加しておく。
%_signature gpg %_gpg_name <鍵の所有者名>
~/.rpmmacrosファイルが存在しない場合は、適宜作成してこの内容を記述すればよい。また、鍵の所有者名には鍵の作成時に入力した名前を指定する。
以上の設定が完了したら、「rpm –addsign <署名するRPMパッケージファイル>」コマンドでRPMパッケージに署名を行えるようになる。たとえばnodejs-0.10.12-private1.x86_64.rpmというRPMファイルに署名をする場合、以下のようになる。
$ rpm --addsign nodejs-0.10.12-private1.x86_64.rpm パスフレーズの入力: ←パスフレーズを入力 パスフレーズは正常です。 nodejs-0.10.12-private1.x86_64.rpm:
署名を検証するには、以下のように「rpm –checksig <パッケージファイル>」コマンドを実行する。
$ rpm --checksig nodejs-0.10.12-private1.x86_64.rpm nodejs-0.10.12-private1.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
独自のyumリポジトリを作成する
さて、前述の手順で作成した独自のRPMパッケージは、ディストリビューション公式のパッケージと同様に、rpmコマンドでのインストールやアンインストールが可能だ。しかし、作成したパッケージを複数のサーバーで利用したい場合、いちいちそれぞれのサーバーにパッケージファイルをコピーしてからインストール作業を実行するのは手間である。rpmコマンドにはHTTPやFTPを使ってリモートサーバー上にあるファイルを取得し、直接インストールする機能も備えられているものの、いちいちフルパスを含むURLを指定する必要がある。このような場合に有用なのが、独自のyumリポジトリを作成してRPMパッケージを配置し、パッケージを利用するサーバーからはyumコマンドを使ってパッケージのインストールを行う、というやり方だ。
独自のyumリポジトリを利用するメリットとしては、次のものが挙げられる。
- バージョン番号までを含めたパッケージファイル名をいちいち指定する必要がない
- パッケージグループや依存性の設定により、複数のパッケージを一括してインストールできる
- パッケージを更新した際のアップデートが容易
yumコマンドには、利用できるパッケージのなかで最も新しいものを自動的に探索してインストールする機能を備えている。そのため、パッケージのインストール時にはパッケージ名のみを指定すれば良い。また、yum updateコマンドを実行することで、インストールされているパッケージでより新しいものが利用できる場合は自動的にパッケージの更新を行える。特に管理対象とするサーバーの台数が多い場合などに有用だ。
yumリポジトリの構造とyumコマンドの仕組み
独自yumリポジトリについて説明する前に、まずはyumリポジトリの構造やyumコマンドの動作について解説しておこう。
yumリポジトリは通常、HTTPもしくはFTPでファイルを公開する。特殊なHTTPサーバーやFTPサーバーは不要で、Apacheなどの一般的なWebサーバーがファイルの公開に利用される。
yumリポジトリで公開されている必要があるのは、公開するRPMパッケージファイルと、リポジトリの情報が格納されている「repomd.xml」ファイル、そして提供するパッケージの情報が格納されたデータベースファイルだ。repomd.xmlファイルやデータベースファイルはまとめて「メタデータファイル」などとも呼ばれる。メタデータファイルはRPMパッケージファイルが納められているディレクトリ内に「repodata」というサブディレクトリが作成されて納められるのが一般的だ。
yumコマンドは、そのファイルを参照して有効化されているリポジトリのURLを取得し、リポジトリサーバーにアクセスしてrepomd.xmlファイルを取得する。続いてrepomd.xmlファイル内で指定されているデータベースファイルを取得して読み込み、利用可能なパッケージを確認する。有効化されているリポジトリすべてに対してこの処理を実行したのち、yumコマンドはコマンドラインで指定された処理に応じてデータベースを確認し、最新のパッケージを探索してダウンロードおよびインストールを実行する。
なお、yumコマンドでは通常/etc/yum.repos.dディレクトリ内に格納されているリポジトリ設定ファイルを参照して利用するリポジトリを決定する。そのため、独自のリポジトリを利用したい場合、このディレクトリ以下に設定ファイルを配置しておく必要がある。
独自のyumリポジトリを作成する
yumリポジトリを作成するには、repomd.xmlファイルや各種データベースファイルを作成する「creatrepo」コマンドが必要となる。これは同名のパッケージで提供されているので、これをあらかじめインストールしておこう。
# yum install createrepo
yumリポジトリを作成するには、公開するRPMファイルが格納されているディレクトリを引数に指定してcreaterepoコマンドを実行する。たとえば/var/www/rpmrepo/x86_64/PackagesというディレクトリにRPMファイルが格納されている場合、以下のように実行する。
# createrepo /var/www/rpmrepo/x86_64/Packages
すると、引数で指定したディレクトリ内にrepodataディレクトリが作成され、そこにrepomd.xmlなどのメタデータファイルが作成される。
そのほかrpmbuildコマンドにはリポジトリで公開するファイルを指定する「-i」オプションやリポジトリの更新時に利用できる「–update」オプションなども用意されているので、詳しくはmanページなどを参照してほしい。
createrepoコマンドでメタデータを作成したら、最後にこれらのディレクトリがHTTPもしくはFTPで公開されるようにすれは設定作業は完了だ。