Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Einführung

In dieser Artikelserie möchte ich das Build-System der Buildroot-Distribution überprüfen und meine Erfahrungen bei der Anpassung teilen. Es werden praktische Erfahrungen in der Erstellung eines kleinen Betriebssystems mit grafischer Oberfläche und minimaler Funktionalität gesammelt.

Verwechseln Sie zunächst nicht das Build-System mit der Distribution. Buildroot kann ein System aus einer Reihe von Paketen erstellen, die ihm angeboten werden. Buildroot basiert auf Makefiles und verfügt daher über zahlreiche Anpassungsoptionen. Ersetzen Sie das Paket durch eine andere Version, fügen Sie Ihr eigenes Paket hinzu, ändern Sie die Regeln zum Erstellen des Pakets, passen Sie das Dateisystem nach der Installation aller Pakete an? All dies kann buildroot sein.

In Russland wird Buildroot verwendet, aber meiner Meinung nach gibt es nur wenige russischsprachige Informationen für Anfänger.

Ziel der Arbeit ist der Aufbau eines Distributionskits mit Live-Download, IceWM-Schnittstelle und Browser. Die Zielplattform ist Virtualbox.

Warum eine eigene Distribution aufbauen? Oft benötigen Sie eine begrenzte Funktionalität mit begrenzten Ressourcen. In der Automatisierung müssen Sie häufiger Firmware erstellen. Die Anpassung einer Allzweck-Distribution durch Bereinigen überflüssiger Pakete und deren Umwandlung in Firmware ist zeitaufwändiger als das Zusammenstellen einer neuen Distribution. Auch die Verwendung von Gentoo hat seine Grenzen.

Das Buildroot-System ist sehr leistungsfähig, bringt Ihnen aber nichts ab. Es kann lediglich den Montageprozess ermöglichen und automatisieren.

Alternative Build-Systeme (Yocto, Open Build System etc.) werden nicht berücksichtigt oder verglichen.

Wohin und wie man anfängt

Projektwebsite - buildroot.org. Hier können Sie die neueste Version herunterladen und das Handbuch lesen. Dort kann man auch mit der Community Kontakt aufnehmen, es gibt einen Bugtracker, Maillisten und einen IRC-Kanal.

Buildroot arbeitet mit Defconfigs für das Ziel-Buildboard. Defconfig ist eine Konfigurationsdatei, die nur Optionen enthält, die keinen Standardwert haben. Er bestimmt, was und wie gesammelt wird. In diesem Fall können Sie die Konfigurationen für Busybox, Linux-Kernel, Ulibc, U-Boot und Barebox-Bootloader separat konfigurieren, sie sind jedoch alle an die Zielplatine gebunden.
Nachdem wir das heruntergeladene Archiv entpackt oder von Git geklont haben, machen wir Buildroot betriebsbereit. Mehr zur Verzeichnisstruktur kannst du im Handbuch nachlesen, ich verrate dir die wichtigsten:

Tafel – Verzeichnis mit für jedes Board spezifischen Dateien. Dies können System-Imaging-Skripte (ISO, SDCart, CPIO und andere), Overlay-Verzeichnis, Kernel-Konfiguration usw. sein.
konfiguriert - die tatsächliche Defconfig des Boards. Defconfig ist eine unvollständige Platinenkonfiguration. Es speichert nur andere Parameter als die Standardeinstellungen.
dl - Verzeichnis mit heruntergeladenen Quellcodes/Dateien zur Montage
Ausgabe/Ziel - das zusammengestellte Dateisystem des empfangenen Betriebssystems. Zukünftig werden daraus Images zum Download/Installation erstellt
Ausgabe/Host - Host-Dienstprogramme für die Montage
Ausgabe/Build - zusammengestellte Pakete

Die Assembly-Konfiguration erfolgt über KConfig. Das gleiche System wird zum Erstellen des Linux-Kernels verwendet. Liste der am häufigsten verwendeten Befehle (im Buildroot-Verzeichnis ausführen):

  • make menuconfig – Rufen Sie die Build-Konfiguration auf. Sie können auch die GUI verwenden (make nconfig, make xconfig, make gconfig)
  • make linux-menuconfig – Kernel-Konfiguration aufrufen.
  • make clean – saubere Build-Ergebnisse (alles, was in der Ausgabe gespeichert ist)
  • make – das System aufbauen. Dadurch werden bereits erstellte Prozesse nicht neu erstellt.
  • make defconfig_name – Konfiguration auf spezifische Defconfig umstellen
  • make list-defconfigs – zeigt eine Liste der Defconfigs an
  • Quelle erstellen – nur die Installationsdateien herunterladen, keine Assembly.
  • make help – Zeigt eine Liste möglicher Befehle an

Wichtige Hinweise und hilfreiche Tipps

Buildroot erstellt keine bereits erstellten Pakete neu! Daher kann es vorkommen, dass ein kompletter Zusammenbau erforderlich ist.

Mit dem Befehl können Sie ein einzelnes Paket neu erstellen Paketname-Rebuild durchführen. Sie können beispielsweise den Linux-Kernel neu erstellen:

