カテゴリー
FreeBSD PC

FreeBSD 10.1-RELEASE + ezjail + VIMAGE

昔書いたエントリの更新版。表題の環境で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と、あとはお好みで。

Share this...

「FreeBSD 10.1-RELEASE + ezjail + VIMAGE」への1件の返信

コメントは受け付けていません。