独自のRPMパッケージやyumリポジトリを作ってみよう

 Red Hat系のLinuxディストリビューションでは、RPMパッケージという形式でソフトウェアが配布されており、yumコマンドを利用してパッケージをインストールしたり、アップデートを行うことができる。今回は既存のRPMパッケージをカスタマイズして独自のパッケージを作成したり、独自のyumリポジトリを作成してパッケージ管理を行う方法を紹介しよう。

プライベートyumリポジトリを活用してサーバーをデプロイする

 Ret Hat Enterprise LinuxやCentOSといったRed Hat系のLinuxディストリビューションでは、RPMパッケージ(ファイルの拡張子は.rpm)を使ってソフトウェアをインストールするのが一般的だ。

 RPMは「RPM Package Manager」の略で、Red Hatが開発したことから当初は「Red Hat Package Manager」と呼ばれていた。現在ではRed Hat以外のLinuxディストリビューションでも採用されており、独自のコミュニティでの開発が行われている(図1)。

図1 RPMのWebサイト(rpm.org)
図1 RPMのWebサイト(rpm.org)

 RPMを採用するディストリビューションではソフトウェアがRPMパッケージで提供され、yumコマンドやrpmコマンドを利用して簡単にソフトウェアをインストールできる。

 しかし、ディストリビューションが提供している以外のソフトウェアを利用したい場合や、提供されているものよりも新しいバージョンのソフトウェアを利用したい場合、また独自にカスタマイズしたソフトウェアを利用したい場合もあるだろう。このような場合、そのソフトウェアのRPMパッケージを独自に作成してインストールすることが推奨されている。

 RPMパッケージを利用するメリットとしては、まずソフトウェアの依存関係を自動的に管理してくれる点がある。これにより、依存するソフトウェアやライブラリを自動的にインストールしたり、ファイルのアンインストールやアップデート時にインストールされていたファイルを安全に削除する、といったことが可能になる。また、必要なパッケージをうっかり削除してしまうというようなミスを防ぐこともできる。

 さらに、作成したパッケージは容易にほかのサーバーへとインストールできる。yumコマンドでRPMパッケージをインストールする場合、通常はディストリビューションの開発元が提供するサーバーやそのミラーサーバーからRPMファイルがダウンロードされるが、yumコマンドの設定を変更することで、サーバー管理者が独自に作成したリポジトリからパッケージをダウンロードしてインストールすることもできる。複数台のサーバーを管理している場合、作成したパッケージを独自のリポジトリで公開し、各サーバーはそのリポジトリを参照するように設定しておけば、容易に複数のサーバーにソフトウェアをインストールしたり、アップデートを行うことが可能になる。

 以下ではこのようなRPMパッケージを用いたサーバーのデプロイを行うために必要となる独自のRPMパッケージおよびyumリポジトリの作成方法について解説する。

独自のRPMパッケージを作成する

 RPMパッケージの作成には、パッケージを作成するための「rpmbuild」と呼ばれるツールと、パッケージを作成するソフトウェアのソースコード、そしてspecファイルと呼ばれる設定ファイルが必要となる。これらを利用して独自のRPMパッケージを作成する流れは以下のようになる。

  1. 作成するパッケージのソースアーカイブやパッチファイル、設定ファイルなどを用意する
  2. パッケージ作成手順やパッケージ情報を記載したspecファイルを作成する
  3. rpmbuildコマンドを実行してパッケージを作成する

 以下では、これらの流れを簡単に紹介していこう。

RPMパッケージの作成環境を整える

 rpmbuildは「rpm-build」という名称のパッケージで提供されている。まずはこれをインストールしておく。

# yum install rpm-build

 rpmbuildコマンドのデフォルト設定では、RPMファイルの作成にホームディレクトリ以下の「rpmbuild」というディレクトリや表1のサブディレクトリを使用する。これらのディレクトリは後述するソースパッケージのインストール時やrpmbuildコマンドの実行時に必要に応じて自動的に作成される。

