(2014/11/24追記: 10.0-RELEASE以降の環境については 新しい記事を参照)
表題の環境でJailを作ってみる。
VIMAGEというのは、Jailにその親とは独立したネットワーク環境を持たせる方法。これがないときには、親がSSHサーバを立ち上げているとJail環境でもSSHサーバを立ち上げるのにいろいろ手間がかかるなどしたらしい。
昔はezjailとVIMAGEを共存させるのがえらく大変だったらしいが、9.2-R時点ではうまく共存がはかられていて、システムファイルにパッチを当てたりする必要はなくなった。
まずは参考文献から。
このへんをぐるぐる見回ったり、最新バージョンの状況に合わせたり。
カーネルコンフィグ
options VIMAGE options NULLFS
NULLFSは、後述のportsディレクトリの使用に必要。
ネットワークの下準備
親マシンの/etc/rc.confで以下の記述を行う。
cloned_interfaces="bridge0" ifconfig_bridge0_name="vswitch0" ifconfig_vswitch0="addm bge0"
bge0は各自のインターフェースの名前に。
ここで再起動して設定を有効にしておく。
ezjailでベースJailを作成
portsからezjailをインストール。
私はZFSを使っているので、/usr/local/etc/ezjail.conf を以下のように書き換え。
--- ezjail.conf.sample 2013-04-16 11:26:48.000000000 +0900 +++ ezjail.conf 2013-10-04 18:49:33.213786353 +0900 @@ -49,14 +49,14 @@ # ZFS options # Setting this to YES will start to manage the basejail and newjail in ZFS -# ezjail_use_zfs="YES" +ezjail_use_zfs="YES" # Setting this to YES will manage ALL new jails in their own zfs -# ezjail_use_zfs_for_jails="YES" +ezjail_use_zfs_for_jails="YES" # The name of the ZFS ezjail should create jails on, it will be mounted at the ezjail_jaildir -# ezjail_jailzfs="tank/ezjail" +ezjail_jailzfs="raidtank/usr/jails" # ADVANCED, be very careful! # ezjail_zfs_properties="-o compression=lzjb -o atime=off" # ezjail_zfs_jail_properties="-o dedup=on"
次に全JailのベースとなるJailを作成する。ZFSだとスナップショットなどなどを使って、ベース部分を共用するようにしてくれる。
私は直前に9.2-RELEASEをソースからインストールしていたので、その成果物を使うコマンドがこちら。
# ezjail-admin setup -i
これでベースJailの作成は完了。
あと1つ作業を。ports用の領域を作る。ここも共用される。(ワークディレクトリは各々のJailに必要。後述)
# ezjail-admin update -P
個別のJailの作成
続いて個別のJailの作成に入る。今回はtest01という、apacheの動作検証を行うJailを作成することにする。
今回はezjailではまだサポートされていないVIMAGEを使うので、少し手間がかかる。
まずJailの作成。
# ezjail-admin create test01 0.0.0.0
IPアドレスに0.0.0.0を渡しているのは、VIMAGEだと違う方法で渡すからである。
さて、個別のJailの設定ファイルは /usr/local/etc/ezjail/ にできる。今回の場合にはtest01というファイルが出来ているはずである。
このファイルを編集する。
--- test01.orig 2013-10-08 22:21:10.148635580 +0900 +++ test01 2013-10-04 20:39:28.905690077 +0900 @@ -7,7 +7,6 @@ # export jail_test01_hostname="test01" -export jail_test01_ip="0.0.0.0" export jail_test01_rootdir="/usr/jails/test01" export jail_test01_exec_start="/bin/sh /etc/rc" export jail_test01_exec_stop="" @@ -27,3 +26,10 @@ export jail_test01_parentzfs="raidtank/usr/jails" export jail_test01_parameters="" export jail_test01_post_start_script="" + +export jail_test01_exec_prestart0="ifconfig epair1 create up" +export jail_test01_exec_prestart1="ifconfig vswitch0 addm epair1a" +export jail_test01_exec_poststart0="ifconfig epair1b vnet test01" +export jail_test01_exec_poststart1="jexec test01 /sbin/ifconfig epair1b 192.168.0.101/24" +export jail_test01_exec_poststart2="jexec test01 /sbin/route add default 192.168.0.1" +export jail_test01_exec_poststop0="ifconfig epair1a destroy"
最初の削除は、VIMAGEではこの方法でIPアドレスを渡さないため。
2番目の追加は、ここでネットワークの設定をするためである。test01(変数名の中も)は各自のJailの名前に置き換えること。
prestart, poststart, poststopに指定した各コマンドは、親マシンで実行される。なので、Jailで実行したいコマンドを書くにはpoststart1のようにjexecコマンドを介すこと。
親マシンの/etc/rc.confに以下の記述を追加する。
ezjail_enable="YES" jail_parameters="vnet=new"
1行目は言わずもがな。2行目は、VIMAGEの使用を/etc/rc.d/jail に伝えるためにある。
それではJailを起動しよう。
# /usr/local/etc/rc.d/ezjail start
うまく起動したかjlsで確認。
# jls JID IP Address Hostname Path 1 - test01 /usr/jails/test01
このように出てくれば成功。
Jail仮想マシンの設定
Jailマシンにログインして設定を行う。
# jexec 1 /bin/sh #
2つめの「#」はJailマシンのプロンプトだ。後は普通にFreeBSDの設定をするようにすればいい。とりあえずrootのパスワードを。
なお、/etc/resolv.confは手動で設定する必要がある。domainとnameserverと、あとはお好みで。