Debian (aarch64) und QEMU

Debian (aarch64) und QEMU

Der ODROID-HC4 hat mein Interesse geweckt, einfach mal Debian in einer virtuellen Maschine für die ARM-Architektur zu installieren. Es mag sicherlich noch andere Wege dafür geben, doch beschreibe ich hier einmal, wie es bei mir funktioniert hat.

Vorbereitungen

Zunächst gilt es, die Installationsdateien (Kernel und Initrd) für eine Netzwerk-Installation herunterzuladen. Diese werden gleich umbenannt, um sie später nicht mit den eigentlichen Kernel- und Initrd-Dateien zu verwechseln, die wir später erstellen werden.

# wget -O installer-linux http://http.us.debian.org/debian/dists/bullseye/main/installer-arm64/current/images/netboot/debian-installer/arm64/linux
# wget -O installer-initrd.gz http://http.us.debian.org/debian/dists/bullseye/main/installer-arm64/current/images/netboot/debian-installer/arm64/initrd.gz

Anschließend wird eine leere Festplattendatei erstellt, in die das Debian-System installiert werden soll. 30GB dürften genügend Platz bieten.

qemu-img create -f qcow2 debian-arm64.qcow2 30G

Installation

Jetzt kann die eigentliche Installation gestartet werden:

qemu-system-aarch64 -M virt -m 4096 -cpu cortex-a53 \
  -kernel installer-linux \
  -initrd installer-initrd.gz \
  -drive if=none,file=debian-arm64.qcow2,format=qcow2,id=hd \
  -device virtio-blk-pci,drive=hd \
  -netdev user,id=mynet \
  -device virtio-net-pci,netdev=mynet \
  -nographic -no-reboot

Der Installer führt einen in der Textkonsole durch den Installationsprozess. Dies sollte weitgehend selbsterklärend sein. Die Installation dauert einige Zeit und man wird hin und wieder nach weiteren Angaben gefragt.

Relativ spät wird der Installer meckern, dass kein Bootloader installiert werden konnte. Das ist okay.

Kernel extrahieren

Damit das System bootet, muss man den Kernel und die Initrd direkt in QEMU angeben. Dazu kopiert man die beiden Dateien aus der qcow2-Disk auf das Host-System. Hierfür gibt es verschiedene Tools. Erfolgreich war bei mir qemu-nbd (QEMU Disk Network Block Device Server), das das qcow2-Image als Network Block Device exportiert.

# modprobe nbd max_part=8
# qemu-nbd --connect=/dev/nbd0 debian-aarch64.qcow2

Das erste Kommando lädt das Kernelmodul (m̀ax_part gibt die max. Anzahl der Partitionen an). Das Zweite exportiert das Disk Image als Network Block Device (/dev/nbd0). Daraufhin werden die vorhandenen Partitionen des Images auf die Devices /dev/nbd0p1, /dev/nbd0p2 usw. gemapped.

Mit dem foldenden Kommando kann man sich die Partitionen anzeigen lassen:

# fdisk /dev/nbd0 -l

Festplatte /dev/nbd0: 40 GiB, 42949672960 Bytes, 83886080 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: gpt
Festplattenbezeichner: F39F70B4-1EFA-4F58-BB3D-E956373D3B43

Gerät         Anfang     Ende Sektoren Größe Typ
/dev/nbd0p1     2048   999423   997376  487M Linux-Dateisystem
/dev/nbd0p2   999424 81885183 80885760 38,6G Linux-Dateisystem
/dev/nbd0p3 81885184 83884031  1998848  976M Linux Swap

Da die erste Partition /boot enthält, mounten wir nun diese und kopieren die beiden Dateien heraus:

# mount /dev/nbd0p1 /mnt/temp
$ cp /mnt/temp/vmlinuz-5.10.0-9-arm64 .
$ cp /mnt/temp/initrd.img-5.10.0-9-arm64 .

Nun räumen wir noch etwas auf:

# sudo umount /mnt/temp
# sudo qemu-nbd --disconnect /dev/nbd0

Die virtuelle Maschine verwenden

Die extrahierten Dateien sowie das erstellte qcow2-Image habe ich nun unter /var/lib/libvirt/images abgelegt und über den virt-manager eine neue Maschine erstellt. Hier ist zu beachten, dass man als Architektur aarch64 auswählt und in den Einstellungen bei den Boot-Optionen den Pfad zum Kernel und der Initrd angibt. Ebenso muss man dem Kernel noch sagen, wo sich die root-Partition befindet: root=/dev/vda2.

QEMU Kernel Setting

Die virtuelle ARM-Maschine kann nun verwendet werden.