EinfĂŒhrung
In dieser Artikelreihe möchte ich das Buildroot-Betriebssystem und meine Erfahrungen mit seiner Anpassung vorstellen. Es wird praktische Erfahrungen bei der Erstellung eines kleinen Betriebssystems mit grafischer BenutzeroberflÀche und minimaler FunktionalitÀt geben.
ZunĂ€chst sollte man das Build-System nicht mit einer Distribution verwechseln. Buildroot kann ein System aus einem Satz von Paketen erstellen, die ihm angeboten werden. Es basiert auf Makefiles und bietet daher umfangreiche Anpassungsmöglichkeiten. Ein Paket durch eine andere Version ersetzen, eigenes Paket hinzufĂŒgen, die Build-Regeln Ă€ndern oder das Dateisystem nach der Installation aller Pakete anpassen? All das kann Buildroot.
In Russland wird Buildroot verwendet, aber meiner Meinung nach gibt es wenig russischsprachige Informationen fĂŒr AnfĂ€nger.
Ziel der Arbeit ist es, eine Distribution mit Live-Start, einer IceWM-OberflÀche und einem Browser zu erstellen. Die Zielplattform ist VirtualBox.
Warum sollte man seine eigene Distribution erstellen? Oft benötigt man eine eingeschrĂ€nkte FunktionalitĂ€t bei begrenzten Ressourcen. Noch hĂ€ufiger mĂŒssen im Automatisierungsprozess Firmware erstellt werden. Eine allgemeine Distribution anzupassen, indem ĂŒberflĂŒssige Pakete entfernt werden und sie in eine Firmware umgewandelt wird, ist weitaus mĂŒhsamer, als eine neue Distribution zu erstellen. Auch die Verwendung von Gentoo hat ihre eigenen EinschrĂ€nkungen.
Buildroot ist ein sehr leistungsfĂ€higes System, aber es tut nichts fĂŒr Sie. Es bietet lediglich Möglichkeiten und automatisiert den Build-Prozess.
Alternative Build-Systeme (Yocto, Open Build System und andere) werden nicht betrachtet und nicht verglichen.
Wo man es finden kann und wie man anfÀngt
Die Projektwebsite ist â . Hier kann man die aktuelle Version herunterladen und die Anleitung lesen. Dort kann man auch die Community ansprechen, es gibt einen Bugtracker, Mailinglisten und einen IRC-Kanal.
Buildroot arbeitet mit Defconfigs fĂŒr die Zielplatine. Defconfig ist eine Konfigurationsdatei, die nur Optionen enthĂ€lt, die keine Standardwerte haben. Sie bestimmt, was und wie gebaut wird. Dabei können die Konfigurationen von Busybox, Linux-Kernel, uClibc sowie die Bootloader u-boot und barebox separat eingestellt werden, aber alle werden an die Zielplatine gebunden sein.
Nach dem Entpacken des heruntergeladenen Archivs oder dem Klonen aus Git erhalten wir ein betriebsbereites Buildroot. Detaillierte Informationen zur Verzeichnisstruktur finden Sie im Handbuch, ich werde die wichtigsten Punkte erlÀutern:
board â Verzeichnis mit platzierten spezifischen Dateien fĂŒr jede Platine. Dazu gehören Skripte zur Erstellung von System-Images (ISO, SDCart, CPIO usw.), das Overlay-Verzeichnis, Kernel-Konfigurationen und weitere Dateien.
configs â tatsĂ€chlich die defconfig der Platine. Defconfig ist eine unvollstĂ€ndige Konfiguration der Platine. Sie enthĂ€lt nur die Parameter, die von den standardmĂ€Ăigen Einstellungen abweichen.
dl â Verzeichnis mit heruntergeladenen Quellcodes/Dateien fĂŒr den Build.
output/target â das erstellte Dateisystem des erhaltenen Betriebssystems. Daraus werden spĂ€ter Images fĂŒr das Booten/Installieren erstellt.
output/host â Host-Utilities fĂŒr den Build.
output/build â erstellte Pakete.
Die Konfiguration des Builds erfolgt ĂŒber KConfig. Dasselbe System wird fĂŒr den Bau des Linux-Kernels verwendet. Hier ist eine Liste der am hĂ€ufigsten verwendeten Befehle (auszufĂŒhren im Verzeichnis Buildroot):
- make menuconfig â um die Build-Konfiguration aufzurufen. Es besteht auch die Möglichkeit, eine grafische BenutzeroberflĂ€che zu nutzen (make nconfig, make xconfig, make gconfig).
- make linux-menuconfig â um die Kernel-Konfiguration aufzurufen.
- make clean â bereinigen Sie die Build-Ergebnisse (alle Inhalte im output)
- make â das System zusammenstellen. Dabei werden bereits kompilierte Prozesse nicht erneut gebaut.
- make defconfig_name â die Konfiguration auf einen bestimmten defconfig umschalten
- make list-defconfigs â eine Liste der defconfig anzeigen
- make source â nur die Installationsdateien herunterladen, ohne zu bauen.
- make help â eine Liste der verfĂŒgbaren Befehle ausgeben
Wichtige Hinweise und nĂŒtzliche Tipps
Buildroot rekonstruiert keine bereits erstellten Pakete! Daher kann die Notwendigkeit entstehen, eine vollstĂ€ndige Neukompilierung durchzufĂŒhren.
Ein einzelnes Paket kann mit dem Befehl rekonstruiert werden make packagename-rebuild. Zum Beispiel kann der Linux-Kernel rekonstruiert werden:
make linux-rebuildBuildroot speichert den Zustand eines Pakets durch die Erstellung von .stamp-Dateien im Verzeichnis output/build/$packagename:

