Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

EinfĂŒhrung

In dieser Artikelreihe möchte ich das Buildroot-Betriebssystem und meine Erfahrungen mit dessen Anpassung beleuchten. Hier wird es praktische Erfahrungen in der Erstellung eines kleinen Betriebssystems mit grafischer BenutzeroberflÀche und minimaler FunktionalitÀt geben.

ZunĂ€chst einmal sollte man das Build-System und das Betriebssystem nicht verwechseln. Buildroot kann ein System aus einem Satz von Paketen erstellen, die ihm angeboten werden. Buildroot basiert auf Makefiles und bietet daher immense Anpassungsmöglichkeiten. Ein Paket durch eine andere Version zu ersetzen, ein eigenes Paket hinzuzufĂŒgen, die Build-Regeln eines Pakets zu Ă€ndern und das Dateisystem nach der Installation aller Pakete anzupassen? All das kann Buildroot.

In Russland wird Buildroot verwendet, aber meines Erachtens gibt es wenig russischsprachige Informationen fĂŒr AnfĂ€nger.

Das Ziel dieser Arbeit ist es, ein Distribution mit Live-Start, einem IceWM-Interface und einem Browser zu erstellen. Die Zielplattform ist VirtualBox.

Warum ein eigenes Distribution erstellen? Oft benötigt man eine eingeschrĂ€nkte FunktionalitĂ€t bei begrenzten Ressourcen. Noch hĂ€ufiger in der Automatisierung muss man Firmware erstellen. Ein Allzweck-Betriebssystem anzupassen, indem man ĂŒberflĂŒssige Pakete entfernt und es in eine Firmware umwandelt, ist ein deutlich mĂŒhsamerer Weg, als eine neue Distribution zu erstellen. Auch die Verwendung von Gentoo hat ihre EinschrĂ€nkungen.

Buildroot ist ein sehr leistungsfĂ€higes System, aber es wird nichts fĂŒr Sie tun. Es kann nur Möglichkeiten bieten und den Build-Prozess automatisieren.

Alternative Build-Systeme (Yocto, Open Build System und andere) werden nicht betrachtet und nicht verglichen.

Wo man es bekommen kann und wie man anfÀngt

Projekt-Website — buildroot.org. Hier kann man die aktuelle Version herunterladen und das Handbuch lesen. Dort kann man sich auch an die Gemeinschaft wenden, es gibt einen Bugtracker, Mailinglisten und einen IRC-Kanal.

Buildroot arbeitet mit Defconfig-Dateien fĂŒr die Zielplattform. Defconfig ist eine Konfigurationsdatei, die nur Optionen speichert, die keine Standardwerte haben. Sie legt fest, was und wie gebaut wird. Dabei können die Konfigurationen von Busybox, Linux-Kernel, uClibc, Bootloadern wie u-boot und barebox separat angepasst werden, aber alle sind an die Zielplattform gebunden.
Nach dem Entpacken des heruntergeladenen Archivs oder dem Klonen aus Git haben wir ein sofort einsatzbereites Buildroot. Über die Struktur der Verzeichnisse kann man im Handbuch lesen, ich werde ĂŒber die wichtigsten sprechen:

board — Katalog mit dateispezifischen Dateien fĂŒr jedes Board. Dazu können Erstellungs-Skripte fĂŒr Systemabbilder (iso, sdcart, cpio usw.), Overlay-Verzeichnisse, Kernel-Konfigurationen und mehr gehören.
configs — das eigentliche defconfig des Boards. Defconfig ist eine unvollstĂ€ndige Konfiguration des Boards. Darin werden nur Parameter gespeichert, die von den Standardwerten abweichen.
dl — Verzeichnis mit heruntergeladenen Quellcodes/Dateien zum Erstellen.
output/target — das erstellte Dateisystem des erhaltenen OS. Daraus werden spĂ€ter Abbilder fĂŒr den Boot- und Installationsprozess erstellt.
output/host — Host-Utilities fĂŒr den Build.
output/build — gebaute Pakete.

