PCIe passthrough: praktisk guide till GPU och nätverkskort i virtuella maskiner

Redaktionens viktigaste punkter

  • PCIe passthrough ger en virtuell maskin direkt åtkomst till ett grafikkort eller nätverkskort — med nästan samma prestanda som på fysisk hårdvara.
  • Du behöver en processor med IOMMU-stöd (Intel VT-d eller AMD-Vi), ett moderkort där det går att aktivera i BIOS, och helst separat grafik till värdsystemet.
  • Enheten måste ligga i en ren IOMMU-grupp. Delar den grupp med enheter som värden behöver blir passthrough opraktiskt utan riskabla genvägar.
  • Bind enheten till vfio-pci via dess PCI-ID:n i /etc/modprobe.d/vfio.conf och bygg om initramfs — det är den etablerade metoden.
  • Äldre AMD-kort (Polaris, Vega, RX 5000) drabbas av den kända reset bug; RX 6000 och nyare samt de flesta NVIDIA-kort klarar sig.

PCIe passthrough: praktisk guide till GPU och nätverkskort i virtuella maskiner

Med PCIe passthrough får en virtuell maskin direkt åtkomst till ett fysiskt grafikkort eller nätverkskort. Gästsystemets drivrutin pratar med riktig hårdvara i stället för emulerad, och prestandan landar på 95–98 procent av fysisk maskin. Det möjliggör en spel-VM med Windows på samma maskin som kör NAS:en, hårdvaruaccelererad transkodning i Plex, eller en brandväggs-VM med direkt åtkomst till nätverksportarna. Här är hela vägen från IOMMU-grupper och BIOS till vfio-pci och de vanligaste fallgroparna.

Vad är PCIe passthrough?

Normalt delar virtuella maskiner värdens resurser genom ett virtuellt lager. Med passthrough kringgås lagret för just den enheten: Linux-kärnans VFIO-ramverk kopplar bort enheten från värdens drivrutin och exponerar den direkt för gästen via IOMMU — Intel VT-d eller AMD-Vi — hårdvaran som isolerar enhetens minnesåtkomst.

Hårdvarukrav

KravVad du ska leta efter
Processor med IOMMUIntel VT-d eller AMD-Vi. Nästan alla moderna processorer har det, men kontrollera specifikationerna — vissa lågenergimodeller saknar stöd.
Moderkort med BIOS-stödEn inställning för VT-d/IOMMU. På billiga OEM-moderkort kan alternativet saknas helt.
Separat grafik till värdenHelst integrerad GPU eller ett andra grafikkort till värdsystemet, så att kortet du skickar vidare inte används av värden.
UEFI-lägeStäng av CSM. Moderna passthrough-uppsättningar bygger på OVMF (UEFI för virtuella maskiner).

Ett andra grafikkort behöver inte vara dyrt — ett gammalt kort räcker till värdens konsol. Single GPU passthrough, där värdens enda kort tillfälligt frigörs, fungerar men är skört och rekommenderas inte för en server som ska vara stabil.

Steg 1: aktivera IOMMU i BIOS

Gå in i BIOS/UEFI: på Intel letar du efter Intel VT-d, på AMD efter AMD-Vi eller IOMMU. Aktivera också Above 4G Decoding, som moderna grafikkort behöver för sina stora minnesområden (BAR), och stäng av CSM. Lämna Resizable BAR avstängt tills allt annat fungerar. Lägg sedan till rätt kernel-parameter i /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"  # Intel
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"    # AMD

Kör update-grub och starta om. Parametern iommu=pt sätter passthrough-läge: enheter som inte skickas till någon gäst använder värdens normala minnesmappning utan prestandakostnad. Verifiera med dmesg | grep -e DMAR -e IOMMU.

Steg 2: kontrollera IOMMU-grupperna

En IOMMU-grupp är den minsta uppsättning PCI-enheter som hårdvaran kan isolera tillsammans — hela gruppen måste till samma VM eller bindas till vfio-pci. Lista grupperna och leta upp ditt kort:

