Indledning
I denne serie af artikler vil jeg se på buildroot distributions montagesystemet og dele min erfaring med at tilpasse det. Her får du 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 pakkeopbygningsreglerne, tilpasse filsystemet efter installation af alle pakker? Buildroot kan alt dette.
I Rusland bruges buildroot, men efter min mening er der lidt russisksproget information til begyndere.
Målet med arbejdet er at bygge en distribution med live boot, 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 er det nødvendigt at oprette firmware. At tilpasse en distribution til generelle formål, rydde ud i unødvendige pakker og omdanne den til firmware er en mere arbejdskrævende vej 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 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 - . Her kan du downloade den seneste version og læse manualen. Der kan du også kontakte fællesskabet, der er en bug tracker, mail-lister og en irc-kanal.
Buildroot fungerer på defconfigs for målbyggekortet. Defconfig er en konfigurationsfil, der kun gemmer 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-konfigurationerne, 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 om mappestrukturen i detaljer i manualen, jeg vil fortælle dig om de vigtigste:
board — en mappe med filer, der er specifikke for hvert bord. Disse kan være scripts til generering af systembilleder (iso, sdcart, cpio osv.), overlay-mappe, kernekonfiguration osv.
configs — selve defconfig af tavlen. Defconfig er en ufuldstændig kortkonfiguration. Den gemmer kun parametre, der adskiller sig fra standardindstillingerne.
dl — bibliotek med downloadede kildekoder/filer til samling
output/mål — det samlede filsystem for det modtagne OS. Senere oprettes billeder til download/installation af den.
output/vært — værtsværktøjer til montering
output/byg — indsamlede pakker
Konfiguration af samlingen udføres via KConfig. Det samme system bruges til at bygge Linux-kernen. Liste over oftest brugte kommandoer (kør i buildroot-mappen):
- make menuconfig — kald build-konfiguration. Det er også muligt at bruge den grafiske grænseflade (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig — start kernekonfiguration.
- gør rent — rens byggeresultaterne (alt gemt i output)
- lave — byg systemet. I dette tilfælde samles allerede samlede processer ikke igen.
- make defconfig_name — skift konfiguration til en specifik defconfig
- make list-defconfigs — vis liste over defconfigs
- lav kilde - download kun installationsfiler uden montering.
- lav hjælp — angiv 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 separat pakke med kommandoen lav pakkenavn-genopbygning. For eksempel kan du genopbygge Linux-kernen:
make linux-rebuildBuildroot 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 ; makeNyttige variabler
Buildroot har et sæt variabler for nem konfiguration.
- $TOPDIR — buildroot rodmappe
- $BASEDIR - OUTPUT bibliotek
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — vært fs, iscenesættelse fs, mål fs build mapper.
- $BUILD_DIR — mappe med udpakkede og indbyggede pakker
Visualisering
Buildroot har en visualiseringsfunktion. Du kan bygge et afhængighedsdiagram, en byggetidsgraf, en graf over størrelsen af pakker i det endelige system. Resultater i form af pdf-filer (du kan vælge svn, png) i output/graf-mappen.
Eksempler på visualiseringskommandoer:
make graph-dependsbygge et afhængighedstræmake <pkg>-graph-dependsbygge et afhængighedstræ af en specifik pakkeBR2_GRAPH_OUT=png make graph-buildplot byggetidsgraf med png-outputmake graph-sizeplot pakkestørrelse graf
Nyttige scripts
Der er en undermappe i buildroot-mappen utils med nyttige scripts. For eksempel er der et script, der kontrollerer rigtigheden af pakkebeskrivelsen. Dette kan være nyttigt, når du tilføjer dine egne pakker (det gør jeg senere). Filen utils/readme.txt indeholder en beskrivelse af disse scripts.
Lad os bygge en aktiefordeling
Det er vigtigt at huske, at alle handlinger udføres på vegne af en almindelig bruger, ikke root.
Alle kommandoer udføres i buildroden. Byggerodsleveringen indeholder allerede et sæt konfigurationer til mange almindelige boards og virtualisering.
Lad os se på listen over konfigurationer:

Skift til qemu_x86_64_defconfig config
make qemu_x86_64_defconfigOg vi starter byggeriet
makeMonteringen er gennemført med succes, lad os se på resultaterne:
![]()
Buildroot har bygget billeder, som du kan køre i Qemu for at se, om de virker.
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 din egen tavlekonfiguration
Tilføjelse af tavlefiler
Lad os se på listen over konfigurationer:

På listen ser vi pc_x86_64_efi_defconfig. Vi vil oprette 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 board-mappe til at gemme vores scripts, rootfs-overlay og andre nødvendige filer:
mkdir board/my_x86_boardSkift til denne defconfig:
make my_x86_board_defconfigSåledes matcher build-konfigurationen (gemt i .config i roden af buildroot-mappen) målet x86-64 legacy(bios) boot-maskinen.
Lad os kopiere linux-kerne-konfigurationen (det vil være nyttigt senere):
cp board/pc/linux.config board/my_x86_board/Opsætning 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 bygningen skal udføres for.

Byg muligheder - her kan du finde forskellige byggeindstillinger. 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 – det er her selve byggeværktøjskæden er konfigureret. Mere om ham.

Værktøjskædetype – den anvendte type værktøjskæde. Dette kan være en indbygget buildroot eller ekstern værktøjskæde (du kan angive en mappe med en allerede bygget eller en download-URL). Der er yderligere muligheder for forskellige arkitekturer. For eksempel kan du til arm 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. Typisk 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 kerneversion, der vil være i det system, der bygges. For kerneoverskrifter kan du også angive stien til et tarball- eller git-lager.
GCC COMPILER VERSIONS - vælg den compiler version, der skal bruges til build
Aktiver C++-understøttelse – vælg for 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 fil. En bruger bruger vil blive oprettet med adgangskode 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 userRoot-filsystem-overlejringsmapper - en mappe overlejret oven på de samlede target-fs. Tilføjer nye filer og erstatter eksisterende.
Brugerdefinerede scripts, der skal køres før oprettelse af filsystembilleder — Scripts, der udføres umiddelbart før filsystemet skjules til billeder. Vi lader selve scriptet være tomt indtil videre.
Lad os gå videre til Kernel-sektionen

Kernelindstillinger konfigureres her. Selve kernen konfigureres via make linux-menuconfig.
Du kan indstille kerneversionen på forskellige måder: vælg blandt de foreslåede, indtast versionen manuelt, angiv et lager eller en færdiglavet tarball.
Kernekonfiguration — stien til kernekonfigurationen. Du kan vælge standardkonfigurationen for den valgte arkitektur eller defocnfig fra LinuxI kildekoden Linux Der findes et sæt defconfigs til forskellige målsystemer. Du kan finde den, du har brug for. . For eksempel, for beagle bone sorte tavle kan du .
Sektionen Målpakker giver dig mulighed for at vælge, hvilke pakker der skal installeres på det indbyggede system. Lad os lade det være uændret indtil videre. Vi tilføjer vores pakker til denne liste senere.
Filsystembilleder - liste over filsystembilleder, der skal bygges. Lad os tilføje et iso-billede

Bootloadere - vælg bootloadere, der skal bygges. Lad os vælge isolinix

Konfiguration af Systemd
Systemd er ved at blive en af grundpillerne i Linux sammen med kerne og glibc. Det er derfor, jeg flyttede dens indstilling til en separat sektion.
Konfigureret via make menuconfig, derefter Target-pakker → Systemværktøjer → systemd. Her kan du angive, hvilke systemd-tjenester, der skal installeres og startes ved systemstart.

Gemmer systemkonfiguration
Vi gemmer denne opsætning via KConfig.
Derefter gemmer vi vores defconfig:
make savedefconfigKonfiguration af kernen Linux
Linux-kernekonfigurationen kaldes af følgende kommando:
make linux-menuconfigLad os tilføje understøttelse af Virtualbox-skærmkortet

Lad os tilføje Virtualbox Guest-integrationssupport

Gem og afslut. 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.configHvorefter vi vil udføre en komplet genmontering af hele systemet. Fordi buildroot ikke genopbygger det, der allerede er blevet bygget, så du skal manuelt angive de pakker, der skal genopbygges. For ikke at spilde tid og nerver er det lettere at genopbygge et lille system helt):
make clean;makeNår opbygningen er færdig, skal du starte VirtualBox (testet på version 5.2 og 6.0) og starte fra cd'en. Systemparametre:

Start fra den kompilerede iso:

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