在玩转 Homelab 和 PVE(Proxmox VE)时,核显虚拟化一直是高频需求。自 Intel 11 代 CPU 开始,传统的 GVT-g 虚拟化方案(可以将核显切分为多个 vGPU 供不同虚拟机使用)已被彻底废弃。取而代之的是 SR-IOV(Single Root I/O Virtualization) 技术。
对于 12 代、13 代以及 14 代的 Intel 处理器(包括低功耗神卡 N100、i3-N305,以及主流的 i5-13500、i7-13700 等 UHD 770 / Iris Xe 核显),在 PVE 8.1(基于 Debian 12,默认内核 6.5)下,我们可以通过第三方 DKMS 驱动完美开启 SR-IOV,实现物理核显的“一刀切多”,同时兼顾物理机和多个虚拟机的 H.264/HEVC/AV1 硬件编解码能力。
以下是保姆级的实操配置方案,避开了社区中常见的各种“断网”、“编译失败”和“虚拟机死机”的坑。
准备工作:BIOS 层的配置
SR-IOV 依赖于主板底层虚拟化技术的支持,必须先在 BIOS 中开启以下选项(不同主板命名略有不同):
- Intel Virtualization Technology (VT-x):开启。
- Intel VT-d:开启(实现 IOMMU 的关键)。
- SR-IOV Support:开启(部分主板此选项默认隐藏,需要更新 BIOS 或在 PCIe/Advanced 菜单中寻找)。
- Above 4G Decoding:开启。
- Primary Display:设置为 IGFX(首选核显启动,不要插独显,或者在 BIOS 中将核显设为主要显示设备,否则可能无法初始化虚拟功能)。
第一步:修改 PVE 宿主机内核参数
我们需要在引导阶段开启 IOMMU 支持并允许 SR-IOV 探测。
1. 修改 grub 或 systemd-boot 配置文件
首先判断你的 PVE 是通过哪种方式引导的。运行以下命令,如果有输出则为 systemd-boot,否则为 grub:
cmdline_file="/etc/kernel/cmdline"
[ -f "$cmdline_file" ] && echo "Systemd-boot 引导" || echo "GRUB 引导"
如果是 GRUB 引导:
编辑/etc/default/grub:nano /etc/default/grub找到
GRUB_CMDLINE_LINUX_DEFAULT行,修改为:GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_aspm=off"注:
pcie_aspm=off可以解决部分主板在开启 SR-IOV 后出现的 PCIe 报错问题。保存退出后,更新 GRUB:
update-grub如果是 systemd-boot 引导:
编辑/etc/kernel/cmdline:nano /etc/kernel/cmdline在末尾追加(保持在一行内,空格隔开):
intel_iommu=on iommu=pt pcie_aspm=off保存退出后,更新引导:
proxmox-boot-tool refresh
第二步:安装编译依赖与 DKMS 驱动
13 代核显的 SR-IOV 需要编译 strongtz/i915-sriov-dkms 驱动。PVE 8.1 的内核通常为 6.5.x,该驱动在此内核版本下运行非常稳定。
1. 换源并安装编译工具和内核头文件
确保你的 PVE 已经配置好了非订阅源(No-Subscription Source),然后运行:
apt update
apt install -y pve-headers-$(uname -r) build-essential dkms git
注意:必须保证安装的 pve-headers 版本与你当前运行的内核版本(通过 uname -r 查看)完全一致,否则后续 DKMS 编译会报错。
2. 克隆并安装 i915-sriov-dkms 驱动
cd /usr/src
git clone https://github.com/strongtz/i915-sriov-dkms.git i915-sriov-dkms-2023.12.01
这里把文件夹命名为 i915-sriov-dkms-2023.12.01 是为了方便 DKMS 管理,版本号需要与源码目录下的 dkms.conf 中的版本信息对应。
修改 dkms.conf(如果克隆下来的版本号不同,请调整以下命令):
cd i915-sriov-dkms-2023.12.01
# 确认 dkms.conf 中的 PACKAGE_VERSION 是否为 2023.12.01
cat dkms.conf | grep PACKAGE_VERSION
注册并编译驱动:
dkms add -m i915-sriov-dkms -v 2023.12.01
dkms build -m i915-sriov-dkms -v 2023.12.01
dkms install -m i915-sriov-dkms -v 2023.12.01
检查驱动状态,如果显示 installed,说明编译并安装成功:
dkms status
第三步:配置核显虚拟化参数与固件加载
Intel 核显需要 GuC (Graphics MicroController) 和 HuC 固件来协助硬解和电源管理,SR-IOV 必须启用 GuC。
1. 配置 i915 模块参数
创建并编辑 /etc/modprobe.d/i915.conf:
nano /etc/modprobe.d/i915.conf
写入以下内容:
options i915 enable_guc=3 enable_fbc=1
enable_guc=3表示同时开启 GuC 和 HuC 的加载与提交。- 此时不要在此文件中写入
max_vfs参数,因为新版驱动在内核模块加载时直接指定max_vfs容易导致系统卡死或识别不全,我们后续通过 udev 规则动态启用。
2. 更新 initramfs
update-initramfs -u -k all
第四步:使用 udev 规则在开机时自动切分 VF
VF (Virtual Function) 是我们分配给虚拟机的虚拟核显实体。13 代 UHD 770 最多支持切分为 7 个 VF。
创建 udev 规则文件:
nano /etc/udev/rules.d/70-i915-sriov.rules
写入以下内容(自动在核显 PCI 接口上启用 7 个虚拟核显):
# 启用 Intel 核显 SR-IOV 虚拟通道
KERNEL=="0000:00:02.0", SUBSYSTEM=="pci", ATTR{sriov_numvfs}="7"
如果你的核显 PCI 地址不是 0000:00:02.0(极少见),请通过 lspci | grep VGA 确认并修改。
保存后,重启 PVE 宿主机:
reboot
第五步:验证 SR-IOV 是否配置成功
重启后,登录 PVE 终端,运行以下命令验证:
查看 PCI 设备列表中是否多出了虚拟核显:
lspci | grep -i vga如果输出类似如下内容,说明切分成功(
00:02.0是物理核显,00:02.1到00:02.7是生成的 7 个虚拟核显):00:02.0 VGA compatible controller: Intel Corporation Raptor Lake-S GT1 [UHD Graphics 770] (rev 0c) 00:02.1 VGA compatible controller: Intel Corporation Raptor Lake-S GT1 [UHD Graphics 770] (rev 0c) ... 00:02.7 VGA compatible controller: Intel Corporation Raptor Lake-S GT1 [UHD Graphics 770] (rev 0c)检查 GuC 是否成功加载:
dmesg | grep -i guc看到
submission enabled和HuC enabled相关的字样,说明硬解固件加载正常。
第六步:虚拟机(VM)配置与直通
现在,我们可以把切分出来的虚拟核显分配给虚拟机了。这里以 Linux (如 Ubuntu/Debian) 和 Windows 11 为例。
1. Linux 虚拟机直通与硬解调用
在 PVE 后台创建好虚拟机(建议使用 q35 机器类型,引导方式为 OVMF (UEFI)):
- 打开虚拟机“硬件” -> “添加” -> “PCI 设备”。
- 设备 栏选择其中一个虚拟核显,例如
0000:00:02.1。 - 不要 勾选“全部功能(All Functions)”。
- 勾选 ROM-Bar。
- 勾选 PCI-Express。
- 保存。
在 Linux 虚拟机内验证:
启动虚拟机后,安装显卡工具:
sudo apt update && sudo apt install -y intel-gpu-tools
运行 sudo intel_gpu_top,当虚拟机内运行媒体转码(如 Plex, Jellyfin, Emby)时,如果能看到 Render/3D 或 Video 引擎有利用率波动,说明硬解直通完美成功!
2. Windows 11 虚拟机直通
Windows 虚拟机因为驱动签名和安全限制,配置稍显特殊。
- PVE 硬件添加 PCI 设备时,选择一个 VF(如
0000:00:02.2),同样勾选 ROM-Bar 和 PCI-Express。 - 虚拟机 CPU 类别建议设置为 host。
- 为了防止 Windows 驱动报错
Code 43(虽然 SR-IOV 很少见,但防患未然),建议修改虚拟机的配置文件。
在 PVE 宿主机终端编辑该虚拟机的 conf 文件(假设 VM ID 是 101):
在首行或合适位置添加以下参数,伪装 CPU,绕过驱动限制:nano /etc/pve/qemu-server/101.confargs: -cpu 'host,-hypervisor,kvm=off' - 启动 Windows 11,下载并安装 Intel 官方最新的 Intel Graphics Driver。
- 安装完成后,设备管理器中的显卡设备应该显示正常,无黄色感叹号。打开任务管理器,即可看到 Intel UHD Graphics 的 GPU 性能曲线。
避坑与维护指南(极重要)
- 不要轻易升级 PVE 内核:
当 PVE 进行大版本系统更新(例如从 8.1 升级到 8.2,内核从 6.5 升级到 6.8)时,DKMS 驱动可能会编译失败。建议在执行apt ddist-upgrade前,去strongtz/i915-sriov-dkms仓库查看新内核的兼容分支。 - 锁定内核版本(推荐):
如果你当前系统运行非常稳定,可以锁定当前内核,防止其被意外更新:apt-mark hold pve-kernel-$(uname -r) proxmox-headers-$(uname -r) - 物理宿主机没有显示输出:
开启 SR-IOV 并把物理核显主导权交给虚拟化驱动后,PVE 物理机背部的 HDMI/DP 接口可能会黑屏或无法正常输出控制台命令行。这是正常现象,后续请完全通过 Web 页面或 SSH 进行管理。对于需要物理输出的场景(如做 HTPC 电视盒子),请专门留一个 VF 直通给负责播放的虚拟机,并设置该 VM 的显卡输出到物理接口。