Intel 核显直通:告别代码 43
把 Intel 核显直通给 Windows 虚拟机,是 PVE 玩家公认的翻车重灾区。典型症状有三种:设备管理器报"代码 43"、虚拟机黑屏、装完驱动直接蓝屏或重启。
这篇讲 PVE Tools Pro 具体改了什么,以及失败时怎么查、怎么退回去。不谈玄学,只说清楚四件事:脚本动了哪些文件、每步怎么验证、哪里最容易出问题、出了问题怎么恢复。
先确认你的机器能不能做
- CPU 代际:Intel 6 代(Skylake)到 14 代(Raptor Lake Refresh)。常见型号:N5105、N100、i5-12400、i7-13700。
- 客户机系统:Windows 10/11。这两个系统对初始化链路特别敏感,报错也最集中。
- BIOS 必须开启:VT-d / IOMMU,以及 Internal Graphics。
- IOMMU 分组:核显要能落在一个独立可控的 IOMMU Group 里。如果分不开,那是主板拓扑的问题,脚本解决不了,得查 Proxmox 官方文档 调 BIOS 或换插槽。
有句话得说在前面:主板固件、核显步进、内核版本三者组合起来,直通成功率是有波动的。失败不等于脚本有 bug。 这篇给的是可复现的排障路径和回滚方案,不是"百分之百成功"的承诺。
直通会把核显从宿主机手里抢走
设备一旦直通,宿主机就用不了它了。动手前先给 PVE 做快照或备份,尤其是在更新内核之前。
动手前的环境自检
先在 PVE 终端跑这四条,确认底座是成立的:
# 1) 虚拟化与 IOMMU 是否开启(Intel 平台关键词是 DMAR)
dmesg | grep -E "DMAR|IOMMU|Interrupt Remapping" -n
# 2) VFIO 相关模块是否加载(没加载,直通必然失败或表现异常)
lsmod | grep -E "vfio|kvm" -n
# 3) 找到核显设备和它当前绑定的驱动(常见是 00:02.0,以实际输出为准)
lspci -nnk | grep -A3 -E "VGA|Display"
# 4) 看 IOMMU 分组
find /sys/kernel/iommu_groups/ -type l2
3
4
5
6
7
8
9
10
11
脚本做了什么
传统的 Legacy Passthrough 在 PVE 9.0+ 的内核上兼容性很差,换新内核和新 QEMU 之后波动更大。PVE Tools Pro 走的是另一条路:黑名单驱动 + 修改版 QEMU + ROM 注入,三步。
第一步,不让宿主机占用核显。 在 /etc/modprobe.d/ 里加黑名单,阻止内核加载 i915。新平台还要拦住 xe 驱动——它会抢先绑定设备,导致 VM 初始化链路不完整。
第二步,换掉虚拟化层。 用社区维护的修改版 pve-qemu-kvm,它修了几处内核地址映射问题。脚本还会按平台调整 VM 参数,比如 q35/OVMF、PCIe 标志、rombar,这些直接影响 Windows 侧能不能认出设备。
第三步,注入 ROM。 把对应版本的核显 VBIOS 写进虚拟机配置,Windows 才能拿到正确的硬件初始化信息。
直通本质上是在骗虚拟机——把一整段硬件初始化流程搬进 VM 里。Intel 每代核显的微架构都不一样,三步里少任何一环,表现出来就是 Code 43、黑屏或者驱动异常。
操作流程
一、准备退路。 BIOS 里开好 VT-d 和 Internal Graphics。更重要的是准备好控制台访问——IPMI、iKVM 或者本地显示器都行。配置失误会导致 SSH 连不上,没有退路就只能拆机了。
二、跑脚本。 进入 直通与显卡 → Intel 核显直通配置(修改版 QEMU),选"开始配置"。
三、核对虚拟机配置。 脚本跑完,检查 VM 的 .conf 文件里有这一行:
args: -device 'vfio-pci,host=00:02.0,addr=0x18,guest-reset=0,romfile=intel.bin'提示
文件下载和配置映射脚本都会自动做。ROM 注入、直通参数、q35/OVMF 的兼容性细节,Proxmox 官方 Wiki 上有更完整的解释和示例。
三个高频坑
Jasper Lake(N5105/N6005) 这一代核显很特殊。直通后黑屏,多半是 ROM 版本对不上,换几个 ROM 文件试试。
内核抢设备。 PVE 9.1+ 引入的 xe 驱动会抢占核显。脚本会自动屏蔽,但升级内核后值得复查一次。
配置炸了怎么办。 如果改完所有虚拟机都起不来,或者宿主机异常,用脚本里的"救砖模式"一键恢复官方 QEMU 环境。
排障速查表
| 现象 | 可能原因 | 先查什么 | 怎么处理 |
|---|---|---|---|
| 设备管理器代码 43 | 初始化信息不完整、ROM 或设备暴露方式不匹配、宿主机驱动抢占 | VM 配置里有没有 romfile 和直通参数;宿主机是不是还在加载 iGPU 驱动 | 按上面流程确保宿主机驱动不抢占,核对 ROM 注入路径和格式。Jasper Lake 优先换 ROM 版本 |
| VM 黑屏 / NoVNC 黑屏 | 显示设备冲突,GPU 被当成主显输出 | VM 是不是同时开了虚拟显卡;OVMF/q35 设置对不对 | 直通时用 q35/OVMF,调整显示策略,必要时禁用虚拟显示 |
| 直通后宿主机也没显示 | 把宿主机正在用的 iGPU 抢走了 | 宿主机是不是靠 iGPU 输出 | 生产环境强烈建议用独显做宿主输出,或者确认宿主机根本不需要图形输出 |
| 升级内核后突然失效 | 驱动链路变了,比如新驱动介入 | lspci -nnk 显示的绑定驱动有没有变 | 锁定内核版本,或按下面的回滚流程重新配一遍 |
回滚
直通失败,或者想恢复原状,按这个顺序退:
- 让宿主机重新加载驱动:删掉或注释
/etc/modprobe.d/里加的黑名单和参数。 - 换回官方组件:如果脚本替换过
qemu,用"救砖模式",或者手动装回官方pve-qemu-kvm包。 - 清理 VM 配置:删掉
.conf里的args:行和romfile引用,让虚拟机能用纯虚拟显卡启动。
退完之后验证两条:
# iGPU 是否重新绑回宿主机驱动(i915 或 xe)
lspci -nnk | grep -A3 -E "VGA|Display"
# 驱动初始化是否正常
dmesg | grep -E "i915|xe" -n2
3
4
5
最后
Intel 每代核显的微架构差异加上软硬件环境的复杂度,直通这件事本身就充满变数。失败了欢迎去项目 Issue 提CPU 型号、PVE 版本、完整的虚拟机配置、脚本运行日志或系统日志,这些信息能帮社区一起定位。
能回滚的折腾,才是安全的折腾。