🔠 Intel iGPU Passthrough to VM in Proxmox (Jellyfin Use Case)
📘 Introduction
This guide walks you through passing an Intel integrated GPU (iGPU) from a Proxmox host to a virtual machine (VM). This is useful for hardware-accelerated video transcoding in media servers like Jellyfin, which can significantly reduce CPU usage during playback and improve performance.
We'll use an Intel UHD Graphics 630 iGPU in this example.
🔍 1. Identify Your Intel GPU on the Proxmox Host
Open a terminal on your Proxmox host and run:
This lists all VGA-compatible devices, including integrated GPUs. You're looking for the Intel GPU's PCI address and ID.
Sample Output:
00:02.0 VGA compatible controller [0300]: Intel Corporation CometLake-S GT2 [UHD Graphics 630] [8086:3e92] (prog-if 00 [VGA controller])
00:02.0
is the PCI address of the iGPU.[8086:3e92]
is the vendor/device ID (Intel UHD Graphics 630).
🛠️ 2. Add PCI Device to VM via Proxmox GUI
- Open the Proxmox web interface.
- Select the VM you want to passthrough the GPU to.
- Go to Hardware → Add → PCI Device.
- Select your iGPU (match by PCI address).
-
Choose:
-
Device Type: Raw Device
- All Functions: ✅ Enable this (important for multifunction devices)
Passing through the entire GPU ensures Jellyfin can access the full capabilities of the iGPU, including video decoding and encoding engines.
🥪 3. Verify GPU Presence Inside the VM
After starting the VM:
You should see the Intel GPU listed among VGA devices, like:
00:10.0 VGA compatible controller [0300]: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630] [8086:3e92] (prog-if 00 [VGA controller])
Confirms that the VM now has access to the passed-through GPU.
📁 4. Check for Direct Rendering Infrastructure (DRI) Devices
Inside the VM, run:
Sample Output:
crw-rw---- 1 root video 226, 0 card0
crw-rw---- 1 root video 226, 1 card1
crw-rw---- 1 root render 226, 128 renderD128
Explanation:
/dev/dri/cardX
: These are the display devices.renderD128
: This is the render node for compute/video processing (used by Jellyfin and FFmpeg).
Tip: Your user should be in the video
and render
groups to access these devices.
⚙️ 5. Test Hardware Acceleration Capabilities
Follow Jellyfin's VA-API guide.
Install vainfo
(part of libva-utils
) to verify supported video codecs:
Then:
This checks which video codec profiles are supported by your GPU using VA-API.
Sample Output Includes:
VAProfileH264High :VAEntrypointVLD
VAProfileHEVCMain :VAEntrypointVLD
VAProfileVP9Profile0 :VAEntrypointVLD
This confirms your GPU can decode/encode H.264, HEVC, VP8/VP9, and more.
📺 6. Enable Hardware Acceleration in Jellyfin
In the Jellyfin Web UI:
- Go to Admin Dashboard → Playback.
-
Under Hardware Acceleration, choose:
-
✅ Intel QuickSync (QSV)
- ✅ Enable decoding for formats like HEVC, H.264, VP9
- ✅ Enable hardware encoding
- Avoid low-power encoding unless using Intel Jasper Lake or Elkhart Lake CPUs. It may not be supported and can cause issues.
📋 More info on low-power encoding
📊 7. Monitor GPU Usage with intel-gpu-tools
Install the Intel GPU monitoring tools:
Run the real-time GPU usage tool:
While streaming a video in Jellyfin, this tool should show GPU activity in the Video and Render/Media sections.
Confirms that Jellyfin is offloading transcoding to the GPU and not using the CPU heavily.