Einführung
In dieser Artikelserie möchte ich das Buildroot-Verteilungssystem betrachten und die Erfahrungen beim Anpassen teilen. Hier finden Sie praktische Erfahrungen beim Erstellen eines kleinen Betriebssystems mit grafischer Oberfläche und minimaler Funktionalität.
Zunächst sollten Sie das Build-System und die Distribution nicht verwechseln. Buildroot kann ein System aus den angebotenen Paketen erstellen. Buildroot basiert auf Makefiles und verfügt daher über enorme Anpassungsmöglichkeiten. Ersetzen Sie das Paket durch eine andere Version, fügen Sie Ihr Paket hinzu, ändern Sie die Regeln zum Erstellen des Pakets, passen Sie das Dateisystem nach der Installation aller Pakete an? Buildroot kann das alles.
In Russland wird Buildroot verwendet, aber meiner Meinung nach gibt es für Anfänger nur wenige russischsprachige Informationen.
Der Zweck der Arbeit besteht darin, ein Distributionskit mit Live-Download, icewm-Oberfläche und Browser zu erstellen. Die Zielplattform ist virtualbox.
Warum Ihre Distribution aufbauen? Oft benötigen Sie eine eingeschränkte Funktionalität mit begrenzten Ressourcen. In der Automatisierung müssen Sie häufiger Firmware erstellen. Das Anpassen einer Allzweckdistribution durch Bereinigen zusätzlicher Pakete und deren Umwandlung in Firmware ist zeitaufwändiger als das Erstellen einer neuen Distribution. Die Verwendung von Gentoo hat auch seine Grenzen.
Das Buildroot-System ist sehr leistungsfähig, aber es wird nichts für Sie tun. Es kann nur Möglichkeiten bieten und den Montageprozess automatisieren.
Alternative Build-Systeme (Yocto, Open Build-System usw.) werden nicht berücksichtigt oder verglichen.
Wo bekomme ich und wie fange ich an?
Die Projektseite ist buildroot.org . Hier können Sie die aktuelle Version herunterladen und das Handbuch lesen. Sie können sich dort auch an die Community wenden. Es gibt einen Bug-Tracker, Mail-Listen und einen IRC-Kanal.
Buildroot arbeitet mit defconfig für die Assembly-Zielplatine. Defconfig ist eine Konfigurationsdatei, in der nur Optionen gespeichert werden, die keine Standardwerte haben. Er bestimmt, was und wie gesammelt wird. In diesem Fall können Sie die Konfigurationen Busybox, Linux-Kernel, uClibc, Bootloader, U-Boot und Barebox separat konfigurieren, sie werden jedoch alle an die Zielplatine gebunden.
Nachdem wir das heruntergeladene Archiv entpackt oder von git geklont haben, bereiten wir die Buildroot für die Arbeit vor. Details zur Verzeichnisstruktur finden Sie im Handbuch, ich werde über das Wichtigste sprechen:
board - Ein Verzeichnis mit Dateien, die für jedes Board spezifisch sind. Dies können Skripte zum Erstellen von Systemabbildern (ISO, SDCART, CPIO usw.), Überlagerungsverzeichnis, Kernelkonfiguration usw. sein.
Configs - eigentlich defconfig Boards. Defconfig ist eine unvollständige Konfiguration der Karte. Darin werden nur andere Parameter als die Standardeinstellungen gespeichert.
dl - Verzeichnis mit heruntergeladenen Quellcodes / Dateien für die Assemblierung
Ausgabe / Ziel - das zusammengestellte Dateisystem des resultierenden Betriebssystems. Anschließend werden daraus Bilder zum Herunterladen / Installieren erstellt.
output / host - Host-Dienstprogramme zum Erstellen
Ausgabe / Build - kompilierte Pakete
Die Build-Konfiguration erfolgt über KConfig. Das gleiche System wird zum Erstellen des Linux-Kernels verwendet. Liste der am häufigsten verwendeten Befehle (im Buildroot-Verzeichnis ausgeführt):
- make menuconfig - Ruft die Build-Konfiguration auf. Sie können auch die grafische Oberfläche verwenden (make nconfig, make xconfig, make gconfig).
- make linux-menuconfig - rufe die Kernelkonfiguration auf.
- Machen Sie saubere - klare Montageergebnisse (alles, was in der Ausgabe gespeichert ist)
- make - baue das System. Bereits gesammelte Prozesse werden nicht neu erstellt
- make defconfig_name - wechselt die Konfiguration zu einer bestimmten defconfig
- make list-defconfigs - Zeigt eine Liste von defconfig an
- Quelle erstellen - Laden Sie nur die Installationsdateien ohne Assembly herunter.
- Hilfe machen - mögliche Befehle auflisten
Wichtige Hinweise und Tipps
Buildroot erstellt bereits verpackte Pakete nicht neu! Daher kann eine Situation auftreten, in der ein vollständiger Zusammenbau erforderlich ist.
Sie können ein einzelnes Paket mit dem Befehl make packagename-restore erstellen neu erstellen. Sie können beispielsweise den Linux-Kernel neu erstellen:
make linux-rebuild
Buildroot speichert den Status eines Pakets, indem .stamp-Dateien im Verzeichnis output / build / $ packagename erstellt werden:

