User Tools

Site Tools


arm:qemu_armv7_debian_vm

VM mit ARM-System und QEMU aufsetzen

QEMU ist eine freie Virtualisierungssoftware, die ich im Folgenden verwende, ein Debian Linux auf ARMv7-Basis aufzusetzen. Installiert wird es über das Paket qemu:

sudo pacman -S qemu

Zumindest unter Arch Linux befinden sich, damit die Paketgröße überschaubar bleibt, zusätzliche Architekturen in einem separaten Paket, qemu-arch-extra:

sudo pacman -S qemu-arch-extra

Zuerst wird ein Datenträger erstellt, auf dem Linux installiert werden soll. Ich habe in diesem Fall 4GB gewählt:

qemu-img create -f raw armdisk.img 4G

Für die spätere Installation muss ein Maschinentyp und Prozessor festgelegt werden, der emuliert werden soll. Die verfügbaren Maschinen werden mit

qemu-system-arm -machine help

aufgelistet. Ich will eine ARMv7-Basis, speziell bin ich am Cortex-A9 Prozessor interessiert, weswegen ich vexpress-a9 wähle. Die zu einem Maschinentyp verfügbaren Prozessoren können mit

qemu-system-arm -M vexpress-a9 -cpu help

angezeigt werden. Bei Debian heißt diese Architektur armhf (ARM hard float), weswegen vmlinuz und initrd Dateien für in diesem Fall Wheezy armhf netboot heruntergeladen werden müssen.

ARMv6 wird bei Debian armel genannt, was mit dem entsprechenden Wheezy armel netboot emuliert werden kann. armel wird auch für ARMv5 benötigt. Um einen Raspberry Pi zu emulieren, wird armel benötigt, die CPU ist in diesem Fall arm1176 und der Maschinentyp versatilepb.

Es wird nun eine virtuelle Maschine mit 1GB RAM und Cortex-A9 CPU erstellt. In diesem Fall muss -sd anstatt -sda verwendet werden, da der vexpress Kernel keine PCI SCSI Festplatten unterstützt. Das Debian wird also auf einer MMC/SD Karte installiert.

qemu-system-arm -m 1024M -sd armdisk.img \
                -M vexpress-a9 -cpu cortex-a9 \
                -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.gz \
                -append "root=/dev/ram" -no-reboot

Oder in einer Zeile:

qemu-system-arm -m 1024M -sd armdisk.img -M vexpress-a9 -cpu cortex-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.gz -append "root=/dev/ram" -no-reboot

Die Option -cpu ist dabei optional, standardmäßig wird -cpu=any verwendet. Der Maschinentyp -M allerdings muss angegeben werden.

Der obige Befehl startet ein QEMU Fenster mit dem Debian Installer. Die Installation entsprechend den Wünschen ausführen, dies dauert gut zwei Stunden oder auch länger.

Im Falle von ARMv6 wird entsprechend versatilepb verwendet:

qemu-system-arm -m 1024M -M versatilepb \
                -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.gz \
                -append "root=/dev/ram" -hda armdisk.img -no-reboot

Bei der Partitionierung habe ich eine separate boot-Partition eingerichtet. Diese wird nun benötigt. Ist die Installation abgeschlossen und das System fährt herunter, muss aus dem eingerichteten Datenträger-Image Kernel und initrd extrahiert werden. Dazu mit einem

sudo fdisk -l armdisk.img

die Blockgröße und den Startblock der boot-Partition, bzw. bei keiner separaten boot-Partition der root-Partition, zu ermitteln. In meinem Fall beträgt die Blockgröße 512 Bytes, meine boot-Partition fängt beim Block 2048 an. Entsprechend beträgt das Offset für den Start der Partition 512*2048 Bytes. Um die Partition einzubinden, wird mount mit dem ermittelten Offset verwendet:

sudo mount -o loop,offset=1048576 armdisk.img /mnt

Aus der boot-Partition muss nun der Kernel, vmlinuz-3.2.0-4-vexpress, und die initrd, initrd.img-3.2.0-4-vexpress, kopiert werden. Ich habe sie in einem separaten Ordner arm_extracted hinterlegt. Theoretisch kann auch der gesamte Inhalt der boot-Partition in diesen Ordner kopiert werden. Anschließend die gemountete Partition wieder aushängen:

sudo umount /mnt

Haben wir unsere Dateien, können wir sie zum Booten des installierten Systems verwenden, das root-Verzeichnis entsprechend anpassen:

qemu-system-arm -m 1024M -sd armdisk.img -M vexpress-a9 -kernel arm_extracted/vmlinuz-3.2.0-4-vexpress -initrd arm_extracted/initrd.img-3.2.0-4-vexpress -append "root=/dev/mmcblk0p2" -sd armdisk.img -no-reboot

Für den armel-Fall lautet der Befehl entsprechend

qemu-system-arm -M versatilepb -m 1024M  \
                -kernel after-copy/vmlinuz-3.2.0-4-versatile \
                -initrd after-copy/initrd.img-3.2.0-4-versatile \
                -hda armdisk.img -append "root=/dev/sda1"

mehr Infos:

arm/qemu_armv7_debian_vm.txt · Last modified: by sascha