BHyVe hackathon やってきました

この土日、埼玉県某所でBHyVe Hackathon が開催されました。

BHyVe ? という方はこちらをご覧ください
http://www.slideshare.net/AsadaTakuya/bhyve


このスライド書いた id:syuu1228 に「腕の立つ若いの集めてくれ」って言われたので心当たりに声掛けたら主催者って事になったり。そのわりに重役出勤だったり。

事前の動作検証で VMware Player を使ったNested VMMでの動作を確認していたのでてっきりそれを使うもんだと思って何も準備していかなかったのですが、当日実機を渡されたので、初日は環境を構築するので終わりました。

二日目でのっけに配布されているイメージを起動させることは出来たのですが、とりあえず何をするにしても自前のゲストを動かせないと駄目だよねーと思ってダウンロードしてきたソースツリーからゲスト用カーネルを作ったら何故かこいつがログインプロンプトまでいきません。

あーでもないこーでもないと試行錯誤してるうちにどんどん日が陰ってきてしまい、結局bhyve がどんなものかって弄くってるだけで終わってしまいました。後で聞いたらみんな嵌ったみたいなので、きっとチェックアウトしたバージョンのソースが悪いに違いないとは思ったけれど、時間切れ。

合間合間に、こうやったらどうなるかな?という異常系の操作の話が参加者からポツポツ出てきていたので、その異常系の操作を検証したりもしていました。

たとえば、BHyVeゲストが稼働中に/dev/vmm/{vmname} を削除したら?→ホストがpanic します

とか。

具体的には、以下のコマンドを実行します

 # vmmctl --vm={vmname} --destroy


環境の構築は以下の手順書どおりに作業を行ったのですが

Building BHyVe HOWTO
http://d.hatena.ne.jp/syuu1228/20120625/1340655759

これでダウンロードしてくるゲストイメージには、起動用のシェルスクリプトが同梱されています。手順書の最後に言及されているvmrun.sh ですが、これはまず最初に何も考えずに上記のコマンドを実行します。

echo "Wait until 20 seconds after boot for networking to work"
/usr/sbin/vmmctl --vm=myguest --destroy; /usr/sbin/bhyveload -m 768 -M 2048 -h . myguest && /usr/sbin/bhyve -c 2 -m 768 -M 2048 -g 0 -P -H -s 1,virtio-net,tap0 -s 2,virtio-blk,diskdev myguest && sleep 20 && ifconfig tap0 up

ゲストを終了させてもカーネル内のゲスト定義が残ってて掃除してくれないためにこうしているのだと思いますが、同じ名前のゲストが走っていると、ホストがpanicします。ていうかやりました。てへぺろ

なのでpsで見て同じ名前のゲスト動かしてないかチェックするルーチンを追記しました。
同じ名前のゲストが動いてたら終了します。こんな感じ。
あ、ついでに引数とってその名前でゲスト作るようにもしました。

echo "Wait until 20 seconds after boot for networking to work"
if [ $1 ]; then
 GUEST=$1
else
GUEST="myguest"
fi

RET=`ps ax |grep bhyve|grep $GUEST|grep -v grep|wc -l `

if [ $RET -ne 0 ]; then
echo "$GUEST already run. exiting..."
exit
fi
/usr/sbin/vmmctl --vm=$GUEST --destroy;/usr/sbin/bhyveload -m 768 -M 2048 -h . $GUEST && /usr/sbin/bhyve -c 2 -m 768 -M 2048 -g 0 -P -H -s 1,virtio-net,tap0 -s 2,virtio-blk,diskdev $GUEST && sleep 20 && ifconfig tap0 up

結局成果といえるのはこれだけ。とほほ