:::: MENU ::::

Création d’une custom image pour votre Raspberry Pi

BuildRoot LogoLe système d’exploitation le plus utilisé pour notre cher Raspberry Pi est la distribution Raspbian, développée par la fondation Raspberry Pi, étant basé sur Debian et optimisée pour ce micro ordinateur. L’image embarque par défaut une interface graphique, de nombreuses librairies pré-installées (python, wpa_supplicant …) et les dépôts contenants des dizaines de milliers paquets pré-compilés permettent d’installer rapidement de nouvelles applications sur notre Raspberry Pi.

Néanmoins, pour la réalisation de système embarqué notamment, cette image pourrait s’avérer trop gourmande en ressource et non adaptée aux besoins exprimés. C’est pourquoi nous allons utiliser l’outil buildroot afin de pouvoir compiler notre propre custom image basée sur un Linux classique, et ne contenant que les paquets strictement nécessaires à la réalisation de notre système embarqué.

Tout d’abord on installe les outils nécessaires sur une distribution Linux pour la compilation de l’image. La liste n’est pas forcément exhaustive et il est possible que d’autres paquets vous soient demandés à la compilation en fonction de votre système.

sudo apt-get install build-essential ncurses-dev git

Ensuite on télécharge la dernière version de buildroot disponible à l’adresse suivante :

http://buildroot.uclibc.org/download.html

On décompresse l’archive :

tar xvf buildroot-*.tar.gz
cd buildroot-*

On liste les fichiers de configuration disponible afin de trouver celui qui nous intéresse :

