Emuler la Raspbian avec Qemu

Raspberry logoJe m’intéresse de plus en plus au Raspberry et je franchirai peut-être le pas de l’achat dans quelque temps. J’ai voulu voir à quoi ressemble sa distribution principale Raspbian (basée sur Debian) en l’émulant sous Qemu. Je me suis basé sur le tutorial pointé par beaucoup de gens dans les forums et j’ai effectué des recherches annexes pour résoudre certains problèmes : taille des partitions, gestion de la souris sous Qemu. Ce qui suit est le résultat de mes manipulations pour émuler Raspbian avec Qemu depuis une distribution GNU/Linux 64 bits.

En pré-requis, on suppose que Qemu est installé sur le système hôte. On vérifie que le processeur ARM du Raspberry est supporté par Qemu avec la commande suivante :

$ qemu-system-arm -cpu ?

Le résultat liste les types de processeur supportés. On s’assure que arm1176 est mentionné.

Installation de base

On se crée un répertoire de travail dans lequel on va télécharger les fichiers nécessaires :

La modification d’un fichier est nécessaire pour que la distribution fonctionne avec Qemu. On effectue donc un premier démarrage particulier avec BASH en processus INIT pour la réaliser.

$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2014-06-20-wheezy-raspbian.img

Quand Qemu a démarré BASH on modifie le fichier /etc/ld.so.preload

$ nano /etc/ld.so.preload

On commente la première ligne du fichier :

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

On sauvegarde (CTRL-X avec nano) et on arrête l’émulation

exit

A ce stade, l’émulation Raspbian sous Qemu est fonctionnelle et on peut faire un vrai démarrage avec la commande :

$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-06-20-wheezy-raspbian.img

Elargir la partition

Il ne reste pas beaucoup d’espace disque sur la partition root. On peut élargir la partition, sinon on ne pourra même pas mettre à jour Raspbian avec apt-get. Cela nécessite plusieurs étapes.

D’abord on élargit le disque avec l’utilitaire qemu-resize.

$ qemu-img resize 2014-06-20-wheezy-raspbian.img +2G

Ensuite on démarre la Raspbian avec Qemu

$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-06-20-wheezy-raspbian.img

On se connecte au Raspberry avec l’utilisateur pi et le mot de passe raspberry. Attention si on se connecte depuis la fenêtre Qemu, le clavier est probablement configuré en QWERTY.

On lancer l’utilitaire fdisk pour modifier les partitions

$ fdisk /dev/sda
  • supprimer la partition 2 qui commence à l’offset 122880 : commande d puis indiquer la partition 2
  • recréer une partition 2 qui commence à l’offset 122880 et utilise la totalité du disque : commande n
  • sauvegarder les modifications : commande w
  • arrêter le système avec la commande reboot.

On démarre à nouveau la Raspbian avec Qemu et on lance la commande resize2fs pour élargir la partition 2 :

$ resize2fs /dev/sda2
$ reboot

Augmenter la résolution sous X

Par défaut, on a une résolution en 640x480 quand on lance LXDE avec startx. On peut monter en 800x600 en créant un fichier xorg.conf.

# sudo nano /etc/X11/xorg.conf

Ajouter ces lignes dans le fichier :

Section "Screen"
Identifier "Default Screen"
SubSection "Display"
Depth 16
Modes "800x600" "640x480"
EndSubSection
EndSection

Sauvegarde et redémarrer X pour voir le résultat.

Déplacements erratiques de la souris

J’ai été confronté à ce problème lié à la configuration de Qemu. La souris se fige ou certaines portions de l’écrans deviennent inaccessibles. je l’ai résolu en lançant Qemu ainsi :

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -usbdevice tablet -display sdl -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-06-20-wheezy-raspbian.img

Notez le paramètre -usbdevice tablet et -display sdl.

Conclusion

L’émulation Qemu permet de se faire une bonne idée de la distribution. Bien sûr, ce n’est pas complètement fonctionnel car certains périphériques spécifiques au Raspberry ne sont pas présent (je pense aux entrées / sortie, au port HDMI) mais cela permet déjà beaucoup.

Pita - 2014-08-12 20:59:52

Ne réfléchis plus trop et fonce en acheter en un! Je viens à peine d’acquérir le miens il y a 3 jours, en version B+ notamment et vraiment aucuns regrets! Elle est géniale cette board.

Note que si tu as des cartes SD standars en épargne et que tu espèrais les utiliser, prends alors la version B du RaspBerry Pi et non la B+ qui vient de sortir et propose qui un socket microSD.

Merci pour le tuto!

orx57 - 2014-08-13 07:30:59

Article parfait qui tombe à point le jour où je me pose la question ;) Bien que j’avais vu l’article et les commentaires sur http://xecdesign.com. Manque juste un petit chapitre pour sur la redirection de port ou la configuration d’un bridge réseau avec qemu… :)

chrishom - 2016-05-30 11:28:32

Bonjour très bien votre tuto bien que chez moi cela ne fonctionne pas dommage tous les liens que vous mettez dedans sont obsolètes, le site xecdesign ne répond plus

chrishom - 2016-05-30 11:30:33

Donc cela ne marche pas, il faut dire que QEMU n’est pas vraiment conviviale; vous avez écris :“On vérifie que le processeur ARM du Raspberry est supporté par Qemu” cela veut dire quoi ? je suis sur une machine AMD64, la commande qemu-system-arm -cpu help ne renvoie rien ! est-ce normal ?

Yax - 2016-05-30 11:42:36

@chrishom L’article a deux ans et QEMU a évolué. La commande qemu-system-arm demande de préciser une machine cible :

# qemu-system-arm -machine virt -cpu ?

Votre commentaire
Le site Web est optionel
Le message peut être rédigé au format Markdown