«前の日記(2013-02-04) 最新 次の日記(2013-02-09)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2013-02-05 バイナリパッケージ作成祭り

poudriere で自家製の FreeBSD pkg (pkgng)リポジトリを作成する

先日自分の環境を pkgng によるパッケージ管理に移行したところですが、2013年2月5日現在、開発クラスタへの不正侵入の影響で未だに ports-mgmt/pkg 以外の pkgng 形式のバイナリパッケージは提供されていません。詳しい情報はこのあたりで。雑にまとめると、侵入の疑いのクラスタをすべて再構築してセキュリティ監査を受けるまで pkgng 形式のバイナリパッケージはビルドされず、とりあえず旧形式のバイナリパッケージを提供するということみたいです。

実際に、ミラーサイトには旧形式のバイナリパッケージはありました。

というわけでなんとなく自家製 pkgng 形式のリポジトリを作成しようと思い立ってやってみました。

pkgng のバイナリパッケージをひたすらビルドするには ports-mgmt/poudriere を使います。poudriere を使った自家製リポジトリの作成方法は FreeBSD src コミッタの bapt@ によって既に作成されていたのでそれを参考にしました。

必要なもの

  • 最近の FreeBSD (8.3以上)
  • 7GB以上の空きのある ZFS pool (FreeBSD のシステム自体を ZFS pool にインストールする必要はない)
  • root 権限

poudriere は jail を作成して jail の中でパッケージをビルドするので、poudriere 自体を jail の中にインストールして実行することはできません(たぶん)。

ここから実際の構築手順

あらかじめ ZFS pool を準備しておきます。今回は外付けの HDD 1台をまるごと ZFS pool にして poudriere 専用にしました。 zpool の名前は poudriere でこれを /poudriere にマウントしてあります。

poudriere と pkg ををインストールします。portinstall なり portmaster 使うなり好みで。

# make -C /usr/ports/ports-mgmt/poudriere install clean
# make -C /usr/ports/ports-mgmt/pkg install clean

poudriere の設定ファイルをサンプルからコピーして編集します。

# cd /usr/local/etc; cp poudriere.conf.sample poudriere.conf

設定ファイルのコメント行以外を抜き出すとこんな感じになりました。FREEBSD_HOST には allbsd.org のミラーを設定しました。DISTFILES_CACHE は poudriere 専用に確保するのではなく、普段使っている /usr/ports/distfiles を共有するように設定しました。

$ egrep -v "^$|^#" /usr/local/etc/poudriere.conf
ZPOOL=poudriere
FREEBSD_HOST=https://pub.allbsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/poudriere/usr/local/poudriere
USE_PORTLINT=no
USE_TMPFS=yes
DISTFILES_CACHE=/usr/ports/distfiles
NO_RESTRICTED=yes

ports tree は /usr/ports を共有せず、新しくとってきて extract します。

# poudriere ports -c

パッケージをビルドするための jail を作成します。いろんな環境を網羅すると手持ちの機材ではパワーが足りないので、今回は amd64 の 9.1-RELEASE 1本だけ。

  • -c jail を作成するためのオプション
  • -v jail の中に作成する FreeBSD のバージョン
  • -a アーキテクチャ(指定がなければホストと同じ)
  • -j jail の名前
# poudriere jails -c -j 91amd64 -v 9.1-RELEASE -a amd64 -J6

jail ごとの make.conf を作って PKGNG を使うように設定。jail の名前が 91amd64 なら /usr/local/etc/poudriere.d/91amd64-make.conf がビルドに使われます。

# mkdir /usr/local/etc/poudriere.d
# echo "WITH_PKGNH=yes" > /usr/local/etc/poudriere.d/91amd64-make.conf

今回はすべて clang でビルドするので以下の設定も 91amd64-make.conf に書きます。

.if !defined(CC) || ${CC} == "cc"
CC=clang
.endif
.if !defined(CXX) || ${CXX} == "c++"
CXX=clang++
.endif
.if !defined(CPP) || ${CPP} == "cpp"
CPP=clang-cpp
.endif
# Don't die on warnings
NO_WERROR=
WERROR=

