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/sandboxchroot-#rm $HOME/.ssh/id-dsa*chroot-#ssh-keygen -t rsachroot-#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-20xxQynbftp%mv upload/* .nbftp%rmdir uploadnbftp%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が含まれるようになります。