在 Intel 11 代之前的消费级平台上,我们常用 GVT-g 技术来对核显进行分片虚拟化。但从 12 代(Alder Lake)及以后的架构(包括 N100、i3-12100、i7-13700 等)开始,Intel 彻底废弃了 GVT-g,转向基于硬件级的 SR-IOV(Single Root I/O Virtualization)技术。
很多 Homelab 用户在配置 12 代核显 SR-IOV 时,经常遇到宿主机 HDMI 物理输出黑屏、失真,或者虚拟机无法正常启动的问题。本文将详细介绍如何在 PVE 8.0(基于 Linux 6.2/6.5 内核)中开启 Intel 12 代及以上核显的 SR-IOV,并完美保留宿主机 HDMI 控制台输出能力。
核心逻辑:为什么能保留宿主机 HDMI 输出?
SR-IOV 技术会将一个物理设备(Physical Function, PF)虚拟出多个虚拟设备(Virtual Function, VF)。
- PF(即 0000:00:02.0):宿主机(PVE)继续占有并驱动该物理设备。因为宿主机保留了 PF 的控制权,因此连接在主板 HDMI/DP 接口上的显示器可以正常显示 PVE 的 TTY 控制台或本地 GUI。
- VF(即 0000:00:02.1 到 0000:00:02.7):这些是切分出来的虚拟显卡,专门用于直通给 LXC 容器或 KVM 虚拟机。
避坑关键:绝对不能在 /etc/modprobe.d/vfio.conf 中把核显的硬件 ID(如 8086:46a8)写入 ids 绑定,也不能将 0000:00:02.0(PF)直接直通给任何虚拟机。
第一步:准备工作与 BIOS 设置
进入主板 BIOS,确保开启以下关键选项:
- VT-d / Intel Virtualization Technology for Directed I/O:必须开启(IOMMU 基础)。
- SR-IOV Support:必须开启(部分主板在 PCIe 或 Advanced 设置中)。
- Above 4G Decoding:必须开启。
- Primary Display:设置为 IGFX(或内显/板载显卡优先),不要设为 Auto 或 PCIE(如果你插了独显)。
第二步:配置 PVE 宿主机内核参数
我们需要开启 IOMMU 支持,并允许 i915 驱动加载 GuC/HuC 固件(SR-IOV 的硬性要求)。
编辑 Grub 配置文件:
nano /etc/default/grub找到
GRUB_CMDLINE_LINUX_DEFAULT行,修改为:GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7"- 注:
i915.max_vfs=7表示最多虚拟出 7 个 VF 显卡。
- 注:
更新 Grub 引导:
update-grub(如果你的 PVE 是使用 systemd-boot 引导的,请编辑
/etc/kernel/cmdline,在末尾添加上述参数,并运行proxmox-boot-tool refresh)
第三步:安装 i915-sriov-dkms 驱动
由于 Intel 官方的通用内核目前尚未合入消费级核显的 SR-IOV 完整驱动,我们需要使用社区维护的 DKMS 驱动模块。这里推荐使用 strongtz/i915-sriov-dkms 项目。
安装编译所需的依赖包和当前内核的 header 头文件:
apt update apt install -y pve-headers-$(uname -r) dkms git build-essential克隆驱动仓库并进入目录:
git clone https://github.com/strongtz/i915-sriov-dkms.git cd i915-sriov-dkms针对 PVE 8.0 的内核(通常为 6.2 或 6.5)进行配置与编译。
首先查看当前内核版本:uname -r根据你的内核版本,DKMS 会自动匹配。修改
dkms.conf中的版本号,或者直接执行以下命令安装:# 默认直接将当前目录注册到 dkms 中 dkms add . dkms install -m i915-sriov-dkms -v $(awk -F'"' '/PACKAGE_VERSION=/ {print $2}' dkms.conf)如果顺利,编译完成后会提示
DKMS: install completed.
第四步:配置加载参数与防黑屏设置
为了让宿主机的 HDMI 保持工作,同时让 i915 驱动正确初始化 SR-IOV,我们需要手动创建 modprobe 配置文件。
创建并编辑
/etc/modprobe.d/i915.conf:nano /etc/modprobe.d/i915.conf写入以下内容:
options i915 enable_guc=3 options i915 max_vfs=7(注意:不要在这里添加
modeset=0等禁用显示输出的参数,否则宿主机 HDMI 会直接失效。)更新 initramfs:
update-initramfs -u -k all
第五步:启用虚拟通道(VF)
N100 或 12 代核显在系统启动时,默认可能不会自动生成 VF 虚拟显卡。我们需要通过向 sriov_numvfs 写入数值来激活它们。
为了实现开机自启,我们可以通过
sysfsutils或编写systemd服务。这里推荐使用udev规则,最不容易出错。
编辑或创建/etc/udev/rules.d/70-i915-sriov.rules:nano /etc/udev/rules.d/70-i915-sriov.rules写入以下内容(当检测到
0000:00:02.0核显设备加载时,自动开启 7 个 VF):# Enable SR-IOV VFs on Boot KERNEL=="0000:00:02.0", SUBSYSTEM=="pci", ACTION=="add", ATTR{sriov_numvfs}="7"保存退出,重启 PVE 宿主机:
reboot
第六步:验证配置与 HDMI 状态
1. 验证宿主机 HDMI 输出
重启后,观察连接在 PVE 机器上的物理显示器。如果能够正常看到 PVE 的登录终端界面(如 pve login:),说明宿主机 PF 驱动完美,HDMI 输出成功保留。
2. 验证 VF 是否成功创建
在 PVE 终端执行:
lspci | grep VGA
如果输出中包含类似以下信息,说明配置极其成功:
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [Grounded Graphics] (rev 04)
00:02.1 VGA compatible controller: Intel Corporation Alder Lake-N [Grounded Graphics] (virtual function) (rev 04)
00:02.2 VGA compatible controller: Intel Corporation Alder Lake-N [Grounded Graphics] (virtual function) (rev 04)
...
00:02.7 VGA compatible controller: Intel Corporation Alder Lake-N [Grounded Graphics] (virtual function) (rev 04)
其中 00:02.0 是保留给 PVE 宿主机用于 HDMI 输出的物理核显,而 00:02.1 到 00:02.7 则是我们可以任意分配给虚拟机的虚拟显卡。
第七步:在虚拟机(VM)中配置使用 VF 显卡
以创建 Windows 或 Ubuntu 虚拟机为例:
- 新建虚拟机:机型(Machine)选择
q35,BIOS 选择OVMF (UEFI)。 - 添加 PCI 设备:
- 在虚拟机「硬件」->「添加」->「PCI 设备」中。
- 设备:下拉选择
0000:00:02.1(或者 .2 到 .7 中的任意一个,千万不要选 00:02.0)。 - 不要勾选「所有功能(All Functions)」。
- 勾选「ROM-Bar」。
- 勾选「PCI-Express」。
- 开机并安装驱动:
- Windows 虚拟机:直接下载 Intel 官方最新版显卡驱动安装即可。安装成功后,设备管理器中会正确识别出
Intel(R) UHD Graphics,无黄色感叹号(无需处理 Code 43 问题)。 - Linux 虚拟机/LXC:直接拉取最新内核,驱动开箱即用,可通过
vainfo验证硬件加速是否开启。
- Windows 虚拟机:直接下载 Intel 官方最新版显卡驱动安装即可。安装成功后,设备管理器中会正确识别出
避坑与故障排除
- Q:编译 dkms 报错,提示
SSL error或内核版本不匹配?- A:这是因为 PVE 在更新过程中升级了内核,但你没有安装对应新内核的
pve-headers。请确保运行apt install pve-headers-$(uname -r)重新安装头文件,然后执行dkms autoinstall。
- A:这是因为 PVE 在更新过程中升级了内核,但你没有安装对应新内核的
- Q:虚拟机启动后,宿主机 HDMI 画面冻结或绿屏?
- A:请确认在虚拟机 PCI 直通设置中,没有误将
00:02.0(主核显)勾选直通。只有保持宿主机独占00:02.0,才能防止 HDMI 输出冲突。
- A:请确认在虚拟机 PCI 直通设置中,没有误将
- Q:在 Windows 虚拟机内显卡报错“代码 43”?
- A:通常是由于未在 PVE 中成功启用 GuC/HuC。请检查宿主机运行
dmesg | grep i915,确认是否有GuC firmware active相关的字样。如果没有,需要重新检查i915.conf中的enable_guc=3参数是否正确生效。
- A:通常是由于未在 PVE 中成功启用 GuC/HuC。请检查宿主机运行