Raspberry Pi kann nicht mit Qemu: Kernel Panic emuliert werden


15

Ich versuche, verschiedenen Anleitungen im Internet zu folgen, um Raspberry Pi auf meinem Fedora 22-Computer zu emulieren. Ich habe diese Frage gefunden: Raspbian mit QEMU emulieren und damit Kernel-Qemu finden , um einen Kernel zu finden. Ich habe 2015-09-24-raspbian-jessie.imgvon den guten Leuten bei Raspberry Pi heruntergeladen .

Wenn ich versuche zu rennen, qemu-system-armbekomme ich eine Kernel-Panik. Fehlt mir etwas?

Hier ist die qemu-system-armBefehlszeile, die ich eingegeben habe:

qemu-system-arm -cpu arm1176 -m 256 -M versatilepb -no-reboot -nographic -kernel kernel-qemu -appc=2 console=ttyAMA0 rw" -hda 2015-09-24-raspbian-jessie.img -net nic -net user,hostfwd=tcp::9999-:22

Gefolgt von den Kernelnachrichten:

sd 0:0:0:0: [sda] Attached SCSI disk
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@fluxnic.net>
eth0: SMC91C11xFD (rev 1) at d089a000 IRQ 25 [nowait]
eth0: Ethernet addr: 52:54:00:12:34:56
mousedev: PS/2 mouse device common for all mice
TCP cubic registered
NET: Registered protocol family 17
input: AT Raw Set 2 keyboard as /devices/fpga:06/serio0/input/input0
input: ImExPS/2 Generic Explorer Mouse as /devices/fpga:07/serio1/input/input1
EXT2-fs (sda2): error: couldn't mount because of unsupported optional features (244)
EXT4-fs (sda2): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (sda2): recovery complete
EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) on device 8:2.
devtmpfs: mounted
Freeing init memory: 120K
Kernel panic - not syncing: Attempted to kill init!
[<c0032bec>] (unwind_backtrace+0x0/0xf0) from [<c03064dc>] (panic+0x58/0x170)
[<c03064dc>] (panic+0x58/0x170) from [<c0044054>] (do_exit+0x5d0/0x68c)
[<c0044054>] (do_exit+0x5d0/0x68c) from [<c004435c>] (do_group_exit+0x40/0xb0)
[<c004435c>] (do_group_exit+0x40/0xb0) from [<c004ed48>] (get_signal_to_deliver+0x1a8/0x378)
[<c004ed48>] (get_signal_to_deliver+0x1a8/0x378) from [<c002f124>] (do_signal+0x90/0x518)
[<c002f124>] (do_signal+0x90/0x518) from [<c002fa64>] (do_notify_resume+0x48/0x54)
[<c002fa64>] (do_notify_resume+0x48/0x54) from [<c002cc38>] (work_pending+0x24/0x28)

2
Haben Sie versucht, ein keuchendes Bild zu emulieren? Wenn der Kernel damit arbeitet, muss es Jessie sein.
Dhruvvyas90

Oh, duh! Ja, wenn der Kernel nicht mit dem Bild übereinstimmt, brechen die Dinge! Das keuchende Bild funktioniert ... Danke.
Mike S

Antworten:


4

Wie @dastaan ​​sagte, muss die Kernel-Version mit der img-Datei übereinstimmen. Ich habe versucht, eine 4.1-Kernel-Image-Datei mit einem 3.18-Kernel zu verwenden.

Jetzt, wo ich das richtige Bild verwende, funktioniert es.

Vielen Dank!

Bearbeiten: Es ist ziemlich einfach, dies zum Laufen zu bringen: Holen Sie sich das Bild von https://github.com/dhruvvyas90/qemu-rpi-kernel/ und laden Sie das entsprechende Raspian-Bild, das Sie möchten, unter https://www.raspberrypi.org/ herunter. downloads / raspbian / . Derzeit sind Jessie und Wheezy an beiden Orten aktiv, es gibt jedoch keine Garantie dafür, dass der entsprechende Kernel in Zukunft auf dieser Github-Site verfügbar sein wird. Auf jeden Fall war ich selbst nicht so beeindruckt von der Geschwindigkeit, also versuche ich, einen echten Pi auf den kabelgebundenen Netzwerkanschluss meines Laptops zu stecken und ihn über einen 5200-mAh-Handy-Zusatzakku mit VNC auf dem Laptop zu betreiben ein Bildschirm.

Ich habe Jessie nicht zur Arbeit gebracht. Das war das Problem. Ich hatte einen Wheezy-Kernel und ein Jessie-Image, aber keinen Jessie-Kernel.


1
Können Sie eine detaillierte Antwort hinzufügen, wie Sie diese mit dem neuesten Kernel gelöst haben? Es wird anderen Benutzern helfen, die versuchen, Jessie zu emulieren. Vielen Dank.
Dhruvvyas90

3
Ich habe einen Jessie-Kernel und ein Jessie-Image ausprobiert und sie schlagen mit demselben Fehler fehl. Einen 4.1-Kernel ( github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/… ) und den regulären Jessie-Post vom Mai 2015 von Raspbian.
Michael McGarrah

Nichts für ungut, aber es gibt keinen Jessie-Kernel. Mit dem raspbian netinstaller können Sie wählen, ob Sie wheezy oder jessie installieren möchten. In beiden Fällen wird genau derselbe Kernel installiert.
Diederik de Haas

Obwohl es stimmt, dass die Kernel nach Version benannt sind, war mein Problem nicht, wie ich den raspbian netinstaller herunterlade. Mein Problem bestand darin, die Image-Dateien der guten Leute von Raspberry Pi mit einer richtigen Kernel-Version abzugleichen. In Zukunft hoffe ich, dass Leute, die auf diese Frage stoßen, sich meine Fehlermeldungen ansehen und erkennen, was für ein Problem sie haben.
Mike S