そしてこれからビルド祭りに入りますが、その前に何のパッケージをビルドするのかを列挙したファイルを作ります。 今回はホストにインストール済みのパッケージをビルドさせてみるので以下のようにして作成。

# pkg info -oa | cut -d: -f2 > ~/installed-ports

そしていよいよビルドに入ります。

# poudriere bulk -f ~/installed-ports -j 91amd64 -J4 -v

指定したパッケージだけでなく全部をビルドするには -f ファイル名の代わりに -a オプションを指定。

# poudriere bulk -a -j 91amd64 -J4 -v

この設定でビルドが終わると /poudriere/usr/local/poudriere/data/packages/91amd64-default に出来上がったバイナリパッケージが出力されます。リポジトリを公開するにはこのディレクトリ以下を適当な Web サーバに置いて公開します。今回は rsync で。

$ cd /poudriere/usr/local/poudriere/data/packages
$ rsync --delete -crtlv --stats 91amd64-default/ www.example.jp:/path/to/docroot/freebsd:9:x86:64/latest

こうしてできたリポジトリの URL が以下です。amd64 環境の 9.1-RELEASE に向けて作成したバイナリパッケージを置いてあります。ビルドに clang を使っている以外はデフォルトの設定のままです。置いてあるパッケージの品質などは保証しないので利用する場合は注意して下さい。予告なく停止もします。

作成した自家製リポジトリを使ってみる

上で作成した自家製リポジトリを実際に使用してみます。/usr/local/etc/pkg.conf を編集。

$ sudoedit /usr/local/etc/pkg.conf

中身はこうなっています。1行だけです。

PACKAGESITE         : http://www.club.kyutech.ac.jp/~meta/pkg/${ABI}/latest

リポジトリのインデックスを更新します。

# pkg update

試しにひとつ、ビルドに時間の掛かりそうなパッケージとして firefox をインストール。

# pkg install firefox
Updating repository catalogue
Repository catalogue is up-to-date, no need to fetch fresh copy
The following packages will be installed:

        Installing libpciaccess: 0.12.1
        Installing xf86vidmodeproto: 2.3.1
        Installing alsa-lib: 1.0.26
        Installing nspr: 4.9.4
        Installing libdrm: 2.4.17_1
        Installing dri2proto: 2.6
        Installing libXxf86vm: 1.1.1
        Installing zip: 3.0
        Installing alsa-plugins: 1.0.26
        Installing libevent2: 2.0.21
        Installing libGL: 7.6.1_2
        Installing libv4l: 0.8.8_1
        Installing libvpx: 1.1.0
        Installing nss: 3.14.1
        Installing hunspell: 1.3.2_1
        Installing firefox: 18.0.1,1

The installation will require 72 MB more space

22 MB to be downloaded
(以下略)

依存関係で必要とされるパッケージも一緒にダウンロードされてインストールに成功しました。めでたしめでたし。 全パッケージをアップグレードする場合は以下のように。

# pkg upgrade

以上で自家製 pkgng リポジトリの作成と、pkg コマンドを使ったパッケージのアップデートができました。今回は pkg upgrade でパッケージをアップデートする運用の予行がやってみたかったので、poudriere でバイナリパッケージをビルドしてそれを pkg でダウンロードしてくるという自作自演をしましたが、1台しかない場合は普通に portupgrade などを使えば十分です。

実際には複数の FreeBSD マシンを抱えているので、一番性能の良い1台でビルドして、他のマシンには自家製バイナリパッケージを食わすという運用をしています。FreeBSD 公式の pkg リポジトリである pkg.freebsd.org, pkgbeta.freebsd.org にバイナリパッケージが置かれるようになればだいぶ運用が楽になります。

本日のツッコミ(全1件) [ツッコミを入れる]
Σ masaki (2013-02-06 03:01)

typo がありますー<br>s/WITH_PKGNH/WITH_PKGNG/