Impossible d'émuler Raspberry Pi à l'aide de Qemu: Kernel Panic

15

J'essaie de suivre divers guides sur Internet afin d'émuler Raspberry Pi sur ma machine Fedora 22. J'ai trouvé cette question: émuler raspbian avec QEMU et l'utiliser pour trouver kernel-qemu pour récupérer un noyau. J'ai téléchargé 2015-09-24-raspbian-jessie.imgdes bonnes personnes sur Raspberry Pi.

Lorsque j'essaie de lancer, qemu-system-armje ressens une panique du noyau. Y a-t-il quelque chose qui me manque?

Voici la qemu-system-armligne de commande que j'ai tapée:

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

Suivi des messages du noyau:

sd 0:0:0:0: [sda] Attached SCSI disk
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <[email protected]>
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)
Mike S
la source
2
Avez-vous essayé d'émuler une image sifflante? Si le noyau fonctionne avec, il doit être Jessie.
dhruvvyas90
Oh, duh! Oui, quand le noyau ne correspond pas à l'img, les choses se cassent! L'image sifflante fonctionne ... Merci.
Mike S
version du
guide

Réponses:

4

Comme l'a dit @dastaan, la version du noyau doit correspondre au fichier img. J'essayais d'utiliser un fichier image de version du noyau 4.1 avec un noyau 3.18.

Maintenant que j'utilise l'image appropriée, cela fonctionne.

Merci!

Edit: Pour que cela fonctionne, c'est assez simple: prenez l'image à partir de https://github.com/dhruvvyas90/qemu-rpi-kernel/ , puis téléchargez l'image Raspian correspondante que vous souhaitez sur https://www.raspberrypi.org/ téléchargements / raspbian / . Actuellement, Jessie et Wheezy sont en place aux deux endroits, mais il n'y a aucune garantie à l'avenir que le noyau approprié sera disponible sur ce site Github. Quoi qu'il en soit, je n'ai pas été aussi impressionné par la vitesse moi-même, donc je cherche à mettre un vrai Pi sur le port réseau filaire de mon ordinateur portable et à l'alimenter via une batterie auxiliaire de 5200 mAh pour téléphone portable, et à utiliser VNC sur l'ordinateur portable comme un écran.

Je n'ai pas fait travailler Jessie; c'était le problème - j'avais un noyau Wheezy et une image Jessie, mais je n'avais pas de noyau Jessie.

Mike S
la source
1
Pouvez-vous ajouter une réponse détaillée sur la façon dont vous l'avez résolu en utilisant le dernier noyau? Cela aidera les autres utilisateurs à essayer d'émuler Jessie. Merci.
dhruvvyas90
3
J'ai essayé un noyau jessie et une image jessie et ils échouent avec la même erreur. Un noyau 4.1 ( github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/… ) et la publication régulière de Jessie après mai 2015 de Raspbian.
Michael McGarrah
Aucune infraction, mais il n'y a pas de noyau jessie. Avec le netinstaller raspbian, vous pouvez choisir d'installer Wheezy ou Jessie et dans les deux cas, le même noyau est installé.
Diederik de Haas
Bien qu'il soit vrai que les noyaux sont nommés par version, mon problème n'était pas de savoir comment télécharger le netinstaller raspbian. Mon problème était de faire correspondre les fichiers image des bonnes personnes de Raspberry Pi avec une bonne version du noyau. À l'avenir, j'espère que les gens qui se heurteront à cette question regarderont mes messages d'erreur et se rendront compte de leur problème.
Mike S
@MichaelMcGarrah l'a fait fonctionner après avoir lu le wiki de ce dépôt: raspberrypi.stackexchange.com/a/53993/33424 Vous devez modifier un peu l'image Raspbian.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1

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

entrez la description de l'image ici

Pas:

  1. Compilez QEMU 2.9.0 à partir de la source:

    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. Téléchargez l'image et extrayez-y le noyau et les dts:

    1. Téléchargez l'image et décompressez-la:

      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. Montez la deuxième image de la partition. Le moyen le plus simple est:

      sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
      

      Cela ne fonctionne qu'avec la dernière version losetupd'Ubuntu 16.04, d'autres méthodes sur: /ubuntu/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Ceci imprime un périphérique en boucle, par exemple:

      /dev/loop0
      

      nous faisons donc:

      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. Courir:

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

Vous pouvez ensuite vous connecter sur le terminal qui s'affiche sur votre terminal hôte.

