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 |