Introductie
In deze serie artikelen wil ik kijken naar het buildroot-distributiebouwsysteem en mijn ervaringen delen met het aanpassen ervan. Er zal praktische ervaring worden opgedaan met het creëren van een klein besturingssysteem met een grafische interface en minimale functionaliteit.
Allereerst moet je het bouwsysteem en de distributie niet verwarren. Buildroot kan een systeem bouwen uit een reeks pakketten die eraan worden aangeboden. Buildroot is gebouwd op makefiles en heeft daarom enorme aanpassingsmogelijkheden. Een pakket vervangen door een andere versie, uw eigen pakket toevoegen, de regels voor het bouwen van een pakket wijzigen, het bestandssysteem aanpassen nadat u alle pakketten hebt geïnstalleerd? buildroot kan dit allemaal.
In Rusland wordt buildroot gebruikt, maar naar mijn mening is er weinig Russischtalige informatie voor beginners.
Het doel van het werk is het samenstellen van een distributiekit met live download, icewm-interface en browser. Het doelplatform is virtualbox.
Waarom uw eigen distributie bouwen? Vaak is beperkte functionaliteit nodig met beperkte middelen. Nog vaker moet je bij automatisering firmware maken. Het aanpassen van een algemene distributie door onnodige pakketten op te schonen en deze in firmware om te zetten is arbeidsintensiever dan het bouwen van een nieuwe distributie. Het gebruik van Gentoo heeft ook zijn beperkingen.
Het Buildroot-systeem is erg krachtig, maar het zal niets voor je doen. Het kan alleen het assemblageproces mogelijk maken en automatiseren.
Alternatieve bouwsystemen (yocto, open bouwsysteem en andere) worden niet overwogen of vergeleken.
Waar je het kunt krijgen en hoe je moet beginnen
Projectwebsite -
Buildroot voert defconfigs uit voor het doelbord van de build. Defconfig is een configuratiebestand waarin alleen opties worden opgeslagen die geen standaardwaarden hebben. Hij is degene die bepaalt wat er wordt verzameld en hoe. In dit geval kun je de configuraties van busybox, linux-kernel, uglibc, u-boot en barebox bootloaders afzonderlijk configureren, maar ze zullen allemaal aan het doelbord gekoppeld zijn.
Na het uitpakken van het gedownloade archief of het klonen van git, krijgen we een kant-en-klare buildroot. Meer over de directorystructuur lees je in de handleiding; ik vertel je de belangrijkste:
boord — een map met bestanden die specifiek zijn voor elk bord. Dit kunnen scripts zijn voor het vormen van systeemimages (iso, sdcart, cpio en andere), een overlay-map, kernelconfiguratie, enz.
configs — de daadwerkelijke defconfig van het bord. Defconfig is een onvolledige bordconfiguratie. Er worden alleen parameters opgeslagen die afwijken van de standaardinstellingen
dl — map met gedownloade broncodes/bestanden voor montage
uitgang/doel — het samengestelde bestandssysteem van het resulterende besturingssysteem. Vervolgens worden er afbeeldingen van gemaakt om te downloaden/installeren
uitvoer/host - hosthulpprogramma's voor montage
uitvoer/opbouw - samengestelde pakketten
De assembly wordt geconfigureerd via KConfig. Hetzelfde systeem wordt gebruikt om de Linux-kernel te bouwen. Lijst met de meest gebruikte opdrachten (uitvoeren in de buildroot-directory):
- make menuconfig - roep de build-configuratie aan. U kunt ook de grafische interface gebruiken (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig - roep de kernelconfiguratie aan.
- make clean - maak de buildresultaten schoon (alles opgeslagen in de uitvoer)
- maak - bouw een systeem. Hiermee worden reeds samengestelde processen niet opnieuw samengesteld.
- make defconfig_name - schakel de configuratie naar een specifieke defconfig
- make list-defconfigs - toon een lijst met defconfigs
- maak bron - download gewoon de installatiebestanden, zonder te bouwen.
- help maken - lijst mogelijke opdrachten op
Belangrijke opmerkingen en nuttige tips
Buildroot bouwt geen pakketten opnieuw op die al zijn gebouwd! Daarom kan er een situatie ontstaan waarin een volledige hermontage vereist is.
Met de opdracht kunt u een afzonderlijk pakket opnieuw opbouwen maak pakketnaam-rebuild. U kunt bijvoorbeeld de Linux-kernel opnieuw opbouwen:
make linux-rebuild
Buildroot slaat de status van elk pakket op door .stamp-bestanden te maken in de directory output/build/$packagename:
Daarom kunt u root-fs en images opnieuw opbouwen zonder 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
buildroot heeft een reeks variabelen voor eenvoudige configuratie
- $TOPDIR - buildroot-map
- $BASEDIR - OUTPUT-map
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — host fs, staging fs, doel fs build-mappen.
- $BUILD_DIR - map met uitgepakte en gebouwde pakketten
Visualisatie
buildroot heeft een visualisatiefunctie. U kunt een afhankelijkheidsdiagram, een bouwtijdgrafiek en een grafiek van pakketgroottes in het uiteindelijke systeem bouwen. De resultaten zijn in de vorm van pdf-bestanden (u kunt kiezen uit svn,png) in de map output/graph.
Voorbeelden van visualisatieopdrachten:
make graph-depends
afhankelijkheidsboom bouwenmake <pkg>-graph-depends
bouw een afhankelijkheidsboom voor een specifiek pakketBR2_GRAPH_OUT=png make graph-build
plot bouwtijd met PNG-uitvoermake graph-size
pakketgrootte plotten
Handige scripts
Er is een submap in de buildroot-map utils met handige scripts. Zo is er een script dat de juistheid van pakketbeschrijvingen controleert. Dit kan handig zijn als u uw eigen pakketten toevoegt (ik zal dit later doen). Het bestand utils/readme.txt bevat een beschrijving van deze scripts.
Laten we een aandelendistributie bouwen
Het is belangrijk om te onthouden dat alle bewerkingen worden uitgevoerd namens een gewone gebruiker en niet namens de root.
Alle opdrachten worden uitgevoerd in de buildroot. Het buildroot-pakket bevat al een set configuraties voor veel gangbare borden en virtualisatie.
Laten we eens kijken naar de lijst met configuraties:
Schakel over naar de configuratie qemu_x86_64_defconfig
make qemu_x86_64_defconfig
En we beginnen met de montage
make
De build is succesvol voltooid, bekijk de resultaten:
Buildroot heeft afbeeldingen samengesteld die u in Qemu kunt uitvoeren en kunt verifiëren dat ze werken.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Het resultaat is een systeem dat draait in qemu:
Creëer uw eigen bordconfiguratie
Bordbestanden toevoegen
Laten we eens kijken naar de lijst met configuraties:
In de lijst zien we pc_x86_64_efi_defconfig. We zullen ons eigen bord maken door het uit de configuratie te kopiëren:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Laten we onmiddellijk een boarddirectory maken om onze scripts, rootfs-overlay en andere noodzakelijke bestanden op te slaan:
mkdir board/my_x86_board
Schakel over naar deze defconfig:
make my_x86_board_defconfig
Dus nu komt de build-configuratie (opgeslagen in .config in de root van de buildroot-map) overeen met de x86-64 legacy (bios) opstartdoelmachine.
Laten we de Linux-kernelconfiguratie kopiëren (later nuttig):
cp board/pc/linux.config board/my_x86_board/
Bouwparameters instellen via KConfig
Laten we beginnen met de installatie:
make menuconfig
Het KConfig-venster wordt geopend. Het is mogelijk om te configureren met een grafische interface (make nconfig, make xconfig, make gconfig):
We komen in de eerste sectie Doelopties. Hier kunt u de doelarchitectuur selecteren waarvoor de build wordt uitgevoerd.
Bouwopties - er zijn hier verschillende bouwinstellingen. U kunt mappen met broncodes, het aantal build-threads, mirrors voor het downloaden van broncodes en andere instellingen opgeven. Laten we de instellingen op de standaard laten staan.
Toolchain – de bouwtools zelf worden hier geconfigureerd. Lees meer over hem.
Type gereedschapsketting – type gereedschapsketting dat wordt gebruikt. Dit kan een toolchain zijn die is ingebouwd in buildroot of een externe toolchain (u kunt de map opgeven met de reeds gebouwde of de URL om te downloaden). Er zijn extra opties voor verschillende architecturen. Voor arm kunt u bijvoorbeeld eenvoudig de Linaro-versie van de externe toolchain selecteren.
C-bibliotheek – selectie van de C-bibliotheek. De werking van het hele systeem is hiervan afhankelijk. Meestal wordt glibc gebruikt, dat alle mogelijke functionaliteit ondersteunt. Maar het kan te groot zijn voor een embedded systeem, daarom wordt vaak gekozen voor uglibc of musl. We zullen glibc selecteren (dit is later nodig om systemd te gebruiken).
Kernel Headers en Custom Kernel Headers-series - moeten overeenkomen met de versie van de kernel die zich in het geassembleerde systeem zal bevinden. Voor kernelheaders kun je ook het pad naar de tarball- of git-repository opgeven.
GCC COMPILERVERSIES – selecteer de compilerversie die moet worden gebruikt voor het bouwen
Schakel C++-ondersteuning in – selecteer om te bouwen met ondersteuning voor C++-bibliotheken in het systeem. Dit zal voor ons in de toekomst nuttig zijn.
Extra gcc-opties – u kunt extra compileropties instellen. Wij hebben het voorlopig niet nodig.
Met systeemconfiguratie kunt u toekomstige parameters van het gemaakte systeem instellen:
De meeste punten worden duidelijk uit de titel. Laten we op de volgende punten letten:
Pad naar de gebruikerstabellen - tabel met aan te maken gebruikers (
Voorbeeld bestand. De gebruiker-gebruiker wordt aangemaakt met het wachtwoord admin, automatisch gid/uid, /bin/sh shell, standaardgroepsgebruiker, groepslid root, commentaar Foo-gebruiker
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
Overlay-mappen voor het rootbestandssysteem - map als overlay bovenop de samengestelde target-fs. Voegt nieuwe bestanden toe en vervangt bestaande.
Aangepaste scripts die moeten worden uitgevoerd voordat bestandssysteemafbeeldingen worden gemaakt - Scripts die worden uitgevoerd onmiddellijk voordat het bestandssysteem in afbeeldingen wordt gevouwen. Laten we het script voorlopig leeg laten.
Laten we naar de Kernel-sectie gaan
Hier worden de kernelinstellingen ingesteld. De kernel zelf wordt geconfigureerd via make linux-menuconfig.
U kunt de kernelversie op verschillende manieren instellen: kies uit de aangeboden versies, voer de versie handmatig in, specificeer een repository of een kant-en-klare tarball.
Kernelconfiguratie — pad naar de kernelconfiguratie. U kunt de standaardconfiguratie voor de geselecteerde architectuur of defocnfig vanuit Linux selecteren. De Linux-bron bevat een set defconfigs voor verschillende doelsystemen. Je kunt degene vinden die je nodig hebt
In de sectie Doelpakketten kunt u selecteren welke pakketten worden geïnstalleerd op het systeem dat wordt gebouwd. Laten we het voorlopig ongewijzigd laten. We zullen onze pakketten later aan deze lijst toevoegen.
Bestandssysteemafbeeldingen - een lijst met bestandssysteemafbeeldingen die worden verzameld. Voeg een ISO-afbeelding toe
Bootloaders - selectie van bootloaders om te verzamelen. Laten we isolinix kiezen
Systemd configureren
Systemd wordt een van de pijlers van Linux, samen met kernel en glibc. Daarom heb ik de instelling ervan naar een apart item verplaatst.
Geconfigureerd via make menuconfig, vervolgens Doelpakketten → Systeemhulpmiddelen → systemd. Hier kunt u opgeven welke systeemservices worden geïnstalleerd en gestart wanneer het systeem opstart.
Systeemconfiguratie opslaan
We slaan deze configuratie op via KConfig.
Sla vervolgens onze defconfig op:
make savedefconfig
Linux-kernelconfiguratie
De Linux-kernelconfiguratie wordt aangeroepen met de volgende opdracht:
make linux-menuconfig
Laten we ondersteuning toevoegen voor de Virtualbox-videokaart
Laten we Virtualbox Guest-integratieondersteuning toevoegen
Opslaan en afsluiten. BELANGRIJK: configuratie wordt opgeslagen in output/build/linux-$version/config, maar niet in board/my_x86_board/linux.config
Daarom moet u de configuratie handmatig naar een opslaglocatie kopiëren:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Daarna zullen wij een volledige hermontage van het gehele systeem uitvoeren. buildroot bouwt niet opnieuw op wat al is gebouwd; u moet handmatig pakketten opgeven om opnieuw te bouwen. Om geen tijd en zenuwen te verspillen, is het gemakkelijker om een klein systeem volledig opnieuw op te bouwen):
make clean;make
Na voltooiing van de build start u VirtualBox (getest op versies 5.2 en 6.0) en start u op vanaf de cd.
Lopend vanaf de samengestelde ISO:
Lijst met gebruikte materialen
- Buildroot-handleiding
Bron: www.habr.com