前回までで仮想マシンをインストールする準備が整った。
さっそくWindows10のインストールに取り掛かるが、準備すべきものがある。

  1. Windows10インストールイメージ
  2. TigerVNC(Viewer)

一つ目は言わずもがな。
https://www.microsoft.com/ja-jp/software-download/windows10

二つ目は、GUI操作のため。
Windowsのような、GUI操作が必須のOSをbhyve上の仮想マシンとして動かす場合には、VNCでその画面を見ることになる。
ただ、bhyveのVNCは癖があるようで、VNC viewerによっては途中で切れてしまうんである。
WindowsでもProであればリモートデスクトップという手もあるが、それにしたってインストールの時にはVNCで繋ぐほかない。
TigerVNCなら問題なく接続できるのでこれを準備しておくこと。
https://tigervnc.org/
https://github.com/TigerVNC/tigervnc/releases

2019/5/12時点では1.9.0が最新だからしてバイナリはこちら。Viewerでよい。
https://bintray.com/tigervnc/stable/tigervnc/1.9.0

初回には少し混乱したので記しておくが、VNCで接続する先のIPアドレスは、bhyveホストのIPアドレスである。
仮想マシンが自立して起動すると、そっちはそっちで独自のIPアドレスを取得する。

VNCはbhyveが用意する仮想マシンへのGUIアクセスなのでbhyveホストに接続する必要があるわけ。
一方で、仮想マシンそのものでリモートデスクトップやら、VNC Serverを用意すれば、そのときは当然、仮想マシンのIPアドレスを接続先として指定することになる。

ではISOの準備から。

仮想マシンインストール準備(インストーラ = ISO)

インストーラの準備。
ISOイメージを登録する。VirtualBoxでもそういう操作あるよね。

ISOイメージがあるなら$vm_dir/.isoに移す
sudo vmとして確認する
sudo vm とすれば、ダウンロードしてそこに置いてくれる。ちょっと驚き。

$ sudo mv ./files/Windows10_18090.iso /vm/.iso/
$ sudo vm iso
DATASTORE           FILENAME
default             Windows10_18090.iso

$ sudo vm iso https://download.freebsd.org/ftp/releases/ISO-IMAGES/11.2/FreeBSD-11.2-RELEASE-amd64-bootonly.iso
/vm/.iso/FreeBSD-11.2-RELEASE-amd64-bootonly.iso         308 MB 2228 kBps 02m22s
$ sudo vm iso
DATASTORE           FILENAME
default             FreeBSD-11.2-RELEASE-amd64-bootonly.iso
default             Windows10_18090.iso

仮想マシンインストール準備(仮想マシン設定)

前提。
仮想マシンは$vm_dir/(仮想マシン名)/に置かれる。
設定ファイルは$vm_dir/(仮想マシン名)/(仮想マシン名).confである。
なお仮想マシンのログは$vm_dir/(仮想マシン名)/vm-bhyve.log。

仮想マシン置き場が/vmで、仮想マシン名がwin10だと、
/vm/win10/win10.confなどとなる。

で、vm createでまず仮想マシンの枠を作る。
このとき、-tでテンプレートを指定し、-sでディスクイメージのサイズを指定できる。
デフォルトだと20Gなので余程のことがない限り指定は必須。
作った仮想マシンはvm listで確認。

$ sudo vm create -t windows -s 64G win10
$ sudo vm list
NAME       DATASTORE  LOADER  CPU  MEMORY  VNC  AUTOSTART  STATE
win10home  default    uefi    2    2G      -    No         Stopped
$ ls -lah /vm/win10/
total 13366199
drwxr-xr-x  2 root  wheel     6B May 11 14:10 .
drwxr-xr-x  6 root  wheel     6B May  4 20:34 ..
-rw-------  1 root  wheel    64G May 11 14:10 disk0.img
-rw-r--r--  1 root  wheel   299B May  5 21:35 win10.conf

vm configureで設定(win10.conf)を変更。
vi操作で書き換える。
以下のように。

uefi="yes"
graphics="yes"
graphics_wait="yes"
cpu=1
memory=4G
network0_type="e1000"
network0_switch="public"
disk0_type="ahci-hd"
disk0_name="disk0.img"
uuid="ff31650b-6ef0-11f9-963c-6cfffff61323"
utctime="no"
xhci_mouse="yes"

WindowsなのでBIOSはuefi。

graphicsをYesにするとVNCで接続できる。
デフォルトではbhyveホストのIPアドレス:5900で待ち受け。
変更したければそれぞれgraphics_listen、graphics_portで指定する。
また、解像度は800x600。graphics_res=“WxH"で変更できる。
graphics_waitを設定しておくと、VNC接続するまでゲストの起動を待ってくれる。
設定しなくても、仮想マシンをインストールモードで立ち上げたときには待ってくれるが、それは初回だけ。
Windowsのようにインストール時に複数回再起動するものはwaitしてもらったほうがいいだろうと。

Windows10homeの場合はcpuを1。(後述)