make linux-rebuild

Buildroot speichert den Status jedes Pakets, indem es .stamp-Dateien im Verzeichnis „output/build/$packagename“ erstellt:

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Daher ist es möglich, Root-FS und Images neu zu erstellen, ohne Pakete neu zu erstellen:

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

buildroot verfügt über eine Reihe von Variablen zur einfachen Konfiguration

  • $TOPDIR – Buildroot-Stammverzeichnis
  • $BASEDIR – OUTPUT-Verzeichnis
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR – Host-FS, Staging-FS, Ziel-FS-Build-Verzeichnisse.
  • $BUILD_DIR – Verzeichnis mit entpackten und erstellten Paketen

Visualisierung

Buildroot verfügt über die Fähigkeit zur Visualisierung. Sie können im endgültigen System ein Abhängigkeitsdiagramm, ein Build-Zeitdiagramm und ein Paketgrößendiagramm erstellen. Ergebnisse als PDF-Dateien (Sie können zwischen SVN und PNG wählen) im Verzeichnis „output/graph“.

Beispiele für Renderbefehle:

  • make graph-depends Erstellen Sie einen Abhängigkeitsbaum
  • make <pkg>-graph-depends Erstellen Sie den Abhängigkeitsbaum eines bestimmten Pakets
  • BR2_GRAPH_OUT=png make graph-build Plot-Erstellungszeitdiagramm mit PNG-Ausgabe
  • make graph-size Plotten Sie die Paketgröße

Nützliche Skripte

Das Buildroot-Verzeichnis verfügt über ein Unterverzeichnis utils mit nützlichen Skripten. Beispielsweise gibt es ein Skript, das die Richtigkeit von Paketbeschreibungen prüft. Dies kann beim Hinzufügen benutzerdefinierter Pakete nützlich sein (das mache ich später). Die Datei utils/readme.txt enthält eine Beschreibung dieser Skripte.

Lassen Sie uns eine Aktienverteilung aufbauen

Es ist wichtig, sich daran zu erinnern, dass alle Vorgänge im Namen eines regulären Benutzers und nicht als Root ausgeführt werden.
Alle Befehle werden in buildroot ausgeführt. Die Buildroot-Distribution verfügt bereits über eine Reihe von Konfigurationen für viele gängige Boards und Virtualisierungen.

Sehen Sie sich die Liste der Konfigurationen an:

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Wechseln Sie zur qemu_x86_64_defconfig-Konfiguration

make qemu_x86_64_defconfig

Und beginnen Sie mit dem Bau

make

Der Build wurde erfolgreich abgeschlossen. Schauen Sie sich die Ergebnisse an:

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Buildroot hat Images zusammengestellt, die Sie in Qemu ausführen und prüfen können, ob sie funktionieren.

qemu-system-x86_64 -kernel output/images/bzImage -hda    output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S

Das Ergebnis ist ein System, das in qemu läuft:

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Erstellen Sie Ihre eigene Board-Konfiguration

Board-Dateien hinzufügen

Sehen Sie sich die Liste der Konfigurationen an:

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

In der Liste sehen wir pc_x86_64_efi_defconfig. Wir erstellen unser Board, indem wir es aus der Konfiguration kopieren:

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Erstellen Sie sofort ein Board-Verzeichnis, um unsere Skripte, RootFS-Overlays und andere notwendige Dateien zu speichern:

mkdir board/my_x86_board

Wechseln Sie zu dieser Defconfig:

make my_x86_board_defconfig

Jetzt stimmt die Build-Konfiguration (gespeichert in .config im Stammverzeichnis des Buildroot-Verzeichnisses) beim Booten mit dem x86-64-Legacy-(BIOS)-Zielcomputer überein.

Kopieren Sie die Linux-Kernel-Konfiguration (später nützlich):

cp board/pc/linux.config board/my_x86_board/

Konfigurieren der Build-Optionen über KConfig

Beginnen wir mit der Einrichtung:

make menuconfig 

Das KConfig-Fenster wird geöffnet. Es ist möglich, mit einer grafischen Oberfläche zu konfigurieren (make nconfig, make xconfig, make gconfig):

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Wir betreten den ersten Abschnitt Zieloptionen. Hier können Sie die Zielarchitektur auswählen, für die die Montage durchgeführt werden soll.

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Build-Optionen – hier gibt es verschiedene Build-Optionen. Sie können Verzeichnisse mit Quellcodes, die Anzahl der Build-Threads, Spiegel zum Herunterladen von Quellcodes und andere Einstellungen angeben. Belassen wir die Standardeinstellungen.

Toolchain – das Build-Toolkit selbst wird hier konfiguriert. Mehr über ihn.

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Toolchain-Typ – der Typ der verwendeten Toolchain. Dies kann in Buildroot oder eine externe Toolchain integriert werden (Sie können ein Verzeichnis mit einem bereits erstellten Verzeichnis oder eine URL zum Herunterladen angeben). Es gibt zusätzliche Optionen für verschiedene Architekturen. Beispielsweise können Sie für den Arm einfach die Version der externen Linaro-Toolchain auswählen.