Daher können root-fs und Images ohne Neukompilierung der Pakete rekonstruiert werden:
rm output/build/host-gcc-final-*/.stamp_host_installed; rm -rf output/target; find output/ -name ".stamp_target_installed" | xargs rm -rf ; makeNĂŒtzliche Variablen
Im Buildroot gibt es eine Reihe von Variablen fĂŒr eine bequeme Konfiguration
- $TOPDIR â Stammverzeichnis von Buildroot
- $BASEDIR â Verzeichnis OUTPUT
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR â Verzeichnisse fĂŒr die Erstellung von Host-FS, Staging-FS, Ziel-FS.
- $BUILD_DIR â Verzeichnis mit entpackten und zusammengesetzten Paketen
Visualisierung
In Buildroot gibt es die Möglichkeit zur Visualisierung. Sie können ein AbhĂ€ngigkeitsdiagramm, ein Diagramm der Build-Zeit und ein Diagramm der PaketgröĂen im Endsystem erstellen. Die Ergebnisse liegen in Form von PDF-Dateien vor (auf Wunsch auch als SVN, PNG) im Verzeichnis output/graph.
Beispiele fĂŒr Visualisierungsbefehle:
make graph-dependsAbhĂ€ngigkeitsbaum erstellenmake -graph-dependsAbhĂ€ngigkeitsbaum eines bestimmten Pakets erstellenBR2_GRAPH_OUT=png make graph-buildBuild-Zeit-Diagramm im PNG-Format erstellenmake graph-sizeDiagramm der PaketgröĂen erstellen
NĂŒtzliche Skripte
Im Buildroot-Verzeichnis gibt es ein Unterverzeichnis utils mit nĂŒtzlichen Skripten. Zum Beispiel gibt es ein Skript, das die Richtigkeit der Paketbeschreibungen ĂŒberprĂŒft. Dies kann hilfreich sein, wenn Sie eigene Pakete hinzufĂŒgen (ich werde dies spĂ€ter tun). Im Datei utils/readme.txt gibt es eine Beschreibung dieser Skripte.
Wir erstellen ein Standard-Distribution
Es ist wichtig zu beachten, dass alle Operationen im Namen eines normalen Benutzers und nicht von root durchgefĂŒhrt werden.
Alle Befehle werden im Stammverzeichnis von Buildroot ausgefĂŒhrt. In der Buildroot-Lieferung gibt es bereits eine Reihe von Konfigurationen fĂŒr viele gĂ€ngige Platinen und Virtualisierung.
Lassen Sie uns die Konfigurationen anzeigen:

Wir wechseln zu der Konfiguration qemu_x86_64_defconfig
make qemu_x86_64_defconfigUnd starten den Build
makeDer Bau wurde erfolgreich abgeschlossen, schauen wir uns die Ergebnisse an:
![]()
Buildroot hat Images erstellt, die in Qemu gestartet werden können, um sicherzustellen, dass sie funktionieren.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -SDas Ergebnis â ein in Qemu gestartetes System:

