Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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 — buildroot.org. 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-rebuild

Buildroot speichert den Zustand eines Pakets durch die Erstellung von .stamp-Dateien im Verzeichnis output/build/$packagename:

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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 ; make

NĂŒ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-depends AbhĂ€ngigkeitsbaum erstellen
  • make -graph-depends AbhĂ€ngigkeitsbaum eines bestimmten Pakets erstellen
  • BR2_GRAPH_OUT=png make graph-build Build-Zeit-Diagramm im PNG-Format erstellen
  • make graph-size Diagramm 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:

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

Wir wechseln zu der Konfiguration qemu_x86_64_defconfig

make qemu_x86_64_defconfig

Und starten den Build

make

Der Bau wurde erfolgreich abgeschlossen, schauen wir uns die Ergebnisse an:

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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 -S

Das Ergebnis – ein in Qemu gestartetes System:

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

Erstellung der Konfiguration fĂŒr die eigene Platine

HinzufĂŒgen der Dateien fĂŒr die Platine

Lassen Sie uns die Konfigurationen anzeigen:

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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_defconfig

Lassen 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_board

Wir wechseln zu diesem defconfig:

make my_x86_board_defconfig

So 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):

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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.

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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:

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

Die meisten Punkte sind aus dem Titel klar. Beachten Sie insbesondere die folgenden Punkte:
Pfad zu den Benutzertabellen – Tabelle mit den zu erstellenden Benutzern (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

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 user

Root-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

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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 direkt in den Quellen hier gefunden werden.Zum Beispiel kann fĂŒr das BeagleBone Black die Konfiguration ausgewĂ€hlt werden..

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.

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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.

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

Speicherung der Systemkonfiguration.

Wir speichern diese Konfiguration ĂŒber KConfig.

Anschließend speichern wir unser defconfig:

make savedefconfig

Konfiguration des Linux-Kernels

Die Konfiguration des Linux-Kernels erfolgt mit folgendem Befehl:

make linux-menuconfig

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

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

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

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

Sie mĂŒssen daher die Konfiguration manuell an den Speicherort kopieren:

cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config

Anschließ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; make

Nach Abschluss des Baus starten wir VirtualBox (getestet mit Version 5.2 und 6.0) und booten von der CD. Systemeinstellungen:

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

Start mit dem erstellten ISO:

Buildroot — Teil 1. Allgemeine Informationen, Aufbau eines minimalen Systems, Konfiguration ĂŒber das MenĂŒ

Liste der verwendeten Materialien

  1. Buildroot-Handbuch

Quelle: habr.com

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster