FreeBSD 14.0 RELEASE + bhyve で各種 OS を使用する

## 注意事項

**bhyve** を有効化するための手順を追記しました。

以下の二つのパッケージはインストール不要だったので、これに関する記述部分を ~~打ち消し表記~~ 変更しました。
* vm-bhyve
* bhyve-firmware

FreeBSD を再起動したときに tap を有効にするために、**/etc/sysctl.conf** の設定を追記しました。


## はじめに

物理マシンに FreeBSD 14.0 RELASE をインストールした後の　bhyve のインストールと設定および各種 OS のインストール手順を説明します。

FreeBSD のインストールに関しては、[Chapter 2. Installing FreeBSD](https://docs.freebsd.org/en/books/handbook/bsdinstall/) や [Share FreeBSD based information の install FreeBSD](https://freebsd.seirios.org/doku.php?id=install) などを参考にしてください。

なお、本記事ではデスクトップ環境は使用しないので、X Window System をインストールしていなくても各種 OS を使用することができます。
* 当然のことながら、bhyve を使用してインストールする各種 OS もデスクトップ環境は使用できません。
* 各種 OS 上でデスクトップ環境を使用する場合には、FreeBSD にもデスクトップ環境をインストールしなければなりませんが、本記事ではデスクトップ環境は扱いません。

## bhyve とは
bhyve とは、FreeBSD をホスト OS とするハイパーバイザーのことです。
VMware Player や Oracle VM VirtualBox と同じような仮想マシン環境と考えていただければ良いと思います。


## 使用するマシンの仕様

MOUSE COMPUTER の LUV MACHINES iH700XN という PC に FreeBSD をインストールしました。
* CPU: Core i7-8700 (6 cores, 12 threads, 3.20 GHz/ TB: 4.6 GHz)
* Memory: 64 GB (2 GB 以上あれば大丈夫だと思いますが、できれば 4 GB 以上のほうが良いかも知れません)
* HDD: 4 TB (64 GB 以上あれば大丈夫だと思います)

「Memory 2 GB 以上と HDD 64 GB 以上」は、とりあえず仮想マシンを実行するのに最低限必要な容量と考えてください。
複数の仮想マシンを使用する場合には、より多くの Memory と HDD が必要になります。
本記事では HDD を使用していますが、当然 SSD を使用することも可能です。


## CPU の機能

bhyve を使用するには、CPU の機能で Intel Extended Page Tables (EPT) あるいは AMD Rapid Virtulization indexing (PVI) または Nested Page Tables (NPT) が有効になっていなければなりません。
また、Linux あるいは FreeBSD をゲスト OS （仮想マシン上で使用する OS) として使用するには、VMX unrestricted mode support (UG) も必要になります。

これらの機能は、以下のように /var/run/dmesg.boot ファイルの内容を確認します。

Intel CPU の場合:
```
$ egrep '(EPT|UG|VT-x)' /var/run/dmesg.boot
  VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID
```
VT-x に続いて EPT と UG が表示されているので bhyve を使用可能。

AMD CPU の場合:
```
$ grep 'POPCNT' /var/run/dmesg.boot   
Features2=0x7ed8320b<SSE3,PCLMULQDQ,MON,SSSE3,FMA,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AESNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND>
```
Fearures2 に続いて POPCNT が表示されているので bhyve を使用可能。

上記の *grep* コマンドを実行した結果、該当する機能が表示されない場合には、UEFI (あるいは BIOS) の設定で有効にできる場合もあるようなので、そちらを確認してください。


## bhyve の有効化と設定

