外观
直通常见问题:黑屏、Code 43 与设备无法重置
显卡直通配好之后,最常遇到的三类问题:接了显示器却没画面、Windows 设备管理器报 Code 43、虚拟机关机重开就卡死。这篇按现象分别排查。
适用范围
本文假设你已经完成开启 IOMMU和读懂 IOMMU 分组,dmesg 已确认 IOMMU 启用、目标设备分组干净,遇到的是显卡直通配置完成之后的问题。如果 IOMMU 本身没开或者分组本身就是脏的,先回到前两篇处理,不适用本文。
开始排查前
先弄清楚是"从来没成功过"还是"以前能用现在坏了":前者多半是配置问题,按下文对号排查;后者常见诱因是宿主机内核更新、显卡驱动更新或者 BIOS 设置被改动过,先查一下 journalctl -b 里对应时间点的日志。
涉及要改 BIOS 设置或内核参数的步骤,提前规划维护窗口,并确认有物理控制台或带外管理方式。
排查步骤
1. 没有显示输出
先分清楚是"物理显示器没画面"还是"noVNC/SPICE 控制台没画面"——直通显卡的画面只会出现在它自己的物理接口上,noVNC/SPICE 天生看不到直通显卡渲染的内容,这是正常现象,不是故障。排查前,先接一台真实显示器到这张卡的接口上,或者在客户机里装好 RDP/VNC 服务再远程看。
接了物理显示器仍然没有画面,按顺序检查:
- 配置里是否勾了 "Primary GPU"(对应
x-vga=1)——如果这张卡不是虚拟机唯一的显示适配器,未必需要勾。 - 机型是不是
q35,且 PCI 设备勾了 "PCI-Express"(对应pcie=1)——独显直通在 i440fx 机型上经常出问题。 - BIOS 里 "Primary Display" / "Initial Display Output" 这类设置是否还指向了这张即将被直通的卡,导致宿主机启动阶段占用了它的输出,改成指向核显或另一张卡。
2. Windows 报 Code 43
这通常是显卡对"检测到运行在虚拟机里"做的防护(NVIDIA 卡上更常见)。按代价从低到高尝试:
- 确认机型是
q35、CPU 类型用host,这是最基础的前提。 - 检查 BIOS 里 Resizable BAR / Smart Access Memory 是否开启——部分 AMD 显卡在开启这项后会触发 Code 43,尝试关闭。
- 更新到厂商较新版本的显卡驱动:较新驱动已经放宽了对虚拟机环境的限制条款,不一定还需要额外隐藏虚拟化痕迹。
- 如果以上都不行,需要在虚拟机的 CPU 参数里做"隐藏虚拟化痕迹"的配置。不同 QEMU 版本的具体参数写法有差异,为避免给出过时或不准确的语法,请对照官方 Wiki 的 PCI(e) Passthrough 条目里 Code 43 相关章节操作。
- 换一个干净的 IOMMU 分组、换一张显卡测试,排除硬件本身的兼容问题。
3. 关机后设备无法重置,虚拟机启动失败甚至宿主机跟着卡住
现象:虚拟机 Stop 或重启之后再次 Start,报设备复位超时;严重时宿主机的 PCI 总线也跟着挂起,需要整机断电重启才能恢复。
这是部分显卡芯片(尤其某些 AMD 消费级独显)已知的硬件复位缺陷,不是配置写错了。缓解方式按代价从低到高:
- 先别急着重启虚拟机:关机后间隔一段时间再开,部分型号在"冷启动"后能正常复位。
- 社区维护的
vendor-reset内核模块:不在官方内核里,需要自己编译,并且每次宿主机内核更新后都要重新构建。把它当作社区补丁而不是官方支持方案,安装前理解这是长期维护负担,不是一次性修复。
用 pcie_acs_override 或类似补丁强制复位,代价是牺牲隔离安全性
个别情况下,有人用 pcie_acs_override 或其他强制复位手段绕过这个问题。必须清楚这类参数的代价:它削弱了同一 IOMMU 分组内设备之间本该有的 DMA 隔离,理论上让分组里的其他设备暴露在这个被直通设备(或使用它的虚拟机)之下。
本站不推荐把它当作解法,只在你已经理解这个安全代价、没有换卡的条件、且直通场景本身可信度较高时才短期使用。
前置条件:备份 /etc/default/grub 或 /etc/kernel/cmdline,确认有物理控制台。回退方法:按开启 IOMMU里的方法,把加过的参数从对应文件里去掉,重新执行 update-grub 或 proxmox-boot-tool refresh,然后重启。
更稳妥的长期方案是换一张没有这个复位缺陷的显卡。
确认恢复
重复一次之前失败的操作:正常开机进入客户机系统、跑一段实际负载(转码或运行一次 3D 程序)、正常关机再重新开机一次。三步都没有复现原来的问题,才算真正解决。
仍未解决
带着以下信息去 Proxmox 官方论坛或对应显卡型号的社区帖子求助:
qm config <vmid>的完整输出lspci -vvv -s <设备地址>- 宿主机
dmesg里和这个设备相关的行 - 客户机内的报错信息或设备管理器截图(发之前去掉主机名、IP 等信息)
如果反复折腾同一张卡都解决不了,也可以退一步重新评估:回到硬件直通的"先认清代价"部分,考虑这个场景是不是更适合用一台独立的物理机而不是死磕虚拟机直通。
参考资料
- PCI(e) Passthrough - Proxmox VE Wiki
- PCI Passthrough - Proxmox VE Wiki(故障排查条目集合,含 Code 43 与黑屏章节)