Buildroot – deel 2. De configuratie van uw bord aanmaken; toepassing van external tree, rootfs-overlay, post-build scripts

In dit gedeelte bespreek ik enkele aanpassingsmogelijkheden die ik nodig had. Dit is geen volledige lijst van wat buildroot biedt, maar ze zijn functioneel en vereisen geen ingreep in de bestanden van buildroot.

Gebruik van de EXTERNAL-mechanisme voor aanpassing

In het vorige artikel er werd een eenvoudig voorbeeld beschouwd van het toevoegen van een eigen configuratie door een defconfig van het bord en de benodigde bestanden rechtstreeks in de Buildroot-directory toe te voegen.

Maar deze methode is niet erg handig, vooral bij het bijwerken van buildroot. Om dit probleem op te lossen, is er een mechanisme external tree. Het idee is dat je in een aparte directory de directories board, configs, packages en andere kunt opslaan (bijvoorbeeld gebruik ik de directory patches om patchen op pakketten aan te brengen, meer daarover in een apart gedeelte) en buildroot zal deze zelf toevoegen aan die in zijn eigen directory.

Opmerking: je kunt meerdere external trees tegelijk toepassen, er is een voorbeeld in de buildroot-handleiding

Laten we een directory my_tree maken, gelegen naast de buildroot-directory, en daar onze configuratie naartoe verplaatsen. Aan het eind moeten we de volgende bestandsstructuur krijgen:

[alexey@alexey-pc my_tree]$ tree
.
├── board
│   └── my_x86_board
│       ├── bef_cr_fs_img.sh
│       ├── linux.config
│       ├── rootfs_overlay
│       └── users.txt
├── Config.in
├── configs
│   └── my_x86_board_defconfig
├── external.desc
├── external.mk
├── package
└── patches

6 directories, 7 files

Zoals te zien is, komt de structuur grotendeels overeen met de structuur van buildroot.

Map board bevat bestanden die specifiek zijn voor elke kaart in ons geval:

  • bef_cr_fs_img.sh — script dat wordt uitgevoerd na het bouwen van de target-bestandssysteem, maar vóór het verpakken in schijven. We zullen het later gebruiken
  • linux.config — kernelconfiguratie
  • rootfs_overlay — directory voor overlayen bovenop het target-bestandssysteem
  • users.txt — bestand met de beschrijving van de te maken gebruikers

Map configs bevat de defconfig's van onze kaarten. In ons geval is er maar één.

Package — directory met onze pakketten. Aanvankelijk bevat buildroot beschrijvingen en bouwregels voor een beperkt aantal pakketten. Later zullen we hier de windowmanager icewm en de grafische loginmanager Slim aan toevoegen.
Patches — maakt het gemakkelijk om je patches voor verschillende pakketten op te slaan. Meer daarover in een apart gedeelte verderop.
Nu moeten we de beschrijvende bestanden voor onze external tree toevoegen. Dit worden de volgende 3 bestanden: external.desc, Config.in, external.mk.

external.desc bevat feitelijk de beschrijving:

[alexey@alexey-pc my_tree]$ cat external.desc 
name: my_tree
desc: Mijn eenvoudige external tree voor artikel

De eerste regel is de naam. Verderop moet buildroot een variabele aanmaken $(BR2_EXTERNAL_MY_TREE_PATH), die moet worden gebruikt bij het configureren van de build. Bijvoorbeeld, het pad naar het gebruikersbestand kan als volgt worden opgegeven:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

De tweede regel is een korte, begrijpelijke beschrijving voor mensen.

Config.in, external.mk — zijn bestanden voor het beschrijven van toegevoegde pakketten. Als je geen eigen pakketten toevoegt, kunnen deze bestanden leeg worden gelaten. Voor nu doen we dat.
Nu hebben we onze external-tree klaar, die de defconfig van ons bord en de benodigde bestanden bevat. Laten we naar de buildroot-directory gaan en aangeven dat we de external-tree willen gebruiken:

