Buildroot – Teil 2. Erstellen Ihrer Board-Konfiguration; Verwendung von externen Baum-, Rootfs-Overlay- und Post-Build-Skripten

In diesem Abschnitt schaue ich mir einige der Anpassungsoptionen an, die ich benötigte. Dies ist keine vollständige Liste der Angebote von Buildroot, aber sie sind recht funktionsfähig und erfordern keinen Eingriff in die Dateien von Buildroot selbst.

Verwendung des EXTERNEN Mechanismus zur Anpassung

In einem früheren Artikel Wir haben uns ein einfaches Beispiel für das Hinzufügen einer eigenen Konfiguration angesehen, indem wir die Defconfig des Boards und die erforderlichen Dateien direkt zum Buildroot-Verzeichnis hinzugefügt haben.

Diese Methode ist jedoch nicht sehr praktisch, insbesondere beim Aktualisieren von Buildroot. Es gibt einen Mechanismus, um dieses Problem zu lösen externer Baum. Das Wesentliche ist, dass Sie Board, Konfigurationen, Pakete und andere Verzeichnisse in einem separaten Verzeichnis speichern können (ich verwende zum Beispiel das Patches-Verzeichnis, um Patches auf Pakete anzuwenden, weitere Details in einem separaten Abschnitt) und Buildroot selbst wird sie zu denen in hinzufügen sein Verzeichnis.

Hinweis: Sie können mehrere externe Bäume gleichzeitig überlagern. Ein Beispiel finden Sie im Buildroot-Handbuch

Erstellen wir ein Verzeichnis my_tree, das sich neben dem Buildroot-Verzeichnis befindet, und übertragen wir unsere Konfiguration dorthin. Die Ausgabe sollte die folgende Dateistruktur haben:

