Table of Contents
同じパッケージが動くマシンが複数ある場合、 それぞれのマシンでソースからパッケージを構築するのは、時間の無駄です。 バイナリーパッケージ一式を作る方法が二通りあります。 古いバルクビルドシステムと、新しい (2007 年からの) 分散バルクビルド (parallel bulk build, pbulk) システムです。本章では、 構築したパッケージが有用なものにできるよう、 この二通りのバルクビルドの設定方法を説明します。
バルクビルドを最後までおこなうには、数日、あるいは数週間かかることもあります。 このため、始める前に、その準備について考えたほうがよいでしょう。 少なくとも、以下の点に注意を払ってください。
バイナリーパッケージを ftp.NetBSD.org にアップロードしたい場合、バイナリーパッケージに関する以下の条件を、 かならず満たすようにします。
ftp.NetBSD.org に置かれるパッケージは、 NetBSD 開発者が、信頼のおけるマシン (つまり、あなたが root 権限を持っており、かつ、 あなただけが root 権限を持つマシン) で構築したものである必要があります。
ftp.NetBSD.org には、安定版の枝 (たとえば 2009Q1 など) から作成されたものだけを置くようにします。これは、利用者が一見しただけで、 置かれているパッケージがどれだけ古いものかわかるようにするためです。
パッケージは root で構築する必要があります。 パッケージのなかには、実行時に set-uid バイナリーを必要とするものがあり、 今のところ、そのようなパッケージを特権ユーザー以外で作成すると、うまく動作しないからです。
バルクビルドによって、お使いのシステムが壊されることのないようにしてください。
バルクビルドの大半は、root 権限で動くので、少なくとも chroot 環境か、
(お使いのオペレーティングシステムに応じた) 何らかの制限環境で実行するようにします。
個々のパッケージが、ファイルを
LOCALBASE
以外の場所にインストールしようとしたり、
/etc
にあるファイルを編集しようとしたりする事例が、
いくつもあります。
さらに、バルクビルドでは、その過程において、
/usr/pkg
(あるいは
LOCALBASE
で設定された場所)
にパッケージをインストールしたりアンインストールしたりするので、
構築中は、どのパッケージも必要ない (アンインストールされても困らない)
ようにしておいてください。
完全なバルクビルドには、大量のディスク容量が必要です。 ディスクスペースの一部は読み取り専用でもかまいませんが、 書き込みが必要なものもあります。 ディスクスペースの一部はリモートファイルシステム (NFS など) でもかまいませんが、 ローカルとしたほうがよいものもあります。 ディスクスペースの一部は一時ファイルシステムでもかまいませんが、 突然リブートしても平気な (恒久的な) ファイルシステムが必要なものもあります。
10 GB: distfile 用 (要読み書き、リモート可、一時可)
10 GB: バイナリーパッケージ用 (要読み書き、リモート可、要恒久)
400 MB: pkgsrc ツリー用 (読み取り専用可、リモート可、要恒久)
5 GB: LOCALBASE
用 (要読み書き、ローカル推奨、pbulk では一時可、旧形式では要恒久)
5 GB: ログファイル用 (要読み書き、リモート可、要恒久ファイルシステム)
5 GB: 一時ファイル用 (要読み書き、ローカル推奨、一時ファイルシステム可)
バルクビルドには、二つの方式があります。 旧方式のバルクビルドと、新方式の “pbulk” です。 後者の方式をおすすめします。
build.conf
ファイルは、
バルクビルドの主たる設定ファイルです。pkgsrc ツリーを最新に保つ方法、
distfile のダウンロード方法、パッケージの構築方法や、
報告の作成方法を設定することができます。註釈つきの設定例が
pkgsrc/mk/bulk/build.conf-example
にあります。
これを使うには、build.conf-example
を
build.conf
にコピーし、
このファイル中のコメントに従って編集します。
mk.conf
mk.conf
で以下の変数を設定するとよいでしょう。デフォルト設定についての詳細
はpkgsrc/mk/defaults/mk.conf
を見てください。
ACCEPTABLE_LICENSES
はローカルポリシーに適合するようにしておきます。
この例では SKIP_LICENSE_CHECK=yes
としており、
ライセンスの検査を一切おこないません。
PACKAGES?= ${_PKGSRCDIR}/packages/${MACHINE_ARCH} WRKOBJDIR?= /usr/tmp/pkgsrc # build here instead of in pkgsrc BSDSRCDIR= /usr/src BSDXSRCDIR= /usr/xsrc # for x11/xservers OBJHOSTNAME?= yes # use work.`hostname` FAILOVER_FETCH= yes # insist on the correct checksum PKG_DEVELOPER?= yes SKIP_LICENSE_CHECK= yes
バルクビルド用として、特に有用なオプションが、
mk/bulk/bsd.bulk-pkg.mk
の冒頭にいくつかあります。そのなかでも最も有用な部類のものを、
ここで簡単に説明します。
遅いマシンを使っている場合は、
USE_BULK_BROKEN_CHECK
を
“no” に設定するとよいでしょう。
読み出し専用の pkgsrc ツリーを使ってバルクビルドをする場合は、
ログファイルが作られるディレクトリーとして BULKFILESDIR
を設定する必要があります。そうしないと、
pkgsrc ディレクトリー内にログファイルが作られます。
このほか、重要な変数として
BULK_PREREQ
があります。
これは、他のパッケージを構築する際には常に使える状態になっているべきパッケージを
並べたリストです。
その他、いくつかのオプションが、 pkgsrc の基盤内に散在しています。
ALLOW_VULNERABLE_PACKAGES
は yes
に設定するようにします。
バルクビルドの目的はバイナリーパッケージを作ることであり、
脆弱性の有無は重要ではありません。
この変数を設定しておかないと、バルクビルドにおいて、
脆弱性のあるパッケージを構築しようとしなくなるため、
構築でエラーがあっても検出できなくなってしまいます。
CHECK_FILES
(pkgsrc/mk/check/check-files.mk
) を
“yes” に設定すると、インストールされた一連のファイルが
PLIST
と一致することを確認することができます。
CHECK_INTERPRETER
(pkgsrc/mk/check/check-interpreter.mk
) を
“yes” に設定すると、インストールされた
“#!” で始まるスクリプトが、
指定されたインタープリターを見つけられることを確認することができます。
PKGSRC_RUN_TEST
を
“yes
” に設定して、
各パッケージのインストール前に自己診断を実行することができます。
なお、パッケージのなかには“良質の”乱数を大量に使うものがあるので、
バルクビルドを実行しているマシンが、
完全なアイドル状態にはならないようにする必要があります。
さもないと、一部の診断プログラムが、
新しい乱数データが使えるようになるのを待つ間、
ハングしているかのように見えるようになります。
バルクビルドでは、ビルド前の段階の最後に、サイト独自の作業を行なうよう設定
することができます。/usr/pkgsrc/mk/bulk
に
pre-build.local
ファイルがあると、ビ
ルド前の段階の最後に、このファイルが(sh(1)スクリプトとして)実行されます。
pre-build.local
の使い方の例としては、このファイルに
echo "I do not have enough disk space to build this pig." \ > misc/openoffice/$BROKENF
のような内容を書いておいて、3 GB近くのディスク容量が必要な個々のパッケージ の構築をしないようにする、というものがあります。
/usr/pkg
はバルクビルド開始時に完全に削除されるので、ログインシェルが別の場
所にあることを確認してください。ログインシェルを/usr/local/bin
に移して(それ
に合わせて passwd ファイルも修正して)おくか、/etc/rc.local
でpkg_add(1)を使っ
て(再)インストールするようにしておきます。これでリブート後もログインできま
す(パッケージが削除されてもシェルのプロセスは死なず、シェルを新たに起動でき
なくなるだけです)。また、1.5より前のNetBSDを使っていたり、何らかの
理由でpkgsrc版のsshを使いたい場合は、rc.local
でsshdが起動する前にsshをイン
ストールするようにしておきます:
(cd /usr/pkgsrc/security/ssh && make bulk-install) if [ -f /usr/pkg/etc/rc.d/sshd ]; then /usr/pkg/etc/rc.d/sshd fi
こうしておかないと、バルクビルド終了後や、あるいはマシンがリブートやクラッ シュした場合にsshでログインできなくなります。警告しておきましたよ! :)
すでにインストールされているどのパッケージも必要ない状態にしてください。
バルクビルドの過程で、すべてのパッケージ、
設定ファイルと、さらに、
/var
, /home
その他の場所にあるファイルがいくつか削除されます。
なので、システムに悪影響を与えるおそれのある権限で、
バルクビルドを実行しないでください。
その他、
構築の妨げになりうるもの(/usr/local
にインストールされているライブラリーなど)
もすべて削除しておいてください。root になって、以下のようにタイプします:
#
cd /usr/pkgsrc
#
sh mk/bulk/build
何らかの理由で前回の構築が完了していない場合(電源断、システムパニックなど) は、以下を実行すると、その続きをすることができます:
#
sh mk/bulk/build restart
バルクビルドが終わると、その要約がメールで届きます。また、build.conf
ファイルのFTP
で指定したディレクトリーに、構築ログがあります。
バルクビルドは三つの段階からなります:
スクリプトがpkgsrcツリーを(anon)cvsで更新します。そして、壊れている distfileをすべて一掃し、インストールされているパッケージをすべて削 除します。
これは基本的に、 “make bulk-package”を、パッケージの構築順 序を最適化しておこなうものです。他のパッケージに依存しないパッケー ジが最初に構築され、多くの依存関係を持つパッケージは後に構築されま す。
報告を作成し、build.conf
で指定されたディレクトリーに
broken.html
という名前で置きます。あわせて、この報告の簡略版が
構築管理者にメールで送られます。
構築中、壊れているパッケージの一覧が/usr/pkgsrc/.broken
(OBJMACHINE
が設定されている場合は
.../.broken.${MACHINE}
)
に作られ、構築が壊れているものの個々の
構築ログは、各パッケージのディレクトリーに置かれます。これらのファイルは、
壊れているパッケージを再度構築しようとするような無駄をなくすために、bulk-ター
ゲットが構築が壊れていることを記録するのに使われます。また、壊れているパッ
ケージを後でデバッグするためにも使えます。
現在、 NetBSD 2.0/i386 ではおおむね以下の容量が必要です:
10 GB - distfile (NFSでも可)
8 GB - 全バイナリー一式 (NFSでも可)
5 GB - コンパイル用の一時領域 (ローカルディスクを推奨)
各パッケージは、バイナリーパッケージ作成直後にアンインストールされた上、 ソースも削除されます。このため、莫大なディスク容量は必要ありません。後 になって、このパッケージがまた必要となった場合は、再度構築することなく pkg_add(1) でインストールされるので、 無駄な再コンパイルの繰り返しは発生しません。
バルクビルドによってパッケージを全部消される(マシンがパッケージのコンパイル 以外に無用なものになってしまう)のが嫌な場合は、chroot環境下でパッケージをバ ルクビルドすることもできます。
最初にすることは、chrootされた砂場を、
たとえば/usr/sandbox
に用意することです。
これは null マウントを使って、または手動でおこなうことができます。
pkgsrc/mk/bulk/mksandbox
というシェルスクリプトがあり、
null マウントを使った砂場の環境を用意してくれます。このスクリプトは、
砂場の環境のルートに sandbox
というスクリプトも作ります。
これは、sandbox mount コマンドで null マウントをした状態にしたり、
sandbox umount
コマンドでアンマウントした状態にしたりすることができるものです。
砂場の環境を手動で用意するには、
NetBSDのインストール配布物をすべて展開するか、/usr/src/etc
で
make distribution DESTDIR=/usr/sandboxを実行した後、以下のものを用意して
適切に設定された状態にします。
カーネル
#
cp /netbsd /usr/sandbox
/dev/*
#
cd /usr/sandbox/dev ; sh MAKEDEV all
/etc/resolv.conf
(security/smtpd
およびメール用):
#
cp /etc/resolv.conf /usr/sandbox/etc
動作する(!)ようなメールの設定 (hostname, sendmail.cf):
#
cp /etc/mail/sendmail.cf /usr/sandbox/etc/mail
/etc/localtime
(security/smtpd
用):
#
ln -sf /usr/share/zoneinfo/UTC /usr/sandbox/etc/localtime
/usr/src
(たとえば
sysutils/aperture
用のシステムソース):
#
ln -s ../disk1/cvs .
#
ln -s cvs/src-2.0 src
/var/db/pkg
を作成する(デフォルトのインストールには含まれません):
#
mkdir /usr/sandbox/var/db/pkg
/usr/pkg
を作成する(デフォルトのインストールには含まれません):
#
mkdir /usr/sandbox/usr/pkg
cvs を使って、/usr/sandbox/usr/pkgsrc
内にpkgsrcをチェックアウトする:
#
cd /usr/sandbox/usr
#
cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -d -P pkgsrc
この pkgsrc ツリーを、開発用の pkgsrc ツリーにマウントしたりリンクしたりしてはいけません。 そういうことをすると問題を起こしがちだからです。
/usr/sandbox/usr/pkgsrc/packages
と
.../distfiles
が、適切な場所を指すようにする。
これらは NFS や nullfs でマウントしておくと便利かもしれません。
mk.conf
を編集する。Section 7.3.1.2, “mk.conf
”参照。
mk/bulk/build.conf
を必要に合わせて調整する。
chroot砂場の用意ができれば、 以下の手順で構築を開始できます:
#
cd /usr/sandbox/usr/pkgsrc
#
sh mk/bulk/do-sandbox-build
このコマンドは、砂場内に移動して、構築を開始するものです。構築が終わ
ると、構築の結果がメールで送信されます。できあがったバイナリーパッケージは、
/usr/sandbox/usr/pkgsrc/packages
(の指す/マウントされた先/元)に置かれます。
pkgsrc/mk/bulk/build
スクリプトは、
pkgsrc の全パッケージの一式の構築のほか、
pkgsrc に含まれるパッケージの部分集合の構築にも使うことができます。
mk.conf
で SPECIFIC_PKGS
を定義すると、
SITE_SPECIFIC_PKGS
HOST_SPECIFIC_PKGS
GROUP_SPECIFIC_PKGS
USER_SPECIFIC_PKGS
の各変数で構築対象のパッケージを定義できるようになります。 構築対象として定義されたパッケージの依存関係によって必要となるパッケージも、 バルクビルドのコードが構築対象に追加します。
この使い方のひとつに、
サイトで必要なバイナリーパッケージをすべて用意するために、
SPECIFIC_PKGS
を使ったバルクビルドを
chroot 環境で定期的に実行するというものがあります。
こうすれば、不要なパッケージまで構築するような余計な負荷はかかりません。
本節では、pkgsrc 開発者がバルクビルドで構築したバイナリーパッケージを ftp.NetBSD.org へアップロードする方法を説明します。
アップロードしようとしているバイナリーパッケージの
チェックサムファイルを自動生成したい場合は、
mk/bulk/build.conf
で
MKSUMS=yes
を忘れずに設定してください。
チェックサムファイルに PGP 署名をしたい場合
(そうすることを強くおすすめします)は、
mk/bulk/build.conf
で
SIGN_AS=username@NetBSD.org
を忘れずに設定してください。
こうしておくと、ファイルをアップロードする前には常に、そのファイルに署名するため、
GPG パスワードの入力を促すようになります。
次に、mk/bulk/build.conf
ファイルで
RSYNC_DST
が適切に設定された状態にします。
つまり、この変数値を以下のような形式に調節します。
RSYNC_DST=ftp.NetBSD.org:/pub/pkgsrc/packages/NetBSD/arch/a.b.c-20xxQy/upload
このなかの "20xxQy" (枝), "a.b.c" (OS のバージョン), "arch" を、適切な値にしてください。 ftp.NetBSD.org でのログイン名がローカルのログイン名と異なる場合は、 そのログイン名を直接指定します。たとえば、 筆者のローカルアカウントは "feyrer" ですが、ログイン名は "hubertf" なので、以下のようにします。
RSYNC_DST=hubertf@ftp.NetBSD.org:/pub/pkgsrc/packages/NetBSD/arch/a.b.c-20xxQy/upload
ここでは、アップロードの最中はディレクトリーを公開しないようにするため、
独立した upload
ディレクトリーにアップロードします。
そうするために、ftp.NetBSD.org で以下のコマンドを実行しておきます。
nbftp% mkdir -p -m 750 /pub/pkgsrc/packages/NetBSD/arch/a.b.c-20xxQy/upload
バイナリーパッケージをアップロードする前に、以下のような ssh の認証が必要となります。以下の例は、砂場内における root アカウント用の一時的な鍵を使うようにする方法です。 (同じ鍵を常時使うことはしないものとします)。
#
chroot /usr/sandbox
chroot-#
rm $HOME/.ssh/id-dsa*
chroot-#
ssh-keygen -t rsa
chroot-#
cat $HOME/.ssh/id-rsa.pub
ここで出力した id-rsa.pub
の内容を、
ftp.NetBSD.org の ~/.ssh/authorized_keys
ファイルに追加します。パッケージのアップロードが終わったら、
この鍵は削除してください。
次に、ssh でうまく接続できることを確認します。
chroot-#
ssh ftp.NetBSD.org date
ここでは、適宜 "-l yourNetBSDlogin" を使ってください。
すべて順調にいけば、 砂場から抜けて、アップロードを始めることができます。
chroot-#
exit
#
cd /usr/sandbox/usr/pkgsrc
#
sh mk/bulk/do-sandbox-upload
アップロードにはそれなりに時間がかかるかもしれません。 FTP サーバーで ls(1) や du(1) して、アップロードの過程を見てください。 アップロード用スクリプトは、制限つきのパッケージはアップロードしないように 処理してくれます。
アップロードが終わった後に、最初にすることは、ssh でアクセスして以下のようにすることです。
nbftp% vi ~/.ssh/authorized_keys
Gdd:x!
アップロード用に事前に追加しておいた鍵はすべて削除してください。
最後に、アップロードしたパッケージを
upload
ディレクトリーの外に出して、
公開された状態にします。
nbftp%cd /pub/pkgsrc/packages/NetBSD/arch/a.b.c-20xxQy
nbftp%mv upload/* .
nbftp%rmdir upload
nbftp%chgrp -R netbsd .
nbftp%find . -type d | xargs chmod 775
pbulk 方式のバルクビルドの実行の概要は、以下のとおりです。
最初に、まっさらな pkgsrc ツリー内で pbulk 基盤を構築する。
次に、この pbulk 基盤を使って、まっさらの pkgsrc ディレクトリーから個々のパッケージを構築する。
最初に、pbulk 基盤を作るための pkgsrc 基盤を作る必要があります。プラットフォームが何であっても (NetBSD であっても)、専用のディレクトリーを用意してそこに対して bootstrap をしてください。このディレクトリーは /usr/pbulk
または $HOME/pbulk
としましょう。bootstrap すると、バルクビルドに必要なツールがインストールされます。
$cd /usr/pkgsrc
$./bootstrap/bootstrap --prefix=/usr/pbulk --varbase=/usr/pbulk/var --workdir=/tmp/pbulk-bootstrap
$rm -rf /tmp/pbulk-bootstrap
これで、pbulk 基盤のための基本的な環境がインストールされましたが、いくつかのツールはまだありません。ここで、pkgsrc の設定ファイル /usr/pbulk/etc/mk.conf
を pbulk 向けに編集しましょう。ここでの典型的な設定内容は以下のとおりです。
, より多くの整合性確認をするためPKG_DEVELOPER
=yes
, WRKOBJDIR
=/tmp/pbulk-outer/usr/pkgsrc
にいかなる変更も加わらないようにするため
, ダウンロードされた distfile (pbluk 基盤および構築するパッケージ用) を、すべて、ただひとつのデイレクトリーに置くようにするためDISTDIR
=/distfiles
, 普及しているフリー/オープンソースライセンスのうち許容できるものを追加するためACCEPTABLE_LICENSES
+=...
, ライセンスの検査を省略するためSKIP_LICENSE_CHECK
=yes
これで、pbulk 基盤の残りの部分を構築する準備ができました。
$cd pkgtools/pbulk
$/usr/pbulk/bin/bmake install
$rm -rf /tmp/pbulk-outer
これで、pbulk 基盤が構築・インストールされました。この基盤を設定したうえで、さらなる準備が必要です。そうした後に、実際のバルクビルドを始めることができるようになります。
pkgsrcのバルクビルド完了後、できあがったバイナリーパッケージからCD-ROMを作っ
て、他のマシンへのインストール用に使うことができます。
pkgtools/cdpack
パッケージに、そのようなISO 9660イメージ作成用の簡単
なツールがあります。cdpackは、依存関係が一枚のCD内で完結するように、パッ
ケージを複数枚のCD-ROMに編集してくれます。
cdpackの完全なドキュメンテーションはcdpack(1)マニュアルページにあります。
以下の短い例では、
バイナリーパッケージが/usr/pkgsrc/packages/All
に置いてあり、ISO 9660イメー
ジ用の十分なディスク容量が/u2
にあるものとします。
#
mkdir /u2/images
#
pkg_add /usr/pkgsrc/packages/All/cdpack
#
cdpack /usr/pkgsrc/packages/All /u2/images
各CDに共通ファイル(COPYRIGHT
, README
, など)を含めたい場合は、そのファイルを
含むディレクトリーを作る必要があります。たとえば以下のようにします。
#
mkdir /tmp/common
#
echo "This is a README" > /tmp/common/README
#
echo "Another file" > /tmp/common/COPYING
#
mkdir /tmp/common/bin
#
echo "#!/bin/sh" > /tmp/common/bin/myscript
#
echo "echo Hello world" >> /tmp/common/bin/myscript
#
chmod 755 /tmp/common/bin/myscript
ここで、以下のようにしてイメージを作成します。
#
cdpack -x /tmp/common /usr/pkgsrc/packages/All /u2/images
こうすると、各イメージのルートディレクトリーにREADME
, COPYING
および
bin/myscript
が含まれるようになります。