FreeBSD jail+vnetと戯れた話
Nov 29, 2015
Masaru OKI @masaru0714
やりたいこと
下記をやるのに3台もマシンを用意したくないので、コンテナ仮想化でできないか?
ホスト ホスト
テスト対象
ソフトウェアスイッチ
172.21.0.1/24 172.21.0.2/24
pingで往復するかのテストを実行したい
動く?
Linuxだったらこんな感じ(network namespaceを使う)
sudo ip link add type veth を2回 (2ペア作る)
sudo ip netns add NET0; sudo ip netns add NET1
sudo ip link set netns NET0 veth1; sudo ip link set netns NET1 veth3
veth0とveth2を使う設定でスイッチを起動
sudo ip netns exec NET0 ip addr add ..等でveth1, veth3を設定
sudo ip netns exec NET0 ping 172.21.0.2
FreeBSDだったらjailだろう!
昔からあるし、なんて話も聞いていたので、きっと楽勝に違いない。
ちゃちゃっとやってみようと思った。
このあと試行錯誤のダラダラが長く続くので、興味ない方は最後まとめ見てください
さっそくjailを作ってみる。
検索して出てきたやり方で作ってみる。10.1-RELEASE(-p)だしきっと動くだろう。
mkdir $HOME/testjail
sudo jail -c vnet name=testjail host.hostname=testjail path=$HOME/testjail persist
vnetなんて知らねえよと怒られましたorz
jlsしてみても、たしかに作られてなかった。うーん?
vnetどうやったら使えるようになる?
検索してみた。
「options VIMAGEをつけてカーネルをリビルド」
お、おう。
まだ不安定なのでGENERICカーネルでは無効とのこと。なるほどねー。
FreeBSDカーネルのリビルド
freebsd-updateかけてるから10.1-RELEASE-p26って出てるんだけど、
これのソースってどこ? あるの? ないの?
わからなかったし調べる時間もかけたくなかったので stable/10のソースを使う。
sys拾ってkernel config書いて、config JAILKERNELして、make depend
MK_なんちゃらがないとか怒られました。
無視してkernelだけビルドして入れ替えたらカーネルモジュール読めずにコケる。
バージョンチェックしているらしい。
あきらめて全ソース拾ってmake buildkernel実行。
たぶんsysの他はMakefileとrelease, share/mkがあればよかったのだと思う。未確認。
カーネル再構築できたし、やってみよう!
sudo jail -c vnet host.hostname=testjail path=$HOME/testjail persist
jlsするとちゃんとできてるのがわかる。よーしネットワークの設定確認しちゃうぞー。
sudo jexec testjail ifconfig
そんなコマンド(ifconfig)はないと怒られましたorz
そりゃそうか。chrootしてるようなものだしなあ。
symlinkだめだろうしhard linkもpath次第ではだめだろうしなあ。コピーするのかな?
手でいちいちコピーとかやってられないなあ。
簡単構築ツールとかないかな
なにをどう用意するか考えるのが面倒で、やってくれるものがないか探してみた。
● ezjail
● qjail
どちらも最初に installを実行して使用準備を整えるとのこと。
やってみた。
base.txzを拾ってるー。しかたないね。
ezjail
sudo ezjail-admin install
sudo ezjail-admin create
sudo ezjail-admin startで起動。
jexecでifconfigしてみたら……あれ、全インタフェース見えてる。
vnet指定がないからか。いったんdeleteして、createかな、指定の方法は……
なかった。orz
あちこちのファイルを手で編集すればいいらしい。……できるか! (面倒)
qjail
sudo qjail install (UNAME_rとか指定しないとだめでした)
sudo qjail create
sudo qjail startで起動。
jexecでifconfigしてみたら……あれ、全インタフェース見えてる。
vnet指定がないからか。いったんdeleteして、createかな、指定の方法は……
なかった。orz
あちこちのファイルを手で編集すればいいらしい。……できるか! (面倒)
詳しい人によれば
vnetを使うときは素のjailを叩くよー。ツールは使わないよー。とのこと。
手でbase.txz展開するよー。とのこと。
qjailが広げていた/usr/jail/basejail/ の中身をコピーして、jail -cで作って、
jexecしてみる。
ifconfigでlo0だけ見えました。
ようやく構築できたよ……!
(ここでいったん力尽きる)
まとめ: FreeBSD + jail + vnetカーネル構築
svn checkout svn://svn.freebsd.org/base/stable/10
cat > 10/sys/amd64/confJAILKERNEL <<EOF
include GENERIC
ident JAILKERNEL
options VIMAGE
EOF
cd 10
sudo make buildkernel KERNCONF=JAILKERNEL
sudo make installkernel KERNCON=JAILKERNEL
sudo shutdown -r now
まとめ: FreeBSD + jail + vnet jail環境構築
ftp ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.1-RELEASE/base.txz
mkdir testjail
xz -dc /base.txz | tar xf - -C ./testjail
jail -c vnet name=testjail host.hostname=testjail path=`pwd`/testjail persist
jailとホストをつなぐにはifconfig epair0 createしてifconfig epair0a vnet testjail
以降はjexec testjail ifconfig epair0aなどできるようになる。ホスト側はepair0b
もちろんa, b逆でも構わない。
● 取得元はミラーサイトなどを活用してください(近いところに書き換えてね)
● 取得するソースやバイナリのバージョンは各自環境に合わせてください。
サマリーと雑感
● options VIMAGEつきのカーネルをリビルド。ソース持ってきてコンパイル。
カーネルモジュールも作らないとダメなので注意。
● 必要なバイナリをjailのディレクトリに置かないと当然実行できないので注意。
● ezjailやqjailだとvnetつきjailを作るのにあちこち設定ファイルをいじらないとダメ
● ふつうにjail -c vnetするのがオススメ
感想: ハードル高いので素人にはお勧めできない
不安定っていうしねー、コンテナ仮想化やりたかったら素直にLinux使いましょう
FreeBSDでテストする方法の模索だったので使いますが、これ何度もやりたくないなあ
おまけ: 他のBSDでは?
NetBSD
● network namespaceとかjailとかない
● rump (libcの関数エントリを横取してカーネルの機能をライブラリで実現) 使う感じ
● これはこれで要調査
OpenBSD
● routing tableを複数持てるのは知ってるけど……
その他のBSDはベースのOSに準拠、かな?

FreeBSD jail+vnetと戯れた話