Guide to Configuring Intel i915 SR-IOV vGPU on Proxmox VE: Sharing Gen 11–14 iGPUs Across Multiple Virtual Machines

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Quick start: Configure i915 SR-IOV in 5 Minutes

Traditional PCIe passthrough has a fatal flaw: a physical hardware device can only be assigned to a single virtual machine. When a Windows VM monopolizes the UHD 770 iGPU, an adjacent Jellyfin container immediately loses hardware acceleration and runs into CPU bottlenecks during 4K transcoding.

SR-IOV (Single Root I/O Virtualization) technology combined with a DKMS module completely resolves this issue. The entire installation process is carried out directly in the Proxmox Host shell (PVE 8.x, Kernel 6.5 or 6.8):

# 1. Install kernel headers and build tools
apt update && apt install -y git build-essential pve-headers-$(uname -r) dkms sysfsutils

# 2. Clone the i915 SR-IOV DKMS driver repository
cd /usr/src
git clone https://github.com/strongtz/i915-sriov-dkms.git
cd i915-sriov-dkms

# 3. Register and build the module into the system
dkms add .
dkms install -m i915-sriov-dkms -v $(cat VERSION)

# 4. Check module status after build
dkms status

Update GRUB to enable IOMMU and allow the i915 driver to initialize Virtual Functions (VFs):

# Load IOMMU parameters, GuC firmware, and limit to 7 VFs in GRUB
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[^"]*/& intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7/' /etc/default/grub
update-grub

# Configure the number of VFs to automatically create on system boot
echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" >> /etc/sysfs.conf

# Reboot the Proxmox host
reboot

Verify the results right after the server reboots:

lspci | grep -i display
# Expected output will include 00:02.0 (Physical Function) along with 7 virtual devices from 00:02.1 to 00:02.7 (Virtual Functions)

Technical Architecture: GVT-g Is Dead—How Does SR-IOV Replace It?

From Skylake (Gen 6) to Comet Lake (Gen 10), Intel supported GVT-g directly within the Linux kernel. This technology enabled seamless vGPU sharing through mediated devices. However, starting with Gen 11 (Tiger Lake) and newer architectures like Alder Lake (Gen 12) and Raptor Lake (Gen 13/14), Intel completely discontinued GVT-g.

Instead, Intel brought SR-IOV down to consumer-grade iGPUs. This mechanism operates directly at the silicon level with two distinct components:

  • Physical Function (PF): Resides permanently on bus 00:02.0. The PF retains administrative control over the entire physical hardware, managing clock frequencies, voltage, and VRAM allocation.
  • Virtual Function (VF): Virtual PCIe devices (from 00:02.1 to 00:02.7). Each VF possesses its own independent PCIe configuration space. QuickSync engines (decoding/encoding H.264, HEVC, AV1) are shared in real time (via time-slicing) through the GuC hardware scheduler.

Intel’s stock driver in the Linux kernel blocks VF creation on consumer CPUs. The open-source i915-sriov-dkms project removes this limitation, allowing a CPU like the Core i5-13500 to smoothly handle 5 simultaneous 4K HDR transcode streams across multiple virtual machines.

Assigning VFs to VMs and Permanently Fixing Code 43 on Windows

Configuring a virtual machine to recognize the virtual device correctly requires precise PCIe flag configuration in Proxmox.

1. Configuring a Linux VM for Plex, Jellyfin, or Docker

Open the VM configuration file (e.g., VM 101 at /etc/pve/qemu-server/101.conf) and add the VF device:

# Assign the first Virtual Function to the VM
hostpci0: 0000:00:02.1,pcie=1

Start the Ubuntu/Debian VM and install the graphics driver diagnostic tools:

apt install -y vainfo intel-media-va-driver-non-free
vainfo --display drm --device /dev/dri/renderD128

Once the command returns a list of supported profiles showing VAEntrypointVLD and VAEntrypointEncSlice for H264, HEVC Main10 formats, hardware acceleration is working flawlessly.

2. Overcoming Error Code 43 on Windows 10 and Windows 11 VMs

Intel’s graphics driver installer on Windows scans for hypervisor signatures by default. If it detects a KVM virtualization environment, the driver halts operation and throws a Code 43 error in Device Manager.

To fix this, open the Windows VM configuration file (e.g., /etc/pve/qemu-server/102.conf) and apply the following configuration template:

bios: ovmf
machine: q35
cpu: host,hidden=1,flags=+pcid
hostpci0: 0000:00:02.2,pcie=1,x-vga=1
vga: none

The hidden=1 flag hides the KVM hypervisor identity from the CPUID table. The guest operating system will recognize the graphics card just like hardware installed on bare metal, which is a key step when optimizing Windows on KVM/Proxmox. If you run Windows 11, make sure you also configure a virtual TPM module with vTPM 2.0 with swtpm on Proxmox and KVM to meet system security requirements. From there, simply download the official Intel Graphics DCH Driver package and install it normally.

Operational Insights and Troubleshooting in Practice

Here are crucial technical notes to ensure stable long-term system operation:

  • Issues After Kernel Updates: Every time Proxmox upgrades its kernel (e.g., from 6.8.4 to 6.8.8), DKMS may fail to compile the new module if the corresponding header packages are missing. Always run dkms status after running apt dist-upgrade. If the module reports an error, immediately run dkms autoinstall prior to rebooting.
  • Verifying GuC/HuC Firmware Loading: Without GuC firmware loaded, the system will refuse to allocate resources to VFs. Run the following command to verify:
    dmesg | grep -i guc

    The system log must display the line GuC firmware validated to confirm that the hardware scheduler is ready.

  • Optimizing VRAM Based on Needs: The i915 driver evenly divides graphics memory according to the max_vfs value. If you only run 2 virtual machines, change the parameter to i915.max_vfs=2. This doubles the available framebuffer capacity and VRAM for each VM.
  • Maintaining SSH Access for Recovery: Avoid modifying network or PCI bus configuration files via a physical display connected directly to the motherboard’s HDMI port. Always manage your host over an independent SSH connection so you can promptly revert changes if the display output gets disabled during driver initialization. You can also establish a fallback by configuring serial console for KVM and Proxmox, or use tools like libguestfs to rescue KVM/Proxmox VMs if configuration changes break system boot.
Share: