XCP-ng Intel iGPU Passthrough

Virtualization

4 min readAdvancedLast updated Oct 29, 2026

Pass the CPU's built-in Intel graphics (iGPU) through to a VM on XCP-ng 8.2 / 8.3. The usual reason is hardware video transcoding (Intel Quick Sync) for Plex, Jellyfin, Frigate or similar in a Linux VM.

Before you start

  • In the BIOS/UEFI, enable VT-d and make sure the iGPU is enabled. If the server also has a discrete GPU, turn on the option that keeps the iGPU active (often called iGPU Multi-Monitor), and set the primary display to the discrete card if you want to keep a host console.
  • When the iGPU is hidden from the host, the host's local screen goes blank after boot. Make sure SSH or IPMI works before you start.
  • A VM with a passed-through device can't be live-migrated.
  • Use a recent Linux kernel in the VM (Ubuntu 24.04+, Debian 13, Fedora 40+). 12th-gen Intel and newer need newer i915 / xe drivers.
1

Find the iGPU

lspci | grep -i vga
00:02.0 VGA compatible controller: Intel Corporation AlderLake-S GT1 (rev 0c)

The Intel iGPU is almost always at 00:02.0. In full form that's 0000:00:02.0.

2

Hide the iGPU from the host

/opt/xensource/libexec/xen-cmdline --set-dom0 "xen-pciback.hide=(0000:00:02.0)"
reboot

After the reboot, confirm it's ready:

xl pci-assignable-list     # should list 0000:00:02.0
3

Attach it to the VM

Shut the VM down, then:

xe vm-list name-label="jellyfin" params=uuid
xe vm-param-set uuid=<vm-uuid> other-config:pci=0/0000:00:02.0

Keep the VM's normal virtual display. You'll still use the Xen Orchestra console to manage it, and the iGPU works alongside it as a second GPU.

Start the VM.

4

Set up the VM (Linux)

  1. Check the iGPU is visible and the driver loaded:
    lspci -nnk | grep -A3 -i vga
    ls -l /dev/dri
    You should see the Intel device with Kernel driver in use: i915 (or xe), and /dev/dri/renderD128 (sometimes renderD129).
  2. Install the video acceleration drivers and test them:
    # Debian / Ubuntu
    sudo apt install intel-media-va-driver-non-free vainfo intel-gpu-tools
    # Fedora (intel-media-driver comes from RPM Fusion)
    sudo dnf install intel-media-driver libva-utils igt-gpu-tools
    
    vainfo
    vainfo should list H.264/HEVC profiles with VAEntrypointEncSlice.
  3. Let your media server use the GPU:
    • Native install: add the service user to the render and video groups: sudo usermod -aG render,video jellyfin
    • Docker: pass the device through, e.g. in compose: devices: ["/dev/dri:/dev/dri"]
  4. Turn on hardware transcoding in the app (Jellyfin: Dashboard → Playback → Transcoding → Intel QuickSync (QSV); Plex: Settings → Transcoder → Use hardware acceleration).
  5. Play something that needs transcoding and watch the GPU work:
    sudo intel_gpu_top

Removing passthrough

xe vm-param-remove uuid=<vm-uuid> param-name=other-config param-key=pci
/opt/xensource/libexec/xen-cmdline --delete-dom0 xen-pciback.hide
reboot

Troubleshooting

  • No /dev/dri in the VM – the kernel is too old for the GPU. Check sudo dmesg | grep -i -e i915 -e xe. On 12th-gen and newer with older kernels, try the kernel option i915.force_probe=<device-id> (the ID is in lspci -nn, e.g. 4680), or upgrade the kernel.
  • vainfo errors with "va_openDriver() returns -1" – the wrong VA driver is installed. Modern Intel iGPUs need the iHD driver (intel-media-driver), not the older i965.
  • VM won't start – check xl pci-assignable-list on the host and that VT-d is enabled (xl dmesg | grep -i vt-d).
  • The iGPU disappeared from lspci on the host – the BIOS disabled it because a discrete GPU is installed. Turn on the iGPU / multi-monitor option in the BIOS.

See also: XCP-ng PCIe NIC Passthrough, Proxmox GPU Passthrough.

Article information

Category
Virtualization
Read time
4 minutes
Difficulty
Advanced
Last updated
Oct 29, 2026