外观
显卡直通:独显与核显
给虚拟机整卡直通一块显卡,性能几乎和裸机一样,常见于转码、云游戏、跑深度学习或者给虚拟机做图形工作站。代价也最直接:这块卡从此宿主机不能再用。
为什么需要它
QEMU 自带的虚拟显卡只够图形界面能显示,跑不动 3D 加速、编解码这类需要真实 GPU 算力的任务。直通把物理显卡整个交给一台虚拟机独占,换来接近原生的性能。
开始之前
- 已完成开启 IOMMU,
dmesg确认 IOMMU 已启用,vfio系列模块已加载。 - 已用读懂 IOMMU 分组的方法确认目标显卡在一个干净的分组里(正常情况下会和它自己的 HDMI 音频功能同组,这没问题)。
- 虚拟机用 q35 机型(提供 PCIe 总线),装 OVMF (UEFI)。
直通宿主机正在使用的显卡,会让物理输出黑屏
如果这张卡是宿主机接显示器用的那一张(或者是唯一一张显卡),完成绑定之后:
- 宿主机本地接的显示器会失去输出,直到你把显卡还给宿主机。
- 这台虚拟机开机后,画面只会出现在这张卡的物理接口上,不会出现在 Web UI 的 noVNC/SPICE 控制台里——这是直通显卡的正常表现,不是故障。
开始前确保:
- 你能通过 SSH、IPMI/iKVM 或者另一张核显/独显管理这台宿主机,不依赖即将被直通出去的这张卡。
- 如果宿主机只有这一张显卡,考虑先加一张便宜的核显/独显专门留给宿主机用,或者接受"直通期间只能远程管理"这个事实。
- 回退方法:删掉下文创建的
/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
reboot3. 确认绑定成功
sh
# 宿主机 shell
lspci -nnk -s 01:00.0Kernel 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的内容,且只有部分平台支持。
检查结果
- 显卡接的物理显示器(或另一张管理用的卡)能看到虚拟机的开机画面。
- 客户机内部(Windows 设备管理器、或 Linux 的
lspci)能看到这张显卡,且没有感叹号或 Code 43 之类的错误。 - 装上厂商官方驱动后,跑一个实际负载(转码、跑一段 3D 程序)验证性能符合预期。
- 回到宿主机
lspci -nnk确认这张卡的Kernel driver in use始终是vfio-pci,没有被意外抢回。
常见问题
接了显示器还是没有画面。 先确认是不是显示器接在了正确的卡上;再检查配置里 pcie=1 是否写对、机型是不是 q35;详细排查见直通常见问题。
Windows 设备管理器里显卡报 Code 43。 这是 NVIDIA 显卡对"检测到运行在虚拟机里"的常见防护表现,详细成因和缓解思路见直通常见问题。
虚拟机关机后再开机就起不来了,报设备 reset 超时。 部分显卡(尤其某些 AMD 消费卡)存在已知的复位缺陷,见直通常见问题。