В FreeBSD 10.0 появилась поддержка BSD hypervisor. Первоначальный список поддерживаемых операционных систем не очень радовал, но со временем он расширялся, и на текущий момент в bhyve можно установить в том числе и ОС семейства Windows. Чисто формально процедура установки Windows в bhyve описана в FreeBSD Wiki. Но, на мой взгляд, в этой процедуре есть два недостатка:
- Для установки используется "обычная" (без паравиртуализации) эмуляция HDD;
- Пункт ISO Remastering подразумевает процедуру перепаковки инсталляционного ISO образа с внедрением в неё virtio драйверов и подкладыванием AutoUnattend.xml, хотя, на мой взгляд, для разовой установки можно обойтись и без этого.
И всё это при том, что из паравиртулизированого "оборудования" используется только сетевой адаптер, хотя всем известно, что использование паравиртуализации для HDD даёт заметный выигрыш в производительности.
Поэтому мы пойдём своим путём. Для этого нам потребуются:
- Операционная система FreeBSD 10.0 и старше с установленными исходными кодами;
- Установленный пакет sysutils/uefi-edk2-bhyve;
- Инсталляционный ISO образ Windows;
- ISO образ в драйверами virtio для Windows.
Начать установку придётся с исправления определения BLOCKIF_IOV_MAX в block_if.h на 128:
# cd /usr/src/usr.sbin/bhyve
# svn diff
Index: block_if.h
===================================================================
--- block_if.h (revision 333319)
+++ block_if.h (working copy)
@@ -41,7 +41,7 @@
#include <sys/uio.h>
#include <sys/unistd.h>
-#define BLOCKIF_IOV_MAX 33 /* not practical to be IOV_MAX */
+#define BLOCKIF_IOV_MAX 128 /* not practical to be IOV_MAX */
struct blockif_req {
struct iovec br_iov[BLOCKIF_IOV_MAX];
# make
[output omitted]
# cp /usr/obj/usr/src/amd64.amd64/usr.sbin/bhyve/bhyve /usr/sbin/bhyve2
# svn revert block_if.h
Если этого не сделать, то после начала использования virtio драйвера для HDD bhyve аварийно завершит свою работу с сообщением:
Assertion failed: (n >= 2 && n <= BLOCKIF_IOV_MAX + 2), function pci_vtblk_proc, file /usr/src/usr.sbin/bhyve/pci_virtio_block.c, line 218.
Это известная проблема, но это изменение ломает работу виртуальных машин на Linux. И для сохранения возможности запуска Linux и копируется исправленный файл под другим именем.
На текущий момент bhyve не поддерживает работу с образами диска в формате QCOW2, и, соответственно, поддержки снимков тоже нет. Поэтому, для упрощения работы со снимками, создаём отдельный ZFS dataset:
# zfs create export/bhyve/windows
И создаём в нём файл, который будет играть роль дискового хранилища:
# truncate -s 64g vda.img
Cоздаём tap интерфейс и подключаем его в нужный bridge:
# ifconfig bridge0 addm `ifconfig tap plumb`
Также не будет лишним разрешить tap интерфейсу переходить в состояние UP при его открытии:
# sysctl net.link.tap.up_on_open=1
После чего запускаем виртуальную машину:
# bhyve -c 2 -m 2048M -H -w \
-s 0:0,hostbridge -s 3:0,virtio-blk,/export/bhyve/windows/vda.img,sectorsize=512/4096 \
-s 4:0,ahci-cd,/path/to/windows.iso \
-s 5:0,ahci-cd,/path/to/virtio-win-0.X.XXX.iso \
-s 29,fbuf,tcp=0.0.0.0:5900,wait \
-s 31,lpc \
-s 10,virtio-net,tap0 \
-l com1,stdio \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
windows
После этого в соседнем окне можно запустить:
$ vncviewer localhost:0
И получить консоль виртуальной машины, через которую можно провести процедуру установки операционной системы. При этом из-за указания wait виртуальная машина будет приостановлена до тех пор, пока не произойдёт подключение по VNC.
В момент, когда Windows скажет:
No drives were found. Click Load Driver to provide a mass storage driver for installation.
Можно нажать Load Driver и установить virtio драйвера сетевого адаптера и жёсткого диска со второго подключенного CD-ROM . По окончанию установки и после настройки удалённого подключения по RDP ISO образы и консоль больше не потребуются и запускать виртуальную машину можно будет командой:
# bhyve2 -c 2 -m 2048M -H -w \
-s 0:0,hostbridge -s 3:0,virtio-blk,/export/bhyve/windows/vda.img,sectorsize=512/4096 \
-s 31,lpc \
-s 10,virtio-net,tap0 \
-l com1,stdio \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
windows
Обновление: На текущий момент проблему с assertion failed в bhyve исправли, судя по diff для 12-STABLE в коммите r348374.