Daher können Sie Root-Fs und Images neu 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 - Stammverzeichnis von buildroot
- $ BASEDIR - OUTPUT-Verzeichnis
- $ HOST_DIR, $ STAGING_DIR, $ TARGET_DIR - Assembly-Verzeichnisse hosten fs, Staging-fs, Ziel-fs.
- $ BUILD_DIR - Verzeichnis mit entpackten und zusammengestellten Paketen
Visualisierung
Buildroot kann visualisieren. Sie können im endgültigen System ein Abhängigkeitsdiagramm, eine Erstellungszeitleiste und ein Paketgrößendiagramm erstellen. Die Ergebnisse liegen in Form von PDF-Dateien (Sie können zwischen svn und png wählen) im Ausgabe- / Grafikverzeichnis vor.
Beispiele für Visualisierungsbefehle:
make graph-depends
einen Abhängigkeitsbaummake <pkg>-graph-depends
Erstellung eines make <pkg>-graph-depends
BR2_GRAPH_OUT=png make graph-build
ein Diagramm der Montagezeit mit Ausgabe in PNGmake graph-size
Diagrammgröße
Nützliche Skripte
Das Buildroot-Verzeichnis verfügt über ein utils- Unterverzeichnis mit nützlichen Skripten. Beispielsweise gibt es ein Skript, das die korrekte Beschreibung von Paketen überprüft. Dies kann beim Hinzufügen meiner Pakete hilfreich sein (ich werde dies später tun). Die Datei utils / readme.txt enthält eine Beschreibung dieser Skripte.
Lassen Sie uns eine Aktienverteilung aufbauen
Es ist wichtig daran zu erinnern, dass alle Vorgänge im Auftrag eines regulären Benutzers und nicht von root ausgeführt werden.
Alle Befehle werden im Stammverzeichnis von buildroot ausgeführt. Das Buildroot-Paket enthält bereits eine Reihe von Konfigurationen für viele gängige Boards und Virtualisierungen.
Wir sehen uns die Liste der Konfigurationen an:

Wechseln Sie zur Konfiguration qemu_x86_64_defconfig
make qemu_x86_64_defconfig
Und wir beginnen mit der Montage
make
Die Montage ist erfolgreich abgeschlossen, wir sehen uns die Ergebnisse an:

Buildroot hat Bilder zusammengestellt, die Sie in Qemu ausführen und sicherstellen können, 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 ist ein System, das in qemu ausgeführt wird:

Erstellen einer benutzerdefinierten Kartenkonfiguration
Board-Dateien hinzufügen
Wir sehen uns die Liste der Konfigurationen an:

In der Liste sehen wir pc_x86_64_bios_defconfig. Wir werden unser Board erstellen, indem wir es aus der Konfiguration kopieren:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Erstellen Sie sofort das Board-Verzeichnis, um unsere Skripte, Rootfs-Overlay und andere notwendige Dateien zu speichern:
mkdir board/my_x86_board
Wechseln Sie zu dieser defconfig:
make my_x86_board_defconfig
Daher entspricht die Build-Konfiguration (gespeichert in .config im Stammverzeichnis des Buildroot-Verzeichnisses) durch Laden der Ziel-x86-64-Legacy-Maschine (BIOS).
Kopieren Sie die Linux-Kernel-Konfiguration (nützlich für die Zukunft):
cp board/pc/linux.config board/my_x86_board/
Konfigurieren Sie Build-Optionen über KConfig
Führen Sie das Setup aus:
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):

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

Build-Optionen - Hier gibt es verschiedene Build-Einstellungen. Sie können Verzeichnisse mit Quellcodes, die Anzahl der Assembly-Threads, Spiegel zum Herunterladen von Quellcodes und andere Einstellungen angeben. Übernehmen Sie die Standardeinstellungen.
Toolchain - hier werden Build-Tools konfiguriert. Mehr über ihn.

