How to launch ARM aarch64 VM with QEMU from scratch

https://futurewei-cloud.github.io/ARM-Datacenter/qemu/how-to-launch-aarch64-vm

https://ww2.coastal.edu/mmurphy2/oer/qemu/aarch64

The below instructions will allow for bringing up an ARM VM from scratch.

To launch an aarch64 VM we first need to install a few dependencies, including QEMU and the qemu-efi-aarch64 package, which includes the efi firmware.

apt-get install qemu-system-arm
apt-get install qemu-efi-aarch64
apt-get install qemu-utils

Create the flash images with the correct sizes.

dd if=/dev/zero of=flash1.img bs=1M count=64
dd if=/dev/zero of=flash0.img bs=1M count=64
dd if=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd of=flash0.img conv=notrunc

Create a dedicated directory (folder) on your host system to contain this virtual machine.

Download the latest Alpine Linux “Virtual” ISO file for the aarch64 architecture.

Create the disk image by running the following command:

qemu-img create -f qcow2 alpine.qcow2 40G

Start QEMU with the installer.

qemu-system-aarch64 -nographic -machine virt,gic-version=max -m 2048 -cpu max -smp 4 \
-netdev user,id=vnet,hostfwd=:127.0.0.1:2222-:22 -device virtio-net-pci,netdev=vnet \
-drive file=alpine.qcow2,if=none,id=drive0,cache=writeback -device virtio-blk,drive=drive0,bootindex=0 \
-drive file=alpine-virt-3.21.2-aarch64.iso,if=none,id=drive1,cache=writeback -device virtio-blk,drive=drive1,bootindex=1 \
-drive file=flash0.img,format=raw,if=pflash -drive file=flash1.img,format=raw,if=pflash 

Setup the system with the command: setup-alpine

Once the install is finished you can exit QEMU with ctrl+a,x

Then restart QEMU without the installer image with the following command.

qemu-system-aarch64 -nographic -machine virt,gic-version=max -m 2048 -cpu max -smp 4 \
-netdev user,id=vnet,hostfwd=:127.0.0.1:2222-:22 -device virtio-net-pci,netdev=vnet \
-drive file=alpine.qcow2,if=none,id=drive0,cache=writeback -device virtio-blk,drive=drive0,bootindex=0 \
-drive file=flash0.img,format=raw,if=pflash -drive file=flash1.img,format=raw,if=pflash 

Starting the virtual machine by hand with the full command line each time would be cumbersome and error-prone. Consequently, I recommend creating a script that contains the QEMU command. The following example is a Bourne shell script for Linux or macOS.

#!/bin/sh
#
# Alpine Linux on AArch64
#

qemu-system-aarch64 -nographic -machine virt,gic-version=max -m 2048 -cpu max -smp 4 \
-netdev user,id=vnet,hostfwd=:127.0.0.1:2222-:22 -device virtio-net-pci,netdev=vnet \
-drive file=alpine.qcow2,if=none,id=drive0,cache=writeback -device virtio-blk,drive=drive0,bootindex=0 \
-drive file=flash0.img,format=raw,if=pflash -drive file=flash1.img,format=raw,if=pflash 

echo "QEMU has finished. Press Enter to continue."
read throwaway

Leave a Reply

Your email address will not be published. Required fields are marked *