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
-kerneland, usually, an initramfs with-initrd. The fastest way to a shell. - Through firmware: give it U-Boot with
-biosand a disk with an EFI system partition. U-Boot findsEFI/BOOT/BOOTAA64.EFIand 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 -nographicThe 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-nographicputs on your terminal.- The compressed kernel:
vmlinuz-virtis 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" \
-nographicThe 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.
- Download the image and convert it to raw (Warm64 opens raw images;
qemu-imgcomes 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- Get U-Boot for QEMU's virt board (see U-Boot below).
- Boot it:
wemu-system-aarch64 -m 1G -bios u-boot.bin -drive file=debian.raw,if=virtio,format=raw -nographicU-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:
- Make a raw disk image with an ext4 filesystem and unpack the tarball into it.
- Take the kernel (
boot/Image) and initramfs from it. The initramfs must include the virtio drivers (virtio_mmioorvirtio_pci, andvirtio_blk); add them withmkinitcpioif they're missing. - 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" -nographicThe 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 maxfor pointer authentication, MTE and SVE. - Boot level: EL2, with the Virtualization Host Extensions.
-M virt,virtualization=offboots 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
| Symptom | Cause |
|---|---|
nothing to boot: this machine has no ROM of its own | Give -kernel, -bios or -pflash. |
Unknown driver 'qcow2' | Convert the image to raw: qemu-img convert -O raw in.qcow2 out.img. |
| No output at all | Add console=ttyAMA0 to -append, and use -nographic (or read vm.serial[0]). |
| Out of memory, or the initramfs stops unpacking | Raise -m; the default is 128 MiB. |