====== FreeBSD - Bhyve ======
* **[[https://wiki.freebsd.org/bhyve|FreeBSD-Wiki: Bhyve]]**
* [[https://www.freebsd.org/doc/de_DE.ISO8859-1/books/handbook/virtualization-host-bhyve.html|FreeBSD als Host mit bhyve]]
* [[https://reviews.freebsd.org/D10335|VirtFS/9p filesystem passthrough support (virtio-9p)]]
* [[https://libvirt.org/drvbhyve.html|Bhyve driver]]
* [[https://libvirt.org/drvbhyve.html#fs-9p|Virtio-9p filesystem]]
[[https://wiki.freebsd.org/bhyve|Bhyve]] ist ein Hypervisor, auf dem Gastbetriebssysteme in einer virtuellen Maschine ausgeführt werden.
==== Bhyve installieren ====
das Virtualisierungsmodul laden:
> kldload vmm
> echo 'vmm_load="YES"' >> /boot/loader.conf
die Netzwerkanbindung vorbereiten:
> ifconfig tap0 create
> sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
> ifconfig bridge0 create
> ifconfig bridge0 addm igb0 addm tap0
> ifconfig bridge0 up
Konfiguration persistent machen, damit sie nach einem Reboot wieder vorhanden ist:
> echo "net.link.tap.up_on_open=1" >> /etc/sysctl.conf
> echo 'cloned_interfaces="bridge0 tap0"' >> /etc/rc.conf
> echo 'ifconfig_bridge0="addm igb0 addm tap0"' >> /etc/rc.conf
> echo 'kld_list="vmm nmdm"' >> /etc/rc.conf
für eine 2. VM bräuchte man dann ein weiteres TAP:
> ifconfig tap1 create
> ifconfig bridge0 addm tap1
und diese beiden Zeilen müssten dann in der '''' geändert werden:
> vi /etc/rc.conf
...
cloned_interfaces="bridge0 tap0 tap1"
ifconfig_bridge0="addm igb0 addm tap0 addm tap1"
...
==== FreeBSD als Gast in der VM starten ====
eine virtuelle Festplatte erstellen:
> truncate -s 16G freebsd.img
FreeBSD 10.3 in der VM installieren:
> sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M -t tap0 -d freebsd.img -i -I FreeBSD-10.3-RELEASE-amd64-bootonly.iso guestname
die VM von ihrer virtuellen Platte starten:
> sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d freebsd.img guestname
===== Verzeichnis in die VM durchreichen =====
VM-Start (''virtio-9p''):
# bhyve -AHP -s 0:0,hostbridge -s 3:0,ahci-cd,./debian-12.4.0-amd64-netinst.iso -s 4:0,virtio-blk,./linux.img -s 5,virtio-9p,sharename=/daten/mm -s 6:0,virtio-net,tap0 -s 31:0,lpc -l com1,stdio -c 4 -m 4G linuxguest
Mount mit Linux/FreeBSD
# mount -t 9p -o trans=virtio sharename /mm
Eintrag in der FsTab:
# vim /etc/fstab
sharename /mm 9p trans=virtio,rw 0 0
==== mehrere Verzeichnisse in die VM durchreichen ====
VM-Start (''virtio-9p''):
# bhyve -AHP -s 0:0,hostbridge -s 3:0,ahci-cd,./debian-12.4.0-amd64-netinst.iso -s 4:0,virtio-blk,./linux.img -s 5,virtio-9p,mmaudio=/daten/mm/Audio -s 6,virtio-9p,mmvideo=/daten/mm/Video -s 7:0,virtio-net,tap0 -s 31:0,lpc -l com1,stdio -c 4 -m 4G linuxguest
Mount mit Linux/FreeBSD
# mount -t 9p -o trans=virtio mmaudio /mm/Audio
# mount -t 9p -o trans=virtio mmvideo /mm/Video
Eintrag in der FsTab:
# vim /etc/fstab
mmaudio /mm/Audio 9p trans=virtio,rw 0 0
mmvideo /mm/Video 9p trans=virtio,rw 0 0
===== Bhyve-Netzwerkkonfiguration =====
* [[https://empt1e.blogspot.com/2016/10/bhyve-networking-options.html|Bhyve Networking Options]]
* __NAT__ - //VM und Host gehen über die selbe Netzwerkkarte und der selben IP ins Netz//
* [[https://adventurist.me/posts/00304|Simple ipfw NAT for bhyve virtual machines and vnet jails]]
* __Bridged networking__ - //VM und Host gehen über die selbe Netzwerkkarte aber unterschiedlichen IPs ins Netz//
* ''bhyve -c 2 -m 4G -w -H -s 0,hostbridge -s 3,ahci-cd,/home/novel/FreeBSD-11.0-CURRENT-amd64-20160217-r295683-disc1.iso **-s 5,virtio-net,tap1** -s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait -s 30,xhci,tablet -s 31,lpc -l com1,stdio -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd vm0''
* //Die IP-Adresse wird in der VM statisch konfiguriert.//
* __NIC Passthrough__ - //eine Netzwerkkarte alleine nur für die VM//
* ''bhyve -c 2 -m 1G -w -H -S -s 0,hostbridge -s 4,ahci-hd,/home/novel/img/uefi_fbsd.raw **-s 6,passthru,3/0/0** -s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait -s 30,xhci,tablet -s 31,lpc -l com1,stdio -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd vm0''
===== Bridged networking - VM und Host gehen über die selbe Netzwerkkarte aber unterschiedlichen IPs ins Netz =====
> pkg install sysutils/grub2-bhyve sysutils/bhyve-firmware
eine virtuelle Festplatte erstellen:
> truncate -s 20G linux.img
==== Linux als Gast in der VM installieren ====
Map-Datei für den Grub anlegen:
> vi device.map
(hd0) ./linux.img
(cd0) ./debian-12.4.0-amd64-netinst.iso
Grub läd den Linux-Kernel vom Installations-ISO-Image:
> grub-bhyve -m device.map -r cd0 -M 4G linuxguest
VM starten:
> bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img -s 4:0,ahci-cd,./debian-12.4.0-amd64-netinst.iso -l com1,stdio -c 4 -m 4G linuxguest
> bhyvectl --destroy --vm=linuxguest
==== in der VM installiertes Linux starten ====
Map-Datei für den Grub anpassen:
> vi device.map
(hd0) ./linux.img
Grub läd den Linux-Kernel von der virtuellen Festplatte:
> grub-bhyve -m device.map -r hd0,msdos1 -M 4G linuxguest
VM starten:
> bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img -l com1,stdio -c 4 -m 4G linuxguest
> bhyvectl --destroy --vm=linuxguest
==== Konsolen in der virtuellen Maschine ====
> kldload nmdm
> bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img -l com1,/dev/nmdm0A -c 4 -m 4G linuxguest
> cu -l /dev/nmdm0B
Connected
Ubuntu 13.10 handbook ttyS0
handbook login:
==== Virtuelle Maschinen verwalten ====
> ls -al /dev/vmm
total 1
dr-xr-xr-x 2 root wheel 512 Mar 17 12:19 ./
dr-xr-xr-x 14 root wheel 512 Mar 17 06:38 ../
crw------- 1 root wheel 0x1a2 Mar 17 12:20 guestname
crw------- 1 root wheel 0x19f Mar 17 12:19 linuxguest
crw------- 1 root wheel 0x1a1 Mar 17 12:19 otherguest
> bhyvectl --destroy --vm=guestname
==== vereinfachen per Skript am Beispiel einer Minecraft-VM ====
Das Host-System heißt in diesem Beispiel "server", die VM hat die IP "192.168.1.250" und den Namen "minecraft".
Auf dem Host-System tun wir fast alles als Benutzer "fritz" und in der VM als "root".
Die VM sollte derart vorbereitet sein, dass "fritz" sich passwortlos per ''ssh root@192.168.1.250'' einloggen kann.
* dazu muss eine statische Netzwerkkonfiguration im VM-OS konfiguriert sein
* weiterhin muss der Benutzer "fritz" einen SSH-Schlüssel besitzen
* und der öffentliche Teil von "fritz" seinem SSH-Schlüssel muss beim Benutzer "root" in der VM hinterlegt werden => [[::SSH-Schlüssel austauschen für ein passwortlosen Login#Schlüsselpaar generieren]]
Dann ist das stoppen der VM viel einfacher.
Auch wenn das Verzeichnis ''/home/Minecraft/'' in diesem Fall unter ''/home/'' liegt, ist es kein Home-Verzeichnis.
Ich habe es nur als allgemeinen Ablageort für die Dateien bezüglich dieser VM gewählt:
> ls -lha /home/Minecraft/
drwxr-xr-x 3 root wheel 10B 13 Nov. 02:22 .
drwxr-xr-x 31 root wheel 52B 13 Nov. 09:13 ..
-rwxr-xr-x 1 root wheel 754B 13 Nov. 09:11 Minecraft_VM.sh
drwxr-xr-x 2 root wheel 3B 13 Nov. 01:56 bin
-rw-r--r-- 1 root wheel 32B 13 Nov. 00:59 device.map
-rw-r--r-- 1 root wheel 100G 13 Nov. 09:50 linux.img
-rwx------ 1 root wheel 787M 12 Nov. 23:10 ubuntu-20.04-legacy-server-amd64.iso
> ls -lha /home/Minecraft/bin/
drwxr-xr-x 2 root wheel 3B 13 Nov. 01:56 .
drwxr-xr-x 3 root wheel 10B 13 Nov. 02:22 ..
-rwxr-xr-x 1 root wheel 88B 13 Nov. 01:58 mc.sh
#!/bin/bash
VM_GAST="Minecraft"
HDD="linux.img"
CDROM="ubuntu-20.04-legacy-server-amd64.iso"
CPU="2"
RAM="16G"
NETZWK="tap0"
#==============================================================================#
cd $(dirname ${0}) || exit 123
ps alxwww | fgrep -v grep | fgrep grub-bhyve | fgrep Minecraft && killall grub-bhyve
sleep 0.5
ps alxwww | fgrep -v grep | fgrep grub-bhyve | fgrep Minecraft && killall grub-bhyve
sleep 0.5
grub-bhyve -m device.map -r hd0,msdos1 -M ${RAM} ${VM_GAST}
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,${NETZWK} -s 3:0,virtio-blk,./${HDD} -l com1,stdio -c ${CPU} -m ${RAM} ${VM_GAST}
bhyvectl --destroy --vm=${VM_GAST}
ls -lha /dev/vmm/
#==============================================================================#
#!/bin/bash
screen -S Minecraft /home/Minecraft/Minecraft_VM.sh
> echo "fritz ALL=NOPASSWD:/home/Minecraft/bin/mc.sh" > /usr/local/etc/sudoers.d/minecraft
starten:
[fritz@server ~]$ sudo /home/Minecraft/bin/mc.sh
Kontrolle:
[fritz@server ~]$ sudo /home/Minecraft/bin/mc.sh
[fritz@server ~]$ ls -lha /dev/vmm/
total 2
dr-xr-xr-x 2 root wheel 512B 13 Nov. 09:22 .
dr-xr-xr-x 36 root wheel 512B 3 Nov. 11:01 ..
crw------- 1 root wheel 0x9b 13 Nov. 09:22 Minecraft
[root@server ~]# screen -ls
There are screens on:
3793.Minecraft (Detached)
1 Socket in /tmp/screens/S-root.
"fritz" verbindet sich über das Netzwerk mit der VM:
[fritz@server ~]$ ssh root@192.168.1.250
"root" öffnet den Screen, in dem die VM läuft (Konsolenzugang):
[root@server ~]# screen -x Minecraft
stoppen:
[fritz@server ~]$ ssh root@192.168.1.250 halt -p
=== Minecraft in der VM installieren ===
soweit ist jetzt alles vorbereitet, jetzt kann Minecraft installiert werden => [[https://www.digitalocean.com/community/tutorials/how-to-create-a-minecraft-server-on-ubuntu-20-04-de|So erstellen Sie einen Minecraft-Server unter Ubuntu 20.04]]
Den gewünschten Minecraft-Server kann man beispielsweise von [[https://getbukkit.org/|hier (die neueste von spigot)]] oder [[https://getbukkit.org/get/|hier (die stabilste von spigot)]] runterladen.
in der VM müssen folgende Kommandos ausgeführt werden:
root@minecraft:~# apt update
root@minecraft:~# apt full-upgrade
root@minecraft:~# apt install openjdk-11-jre-headless screen vim mc net-tools
root@minecraft:~# mkdir Minecraft_Server
root@minecraft:~# cd Minecraft_Server
root@minecraft:~/Minecraft_Server# wget https://cdn.getbukkit.org/spigot/spigot-1.16.1.jar -O spigot-1.16.1.jar
root@minecraft:~/Minecraft_Server# java -Xmx3G -Xms3G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -jar spigot-1.16.1.jar nogui
root@minecraft:~/Minecraft_Server# echo "eula=true" >> eula.txt
root@minecraft:~/Minecraft_Server# cp server.properties server.properties_original
root@minecraft:~/Minecraft_Server# cat server.properties_original | sed "s/server-ip=.*/server-ip=$(hostname -i)/" > server.properties
=== Skripte zum starten des Minecraft-Servers ===
Das Ubuntu-Linux 20.04 wurde in der VM bei der Installation mit dem Hostnamen "minecraft", dem Benutzer **"mc"** und der IP **"192.168.1.250"** konfiguriert.
Der Hostname und die IP wurden auch im DNS eingetragen.
Die VM sollte derart vorbereitet sein, dass "mc" sich passwortlos per ''ssh root@192.168.1.250'' einloggen kann.
* dazu muss eine statische Netzwerkkonfiguration im VM-OS konfiguriert sein
* weiterhin muss der Benutzer "mc" einen SSH-Schlüssel besitzen
* und der öffentliche Teil von "mc" seinem SSH-Schlüssel muss beim Benutzer "root" in der VM hinterlegt werden => [[::SSH-Schlüssel austauschen für ein passwortlosen Login#Schlüsselpaar generieren]]
Dann ist das stoppen der VM viel einfacher.
root@minecraft:~# ls -lh /root/
drwxr-xr-x 2 root root 4.0K Nov 13 13:33 bin
drwx------ 7 root root 4.0K Nov 13 14:16 Minecraft_Server
-rw-r--r-- 1 root root 0 Nov 13 11:13 systemctl
root@minecraft:~# ls -lh /root/bin/
-rwxr-xr-x 1 root root 620 Nov 13 13:33 mc.sh
-rwxr-xr-x 1 root root 206 Nov 13 10:59 Start.sh
#!/usr/bin/env bash
#
SERVER_JAR="spigot-1.16.1.jar"
SPEICHER="3G"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
echo java -Xmx3G -Xms3G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -jar spigot-1.16.1.jar nogui
cd /root/Minecraft_Server/ && java -Xmx${SPEICHER} -Xms${SPEICHER} -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -jar ${SERVER_JAR} nogui
#read PAUSE
#!/usr/bin/env bash
#
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
cd /root/Minecraft_Server/ || exit 123
screen -S Minecraft /root/bin/mc.sh
=== Start-Prozedur des Minecraft-Servers ===
einloggen in die VM:
[fritz@server ~]$ ssh root@192.168.1.250
Minecraft-Servers starten:
root@minecraft:~# /root/bin/Start.sh
aus dem Screen raus gehen:
[Strg]+[a],[d]
Kontrolle:
screen -ls
=== Stop-Prozedur des Minecraft-Servers ===
Entweder hat man die Konsole vom Start des Minecraft-Servers noch offen, dann kann man dort einfach "stop" eingeben.
... oder man muss sich wieder in die VM einloggen:
[fritz@server ~]$ ssh root@192.168.1.250
root@minecraft:~# screen -ls
There is a screen on:
1653.Minecraft (11/13/2020 01:33:14 PM) (Attached)
1 Socket in /run/screen/S-root.
root@minecraft:~# screen -x Minecraft
> stop
===== Port-Weiterleitung mit PF =====
[[::FreeBSD:FreeBSD - Port-Weiterleitung]]
===== NIC Passthrough - eine Netzwerkkarte alleine nur für die VM =====
* [[https://wiki.freebsd.org/bhyve/pci_passthru|bhyve PCI Passthrough]]
* [[https://www.davidschlachter.com/misc/t480-bhyve-wifi-pci-passthrough|FreeBSD WiFi PCI Passthrough: Intel Wireless 8265, bhyve, 13.0-CURRENT]]
> pciconf -v -l | fgrep -A1 -B3 network
em1@pci0:0:31:6: class=0x020000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x0d4d subvendor=0x1849 subdevice=0x0d4d
vendor = 'Intel Corporation'
device = 'Ethernet Connection (11) I219-V'
class = network
subclass = ethernet
Ethernet Connection: ''em1@pci0:**0:31:6 -> 0/31/6**''
interaktiv:
> devctl set driver -f pci0:0:31:6 ppt
bootfest:
> echo 'pptdevs="0/31/6"' >> /boot/loader.conf
> reboot
> pciconf -lv | fgrep -A1 -B3 network
ppt0@pci0:0:31:6: class=0x020000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x0d4d subvendor=0x1849 subdevice=0x0d4d
vendor = 'Intel Corporation'
device = 'Ethernet Connection (11) I219-V'
class = network
subclass = ethernet
... PCI passthrough requires direct memory allocation, hence the -S flags.\\
[[http://freebsd.1045724.x6.nabble.com/bhyve-PCI-pass-through-to-Linux-guest-td6061452.html|bhyve PCI pass-through to Linux guest]]
> grub-bhyve -m device.map -r hd0,msdos1 -S -M 4G Linux
> bhyve -A -H -P -S -s 0:0,hostbridge -s 1:0,lpc -s 2:0,passthru,ppt0 -s 3:0,virtio-blk,./linux.img -l com1,stdio -c 1 -m 4G Linux
> bhyvectl --destroy --vm=Linux
> ls -lha /dev/vmm
total 1
dr-xr-xr-x 2 root wheel 512B Mar 16 02:23 .
dr-xr-xr-x 21 root wheel 512B Mar 16 03:12 ..
crw------- 1 root wheel 0xae Mar 16 02:23 Linux
Wenn jetzt kein Ping durchgeht, dann hat man sicherlich vergessen, ein Eth-Kabel anzuschließen. :-)
Test mit DVD-Image:
> bhyve -A -H -P -S -s 0:0,hostbridge -s 1:0,lpc -s 2:0,passthru,ppt0 -s 3:0,virtio-blk,./linux.img -s 4:0,ahci-hd,./dvd.img -l com1,stdio -c 1 -m 4G Linux
//Wie kann man ''bhyve'' ein optisches, physisches Gerät (z.B.: ''/dev/cd0'') übergeben?// => [[https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=254813]]
===== GPU passthrough mit Bhyve =====
==== EuroBSDcon 2023 ====
* [[https://youtu.be/eurBCPj65oI|GPU passthrough with bhyve - Corvin Köhne - EuroBSDcon 2023]]-09-16 => ''FreeBSD 14.0''
* //GPU-passthrough wird genauso gemacht wie PCI-passthrough//
//Bhyve in FreeBSD 14.0 unterstützt AMD-Grafikkarten, Intel-Grafikkarten aber keine NVIDIA-Grafikkarten.//
//Für integrierten Intel-Grafikkarten muß Bhyve mit dem ''sysutils/edk2''-Port ein Firmware-Update bekommen, dann funktioniert es. Bei NVIDIA-Grafikkarten funktioniert der Reset nicht, d.h. beim ersten Start funktioniert alles aber ein zweiter Start der VM funktioniert nicht, bis das Host-System rebootet wurde. Integrierte AMD-Grafikkarten funktionieren nicht.//
=== Vorbereitungen in FreeBSD 14.0 ===
Extract ROM (mit Linux):
> lspci -v | grep -Fi vga
00:02.0 VGA compatible controller: ...
> echo 1 > /sys/devices/pci0000:00/0000:00:02.0/rom
> cat /sys/devices/pci0000:00/0000:00:02.0/rom > vbios.rom
> echo 0 > /sys/devices/pci0000:00/0000:00:02.0/rom
FreeBSD-Host-System
> kldload vmm
> pciconf -l | grep -Ei 'vga|xhci'
vgapci0@pci0:0:2:0: ...
xhci0@pci0:0:20:0: ...
> devctl detach pci0:0:2:0
> devctl detach pci0:0:20:0
> devctl set driver pci0:0:2:0 ppt
> devctl set driver pci0:0:20:0 ppt
> pciconf -l | grep -Fi ppt
ppt0@pci0:0:2:0: ...
ppt1@pci0:0:20:0: ...
=== AMD-GPU passthrough ===
//Es funktionieren nur externe bzw. dedizierte Grafikkarten, interne AMD-Grafikkarten funktionieren nicht.//
Call bhyve //(es ist notwendig, von UEFI zu booten)//:
> bhyve -HPw -c 2 -m 4G -s 0,hostbridge -s 1,nvme,/root/linux.raw -s 2,passthru,0/2/0,rom=/root/vbios.rom -s 3,virtio-net,tap0 -s 31,lpc -l com1,stdio -l bootrom,/usr/local/share/uefi-firmware/BHYVE_BHF_UEFI.fd,fwcfg=qemu Linux
=== Intel-GPU passthrough ===
//Interne Intel-Grafikkarten funktionieren, externe bzw. dedizierte Intel-Grafikkarten wurden noch nicht getestet.//
Bhyve benötigt ein Firmware-Update aus dem Ports-Tree: **''sysutils/edk2''**
FreeBSD-Host-System
> cd /usr/ports/sysutils/edk2
> git remote -v
...
Manchmal kann man das VBIOS nicht dumpen, dann muß man seinen Mainboard-Hersteller nach einem GOP fragen.
Das VBIOS ist nicht wirklich zwingend nötig aber es ist sehr hilfreich!
Call bhyve //(es ist notwendig, von UEFI zu booten)//:
> bhyve -AHPw -c 2 -m 4G -s 0,hostbridge \
-s 1,nvme,/root/linux.raw \
-s 2,passthru,0/2/0,rom=/root/vbios.rom \
-s 20,passthru,0/20/0 \
-s 3,virtio-net,tap0 \
-s 31,lpc \
-o pci.0.31.0.pcireg.vendor=host \
-o pci.0.31.0.pcireg.device=host \
-o pci.0.31.0.pcireg.revid=host \
-o pci.0.31.0.pcireg.subvendor=host \
-o pci.0.31.0.pcireg.subdevice=host \
-l com1,stdio \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_BHF_UEFI.fd,fwcfg=qemu Linux
//Hier wird die Option ''**-A**'' benötigt und man sollte darauf auchten, die Grafik über Slot "**2**" einzubinden und LPC muß über Slot "**31**" eingebunden werden!//
=== NVIDIA-GPU passthrough ===
//NVIDIA-Grafikkarten funktionieren nur beim ersten Mal, wenn man die VM restartet, dann funktioniert es nicht mehr. Erst nach einem Reboot des Host-Systems kann man die VM wieder starten.//
==== EuroBSDcon 2022 ====
* [[https://youtu.be/vnicQZvW0vs|GPU passthrough with bhyve - Corvin Köhne - EuroBSDcon 2022]] => ''FreeBSD 13.1''
__//Nur Standard-PCI-AMD-Grafikkarten (auch Windows) und integrierte Intel-Grafik (nur Linux + FreeBSD) können genutzt werden, mit integrierter AMD-Grafik funktioniert es nicht! An der Unterstützung von NVIDIA-Grafikkarten wird gearbeitet, funktioniert aber noch nicht.//__
__auf dem Host:__
> pciconf -l
...
vgapci0@pci0:0:2:0: ...
...
xhci0@pci0:0:20:0: ...
...
> kldload vmm
> devctl detatch pci0:0:2:0
> devctl detatch pci0:0:20:0
> devctl set driver pci0:0:20:0 ppt
> devctl set driver pci0:0:2:0 ppt
> pciconf -l
...
ppt1@pci0:0:2:0: ...
...
ppt0@pci0:0:20:0: ...
...
> bhyve -AHPSw -c cores=8 -m 8G -s 0,hostbridge -s 1,nvme,/root/linux.raw -s 2,passthru,0/2/0,rom=/root/gop.rom -s 20,passthru,0/20/0 -s 4,virtio-net,tap0 -s 31,lpc -l com1,stdio -l bootrom,/usr/local/share/uefi-firmware/BHYVE_BHF_UEFI.fd Linux
//[[https://youtu.be/vnicQZvW0vs?t=1359|Um Probleme mit Windows zu vermeiden, sollte die integrierte Intel-Grafik immer auf Slot "2" und der LPC immer auf Slot "31" gelegt werden!]]//
__in der VM:__
# dmidcode | grep -EA3 '^System Information'
System Information
Manufacturer: FreeBSD
Product Name: BHYVE
Version: 1.0
> lspci -v -s 0:2.0
00:02.0 VGA compatible controller: Intel Comporation HD Grafics 630 (rev 04)
Subsytem: Intel Comporation HD Grafics 630
...
Ca. **79% (Benchmark 182/231) der 2D-Grafikleistung** und ca. **92% (Benchmark 1080/1178) der 3D-Grafikleistung** des nativen Host-Systems kann in der VM genutzt werden.
Der GOP-Treiber (Graphics Output Protocol) für AMD- und NVIDIA-Grafikkarten ist im VBIOS enthalten und das VBIOS kann gedumpt werden.
Einzig verbliebene Schwierigkeit ist, wie bekommt man den GOP-Treiber für Intel-Grafik. Da gibt es noch keinen einheitlichen Weg für. Der in diesem Beispiel verwendete Treiber "''gop.rom''" stammt von dieser Webseite (Intel-ACRN): [[https://projectacrn.github.io/3.0/tutorials/gpu-passthru.html#steps]]
//siehe [[https://youtu.be/vnicQZvW0vs?t=1254]] für VBIOS für AMD-Grafikkarten und [[https://youtu.be/vnicQZvW0vs?t=1329]] für integrierte Intel-Grafik.//
Auf Windows kann man es mit ''GPU-Z'' dumpen.
Auf Linux kann das VBIOS wie folgt gedumpt werden:
> echo 1 > /sys/devices/pci0000:00/0000:00:02.0/rom
> cat /sys/devices/pci0000:00/0000:00:02.0/rom > vbios.rom
> echo 0 > /sys/devices/pci0000:00/0000:00:02.0/rom
Auf FreeBSD ???
//Wenn man sich ein VBIOS aus dem Internet besorgt, dann muß man aufpassen, dass es von der gleichen Version ist, wie das im Host-System.//
... -s 2,passthru,0/2/0,rom=/root/vbios.rom