Ich versuche, einen Himbeer-Pi mit dem Raspian-Betriebssystem mithilfe von QEMU zu emulieren. Ich habe mehrere im Internet beschriebene Ansätze ausprobiert, aber ohne Erfolg.
Ich fand heraus, dass ich einen Linux-Kernel patchen muss, der zum gewünschten Betriebssystem passt. In meinem Fall habe ich mich für Rasbian Lite mit Kernel 4.4 entschieden:
wget https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2016-05-31/2016-05-27-raspbian-jessie-lite.Zip
unzip 2016-05-27-raspbian-jessie-lite.Zip
rm 2016-05-27-raspbian-jessie-lite.Zip
Als nächstes lade ich einen Kernel von https://www.kernel.org/ :
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.16.tar.gz
tar -xzf linux-4.4.16.tar.gz
rm linux-4.4.16.tar.gz
Jetzt überqueren Sie das Kompilieren des Kernels:
export Arch=arm
export CROSS_COMPILE=arm-linux-gnueabi-
cd linux-4.4.16
make vexpress_defconfig
make all
cd ..
Jetzt kann ich das Boot-Image, das ist ein komprimiertes Kernel-Image, das im RAM automatisch extrahiert wird, in meinen Arbeitsbereich kopieren:
cp linux-4.4.16/Arch/arm/boot/zImage zImage
und QEMU ausführen
qemu-system-arm -kernel zImage -M vexpress-a9 -m 1024 -cpu cortex-a9 -no-reboot -serial stdio -hda 016-05-27-raspbian-jessie-lite.img -append "root=/dev/sda2 rootfstype=ext4"
Aber ich sehe nur ein schwarzes QEMU-Fenster. :(
Ich denke, dass das Problem darin besteht, den richtigen Kernel zu finden. Das Kopieren einiger Kernel aus dem Internet führte nie zum Erfolg, da sie nicht für das Betriebssystem geeignet sind.
Wie kann ich einen Kernel erstellen/patchen, der zum Betriebssystem passt (ohne einen vorhandenen herunterzuladen) und wie kann ich QEMU richtig ausführen?
Danke im Voraus
Alex
Ich lade ein kernel-qemu
von hier https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu?dl= und führen Sie [~ # ~] qemu [ ~ # ~] damit:
qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2" -hda 2016-05-27-raspbian-jessie-lite.img
Das bringt mir folgende Ausgabe: Und es macht für mich Sinn, weil der Kernel 3.10.25 und älter ist als Raspbian Jessie mit Kernel 4.4.16.
Mit dem qemu-Kernel von https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/kernel-qemu-4.4.12-jessie
qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img
Ich habe dieses ähnliche Ergebnis erhalten:
Ein neuer Versuch mit einem neuen Kernel-Qemu 4.4.16:
Kopieren Sie build-kernel-qemu von https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools und fügen Sie die folgende Zeile hinzu, um die Version für Kernel 4.4.16 zu überprüfen:
git checkout b05965f284db3e086022f4e318e46cb5bffb1376
Lauf build-kernel-qemu
um den Kernel zu bauen
sh build-kernel-qemu
Führen Sie [~ # ~] qemu [~ # ~] aus
qemu-system-arm -kernel kernel-qemu -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img
Sie sollten die Raspbian Image-Datei vor dem Start erweitern
Mounten Sie die Raspbian Image-Datei mit kpartx (muss möglicherweise kpartx installieren)
$ Sudo kpartx -av your-image.img
add map loop0p1 (252:5): 0 117187 linear /dev/loop0 1
add map loop0p2 (252:6): 0 3493888 linear /dev/loop0 118784
$ Sudo mount /dev/mapper/loop0p2 /mnt/img1
$ cd /mnt/img1
Ändern Sie die /etc/fstab und kommentieren Sie die MMCBLK-Mounts aus
$ Sudo nano etc/fstab
proc /proc proc defaults 0 0
#/dev/mmcblk0p1 /boot vfat defaults 0 2
#/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
Ändern Sie /etc/ld.so.preload und kommentieren Sie Zeilen aus ...
$ Sudo nano etc/ld.so.preload
#/usr/lib/arm-linux-gnueabihf/libarmmem.so
Hänge ab und zerstöre die Schleifen von kpartx
$ Sudo umount /mnt/img1
$ Sudo kpartx -d your-image.img
Holen Sie sich hier den Qemu-Kernel , der zum Raspbian-Image passt ...
https://github.com/dhruvvyas90/qemu-rpi-kernel
Ich habe diesen Befehl verwendet, um Raspbian Jessie erfolgreich zu emulieren
qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb \
-no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-redir tcp:5022::22 \
-hda 2016-05-27-raspbian-jessie-lite.img
Sie benötigen einen modifizierten Kernel, um in QEMU ausgeführt werden zu können, da die Raspberry Pi-Board-Hardware in QEMU nicht verfügbar ist. Deshalb ist Ihr erster Ansatz gescheitert.
Ihr zweiter Ansatz verwendet einen Kernel, der ordnungsgemäß gepatcht ist, um auf dem vielseitigen Board (das von QEMU unterstützt wird) ausgeführt zu werden. Das ist gut, aber der Kernel 3.x ist zu alt für einen modernen Raspbian. Grundsätzlich hätte Ihr letzter Ansatz funktionieren sollen.
Ich empfehle this aktualisiertes Handbuch (Februar 2017), ich habe es mit einem 4.4er Kernel getestet und es funktioniert sofort.
qemu-system-arm -kernel $KERNEL -cpu arm1176 -m 256 -M versatilepb -net nic,macaddr=$MAC -net tap -no-reboot -append "root=/dev/sda2 panic=1" -drive format=raw,file=$IMG
Ich musste die Option format=raw,file=$IMG
Verwenden, um eine QEMU-Warnung zu vermeiden.
Sie müssen /etc/fstab
Nicht auskommentieren, sondern können /etc/udev/rules.d/90-qemu.rules
Hinzufügen.
KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"
Außerdem ist das ld.so.preload-Ding alt und gilt nicht mehr
Das in diesem Handbuch bereitgestellte Skript erledigt all dies für Sie und ermöglicht den Netzwerkzugriff auf Ihren Raspbian, indem Sie Ihre Netzwerkschnittstelle für Raspbian freigeben.
Ubuntu 16.04-Host, QEMU 2.9.0-M raspi2, Raspbian 27.05.2016, Vanilla-Kernel
Vorteile:
-M raspi2
können wir den Vanilla-Kernel verwenden, damit das System repräsentativer istEinschränkungen:
-M raspi2
Wurde in QEMU 2.6.0 hinzugefügt, und Ubuntu 16.04 hat nur QEMU 2.5.0, daher müssen wir QEMU aus dem Quellcode kompilieren. Das ist aber nicht schwer.Schritte:
Kompilieren Sie QEMU 2.9.0 aus dem Quellcode:
Sudo apt-get build-dep qemu-system-arm
git clone --recursive git://git.qemu-project.org/qemu.git
cd qemu
git checkout v2.9.0
./configure
make `nproc`
Lade das Bild herunter und extrahiere den Kernel und dts daraus:
Lade das Bild herunter und entpacke es:
wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.Zip
unzip 2016-05-27-raspbian-jessie.Zip
Hängen Sie das zweite Image der Partition ein. Der einfachste Weg ist:
Sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
Dies funktioniert nur mit dem neuesten losetup
unter Ubuntu 16.04, andere Methoden unter: https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk) -device/496576 # 496576
Dies druckt eine Schleifenvorrichtung, z.
/dev/loop0
so machen wir es:
Sudo mkdir /mnt/rpi
Sudo mount /dev/loop0p1 /mnt/rpi
cp /mnt/rpi/kernel7.img bcm2709-rpi-2-b.dtb .
Sudo umount /mnt/rpi
Sudo losetup -d /dev/loop0
Lauf:
./arm-softmmu/qemu-system-arm \
-M raspi2 \
-append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" \
-cpu arm1176 \
-dtb bcm2709-rpi-2-b.dtb \
-sd 2016-05-27-raspbian-jessie.img \
-kernel kernel7.img \
-m 1G \
-smp 4 \
-serial stdio \
;
Sie können sich dann an dem Terminal anmelden, das auf Ihrem Host-Terminal angezeigt wird.
[fehlgeschlagen] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 2016-05-27, Vanilla-Kernel
Auf diesem neueren Ubuntu ist QEMU 2.8.0 der Standard, daher müssen wir QEMU nicht aus dem Quellcode für -M raspi2
Kompilieren. 2.8.0 hängt jedoch beim Booten nach der Meldung:
Console: switching to colour frame buffer device 100x30
Dies zeigt, wie instabil -M raspi2
Noch ist.
[fehlgeschlagen] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2017-08-16, Vanilla-Kernel
Auf diesem neueren Image kommt der Kernel nach der gleichen Methode für den 27.05.2016 beim Booten in Panik mit:
Please append a correct "root=" boot option; here are the available partitions:
...
[ 4.138114] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
bztsrc/raspi3-tutorial
RPI3 Bare Metal auf QEMU
https://github.com/bztsrc/raspi3-tutorial ist eine gute Sammlung von Beispielen, die nur mit QEMU funktionieren. Einstieg unter: https://raspberrypi.stackexchange.com)/questions/34733/how-to-do-qemu-emulation-für-bare-metal-himbeer-pi-bilder/85135 # 85135
Ich hatte ein ähnliches Problem mit einem benutzerdefinierten Ubuntu-Image. Ich habe auch die in der Antwort von @Michael Connors beschriebenen Änderungen vorgenommen. Dann wird das System gebootet.
Sie können Folgendes in -append=""
Hinzufügen, um zu sehen, was in Ihrem Fall passiert:
qemu-system-arm ... -serial stdio -append="... console=ttyAMA0,115200 loglevel=8"