runit によるユーザ権限でのデーモン化

はじめに

ネタがなかったのでずっと更新してなかったのですが、久しぶりにブログ更新します。
今回はユーザ権限によるプログラムのデーモン化をrunitを使って試したのでそれをまとめようと思います。
今まで仕事でdaemontoolsを使うことが多かったのですがroot権限でservice登録する必要があり(私が回避方法を知らないだけかもしれませんが。。。)、runスクリプトを変更した際に毎回rootになる必要があって不便だと思っていました。
そこで最近runitというものがあることを知り調べて実際に使ってみたのでそれをまとめます。

適当なサンプルプログラムを作るのも味気ないので IRC proxy で有名な tiarra をrunit管理下においてデーモン化してみたいと思います。

tiarraのインストール・設定

まずさっそくですが tiarra 本体をインストールします。
私の環境が Debian lenny なので今回は Debian lenny 環境において話を進めます。

nhayashi@deb1:~$ mkdir deb && cd deb
nhayashi@deb1:~/deb$ wget http://hanzubon.jp/Linux/Debian/sid/tiarra/tiarra_0.20100922.orig.tar.gz
nhayashi@deb1:~/deb$ wget http://hanzubon.jp/Linux/Debian/sid/tiarra/tiarra_0.20100922-1.diff.gz
nhayashi@deb1:~/deb$ tar zxvf tiarra_0.20100922.orig.tar.gz
nhayashi@deb1:~/deb$ cd tiarra-0.20100922/
nhayashi@deb1:~/deb/tiarra-0.20100922$ zcat ../tiarra_0.20100922-1.diff.gz | patch -p1
nhayashi@deb1:~/deb/tiarra-0.20100922$ debuild -rfakeroot -uc -us
nhayashi@deb1:~/deb/tiarra-0.20100922$ cd ../
nhayashi@deb1:~/deb$ sudo dpkg -i tiarra_0.20100922-1_all.deb

次に tiarra の設定をしておきます。tiarra の設定は各自お好みの設定でお願いします。

nhayashi@deb1:~$ cd
nhayashi@deb1:~$ mkdir .tiarra
nhayashi@deb1:~$ zcat /usr/share/doc/tiarra/examples/sample.conf.gz > .tiarra/tiarra.conf
nhayashi@deb1:~$ tiarra --make-password
(ここでパスワードを生成します。)
nhayashi@deb1:~$ vi .tiarra/tiarra.conf

私の tiarra.conf の最低限の設定は下記になります。

-  nick: tiarra
-  user: tiarra
-  name: Tiarra the "Aeon"
+  nick: nhayashi
+  user: nhayashi
+  name: nhayashi

-  tiarra-password: xl7cflIcH9AwE
+  tiarra-password: ij3N65pr8dPkI

+  name: freenode

+    channel: *@freenode

+freenode {
+  server: irc.freenode.net 6667
 
+  in-encoding: utf8
+  out-encoding: utf8
 }

ここまでで最低限の tiarra の設定はできました。

rootでのrunitの設定(一般ユーザ用runsvdirサービス登録)

次に今回の本題の runit の設定についてまとめます。
まずは runit をインストールします。

nhayashi@deb1:~$ sudo apt-get install -V runit

次にユーザ権限でrunit管理下のデーモンを扱うための設定をします。

nhayashi@deb1:~$ sudo mkdir /etc/sv/runsvdir-nhayashi

ユーザ権限でデーモンを扱うためのrunスクリプトは下記のようになります。
ここでは chpst という runit 付属のプロセス状態を変更するコマンドでユーザ権限でrunsvdirを実行します。
このrunsvdirというのがサービス登録されるプログラムのディレクトリを監視してくれます。

nhayashi@deb1:~$ sudo vi /etc/sv/runsvdir-nhayashi/run
#!/bin/sh
exec 2>&1
exec chpst -unhayashi runsvdir /home/nhayashi/service

今回は /home/nhayashi/service というディレクトリをサービス登録されるプログラムの監視対象ディレクトリにしました。

忘れる前に /home/nhayashi/service ディレクトリを作っておきます。

nhayashi@deb1:~$ mkdir /home/nhayashi/service

プログラム起動できるように実行権限を与えておきます。

nhayashi@deb1:~$ sudo chmod +x /etc/sv/runsvdir-nhayashi/run

次にログ管理するrunスクリプトを用意しておきます。

nhayashi@deb1:~$ sudo mkdir /etc/sv/runsvdir-nhayashi/log

今回はログ出力先に /var/log/runsvdir/nhayashi を指定しました。
またここでも 一般ユーザでログを見れるように chpst を使って実行ユーザを一般ユーザに変えています。
runit 付属のコマンドに svlogd という daemontools でいう multilog 相当のものがあるのでこちらを利用してログ出力を行います。

nhayashi@deb1:~$ sudo vi /etc/sv/runsvdir-nhayashi/log/run
#!/bin/sh
LOG=/var/log/runsvdir/nhayashi
test -d "$LOG" || mkdir -p -m755 "$LOG" && chown nhayashi:adm "$LOG"
exec chpst -unhayashi svlogd -t "$LOG"

忘れずに実行権限を与えておきます。

nhayashi@deb1:~$ sudo chmod +x /etc/sv/runsvdir-nhayashi/log/run

runit も daemontools を参考に実装されているため サービス登録されるプログラムと同じディレクトリに supervise ディレクトリを作成してデーモン管理します。
そのままだと /etc/sv/runsvdir-nhayashi/ 以下に状態管理ファイルが作成されてしまい気持ち悪いので /var/lib/supervise に変更します。
(ちなみにこの設定は runit で管理される git-daemon の実装を参考にしました。)

nhayashi@deb1:~$ sudo mkdir /var/lib/supervise/runsvdir-nhayashi
nhayashi@deb1:~$ sudo mkdir /var/lib/supervise/runsvdir-nhayashi.log
nhayashi@deb1:~$ sudo ln -s /var/lib/supervise/runsvdir-nhayashi /etc/sv/runsvdir-nhayashi/supervise
nhayashi@deb1:~$ sudo ln -s /var/lib/supervise/runsvdir-nhayashi.log /etc/sv/runsvdir-nhayashi/log/supervise

ここまでできたらユーザ権限でrunit管理下のデーモンを管理できるようサービスを登録します。
サービス登録は /etc/service にシンボリックリンクを貼れば runsvdir が自動でサービス登録を検知してくれます。

nhayashi@deb1:~$ sudo ln -s /etc/sv/runsvdir-nhayashi /etc/service/
nhayashi@deb1:~$ sudo sv status runsvdir-nhayashi

ちゃんとサービス登録できているか確認します。

nhayashi@deb1:~$ pstree -acu
init
  ├─runsvdir -P /etc/service...
  │   └─runsv runsvdir-nhayashi
  │       ├─runsvdir,nhayashi /home/nhayashi/service
  │       └─svlogd,nhayashi -t /var/log/runsvdir/nhayashi

runsv runsvdir-nhayashi から runsvdir,nhayashi /home/nhayashi/service と svlogd,nhayashi -t /var/log/runsvdir/nhayashi が起動できていることが確認できます。

一般ユーザでのrunitの設定(tiarraサービス登録)

ここからは一般ユーザにおけるデーモン化についてまとめます。
まずサービス登録するプログラムのディレクトリを用意します。
今回は tiarra をデーモン化するので ~/.tiarra/service にその設定をまとめます。

nhayashi@deb1:~$ mkdir ~/.tiarra/service

~/.tiarra/service/run に tiarra 起動プログラムを書きます。
実行権限を与えるのを忘れずに。

nhayashi@deb1:~$ vi ~/.tiarra/service/run
#!/bin/sh
exec 2>&1
exec tiarra --config=/home/nhayashi/.tiarra/tiarra.conf
nhayashi@deb1:~$ chmod +x ~/.tiarra/service/run

tiarra のログ管理を行うrunスクリプトを用意します。ログ出力先は ~/.tiarra/log/ に設定します。

nhayashi@deb1:~$ mkdir ~/.tiarra/log
nhayashi@deb1:~$ mkdir ~/.tiarra/service/log
nhayashi@deb1:~$ vi ~/.tiarra/service/log/run
#!/bin/sh
LOG=/home/nhayashi/.tiarra/log
exec svlogd -t "$LOG"

忘れずに実行権限を与えます。

nhayashi@deb1:~$ chmod +x .tiarra/service/log/run

一般ユーザでのrunitによるtiarraサービス起動

