You’ve invested in a powerhouse GPU, perhaps a cutting-edge RTX 4090 or an AMD Radeon RX 7900 XTX, and you want to unleash its full potential within a virtual machine on your Proxmox VE host. The promise is tantalizing: bare-metal gaming performance, AI/ML acceleration, or professional rendering, all while maintaining the flexibility and resource management of virtualization. Yet, the road to seamless GPU passthrough often feels like navigating a minefield.
You’ve likely encountered the cryptic “IOMMU groups,” the frustrating “device not available” errors, or the unsettling whispers of kernel patches that promise a fix but carry hidden risks. The anxiety is real: will this break my Proxmox host? Am I wasting hours only to hit a brick wall? Your hardware is a significant investment, and getting this right means unlocking its true value, not just for today, but for the robust, high-performance virtualized environments of 2026 and beyond.
This isn’t just about making a GPU appear in a VM; it’s about doing it securely, stably, and with a deep understanding of the underlying architecture. It’s about transforming frustration into confident mastery.
Achieving Proxmox GPU passthrough reliably hinges on understanding and respecting IOMMU groups. Avoid the dangerous pcie_acs_override patch, which compromises host security. Instead, enable IOMMU in GRUB, blacklist host drivers, bind your GPU to vfio-pci, and configure a Q35/UEFI VM for secure, performant bare-metal GPU access within your virtualized environment.
Why Does Proxmox GPU Passthrough Fail Without Proper IOMMU Grouping?
The vast majority of practitioners stumble at the IOMMU grouping hurdle, often resorting to a dangerous shortcut: the pcie_acs_override kernel patch. This isn’t just a minor oversight; it’s a critical security and stability vulnerability that 80% of online guides either ignore or actively recommend, leading users down a path of potential system compromise and unpredictable behavior. You’re not just trying to pass through a GPU; you’re trying to maintain the integrity of your entire Proxmox host.
The core issue lies in the Input-Output Memory Management Unit (IOMMU) and how your motherboard’s PCIe topology dictates device isolation. The IOMMU’s fundamental job is to provide memory isolation for PCI devices, preventing a rogue or compromised device (like a passthrough GPU in a VM) from directly accessing or corrupting the host system’s memory. It creates “IOMMU groups” – logical bundles of devices that share a common pathway to the CPU and memory. For a device to be safely passed through to a VM, it ideally needs its own isolated IOMMU group, or at least share a group only with other devices that will also be passed to the same VM.
What many get wrong is assuming that if a GPU isn’t in its own group, a simple kernel parameter can fix it. The pcie_acs_override=downstream,multifunction patch bypasses the Access Control Services (ACS) checks, which are crucial for enforcing IOMMU isolation. By doing this, you’re essentially telling the kernel to ignore the hardware’s physical limitations and pretend devices are isolated when they aren’t. This creates a gaping hole: a malicious or buggy VM could potentially use its passthrough GPU to read or write to arbitrary memory locations on your host system, leading to:
- VM-to-Host Memory Corruption: The most severe risk. A VM could crash your host, corrupt its filesystem, or even extract sensitive data.
- System Instability: Unpredictable crashes, freezes, or data loss on the host.
- Security Vulnerabilities: A compromised guest OS could escalate privileges to the host through the shared IOMMU group.
- Debugging Nightmares: Issues become incredibly difficult to diagnose because the fundamental memory safety mechanisms are disabled.
Motherboard vendors design their PCIe lanes and root complexes differently. Some high-end server boards or enthusiast platforms offer excellent IOMMU grouping, providing dedicated groups for each PCIe slot. Others, especially consumer-grade motherboards, might group a GPU with a USB controller, a SATA port, or even the onboard network adapter. This is where the frustration sets in, but understanding this hardware reality is key to a secure and stable passthrough.
| Passthrough Method | IOMMU Group Integrity | Security Implications | Performance Profile | Recommended Use Case |
|---|---|---|---|---|
| Safe, IOMMU-Compliant Passthrough | Preserves strict hardware isolation; GPU in its own or safely shared group. | High Security: VM cannot access host memory; robust isolation. | Near-native performance; stable and predictable. | Production environments, critical workloads, secure gaming VMs, AI/ML. |
| ACS Override Passthrough | Bypasses hardware isolation; forces separation of devices in shared groups. | High Risk: Potential VM-to-host memory corruption; severe security vulnerability. | Near-native performance, but highly unstable and unpredictable. | Strictly for experimental, non-critical lab use where data loss/security is irrelevant. Never for production. |
Unpacking IOMMU Groups: Your Hardware’s Hidden Language
Think of IOMMU groups as security checkpoints on a highway. Each checkpoint (IOMMU group) manages a specific set of lanes (PCIe devices). For a device to pass through securely to a VM, it needs its own dedicated lane or share a lane only with other devices going to the exact same destination (VM). If your GPU shares a lane with, say, a USB controller that the host needs, the IOMMU can’t safely isolate the GPU without also isolating the USB controller, which would break the host.
Your motherboard’s PCIe topology is the architect of these groups. High-end motherboards often feature multiple PCIe root complexes, each capable of creating distinct IOMMU groups for individual slots. More budget-oriented boards might route several PCIe slots, USB controllers, or even SATA controllers through a single root complex, forcing them into the same IOMMU group. This isn’t a flaw; it’s a design choice that prioritizes cost or compactness over granular device isolation.
To identify your IOMMU groups, you’ll need to query your Proxmox host. This is your first diagnostic step, revealing whether your hardware is inherently suitable for a clean passthrough or if you’re facing a more challenging scenario.
Here’s how to list your IOMMU groups:
for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d##*/}; printf 'IOMMU Group %s [%s] %s\n' "$(basename "$(dirname "$d")")" "$(lspci -nns "$n" | awk '{print $3}')" "$(lspci -ns "$n")"; done
When you run this command, you’re looking for your GPU. A “good” grouping for a GPU would look something like this:
IOMMU Group 10 [10de:1e87] 01:00.0 VGA compatible controller: NVIDIA Corporation Device 1e87 (rev a1)
IOMMU Group 10 [10de:10f8] 01:00.1 Audio device: NVIDIA Corporation Device 10f8 (rev a1)
Here, the GPU (01:00.0) and its associated HDMI audio controller (01:00.1) are in their own IOMMU Group 10. This is ideal. Both devices are part of the same physical GPU, and they can be passed through together to a single VM without compromising host integrity.
A “bad” grouping, which would necessitate the dangerous ACS override if you insisted on passthrough, might look like this:
IOMMU Group 10 [10de:1e87] 01:00.0 VGA compatible controller: NVIDIA Corporation Device 1e87 (rev a1)
IOMMU Group 10 [10de:10f8] 01:00.1 Audio device: NVIDIA Corporation Device 10f8 (rev a1)
IOMMU Group 10 [8086:a12f] 00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-V (rev 31)
In this scenario, your NVIDIA GPU is sharing IOMMU Group 10 with an Intel Ethernet controller. If you pass the GPU to a VM, the Ethernet controller would also be isolated from the host, making your host lose network connectivity. This is the kind of situation where the ACS override is often applied, but as we’ve discussed, it comes with severe risks.
Your goal is to find a GPU that resides in an IOMMU group either by itself or with only its associated sub-devices (like its HDMI audio controller). If your GPU is grouped with essential host devices, you have two safe options: either don’t pass through that specific GPU, or consider a different motherboard with a more favorable IOMMU topology.
Preparing Your Proxmox Host for GPU Passthrough: The Actionable Playbook
This is where we roll up our sleeves. Follow these steps meticulously to configure your Proxmox VE 8.x host for secure and stable GPU passthrough. Remember, precision here prevents hours of troubleshooting later.
Step 1: Verify IOMMU Support in BIOS/UEFI
Before touching any software, ensure your motherboard’s firmware is configured correctly. Reboot your Proxmox host and enter the BIOS/UEFI settings. Look for options related to virtualization or IOMMU. The exact terminology varies by vendor:
- Intel: Look for “Intel VT-d,” “Virtualization Technology for Directed I/O,” or similar. Enable it.
- AMD: Look for “AMD-Vi,” “SVM Mode,” or “IOMMU.” Enable it.
Save your changes and reboot back into Proxmox.
Step 2: Enable IOMMU in GRUB
Now, we tell the Linux kernel to activate IOMMU. This is done by modifying the GRUB bootloader configuration.
- Edit GRUB configuration:
nano /etc/default/grub - Locate the
GRUB_CMDLINE_LINUX_DEFAULTline.Add the appropriate IOMMU parameter for your CPU and
iommu=pt. Theiommu=pt(passthrough) parameter ensures that the IOMMU is used in passthrough mode, which can improve performance and stability for virtualized devices.- For Intel CPUs:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt" - For AMD CPUs:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
If you have other parameters already there (e.g.,
splash), just append these at the end within the quotes, separated by spaces. - For Intel CPUs:
- Update GRUB:
update-grub
Step 3: Blacklist Host Graphics Drivers
To prevent the Proxmox host from trying to use your dedicated GPU, we need to blacklist its drivers. This ensures the GPU is free for `vfio-pci` to bind to it.
- Create a blacklist configuration file:
nano /etc/modprobe.d/blacklist.conf - Add the following lines to the file:
blacklist nouveau blacklist nvidiafb blacklist nvidia blacklist radeon blacklist amdgpu blacklist snd_hda_intelsnd_hda_intelis often the audio component of your GPU, which also needs to be blacklisted if you’re passing through the GPU’s audio. - Disable early loading of graphics drivers (optional but recommended for robustness):
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/vfio-iommu-type1.confThe
allow_unsafe_interrupts=1option is sometimes necessary for certain hardware configurations to prevent issues with interrupt remapping. While the name sounds concerning, it’s generally safe in a well-isolated IOMMU group scenario.
Step 4: Load vfio-pci Module and Identify GPU IDs
The vfio-pci module is what allows the kernel to bind PCI devices to the VFIO framework, making them available for passthrough. We also need to tell it which specific devices to grab.
- Enable VFIO modules:
echo "vfio" >> /etc/modules echo "vfio_iommu_type1" >> /etc/modules echo "vfio_pci" >> /etc/modules echo "vfio_virqfd" >> /etc/modules - Identify your GPU’s Vendor and Device IDs:
Use
lspci -nnkto list all PCI devices and their kernel drivers. Look for your GPU and its associated audio device.lspci -nnkYou’ll see output like this (example for an NVIDIA GPU):
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:1e87] (rev a1) Subsystem: ASUSTeK Computer Inc. Device [1043:8710] Kernel driver in use: nvidia Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia 01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10f8] (rev a1) Subsystem: ASUSTeK Computer Inc. Device [1043:8710] Kernel driver in use: snd_hda_intel Kernel modules: snd_hda_intelFrom this, extract the Vendor ID and Device ID for both the VGA controller and the Audio device. In this example, they are
10de:1e87and10de:10f8. - Bind the GPU to
vfio-pci:Create a configuration file to tell
vfio-pcito claim these specific devices.echo "options vfio-pci ids=10de:1e87,10de:10f8 disable_vga=1" > /etc/modprobe.d/vfio.confImportant: Replace
10de:1e87,10de:10f8with the actual Vendor:Device IDs of your GPU and its audio component. Thedisable_vga=1option is crucial for preventing the host from trying to initialize the GPU as a display output, which can cause conflicts.
Step 5: Update initramfs
The initramfs (initial RAM filesystem) needs to be rebuilt to include these new kernel module configurations and blacklists. This ensures they are loaded at boot time.
update-initramfs -u -k all
Step 6: Reboot and Verify IOMMU and VFIO Binding
A full reboot is necessary for all these changes to take effect.
reboot
After rebooting, log back into your Proxmox host via SSH or console and perform these verification steps:
IOMMU Verification CLI Cheat Sheet:
- Verify IOMMU is enabled:
dmesg | grep -e DMAR -e IOMMUYou should see output indicating IOMMU is enabled, e.g.,
DMAR: IOMMU enabledorAMD-Vi: IOMMU activated. - Verify VFIO modules are loaded:
lsmod | grep vfioYou should see
vfio_pci,vfio_iommu_type1,vfio, andvfio_virqfdlisted. - Verify GPU is bound to
vfio-pci:lspci -nnk | grep -i vga -A3Look for your GPU. Instead of
Kernel driver in use: nvidiaoramdgpu, you should now seeKernel driver in use: vfio-pci.Also check the audio device:
lspci -nnk | grep -i audio -A3It should also show
Kernel driver in use: vfio-pci.
If all these checks pass, your Proxmox host is now ready for GPU passthrough!
Crafting Your Virtual Machine for GPU Passthrough
With the host prepared, the final step is to configure your VM to utilize the passthrough GPU. This involves specific VM settings to ensure compatibility and performance.
- Create a New VM:
In the Proxmox web UI, create a new virtual machine. Pay close attention to these settings:
- OS Type: Select “Microsoft Windows” or “Linux” depending on your guest.
- System Tab:
- Graphics Card: Set to
None. This is critical to prevent conflicts with the passthrough GPU. - Machine: Choose
Q35. This is a modern PCIe-centric machine type that is essential for reliable passthrough. - BIOS: Select
OVMF (UEFI). UEFI is generally required for modern GPUs and provides better compatibility. - Pre-Enroll keys: Enable this if you plan to use Secure Boot in the guest (optional, but good practice).
- Graphics Card: Set to
- Disks & CPU: Configure these as needed for your guest OS. Ensure you allocate enough CPU cores and RAM.
- Add the PCI Device:
After creating the VM, go to its Hardware tab in the Proxmox UI.
- Click “Add” -> “PCI Device”.
- In the “PCI Device” dialog:
- Raw Device: Select your GPU from the dropdown list. It should appear with its Vendor and Device IDs (e.g.,
10de:1e87). Make sure to select both the VGA and Audio devices if they are in the same IOMMU group and you want to pass both. - Primary GPU: Check this box if this is the only or primary display adapter for the VM.
- All Functions: Check this box. This ensures all sub-devices (like the audio controller) are passed through.
- ROM-Bar: Check this box. This enables the PCI ROM BAR, which is often required for modern GPUs to initialize correctly in a VM.
- PCI-Express: Check this box. This tells Proxmox to present the device as a PCIe device, which is necessary for Q35 machine types and modern GPUs.
- Raw Device: Select your GPU from the dropdown list. It should appear with its Vendor and Device IDs (e.g.,
- Click “Add”.
- Install Guest OS and Drivers:
Start the VM, install your chosen guest operating system (Windows or Linux), and then install the appropriate GPU drivers directly within the guest. For Windows, download the latest drivers from NVIDIA or AMD. For Linux, use the vendor-provided drivers or open-source alternatives if supported.
Troubleshooting Common Proxmox GPU Passthrough Headaches
Even with the most meticulous setup, issues can arise. Here’s a structured 4-step troubleshooting protocol to diagnose and resolve common GPU passthrough problems.
- Verify IOMMU and VFIO Status on Host:
The first step is always to re-verify the host configuration. Go back to the “IOMMU Verification CLI Cheat Sheet” above. Are IOMMU and VFIO modules loaded? Is your GPU correctly bound to
vfio-pci? If not, review Steps 1-6 of the “Actionable Playbook” carefully. A common mistake is forgetting to runupdate-gruborupdate-initramfs -u -k allafter making changes. - Check VM Configuration for Passthrough Requirements:
Ensure your VM settings are correct. Is the machine type
Q35? Is the BIOS set toOVMF (UEFI)? Is the “Graphics Card” set toNone? Have you checked “Primary GPU,” “All Functions,” “ROM-Bar,” and “PCI-Express” when adding the PCI device? Incorrect VM settings are a frequent cause of “Code 43” errors in Windows guests or black screens. - Examine Guest OS Logs and Device Manager:
If the GPU appears in the VM but isn’t working, check the guest OS. In Windows, open Device Manager. Look for your GPU. If it has a yellow exclamation mark and “Code 43” (Windows has stopped this device because it has reported problems), this often

