• 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

Créez et configurez votre image Linux pour Raspberry PI

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

Générez une image pour Raspberry PI

Vous venez de générer une image en utilisant la configuration par défaut de Buildroot. Mais Buildroot fournit une interface de configuration permettant d'adapter le système à ses besoins. Voyons comment utiliser cette interface.

Commencez par créer un nouveau dossier Buildroot qui vous permettra de générer une image pour Raspberry PI, que nous testerons avec QEMU.

cd ~/Development-tools
cp -R buildroot buildroot-qemu-rpi

Prenez en main l'interface de configuration

Préconfigurez Buildroot avec la configuration fournie pour Raspberry PI 1, en utilisant le fichier defconfig fourni.

cd buildroot-qemu-rpi
make raspberrypi_defconfig

Lancez ensuite l'interface de configuration de Buildroot.

make menuconfig

Vous obtenez ainsi cette interface de configuration en mode texte.

Menu :
Menu principal

Le premier menu permet de configurer le système cible en fonction de la carte embarquée que vous utilisez. C'est dans ce menu que vous choisissez le type d'architecture, le format des exécutables, le type d'instructions... Les options ont été préremplies via le fichier defconfig. Dans notre cas, il s'agit d'une architecture ARM de type ARM1176 et des exécutables au format ELF (Executable Linux Format) pour Linux.

Système cible
Système cible

Le menu Toolchain permet de configurer la chaîne de cross-compilation. Par défaut, Buildroot télécharge et compile sa propre chaîne, et cette opération prend beaucoup de temps. Comme nous avons installé une chaîne sur notre Debian, nous modifierons cette partie pour utiliser cette chaîne. Ce menu permet aussi de configurer les options liées à la chaîne de cross-compilation :

  • le type de librairie C à utiliser : uClibc adaptée aux systèmes embarqués (taille réduite) ou la glibc ;

  • la version du noyau qui sera utilisée, afin de ne pas faire appel à des fonctions inexistantes ou non compatibles ;

  • les options liées à la librairie C (support multilangues, thread...) ;

  • la version des utilitaires pour les binaires (binutils) ;

  • les options du compilateur GCC.