[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

Wie Sie sehen können, wiederholt die Struktur im Allgemeinen die Struktur von buildroot.

Verzeichnis Tafel enthält in unserem Fall für jedes Board spezifische Dateien:

  • bef_cr_fs_img.sh ist ein Skript, das nach dem Erstellen des Zieldateisystems, aber vor dem Packen in Images ausgeführt wird. Wir werden es in Zukunft nutzen
  • linux.config – Kernel-Konfiguration
  • rootfs_overlay – Verzeichnis, das über das Zieldateisystem gelegt werden soll
  • „users.txt“ – eine Datei, die die zu erstellenden Benutzer beschreibt

Verzeichnis konfiguriert enthält die Defconfig unserer Boards. Wir haben nur einen.

Paket - Katalog mit unseren Paketen. Buildroot enthält zunächst Beschreibungen und Regeln zum Erstellen einer begrenzten Anzahl von Paketen. Später werden wir hier den Icewm-Fenstermanager und den Slim-Grafik-Login-Manager hinzufügen.
Patches – ermöglicht Ihnen die bequeme Speicherung Ihrer Patches für verschiedene Pakete. Weitere Details finden Sie weiter unten in einem separaten Abschnitt.
Jetzt müssen wir die Beschreibungsdateien für unseren externen Baum hinzufügen. Dafür sind 3 Dateien verantwortlich: external.desc, Config.in, external.mk.

external.desc enthält die eigentliche Beschreibung:

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

Die erste Zeile ist der Titel. Erstellen Sie in Zukunft eine Variable mit buildroot $(BR2_EXTERNAL_MY_TREE_PATH), die beim Konfigurieren der Assembly verwendet werden sollte. Der Pfad zur Benutzerdatei kann beispielsweise wie folgt festgelegt werden:

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

Die zweite Zeile ist eine kurze, für Menschen lesbare Beschreibung.

Config.in, external.mk – Dateien zur Beschreibung hinzugefügter Pakete. Wenn Sie keine eigenen Pakete hinzufügen, können diese Dateien leer bleiben. Das ist es, was wir vorerst tun werden.
Jetzt haben wir unseren externen Baum fertig, der die Defconfig unseres Boards und die benötigten Dateien enthält. Gehen wir zum Buildroot-Verzeichnis und geben an, dass external-tree verwendet werden soll:

[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

Im ersten Befehl verwenden wir das Argument BR2_EXTERNAL=../mein_Baum/, was die Verwendung eines externen Baums anzeigt. Sie können mehrere externe Bäume zur gleichzeitigen Verwendung angeben. In diesem Fall müssen Sie dies nur einmal tun, woraufhin eine Datei „output/.br-external.mk“ erstellt wird speichert Informationen über den verwendeten externen Baum:

[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

Wichtig! Die Pfade in dieser Datei sind absolut!

Im Menü ist ein Eintrag „Externe Optionen“ aufgetaucht:

Buildroot – Teil 2. Erstellen Ihrer Board-Konfiguration; Verwendung von externen Baum-, Rootfs-Overlay- und Post-Build-Skripten

Dieses Untermenü enthält unsere Pakete aus unserem externen Baum. Dieser Abschnitt ist derzeit leer.

Jetzt ist es für uns wichtiger, die notwendigen Pfade für die Verwendung von external-tree neu zu schreiben.

Bitte beachten Sie, dass im Abschnitt Build-Optionen → Speicherort zum Speichern der Buildroot-Konfiguration ein absoluter Pfad zur gespeicherten Defconfig vorhanden ist. Es wird zum Zeitpunkt der Angabe der Verwendung von extgernal_tree gebildet.

Wir werden auch die Pfade im Abschnitt Systemkonfiguration korrigieren. Für eine Tabelle mit erstellten Benutzern:

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

Ändern Sie im Abschnitt Kernel den Pfad zur Kernel-Konfiguration:

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

Jetzt werden unsere Dateien aus unserem externen Baum beim Zusammenbau verwendet. Beim Verschieben in ein anderes Verzeichnis oder beim Aktualisieren des Buildroots treten nur minimale Probleme auf.

Root-FS-Overlay hinzufügen:

Dieser Mechanismus ermöglicht Ihnen das einfache Hinzufügen/Ersetzen von Dateien im Zieldateisystem.
Wenn sich die Datei im Root-FS-Overlay, aber nicht im Ziel befindet, wird sie hinzugefügt
Wenn sich die Datei im Root-FS-Overlay und im Ziel befindet, wird sie ersetzt.
Legen wir zunächst den Pfad zum Root-FS-Overlay-Verzeichnis fest. Dies geschieht im Abschnitt Systemkonfiguration → Root-Dateisystem-Overlay-Verzeichnisse:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/

Jetzt erstellen wir zwei Dateien.

[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

Die erste Datei (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) ersetzt die Datei /etc/hosts auf dem fertigen System. Die zweite Datei (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) wird hinzugefügt.

Wir sammeln und prüfen:

Buildroot – Teil 2. Erstellen Ihrer Board-Konfiguration; Verwendung von externen Baum-, Rootfs-Overlay- und Post-Build-Skripten

Ausführung von Anpassungsskripten in verschiedenen Phasen der Systemmontage

Oft müssen Sie einige Arbeiten im Zieldateisystem durchführen, bevor es in Images gepackt wird.

Dies kann im Abschnitt Systemkonfiguration erfolgen:

Buildroot – Teil 2. Erstellen Ihrer Board-Konfiguration; Verwendung von externen Baum-, Rootfs-Overlay- und Post-Build-Skripten

Die ersten beiden Skripte werden ausgeführt, nachdem das Zieldateisystem erstellt wurde, aber bevor es in Images gepackt wird. Der Unterschied besteht darin, dass das Fakeroot-Skript im Kontext von Fakeroot ausgeführt wird, wodurch die Arbeit als Root-Benutzer simuliert wird.

Das letzte Skript wird ausgeführt, nachdem die Systemabbilder erstellt wurden. Sie können darin zusätzliche Aktionen ausführen, beispielsweise die erforderlichen Dateien auf einen NFS-Server kopieren oder ein Image Ihrer Geräte-Firmware erstellen.

Als Beispiel erstelle ich ein Skript, das die Version und das Erstellungsdatum in /etc/ schreibt.
Zuerst werde ich den Pfad zu dieser Datei in meinem externen Baum angeben:

Buildroot – Teil 2. Erstellen Ihrer Board-Konfiguration; Verwendung von externen Baum-, Rootfs-Overlay- und Post-Build-Skripten

Und nun das Skript selbst:

[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

Nach dem Zusammenbau können Sie diese Datei auf dem System sehen.

In der Praxis kann das Skript groß werden. Deshalb habe ich im realen Projekt einen fortgeschritteneren Weg gewählt:

  1. Ich habe ein Verzeichnis (my_tree/board_my_x86_board/inside_fakeroot_scripts) erstellt, in dem sich auszuführende Skripte mit Seriennummern befinden. Zum Beispiel 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Ich habe ein Skript geschrieben (my_tree/board_my_x86_board/run_inside_fakeroot.sh), das dieses Verzeichnis durchläuft und die darin enthaltenen Skripte nacheinander ausführt
  3. Dieses Skript wurde in den Board-Einstellungen im Abschnitt Systemkonfiguration -> Benutzerdefinierte Skripte zur Ausführung in der Fakeroot-Umgebung ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh) angegeben

Source: habr.com

Kommentar hinzufügen