Getting GPU Passthrough Working on Proxmox (The Honest Guide)

|5 min read|

I've spent more time than I care to admit fighting GPU passthrough on Proxmox. Between cryptic kernel messages, VMs that boot to a black screen, and IOMMU groups that just refuse to cooperate, it's the kind of rabbit hole that eats entire weekends.

Yoga Novaindra

Author

The Problem With GPU Passthrough

The whole idea is simple enough on paper: you have a GPU sitting on your Proxmox host, and you want a VM to claim it completely. Not share it through some virtual layer, but own the hardware directly. For gaming VMs, AI workloads, or any GPU-accelerated task, this is the difference between night and day performance.

The tricky part is that your host OS (Proxmox, which is Debian-based) wants to use that GPU too. And your motherboard's firmware might not fully support the IOMMU groupings you need. There are a lot of moving pieces.

Let's go through them one by one.


Step 1: Install the Firmware Packages First

Before anything else, grab the non-free firmware packages. Skipping this caused me hours of confusion early on:

sudo apt install firmware-misc-nonfree firmware-intel-sound

The firmware-misc-nonfree package covers a broad range of hardware microcode that the kernel needs to properly initialize devices. Without it, some hardware might appear in your IOMMU groups but misbehave during passthrough in subtle ways.


Step 2: Enable IOMMU in GRUB

This is the critical one. IOMMU (Input-Output Memory Management Unit) is what lets the CPU enforce memory isolation between devices, which is exactly what makes passthrough safe and functional.

Edit /etc/default/grub and update the GRUB_CMDLINE_LINUX_DEFAULT line:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt vfio-pci.disable_vga=1 vfio_iommu_type1.allow_unsafe_interrupts=1 kvm.ignore_msrs=1 modprobe.blacklist=radeon,nouveau,nvidia,nvidiafb,nvidia-gpu,snd_hda_intel,snd_hda_codec_hdmi,i915 video=simplefb:off,vesafb:off,efifb:off,vesa:off"

A few things worth explaining here:

  • intel_iommu=on: Enables IOMMU on Intel systems. If you're on AMD, use amd_iommu=on instead.
  • iommu=pt: "Passthrough" mode. This tells the kernel to only use IOMMU for devices that actually need isolation, which improves performance and reduces compatibility issues.
  • vfio-pci.disable_vga=1: Prevents the VFIO driver from touching VGA memory regions, which can cause boot issues.
  • kvm.ignore_msrs=1: Stops the VM from crashing when Windows tries to access MSRs that KVM doesn't emulate. You'll want this for Windows guest VMs.
  • The blacklist entries: This is what keeps the host from loading its own GPU drivers (i915, nouveau, nvidia). If the host grabs the GPU before VFIO does, you're stuck.
  • video=simplefb:off,...: Disables the host's framebuffer drivers. This is especially important if you're running Proxmox headlessly and don't need a display on the host at all.

After editing, update GRUB:

sudo update-grub

Step 3: Set Up VFIO Modules

VFIO (Virtual Function I/O) is the kernel framework that handles device passthrough. You need to tell it which PCI devices to claim before the regular drivers do.

First, find your GPU's PCI IDs. Run lspci -nn and look for your GPU. You'll see something like [8086:5912]. The format is [vendor:device].

Create /etc/modprobe.d/vfio.conf with your actual IDs:

options vfio-pci ids=8086:5912,8086:a2f0
options vfio-pci disable_vga=1

The 8086:5912 in my case is an Intel HD Graphics 630 (integrated GPU). You'll have different IDs, so replace them with whatever lspci -nn shows for your hardware.

Then create /etc/modules-load.d/vfio.conf to load these modules at boot:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

Step 4: Rebuild Initramfs

The initramfs is the early userspace environment that runs before the full OS loads. Your VFIO modules and blacklist changes need to be baked into it so they take effect before any GPU drivers try to initialize:

sudo update-initramfs -u -k all

The -k all rebuilds for every installed kernel, which is what you want.


Step 5: Attach the GPU to Your VM

With VFIO handling the GPU, you can now assign it to a Proxmox VM. In my setup, VM 107 gets the Intel iGPU:

qm set 107 --hostpci0 00:02.0,legacy-igd=1

The 00:02.0 is the PCI address of the GPU, get yours with lspci. The legacy-igd=1 flag is specific to Intel integrated graphics; it enables legacy IGD mode which is required for proper initialization. If you're passing through a discrete GPU (NVIDIA, AMD), drop that flag.


Step 6: Verify Everything Looks Right

Before rebooting, do a sanity check. After you reboot, come back and verify:

# Check that IOMMU groups exist
ls /sys/kernel/iommu_groups

# Verify VFIO has claimed the right devices
lspci -nnk

# Look for any VFIO-related kernel messages
dmesg | grep -i vfio

In lspci -nnk, look for your GPU. Under "Kernel driver in use" you want to see vfio-pci, not i915 or nouveau. If you still see the host driver, the blacklist didn't work. Double-check your GRUB configuration and initramfs rebuild.


Step 7: Reboot

reboot

Yeah, that's it. But make sure you have a way to access Proxmox after the reboot, either via the web UI from another machine or an out-of-band management interface. Since we're disabling host GPU drivers, you won't have a console display on the host anymore (unless you have a separate GPU or onboard video).


Troubleshooting

IOMMU groups look wrong (your GPU is grouped with other devices)

This is a common issue, especially on consumer motherboards that don't implement IOMMU groups cleanly. You can inspect the groupings with:

for d in /sys/kernel/iommu_groups/*/devices/*; do
  n=${d#*/iommu_groups/*}; n=${n%%/*}
  printf 'IOMMU Group %s ' "$n"
  lspci -nns "${d##*/}"
done

If your GPU shares a group with something you can't pass through (like a PCIe root port), you may need to look into ACS override patches. That's a whole separate topic, but knowing the grouping is the first step.

VFIO modules not loading

lsmod | grep vfio

If you see nothing, the modules aren't loading. Check that /etc/modules-load.d/vfio.conf exists and that you ran update-initramfs after creating it.

VM boots to a black screen

If the VM starts but you get no display, the GPU initialization inside the VM is probably failing. For Windows VMs, make sure you have VirtIO drivers installed and try adding romfile to point to a vBIOS dump of your GPU. This is especially common with NVIDIA cards.


Important Notes Before You Start

  • Always back up your configuration before touching GRUB, modprobe, or initramfs. Breaking your bootloader on a Proxmox host is not fun.
  • Replace the PCI IDs (8086:5912, 8086:a2f0) with your actual hardware IDs from lspci -nn.
  • Intel vs AMD: The GRUB parameters use intel_iommu=on. Swap to amd_iommu=on if you're on AMD.
  • The legacy-igd=1 flag is Intel integrated GPU specific. Don't use it for discrete cards.
  • Adjust the driver blacklist (modprobe.blacklist=...) based on which GPU you're passing through. If it's NVIDIA, you need nvidia,nvidiafb,nvidia-gpu in there. AMD needs radeon,amdgpu.

GPU passthrough on Proxmox has a reputation for being painful, and that reputation is partially earned. But once it works, it's genuinely impressive. A VM with near-native GPU performance, completely isolated from the host. For my homelab, it's been worth every hour of debugging.

If you hit something this guide doesn't cover, the Proxmox forums and the VFIO subreddit are both solid resources. Most problems have been solved by someone else before you.

© 2026 Yoga Novaindra Powered by Ghost