ここまでできたら準備は整ったので tiarra を runit 管理下のデーモンとして起動してみます。
起動方法は /home/nhayashi/service にサービス登録プログラムのシンボリックリンクを貼るだけです。

nhayashi@deb1:~$ ln -s /home/nhayashi/.tiarra/service /home/nhayashi/service/tiarra

ちゃんと起動できたか確認してみます。

nhayashi@deb1:~$ pstree -acu
init
  ├─runsvdir -P /etc/service...
  │   └─runsv runsvdir-nhayashi
  │       ├─runsvdir,nhayashi /home/nhayashi/service
  │       │   └─runsv tiarra
  │       │       ├─svlogd -t /home/nhayashi/.tiarra/log
  │       │       └─tiarra /usr/share/tiarra/tiarra...
  │       │           └─{tiarra}
  │       └─svlogd,nhayashi -t /var/log/runsvdir/nhayashi

sv コマンドでサービス管理を行うのですが下記のように SVDIR=(サービス登録ディレクトリ) を指定してあげる必要があります。
SVDIR を未指定の場合は /etc/service が設定されたものと認識されてしまうので気をつけてください。
sv status コマンドで状態を確認してみます。

nhayashi@deb1:~$ SVDIR=~/service sv status tiarra
run: tiarra: (pid 11202) 187s; run: log: (pid 11173) 380s

問題なく起動できてますね。

念のためログも正しく出力されているか確認してみようと思います。
と、その前に svlogd -t と指定してログ出力を行ったのですが、このままだと日時が意味の分からないものになっているので、daemontools 付属の tai64nlocal を使って人が読める形式に変換します。まずは daemontools のインストール。

nhayashi@deb1:~$ sudo apt-get install -V daemontools

下記のようにして見ることができます。

nhayashi@deb1:~$ tail -f ~/.tiarra/log/current | tai64nlocal

svlogd -tt とすれば人が読める形式にはなるのですが UTC timestamp で出力されるので日本より9時間遅い時間が出力されてしまいます。そのため私の環境では svlogd -t と設定して tai64nlocal で変換してみるようにしています。
(UTC timestamp で出力されたものを私が見る方法を知らないだけかもしれませんが。。。)

svコマンド例

デーモンの起動・停止は sv コマンドを使って下記のように行います。

nhayashi@deb1:~$ SVDIR=~/service sv start tiarra
nhayashi@deb1:~$ SVDIR=~/service sv stop tiarra

また私が見落としていてはまったのが svlogd プログラムの停止を忘れることが多く下記のように指定します。

nhayashi@deb1:~$ SVDIR=~/service sv start tiarra/log
nhayashi@deb1:~$ SVDIR=~/service sv stop tiarra/log

他にもいくつかコマンドがあるようなので試してみることをお勧めします。

まとめ

今回、ユーザ権限でデーモン管理ができる runit を試してみて現状問題なく動いているようです。
ただ実運用で使った実績はまだないのでもう少し検証して安定性を確認しようと思います。
runit 自体 daemontools を参考に実装されたこともあり、daemontools -> runit へ乗り換えるのは簡単にできそうです。

daemontools では コマンドが多かったり multilog の記述が難解だったり 最初使うのにすごい苦労した記憶があります。
runit だと コマンドも少ないですし、プロセスの起動フローもシンプルな印象を受けました。
daemontools と runit のプロセス起動を比較すると下記のようになると思います。

