HOOOS

PVE 8.x 环境下 N100 核显 SR-IOV 直通保姆级教程,实现多虚拟机同时硬件解码

0 5 极客阿星 Proxmox VEIntel N100SR-IOV核显直通
Apple

在低功耗工控机和 NAS 领域,Intel N100(Alder Lake-N)因其极低的功耗和优秀的 24 EU Xe 核显性能,成为了目前最火爆的选择。

以往在 Intel 核心上,我们常用 GVT-g 技术来实现核显虚拟化,分给多个虚拟机使用。但从 Intel 11 代处理器开始,GVT-g 被废弃,取而代之的是 SR-IOV(Single Root I/O Virtualization)

通过 SR-IOV,我们可以将 N100 的核显(iGPU)虚拟出最多 7 个独立的虚拟显卡(VF),分别直通给不同的虚拟机(如 Windows、iStoreOS、Ubuntu 等)或 LXC 容器,实现同时进行 Plex/Jellyfin/Emby 的 H.264/HEVC/AV1 硬件解码。

本文将基于 Proxmox VE 8.x (内核 6.5/6.8+),手把手带你完成 N100 核显 SR-IOV 的配置。


准备工作

在开始之前,请确保满足以下条件:

  1. 主板 BIOS 设置
    • 开启 Intel Virtualization Technology (VMX)
    • 开启 VT-d
    • 开启 SR-IOV Support(部分主板可能在 Advanced -> PCI Subsystem Settings 中)。
    • 开启 Above 4G Decoding
  2. PVE 系统:已安装 PVE 8.x,且能够正常访问互联网。

第一步:开启 PVE 主机 IOMMU 支持

我们需要修改 GRUB 或 Systemd-boot 来启用内核的 IOMMU 支持。

1. 确定引导方式

在 PVE 终端运行以下命令:

[ -d /sys/firmware/efi ] && echo "EFI 引导" || echo "Legacy 引导"

2. 修改引导配置文件

  • 如果是 GRUB 引导
    编辑 /etc/default/grub

    nano /etc/default/grub
    

    找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行,修改为:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
    

    保存退出(Ctrl+O, Enter, Ctrl+X),然后更新 GRUB:

    update-grub
    
  • 如果是 Systemd-boot 引导
    编辑 /etc/kernel/cmdline

    nano /etc/kernel/cmdline
    

    在整行内容的末尾加入(用空格隔开):

    intel_iommu=on iommu=pt
    

    保存退出,然后更新引导:

    proxmox-boot-tool refresh
    

第二步:安装 PVE 内核头文件与 DKMS 依赖

为了编译 SR-IOV 驱动,需要安装当前内核对应的头文件和编译工具。

# 更新源并安装依赖
apt update
apt install -y pve-headers-$(uname -r) dkms git sysfsutils

注意:如果提示找不到 pve-headers,请确认你是否已经切换到了 PVE 非订阅源(No-Subscription Source)。


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

目前社群维护最活跃的是基于 strongtz/i915-sriov-dkms 的驱动项目,它支持 Alder Lake-N (N100) 在 6.5/6.8 内核下的 SR-IOV 虚拟化。

# 克隆驱动仓库
cd /usr/src
git clone https://github.com/strongtz/i915-sriov-dkms.git i915-sriov-dkms-2024.08.09

(注:后面的版本号目录名需要与克隆下来的项目中的 dkms.conf 内容一致,通常直接克隆后可以查看 cat i915-sriov-dkms-2024.08.09/dkms.conf 确认 PACKAGE_VERSION)

# 注册并编译 DKMS 模块
dkms add -m i915-sriov-dkms -v 2024.08.09
dkms build -m i915-sriov-dkms -v 2024.08.09
dkms install -m i915-sriov-dkms -v 2024.08.09

检查安装状态:

dkms status

如果输出显示 i915-sriov-dkms/xxxx, installed,说明驱动已成功加载。


第四步:配置加载参数并启用虚拟 VF

我们需要通过模组参数告诉显卡驱动,我们要启用 SR-IOV 并且分配多少个虚拟显卡(N100 最大支持 7 个)。

1. 配置 modprobe 参数

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

nano /etc/modprobe.d/i915.conf

写入以下内容(限制最大 VF 数量为 7,开启 GuC/HuC 支持):

