Proxmox GPU 直通实战教程(AMD Ryzen 9 7950X + NVIDIA RTX 5060 Ti)
这篇文章整理自一次完整的排障聊天记录,目标环境如下:
- 宿主机:Proxmox VE(AMD 平台)
- CPU:Ryzen 9 7950X(带 AMD Raphael 核显)
- 主板:MSI PRO B650M-A WIFI
- 需要直通给虚拟机的独显:NVIDIA GeForce RTX 5060 Ti
- 宿主机显示继续使用核显,NVIDIA 独显专供虚拟机
如果你也是类似的 AM5 + NVIDIA 组合,这套流程基本可以直接复用。
本教程涉及的技术栈
这篇教程不仅是操作步骤,还涉及多层虚拟化与内核机制。理解这些层次会让排障更高效:
-
固件层(UEFI/BIOS)
SVM(AMD-V)负责开启 CPU 硬件虚拟化扩展。IOMMU(AMD-Vi)负责 DMA 重映射与设备隔离。- 使用 UEFI 模式可避免部分 Legacy 初始化行为对 GPU 直通产生干扰。
-
虚拟化平台层(Proxmox VE)
- Proxmox 是管理层,真正的虚拟化加速由 Linux
KVM完成,设备模型由QEMU提供。 - GPU 直通本质是让 QEMU 把真实 PCIe 设备直接交给客户机,而不是使用虚拟显卡。
- Proxmox 是管理层,真正的虚拟化加速由 Linux
-
隔离层(Linux IOMMU 分组)
IOMMU的全称是Input-Output Memory Management Unit。- 内核会按隔离边界把 PCI 设备划分为 IOMMU groups。
- 只有分组隔离合理,直通才安全且稳定。
-
设备绑定层(VFIO)
VFIO的全称是Virtual Function I/O。vfio(VFIO 核心框架)、vfio_iommu_type1(Type-1 IOMMU 后端)、vfio_pci(PCI 设备绑定驱动)、vfio_virqfd(虚拟中断 eventfd 支持)共同构成用户态虚拟机直通链路。- 把显卡绑定到
vfio-pci的目的是阻止宿主机图形驱动抢先占用设备。
-
引导与模块编排层
- GRUB 注入内核参数(
amd_iommu=on iommu=pt)。 initramfs保证关键模块和绑定策略在早期启动阶段就可用。/etc/modules-load.d/管理模块自动加载,/etc/modprobe.d/管理模块参数与黑名单策略。
- GRUB 注入内核参数(
-
虚拟机硬件配置层
OVMF (UEFI)+q35提供更贴近现代 PCIe 设备的虚拟平台。CPU type: host暴露更多原生 CPU 特性。- 关闭 ballooning 可降低直通场景中的 DMA 稳定性风险。
-
验证工具链
dmesg、/proc/cmdline、find /sys/kernel/iommu_groups、lspci -nnk用于宿主机侧状态确认。nvidia-smi用于客户机侧驱动与运行状态确认。
1. 最终成功状态
在开始前,先明确最终应该达到的状态:
- BIOS 里 SVM 和 IOMMU 都已开启。
- 内核启动参数包含
amd_iommu=on iommu=pt。 /sys/kernel/iommu_groups/下存在 IOMMU 分组。- NVIDIA 显卡两个功能设备都绑定到
vfio-pci。 - 虚拟机使用
OVMF (UEFI)+q35,并成功挂载 PCI 直通设备。
2. BIOS 配置(MSI Click BIOS 5)
步骤 1:进入高级模式
重启进入 BIOS(一般开机按 Delete),切换到 Advanced Mode。

步骤 2:进入 AMD CBS
依次进入:
OC->Advanced CPU Configuration->AMD CBS

步骤 3:开启虚拟化相关选项
在 AMD CBS 中设置:
SVM Enable->EnabledIOMMU->Enabled
建议显式设为 Enabled,不要依赖 Auto。

步骤 4:配置两个 DMA Protection 选项
在本次测试的 MSI PRO B650M-A WIFI 固件中,需要显式设置以下两个名称相近、但彼此独立的选项:
Pre-boot DMA Protection->DisabledKernel DMA protection Indicator->Disabled
仅关闭 Pre-boot DMA Protection 不会消除本机固件要求的 direct IOMMU 映射;真正让 GPU 虚拟机恢复启动的是关闭 Kernel DMA protection Indicator。不要关闭 IOMMU,VFIO 仍然依赖它完成 DMA 重映射与设备隔离。
不同 BIOS 版本可能会调整菜单位置,请在 AMD CBS 与安全相关菜单中搜索这两个完整名称。修改后保存 BIOS 设置并重启宿主机。
这项操作存在安全取舍:上述两个选项控制固件/操作系统的 DMA 保护策略,而 IOMMU 提供直通所需的 DMA 重映射。仅建议在物理环境与 PCIe 设备均可信的宿主机上关闭它们。
此外,Ryzen 长期运行宿主机还可以考虑以下可选稳定性设置:
Global C-state Control->Disabled
若没有特殊需求,PCIe ARI Support 可以保持 Auto。

步骤 5:确认 UEFI 启动
在 Settings -> Boot 中确认:
Boot mode select为UEFI

保存并重启(F10)。
3. 在 Proxmox 验证并启用 IOMMU
步骤 6:先做基础检测
在 AMD 平台上,常见输出类似:
这表示硬件被识别到了,但还需要确认内核参数已生效。
步骤 7:添加内核参数(GRUB)
先查看当前启动参数:
本次环境中出现了 root=/dev/mapper/pve-root,说明是 LVM + GRUB。
编辑:
设置:
应用并重启:
重启后再次验证:
确认看到 amd_iommu=on iommu=pt。
步骤 8:确认 IOMMU 分组存在
快速检查:
更严格一点可以看分组条目:
只要目录存在且有分组项,IOMMU 就是工作状态。
4. 开机加载 VFIO 模块
虽然历史上常编辑 /etc/modules,但在 systemd 环境下更推荐使用 /etc/modules-load.d/。
创建:
写入:
更新 initramfs:
如果看到:
在 GRUB/LVM 布局下属于正常现象。
然后重启:
5. 将 NVIDIA 显卡绑定到 vfio-pci
步骤 9:识别显卡设备 ID
本次环境识别结果:
- NVIDIA 图形功能:
01:00.0->[10de:2d04] - NVIDIA 音频功能:
01:00.1->[10de:22eb] - 宿主核显:AMD Raphael
11:00.0(amdgpu)
步骤 10:配置 vfio-pci 绑定 ID
创建:
写入:
步骤 11:屏蔽宿主机 NVIDIA 驱动
创建:
写入:
说明:
- 不要屏蔽
amdgpu,否则宿主核显会受影响。 blacklist radeon在现代 Ryzen 核显平台通常不是必须。
应用并重启:
步骤 12:最终验证
理想结果:
这说明宿主机已经把显卡完整交给 VFIO,具备直通条件。
6. 创建 Ubuntu 虚拟机(Proxmox UI)
宿主侧绑定完成后,建议新建虚拟机,而不是复用旧的 SeaBIOS 模板。
创建向导建议:
- OS:选择你的 Ubuntu ISO
- System:
- BIOS:
OVMF (UEFI) - Machine:
q35 - Graphics:安装阶段保留
Default或VirtIO-GPU - CPU:
- Type:
host - Memory:
- 关闭 ballooning
- Network:
VirtIO
然后添加 PCI 设备:
Hardware->Add->PCI Device- 选择
01:00.0(NVIDIA VGA) - 勾选:
All FunctionsROM-BarPCI-Express
为什么只选 01:00.0?
- 因为勾选
All Functions后,会自动把同地址下的01:00.1音频功能一起直通。
安装 Ubuntu 后,在虚拟机内安装 NVIDIA 驱动,并执行:
7. 常见问题排查
- 重启后不是
vfio-pci: - 复查
vfio.conf、blacklist.conf,并再次执行update-initramfs -u -k all。 - 没有 IOMMU 分组:
- 复查 BIOS 中 SVM/IOMMU,以及内核启动参数。
- 安装器黑屏:
- 先保留虚拟显示设备完成系统安装,之后再调整显示策略。
lspci里看到Kernel modules但没生效:- 关键看
Kernel driver in use,不是看模块是否存在。 - 启动虚拟机时出现固件要求的 1:1 IOMMU 映射错误:
- 内核日志可能出现
Firmware has requested this device have a 1:1 IOMMU mapping,同时 QEMU 报告Failed to set group container: Invalid argument。 - 对于本文位于 IOMMU group 13 的显卡,执行
cat /sys/kernel/iommu_groups/13/reserved_regions可安全地只读检查固件派生的保留区;如果显卡位于其他组,请替换13。若存在以direct结尾的条目,即确认存在相关的恒等映射约束。 - 返回 BIOS 步骤 4,显式关闭两个 DMA Protection 选项。本次实测中,仅设置
Pre-boot DMA Protection = Disabled无效;Kernel DMA protection Indicator = Disabled才是实际修复。 - 其可能机制是:启用该 Indicator 后,MSI 固件会暴露 AMD IVRS/IVMD exclusion regions;Linux 将其表示为必须保留的 direct/恒等映射,导致 VFIO 无法把 GPU 从宿主机 IOMMU domain 切换到虚拟机的 DMA domain。
8. 总结
当 01:00.0 和 01:00.1 都显示 Kernel driver in use: vfio-pci 时,宿主侧配置就完成了。
此时 Proxmox 不再占用这张 NVIDIA 显卡,虚拟机即可独占使用,性能接近原生。