bhyve用のBIOSイメージをインストール
# pkg install bhyve-firmware
必要なカーネルモジュールを読み込む
# kldload vmm # kldload if_tap # kldload if_bridge
上記モジュールを起動時に読み込むようにする
# echo 'vmm_load="YES"' >> /boot/loader.conf # echo 'if_tap_load="YES"' >> /boot/loader.conf
仮想CPUのトポロジを設定する(要再起動)。デフォルト設定は1パッケージ1コアとなっており、特にWindows環境に複数個のCPUを割り当てた時にライセンス上の問題が出る。
# echo 'hw.vmm.topology.cores_per_package="12"' >> /boot/loader.conf
tapデバイスアクセス時に自動的に有効化されるようにする
# cat 'net.link.tap.up_on_open=1' >> /etc/sysctl.conf
ネットワークブリッジを作る
igb0が物理マシンの有効なNICで、tap10が仮想マシンに割り当てられる仮想NIC。
# ifconfig tap10 create up # ifconfig tap10 create up # ifconfig bridge0 create 0 # ifconfig bridge0 addm igb0 addm tap10
ディスクイメージを用意する
# truncate -s 30G disk0.img
# bhyve -c 2 -m 4G -H -w \ -s 0,hostbridge \ -s 3,ahci-cd,/path/to/WindowsInstall.iso \ -s 4,ahci-hd,./disk0.img \ -s 5,virtio-net,tap10 \ -s 29,fbuf,tcp=0.0.0.0:5902,wait \ -s 30,xhci,tablet \ -s 31,lpc \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \ Windows
引数の意味:
-c 2 | CPUを2つ割り当てる |
-m 4G | メモリを4GB割り当てる |
-H | |
-w | 未実装のMSRレジスタへのアクセスを無視する。デバッグ用(付ける必要ないかも?) |
-s 3,ahci-cd,/path/to/image | PCIスロット3にAHCI接続の光学ドライブを接続 |
-s 4,ahci-hd,/path/to/image | PCIスロット4にAHCI接続のHDDを接続 |
-s 5,virtio-net,tap10 | PCIスロット5に準仮想化NICを接続 |
-s 29,fbuf,tcp=0.0.0.0:5902,wait | PCIスロット29に仮想フレームバッファを用意しポート5902でVNC接続を待ち受ける。waitを付けるとVNCで接続されるまでVMの起動を待つ |
-s 30,xhci,table | PCIスロット30にUSBのポインティングデバイスを接続 |
-s 31,lpc | PCIスロット31に仮想コンソールを接続。VMのBIOS画面をホストのターミナルにリダイレクト表示できるようになる。 |
-s bootrom,/path/to/image | VMで使うBIOSを設定する |
Windows | 仮想マシンの名前 |
このコマンドは何度も打ち込むことになるので、↓こんな感じでシェルスクリプト化しとくと便利。
#!/bin/sh bhyve -c 2 -m 4G -H -w \ -s 0,hostbridge \ -s 4,ahci-hd,/path/to/disk.img \ -s 5,virtio-net,tap10 \ -s 29,fbuf,tcp=0.0.0.0:5902 \ -s 30,xhci,tablet \ -s 31,lpc \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \ ${1} ${2} ${3} ${4} \ VM_NAME
無事に仮想マシンが起動したら、VNCで接続し、いつも通りWindowsをインストールする。
ただ、bhyveのVNCサーバはかなり相性があるようで、Macの標準VNCビューワ、Chicken of the VNC、RealVNC、TigerVNCの何れも物凄いラグやキー入力が出来なかったりで、まともに使えなかった。うちの環境では、ホストマシンに標準VNCビューワで接続し、その中でTigerVNCビューワでVMにVNCするのが一番まともに動いたっていう…。
リモートデスクトップを有効化するまでの辛抱なので、実用上そこまで問題ではないけども。