linux-kernel-advanced virtualization kvm iommu pcie passthrough vfio advanced

IOMMU & PCI-E Passthrough: Direct Hardware (Artikel 404)

Beherrschung des PCI-Express Passthrough mittels IOMMU. Erfahren Sie alles über VT-d/AMD-Vi, die Isolation von Geräten via VFIO und den direkten Zugriff auf Hardware in virtuellen Maschinen.

# IOMMU Mastery: Hardware-Leistung ohne Hypervisor-Overhead

TL;DR / Management Summary Normalerweise emuliert KVM Hardware. Bei PCI-E Passthrough hingegen “schenken” wir der VM ein echtes Stück Hardware (z.B. eine Grafikkarte, eine NVMe oder eine 40Gbit-Netzwerkkarte). Die VM spricht direkt mit der Hardware, was Latenzen eliminiert. Das Herzstück ist die IOMMU (Input-Output Memory Management Unit). In diesem Modul lernen wir, wie wir den Host davon abhalten, die Hardware zu benutzen, und sie stattdessen sicher an eine VM binden.


# 1. Einführung & Architektur

Die Brücke zwischen Bus und Gast.

IOMMU (Intel VT-d / AMD-Vi) ist die Hardware-Einheit, die den Speicherzugriff von PCI-Geräten schützt und übersetzt. Sie sorgt dafür, dass eine VM mit direkter Hardware-Zuweisung nicht in den RAM des Hosts einbrechen kann.

# Der Passthrough-Weg (Mermaid)

graph TD
    subgraph "SLES Host (Ring 0)"
        A[Physical PCI Device: GPU / NIC]
        B[Kernel: vfio-pci Driver]
        A --- B
    end
    subgraph "Guest VM"
        C[Guest Driver]
        D[App]
    end
    B -->|IOMMU Mapping| C
    C --> D
    E[IOMMU Hardware] --- B
    E --- A

# 2. Aktivierung der IOMMU

Vom BIOS zum Kernel.

# Schritt 1: BIOS/UEFI

Aktivieren Sie “Intel VT-d” oder “AMD-Vi / IOMMU” in den CPU-Einstellungen Ihres Mainboards.

# Schritt 2: Kernel-Parameter (GRUB)

# Intel
intel_iommu=on iommu=pt
# AMD
amd_iommu=on iommu=pt
  • iommu=pt (Passthrough): Verhindert, dass der Kernel Geräte berührt, die nicht zugewiesen sind (Performance-Vorteil).

# 3. VFIO: Das Gerät binden

Hardware für den Host unsichtbar machen.

Damit der Host den Treiber für ein Gerät nicht lädt, binden wir es an den vfio-pci Stub-Treiber.

# Schritt 1: PCI-ID finden

lspci -nn | grep -i nvidia
# Output: 01:00.0 VGA ... [10de:1f08]

# Schritt 2: Bindung erzwingen

Datei: /etc/modprobe.d/vfio.conf

options vfio-pci ids=10de:1f08

# 4. Day-2 Operations: IOMMU Groups

Das Alles-oder-Nichts Prinzip.

Hardware-Geräte sind oft in Gruppen zusammengefasst. Wenn Sie ein Gerät einer VM geben wollen, müssen Sie alle Geräte aus dieser IOMMU-Gruppe mitgeben (oder der Host darf keines davon nutzen).

# Gruppen prüfen

find /sys/kernel/iommu_groups/ -type l

Sicherheit: Achten Sie darauf, dass der USB-Controller, den Sie durchreichen wollen, nicht auch Ihre Tastatur/Maus des Hosts steuert!


# 5. Troubleshooting & “War Stories”

Wenn die VM die Hardware nicht findet.

# Story 1: “Der Error 43 im Windows-Gast”

Symptom: Eine durchgereichte Nvidia-Grafikkarte wird im Gerätemanager von Windows mit “Fehler 43” angezeigt. Ursache: Der Nvidia-Treiber erkennt, dass er in einer VM läuft, und blockiert die Funktion (Markenschutz/Produktsegmentierung). Lösung: “Verstecken” Sie die VM vor dem Gast. In der Libvirt-XML:

<features>
  <kvm><hidden state='on'/></kvm>
</features>

# Story 2: “Das hängende System nach VM-Start”

Symptom: Sobald die VM mit Passthrough startet, friert der gesamte Host ein. Ursache: Das Gerät nutzt die gleiche IOMMU-Gruppe wie ein kritischer System-Bus oder der Disk-Controller. Lösung: Aktivieren Sie den ACS Patch (AcsOverride) im Kernel, um Gruppen künstlich aufzubrechen (Vorsicht: verringert die Sicherheit der Isolation!).


# 6. Fazit & Empfehlung

  • Wahl: Nutzen Sie Passthrough für Datenbanken (NVMe), High-Speed Netzwerke (40/100G) oder GPU-Workloads (KI/Transcoding).
  • Wartung: Prüfen Sie nach jedem BIOS-Update, ob IOMMU noch aktiv ist.
  • Wissen: PCI-E Passthrough verhindert das “Live Migration” Feature von VMs, da die Hardware physisch an den Host gebunden ist.

# Anhang: Cheatsheet

Aufgabe Befehl
IOMMU Status `dmesg
PCI IDs finden lspci -nn
Module laden modprobe vfio-pci
Gruppen skript for g in /sys/kernel/iommu_groups/*; do ...
Bindung prüfen `lspci -nnk
Interrupt Remap `dmesg
ACS Check `lspci -vvv