HOOOS

13代Intel核显在PVE 8.1下完美的SR-IOV虚拟化配置指南

0 13 极客折腾家 PVE 81SR-IOVIntel核显虚拟化
Apple

在玩转 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 中开启以下选项(不同主板命名略有不同):

  1. Intel Virtualization Technology (VT-x):开启。
  2. Intel VT-d:开启(实现 IOMMU 的关键)。
  3. SR-IOV Support:开启(部分主板此选项默认隐藏,需要更新 BIOS 或在 PCIe/Advanced 菜单中寻找)。
  4. Above 4G Decoding:开启。
  5. 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 终端,运行以下命令验证:

  1. 查看 PCI 设备列表中是否多出了虚拟核显:

    lspci | grep -i vga
    

    如果输出类似如下内容,说明切分成功(00:02.0 是物理核显,00:02.100: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)
    
  2. 检查 GuC 是否成功加载:

    dmesg | grep -i guc
    

    看到 submission enabledHuC enabled 相关的字样,说明硬解固件加载正常。


第六步:虚拟机(VM)配置与直通

现在,我们可以把切分出来的虚拟核显分配给虚拟机了。这里以 Linux (如 Ubuntu/Debian) 和 Windows 11 为例。

1. Linux 虚拟机直通与硬解调用

在 PVE 后台创建好虚拟机(建议使用 q35 机器类型,引导方式为 OVMF (UEFI)):

  1. 打开虚拟机“硬件” -> “添加” -> “PCI 设备”。
  2. 设备 栏选择其中一个虚拟核显,例如 0000:00:02.1
  3. 不要 勾选“全部功能(All Functions)”。
  4. 勾选 ROM-Bar
  5. 勾选 PCI-Express
  6. 保存。

在 Linux 虚拟机内验证:
启动虚拟机后,安装显卡工具:

sudo apt update && sudo apt install -y intel-gpu-tools

运行 sudo intel_gpu_top,当虚拟机内运行媒体转码(如 Plex, Jellyfin, Emby)时,如果能看到 Render/3DVideo 引擎有利用率波动,说明硬解直通完美成功!

2. Windows 11 虚拟机直通

Windows 虚拟机因为驱动签名和安全限制,配置稍显特殊。

  1. PVE 硬件添加 PCI 设备时,选择一个 VF(如 0000:00:02.2),同样勾选 ROM-BarPCI-Express
  2. 虚拟机 CPU 类别建议设置为 host
  3. 为了防止 Windows 驱动报错 Code 43(虽然 SR-IOV 很少见,但防患未然),建议修改虚拟机的配置文件。
    在 PVE 宿主机终端编辑该虚拟机的 conf 文件(假设 VM ID 是 101):
    nano /etc/pve/qemu-server/101.conf
    
    在首行或合适位置添加以下参数,伪装 CPU,绕过驱动限制:
    args: -cpu 'host,-hypervisor,kvm=off'
    
  4. 启动 Windows 11,下载并安装 Intel 官方最新的 Intel Graphics Driver
  5. 安装完成后,设备管理器中的显卡设备应该显示正常,无黄色感叹号。打开任务管理器,即可看到 Intel UHD Graphics 的 GPU 性能曲线。

避坑与维护指南(极重要)

  1. 不要轻易升级 PVE 内核:
    当 PVE 进行大版本系统更新(例如从 8.1 升级到 8.2,内核从 6.5 升级到 6.8)时,DKMS 驱动可能会编译失败。建议在执行 apt ddist-upgrade 前,去 strongtz/i915-sriov-dkms 仓库查看新内核的兼容分支。
  2. 锁定内核版本(推荐):
    如果你当前系统运行非常稳定,可以锁定当前内核,防止其被意外更新:
    apt-mark hold pve-kernel-$(uname -r) proxmox-headers-$(uname -r)
    
  3. 物理宿主机没有显示输出:
    开启 SR-IOV 并把物理核显主导权交给虚拟化驱动后,PVE 物理机背部的 HDMI/DP 接口可能会黑屏或无法正常输出控制台命令行。这是正常现象,后续请完全通过 Web 页面或 SSH 进行管理。对于需要物理输出的场景(如做 HTPC 电视盒子),请专门留一个 VF 直通给负责播放的虚拟机,并设置该 VM 的显卡输出到物理接口。

点评评价

captcha
健康