Introduction
Dans cette série d'articles, je souhaite examiner le systÚme de construction du distributeur buildroot et partager mon expérience de sa personnalisation. Il s'agira d'une expérience pratique de création d'un petit systÚme d'exploitation avec une interface graphique et une fonctionnalité minimale.
Tout d'abord, il ne faut pas confondre le systÚme de construction et le distributeur. Buildroot peut assembler un systÚme à partir d'un ensemble de packages qui lui sont proposés. Buildroot est basé sur des fichiers make et possÚde donc d'énormes possibilités de personnalisation. Remplacer un package par une autre version, ajouter son propre package, modifier les rÚgles de construction d'un package, personnaliser le systÚme de fichiers aprÚs l'installation de tous les packages ? Tout cela est possible avec buildroot.
En Russie, buildroot est utilisé, mais à mon avis, il y a peu d'informations en russe pour les débutants.
L'objectif de ce travail est de construire un distributeur avec un chargement live, une interface icewm et un navigateur. La plateforme cible est virtualbox.
Pourquoi construire son propre distributeur ? Souvent, un fonctionnement limité est nécessaire avec des ressources limitées. Encore plus souvent, dans l'automatisation, il est nécessaire de créer des firmwares. Adapter un distributeur générique, en éliminant les packages superflus et en le transformant en firmware est un processus beaucoup plus laborieux que de construire un nouveau distributeur. L'utilisation de Gentoo a également ses limites.
Buildroot est un systÚme trÚs puissant, mais il ne fera rien à votre place. Il peut seulement offrir des possibilités et automatiser le processus de construction.
Les systÚmes de construction alternatifs (yocto, open build system et autres) ne sont pas examinés ni comparés.
OĂč les trouver et comment commencer
Site du projet â . Ici, vous pouvez tĂ©lĂ©charger la version actuelle et lire le manuel. Vous pouvez Ă©galement rejoindre la communautĂ©, il y a un systĂšme de suivi des bugs, des listes de diffusion et un canal IRC.
Buildroot utilise des defconfig pour la carte cible de construction. Le defconfig est un fichier de configuration qui ne stocke que les options n'ayant pas de valeur par défaut. C'est lui qui détermine ce qui sera assemblé et comment. Il est possible de configurer séparément les configs busybox, linux-kernel, uglibc, et les chargeurs u-boot et barebox, mais tous seront liés à la carte cible.
AprĂšs avoir dĂ©compressĂ© l'archive tĂ©lĂ©chargĂ©e ou clonĂ© depuis git, nous obtenons un buildroot prĂȘt Ă l'emploi. Une description dĂ©taillĂ©e de la structure des rĂ©pertoires peut ĂȘtre trouvĂ©e dans le manuel, mais je vais parler des Ă©lĂ©ments les plus importants :
board â un catalogue de fichiers spĂ©cifiques pour chaque carte. Cela peut inclure des scripts pour crĂ©er des images systĂšme (iso, sdcart, cpio, etc.), un rĂ©pertoire overlay, la configuration des noyaux, et plus encore.
configs â le defconfig de la carte. Le defconfig est une configuration incomplĂšte de la carte. Il contient uniquement les paramĂštres qui diffĂšrent des paramĂštres par dĂ©faut.
dl â un rĂ©pertoire contenant les fichiers/source codes tĂ©lĂ©chargĂ©s pour la compilation.
output/target â le systĂšme de fichiers créé de l'OS reçu. C'est de lĂ que sont créées les images pour le chargement/l'installation.
output/host â utilitaires hĂŽtes pour la compilation.
output/build â paquets compilĂ©s.
La configuration de la compilation se fait via KConfig. Ce mĂȘme systĂšme est utilisĂ© pour compiler le noyau Linux. Voici une liste des commandes les plus couramment utilisĂ©es (Ă exĂ©cuter dans le rĂ©pertoire buildroot) :
- make menuconfig â lancer la configuration de la compilation. Il est Ă©galement possible d'utiliser une interface graphique (make nconfig, make xconfig, make gconfig).
- make linux-menuconfig â lancer la configuration du noyau.
- make clean â nettoyer les rĂ©sultats de la compilation (tout ce qui est stockĂ© dans output).
- make â compiler le systĂšme. Cela n'effectue pas la recompilation des processus dĂ©jĂ compilĂ©s.
- make defconfig_name â changer de configuration pour un defconfig spĂ©cifique.
- make list-defconfigs â afficher la liste des defconfigs.
- make source â uniquement tĂ©lĂ©charger les fichiers d'installation, sans compilation.
- make help â afficher la liste des commandes possibles.
Remarques importantes et conseils utiles.
Buildroot ne recompilera pas les paquets dĂ©jĂ compilĂ©s ! Par consĂ©quent, il peut se crĂ©er une situation oĂč une recompilation complĂšte est nĂ©cessaire.
On peut recompiling un paquet spécifique avec la commande make packagename-rebuild. Par exemple, on peut recompiler le noyau Linux :
make linux-rebuild.Buildroot garde la trace de l'état de tout paquet en créant des fichiers .stamp dans le répertoire output/build/$packagename.