表1 rpmbuildディレクトリの内容
ディレクトリ名説明
BUILDパッケージの作成時に使われるディレクトリ。ソースコードなどはこのディレクトリ以下に展開される
BUILDROOTパッケージの作成時に使われるディレクトリ。ビルドされたバイナリなどがこのディレクトリ以下に格納される
RPMS作成されたバイナリパッケージが格納されるディレクトリ
SOURCESパッケージ作成に必要なTarballやパッチなどを格納するディレクトリ
SPECSspecファイルを格納するディレクトリ
SRPMS作成されたソースパッケージが格納されるディレクトリ

 パッケージを作成するソフトウェアのソースコードについては、配布されているtar.gz形式などのアーカイブ形式(Tarballなどと呼ばれる)のままで良い。アーカイブの展開などはrpmbuildコマンドが自動的に実行してくれるからだ。そのほかパッチなどが必要な場合はそれぞれ用意しておく。これらのファイルは、rpmbuildディレクトリ内のSOURCESディレクトリ内に格納しておく。

 また、specファイルはパッケージの作成に必要な情報が記述されたテキストファイルで、テキストエディタで作成・編集できる。specファイル中にはパッケージの名称やバージョン番号、依存するパッケージといったパッケージ自体の情報だけでなく、ソースファイルをどのようにビルドするか、またビルド時にどのように設定を行うかといった情報、そしてパッケージに含めるファイル一覧といった情報も記述されている。作成したspecファイルは、rpmbuildディレクトリ中のSPECSディレクトリ内に格納しておく。

ソースパッケージからspecファイルを取り出す

 RPMパッケージを作成する際の「設計図」とも言えるspecファイルだが、これを一から作成しようとするとそれなりに手間がかかる。そのため、既存のパッケージをカスタマイズする場合はまずはそのspecファイルを入手し、それを元にカスタマイズしていくことをおすすめする。

 既存のパッケージをカスタマイズする場合は、そのソースパッケージ(「SRPM」とも呼ばれる。拡張子は.src.rpm)を利用する。RPMファイルからTarballやspecファイルを取り出すことはできないので注意してほしい。SRPMファイルはディストリビューションのリポジトリからダウンロードできる。たとえばCentOS 5.8の場合、「http://vault.centos.org/6.4/os/Source/」や「http://vault.centos.org/6.4/updates/Source/」といった公開ディレクトリから入手可能だ。また、yum-utilsというパッケージに含まれるyumdownloaderというコマンドでもSRPMファイルを入手できる。

# yum install yum-utils

 yumdownloaderを利用する場合、このyum-utilsパッケージをインストールしたうえで、SRPMファイルの入手先リポジトリを設定しておく必要がある。たとえばCentOS 6.4の場合、/etc/yum.repos.d/CentOS-Source.repoというファイルを作成し、以下のような内容を記述しておけばよい。

[base-Source]
name=CentOS-6.4 - Base - Source
baseurl=http://vault.centos.org/6.4/os/Source/
gpgcheck=0

[updates-Source]
name=CentOS-6.4 - Updates - Source
baseurl=http://vault.centos.org/6.4/updates/Source/
gpgcheck=0

 たとえばtarパッケージのSRPMファイルをダウンロードするには、以上の設定を行った状態でyumdownloaderコマンドを次のように実行すれば良い。

$ yumdownloader --source tar

 これで、対応するSRPMファイルがダウンロードされ、コマンドを実行したディレクトリ内に保存される。

 ダウンロードしたSRPMファイルは、次のようにrpmコマンドでインストールすることで、specファイルやソースファイルを取り出すことができる。

$ rpm -ivh <SRPMファイル>

 このとき、rpmコマンドはroot権限ではなく一般ユーザー権限で実行する点に注意したい。RPMパッケージの作成は一般ユーザー権限で実行するのが慣例となっているからだ。

 ソースパッケージをインストールすると、rpmbuildディレクトリ以下にspecファイルやソースコードのTarballなどが格納される。あとは必要に応じてspecファイルを修正したり、パッチなどを追加すれば良い。