注意事項
bhyve を有効化するための手順を追記しました。
以下の二つのパッケージはインストール不要だったので、これに関する記述部分を 打ち消し表記 変更しました。
- vm-bhyve
- bhyve-firmware
FreeBSD を再起動したときに tap を有効にするために、/etc/sysctl.conf の設定を追記しました。
はじめに
物理マシンに FreeBSD 14.0 RELASE をインストールした後の bhyve のインストールと設定および各種 OS のインストール手順を説明します。
FreeBSD のインストールに関しては、Chapter 2. Installing FreeBSD や Share FreeBSD based information の install FreeBSD などを参考にしてください。
なお、本記事ではデスクトップ環境は使用しないので、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 の 24.6. FreeBSD as a Host with bhyveに記述されています。また https://wiki.freebsd.org/bhyve にFAQが掲載されています。
以下に掲載する手順に関しては上記の資料を元に作成しています。
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 に関しては、ファイルシステムの選び方 で解説されています。
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 で 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 キーを押下してください。
以上で 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
以下のことが考えられるので再確認してください。
- cat コマンドで作成した openbsd-device.map に指定したファイル名 /work/openbsd/openbsd.img あるいは /work/openbsd/install74.iso を間違えている。
- 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 のインストーラーの画面が表示されれば仮想マシンの起動は成功しています。
OpenBSD をインストールしてください。
OpenBSD のインストールが完了すると、上記のように「Exit to (S)hell, (H)alt or (R)eboot? [reboot] 」と表示されるので Enter キーを押下します。
「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]: と表示されれば、仮想マシンの起動は成功しています。
Enter キーを押下すると、FreeBSD のインストーラーの画面が表示されるので、FreeBSD をインストールしてください。
FreeBSD のインストールが完了し最後に以下の画面が表示されます。
ここで Enter キーを押下してしまうと再び FreeBSD のインストーラーが起動してしまうので、以下のように TAB キーを押下して Shtdown を選択してから Enter キーを押下してください。
もし Reboot のまま Enter キーを押下してしまった場合には、Cosole type [vt100]:
が表示されたら Enter キーを押下し、
インストーラーの画面が表示されたら TAB キーを押下して Shell を選択し Enter キーを押下します。
shell が起動されるので、shutdown -p now と入力して Enter キーを押してください。
FreeBSD の起動
$ sudo sh /usr/share/examples/bhyve/vmrun.sh -c 2 -m 2048M -t tap0 -d freebsd.img freebsd
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
以下のことが考えられるので再確認してください。
- cat コマンドで作成した netbsd-device.map に指定したファイル名 /work/netbsd/netbsd.img あるいは /work/netbsd//work/netbsd/NetBSD-9.3-amd64.iso を間違えている。
- 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'): 」が表示されれば仮想マシンの起動は成功しています。
Enter キーを押下すると、NetBSD のインストーラーの画面が表示されるので、NetBSD をインストールしてください。
ネットワークの設定を行う際、「Network media type []: 」に対して autoselect を指定すると以下のようにエラーになるので、manual を指定してください。
インストールが終了すると以下の画面が表示されます。
"d" キーを押下して「Reboot the coumputer」を選択し Enter キーを押下してください。
「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
Ubuntu 23.10 server のインストール
注意: 申し訳ございません。Ubuntu のインストール後の起動ができない可能性があります。
- 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 キーを押してください。
$ 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
以下のようにインストーラーの画面が表示されれば仮想マシンの起動は成功しています。
TAB キーを押下して「Continue in basic mode」を選択し Enter キーを押下し Ubuntu をインストールしてください。
デフォルトの「Contiune in rich mode」のままだと以降の画面がカラー表示となり、手元の端末の環境によっては画面が見えなくなってしまいます。「Continue in basic mode」を選択することをお勧めします。
インストールが完了したら TAB キーを押下し、
「Reboot Now」を選択して Enter キーを押下してください。
「Please remove the installation medium, then press ENTER:」と表示されるので、Enter キーを押下してください。
「reboot: Restarting system」と表示されますが、実際には仮想マシンが終了します。
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
問題発生時の対応方法
grub-bhyve コマンドを実行したら操作ができなくなった
OpenBSD, NetBSD, Ubuntu を インストール・起動 では printf | grub-bhyve コマンドを実行しますが、この時に printf および grub-bhyve コマンドに渡す引数に間違いがあると、画面上に以下のメッセージが表示されキーボードからの入力を受け付けなくなってしまうことがあります。
このような場合には、まず
コンソールから 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 コマンドを実行した時に発生します。
- bhyve コマンドで仮想マシンを起動する。
- 仮想マシンにログインし shutdown -p now でシャットダウンする。
- 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)