bhyve の有効化に関しては、[FreeBSD Handbook](https://docs.freebsd.org/en/books/handbook/) の[ 24.6. FreeBSD as a Host with bhyve](https://docs.freebsd.org/en/books/handbook/book/#virtualization-host-bhyve)に記述されています。また　https://wiki.freebsd.org/bhyve に[FAQ](https://wiki.freebsd.org/bhyve#Frequently_Asked_Questions)が掲載されています。

以下に掲載する手順に関しては上記の資料を元に作成しています。

### sudo コマンドと su コマンドの説明

FreeBSD をインストールして再起動を行ったら、スーパーユーザー権限で bhyve のインストールと設定を行います。

su コマンドを使用してスーパーユーザー権限を取得するか、pkg install sudo を実行して sudo コマンドをインストールし、visudo コマンドであなたのユーザーあるいは wheel group が sudo コマンドを実行できるように設定を行った上で sudo COMMAND を実行してください。
- 本記事の実行例は、全て sudo コマンドを使用しています。
- sudo コマンドを使用せずに su コマンドを使用して各種コマンドを実行する場合には、実行例の先頭にある「sudo」を除いて実行してください。

実行例: sudo コマンド:
```
$ sudo pkg install -y vm-bhyve bhyve-firmware
Password:
```
実行例: su コマンド:
```
$ su
Password:
# pkg install -y vm-bhyve bhyve-firmware
```

上記の実行例の vm-bhyve と bhyve-firmware のインストールは必要ありませんでした。なお、sudo コマンドと su コマンドの使用例として、上記の記述は残しておきます。

~~上記の実行例のようにコマンドを実行し、binary package の vm-bhyve と bhyve-firmware をインストールしてください。~~
以降の実行例では、sudo コマンドを使用したもののみを掲載します。

~~上記の pkg install コマンドを実行すると、以下のメッセージが表示されます。~~

```
Message from vm-bhyve-1.5.0:

--
To enable vm-bhyve, please add the following lines to rc.conf,
depending on whether you are using ZFS storage or not. Please note
that the directory or dataset specified should already exist.

    vm_enable="YES"
    vm_dir="zfs:pool/dataset"

OR

    vm_enable="YES"
    vm_dir="/directory/path"

Then run 'vm init'.
```
~~メッセージに従ってディレクトリーを作成し vm init コマンドを実行します。~~

~~上記のメッセージは ZFS あるいは UFS の vm_dir の設定例を表示しています。~~
本記事では、UFS を使用した実行例を示します。
ZFS と UFS に関しては、[ファイルシステムの選び方](https://freebsd.seirios.org/doku.php?id=install:%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9) で解説されています。

vm-bhyve と bhyve-firmwar は必要ないので、以下の実行例
* /work ディレクトリの作成
* /etc/rc.conf への vm_enable と vm_dir の追加

も不要です。が、"^D" の説明として残しておきます。

```
$ sudo mkdir /work
$ sudo sh -c 'cat >> /etc/rc.conf'
vm_enable="YES"
vm_dir="/work"
^D
$ sudo vm init
$ ls -a /work
.               .config         .iso
..              .img            .templates
```
上記の実行例の "^D" は、CTRL キーと D キーを同時に押下します。

~~vm init コマンドを実行すると、上記のように /work 以下に幾つかのディレクトリーが作成されます。以降の実行例では vmrun.sh あるいは bhyve コマンドを使用するので、必ずしも vm init コマンドで作成されるディレクトリーを使用する必要はありません。~~

### bhyve の有効化

以下のコマンドを実行し、bhyve を有効化してください。
```
$ sudo kldload vmm
```

以下の実行例のように **vmm.ko** が表示されれば bhyve が使用可能です。
```
$ kldstat | grep vmm
11    1 0xffffffff82a00000   33e438 vmm.ko
```

FreeBSD を再起動 (shutdown -r) した時に bhyve が有効になるように、**/etc/rc.conf** に以下の設定を追加します。
```
$ sudo sh -c ' cat >> /etc/rc.conf'
kld_list="vmm"
^D
```
### bridge インターフェースの作成

仮想マシン上の OS からハイパーバイザーとして動作している FreeBSD が接続されている LAN にアクセスできるようにするために bridge インターフェースを作成します。
```
$ sudo ifconfig tap0 create
$ sudo sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
$ sudo sh -c 'cat >> /etc/sysctl.conf'
net.link.tap.up_on_open=1
^D
$ sudo ifconfig bridge0 create
$ sudo ifconfig bridge0 addm YOURIF addm tap0
$ sudo ifconfig bridge0 up
```
上記の実行例の **sudo sysctl net.link.tap.up_on_open=1** は、/etc/sysctl.conf ファイルへの設定の追加を行っています。これを忘れると、FreeBSD を再起動 (shutdown -r) した時に、tap インターフェースが正しく動作しなくなります。

上記の YOURIF の部分には、使用している FreeBSD が LAN に接続しているネットワークインターフェースを指定します。実際にどのようなインターフェースが使用されているか確認するには、ifconfig コマンドを使用します。
```
$ ifconfig
em0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=4e504bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,LRO,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6,HWSTATS,MEXTPG>
        ether 00:1b:21:85:39:f7
        inet 192.168.10.116 netmask 0xffffff00 broadcast 192.168.10.255
        inet6 fe80::21b:21ff:fe85:39f7%em0 prefixlen 64 scopeid 0x1
        inet6 2001:f71:4ee0:2100:21b:21ff:fe85:39f7 prefixlen 64 autoconf pltime 300 vltime 300
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
em1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=4e504bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,LRO,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6,HWSTATS,MEXTPG>
        ether 70:85:c2:8a:b5:8b
        media: Ethernet autoselect
        status: no carrier
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
```
上記の実行例では em0 と em1 および lo0 という三つのインターフェースの情報が表示されています。この PC の場合には、em0 が LAN に接続されているので、YOURIF には em0 を指定します。この他、re0, wlan0 など PC に装着されているネットワークインターフェースにより様々な名称のインターフェースが存在します。

bridge インターフェースが正しく設定できていれば、ifconfig bridge0 コマンドを実行すると、以下のように member: tap0, member: YOURIF が表示されるはずです。
```
$ ifconfig bridge0
bridge0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=0
        ether 58:9c:fc:10:ff:c7
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 4 priority 128 path cost 2000000
        member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 1 priority 128 path cost 20000
        groups: bridge
        nd6 options=9<PERFORMNUD,IFDISABLED>
```

/etc/rc.conf に bridge の設定を追加します。
* 下記の実行例の YOURIF は実際のインターフェース名に変更してから実行してください。
```
$ sudo sh -c 'cat >> /etc/rc.conf'
cloned_interfaces="bridge0 tap0"
ifconfig_bridge0="addm YOURIF addm tap0"
^D
```

### grub2-bhyve のインストール

bhyve 上の仮想マシンで OpenBSD や NetBSD などを使用するには、grub2-bhyve というツールが必要になります。

以下の手順に従って、*grub2-bhyve* をインストールしてください。

OpenBSD (確か 7.4 以降) を使用するには、binary package の grub2-bhyve ではなく最新の ports から grub2-bhyve をインストールする必要があります。

OpenBSD (確か 7.4 以降) を使用しないのであれば **sudo pkg install -y grub2-bhyve** コマンドを実行し、binary package の grub2-bhyve を使用しても良いと思います。
```
$ sudo mv /usr/ports /usr/orig-ports
$ sudo pkg install -y git
$ sudo git clone https://git.FreeBSD.org/ports.git /usr/ports
$ sudo pkg install -y help2man flex bison gcc13
$ cd /usr/ports/sysutils/grub2-bhyve
$ sudo make install
```
今回使用した PC は、FreeBSD をインストールする際に[Selecting Components to Install](https://docs.freebsd.org/en/books/handbook/book/#bsdinstall-components) で *ports* を選択しているので、既存の /usr/ports を /usr/orig-ports に移動しています。/usr/ports が存在しなければ、mv コマンドは不要です。

*help2man, flex, bison, gcc13* は、grub2-bhyve をビルドする際に必要なパッケージです。これらのパッケージがインストールされていない場合、grub2-bhyve をビルドする際に ports から ビルド & インストール してくれますが、時間が掛かるので binary package をインストールしました。

この他に GNU Make が必要になりますが、binary package の GNU Make は grub2-bhyve が要求している GNU Make よりも古いバージョンなので、これに関しては grub2-bhyve のビルド時に一緒に ビルド & インストール します。

GNU Make をビルドする際にビルド時の設定を確認するため以下の画面が表示されます。特に変更する項目はないので Enter キーを押下してください。
![スクリーンショット 2024-04-03 7.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/56030ba2-e41d-bbde-e1c6-96d832cf6c07.png)

以上で bhyve を使用して仮想マシンを使用する準備は整いました。


## OpenBSD 7.4 のインストール

FreeBSD + bhyve 上に仮想マシンを作成し、OpenBSD 7.4 をインストールする手順を示します。
```
$ cd /work     
$ sudo mkdir openbsd
$ cd openbsd
$ sudo fetch https://cdn.openbsd.org/pub/OpenBSD/7.4/amd64/SHA256
$ sudo fetch https://cdn.openbsd.org/pub/OpenBSD/7.4/amd64/install74.iso
$ shasum -c SHA256 2>/dev/null | grep OK
install74.iso: OK
```
shasum コマンド実行時に **install74.iso: OK** が表示されない場合には、*SHA256* か *install74.iso* が正しく取得できていない可能性があるので、再度 fetch コマンドを使用して取得し直してください。
```
$ sudo truncate -s 16G openbsd.img
$ sudo sh -c 'cat > openbsd-device.map'
(hd0) /work/openbsd/openbsd.img
(cd0) /work/openbsd/install74.iso
^D
$ printf "kopenbsd -h com0 (cd0)/7.4/amd64/bsd.rd\nboot\n" | sudo grub-bhyve -m /work/openbsd/openbsd-device.map -r cd0 -M 2G openbsd
```
上記の *printf* コマンドを実行した際に以下のエラーが発生した場合には、
```
Could not create VM openbsd
Error in initializing VM
```
以下のことが考えられるので再確認してください。
1. cat コマンドで作成した openbsd-device.map に指定したファイル名 */work/openbsd/openbsd.img* あるいは */work/openbsd/install74.iso* を間違えている。
1. UEFI の「仮想化機能」が無効になっている。
```
$ sudo bhyve -A -c 2 -m 2G -w -u -H -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,ahci-cd,/work/openbsd/install74.iso -s 4,virtio-blk,/work/openbsd/openbsd.img openbsd
```
以下のように OpenBSD のインストーラーの画面が表示されれば仮想マシンの起動は成功しています。
![スクリーンショット 2024-04-02 12.34.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/8c3a7b4f-64e3-5287-885c-8979c2e3e6db.png)
OpenBSD をインストールしてください。
![スクリーンショット 2024-04-02 12.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/3fe92c87-73d9-8721-6b00-4d5c9da0c1d1.png)
OpenBSD のインストールが完了すると、上記のように「Exit to (S)hell, (H)alt or (R)eboot? [reboot] 」と表示されるので Enter キーを押下します。
![スクリーンショット 2024-04-02 12.39.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/53153b95-7e7f-4aca-fae9-52c8cebb4388.png)
「rebooting...」と表示されますが、実際には reboot はされず仮想マシンが終了します。

### OpenBSD の起動
```
$ printf "kopenbsd -h com0 -r sd0a (hd0,openbsd1)/bsd\nboot\n" | sudo grub-bhyve -m /work/openbsd/openbsd-device.map -M 2G openbsd
$ sudo bhyve -A -c 2 -m 2G -w -u -H -G 19999 -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/openbsd/openbsd.img openbsd
```
インストールした OpenBSD が起動します。
* 上記の bhyve コマンドを実行する際に "-A" を指定しないと、com0 を表示した以降で動作が非常になることがあります。
* このような場合には別の端末から　**sudo bhyvectl --vm=openbsd --destroy** コマンドを実行し、仮想マシン openbsd を破棄してください。


## FreeBSD 14.0 のインストール

FreeBSD + bhyve 上に仮想マシンを作成し、FreeBSD 14.0 をインストールする手順を示します。
```
$ cd /work
$ sudo mkdir freebsd
$ cd freebsd
$ sudo fetch https://download.freebsd.org/releases/amd64/amd64/ISO-IMAGES/14.0/CHECKSUM.SHA512-FreeBSD-14.0-RELEASE-amd64
$ sudo fetch https://download.freebsd.org/releases/amd64/amd64/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASE-amd64-bootonly.iso
$ shasum -c CHECKSUM.SHA512-FreeBSD-14.0-RELEASE-amd64 2>/dev/null | grep OK
FreeBSD-14.0-RELEASE-amd64-bootonly.iso: OK
```
shasum コマンド実行時に **FreeBSD-14.0-RELEASE-amd64-bootonly.iso: OK** が表示されない場合には、*CHECKSUM.SHA512-FreeBSD-14.0-RELEASE-amd64* か *FreeBSD-14.0-RELEASE-amd64-bootonly.iso* が正しく取得できていない可能性があるので、再度 fetch コマンドを使用して取得し直してください。
```
$ sudo truncate -s 16G freebsd.img
$ sudo sh /usr/share/examples/bhyve/vmrun.sh -c 2 -m 2048M -t tap0 -d freebsd.img -i -I FreeBSD-14.0-RELEASE-amd64-bootonly.iso freebsd
```
以下のように「Console type [vt100]: と表示されれば、仮想マシンの起動は成功しています。
![スクリーンショット 2024-04-02 11.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/f8450ca2-b161-7e67-d35e-9b4af68837f8.png)
Enter キーを押下すると、FreeBSD のインストーラーの画面が表示されるので、FreeBSD をインストールしてください。

FreeBSD のインストールが完了し最後に以下の画面が表示されます。
![スクリーンショット 2024-04-02 12.00.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/49b89ca5-3157-5c08-d927-948056296bf9.png)
ここで Enter キーを押下してしまうと再び FreeBSD のインストーラーが起動してしまうので、以下のように TAB キーを押下して **Shtdown** を選択してから Enter キーを押下してください。
![スクリーンショット 2024-04-02 12.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/cf693565-4884-1b3f-269b-3e34c7638ec7.png)

もし **Reboot** のまま Enter キーを押下してしまった場合には、**Cosole type [vt100]:**
が表示されたら Enter キーを押下し、
![スクリーンショット 2024-04-02 11.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/ecb37a19-c26c-b8e3-5918-4d2f7234e81b.png)

インストーラーの画面が表示されたら TAB キーを押下して **Shell** を選択し Enter キーを押下します。
![スクリーンショット 2024-04-02 12.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/3c67ba82-b1a2-5721-b695-040c524e2675.png)
![スクリーンショット 2024-04-02 12.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/dd244c70-6f3b-2b9d-d115-444f89b8236b.png)

shell が起動されるので、**shutdown -p now** と入力して Enter キーを押してください。
![スクリーンショット 2024-04-02 12.12.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/0474cf37-cc33-7c4f-e13f-f2d0685a48e1.png)

仮想マシンが停止します。
![スクリーンショット 2024-04-02 12.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/82338c26-6404-21b1-e345-9faef4e624b8.png)

### FreeBSD の起動

```
$ sudo sh /usr/share/examples/bhyve/vmrun.sh -c 2 -m 2048M -t tap0 -d freebsd.img freebsd
```
インストールした FreeBSD が起動します。
![スクリーンショット 2024-04-02 12.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/97beaed7-95a3-c4f9-a6fb-24cb41949489.png)


## NetBSD 9.3 のインストール
```
$ cd /work
$ sudo mkdir netbsd
$ cd netbsd
$ sudo fetch https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.3/images/SHA512
$ sudo fetch https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.3/images/NetBSD-9.3-amd64.iso
$ shasum -c SHA512 2>/dev/null | grep OK
NetBSD-9.3-amd64.iso: OK
```
shasum コマンド実行時に **NetBSD-9.3-amd64.iso: OK** が表示されない場合には、*SHA512* か *NetBSD-9.3-amd64.iso* が正しく取得できていない可能性があるので、再度 fetch コマンドを使用して取得し直してください。
```
$ sudo truncate -s 16G netbsd.img
$ sudo sh -c 'cat > netbsd-device.map'
(hd0) /work/netbsd/netbsd.img
(cd0) /work/netbsd/NetBSD-9.3-amd64.iso
^D
$ printf "knetbsd -h -r cd0a (cd0)/netbsd\nboot\n" | sudo grub-bhyve -m /work/netbsd/netbsd-device.map -r cd0 -M 2G netbsd

```
上記の *printf* コマンドを実行した際に以下のエラーが発生した場合には、
```
Could not create VM netbsd
Error in initializing VM
```
以下のことが考えられるので再確認してください。
1. cat コマンドで作成した netbsd-device.map に指定したファイル名 */work/netbsd/netbsd.img* あるいは */work/netbsd//work/netbsd/NetBSD-9.3-amd64.iso* を間違えている。
1. UEFI の「仮想化機能」が無効になっている。
```
$ sudo bhyve -A -c 2 -m 2G -w -u -H -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,ahci-cd,/work/netbsd/NetBSD-9.3-amd64.iso -s 4,virtio-blk,/work/netbsd/netbsd.img netbsd
```
以下のように「Terminal type (just hit ENTER for 'vt220'): 」が表示されれば仮想マシンの起動は成功しています。
![スクリーンショット 2024-04-02 13.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/fb52cf96-c81e-0beb-902e-c4d640cd8b8b.png)
Enter キーを押下すると、NetBSD のインストーラーの画面が表示されるので、NetBSD をインストールしてください。

ネットワークの設定を行う際、「Network media type []: 」に対して *autoselect* を指定すると以下のようにエラーになるので、*manual* を指定してください。
![スクリーンショット 2024-04-02 13.42.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/9c28b856-5761-ee53-2ec0-5372d26ff3a6.png)

インストールが終了すると以下の画面が表示されます。
![スクリーンショット 2024-04-02 13.45.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/4aee56e0-827f-9d46-7176-de01acb9c611.png)
"d" キーを押下して「Reboot the coumputer」を選択し Enter キーを押下してください。
![スクリーンショット 2024-04-02 13.46.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/3f9fde58-401a-9935-1d68-c1d949f0ab2a.png)
![スクリーンショット 2024-04-02 13.47.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/257793d5-4ae5-7498-f44d-bb61e2cb60d6.png)
「rebooting...」と表示されますが、実際には reboot はされず仮想マシンが終了します。

### NetBSD の起動
```
$ printf "knetbsd -h -r dk0a (hd0,gpt1)/netbsd\nboot\n" | sudo grub-bhyve -m /work/netbsd/netbsd-device.map -r cd0 -M 2G netbsd
$ sudo bhyve -A -c 2 -m 2G -w -u -H -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/netbsd/netbsd.img netbsd
```
インストールした NetBSD が起動します。
![スクリーンショット 2024-04-02 14.02.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/88778687-6491-8ef5-d0b9-9c28b145aa4e.png)


## Ubuntu 23.10 server のインストール
<font color="red">注意: 申し訳ございません。Ubuntu のインストール後の起動ができない可能性があります。</font>
* 2024年4月5日現在、Ubuntu server のインストール後の Ubuntu の起動前に実行する grub-bhyve コマンドが「Segmentation fault」を表示して以上終了してしまいます。私が使用している FreeBSD 14.0 + bhyve 環境に何か問題があるのかもしれません。現在原因を調査中です。
* 「/work/ubuntu-ext4　のように、以降の実行例の /work/ubuntu に "-ext4" を付与したディレクトリ名を使用すると、Ubuntu のインストールは完了するが、インストール後の再起動の途中で止まってしまう。」という現象を把握していますが、この問題の原因と対策方法がわかっていません。


```
$ cd /work
$ sudo mkdir ubuntu
$ cd ubuntu
$ sudo fetch https://ftp.iij.ad.jp/pub/linux/ubuntu/releases/23.10.1/SHA256SUMS
$ sudo fetch https://ftp.iij.ad.jp/pub/linux/ubuntu/releases/23.10.1/ubuntu-23.10-live-server-amd64.iso
$ shasum -c SHA256SUMS 2>/dev/null | grep OK
ubuntu-23.10-live-server-amd64.iso: OK
```
shasum コマンド実行時に **ubuntu-23.10-live-server-amd64.iso: OK** が表示されない場合には、*SHA256SUMS* か *ubuntu-23.10-live-server-amd64.iso* が正しく取得できていない可能性があるので、再度 fetch コマンドを使用して取得し直してください。
```
$ sudo truncate -s 16G ubuntu.img
$ sudo sh -c 'cat > ubuntu-device.map'
(hd0) /work/ubuntu/ubuntu.img
(cd0) /work/ubuntu/ubuntu-23.10-live-server-amd64.iso
^D
$ sudo grub-bhyve -r cd0 -m /work/ubuntu/ubuntu-device.map -M 2G ubuntu
```
gurb-bhyve コマンドを実行すると以下の画面が表示されるので、「Try or Install Ubuntu Server」が選択されている状態で Enter キーを押してください。
![スクリーンショット 2024-04-02 14.30.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/097dbf9a-7211-afaf-0a3c-d5f2b25ff9e3.png)
```
$ sudo bhyve -A -c 2 -m 2G -w -u -H -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,ahci-cd,/work/ubuntu/ubuntu-23.10-live-server-amd64.iso -s 4,virtio-blk,/work/ubuntu/ubuntu.img ubuntu
```
以下のようにインストーラーの画面が表示されれば仮想マシンの起動は成功しています。
![スクリーンショット 2024-04-02 14.44.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/f044dc33-a64b-2c98-8f7d-127b2c6091c7.png)
TAB キーを押下して「Continue in basic mode」を選択し Enter キーを押下し　Ubuntu をインストールしてください。
![スクリーンショット 2024-04-02 14.47.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/90d9e78d-8159-b932-9ef4-f301266b6915.png)
デフォルトの「Contiune in rich mode」のままだと以降の画面がカラー表示となり、手元の端末の環境によっては画面が見えなくなってしまいます。「Continue　in basic mode」を選択することをお勧めします。

インストールが完了したら TAB キーを押下し、
![スクリーンショット 2024-04-02 14.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/dee16542-4dcf-edd1-fb58-dcfddf506555.png)
![スクリーンショット 2024-04-02 14.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/449e7f7c-72b9-93fb-646a-f76c4af1ddf1.png)
「Reboot Now」を選択して Enter キーを押下してください。
「Please remove the installation medium, then press ENTER:」と表示されるので、Enter キーを押下してください。![スクリーンショット 2024-04-02 14.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/f9993144-281b-1236-b142-a1cb4505e56b.png)
「reboot: Restarting system」と表示されますが、実際には仮想マシンが終了します。
![スクリーンショット 2024-04-02 14.57.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/2ccb5a9e-82f9-7234-6801-486308c7d91c.png)


### Ubuntu の起動
```
$ printf "linux (hd0,gpt2)/vmlinuz root=/dev/mapper/ubuntu--vg-ubuntu--lv\ninitrd (hd0,gpt2)/initrd.img\nboot\n" | sudo grub-bhyve -r hd0,gpt2 -m /work/ubuntu/ubuntu-device.map -M 2G ubuntu
$ sudo bhyve -A -c 2 -m 2G -w -u -H -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/ubuntu/ubuntu.img ubuntu
```
![スクリーンショット 2024-04-02 15.31.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/6a98c1e8-0e6c-dd91-e3e6-10319202e5a7.png)
インストールした Ubuntu が起動します。


## 問題発生時の対応方法

### grub-bhyve コマンドを実行したら操作ができなくなった

OpenBSD, NetBSD, Ubuntu を インストール・起動 では *printf* | *grub-bhyve* コマンドを実行しますが、この時に *printf* および *grub-bhyve* コマンドに渡す引数に間違いがあると、画面上に以下のメッセージが表示されキーボードからの入力を受け付けなくなってしまうことがあります。
![スクリーンショット 2024-04-03 15.21.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/ed6e5be3-6071-25f3-a22f-64c853b3c0bc.png)
このような場合には、まず

コンソールから FreeBSD を操作している場合:
* Alt と F2 キーを同時に押下し、仮想コンソールを切り替えてログインする。
* Alt + Fx は F1〜F8 を指定できます。

FreeBSD 上でデスクトップ環境を使用している場合:
* 新たに端末を開く

別のマシンから FreeBSD に ssh で接続している場合:
* 別の端末などから FreeBSD に ssh でログインする。

などの方法で FreeBSD を操作できる環境を用意したら、w コマンドを使用して誰がその FreeBSD を使用しているかを確認します。
```
$ w
 3:50PM  up  4:56, 1 user, load averages: 0.03, 0.27, 0.50
USER       TTY      FROM                                     LOGIN@  IDLE WHAT
taro       pts/0    2001:f71:4ee0:2100:a808:c2ed:d5ac:c7cd   3:50PM     - w
```
自分 (上記の例では USER: taro) 以外に使用している人がいない場合には、

pkill コマンドを実行して grub-bhyve を kill します。
```
$ sudo pkill grub-bhyve
```

以下のように自分以外のユーザー (USER: hanako) がいる場合には、
```
$ w
 4:05PM  up  5:10, 5 users, load averages: 2.03, 1.71, 1.11
USER       TTY      FROM                                     LOGIN@  IDLE WHAT
taro       pts/0    2001:f71:4ee0:2100:a808:c2ed:d5ac:c7cd   3:50PM     8 sudo
hanako     pts/1    2001:f71:4ee0:2100:a808:c2ed:d5ac:c7cd   3:52PM     8 sudo
hanako     pts/2    2001:f71:4ee0:2100:a808:c2ed:d5ac:c7cd   3:56PM     8 grub 
taro       pts/3    2001:f71:4ee0:2100:a808:c2ed:d5ac:c7cd   3:57PM     8 grub 
taro       pts/4    2001:f71:4ee0:2100:a808:c2ed:d5ac:c7cd   3:58PM     - w
```

以下のようjに ps コマンドを実行し自分の grub-bhyve のプロセス ID を確認してから kill コマンドで grub-bhyve を kill します。
```
$ ps ax | grep grub-bhyve
2866  0  I+      0:00.01 sudo grub-bhyve -m /work/openbsd/openbsd-device.map -r
2862  1  I+      0:00.00 sudo grub-bhyve -m /work/nbsd-ufs/netbsd-device.map -r
2863  2  Is      0:00.00 sudo grub-bhyve -m /work/nbsd-ufs/netbsd-device.map -r
2864  2  R+      9:30.15 grub-bhyve -m /work/nbsd-ufs/netbsd-device.map -r cd0 
2867  3  Is      0:00.00 sudo grub-bhyve -m /work/openbsd/openbsd-device.map -r
2868  3  R+      9:17.23 grub-bhyve -m /work/openbsd/openbsd-device.map -r cd0 
2915  4  S+      0:00.00 grep grub-bhyve
$ sudo kill 2868
```
grub-bhyve に渡されている引数から自分が起動した grub-bhyve を特定できない場合には、他のユーザーに確認 (「grub-bhyve を使い終わったらしばらく grub-bhyve を使用しないでね」など) した上で上記の kill コマンドを実行すると良いと思います。

このような事態を想定して、FreeBSD および bhyve に慣れるまでは、他の人が使用しない自分専用の FreeBSD 上で bhyve を使用することをお勧めします。

なお、grub-bhyve が操作できなくなる原因は、
*(cd0)* と入力するべきところを *(cd)* のように *0* を入力し忘れていた。
```
printf "kopenbsd -h com0 (cd)/7.4/amd64/bsd.rd\nboot\n" | sudo grub-bhyve -m /work/openbsd/openbsd-device.map -r cd0 -M 2G openbsd
```

*openbsd-device.map* と入力するべきところを *openbsd-device.ma* のように末尾の *p* を入力し忘れていた。
```
printf "kopenbsd -h com0 (cd0)/7.4/amd64/bsd.rd\nboot\n" | sudo grub-bhyve -m /work/openbsd/openbsd-device.ma -r cd0 -M 2G openbsd
```

netbsd-device.map ファイルの内容で *netbsd.img* と入力するべきところを *etbsd.img* のように 先頭の *n* を入力し忘れていた。
```
$ cat netbsd-device.map 
(hd0) /work/netbsd/etbsd.img
(cd0) /work/netbsd/NetBSD-9.3-amd64.iso
```
このように、ちょっとした間違えで grub-bhyve の操作ができなくなってしまうので、grub-bhyve コマンドの実行時にはその入力内容に十分注意して下さい。


### grub-bhyve を実行したら「Could not setup memory for VM」というエラーが発生した
以下のように、grub-bhyve コマンドを実行したら、「Could not setup memory for VM」というエラーが表示されることがあります。
```
$ printf "linux (hd0,gpt2)/vmlinuz root=/dev/mapper/ubuntu--vg-ubuntu--lv\ninitrd (hd0,gpt2)/initrd.img\nboot\n" | sudo grub-bhyve -r hd0,gpt2 -m /work/ubuntu/ubuntu-device.map -M 4G ubuntu
Password:
Could not setup memory for VM
Error in initializing VM
```
これは、直前に同じ仮想マシン名 (上記の例の場合、*grub-bhyve* コマンドの最後に指定した　"**ubuntu**") メモリーサイズが異なる *grub-bhyve* コマンドを実行した時に発生します。

このような場合には、以下のように *bhyvectl --destroy* コマンドを実行し、以前に作成した仮想マシンを一旦破棄してから *grub-bhyve* コマンドを再実行して下さい。
```
$ sudo bhyvectl --vm=ubuntu --destroy
$ printf "linux (hd0,gpt2)/vmlinuz root=/dev/mapper/ubuntu--vg-ubuntu--lv\ninitrd (hd0,gpt2)/initrd.img\nboot\n" | sudo grub-bhyve -r hd0,gpt2 -m /work/ubuntu/ubuntu-device.map -M 4G ubuntu
```


### Ubuntu の起動時に途中で停止してしまい起動できない
以下のように、Ubuntu の起動途中で止まってしまいここから先に進まなくなってしまうことがあります。
```
$ printf "linux (hd0,gpt2)/vmlinuz root=/dev/mapper/ubuntu--vg-ubuntu--lv\ninitrd (hd0,gpt2)/initrd.img\nboot\n" | sudo grub-bhyve -r hd0,gpt2 -m /work/ubuntu/ub
untu-device.map -M 2G ubunt
$ sudo bhyve -A -c 2 -m 2G -w -u -H -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/ubuntu/ubuntu.img ubuntu
[    0.000000] Linux version 6.5.0-26-generic (buildd@lcy02-amd64-070) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0, GNU ld (GNU Binutils for Ubuntu)
 2.41) #26-Ubuntu SMP PREEMPT_DYNAMIC Tue Mar  5 21:19:28 UTC 2024 (Ubuntu 6.5.0-26.26-generic 6.5.13)
[    0.000000] Command line: console=ttyS0 BOOT_IMAGE=(hd0,gpt2)/vmlinuz root=/dev/mapper/ubuntu--vg-ubuntu--lv
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel 
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Hygon HygonGenuine
[    0.000000]   Centaur CentaurHauls
[    0.000000]   zhaoxin   Shanghai

＜略＞

[    2.840754] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
         Mounting dev-hugepages.mount - Huge Pages File System...
[    2.842268] systemd[1]: Mounting dev-mqueue.mount - POSIX Message Queue File System...
         Mounting dev-mqueue.mount
```
原因は不明ですが、一度 Ubuntu を起動してから *shutdown* コマンドで停止し、再び *bhyve* コマンドを実行して Ubuntu を起動するときに発生するようです。

今のところ Hyperviser となっている FreeBSD を再起動する以外の解決方法はわかっていません。なお、FreeBSD を再起動する前に、以下のように *bhyvectl --destroy* コマンドを実行して Ubuntu を終了させて下さい。
```
$ sudo bhyvectl --vm=ubuntu --destroy
```


### 仮想マシンの起動時に「Unable to setup memory (22) と表示され、仮想マシンを起動できない
```
$ sudo bhyve -A -c 2 -m 4G -w -u -H -G 19999 -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/openbsd/openbsd.img openbsd
Unable to setup memory (22)
```
このエラーは、grub-bhyve で指定したメモリー容量と bhyve で指定したメモリー容量が異なる時に発生します。

以下のように grub-bhyve -M 2G で 2 GB のメモリーを指定したけれど、bhyve -m 4G のように grub-bhyve とは異なる容量し指定すると上記のエラーが発生します。
```
$ printf "kopenbsd -h com0 -r sd0a (hd0,openbsd1)/bsd\nboot\n" | sudo grub-bhyve -m /work/openbsd/openbsd-device.map -M 2G openbsd
$ sudo bhyve -A -c 2 -m 4G -w -u -H -G 19999 -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/openbsd/openbsd.img openbsd
Unable to setup memory (22)
```
このような場合には、以下のように grub-bhyve で指定した容量と同じ容量のメモリーを指定して bhyve コマンドを実行します。
```
$ sudo bhyve -A -c 2 -m 2G -w -u -H -G 19999 -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/openbsd/openbsd.img openbsd
[ no symbol table formats found ]
Copyright (c) 1982, 1986, 1989, 1991, 1993
        The Regents of the University of California.  All rights reserved.
Copyright (c) 1995-2023 OpenBSD. All rights reserved. https://www.OpenBSD.org

OpenBSD 7.4 (GENERIC.MP) #1397: Tue Oct 10 09:02:37 MDT 2023
    deraadt@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP
real mem = 2130706432 (2032MB)
avail mem = 2049966080 (1955MB)
```


### 仮想マシンの起動時に「bhyve: could not activate CPU 0: Device busy」と表示され、仮想マシンを起動できない
```
$ sudo bhyve -A -c 2 -m 2G -w -u -H -G 19999 -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/openbsd/openbsd.img openbsd
bhyve: could not activate CPU 0: Device busy
```
このエラーは、以下のように一度仮想マシンを起動してシャットダウンしたのちに grub-bhyve コマンドを実行しないで bhyve コマンドを実行した時に発生します。
1. bhyve コマンドで仮想マシンを起動する。
1. 仮想マシンにログインし *shutdown -p now* でシャットダウンする。
1. bhyve コマンドで仮想マシンを起動する。

このような場合には、二回目の bhyve コマンドを実行する前に grub-bhyve コマンドを実行して下さい。
```
$ sudo bhyve -A -c 2 -m 2G -w -u -H -G 19999 -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/openbsd/openbsd.img openbsd
bhyve: could not activate CPU 0: Device busy

$ printf "kopenbsd -h com0 -r sd0a (hd0,openbsd1)/bsd\nboot\n" | sudo grub-bhyve -m /work/openbsd/openbsd-device.map -M 2G openbsd

$ sudo bhyve -A -c 2 -m 2G -w -u -H -G 19999 -l com1,stdio -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3,virtio-blk,/work/openbsd/openbsd.img openbsd
[ no symbol table formats found ]
Copyright (c) 1982, 1986, 1989, 1991, 1993
        The Regents of the University of California.  All rights reserved.
Copyright (c) 1995-2023 OpenBSD. All rights reserved. https://www.OpenBSD.org

OpenBSD 7.4 (GENERIC.MP) #1397: Tue Oct 10 09:02:37 MDT 2023
    deraadt@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP
real mem = 2130706432 (2032MB)
avail mem = 2049966080 (1955MB)
```