Proxmox VE 9.2+ Intel 核显 SR-IOV + AMD Radeon AI PRO R9700 直通+Ubuntu24.04部署实测(一)
-
一. 方案概述
Proxmox VE 9.2 宿主(headless) 主机:ASUS TUF GAMING Z890-PRO WIFI / Core Ultra 7 265K / 64GB ① Intel 核显 00:02.0(PF,留给宿主 i915 管理) ├─ 00:02.1 VF -> 办公/学习 VM-1(解码加速) ├─ 00:02.2 VF -> 办公/学习 VM-2 ├─ 00:02.3 VF -> 办公/学习 VM-3 ├─ 00:02.4 VF -> 办公/学习 VM-4 ② AMD R9700 04:00.0(整卡直通) └─> Ubuntu 24.04 算力 VM └─> ROCm + llama.cpp(Qwen3.8-27B)+ DeepSeek Harness WebUI二. 本机配置
组件 型号/参数 主板 ASUS TUF GAMING Z890-PRO WIFI BIOS 3211 CPU Intel Core Ultra 7 265K Arrow Lake-S,20 核 内存 64GB DDR5-6400(2×32GB 双通道) 核显 Intel 8086:7d67(Xe-LPG,驱动识别为 meteorlake) SR-IOV 能力已实测: sriov_totalvfs=4独显 AMD Radeon AI PRO R9700(gfx1201/RDNA4,32GB) 地址 04:00.0启动盘 Samsung MZAMX512HCLV-00BL2 512 GB(LVM pve-root461 G +pve-swap8 G,ext4)数据盘 Kingston SNV2S1000G 1 TB (整块直通给 VM 102 Ubuntu24.04) 系统现状 Ubuntu 24.04.5,内核 7.0.0-31-generic 加载llama.cpp+AMD AI Pro R9700 三. 方案可行性结论(已核实)
1. **核显 SR-IOV 可行**:本机核显实测具备 `Single Root I/O Virtualization` 能力,`sriov_totalvfs=7`(最多 7 个 VF,本方案用 5 个)。Intel 官方支持列表含 Arrow Lake(Core Ultra 200 / Series 2)。 2. **VF 定位为解码加速**:VF 只做渲染/解码(guest 内表现为 `/dev/dri/renderD128`,走 VAAPI/QSV),**不驱动物理 HDMI/DP**。主显示走 virtio-gpu/Spice/RDP,远程连接使用——这正是 Intel vGPU 云桌面的标准用法。 3. **AMD R9700 直通可行**:社区已有双 R9700 在 Proxmox 上跑 llama.cpp 的成功案例,单卡更简单。四. 前置准备(BIOS 设置)
进入 BIOS 确认(这些是 SR-IOV 和直通的共同前提):
设置 值 Intel VT-d Enabled Above 4G Decoding Enabled(VF BAR 需要大地址空间) Re-Size BAR Support Enabled Secure Boot Disabled(你已是 disabled,保持即可) CSM Disabled 参考:内核日志里 VF BAR 的预留是
VF BAR 0 ... contains BAR 0 for 7 VFs,说明固件确实为 7 个 VF 预留了 MMIO 空间。如果 4 个 VF 建不起来,优先回查 Above 4G Decoding 与 Re-Size BAR。步骤 1:安装编译工具链与内核头文件
apt update apt install -y build-essential dkms sysfsutils pciutils wget # 头文件必须与当前运行内核严格对应 apt install -y proxmox-headers-$(uname -r) # 校验 ls -d /usr/src/linux-headers-$(uname -r)如果你的
uname -r不是7.0.14-16-pve,把命令里的版本换成实际值。也可以用proxmox-default-headers跟随默认内核。步骤 2:安装 i915-sriov-dkms
当前最新版
2026.08.12.1,要求内核 6.17.x ~ 7.1.x —— 本机的7.0.14-16-pve在支持范围内。wget -O /tmp/i915-sriov-dkms_2026.08.12.1_amd64.deb \ "https://github.com/strongtz/i915-sriov-dkms/releases/download/2026.08.12.1/i915-sriov-dkms_2026.08.12.1_amd64.deb" dpkg -i /tmp/i915-sriov-dkms_2026.08.12.1_amd64.deb # 关键:确认 DKMS 针对本机的内核编译成功 dkms status # 期望输出:i915-sriov-dkms/2026.08.12.1, 7.0.14-16-pve, x86_64: installed若
dkms status没有installed,先不要重启,否则可能起不来图形/核显。排查:cat /var/lib/dkms/i915-sriov-dkms/2026.08.12.1/build/make.log | tail -40步骤 3:配置内核参数(i915 路径)
编辑
/etc/default/grub,把第 9 行改成:GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_guc=3 i915.max_vfs=4 module_blacklist=xe"要点说明:
intel_iommu=on—— 直通与 VF 隔离前提(当前没写,但 R9700 已在用,说明内核默认开了;显式写上更稳妥)。i915.enable_guc=3—— 启用 GuC + HuC,SR-IOV 必需。本机当前的 GuC 已经在跑(GuC firmware i915/mtl_guc_70.bin version 70.53.0,submission/SLPC/RC 均已启用),加这个参数是确保补丁版驱动下依然加载。i915.max_vfs=4—— 我要 4 个 VF,所以写 4(硬件上限 7;写 4 就只创建 4 个,不浪费 BAR 空间)。module_blacklist=xe—— 硬性要求。本机当前xe已加载(0 引用),必须屏蔽。
应用:
update-grub update-initramfs -u -k all步骤 4:开机自动创建 VF
DKMS 模块装好后,VF 仍需通过 sysfs 显式创建。用
sysfsutils让它在开机时自动执行:echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 4" > /etc/sysfs.conf # 确认写入 cat /etc/sysfs.conf官方 PVE 指南用的就是这一步。只写 grub 参数而不配
sysfs.conf,重启后sriov_numvfs仍是 0,VF 不会出现。步骤 5:把 VF 在宿主上屏蔽
VF 留在宿主上会导致系统不稳定、软件冲突,也可能被宿主的转码软件误用。官方明确建议屏蔽。
️ 注意:已经有 /etc/modprobe.d/vfio.conf(给 R9700 用的options vfio-pci ids=1002:7551,1002:ab40)。下面这条命令会新建 modules-load 配置,不会覆盖你现有的 vfio.conf。但请先确认,不要手工去改 vfio.conf 而把 AMD 的配置弄丢。# 让 vfio-pci 开机加载 echo "vfio-pci" > /etc/modules-load.d/vfio.conf创建 udev 规则(设备 ID 用你的
0x7d67,VF 范围 1–4):cat > /etc/udev/rules.d/99-i915-vf-vfio.rules <<'EOF' # 把核显 VF (00:02.1 - 00:02.4) 绑定到 vfio-pci,PF (00:02.0) 保持 i915 ACTION=="add", SUBSYSTEM=="pci", KERNEL=="0000:00:02.[1-4]", ATTR{vendor}=="0x8086", ATTR{device}=="0x7d67", DRIVER!="vfio-pci", RUN+="/bin/sh -c 'echo $kernel > /sys/bus/pci/devices/$kernel/driver/unbind; echo vfio-pci > /sys/bus/pci/devices/$kernel/driver_override; modprobe vfio-pci; echo $kernel > /sys/bus/pci/drivers/vfio-pci/bind'" EOF update-initramfs -u步骤 6:重启并验证
reboot重启后执行:
# 1) 应看到 PF + 4 个 VF lspci | grep -i vga # 期望:00:02.0(PF)+ 00:02.1 / 00:02.2 / 00:02.3 / 00:02.4 # 2) VF 数量 cat /sys/bus/pci/devices/0000:00:02.0/sriov_numvfs # 期望 4 # 3) 驱动归属:PF 是 i915,VF 是 vfio-pci lspci -nnk -s 00:02 # 4) xe 应已不加载 lsmod | grep -E '^xe ' ; echo "(无输出 = 已成功屏蔽)" # 5) GuC 应正常 dmesg | grep -iE 'guc|sriov' | tail -20 # 6) 宿主上不应出现 VF 的渲染节点 ls /dev/dri/ # 期望只有 card0 和 renderD128;若出现 renderD130+ 说明 VF 未成功屏蔽第 3 步的期望输出形态:
00:02.0 VGA compatible controller: Intel Corporation Arrow Lake-S [Intel Graphics] (rev 06) Kernel driver in use: i915 ← PF 仍是 i915 00:02.1 ... Kernel driver in use: vfio-pci ← VF 归 vfio 00:02.2 ... Kernel driver in use: vfio-pci 00:02.3 ... Kernel driver in use: vfio-pci 00:02.4 ... Kernel driver in use: vfio-pci步骤 7:把 VF 分配给虚拟机
在 PVE Web 界面,对每一台要用的 VM:
- 硬件 → 添加 → PCI 设备
- Raw Device 选择对应的 VF,例如
0000:00:02.1 - 勾选 PCI-Express
- 不要勾选 "Primary GPU";显示(Display)保持 virtio-gpu 或 SPICE
- 一台 VM 只给一个 VF,四个 VF 给四台 VM
VF 只做渲染/编解码,不驱动物理 HDMI/DP 输出。 显示走 virtio-gpu + SPICE/RDP/noVNC,这正是 Intel vGPU 云桌面的标准用法。
步骤 8:guest 内配置
DKMS 模块必须同时装在宿主机和 guest 里(项目 README 明确要求:"You need to install this dkms module in both host and guest!")。
以 Ubuntu 24.04 guest 为例(本机的 VM 102 内核
7.0.0-31-generic,同样落在 6.17–7.1 支持区间):sudo apt update sudo apt install -y build-essential dkms "linux-headers-$(uname -r)" wget pciutils # 安装同一个 deb wget -O /tmp/i915-sriov-dkms_2026.08.12.1_amd64.deb \ "https://github.com/strongtz/i915-sriov-dkms/releases/download/2026.08.12.1/i915-sriov-dkms_2026.08.12.1_amd64.deb" sudo dpkg -i /tmp/i915-sriov-dkms_2026.08.12.1_amd64.deb sudo dkms status # guest 里不需要也不应该设 max_vfs(那是 PF 侧参数) sudo sed -i 's/^GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="i915.enable_guc=3 module_blacklist=xe /' /etc/default/grub sudo update-grub sudo update-initramfs -u -k all sudo rebootguest 内验证:
ls -l /dev/dri # 期望出现 renderD128 sudo apt install -y vainfo intel-gpu-tools ffmpeg intel-media-va-driver-non-free vainfo --display drm --device /dev/dri/renderD128 # 期望看到 H.264 / HEVC / VP9 / AV1 的 decode 入口 # FFmpeg 硬解冒烟测试(HEVC) ffmpeg -hide_banner \ -init_hw_device vaapi=va:/dev/dri/renderD128 -filter_hw_device va \ -f lavfi -i testsrc2=size=1920x1080:rate=30 \ -vf 'format=nv12,hwupload' -c:v hevc_vaapi -frames:v 120 -f null -
五、验证清单
# 检查项 命令(位置) 期望结果 1 DKMS 编译成功 dkms status(宿主)i915-sriov-dkms/2026.08.12.1, 7.0.14-16-pve: installed2 xe 已屏蔽 lsmod \| grep '^xe '(宿主)无输出 3 VF 数量 cat .../sriov_numvfs(宿主)44 PF 归 i915 lspci -nnk -s 00:02.0(宿主)Kernel driver in use: i9155 VF 归 vfio lspci -nnk -s 00:02.1(宿主)Kernel driver in use: vfio-pci6 宿主无 VF 渲染节点 ls /dev/dri/(宿主)只有 card0/renderD1287 GuC 正常 dmesg \| grep -i guc(宿主)无 firmware 加载失败 8 guest 看到设备 ls -l /dev/dri(guest)renderD128存在9 硬解可用 vainfo --display drm ...(guest)列出 H.264/HEVC/VP9/AV1 10 多 VM 并行 四台 VM 同时转码 均正常,无掉卡
六、风险与注意事项
6.1 实验性方案
DKMS 项目自己的声明是 "highly experimental"、"use it at your own risk"。走这条路意味着:
- 不受 Intel 官方支持;
- 可能遇到稳定性问题。报 "driver not bound / 无 VF"。
6.2 内核升级会让模块失效
每次 PVE 升级内核后,必须重装/重编译 DKMS 模块,否则核显会退回内置驱动、VF 全部消失。
# 升级内核后 dkms status # 检查是否已为新内核构建 apt install -y proxmox-headers-$(uname -r) # 装新内核头文件 dkms autoinstall # 或重装 deb建议固定当前内核直到确认稳定,或在升级流程里加上
dkms autoinstall。6.3 四个 VF 共享同一颗物理核显
这是最重要的一条性能预期管理:4 个 VF 并非 4 颗独立显卡,它们共享同一组执行单元(EU)和媒体引擎(VDBOX)。
- 4 台 VM 同时重度转码会互相争抢,性能是非线性下降的;
- Intel 的媒体引擎在 VF 之间的隔离并不完全,高并发时可能出现个别任务变慢;
- 轻中度办公/学习场景(偶尔看视频、视频会议硬解)完全够用;
- 不要预期"4 路 4K 同时转码"能线性扩展。
6.4 绝对不要把 PF 直通给 VM
00:02.0(PF)必须留在宿主机。把 PF 直通给任何 VM 会导致其余所有 VF 一起崩溃。只直通00:02.1~00:02.4。6.5 不要覆盖现有的 vfio.conf
你的
/etc/modprobe.d/vfio.conf里有 R9700 的ids=1002:7551,1002:ab40。步骤 5 新建的是/etc/modules-load.d/vfio.conf(不同目录、不同用途),不要用重定向覆盖/etc/modprobe.d/vfio.conf,否则 R9700 直通会失效。6.6 与现有 R9700 直通共存
两者互不冲突:R9700 走
04:00.0的 vfio-pci,核显 PF 走00:02.0的 i915。但修改后务必回归验证 VM 102 能正常启动、rocm-smi能看到 R9700。