![]() |
M2 SETI B4 / MS SE SE758 |
L’objectif de ce deuxième TP est de découvrir l’outil Buildroot.
Nous allons reprendre le répertoire créé lors du précédent TP
(remplacez xxx
par le chemin du répertoire) :
$ export TPROOT=xxx
$ cd $TPROOT
Buildroot est un outil permettant de générer les différents composants nécessaires pour un système embarqué à base de Linux. Il est notamment capable de générer une chaîne de compilation adaptée (compilateur croisé, bibliothèque standard…), un bootloader, un noyau Linux, et de créer un système de fichiers avec différents outils (depuis un petit système basé sur Busybox, jusqu’à un système plus complet basé sur systemd et intégrant des centaines de logiciels comme des serveurs web, etc.).
Récupérez la version 2020.02.9 (la dernière version avec un support à long terme lors de l’écriture de ce texte) depuis le site de Buildroot : https://buildroot.org/downloads/buildroot-2020.02.9.tar.bz2, puis décompressez-la dans votre répertoire de travail.
$ cd $TPROOT
$ wget https://buildroot.org/downloads/buildroot-2021.02.7.tar.bz2
$ tar xjf buildroot-2021.02.7.tar.bz2
$ cd buildroot-2021.02.7
Buildroot fournit des fichiers de configuration par défaut pour de nombreuses cartes. Vous pouvez en obtenir la liste en tapant la commande :
$ make list-defconfigs
Vous pouvez notamment voir que la cible que nous utilisons (QEMU Versatile Express avec Cortex-A9) est supportée. Vous pouvez voir le contenu de sa configuration par défaut :
$ cat configs/qemu_arm_vexpress_defconfig
Nous pourrions utiliser ce fichier fourni par Buildroot (il suffirait
alors de faire make qemu_arm_vexpress_defconfig
pour
l’utiliser), mais nous allons un peu parcourir à la main la
configuration à des fins pédagogiques.
Buildroot fournit une interface menuconfig (ressemblant à celle du noyau) pour configurer son fonctionnement. Vous pouvez la lancer avec la commande :
$ make menuconfig
Nous allons parcourir rapidement la configuration afin de l’adapter à notre cas mais également de voir les différentes options qui s’offrent à nous.
Dans le menu Target options
, nous devons configurer
l’architecture cible.
Choisissez les valeurs suivantes :
Target architecture
=>
ARM little endian
Target architecture variant
=>
Cortex-A9
Enable NEON SIMD extension support
=>
yes
Enable VFP extension support
=>
yes
Target ABI
=> EABIhf
Ces options permettent de configurer le comportement de Buildroot. Nous n’avons pas de modification à apporter mais regardez néanmoins rapidement les différentes options disponibles.
Le menu Toolchain
permet de configurer le
cross-compilateur et les outils qui seront utilisés pour la compilation
des différents composants logiciels.
La première option Toolchain type
permet d’indiquer à
Buildroot :
Buildroot toolchain
)External toolchain
)Regardez rapidement les options proposées (notamment par exemple les
différentes bibliothèques standard proposées) dans le mode
Buildroot toolchain
(celui par défaut).
Cependant, la compilation d’une chaîne de compilation est très
longue. Nous allons donc, dans le cadre de ce TP, en choisir une
existante. Sélectionnez donc External toolchain
.
Dans l’option Toolchain
, choisissez
Arm ARM 2020.4
. Si vous ne touchez pas aux autres options,
Buildroot va automatiquement télécharger cette chaîne de compilation
depuis le site d’ARM et l’installer.
Dans System configuration
, vous trouverez un certain
nombre d’options pour modifier le comportement du système Linux que vous
construisez.
La seule modification que nous apporterons est la suivante :
Run a getty (login prompt) after boot / TTY port
=>
ttyAMA0
pour indiquer sur quel port série ouvrir une console.
Dans le menu Kernel
vous trouverez les options
contrôlant la compilation d’un noyau Linux par Buildroot.
Nous aurons besoin des options suivantes :
Linux Kernel
=> yes
Defconfig name
=> vexpress
Build a Device Tree Blob (DTB)
=>
yes
In-tree Device Tree Source file names
=>
vexpress-v2p-ca9
Ces options indiquent à Buildroot que l’on souhaite compiler un noyau
Linux, en utilisant le fichier de configuration par défaut
vexpress
fourni par le noyau, que l’on souhaite également
construire un arbre des périphériques et que ce dernier provient du
fichier vexpress-v2p-ca9.dts
fourni par le noyau.
Dans ce menu, vous trouverez la liste des applications à compiler et à installer dans notre système de fichiers. Par défaut, seul BusyBox est sélectionné, et c’est le seul dont nous aurons besoin. Regardez néanmoins rapidement la diversité des paquets proposés par Buildroot.
Dans ce menu, vous pouvez choisir le format de destination pour l’image du système de fichiers qui sera générée par Buildroot.
Pour simplifier, nous allons faire générer à Buildroot une
image initramfs
contenant l’intégralité de notre système de
fichiers.
Activez donc uniquement les options suivantes :
cpio the root filesystem (for use as an initial RAM filesystem)
=> yes
Compression method
=> gzip
Plus couramment, Buildroot permet de créer :
Une archive tar
contenant l’intégralité du contenu
de votre système de fichiers (option
tar the root filesystem
). C’est utile si vous avez déjà une
partition formattée dans laquelle vous n’aurez qu’à extraire le contenu
de l’archive.
Un fichier contenant une image d’un système de fichiers (le
format est configurable : ext2/3/4
, camfs
,
JFFS2
…). Le contenu de ce fichier devra ensuite être copié
tel quel (probablement avec dd
) sur un support de stockage
(carte SD, flash…).
Dans ce menu vous pourrez demander à Buildroot de compiler un bootloader pour votre système (par exemple U-Boot).
Nous n’en aurons pas besoin dans le cadre de ce TP.
Les réglages de langue mis en place par certaines distributions (notamment Ubuntu) peuvent perturber le fonctionnement de Buildroot. Assurez-vous de les désactiver, pour le terminal courant, à l’aide des commandes suivantes :
$ unset LANG
$ unset LC_MESSAGES
$ unset LC_ALL
$ unset LANGUAGE
$ export LANG=C
Une fois la configuration terminée et le fichier de configuration enregistré, il n’y a plus qu’à demander à Buildroot de construire les différents composants :
$ make
Si vous voulez conserver une trace de tous les messages dans un
fichier pour s’y référer ultérieurement, vous pouvez utiliser
tee
:
$ make 2>&1 | tee build.log
Une fois tous les composants construits, vous trouverez dans le
répertoire output/images
:
zImage
: l’image du noyauvexpress-v2p-ca9.dtb
: l’arbre des périphériquesrootfs.cpio.gz
: l’image initramfs
contenant notre système de fichiers racineEn fonction des options choisies dans la section
Filesystem images
, on aurait pu trouver également :
rootfs.tar
: l’archive tar
contenant les
différents fichiers du système de fichiers racinerootfs.ext2
: le fichier contenant l’image du système
de fichiers racineNous pouvons donc tester le résultat à l’aide de QEMU :
$ cd ..
$ ./qemu-system-arm -machine vexpress-a9 -nographic \
-kernel buildroot-2021.02.7/output/images/zImage \
-dtb buildroot-2021.02.7/output/images/vexpress-v2p-ca9.dtb \
-initrd buildroot-2021.02.7/output/images/rootfs.cpio.gz
Vous trouverez la documentation officielle de Buildroot ici : https://buildroot.org/downloads/manual/manual.html.
Bootlin propose des formations avancées sur l’utilisation de Buildroot, dont les supports et les textes des travaux pratiques sont librement téléchargeables sous licence Creative Commons Attribution - Share Alike 3.0.
© Copyright 2020 Guillaume Duc. Le contenu de cette page est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International (à l'exception des exemples de code tirés du noyau Linux et qui sont distribués sous leurs licences d'origine).