Erstellung der Konfiguration fĂŒr die eigene Platine
HinzufĂŒgen der Dateien fĂŒr die Platine
Lassen Sie uns die Konfigurationen anzeigen:

Im MenĂŒ sehen wir pc_x86_64_efi_defconfig. Wir werden unsere Platine erstellen, indem wir sie von dieser Konfiguration kopieren:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfigLassen Sie uns sofort ein Verzeichnis fĂŒr die Platine erstellen, um unsere Skripte, rootfs-overlay und andere benötigte Dateien zu speichern:
mkdir board/my_x86_boardWir wechseln zu diesem defconfig:
make my_x86_board_defconfigSo entspricht die Build-Konfiguration jetzt (gespeichert in .config im Hauptverzeichnis von Buildroot) der Zielmaschine x86-64 Legacy (BIOS) Boot.
Kopieren Sie die Konfiguration des Linux-Kernels (nĂŒtzlich fĂŒr die Zukunft):
cp board/pc/linux.config board/my_x86_board/Konfiguration der Build-Parameter ĂŒber KConfig
Starten Sie die Konfiguration:
make menuconfig Das KConfig-Fenster wird geöffnet. Es gibt die Möglichkeit, mit einer grafischen BenutzeroberflÀche zu konfigurieren (make nconfig, make xconfig, make gconfig):

Gehen Sie in den ersten Abschnitt Target Options. Hier kann die Zielarchitektur ausgewĂ€hlt werden, fĂŒr die der Build durchgefĂŒhrt wird.

Build-Optionen â hier finden Sie verschiedene Einstellungen fĂŒr den Build-Prozess. Sie können Verzeichnisse mit Quellcodes, die Anzahl der Build-Threads, Mirrors zum Herunterladen der Quellcodes und andere Einstellungen angeben. Lassen Sie die Standardkonfigurationen unverĂ€ndert.
Toolchain â hier wird das eigentliche Build-Toolset konfiguriert. Weitere Informationen dazu folgen.

Toolchain-Typ â der verwendete Toolchain-Typ. Dies kann entweder der in Buildroot integrierte oder ein externer Toolchain sein (Sie können ein Verzeichnis mit bereits erstellten Dateien oder eine URL zum Herunterladen angeben). FĂŒr verschiedene Architekturen gibt es zusĂ€tzliche Optionen. Beispielsweise kann fĂŒr ARM einfach die Version des externen Linaro-Toolchains ausgewĂ€hlt werden.
C-Bibliothek â die Wahl der C-Bibliothek, die fĂŒr die gesamte SystemfunktionalitĂ€t entscheidend ist. In der Regel wird glibc verwendet, die alle möglichen Funktionen unterstĂŒtzt. Diese kann jedoch zu umfangreich fĂŒr ein Embedded-System sein, weshalb oft uglibc oder musl gewĂ€hlt werden. Wir wĂ€hlen glibc (dies ist spĂ€ter erforderlich, um systemd verwenden zu können).
Kernel-Header und benutzerdefinierte Kernel-Header-Serie â mĂŒssen mit der Version des Kernels ĂŒbereinstimmen, die im zu erstellenden System verwendet wird. FĂŒr Kernel-Header können Sie auch den Pfad zu einem Tarball oder ein Git-Repository angeben.
GCC-KOMPILER VERSIONEN â WĂ€hlen Sie die Version des Compilers aus, die fĂŒr den Build verwendet werden soll.
C++-UnterstĂŒtzung aktivieren â Wir wĂ€hlen fĂŒr den Build die UnterstĂŒtzung von C++-Bibliotheken im System. Dies wird uns spĂ€ter nĂŒtzlich sein.
ZusĂ€tzliche gcc-Optionen â Hier können zusĂ€tzliche Compiler-Optionen angegeben werden. Momentan benötigen wir das nicht.
Die Systemkonfiguration ermöglicht es, zukĂŒnftige Parameter des erstellten Systems festzulegen:

