前言

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

通过网盘分享的文件: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 - 生命、宇宙和钓鱼