Par conséquent, il est possible de recompiler root-fs et d'images sans recompilation des paquets :
rm output/build/host-gcc-final-*/.stamp_host_installed; rm -rf output/target; find output/ -name ".stamp_target_installed" | xargs rm -rf; make.Variables utiles.
Dans buildroot, il existe un ensemble de variables pour faciliter la configuration.
- $TOPDIR â le rĂ©pertoire racine de buildroot.
- $BASEDIR â le rĂ©pertoire OUTPUT.
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR â rĂ©pertoires de compilation pour host fs, staging fs, target fs.
- $BUILD_DIR â le rĂ©pertoire avec les paquets dĂ©compressĂ©s et compilĂ©s.
Visualisation
Dans buildroot, il est possible de visualiser. On peut créer un schéma de dépendances, un graphique des temps de compilation, un graphique de la taille des paquets dans le systÚme final. Les résultats se présentent sous forme de fichiers pdf (les options incluent svn, png) dans le répertoire output/graph.
Exemples de commandes de visualisation :
make graph-depends.construire un arbre de dépendancesmake -graph-dependsconstruire l'arbre de dépendances d'un paquet spécifiqueBR2_GRAPH_OUT=png make graph-buildconstruire un graphique du temps de compilation avec une sortie en PNGmake graph-sizeconstruire un graphique de la taille des paquets
Scripts utiles
Dans le rĂ©pertoire buildroot, il y a un sous-rĂ©pertoire utils avec des scripts utiles. Par exemple, il y a un script qui vĂ©rifie la validitĂ© de la description des paquets. Cela peut ĂȘtre utile lors de l'ajout de vos propres paquets (je le ferai plus tard). Un fichier utils/readme.txt dĂ©crit ces scripts.
Construisons une distribution de base
Il est important de rappeler que toutes les opérations se font au nom d'un utilisateur standard, pas root.
Toutes les commandes sont exécutées à la racine de buildroot. La distribution buildroot comprend déjà un ensemble de configurations pour de nombreuses cartes courantes et la virtualisation.
Voyons la liste des configurations :

Passons Ă la configuration qemu_x86_64_defconfig
make qemu_x86_64_defconfigEt lançons la compilation
makeLa compilation se termine avec succÚs, voyons les résultats :
![]()
Buildroot a construit des images qui peuvent ĂȘtre lancĂ©es dans Qemu et dont nous pouvons vĂ©rifier qu'elles fonctionnent.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -SLe rĂ©sultat â un systĂšme tournant dans qemu :

Création de la configuration d'une carte personnalisée
Ajout de fichiers de carte
Voyons la liste des configurations :

Dans la liste, nous voyons pc_x86_64_efi_defconfig. Nous allons créer notre propre carte en la copiant à partir de la configuration :
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfigCréons immédiatement un répertoire pour la carte pour stocker nos scripts, rootfs-overlay et d'autres fichiers nécessaires :
mkdir board/my_x86_boardPassons Ă ce defconfig :
make my_x86_board_defconfigAinsi, maintenant la configuration de compilation (stockée dans .config à la racine du répertoire buildroot) correspond à la machine cible x86-64 legacy(bios) au démarrage.
Copions la configuration linux-kernel (elle sera utile plus tard) :
cp board/pc/linux.config board/my_x86_board/Configuration des paramĂštres de compilation via KConfig
Lançons la configuration :
make menuconfig Une fenĂȘtre KConfig s'ouvrira. Il est possible de configurer avec une interface graphique (make nconfig, make xconfig, make gconfig) :

Entrons dans la premiÚre section Options Cibles. Ici, vous pouvez choisir l'architecture cible pour laquelle la compilation sera effectuée.

Options de compilation â ici, il y a divers paramĂštres de compilation. Vous pouvez indiquer les rĂ©pertoires des codes sources, le nombre de threads de compilation, les miroirs pour tĂ©lĂ©charger les sources et d'autres paramĂštres. Gardons les paramĂštres par dĂ©faut.
Toolchain â ici, l'outil de compilation lui-mĂȘme est configurĂ©. Nous en parlerons plus en dĂ©tail.