options i915 enable_guc=3 max_vfs=7

保存并退出。

2. 更新 initramfs

update-initramfs -u -k all

3. 开机自动创建虚拟显卡

虽然我们设置了 max_vfs=7,但系统启动时默认并不会主动创建这些虚拟显卡,需要向 sysfs 写入指令。

我们可以利用 sysfsutils 在系统启动时自动写入。编辑 /etc/sysfs.conf

nano /etc/sysfs.conf

在文件末尾追加以下内容(表示给 PCI 域中的核显设备分配 7 个虚拟显卡):

# N100 SR-IOV 自动创建 7 个虚拟显卡
devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7

提示:不同主板的核显 PCI 地址可能稍有不同,绝大多数是 0000:00:02.0。你可以通过 lspci | grep VGA 确认。

4. 重启 PVE 主机

reboot

第五步:验证 SR-IOV 是否配置成功

重启完成后,在 PVE 命令行输入:

lspci | grep VGA

如果配置成功,你应该能看到类似下面的输出:

00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [Geni915] (rev 07)
00:02.1 VGA compatible controller: Intel Corporation Alder Lake-N [Geni915] (virtual function) (rev 07)
00:02.2 VGA compatible controller: Intel Corporation Alder Lake-N [Geni915] (virtual function) (rev 07)
00:02.3 VGA compatible controller: Intel Corporation Alder Lake-N [Geni915] (virtual function) (rev 07)
...
00:02.7 VGA compatible controller: Intel Corporation Alder Lake-N [Geni915] (virtual function) (rev 07)

其中,00:02.0 是物理核显(PF),而 00:02.100:02.7 就是我们虚拟出来的 7 个虚拟显卡(VF)。


第六步:将虚拟显卡分配给虚拟机/LXC

场景一:分配给 QEMU 虚拟机(如 Windows / Ubuntu VM)

  1. 在 PVE 网页端,选择你的虚拟机,点击 硬件 (Hardware) -> 添加 (Add) -> PCI 设备 (PCI Device)
  2. 设备 (Device) 下拉菜单中,不要选择 00:02.0(这是物理主显卡,直通它会导致 PVE 失去显卡控制,且无法共享)。
  3. 选择其中一个虚拟显卡(例如 0000:00:02.1)。
  4. 勾选 All Functions,如果是 Windows 虚拟机,建议勾选 PCI-Express
  5. 启动虚拟机,在虚拟机内安装 Intel 官方显卡驱动即可。

场景二:分配给 LXC 容器(如 Jellyfin 官方镜像)

由于 LXC 共享宿主机内核,不需要像普通虚拟机那样通过 PCI 直通。可以直接将显卡渲染设备共享给 LXC。

编辑 LXC 容器的配置文件(例如容器 ID 为 101,文件路径为 /etc/pve/lxc/101.conf):

# 允许 LXC 访问 GPU 设备
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
# 挂载 /dev/dri 设备到容器内
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

进入 LXC 容器后,通过 ls -l /dev/dri 就能看到渲染节点,Jellyfin 开启 Intel QuickSync (QSV) 即可实现丝滑的 4K 硬件转码。


常见坑点与注意事项

  1. PVE 内核升级导致失效
    当 PVE 升级内核后,DKMS 通常会自动尝试为新内核重新编译驱动。但如果新内核变动太大(如从 6.5 升级到 6.8),原有的 i915-sriov-dkms 源码可能不兼容,导致启动后 VF 消失。
    • 解决方法:留意项目 GitHub 仓库,及时 git pull 更新驱动源码后,重新执行 dkms 编译步骤。
  2. HDMI 输出问题
    虚拟显卡(VF)只提供计算和硬解能力,不提供物理接口输出。如果你需要通过工控机的物理 HDMI/DP 接口接显示器,物理接口依然归主卡 00:02.0 所有。
  3. VM 驱动黄三角 (Code 43)
    在 Windows 虚拟机中直通 VF 显卡后,如果设备管理器出现黄三角报错,请确保:
    • 虚拟机使用的是 q35 机型。
    • 已经在 PVE 显卡设置中将默认显卡设为 none(仅保留直通的 PCI 设备),或使用远程桌面连接进行测试。

点评评价

captcha
健康