====== VM mit ARM-System und QEMU aufsetzen ====== [[http://www.qemu-project.org/|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 [[http://ftp.debian.org/debian/dists/wheezy/main/installer-armhf/current/images/vexpress/netboot/|Wheezy armhf netboot]] heruntergeladen werden müssen. ARMv6 wird bei Debian ''armel'' genannt, was mit dem entsprechenden [[http://ftp.debian.org/debian/dists/wheezy/main/installer-armel/current/images/versatile/netboot/|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: * https://en.wikibooks.org/wiki/QEMU/Images#Mounting_an_image_on_the_host * https://gist.github.com/Liryna/10710751 * http://www.linux-kvm.org/page/USB_Host_Device_Assigned_to_Guest {{tag>linux arm vm qemu}}