Buildroot - deel 2. Uw bordconfiguratie maken; met behulp van externe boom, rootfs-overlay, post-build-scripts

In dit gedeelte bekijk ik enkele aanpassingsopties die ik nodig had. Dit is geen volledige lijst van wat buildroot te bieden heeft, maar ze zijn behoorlijk functioneel en vereisen geen tussenkomst in de bestanden van buildroot zelf.

Het EXTERNE mechanisme gebruiken voor maatwerk

In het vorige artikel We hebben gekeken naar een eenvoudig voorbeeld van het toevoegen van je eigen configuratie door de defconfig van het bord en de benodigde bestanden rechtstreeks aan de map Buildroot toe te voegen.

Maar deze methode is niet erg handig, vooral niet bij het updaten van buildroot. Er bestaat een mechanisme om dit probleem op te lossen externe boom. De essentie ervan is dat je board, configs, pakketten en andere mappen in een aparte map kunt opslaan (ik gebruik bijvoorbeeld de map patches om patches op pakketten toe te passen, meer details in een aparte sectie) en buildroot zelf zal ze toevoegen aan die in zijn map.

Let op: je kunt meerdere externe bomen tegelijk over elkaar heen leggen; er staat een voorbeeld in de buildroot-handleiding

Laten we een map my_tree maken, gelegen naast de buildroot-map, en onze configuratie daarheen overbrengen. De uitvoer moet de volgende bestandsstructuur hebben:

