Introduction
After releasing my QEMU images and then publishing a post on how to build a QEMU image for Debian MIPSel, I still received many demands for information on building more VMs, and among those, the most popular one was AARCH64 (or ARM64).
If you’re just interested in downloading the ready-to-use AARCH64 image, just go to the Mega repository.
Pre-requisite
Just like we did earlier in the former post, we will proceed with the Debian Net Installer, so you will require:
- an Internet connection
- a recent QEMU (generally
{apt,dnf} install qemu
will suffice) - the initrd of the Debian installer
$ wget http://ftp.debian.org/debian/dists/Debian9.13/main/installer-arm64/current/images/netboot/debian-installer/arm64/initrd.gz
- the kernel to boot on for the installation:
$ wget http://ftp.debian.org/debian/dists/Debian9.13/main/installer-arm64/current/images/netboot/debian-installer/arm64/linux
You also need a hard drive to install the OS on:
$ qemu-img create -f qcow2 disk.qcow2 20G
Installation steps
since most steps are similar with the ones described in the post before, I’ll simply show the commands I’ve used so they can be copy/pasted for reproduction.
Start with running the installer (with 2 vCPUs and 1GB Ram):
$ qemu-system-aarch64 -smp 2 -M virt -cpu cortex-a57 -m 1G \
-initrd initrd.gz \
-kernel linux -append "root=/dev/ram console=ttyAMA0" \
-global virtio-blk-device.scsi=off \
-device virtio-scsi-device,id=scsi \
-drive file=disk.qcow2,id=rootimg,cache=unsafe,if=none \
-device scsi-hd,drive=rootimg \
-netdev user,id=unet -device virtio-net-device,netdev=unet \
-net user \
-nographic
Then, go grab a coffee while the installer does its magic:
And finally:
Now we must shutdown the VM, and extract the initrd and kernel from the image, as follow:
$ sudo apt install nbd-client
$ sudo modprobe nbd max_part=8
$ sudo qemu-nbd --connect=/dev/nbd0 disk.qcow2
$ mkdir mnt
$ sudo mount /dev/nbd0p1 mnt
$ cp mnt/initrd.img-4.9.0-4-arm64 mnt/vmlinuz-4.9.0-4-arm64 .
$ sync
$ sudo umount /dev/nbd0p1
$ sudo nbd-client -d /dev/nbd0
And run your VM with the kernel and initrd copied from installer:
$ qemu-system-aarch64 -smp 2 -M virt -cpu cortex-a57 -m 1G \
-initrd initrd.img-4.9.0-4-arm64 \
-kernel vmlinuz-4.9.0-4-arm64 \
-append "root=/dev/sda2 console=ttyAMA0" \
-global virtio-blk-device.scsi=off \
-device virtio-scsi-device,id=scsi \
-drive file=disk.qcow2,id=rootimg,cache=unsafe,if=none \
-device scsi-hd,drive=rootimg \
-device e1000,netdev=net0 \
-net nic \
-netdev user,hostfwd=tcp:127.0.0.1:2222-:22,id=net0 \
-nographic
And that’s it!
The ready-to-use image (with gcc, gdb, gef, etc.) is available here.
Adios ☕