我用 构建了一个标准的 qemu 镜像bitbake core-image-sato
。
我可以在没有 GUI 的情况下运行它:
runqemu nographic
<- 作品
但我无法用图形运行它
runqemu qemux86-64
<- 失败,错误:
runqemu - ERROR - Failed to run qemu: Could not initialize SDL(x11 not available) - exiting
但我需要图形模式!
我正在 Windows 10 上使用 Ubuntu 18.04 + WSL 进行构建。
答案1
问题的根本原因是您的 Linux 环境中缺少正在运行的 X GUI SERVER (X11/Xorg)。
这是您遇到的第一个问题。通常,要使其工作,您只需在 Linux 机器中启动 xserver 即可。这通常是通过将发行版切换到图形模式来完成的简单任务,通常默认设置为图形模式。
然而,就您的情况而言,存在严重的混淆 - 您说您正在 Windows 上运行 Linux 工作负载。
于是就有了第二个问题。要了解更多信息并为您提供帮助,我们首先需要了解您正在运行的 WSL 版本:
- 如果您正在运行 WSL 1,那么对于新手甚至更有经验的 Linux 管理员(您需要非常了解 Windows 和 Linux)来说,让 Xorg xserver 运行并暴露到 WSL 环境中是相当困难的(我设法在 WSL1 上实现了这一点 -但 Linux 环境只是缺少 WSL)
- 如果您正在运行 WSL2,情况会更加复杂:虽然在 WSL1 上 Linux 环境是由 Windows 内核本身提供的(很糟糕),但在 WSL2 中,您正在一个非常特殊的多虚拟机多内核配置中运行“Linux 盒子”: WSL2 Linux 实例实际上是非常特殊的 Hyper-V 节点,即真正的 VM。
不幸的是,我还没有时间去搞乱 WSL2,因为我的客户都不需要它,但如果我理解正确的话,虽然 WSL2 中的 Linux“模拟”比 WSL1 中的更准确,但我不确定您是否也这样做。可以将 X 服务器暴露到 WSL2 环境中,就像暴露到 WSL1 环境中一样容易。
最后还有第三个问题:QEMU 问题。
QEMU 是通用仿真引擎,可以仿真数十个处理器、机器和虚拟系统,范围从“桌面式机器”到“智能手机/树莓派”级别的单板计算机。
现在我们需要知道你想模仿什么。从你的问题来看,你似乎正在模拟 x86-64。在 x86-64 主机上执行此操作时,模拟通常非常非常慢。
您必须意识到QEMU提供两种仿真模式:软件仿真和硬件辅助加速仿真。
软件模拟在任何地方都适用,但正如已经说过的,对于 x86-64(默认)上的 x86-64 软件模拟,对于任何实际工作负载来说,它都非常慢。
为了实现接近实时/真实的硬件模拟速度,我们在 Linux 世界中通常将 QEMU 系统模拟与所谓的 KVM(内核虚拟机)结合起来,您可以将其视为 Linux 上 Hyper-V 的内核端等效项。在此设置中,QEMU 在 Linux 内核和 KVM 的帮助下,将使用处理器的硬件辅助虚拟化设施。即 Windows 上的 Hyper-V = Linux 上的 QEMU + KVM(以及用于图形的 xserver)。
但正如我们已经说过的,如果您使用 WSL2,那么您已经在使用 Hyper-V 虚拟化,所以我很惊讶 QEMU 甚至可以运行 - 如果它运行,它要么使用嵌套 KVM 虚拟化,要么您正在纯软件模拟模式下运行。如果您正在使用某种特殊类型的嵌套虚拟化,您的性能会受到严重影响(两倍/三倍),如果您确实在软件模式下运行,那么您的模拟一定很慢,令我惊讶的是,您甚至什么都做不了。
因此,请添加有关您正在运行的 WSL 版本以及 KVM 在 QEMU 设置中是否处于活动状态的缺失信息。
最后,在这种嵌套和复杂程度下,我建议您完全放弃 Windows:
- 获得辅助的、真实的、具有硬件辅助虚拟化功能的计算机
- 在上面安装Linux并运行xserver、KVM和QEMU并将其连接到网络
- 使用您的主 Windows 计算机通过网络远程控制此 Linux 虚拟主机
相信我,与试图将 QEMU 主机硬塞到 Windows 虚拟化 Linux 上相比,使用该设置您会更加有效和高效。
答案2
我有同样的问题。我不知道这是否是你的情况,但如果你qemu
以root身份运行,你必须首先执行
xhost +
以用户身份命令授权root访问X11。