跳转至内容

QEMU/故障排除

来自 ArchWiki


鼠标光标抖动或不规律

如果光标在屏幕上不受控制地跳动,在启动 QEMU 之前在终端中输入此命令可能会有帮助

$ export SDL_VIDEO_X11_DGAMOUSE=0

如果这有帮助,您可以将其添加到您的 ~/.bashrc 文件中。

无可见光标

在 QEMU 的选项中添加 -display default,show-cursor=on 以显示鼠标光标。

如果仍然无效,请确保您已正确设置显示设备,例如:-vga qxl

另一个可以尝试的选项是 -usb -device usb-tablet,正如在 QEMU#鼠标集成 中提到的。这会覆盖默认的 PS/2 鼠标仿真,并作为额外的好处同步主机和客户机之间的指针位置。

可见两个不同的鼠标光标

应用 QEMU#鼠标集成 中的提示。

使用 VNC 时出现键盘问题

使用 VNC 时,您可能会遇到文中(详细描述)这里描述的键盘问题。解决方案是 *不要* 在 QEMU 上使用 -k 选项,而是使用来自 gtk-vncgvncviewer。另请参阅 libvirt 邮件列表中发布的 这条消息

键盘似乎损坏或箭头键不起作用

如果您发现有些按键不起作用或按下的是错误的按键(特别是箭头键),您可能需要将您的键盘布局指定为选项。键盘布局可以在 /usr/share/qemu/keymaps/ 中找到。

$ qemu-system-x86_64 -k keymap disk_image

无法读取键盘映射文件

qemu-system-x86_64: -display vnc=0.0.0.0:0: could not read keymap file: 'en'

这是由于传递给 -k 参数的 *keymap* 无效。例如,en 无效,但 en-us 有效 - 请参阅 /usr/share/qemu/keymaps/

窗口调整大小时客户机显示拉伸

要恢复默认窗口大小,请按 Ctrl+Alt+u

ioctl(KVM_CREATE_VM) 失败:16 设备或资源繁忙

如果在使用 -enable-kvm 选项启动 QEMU 时出现此错误消息

ioctl(KVM_CREATE_VM) failed: 16 Device or resource busy
failed to initialize KVM: Device or resource busy

这意味着另一个 虚拟机监控程序 正在运行。不建议也不可能并行运行多个虚拟机监控程序。

libgfapi 错误消息

启动时显示的错误消息

Failed to open module: libgfapi.so.0: cannot open shared object file: No such file or directory

安装 glusterfs 或忽略错误消息,因为 GlusterFS 是一个可选依赖项。

LIVE 环境下的内核恐慌

如果您启动一个 live 环境(或者更好:启动一个系统)您可能会遇到此问题

