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
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: 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:
Un nouvel essai avec un nouveau kernel-qemu 4.4.16:
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
Courir build-kernel-qemu
pour construire le noyau
sh build-kernel-qemu
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
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
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.
Hôte Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2016-05-27, Vanilla kernel
Avantages:
-M raspi2
, nous pouvons utiliser le noyau Vanilla, donc le système est plus représentatifLimites:
-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.Pas:
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`
Téléchargez l'image et extrayez-y le noyau et les dts:
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
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
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"