bhyve を bmd でキメる✨

個人レヴェルでもそこそこ使えるように成ってきた bhyve を、現役を退いたワークマシンを用いて SDG'S の観点から再利用する為の実験をしてみた👏
google 先生で bhyve と尋ねると sysutils/vm-bhyve の使用例がてんこ盛りw
という訳で、内藤さん作の [sysutils/bmd](https://github.com/yuichiro-naito/bmd) で環境構築からのザックリした手順書を書いてみた(うぇい✌)
# 対象者
daemon 使いとして自負の有る人
FreeBSD が大好きな人
# 環境(古)
今回の記事で使用した実環境の仕様か以下の通り
```text:dmesg の抜粋
FreeBSD 14.2-RELEASE-p1 GENERIC amd64
CPU: Intel(R) Xeon(R) CPU E31225 @ 3.10GHz (3093.06-MHz K8-class CPU)
real memory  = 21474836480 (20480 MB)
em0: <Intel(R) Gigabit CT 82574L> port 0x4000-0x401f mem 0xfbee0000-0xfbefffff,0xfbed0000-0xfbed3fff irq 16 at device 0.0 on pci4
em1: <Intel(R) Gigabit CT 82574L> port 0x5000-0x501f mem 0xfbfe0000-0xfbffffff,0xfbfd0000-0xfbfd3fff irq 17 at device 0.0 on pci5
ada0: <VB0250EAVER HPG7> ATA8-ACS SATA 2.x device
ada1: <VB0250EAVER HPG7> ATA8-ACS SATA 2.x device
ada2: <VB0250EAVER HPG7> ATA8-ACS SATA 2.x device
ada3: <VB0250EAVER HPG9> ATA8-ACS SATA 2.x device
```
```text:zfs pool 構成
pool status
  pool: zroot
 state: ONLINE
config:

	NAME	STATE     READ WRITE CKSUM
	zroot       ONLINE       0     0     0
	  raidz2-0  ONLINE       0     0     0
	    ada0p3  ONLINE       0     0     0
	    ada1p3  ONLINE       0     0     0
	    ada2p3  ONLINE       0     0     0
	    ada3p3  ONLINE       0     0     0
```
em0 には管理用としての IPv6 アドレスが割り振ってあり、bhyve の通信用として em1 を使う前提
```text:/etc/rc.conf.local
ifconfig_em0_ipv6="inet6 accept_rtadv"
ifconfig_em1_ipv6="inet6 -ifdisabled up"
```
# インスコ
```cmd:bmd をインスコ
pkg install bmd
```
# 仮想環境の置き場所作るよ
zfs create -V で zfs 上にブロックデバイスを作ってみる
```cmd:とりま 20G 程度の箱を用意
zfs create zroot/bhyve
zfs create -V 20g zroot/bhyve/13-i386
zfs create -V 20g zroot/bhyve/13-amd64
zfs create -V 20g zroot/bhyve/14-i386
zfs create -V 20g zroot/bhyve/14-amd64
zfs create -V 20g zroot/bhyve/15-i386
zfs create -V 20g zroot/bhyve/15-amd64
```
以下のデバイスファイルが出来ていれば桶
```text
/dev/zvol/zroot/bhyve/13-amd64
/dev/zvol/zroot/bhyve/13-i386
/dev/zvol/zroot/bhyve/14-amd64
/dev/zvol/zroot/bhyve/14-i386
/dev/zvol/zroot/bhyve/15-amd64
/dev/zvol/zroot/bhyve/15-i386
```
# インスコ用 iso ファイルを置く
CHECKSUM.SHA256 とか CHECKSUM.SHA512 の確認はご自由に→野良イメージ置き場からの取得は非推奨✌
手元に有る人は適宜、実環境から読み出せる状態にする
ex. nfs で共有するとか cp するとか...
# 置き場の確保
```cmd:置き場所は任意でおｋ
zfs create -omountpoint=/iso zroot/iso
```
```cmd:2025/3/18現在の iso イメージとそのチェックサム在処
cd /iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/13.5/CHECKSUM.SHA256-FreeBSD-13.5-RELEASE-amd64
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/13.5/CHECKSUM.SHA512-FreeBSD-13.5-RELEASE-amd64
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/13.5/FreeBSD-13.5-RELEASE-amd64-bootonly.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/13.5/FreeBSD-13.5-RELEASE-amd64-disc1.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/13.5/FreeBSD-13.5-RELEASE-amd64-dvd1.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/14.2/CHECKSUM.SHA256-FreeBSD-14.2-RELEASE-amd64
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/14.2/CHECKSUM.SHA512-FreeBSD-14.2-RELEASE-amd64
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/14.2/FreeBSD-14.2-RELEASE-amd64-bootonly.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/14.2/FreeBSD-14.2-RELEASE-amd64-disc1.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/14.2/FreeBSD-14.2-RELEASE-amd64-dvd1.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/snapshots/amd64/amd64/ISO-IMAGES/15.0/CHECKSUM.SHA256-FreeBSD-15.0-CURRENT-amd64-20250313-cabf76fde836-275921
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/snapshots/amd64/amd64/ISO-IMAGES/15.0/CHECKSUM.SHA512-FreeBSD-15.0-CURRENT-amd64-20250313-cabf76fde836-275921
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/snapshots/amd64/amd64/ISO-IMAGES/15.0/FreeBSD-15.0-CURRENT-amd64-20250313-cabf76fde836-275921-disc1.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/13.5/CHECKSUM.SHA256-FreeBSD-13.5-RELEASE-i386
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/13.5/CHECKSUM.SHA512-FreeBSD-13.5-RELEASE-i386
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/13.5/FreeBSD-13.5-RELEASE-i386-bootonly.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/13.5/FreeBSD-13.5-RELEASE-i386-disc1.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/13.5/FreeBSD-13.5-RELEASE-i386-dvd1.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/14.2/CHECKSUM.SHA256-FreeBSD-14.2-RELEASE-i386
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/14.2/CHECKSUM.SHA512-FreeBSD-14.2-RELEASE-i386
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/14.2/FreeBSD-14.2-RELEASE-i386-bootonly.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/14.2/FreeBSD-14.2-RELEASE-i386-disc1.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/14.2/FreeBSD-14.2-RELEASE-i386-dvd1.iso
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/snapshots/i386/i386/ISO-IMAGES/15.0/CHECKSUM.SHA256-FreeBSD-15.0-CURRENT-i386-20250313-cabf76fde836-275921
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/snapshots/i386/i386/ISO-IMAGES/15.0/CHECKSUM.SHA512-FreeBSD-15.0-CURRENT-i386-20250313-cabf76fde836-275921
fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/snapshots/i386/i386/ISO-IMAGES/15.0/FreeBSD-15.0-CURRENT-i386-20250313-cabf76fde836-275921-disc1.iso
```
# 今回の選抜隊 iso イメージ群[^注]
```text
/iso/FreeBSD-13.5-RELEASE-amd64-bootonly.iso
/iso/FreeBSD-13.5-RELEASE-i386-bootonly.iso
/iso/FreeBSD-14.2-RELEASE-amd64-bootonly.iso
/iso/FreeBSD-14.2-RELEASE-i386-bootonly.iso
/iso/FreeBSD-15.0-CURRENT-amd64-20250313-cabf76fde836-275921-disc1.iso
/iso/FreeBSD-15.0-CURRENT-i386-20250313-cabf76fde836-275921-disc1.iso
```
# おまじない😋
```cmd
ifconfig bridge0 create addm em1 up
```
再起動で消えない為にも
```config
/etc/rc.conf.local
cloned_interfaces="bridge0"
ifconfig_bridge0="addm em1"
```
daemon 君の起こし方
```config:このワンライナーで /etc/rc.conf に bmd_enable="YES" が追記されるん最近まで気づかなかった
service bmd enable
```
一旦 boot をしないように config を書く
```config:/usr/local/etc/bmd.conf
global {
	cmd_socket_mode = 0660;
	$imgpath = /dev/zvol/zroot/bhyve;
	$isopath = /iso;
}

template default_disk {
	disk = ${imgpath}/${NAME};
}

template graphics {
	graphics = yes;
	graphics_port = $((5900 + ${ID}));
	graphics_res = 1024x768;
	xhci_mouse = yes;
}

template serial {
	comport = auto;
}

template internet {
	network = bridge0;
}

template grub_inspect {
	loader = grub;
	loadcmd = auto;
	installcmd = auto;
}

template key {
    keymap = /usr/share/bhyve/kbdlayout/jp;
}

vm 13-amd64 {
#       boot = yes;
	ncpu = 1;
	memory = 2G;
	iso = ${isopath}/FreeBSD-13.5-RELEASE-amd64-bootonly.iso;
	loader = uefi;
	.apply default_disk, serial, internet, graphics, key;
}

vm 13-i386 {
#       boot = yes;
	ncpu = 1;
	memory = 2G;
	iso = ${isopath}/FreeBSD-13.5-RELEASE-i386-bootonly.iso;
	loader = bhyveload;
	.apply default_disk, serial, internet, graphics, key;
}

vm 14-amd64 {
#       boot = yes;
	ncpu = 1;
	memory = 2G;
	iso = ${isopath}/FreeBSD-14.2-RELEASE-amd64-bootonly.iso;
	loader = uefi;
	.apply default_disk, serial, internet, graphics, key;
}

vm 14-i386 {
#       boot = yes;
	ncpu = 1;
	memory = 2G;
	iso = ${isopath}/FreeBSD-14.2-RELEASE-i386-bootonly.iso;
	loader = bhyveload;
	.apply default_disk, serial, internet, graphics, key;
}

vm 15-amd64 {
#       boot = yes;
	ncpu = 1;
	memory = 2G;
	iso = ${isopath}/FreeBSD-15.0-CURRENT-amd64-20250313-cabf76fde836-275921-disc1.iso;
	loader = uefi;
	.apply default_disk, serial, internet, graphics, key;
}

vm 15-i386 {
#       boot = yes;
	ncpu = 1;
	memory = 2G;
	iso = ${isopath}/FreeBSD-15.0-CURRENT-i386-20250313-cabf76fde836-275921-disc1.iso;
	loader = bhyveload;
	.apply default_disk, serial, internet, graphics, key;
}
#.include "bmd.d/*";
```
# bmd 実行👏
```cmd
service bmd start
```
ここで tap? の仮想 nic が環境分(今回の例だと6つ)出て来ていれば桶
```text
ifconfig | grep "tap[0-9]:"
tap0: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
tap1: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
tap2: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
tap3: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
tap4: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
tap5: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
```
# 仮想環境に OS をインスコ[^注]
```cmd
bmdctl install -c 13-amd64
bmdctl install -c 13-i386
bmdctl install -c 14-amd64
bmdctl install -c 14-i386
bmdctl install -c 15-amd64
bmdctl install -c 15-i386
```
インスコが終わった直後は仮想環境は停止している
```cmd:確認方法
bmdctl list
```
```text
id                name ncpu memory    loader       state       owner
 --- ------------------- ---- ------ --------- -----------  ----------
   0            13-amd64    1     2G      uefi        STOP        root
   1             13-i386    1     2G bhyveload        STOP        root
   2            14-amd64    1     2G      uefi        STOP        root
   3             14-i386    1     2G bhyveload        STOP        root
   4            15-amd64    1     2G      uefi        STOP        root
   5             15-i386    1     2G bhyveload        STOP        root
```

# インスコが整えば自動起動で再起動もスムーズに✌
/usr/local/etc/bmd.conf のファイルでコメントアウトしていた boot = yes; 行のコメントを bmd に認識してもらいましょ
```cmd
service bmd restart
```
裏で daemon 君が淡々と設定ファイルに従って仮想環境を構築してくれる筈🍡
# 活動中👹
```cmd
bmdctl list
```
```text
id                name ncpu memory    loader       state       owner
 --- ------------------- ---- ------ --------- -----------  ----------
   0            13-amd64    1     2G      uefi         RUN        root
   1             13-i386    1     2G bhyveload         RUN        root
   2            14-amd64    1     2G      uefi         RUN        root
   3             14-i386    1     2G bhyveload         RUN        root
   4            15-amd64    1     2G      uefi         RUN        root
   5             15-i386    1     2G bhyveload         RUN        root
```
# OS のインスコが終わったら、個別設定をする
インスコの時点でユーザの追加とか sshd を enable してたら、外から普通に設定すればいいが、ズボラ噛まして後から設定したい我儘な daemon 使いの人はコンソールを実環境から扱う
```cmd
bmdctl console 13-amd64
bmdctl console 13-i386
bmdctl console 14-amd64
bmdctl console 14-i386
bmdctl console 15-amd64
bmdctl console 15-i386
```
各々コマンド入力後は cu -l でシリアルコンソール接続と同じ状況になっているので、
```text
root⏎
パスワード⏎
```
とタイプして root でログイン出来る(筈)
# logout 後に実環境へ戻りたいよね
cu -l の脱出コマンドで華麗に👋出来る
```text
~ Ctrl+D
```
# bmd.conf がミスってたら...
/var/log/daemon.log 見ませう✌
[^注]:執筆現在ではkernelの読み込み時にpanicしてインスコ出来ない🤣