跳转到内容

显卡直通:独显与核显 ​

给虚拟机整卡直通一块显卡,性能几乎和裸机一样,常见于转码、云游戏、跑深度学习或者给虚拟机做图形工作站。代价也最直接:这块卡从此宿主机不能再用。

为什么需要它 ​

QEMU 自带的虚拟显卡只够图形界面能显示,跑不动 3D 加速、编解码这类需要真实 GPU 算力的任务。直通把物理显卡整个交给一台虚拟机独占,换来接近原生的性能。

开始之前 ​

  • 已完成开启 IOMMU,dmesg 确认 IOMMU 已启用,vfio 系列模块已加载。
  • 已用读懂 IOMMU 分组的方法确认目标显卡在一个干净的分组里(正常情况下会和它自己的 HDMI 音频功能同组,这没问题)。
  • 虚拟机用 q35 机型(提供 PCIe 总线),装 OVMF (UEFI)。

直通宿主机正在使用的显卡,会让物理输出黑屏

如果这张卡是宿主机接显示器用的那一张(或者是唯一一张显卡),完成绑定之后:

  • 宿主机本地接的显示器会失去输出,直到你把显卡还给宿主机。
  • 这台虚拟机开机后,画面只会出现在这张卡的物理接口上,不会出现在 Web UI 的 noVNC/SPICE 控制台里——这是直通显卡的正常表现,不是故障。

开始前确保:

  1. 你能通过 SSH、IPMI/iKVM 或者另一张核显/独显管理这台宿主机,不依赖即将被直通出去的这张卡。
  2. 如果宿主机只有这一张显卡,考虑先加一张便宜的核显/独显专门留给宿主机用,或者接受"直通期间只能远程管理"这个事实。
  3. 回退方法:删掉下文创建的 /etc/modprobe.d/vfio.conf,执行 update-initramfs -u -k all 后重启,显卡会还给宿主机原来的驱动。

操作步骤 ​

1. 确认显卡的 PCI 地址和 ID ​

sh
# 宿主机 shell
lspci -nn | grep -Ei 'vga|3d|display'

记下地址(例如 01:00.0)和方括号里的 厂商ID:设备ID(例如 [10de:2504])。显卡通常还带一个音频功能(01:00.1),同组一起处理。

2. 让宿主机放开这张卡 ​

方法一(推荐):按 ID 绑定 vfio-pci,不影响其他同型号但不想直通的设备(如果只有一张同型号卡,二者效果一样):

sh
# 宿主机 shell,把 ID 换成上一步记下的显卡和音频功能的 ID,用逗号分隔
echo "options vfio-pci ids=10de:2504,10de:228e" > /etc/modprobe.d/vfio.conf

方法二:拉黑显卡驱动,适合这张卡的驱动只会被这一张卡用到的情况(如果宿主机还有一张核显在用同一个驱动,比如 Intel 核显走 i915,拉黑会连累核显,请用方法一):

sh
# 宿主机 shell,把 amdgpu 换成实际驱动名(nouveau / nvidia / amdgpu / radeon)
echo "blacklist amdgpu" >> /etc/modprobe.d/blacklist.conf

这一步要重建 initramfs 并重启,显卡会立即脱离宿主机

sh
# 宿主机 shell
update-initramfs -u -k all
reboot

影响范围:重启后这张显卡的物理输出立刻消失,宿主机改用其他方式管理(见上方危险提示)。前置条件:已确认有不依赖这张卡的管理路径。回退方法:删除本步创建的 /etc/modprobe.d/vfio.conf(或去掉 blacklist 那一行),重新执行 update-initramfs -u -k all 并重启。

如果重启后仍显示被原驱动占用,多半是原驱动比 vfio-pci 先加载,追加一条加载顺序控制(把 amdgpu 换成实际驱动名):

sh
# 宿主机 shell
echo "softdep amdgpu pre: vfio-pci" > /etc/modprobe.d/vfio-softdep.conf
update-initramfs -u -k all
reboot

3. 确认绑定成功 ​

sh
# 宿主机 shell
lspci -nnk -s 01:00.0

Kernel driver in use: 那一行应该显示 vfio-pci,而不是 nvidia、amdgpu 或 nouveau 之类的原驱动。

4. 把显卡加进虚拟机 ​

Web UI:虚拟机 → Hardware → Add → PCI Device,选择这张卡(选中 "All Functions" 会把显卡和它的音频功能一起加入,通常这样做更省事),按需勾选:

选项什么时候勾
PCI-Express机型是 q35 时勾上(对应配置里的 pcie=1)
Primary GPU (x-vga)这张卡是虚拟机唯一的显示输出、且你不再需要 QEMU 自带的虚拟显示时勾上
ROM-Bar默认开启,保持默认即可,除非某些设备提示需要关闭

对应的配置大致是:

text
hostpci0: 0000:01:00,pcie=1,x-vga=1

消费级独显大多不支持 UEFI ROM 的场景很少见

现在主流的独立显卡基本都支持 UEFI,配合 OVMF 直接用即可。极少数老卡或工控卡的 ROM 不支持 UEFI,需要手动转储 vBIOS 并通过 romfile= 指定,这部分操作依赖具体型号,请以官方 Wiki 的 PCI(e) Passthrough 条目为准,不在本文展开。

核显直通的差异 ​

Intel 核显可以整颗直通(配置里对应 legacy-igd 相关选项),前提是宿主机自己不再用它做输出。如果你想让多台虚拟机分享同一颗核显(而不是整颗独占),需要用到分片虚拟化(GVT-g / SR-IOV based vGPU),这属于SR-IOV 与 vGPU的内容,且只有部分平台支持。

检查结果 ​

  1. 显卡接的物理显示器(或另一张管理用的卡)能看到虚拟机的开机画面。
  2. 客户机内部(Windows 设备管理器、或 Linux 的 lspci)能看到这张显卡,且没有感叹号或 Code 43 之类的错误。
  3. 装上厂商官方驱动后,跑一个实际负载(转码、跑一段 3D 程序)验证性能符合预期。
  4. 回到宿主机 lspci -nnk 确认这张卡的 Kernel driver in use 始终是 vfio-pci,没有被意外抢回。

常见问题 ​

接了显示器还是没有画面。 先确认是不是显示器接在了正确的卡上;再检查配置里 pcie=1 是否写对、机型是不是 q35;详细排查见直通常见问题。

Windows 设备管理器里显卡报 Code 43。 这是 NVIDIA 显卡对"检测到运行在虚拟机里"的常见防护表现,详细成因和缓解思路见直通常见问题。

虚拟机关机后再开机就起不来了,报设备 reset 超时。 部分显卡(尤其某些 AMD 消费卡)存在已知的复位缺陷,见直通常见问题。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。