Proxmox VE GPU 直通实战:把显卡塞进虚拟机跑 AI 推理

说起来你可能不信——我在 Proxmox V…

说起来你可能不信——我在 Proxmox VE 上折腾 GPU 直通,前后踩了不下十个坑。从 BIOS 设置到内核参数,从驱动黑名单到 vfio-pci 绑定,每一步都可能翻车。今天这篇教程,就是我用三台机器、换了两种显卡、重装了五次系统之后,总结出来的可复现方案。

为什么要做 GPU 直通?

简单说:你有一台装了 Proxmox VE 的物理服务器,上面插着一张 RTX 3090(或者 4090,或者一张 A4000),你想在虚拟机里跑 Ollama、ComfyUI、vLLM 这类 AI 推理服务。如果走虚拟显卡,性能损失严重不说,CUDA 压根不认。唯一的正经路子就是把整个 PCIe 设备直通给虚拟机。

我的场景是这样:一台双路 Xeon 服务器,PVE 8.2 宿主,上面跑着十几个 CT 容器和两台 VM。其中一台 Ubuntu 22.04 VM 专门做 AI 推理节点,需要独占一张 RTX 3090。宿主本身不需要显示输出——反正有 iLO/IPMI 远程管理。

前提条件:这些不满足就别往下搞了

  • CPU 和主板都支持 VT-d(Intel)或 AMD-Vi(AMD)。大部分服务器平台都支持,消费级主板注意看说明书。
  • BIOS 里开启了 IOMMU / VT-d。这是最容易被忽略的一步——有些主板默认关闭。
  • 显卡支持 UEFI。最近五年的 N 卡都没问题,老卡(GTX 700 系列及更早)可能需要刷 GOP BIOS。
  • PVE 版本 ≥ 8.0。我用的是 8.2,内核 6.8。
  • 宿主没有跑 X11/Wayland 桌面环境。如果你在宿主上插显示器用图形界面,显卡已经被占用了,直通就别想了。

第一步:启用 IOMMU 并验证

编辑 /etc/default/grub,找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行,加上 IOMMU 参数:

# Intel CPU:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

# AMD CPU:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"

解释一下参数:intel_iommu=onamd_iommu=on 是启用 IOMMU;iommu=pt 表示 Passthrough 模式——不对直通设备做额外的地址转换,能提升性能。

更新 GRUB 并重启:

update-grub
reboot

重启后验证 IOMMU 是否生效:

dmesg | grep -i iommu

如果看到类似 DMAR: IOMMU enabledAMD-Vi: IOMMU enabled 的输出,说明第一步成功了。没看到?回 BIOS 检查 VT-d 是不是真的开了。

第二步:检查 IOMMU 分组

这是整个流程里最关键的检查点。PVE 的 PCI 直通是按 IOMMU group 为单位的——一个 group 里的所有设备必须一起直通。如果你的显卡和 USB 控制器、SATA 控制器分在同一个 group 里,那就麻烦了。

执行以下脚本查看分组情况:

