Jak úspěšně zprovoznit PCI Passthrough NVIDIA grafiky do Bazzite VM v Proxmoxu

Předávání grafické karty (PCI Passthrough) do virtuálního stroje zní papírově jednoduše, ale v praxi narazíte na několik vrstev problémů. Od tvrdohlavého hostitelského systému, přes skrytá nastavení BIOSu, až po blokace při bootování. Zde je kompletní a ověřený postup, jak vzít NVIDIA GTX 1070 Ti a předat ji do herního systému Bazzite.

Izolace grafické karty od hostitele (Proxmox)

Nejčastější chybou je, že si Proxmox (respektive Debian) kartu přivlastní dříve, než zasáhne VFIO. Projevuje se to blikajícím kurzorem na monitoru nebo tím, že příkaz lspci -nnk ukazuje aktivní ovladač nouveau nebo efifb. Grafiku musíme kompletně odříznout.

Zablokování nativních ovladačů: Vytvoříme blacklist, aby se open-source ovladače vůbec nenačetly:

# Add native drivers to blacklist
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist.conf

Konfigurace VFIO a identifikace karty: Pomocí lspci -nn | grep -i nvidia si najdeme ID naší karty a jejího zvukového čipu (v mém případě 10de:1b82 a 10de:10f0). Nastavíme, aby si je přebral vfio-pci a explicitně zakážeme VGA:

# Force vfio to claim the GPU and disable vga
echo "options vfio-pci ids=10de:1b82,10de:10f0 disable_vga=1" > /etc/modprobe.d/vfio.conf

Vynucení modulů při startu a úprava GRUBu: Moduly pro VFIO musí najet jako první. Zápíšeme je do /etc/modules:

# Load vfio modules early
echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd" >> /etc/modules

Následně upravíme /etc/default/grub, kde přidáme parametry pro IOMMU a zakážeme framebuffer:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off"

Změny aplikujeme a restartujeme:

# Update bootloader and initramfs
update-grub
update-initramfs -u -k all
reboot

Výsledek: Monitor připojený ke grafice musí po restartu zůstat zcela černý (“No Signal”).

Řešení chyby “IOMMU not present” (BIOS)

I když do GRUBu přidáte parametry, Proxmox může při startu VM vyhodit chybu, že IOMMU chybí. Ověření provedeme příkazem:

find /sys/kernel/iommu_groups/ -type l

Pokud příkaz nevrátí žádný výstup, jádro nedokázalo rozdělit hardware do skupin. Problém je v BIOSu základní desky. Nestačí mít zapnutou běžnou virtualizaci (VT-x). Pro PCI Passthrough je nutné najít a povolit VT-d (Intel Virtualization Technology for Directed I/O). Na deskách ASUS se tato volba často nenachází u CPU, ale v sekci Advanced -> System Agent (SA) Configuration.

  • VT-x - virtualizace na CPU
  • VT-d - virtualizace na PCIe (pro přímé předání grafické karty do VM)

Falešný poplach se zamrznutím a 100% využitím RAM

Po přidání PCI zařízení do virtuálky uvidíte v grafu Proxmoxu, že využití paměti okamžitě vystřelilo na 100 %. Nejde o chybu ani únik paměti. Při předávání fyzického hardwaru musí hypervizor veškerou přidělenou paměť natvrdo uzamknout (Memory Pinning), aby k ní měla grafika přímý DMA přístup.

Co je potřeba udělat: V nastavení hardwaru virtuálního stroje otevřete Memory a odškrtněte položku Ballooning Device. Dynamické přidělování paměti je s PCI Passthrough nekompatibilní a VM by kvůli němu mohla skutečně zamrznout.

Chyba “bad shim signature” (Zákaz Secure Boot)

Bazzite (jakožto derivát Fedory) obsahuje proprietární ovladače, jejichž podpisy výchozí Microsoft klíče v Proxmoxu neznají. Výsledkem je zásek hned na začátku bootování. Nejrychlejší oprava přímo z Proxmox GUI:

  1. V záložce Hardware virtuálky odstraňte stávající EFI Disk.
  2. Přidejte nový EFI Disk (Add -> EFI Disk).
  3. Klíčový krok: Úplně dole odškrtněte “Pre-Enroll keys”. Tím se vytvoří čistý UEFI BIOS bez certifikátů, čímž je Secure Boot trvale deaktivován.

Finální přesun na fyzický hardware

Aby Bazzite posílal obraz primárně do fyzické NVIDIA karty a ne do webové noVNC konzole Proxmoxu, je potřeba udělat poslední dvě úpravy:

  1. V záložce Hardware změňte Display na None (none).
  2. U předávaného PCI zařízení (1070 Ti) zaškrtněte políčko Primary GPU.
  3. Přidejte klávesnici a myš přes Add -> USB Device s využitím “Use USB Vendor/Device ID”, což zajistí, že periferie zůstanou spárované i při přepojení do jiného fyzického portu v serveru.

Po spuštění virtuálního stroje již monitor ožije a zobrazí prostředí Bazzite s plným výkonem dedikované grafiky a nulovou latencí periferií.