Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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 — buildroot.org. 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:

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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-afhankelijkheden bouw afhankelijkheidsboom
  • maak <pkg>-graf-afhankelijkheden bouw afhankelijkheidsboom van een specifiek pakket
  • BR2_GRAPH_OUT=png maak graf-bouw bouw een grafiek van de bouwtijd met uitvoer in PNG
  • maak graf-grootte bouw 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:

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

We schakelen over naar de configuratie qemu_x86_64_defconfig

maak qemu_x86_64_defconfig

En we starten de compilatie

make

De compilatie wordt succesvol voltooid, laten we naar de resultaten kijken:

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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 -S

Het resultaat — het systeem dat in qemu draait:

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

Configuratie van uw eigen bord aanmaken

Bestanden van het bord toevoegen

Laten we de lijst met configuraties bekijken:

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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_defconfig

Laten we meteen een map voor het bord aanmaken om onze scripts, rootfs-overlay en andere benodigde bestanden op te slaan:

mkdir board/my_x86_board

We schakelen over naar deze defconfig:

maak my_x86_board_defconfig

Zo 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):

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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.

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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:

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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 (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

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 user

Root 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.

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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. hier. Bijvoorbeeld, voor het bord Beagle Bone Black, kun je config kiezen.

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.

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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.

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

Opslaan van systeemconfiguratie

We slaan deze configuratie op via KConfig.

Daarna zullen we onze defconfig opslaan:

make savedefconfig

Configuratie van de Linux-kernel

De configuratie van de Linux-kernel wordt aangeroepen met het volgende commando:

make linux-menuconfig

Laten we ondersteuning voor de Virtualbox-grafische kaart toevoegen.

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

Laten we ondersteuning voor Virtualbox Guest-integratie toevoegen.

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

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

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

Daarom moeten we de configuratie handmatig naar de opslaglocatie kopiëren:

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

Daarna 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;make

Na het voltooien van de constructie starten we VirtualBox (geprobeerd op versie 5.2 en 6.0) met opstarten vanaf een cd-schijf. Systeemparameters:

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

Opstarten vanaf de gebouwde iso:

Buildroot - Deel 1. Algemene informatie, het bouwen van een minimaal systeem, configuratie via menu

Lijst van gebruikte materialen

  1. Buildroot-handleiding

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster