Indledning
I denne serie af artikler vil jeg gennemgå buildroot-distributionens byggesystem og dele min erfaring med at tilpasse det. Der vil være praktisk erfaring med at skabe et lille OS med en grafisk grænseflade og minimal funktionalitet.
Først og fremmest bør du ikke forveksle byggesystemet og distributionen. Buildroot kan bygge et system ud fra et sæt pakker, der tilbydes til det. Buildroot er bygget på makefiler og har derfor enorme tilpasningsmuligheder. Erstatte en pakke med en anden version, tilføje din egen pakke, ændre reglerne for at bygge en pakke, tilpasse filsystemet efter installation af alle pakkerne? buildroot kan alt dette.
I Rusland bruges buildroot, men efter min mening er der lidt russisksproget information til begyndere.
Formålet med arbejdet er at bygge et distributionssæt med live download, icewm interface og browser. Målplatformen er virtualbox.
Hvorfor bygge din egen distribution? Ofte er der brug for begrænset funktionalitet med begrænsede ressourcer. Endnu oftere i automatisering skal du oprette firmware. At tilpasse en distribution til generelle formål ved at rense unødvendige pakker og omdanne den til firmware er mere arbejdskrævende end at bygge en ny distribution. Brug af Gentoo har også sine begrænsninger.
Buildroot-systemet er meget kraftfuldt, men det vil ikke gøre noget for dig. Det kan kun aktivere og automatisere monteringsprocessen.
Alternative byggesystemer (yocto, åbent byggesystem osv.) tages ikke i betragtning eller sammenlignes.
Hvor man kan få fat og hvordan man starter
Projektets hjemmeside -
Buildroot fungerer med defconfigs til målbyggekortet. Defconfig er en konfigurationsfil, der kun indeholder indstillinger, der ikke har en standardværdi. Det er ham, der bestemmer, hvad og hvordan der skal indsamles. I dette tilfælde kan du separat konfigurere busybox, linux-kernel, uglibc, u-boot og barebox bootloader-konfigurationer, men de vil alle være bundet til målkortet.
Efter udpakning af det downloadede arkiv eller kloning fra git får vi en buildroot, der er klar til brug. Du kan læse mere om mappestrukturen i manualen; jeg fortæller dig om de vigtigste:
board — bibliotek med filer, der er specifikke for hvert bræt. Disse kan være scripts til at danne systembilleder (iso, sdcart, cpio og andre), en overlay-mappe, kernekonfiguration osv.
configs - selve defconfig af bestyrelsen. Defconfig er en ufuldstændig kortkonfiguration. Den gemmer kun andre parametre end standardindstillingerne.
dl — bibliotek med downloadede kildekoder/filer til samling
output/mål - det samlede filsystem for det modtagne OS. I fremtiden oprettes billeder fra den til download/installation
output/vært - Værtsværktøjer til montering
output/byg - samlede pakker
Monteringskonfiguration udføres via KConfig. Det samme system bruges til at bygge linux-kernen. Liste over de mest brugte kommandoer (udfør i buildroot-mappen):
- lav menuconfig - kald build-konfigurationen. Du kan også bruge GUI'en (lav nconfig, lav xconfig, lav gconfig)
- lav linux-menuconfig - kald kernekonfiguration.
- gør rene - rene byggeresultater (alt, der er gemt i output)
- lave - opbygge et system. Dette samler ikke allerede samlede processer igen.
- make defconfig_name - skift konfiguration til specifik defconfig
- make list-defconfigs - vis en liste over defconfigs
- lav kilde - download kun installationsfilerne, ingen samling.
- lav hjælp - vis en liste over mulige kommandoer
Vigtige bemærkninger og nyttige tip
Buildroot genopbygger ikke allerede byggede pakker! Derfor kan der opstå en situation, hvor en fuldstændig genmontering er påkrævet.
Du kan genopbygge en enkelt pakke med kommandoen lav pakkenavn-genopbygning. For eksempel kan du genopbygge linux-kernen:
make linux-rebuild
Buildroot gemmer tilstanden for enhver pakke ved at oprette .stamp-filer i mappen output/build/$pakkenavn:
Derfor er det muligt at genopbygge root-f'er 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 ; make
Nyttige variabler
buildroot har et sæt variabler for nem konfiguration
- $TOPDIR - buildroot rodmappe
- $BASEDIR - OUTPUT bibliotek
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR - host fs, staging fs, target fs build mapper.
- $BUILD_DIR - mappe med udpakkede og indbyggede pakker
Visualisering
buildroot har en visualiseringsfunktion. Du kan bygge et afhængighedsdiagram, en byggetidsgraf og en graf over pakkestørrelser i det endelige system. Resultater som pdf-filer (du kan vælge fra svn,png) i output/graf-mappen.
Eksempler på gengivelseskommandoer:
make graph-depends
bygge et afhængighedstræmake <pkg>-graph-depends
opbygge afhængighedstræet for en specifik pakkeBR2_GRAPH_OUT=png make graph-build
plot byggetidsgraf med PNG-outputmake graph-size
plotte pakkestørrelsen
Nyttige scripts
Bygrodmappen har en undermappe utils med nyttige scripts. For eksempel er der et script, der kontrollerer rigtigheden af pakkebeskrivelser. Dette kan være nyttigt, når du tilføjer dine egne pakker (jeg gør det senere). Filen utils/readme.txt indeholder en beskrivelse af disse scripts.
Lad os bygge en aktiefordeling
Det er vigtigt at huske på, at alle operationer udføres på vegne af en almindelig bruger, ikke root.
Alle kommandoer udføres i buildroot. Buildroot-pakken inkluderer allerede et sæt konfigurationer til mange fælles boards og virtualisering.
Se listen over konfigurationer:
Skift til qemu_x86_64_defconfig config
make qemu_x86_64_defconfig
Og vi starter samlingen
make
Opbygningen fuldføres med succes, se på resultaterne:
Buildroot har sammensat billeder, som du kan køre i Qemu og se om de virker.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Resultatet er et system, der kører i qemu:
Opret din egen tavlekonfiguration
Tilføjelse af tavlefiler
Se listen over konfigurationer:
På listen ser vi pc_x86_64_efi_defconfig. Vi opretter vores board ved at kopiere det fra konfigurationen:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Opret straks en board-mappe til at gemme vores scripts, rootfs-overlay og andre nødvendige filer:
mkdir board/my_x86_board
Skift til denne defconfig:
make my_x86_board_defconfig
Så nu matcher build-konfigurationen (lagret i .config i roden af buildroots bibliotek) den x86-64 legacy(bios)-målmaskine ved boot.
Kopier linux-kerne-konfigurationen (nyttigt senere):
cp board/pc/linux.config board/my_x86_board/
Konfiguration af byggeindstillinger via KConfig
Lad os starte opsætningen:
make menuconfig
KConfig-vinduet åbnes. Det er muligt at konfigurere med en grafisk grænseflade (make nconfig, make xconfig, make gconfig):
Vi går ind i det første afsnit Målindstillinger. Her kan du vælge den målarkitektur, som montagen skal udføres for.
Byggemuligheder - her er der forskellige byggemuligheder. Du kan angive mapper med kildekoder, antallet af build-tråde, spejle til download af kildekoder og andre indstillinger. Lad os forlade standardindstillingerne.
Værktøjskæde - selve byggeværktøjssættet er konfigureret her. Mere om ham.
Værktøjskædetype - den anvendte type værktøjskæde. Dette kan være en værktøjskæde indbygget i buildroot eller en ekstern (du kan angive mappen med den allerede indbyggede eller url til download). Der er yderligere muligheder for forskellige arkitekturer. For eksempel, for arm, kan du blot vælge versionen af den eksterne Linaro værktøjskæde.
C-bibliotek - valg af C-bibliotek.. Driften af hele systemet afhænger af dette. Normalt bruges glibc, som understøtter al mulig funktionalitet. Men det kan være for stort til et indlejret system, så uglibc eller musl bliver ofte valgt. Vi vælger glibc (dette vil være nødvendigt senere for at bruge systemd).
Kernel Headers og Custom Kernel Headers-serien – skal matche den version af kernen, der vil være i det samlede system. For kerneoverskrifter kan du også angive stien til tarballen eller git-lageret.
GCC COMPILER VERSIONER - vælg den compiler version, der skal bruges til at bygge
Aktiver C++-understøttelse - vælg at bygge med understøttelse af c++-biblioteker i systemet. Det får vi brug for senere.
Yderligere gcc-indstillinger - du kan indstille yderligere kompileringsindstillinger. Vi har ikke brug for det lige nu.
Systemkonfiguration giver dig mulighed for at indstille fremtidige parametre for det oprettede system:
De fleste af pointerne fremgår tydeligt af titlen. Lad os være opmærksomme på følgende punkter:
Sti til brugertabellerne - tabel med oprettede brugere (
Eksempel på fil. Brugerbrugeren oprettes med adgangskoden admin, automatisk gid/uid, /bin/sh shell, standard gruppebruger, gruppemedlems rod, kommentar Foo bruger
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
Root filsystem overlejringsmapper - en mappe, der er overlejret oven på de kompilerede target-fs. Tilføjer nye filer og erstatter eksisterende.
Brugerdefinerede scripts til at køre før oprettelse af filsystembilleder - Scripts udført umiddelbart før foldning af filsystemet til billeder. Lad scriptet være tomt indtil videre.
Lad os gå til Kernel-sektionen
Det er her kerneindstillingerne er sat. Selve kernen konfigureres via make linux-menuconfig.
Du kan indstille kerneversionen på forskellige måder: vælg blandt de tilbudte, indtast versionen manuelt, angiv et lager eller en færdiglavet tarball.
Kernekonfiguration — sti til kernekonfigurationen. Du kan vælge standardkonfigurationen for den valgte arkitektur eller defocnfig fra Linux. Linux-kilden indeholder et sæt defconfigs til forskellige målsystemer. Du kan finde den, du skal bruge
Sektionen Målpakker giver dig mulighed for at vælge, hvilke pakker der skal installeres på det system, der bygges. Lad os lade det være uændret indtil videre. Senere vil vi tilføje vores pakker til denne liste.
Filsystembilleder - Liste over filsystembilleder, der skal bygges. Tilføj et iso-billede
Bootloadere - valget af indsamlede bootloadere. Vælg isolinix
Konfiguration af Systemd
Systemd bliver en af grundpillerne i linux sammen med kernel og glibc. Derfor tog jeg dens indstilling ud i et separat afsnit.
Konfigureret via make menuconfig, derefter Target-pakker → Systemværktøjer → systemd. Her kan du angive, hvilke systemd-tjenester, der skal installeres og startes, når systemet starter.
Gemmer systemkonfigurationen
Vi gemmer denne opsætning via KConfig.
Så gemmer vi vores defconfig:
make savedefconfig
Linux-kernekonfiguration
Linux-kernekonfigurationen påkaldes af følgende kommando:
make linux-menuconfig
Lad os tilføje understøttelse af Virtualbox-skærmkortet
Tilføj Virtualbox Guest-integrationssupport
Gem og luk. VIGTIGT: konfigurationen vil blive gemt i output/build/linux-$version/config, men ikke i board/my_x86_board/linux.config
Derfor skal du manuelt kopiere konfigurationen til lagerplaceringen:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Derefter vil vi udføre en komplet genmontering af hele systemet. buildroot genopbygger ikke det, der allerede er bygget, du skal manuelt angive de pakker, der skal genopbygges. For ikke at spilde tid og nerver er det lettere at genopbygge et lille system som helhed):
make clean;make
Efter færdiggørelse af montagen starter vi VirtualBox (testet på version 5.2 og 6.0) med opstart fra cd-disken Systemparametre:
Starter fra den indbyggede iso:
Liste over anvendte materialer
- Buildroot manual
Kilde: www.habr.com