Présentation
Dans cette série d'articles, je veux examiner le système de distribution buildroot et partager l'expérience de sa personnalisation. Voici une expérience pratique de la création d'un petit système d'exploitation avec une interface graphique et des fonctionnalités minimales.
Tout d'abord, vous ne devez pas confondre le système de build et la distribution. Buildroot peut construire un système à partir de l'ensemble des packages qui lui ont été proposés. Buildroot est construit sur des makefiles et possède donc d'énormes capacités de personnalisation. Remplacer le package par une autre version, ajouter votre package, modifier les règles de construction du package, personnaliser le système de fichiers après avoir installé tous les packages? Buildroot peut faire tout cela.
En Russie, buildroot est utilisé, mais à mon avis, il y a peu d'informations en russe pour les débutants.
Le but du travail est de construire un kit de distribution avec téléchargement en direct, interface icewm et navigateur. La plateforme cible est virtualbox.
Pourquoi construire votre distribution? Souvent, vous avez besoin de fonctionnalités limitées avec des ressources limitées. Plus souvent dans l'automatisation, vous devez créer un firmware. L'adaptation d'une distribution à usage général en nettoyant des packages supplémentaires et en les transformant en firmware prend plus de temps que de créer une nouvelle distribution. L'utilisation de Gentoo a également ses limites.
Le système Buildroot est très puissant, mais il ne fera rien pour vous. Il ne peut que donner des opportunités et automatiser le processus d'assemblage.
Les systèmes de construction alternatifs (yocto, système de construction ouvert, etc.) ne sont pas pris en compte ou comparés.
Où trouver et comment commencer
Le site du projet est buildroot.org . Ici, vous pouvez télécharger la version actuelle et lire le manuel. Vous pouvez également y contacter la communauté, il y a un bug tracker, des listes de diffusion et un canal irc.
Buildroot fonctionne avec defconfig pour la carte cible d'assemblage. Defconfig est un fichier de configuration qui stocke uniquement les options qui n'ont pas de valeurs par défaut. C'est lui qui détermine quoi et comment seront collectés. Dans ce cas, vous pouvez configurer séparément les configs busybox, linux-kernel, uClibc, bootloaders u-boot et barebox, mais ils seront tous liés à la carte cible.
Après avoir déballé l'archive téléchargée ou cloné de git, nous préparons la buildroot pour le travail. Les détails sur la structure du répertoire peuvent être trouvés dans le manuel, je vais parler des plus importants:
board - un répertoire avec des fichiers spécifiques à chaque board. Il peut s'agir de scripts pour former des images système (iso, sdcart, cpio, etc.), répertoire de superposition, configuration du noyau, etc.
configs - en fait des cartes defconfig. Defconfig est une configuration incomplète de la carte. Seuls les paramètres autres que les paramètres par défaut y sont stockés.
dl - répertoire avec les codes source / fichiers téléchargés pour l'assemblage
sortie / cible - le système de fichiers assemblé du système d'exploitation résultant. Par la suite, des images pour le téléchargement / l'installation sont créées à partir de celui-ci.
output / host - utilitaires hôte pour la construction
sortie / build - packages compilés
La configuration de la construction se fait via KConfig. Le même système est utilisé pour construire le noyau linux. Liste des commandes les plus utilisées (exécutées dans le répertoire buildroot):
- make menuconfig - appelle la configuration de construction. Vous pouvez également utiliser l'interface graphique (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig - appelle la configuration du noyau.
- rendre propre - des résultats d'assemblage clairs (tout ce qui est stocké dans la sortie)
- make - construire le système. Il ne reconstruit pas les processus déjà collectés
- make defconfig_name - basculer la configuration vers un defconfig spécifique
- make list-defconfigs - affiche une liste de defconfig
- make source - téléchargez uniquement les fichiers d'installation, sans assemblage.
- make help - liste les commandes possibles
Remarques et astuces importantes
Buildroot ne reconstruit pas les packages déjà packagés! Par conséquent, une situation peut survenir lorsqu'un remontage complet est requis.
Vous pouvez reconstruire un seul package avec la commande make packagename-rebuild. Par exemple, vous pouvez reconstruire le noyau linux:
make linux-rebuild
Buildroot stocke l'état de n'importe quel package en créant des fichiers .stamp dans le répertoire output / build / $ packagename:

