HOOOS

PVE 8.0下Intel 12代及以上核显SR-IOV虚拟化实操教程(保留宿主机HDMI输出)

0 12 Homelab研究员 PVE 80SR-IOV核显虚拟化
Apple

在 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,确保开启以下关键选项:

  1. VT-d / Intel Virtualization Technology for Directed I/O:必须开启(IOMMU 基础)。
  2. SR-IOV Support:必须开启(部分主板在 PCIe 或 Advanced 设置中)。
  3. Above 4G Decoding:必须开启。
  4. Primary Display:设置为 IGFX(或内显/板载显卡优先),不要设为 Auto 或 PCIE(如果你插了独显)。

第二步:配置 PVE 宿主机内核参数

我们需要开启 IOMMU 支持,并允许 i915 驱动加载 GuC/HuC 固件(SR-IOV 的硬性要求)。

  1. 编辑 Grub 配置文件:

    nano /etc/default/grub
    
  2. 找到 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 显卡。
  3. 更新 Grub 引导:

    update-grub
    

    (如果你的 PVE 是使用 systemd-boot 引导的,请编辑 /etc/kernel/cmdline,在末尾添加上述参数,并运行 proxmox-boot-tool refresh)


第三步:安装 i915-sriov-dkms 驱动

由于 Intel 官方的通用内核目前尚未合入消费级核显的 SR-IOV 完整驱动,我们需要使用社区维护的 DKMS 驱动模块。这里推荐使用 strongtz/i915-sriov-dkms 项目。

  1. 安装编译所需的依赖包和当前内核的 header 头文件:

    apt update
    apt install -y pve-headers-$(uname -r) dkms git build-essential
    
  2. 克隆驱动仓库并进入目录:

    git clone https://github.com/strongtz/i915-sriov-dkms.git
    cd i915-sriov-dkms
    
  3. 针对 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 配置文件。

  1. 创建并编辑 /etc/modprobe.d/i915.conf

    nano /etc/modprobe.d/i915.conf
    
  2. 写入以下内容:

    options i915 enable_guc=3
    options i915 max_vfs=7
    

    (注意:不要在这里添加 modeset=0 等禁用显示输出的参数,否则宿主机 HDMI 会直接失效。)

  3. 更新 initramfs:

    update-initramfs -u -k all
    

第五步:启用虚拟通道(VF)

N100 或 12 代核显在系统启动时,默认可能不会自动生成 VF 虚拟显卡。我们需要通过向 sriov_numvfs 写入数值来激活它们。

  1. 为了实现开机自启,我们可以通过 sysfsutils 或编写 systemd 服务。这里推荐使用 udev 规则,最不容易出错。
    编辑或创建 /etc/udev/rules.d/70-i915-sriov.rules

    nano /etc/udev/rules.d/70-i915-sriov.rules
    
  2. 写入以下内容(当检测到 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"
    
  3. 保存退出,重启 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.100:02.7 则是我们可以任意分配给虚拟机的虚拟显卡。


第七步:在虚拟机(VM)中配置使用 VF 显卡

以创建 Windows 或 Ubuntu 虚拟机为例:

  1. 新建虚拟机:机型(Machine)选择 q35,BIOS 选择 OVMF (UEFI)
  2. 添加 PCI 设备
    • 在虚拟机「硬件」->「添加」->「PCI 设备」中。
    • 设备:下拉选择 0000:00:02.1(或者 .2 到 .7 中的任意一个,千万不要选 00:02.0)。
    • 不要勾选「所有功能(All Functions)」。
    • 勾选「ROM-Bar」。
    • 勾选「PCI-Express」。
  3. 开机并安装驱动
    • Windows 虚拟机:直接下载 Intel 官方最新版显卡驱动安装即可。安装成功后,设备管理器中会正确识别出 Intel(R) UHD Graphics,无黄色感叹号(无需处理 Code 43 问题)。
    • Linux 虚拟机/LXC:直接拉取最新内核,驱动开箱即用,可通过 vainfo 验证硬件加速是否开启。

避坑与故障排除

  • Q:编译 dkms 报错,提示 SSL error 或内核版本不匹配?
    • A:这是因为 PVE 在更新过程中升级了内核,但你没有安装对应新内核的 pve-headers。请确保运行 apt install pve-headers-$(uname -r) 重新安装头文件,然后执行 dkms autoinstall
  • Q:虚拟机启动后,宿主机 HDMI 画面冻结或绿屏?
    • A:请确认在虚拟机 PCI 直通设置中,没有误将 00:02.0(主核显)勾选直通。只有保持宿主机独占 00:02.0,才能防止 HDMI 输出冲突。
  • Q:在 Windows 虚拟机内显卡报错“代码 43”?
    • A:通常是由于未在 PVE 中成功启用 GuC/HuC。请检查宿主机运行 dmesg | grep i915,确认是否有 GuC firmware active 相关的字样。如果没有,需要重新检查 i915.conf 中的 enable_guc=3 参数是否正确生效。

点评评价

captcha
健康