Die Konfiguration des Builds erfolgt ĂŒber KConfig. Dieses System wird auch zum Bauen des Linux-Kernels verwendet. Eine Liste der am hĂ€ufigsten verwendeten Befehle (im Verzeichnis buildroot auszufĂŒhren):

  • make menuconfig — Aufruf der Build-Einstellungen. Auch ĂŒber eine grafische OberflĂ€che möglich (make nconfig, make xconfig, make gconfig).
  • make linux-menuconfig — Aufruf der Kernel-Konfiguration.
  • make clean — Bereinigung der Build-Ergebnisse (alles, was sich im output befindet).
  • make — das System erstellen. Dabei erfolgt keine Neuerstellung bereits gebaute Prozesse.
  • make defconfig_name — die Konfiguration auf das bestimmte defconfig umschalten.
  • make list-defconfigs — Liste der defconfigs anzeigen.
  • make source — nur die Installationsdateien herunterladen, ohne zu bauen.
  • make help — Liste der verfĂŒgbaren Befehle ausgeben.

Wichtige Hinweise und nĂŒtzliche Tipps.

Buildroot baut bereits gebaute Pakete nicht neu! Daher kann eine Situation entstehen, in der ein vollstÀndiger Neubau erforderlich ist.

Ein einzelnes Paket kann mit dem Befehl neu gebaut werden. make packagename-rebuild. Zum Beispiel kann der Linux-Kernel neu gebaut werden:

make linux-rebuild.

Buildroot speichert den Status jedes Paketes durch die Erstellung von .stamp-Dateien im Verzeichnis output/build/$packagename:

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Daher können root-fs und Abbildungen ohne Neubau der Pakete neu gebaut 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.

In Buildroot gibt es eine Reihe von Variablen fĂŒr eine bequeme Konfiguration.

  • $TOPDIR — das Wurzelverzeichnis von Buildroot.
  • $BASEDIR — Verzeichnis OUTPUT.
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR — Verzeichnisse fĂŒr das Erstellen von host fs, staging fs, target fs.
  • $BUILD_DIR — Verzeichnis mit entpackten und gebauten Paketen.

Visualisierung

In Buildroot besteht die Möglichkeit der Visualisierung. Es können AbhĂ€ngigkeitsdiagramme, ZeitplĂ€ne fĂŒr den Build und Diagramme der PaketgrĂ¶ĂŸen im Endsystem erstellt werden. Die Ergebnisse liegen in Form von PDF-Dateien (es gibt die Auswahl zwischen svn, png) im Verzeichnis output/graph vor.

Beispiele fĂŒr Visualisierungsbefehle:

  • graph-depends erstellen AbhĂ€ngigkeitsbaum erstellen
  • make -graph-depends AbhĂ€ngigkeitsbaum eines bestimmten Pakets erstellen
  • BR2_GRAPH_OUT=png make graph-build Erstellen Sie ein Diagramm der Build-Zeit mit PNG-Ausgabe
  • make graph-size PaketgrĂ¶ĂŸen-Diagramm erstellen

NĂŒtzliche Skripte

Im buildroot-Verzeichnis gibt es ein Unterverzeichnis utils mit nĂŒtzlichen Skripten. Zum Beispiel gibt es dort ein Skript, das die Korrektheit der Paketbeschreibungen ĂŒberprĂŒft. Dies kann nĂŒtzlich sein, wenn man eigene Pakete hinzufĂŒgt (ich werde das spĂ€ter tun). Im utils/readme.txt gibt es eine Beschreibung dieser Skripte.

Wir werden ein Standard-Distribution erstellen

Es ist wichtig zu erinnern, dass alle Operationen im Namen eines normalen Benutzers, nicht als root, durchgefĂŒhrt werden.
Alle Befehle werden im Wurzelverzeichnis von buildroot ausgefĂŒhrt. Im Lieferumfang von buildroot gibt es bereits eine Reihe von Konfigurationen fĂŒr viele gĂ€ngige Boards und Virtualisierungen.