Par conséquent, vous pouvez reconstruire les fichiers root et les images sans reconstruire les packages:
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
Buildroot a un ensemble de variables pour une configuration facile
- $ TOPDIR - répertoire racine de buildroot
- $ BASEDIR - Répertoire OUTPUT
- $ HOST_DIR, $ STAGING_DIR, $ TARGET_DIR - les répertoires d'assembly hébergent fs, staging fs, target fs.
- $ BUILD_DIR - répertoire avec des packages décompressés et assemblés
Visualisation
Buildroot a la capacité de visualiser. Vous pouvez construire un diagramme de dépendance, un calendrier de construction, un graphique de taille de paquet dans le système final. Les résultats sont sous forme de fichiers pdf (vous pouvez choisir parmi svn, png) dans le répertoire output / graph.
Exemples de commandes de visualisation:
- créer un arbre dépendant des
make graph-depends
make <pkg>-graph-depends
construire une arborescence de dépendances de paquetBR2_GRAPH_OUT=png make graph-build
construire un graphe du temps d'assemblage avec sortie en PNGmake graph-size
paquet de taille graphique
Scripts utiles
Le répertoire buildroot a un sous-répertoire utils avec des scripts utiles. Par exemple, il existe un script qui vérifie la description correcte des packages. Cela peut être utile lors de l'ajout de mes packages (je le ferai plus tard). Le fichier utils / readme.txt contient une description de ces scripts.
Construisons une distribution de stock
Il est important de rappeler que toutes les opérations sont effectuées au nom d'un utilisateur régulier, et non root.
Toutes les commandes sont exécutées à la racine de buildroot. Le package buildroot a déjà un ensemble de configurations pour de nombreuses cartes communes et virtualisation.
Nous regardons la liste des configurations:

Basculez vers la configuration qemu_x86_64_defconfig
make qemu_x86_64_defconfig
Et nous commençons l'assemblage
make
L'assemblage est terminé avec succès, nous regardons les résultats:

Buildroot a compilé des images que vous pouvez exécuter dans Qemu et vous assurer qu'elles fonctionnent.
qemu-system-x86_64 -kernel output/images/bzImage -hda \ output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Le résultat est un système fonctionnant dans qemu:

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