Type de chaĂźne d'outils â le type de chaĂźne d'outils Ă utiliser. Cela peut ĂȘtre une chaĂźne intĂ©grĂ©e dans Buildroot ou une chaĂźne externe (vous pouvez spĂ©cifier un rĂ©pertoire avec une version dĂ©jĂ compilĂ©e ou une URL pour le tĂ©lĂ©chargement). Pour diffĂ©rentes architectures, des options supplĂ©mentaires sont disponibles. Par exemple, pour arm, vous pouvez simplement choisir la version de la chaĂźne d'outils externe Linaro.
BibliothĂšque C â choix de la bibliothĂšque C. Cela impacte le fonctionnement de tout le systĂšme. En gĂ©nĂ©ral, glibc est utilisĂ©e, car elle prend en charge toutes les fonctionnalitĂ©s possibles. Mais elle peut ĂȘtre trop volumineuse pour un systĂšme embarquĂ©, donc on choisit souvent uClibc ou musl. Nous choisirons glibc (cela sera nĂ©cessaire pour utiliser systemd).
Headers du noyau et sĂ©rie des Headers du noyau personnalisĂ©s â doit correspondre Ă la version du noyau qui sera dans le systĂšme Ă compiler. Pour les headers du noyau, vous pouvez Ă©galement spĂ©cifier le chemin vers une tarball ou un dĂ©pĂŽt git.
VERSIONS DU COMPILATEUR GCC â choix de la version du compilateur Ă utiliser pour la compilation.
Activer le support C++ â choisissons de compiler avec le support des bibliothĂšques C++ dans le systĂšme. Cela nous sera utile par la suite.
Options gcc supplĂ©mentaires â vous pouvez spĂ©cifier des options supplĂ©mentaires pour le compilateur. Nous n'en avons pas besoin pour l'instant.
La configuration du systÚme permet de définir les paramÚtres futurs du systÚme créé :

La plupart des éléments sont clairs d'aprÚs leur nom. Portons notre attention sur les éléments suivants :
Chemin vers les tables d'utilisateurs â tableau avec les utilisateurs créés ().
Exemple de fichier. Un utilisateur user sera créé avec le mot de passe admin, gid/uid automatiquement, shell /bin/sh, groupe par défaut user, membre du groupe root, commentaire Foo user
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo userRĂ©pertoires de superposition du systĂšme de fichiers racine â rĂ©pertoire superposĂ© au systĂšme cible compilĂ©. Ajoute de nouveaux fichiers et remplace les existants.
Scripts personnalisĂ©s Ă exĂ©cuter avant de crĂ©er des images du systĂšme de fichiers â scripts exĂ©cutĂ©s juste avant la compression du systĂšme de fichiers en images. Nous laisserons le script vide pour l'instant.
Passons Ă la section Noyau

Ici, les paramĂštres du noyau sont dĂ©finis. Le noyau lui-mĂȘme est configurĂ© via make linux-menuconfig.
La version du noyau peut ĂȘtre spĂ©cifiĂ©e de plusieurs façons : choisir parmi les versions proposĂ©es, entrer la version manuellement, spĂ©cifier un dĂ©pĂŽt ou une tarball prĂȘte Ă l'emploi.
Configuration du noyau â chemin vers la configuration du noyau. Vous pouvez choisir la configuration par dĂ©faut pour l'architecture sĂ©lectionnĂ©e ou un defconfig de Linux. Dans les sources de Linux, il y a un ensemble de defconfigs pour diffĂ©rents systĂšmes cibles. Vous pouvez en trouver un ici, . Par exemple, pour la carte Beagle Bone Black, vous pouvez. .
La section Target packages permet de choisir quels paquets seront installés dans le systÚme à construire. Pour l'instant, laissons-le sans modifications. Nous ajouterons nos paquets dans cette liste plus tard.
Les images de systĂšme de fichiers â liste des images de systĂšmes de fichiers qui seront assemblĂ©es. Ajoutons l'image iso.

Bootloaders â choix des bootloaders Ă assembler. Choisissons isolinix.

Configuration de Systemd
Systemd devient l'une des colonnes vertĂ©brales de linux, au mĂȘme titre que le noyau et glibc. C'est pourquoi j'ai isolĂ© sa configuration dans un point sĂ©parĂ©.
Il se configure via make menuconfig, ensuite Target packages â System tools â systemd. Ici, vous pouvez indiquer quels services systemd seront installĂ©s et lancĂ©s au dĂ©marrage du systĂšme.

Sauvegarde de la configuration systĂšme
Nous sauvegardons cette configuration via KConfig.
AprĂšs quoi nous sauvegarderons notre defconfig :
make savedefconfigConfiguration du noyau Linux
La configuration du noyau linux s'appelle avec la commande suivante :
make linux-menuconfigAjoutons le support de la carte graphique Virtualbox.

Ajoutons le support d'intégration de Virtualbox Guest.

Sauvegardons et sortons. IMPORTANT: la configuration sera sauvegardée dans output/build/linux-$version/config, mais pas dans board/my_x86_board/linux.config

Il faut donc copier manuellement la configuration Ă son emplacement de stockage :
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.configAprĂšs quoi nous effectuerons une reconstruction complĂšte de tout le systĂšme. Ătant donnĂ© que buildroot ne reconstruit pas ce qui a dĂ©jĂ Ă©tĂ© assemblĂ©, il faut indiquer manuellement les paquets Ă reconstruire. Pour ne pas perdre de temps et de nerfs, il est plus facile de reconstruire un petit systĂšme en entier :
make clean;makeà la fin de la construction, lançons VirtualBox (testé sur les versions 5.2 et 6.0) avec le démarrage à partir du CD. ParamÚtres du systÚme :

Démarrage depuis l'iso assemblé :

Liste des matériaux utilisés
- Manuel de Buildroot
Source : habr.com