network0_typeにはe1000を指定。
インストールが無事に済んだらvirtioに変更するが、まずはe1000で。

network0_switchで本仮想マシンを繋ぐ仮想スイッチを指定する。
vm-bhyveのデフォルト、publicにしておく。
なお、起動した暁には、仮想マシンにはtapX(Xは数字)インタフェースが割り当てられ、publicに接続される。

disk0_type="ahci-hd"としていて、本来ならディスクイメージをzfsのボリュームにしてvirtio-blkと指定したいが、以下の通りahci-hdしかダメ。
https://github.com/churchers/vm-bhyve/wiki/Supported-Guest-Examples

the disk emulation needs to be ahci-hd.

vm-bhyveは標準で仮想マシンの時刻をUTCに設定するので、utctime="no"とする。
xhci_mouse="yes"にしておかないと、後々VNCで接続したときにまともにマウスが動かない。

仮想マシンインストール

さあインストール。vmにinstallサブコマンドを与えて起動。
状態はvm listで確認。
bhyveホスト側では$vm_dirにあるvm-bhyve.logをtailして状況を確認しつつ進めるがよいだろう。

$ sudo vm install win10home Windows10_18090.iso
Starting win10home
  * found guest in /vm/win10home
  * booting...
$ sudo vm list
NAME       DATASTORE  LOADER  CPU  MEMORY  VNC           AUTOSTART  STATE
win10home  default    uefi    1    2G      0.0.0.0:5900  No         Locked (camazotz)

lockedの通り、VNC待ち。
TigerVNCで接続し、インストールを進める。
繰り返すがこのときの接続先はbhyveホスト。

$ sudo tail -f ./vm-bhyve.log
Password:
May 12 17:44:20: dynamically allocated port 5900 for vnc connections
May 12 17:44:20: booting
May 12 17:44:20:  [bhyve options: -c 1 -m 4G -Hwl bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd -U 9e31650b-6e60-11e9-963c-6c4b90a61323]
May 12 17:44:20:  [bhyve devices: -s 0,hostbridge -s 31,lpc -s 4:0,ahci-hd,/vm/win10/disk0.img -s 5:0,virtio-net,tap0,mac=58:9c:fc:02:b6:f3 -s 6:0,fbuf,tcp=0.0.0.0:5900 -s 7:0,xhci,tablet]
May 12 17:44:20:  [bhyve console: -l com1,/dev/nmdm-win10.1A]
May 12 17:44:20:  [bhyve iso device: -s 3:0,ahci-cd,/vm/.config/null.iso]
May 12 17:44:20: starting bhyve (run 1)

実行イメージ

インストール後(ネットワークドライバの変更他)

無事にインストールが済んだら、ネットワークドライバを変更する。
ネットワークドライバの変更なのでVNCから接続しておく。
ドライバの配布先には、仮想マシンから直接、行ってしまってよい。

場所はここだが、「virtio-win fedora」あたりで検索すれば辿り着けるはず。
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/

5/12時点では0.1.164が最新。
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.164-2/virtio-win-0.1.164.iso

Dにマウントしたら、以下のパスがドライバの場所。パスの通りWindows10, 64bitね。
こちらに強制的に変更する。ネットワークが切断されるがお構いなしで。
D:\NetKVM\w10\amd64

実行イメージ02 実行イメージ03

シャットダウンしたら、bhyve側の設定ファイルでネットワークタイプをe1000からvirtio-netに変更する。
graphics_waitも忘れずに削除。

uefi="yes"
graphics="yes"
# graphics_wait="yes"
cpu=1
memory=4G
network0_type="virtio-net"
network0_switch="public"
disk0_type="ahci-hd"
disk0_name="disk0.img"
uuid="ff31650b-6ef0-11f9-963c-6cfffff61323"
utctime="no"
xhci_mouse="yes"

ゲストWindowsに与えるCPU数

Windows10の場合、割り当てられるCPUは、Homeだと1つ、Proだと2つまで。
コア/スレッドはHomeだと32、Proだと256。

コアを二つ以上与えようとしても、vm-bhyveでの指定はCPU数でのみ可能。
1.3からはより細かい設定ができるようになるそうだが、pkgからインストールするvm-bhyveは1.2なので1のままにしておく。

https://github.com/churchers/vm-bhyve/wiki/Guest-Example:-Windows

なお/boot/loader.confに以下の設定をすることで、CPU一つあたりのコア数を指定できるが、手元ではうまく動かないので特に説明はしない。

hw.vmm.topology.cores_per_package=4

上記パラメータの詳しい説明はこちら。
https://forums.freebsd.org/threads/bhyve-cpu-vcpu-cores-nad-threads.60169/

ホスト起動時に仮想マシンも起動させるには。

/etc/rc.confに以下の行を追加。
複数ある場合にはスペースを置いて起動させたい順に記載。
vm_delayは、複数の仮想マシンを起動する場合のインターバルを秒で指定。

vm_list="win10"
vm_delay="5"