FreeBSD6.2Rでjail環境構築中 - ナウいezjailの構築法

http://d.hatena.ne.jp/m-bird/20080118/1200643734の続き。

portsツリーを分けるかどうか。

さて、この後portsツリーを使えるようにする必要があります。
今まで仮想環境を使わずにFreeBSDを使うときは、portsツリーをcvsup等で持ってきていました。
しかし、ezjailで複数台マシンを作る場合、portsツリーがマシンの数だけできてしまい、メンテナンスの手間が増え、HDD容量も無駄になります。
そこで、nullfsを使って、HOST環境のportsツリーをリードオンリーでマウントします。
これにより、

  • host環境のportsツリー一個分のHDD容量だけで済む
  • host環境のportsツリーを更新するだけで、全ての仮想マシンportsツリーが更新される
  • nullfsでリードオンリーなので、「マウントしてるから、host環境に辿られたり…」という心配が無くなります(...多分
しかし。

FreeBSD7.0-currentで/etc/fstabでro(Read-Only)でnullfsなマウントしても、なぜかwriteが立ってるというバグがあったらしいです。
つまり、「jail環境でportsツリーを書き換えたら、マウント元であるhostのportsツリーまで書き換わってしまう」という事です。
これじゃ、hostマシンと完全に隔離したんだってVA!なんて言えませんね。
6.2-Rや6.3-Rでは問題ないですが、jailの公式では

忠実な訳:「またそんなバグあったら危ないから、ホスト環境とjail環境では完璧に環境を分離させた方が良いと思うお。portsツリーもHOST環境とjail環境で分けた方が良いと思うお。」
とあったりします。

多少ディスク容量が無駄になったとしてもhostのツリーと分けようぜ、その方が夜も安心だろ?」という事です。

以上を読んで、
「よし、俺ナウいezjailの構築方法を実行するZE!」
って言う人はこのまま読み進めて下さい。
「危険性は分かったけど、リリースなバージョンではそんなバグ無いだろ?ディスクを少しでも節約したいZE!」という人は次のリンク先へ行ってください。
http://d.hatena.ne.jp/m-bird/20080118/1200643734

jail用のportsツリー構築

ezjailはデフォルトで/basejail/usr/portsをマウントするようになっています。
そこにportsツリー構築してやれば、jail環境でもportsツリーが使えるようになります。

まず以下をチェック
/usr/jails/basejail/usr/ports
/usr/jails/basejail/usr/src

この二つのディレクトリがあるかどうか確認(私はここで詰まりましたorz)。

portsツリーをごっすんごっすん

次に、portsツリーを作っちゃいます。
今回はcvsupを使ってportsツリーを持ってくる場合について書きます。

# cp /usr/share/examples/cvsup/ports /root/jail-ports-supfile

とりあえず、rootのホームディレクトリあたりに、standard-supfileのexampleをコピー。

*default host=CHANGE_THIS.FreeBSD.org
*default base=/var/db
*default prefix=/home/ncvs
*default release=cvs
*default delete use-rel-suffix

上のような感じになっているのを、下のような感じに。

*default host=cvsup3.jp.FreeBSD.org
*default base=/usr/YOUR_JAIL_PATH/jails
*default prefix=/usr/YOUR_JAIL_PATH/jails/basejail/usr

YOUR_JAIL_PATHは、適当にjailsディレクトリへのパスと置き換えてください。

で、実行。

# cvsup /root/jail-ports-supfile

ごっすんごっすんportsツリー構築。
以上で終わり。
後は、時々portsツリーを更新してやらなきゃなりませんが、hostとjailの両方を更新わすれないように、適当なシェルスクリプトでも書いて、常にそれを実行するようにした方が良いと思います。

cvsup /root/ports-supfile
cvsup /root/jail-ports-supfile

とか、適当に。

以上設定が終わったら、いよいよjail環境内の仮想マシンを実行します。
http://d.hatena.ne.jp/m-bird/20080118/1200647446
続きへGO

おまけ。

/jails/flavours/defaultとかありますが、ここのezjail.flavourとかを編集するとezjailを初めて走らせる時にscreenとかvimとかmakeしてもらえます。

cd /usr/ports/sysutils/screen && make install
cd /usr/ports/sysutils/vim && make install
cd /usr/ports/sysutils/sudo && make install

こんな感じで列挙。
ただ、portsからインストールする時みたくportsのconfig画面は出ません。
つまり、デフォルト設定のまんまmakeが走ります。ギャース。
で、打開策としてはWITHOUT_GUI=yes...とか延々と書く。
めどいですか?ええ、めどいです。

で、もう一つの方法としてはhost環境でconfigしてから、そのconfigファイルだけ持ってくる。
たとえば、sudoとかだと

# cd /usr/ports/security/sudo
# make rmconfig
# make config

こんな感じ。
sudoのディレクトリまで行って、make rmconfigで今までのconfigファイルを飛ばす。
んで、make configで設定ファイルを再生成。
一旦configファイルを吹っ飛ばしておかないと、host環境で設定したものと同じものになってしまうので。
hostと同じ設定で良くても、設定見直しを兼ねて再設定した方が無難です。

設定が終わったら、その設定ファイルをコピーしてやります。

# mkdir -p /usr/local/jails/flavours/default/var/db/ports/sudo
# cp /var/db/ports/sudo/options /usr/local/jails/flavours/default/var/db/ports/sudo

これで、make時のオプションが指定できます。
が。
これだけだと、GUIで設定できる分しか設定してやれません。
例えば、WITHOUT_GUI=yesとか、WITHOUT_X11=yesとか。
そうじゃないと、サーバなのにX11とかいう憎き敵がごっすんごっすんmakeされてしまいます。
回避する為に、flavoursディレクトリ以下の/etc/make.confをきちんと書いておきましょう。

で、結論。

flavoursディレクトリに入れるのは、make.confとかresolv.confとか、そういったものだけでよくね?と。
ezjail.flavourの設定をミスってて、途中でmakeが終わってたとしても端末を通して見る事は無理なんですよね。
いつmakeが終わるとも知れないし(ロードアベレージ見てりゃ大体分かりますし、sshで構築中の仮想マシンにログインしちゃえばpsで何makeしてるか分かりますが面倒)。
10個20個作って貸し出しする人でないなら、とりあえずmake.confとかresolv.confとかをfravours以下の/etc/に置いておく、位が丁度いいんでないかなー、と。