Skip to main content

KVM - PCI Passthrough

Diese Seite enthält nur eine grobe Dokumentation und richtet sich an Arch Linux. Detailtiere Erklärungen werden evtl. nachgereicht. Siehe auch diesen Beitrag.

Je nach dem welches PCI Gerät, bzw. Geräte man in eine VM bringen möchte, muss man entsprechend mittels lspci -nn die Geräte IDs suchen. Diese sehen rechts (z.B. 10de:1e87).

image2022-3-18_22-1-29.png

Grub Config bearbeiten und folgende Kernel Parameter hinzufügen.

GRUB_CMDLINE_LINUX_DEFAULT="[...] amd_iommu=on iommu=pt"

Nun die GRUB-Config aktualisieren.

sudo grub-mkconfig -o /boot/grub/grub.cfg

Datei /etc/modprobe.d/vfio.conf erstellen und folgendes mit den entsprechenden Geräte IDs in die erste Zeile einfügen und speichern. Ein PCI Gerät kann mehrere Geräte IDs haben - es muss die komplette IOMMU-Gruppe (also die komplette PCI Steckkarte) aufgenommen werden.

options vfio-pci ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9

Mit diesem Bash Script kann man die einzelnen Gruppen auflisten.

#!/bin/bash
shopt -s nullglob
for g in $(find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V); do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;

Alternativ können die IDs auch als Kernel Parameter angegeben werden (GRUB_CMDLINE_LINUX_DEFAULT="[...] vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9").

Als nächstes müssen die folgenden Module zu /etc/mkinitcpio.conf hinzugefügt werden.

MODULES=(... vfio_pci vfio vfio_iommu_type1 ...)
[...]
HOOKS=(... modconf ...)

Nun das initramfs Image aktualisieren.

sudo mkinitcpio -P

System herunterfahren. Hat man - wie in diesem Beispiel - eine Grafikkarte genommen, müssen nun die Monitore an eine andere Grafikkarte angeschlossen werden. Eine iGPU (im Prozessor integrierte Grafikeinheit) ist auch möglich, in diesem Fall also am Mainboard anschließen. Das System kann nun wieder gestartet werden.

Im BIOS / UEFI muss nach Möglichkeit die primäre GPU ausgewählt werden und zwar die, die wir nicht in die VM bringen wollen. Manche Mainboards bieten so eine Auswahlmöglichkeit nicht. Hier gilt normalerweise: Die GPU, welche weiter oben, also näher zur CPU eingesteckt ist, ist die primäre.

Nachdem das System wieder hochgefahren wurde kann im Virtual Machine Manager eine VM erstellt werden. Wichtig ist, dass als Firmware UEFI (installieren mit pacman -S ovmf) und als Chipset Q35 ausgewählt ist.

image2022-3-18_22-26-42.png

Die VM sollte nun erst mal fertig installiert und eingerichtet werden.

Als nächstes können schließlich die entsprechenden PCI Geräte zugewiesen werden (es müssen alle Geräte der PCI Steckkarte hinzugefügt werden).

image2022-3-18_22-32-38.png

In der VM sollte nun das Gerät erkannt werden. Nun kann wie gewohnt ein Treiber in der VM für die PCI Karte installiert werden.