前言

懒得自己配的话可以直接下载, 配一下也需要好几个小时,怪麻烦的

通过网盘分享的文件:qemu_ARM64.rar
链接: https://pan.baidu.com/s/1ypZnTVZUwUZQQK0Tnc9bew?pwd=xidp 提取码: xidp

所需前置准备

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

1
2
3
4
5
6
7
8
qemu-img create -f qcow2 debian-3607-aarch64.qcow2 32G

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

上述命令执行完毕之后可以得到下面这几个文件

1
debian-3607-aarch64.qcow2  initrd.gz  linux  mini.iso

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

依次执行下面的命令来配置 Linux主机 网络以此来实现 qemu虚拟机的 网络

1
2
3
4
5
6
# net.sh
sudo apt install libvirt-daemon-system libvirt-clients virt-manager
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

使用命令 ifconfig 来确保 tap0 已经添加

准备完毕后执行下面qemu命令来启动虚拟机

1
2
3
4
5
6
7
#!/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, 回车即可

这里选择地点选择 香港 回车即可

选择键盘布局为中国

然后就会自动配置网络

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

设置主机名

设置域名,默认为空即可

选择一个镜像地址, 选香港就好

这个选 deb.debian.org (默认就是这个)

这里设置代理, 默认为空即可

然后就会开始下载, 这里大概需要30分钟左右下载

这里下载好了之后就是设置 root密码 和 用户名 还有 用户密码 (等太久了在刷抖音, 忘记截图了, 顺手就给回车敲了o(╥﹏╥)o)

设置好用户名和密码之后(下面忘记截图了, 这里用zikh26师傅的截图来展示)

注意这里要选择 yes, 不要无脑回车, 因为他默认是 no

上面设置好了之后就会进入下载

在下载过程中也会出现选择
下图选择 yes

下图先按下 tab 会切换到 continue 然后再回车

默认回车

直到回到这里, 重新看到这个界面算是已经全部下载结束了, 这个窗口已经没有用了, 可以直接关掉(好像用 ctrl+c 和 ctrl+d 都退出不了,直接关掉就好了)

从镜像中提取文件

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

1
2
3
4
5
6
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-35-arm64 ./
cp /mnt/boot/initrd.img-5.10.0-35-arm64 ./

可能会遇到下面问题

1
qemu-system-aarch64: -drive if=virtio,file=debian-3607-aarch64.qcow2,format=qcow2,id=hd: Failed to get "write" lock Is another process using the image [debian-3607-aarch64.qcow2]?

我的解决方案是确保东西保存了之后(可以打一下快照)重启一下虚拟机
我重启一下就好了,指令都可以正常执行

最终得到如下

1
debian-3607-aarch64.qcow2  initrd.gz  initrd.img-5.10.0-35-arm64  linux  mini.iso  net.sh  start.sh  vmlinuz-5.10.0-35-arm64

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

1
2
3
4
5
6
# net.sh
#!/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

运行下面的启动脚本

1
2
3
4
5
6
7
#!/bin/bash
sudo qemu-system-aarch64 -M virt -cpu cortex-a53 -m 1G -initrd ./initrd.img-5.10.0-35-arm64 \
-kernel ./vmlinuz-5.10.0-35-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

同样启动qemu虚拟机也会有上面那个问题, 我的解决方法也是重启

然后就可以启动, 启动之后第一件事情就是配置IP, qemu虚拟机 和 Linux主机 互相ping一下看看能不能通

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

设置好之后可以互相ping通

参考:
QEMU搭建ARM64环境 | ZIKH26’s Blog
Building a Debian Bullseye QEMU image for AARCH64 | diozero
QEMU 模拟的 ARM-64 上的 Debianaarch64 - 生命、宇宙和钓鱼