Follow the steps below to install Ubuntu Server 20.04 on a QEMU aarch64 (Armv8) virtual machine from the Linux command line. The x86 host system was running Ubuntu 18.04. The virtual machine uses UEFI boot firmware.
Ubuntu Server is console based and so everything in these steps uses a console and no GUI. I may show the steps for Ubuntu desktop with a GUI in a future post.
Prerequisites
1. Install QEMU
$ sudo apt-get install qemu-system-arm
2. Install a pre-built UEFI image for QEMU
$ sudo apt-get install qemu-uefi
3. Download an Ubuntu distro install ISO image. In this example we are using the Server variant of Ubuntu. You can find 20.04 release images here: http://cdimage.ubuntu.com/ubuntu/releases/20.04/release/
$ wget -O ubuntu-20.04-live-server-arm64.iso http://cdimage.ubuntu.com/ubuntu/releases/20.04/release/ubuntu-20.04-live-server-arm64.iso
Prepare flash and disk images
The UEFI image will be placed in a 64MB simulated flash and an empty simulated 64MB flash will be used for UEFI variable.
1. Place the UEFI image in a 64MB simulated flash.
$ cp /usr/share/qemu-efi-aarch64/QEMU_EFI.fd flash0.img
$ truncate -s 64M flash0.img
2. Create an empty 64MB flash image to hold UEFI variables.
$ truncate -s 64M flash1.img
3. Set up empty disk qcow2 image (16G in this example) where Ubuntu will be installed. For info on qcow images see https://en.wikipedia.org/wiki/Qcow.
$ qemu-img create -f qcow2 hda.qcow2 16G
Boot the virtual machine and run the Ubuntu installer
The install image ISO will appear as a CD drive to the virtual machine and will automatically launch the installer. We doing a Ubuntu Server install and so everything is console based and there is no GUI.
$ qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 \
-device virtio-net-pci,netdev=net0,romfile="" \
-netdev type=user,id=net0 \
-device virtio-blk-pci,drive=drv0 \
-object rng-random,filename=/dev/urandom,id=rng0 \
-device virtio-rng-pci,rng=rng0 \
-drive format=qcow2,file=hda.qcow2,if=none,id=drv0 \
-drive if=pflash,format=raw,file=flash0.img,readonly \
-drive if=pflash,format=raw,file=flash1.img \
-nographic \
-device virtio-scsi \
-device scsi-cd,drive=cd \
-drive if=none,id=cd,file=/local/install-images/ubuntu-20.04- live-server-arm64.iso
At the boot menu that appears select “Install Ubuntu Server”.
Follow the prompts until the installation is complete.
After the installation is complete shutdown the virtual machine and QEMU will exit to the host Linux prompt:
$shutdown now
Boot the newly installed virtual machine
Run QEMU to boot your newly installed virtual machine, but this time without the install media.
$ qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 \
-device virtio-net-pci,netdev=net0,romfile="" \
-netdev type=user,id=net0 \
-device virtio-blk-pci,drive=drv0 \
-object rng-random,filename=/dev/urandom,id=rng0 \
-device virtio-rng-pci,rng=rng0 \
-drive format=qcow2,file=hda.qcow2,if=none,id=drv0 \
-drive if=pflash,format=raw,file=flash0.img,readonly \
-drive if=pflash,format=raw,file=flash1.img \
-nographic
You should arrive at an Ubuntu login prompt.
Congrats!