本文记录在 H3C 服务器 PVE 环境下,将 NVIDIA RTX 6000 Ada(48G 大显存纯算力卡)直通给 Windows/Linux 虚拟机,并彻底解决“代码 43”及“Fallen off the bus”报错的完整排坑过程。适用于需要在开启 SR-IOV 的企业级服务器上部署大显存 GPU 的运维与 AI 基础设施工程师。阅读本文,你将获得从底层 BIOS MMIO 寻址排查到 PVE 虚拟机配置的最佳实践,避免在客机驱动与注册表层面做无效消耗。
1. 环境与简介
排查与落地需建立在清晰的软硬件基线上。虚拟化大显存算力卡,最易踩坑点在于宿主机物理地址空间的枯竭。
- 硬件底座: H3C 服务器 (AMD EPYC 架构)
- 核心外设: NVIDIA RTX 6000D (84GB VRAM)
- 宿主机 OS: Proxmox VE (PVE) 9.1.1
- 客机 OS: Windows 11 / Ubuntu 24.04 Server
- 驱动版本: NVIDIA Data Center / Enterprise 590.48.01 及 595.97
- 目标指标: 虚拟机内
nvidia-smi成功输出 P0 满血状态面板,0 报错。
许可与合规说明:
- 许可演进: 采用 NVIDIA 官方 Data Center 闭源驱动(Proprietary),避免使用 Nouveau 或开源 OpenRM 模块引发中断异常。
- 风险规避: 禁止在虚拟机内混合使用 GeForce 游戏驱动;允许在 EULA 授权范围内用于内网 AI 推理与计算加速。
- 免责声明: 以上为信息性说明,非法律意见。
2. 核心问题与架构排查
方案核心: 大显存 GPU 直通失败(虚拟机报代码 43 或脱离总线)的根本原因通常不在驱动,而在宿主机 BIOS 的 64 位 MMIO(内存映射)寻址空间耗尽。
核心排查流程
- 查宿主物理层: 执行
dmesg -T | grep "no space",若存在BAR 2 [mem size 0x... 64bit pref]: can't assign,证明主板分配空间失败。 - 查宿主隔离层: 执行
lspci -nnk -s <设备号>,确认vfio-pci已先于系统驱动接管 GPU。 - 查客机虚拟层: 验证 QEMU 配置中是否已将 CPU 物理寻址位数暴露给客机,并扩大了虚拟 EFI 映射窗口。
关键细节与失败模式
- 失败模式(Windows 43 与 0x0): 设备管理器报 43,且 PowerShell 提取
ProblemStatus为 0。此为底层 PCIe 握手失败,非单纯驱动冲突。切忌盲目修改注册表(如强制 TCC 或 MSI 重定向),会引发后续死锁。 - 失败模式(Linux QEMU Code 1): 启动报错
MSIX PBA outside of specified BAR。此为物理主板中断向量表分配超限导致的 QEMU 自保闪退。 - 冲突根源(SR-IOV): 服务器开启网卡 SR-IOV 会动态生成大量 VF,瞬间榨干 BIOS 默认的 256G MMIO 高位空间,导致 48G 显存的 GPU 请求被宿主内核拒绝。
3. 对比与选型:MMIO 空间抢夺战
在确诊物理空间不足后,解决路线分为以下两种:
| 解决路线 | 性能损耗 | 主要优势 | 主要劣势/注意 | 典型场景 |
| A. 修改 BIOS PFMMIO | 0 | 显卡直通与 SR-IOV 完美共存 | 依赖主板厂商开放隐藏的 Padding 选项 | 综合性企业级算力/网络集群 |
| B. 强关 SR-IOV | 0 | 直接释放 100G+ MMIO,GPU 必通 | 丧失硬件级网卡虚拟化,需改用桥接 | 纯 AI 训练节点,主板 BIOS 锁死 |
小结:
- 要极致隔离与外设共存 → 选 A(进 BIOS 找
PCI Hot-Plug Settings)。 - 若主板 BIOS 选项锁死且急需 GPU 算力 → 选 B,牺牲网络 SR-IOV 保全显卡。
4. 落地实践(直接可跑)
本节提供修改底层逻辑与配置虚拟机的标准步骤。
4.1 宿主机环境制备
# 1. 确保屏蔽宿主驱动,避免抢占
cat <<EOF > /etc/modprobe.d/pve-blacklist.conf
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
EOF
# 2. 确保加载 VFIO 核心模块
cat <<EOF >> /etc/modules
vfio
vfio_iommu_type1
vfio_virqfd
vfio_pci
EOF
# 更新内核并重启
update-initramfs -u -k allBIOS 关键操作: 重启物理机,进入 BIOS 或 BMC -> Advanced -> PCI Hot-Plug Settings。 将 PFMMIO 64 bit Resources Padding 设置为最大值(如 512G 或 1T),保存重启。dmesg 中 no space 红字消失即为成功。
避坑指南: 不要只在物理机的 BIOS 界面里寻找 PFMMIO 选项,部分企业级服务器会将该高级选项隐藏在 BMC (基板管理控制器) 的独立 Web 管理后台设置中。

4.2 虚拟机核心配置
现代大显存 GPU 直通存在两条不可妥协的底层基线:必须使用 Q35 机型(提供原生 PCIe 拓扑结构以支持现代驱动)与 OVMF BIOS(提供 64 位及 4G 以上的内存寻址能力)。
配置文件路径:/etc/pve/qemu-server/<VMID>.conf。 以下为无头算力卡(Windows/Linux 均适用)必须对齐的 4 个关键参数:
# 基线架构:必须启用原生 PCIe 通道与 UEFI 固件
machine: q35
bios: ovmf
# 必须使用宿主机物理地址位数,否则大内存寻址失败
cpu: host,hidden=1,flags=+pcid,phys-bits=host
# 扩大 UEFI 的 MMIO 映射窗口至 512GB
args: -fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=524288
# 彻底关闭虚拟显卡,防止 WDDM 主显示权抢占导致驱动崩溃 (安装前须备好 RDP)
vga: none
# 内存底线:分配大于 8GB,防止解压与调度超大 VRAM 时静默 OOM
memory: 8192
# 直通设备本体
hostpci0: 0000:01:00,pcie=1
4.3 启动与验证
Windows需要下载数据中心版驱动,地址:https://www.nvidia.cn/drivers/

Windows开机后,执行 Data Center 版驱动的清洁安装(卸载此前所有残留驱动)。完成后在终端/命令提示符输入验证命令:
# 验证驱动状态与显存挂载
nvidia-smi期望输出: 输出完整面板,无通信报错。Fan / Temp 数据正常读取,GPU Memory 准确识别出容量。
Linux操作请参考《REK2 搭建6节点K8S教程(三):RKE节点安装》 文中第二节:2.1 安装GPU驱动
5. 结尾
- 总结:
- 算力卡代码 43 优先查宿主
dmesg的 MMIO 分配。 - 大显存 GPU + SR-IOV 是 MMIO 空间耗尽的重灾区。
- 虚拟机配置必须补齐
phys-bits=host、X-PciMmio64Mb窗口和vga: none三板斧。
- 算力卡代码 43 优先查宿主
- 边界提醒: 若在老旧服务器上配置,可能因 BIOS 固件限制完全无法调大 MMIO,此时只能物理关闭 SR-IOV。
- 下一步:
- 在 Windows 环境下验证 CUDA 运行环境及 PyTorch 调用。
- 配置 PVE 宿主机的开机启动顺序,确保 VFIO 模块在网卡 VF 切分前优先锁死显卡。