ls configs/*

Afin d’avoir un buildroot permettant de compiler une image de Linux pour notre RaspberryPi il faut exécuter la commande :

make raspberrypi_defconfig

Normalement si tout s’est bien passé, vous devriez voir quelque chose de ce type apparaitre :

mkdir -p /home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config/lxdialog
make CC="/usr/bin/gcc" HOSTCC="/usr/bin/gcc" obj=/home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config -C support/kconfig -f Makefile.br conf
make[1]: Entering directory `/home/benoit/Downloads/buildroot-2013.11/support/kconfig'
/usr/bin/gcc -DCURSES_LOC="<curses.h>" -DLOCALE -I/home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config -DCONFIG_=\"\" -MM *.c > /home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config/.depend 2>/dev/null || :
make[1]: Leaving directory `/home/benoit/Downloads/buildroot-2013.11/support/kconfig'
make[1]: Entering directory `/home/benoit/Downloads/buildroot-2013.11/support/kconfig'
/usr/bin/gcc -DCURSES_LOC="<curses.h>" -DLOCALE -I/home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config -DCONFIG_=\"\" -c conf.c -o /home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config/conf.o
/usr/bin/gcc -DCURSES_LOC="<curses.h>" -DLOCALE -I/home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config -DCONFIG_=\"\" -I. -c /home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config/zconf.tab.c -o /home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config/zconf.tab.o
/usr/bin/gcc -DCURSES_LOC="<curses.h>" -DLOCALE -I/home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config -DCONFIG_=\"\" /home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config/conf.o /home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config/zconf.tab.o -o /home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config/conf
rm /home/benoit/Downloads/buildroot-2013.11/output/build/buildroot-config/zconf.tab.c
make[1]: Leaving directory `/home/benoit/Downloads/buildroot-2013.11/support/kconfig'
#
# configuration written to /home/benoit/Downloads/buildroot-2013.11/.config
#

Une fois notre environnement de compilation configuré et prêt à compiler, il nous faut configurer l’image que nous souhaitons obtenir à l’aide de la commande :

make menuconfig

Vous devez alors voir un menu de ce type s’afficher :

Menuconfig

Des connaissances en compilation d’image Linux sont recommandées afin d’appréhender toutes les options disponibles. Afin de spécifier les paquets à ajouter à votre image Linux, rendez-vous dans le menu Target packages. Les paquets sont regroupés par catégorie, à vous d’activer ceux nécessaires à la réalisation de votre système embarqué.

cap3

Certains paquets de grande utilité nécessitent l’activation d’une option nommée : Enable WCHAR support. Vous trouverez cette option dans le menu Toolchain.

Menu Toolchain

Voici un exemple des paquets disponible dans la section Network applications.

Network applications disponible

Je vous laisse faire vos propres recherches afin de pouvoir configurer votre image selon vos besoins. N’oubliez pas de valider l’enregistrement du fichier de configuration avant de quitter.

Nous sommes maintenant prêts à lancer la compilation de notre image.

make -j6

L’option -j6 permet d’accélérer la compilation en exécutant plusieurs tâches simultanément. Voici ce que dit le manuel à propos de cette option :

-j [jobs], --jobs[=jobs]
Specifies the number of jobs (commands) to run simultaneously. If
there is more than one -j option, the last one is effective. If
the -j option is given without an argument, make will not limit
the number of jobs that can run simultaneously.

Bien sûr tout ceci dépendra du nombre de cœurs processeurs (et de threads) que vous avez à votre disposition. Il est possible que cette option fasse crasher la compilation à un certain moment. Relancer alors le make sans option le temps que la tâche posant problème se termine.

Voilà, si c’est votre première compilation vous pouvez des à présent allez vous chercher un café car celle-ci peut prendre un peu (beaucoup) de temps. L’utilitaire devra télécharger une quantité de données assez importante (Firmware du Raspberry Pi, image de Linux …) donc le temps nécessaire à la compilation dépendra également de votre connexion à internet.

Si la compilation se termine avec succès, vous devriez retrouver quelque chose de semblable dans la console :

echo "/home/benoit/Downloads/buildroot-2013.11/output/host/usr/bin/makedevs -d /home/benoit/Downloads/buildroot-2013.11/output/build/_device_table.txt /home/benoit/Downloads/buildroot-2013.11/output/target" >> /home/benoit/Downloads/buildroot-2013.11/output/build/_fakeroot.fs
printf '\n \n \n \n \n' > /home/benoit/Downloads/buildroot-2013.11/output/build/_users_table.txt
/home/benoit/Downloads/buildroot-2013.11/support/scripts/mkusers /home/benoit/Downloads/buildroot-2013.11/output/build/_users_table.txt /home/benoit/Downloads/buildroot-2013.11/output/target >> /home/benoit/Downloads/buildroot-2013.11/output/build/_fakeroot.fs
echo " tar -c""f /home/benoit/Downloads/buildroot-2013.11/output/images/rootfs.tar -C /home/benoit/Downloads/buildroot-2013.11/output/target ." >> /home/benoit/Downloads/buildroot-2013.11/output/build/_fakeroot.fs
chmod a+x /home/benoit/Downloads/buildroot-2013.11/output/build/_fakeroot.fs
/home/benoit/Downloads/buildroot-2013.11/output/host/usr/bin/fakeroot -- /home/benoit/Downloads/buildroot-2013.11/output/build/_fakeroot.fs
rootdir=/home/benoit/Downloads/buildroot-2013.11/output/target
table='/home/benoit/Downloads/buildroot-2013.11/output/build/_device_table.txt'
cp support/misc/target-dir-warning.txt /home/benoit/Downloads/buildroot-2013.11/output/target/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM

En vous rendant dans le dossier output/images de votre répertoire builroot vous devriez retrouver 2 fichiers et un dossier :

  • zImage : Le kernel (noyau) linux de votre image à copier dans la partition de boot.
  • rootfs.tar : La racine de votre distribution contenant tous les fichiers nécessaires. Cette archive devra être décompressée dans votre partition principale.
  • rpi-firmware : Le firmware ainsi que des fichiers de configurations nécessaires au boot de la carte. Le contenu de ce dossier devra lui aussi être copié dans la partition de boot.

Maintenant, vous devez formater votre carte SD (à l’aide de votre utilitaire préféré, GParted par exemple) et créer 2 partitions :

  • Une partition boot d’une taille de 75 Mo en FAT 32
  • Une partition racine (point de montage « / ») prenant le reste de l’espace disponible en EXT 4

Il ne vous reste plus qu’à copier le contenu du dossier rpi-firmware ainsi que le fichier zImage dans votre partition de boot. Pour le rootfs.tar il faudra le décompresser à l’aide de la commande (afin de conserver les droits appliqués aux fichiers) :

tar xvf rootfs.tar /point_de_montage_partition_racine/

Voilà, vous pouvez maintenant démarrer sur votre image custom.

A propos de l'auteur :

C’est l’histoire d’un développeur pleine pile un peu touche à tout, qui découvre l'infrastructure et le nuage. Son plat préféré, c’est le hachi-corp sauce K8S. Détestant faire deux fois la même chose, féru d’automatisation, il s’est dévoué à la cause de l’infrastructure comme code, de la containérisation et du déploiement continu. Blogueur sur un site de Framboise, il a eu le malheur d’acheter une imprimante 3D, et cherche encore à comprendre pourquoi il est un fan ardu de Formule 1.


6 Comments

  • Répondre Gajh |

    Bonjour,

    Merci pour ce tutoriel mais n’y aurait il pas un probleme dans:
    sudo apt-get install build-essentiel ncurses-dev git
    remplacer essentiel par essential et ncurses-dev par libncurses5-dev?

    Cordialement,
    Gajh

    • Répondre Benoit |

      Bonjour,

      En effet petite coquille pour build-essential que je n’avais pas remarquée. Pour ncurses-dev, c’est possible que le nom du package ai changé. Il faut que je refasse une passe sur le tuto avec une distribution récente afin de faire le test.

      En tout cas merci pour tes retours,

      Benoit

  • Répondre franko |

    SAluu , pour moi j’ai utilisé la configuration deja présente pour raspberry par :
    make raspberrypi_defconfig
    make

    Donc pour les fichiers que j’ai obtenu j’ai crée une partition boot et une partition / : est ce que je dois la nommée / ? merci

    • Répondre Benoit |

      Réponse un peu tardive, mais il me semble qu’il est pas nécessaire de nommer cette partition « / ».

Laissez un commentaire