• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 23/12/2019

Recompilez votre noyau pour QEMU

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Cross-compilez son noyau pour Raspberry PI

Dans la partie précédente, vous avez exécuté une ancienne version de Raspbian car le noyau disponible, qui est compatible avec QEMU, ne fonctionne pas avec les nouvelles versions de Raspbian. Donc, comment utiliser la dernière version de Raspbian ? Pour cela vous devez générer, et donc cross-compiler, une version du noyau Linux compatible avec votre version de Raspbian.

Dans cette partie, nous utiliserons la version de Raspbian du 17 avril 2018 et vous allez donc générer une image du noyau Linux correspondante (20180417).

Mise en place

Le noyau modifié pour fonctionner avec QEMU est fourni avec un script permettant de le recompiler soi-même. Vous allez modifier ce script, pour qu'il télécharge et compile la version du noyau correspondant à l'image de Raspbian que vous avez téléchargée au début de ce chapitre.

Tout d'abord, rendez-vous dans le dossier tools de qemu-rpi-kernel et éditez le script build-kernel-qemu :

cd ~/Development-tools/qemu-rpi-kernel/tools
nano build-kernel-qemu

Ce script récupère par défaut les sources du noyau Raspberry PI en utilisant Git. Comme ce processus est très long, commencez par désactiver l'utilisation de Git, ce qui forcera le script à télécharger directement l'archive contenant les sources du noyau. La version des sources pour Git ou de l'archive à télécharger correspond à la variable COMMIT, vous devez aussi la modifier pour télécharger les sources de la version du 20180417.

Modifiez les 3 lignes suivantes au début du fichier :

COMMIT=6820d0cbec64cfee481b961833feffec8880111e
COMMIT=raspberrypi-kernel_1.20171029-1
#COMMIT=""

Pour ne déclarer qu'une seule fois la variable COMMIT ayant comme valeur raspberrypi-kernel_1.20180417-1 :

#COMMIT=921b6254452db87ae0304beaa9833cfdf5083ed8
#COMMIT=raspberrypi-kernel_1.20171029-1
COMMIT="raspberrypi-kernel_1.20180417-1"

Commentez ensuite la ligne :

USE_GIT=1

comme ceci :

#USE_GIT=1

afin de désactiver le support du téléchargement via Git.

Votre fichier doit maintenant correspondre à :

Modification du fichier build-kernel-qemu
Modification du fichier build-kernel-qemu

Par défaut, le script télécharge l'archive contenant les sources du noyau, à chaque lancement. En conséquence, vous perdez du temps à chaque exécution et vous ne pouvez pas faire de test en mode non connecté. Vous allez donc modifier ce script pour vérifier l'existence de l'archive. Si elle existe déjà, la phase de téléchargement sera ignorée.

Modifiez la ligne suivante :

wget -c https://github.com/raspberrypi/linux/archive/${COMMIT}.zip -O linux-${COMMIT}.zip

Afin d'ajouter un test, vérifiez l'existence de l'archive :

if [ ! -f linux-${COMMIT}.zip ]
then
      wget -c https://github.com/raspberrypi/linux/archive/${COMMIT}.zip -O linux-${COMMIT}.zip
fi

Votre fichier doit maintenant correspondre à :

Modification du fichier build-kernel-qemu
Modification du fichier build-kernel-qemu

Configurez et compilez votre futur noyau

Votre script est maintenant prêt à être exécuté. Lancez-le via la commande :

bash build-kernel-qemu

Après le téléchargement et la décompression de l'archive contenant les sources du noyau, vous obtenez cet écran vous proposant de modifier les paramètres du noyau. Heureusement, le noyau a été préconfiguré avec les paramètres nécessaires pour une Raspberry PI émulée via QEMU ; il n'y a donc rien à faire lors de cette étape, mis à part sélectionner Exit puis Save :

Interface de configuration du noyau
Interface de configuration du noyau

Lorsque vous quittez l'interface de configuration du noyau, la phase de compilation commence. Patientez pendant cette phase, vous devez obtenir ceci à la fin :

Fin de la compilation du noyau
Fin de la compilation du noyau

Votre noyau est maintenant compilé et correspond au fichier arch/arm/boot/zImage

Testez votre nouveau noyau

Essayons maintenant de démarrer notre Raspbian avec ce noyau. Commencez par recopier ce noyau dans le dossier Raspbian, via la commande :

cp linux-raspberrypi-kernel_1.20180417-1/arch/arm/boot/zImage ~/Development-tools/raspbian/kernel-20180417-1

Lancez ensuite QEMU en chargeant ce nouveau noyau :

cd ~/Development-tools/
qemu-system-arm -kernel raspbian/kernel-20180417-1 \
                -cpu arm1176 \
                -m 256 \
                -M versatilepb \
                -dtb qemu-rpi-kernel/versatile-pb.dtb 
                -no-reboot \
                -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
                -net nic \
                -net user,hostfwd=tcp::5022-:22 \
                -drive file=raspbian/2018-04-18-raspbian-stretch-lite.img,format=raw \
                -nographic

 Notez que vous avez spécifié, via l'option -kernel,  le fichier correspondant au noyau que vous venez de compiler, afin de demander à QEMU d'utiliser ce noyau pour démarrer votre Raspbian.

Vous pouvez maintenant ouvrir une session avec l'utilisateur pi, et entrer la commande :

uname -a

afin d'afficher la version et la date de compilation de votre noyau actuel :

Démarrage sur notre noyau
Démarrage sur notre noyau

La version doit correspondre à 4.14.34, et la date doit correspondre à la date de compilation de votre noyau.

Vous savez désormais émuler une Raspberry PI via QEMU et exécuter un GNU/Linux classique ; dans notre cas, Raspbian. Dans la partie suivante, vous verrez comment générer votre propre distribution GNU/Linux adaptée à vos besoins.

Exemple de certificat de réussite
Exemple de certificat de réussite