在M1 Macbook上使用QEMU运行Linux镜像

在M1 Macbook上使用QEMU运行Linux镜像

💡 原文英文,约600词,阅读约需3分钟。
📝

内容提要

本文介绍在M1 Mac上构建QEMU并运行Linux虚拟机:用Homebrew安装依赖,克隆QEMU 6.0源码并打上Alexander Graf的hvf补丁,以aarch64-softmmu为目标编译安装;再用qemu-system-aarch64配合hvf加速、EDK2固件和Ubuntu 20.04 ARM镜像启动虚拟机,并给出调试建议。

🔎

延伸解读

为何需要自行编译 QEMU

文章指出,截至2021年8月,在 M1 Mac 上直接使用 brew install qemu 无法正常工作。这是因为当时 QEMU 对 Apple Silicon 的 hvf 加速支持尚不完整,主分支虽已合并部分补丁,但仍需借助 Alexander Graf 的补丁 v8 才能获得可用的虚拟化支持。因此,作者选择从源码编译 QEMU 6.0,并针对 aarch64 目标进行构建。

编译配置的关键细节

编译时,作者强调只需指定 --target-list=aarch64-softmmu,不要添加 --enable-hvf 或 --disable-gnutls 等参数。这与早期博客的建议不同,反映了 QEMU 代码的演进。此外,作者建议使用 gcc-11 而非 Apple Clang,但表示自己用 Clang 也成功编译。配置阶段会输出各特性的启用状态,值得留意。

运行 Linux 虚拟机的要点

启动虚拟机时,作者使用 qemu-system-aarch64 并启用 hvf 加速,配合 EDK2 固件和 Ubuntu 20.04 ARM 镜像。命令中指定了 -M virt,highmem=off 和 -cpu cortex-a57,并通过 telnet 串口和 stdio 监视器进行交互。这为在 M1 上直接开发 Linux 内核提供了可行环境,但需注意固件路径和磁盘镜像格式。

调试与验证建议

作者分享的调试经验包括:检查自动配置输出以确认特性启用情况,以及使用 qemu-system-aarch64 -accel help 验证 hvf 支持。如果 hvf 未列出,通常意味着补丁应用有问题。这些步骤能帮助读者快速定位编译或配置中的常见错误,避免在环境搭建上耗费过多时间。

❓

Q&A

为什么在M1 Mac上不能直接用brew install qemu?

截至2021年8月24日,直接使用brew install qemu在M1 macOS上无法正常工作,因为QEMU尚未完全支持Apple Silicon。

如何在M1 Mac上编译支持hvf的QEMU?

需要克隆QEMU 6.0源码,打上Alexander Graf的hvf补丁v8,然后以aarch64-softmmu为目标进行编译安装。具体步骤:安装依赖(brew install ninja pkgconfig glib pixman),克隆仓库并检出6.0.0版本,应用补丁(curl https://patchew.org/QEMU/20210519202253.76782-1-agraf@csgraf.de/mbox | git am),配置(../configure --target-list=aarch64-softmmu),编译(make -j8),安装(sudo make install)。

在M1 Mac上运行QEMU Linux虚拟机需要哪些参数?

使用qemu-system-aarch64命令,关键参数包括:-accel hvf启用加速,-m 2048分配内存,-cpu cortex-a57,-M virt,highmem=off,加载EDK2固件(-drive file=/usr/local/share/qemu/edk2-aarch64-code.fd,if=pflash,format=raw,readonly=on),以及磁盘、网络、显示等设备配置。

如何检查QEMU是否支持hvf加速?

运行qemu-system-aarch64 -accel help,如果输出中包含hvf,则说明支持;否则可能是补丁未正确应用。

编译QEMU时有哪些调试建议?

建议使用gcc-11代替Apple clang(但Apple clang也可成功编译);注意自动配置的输出,确认功能启用状态;使用qemu-system-aarch64 -accel help检查hvf支持。

在M1 Mac上运行QEMU Linux虚拟机需要什么固件?

需要EDK2固件,通常使用edk2-aarch64-code.fd(只读)和ovmf_vars.fd(可写)作为pflash设备加载。

🏷️

标签

➡️

继续阅读