Booting Linux

Alpine, Debian and Arch Linux ARM, from a kernel and initrd or through U-Boot and EFI, unmodified.

Warm64 boots stock arm64 Linux distributions, unmodified. There are two ways in:

  • Directly: give it a kernel with -kernel and, usually, an initramfs with -initrd. The fastest way to a shell.
  • Through firmware: give it U-Boot with -bios and a disk with an EFI system partition. U-Boot finds EFI/BOOT/BOOTAA64.EFI and starts it, the way a real Arm board boots.

Alpine Linux

Alpine's netboot kernel and initramfs boot to a shell with nothing else.

curl -LO https://dl-cdn.alpinelinux.org/alpine/v3.22/releases/aarch64/netboot/vmlinuz-virt
curl -LO https://dl-cdn.alpinelinux.org/alpine/v3.22/releases/aarch64/netboot/initramfs-virt

wemu-system-aarch64 -m 1G -kernel vmlinuz-virt -initrd initramfs-virt -append console=ttyAMA0 -nographic

The kernel's messages scroll past and a ~ # prompt appears. Press Ctrl+A then x to quit.

  • -m 1G: the default is QEMU's 128 MiB, which is too little for Alpine's initramfs.
  • console=ttyAMA0: the board's first serial port, which -nographic puts on your terminal.
  • The compressed kernel: vmlinuz-virt is an EFI zboot image; Warm64 unpacks it, as it does a gzipped initramfs.

With a root disk

To boot an installed system, add its disk and point the kernel at it:

wemu-system-aarch64 -m 1G -kernel vmlinuz-virt -initrd initramfs-virt \
  -drive file=rootfs.img,if=virtio,format=raw \
  -append "console=ttyAMA0 root=/dev/vda rw rootfstype=ext4 modules=virtio_pci,virtio_blk,ext4" \
  -nographic

The disk is opened in place: the guest's writes reach rootfs.img as they happen. Add -snapshot to keep the image unchanged. See Disks and images.

Debian

Debian publishes ready-to-boot arm64 images. The nocloud image has a root account with no password.

  1. Download the image and convert it to raw (Warm64 opens raw images; qemu-img comes with QEMU):
   curl -LO https://cloud.debian.org/images/cloud/trixie/latest/debian-13-nocloud-arm64.qcow2
   qemu-img convert -O raw debian-13-nocloud-arm64.qcow2 debian.raw
  1. Get U-Boot for QEMU's virt board (see U-Boot below).
  1. Boot it:
   wemu-system-aarch64 -m 1G -bios u-boot.bin -drive file=debian.raw,if=virtio,format=raw -nographic

U-Boot finds the image's EFI partition, GRUB starts the kernel, and systemd brings the system up to a login prompt: log in as root.

Tip If /boot/efi fails to mount while the system starts, add systemd.default_device_timeout_sec=600 to the kernel's command line (in GRUB, press e). Emulated disks can take longer to appear than systemd's default allows.

Arch Linux ARM

Arch Linux ARM publishes a root filesystem, ArchLinuxARM-aarch64-latest.tar.gz, rather than a disk image. To boot it:

  1. Make a raw disk image with an ext4 filesystem and unpack the tarball into it.
  2. Take the kernel (boot/Image) and initramfs from it. The initramfs must include the virtio drivers (virtio_mmio or virtio_pci, and virtio_blk); add them with mkinitcpio if they're missing.
  3. Boot:
   wemu-system-aarch64 -m 1G -kernel Image -initrd initramfs-linux.img \
     -drive file=arch.img,if=virtio,format=raw \
     -append "console=ttyAMA0 root=/dev/vda rw" -nographic

The default login is root with the password root.

U-Boot

The firmware Warm64 boots is U-Boot built for QEMU's virt board. Debian packages it as u-boot-qemu; the file you need is usr/lib/u-boot/qemu_arm64/u-boot.bin inside the package:

curl -LO https://deb.debian.org/debian/pool/main/u/u-boot/u-boot-qemu_2025.01-3+deb13u1_all.deb
ar x u-boot-qemu_*_all.deb
tar xf data.tar.xz ./usr/lib/u-boot/qemu_arm64/u-boot.bin
cp usr/lib/u-boot/qemu_arm64/u-boot.bin .

U-Boot runs from flash at the reset vector, finds the device tree Warm64 builds at the start of RAM, scans the virtio disks, and boots the first EFI system partition's EFI/BOOT/BOOTAA64.EFI. To keep U-Boot's environment in a second flash bank, pass two -pflash images instead of -bios; changes made with saveenv last until the machine exits.

What the guest sees

  • CPU: a Cortex-A76 with every Armv8.x feature Linux uses. Add -cpu max for pointer authentication, MTE and SVE.
  • Boot level: EL2, with the Virtualization Host Extensions. -M virt,virtualization=off boots it at EL1 instead.
  • Firmware: a device tree describes the machine; there's no ACPI. PSCI starts the other cores.
  • Devices: QEMU's virt layout. See The virt machine.

Troubleshooting

SymptomCause
nothing to boot: this machine has no ROM of its ownGive -kernel, -bios or -pflash.
Unknown driver 'qcow2'Convert the image to raw: qemu-img convert -O raw in.qcow2 out.img.
No output at allAdd console=ttyAMA0 to -append, and use -nographic (or read vm.serial[0]).
Out of memory, or the initramfs stops unpackingRaise -m; the default is 128 MiB.

See also