概括:
我希望使用我从运行 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 分区中的数据。unxz
dd
ae.img
cp
/dev/sda
fdisk
挑战:
我想使用 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% 红色(内核)。
我如何诊断发生了什么?有什么建议的修复方法吗?
答案1
刚刚想通了。
概括
QEMU 默认使用 BIOS 启动。这与使用 UEFI 启动的真实系统形成对比。 UEFI 和 BIOS 需要不同的磁盘组织。我的磁盘映像(来自 UEFI 系统)挂在使用 BIOS 启动的 QEMU 上。
修复:附加选项-bios /usr/share/ovmf/OVMF.fd
OVMF 提供正确的固件。
更详细的答案
引用自操作系统开发,“传统 BIOS 将 512 字节平面二进制 blob 从引导设备的 MBR 加载到物理地址 7C00 处的内存中,并跳转到该位置。”。这可能包含实际 UEFI 磁盘上的一些任意数据,导致其挂起。