web-dev-qa-db-fra.com

Comment émuler Raspberry Pi Raspbian avec QEMU?

J'essaie d'émuler un Raspberry Pi avec le Raspian OS en utilisant QEMU. J'ai essayé plusieurs approches décrites sur Internet mais sans succès.

J'ai compris que je devais patcher un noyau Linux adapté au système d'exploitation souhaité. Dans mon cas, j'ai choisi Rasbian Lite avec Kernel 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

Ensuite, je charge un noyau 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, compilez le noyau:

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

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

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

et exécutez 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 remplie de noir. :(

Je pense que le problème est d'obtenir le bon noyau. La copie de certains noyaux à partir d'Internet n'a jamais abouti car ils ne sont pas adaptés au système d'exploitation.

Comment puis-je créer/patcher un noyau adapté au système d'exploitation (sans en télécharger un existant) et comment exécuter QEMU correctement?

Merci d'avance
Alex


2ème approche

Je charge un kernel-qemu d'ici https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu?dl= et exécutez [~ # ~] 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

Cela m'apporte la sortie suivante: enter image description here Et cela a du sens pour moi car le noyau est 3.10.25 et plus ancien que Raspbian Jessie 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 obtenu ce résultat similaire: enter image description here

Un nouvel essai avec un nouveau kernel-qemu 4.4.16:

  1. Copiez build-kernel-qemu depuis https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools et ajoutez la ligne suivante pour extraire la version du noyau 4.4.16:

    git checkout b05965f284db3e086022f4e318e46cb5bffb1376
    
  2. Courir build-kernel-qemu pour construire le noyau

    sh build-kernel-qemu
    
  3. Exécutez [~ # ~] 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

22
Alex44

Vous devez développer le fichier image Raspbian avant de commencer

Montez le fichier image Raspbian avec kpartx (il faudra peut-être 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

Modifiez le /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

Modifiez /etc/ld.so.preload et commentez les lignes ...

$ Sudo nano etc/ld.so.preload

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

Démontez et détruisez les boucles de kpartx

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

Obtenez le noyau Qemu correspondant à l'image Raspbian ici ...

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

J'ai utilisé cette commande pour émuler avec succès 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
12
Daddyfix

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 deuxième approche utilise un noyau correctement corrigé pour fonctionner sur la carte polyvalente (prise en charge par QEMU), ce qui est bien, mais le noyau 3.x est trop ancien pour un Raspbian moderne. En principe, votre dernière approche aurait dû fonctionner.

Je recommande this guide mis à jour (fév 2017), je l'ai testé avec un noyau 4.4 et ça marche 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

Je devais utiliser format=raw,file=$IMG option pour éviter un avertissement QEMU.

Vous n'avez pas besoin de commenter /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"

De plus, la chose ld.so.preload est ancienne et ne s'applique plus

Le script fourni dans 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.

7
nachoparker

Hôte Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2016-05-27, Vanilla kernel

enter image description here

Avantages:

  • avec -M raspi2, nous pouvons utiliser le noyau Vanilla, donc le système est plus représentatif

Limites:

  • -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 difficile.
  • l'interface graphique affiche mais ne répond pas à la souris/clavier, testé à la fois sur SDL et VNC. Mais CLI fonctionne parfaitement cependant. Donc, vous pourriez tout aussi bien utiliser l'image Lite qui a maintenant une interface graphique.
  • pas de réseautage

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 losetup sur Ubuntu 16.04, d'autres méthodes sur: https://askubuntu.com/questions/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.

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

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 instable -M raspi2 est encore.

[é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, ultraquick pour commencer à: https://raspberrypi.stackexchange.com/questions/34733/comment-faire-qemu-emulation-pour-des-images-raspberry-metal-nues/85135 # 85135

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 démarrage du système.

Vous pouvez ajouter ce qui suit dans -append="" pour voir ce qui se passe dans votre cas:

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

3
vfdev