パッケージサーバの作り方
カスタムビルドパッケージ
の作成と公開について
2017年4月28日
(株)創夢 内藤 祐一郎
はじめに
● FreeBSD のバイナリパッケージは
とっても便利ですが
● オプションがデフォルト
● DEFAULT_VERSIONS もデフォルト
● make.conf もデフォルト
→ 自分好みにカスタマイズしたパッケージを作りたい
パッケージビルドツール
● Poudriere
– プドゥリエル:仏語で火薬庫の意
– AsiaBSDCon2017 でたくさん言及されてました
– 調べると日本語の記事もたくさんありました
● FreeBSD ハンドブック
● Qiitaの記事
● CBUGの資料
● その他、Blog記事多数
Poudriere
● これら多数の情報とっても参考になりました。
ありがとうございます。
● これらの情報を踏まえつつ、実際に使ってみた
感じをまとめたいと思います。
Poudriereとは
● Ports ツリーのビルドを jail 環境で行い
pkgで利用できるパッケージリポジトリを
作ってくれる shell script です
● ports/ports-mgmt/poudriere から make install
● または pkg install poudriere で
インストールできます
Ports のビルドに必要なもの
1. どの Ports ツリーを使うのか?
2. どの jail 環境でビルドするのか?
3. どのオプションでビルドするのか?
4. どの make.conf を使うのか?
5. どの src.conf を使うのか?
6. どの port をビルドするのか?
1. Ports ツリーの取得
poudriere では次の方法でツリーを取得します。
A) portsnap
B) svn
C) git
取得したツリーそれぞれに名前をつけて管理しま
す。
$ poudriere ports -c -p <ツリー名> 
-m portsnap | svn | git
1. Ports ツリーの取得
svn, git リポジトリのデフォルトは
● svn://svn.freebsd.org/ports
● git://github.com/freebsd/freebsd-ports.git
変更するには poudriere.conf に
SVN_HOST に svn サーバのホスト名を
GIT_URL に git リポジトリのURLを書きます。
1. Ports ツリーの取得
ブランチのデフォルトは
● svn : head
● git : master
変更するには poudriere ports に -B <ブランチ名>
を渡します (svnでは branches/2017Q2など)
従って svn では必ず次のような URL になります
“svn://${SVN_HOST}/ports/<ブランチ名>”
1. Ports ツリーの一覧
● Poudriere で管理されている Ports ツリーの一覧
$ poudriere ports -l
● Poudriere で管理されている Ports ツリーの更新
$ poudriere ports -u -p <ports名>
● Poudriere で管理されている Ports ツリーの削除
$ poudriere ports -d -p <ports名>
2. jail 環境の作成
● jail 環境にもそれぞれ名前をつけて管理します
● jail を作成するには以下のコマンドを使います
$ poudriere jail -c -j <jail名> 
-v <バージョン: 11.0-RELEASE など> 
-a <アーキテクチャ: amd64 など>
2. jail 環境の取得先
● デフォルトでは ftp://ftp.freebsd.org からです
● poudriere.conf に
FREEBSD_HOST=ftp://ftp.jp.freebsd.org
とすると変えることができます。
2. jail 環境の一覧
● jail 環境の一覧を表示するには
$ poudriere jail -l
● jail 環境を更新 (freebsd-update) するには
$ poudriere jail -u -j <jail名>
● jail 環境を削除するには
$ poudriere jail -d -j <jail名>
3. オプションの設定
まず、 make config-recursive を実行する対象の
パッケージリストを作成します。
例)$ echo “editor/emacs” > pkglist
このリストを元にオプションを設定します。
オプションのまとまりを「セット」と呼び、名前
をつけて管理します。
3. オプションの設定
オプションは Ports ツリー、jail 環境に依存する
ため、それぞれを指定した上で設定します
$ poudriere options -p <ports名> 
-j <jail名> 
-z <セット名> 
-f <パッケージリストファイル>
poudriereが make config を実行し、対話的にオプ
ションを設定します。
3. オプションの設定
オプションの保存形式は既存の make config と全
く同じですので、/var/db/ports 以下を poudriere
の管理領域にコピーすることもできます。
例)
cp -r /var/db/ports 
/usr/local/etc/poudriere.d/<jail名>-<ports名>-<セット名
>-options
4. make.conf の設定
poudriere が使用する make.conf は次の順に読み込みます。
/usr/local/etc/poudriere.d/make.conf
/usr/local/etc/poudriere.d/<セット名>-make.conf
/usr/local/etc/poudriere.d/<ports名>-make.conf
/usr/local/etc/poudriere.d/<jail名>-make.conf
/usr/local/etc/poudriere.d/<jail名>-<ports名>-make.conf
/usr/local/etc/poudriere.d/<jail名>-<セット名>-make.conf
/usr/local/etc/poudriere.d/<jail名>-<ports名>-<セット名>-make.conf
6. src.conf の設定
poudriere が使用する src.conf は次の順に読み込
みます。
/usr/local/etc/poudriere.d/src.conf
/usr/local/etc/poudriere.d/<セット名>-src.conf
/usr/local/etc/poudriere.d/<jail名>-src.conf
パッケージビルド
poudriere が build するパッケージのリストを指定
して poudriere bulk を呼び出します。
$ poudriere bulk 
-p <ports名> -j <jail名> -z <セット名> 
-f <パッケージリストファイル>
パッケージビルド
出来上がったパッケージは
/usr/local/poudriere/data/packages/
<jail名>-<ports名>-<セット名>
に pkg repo した状態で書き込まれます。
→ここをhttpで公開します。
パッケージの署名
公開するに当たって署名したい場合には
まず、RSA鍵ペアを作成します。
例)
$ openssl genrsa -out repo.key
$ openssl rsa -in repo.key -pubout -out repo.pub
repo.key が秘密鍵で repo.pub が公開鍵です。
パッケージの署名
poudriere.conf に
PKG_REPO_SIGNING_KEY=/root/repo.key
と指定しておくとビルド時に署名してくれます
パッケージの署名検証
署名を検証する側にはRSA公開鍵をインストールし
ておき、次のような pkg.conf を作成します。
myrepo: {
url: "<公開URL>",
mirror_type: "http",
signature_type: "pubkey",
pubkey: "/root/repo.pub",
enabled: yes
}
パッケージの署名検証
poudriereは署名検証方式としてfingerprintはサ
ポートしていないようです。
FreeBSDのパッケージリポジトリと異なり
poudriereで作成したリポジトリのメタデータに
RSA 公開鍵が含まれないためです。
パッケージビルドの並列度
デフォルトではホストのCPUコア数分、jail環境
をコピーし依存関係のない Port が並列ビルドさ
れます。
一つ一つの jail では make -j 1 でビルドされま
す。
poudriere.conf の以下の設定で変えられます。
PARALLEL_JOBS=<jail数>
ALLOW_MAKE_JOBS= no | yes
ZFSを使う
zfs を使うと jail環境をコピーではなく clone して
くれるため、圧倒的に前処理が速くなります。
poudriere.conf に使いたいプール名とpoudriere用
のルートファイルシステムを指定します。
例)
ZPOOL=tank
ZROOTFS=/poudriere
おまけ
poudriereはportを作成している人にとっても複数
の環境でビルドをテストできとても魅力的です。
$ poudriere testport -j <jail名> -p <ports名> 
-z <セット名> -f <パッケージリストファイル>
で該当パッケージのビルドログを全て表示してく
れます。依存関係の不足なども表示されますの
で、ぜひご活用ください!

Custom Package Building with Poudriere