Kevin Wang 发布的文章

PVE 8.4 + Intel HD 530 gVT-g 排错完整复盘

快速结论

PVE 8.4 / Linux 6.8 并未移除 gVT-g。

如果你的系统“参数正确、模块存在,但就是没有 mdev”,
第一时间检查显卡是否被 vfio-pci 绑定。

结论先行

PVE 8.4 / Linux 6.8 并未移除 gVT-g。

本次问题的根因是 Intel HD 530 被错误绑定到 vfio-pci,导致 i915 未初始化,从而 gVT-g 未注册


一、问题背景

  • 宿主机:Proxmox VE 8.4(由 8.3 升级)
  • 内核版本:6.8.12-17-pve
  • CPU / 核显:Intel Skylake + HD Graphics 530 (8086:1912)
  • 需求:

    • Windows VM 桌面 / 轻办公
    • 需要视频播放(硬件解码)
    • 使用 Intel gVT-g 虚拟多显卡

二、三分钟快速自检 Checklist(推荐先看)

如果下面 第 3 条不满足,后面所有步骤都可以先不用看。

1️⃣ 内核是否支持 GVT-g

grep GVT /boot/config-$(uname -r)

期望看到:

CONFIG_DRM_I915_GVT=y
CONFIG_DRM_I915_GVT_KVMGT=m

2️⃣ gVT 相关模块是否存在

modinfo kvmgt

能正常输出模块信息即可。


3️⃣ 核显当前绑定的驱动(生死判定

lspci -nnk -s 00:02.0
  • Kernel driver in use: i915 → 继续往下排
  • Kernel driver in use: vfio-pci根因已找到,直接跳到修复章节

4️⃣ gVT-g 是否已注册

ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types
  • 能看到 i915-GVTg_* → gVT-g 正常
  • 路径不存在 → 继续排错

5️⃣ 启动参数是否生效

cat /proc/cmdline

确认包含:

i915.enable_gvt=1

二、最初的异常现象

系统表面状态(通过以下命令确认):

uname -r
dmesg | grep -E "DMAR|IOMMU"
cat /proc/cmdline
grep GVT /boot/config-$(uname -r)
modinfo kvmgt

确认结果:

  • VT-d 已开启(DMAR 正常)
  • grub 启动参数包含:

    intel_iommu=on iommu=pt i915.enable_gvt=1
  • 内核配置中存在:

    CONFIG_DRM_I915_GVT=y
    CONFIG_DRM_I915_GVT_KVMGT=m
  • kvmgt.ko 模块存在

但实际异常表现为:

dmesg | grep -i gvt

无任何输出,且:

ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types

路径不存在。


三、排错决策树(避免走弯路)

没有 mdev_supported_types?
│
├─ 00:02.0 使用 vfio-pci
│    └─ 根因:核显被整卡直通,i915 未初始化(最常见)
│
├─ 00:02.0 使用 i915
│    │
│    ├─ VT-d 未开启
│    │    └─ BIOS / IOMMU 配置问题
│    │
│    ├─ VT-d 已开启
│    │    ├─ 内核无 GVT 配置 → 内核不支持
│    │    └─ 内核有 GVT 配置 → 继续查驱动/参数
│    │
│    └─ 启动参数缺失
│         └─ grub 未正确传入 i915.enable_gvt=1
│
└─ mdev 已存在
     └─ gVT-g 正常,无需排错

四、最初的异常现象

为什么“看起来像是内核问题”?

  • 编译选项仍在
  • 模块仍在
  • 参数仍可传入
  • 系统无任何报错

真正被忽略的关键问题是

HD 530 当前是被哪个驱动接管?

四、决定性证据(根因定位)

首先检查显卡当前绑定的驱动(这是最关键的一步):

lspci -nnk -s 00:02.0

输出为:

00:02.0 Display controller [0380]: Intel Corporation HD Graphics 530 [8086:1912]
Kernel driver in use: vfio-pci
Kernel modules: i915

随后检查是否存在 vfio 强制绑定配置:

grep -R "8086:1912" /etc/modprobe.d/

结果发现:

/etc/modprobe.d/vfio.conf:options vfio-pci ids=8086:1912

这一步直接定位到根因。


五、为什么 BIOS 和内核版本其实无罪

BIOS 层面

  • VT-d 已开启
  • iGPU 正常枚举
  • 否则 i915 都无法加载

内核层面

  • GVT 相关配置仍存在
  • 模块可正常加载

真正的问题在于:

i915 根本没拿到设备,自然也无法提供 gVT-g

六、修复步骤(关键操作)

1️⃣ 取消 vfio 对核显的绑定

编辑:

nano /etc/modprobe.d/vfio.conf

注释或删除:

options vfio-pci ids=8086:1912

2️⃣ 确认未 blacklist i915

grep -R "i915" /etc/modprobe.d/

确保类似下面内容是 注释状态

# blacklist i915

3️⃣ 更新 initramfs(非常关键)

update-initramfs -u -k all

4️⃣ 重启系统

reboot

七、修复后的验证结果

重启后,按以下顺序逐条验证:

1️⃣ 驱动是否回到 i915

lspci -nnk -s 00:02.0

期望结果:

Kernel driver in use: i915
Kernel modules: i915

2️⃣ gVT-g 是否被正确注册

ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types

期望看到:

i915-GVTg_V5_2
i915-GVTg_V5_4
i915-GVTg_V5_8

3️⃣ 可选:确认内核已启用 GVT 参数

dmesg | grep -i i915 | head -n 20

确认 i915 正常初始化且无报错。


八、最终结论(可直接引用)

PVE 8.4 / Linux 6.8 并未移除 gVT-g。
本问题的根因是 Intel HD 530 被绑定到 vfio-pci,导致 i915 未初始化,从而 gVT-g 未注册

九、经验总结(避免再次踩坑)

Intel 核显只有两条互斥路线:

使用方式绑定驱动说明
gVT-g 虚拟多显卡i915多 VM 共享核显
整卡直通vfio-pci单 VM 独占

两种配置不能同时存在


十、命令汇总(可直接复制排错)

基础信息

uname -r
lspci -nnk -s 00:02.0

IOMMU / VT-d

dmesg | grep -E "DMAR|IOMMU"

内核与模块

grep GVT /boot/config-$(uname -r)
modinfo kvmgt

gVT-g 运行时状态

ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types
dmesg | grep -i gvt

配置排查

grep -R "8086:1912" /etc/modprobe.d/
grep -R "i915" /etc/modprobe.d/
cat /proc/cmdline

十一、适用人群

  • 使用 PVE 8.x
  • 使用 Intel 核显(Skylake ~ Coffee Lake)
  • gVT-g 无日志 / 无 mdev / 怀疑被废弃的用户

优先检查驱动绑定,而不是 BIOS 或内核版本。