从 QEMU 上的真实 (UEFI) 磁盘映像启动

从 QEMU 上的真实 (UEFI) 磁盘映像启动
概括:

我希望使用我从运行 Ubuntu 的真机创建的磁盘映像来启动 QEMU。创建映像并尝试运行 QEMU 后,VM 挂在“从硬盘启动”状态。

详细说明

我有一台 x86_64 桌面计算机,上面安装了标准 Ubuntu 20.04.3。默认情况下,这还会在 1TiB HDD 上安装 GRUB 作为引导加载程序。该磁盘有一个 GPT、一个 EFI 分区以及一个 ext4 分区 (~50GiB)。该系统可以启动、运行并且功能齐全。通过实时 USB 运行,我创建了整个启动磁盘的原始映像。让我们调用图像ae.img

从远程计算机上,我通过运行创建了图像

ssh root@<IP> "dd if=/dev/sda bs=100M status=progress | xz -T 8 -1" | unxz | cp --sparse=always /proc/self/fd/0 ae.img

忽略通过网络压缩数据的xz/ ,实际上整个磁盘都由 读取,通过网络发送,并由 写入稀疏文件。对于正在运行的实时 USB,是 HDD。我已使用 来检查映像的分区表,并通过将其安装为环回设备来检查实际 ext4 分区中的数据。unxzddae.imgcp/dev/sdafdisk

挑战:

我想使用 QEMU 在另一个(几乎相同的)系统上运行具有此磁盘映像的虚拟机。我认为,如果我将此映像指定为 QEMU 上的驱动器,它可能会尝试从该映像启动,然后启动 GRUB 引导加载程序,依此类推。为了保持相同,我尝试用视频输出启动它。我使用的命令是:

  -m 4G \
  -machine type=q35,accel=kvm \
  -smp 4 \
  -drive format=raw,file=ae.img \
  -cpu host \
  -display default \
  -vga virtio \
  -show-cursor

我已将映像指定为驱动器,并提供 vga 显示屏、4GB 内存和 4 个内核。应该够了。运行此命令会显示一个 QEMU 窗口,如下所示。我卡在启动上,没有进一步的进展。htop报告称 QEMU 正在以 100% 的速度消耗一个核心,其中一个条为 50% 蓝色(低优先级进程)和 50% 红色(内核)。

我如何诊断发生了什么?有什么建议的修复方法吗?

QEMU 启动窗口

答案1

刚刚想通了。

概括

QEMU 默认使用 BIOS 启动。这与使用 UEFI 启动的真实系统形成对比。 UEFI 和 BIOS 需要不同的磁盘组织。我的磁盘映像(来自 UEFI 系统)挂在使用 BIOS 启动的 QEMU 上。

修复:附加选项-bios /usr/share/ovmf/OVMF.fd

OVMF 提供正确的固件。

更详细的答案

引用自操作系统开发,“传统 BIOS 将 512 字节平面二进制 blob 从引导设备的 MBR 加载到物理地址 7C00 处的内存中,并跳转到该位置。”。这可能包含实际 UEFI 磁盘上的一些任意数据,导致其挂起。

相关内容