[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuratie geschreven naar /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfig

In het eerste commando gebruiken we de argument BR2_EXTERNAL=../my_tree/, waarmee we het gebruik van de external tree aangeven. Je kunt meerdere external-trees tegelijk instellen. Dit hoeft maar één keer te worden gedaan, waarna er een bestand output/.br-external.mk wordt aangemaakt dat informatie over de gebruikte external-tree opslaat:

[alexey@alexey-pc buildroot]$ cat output/.br-external.mk 
#
# Automatisch gegenereerd bestand; BEWERK HET NIET.
#

BR2_EXTERNAL ?= /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_NAMES = 
BR2_EXTERNAL_DIRS = 
BR2_EXTERNAL_MKS = 

BR2_EXTERNAL_NAMES += my_tree
BR2_EXTERNAL_DIRS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_MKS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree/external.mk
export BR2_EXTERNAL_my_tree_PATH = /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
export BR2_EXTERNAL_my_tree_DESC = Mijn simpele external-tree voor het artikel

Let op! In dit bestand zullen de paden absoluut zijn!

In het menu is er een optie voor External options:

Buildroot – deel 2. De configuratie van uw bord aanmaken; toepassing van external tree, rootfs-overlay, post-build scripts

In dit submenu zullen onze pakketten uit onze external-tree worden weergegeven. Dit gedeelte is momenteel leeg.

Het is nu belangrijker om de benodigde paden te herschrijven voor het gebruik van de external-tree.

Let op dat er in het gedeelte Build options → Location to save buildroot config een absoluut pad naar het opgeslagen defconfig zal zijn. Dit wordt gevormd op het moment dat het gebruik van de external_tree wordt aangegeven.

Ook in het gedeelte System configuration zullen we de paden aanpassen. Voor de tabel met aangemaakte gebruikers:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

In het gedeelte Kernel zullen we het pad naar de kernelconfiguratie wijzigen:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config

Nu zullen onze bestanden uit onze external-tree worden gebruikt tijdens de build. Bij het verplaatsen naar een andere directory of het bijwerken van buildroot zullen we minimaal problemen hebben.

Toevoegen van root fs-overlay:

Dit mechanisme maakt het gemakkelijk om bestanden in het doelsysteem toe te voegen/vervangen.
Als een bestand aanwezig is in de root fs-overlay, maar niet in het doel, wordt het toegevoegd.
Als het bestand aanwezig is in de root fs overlay en in de target, wordt het vervangen.
Laten we eerst het pad naar de root fs overlay-directory instellen. Dit doen we in het onderdeel Systeemconfiguratie → Root bestandssysteem overlay mappen:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/

Laten we nu twee bestanden maken.

[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/etc/hosts 
127.0.0.1   localhost
127.0.1.1   my_small_linux
8.8.8.8     google-public-dns-a.google.com.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt 
Dit is een nieuw bestand uit de overlay

Het eerste bestand (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) vervangt het bestand /etc/hosts in het eindproduct. Het tweede bestand (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) wordt toegevoegd.

We bouwen en controleren:

Buildroot – deel 2. De configuratie van uw bord aanmaken; toepassing van external tree, rootfs-overlay, post-build scripts

Het uitvoeren van aanpassingsscripts op verschillende fasen van het systeemopbouwproces

Vaak is het nodig om enkele handelingen binnen het target-bestandssysteem uit te voeren voordat het in beelden wordt verpakt.

Dit kan worden gedaan in het onderdeel Systeemconfiguratie:

Buildroot – deel 2. De configuratie van uw bord aanmaken; toepassing van external tree, rootfs-overlay, post-build scripts

De eerste twee scripts worden uitgevoerd na het bouwen van het target-bestandssysteem, maar voordat het in beelden wordt verpakt. Het verschil is dat het fakeroot-script wordt uitgevoerd in de context van fakeroot, hetgeen de werking van de gebruiker root simuleert.

Het laatste script wordt al uitgevoerd na het maken van de systeembeelden. Hierin kunnen aanvullende acties worden uitgevoerd, zoals het kopiëren van benodigde bestanden naar een nfs-server of het creëren van een beeld van de firmware van het apparaat.

Als voorbeeld zal ik een script maken dat de versie en datum van de opbouw naar /etc/ schrijft.
Eerst geef ik het pad naar dit bestand in mijn external-tree op:

Buildroot – deel 2. De configuratie van uw bord aanmaken; toepassing van external tree, rootfs-overlay, post-build scripts

En nu het script zelf:

[alexey@alexey-pc buildroot]$ cat ../my_tree/board/my_x86_board/bef_cr_fs_img.sh 
#! /bin/sh
echo "mijn kleine linux 1.0 pre alpha" > output/target/etc/mysmalllinux-release
date >> output/target/etc/mysmalllinux-release

Na de opbouw is dit bestand zichtbaar in het systeem.

In de praktijk kan het script groot worden. Daarom heb ik in een echt project een geavanceerdere benadering gekozen:

  1. Ik heb een map gemaakt (my_tree/board_my_x86_board/inside_fakeroot_scripts), waar scripts voor uitvoering in staan, met volgorde nummers. Bijvoorbeeld, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Ik schreef een script (my_tree/board_my_x86_board/run_inside_fakeroot.sh), dat deze map doorloopt en de scripts die erin staan één voor één uitvoert.
  3. Ik gaf dit script op in de bordinstellingen in het gedeelte Systeemconfiguratie -> Aangepaste scripts die moeten worden uitgevoerd in de fakeroot-omgeving ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster