mksandboxで/etcをコピーできなかった問題

前回こんなこと言ってたけど、理由がわかった。

なお何故かsbox/etcの作成でしばらく止まったと思ったらエラーが盛大に出る。メッセージを見るにどうもディレクトリがループしているようだが何のことかはわからん。このPC固有の問題?

mksandbox環境でpkgsrcをビルドする - steletoのブログ

結論から言ってしまうと、「mksandboxで指定する作成先ディレクトリは 絶対パス でなければならない 」というもの。

mksandboxでは/etcをコピーするとき、次の行を実行する。

*)      (cd /etc; $paxprog -rwpe . $sandbox/etc) ;;

このとき作成先ディレクトリ($sandbox)が前回のように相対パス "sbox" のみ与えられた場合、paxのコピー元とコピー先はこう解釈される。

  • コピー元: . (= /etc)
  • コピー先: sbox/etc (= /etc/sbox/etc)

元々意図していたコピー先は /home/oreore/sbox/etc だったつもりであっても、実際は全然関係ない /etc/sbox/etc になる。それどころかコピー先がコピー元に含まれるということで、結果 /etc/sbox/etc/sbox/etc/sbox/... と無限ループになる、というオチ。しかもやらかした時点で /etc の下に無限ループしたファイルが作成されてしまうので、このあと cp で手動コピーさせてもパスが深過ぎてコピーできないエラーが発生する、という二段オチまである。

ということで、冒頭で伸べた通り作成先ディレクトリを絶対パス "/home/oreore/sbox" とすると、次のようにエラーも出ず一瞬で作成される。

$ sudo mksandbox --pkgsrc=/home/oreore/pkgsrc --src=/home/oreore/work/netbsd/src --without-xsrc /home/oreore/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 /home/oreore/sbox/dev
Make and populate /home/oreore/sbox/etc
Make empty dirs upon which to mount the null mounts
Making /tmp in /home/oreore/sbox
Making /var/games in /home/oreore/sbox
Making /var/run in /home/oreore/sbox
Making /var/log in /home/oreore/sbox
Making /var/spool/lock in /home/oreore/sbox
Making /var/run/utmp in /home/oreore/sbox
Making /var/run/utmpx in /home/oreore/sbox
Making /var/log/wtmp in /home/oreore/sbox
Making /var/log/wtmpx in /home/oreore/sbox
Making /var/log/lastlog in /home/oreore/sbox
Making /var/log/lastlogx in /home/oreore/sbox
Mount /home/oreore/work/netbsd/src from /home/oreore/sbox
Mount /home/oreore/pkgsrc from /home/oreore/sbox
Mounting /home/oreore/pkgsrc/packages and /home/oreore/pkgsrc/distfiles from /home/oreore/sbox
Sandbox creation is now complete