X99 平台 Proxmox VE 直通 AMD RX 7900 XTX 完整实战指南
适用平台:华南金牌 X99-TF + Intel Xeon E5 v3/v4(40 通道 CPU 最佳)
目标显卡:Sapphire NITRO+ RX 7900 XTX Vapor-X(设备 ID 1002:744c,音频 ID 1002:ab30)
PVE 版本:Proxmox VE 8.x / 9.x,内核 7.0.2-6-pve
亮机卡:NVIDIA GeForce GT 620(10de:1049,用于宿主机显示输出)
目标 Guest:Ubuntu 24.04 LTS
写在前面:AMD 官方明确声明 RX 7900 XTX 的 PCI Passthrough 不在支持范围内,所有可用的方案均属于社区实践。本指南记录的是在 X99 平台上实际跑通的完整配置,但不保证在其他主板上完全复现。X99 平台存在 PCIe 根端口 AER 报错这一硬件级限制,需要在软件层面尽量规避。
一、硬件准备
| 设备 |
位置 |
用途 |
| RX 7900 XTX |
离 CPU 最近的 PCIe x16 插槽(Port 1A) |
直通给 Guest |
| GT 620 |
第二条 x16 或 x4 插槽 |
PVE 宿主机显示输出 |
| 显示器 |
接在 GT 620 上 |
用于 PVE 安装和救援 |
关键原则:7900 XTX 必须插在直连 CPU 的插槽,保证 IOMMU 分组独立且 PCIe 带宽为 x16。GT 620 负责宿主机显示,两张卡在不同的 IOMMU 组(本例中 GT 620 在 Group 31,7900 XTX 在 Group 35)。
二、BIOS 设置(华南金牌 X99-TF)
进入 BIOS(Aptio Setup Utility),完成以下配置:
2.1 IntelRCSetup 标签页
进入 IIO Configuration,设置:
| 选项 |
值 |
| Intel VT for Directed I/O (VT-d) |
[Enabled] |
| ACS Control |
[Enabled] |
| Interrupt Remapping |
[Enabled] |
| Coherency Support (Non-Isoch) |
[Enabled] |
| Coherency Support (Isoch) |
[Enabled] |
| VTd Azalea Vcp Optimizations |
[Disable](保持默认) |
进入 IIO0 Configuration,确认两个全长插槽都是 x16:
| 选项 |
值 |
| IOU0 (IIO PCIe Port 2) |
[x16] |
| IOU1 (IIO PCIe Port 3) |
[x16] |
注意:X99-TF 的 BIOS 中没有独立的 Link Speed 选项(子菜单中也没有),速率由硬件自动协商为 Gen3。
2.2 Advanced 标签页
进入 PCI Subsystem Settings:
| 选项 |
值 |
| Above 4G Decoding |
[Enabled] |
| Re-Size BAR Support |
[Enabled](部分 BIOS 版本需关闭,见下方说明) |
| SR-IOV Support |
[Enabled] |
进入 CSM Configuration:
| 选项 |
值 |
| CSM Support |
[Disabled](使用 UEFI 引导) |
关于 Re-Size BAR 的取舍:如果直通后出现频繁 AER 报错或虚拟机启动不稳定,将 Re-Size BAR Support 改为 [Disabled] 再测试。这会牺牲少量性能,但能显著提升兼容性。
2.3 关于板载显卡选项
华南金牌 X99-TF 没有物理板载显卡,BIOS 中也没有 Onboard VGA Control 或 Primary Display 相关选项。直接使用 GT 620 作为宿主机显示输出即可,无需额外设置。
保存退出:按 F10。
三、PVE 宿主机配置
3.1 安装 PVE
用 U 盘安装 PVE 8.x 或 9.x。安装时显示器接在 GT 620 上。
3.2 开启 IOMMU
编辑 GRUB 配置:
nano /etc/default/grub
将 GRUB_CMDLINE_LINUX_DEFAULT 这一行完整替换为(注意:必须是一整行,不能有换行):
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pci=noaer video=efifb:off initcall_blacklist=sysfb_init"
保存退出后执行:
update-grub
update-initramfs -u
reboot
重启后验证 IOMMU:
dmesg | grep -e DMAR -e IOMMU
应看到 DMAR: IOMMU enabled。
3.3 获取显卡设备 ID
lspci -nn | grep -i vga
lspci -nn | grep -i audio
本例输出:
- 7900 XTX 显卡:
05:00.0,ID 1002:744c
- 7900 XTX 音频:
05:00.1,ID 1002:ab30
- GT 620:
01:00.0,ID 10de:1049(不需要屏蔽)
3.4 绑定 vfio-pci
创建 VFIO 配置(不要加入 disable_vga=1,该参数会导致 X99 平台启动死锁):
cat << EOF > /etc/modprobe.d/vfio.conf
options vfio-pci ids=1002:744c,1002:ab30
EOF
拉黑宿主机 AMD 驱动:
cat << EOF > /etc/modprobe.d/pve-blacklist.conf
blacklist amdgpu
blacklist radeon
EOF
让 PVE 开机自动加载 VFIO 模块:
echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd" >> /etc/modules
更新 initramfs 并重启:
update-initramfs -u
reboot
3.5 验证 vfio-pci 接管成功
lspci -nnk | grep -A 3 "VGA compatible controller"
7900 XTX(05:00.0)下面应显示:
Kernel driver in use: vfio-pci
GT 620(01:00.0)下面应显示:
Kernel driver in use: nvidiafb
3.6 验证 IOMMU 分组独立
for d in /sys/kernel/iommu_groups/*/devices/*; do n="${d#*/iommu_groups/*}"; n="${n%%/*}"; printf 'IOMMU group %s ' "$n"; lspci -nns "${d##*/}"; done | grep -E "1002:744c|10de:1049"
本例输出:
IOMMU group 31 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GF119 [GeForce GT 620 OEM] [10de:1049] (rev a1)
IOMMU group 35 05:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 [Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M] [1002:744c] (rev c8)
两张卡在不同 Group,说明分组干净,可以单独隔离。
四、vBIOS 文件准备
必须从自己这张显卡上提取,不要从网上下载第三方 vBIOS。
- 将 7900 XTX 装到一台 Windows 机器上。
- 用 GPU-Z 软件导出 vBIOS,保存为
7900xtx.rom。
- 上传到 PVE 宿主机
/usr/share/kvm/ 目录。
- 验证文件:
ls -lh /usr/share/kvm/7900xtx.rom
应显示约 2.0M 大小。
五、创建 Ubuntu 虚拟机
5.1 创建 VM
在 PVE Web UI 中创建虚拟机,关键参数:
| 项目 |
值 |
| VM ID |
101 |
| 名称 |
Ubuntu24.04 |
| BIOS |
OVMF (UEFI) |
| Machine |
q35 |
| CPU |
host |
| 核心数 |
16 |
| 内存 |
61440 MB |
| 磁盘 |
388G |
| 网络 |
virtio, bridge=vmbr0 |
| 显示 |
默认(先用 QEMU 虚拟显卡) |
| 引导顺序 |
sata0;net0 |
5.2 编辑虚拟机配置文件
nano /etc/pve/qemu-server/101.conf
当前跑通的配置内容:
balloon: 0
bios: ovmf
boot: order=sata0;net0
cores: 16
cpu: host
efidisk0: local-lvm:vm-101-disk-0,efitype=4m,ms-cert=2023k,pre-enrolled-keys=1,size=4M
hostpci0: 0000:05:00,pcie=1,romfile=7900xtx.rom
ide2: none,media=cdrom
machine: q35
memory: 61440
meta: creation-qemu=11.0.0,ctime=1789626016
name: Ubuntu24.04
net0: virtio=BC:24:11:7B:0F:27,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
sata0: local-lvm:vm-101-disk-1,size=388G
scsihw: virtio-scsi-single
smbios1: uuid=e144b18b-b6fb-4350-bc4c-b1c9659bfe59
sockets: 1
vmgenid: afd026f7-60b3-4c56-a1ca-5d67d88245b7
关键说明:
hostpci0: 0000:05:00,pcie=1,romfile=7900xtx.rom — 使用 pcie=1 启用 PCIe 直通,加载 vBIOS
- 不要加
args: -fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=65536,X99 平台会因此触发 AER 报错
- 不要加
disable_vga=1,会导致启动死锁
x-vga=1 可以视 Guest 内输出情况决定是否添加,本例最终未使用
5.3 给虚拟机添加串口(调试用)
qm set 101 -serial0 socket
之后可以用 qm terminal 101 通过串口查看引导输出。
六、安装 Ubuntu 24.04
6.1 先不加直通,用虚拟显卡装完系统
重要:先用最简配置完成 Ubuntu 安装,避免直通干扰安装流程。
# 临时去掉直通
qm set 101 -delete hostpci0
挂载 Ubuntu ISO:
ls /var/lib/vz/template/iso/
qm set 101 -ide2 local:iso/你的ubuntu镜像.iso,media=cdrom
qm set 101 -boot order=ide2;sata0;net0
启动 VM:
qm start 101
通过 PVE Web UI → VM 101 → Console → noVNC 完成 Ubuntu 安装。
6.2 安装时确认
- 设置用户名(本例为
kby)和密码
- 配置网络(DHCP 或静态 IP)
- 安装过程中勾选
Install OpenSSH server
安装完成后,记录 Guest 的 IP 地址(本例为 192.168.0.58)。
6.3 在 Guest 内配置 SSH
SSH 进 Guest:
ssh [email protected]
安装并启用 SSH:
sudo apt update
sudo apt install openssh-server -y
sudo systemctl enable --now ssh
sudo systemctl status ssh
看到 active (running) 即可。
七、加回直通并配置 Guest 显示
7.1 在 PVE 宿主机加回直通
qm set 101 -hostpci0 0000:05:00,pcie=1,romfile=7900xtx.rom
重启 VM:
qm stop 101
qm start 101
启动时可能出现以下警告:
error writing '1' to '/sys/bus/pci/devices/0000:05:00.0/reset': Inappropriate ioctl for device
failed to reset PCI device '0000:05:00.0', but trying to continue as not all devices need a reset
这是正常警告,不会阻断启动,QEMU 会继续执行。
7.2 Guest 内验证显卡识别
SSH 进 Guest:
ssh [email protected]
lspci -nnk | grep -i vga -A3
应看到:
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 [Radeon RX 7900 XT/7900 XTX/7900M] [1002:744c] (rev c8)
Subsystem: Sapphire Technology Limited NITRO+ RX 7900 XTX Vapor-X [1da2:e471]
Kernel driver in use: amdgpu
Kernel modules: amdgpu
以及 00:01.0 的 QEMU 虚拟显卡(bochs-drm)。
7.3 检查 amdgpu 驱动加载日志
sudo dmesg | grep -i amdgpu | tail -n 80
关键成功标志:
amdgpu: 24560M of VRAM memory ready
[drm] Initialized amdgpu 3.64.0 for 0000:01:00.0 on minor 1
可能出现的非致命报错:
amdgpu: PCIe atomic ops is not supported
amdgpu: [drm] Failed to setup vendor infoframe on connector HDMI-A-2: -22
-22 是 HDMI infoframe 格式不合法,会影响 HDMI 音频通道建立,但不影响显示输出的核心功能。
7.4 确认 /dev/dri 设备节点
ls -l /dev/dri/
应看到:
card0(bochs 虚拟显卡)
card1(7900 XTX)
renderD128(7900 XTX 渲染节点)
八、强制 Xorg 使用 7900 XTX 作为主 GPU
这一步是关键:Ubuntu 默认把 card0(bochs 虚拟显卡)当作主显示输出,导致 7900 XTX 虽然驱动加载成功,但拿不到 GDM 的显示绑定。
8.1 创建 Xorg 配置文件
在 Guest 内:
sudo nano /etc/X11/xorg.conf
填入:
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0"
EndSection
Section "Device"
Identifier "AMD0"
Driver "amdgpu"
BusID "PCI:1:0:0"
Option "PrimaryGPU" "yes"
EndSection
Section "Screen"
Identifier "Screen0"
Device "AMD0"
DefaultDepth 24
EndSection
保存:Ctrl+O → Enter → Ctrl+X。
8.2 强制 GDM 使用 Xorg(禁用 Wayland)
sudo nano /etc/gdm3/custom.conf
找到 #WaylandEnable=false,去掉前面的 #,变成:
WaylandEnable=false
保存退出。
8.3 更新并重启
sudo update-initramfs -u
sudo reboot
重启后,7900 XTX 屏幕应出现 GDM 登录界面。
九、HDMI 音频配置
如果 HDMI 音频未自动生效,按以下顺序排查:
9.1 检查系统声音设置
打开 Ubuntu 的 设置 → 声音,在“输出设备”中查找 HDMI / DisplayPort Output 或 Navi 31 HDMI Audio,选中它。
9.2 检查音频设备直通状态
确保 7900 XTX 的音频设备(05:00.1,ID 1002:ab30)也一同直通给 Guest。本例中 hostpci0: 0000:05:00 写的是 05:00.0,由于 05:00.0 和 05:00.1 在同一 IOMMU 组,QEMU 会自动带上音频设备。
在 Guest 内验证:
lspci -nnk | grep -i audio
应看到:
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 HDMI/DP Audio [1002:ab30]
9.3 若声音断断续续,禁用 WirePlumber 自动挂起
mkdir -p ~/.config/wireplumber/wireplumber.conf.d/
nano ~/.config/wireplumber/wireplumber.conf.d/disable-suspend.conf
填入:
wireplumber.profiles = {
main = {
hooks.node.suspend = disabled
}
}
然后重启音频服务:
systemctl --user restart pipewire
systemctl --user restart wireplumber
9.4 若 HDMI 音频始终异常
换用 DisplayPort 线。-22 infoframe 报错是 HDMI 通道特有的兼容性问题,DP 通道通常能直接绕过。这是最省心的解决方案。
十、X99 平台长期使用注意事项
10.1 failed to reset PCI device 警告
每次 qm start 都可能出现,不是致命错误,QEMU 会继续启动。如果遇到 VM 启动后 7900 XTX 不亮:
qm stop 101
# 若 stop 失败
qm stop 101 --skiplock
qm start 101
若仍失败,冷启动 PVE 主机(长按电源键关机再开机)恢复 PCIe 状态。
10.2 AER 错误
X99 平台 PCIe 根端口会持续报 AER: Uncorrectable (Non-Fatal)。这是硬件级限制,已通过 pci=noaer 和 initcall_blacklist=sysfb_init 在内核层面尽量抑制。高负载下若链路崩溃,需冷启动主机。
10.3 备份关键配置
跑通后立刻备份:
cp /etc/pve/qemu-server/101.conf ~/101.conf.backup
cp /etc/default/grub ~/grub.backup
cp /etc/modprobe.d/vfio.conf ~/vfio.conf.backup
cp /etc/modprobe.d/pve-blacklist.conf ~/pve-blacklist.conf.backup
cp /usr/share/kvm/7900xtx.rom ~/7900xtx.rom.backup
10.4 关于鼠标键盘
不需要专门直通键鼠。QEMU 默认提供虚拟 USB 控制器和模拟键鼠,物理键鼠在切换显示窗口时通常能直接使用。只有在追求极低延迟(如游戏)或虚拟机需要完全独占输入时,才考虑单设备 USB 直通(不要直通整个 USB 控制器,X99 上有风险)。
十一、完整配置清单速查
PVE 宿主机:
| 文件 |
内容 |
/etc/default/grub |
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pci=noaer video=efifb:off initcall_blacklist=sysfb_init" |
/etc/modprobe.d/vfio.conf |
options vfio-pci ids=1002:744c,1002:ab30 |
/etc/modprobe.d/pve-blacklist.conf |
blacklist amdgpu / blacklist radeon |
/etc/modules |
vfio / vfio_iommu_type1 / vfio_pci / vfio_virqfd |
/usr/share/kvm/7900xtx.rom |
从本卡导出的 vBIOS |
Guest 虚拟机(101.conf)关键行:
hostpci0: 0000:05:00,pcie=1,romfile=7900xtx.rom
Guest 内关键配置:
| 文件 |
内容 |
/etc/X11/xorg.conf |
强制 amdgpu 作为 PrimaryGPU,BusID PCI:1:0:0 |
/etc/gdm3/custom.conf |
WaylandEnable=false |
十二、最终验证
在 Guest 内执行:
glxinfo | grep "OpenGL renderer"
应显示:
OpenGL renderer string: AMD Radeon RX 7900 XTX (radeonsi, navi31, ...)
看到这一行,说明整个直通链路——BIOS → vfio-pci → QEMU → amdgpu → Xorg → GDM → 显示输出 → HDMI 音频——全部打通。
这套配置在华南金牌 X99-TF + RX 7900 XTX 上已实际验证可用。