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: 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:
Un nouvel essai avec un nouveau noyau-qemu 4.4.16:
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
Exécuter
build-kernel-qemu
pour construire le noyaush build-kernel-qemu
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
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
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.
Ubuntu 16.04 host, QEMU 2.9.0-M raspi2, Raspbian 2016-05-27, vanilla kernel
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:
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écharger l'image et d'en extraire le noyau et dts:
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
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#496576cela 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
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
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"