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: