Comment émuler Raspberry Pi Raspbian avec QEMU?

j'essaie d'imiter un Pi à la framboise avec L'OS à la framboise en utilisant QEMU. J'ai essayé plusieurs approches décrites sur internet, mais sans aucun succès.

j'ai compris que j'avais besoin de corriger un noyau Linux qui s'adapte au système d'exploitation désiré. Dans mon cas, J'ai choisi Rasbian Lite avec le noyau 4.4:

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

suivant je charge un noyau à partir de 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

maintenant cross compiler le noyau:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
cd linux-4.4.16
make vexpress_defconfig
make all
cd ..

Maintenant, Je peut copier l'image de démarrage, c'est-à-dire une image du noyau compressé qui s'extrait automatiquement en RAM, dans mon espace de travail:

cp linux-4.4.16/arch/arm/boot/zImage zImage

et lancer QEMU

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"

mais tout ce que je vois c'est une fenêtre qemu noire remplie. : (

je pense que le problème est d'obtenir le bon Noyau. Copier certains noyaux de L'Internet n'a jamais conduit à la réussite parce qu'ils ne sont pas adaptés pour L'OS.

Comment puis-je compiler/patcher un noyau qui s'adapte au système D'exploitation (sans télécharger un noyau existant)? un) et comment exécuter QEMU correctement?

Merci d'avance

Alex


2ème approche

je charge un kernel-qemu de là https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu?dl=0 et run QEMU avec:

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

ceci m'amène à la sortie suivante: enter image description here Et ça a du sens pour moi parce que le noyau est 3.10.25 et plus vieux que Jessie Raspabe avec le noyau 4.4.16.

avec le noyau qemu de 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

j'ai eu ce résultat similaire: enter image description here

Un nouvel essai avec un nouveau noyau-qemu 4.4.16:

  1. copier build-kernel-qemu de https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools et ajouter la ligne suivante à vérifiez la version pour le noyau 4.4.16:

    git checkout b05965f284db3e086022f4e318e46cb5bffb1376
    
  2. Exécuter build-kernel-qemu pour construire le noyau

    sh build-kernel-qemu
    
  3. Exécuter QEMU

    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
    

    Le résultat: enter image description here

19

4 réponses

vous devriez étendre le fichier D'Image Raspbian avant de commencer

montez le fichier D'Image Raspbian avec kpartx (peut-être les installer kpartx)

$ 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

Modifier /etc/fstab et commentez les montures MMCBLK

$ 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

Modifier /etc/ld..précharge et commentez les lignes ...

$ sudo nano etc/ld.so.preload

#/usr/lib/arm-linux-gnueabihf/libarmmem.so

Déconnecter et de détruire des boucles à partir de kpartx

$ sudo umount /mnt/img1
$ sudo kpartx -d your-image.img

Obtenir Qemu noyau correspondant à L'image Raspabe ici...

https://github.com/dhruvvyas90/qemu-rpi-kernel

j'ai utilisé cette commande pour réussir à imiter Raspbian Jessie

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
10
répondu Daddyfix 2016-08-24 22:00:42

vous avez besoin d'un noyau modifié pour fonctionner dans QEMU, car le matériel de la carte raspberry PI n'est pas disponible dans QEMU. C'est pourquoi votre première approche a échoué.

votre seconde approche utilise un noyau correctement corrigé pour fonctionner sur la carte polyvalente (supportée par QEMU), donc c'est bien, mais le noyau 3.x est trop vieux pour un Raspabe moderne. En principe, votre dernière approche aurait dû fonctionner.

je recommande mise à jour du guide (février 2017), je l'ai testé avec un noyau 4.4 et il fonctionne tout de suite.

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

j'ai eu à utiliser format=raw,file=$IMG option pour éviter un avertissement QEMU.

Vous n'avez pas besoin de commentaire /etc/fstab, vous pouvez ajouter à /etc/udev/rules.d/90-qemu.rules

KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"

en outre, La ld..précharge chose est vieux et ne s'applique plus

le script fourni sur le guide mentionné fait tout cela pour vous, et fournit également un accès réseau à votre raspbian en partageant votre interface réseau avec raspbian.

6
répondu nachoparker 2017-02-09 12:29:19

Ubuntu 16.04 host, QEMU 2.9.0-M raspi2, Raspbian 2016-05-27, vanilla kernel

enter image description here

les Avantages:

  • -M raspi2, on peut utiliser le noyau vanille, donc le système est plus représentatif

Limitations:

  • -M raspi2 a é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 dur.
  • l'interface graphique affiche mais ne répond pas à la souris / clavier, testé sur SDL et VNC. Mais CLI fonctionne parfaitement. Donc, vous pourriez aussi bien utiliser l'image Lite qui a go GUI pour le moment.
  • pas de réseau

Mesures:

  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écharger l'image et d'en extraire le noyau et dts:

    1. télécharger le l'image et le décompresser:

      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. La façon la plus simple est:

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

      cela ne fonctionne qu'avec les derniers losetup sur Ubuntu 16.04, autres méthodes à: https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      cela imprime un périphérique de boucle, par exemple:

      /dev/loop0
      

      donc nous faire:

      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. Exécuter:

    ./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 alors vous connecter sur le terminal qui affiche sur votre terminal hôte.

[échoué] Ubuntu 17.04, QEMU 2.8.0-M raspi2, Raspbian 2016-05-27, vanilla kernel

sur cette nouvelle Ubuntu, QEMU 2.8.0 est la valeur par défaut, nous n'avons donc pas besoin de compiler QEMU à partir des sources pour -M raspi2. Cependant, 2.8.0 est accroché au boot après le message:

Console: switching to colour frame buffer device 100x30

Cela montre comment instable -M raspi2 il l'est toujours.

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

sur cette nouvelle image, 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 RPI3 métal nu sur QEMU

https://github.com/bztsrc/raspi3-tutorial est un bon jeu de exemples qui ne fonctionnent que sur QEMU, ultraquick se lancer à: https://raspberrypi.stackexchange.com/questions/34733/how-to-do-qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135

4

j'ai eu un problème similaire avec une image ubuntu personnalisée. J'ai également appliqué les modifications décrites dans la réponse de @Michael Connors, puis je vois le système Démarrer.

-append="" pour voir ce qui se passe dans ton cas:

qemu-system-arm ... -serial stdio -append="... console=ttyAMA0,115200 loglevel=8"

3
répondu vfdev 2016-09-24 12:05:12