はじめに
BHyVeお手軽スクリプトを作って以来、手元ではVMをホイホイ動かしたり止めたりしています。ここではそのBHyVeお手軽スクリプトとZFS環境が製品開発に大変役に立ったという実例を紹介したいと思います。
アプライアンス開発のステップ
製品としてのアプライアンスを作る場合、最終的に出荷イメージを作りハードウェアに展開する形になると思います。出荷イメージの開発作成はこんな流れになると思います。
- OSの基本部分をインストールする
- OSの標準的な追加アプリケーションをインストールする。
- OSの動作に必要な設定を行う。
- アプライアンスに必要なアプリをインストールする
- アプライアンスのアプリの動作設定を行う
- アプライアンスとしての動作試験を行う
- 出荷イメージを作る
各ステップでは、動作確認を行い動作が確認してOKであれば次へ、BADであれば前に戻ってやり直しとなるわけです。
ここで問題となるのは、BADで前のステップに戻る場合です。
コマンドを1個インストールして、その設定ファイルを書き換えた程度であれば、前のステップに戻るのは比較的簡単です。しかしながら複数のコマンドをインストールしていろいろ設定ファイルを書き換えた場合などは、前のステップに戻るのは容易ではありません。とくにPostgreSQLなどのデータベースが関係するような場合、データベースの内容を以前の状態に戻すのは困難な場合もありえます。そこで威力を発揮するのがBHyVeとZFSボリュームの組み合わせです。
BHyVe と ZFSボリューム
BHyVe では、ディスクイメージに ZFSボリューム が利用でき、ZFSでは ZFSボリュームに対してもスナップショットが作成できます。つまり この組み合わせの場合、BHyVeで動いているVMの状態をZFSのスナップショットで簡単に保存できることになります。
具体的には前述の各ステップで、動作確認を行った段階で一旦VMをシャットダウンして スナップショット を録ります。こうすることで、次のステップを試し、うまくいかなくて以前の状態に戻すのは、直前に録ったスナップショットにロールバックすることで簡単に実現できます。
実はBHyVeお手軽スクリプトには当初
- VMNAME-snapshot
- VMNAME-rollback
のコマンドはなく、アプライアンスを開発していて必要になって用意したという経緯があります。
BHyVeお手軽スクリプトとsudoの設定
アプライアンスの場合、開発者が root 権限で次のコマンドが利用できるように、sudo を適切に設定します。
- VMNAME-boot
- VMNAME-console
- VMNAME-rollback
- VMNAME-shutdown
- VMNAME-snapshot
具体的にはこのような設定になっていました。
user-a が VM名 debian0 で開発をする場合の設定例
belgianbeer@host$ cd /usr/local/sbin
belgianbeer@host$ ls -l vm-control debian0*
lrwxr-xr-x 1 root wheel 10 Sep 7 2017 debian0-boot -> vm-control
lrwxr-xr-x 1 root wheel 10 Sep 7 2017 debian0-console -> vm-control
lrwxr-xr-x 1 root wheel 10 Sep 7 2017 debian0-rollback -> vm-control
lrwxr-xr-x 1 root wheel 10 Sep 7 2017 debian0-shutdown -> vm-control
lrwxr-xr-x 1 root wheel 10 Sep 7 2017 debian0-snapshot -> vm-control
-rwxr-xr-x 1 root wheel 72 Sep 7 2017 vm-control
belgianbeer@host$ cat vm-control
#!/bin/sh
export PATH=~belgianbeer/bin/bhyve:$PATH
exec ${0##*/} "$@"
belgianbeer@host$
sudoの設定はこんな感じ
belgianbeer@host$ cat /usr/local/etc/sudoers.d/user-a
user-a ALL=(ALL) NOPASSWD: \
/usr/local/sbin/debian0-boot, \
/usr/local/sbin/debian0-console, \
/usr/local/sbin/debian0-rollback, \
/usr/local/sbin/debian0-shutdown, \
/usr/local/sbin/debian0-snapshot
belgianbeer@host$
これで user-a は、パスワード無で、debian0のVMの起動、停止、スナップショットの作成、ロールバックを自由に行えます。
もちろんあらかじめ設定済みのVMのZFS Volumeがあれば、それをcloneすることで設定済みの続きから作業が行えます。この機能もこのような開発にはとても有効です。
開発者に使わせてみた反応
実際にこの環境を社内の開発者に利用してもらいアプライアンスの開発を行ったところ、ものすごく感動してくれてます。
「これ凄いです!」「便利です!」「効率良いです!」「1日かかる作業がすぐすみます」
そして「FreeBSD使いたいです。勉強したいです。」と言ってくれました。
開発者「FreeBSDの勉強する本ありますか?」
みんみん「そーいうの無いから」 (ボソ)
Merry Christmas and Happy New Year!
皆様、よいお年を!