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
.
Die virtuelle ARM-Maschine kann nun verwendet werden.