[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 je kunt zien herhaalt de structuur over het algemeen de structuur van buildroot.

Adresboek boord bevat bestanden die specifiek zijn voor elk bord in ons geval:

  • bef_cr_fs_img.sh is een script dat wordt uitgevoerd nadat het doelbestandssysteem is gebouwd, maar voordat het in afbeeldingen wordt verpakt. Wij zullen er in de toekomst gebruik van maken
  • linux.config - kernelconfiguratie
  • rootfs_overlay - map die over het doelbestandssysteem heen moet worden geplaatst
  • users.txt - een bestand dat de aan te maken gebruikers beschrijft

Adresboek configs bevat defconfig van onze boards. Wij hebben er maar één.

Pakket - catalogus met onze pakketten. Aanvankelijk bevat buildroot beschrijvingen en regels voor het bouwen van een beperkt aantal pakketten. Later zullen we hier de icewm window manager en de Slim grafische login manager toevoegen.
Patches — hiermee kunt u uw patches voor verschillende pakketten gemakkelijk opslaan. Meer details in een apart gedeelte hieronder.
Nu moeten we de beschrijvingsbestanden voor onze externe boom toevoegen. Hiervoor zijn 3 bestanden verantwoordelijk: external.desc, Config.in, external.mk.

externe.desc bevat de daadwerkelijke beschrijving:

[alexey@alexey-pc my_tree]$ cat external.desc 
name: my_tree
desc: My simple external-tree for article

De eerste regel is de titel. In de toekomst maakt buildroot een variabele $(BR2_EXTERNAL_MY_TREE_PATH), die moet worden gebruikt bij het configureren van de assembly. Het pad naar het gebruikersbestand kan bijvoorbeeld als volgt worden ingesteld:

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

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

Config.in, externe.mk — bestanden om toegevoegde pakketten te beschrijven. Als u geen eigen pakketten toevoegt, kunnen deze bestanden leeg blijven. Voorlopig zullen we dat doen.
Nu hebben we onze externe boom gereed, met daarin de defconfig van ons bord en de bestanden die het nodig heeft. Laten we naar de buildroot-map gaan en opgeven dat we external-tree willen gebruiken:

[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuration written to /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfig

In het eerste commando gebruiken we het argument BR2_EXTERNAL=../mijn_boom/, waarmee het gebruik van een externe boom wordt aangegeven. U kunt meerdere externe-bomen opgeven die u tegelijkertijd wilt gebruiken. In dit geval hoeft u dit slechts één keer te doen, waarna er een bestand output/.br-external.mk wordt aangemaakt dat slaat informatie op over de gebruikte externe boom:

[alexey@alexey-pc buildroot]$ cat output/.br-external.mk 
#
# Automatically generated file; DO NOT EDIT.
#

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 = My simple external-tree for article

Belangrijk! De paden in dit bestand zijn absoluut!

Er is een item Externe opties in het menu verschenen:

Buildroot - deel 2. Uw bordconfiguratie maken; met behulp van externe boom, rootfs-overlay, post-build-scripts

Dit submenu bevat onze pakketten uit onze externe boom. Deze sectie is momenteel leeg.

Nu is het belangrijker voor ons om de noodzakelijke paden te herschrijven om de externe boom te gebruiken.

Houd er rekening mee dat er in de sectie Build-opties → Locatie om buildroot-configuratie op te slaan een absoluut pad zal zijn naar de opgeslagen defconfig. Het wordt gevormd op het moment dat het gebruik van extgernal_tree wordt gespecificeerd.

We zullen ook de paden corrigeren in de sectie Systeemconfiguratie. Voor een tabel met aangemaakte gebruikers:

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

Wijzig in de Kernel-sectie het pad naar de kernelconfiguratie:

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

Nu zullen onze bestanden uit onze externe boom gebruikt worden tijdens de montage. Bij het verplaatsen naar een andere map of het bijwerken van de buildroot zullen we een minimum aan problemen ondervinden.

Root fs-overlay toevoegen:

Met dit mechanisme kunt u eenvoudig bestanden toevoegen/vervangen in het doelbestandssysteem.
Als het bestand zich in de root fs-overlay bevindt, maar niet in het doel, wordt het toegevoegd
Als het bestand zich in root fs-overlay en in target bevindt, wordt het vervangen.
Laten we eerst het pad instellen naar de root fs overlay dir. Dit wordt gedaan in de sectie Systeemconfiguratie → Overlay-mappen voor rootbestandssysteem:

$(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 
This is new file from overlay

Het eerste bestand (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) zal het bestand /etc/hosts op het voltooide systeem vervangen. Het tweede bestand (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) zal worden toegevoegd.

Wij verzamelen en controleren:

Buildroot - deel 2. Uw bordconfiguratie maken; met behulp van externe boom, rootfs-overlay, post-build-scripts

Uitvoering van aanpassingsscripts in verschillende stadia van de systeemassemblage

Vaak moet u wat werk verrichten binnen het doelbestandssysteem voordat het in afbeeldingen wordt verpakt.

Dit kunt u doen in de sectie Systeemconfiguratie:

Buildroot - deel 2. Uw bordconfiguratie maken; met behulp van externe boom, rootfs-overlay, post-build-scripts

De eerste twee scripts worden uitgevoerd nadat het doelbestandssysteem is gebouwd, maar voordat het in afbeeldingen wordt verpakt. Het verschil is dat het fakeroot-script wordt uitgevoerd in de context van fakeroot, wat het werk als rootgebruiker simuleert.

Het laatste script wordt uitgevoerd nadat de systeemimages zijn gemaakt. U kunt daarin extra acties uitvoeren, bijvoorbeeld de benodigde bestanden naar een NFS-server kopiëren of een image maken van de firmware van uw apparaat.

Als voorbeeld maak ik een script dat de versie en de builddatum naar /etc/ schrijft.
Eerst zal ik het pad naar dit bestand in mijn externe boom aangeven:

Buildroot - deel 2. Uw bordconfiguratie maken; met behulp van externe boom, 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 "my small linux 1.0 pre alpha" > output/target/etc/mysmalllinux-release
date >> output/target/etc/mysmalllinux-release

Na montage kunt u dit bestand op het systeem bekijken.

In de praktijk kan het script groot worden. Daarom heb ik in het echte project een meer geavanceerde route gevolgd:

  1. Ik heb een map gemaakt (my_tree/board_my_x86_board/inside_fakeroot_scripts) waarin scripts moeten worden uitgevoerd, met serienummers. Bijvoorbeeld 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Ik heb een script geschreven (my_tree/board_my_x86_board/run_inside_fakeroot.sh) dat door deze map gaat en achtereenvolgens de scripts daarin uitvoert
  3. Dit script opgegeven in de bordinstellingen in de sectie Systeemconfiguratie -> Aangepaste scripts om uit te voeren in de fakeroot-omgeving ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

Bron: www.habr.com

Voeg een reactie