Chaîne de cross-compilation
Chaîne de cross-compilation

 Le menu System permet de personnaliser le système obtenu :

  • le nom d'hôte et la bannière de connexion ;

  • le format de stockage des mots de passe, et le mot de passe root ; 

  • le système de démarrage des services (BusyBox, init, systemd) ;

  • la gestion des périphériques dans/dev et les périphériques persistants à créer ;

  • la configuration du réseau (dhcp sur l'interface eth0) ;

  • la localisation par défaut et l'heure locale.

Configuration du système
Configuration du système

Le menu Kernel permet de configurer le noyau. Par défaut, Buildroot télécharge la version indiquée, applique la configuration du defconfig (bcmrpi), puis ouvre l'interface de configuration du noyau (menuconfig) afin d'adapter, si nécessaire, les paramètres du noyau. Il est aussi possible d'indiquer à Buildroot que nous fournissons une image déjà compilée du noyau.

Configuration du noyau
Configuration du noyau

Le menu Target packages contient l'ensemble des applications/librairies que vous pouvez installer sur votre système cible. Ces applications sont regroupées dans différents menus en  fonction de leur catégorie (audio, compressions, développement...).  Si une application nécessite que d'autres applications soient installées pour pouvoir l'être, Buildroot vous indique les dépendances nécessaires.

Choix des applications
Choix des applications

Le menu Filesystem images vous offre la possibilité de choisir le ou les formats finaux de votre image. Dans notre cas, nous générons une image d'une carte SD contenant un système de fichier racine en EXT4. Mais vous pouvez aussi générer une archive (tar) de ce système, une image pour un livecd (SquashFS)... 

Format de l'image finale
Format de l'image finale

Le menu Bootloaders permet de sélectionner son chargeur de démarrage, l'équivalent de GRUB sur PC. Dans le cas de la Raspberry PI, il s'agit de U-Boot.

Chargeur de démarrage
Chargeur de démarrage

Différentes applications sont nécessaires sur la machine hôte pour générer l'image finale. Ces applications sont rassemblées dans le menu Host Utilities.

Utilitaires sur l'hôte
Utilitaires sur l'hôte

Le dernier menu, Legacy config, contient la liste des options qui sont actuellement sélectionnées, mais qui ne sont plus supportées par Buildroot. Buildroot refusera alors de générer l'image tant que de telles options sont sélectionnées. 

Options obsolètes
Options obsolètes

Personnalisez la configuration

Avant de générer l'image du système et de la tester, je vous propose de modifier la configuration par défaut. Afin de gagner du temps lors de la génération, et étant donné que nous avons déjà installé la chaîne de compilation officielle de la fondation Raspberry, vous pouvez modifier la configuration pour utiliser cette chaîne de cross-compilation.

Rendez-vous tout d'abord dans le menu Toolchain, puis choisissez le type de chaîne externe (Toolchain Type (External toolchain)). Il faut ensuite sélectionner une chaîne personnalisée (Toolchain (Custom toolchain)) qui est déjà installée (Toolchain origin (Pre-installed toolchain)).

Vous avez désormais accès au menu Toolchain path ; Toolchain path permettant d'indiquer le répertoire contenant la chaîne de cross-compilation et le préfixe des exécutables de la suite GCC. Dans notre cas, le chemin est /home/user/Development-tools/tools/arm-bcm2708/arm-linux-gnueabihf/ et le préfixe correspond à arm-linux-gnueabihf

Renseignez ensuite le numéro de version de GCC (External toolchain gcc version (4.9.x)), le numéro de version du noyau (External toolchain kernel headers series (4.1.x)) et le type de librairie C (External toolchain C library (glibc/eglibc)).  
Finalement, la chaîne fournie pour la Raspberry PI ayant le support du C++, activez l'option correspondante (Toolchain has C++ support).

Vous devez obtenir cette configuration :

Utilisation de la chaîne de cross-compilation pré-installée
Utilisation de la chaîne de cross-compilation préinstallée

Si vous essayez de générer l'image immédiatement, vous allez obtenir une erreur à la fin lors de la génération de l'image de la carte SD. Par défaut, la taille du rootfs généré est de 60 Mo. Or, comme nous utilisons la chaîne de compilation officielle et que cette chaîne utilise la glibc et non la uClibc, l'image finale excède 60 Mo et la copie échoue. Vous devez donc augmenter la taille de l'image finale. Pour cela, dans le menu Filesystem images, augmentez la taille à 200 Mo ((200M) exact size).

Modification de la taille de l'image
Modification de la taille de l'image

La configuration étant terminée, quittez l'interface via le bouton Exit et n'oubliez pas d'enregistrer vos modifications.

Générez votre image

Finalement, générez l'image via un :

make

Comme vous utilisez la chaîne de cross-compilation déjà installée, vous noterez que cette étape est plus rapide que lors de la génération de l'image aarch64 de la partie précédente.

Vous obtenez finalement une image sdcard.img contenant deux partitions.

Génération de l'image de la carte SD
Génération de l'image de la carte SD

Les fichiers générés sont disponibles dans le dossier output/images :

  • les fichiers de descriptions matériel .dtb ;

  • l'image de la partition FAT32 (boot.vfat) qui contient notamment le bootloader et le noyau ;

  • l'image de la partition racine (rootfs.ext2) qui contient le système GNU/Linux ;

  • le dossier rpi-firmware contient les binaires précompilés fournis par la fondation Raspberry (start.elf, bootcode.bin....) nécessaires au démarrage ;

  • le fichier sdcard.img est une image de la carte SD que vous avez générée ;

  • le fichier zImage correspond au noyau.

Fichiers obtenus suite à la génération de l'image
Fichiers obtenus suite à la génération de l'image

Maintenant que nous avons généré une image, passons au test.

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