Voici quelques notes sur comment émuler un RaspberryPi sur un linux "classique". Ca peut-être intéressant pour préparer/configurer une image pour un Raspberry quand on n’en a pas un sous la main.
Installer QEmu
C'est QEmu qui va faire le job de virtualisation. Tout simple à installer sous Ubuntu (pour les autres distribs je vous laisse vous débrouiller):
$ sudo apt-get install qemu-system-arm
Préparer une image de Raspbian (ici minibianpi)
Seconde étape : télécharger et légèrement modifier une image Rasbian. J'utilise Minibian qui est une version light de raspbian (pas de serveur X, vraiment le minimal, sachant que tout est installable ensuite à coup d'apt-get
).
Pour télécharger la dernière version, c'est par ici: https://minibianpi.wordpress.com/download/
Il faut ensuite faire quelques changements dans l'image. Le plus simple est de la monter dans le système de fichier. Comme l'image contient deux partitions, il faut préciser un offset
à la commande mount
. Voici la méthode (source).
On commence par repérer quelles sont les partitions et où elles démarrent:
$ fdisk -l 2015-11-12-jessie-minibian.img
Disque 2015-11-12-jessie-minibian.img : 832 Mo, 832569344 octets
255 têtes, 63 secteurs/piste, 101 cylindres, total 1626112 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Identifiant de disque : 0x00000000
Périphérique Amorçage Début Fin Blocs Id. Système
2015-11-12-jessie-minibian.img1 16 125055 62520 b W95 FAT32
2015-11-12-jessie-minibian.img2 125056 1626112 750528+ 83 Linux
La partition qui nous intéresse ici est la seconde (2015-11-12-jessie-minibian.img2
), c'est la partition principale. Elle démarre sur le secteur 125056
.
Une fois que l'on a cette info, voici la commande pour la monter:
$ mkdir minibian
$ sudo mount -v -o offset=$((512*125056)) -t ext4 2015-11-12-jessie-minibian.img ./rasbian/
On peut ensuite aller modifier l'image. La seule chose a faire avec minibian est de commenter tout ce qu'il y a des etc/fstab
. Avec vim ou n'importe quel éditeur de texte, on ajoute un #
devant les deux lignes:
#/dev/mmcblk0p1 /boot vfat defaults 0 2
#/dev/mmcblk0p2 / ext4 errors=remount-ro,noatime,nodiratime,commit=120 0 1
En effet, sur la carte SD est sur /dev/mmcblk0p*
sur un Raspberry Pi, hors avec QEmu l'image va être en /dev/sda
. Il suffit de commenter ces deux lignes.
Kernel modifié, et boot de la VM raspbian
Une fois que l'on a télécharger et modifier une image rasbian/minibian et installer QEmu, il ne nous manque plus qu'un noyau compiler pour tourner avec QEmu. Le plus simple est de le télécharger depuis le dépôt github [polaco1782/raspberry-qemu]:
$ wget https://github.com/polaco1782/raspberry-qemu/raw/master/kernel-qemu
Note: le dépôt contient un sh qui permet de compiler ce noyau, je vous laisse aller voir si le coeur vous en dit !
Une fois que l'on a tout ça, il suffit de lancer QEmu:
$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -hda 2015-11-12-jessie-minibian.img -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw"
Atention par défaut le clavier est configurer en Qwerty, il faut donc taper rqspberry
sur un clavier Azerty pour avoir le bon mot de passe (le mot de passe par défaut c'est : raspberry
). Voir plus bas pour configurer un claver Azerty.
À noter aussi les performances de QEmu ne sont pas extraordinaires... et le rPi virtuel tourne moins vite qu'un physique, même sur un host puissant ! Aussi la RAM est limitée à 256Mo sur la VM... Bref c'est pratique pour préparer des images sans rPi sous la main, mais gère plus.
Configurer le réseau
La VM raspbian a par défaut une connexion internet qui tourne, malgré que l'ICMP ne marche pas (i.e. le ping, attention ça peut être piège !). Voir la doc de QEMU.
Se connecter en SSH depuis le host
Le plus simple est d'ajouter une redirection de port du localhost:2200
du host vers le 22
de la VM. Ca se fait en ajoutant -redir tcp:2200::22
à la commande:
$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -hda 2015-11-12-jessie-minibian.img -append "root=/dev/sda2 rootfstype=ext4 rw" -redir tcp:2200::22
Et ensuite sur le host:
$ ssh rooþ@localhost -p 2200
Configurer le clavier par défaut (en Azerty)
Sur la VM:
# apt-get install console-data
Ou si déjà installer:
# dpkg-reconfigure console-data
Et suivre les instructions : select keymap from fullist
et choisir "pc / azerty / French / Same as X11 (latin 9) / Standard
".
De la VM au Raspberry Pi physique
Une fois que l'on a configuré son image minibian
avec une VM QEmu, il est possible de faire tourner cette image sur un Raspberry Py bien réel et physique !
Il suffit de bien dé-commenter les deux lignes de etc/fstab
et ensuite de copier le .img vers une carte micro SD :
$ sudo dd bs=4M if=~/2015-11-12-jessie-minibian.img of=/dev/sdd
(attention à bien vérifier que la carte SD est en /dev/sdd
!)
Ensuite on met la SD dans le Raspberry Pi et on le branche... et ça doit tourner !
À noter: il est possible de faire l'inverse ensuite, c'est-à-dire de prendre la carte SD d'un Raspberry Pi et de faire tourner une VM à partir de ce système.
Sources
Voici quelques liens vers des tutos qui m'ont guidé:
- https://web.archive.org/web/20131210001526/http://xecdesign.com/qemu-emulating-raspberry-pi-the-easy-way/
- https://github.com/polaco1782/raspberry-qemu
- https://www.bentasker.co.uk/documentation/linux/267-testing-raspberry-pi-images-with-qemu
- http://sentryytech.blogspot.fr/2013/02/faster-compiling-on-emulated-raspberry.html