Dans la liste, nous voyons pc_x86_64_bios_defconfig. Nous allons créer notre carte en la copiant de la configuration:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Créez immédiatement le répertoire du forum pour stocker nos scripts, rootfs-overlay et autres fichiers nécessaires:
mkdir board/my_x86_board
Passez à ce defconfig:
make my_x86_board_defconfig
Ainsi, maintenant la configuration de construction (stockée dans .config à la racine du répertoire buildroot) correspond à la machine héritée (bios) x86-64 cible par chargement.
Copiez la configuration linux-kernel (utile à l'avenir):
cp board/pc/linux.config board/my_x86_board/
Configurer les options de construction via KConfig
Exécutez la configuration:
make menuconfig
La fenêtre KConfig s'ouvre. Il est possible de configurer avec une interface graphique (make nconfig, make xconfig, make gconfig):

Nous entrons dans la première section des options cibles. Ici, vous pouvez choisir l'architecture cible pour laquelle l'assemblage sera effectué.

Options de construction - il existe différents paramètres de construction ici. Vous pouvez spécifier des répertoires avec des codes source, le nombre de threads d'assemblage, des miroirs pour télécharger les codes source et d'autres paramètres. Laissez les paramètres par défaut.
Chaîne d'outils - ici, les outils de génération sont configurés. En savoir plus sur lui.

Type de chaîne d'outils - type de chaîne d'outils utilisé. Il peut être intégré à buildroot ou à une chaîne d'outils externe (vous pouvez spécifier un répertoire avec un prédéfini ou une URL à télécharger). Pour différentes architectures, il existe des options supplémentaires. Par exemple, pour bras, vous pouvez simplement sélectionner la version de la chaîne d'outils externe Linaro.
Bibliothèque C - le choix de la bibliothèque C. Le fonctionnement de l'ensemble du système en dépend. Glibc habituellement utilisée, prenant en charge toutes les fonctionnalités possibles. Mais il peut être trop grand pour le système embarqué, donc uClibc ou musl sont souvent choisis. Nous choisirons glibc (à l'avenir, il sera nécessaire d'utiliser systemd).
En-têtes de noyau et séries d'en-têtes de noyau personnalisés - doivent correspondre à la version du noyau qui sera sur le système de génération. Pour les en-têtes du noyau, vous pouvez également spécifier le chemin d'accès au référentiel tarball ou git.
VERSIONS DU COMPILATEUR GCC - sélectionnez la version du compilateur qui sera utilisée pour l'assemblage
Activer la prise en charge C ++ - sélectionnez l'assemblage avec prise en charge des bibliothèques c ++ dans le système. À l'avenir, cela sera utile.
Options gcc supplémentaires - vous pouvez définir des options de compilation supplémentaires. Nous n'en avons pas besoin jusqu'à présent.
La configuration du système vous permet de définir les futurs paramètres du système créé:

La plupart des points ressortent clairement du nom. Faites attention aux points suivants:
Chemin d'accès aux tables d'utilisateurs - table avec les utilisateurs créés ( https://buildroot.org/downloads/manual/manual.html#makeuser-syntax ).
Exemple de fichier. L'utilisateur utilisateur sera créé avec le mot de passe admin, automatiquement gid / uid, / bin / sh shell, utilisateur du groupe par défaut, membre du groupe racine, commenter l'utilisateur Foo
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt user -1 user -1 =admin /home/user /bin/sh root Foo user
Répertoires de superposition du système de fichiers racine - un répertoire superposé au-dessus des cibles-f assemblées. Ajoute de nouveaux fichiers et remplace ceux existants.
Scripts personnalisés à exécuter avant de créer des images de système de fichiers - Scripts exécutés immédiatement avant que le système de fichiers ne soit réduit en images. Le script lui-même sera laissé vide pour l'instant.
Passons à la section Kernel

Les paramètres du noyau sont définis ici. Le noyau lui-même est configuré via make linux-menuconfig.
Vous pouvez définir la version du noyau de différentes manières: choisissez parmi celles proposées, entrez la version manuellement, spécifiez le référentiel ou l'archive tar prête.
Configuration du noyau - le chemin vers la configuration du noyau. Vous pouvez choisir la configuration par défaut pour l'architecture sélectionnée ou defocnfig sous Linux. Les sources Linux ont un ensemble de defconfig pour différents systèmes cibles. Vous pouvez trouver le bon en regardant directement la source ici . Par exemple, pour un tableau noir en os de beagle, vous pouvez sélectionner une configuration .
La section Packages cibles vous permet de choisir les packages à installer sur le système de génération. Laissez-le inchangé pour l'instant. Plus tard, nous ajouterons nos packages à cette liste.
Images du système de fichiers - une liste d'images du système de fichiers à compiler. Ajouter une image ISO

Bootloaders - le choix des bootloaders assemblés. Choisissez isolinix

Configuration de Systemd
Systemd devient l'un des piliers de Linux, avec le noyau et la glibc. Par conséquent, j'ai fait sa configuration dans un paragraphe séparé.
Il est configuré via make menuconfig, puis Target packages → System tools → systemd. Ici, vous pouvez spécifier quels services systemd seront installés et démarrés au démarrage du système.

Enregistrement de la configuration du système
Enregistrez cette configuration via KConfig.
Enregistrez ensuite notre defconfig:
make savedefconfig
Configuration du noyau Linux
La configuration du noyau Linux est invoquée avec la commande suivante:
make linux-menuconfig
Ajout de la prise en charge de la carte graphique Virtualbox

Ajouter la prise en charge de l'intégration de Virtualbox Guest

Enregistrez et quittez. IMPORTANT : la configuration sera enregistrée dans output / build / linux- $ version / config, mais pas dans board / my_x86_board / linux.config

Par conséquent, vous devez copier manuellement la configuration dans l'emplacement de stockage:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Avec cette commande, je copie la configuration complète du noyau, ce qui n'est pas toujours nécessaire. Une manière plus correcte consiste à conserver le noyau defconfig:
make linux-update-defconfig
Après cela, nous effectuons un remontage complet de l'ensemble du système. Puisque buildroot ne réassemble pas le déjà assemblé, vous devez spécifier manuellement les packages pour le réassemblage. Afin de ne pas perdre de temps et de nerfs, il est plus facile de reconstruire tout le petit système):
make clean;make
Une fois la construction terminée, exécutez VirtualBox (testé sur les versions 5.2 et 6.0) en démarrant à partir du lecteur de CD. Paramètres système:

À partir de l'iso assemblé:

Liste des matériaux utilisés
- Manuel de Buildroot