a photo of Whexy

Wenxuan

CyberSecurity Researcher at Northwestern University

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

Whexy /
August 16, 2021

作为一名喜欢系统编程的学生,我一直想在 M1 Macbook 上直接开发 Linux 内核,而不需要嵌套虚拟机。这篇博客是开发环境的搭建指南。目标是在搭载 Apple Silicon 的 macOS 上的 QEMU 中运行 Linux 内核。

M1 很棒,巴拉巴拉巴拉... 但它能运行《孤岛危机》吗?呃... 我是说,QEMU?

在 Apple Silicon 上构建 QEMU

原生运行

目前(2021 年 8 月 24 日),简单地使用 brew install qemu 在 M1 macOS 上不会工作。这种情况在未来可能会改变。

在这个教程中,我们将构建在搭载 M1 Apple Silicon 的 macOS 上运行的 QEMU 原生版本。

补丁

我的解决方案是自己构建 QEMU。今年早些时候的一些博客1指出 QEMU 在 M1 上不支持虚拟化框架(hvf),因此应该使用 @_AlexGraf 编写的虚拟化框架补丁。

事情每天都在变化。现在主分支已经合并了一些 hvf 补丁,但仍然没有完全支持 Apple Silicon。这里我们使用 QEMU 6.0(这是 2021 年 8 月 24 日的最新稳定版本),并使用 Alexander Graf 的补丁 v8。

构建说明

我从 GitHub 获取了最新的 QEMU git。要构建 qemu,首先安装依赖。

brew install ninja pkgconfig glib pixman
你可能需要先查看我的调试技巧,让你的生活更轻松。
  1. 克隆 Git 仓库并检出到稳定的 6.0.0 版本
git clone https://github.com/qemu/qemu
cd qemu
git checkout 3c93dfa42c394fdd55684f2fbf24cf2f39b97d47
  1. 补丁
curl https://patchew.org/QEMU/20210519202253.76782-1-agraf@csgraf.de/mbox | git am
  1. 执行自动配置和构建
mkdir build && cd build
../configure --target-list=aarch64-softmmu
make -j8

与今年早些时候写的博客不同,唯一的参数只是 --target-list=aarch64-softmmu。不要添加 --enbale-hvf--disable-gnutls

  1. 安装 QEMU
sudo make install

现在我们有了 qemu-system-aarch64 二进制文件,我们可以用 qemu-system-aarch64 --version 运行它来查看是否准备就绪。

❯ qemu-system-aarch64 --version
QEMU emulator version 6.0.50 (v6.0.0-1407-g44242f6937)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

在 QEMU 上运行 Linux

为了测试 QEMU 是否在笔记本电脑上实际工作,我下载了 Ubuntu Server 20.04 (aarch64)。以下是运行虚拟机的脚本。

#!/bin/sh
qemu-system-aarch64 \
    -accel hvf \
    -m 2048 \
    -cpu cortex-a57 -M virt,highmem=off  \
    -drive file=/usr/local/share/qemu/edk2-aarch64-code.fd,if=pflash,format=raw,readonly=on \
    -drive file=ovmf_vars.fd,if=pflash,format=raw \
    -serial telnet::4444,server,nowait \
    -drive if=none,file=disk.qcow2,format=qcow2,id=hd0 \
    -device virtio-blk-device,drive=hd0,serial="dummyserial" \
    -device virtio-net-device,netdev=net0 \
    -netdev user,id=net0 \
    -vga none -device ramfb \
    -cdrom ubuntu-20.04.2-live-server-arm64.iso \
    -device usb-ehci -device usb-kbd -device usb-mouse -usb \
    -monitor stdio

调试技巧

我在安装 QEMU 时实际遇到了许多问题。以下是你可能想要做的事情。

  • 建议使用 gcc-11 而不是 apple clang (cc)。首先用 homebrew 安装 gcc。但是,我成功地用 apple clang 构建了 QEMU。
  • 注意自动配置。它会显示某个功能是启用还是禁用的信息。
  • 使用 qemu-system-aarch64 -accel help 检查你的 QEMU 是否支持 hvf。如果不支持,那么补丁时有一些问题。

Footnotes

  1. Linux Desktop on Apple Silicon/M1 in Practice; 在 M1 上用 QEMU 运行 Debian 虚拟机; etc.

© LICENSED UNDER CC BY-NC-SA 4.0