Die meisten Punkte sind aus dem Titel klar. Beachten Sie insbesondere die folgenden Punkte:
Pfad zu den Benutzertabellen â Tabelle mit den zu erstellenden Benutzern ().
Beispiel einer Datei. Es wird ein Benutzer mit dem Namen user und dem Passwort admin erstellt, automatisch gid/uid, mit /bin/sh als Shell, der Standardgruppe user zugeordnet und Mitglied der Gruppe root, Kommentar Foo user.
[alexey@alexey-pc buildroot]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo userRoot-Dateisystem-Overlay-Verzeichnisse â Verzeichnis, das ĂŒber das erstellte target-fs gelegt wird. FĂŒgt neue Dateien hinzu und ersetzt vorhandene.
Benutzerdefinierte Skripte, die vor der Erstellung von Dateisystembildern ausgefĂŒhrt werden â Skripte, die direkt vor dem Packen des Dateisystems in Abbildern ausgefĂŒhrt werden. Das Skript lassen wir zunĂ€chst leer.
Gehen wir zum Abschnitt Kernel

Hier werden die Kernel-Einstellungen festgelegt. Der Kernel wird ĂŒber make linux-menuconfig konfiguriert.
Die Kernelversion kann auf verschiedene Arten festgelegt werden: entweder aus den vorgeschlagenen auswÀhlen, die Version manuell eingeben, ein Repository angeben oder ein fertiges Tarball verwenden.
Die Kernelkonfiguration ist der Pfad zur Kernelkonfiguration. Es kann die Standardkonfiguration fĂŒr die gewĂ€hlte Architektur oder ein defconfig aus Linux ausgewĂ€hlt werden. In den Linux-Quellen gibt es eine Reihe von defconfigs fĂŒr verschiedene Zielsysteme. Die benötigte Konfiguration kann Zum Beispiel kann fĂŒr das BeagleBone Black .
Der Abschnitt Zielpakete ermöglicht es, auszuwĂ€hlen, welche Pakete im zu erstellenden System installiert werden. Wir lassen das vorerst unverĂ€ndert. SpĂ€ter fĂŒgen wir unsere Pakete zu dieser Liste hinzu.
Dateisystem-Images sind eine Liste von Dateisystemabbildern, die erstellt werden. Wir fĂŒgen ein ISO-Image hinzu.

Bootloader â die Auswahl der zu erstellenden Bootloader. Wir wĂ€hlen isolinix aus.

Konfiguration von Systemd.
Systemd wird zu einer der SĂ€ulen von Linux, neben Kernel und glibc. Deshalb habe ich seine Konfiguration in einen eigenen Punkt ausgegliedert.
Die Konfiguration erfolgt ĂŒber make menuconfig, dann Zielpakete â Systemtools â systemd. Hier kann angegeben werden, welche Systemd-Dienste installiert und beim Systemstart aktiviert werden.

Speicherung der Systemkonfiguration.
Wir speichern diese Konfiguration ĂŒber KConfig.
AnschlieĂend speichern wir unser defconfig:
make savedefconfigKonfiguration des Linux-Kernels
Die Konfiguration des Linux-Kernels erfolgt mit folgendem Befehl:
make linux-menuconfigFĂŒgen wir die UnterstĂŒtzung fĂŒr die VirtualBox-Grafikkarte hinzu.

FĂŒgen wir die UnterstĂŒtzung fĂŒr die VirtualBox-Gastintegration hinzu.

Speichern und beenden. WICHTIG: die Konfiguration wird in output/build/linux-$version/config gespeichert, jedoch nicht in board/my_x86_board/linux.config.

Sie mĂŒssen daher die Konfiguration manuell an den Speicherort kopieren:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.configAnschlieĂend fĂŒhren wir eine vollstĂ€ndige Neubau der gesamten Systemumgebung durch. Da Buildroot bereits erstellte Pakete nicht neu erstellt, mĂŒssen die Pakete manuell zur Neubearbeitung angegeben werden. Um Zeit und Nerven zu sparen, ist es einfacher, ein kleines System vollstĂ€ndig neu zu erstellen:
make clean; makeNach Abschluss des Baus starten wir VirtualBox (getestet mit Version 5.2 und 6.0) und booten von der CD. Systemeinstellungen:

Start mit dem erstellten ISO:

Liste der verwendeten Materialien
- Buildroot-Handbuch
Quelle: habr.com
