wake-up-neo.net

Wie kann man Raspberry Pi Raspbian mit QEMU emulieren?

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


2. Ansatz

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: enter image description here 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: enter image description here

Ein neuer Versuch mit einem neuen Kernel-Qemu 4.4.16:

  1. 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
    
  2. Lauf build-kernel-qemu um den Kernel zu bauen

    sh build-kernel-qemu
    
  3. 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
    

    Das Ergebnis: enter image description here

22
Alex44

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
12
Daddyfix

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.

7
nachoparker

Ubuntu 16.04-Host, QEMU 2.9.0-M raspi2, Raspbian 27.05.2016, Vanilla-Kernel

enter image description here

Vorteile:

  • mit -M raspi2 können wir den Vanilla-Kernel verwenden, damit das System repräsentativer ist

Einschrä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.
  • die GUI zeigt an, reagiert aber nicht auf die Maus/Tastatur, die sowohl auf SDL als auch auf VNC getestet wurde. CLI funktioniert jedoch einwandfrei. Sie können also auch das Lite-Image verwenden, das für den Moment als GUI fungiert.
  • keine Vernetzung

Schritte:

  1. 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`
    
  2. Lade das Bild herunter und extrahiere den Kernel und dts daraus:

    1. 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
      
    2. 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
      
  3. 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"

3
vfdev