Inleiding
In deze serie artikelen wil ik het buildroot distributie bouwsysteem bekijken en mijn ervaring met de maatwerk ervan delen. Hier zal praktische ervaring zijn over het maken van een klein besturingssysteem met een grafische interface en minimale functionaliteit.
Bovenal moet je het bouwsysteem en de distributie niet verwarren. Buildroot kan een systeem bouwen uit een set pakketten die aan hem zijn aangeboden. Buildroot is gebaseerd op make-bestanden en heeft daarom enorme maatwerkmogelijkheden. Een pakket vervangen door een andere versie, een eigen pakket toevoegen, de bouwregels van een pakket wijzigen, het bestandssysteem aanpassen na installatie van alle pakketten? Dat kan buildroot allemaal.
In Rusland wordt buildroot gebruikt, maar naar mijn mening is er weinig informatie in het Russisch voor beginners.
Het doel van dit werk is om een distributie met live-boot, een icewm-interface en een browser te bouwen. Het doelplatform is virtualbox.
Waarom je eigen distributie bouwen? Vaak is er behoefte aan beperkte functionaliteit met beperkte middelen. Nog vaker in automatisering moet je firmware creëren. Het aanpassen van een algemeen distributie door ongewenste pakketten te verwijderen en het om te zetten in firmware is een veel arbeidsintensievere weg dan het bouwen van een nieuwe distributie. Het gebruik van Gentoo heeft ook zijn beperkingen.
Buildroot is een zeer krachtig systeem, maar het zal niets voor je doen. Het kan alleen mogelijkheden bieden en het bouwproces automatiseren.
Alternatieve bouwsystemen (yocto, open build system en anderen) worden niet behandeld en niet vergeleken.
Waar te beginnen en hoe
Projectwebsite — . Hier kun je de actuele versie downloaden en de handleiding lezen. Je kunt daar ook de community benaderen, er is een bugtracker, maillijsten en een IRC-kanaal.
Buildroot werkt met defconfig-bestanden voor de doelbouwplaat. Defconfig is een configuratiebestand dat alleen opties bevat zonder standaard waarde. Dit bepaalt wat en hoe het zal worden gebouwd. Je kunt ook afzonderlijk de configuraties van busybox, linux-kernel, uClibc, bootloaders zoals u-boot en barebox instellen, maar al deze configuraties zullen aan de doelplaat zijn gebonden.
Na het uitpakken van het gedownloade archief of het klonen uit git, hebben we een klaar om te gebruiken buildroot. Gedetailleerde informatie over de mapstructuur is te vinden in de handleiding; ik zal de belangrijkste uitleggen:
board — catalogus met bestanden die specifiek zijn voor elk bord. Dit kunnen scripts zijn voor het genereren van systeembeelden (iso, sdcart, cpio en andere), overlay-catalogus, kernelconfiguraties en dergelijke.
configs — de eigenlijke defconfig van het bord. Defconfig is een onvolledige configuratie van het bord. Het bevat alleen de parameters die afwijken van de standaardinstellingen.
dl — catalogus met gedownloade originele codes/bestanden voor de build.
output/target — het gebouwde bestandssysteem van het verkregen besturingssysteem. Hieruit worden later afbeeldingsbestanden gemaakt voor opstarten/installeren.
output/host — host-tools voor de build.
output/build — gebouwde pakketten.
De configuratie van de build wordt uitgevoerd via KConfig. Dit systeem wordt ook gebruikt voor het bouwen van de Linux-kernel. Een lijst van de meest gebruikte commando's (uit te voeren in de buildroot-catalogus):
- make menuconfig — voer de buildconfiguratie op. Dit kan ook met behulp van grafische interfaces (make nconfig, make xconfig, make gconfig).
- make linux-menuconfig — voer de kernelconfiguratie op.
- make clean — maak de bouwresultaten schoon (alles dat in output is opgeslagen).
- make — bouw het systeem. Hierbij worden al gebouwde processen niet opnieuw opgebouwd.
- make defconfig_name — schakel de configuratie naar een specifieke defconfig.
- make list-defconfigs — toon de lijst met defconfig's.
- make source — alleen de installatiebestanden downloaden, zonder te bouwen.
- make help — geef een lijst van beschikbare commando's weer.
Belangrijke opmerkingen en nuttige tips.
Buildroot bouwt geen al gebouwde pakketten opnieuw! Hierdoor kan de situatie ontstaan waarin een volledige herbouwing nodig is.
Een specifiek pakket kan worden herbouwd met het commando. make packagename-rebuild. Bijvoorbeeld, je kunt de Linux-kernel herbouwen:
make linux-rebuild.Buildroot houdt de status van elk pakket bij door .stamp-bestanden te maken in de catalogus output/build/$packagename:

Hierdoor kunnen root-fs en beelden opnieuw worden gebouwd zonder de pakketten opnieuw op te bouwen:
rm output/build/host-gcc-final-*/.stamp_host_installed; rm -rf output/target; find output/ -name ".stamp_target_installed" | xargs rm -rf; make.Nuttige variabelen.
In buildroot is er een set variabelen voor handige configuratie.
- $TOPDIR — de rootcatalogus van buildroot.
- $BASEDIR — de OUTPUT-catalogus.
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — buildcatalogi voor host fs, staging fs, target fs.
- $BUILD_DIR — catalogus met uitgepakte en gebouwde pakketten.
Visualisatie
In buildroot is het mogelijk om visualisaties te maken. Je kunt een afhankelijkheidsschema, een tijdsduurgrafiek en een pakketgroottegrafiek in het eindige systeem opbouwen. De resultaten zijn in pdf-bestanden (ook beschikbaar in svn, png) in de catalogus output/graph.
Voorbeelden van visualisatiecommando's:
maak graf-afhankelijkhedenbouw afhankelijkheidsboommaak <pkg>-graf-afhankelijkhedenbouw afhankelijkheidsboom van een specifiek pakketBR2_GRAPH_OUT=png maak graf-bouwbouw een grafiek van de bouwtijd met uitvoer in PNGmaak graf-groottebouw een grafiek van pakketgroottes
Nuttige scripts
In de buildroot-directory is er een subdirectory utils met nuttige scripts. Bijvoorbeeld, er is een script dat de correctheid van de pakketbeschrijvingen controleert. Dit kan handig zijn bij het toevoegen van uw eigen pakketten (dat zal ik later doen). In het bestand utils/readme.txt staat een beschrijving van deze scripts.
We zullen een stockdistributie compileren
Het is belangrijk om te herinneren dat alle bewerkingen plaatsvinden vanuit het perspectief van een normale gebruiker, niet root.
Alle commando's worden uitgevoerd in de root van buildroot. De buildroot-levering bevat al een set configuraties voor veel gangbare borden en virtualisatie.
Laten we de lijst met configuraties bekijken:

We schakelen over naar de configuratie qemu_x86_64_defconfig
maak qemu_x86_64_defconfigEn we starten de compilatie
makeDe compilatie wordt succesvol voltooid, laten we naar de resultaten kijken:
![]()
Buildroot heeft afbeeldingen gemaakt die kunnen worden uitgevoerd in Qemu om te controleren of ze werken.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -SHet resultaat — het systeem dat in qemu draait:

Configuratie van uw eigen bord aanmaken
Bestanden van het bord toevoegen
Laten we de lijst met configuraties bekijken:

In de lijst zien we pc_x86_64_efi_defconfig. We zullen ons eigen bord maken door het te kopiëren van de configuratie:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfigLaten we meteen een map voor het bord aanmaken om onze scripts, rootfs-overlay en andere benodigde bestanden op te slaan:
mkdir board/my_x86_boardWe schakelen over naar deze defconfig:
maak my_x86_board_defconfigZo komt de configuratie van de build (opgeslagen in .config in de root van de buildroot-directory) overeen met de doelmachine x86-64 legacy(bios) boot.
Laten we de linux-kernelconfiguratie kopiëren (die nuttig zal zijn later):
cp board/pc/linux.config board/my_x86_board/Instellen van de bouwparameters via KConfig
Start de configuratie:
maak menuconfig Er verschijnt een KConfig-venster. Het is mogelijk om te configureren met een grafische interface (maak nconfig, maak xconfig, maak gconfig):

We gaan naar het eerste gedeelte Target Options. Hier kunt u de doelarchitectuur kiezen waartegen de bouw zal plaatsvinden.

Bouwopties — hier zijn er verschillende bouwinstellingen. U kunt de mappen met broncode, het aantal bouwthreads, mirrors voor het downloaden van de broncode en andere instellingen opgeven. We laten de standaardinstellingen intact.
Toolchain – hier wordt de bouwtoolkit zelf ingesteld. Hierover later meer.

Toolchain-type – het type van de gebruikte toolchain. Dit kan ingebouwd in buildroot zijn of een externe toolchain (je kunt een catalogus met reeds samengestelde versies of een URL voor downloaden opgeven). Voor verschillende architecturen zijn er aanvullende opties. Voor arm kun je bijvoorbeeld simpelweg een versie van de externe toolchain Linaro kiezen.
C-bibliotheek – de keuze van de C-bibliotheek. Dit beïnvloedt de werking van het hele systeem. Gewoonlijk wordt glibc gebruikt, die alle mogelijke functionaliteit ondersteunt. Maar deze kan te groot blijken te zijn voor ingebedde systemen, daarom kiezen we vaak voor uglibc of musl. We kiezen glibc (dit is later nodig voor het gebruik van systemd).
Kernelheaders en aangepaste kernelheaders - deze moeten overeenkomen met de versie van de kernel die in het te bouwen systeem zal worden gebruikt. Voor kernelheaders kun je ook een pad naar een tarball of een git-repository opgeven.
GCC COMPILER VERSIES – kies de versie van de compiler die zal worden gebruikt voor de bouw.
C++-ondersteuning inschakelen – we kiezen voor een build met ondersteuning voor C++-bibliotheken in het systeem. Dit zal later van pas komen.
Aanvullende gcc-opties – je kunt extra opties voor de compiler opgeven. Dit is voorlopig niet nodig.
Systeemconfiguratie laat toekomstige parameters van het te creëren systeem opgeven:

De meeste punten zijn duidelijk uit de naam. Laten we letten op de volgende punten:
Pad naar de gebruikers tabellen — tabel met te creëren gebruikers ().
Voorbeeldbestand. Er zal een gebruiker user worden aangemaakt met het wachtwoord admin, automatisch gid/uid, /bin/sh-shell, standaardgroep user, lid van de groep root, opmerking 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 filesystem overlay directories — catalogus die bovenop de samengestelde target-fs wordt gelegd. Voegt nieuwe bestanden toe en vervangt bestaande.
Aangepaste scripts die uitgevoerd moeten worden voordat je filesystemafbeeldingen maakt — scripts die direct vóór het samenvoegen van het bestandssysteem in afbeeldingen worden uitgevoerd. Laten we het script voorlopig leeg laten.
Laten we naar het gedeelte Kernel gaan.

Hier worden de kerninstellingen opgegeven. De kernel zelf wordt geconfigureerd via make linux-menuconfig.
De versie van de kernel kan op verschillende manieren worden opgegeven: kies uit de voorgestelde versies, voer de versie handmatig in, geef een repository of een kant-en-klare tarball op.
Kernelconfiguratie — pad naar de kernconfiguratie. Je kunt een standaardconfiguratie voor de gekozen architectuur kiezen of defconfig uit Linux. In de Linux-broncode zijn er een aantal defconfig' s voor verschillende doelsystemen. Je kunt de juiste vinden door rechtstreeks in de broncode te kijken. . Bijvoorbeeld, voor het bord Beagle Bone Black, kun je .
In het gedeelte Target packages kunt u kiezen welke pakketten in het op te bouwen systeem zullen worden geïnstalleerd. Laten we het voorlopig ongemoeid laten. Later voegen we onze pakketten aan deze lijst toe.
Filesystem images - een lijst van bestandssysteemafbeeldingen die zullen worden opgebouwd. Laten we een iso-afbeelding toevoegen.

Bootloaders - keuze van te bouwen bootloaders. Laten we isolinix kiezen.

Configuratie van Systemd
Systemd wordt een van de pijlers van linux, naast de kernel en glibc. Daarom heb ik de configuratie ervan in een apart item geplaatst.
Wordt ingesteld via make menuconfig, vervolgens Target packages → System tools → systemd. Hier kan worden aangegeven welke systemd-diensten zullen worden geïnstalleerd en gestart bij het opstarten van het systeem.

Opslaan van systeemconfiguratie
We slaan deze configuratie op via KConfig.
Daarna zullen we onze defconfig opslaan:
make savedefconfigConfiguratie van de Linux-kernel
De configuratie van de Linux-kernel wordt aangeroepen met het volgende commando:
make linux-menuconfigLaten we ondersteuning voor de Virtualbox-grafische kaart toevoegen.

Laten we ondersteuning voor Virtualbox Guest-integratie toevoegen.

Opslaan en afsluiten. BELANGRIJK: de configuratie wordt opgeslagen in output/build/linux-$version/config, maar niet in board/my_x86_board/linux.config

Daarom moeten we de configuratie handmatig naar de opslaglocatie kopiëren:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.configDaarna voeren we een volledige herbouw van het systeem uit. Omdat buildroot al opgebouwde onderdelen niet opnieuw bouwt, moeten we handmatig de pakketten voor herbouw opgeven. Om tijd en zenuwen te besparen, is het gemakkelijker om een klein systeem volledig opnieuw te bouwen:
make clean;makeNa het voltooien van de constructie starten we VirtualBox (geprobeerd op versie 5.2 en 6.0) met opstarten vanaf een cd-schijf. Systeemparameters:

Opstarten vanaf de gebouwde iso:

Lijst van gebruikte materialen
- Buildroot-handleiding
Bron: habr.com
