收起左侧

PVE上虚拟机GVT-G使用问题

1
回复
20
查看
[ 复制链接 ]

0

主题

0

回帖

0

牛值

江湖小虾

CPU:4415U 系统:PVE 9.1.1飞牛:1.1.3105

系统之前配置好gvt-g后,升级最新版本1.1.3105后失效,使用之前的配置调整也没有恢复。lspci能看到显卡,但是ls /dev/dri/ 始终看不到renderD128。测试过修改grub文件和i915.conf文件,多种参数都测试了还是不行,而且系统开关机还耗时很长。

root@FnOS:/$ dmesg | grep -iE "i915|drm|gvt" | tail -n 20
······
[    3.045998] i915 0000:00:10.0: [drm] Failed to find VBIOS tables (VBT)
[    3.046041] i915 0000:00:10.0: [drm] *ERROR* DC state mismatch (0x0 -> 0x2)
······

"i915 0000:00:10.0: [drm] ERROR DC state mismatch (0x0 -> 0x2)"这个关键错误始终存在。

尝试重装页不行,可见问题复现:

root@FnOS:~#
······
[    4.201338] i915 0000:06:10.0: [drm] Failed to find VBIOS tables (VBT)
[    4.201378] i915 0000:06:10.0: [drm] *ERROR* DC state mismatch (0x0 -> 0x2)
······
root@FnOS:~# lspci
00:00.0 Host bridge: Intel Corporation 82G33/G31/P35/P31 Express DRAM Controller
00:01.0 VGA compatible controller: Device 1234:1111 (rev 02)
······
06:10.0 VGA compatible controller: Intel Corporation HD Graphics 610 (rev 02)
······
root@FnOS:~# ls /dev/dri
by-path  card0

测试修改i915.conf配置文件

root@FnOS:~# echo "options i915 enable_guc=0" > /etc/modprobe.d/i915.conf
root@FnOS:~# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.18.18-trim

enable_guc=0和2两个都试过了,没有变化。

前前后后测试了很久,还好是虚拟机架构,测试起来相对方便。最后通过AI测试到了解决办法,处理后可以正常使用gvt-g,测试影视直接调用GPU可以生效。

注意:需要使用i440fx架构,测试过Q35架构不适用。

根因:GVT-g 虚拟 GPU 缺少 DMC 微控制器硬件,i915 驱动在
intel_dmc_update_dc6_allowed_count() 中解引用空指针导致内核 Oops。

我重新新建了2个飞牛虚拟机:分别是SeaBIOS+i440fx和OVMF+q35,然后使用修改的两个i915.ko直接替换系统文件,然后执行update-initramfs -u后测试。

修复文件 SeaBIOS SeaBIOS OVMF OVMF
版本/架构 i440fx q35 i440fx q35
V1 正常启动,可以开启硬解 启动报错:[drm]ERROR DC state mismatch (0x0 -> 0x2)
无法启动系统,无法连接SSH(或者可能要等很久)
正常启动,可以开启硬解 启动报错:[drm]ERROR DC state mismatch (0x0 -> 0x2)
无法启动系统,无法连接SSH(或者可能要等很久)
V2 正常启动,可以开启硬解 启动报错:[drm]ERROR DC state mismatch (0x0 -> 0x2)
无法启动系统,无法连接SSH(或者可能要等很久)
正常启动,可以开启硬解 启动报错:[drm]ERROR DC state mismatch (0x0 -> 0x2)
无法启动系统,无法连接SSH(或者可能要等很久)

有需要的可以留言,我可以提供i915.ko文件直接替换系统文件

#上传i915.ko文件到/tmp/目录
#备份原文件
cp /lib/modules/6.18.18-trim/kernel/drivers/gpu/drm/i915/i915.ko /lib/modules/6.18.18-trim/kernel/drivers/gpu/drm/i915/i915.kobak
#使用上传版本替换
sudo mv -f /tmp/i915.ko /lib/modules/6.18.18-trim/kernel/drivers/gpu/drm/i915/
#更新系统
sudo update-initramfs -u
#然后正常重启应该就可以了,其他的grub文件和i915.conf文件都不需要调整,安装系统时的默认配置就行。
#如果开机出现类似报错i915 0000:00:02.0: [drm] *ERROR* DC state mismatch (0x0 -> 0x2)
#启动系统的时候在grub位置按e编辑启动菜单,在“quiet splash"那行后面增加“modprobe.blacklist=i915”,然后 ctrl+x 临时启动后恢复原文件即可

没看到怎么放附件,请开发组人员参考,看能否修复处理

下面是AI整理的文档,有兴趣的可以使用带AI功能的SSH软件让它参考内容处理即可。(记得处理前进行系统备份或者快照处理、保险起见可用脱离硬盘)

