QEMU aarch64 emulation
The following script should allow booting the aarch64-linux UEFI
installer ISOs provided through the nixos:unstable-small
and
nixos:trunk
jobsets, when no native hardware support exists.
Pass the ISO file as the first argument, and everything should boot up.
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p qemu_full virt-viewer
# shellcheck shell=bash
set -euo pipefail
BASEDIR=$(dirname "$0")
VMNAME=nixos-aarch64
ISO="${BASEDIR}/$1"
NVRAM="${BASEDIR}/vars-pflash.raw"
CORES=6
MEMORY=4096
KEYBOARD="de"
cleanup() {
kill "$QEMU_PID" || true
}
trap cleanup EXIT
run_vm() {
OVMF_FD=$(nix-build '<nixpkgs>' --no-out-link -A OVMF.fd --system aarch64-linux)
test -f "${NVRAM}" || {
cp "${OVMF_FD}/AAVMF/vars-template-pflash.raw" "${NVRAM}"
chmod u+w "${NVRAM}"
}
qemu-system-aarch64 \
-name $VMNAME,process=$VMNAME \
-machine virt,gic-version=max \
--accel tcg,thread=multi \
-cpu max \
-smp $CORES \
-m $MEMORY \
-k $KEYBOARD \
-serial stdio \
-drive if=pflash,format=raw,file="${OVMF_FD}/AAVMF//QEMU_EFI-pflash.raw",readonly=on \
-drive if=pflash,format=raw,file="${NVRAM}" \
-device virtio-scsi-pci \
-device virtio-gpu-pci \
-device virtio-net-pci,netdev=wan \
-netdev user,id=wan \
-device virtio-rng-pci,rng=rng0 \
-object rng-random,filename=/dev/urandom,id=rng0 \
-device virtio-serial-pci \
-drive file="${ISO}",media=cdrom \
-boot d
QEMU_PID=$!
}
run_vm