mksandbox環境でpkgsrcをビルドする

以前はcurrentを更新した後はpkgを一旦全部消してスクリプトで必要なものをビルドするという運用をしていたけど、それだと数日マシンが使えないのでpkgtools/mksandboxで必要なパッケージを作成してしまおうという試み。

手元の環境はこんな感じ。見てのとおりpkgsrcやsrcを/home配下に構築していたので、ビルドも一般ユーザー権限で回せるように少々こねくり回す羽目になったけど、たぶんこれroot権限でブン回すんなら不要そうな気がする。そもそもmksandbox自体がroot前提なのかも。

  • pkgsrc は /home/oreore/pkgsrc
  • src は /home/oreore/work/netbsd/src
  • xsrc はナシ
  • sandbox作成先ディレクトリは /home/oreore/sbox

まずはmksandboxでsboxディレクトリを作成する。なお何故かsbox/etcの作成でしばらく止まったと思ったらエラーが盛大に出る。メッセージを見るにどうもディレクトリがループしているようだが何のことかはわからん。このPC固有の問題? (追記)作成先ディレクトリの指定の仕方に問題があった。詳細は mksandboxで/etcをコピーできなかった問題 - steletoのブログ を参照。(追記ここまで)

$ sudo mksandbox --pkgsrc=/home/oreore/pkgsrc --src=/home/oreore/work/netbsd/src --without-xsrc sbox

WARNING: LOCALPATCHES directory does not exist - ignoring
Copying the kernel
Checking package hierarchy in /usr/pkg and package database in /var/db/pkg exist
Make and populate sbox/dev
Make and populate sbox/etc
pax: Cannot create sbox/etc/./sbox/etc/sbox/etc/(以下延々とsbox/etc/を繰り返す)/sbox/etc/hoge (File name too long)
(...略...)
Make empty dirs upon which to mount the null mounts
Making /tmp in sbox
Making /var/games in sbox
(...略...)
Mount /home/oreore/pkgsrc from sbox
Mounting /home/oreore/pkgsrc/packages and /home/oreore/pkgsrc/distfiles from sbox
Sandbox creation is now complete

ということでよくわからんエラーのせいでsbox/etcディレクトリ下がほぼ空っぽなので、cpで全部コピー。やっぱり同じようなエラーメッセージは出るけどコピーできてるから気にしない。

$ sudo cp -rf /etc/* sbox/etc/

一般ユーザーでビルドさせるとinstallでsu → /rootが無いのでエラー、というオチになるようなので /root を作成。

$ sudo mkdir sbox/root

自前のpkgsrcビルドスクリプトが /home/oreore/work にあるので、sandbox環境から見えるようにnullfsでmount。

$ mkdir /home/oreore/sbox/home/oreore/work
$ sudo mount -t null /home/oreore/work /home/star/sbox/home/oreore/work

これで作成したsandbox環境のmount/umountは/home/oreore/sbox/sandboxに引数でmount / umount を渡す。mksandboxで作成と同時にmountされるので特に理由がなければ気にしなくて良い。

$ sudo sbox/sandbox mount 
$ sudo sbox/sandbox umount

sandbox環境に入るには引数にchrootを渡す。chrootした時点ではrootになっているのでoreoreにスイッチ。

$ sudo sbox/sandbox chroot
# su oreore

後は普通にビルド。

なお、ほとんどnullfsで構成されたchrootとはいえやっぱりそれなりにディスク容量は消費する。というか足りないのでビルドのたびにmake clean-dependsしたり distfiles を消したり packages をサーバーにscpで移動させたりと涙ぐましいことをせざるを得なくなってたりする。