Innledning
I denne serien med artikler ønsker jeg å se på byggesystemet for byggerotdistribusjon og dele min erfaring med å tilpasse det. Det vil være praktisk erfaring med å lage et lite OS med et grafisk grensesnitt og minimal funksjonalitet.
Først og fremst bør du ikke forveksle byggesystemet og distribusjonen. Buildroot kan bygge et system fra et sett med pakker som tilbys til det. Buildroot er bygget på makefiler og har derfor enorme tilpasningsmuligheter. Erstatte en pakke med en annen versjon, legge til din egen pakke, endre reglene for å bygge en pakke, tilpasse filsystemet etter å ha installert alle pakkene? buildroot kan gjøre alt dette.
I Russland brukes buildroot, men etter min mening er det lite russiskspråklig informasjon for nybegynnere.
Målet med arbeidet er å sette sammen et distribusjonssett med live nedlasting, icewm-grensesnitt og nettleser. Målplattformen er virtualbox.
Hvorfor bygge din egen distribusjon? Ofte er det nødvendig med begrenset funksjonalitet med begrensede ressurser. Enda oftere i automatisering må du lage firmware. Å tilpasse en generell distribusjon ved å rense ut unødvendige pakker og gjøre den om til fastvare er mer arbeidskrevende enn å bygge en ny distribusjon. Å bruke Gentoo har også sine begrensninger.
Buildroot-systemet er veldig kraftig, men det vil ikke gjøre noe for deg. Den kan bare aktivere og automatisere monteringsprosessen.
Alternative byggesystemer (yocto, åpent byggesystem og andre) vurderes eller sammenlignes ikke.
Hvor du får tak i det og hvordan du starter
Prosjektnettsted -
Buildroot driver defconfigs for måltavlen til bygningen. Defconfig er en konfigurasjonsfil som bare lagrer alternativer som ikke har standardverdier. Det er han som bestemmer hva som skal samles inn og hvordan. I dette tilfellet kan du separat konfigurere konfigurasjonene til busybox, linux-kernel, uglibc, u-boot og barebox bootloaders, men alle vil være knyttet til målkortet.
Etter å ha pakket ut det nedlastede arkivet eller kloning fra git, får vi en klar til bruk byggerot. Du kan lese mer om katalogstrukturen i manualen; jeg skal fortelle deg om de viktigste:
borde — en katalog med filer som er spesifikke for hvert brett. Dette kan være skript for å lage systembilder (iso, sdcart, cpio og andre), en overleggskatalog, kjernekonfigurasjon, etc.
configs — selve defconfig av brettet. Defconfig er en ufullstendig kortkonfigurasjon. Den lagrer kun parametere som avviker fra standardinnstillingene
dl — katalog med nedlastede kildekoder/filer for montering
utgang/mål — det sammensatte filsystemet til det resulterende operativsystemet. Deretter lages bilder fra den for nedlasting/installasjon
utgang/vert - vertsverktøy for montering
utgang/bygg - sammensatte pakker
Sammenstillingen konfigureres via KConfig. Det samme systemet brukes til å bygge Linux-kjernen. Liste over de mest brukte kommandoene (utfør i buildroot-katalogen):
- lage menuconfig - kall opp byggekonfigurasjonen. Du kan også bruke det grafiske grensesnittet (lag nconfig, lag xconfig, lag gconfig)
- lag linux-menuconfig - kall opp kjernekonfigurasjonen.
- gjør rent - rengjør byggeresultatene (alt lagret i utdata)
- lage - bygge et system. Dette setter ikke sammen allerede sammensatte prosesser.
- make defconfig_name - bytt konfigurasjonen til en spesifikk defconfig
- make list-defconfigs - vis en liste over defconfigs
- lag kilde - bare last ned installasjonsfilene, uten å bygge.
- lag hjelp - liste opp mulige kommandoer
Viktige merknader og nyttige tips
Buildroot bygger ikke om pakker som allerede er bygget! Derfor kan det oppstå en situasjon hvor en fullstendig remontering er nødvendig.
Du kan gjenoppbygge en egen pakke med kommandoen gjøre pakkenavn-rebuild. For eksempel kan du gjenoppbygge Linux-kjernen:
make linux-rebuild
Buildroot lagrer tilstanden til enhver pakke ved å lage .stamp-filer i katalogen output/build/$packagename:
Derfor kan du gjenoppbygge root-fs og bilder uten å gjenoppbygge pakker:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make
Nyttige variabler
buildroot har et sett med variabler for enkel konfigurasjon
- $TOPDIR - byggerotkatalog
- $BASEDIR - OUTPUT-katalog
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — vert fs, iscenesettelse fs, mål fs byggekataloger.
- $BUILD_DIR - katalog med utpakkede og bygde pakker
Visualisering
buildroot har en visualiseringsfunksjon. Du kan bygge et avhengighetsdiagram, en byggetidsgraf og en graf over pakkestørrelser i det endelige systemet. Resultatene er i form av pdf-filer (du kan velge fra svn,png) i output/graph-katalogen.
Eksempler på visualiseringskommandoer:
make graph-depends
bygge avhengighetstremake <pkg>-graph-depends
bygge et avhengighetstre for en bestemt pakkeBR2_GRAPH_OUT=png make graph-build
plot byggetid med PNG-utdatamake graph-size
plott pakkestørrelse
Nyttige skript
Det er en underkatalog i byggerotkatalogen utils med nyttige skript. For eksempel er det et skript som kontrollerer at pakkebeskrivelsene er korrekte. Dette kan være nyttig når du legger til dine egne pakker (jeg skal gjøre dette senere). Filen utils/readme.txt inneholder en beskrivelse av disse skriptene.
La oss bygge en aksjefordeling
Det er viktig å huske at alle operasjoner utføres på vegne av en vanlig bruker, ikke root.
Alle kommandoer utføres i buildroten. Byggrotpakken inkluderer allerede et sett med konfigurasjoner for mange vanlige brett og virtualisering.
La oss se på listen over konfigurasjoner:
Bytt til qemu_x86_64_defconfig-konfigurasjonen
make qemu_x86_64_defconfig
Og vi starter monteringen
make
Byggingen fullføres vellykket, se på resultatene:
Buildroot har kompilert bilder som du kan kjøre i Qemu og verifisere at de fungerer.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Resultatet er et system som kjører i qemu:
Lag din egen styrekonfigurasjon
Legge til tavlefiler
La oss se på listen over konfigurasjoner:
I listen ser vi pc_x86_64_efi_defconfig. Vi vil lage vårt eget styre ved å kopiere det fra konfigurasjonen:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
La oss umiddelbart lage en brettkatalog for å lagre skriptene våre, rootfs-overlegget og andre nødvendige filer:
mkdir board/my_x86_board
Bytt til denne defconfig:
make my_x86_board_defconfig
Dermed tilsvarer nå build-konfigurasjonen (lagret i .config i roten til buildroot-katalogen) den gamle x86-64 (bios) oppstartsmålmaskinen.
La oss kopiere linux-kjernekonfigurasjonen (nyttig senere):
cp board/pc/linux.config board/my_x86_board/
Angi byggeparametere via KConfig
La oss starte oppsettet:
make menuconfig
KConfig-vinduet åpnes. Det er mulig å konfigurere med et grafisk grensesnitt (make nconfig, make xconfig, make gconfig):
Vi går inn i den første delen Målalternativer. Her kan du velge målarkitekturen som byggingen skal utføres for.
Byggealternativer - det er forskjellige byggeinnstillinger her. Du kan spesifisere kataloger med kildekoder, antall byggetråder, speil for nedlasting av kildekoder og andre innstillinger. La oss la innstillingene stå som standard.
Verktøykjede – selve byggeverktøyene konfigureres her. Les mer om ham.
Verktøykjedetype – type verktøykjede som brukes. Dette kan være en verktøykjede innebygd i buildroot eller en ekstern (du kan spesifisere katalogen med den allerede bygde eller url for nedlasting). Det er flere alternativer for forskjellige arkitekturer. For eksempel, for arm kan du ganske enkelt velge Linaro-versjonen av den eksterne verktøykjeden.
C-bibliotek – valg av C-bibliotek Driften av hele systemet avhenger av dette. Vanligvis brukes glibc, som støtter all mulig funksjonalitet. Men det kan være for stort for et innebygd system, så uglibc eller musl blir ofte valgt. Vi vil velge glibc (dette vil være nødvendig senere for å bruke systemd).
Kernel Headers og Custom Kernel Headers-serien – må samsvare med versjonen av kjernen som vil være i det sammensatte systemet. For kjerneoverskrifter kan du også spesifisere banen til tarball- eller git-depotet.
GCC COMPILER VERSIONS – velg kompilatorversjonen som skal brukes til bygging
Aktiver C++-støtte – velg å bygge med støtte for C++-biblioteker i systemet. Dette vil være nyttig for oss i fremtiden.
Ytterligere gcc-alternativer – du kan angi flere kompilatoralternativer. Vi trenger det ikke akkurat nå.
Systemkonfigurasjon lar deg angi fremtidige parametere for det opprettede systemet:
De fleste punktene er tydelige fra tittelen. La oss ta hensyn til følgende punkter:
Sti til brukertabellene - tabell med brukere som skal opprettes (
Eksempelfil. Brukerbrukeren opprettes med passordadmin, automatisk gid/uid, /bin/sh-skall, standard gruppebruker, gruppemedlemsrot, kommentar Foo-bruker
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
Rotfilsystemoverleggskataloger - katalog lagt over de sammensatte target-fs. Legger til nye filer og erstatter eksisterende.
Egendefinerte skript som skal kjøres før du lager filsystembilder - Skript som kjøres rett før filsystemet brettes til bilder. La oss la skriptet stå tomt for nå.
La oss gå til kjernedelen
Kjerneinnstillinger angis her. Selve kjernen konfigureres via make linux-menuconfig.
Du kan stille inn kjerneversjonen på forskjellige måter: velg blant de som tilbys, skriv inn versjonen manuelt, spesifiser et depot eller en ferdig tarball.
Kjernekonfigurasjon — bane til kjernekonfigurasjonen. Du kan velge standardkonfigurasjonen for den valgte arkitekturen eller defocnfig fra Linux. Linux-kilden inneholder et sett med defconfigs for forskjellige målsystemer. Du kan finne den du trenger
Målpakker-delen lar deg velge hvilke pakker som skal installeres på systemet som bygges. La oss la det være uendret foreløpig. Vi legger pakkene våre til denne listen senere.
Filsystembilder - en liste over filsystembilder som vil bli samlet inn. Legg til et iso-bilde
Bootloaders - utvalg av bootloadere å samle. La oss velge isolinix
Konfigurere Systemd
Systemd er i ferd med å bli en av grunnpilarene i Linux, sammen med kjerne og glibc. Derfor flyttet jeg innstillingen til et eget element.
Konfigurert via make menuconfig, deretter Target-pakker → Systemverktøy → systemd. Her kan du spesifisere hvilke systemd tjenester som skal installeres og startes når systemet starter.
Lagrer systemkonfigurasjon
Vi lagrer denne konfigurasjonen via KConfig.
Lagre deretter vår defconfig:
make savedefconfig
Linux-kjernekonfigurasjon
Linux-kjernekonfigurasjonen påkalles med følgende kommando:
make linux-menuconfig
La oss legge til støtte for Virtualbox-skjermkortet
La oss legge til Virtualbox Guest-integrasjonsstøtte
Lagre og lukk. VIKTIG: konfigurasjonen vil bli lagret i output/build/linux-$version/config, men ikke i board/my_x86_board/linux.config
Derfor må du manuelt kopiere konfigurasjonen til et lagringssted:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Deretter vil vi utføre en fullstendig remontering av hele systemet. buildroot gjenoppbygger ikke det som allerede er bygget, du må manuelt spesifisere pakker for gjenoppbygging. For ikke å kaste bort tid og nerver, er det lettere å gjenoppbygge et lite system helt):
make clean;make
Når bygget er fullført, start VirtualBox (testet på versjon 5.2 og 6.0) ved oppstart fra CD-en. Systemparametere:
Start fra den sammensatte isoen:
Liste over brukte materialer
- Buildroot manual
Kilde: www.habr.com