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 系列卡,建议彻底隐藏。
建议修改后的启动参数(精简优化版)
请尝试使用以下逻辑调整你的启动命令行:
/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
为什么这样改能解决“一会行一会不行”?
-
rombar=1:确保显卡启动时能跑自己的固件,激活物理接口输出。 -
x-vga=on:强制将该显卡标记为首选显示设备,解决显示器不识别的问题。 -
type=q35:现代机型能正确发送 PCIe Reset 信号。之前日志里报错Bus 'pcie.0' does not support hotplugging就是因为机型太老。 -
hv_vendor_id=null:配合kvm=off彻底欺骗驱动,防止驱动因为检测到虚拟机而故意导致重置失败(Code 43 的常见原因)。
额外提醒:那个 Blocked 的 bash 进程
由于你手动执行 qemu 命令,请确保没有其他的监控脚本在后台循环执行 lspci 或 nvidia-smi。
-
如果执行 QEMU 前,显卡已经卡死(
lspci没驱动),请先在宿主机执行:echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove && echo 1 > /sys/bus/pci/rescan然后再运行上面的 QEMU 命令。

浙公网安备 33010602011771号