#!/bin/bash
shopt -s nullglob
for d in /sys/kernel/iommu_groups/*/devices/*; do
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
done

找到你的显卡所在的行。理想情况下,NVIDIA GPU 应该独占一个 IOMMU group(包括显卡的 VGA 控制器和 Audio 设备在同一个 group 也没关系)。如果它和一个你不想直通的设备共享了 group——比如宿主网卡——那就需要 ACS Override 补丁,但这个不在本文范围,而且有安全隐患。

在我的服务器上,RTX 3090 的情况是这样的:

IOMMU Group 42 03:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3090] [10de:2204]
IOMMU Group 42 03:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef]

Group 42 里只有显卡和它的音频设备,完美。

第三步:屏蔽宿主驱动,绑定 vfio-pci

现在要做的是让 PVE 宿主在启动时不要加载 NVIDIA 的开源驱动(nouveau)或闭源驱动(nvidia),而是让 vfio-pci 接管这张卡,这样才能把它直通给虚拟机。

首先,编辑 /etc/modprobe.d/blacklist.conf,追加:

# 禁止宿主加载任何 NVIDIA 相关驱动
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
blacklist nvidia_drm
blacklist nvidia_modeset

然后编辑或创建 /etc/modprobe.d/vfio.conf

# 让 vfio-pci 在系统启动时抢占这张显卡
# 注意:ids 后面填的是 Vendor:Device ID,用 lspci -nn 查
options vfio-pci ids=10de:2204,10de:1aef disable_vga=1

接着确保 vfio 模块在 initramfs 阶段就被加载。编辑 /etc/modules,添加:

vfio
vfio_iommu_type1
vfio_pci

更新 initramfs 并重启:

update-initramfs -u -k all
reboot

重启后验证 vfio-pci 是否成功接管:

lspci -nnk -d 10de:2204

输出中应该能看到 Kernel driver in use: vfio-pci。如果是 nouveaunvidia,说明屏蔽没生效,回头检查黑名单配置。

第四步:创建虚拟机并添加 PCI 设备

在 PVE WebUI 里创建 VM 时,有几个关键设置:

  • BIOS 类型:必须选 OVMF(UEFI)。SeaBIOS 不支持 GPU 直通。
  • 机型(Machine):选 q35,不要用默认的 i440fx。q35 对 PCIe 设备的兼容性好得多。
  • 显示(Display):选 “无”(none)。你不需要虚拟显卡,GPU 直通后直接用物理输出或远程桌面。

VM 创建好后,在 “硬件” 页面点击 “添加” → “PCI 设备”,在列表里找到你的显卡,勾选 “所有功能”、”PCI-Express” 和 “ROM-Bar”。如果有 “主 GPU” 选项也勾上。添加完成后,VM 的硬件列表里应该能看到这个 PCI 设备。

另外还有一个重要的隐藏设置——必须禁用 virtio-balloon 内存热插拔,否则 NVIDIA 驱动会拒绝加载。在 VM 配置文件 /etc/pve/qemu-server/<VMID>.conf 里,把 balloon: 1 改成 balloon: 0,或者直接在 WebUI 里把内存的 “Ballooning” 关掉。

第五步:在虚拟机里装驱动

启动 VM,SSH 进去(或者用 noVNC 控制台)。首先确认显卡被识别:

lspci | grep -i nvidia

应该能看到 RTX 3090。然后安装 NVIDIA 官方驱动:

# Ubuntu/Debian
apt update
apt install -y nvidia-driver-550

# 重启让驱动生效
reboot

重启后验证:

nvidia-smi

如果能看到显卡信息、驱动版本和 CUDA 版本,恭喜你,GPU 直通成功了。

我踩过的坑,帮你提前填了

  • Code 43 错误:NVIDIA 检测到自己在虚拟机里运行,拒绝加载驱动。解决方案:在 VM 的 XML 配置里添加 <hidden state='on'/> 隐藏 KVM 签名。PVE 下直接在 VM 配置文件里加一行 args: -cpu 'host,-hypervisor,kvm=off'
  • 直通后宿主死机:大概率是显卡没有正确隔离。先确认 vfio-pci 绑定成功,再检查 IOMMU group 是否有其他设备。如果宿主本身还需要显卡输出(比如你插着显示器用 PVE 桌面),那这条路就走不通——考虑用两张显卡,一张给宿主,一张直通。
  • 虚拟机启动就崩溃:检查 VM 的机型是不是 q35,BIOS 是不是 OVMF。i440fx + SeaBIOS 组合下 GPU 直通几乎必崩。
  • nvidia-smi 报 “No devices were found”:八成是 ballooning 没关。去 VM 硬件设置里确认内存 Ballooning 是禁用状态。
  • 显卡在虚拟机里能识别但驱动加载失败:试试在 GRUB 里加 pcie_acs_override=downstream,multifunction——但这只是诊断手段,不建议长期使用,有安全风险。

跑起来之后

GPU 直通成功后,这块 RTX 3090 就成了这台 VM 的私有财产。我在上面跑了 Ollama + DeepSeek-V3 量化版、ComfyUI 的 Stable Diffusion 工作流,还挂了一个 Immich 的照片人脸识别服务——24GB 显存分给这些服务绰绰有余。

性能几乎没有损失。我对比过裸机跑和虚拟机直通跑的 ollama 推理速度,差异在 2% 以内,完全可以接受。最大的好处是隔离性:AI 推理节点挂了不会影响宿主的其他服务,宿主的维护也不会影响 AI 服务。

把这块总结发出来,是因为在折腾的过程中发现网上的教程大多停留在 PVE 6.x/7.x 时代,8.x 有些地方不太一样。希望这篇能帮你少踩几个坑。有问题欢迎在评论区交流。


IT大叔 | 2026年8月 | 个人运维笔记,转载请注明出处

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注