(daemontools)
init
 `-svscanboot
     |-readproctitle
     `-svscan
         |-supervise prog
         |   `-exec prog
         `-supervise log
             `-multilog

(runit)
init
 `-runsvdir
     `-runsv prog
     |   `-exec prog
     `-svlogd

svscanboot, svscan が runsvdir にまとまっているためシンプルなのかなと思いました。
今回、runit を試してみて意外に簡単に感じたのはそのせい?かなと思います。
当初、想定より簡単に使えて安定性も確認できれば daemontools から runit に乗り換えるのは賢い選択なのかなと思います。

perlbrew, cpanminus で perl 環境構築

ほぼ自分用のメモとしてまとめを書きます。

curl -LO http://xrl.us/perlbrew
perl perlbrew install
~/perl5/perlbrew/bin/perlbrew init
source ~/perl5/perlbrew/etc/bashrc
perlbrew install perl-5.8.9
cd ~/perl5/perlbrew/dists/
tar jxvf perl-5.8.9.tar.bz2

vi perl-5.8.9/lib/locale.t
460行目
- if ($v >= 8 and $v < 10) {
+ if ($v >= 8 and $v <= 10) {

tar jcvf perl-5.8.9.tar.bz2 perl-5.8.9
perlbrew install perl-5.8.9
perlbrew switch perl-5.8.9
curl -L http://cpanmin.us/ | perl - App::cpanminus
cpanm Module::Install
cpanm App::cpanoutdated
cpan-outdated | cpanm
cpanm App::pmuninstall
cpanm http://nodeload.github.com/tokuhirom/task-belike-tokuhirom/tarball/master

これで一通り perl 環境は整った。hidek++

.bashrc にも perlbrew の bashrc を読み込むように追記。

if [ -f $HOME/perl5/perlbrew/etc/bashrc ]; then
    . $HOME/perl5/perlbrew/etc/bashrc
fi

vim RPMビルド

前回、MySQL-communityのRPMビルドを紹介したが今回はvimRPMビルドについて手順をまとめる。
CentOS5標準付属のvimはバージョンが7.0と古いものなので今回はfedora13で提供されているvimからRPMビルドを作成しようと思う。

まず下記サイトよりfedora13のvim src.rpmを取得する。

http://rpm.pbone.net/

検索時に「fedora13」のチェックボックスを選択して「vim-common」とキーワード指定して検索する。
検索結果の対象アーキテクチャからsrc.rpmを辿って手元にsrc.rpmを取得する。

$ wget ftp://ftp.rhnet.is/pub/fedora/linux/releases/13/Fedora/source/SRPMS/vim-7.2.411-1.fc13.src.rpm

いつも通りrpmで展開しようとするとfedora用src.rpmのため「MD5 sum mismatch」とエラーになってしまう。当然なんですが。。。
なのでMD5チェックサムを無視して展開する。

$ rpm -ivh --nomd5 vim-7.2.411-1.fc13.src.rpm

すると SPECS, SOURCES に展開されているので rpmbuild してみる。

$ rpmbuild -ba SPECS/vim.spec

が、ビルドに必要なパッケージが入っていないので入れる。

$ sudo yum install python-devel libacl-devel gpm-devel ruby-devel ruby gtk2-devel libSM-devel libXt-devel libXpm-devel

ただこれだけでもダメで perl-devel の依存関係が残ってしまう。
しかし、この perl-devel というパッケージは fedora13 にだけある新しいパッケージのため CentOS5 の yumリポジトリには存在しない。
そこでこの perl-devel のビルド依存関係を下記のようにspecファイルから除外する。

@@ -492,7 +492,7 @@
 Patch3013: vim-7.2-elinks-parameter-518791.patch
 
 Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-BuildRequires: python-devel ncurses-devel gettext perl-devel
+BuildRequires: python-devel ncurses-devel gettext
 BuildRequires: perl(ExtUtils::Embed)
 BuildRequires: libacl-devel gpm-devel autoconf
 %if %{WITH_SELINUX}

では実際にビルドしてみる。

$ rpmbuild -ba SPECS/vim.spec

うまくいけば下記のファイルが作られていると思う。

vim-common-7.2.411-1.i386.rpm
vim-minimal-7.2.411-1.i386.rpm
vim-enhanced-7.2.411-1.i386.rpm
vim-X11-7.2.411-1.i386.rpm

まとめ

今回はfedora13のsrc.rpmを使ってvim7.2のRPMビルドを行った。
相変わらずspecファイル抜きのパッケージビルドは避けている。。。
そのためvim7.3の最新のものは見て見ぬ振りを。。。
たいていのものはspecファイルがどこかにあってそれを拝借することでRPMビルドできているので今のところはなんとかできている。

会社の仕事の関係上、CentOSでの開発・運用は当分はなさそうなので、次回は何か別のエントリーを書こうと思う。

MySQL-community RPMビルド

前回、curl, git 最新版のRPMビルド手順について書いたが今回はMySQL-communityのRPMビルドについて書こうと思う。

MySQL-community RPMビルド

何はともあれまずはオフィシャルからsrc.rpmを取得して展開する。

$ wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-community-5.1.51-1.rhel5.src.rpm/from/http://ftp.iij.ad.jp/pub/db/mysql/
$ rpm -ivh MySQL-community-5.1.51-1.rhel5.src.rpm

次にビルドするのに必要なRPMを入れる。

$ sudo yum install gperf readline-devel gcc-c++ ncurses-devel libtool automake autoconf

そして MySQL-community のビルドには専用の define 指定が必要になるのでそれを指定して rpmbuild を実行する。

$ cd ~/rpmbuild/
$ rpmbuild -ba --define 'community 1' SPECS/mysql-5.1.51.rhel5.spec

実際にソースからでもビルドしたことある方ならご存知だと思いますがものすごい時間がかかります。。。

無事にビルドできれば下記のRPMが作成される。

MySQL-server-community-5.1.51-1.rhel5.i386.rpm
MySQL-client-community-5.1.51-1.rhel5.i386.rpm
MySQL-test-community-5.1.51-1.rhel5.i386.rpm
MySQL-devel-community-5.1.51-1.rhel5.i383.rpm
MySQL-shared-community-5.1.51-1.rhel5.i386.rpm
MySQL-embedded-community-5.1.51-1.rhel5.i386.rpm

まとめ

今回は時間がかかるものの何事もなくRPMビルドできてよかった。
specファイルさえあればだいたいのパッケージはRPM化できると思う。
が、逆にspecファイルがないとどうしていいものやら。。。
vimなどは最新版のspecはオフィシャルにはないとか。。。
そういう場合でもfedora yumリポジトリから取得するなどしてビルドすることも出来るので次回はvimRPMビルドを書こうと思う。

自前yumリポジトリでのグループインストール設定

前回、yumリポジトリ構築について書いたが、グループインストールについて触れていなかったので今回は自前yumリポジトリでのグループインストール設定について書く。

yumリポジトリサーバ側でも自前リポジトリを指定する。

yumグループを作る際に yum-groups-manager というツールで既存パッケージを指定するが、yumリポジトリサーバ側でもyumコマンドでRPMが取得できないといけないのでまずはそれを設定する。

$ vi /etc/yum.repos.d/local.repo
[local]
name=CentOS-$releasever - $basearch - Local Repository
baseurl=http://192.168.1.12/centos/$releasever/$basearch/
enabled=1
gpgcheck=0

グループ定義XMLを用意する

グループ定義XMLを用意するために yum-groups-manager というツールを使う。
使い方は下記のようにする。

(新規の場合)
$ yum-groups-manager --id=local-mysql --name='Local MySQL packages' --description='The package in this group are MySQL packages needed to DB servers.' --save=/var/www/html/centos/5/i386/groups.xml MySQL-client-community

すると下記のようなXMLができあがる。

$ cat /var/www/html/centos/5/i386/repodata/groups.xml


  
    local-mysql
    false
    true
    1024
    Local MySQL packages
    The package in this group are MySQL packages needed to DB servers.
    
      MySQL-client-community
    
  

せっかくなので MySQL-server-community も同じグループに含める。
まずはオフィシャルからダウンロードする。

$ wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-server-community-5.1.51-1.rhel5.i386.rpm/from/http://ftp.iij.ad.jp/pub/db/mysql/

上記で既にグループ定義XMLは用意してあるのでそのXMLに追加してみる。コマンドは以下のようになる。

$ yum-groups-manager --id=local-mysql --load=/var/www/html/centos/5/i386/repodata/groups.xml --save=/var/www/html/centos/5/i386/repodata/groups.xml MySQL-server-community

--id もしくは --name に既にあるものを指定すれば追加することができる。念のため確認。

$ cat /var/www/html/centos/5/i386/repodata/groups.xml


  
   local-mysql
   false
   true
   1024
   Local MySQL packages
   The package in this group are MySQL packages needed to DB servers.
    
      MySQL-client-community
      MySQL-server-community
    
  

最後にグループ定義XMLを指定してyumリポジトリを更新する。

$ createrepo -v -g /var/www/html/centos/5/i386/repodata/groups.xml /var/www/html/centos/5/i386/

yumクライアント側でグループインストールしてみる。

では実際にグループインストールでMySQL関連のRPMを入れてみる。

$ yum --disablerepo=* --enablerepo=local groupinstall mysql-local
=====================================================================================
 Package                       Arch        Version                Repository    Size
=====================================================================================
Installing:
 MySQL-client-community        i386        5.1.51-1.rhel5         local        7.3 M
 MySQL-server-community        i386        5.1.51-1.rhel5         local         20 M

無事にインストールできている。

まとめ

1つのグループでたくさんのRPMを入れようとするとそれぞれRPMを指定しないといけなくて大変。
yum-groups-manager には wildcard も指定できるようなのだがどうもうまくいかなかった orz...
他にも 複数グループをまとめてカテゴリとして扱うこともできるようなので興味のある方はぜひ試してみてください。

curl, git の RPM ビルド

CentOS5にrpmforgeからgitを入れて使ってみるとcurlの古いバージョンが入った環境でビルドされているようで、git-http-pushが使えなかったのでcurl, gitともに最新版を手元でRPMビルドして入れたのでその時の手順を書こうと思う。

RPMビルド環境を用意する

まずはRPMビルド環境を用意する必要があるので下記コマンドを実行。

$ sudo yum install rpm-build
$ mkdir rpmbuild
$ cd rpmbuild
$ mkdir BUILD RPMS SOURCES SPECS SRPMS

次に上記で作ったディレクトリ内でビルドを行うために .rpmmacros を設定する。

$ vi ~/.rpmmacros
%_topdir %(echo $HOME)/rpmbuild

これで最低限のビルド環境は設定完了。

curl RPMビルド

gitをビルドする前にcurlの最新版をビルド、インストールしておく。
標準だと 7.15.5 が入っていたのでオフィシャルから最新版の 7.21.2 の src.rpm を落としてくる。

$ wget http://curl.haxx.se/download/curl-7.21.2-1.src.rpm

そしてそれを展開する。

$ rpm -ivh curl-7.21.2-1.src.rpm
$ ls rpmbuild/SPECS/
curl.spec
$ ls rpmbuild/SOURCES/
curl-7.21.2.tar.bz2

では実際にビルドして最新版のcurl RPMを作りたいがそのままの curl.spec ではうまくビルドできなかったので、curl.spec に下記の変更を加えた。

-Copyright: MIT/X derivate
+License: MIT/X derivate

また他のRPMも必要だったのでrpmforgeのリポジトリを追加して下記のように入れておいた。

$ sudo yum install gcc
$ wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm
$ sudo rpm -ivh rpmforge-release-0.5.1-1.el5.rf.i386.rpm
$ sudo yum install libssh2-devel

これでcurlビルドに必要な環境は整ったので実際にビルドしてみる。

$ cd ~/rpmbuild/
$ rpmbuild -ba SPEC/curl.spec
...

エラーが出ずにうまくいけば ~/rpmbuild/SRPMS/, ~/rpmbuild/RPMS/i386/ にRPM が作られている。

$ ls ~/rpmbuild/SRPMS/
curl-7.21.2-1.src.rpm
$ ls ~/rpmbuild/RPMS/i386/
curl-7.21.2-1.i386.rpm  libcurl4-7.21.2-1.i386.rpm  libcurl4-devel-7.21.2-1.i386.rpm

以上で最新版curlRPMビルドは完了。
あとは自前のyumリポジトリなどに反映させてインストールする。

$ sudo cp ~/rpmbuild/RPMS/i386/*curl* /var/www/html/centos/5/i386/
$ sudo createrepo -v /var/www/html/centos/5/i386/
$ sudo yum remove curl
$ sudo yum install curl

一応、バージョンを確認。

$ curl --version
curl 7.21.2 (i686-redhat-linux-gnu) libcurl/7.21.2 OpenSSL/0.9.8b zlib/1.2.3 libssh2/1.2.7

git RPMビルド

本題のgit RPMビルドに入る。
git も curl 同様、オフィシャルから src.rpm を取得して展開しておく。

$ wget http://kernel.org/pub/software/scm/git/RPMS/SRPMS/git-1.7.3.2-1.fc11.src.rpm
$ rpm -ivh git-1.7.3.2-1.fc11.src.rpm

git のビルドにはたくさんのパッケージ依存があってすごい大変。
そのため rpmforge も使っています。
以下に依存のあったパッケージを入れた手順を書きます。

$ sudo yum install expat-devel xmlto asciidoc perl-Error libcurl4-devel

では実際にビルドしてみます。

$ cd ~/rpmbuild/
$ rpmbuild -ba SPECS/git.spec

うまくいけば ~/rpmbuild/SRPMS/, ~/rpmbuild/RPMS/i386/ に RPM が出来ているので、上記curlの時と同様に /var/www/html/centos/5/i386/ にコピーして createrepo を実行すれば git-http-push が実行できる git を RPM で入れることが出来る。

$ sudo cp ~/rpmbuild/RPMS/i386/git* /var/www/html/centos/5/i386/
$ sudo cp ~/rpmbuild/RPMS/i386/perl-Git* /var/www/html/centos/5/i386/
$ sudo createrepo -v /var/www/html/centos/5/i386/

実際にインストールしてバージョンを確認してみます。

$ yum --disablerepo=* --enablerepo=local install git
$ git --version
git version 1.7.3.2

うまくいかない場合は rpmbuild 時の並列処理がうまく処理できていない場合があるので下記のように git.spec ファイルを変更して試してみてください。

@@ -112,7 +112,7 @@
 %setup -q
 
 %build
-make %{_smp_mflags} CFLAGS="$RPM_OPT_FLAGS" \
+make CFLAGS="$RPM_OPT_FLAGS" \
      %{path_settings} \
      all %{!?_without_docs: doc}

まとめ

今回はcurl, gitいずれもオフィシャルでsrc.rpmを提供していてspecを自分で書く必要がなかったのでなんとか無事にRPMビルドすることが出来た。
src.rpmを提供しているもののビルド方法として次回はMySQLRPMビルドを書こうと思う。

privateネットワークにyumリポジトリを構築

仕事でyumリポジトリを立てる場面がありせっかくなのでまとめようと思います。

対象環境は以下です。

OS: CentOS5
アーキテクチャ: 32bit

yumリポジトリサーバの設定

まっさらな状態のサーバにyumリポジトリを立てます。
まずyumリポジトリを立てるのに必要なパッケージから入れます。

$ yum install createrepo

次にhttp経由でパッケージを送るためとりあえずapacheを入れて起動しておきます。

$ yum install httpd
$ /etc/init.d/httpd start

yumリポジトリを配置するディレクトリを作成します。

$ mkdir -p /var/www/html/centos/5/i386

テスト用にCentOS標準のmysqlクライアントではなく mysql オフィシャルのMySQL-client-community RPMyumリポジトリの対象アーキテクチャディレクトリにダウンロードします。

$ cd /var/www/html/centos/5/i386
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-client-community-5.1.51-1.rhel5.i386.rpm/from/http://ftp.iij.ad.jp/pub/db/mysql/

新しいRPMを追加したのでyumリポジトリを更新します。

$ createrepo -v /var/www/html/centos/5/i386

上記コマンドを実行すると下記のファイルができます。

$ ls /var/www/html/centos/5/i386/repodata/
filelists.xml.gz  other.xml.gz  primary.xml.gz  repomd.xml

yumリポジトリを利用するクライアントの設定

次に上記で設定したyumリポジトリからRPMを取得するクライアントの設定をします。
まず上記yumリポジトリの指定を行います。

$ vi /etc/yum.repos/local.repo
[local]
name=CentOS-$releasever - $basearch - Local Repository
baseurl=http://192.168.1.12/centos/$releasever/$basearch/
enabled=1
gpgcheck=0

下記のコマンドで現在設定されているyumリポジトリの一覧が見れる。

$ yum repolist
repo id               repo name                                        status
addons                CentOS-5 - Addons                                enabled:     0
base                  CentOS-5 - Base                                  enabled: 2,599
extras                CentOS-5 - Extras                                enabled:   337
local                 CentOS-5 - i386 - Local Repository               enabled:     2
updates               CentOS-5 - Updates                               enabled:   688
repolist: 3,626

では実際にRPMがprivateネットワークのyumリポジトリから取得できるか確認する。

$ yum --disablerepo=* --enablerepo=local install MySQL-client-community
=====================================================================================
 Package                       Arch        Version                Repository    Size
=====================================================================================
Installing:
 MySQL-client-community        i386        5.1.51-1.rhel5         local        7.3 M

まとめ

privateネットワークに自前のyumリポジトリを立てることでサーバ構成管理はだいぶ楽になるんじゃないかなと思う。
次回はグループインストールを行うための設定を書こうと思う。