[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown block(0,0)

或者其他阻止启动的过程(例如:无法解压 initramfs,无法启动服务 foo)。尝试使用 -m VALUE 开关和适当数量的 RAM 来启动虚拟机,如果 RAM 太低,您很可能会遇到与上述问题类似的问题/没有内存开关。

Windows 7 客户机声音质量低

为 Windows 7 客户机使用 hda 音频驱动程序可能会导致声音质量低下。通过将 -soundhw ac97 参数传递给 QEMU 并从 Realtek AC'97 Audio Codecs[死链接 2025-08-16—SSL 错误] 安装 AC97 驱动程序,将音频驱动程序更改为 ac97 可能会解决问题。有关更多信息,请参阅 Red Hat Bugzilla – Bug 1176761

无法访问 KVM 内核模块:权限被拒绝

如果您遇到以下错误

libvirtError: internal error: process exited while connecting to monitor: Could not access KVM kernel module: Permission denied failed to initialize KVM: Permission denied

Systemd 234 为 kvm 组分配了动态 ID(参见 FS#54943)。要避免此错误,您需要编辑文件 /etc/libvirt/qemu.conf 并将 group = "78" 行更改为 group = "kvm"

启动 Windows 虚拟机时出现“System Thread Exception Not Handled”

Windows 8 或 Windows 10 客户机在启动时可能会引发一个通用的兼容性异常,即“System Thread Exception Not Handled”,这通常是由旧版驱动程序在真实机器上行为异常引起的。在 KVM 机器上,通常可以通过将 CPU 模型设置为 core2duo 来解决此问题。

某些 Windows 游戏/应用程序崩溃/导致蓝屏

偶尔,虚拟机中运行的应用程序可能会意外崩溃,而在物理机上可以正常运行。如果在以 root 身份运行 dmesg -wH 时遇到提及 MSR 的错误,这些崩溃的原因是当客户机尝试访问不支持的 模型特定寄存器 (MSR) 时,KVM 会注入一个 通用保护故障 (GPF) - 这通常会导致客户机应用程序/操作系统崩溃。通过将 ignore_msrs=1 选项传递给 KVM 模块,忽略未实现的 MSR,可以解决许多这些问题。

/etc/modprobe.d/kvm.conf
...
options kvm ignore_msrs=1
...

添加此选项可能有助于解决的情况

  • GeForce Experience 抱怨存在不支持的 CPU。
  • 《星际争霸 2》和《黑色洛城》导致 Windows 10 稳定地出现 KMODE_EXCEPTION_NOT_HANDLED 蓝屏。在这种情况下,蓝屏信息并未识别出驱动程序文件。
警告 虽然这通常是安全的,并且有些应用程序可能没有此选项就无法工作,但静默忽略未知的 MSR 访问可能会破坏虚拟机中的其他软件或其他虚拟机。

高中断延迟和微卡顿

此问题表现为小幅暂停(卡顿),在图形密集型应用程序(如游戏)中尤其明显。

QXL 视频导致分辨率低

QEMU 4.1.0 引入了一个回归,导致 QXL 视频在通过 spice 显示时可能回退到低分辨率。 [1] 例如,当 KMS 启动时,文本分辨率可能低至 4x10 个字符。尝试提高 GUI 分辨率时,它可能会转到最低支持的分辨率。

作为一种变通方法,请按此形式创建您的设备

-device qxl-vga,max_outputs=1...

使用启用了安全启动的 OVMF 时虚拟机未启动

edk2-ovmf 软件包中的 OVMF_CODE.secboot.4m.fdOVMF_CODE.secboot.fd 文件是使用 SMM 支持构建的。如果虚拟机的 S3 支持未被禁用,则虚拟机可能根本无法启动。

-global ICH9-LPC.disable_s3=1 选项添加到 qemu 命令。

有关更多详细信息以及在 QEMU 中使用安全启动所需的选项,请参阅 FS#59465https://github.com/tianocore/edk2/blob/master/OvmfPkg/README

虚拟机未启动到 Arch ISO

当第一次尝试从 Arch ISO 镜像启动虚拟机时,启动过程会挂起。通过在启动菜单中按 e 键将 console=ttyS0 添加到内核启动选项,您将获得更多的启动消息和以下错误

:: Mounting '/dev/disk/by-label/ARCH_202204' to '/run/archiso/bootmnt'
Waiting 30 seconds for device /dev/disk/by-label/ARCH_202204 ...
ERROR: '/dev/disk/by-label/ARCH_202204' device did not show up after 30 seconds...
   Falling back to interactive prompt
   You can try to fix the problem manually, log out when you are finished
sh: can't access tty; job control turned off

错误消息并未很好地说明实际问题。问题在于 QEMU 默认分配给虚拟机的 128MB RAM。使用 -m 1024 将限制提高到 1024MB 可以解决问题并允许系统启动。之后您可以像平常一样继续安装 Arch Linux。安装完成后,可以减小虚拟机的内存分配。需要 1024MB 是因为 RAM 磁盘的要求和安装介质的大小。请参阅 arch-releng 邮件列表上的此消息此论坛帖子

客户机 CPU 中断未触发

如果您正在遵循 OSDev wiki 编写自己的操作系统,或者只是使用 QEMU 的 gdb 接口和 -s 标志逐步调试客户机架构汇编代码,了解许多模拟器(包括 QEMU)通常会实现一些 CPU 中断而留下许多硬件中断未实现是有用的。了解您的代码是否触发了中断的一种方法是使用

-d int

来启用在 stdout 上显示中断/异常。

要查看 QEMU 还提供哪些其他客户机调试功能,请参阅

qemu-system-x86_64 -d help

或将 x86_64 替换为您选择的客户机架构。

KDE 与 sddm 在登录时不会自动启动 spice-vdagent

/etc/xdg/autostart/spice-vdagent.desktop 中删除或注释掉 X-GNOME-Autostart-Phase=WindowManager[2]

QEMU 启动后蓝牙音频质量下降

禁用 WirePlumber 配置文件中的自动切换功能,以防止其使用单声道音频配置文件。

$ wpctl settings --save bluetooth.autoswitch-to-headset-profile false

Linux 客户机在 UEFI 模式下使用 GRUB 启动时挂起

更新到 edk2-ovmf 202505-1 或更高版本后,无法启动许多在 UEFI 模式下使用 GRUB 的 Linux 发行版(已知示例包括 Rocky Linux、Debian、RHEL 和 Fedora 的版本)。这也包括这些发行版的 Live ISO 镜像。

问题跟踪器: archlinux/packaging/packages/edk2#9

截至 edk2-ovmf 202508-1,此问题仍然存在。

症状:输入/输出错误。

  • 尝试启动 GRUB 菜单项时
    • 图形 SPICE 控制台冻结
    • 向串行控制台输出报告页面错误的异常信息
    • QEMU 的 CPU 使用率在一个核心上被锁定在 100%

串行控制台输出示例

!!!! X64 Exception Type - 0E(#PF - Page-Fault)  CPU Apic ID - 00000000 !!!!
ExceptionData - 0000000000000003  I:0 R:0 U:0 W:1 P:1 PK:0 SS:0 SGX:0
RIP  - 00000000766CBCF0, CS  - 0000000000000038, RFLAGS - 0000000000210046
RAX  - 00000000766E7000, RCX - 00000000766E7000, RDX - 0000000000000000
RBX  - 000000007E7B7F18, RSP - 000000007FE6C278, RBP - 000000007F9EC018
RSI  - 0000000000000000, RDI - 0000000076709078
R8   - 0000000000000000, R9  - 000000007BCC1195, R10 - 000000007D41D7F1
R11  - 0000000000000077, R12 - 000000007DCD9000, R13 - 000000007E7B7F18
R14  - 000000007DC4D768, R15 - 000000007DC4D770
DS   - 0000000000000030, ES  - 0000000000000030, FS  - 0000000000000030
GS   - 0000000000000030, SS  - 0000000000000030
CR0  - 0000000080010033, CR2 - 00000000766E7000, CR3 - 000000007FC01000
CR4  - 0000000000000668, CR8 - 0000000000000000
DR0  - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000
DR3  - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400
GDTR - 000000007F9DC000 0000000000000047, LDTR - 0000000000000000
IDTR - 000000007F494018 0000000000000FFF,   TR - 0000000000000000
FXSAVE_STATE - 000000007FE6BED0
!!!! Find image based on IP(0x766CBCF0) (No PDB)  (ImageBase=000000006B676EE0, EntryPoint=000000006C58B537) !!!!

解决方法

  • 手动降级 edk2-ovmf 至 202411-1 并保持版本,直到修复程序发布
  • 应用 Debian 的 edk2 补丁,如 问题跟踪器 中所述,并为需要的客户机添加一个 fwcfg 行。
  • 安装 Fedora 的 EDK2-OVMF edk2-ovmf-fedoraAURedk2-ovmf 一同安装,并为需要的客户机更改启动时的固件路径。