在单台轻量级服务器(如搭载 Intel N100 处理器的小主机)上,既想让 PVE 主机保留控制台输出,又想让黑群晖(DSM)实现独占般的显卡硬件加速(用于 Plex/Jellyfin 转码和 Synology Photos 人脸识别),传统的 PCIe 直通(Passthrough) 显然无法满足多虚拟机共享显卡的需求,而已经过时的 GVT-g 在 11 代及以后的 CPU 上也不再受支持。
目前最完美的方案是利用 SR-IOV(Single Root I/O Virtualization) 技术,将 N100 的 UHD 核显虚拟出多个独立的 VF(Virtual Function)子显卡,分别分给黑群晖、iStoreOS 或 Windows 虚拟机。
以下是基于 PVE 8.1(Kernel 6.5/6.8) 物理机,将 SR-IOV 虚拟显卡分给**黑群晖 DSM 7.2.x(推荐 SA6400 机型)**并激活硬件加速与人脸识别的完整实操指南。
准备工作与避坑说明
- 主板 BIOS 设置:进入 BIOS,务必开启
VT-d、SR-IOV,并将Internal Graphics设为Enabled(不要设为 Auto),Primary Display设为IGFX。 - 黑群晖机型选择:由于 N100(Alder Lake-N)属于 12 代架构,传统的 DS918+/DS920+(内核版本仅 4.4)无法完美驱动该核显。强烈建议使用 SA6400 机型,其采用 5.10+ 内核,对新一代 Intel 核显及 SR-IOV 虚拟显卡的兼容性极佳。
- 引导工具:推荐使用 Arc Loader 或 RR Loader (Redpill-Relation),它们内置了较新的显卡驱动组件(如
i915驱动补丁)。
第一步:PVE 宿主机配置 SR-IOV 驱动
由于 Intel 官方 Linux 内核主流分支尚未完全合并 12 代核显的 SR-IOV 开启脚本,我们需要借助社区维护的 DKMS 驱动模块。
1. 修改 GRUB 开启 IOMMU 与核显 GUC/WUC
编辑 PVE 的 grub 配置文件:
nano /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT 行,修改或添加以下参数(开启 IOMMU 支持、启用核显 SR-IOV 所需的 GuC/HuC 加载):
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7"
注:max_vfs=7 表示最多虚拟出 7 个 VF 子显卡。
更新 GRUB 并重启 PVE:
update-grub
reboot
2. 安装编译依赖与 i915 SR-IOV DKMS 驱动
重启后,安装当前内核对应的头文件和编译工具:
apt update
apt install -y pve-headers-$(uname -r) build-essential dkms git
克隆目前对 6.5/6.8 内核支持较好的第三方 SR-IOV 驱动仓库(推荐 strongtz/i915-sriov-dkms):
cd /usr/src
git clone https://github.com/strongtz/i915-sriov-dkms.git i915-sriov-dkms-2023.12.21
注:请根据你克隆时的分支版本,重命名文件夹以符合 dkms 规范(格式为 i915-sriov-dkms-<版本号>)。
创建 dkms.conf 或使用仓库内自带的配置文件,然后添加并编译该驱动:
dkms add -m i915-sriov-dkms -v 2023.12.21
dkms build -m i915-sriov-dkms -v 2023.12.21
dkms install -m i915-sriov-dkms -v 2023.12.21
检查驱动状态,若显示 installed 则说明编译加载成功:
dkms status
3. 配置 sysfs 脚本自动生成虚拟显卡
为了在每次开机时自动生成 VF 虚拟显卡,可以通过 sysfsutils 或 systemd 服务来写入配置。
安装 sysfsutils:
apt install -y sysfsutils
编辑 /etc/sysfs.conf,在末尾添加(以分配 3 个 VF 为例):
# 这里的 0000:00:02.0 是 N100 核显在 PVE 中的 PCI 地址,可用 lspci | grep VGA 确认
devices/pci0000:00/0000:00:02.0/sriov_numvfs = 3
保存并重启 PVE。重启后在 PVE 终端运行:
lspci | grep VGA
如果能看到类似如下输出,说明 SR-IOV 已经成功启用,02.1 到 02.3 就是虚拟出来的子显卡:
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics] (rev 07)
00:02.1 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics] (rev 07)
00:02.2 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics] (rev 07)
00:02.3 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics] (rev 07)
第二步:在 PVE 中为黑群晖 VM 分配虚拟显卡
- 登录 PVE WebUI,选择你的黑群晖虚拟机(建议使用 q35 机型,BIOS 使用 OVMF (UEFI))。
- 点击 硬件 (Hardware) -> 添加 (Add) -> PCI 设备 (PCI Device)。
- 在设备列表中,不要选择 00:02.0(这是主显卡),选择虚拟出来的子显卡,例如
0000:00:02.1。 - 勾选 所有功能 (All Functions),并将 ROM-Bar 和 PCI-Express 勾选上。
- 保存配置。
第三步:编译黑群晖 SA6400 引导并加载驱动
建议使用 RR (Redpill-Relation) Loader,它对新型 GPU 的兼容处理极其傻瓜化。
- 挂载 RR 引导镜像并启动虚拟机,进入编译配置后台(通过浏览器访问屏幕显示的 IP:7681)。
- 机型选择:必须选择 SA6400。
- 版本选择:推荐选择最新的 DSM 7.2.1-69057。
- 插件 (Addons) 配置:
- 必须添加
i915驱动插件(用于驱动 Alder Lake-N 显卡)。 - 添加
misc或showpci插件,方便在 DSM 内检查设备。
- 必须添加
- Cmdline 配置:确保引导配置中没有禁用显卡硬解的参数。
- 点击 Build the loader 编译引导,完成后选择 Boot the system 启动群晖。
第四步:在 DSM 中验证虚拟显卡状态
群晖系统安装完毕并进入桌面后,通过 SSH 连接到群晖。
执行以下命令查看显卡节点:
ls -la /dev/dri
如果看到如下输出,说明群晖已成功识别并驱动了该 SR-IOV 虚拟显卡:
total 0
drwxr-xr-x 3 root root 80 Oct 24 12:00 .
drwxr-xr-x 12 root root 4340 Oct 24 12:00 ..
crw-rw---- 1 root card 226, 0 Oct 24 12:00 card0
crw-rw---- 1 root video 226, 128 Oct 24 12:00 renderD128
只要存在 /dev/dri/renderD128,就意味着硬件转码的基本通道已经打通。
第五步:实现 Synology Photos 人脸识别
黑群晖在非官方授权的硬件上运行 Synology Photos 时,往往会因为 AME (Advanced Media Extensions) 未激活、序列号不合法等原因,导致无法调用 GPU 进行 HEIC 格式解码和人脸识别。
1. 破解 AME 授权(免官方洗白序列号)
对于 DSM 7.2,我们可以利用社区开源脚本免洗白直接激活 AME(以获取 HEVC/HEIC 授权)。
使用 SSH 登录群晖,切换到 root 账户,运行以下一键激活补丁(请确保群晖已在套件中心安装了 AME 套件,但未激活):
# 下载并运行 AME 7.2 激活脚本
curl -L https://raw.githubusercontent.com/AlexPresso/Synology-AME-Patcher/main/ame.py | python3 -
根据提示操作,该脚本会修改 AME 的动态链接库,使其绕过群晖服务器的 SN 校验,强制显示“已成功激活”。
2. 强制启用 Photos 显卡加速 (chpcode 补丁)
Synology Photos 的人脸识别和缩略图生成默认会检测 CPU/GPU 的白名单。我们可以通过 chpcode 补丁,让 Photos 认为当前处于支持硬件加速的官方机型上。
使用 SSH 运行以下命令:
wget https://raw.githubusercontent.com/jin3089/chpcode/main/chpcode -O /usr/bin/chpcode
chmod +x /usr/bin/chpcode
/usr/bin/chpcode
运行后,该补丁会劫持 synocodectool 的调用,并强制开启转码与 AI 识别的硬件加速。
验证方式:向 Synology Photos 上传几张包含人脸的新照片,稍等片刻,进入“人物”相册,观察是否开始建立人脸索引。同时在 SSH 中运行 top 或 intel_gpu_top(如果群晖内安装了该工具),可以看到显卡调用率上升。
第六步:配置 Plex 硬件转码
在群晖中,我们通常使用 Container Manager(Docker)部署 Plex,这样升级和维护最为方便。
1. 创建 Docker Compose 配置
在群晖 docker 目录下新建 plex 文件夹,并编写 docker-compose.yml 文件。务必将 /dev/dri 映射进容器,并赋予对应权限:
version: '3.8'
services:
plex:
image: plexinc/pms-docker:latest
container_name: plex
network_mode: host
environment:
- TZ=Asia/Shanghai
- PLEX_CLAIM=your_claim_token_here # 填入你的 Plex Claim Token
volumes:
- ./config:/config
- ./transcode:/transcode
- /volume1/video:/data # 替换为你的媒体库路径
devices:
- /dev/dri:/dev/dri # 将虚拟显卡映射进容器
user: "1024:100" # 建议修改为群晖中具有显卡读取权限的用户 UID:GID
restart: unless-stopped
2. 赋予 Docker 容器显卡访问权限
群晖默认的 renderD128 权限可能不属于常规 Docker 用户,需要在群晖开机时自动放宽显卡设备文件的读写权限。
在群晖的 控制面板 -> 任务计划 -> 新增 -> 触发的任务 -> 用户定义的脚本 中添加:
- 任务名称:Chmod GPU
- 用户:root
- 事件:开机
- 运行命令:
chmod 666 /dev/dri/card0 chmod 666 /dev/dri/renderD128
手动运行一次该任务,随后启动 Plex 容器。
3. 在 Plex Web 中启用硬件加速
- 打开 Plex 网页端,进入 设置 -> 转码器 (Transcoder)。
- 勾选 Use hardware acceleration when available(启用硬件加速快捷转码)。
- 转码设备选择 Alder Lake-N [UHD Graphics]。
- 找一个 4K HEVC 的高码率视频进行播放,在播放端选择降低分辨率转码,返回 Plex 服务端控制台的“活动”页面,看到视频流后面显示 (hw) 字样(例如
H264 (HW) -> H264 (HW)),即代表 N100 的 SR-IOV 虚拟显卡转码成功。
常见问题与排错
1. PVE 主机更新内核后 SR-IOV 失效
每次 PVE 内核升级(例如从 6.5.x 升级到 6.8.x),都需要重新编译 DKMS 驱动。如果在更新后虚拟显卡不见了,只需登录 PVE 重新执行:
dkms autoinstall
系统会自动在新内核下编译并加载 i915-sriov 驱动。
2. Synology Photos 依然不识别人物
如果完成了补丁但依然没有识别:
- 请检查 AME 的“高级媒体扩展”套件是否确实显示“已授权/已激活”。
- 确认上传的照片是否为原始格式(Photos 不会对过小的、模糊的图片进行人脸识别)。
- 尝试在群晖的“控制面板” -> “索引服务”中,对媒体文件执行一次“重建索引”。