Sehen wir uns die Liste der Konfigurationen an:

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-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 Build war erfolgreich, sehen wir uns die Ergebnisse an:

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Buildroot hat Images erstellt, die in Qemu ausgefĂŒhrt 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 — das in Qemu gestartete System:

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Erstellen der Konfiguration fĂŒr eigenes Board

HinzufĂŒgen von Board-Dateien

Sehen wir uns die Liste der Konfigurationen an:

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

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

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Wir erstellen sofort ein Verzeichnis fĂŒr das Board, um unsere Skripte, rootfs-overlay und andere notwendige Dateien zu speichern:

mkdir board/my_x86_board

Wir wechseln zu diesem defconfig:

make my_x86_board_defconfig

Somit entspricht die Build-Konfiguration (die in .config im Wurzelverzeichnis von buildroot gespeichert ist) jetzt dem ZielgerÀt x86-64 legacy (bios) Boot.

Kopieren wir die Linux-Kernel-Konfiguration (wird spĂ€ter nĂŒtzlich sein):

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

Einstellungen fĂŒr den Build ĂŒber KConfig konfigurieren

Wir starten die Konfiguration:

, und vor Ihnen erscheint eine praktische Textschnittstelle mit der Anzeige der Parameterbeschreibungen. 

Ein KConfig-Fenster wird geöffnet. Es besteht die Möglichkeit, mit einer grafischen BenutzeroberflÀche zu konfigurieren (make nconfig, make xconfig, make gconfig):

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Wir betreten den ersten Abschnitt Zieloptionen. Hier kann die Zielarchitektur ausgewĂ€hlt werden, fĂŒr die der Build erfolgen wird.

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Build-Optionen — hier gibt es verschiedene Build-Einstellungen. Zielverzeichnisse fĂŒr den Quellcode, Anzahl der Build-Threads, Mirrors fĂŒr den Download von Quellcodes und andere Einstellungen können angegeben werden. Wir lassen die Standardeinstellungen.

Toolchain – hier wird das eigentliche Build-Toolset konfiguriert. NĂ€heres dazu.

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Toolchain-Typ – der verwendete Toolchain-Typ. Dies kann entweder die in Buildroot integrierte oder eine externe Toolchain sein (ein Verzeichnis mit bereits erstelltem oder eine URL zum Herunterladen kann angegeben werden). FĂŒr verschiedene Architekturen gibt es zusĂ€tzliche Optionen. Zum Beispiel kann fĂŒr ARM einfach die Version der externen Toolchain Linaro ausgewĂ€hlt werden.

C-Bibliothek – Auswahl der C-Bibliothek. Dies beeinflusst das gesamte System. Normalerweise wird glibc verwendet, die alle möglichen Funktionen unterstĂŒtzt. Sie kann jedoch zu groß fĂŒr ein eingebettetes System sein, weshalb oft uglibc oder musl gewĂ€hlt werden. Wir wĂ€hlen glibc (dies wird spĂ€ter fĂŒr die Verwendung von systemd erforderlich sein).

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 kann ebenfalls der Pfad zum Tarball oder zum Git-Repository angegeben werden.

GCC-COMPILER VERSIONEN – Auswahl der Compiler-Version, die fĂŒr den Build verwendet wird
C++-UnterstĂŒtzung aktivieren – wir wĂ€hlen die UnterstĂŒtzung von C++-Bibliotheken im System fĂŒr den Build. Das wird uns spĂ€ter nĂŒtzlich sein.

ZusĂ€tzliche GCC-Optionen – es können zusĂ€tzliche Compiler-Optionen angegeben werden. Bisher benötigen wir das nicht.

