BHYVE
Запускаем гипервизор:
VM="freebsd"
while :; do
bhyvectl --vm=$VM --destroy
bhyve -H -P -s 0,amd_hostbridge \
-s 31,lpc -l bootrom,/usr/share/bhyve/uefi-csm-rom.bin \
-c 2 \
-m 4G \
-s 3:0,virtio-blk,/dev/zvol/dsk/rpool/vms/freebsd/freebsd-disk0 \
-s 7:0,virtio-net-viona,free0 \
-s 29,fbuf,vga=off,rfb=0.0.0.0:5900,w=1024,h=768,wait \
-s 2,ahci-cd,/vms/freebsd/freebsd.iso \
$VM
status=$?
bhyvectl --vm=$VM --destroy
[ ${status} -ne 0 ] && break
done
FrameBuffer
Включаем VNC строкой -s 29,fbuf,vga=off,rfb=0.0.0.0:5900,w=1024,h=768,wait, где:
29 - номер на шине (можно брать любой свободный)
fbuf - устройство framebuffer
vga=off - выключить VGA (в противном случае упадёт в корку)
rfb - протокол (VNC), можно tcp
0.0.0.0:5900 - где слушать порт
w, h - размер окна (1024x768 в этом примере)
wait - ожидать прихода клиентов
Для работы графики требуется bootrom uefi-rom.bin:
-l bootrom,/usr/share/bhyve/uefi-rom.bin
Диски
Для явного указания размера сектора (секторов) делаем так:
-s 3:0,virtio-blk,/dev/zvol/dsk/rpool/bhyve/dilos/disk0,sectorsize=512/4096
В этом примере диск будет 512E, по умолчанию у нас 512 байт на сектор (как в kvm)
Конфиг под win:
bhyve -H -P -s 0,amd_hostbridge \
-s 31,lpc \
-l bootrom,/usr/share/bhyve/uefi-rom.bin \
-c 2 -m 2G \
-s 3:0,ahci-cd,/kvm/ISO/SW_DVD9_Win_Server_STD_CORE_2019_1809.2_64Bit_Russian_DC_STD_MLF_X22-18461.ISO \
-s 4:0,virtio-blk,/dev/zvol/dsk/rpool/kvm/disk00 \
-s 7:0,virtio-net-viona,net0 \
-s 28,fbuf,vga=off,tcp=0.0.0.0:5900,w=1024,h=768,wait \
-s 30,xhci,tablet \
win
xhci,tablet синхронизирует перемещение указателя мыши VNC-клиента с гостевой системой.
Для AHCI есть возможность эмулировать SSD, для этого после имени файла нужно дописать nmrr=1 (Nominal Media Rotational Rate или RPM, по умолчанию 0):
-s 4:0,ahci,hd:/vms/zfstest/ahci.data,nmrr=1
root@ztest:~# diskinfo
TYPE DISK VID PID SIZE RMV SSD
- c2t0d0 Virtio Block Device 100G no no
- c1t0d0 Virtio Block Device 8G no no
- c3t0d0 Virtio Block Device 8G no no
- c4t0d0 Virtio Block Device 8G no no
SATA c5t0d0 BHYVE SATA DISK 50G no yes <=== SSD!
NVME
Для эмуляции NVMe нужно указать драйвер в строке вида:
-s 4:0,nvme,/path/to/file.data
Первое число указывает слот PCI, их может быть только 32 штуки (0-31), последняя 31 принадлежит lpc. Второе число указывает на функцию PCI (0-7). Для добавления ещё NVME просто увеличиваем второе число до 7.
Нумерация устройств
Общий формат это -s [bus:]:slot:func.
bus - шина, может быть от 0 до 255, по умолчанию если не указано 0
slot - номер слота на шине от 0 до 31
func - функция устройства, может быть от 0 до 7
Если указывать несколько шин (bus), то при запуске bhyve выводит ошибку, что такая конфигурация запрещена для MPtable, запустить можно путём отключения этой особенности (опция -Y).
virtio-blk
Общее количество дисков virtio может быть 64, на 65 паникует bootrom (uefi-csm-rom.bin):
!!!! X64 Exception Type - 000000000000000E CPU Apic ID - 00000000 !!!!
RIP - 00000000BFBE5FC0, CS - 0000000000000028, RFLAGS - 0000000000010202
ExceptionData - 0000000000000000
RAX - 00000040BF23BB98, RCX - 00000040BF23BB98, RDX - 0000000000000000
RBX - 00000000BFBE3C25, RSP - 00000000BFBDD048, RBP - 00000000BFBDD060
RSI - 00000000BFBDD230, RDI - 00000040BF23BB98
R8 - 0000000000000000, R9 - 0000000000000001, R10 - 00000000BF9F7F8D
R11 - 00000000BFBDCE90, R12 - 0000000000000000, R13 - 0000000000000000
R14 - 0000000000000000, R15 - 0000000000000000
DS - 0000000000000008, ES - 0000000000000008, FS - 0000000000000008
GS - 0000000000000008, SS - 0000000000000008
CR0 - 0000000080000033, CR2 - 00000040BF23BB98, CR3 - 00000000BFB7C000
CR4 - 0000000000000668, CR8 - 0000000000000000
DR0 - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000
DR3 - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400
GDTR - 00000000BFB66E98 000000000000003F, LDTR - 0000000000000000
IDTR - 00000000BF2EE018 0000000000000FFF, TR - 0000000000000000
FXSAVE_STATE - 00000000BFBDCCA0
!!!! Find PE image /export/ws/smartos-live/projects/illumos-extra/uefi-edk2/
uefi-edk2-a36132939e-64/Build/BhyveX64/RELEASE_ILGCC/X64/MdeModulePkg/Core/
Dxe/DxeMain/DEBUG/DxeCore.dll (ImageBase=00000000BFBDE000, EntryPoint=00000000BFBDE260) !!!!
Топология CPU
Есть возможность задать количество процессоров, ядер, тредов. На текущий момент общее количество виртуалных процессоров не может превышать 32 (VM_MAXCPU в файле uts/i86pc/sys/vmm.h). При этом оно должно точно совпадать с произведением количества сокетов, ядре и потоков:
cpus = sockets * cores * threads
Если это не так, то будет выдаваться ошибка топологии: “bhyve: invalid cpu topology 'cpus=32,sockets=8,cores=2'“
Синтаксис следующий:
-c cpus=32,sockets=8,cores=2,threads=2
Если какой-то параметр не указан, то подразумевается 1. Результат виртуальной машины описанной выше топологии:
root@ztest:~# psrinfo -pv
The physical processor has 2 cores and 4 virtual processors (0-3)
The core has 2 virtual processors (0-1)
The core has 2 virtual processors (2-3)
x86 (GenuineIntel 20655 family 6 model 37 step 5 clock 2393 MHz)
Intel(r) Core(tm) i3 CPU M 370 @ 2.40GHz
The physical processor has 2 cores and 4 virtual processors (4-7)
The core has 2 virtual processors (4-5)
The core has 2 virtual processors (6-7)
x86 (GenuineIntel 20655 family 6 model 37 step 5 clock 2393 MHz)
Intel(r) Core(tm) i3 CPU M 370 @ 2.40GHz
The physical processor has 2 cores and 4 virtual processors (8-11)
The core has 2 virtual processors (8-9)
The core has 2 virtual processors (10-11)
x86 (GenuineIntel 20655 family 6 model 37 step 5 clock 2393 MHz)
Intel(r) Core(tm) i3 CPU M 370 @ 2.40GHz
The physical processor has 2 cores and 4 virtual processors (12-15)
The core has 2 virtual processors (12-13)
The core has 2 virtual processors (14-15)
x86 (GenuineIntel 20655 family 6 model 37 step 5 clock 2393 MHz)
Intel(r) Core(tm) i3 CPU M 370 @ 2.40GHz
The physical processor has 2 cores and 4 virtual processors (16-19)
The core has 2 virtual processors (16-17)
The core has 2 virtual processors (18-19)
x86 (GenuineIntel 20655 family 6 model 37 step 5 clock 2393 MHz)
Intel(r) Core(tm) i3 CPU M 370 @ 2.40GHz
The physical processor has 2 cores and 4 virtual processors (20-23)
The core has 2 virtual processors (20-21)
The core has 2 virtual processors (22-23)
x86 (GenuineIntel 20655 family 6 model 37 step 5 clock 2393 MHz)
Intel(r) Core(tm) i3 CPU M 370 @ 2.40GHz
The physical processor has 2 cores and 4 virtual processors (24-27)
The core has 2 virtual processors (24-25)
The core has 2 virtual processors (26-27)
x86 (GenuineIntel 20655 family 6 model 37 step 5 clock 2393 MHz)
Intel(r) Core(tm) i3 CPU M 370 @ 2.40GHz
The physical processor has 2 cores and 4 virtual processors (28-31)
The core has 2 virtual processors (28-29)
The core has 2 virtual processors (30-31)
x86 (GenuineIntel 20655 family 6 model 37 step 5 clock 2393 MHz)
Intel(r) Core(tm) i3 CPU M 370 @ 2.40GHz
root@ztest:~# psrinfo
0 on-line since 04/23/2021 21:07:09
1 on-line since 04/23/2021 21:07:10
2 on-line since 04/23/2021 21:07:10
3 on-line since 04/23/2021 21:07:10
4 on-line since 04/23/2021 21:07:10
5 on-line since 04/23/2021 21:07:10
6 on-line since 04/23/2021 21:07:10
7 on-line since 04/23/2021 21:07:10
8 on-line since 04/23/2021 21:07:10
9 on-line since 04/23/2021 21:07:10
10 on-line since 04/23/2021 21:07:11
11 on-line since 04/23/2021 21:07:11
12 on-line since 04/23/2021 21:07:11
13 on-line since 04/23/2021 21:07:11
14 on-line since 04/23/2021 21:07:11
15 on-line since 04/23/2021 21:07:12
16 on-line since 04/23/2021 21:07:12
17 on-line since 04/23/2021 21:07:12
18 on-line since 04/23/2021 21:07:12
19 on-line since 04/23/2021 21:07:13
20 on-line since 04/23/2021 21:07:13
21 on-line since 04/23/2021 21:07:13
22 on-line since 04/23/2021 21:07:14
23 on-line since 04/23/2021 21:07:28
24 on-line since 04/23/2021 21:07:29
25 on-line since 04/23/2021 21:07:29
26 on-line since 04/23/2021 21:07:30
27 on-line since 04/23/2021 21:07:31
28 on-line since 04/23/2021 21:07:31
29 on-line since 04/23/2021 21:07:32
30 on-line since 04/23/2021 21:07:33
31 on-line since 04/23/2021 21:07:33