GVT-g 虚拟GPU修复记录 v3(最终结论:Q35 不兼容 GVT-g)

主机信息

  • 系统: 飞牛OS (FnOS)
  • 内核版本: 6.18.18-trim
  • GPU: Intel HD Graphics 610 [8086:5906] (GVT-g 虚拟)
  • 虚拟化平台: PVE/QEMU
  • 芯片组: i440fx(推荐)/ Q35(GVT-g 不可用)
  • 修复日期: 2026-05-23

问题现象

i915 0000:00:02.0: [drm] *ERROR* DC state mismatch (0x0 -> 0x2)
BUG: kernel NULL pointer dereference, address: 0000000000000000
RIP: 0010:intel_dmc_update_dc6_allowed_count+0x16/0xa0 [i915]
  • /dev/dri/ 仅有 card0,缺少 card1 和 renderD128
  • GPU 不可用

根因

GVT-g 虚拟 GPU 缺少 DMC 微控制器硬件,i915 驱动在
intel_dmc_update_dc6_allowed_count() 中解引用空指针导致内核 Oops。


芯片组兼容性结论

方案 i440fx Q35
无补丁(原版 i915.ko) 内核 Oops,GPU 不可用 内核 Oops,GPU 不可用
v1:函数入口 ret(0x107130) 正常启动,GVT-g 可用 DC state 卡死
v2:崩溃点 jmp(0x107146) 正常启动,GVT-g 可用 DC state 卡死

关键发现

  • v1 和 v2 在 Q35 上的表现完全一致,均卡在 DC state mismatch,与补丁内容无关
  • 补丁只能避免空指针 Oops,无法解决 Q35 下 DC 状态机底层不兼容的问题
  • Q35 芯片组与 GVT-g 虚拟 GPU 不兼容是根本原因
  • i440fx 下无需补丁也可工作(仅需绕过空指针),补丁后完美运行

推荐方案:PVE 改用 i440fx 芯片组

新建虚拟机时

在 PVE 创建虚拟机的引导步骤中,Machine 选择 i440fx(而非默认的 Q35)。

补丁参考(仅 i440fx 可用)

i440fx 下任选 v1 或 v2 均可,效果相同。

v1:函数入口 ret

KVER=6.18.18-trim
MODPATH=/lib/modules/$KVER/kernel/drivers/gpu/drm/i915/i915.ko
cp $MODPATH $MODPATH.bak
printf "\xc3" | dd of=$MODPATH bs=1 seek=1077552 conv=notrunc
update-initramfs -u -k $KVER

v2:崩溃点 jmp

KVER=6.18.18-trim
MODPATH=/lib/modules/$KVER/kernel/drivers/gpu/drm/i915/i915.ko
cp $MODPATH $MODPATH.bak
printf "\xeb\x0c\x90\x90" | dd of=$MODPATH bs=1 seek=1077574 conv=notrunc
update-initramfs -u -k $KVER

GRUB 配置

# /etc/default/grub
GRUB_DEFAULT="gnulinux-6.18.18-trim-advanced-64818ccb-a77a-45a3-92ce-ff15b03bf258"
GRUB_TIMEOUT=5
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="modprobe.blacklist=pcspkr"

# 修改后需执行
update-grub

验证结果

$ ls /dev/dri/
by-path  card0  card1  renderD128     [OK]

$ dmesg | grep -iE "Oops|BUG|null pointer"
(无崩溃输出)                          [OK]

已知残余警告(无功能影响)

警告 说明
DC state mismatch (0x0 -> 0x2) GVT-g 正常现象
Failed to disable SAGV (-110) 虚拟 GPU 无 SAGV 硬件

回滚方法

KVER=6.18.18-trim
MODPATH=/lib/modules/$KVER/kernel/drivers/gpu/drm/i915/i915.ko
cp $MODPATH.bak $MODPATH
update-initramfs -u -k $KVER

紧急恢复(补丁导致无法启动时)

  1. PVE 控制台重reboot,GRUB 菜单按 e 编辑启动项
  2. 在 linux 行末尾添加:modprobe.blacklist=i915
  3. Ctrl+X 启动进入系统
  4. 执行回滚命令恢复备份

注意

  • 核心结论:Q35 与 GVT-g 不兼容,推荐改用 i440fx
  • v1/v2 补丁仅对 i440fx 有效,对 Q35 卡死问题无效
  • 内核升级后补丁失效,需重新执行
  • GRUB_DEFAULT 的 ID 在内核升级后也会变化,需同步更新
收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

感谢反馈!这个问题我们先记录一下,同时转给研发团队做进一步的适配评估。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则