Die Systemkonfiguration ermöglicht die Festlegung zukĂŒnftiger Parameter des erstellten Systems:

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Die meisten Punkte sind aus dem Titel verstÀndlich. Achten wir auf die folgenden Punkte:
Pfad zu den Benutzertabellen – Tabelle mit den zu erstellenden Benutzern (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

Beispiel-Datei. Ein Benutzer 'user' wird mit dem Passwort 'admin' erstellt, automatisch gid/uid, /bin/sh als Shell, die Standardgruppe 'user', 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 dem Erstellen von Dateisystemabbildern ausgefĂŒhrt werden – Skripte, die direkt vor der Erstellung der Dateisystemabbilder ausgefĂŒhrt werden. Das Skript lassen wir vorerst leer.

Gehen wir zum Abschnitt Kernel

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Hier werden die Kernel-Einstellungen festgelegt. Der Kernel selbst wird ĂŒber make linux-menuconfig konfiguriert.
Die Version des Kernels kann auf verschiedene Weise festgelegt werden: aus den verfĂŒgbaren auswĂ€hlen, die Version manuell eingeben, ein Repository oder ein fertiges Tarball angeben.

Kernel-Konfiguration – Pfad zur Kernel-Konfigurationsdatei. Es kann die Standardkonfiguration fĂŒr die gewĂ€hlte Architektur oder defconfig aus Linux ausgewĂ€hlt werden. In den Linux-Quellen gibt es ein Set von defconfig-Dateien fĂŒr verschiedene Zielsysteme. Das benötigte kann gefunden werden, indem man direkt in die Quellen hier schaut. Zum Beispiel fĂŒr das Board Beagle Bone Black kann man Konfiguration auswĂ€hlen.

Der Abschnitt Zielpakete ermöglicht es, auszuwĂ€hlen, welche Pakete in das zu erstellende System installiert werden sollen. Lassen wir vorerst alles unverĂ€ndert. SpĂ€ter fĂŒgen wir unsere Pakete in diese Liste ein.
Dateisystemabbilder — eine Liste der Dateisystemabbilder, die erstellt werden sollen. Wir fĂŒgen ein ISO-Abbild hinzu.

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Bootloader — Auswahl der zu erstellenden Bootloader. WĂ€hlen wir isolinix.

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Systemd konfigurieren

Systemd wird zu einem der SĂ€ulen von Linux, gleichauf mit Kernel und glibc. Deshalb habe ich seine Konfiguration in einen eigenen Punkt ausgegliedert.

Es wird ĂŒber make menuconfig konfiguriert, dann Zielpakete → Systemwerkzeuge → systemd. Hier kann angegeben werden, welche systemd-Dienste installiert und beim Systemstart gestartet werden sollen.

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Speichern der Systemkonfiguration

Wir speichern diese Konfiguration ĂŒber KConfig.

Danach 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 UnterstĂŒtzung fĂŒr die Grafikkarte von Virtualbox hinzu.

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

FĂŒgen wir die Virtualbox-GastintegrationsunterstĂŒtzung hinzu.

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

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

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Deshalb muss die Konfiguration manuell an den Speicherort kopiert werden:

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

Danach fĂŒhren wir einen vollstĂ€ndigen Neubau des gesamten Systems durch. Da Buildroot die bereits erstellten Komponenten nicht neu baut, mĂŒssen die Pakete fĂŒr den Neuaufbau manuell angegeben werden. Um Zeit und Nerven zu sparen, ist es einfacher, ein kleines System vollstĂ€ndig neu zusammenzustellen):

make clean;make

Nach Abschluss des Builds starten wir VirtualBox (getestet mit Version 5.2 und 6.0) mit dem Booten von der CD. Systemparameter:

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Booten von der erstellten ISO:

Buildroot – Teil 1. Allgemeine Informationen, Erstellen eines Minimal-Systems, Konfiguration ĂŒber das MenĂŒ

Liste der verwendeten Materialien

  1. Buildroot-Handbuch

Quelle: habr.com

60GB SSD 8Gb DDR4