続 BHyVe お手軽スクリプト

# BHyVeを簡単に
2年程前に「[BHyVeお手軽スクリプト](https://qiita.com/belgianbeer/items/ee630fd18d435f2b147c)」を紹介したのですが、あのままでは誰も使って無いと思うわけで、もちろん自分でもこれじゃなと思うところが多数ありました(笑)。その後あちこち改良を加え実用的になっているので、改めて現在のプログラムを紹介します。

# 設計思想

BHyVeはとてもプリミティブなコマンドであるため、そのまま使うには辛いのはご存知の通りです。そのためBHyVeを利用するための複数の管理ツールが開発されています。ざっくりportsを探ったらこのあたりが見つかりました。

- bvm
- cbsd
- chyves
- iohyve
- vm-bhyve

これらのツールとここで紹介するものとの一番の違いは、**VMの起動や停止を一般ユーザーがコマンド感覚で行う**ことに主眼を置いていることです。

例えば VM 名が freebsd0 であれば、起動コマンドは

```
$ bin/bhyve/freebsd0-boot
```

起動中のVMを止めるコマンドは

```
$ bin/bhyve/freebsd0-shutdown
```

といった感じで利用します。ぶっちゃけ自分の利用しているサーバーのリソースがそれほど潤沢では無いので、常時VMが動いたままにしたくないというのが元々の意図にあります。

また個人的にはよくある

```
$ コマンド名 VM名 VMへの指定
```
のような形で使うコマンドは、コンプリーションに頼れずミスタイプの元なので、あまり好きでは無いというのもあります。

なお bhyveの起動等にはroot権限が必要ですが、スクリプト内部で必要な部分にsudoを利用しているため、コマンドを利用する場合はroot権限ではなくユーザーの権限で起動できます(もちろんsudoの適切な設定は必要です)。

起動や停止コマンドは各VM毎に独立したコマンドとなるため、sudoを適切に設定すると普段の管理者権限を持たない人でも、VMに関しては起動や停止などが行えます。これについては別の記事で説明します。

# ソースと使い方

ソースについては、GitHub からダウンロードしてください。

- https://github.com/belgianbeer/_bhyve

使い方については、第40回FreeBSDワークショップでの発表スライドをご覧下さい。

- [お手軽BHyVeスクリプトこうなりました](https://docs.google.com/presentation/d/13FuFBqcL_SBt3qbMX5LYciEKdePLlzn5RJpdQnVbEII/edit?usp=sharing)

スライド24の、本コマンドで特徴的なスナップショットとロールバックについて補足しておきます。

```
$ bin/bhyve/freebsdd0-snapshot
NAME               VOLSIZE   USED  REFER
zroot/vm/freebsdd0      10G  4.76G  4.76G

$ bin/bhyve/freebsdd0-snapshot test snap
NAME                                       VOLSIZE   USED  REFER
zroot/vm/freebsdd0                              10G  4.76G  4.76G
zroot/vm/freebsdd0@_201812171509-test_snap        -      0  4.76G
```

このようにスナップショットを作る場合は、引数に空白があっても空白を"_"(アンダースコア)に変換します。また必ず日時を前に加えるため、いつ作ったスナップショットなのかが一目瞭然です。

またロールバックについては、次のように2つのスナップショットがあって、

```
$ bin/bhyve/freebsd0-snapshot
NAME                                       VOLSIZE   USED  REFER
zroot/vm/freebsd0                              10G  4.87G  4.83G
zroot/vm/freebsd0@_201812171509-test_snap        -      0  4.76G
zroot/vm/freebsd0@_201812191115-snap2            -      0  4.76G
```

ロールバックを実行すると

```
$ bin/bhyve/freebsd0-rollback
```

最新のスナップショットである「zroot/vm/freebsd0@_201812191115-snap2」の時点にロールバックします。またロールバックの引数は ZFSでいうスナップショット名をフルに指定するのではなく「@」の右側の部分だけを指定します。これは[Tera Term](https://ja.osdn.net/projects/ttssh2/)や[iTerm2](https://iterm2.com/)で表示されている文字列をマウス操作でコピーする際、デフォルトの設定のままではダブルクリックでは「@」は区切りとなるので操作性の配慮からです。

```
$ bin/bhyve/freebsd0-snapshot
NAME                                       VOLSIZE   USED  REFER
zroot/vm/freebsd0                              10G  4.77G  4.76G
zroot/vm/freebsd0@_201812171509-test_snap        -      0  4.76G
zroot/vm/freebsd0@_201812191115-snap2            -      0  4.76G

$ bin/bhyve/freebsd0-rollback _201812171509-test_snap

$ bin/bhyve/freebsd0-snapshot
NAME                                       VOLSIZE   USED  REFER
zroot/vm/freebsd0                              10G  4.76G  4.76G
zroot/vm/freebsd0@_201812171509-test_snap        -     1K  4.76G
```

この例のようにロールバックでは、指定したスナップショットの時点までロールバックし、それより新しいスナップショットはまとめて削除されます。

# 動いているVM一覧を確認する

本スクリプトだけでは動いているVM一覧を確認するコマンドが無いので、自分では次のシェルスクリプトを使っています。

```
#!/bin/sh

__get_mem_and_cpu () {
        (
                eval $(~/bin/bhyve/$1-resources)
                echo $cpu $mem
        )
}

pgrep -fl bhyve: |
while read pid dummy vm
do
        printf '%-5d  %-10s  %d  %s\n' ${pid} ${vm} $(__get_mem_and_cpu ${vm})
done | sort +1
```

実行例は次の通り

```
$ running-bhyves
66004  freebsd0    2  256m
57763  debian0     2  512m
25058  ubuntu0     2  256m
$ 
```

表示結果は、PID、VM名、CPU数、割り当てメモリサイズの順になります。

# おわりに

自分で使うものでも1年以上改良を加えると、それなりに使えるものになりますね。当たり前ですけど。