null

Установка Windows в bhyve

В FreeBSD 10.0 появилась поддержка BSD hypervisor. Первоначальный список поддерживаемых операционных систем не очень радовал, но со временем он расширялся, и на текущий момент в bhyve можно установить в том числе и ОС семейства Windows. Чисто формально процедура установки Windows в bhyve описана в FreeBSD Wiki. Но, на мой взгляд, в этой процедуре есть два недостатка:

  1. Для установки используется "обычная" (без паравиртуализации) эмуляция HDD;
  2. Пункт ISO Remastering подразумевает процедуру перепаковки инсталляционного ISO образа с внедрением в неё virtio драйверов и подкладыванием AutoUnattend.xml, хотя, на мой взгляд, для разовой установки можно обойтись и без этого.

И всё это при том, что из паравиртулизированого "оборудования" используется только сетевой адаптер, хотя всем известно, что использование паравиртуализации для HDD даёт заметный выигрыш в производительности.

Поэтому мы пойдём своим путём. Для этого нам потребуются:

  1. Операционная система FreeBSD 10.0 и старше с установленными исходными кодами;
  2. Установленный пакет sysutils/uefi-edk2-bhyve;
  3. Инсталляционный ISO образ Windows;
  4. 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.

Коротко о себе:

Работаю в компании Tune-IT и тьютором кафедры Вычислительной техники в СПбГУИТМО.

Очень люблю команду cat, core solaris и IPv6.