C-Bibliothek – Auswahl der C-Bibliothek. Davon hängt der Betrieb des gesamten Systems ab. Normalerweise wird glibc verwendet, das alle möglichen Funktionen unterstützt. Für ein eingebettetes System kann es jedoch zu groß sein, daher wird oft uglibc oder musl gewählt. Wir wählen glibc (dies wird später für die Verwendung von systemd benötigt).

Kernel-Header und benutzerdefinierte Kernel-Header-Serien – müssen mit der Version des Kernels übereinstimmen, der im zu erstellenden System enthalten sein wird. Für Kernel-Header können Sie auch den Pfad zum Tarball oder zum Git-Repository angeben.

GCC-COMPILER-VERSIONEN – Wählen Sie die Compiler-Version aus, die zum Erstellen verwendet wird
C++-Unterstützung aktivieren – Wählen Sie diese Option aus, um mit Unterstützung für C++-Bibliotheken im System zu erstellen. Das werden wir später brauchen.

Zusätzliche gcc-Optionen – Sie können zusätzliche Compiler-Optionen festlegen. Wir brauchen es im Moment nicht.

Mit der Systemkonfiguration können Sie die zukünftigen Parameter des erstellten Systems festlegen:

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Die meisten Punkte gehen aus dem Titel klar hervor. Achten wir auf folgende Punkte:
Pfad zu den Benutzertabellen – Tabelle mit erstellten Benutzern (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

Dateibeispiel. Der Benutzer wird mit dem Passwort admin, automatisch gid/uid, /bin/sh-Shell, Standardgruppenbenutzer, Mitglied des Gruppenstamms und Kommentar-Foo-Benutzer erstellt

[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 – ein Verzeichnis, das über den kompilierten Ziel-FSs liegt. Fügt neue Dateien hinzu und ersetzt vorhandene.

Benutzerdefinierte Skripte, die vor dem Erstellen von Dateisystem-Images ausgeführt werden Lassen Sie das Skript vorerst leer.

Gehen wir zum Abschnitt Kernel

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Hier werden die Kernel-Einstellungen festgelegt. Der Kernel selbst wird über make linux-menuconfig konfiguriert.
Sie können die Kernel-Version auf unterschiedliche Weise festlegen: Wählen Sie aus den angebotenen, geben Sie die Version manuell ein, geben Sie ein Repository oder einen vorgefertigten Tarball an.

Kernel-Konfiguration – Pfad zur Kernel-Konfiguration. Sie können die Standardkonfiguration für die ausgewählte Architektur oder defocnfig unter Linux auswählen. Die Linux-Quellen verfügen über eine Reihe von Defconfigs für verschiedene Zielsysteme. Sie können das finden, was Sie brauchen Ich schaue hier direkt auf die Quelle. Zum Beispiel für eine schwarze Tafel mit Beagle-Knochenmuster Wählen Sie Konfiguration.

Im Abschnitt „Zielpakete“ können Sie auswählen, welche Pakete auf dem Zielsystem installiert werden. Lassen wir es vorerst unverändert. Später werden wir unsere Pakete zu dieser Liste hinzufügen.
Dateisystem-Images – Liste der zu erstellenden Dateisystem-Images. Fügen Sie ein ISO-Image hinzu

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Bootloader – die Auswahl der gesammelten Bootloader. Wählen Sie Isolinix

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Systemd konfigurieren

Systemd wird neben Kernel und Glibc zu einer der Säulen von Linux. Deshalb habe ich die Einstellung in einem separaten Absatz herausgenommen.

Die Konfiguration erfolgt über make menuconfig, dann Target packets → System tools → systemd. Hier können Sie festlegen, welche Systemd-Dienste beim Systemstart installiert und gestartet werden.

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Speichern der Systemkonfiguration

Wir speichern diese Konfiguration über KConfig.

Dann speichern wir unsere Defconfig:

make savedefconfig

Linux-Kernel-Konfiguration

Die Linux-Kernel-Konfiguration wird durch den folgenden Befehl aufgerufen:

make linux-menuconfig

Unterstützung für Virtualbox-Grafikkarte hinzufügen

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Fügen Sie Unterstützung für die Virtualbox Guest-Integration hinzu

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Wir 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 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Daher müssen Sie 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 komplette Neumontage des gesamten Systems durch. buildroot erstellt nicht neu, was bereits erstellt wurde. Sie müssen die neu zu erstellenden Pakete manuell angeben. Um keine Zeit und Nerven zu verschwenden, ist es einfacher, ein kleines System als Ganzes neu aufzubauen):

make clean;make

Nach Abschluss der Montage starten wir VirtualBox (getestet in den Versionen 5.2 und 6.0) mit Booten von der CD. Systemparameter:

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Ausgehend von der erstellten ISO:

Buildroot – Teil 1 – Übersicht, Minimaler Systemaufbau, Menüeinrichtung

Liste der verwendeten Materialien

  1. Buildroot-Handbuch

Source: habr.com

Kommentar hinzufügen