Toolchain-Typ - Typ der verwendeten Toolchain. Es kann in Buildroot oder eine externe Toolchain integriert sein (Sie können ein Verzeichnis mit einem vorgefertigten Verzeichnis oder eine URL zum Herunterladen angeben). Für verschiedene Architekturen gibt es zusätzliche Optionen. Für arm können Sie beispielsweise einfach die Version der externen Linaro-Toolchain auswählen.
C Bibliothek - die Wahl der Bibliothek C. Der Betrieb des gesamten Systems hängt davon ab. Normalerweise verwendetes glibc, das alle möglichen Funktionen unterstützt. Da es für das eingebettete System jedoch zu groß sein kann, werden häufig uClibc oder musl ausgewählt. Wir werden glibc wählen (in Zukunft wird es erforderlich sein, systemd zu verwenden).
Kernel-Header und benutzerdefinierte Kernel-Header-Serien - müssen mit der Version des Kernels übereinstimmen, die sich auf dem Build-System befindet. Für Kernel-Header können Sie auch den Pfad zum Tarball- oder Git-Repository angeben.
GCC-COMPILER-VERSIONEN - Wählen Sie die Compiler-Version aus, die für die Assembly verwendet werden soll
C ++ - Unterstützung aktivieren - Wählen Sie diese Option für die Assembly mit Unterstützung für C ++ - Bibliotheken im System aus. Dies wird sich in Zukunft als nützlich erweisen.
Zusätzliche gcc-Optionen - Sie können zusätzliche Compileroptionen festlegen. Wir brauchen bisher nicht.
Mit der Systemkonfiguration können Sie zukünftige Parameter für das erstellte System festlegen:

Die meisten Punkte ergeben sich aus dem Namen. Beachten Sie 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 Kennwort admin, automatisch gid / uid, / bin / sh-Shell, Standardgruppenbenutzer, Stammgruppenmitglied, 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 zusammengestellten Ziel-fs liegt. Fügt neue Dateien hinzu und ersetzt vorhandene.
Benutzerdefinierte Skripts, die vor dem Erstellen von Dateisystem-Images ausgeführt werden sollen - Skripte, die unmittelbar vor dem Reduzieren des Dateisystems in Images ausgeführt werden. Das Skript selbst bleibt vorerst leer.
Gehen wir zum Abschnitt Kernel

Hier werden die Kerneleinstellungen festgelegt. Der Kernel selbst wird über make linux-menuconfig konfiguriert.
Sie können die Kernel-Version auf verschiedene Arten festlegen: Wählen Sie eine der vorgeschlagenen aus, geben Sie die Version manuell ein, geben Sie das Repository oder den fertigen Tarball an.
Kernel-Konfiguration - Der Pfad zur Kernel-Konfiguration. Sie können die Standardkonfiguration für die ausgewählte Architektur oder defocnfig unter Linux auswählen. Linux-Quellen haben eine Reihe von defconfig für verschiedene Zielsysteme. Sie finden die richtige, indem Sie hier direkt auf die Quelle schauen . Für eine Beagle-Bone-Tafel können Sie beispielsweise eine Konfiguration auswählen .
Im Abschnitt Zielpakete können Sie auswählen, welche Pakete auf dem Buildsystem installiert werden sollen. Lassen Sie es vorerst unverändert. Später werden wir unsere Pakete zu dieser Liste hinzufügen.
Dateisystem-Images - Eine Liste der zu kompilierenden Dateisystem-Images. ISO-Image hinzufügen

Bootloader - die Auswahl der zusammengebauten Bootloader. Wählen Sie isolinix

Systemd-Konfiguration
Systemd wird neben Kernel und Glibc zu einer der Linux-Säulen. Daher habe ich die Konfiguration in einem separaten Absatz vorgenommen.
Die Konfiguration erfolgt über make menuconfig und dann über Zielpakete → Systemtools → systemd. Hier können Sie angeben, welche systemd-Dienste beim Systemstart installiert und gestartet werden sollen.

Systemkonfiguration speichern
Speichern Sie diese Konfiguration über KConfig.
Dann speichern Sie unsere defconfig:
make savedefconfig
Linux-Kernel-Konfiguration
Die Linux-Kernel-Konfiguration wird mit dem folgenden Befehl aufgerufen:
make linux-menuconfig
Unterstützung für die Virtualbox-Grafikkarte hinzufügen

Unterstützung für die Integration von Virtualbox Guest hinzufügen

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

Daher müssen Sie die Konfiguration manuell in den Speicherort kopieren:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Mit diesem Befehl kopiere ich die FULL-Kernel-Konfiguration, was nicht immer notwendig ist. Eine korrektere Methode besteht darin, den Kernel defconfig beizubehalten:
make linux-update-defconfig
Danach führen wir einen vollständigen Zusammenbau des gesamten Systems durch. Da buildroot die bereits zusammengebauten nicht wieder zusammenbaut, müssen Sie die Pakete für den Zusammenbau manuell angeben. Um Zeit und Nerven nicht zu verlieren, ist es einfacher, das gesamte kleine System wieder aufzubauen.
make clean;make
Führen Sie nach Abschluss des Builds VirtualBox (getestet in den Versionen 5.2 und 6.0) mit dem Booten vom CD-Laufwerk aus. Systemparameter:

Ausgehend von der zusammengebauten ISO:

Liste der verwendeten Materialien
- Buildroot Handbuch