昔書いたエントリの更新版。表題の環境でJailを作ってみる。
(2014/11/26追記)
環境を作ってから間があるので、手順に抜け等あるかもしれない。
後でVMWareを使って追試する予定だが、指摘頂ければ幸いである。
以前の記事では、ezjailを使って作成と起動・終了を行っていたが、今回はezjailを使って作成のみを行い、起動・終了は /etc/rc.d/jail を使う。
カーネルコンフィグ
まだVIMAGEはデフォルトで有効になってないのと、nullfsが必要なので、カーネルの再構築を行う。
options VIMAGE options NULLFS
ネットワークの下準備
親マシンの/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だとスナップショットなどなどを使って、ベース部分を共用するようにしてくれる。
ソースインストールしているのであれば、その成果物を使って作成するコマンドがこちら。
# ezjail-admin setup -i
ports用の領域を作る。ここも共用される。
# ezjail-admin update -P
個別のJailの作成
続いて個別のJailの作成に入る。今回はtest01という、apacheの動作検証を行うJailを作成することにする。
まずJailの作成。
# ezjail-admin create test01 0.0.0.0
さて、10.0-RELEASE以降では、 /etc/rc.d/jail を使ってjail群を設定・起動することができる。設定ファイルは /etc/jail.conf である。
allow.mount; allow.sysvipc; vnet; vnet.interface="epair${if}b"; host.hostname = "${name}.vegalta.org"; path = "/usr/jails/${name}"; exec.clean; exec.system_user = "root"; exec.jail_user = "root"; exec.prestart += "ifconfig epair${if} create > /dev/null"; exec.prestart += "ifconfig epair${if}b ether ${epairbaddr} > /dev/null"; exec.prestart += "ifconfig epair${if}a up > /dev/null"; exec.prestart += "ifconfig bridge0 addm epair${if}a"; exec.start += "/sbin/ifconfig epair${if}b ${ip4addr}/24"; exec.start += "/sbin/route add default 192.168.0.1"; exec.start += "/sbin/ifconfig epair${if}b inet6 accept_rtadv up"; exec.start += "/sbin/rtsol epair${if}b"; exec.start += "/sbin/ifconfig epair${if}b inet6 ${ip6addr} alias"; exec.start += "/sbin/ifconfig epair${if}b inet6 -ifdisabled"; exec.start += "/bin/sh /etc/rc"; exec.stop = ""; exec.poststop += "ifconfig epair${if}a destroy"; exec.consolelog = "/var/log/jail_${name}_console.log"; mount.devfs; mount.fstab = "/etc/fstab.${name}"; mount.fdescfs; mount += "procfs /usr/jails/${name}/proc procfs rw 0 0"; test01 { $if = 1; $ip4addr = 192.168.0.101; $ip6addr = 2001:380:e03:169::101; $epairbaddr = 02:ff:10:10:01:0b; }
(2014/11/26追記)
exec.prestartは親側で、exec.startはjail側で実行されるコマンドである。
同様に、exec.stopはjail側で、exec.poststopは親側で実行されるコマンドである。
$epairbaddrを定義している理由について説明する。
これを定義しないと、epair?bのMACアドレスがOSによって自動的に決められるのだが、このMACアドレスが再利用されてしまう場合があると困るので、明示的に固定のMACアドレスを割り振るようにしている(このあたりの議論は [FreeBSD-users-jp 95357] のhrsさんのメールを参照)
(2014/11/26追記)
Jailごとのfstabを用意する必要がある。
/etc/fstab.test01を作成して以下を記述。
/usr/jails/basejail /usr/jails/test01/basejail nullfs ro 0 0
それではJailを起動しよう。
# /etc/rc.d/jail start test01
うまく起動したかjlsで確認。
# jls JID IP Address Hostname Path 1 - test01 /usr/jails/test01
このように出てくれば成功。
/etc/rc.conf に、jailを自動起動するための設定を書いておく。
jail_sysvipc_allow="YES" jail_enable="YES" jail_list="test01"
Jail仮想マシンの設定
Jailマシンにログインして設定を行う。
# jexec 1 /bin/sh #
2つめの「#」はJailマシンのプロンプトだ。後は普通にFreeBSDの設定をするようにすればいい。とりあえずrootのパスワードを。
なお、/etc/resolv.confは手動で設定する必要がある。domainとnameserverと、あとはお好みで。
「FreeBSD 10.1-RELEASE + ezjail + VIMAGE」への1件の返信
[…] (2014/11/24追記: 10.0-RELEASE以降の環境については 新しい記事を参照) […]