Chapter 7. pkgsrc のバイナリーパッケージを全部作成する (バルクビルド)

Table of Contents

7.1. まず考察、構築はその後
7.2. バルクビルドに必要なもの
7.3. 旧方式のバルクビルドを実行する
7.3.1. 設定
7.3.2. ほか、環境に関する考察
7.3.3. 操作
7.3.4. 何を実行するのか
7.3.5. 必要なディスク容量
7.3.6. chroot構築用の砂場を用意する
7.3.7. パッケージを部分的に構築する
7.3.8. バルクビルドの成果をアップロードする
7.4. pbulk 方式のバルクビルドを実行する
7.4.1. 事前準備
7.4.2. 設定
7.5. CD-ROM複数枚に収めたパッケージコレクションの作成
7.5.1. cdpackの使用例

同じパッケージが動くマシンが複数ある場合、 それぞれのマシンでソースからパッケージを構築するのは、時間の無駄です。 バイナリーパッケージ一式を作る方法が二通りあります。 古いバルクビルドシステムと、新しい (2007 年からの) 分散バルクビルド (parallel bulk build, pbulk) システムです。本章では、 構築したパッケージが有用なものにできるよう、 この二通りのバルクビルドの設定方法を説明します。

7.1. まず考察、構築はその後

バルクビルドを最後までおこなうには、数日、あるいは数週間かかることもあります。 このため、始める前に、その準備について考えたほうがよいでしょう。 少なくとも、以下の点に注意を払ってください。

  • バイナリーパッケージを ftp.NetBSD.org にアップロードしたい場合、バイナリーパッケージに関する以下の条件を、 かならず満たすようにします。

    • ftp.NetBSD.org に置かれるパッケージは、 NetBSD 開発者が、信頼のおけるマシン (つまり、あなたが root 権限を持っており、かつ、 あなただけが root 権限を持つマシン) で構築したものである必要があります。

    • ftp.NetBSD.org には、安定版の枝 (たとえば 2009Q1 など) から作成されたものだけを置くようにします。これは、利用者が一見しただけで、 置かれているパッケージがどれだけ古いものかわかるようにするためです。

    • パッケージは root で構築する必要があります。 パッケージのなかには、実行時に set-uid バイナリーを必要とするものがあり、 今のところ、そのようなパッケージを特権ユーザー以外で作成すると、うまく動作しないからです。

  • バルクビルドによって、お使いのシステムが壊されることのないようにしてください。 バルクビルドの大半は、root 権限で動くので、少なくとも chroot 環境か、 (お使いのオペレーティングシステムに応じた) 何らかの制限環境で実行するようにします。 個々のパッケージが、ファイルを LOCALBASE 以外の場所にインストールしようとしたり、 /etc にあるファイルを編集しようとしたりする事例が、 いくつもあります。 さらに、バルクビルドでは、その過程において、 /usr/pkg (あるいは LOCALBASE で設定された場所) にパッケージをインストールしたりアンインストールしたりするので、 構築中は、どのパッケージも必要ない (アンインストールされても困らない) ようにしておいてください。

7.2. バルクビルドに必要なもの

完全なバルクビルドには、大量のディスク容量が必要です。 ディスクスペースの一部は読み取り専用でもかまいませんが、 書き込みが必要なものもあります。 ディスクスペースの一部はリモートファイルシステム (NFS など) でもかまいませんが、 ローカルとしたほうがよいものもあります。 ディスクスペースの一部は一時ファイルシステムでもかまいませんが、 突然リブートしても平気な (恒久的な) ファイルシステムが必要なものもあります。

  • 10 GB: distfile 用 (要読み書き、リモート可、一時可)

  • 10 GB: バイナリーパッケージ用 (要読み書き、リモート可、要恒久)

  • 400 MB: pkgsrc ツリー用 (読み取り専用可、リモート可、要恒久)

  • 5 GB: LOCALBASE 用 (要読み書き、ローカル推奨、pbulk では一時可、旧形式では要恒久)

  • 5 GB: ログファイル用 (要読み書き、リモート可、要恒久ファイルシステム)

  • 5 GB: 一時ファイル用 (要読み書き、ローカル推奨、一時ファイルシステム可)

7.3. 旧方式のバルクビルドを実行する

Note

バルクビルドには、二つの方式があります。 旧方式のバルクビルドと、新方式の pbulk です。 後者の方式をおすすめします。

7.3.1. 設定

7.3.1.1. build.conf

build.conf ファイルは、 バルクビルドの主たる設定ファイルです。pkgsrc ツリーを最新に保つ方法、 distfile のダウンロード方法、パッケージの構築方法や、 報告の作成方法を設定することができます。註釈つきの設定例が pkgsrc/mk/bulk/build.conf-example にあります。 これを使うには、build.conf-examplebuild.conf にコピーし、 このファイル中のコメントに従って編集します。

7.3.1.2. 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_CHECKno に設定するとよいでしょう。

  • 読み出し専用の pkgsrc ツリーを使ってバルクビルドをする場合は、 ログファイルが作られるディレクトリーとして BULKFILESDIR を設定する必要があります。そうしないと、 pkgsrc ディレクトリー内にログファイルが作られます。

  • このほか、重要な変数として BULK_PREREQ があります。 これは、他のパッケージを構築する際には常に使える状態になっているべきパッケージを 並べたリストです。

その他、いくつかのオプションが、 pkgsrc の基盤内に散在しています。

  • ALLOW_VULNERABLE_PACKAGESyes に設定するようにします。 バルクビルドの目的はバイナリーパッケージを作ることであり、 脆弱性の有無は重要ではありません。 この変数を設定しておかないと、バルクビルドにおいて、 脆弱性のあるパッケージを構築しようとしなくなるため、 構築でエラーがあっても検出できなくなってしまいます。

  • CHECK_FILES (pkgsrc/mk/check/check-files.mk) を yes に設定すると、インストールされた一連のファイルが PLIST と一致することを確認することができます。

  • CHECK_INTERPRETER (pkgsrc/mk/check/check-interpreter.mk) を yes に設定すると、インストールされた #! で始まるスクリプトが、 指定されたインタープリターを見つけられることを確認することができます。

  • PKGSRC_RUN_TESTyes に設定して、 各パッケージのインストール前に自己診断を実行することができます。 なお、パッケージのなかには良質の乱数を大量に使うものがあるので、 バルクビルドを実行しているマシンが、 完全なアイドル状態にはならないようにする必要があります。 さもないと、一部の診断プログラムが、 新しい乱数データが使えるようになるのを待つ間、 ハングしているかのように見えるようになります。

7.3.1.3. pre-build.local

バルクビルドでは、ビルド前の段階の最後に、サイト独自の作業を行なうよう設定 することができます。/usr/pkgsrc/mk/bulkpre-build.localファイルがあると、ビ ルド前の段階の最後に、このファイルが(sh(1)スクリプトとして)実行されます。 pre-build.localの使い方の例としては、このファイルに

echo "I do not have enough disk space to build this pig." \
	> misc/openoffice/$BROKENF

のような内容を書いておいて、3 GB近くのディスク容量が必要な個々のパッケージ の構築をしないようにする、というものがあります。

7.3.2. ほか、環境に関する考察

/usr/pkgはバルクビルド開始時に完全に削除されるので、ログインシェルが別の場 所にあることを確認してください。ログインシェルを/usr/local/binに移して(それ に合わせて passwd ファイルも修正して)おくか、/etc/rc.localpkg_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でログインできなくなります。警告しておきましたよ! :)

7.3.3. 操作

すでにインストールされているどのパッケージも必要ない状態にしてください。

Warning

バルクビルドの過程で、すべてのパッケージ、 設定ファイルと、さらに、 /var, /home その他の場所にあるファイルがいくつか削除されます。 なので、システムに悪影響を与えるおそれのある権限で、 バルクビルドを実行しないでください。

その他、 構築の妨げになりうるもの(/usr/localにインストールされているライブラリーなど) もすべて削除しておいてください。root になって、以下のようにタイプします:

# cd /usr/pkgsrc
# sh mk/bulk/build
      

何らかの理由で前回の構築が完了していない場合(電源断、システムパニックなど) は、以下を実行すると、その続きをすることができます:

# sh mk/bulk/build restart

バルクビルドが終わると、その要約がメールで届きます。また、build.conf ファイルのFTPで指定したディレクトリーに、構築ログがあります。

7.3.4. 何を実行するのか

バルクビルドは三つの段階からなります:

1. ビルド前

スクリプトがpkgsrcツリーを(anon)cvsで更新します。そして、壊れている distfileをすべて一掃し、インストールされているパッケージをすべて削 除します。

2. バルクビルド

これは基本的に、 make bulk-packageを、パッケージの構築順 序を最適化しておこなうものです。他のパッケージに依存しないパッケー ジが最初に構築され、多くの依存関係を持つパッケージは後に構築されま す。

3. ビルド後

報告を作成し、build.confで指定されたディレクトリーに broken.html という名前で置きます。あわせて、この報告の簡略版が 構築管理者にメールで送られます。

構築中、壊れているパッケージの一覧が/usr/pkgsrc/.broken (OBJMACHINE が設定されている場合は .../.broken.${MACHINE}) に作られ、構築が壊れているものの個々の 構築ログは、各パッケージのディレクトリーに置かれます。これらのファイルは、 壊れているパッケージを再度構築しようとするような無駄をなくすために、bulk-ター ゲットが構築が壊れていることを記録するのに使われます。また、壊れているパッ ケージを後でデバッグするためにも使えます。

7.3.5. 必要なディスク容量

現在、 NetBSD 2.0/i386 ではおおむね以下の容量が必要です:

  • 10 GB - distfile (NFSでも可)

  • 8 GB - 全バイナリー一式 (NFSでも可)

  • 5 GB - コンパイル用の一時領域 (ローカルディスクを推奨)

各パッケージは、バイナリーパッケージ作成直後にアンインストールされた上、 ソースも削除されます。このため、莫大なディスク容量は必要ありません。後 になって、このパッケージがまた必要となった場合は、再度構築することなく pkg_add(1) でインストールされるので、 無駄な再コンパイルの繰り返しは発生しません。

7.3.6. chroot構築用の砂場を用意する

バルクビルドによってパッケージを全部消される(マシンがパッケージのコンパイル 以外に無用なものになってしまう)のが嫌な場合は、chroot環境下でパッケージをバ ルクビルドすることもできます。

最初にすることは、chrootされた砂場を、 たとえば/usr/sandboxに用意することです。 これは null マウントを使って、または手動でおこなうことができます。

pkgsrc/mk/bulk/mksandbox というシェルスクリプトがあり、 null マウントを使った砂場の環境を用意してくれます。このスクリプトは、 砂場の環境のルートに sandbox というスクリプトも作ります。 これは、sandbox mount コマンドで null マウントをした状態にしたり、 sandbox umount コマンドでアンマウントした状態にしたりすることができるものです。

砂場の環境を手動で用意するには、 NetBSDのインストール配布物をすべて展開するか、/usr/src/etcmake distribution DESTDIR=/usr/sandboxを実行した後、以下のものを用意して 適切に設定された状態にします。

  1. カーネル

    # cp /netbsd /usr/sandbox
  2. /dev/*

    # cd /usr/sandbox/dev ; sh MAKEDEV all
  3. /etc/resolv.conf (security/smtpdおよびメール用):

    # cp /etc/resolv.conf /usr/sandbox/etc
  4. 動作する(!)ようなメールの設定 (hostname, sendmail.cf):

    # cp /etc/mail/sendmail.cf /usr/sandbox/etc/mail
  5. /etc/localtime (security/smtpd用):

    # ln -sf /usr/share/zoneinfo/UTC /usr/sandbox/etc/localtime
  6. /usr/src (たとえば sysutils/aperture 用のシステムソース):

    # ln -s ../disk1/cvs .
    	  # ln -s cvs/src-2.0 src
  7. /var/db/pkgを作成する(デフォルトのインストールには含まれません):

    # mkdir /usr/sandbox/var/db/pkg
  8. /usr/pkgを作成する(デフォルトのインストールには含まれません):

    # mkdir /usr/sandbox/usr/pkg
  9. cvs を使って、/usr/sandbox/usr/pkgsrc 内にpkgsrcをチェックアウトする:

    # cd /usr/sandbox/usr
    # cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -d -P pkgsrc
    	  

    この pkgsrc ツリーを、開発用の pkgsrc ツリーにマウントしたりリンクしたりしてはいけません。 そういうことをすると問題を起こしがちだからです。

  10. /usr/sandbox/usr/pkgsrc/packages.../distfiles が、適切な場所を指すようにする。 これらは NFS や nullfs でマウントしておくと便利かもしれません。

  11. mk.conf を編集する。Section 7.3.1.2, “mk.conf参照。

  12. mk/bulk/build.confを必要に合わせて調整する。

chroot砂場の用意ができれば、 以下の手順で構築を開始できます:

# cd /usr/sandbox/usr/pkgsrc
# sh mk/bulk/do-sandbox-build
      

このコマンドは、砂場内に移動して、構築を開始するものです。構築が終わ ると、構築の結果がメールで送信されます。できあがったバイナリーパッケージは、 /usr/sandbox/usr/pkgsrc/packages (の指す/マウントされた先/元)に置かれます。

7.3.7. パッケージを部分的に構築する

pkgsrc/mk/bulk/build スクリプトは、 pkgsrc の全パッケージの一式の構築のほか、 pkgsrc に含まれるパッケージの部分集合の構築にも使うことができます。 mk.confSPECIFIC_PKGS を定義すると、

  • SITE_SPECIFIC_PKGS

  • HOST_SPECIFIC_PKGS

  • GROUP_SPECIFIC_PKGS

  • USER_SPECIFIC_PKGS

の各変数で構築対象のパッケージを定義できるようになります。 構築対象として定義されたパッケージの依存関係によって必要となるパッケージも、 バルクビルドのコードが構築対象に追加します。

この使い方のひとつに、 サイトで必要なバイナリーパッケージをすべて用意するために、 SPECIFIC_PKGS を使ったバルクビルドを chroot 環境で定期的に実行するというものがあります。 こうすれば、不要なパッケージまで構築するような余計な負荷はかかりません。

7.3.8. バルクビルドの成果をアップロードする

本節では、pkgsrc 開発者がバルクビルドで構築したバイナリーパッケージを ftp.NetBSD.org へアップロードする方法を説明します。

アップロードしようとしているバイナリーパッケージの チェックサムファイルを自動生成したい場合は、 mk/bulk/build.confMKSUMS=yes を忘れずに設定してください。

チェックサムファイルに PGP 署名をしたい場合 (そうすることを強くおすすめします)は、 mk/bulk/build.confSIGN_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
      

7.4. pbulk 方式のバルクビルドを実行する

pbulk 方式のバルクビルドの実行の概要は、以下のとおりです。

  • 最初に、まっさらな pkgsrc ツリー内で pbulk 基盤を構築する。

  • 次に、この pbulk 基盤を使って、まっさらの pkgsrc ディレクトリーから個々のパッケージを構築する。

7.4.1. 事前準備

最初に、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 にいかなる変更も加わらないようにするため

  • DISTDIR=/distfiles, ダウンロードされた distfile (pbluk 基盤および構築するパッケージ用) を、すべて、ただひとつのデイレクトリーに置くようにするため

  • ACCEPTABLE_LICENSES+=..., 普及しているフリー/オープンソースライセンスのうち許容できるものを追加するため

  • SKIP_LICENSE_CHECK=yes, ライセンスの検査を省略するため

これで、pbulk 基盤の残りの部分を構築する準備ができました。

$ cd pkgtools/pbulk
$ /usr/pbulk/bin/bmake install
$ rm -rf /tmp/pbulk-outer

これで、pbulk 基盤が構築・インストールされました。この基盤を設定したうえで、さらなる準備が必要です。そうした後に、実際のバルクビルドを始めることができるようになります。

7.4.2. 設定

TODO; さらなる情報は pkgsrc/doc/HOWTO-pbulk をご覧ください。

TODO: つづきを書く

7.5. CD-ROM複数枚に収めたパッケージコレクションの作成

pkgsrcのバルクビルド完了後、できあがったバイナリーパッケージからCD-ROMを作っ て、他のマシンへのインストール用に使うことができます。 pkgtools/cdpackパッケージに、そのようなISO 9660イメージ作成用の簡単 なツールがあります。cdpackは、依存関係が一枚のCD内で完結するように、パッ ケージを複数枚のCD-ROMに編集してくれます。

7.5.1. cdpackの使用例

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が含まれるようになります。