QEMU搭建ARM64环境

已经配置好的环境:下载链接 (使用方法:先执行 net.sh 再运行 start.sh 即可)

参考文章:Building a Debian Bullseye QEMU image for AARCH64 | diozero

大概思路:先下载安装程序的基本文件,联网安装完之后从磁盘文件中提取出需要的 initrd.imgvmlinuz 文件。 QEMU 依赖提取的文件构建出 aarch64 环境。

准备阶段

创建磁盘文件并下载内核镜像、内存盘镜像文件

qemu-img create -f qcow2 debian-3607-aarch64.qcow2 20G
wget http://ftp.au.debian.org/debian/dists/bullseye/main/installer-arm64/current/images/netboot/debian-installer/arm64/initrd.gz
wget http://ftp.au.debian.org/debian/dists/bullseye/main/installer-arm64/current/images/netboot/debian-installer/arm64/linux
wget http://ftp.au.debian.org/debian/dists/bullseye/main/installer-arm64/current/images/netboot/mini.iso

执行 qemu 启动脚本前,先确创建出 tap0 接口并将其添加至网桥(名称可能会根据具体情况进行修改),因为接下来会通过网络来下载和安装完整的系统,必须要实现 qemu 的网络通信。依次执行下面的命令。

补充:这个 virbr0 是执行 sudo apt install libvirt-daemon-system libvirt-clients virt-manager 命令安装 libvirt 相关软件包得到的。

sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up
sudo brctl addif virbr0 tap0
sudo chmod 666 /dev/net/tun

下面是 qemu 的启动脚本

#!/bin/bash
sudo qemu-system-aarch64 -M virt -cpu cortex-a53 -m 1G -kernel ./linux -initrd ./initrd.gz \
-hda debian-3607-aarch64.qcow2 -append "console=ttyAMA0" \
-drive file=mini.iso,id=cdrom,if=none,media=cdrom \
-device virtio-scsi-device -device scsi-cd,drive=cdrom -nographic \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-device virtio-net-device,netdev=net0

下载&&安装阶段

当执行启动脚本后,会看到这个界面,这说明正常进入了安装界面。选择 English 并敲击回车继续往下进行

image-20240519172730758

选香港

image-20240519172748706

键盘布局随便,我选了 Chinese

image-20240519172831617

这里会自动尝试配置网络

image-20240519172957528

如果忘记创建 tap0 接口或者没有成功将 tap0 接口添加到网桥,那么会出现自动配置网络失败的情况。

image-20240519173017122

这里可以选择自行手动配置,但我建议最后先将 qemu 的网络通信后,让它自动获取。

image-20240519173029036

遇见上面的情况就需要重新检查网络接口以及网桥的状态,如果是下面的情况则说明一切正常。

image-20240519174328064

默认为空继续

image-20240519174345556

选香港

image-20240519174408193

默认为空继续

image-20240519174500123

设置代理,默认为空即可

image-20240519174511531

设置 root 用户的密码

image-20240519174905966

重复刚才的密码

image-20240519174927529

创建新的用户

image-20240519175105696

和上面的一样即可

image-20240519175137423

输入新建用户的密码

image-20240519175158591

重复密码

image-20240519175210970

下面四个步骤全部默认即可

image-20240519175337793

image-20240519175353589

image-20240519175442190

image-20240519175524650

这里选择 Yes (默认是 No

image-20240519175612033

然后会安装大概一两个小时。弹出来这个,选择 Yes

image-20240519214316884

什么都不用主动勾选(默认会有 SSH),按 Tab 切换到 Continue 就行

image-20240519214522645

​ 继续

image-20240519215503055

这里安装已经完成了,点击 Continue

image-20240519215657041

再次看到这个最初的界面,就是已经安装完了(不需要再继续安装了),直接给这个窗口关了就行

image-20240519220021950

从镜像提取文件

现在要从 qcow2 镜像中提取出来 Linux 内核和 initrd ,将磁盘文件挂载出来,然后把 vmlinuz-5.10.0-29-arm64 以及 initrd.img-5.10.0-29-arm64 拷贝出来

sudo modprobe nbd
sudo qemu-nbd -c /dev/nbd0 debian-3607-aarch64.qcow2
sudo mount /dev/nbd0p2 /mnt
sudo mount /dev/nbd0p1 /mnt/boot
cp /mnt/boot/vmlinuz-5.10.0-29-arm64 ./
cp /mnt/boot/initrd.img-5.10.0-29-arm64 ./

image-20240519225438650

运行并实现网络通信

现在所有的文件都有了,接下来就是启动 qemu ,在此之前先创建出 tap0 接口并将其添加到 virbr0 网桥。

#!/bin/bash
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up
sudo brctl addif virbr0 tap0
sudo chmod 666 /dev/net/tun

运行下面的启动脚本

#!/bin/bash
sudo qemu-system-aarch64 -M virt -cpu cortex-a53 -m 1G -initrd ./initrd.img-5.10.0-29-arm64 \
-kernel ./vmlinuz-5.10.0-29-arm64 -append "root=/dev/vda2 console=ttyAMA0" \
-drive if=virtio,file=debian-3607-aarch64.qcow2,format=qcow2,id=hd \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-device virtio-net-pci,netdev=net0 \
-nographic

一切正常,此时让输入用户名和密码(安装时设置的)

image-20240519232417152

进来应该是这样,此时的网卡还没有分出来 ip

image-20240519232514513

enp0s1 网卡分一个 ip (取决于网桥 virbr0 在宿主机的哪个网段),再设置一下网关,最后启用该网卡。

ip add add 192.168.122.130/24 dev enp0s1
ip link set enp0s1 up
ip route add default via 192.168.122.1

image-20240519232759279

配置好 ip 和网关后,此时可以 ping 通宿主机且可以访问互联网。

image-20240519232832316

至此 QEMU 模拟 ARM64 架构系统完成。

image-20240519234759740

补充

配置好的环境中有两个用户,分别是 zikhroot (如果用 ssh 登录必须要使用 zikh 用户),密码均为 root