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 â . 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:

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 erstellenAbhĂ€ngigkeitsbaum erstellenmake -graph-dependsAbhĂ€ngigkeitsbaum eines bestimmten Pakets erstellenBR2_GRAPH_OUT=png make graph-buildErstellen Sie ein Diagramm der Build-Zeit mit PNG-Ausgabemake graph-sizePaketgröĂ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:

Wir wechseln zu der Konfiguration qemu_x86_64_defconfig
make qemu_x86_64_defconfigUnd starten den Build
makeDer Build war erfolgreich, sehen wir uns die Ergebnisse an:
![]()
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 -SDas Ergebnis â das in Qemu gestartete System:

Erstellen der Konfiguration fĂŒr eigenes Board
HinzufĂŒgen von Board-Dateien
Sehen wir uns die Liste der Konfigurationen an:

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_defconfigWir erstellen sofort ein Verzeichnis fĂŒr das Board, um unsere Skripte, rootfs-overlay und andere notwendige Dateien zu speichern:
mkdir board/my_x86_boardWir wechseln zu diesem defconfig:
make my_x86_board_defconfigSomit 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):

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

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.

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:

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 ().
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 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 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

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, . Zum Beispiel fĂŒr das Board Beagle Bone Black kann man .
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.

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

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.

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

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

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

Deshalb muss die Konfiguration manuell an den Speicherort kopiert werden:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.configDanach 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;makeNach Abschluss des Builds starten wir VirtualBox (getestet mit Version 5.2 und 6.0) mit dem Booten von der CD. Systemparameter:

Booten von der erstellten ISO:

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