Introduktion
I denne artikelserie vil jeg undersĂžge buildroot-distributionssamlesystemet og dele erfaringer med dets tilpasning. Her vil jeg prĂŠsentere praktisk erfaring med at oprette et lille operativsystem med grafisk grĂŠnseflade og minimal funktionalitet.
FÞrst og fremmest bÞr man ikke forveksle et samlesystem med en distribution. Buildroot kan samle et system fra et sÊt pakker, som det har fÄet foreslÄet. Buildroot er baseret pÄ make-filer og har derfor enorme tilpasningsmuligheder. At erstatte en pakke med en anden version, tilfÞje sin egen pakke, Êndre byggebestemmelserne for pakken, tilpasse filsystemet efter installation af alle pakker? Alt dette kan buildroot.
I Rusland anvendes buildroot, men efter min mening er der for lidt information pÄ russisk for nybegyndere.
MÄlet med arbejdet er at samle en distribution med live-boot, icewm-grÊnseflade og en browser. Den mÄlrettede platform er virtualbox.
Hvorfor samle sin egen distribution? Ofte er der behov for begrÊnset funktionalitet ved begrÊnsede ressourcer. Endnu oftere krÊves det i automatisering at skabe firmware. At tilpasse en generel distributionssystem ved at fjerne unÞdvendige pakker og forvandle det til firmware er en langt mere arbejdskrÊvende proces end at samle en ny distribution. Brug af Gentoo har ogsÄ sine begrÊnsninger.
Buildroot er et meget kraftfuldt system, men det vil ikke gĂžre noget for dig. Det kan kun give muligheder og automatisere byggeprocessen.
Alternative samlesystemer (yocto, open build system osv.) overvejes ikke og sammenlignes ikke.
Hvor kan man finde og hvordan kan man komme i gang
Projektets hjemmeside â . Her kan man downloade den aktuelle version og lĂŠse vejledningen. Der kan man ogsĂ„ kontakte fĂŠllesskabet, finde bug-tracker, maillister og IRC-kanal.
Buildroot opererer med defconfig'er til den mÄlrettede byggemaskine. Defconfig er en konfigurationsfil, der kun indeholder indstillinger, der ikke har standardvÊrdier. Det er netop denne, der definerer, hvad og hvordan der skal bygges. Samtidig kan man separat tilpasse konfigurationerne for busybox, linux-kernel, uclibc, bootloaders u-boot og barebox, men alle vil vÊre knyttet til den mÄlrettede maskine.
Efter udpakning af den downloadede arkiv eller kloning fra git fÄr man en funktionsdygtig buildroot. Detaljer om katalogstrukturen kan findes i vejledningen; jeg vil fortÊlle om de vigtigste:
board â katalog med filer, der er specifikke for hvert bundkort. Dette kan vĂŠre scripts til at oprette systembilleder (iso, sdcart, cpio osv.), overlay-katalog, kerneindstillinger osv.
configs â det egentlige defconfig for bundkortet. Defconfig er en ufuldstĂŠndig konfiguration for bundkortet. Den indeholder kun parametre, der afviger fra de standardindstillinger.
dl â katalog med downloadede kildekoder/filer til bygningen
output/target â det samlede filsystem for det opnĂ„ede operativsystem. Herfra oprettes der billeder til opstart/installering.
output/host â vĂŠrktĂžjer til at samle hosten
output/build â samlede pakker
Konfigurationen af bygningen udfĂžres via KConfig. Det samme system bruges til at opbygge Linux-kernen. Liste over de mest anvendte kommandoer (udfĂžres i kataloget buildroot):
- make menuconfig â Ă„bne bygningens indstillinger. Man kan ogsĂ„ bruge grafisk interface (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig â Ă„bne kernekonfigurationen.
- make clean â rydde op i bygningens resultater (alt hvad der er gemt i output)
- make â bygge systemet. Under dette udfĂžres der ikke en genbygning af allerede opbyggede processer.
- make defconfig_name â skifte konfiguration til en bestemt defconfig
- make list-defconfigs â vise listen over defconfig'er
- make source â kun hente installationsfiler uden bygning.
- make help â vise listen over mulige kommandoer
Vigtige bemĂŠrkninger og nyttige tips
Buildroot genopbygger ikke allerede opbyggede pakker! Derfor kan der opstÄ en situation, hvor der krÊves en fuld genbygning.
Man kan genopbygge en bestemt pakke med kommandoen make packagename-rebuild. For eksempel kan man genopbygge Linux-kernen:
make linux-rebuildBuildroot gemmer tilstanden af enhver pakke ved at oprette .stamp-filer i kataloget output/build/$packagename:

Derfor kan man genopbygge root-fs og billeder uden at genopbygge pakker:
rm output/build/host-gcc-final-*/*.stamp_host_installed; rm -rf output/target; find output/ -name ".stamp_target_installed" | xargs rm -rf ; makeNyttige variable
I buildroot er der et sĂŠt variabler til nem konfiguration.
- $TOPDIR â rodkataloget for buildroot
- $BASEDIR â OUTPUT-kataloget
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR â kataloger for opbygning af host fs, staging fs, target fs.
- $BUILD_DIR â katalog med udpakkede og opbyggede pakker
Visualisering
I buildroot er der mulighed for visualisering. Man kan bygge et afhÊngighedsschema, et tidsplan for bygningen, et diagram for pakke stÞrrelser i det endelige system. Resultaterne fÄs som pdf-filer (valg mellem svn, png) i kataloget output/graph.
Eksempler pÄ visualiseringskommandoer:
make graph-dependsbygge afhĂŠngighedstrĂŠmake -graph-dependsbygge afhĂŠngighedstrĂŠ for en bestemt pakkeBR2_GRAPH_OUT=png make graph-buildbygge et tidsdiagram med output i PNGmake graph-sizebygge et diagram over pakkerstĂžrrelser
Nyttige scripts
I buildroot-katalogen er der en undermappe utils c med nyttige scripts. For eksempel er der et script, der kontrollerer korrektheden af pakke beskrivelsen. Dette kan vÊre nyttigt, nÄr man tilfÞjer sine egne pakker (det vil jeg gÞre senere). I filen utils/readme.txt er der en beskrivelse af disse scripts.
Lad os samle en lagerdistribution
Det er vigtigt at huske, at alle operationer udfĂžres som en almindelig bruger, ikke root.
Alle kommandoer udfĂžres i rodmappen af buildroot. I buildroot-pakken er der allerede et sĂŠt konfigurationer til mange almindelige boards og virtualisering.
Lad os se listen over konfigurationer:

Skifter til konfig qemu_x86_64_defconfig
make qemu_x86_64_defconfigOg starter build-processen
makeBygningen afsluttes succesfuldt, lad os se resultaterne:
![]()
Buildroot har samlet billeder, som kan kĂžres i Qemu for at sikre, at de fungerer.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -SResultatet er et system, der kĂžrer i qemu:

Oprettelse af konfiguration til eget board
TilfĂžjelse af boardfiler
Lad os se listen over konfigurationer:

Vi ser pc_x86_64_efi_defconfig i listen. Vi vil skabe vores eget board ved at kopiere det fra konfigurationen:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfigLad os straks oprette en mappe til boardet til opbevaring af vores scripts, rootfs-overlay og andre nĂždvendige filer:
mkdir board/my_x86_boardSkift til denne defconfig:
make my_x86_board_defconfigDermed svarer build-konfigurationen (gemt i .config i rodmappen af buildroot) nu til mÄlmaskinen x86-64 legacy(bios) boot.
Lad os kopiere linux-kernel konfigurationen (den vil blive nyttig senere):
cp board/pc/linux.config board/my_x86_board/Konfigurering af bygningsparametre gennem KConfig
Vi starter konfigurationen:
make menuconfig KConfig-vinduet Äbnes. Der er mulighed for at konfigurere med grafisk grÊnseflade (make nconfig, make xconfig, make gconfig):

Vi gÄr ind i den fÞrste sektion Target Options. Her kan du vÊlge mÄlarkitekturen, som bygningen skal laves til.

Bygningsmuligheder â her er der forskellige bygningsindstillinger. Du kan angive kataloger med kildekoder, antal bygge-trĂ„de, spejle til download af kildekoder og andre indstillinger. Lad os beholde standardindstillingerne.
Toolchain â her indstilles selve bygningsvĂŠrktĂžjet. Mere om det senere.

Toolchain type â typen af den anvendte vĂŠrktĂžjskĂŠde. Dette kan vĂŠre den indbyggede i buildroot eller en ekstern vĂŠrktĂžjskĂŠde (du kan angive en mappe med allerede konstrueret eller en URL til download). Der er yderligere muligheder for forskellige arkitekturer. For eksempel, for arm kan du blot vĂŠlge versionen af den eksterne vĂŠrktĂžjskĂŠde Linaro.
C library â valg af C-bibliotek. Dette afhĂŠnger af hele systemets funktionalitet. Normalt anvendes glibc, som understĂžtter al mulig funktionalitet. Men den kan vise sig at vĂŠre for stor til indbyggede systemer, sĂ„ der vĂŠlges ofte uglibc eller musl. Vi vĂŠlger glibc (det vil vĂŠre nĂždvendigt senere for at bruge systemd).
Kernel Headers og Custom Kernel Headers series â skal matche versionen af kernen, der vil vĂŠre i det konstruerede system. For kernel headers kan du ogsĂ„ angive stien til tarballen eller git-repositoriet.
GCC COMPILER VERSIONS â valg af version af compiler, der vil blive brugt til bygningen.
Enable C++ support â vi vĂŠlger at bygge med understĂžttelse af C++-biblioteker i systemet. Det vil vi fĂ„ brug for senere.
Additional gcc options â du kan angive yderligere compilerindstillinger. Det er ikke nĂždvendigt for nu.
System configuration tillader at angive fremtidige parametre for det oprettede system:

De fleste punkter er forstÄelige ud fra titlen. Lad os tage et kig pÄ fÞlgende punkter:
Path to the users tables â tabellen med de oprettede brugere ().
Eksempel pÄ en fil. Brugeren user vil blive oprettet med adgangskoden admin, automatisk gid/uid, /bin/sh som shell, gruppen user som standard, medlem af gruppen root, kommentaren 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 â katalog, der lĂŠgges oven pĂ„ det samlede target-fs. TilfĂžjer nye filer og erstatter eksisterende.
Custom scripts to run before creating filesystem images â Skripter, der kĂžres lige fĂžr filesystemet laves til billeder. Lad os for nu lade skripterne vĂŠre tomme.
Lad os gÄ til sektionen Kernel.

Her indstilles kernelindstillingerne. Selve kernen konfigureres via make linux-menuconfig.
Du kan angive kernelens version pÄ forskellige mÄder: vÊlge fra de foreslÄede, indtaste versionen manuelt, angive et repository eller en klar tarball.
Kernel configuration â sti til kernelkonfigurationen. Du kan vĂŠlge standardkonfigurationen for den valgte arkitektur eller defconfig fra Linux. I Linux-kilderne findes der et sĂŠt defconfig'er for forskellige mĂ„lrettede systemer. Du kan finde den nĂždvendige ved at . For eksempel, for BeagleBone Black-boardet kan du .
Afsnittet MÄlpakker gÞr det muligt at vÊlge, hvilke pakker der skal installeres i det samlede system. Lad os lade det vÊre uÊndret for nu. Senere vil vi tilfÞje vores egne pakker til denne liste.
Filssystembilleder â en liste over filsystembilleder, der vil blive samlet. Lad os tilfĂžje iso-billedet

Bootloaders â valg af de bootloadere, der skal samles. VĂŠlg isolinix

Konfigurering af Systemd
Systemd er blevet en af sÞjlerne i linux, lige sÄ vigtig som kernel og glibc. Derfor har jeg adskilt dens opsÊtning i et sÊrskilt punkt.
Konfigureres gennem make menuconfig, derefter MĂ„lpakker â SystemvĂŠrktĂžjer â systemd. Her kan du angive, hvilke systemd-tjenester der skal installeres og startes ved opstart af systemet.

Gem af systemkonfiguration
Vi gemmer denne konfiguration via KConfig.
Derefter gemmer vi vores defconfig:
make savedefconfigKonfigurering af Linux-kernen
Konfigurering af linux-kernen udfĂžres med fĂžlgende kommando:
make linux-menuconfigLad os tilfĂžje stĂžtte til Virtualbox-grafikkort.

Lad os tilfĂžje support til Virtualbox Guest integration.

Gem og afslut. VIGTIGT: konfigurationen gemmes i output/build/linux-$version/config, men ikke i board/my_x86_board/linux.config

Derfor skal vi manuelt kopiere konfigurationen til opbevaringsstedet:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.configDerefter udfĂžrer vi en fuld genopbygning af hele systemet. Da buildroot ikke genopbygger allerede samlede, skal vi manuelt angive pakker til genopbygning. For ikke at miste tid og sind, er det lettere at genopbygge et lille system helt):
make clean; makeVed afslutningen af bygningen starter vi VirtualBox (testet pÄ version 5.2 og 6.0) med opstart fra cd-disk. Systemparametre:

Start fra det samlede iso:

Liste over anvendte materialer
- Buildroot manual
Kilde: habr.com
