# VGA Grafikkarte in VM (KVM) durchreichen

Vorraussetzung wie im vorherigen Seite. Das auch die Grafikkarten geblacklistet wurden.

!!!!!VGA PASSTHROUGH funktioniert nur wenn das Host Betriebssystem im EFI Boot installiert wurde!!!!!  
!!!!Wenn eine Onboard Grafikkarte verfügbar ist, diese als Primär im BIOS einstellen.!!!!!

  
Siehe: [Einschalten von vt-d für Intel CPUs (iommu)](https://wiki.hacker-net.de/books/proxmox-ve/page/einschalten-von-vt-d-fur-intel-cpus-iommu "Einschalten von vt-d  für Intel CPUs (iommu)")

Eine VM Erstellen:  
[![Bildschirmfoto vom 2022-10-20 13-13-35.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/scaled-1680-/7ggpCYSJTVdyXe2U-bildschirmfoto-vom-2022-10-20-13-13-35.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/7ggpCYSJTVdyXe2U-bildschirmfoto-vom-2022-10-20-13-13-35.png)

Nun ISO und OS auswählen, hier eine Windows 10 Machine mit ISO. Wenns ein Linux ist,linux auswählen.  
Hier sind die Einstellungen egal.

  
[![Bildschirmfoto vom 2022-10-20 13-17-11.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/scaled-1680-/ejhY3WI7hduuGzWN-bildschirmfoto-vom-2022-10-20-13-17-11.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/ejhY3WI7hduuGzWN-bildschirmfoto-vom-2022-10-20-13-17-11.png)  
  
Hier:

Machine q53 auswählen.  
BIOS : OVMF (UEFI) auswählen  
Add EFI Disk : Haken rein  
Storage dazu auswählen  
Pre-Enroll-Keys : Haken rein  
Qemu Agent : Haken rein  
Add TPM : Haken rein  
Storage dazu auswählen  
  
[![Bildschirmfoto vom 2022-10-20 13-19-00.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/scaled-1680-/PhtBQTL8wLmiJN6g-bildschirmfoto-vom-2022-10-20-13-19-00.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/PhtBQTL8wLmiJN6g-bildschirmfoto-vom-2022-10-20-13-19-00.png)

Nun wieder wie gehabt eine Festplatte zuweisen. Ich nehme hier virtio und 128 GB.  
Denkt bei Windows dran, im Anschluss ein zweites CD/DVD Laufwerk mit den Virtio Treibern hinzuzufügen.  
Download hier : [https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md](https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md)  
Die latest Stable und die guest tools sin im Anhang dieses Artikels.  
  
Nun die CPU settings  
[![Bildschirmfoto vom 2022-10-20 13-26-59.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/scaled-1680-/sDOQDh9TQXJNCTeF-bildschirmfoto-vom-2022-10-20-13-26-59.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/sDOQDh9TQXJNCTeF-bildschirmfoto-vom-2022-10-20-13-26-59.png)  
  
Memory Settings  
  
[![Bildschirmfoto vom 2022-10-20 13-28-05.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/scaled-1680-/nae84vKL6w1GZwoV-bildschirmfoto-vom-2022-10-20-13-28-05.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/nae84vKL6w1GZwoV-bildschirmfoto-vom-2022-10-20-13-28-05.png)

Network Settings.  
Hier auf VirtIO stellen  
Das schöne ist das Win 110/1 die Treiber nicht kennt und somit ein lokales Konto verwendet/erstellt werden kann,  
  
[![Bildschirmfoto vom 2022-10-20 13-29-37.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/scaled-1680-/4yAKd5qFbPEF4Akn-bildschirmfoto-vom-2022-10-20-13-29-37.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/4yAKd5qFbPEF4Akn-bildschirmfoto-vom-2022-10-20-13-29-37.png)

Nun auf finisch, haken bei Start after creation raus.  
  
[![Bildschirmfoto vom 2022-10-20 13-30-41.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/scaled-1680-/Ed5qW5k9ZPcMbNsw-bildschirmfoto-vom-2022-10-20-13-30-41.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/Ed5qW5k9ZPcMbNsw-bildschirmfoto-vom-2022-10-20-13-30-41.png)  
  
Nun noch ein zweites CD/DVD Laufwerk erstellen für die VirtIO treiber. Aber nur nötig bei Windows VMS. sonst kann dieser Teil übersprungen werden.  
  
Nun die Grafikkarte hinzufügen.  
Dazu auf Add Hardware PCI, dann die Grafikkarte auswählen. mit der 0 bei der ID am ende.

[![Menü_001.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/scaled-1680-/yebSztNlFLOGwh7Y-menu-001.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/yebSztNlFLOGwh7Y-menu-001.png)

Hier Haken bei :  
All Funcktions rein  
Primary GPU rein  
Rom-BAR rein  
PCI-Express rein

[![Screenshot 2022-10-21 at 21-32-55 vservwohn - Proxmox Virtual Environment.png](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/scaled-1680-/GgPDIdGMqwJsmOSL-screenshot-2022-10-21-at-21-32-55-vservwohn-proxmox-virtual-environment.png)](https://wiki.hacker-net.de/uploads/images/gallery/2022-10/GgPDIdGMqwJsmOSL-screenshot-2022-10-21-at-21-32-55-vservwohn-proxmox-virtual-environment.png)

Damit die Graffikarte nicht geladen wird, müssen wir die IDs black listen.  
Dazu erstmal die IDs bekommen.  
Die bekommen wir mittels lspci -n -s 01:00  
01:00 ist die erste PCI ID usnerer Graffikarte (Siehe Screenshot Grafikkarten auswahl in derVM

```
lspci -n -s 01:00


Ausgabe:

01:00.0 0300: 10de:1380 (rev a2)
01:00.1 0403: 10de:0fbc (rev a1)


```

Nun die Beiden IDS blacklisten. DIese IDS sind von der GPU und der Soundkarte auf der GPU (HDMI hat Sound)

```
echo "options vfio-pci ids=10de:1380,10de:0fbc" > /etc/modprobe.d/vfio.conf
```

Den Grub anhängen

```
initcall_blacklist=sysfb_init vfio_pci.ids=10de:1380,10de:0fbc iommu=pt vfio_iommu_type1.allow_unsafe_interrupts=1"
```

In der GRUb conf hinzufügen  
Für legacy

```
nano /etc/default/grub
update grub
```

Unter EFI mit ZFS

```
Achtung in der cmdline kein gänsefüßchen am ende!!!!

nano /etc/kernel/cmdline
pve-efiboot-tool refresh
```

hinzufügen

dann initrafs aktualisieren

```
update-initramfs -u
```

Für Soundkartenasugabe kratzen verzerrung oder gar keinen Ton mehr

```
echo "options snd-hda-intel enable_msi=1" >> /etc/modprobe.d/snd-hda-intel.conf
```

  
  
  
  
Nun reboot, des Proxmox hosts.

```
reboot
```

Wenn alles geklappt hat sollte der Loginscreen nicht mehr kommen, sondern mitten im Boottext stecken bleiben, da die Grafikkarte hier abgewürgt wurde.

Nun nur noch die conf file der vm folgende Zeile am ende hinzufügen.

```
nano /etc/pve/qemu-server/<vmid>.conf
nano /etc/pve/qemu-server/100.conf 
```

```
...
args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=1234567890a4,kvm=off' -machine 'type=q35,kernel_irqchip=on'


```

Speichern.  
  
Nun die Vm starten, voila oder aber nein Kein Bild.  
Dann Fehlersuche hier

####   
Fehlersuche

  
Wenn das Bild auf no signal bleibt.  
  
In der /var/log/syslog schauen

```
tail -f /var/log/syslog
```

Hier der LOG Fehler. Bedeutet nicht im EFI Boot modus installiert der Host

```
Oct 21 16:15:57 mediawohn kernel: [   32.695520] vfio-pci 0000:01:00.0: No more image in the PCI ROM
Oct 21 16:15:58 mediawohn pvedaemon[1616]: <root@pam> end task UPID:mediawohn:000007B2:00000C05:6352A99B:qmstart:100:root@pam: OK
Oct 21 16:15:59 mediawohn kernel: [   34.964385] vfio-pci 0000:01:00.0: No more image in the PCI ROM
Oct 21 16:15:59 mediawohn kernel: [   34.964435] vfio-pci 0000:01:00.0: No more image in the PCI ROM

```

weiterer Fehler:  
Ab Kernel 5.15.+ muss in der grub conf   
`video=efifb:off`  
durch  
`initcall_blacklist=sysfb_init`  
ersetzt werden

```
- Invalid PCI ROM header signature
- kernel: vfio-pci 0000:01:00.0: BAR 1: can't reserve [mem 0x4020000000-0x402fffffff 64bit pref]
```

Jetzt bleibt nur noch Invalid PCI ROM header signature und cannot read device übrig

```
vfio-pci: Cannot read device rom at 0000:01:00.0

```

```
Oct 21 20:27:02 pve kernel: [  298.009369] vfio-pci 0000:01:00.0: vfio_ecap_init: hiding ecap 0x1e@0x258
Oct 21 20:27:02 pve kernel: [  298.009382] vfio-pci 0000:01:00.0: vfio_ecap_init: hiding ecap 0x19@0x900
Oct 21 20:27:02 pve kernel: [  298.010765] vfio-pci 0000:01:00.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff

```

  
  
  
Bevor es weiter geht testen ob die Grafikarte UEFI OMFV fähig ist

```
apt install git gcc make
git clone https://github.com/awilliam/rom-parser
cd rom-parser
make
```

Nun das rom aus der Grafikkarte holen ud testen

```
cd /sys/bus/pci/devices/0000:01:00.0/
echo 1 > rom
cat rom > /root/image.rom
echo 0 > rom
cd ~
cd rom-parser
./rom-parser /root/image.rom
```

Ausgabe :   
Hier ein Fehler, am ende.  
Dies bedeutet das Auf das Rom nicht zugegriffen werden kann. In meinem Beispiel hab Ich legacy Boot.  
Denn am einfachsten gets wenn das Hostsystem gleich als UEFI installiert ist.  
Die gegenprobe mach ich noch. Also für die Grafikkarte ein VBIOS holen

```
alid ROM signature found @0h, PCIR offset 190h
	PCIR: type 0 (x86 PC-AT), vendor: 10de, device: 1380, class: 030000
	PCIR: revision 0, vendor revision: 1
Error, ran off the end

```

VBIOS holen:  
  
unter [https://www.techpowerup.com/vgabios/](https://www.techpowerup.com/vgabios/) sein passendes rom suchen.  
Dann dort mit rechtsklick den Downlink undklicken und adresse kopiren meins liegt unter  
[https://www.techpowerup.com/vgabios/175522/Asus.GTX750Ti.2048.141104.rom](https://www.techpowerup.com/vgabios/175522/Asus.GTX750Ti.2048.141104.rom)   
Nun per wget das image ablegen.  
  
Wenn das passende rom nicht dabei selbst dumpen mit nvflash  
  
[https://www.techpowerup.com/download/nvidia-nvflash/](https://www.techpowerup.com/download/nvidia-nvflash/)  
 Usage:

```
chmox +x nvflash
./nvflash --save <filename>
```

ansonsten mit wget das richtige file holen, wenn bei techpowerup verfügbar.  
Beispiel für meine File

```
wget -O /usr/share/kvm/gtx750ti2048m.bin https://www.techpowerup.com/vgabios/175522/Asus.GTX750Ti.2048.141104.rom
```

ROM File ablegen unter  
/usr/share/kvm/meinromfile.bin   
  
Nun die vm conf anpassen und die romfile reinpacken ohnepfad nur den dateinamen

```
nano /etc/pve/qemu-server/1<VMID>.conf
nano /etc/pve/qemu-server/100.conf
```

Dort an die vga Zeile anfügen

```
,romfile=vbios.bin

Beispiel:

,romfile=gtx750ti2048m.bin


hostpci0: 0000:01:00,pcie=1,x-vga=1,romfile=gtx750ti2048m.bin
```

Nun an die Syslog hängen

```
tail -f /var/log/syslog
```

  
  
  
ff