kvm启动参数排错

从你提供的这段 QEMU 启动参数来看,问题出在参数配置的冲突以及对 40 系列显卡不友好的陈旧机型设置上。这解释了为什么你的显卡识别会“随机失败”且“无法重置”。

以下是几个致命的错误点及改进方案:

1. 机型版本太旧 (pc-q35-2.11) —— 头号嫌疑

你指定了 type=pc-q35-2.11。这是一个非常老的版本(对应 QEMU 2.11,约 2017 年)。

  • 后果: 老机型对 PCIe 4.0 设备(如 4060 Ti)的电源管理和 Reset 机制支持极差。这就是导致你日志中出现无限 resetting 却无法完成的原因。

  • 修复: 改为 pc-q35-6.0 或更高版本,或者直接用 q35(默认最新)。

2. GPU Passthrough 关键参数缺失 (x-vga=on)

你使用了 -device vfio-pci,host=01:00.0 但没有指定它是主显卡。

  • 后果: 如果没有 x-vga=on,QEMU 可能不会为该显卡分配 VGA 相关的 Legacy 资源。在无盘系统或物理显示器环境下,这会导致显示器握手失败,从而“识别不到显示器”。

  • 修复: 在 01:00.0 的参数后面加上 x-vga=on

3. ROMBAR 设置错误 (rombar=0)

你设置了 rombar=0

  • 后果: 这会禁用显卡的扩展 ROM 加载。显卡的 VBIOS 是初始化显示输出的核心。 如果禁用了 ROMBAR,显卡在启动时就没有初始化代码,显示器自然无法识别。

  • 修复: 除非你手动指定了 romfile=,否则必须设置 rombar=1

4. CPU 标志位的矛盾 (kvm=off+kvm_pv_unhalt 等)

你虽然写了 kvm=off(隐藏 KVM 身份),但后面又加了一堆 +kvm_pv_...

  • 后果: 这种混合配置有时会导致 NVIDIA 驱动识别逻辑混乱。对于 40 系列卡,建议彻底隐藏。


建议修改后的启动参数(精简优化版)

请尝试使用以下逻辑调整你的启动命令行:

Bash
 
/usr/bin/qemu-system-x86_64 -enable-kvm -m 17000 -smp 32 \
-cpu host,kvm=off,hv_vendor_id=null,hv_time,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_runtime \
-machine type=q35,accel=kvm \
-rtc base=localtime,clock=vm \
-no-reboot --nographic \
-device virtio-net-pci,netdev=net0,mac=52:54:00:46:60:18 \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
# 关键修改部分如下:
-device vfio-pci,host=01:00.0,multifunction=on,rombar=1,x-vga=on \
-device vfio-pci,host=01:00.1 \
-monitor telnet:0.0.0.0:7100,server,nowait,nodelay

为什么这样改能解决“一会行一会不行”?

  1. rombar=1:确保显卡启动时能跑自己的固件,激活物理接口输出。

  2. x-vga=on:强制将该显卡标记为首选显示设备,解决显示器不识别的问题。

  3. type=q35:现代机型能正确发送 PCIe Reset 信号。之前日志里报错 Bus 'pcie.0' does not support hotplugging 就是因为机型太老。

  4. hv_vendor_id=null:配合 kvm=off 彻底欺骗驱动,防止驱动因为检测到虚拟机而故意导致重置失败(Code 43 的常见原因)。

额外提醒:那个 Blocked 的 bash 进程

由于你手动执行 qemu 命令,请确保没有其他的监控脚本在后台循环执行 lspcinvidia-smi

  • 如果执行 QEMU 前,显卡已经卡死(lspci 没驱动),请先在宿主机执行: echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove && echo 1 > /sys/bus/pci/rescan 然后再运行上面的 QEMU 命令。

posted @ 2026-03-31 17:30  技术颜良  阅读(103)  评论(0)    收藏  举报