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 Hardware → Add → PCI 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 Dashboard → Playback.
  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.