Skip to content

🔠 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:

lspci -nnv | grep VGA

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

  1. Open the Proxmox web interface.
  2. Select the VM you want to passthrough the GPU to.
  3. Go to HardwareAddPCI Device.
  4. Select your iGPU (match by PCI address).
  5. Choose:

  6. Device Type: Raw Device

  7. 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:

sudo lspci -nnv | grep VGA

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:

cd /dev/dri && ls -la

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:

sudo apt install vainfo

Then:

/usr/lib/jellyfin-ffmpeg/vainfo --display drm --device /dev/dri/renderD128

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:

  1. Go to Admin DashboardPlayback.
  2. Under Hardware Acceleration, choose:

  3. Intel QuickSync (QSV)

  4. ✅ Enable decoding for formats like HEVC, H.264, VP9
  5. ✅ Enable hardware encoding
  6. 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:

sudo apt install intel-gpu-tools

Run the real-time GPU usage tool:

intel_gpu_top

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.