Limitations actuelles:

  • -M raspi2a été ajouté dans QEMU 2.6.0, et Ubuntu 16.04 n'a que QEMU 2.5.0, nous devons donc compiler QEMU à partir de la source. Mais ce n'est pas difficile.
  • l'interface graphique affiche mais ne répond pas à la souris / clavier, testé sur SDL et VNC. Mais CLI fonctionne parfaitement cependant. Donc, vous pourriez aussi bien utiliser l'image Lite qui a maintenant une interface graphique.
  • pas de réseautage

Ubuntu 16.04, QEMU 2.5.0, Raspbian 2016-05-27, noyau modifié

Cette méthode utilise -M versatilepbce qui est présent sur la QEMU 2.5.0 d'Ubuntu 16.04.

L'inconvénient est que vous devez télécharger un noyau modifié (voir Émuler avec Qemu: pourquoi le noyau supplémentaire? ), Et modifier l'image, de sorte qu'elle soit moins représentative du système réel.

  1. Téléchargement: https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/36ede073f4ccb64f60200ede36c231afe9502070/kernel-qemu-4.4.12-jessie

    Nous choisissons 4.4.12puisque c'est la version du noyau dans l'image Raspbian.

    Le processus pour générer cet objet blob du noyau est décrit dans le référentiel à l' adresse : https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    Pourquoi cette image de noyau supplémentaire est-elle nécessaire? Émuler avec Qemu: pourquoi le noyau supplémentaire?

  2. Modifiez l'image Raspbian comme mentionné sur: https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    Sommaire:

    1. Montez l'image comme nous l'avons fait pour le -M raspi2, mais utilisez la deuxième partition au lieu de la première:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. Modifiez l'image:

      # 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. Courir:

    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
    

[Échec] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 2016-05-27, noyau vanilla

Sur ce Ubuntu plus récent, QEMU 2.8.0 est la valeur par défaut, nous n'avons donc pas besoin de compiler QEMU à partir de la source pour -M raspi2. Cependant, 2.8.0 se bloque au démarrage après le message:

Console: switching to colour frame buffer device 100x30

Cela montre à quel point -M raspi2encore instable .

[Échec] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2017-08-16, vanilla kernel

Sur cette image plus récente, en utilisant la même méthode pour 2016-05-27, le noyau panique au démarrage avec:

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 Métal nu RPI3 sur QEMU

https://github.com/bztsrc/raspi3-tutorial est un bon ensemble d'exemples qui fonctionnent uniquement sur QEMU, ultra rapide pour commencer: Comment faire une émulation QEMU pour des images de Raspberry Pi en métal nu

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
la source
Votre méthode avec losetupest trop compliquée. Vous pouvez à la place simplement utiliser fdisk -l your-image.img, puis utiliser le décalage de la partition en mountoption -o loop,offset=$((512*YOUR_OFFSET)).
Ruslan
-M raspi2 ne fonctionne pas
zhaofeng-shu33
0

La plupart des guides sont obsolètes et contiennent des liens brisés. Vous devez utiliser un noyau corrigé qui correspond à la version raspbian que vous utilisez.

Le guide suivant fonctionne à partir de février 2017. Il comprend un script qui prend en charge la modification de l'image de raspbian pour une exécution sur QEMU et partage également votre connexion réseau avec raspbian automatiquement.

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

nachoparker
la source
-1

Vous pouvez télécharger mon noyau personnalisé (4.1.7) pour Raspbian Jessie sur mon github, polaco1782 . Suivez les instructions sur les fichiers doc.

Cassiano Martin
la source
1
Votre noyau m'envoie en mode d'urgence chaque fois que j'essaie d'émuler. J'ai fait comme il est écrit dans le fichier Lisez-moi. (Voir le dernier message sur -> raspberrypi.org/forums/viewtopic.php?t=112259 ) Pouvez-vous modifier votre réponse pour montrer étape par étape ce que vous avez changé dans l'image de base de Jessie pour le faire fonctionner. Il sera utile aux autres utilisateurs car maintenant que jessie image est en direct, de plus en plus d'utilisateurs vont émuler jessie sur qemu. Merci d'avance.
dhruvvyas90
Pouvez-vous développer votre réponse pour expliquer ce qui est personnalisé à propos de votre noyau?
Greenonline
J'ai pu résoudre mon problème en commentant les fstabentrées mmcblk.
dhruvvyas90
@Greenonline Puisque qemu ne prend pas en charge la plate-forme Rpi, un ajustement de configuration du noyau est nécessaire pour émuler rpi sur Qemu. Vous ne pouvez pas simplement prendre le noyau Rpi et le faire fonctionner hors de la boîte.
dhruvvyas90