@MichaelMcGarrah hat es geschafft, nachdem er das Wiki dieses Repos gelesen hat: raspberrypi.stackexchange.com/a/53993/33424 Sie müssen das Raspbian-Image ein wenig optimieren.
Ciro Santilli


0

Die meisten Anleitungen sind veraltet und enthalten fehlerhafte Links. Sie müssen einen gepatchten Kernel verwenden, der der von Ihnen verwendeten Raspbian-Version entspricht.

Das folgende Handbuch ist ab Februar 2017 verfügbar. Es enthält ein Skript, mit dem das Raspbian-Image für die Ausführung unter QEMU geändert und Ihre Netzwerkverbindung automatisch für Raspbian freigegeben wird.

https://ownyourbits.com/2017/02/06/raspbian-on-qemu-with-network-access/


0

Ubuntu 16.04, QEMU 2.9.0-M raspi2, Raspbian 2016-05-27, Vanillekern

Bildbeschreibung hier eingeben

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 losetupUbuntu 16.04, andere Methoden finden Sie unter: /ubuntu/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Dies druckt ein Loop-Gerät, zB:

      /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.

Aktuelle Einschränkungen:

  • -M raspi2wurde 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 genauso gut das Lite-Image verwenden, das für den Moment als GUI fungiert.
  • keine Vernetzung

Ubuntu 16.04, QEMU 2.5.0, Raspbian 2016-05-27, geänderter Kernel

Diese Methode verwendet -M versatilepbdie auf der QEMU 2.5.0 von Ubuntu 16.04 vorhandene.

Der Nachteil ist, dass Sie einen modifizierten Kernel herunterladen müssen (siehe Emulieren mit Qemu: Warum der zusätzliche Kernel? ) Und das Image modifizieren müssen, damit es weniger repräsentativ für das reale System ist.

  1. Download: https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/36ede073f4ccb64f60200ede36c231afe9502070/kernel-qemu-4.4.12-jessie

    Wir wählen, 4.4.12da dies die Kernel-Version im Raspbian-Image ist.

    Der Prozess zum Generieren dieses Kernel-Blobs ist im Repository unter https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools beschrieben

    Warum wird dieses zusätzliche Kernel-Image benötigt: Emulieren mit Qemu: Warum der zusätzliche Kernel?

  2. Ändern Sie das Raspbian-Image wie folgt: https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    Zusammenfassung:

    1. Hängen Sie das Image genauso ein, wie wir es für das getan haben -M raspi2, verwenden Sie jedoch die zweite Partition anstelle der ersten:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. Bearbeiten Sie das Bild:

      # Comment out the line present there with #
      sudo vim /mnt/rpi/etc/ld.so.preload
      # Comment out the lines of type: "/dev/mmcblk*"
      sudo vim /mnt/rpi/etc/fstab
      
  3. Lauf:

    sudo apt-get install qemu-system-arm
    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" \
        -hda 2016-05-27-raspbian-jessie.img
    

[fehlgeschlagen] Ubuntu 17.04, QEMU 2.8.0-M raspi2, Raspbian 2016-05-27, Vanillekernel

Auf diesem neueren Ubuntu ist QEMU 2.8.0 der Standard, daher müssen wir QEMU nicht aus dem Quellcode für kompilieren -M raspi2. 2.8.0 hängt jedoch beim Booten nach der Meldung:

Console: switching to colour frame buffer device 100x30

Dies zeigt, wie instabil -M raspi2noch ist.

[fehlgeschlagen] Ubuntu 16.04, QEMU 2.9.0-M raspi2, Raspbian 2017-08-16, Vanillekernel

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. Eine schnelle Einführung finden Sie unter: Vorgehensweise bei der QEMU-Emulation für Bare-Metal-Raspberry-Pi-Images


Ihre Methode mit losetupist zu kompliziert. Sie können stattdessen einfach die Option " fdisk -l your-image.imgVersatz zur Partition in" verwenden und dann verwenden . mount-o loop,offset=$((512*YOUR_OFFSET))
Ruslan

-M raspi2 funktioniert nicht
Zhaofeng-Shu33

-1

Sie können meinen benutzerdefinierten Kernel (4.1.7) für Raspbian Jessie auf meinem Github polaco1782 herunterladen . Befolgen Sie die Anweisungen in den Dokumentdateien.


1
Ihr Kernel sendet mich bei jedem Emulationsversuch in den Notfallmodus. Ich habe getan, wie es in Read Me File steht. (Siehe letzter Beitrag auf -> raspberrypi.org/forums/viewtopic.php?t=112259 ) Können Sie Ihre Antwort bearbeiten, um Schritt für Schritt zu zeigen, was Sie im grundlegenden Jessie-Image geändert haben, damit es funktioniert? Es wird für andere Benutzer praktisch sein, da jetzt, da das Jessie-Image live ist, immer mehr Benutzer Jessie auf QEMU emulieren werden. Danke im Voraus.
Dhruvvyas90

Können Sie Ihre Antwort erweitern, um zu erklären, was an Ihrem Kernel üblich ist?
Greenonline

Ich konnte mein Problem durch Kommentieren von fstabmmcblk-Einträgen lösen .
Dhruvvyas90

@Greenonline Da qemu die RPI-Plattform nicht unterstützt, ist eine Optimierung der Kernelkonfiguration erforderlich, um RPI auf Qemu zu emulieren. Sie können nicht einfach den RPI-Kernel nehmen und ihn sofort zum Laufen bringen.
Dhruvvyas90
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.