for d in /sys/kernel/iommu_groups/*/devices/*; do
  g=${d%/devices/*}; g=${g##*/}
  printf 'Group %s %s\n' "$g" "$(lspci -nns "${d##*/}")"
done | grep -i -e vga -e audio

En bra grupp innehåller bara kortet och dess ljudenhet — det är normalt. Innehåller den en USB-kontroller eller nätverksport som värden behöver, flytta kortet till en annan fysisk PCIe-plats: platser direkt på processorn har oftast bättre isolering än de via styrkretsen. Uppdatera också BIOS; tillverkare har förbättrat grupperingen i senare versioner.

Steg 3: binda enheten till vfio-pci

Ta reda på enhetens PCI-ID:n med lspci -nn — ta med både grafik- och ljudenheten — och skapa /etc/modprobe.d/vfio.conf:

options vfio-pci ids=10de:1f82,10de:10fa

Svarta lista värdens ordinarie drivrutiner (nouveau/nvidia eller amdgpu) så att de inte tar enheten först, bygg om initramfs med update-initramfs -u -k all och starta om. lspci -nnk ska nu visa “Kernel driver in use: vfio-pci”. Lägg sedan till enheten som PCI-enhet i din VM i Proxmox, virt-manager eller Unraid.

ACS override: nödlösning med varningstext

Vägrar grupperna bli rena finns ACS override-patchen, som tvingar fram finare gruppindelning. Den fungerar genom att ljuga för kärnan om hårdvarans isoleringsförmåga — det försvagar IOMMU:s säkerhetsisolering och kräver en patchad kärna vid varje uppdatering. Se det som en sista utväg för testbänkar, inte standard på en server du litar på. Ett moderkort med naturligt bra gruppering är nästan alltid billigare än underhållet av en patchad kärna.

Vanliga fallgropar

AMD reset bug

Vissa AMD-kort återställs inte korrekt när VM:en stängs av, och nästa start hänger sig tills värden startas om. Drabbade är Polaris (RX 400/500), Vega och RX 5000. Från RDNA2 (RX 6000) och framåt är problemet i praktiken borta. Det finns den experimentella lösningen vendor-reset för vissa kort, men köper du AMD för passthrough i dag: sikta på RX 6000 eller nyare.

BAR-utrymme och ROM-filer

Moderna kort exponerar stora BAR-områden. Får värden inte allokera dem hjälper Above 4G Decoding i BIOS och kernel-parametern pci=realloc. Använd maskintypen Q35 med OVMF, inte i440fx. Vägrar kortet initieras i gästen kan du behöva dumpa dess vBIOS till en ROM-fil och mata in till VM:en — se till att ROM-filen matchar exakt ditt kort.

NVIDIAs felkod 43

NVIDIAs konsumentdrivrutiner har vägrat laddas när de upptäcker en virtuell maskin (felkod 43). Lösningen är att dölja hypervisorn med kvm=off och ett förfalskat Hyper-V vendor-ID i gästens CPU-konfiguration. RTX 3000 och nyare drivrutiner är mer förlåtande, men kod 43 betyder att du ska börja här.

GrafikkortPassthrough-anmärkning
NVIDIA RTX 3000/4000Ingen känd reset bug. Kod 43 ovanligt på nya drivrutiner. Kräver Above 4G Decoding för stora BAR.
NVIDIA GTX 1000 / RTX 2000Stabilt reset-beteende, men kod 43 är vanligt — räkna med vendor-ID-tricket i Windows.
AMD RX 6000/7000Ingen reset bug enligt community-rapporter. Öppen amdgpu-drivrutin fungerar direkt i Linux-gäster.
AMD RX 5000 / Vega / PolarisKänd reset bug: kräver omstart av värden mellan VM-sessioner. Undvik, eller testa vendor-reset.
Quadro / Radeon ProProffskort beter sig bäst men kostar mer. Intressanta begagnat för transkodning.

Användningsfall på hemservern

Spel-VM: en Windows-VM med dedikerat grafikkort, USB-kontroller för tangentbord och mus samt CPU-pinning. Med Looking Glass visas gästens bild på värdens skärm utan extra monitor. Räkna med underhåll vid drivrutins- och kärnuppdateringar.

Plex-transkodning: ett litet NVIDIA-kort i en VM ger utmärkt prestanda per watt — äldre Quadro-kort med obegränsade sessioner är fynd. Enklast är ofta processorns Quick Sync om den har integrerad grafik.

NAS med HBA och brandvägg med NIC: skicka ett SAS HBA direkt till en TrueNAS-VM så får ZFS rå åtkomst till diskarna. Skicka fysiska nätverksportar till en OPNsense-VM för en virtualiserad brandvägg. Samma regler gäller: rena IOMMU-grupper och vfio-pci-bindning.

Slutsats: praktiska köpråd

Framgången avgörs till 90 procent av hårdvaruvalet, innan en enda konfigurationsrad skrivs. Välj ett moderkort med rykte om bra IOMMU-gruppering, uppdatera BIOS direkt och planera för två grafikkort från början. Undvik AMD Polaris, Vega och RX 5000 på grund av reset bug — välj RX 6000 eller nyare, eller NVIDIA från GTX 1000 och uppåt. Testa hela cykeln — starta VM, stäng av, starta igen — innan du litar på uppsättningen i drift. Då får du en maskin som är spelrigg, mediaserver och NAS på samma gång.

Leave a Comment