Sissejuhatus
Selles artiklisarjas tahan ma käsitleda buildrooti koostamissüsteemi ja jagada oma kogemusi selle kohandamisel. Siin on praktiline kogemus väikese opsüsteemi loomisel, millel on graafiline liides ja minimaalne funktsionaalsus.
Esiteks, ärge segage koostamissüsteemi ja distributsiooni. Buildroot suudab koostada süsteemi komplektist pakettidest, mille ta on ette saanud. Buildroot põhineb make-failidel ja seetõttu on sellel tohutud kohandamisvõimalused. Vahetada pakett teise versiooni vastu, lisada oma pakett, muuta paketi koostamisreegleid, kohandada failisüsteemi pärast kõigi pakettide paigaldamist? Kõike seda oskab buildroot.
Venemaal kasutatakse buildrooti, kuid minu arvates on venekeelset teavet algajatele vähe.
Töö eesmärk on koostada distributsioon live-laadimisega, icewm-liidese ja brauseriga. Sihtplatvorm on virtualbox.
Miks luua oma jaotust? Sageli on vaja piiratud funktsionaalsust piiratud ressursside korral. Veelgi sagedamini tuleb automatiseerimisel luua püsivusi. Üldotstarbelise jaotuse kohandamine, eemaldades liigsed paketid ja muutes selle püsivuseks, on tunduvalt töömahukam kui uue jaotuse koostamine. Gentoo kasutamisel on samuti omad piirangud.
Buildroot on väga võimas süsteem, kuid ta ei tee teie eest midagi. Ta saab ainult pakkuda võimalusi ja automatiseerida koostamisprotsessi.
Alternatiivsed koostamissüsteemid (yocto, open build system jne) ei ole kaalumisel ega võrdlemisel.
Kust leida ja kuidas alustada
Projekti sait — . Siit saab alla laadida viimase versiooni ja lugeda juhendit. Seal saab ka pöörduda kogukonna poole, on vigade jälgimise süsteem, meililistid ja IRC-kanal.
Buildroot töötleb defconfig'e, mis on mõeldud sihtplaadi koostamiseks. Defconfig on konfiguratsioonifail, mis sisaldab ainult valikuid, millel pole vaikeväärtusi. Just tema määrab, mida ja kuidas koostatakse. Samas saab eraldi seadistada busyboxi, linux-kernelit, uglibc-d, laadijaid u-boot ja barebox, kuid kõik need on siiski seotud sihtplaadiga.
Laaditud arhiivi lahtipakkimisel või git'ist kloonimisel saame valmis buildroot'i. Kataloogistruktuuri kohta saab lugeda juhendist, räägin tähtsaimatest:
board — kataloog, kus asuvad iga plaadi jaoks spetsiifilised failid. Need võivad olla süsteemi piltide loomise skripid (iso, sdcart, cpio ja teised), overlay kataloog, kerneli konfiguratsioonid jne
configs — plaadi defconfig. Defconfig on plaadi mittetäielik konfiguratsioon. See sisaldab ainult erinevaid vaikeseadeid.
dl — kataloog, kus on allalaaditud lähtekoodid/failid koostamiseks
output/target — koostatud failisüsteem saadud operatsioonisüsteemist. Edasi luuakse sellest laadimis-/installimisfailid.
output/host — host-utilities koostamiseks
output/build — koostatud pakid
Kogumise konfigureerimine toimub läbi KConfig. Sama süsteemi kasutatakse Linuxi tuuma koostamiseks. Kõige sagedamini kasutatavate käskude loetelu (täitke kataloogis buildroot):
- make menuconfig — käivitada kogumise seade. Samuti võib kasutada graafilist liidest (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig — käivitada tuuma konfiguratsioon.
- make clean — puhastab koostamistulemused (kõik, mis on salvestatud output'isse)
- make — kogub süsteemi. Juhul kui juba kogutud protsesse ei kooskõlastata.
- make defconfig_name — lülitab konfiguratsiooni teatud defconfig'ile
- make list-defconfigs — kuvab defconfig'ide nimekirja
- make source — ainult allalaadib installifailid, ilma kogumiseta.
- make help — kuvab võimalikud käsud
Olulised märkused ja kasulikud nõuanded
Buildroot ei koosta juba kogutud pakette uuesti! Seetõttu võib tekkida olukord, kus on vajalik täielik ümberkoostamine.
Saate koguda eraldi paketti käsuga make packagename-rebuild. Näiteks, saate uuesti koguda linuxi kerneli:
make linux-rebuildBuildroot hoiab paketi seisundit luues .stamp-faile kataloogis output/build/$packagename:

Seetõttu saab uuesti koguda root-fs ja pildid ilma pakettide ümberkoostamiseta:
rm output/build/host-gcc-final-*/*.stamp_host_installed; rm -rf output/target; find output/ -name ".stamp_target_installed" | xargs rm -rf ; makeKasulikud muutujad
Buildrootis on komplekt muutujaid mugavaks konfigureerimiseks
- $TOPDIR — buildrooti juurkatalog
- $BASEDIR — OUTPUT kataloog
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — host fs, staging fs, target fs ehituskataloogid.
- $BUILD_DIR — kataloog lahtipakitud ja koostatud pakettidega
Visualiseerimine
Buildrootis on võimalus visualiseerimiseks. Saame koostada sõltuvuste skeemi, kogumise ajagraafiku ning paketisuuruste graafiku lõpp-süsteemis. Tulemused on saadaval PDF-failidena (valikuna on saadaval ka svn, png) kaustas output/graph.
Visualiseerimise näidiskäsud:
make graph-dependskoosta sõltuvuste puumake -graph-dependskoosta konkreetse paketi sõltuvuste puuBR2_GRAPH_OUT=png make graph-buildkoosta kogumise ajagraafik PNG-väljundigamake graph-sizekoosta paketisuuruste graafik
Kasulikud skriptid
Buildrooti kaustas on alamkaust utils kasulike skriptidega. Näiteks seal on skript, mis kontrollib pakettide kirjelduse õigsust. See võib olla kasulik oma pakettide lisamisel (teen seda hiljem). Failis utils/readme.txt on nende skriptide kirjeldus.
Koostame akadeemilise jaotuse
Oluline on meeles pidada, et kõik toimingud tehakse tavalise kasutajana, mitte rootina.
Kogu käsud täidetakse buildrooti juures. Buildrooti paketis on juba konfiguratsioonide komplekt paljude levinud plaadi ja virtualiseerimise jaoks.
Vaata konfiguratsioonide loendit:

Lülitame konfi qemu_x86_64_defconfig peale
make qemu_x86_64_defconfigJa käivitame kogumise
makeKogumine lõpetatakse edukalt, vaatame tulemusi:
![]()
Buildroot on loonud pildid, mida saab Qemu's käitada ja kontrollida nende toimimist.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -STulemus — Qemu's käivitatud süsteem:

Kohandatud plaadi konfiguratsiooni loomine
Plaadi failide lisamine
Vaata konfiguratsioonide loendit:

Nimekirjas näeme pc_x86_64_efi_defconfig'i. Loome oma plaadi, kopeerides selle konfiguratsiooni:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfigLoome kohe plaadi katalooge, et salvestada oma skripte, rootfs-overlay ja muid vajalikke faile:
mkdir board/my_x86_boardLülitame selle defconfig’i:
make my_x86_board_defconfigSeeläbi vastab nüüd kogumise konfiguratsioon (.config) sihtmasina x86-64 legacy (bios) käivitamisse.
Kopeerime Linuxi tuuma konfiguratsiooni (tulevikus tuleb kasuks):
cp board/pc/linux.config board/my_x86_board/Kogumise parameetrite seadistamine läbi KConfig
Käivitame seadistuse:
make menuconfig Avatakse KConfig aken. On võimalus konfigureerida graafilise kasutajaliidese kaudu (make nconfig, make xconfig, make gconfig):

Siseneme esimesse jaotisse Target Options. Siin saab valida sihtarhitektuuri, millele kogumine toimub.

Kogumise valikud — siin on erinevad kogumise seadistused. Saate määrata lähtekoodide kataloogid, kogumise lõime arvu, lähtekoodide allalaadimise peeglid ja muid seadistusi. Jätame vaikeväärtused.
Tööriistakomplekt – siin seadistatakse koostööriistade komplekt. Rohkem infot selle kohta.

Tööriistakomplekti tüüp – kasutatava tööriistakomplekti tüüp. See võib olla buildrooti sisse ehitatud või väline tööriistakomplekt (võite määrata juba koostatud katalooge või URL-i allalaadimiseks). Erinevate arhitektuuride jaoks on lisavalikud. Näiteks arm- jaoks saab lihtsalt valida Linaro välist tööriistakomplekti versiooni.
C raamatukogu – C raamatukogu valik. See mõjutab kogu süsteemi toimimist. Üldiselt kasutatakse glibc-d, mis toetab kogu võimalikku funktsionaalsust. Kuid see võib olla sisseehitatud süsteemi jaoks liiga suur, seega valitakse sageli uglibc või musl. Valime glibc (hiljem on see vajalik systemd kasutamiseks).
Kernel Headers ja Custom Kernel Headers series – peab olema sama versiooniga kui kernel, mis on kokkupanemiseks. Kernel headers jaoks saab samuti määrata tee tarballile või git-repositooriumile.
GCC KOMPILAATORI VERSIOONID – valige kompilaatori versioon, mida kasutatakse kokkupanekuks
Aktiveeri C++ tugi – valime kompileerimise, mis toetab C++ teeke süsteemis. Hiljem on sellest kasu.
Täiendavad gcc valikud – saab määrata täiendavaid kompilaatori valikuid. Hetkel ei ole need vajalikud.
Süsteemi konfiguratsioon võimaldab määrata tulevased loodud süsteemi parameetrid:

Enamik punkte on nimest arusaadavad. Pöörame tähelepanu järgmistele punktidele:
Kasutajate tabelite tee — tabel luuakse kasutajate jaoks ().
Faili näidis. Luua kasutaja user parooliga admin, automaatselt gid/uid, /bin/sh shell, vaikimisi grupiga user, rühma liikmena root, kommentaariga 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 failisüsteemi ülekande kataloogid — kataloog, mis asetatakse kogutud target-fs-i peale. Lisab uusi faile ja asendab olemasolevaid.
Kohandatud skriptid, mida käitada enne failisüsteemi piltide loomist — Skriptid, mis käivitatakse otse enne failisüsteemi paketis piltide loomist. Hoidke skript hetkel tühjana
Liigume Kernel jaotisse

Siin määratakse tuuma seaded. Ise tuuma konfigureeritakse läbi make linux-menuconfig.
Tuuma versiooni saab määrata mitmeti: valida pakutud seas, sisestada versioon käsitsi, näidata hoidlat või valmis tarballi.
Tuuma konfiguratsioon — tee tuumakonifiguraatorisse. Sa saad valida vaikimisi konfiguratsiooni valitud arhitektuuri jaoks või defconfig Linuxist. Linuxi lähtekoodis on erinevate sihstsüsteemide tarvis hulk defconfig'e. Vajalikku võib leida, Näiteks, Beagle Bone Black plaadi jaoks võib .
Sihtpakettide sektsioon võimaldab valida, millised paketid installitakse kokku pandud süsteemi. Praegu jätame selle muutmata. Hiljem lisame oma paketid sellesse loendisse.
Failisüsteemi pildid — failisüsteemi piltide nimekiri, mis koostatakse. Lisame iso-pildi.

Alglaadurid — valik kokku pandavaid alglaadijaid. Valime isolinixi.

Systemdi konfigureerimine.
Systemd muutub ühiselt Linuxi tugisambaks, koos kernel'i ja glibc'iga. Seetõttu on tema seadistamine eraldi punktis.
Seadistamine toimub läbi make menuconfig, seejärel Sihtpaketid → Süsteemitööriistad → systemd. Siin saab määrata, millised systemd teenused installitakse ja käivitatakse süsteemi käivitamisel.

Süsteemi konfiguratsiooni salvestamine.
Salvestame selle konfi KConfig kaudu.
Pärast seda salvestame meie defconfig:
make savedefconfigLinuxi tuuma konfigureerimine
Linuxi tuuma konfigureerimine toimub järgmise käsu kaudu:
make linux-menuconfigLisame Virtualboxi graafikakaardi toe

Lisame Virtualboxi külalisintegratsiooni toe

Salvestame ja väljumiseks. OLULINE: konfiguratsioon salvestatakse kausta output/build/linux-$version/config, kuid mitte kausta board/my_x86_board/linux.config

Seetõttu tuleb konfiguratsioon käsitsi kopeerida salvestamise kohta:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.configPärast seda teostame kogu süsteemi täieliku uuesti koostamise. Kuna buildroot ei koosta juba koostatud, tuleb käsitsi näidata pakette, mida uuesti koostama minna. Et aega ja närve mitte raisata, on väikest süsteemi lihtsam tervikuna uuesti koostada):
make clean;makeKoostamise lõppedes käivitame VirtualBoxi (olen testinud versioonidel 5.2 ja 6.0) ning laadime cd-diskilt. Süsteemi parameetrid:

Käivitamine koostatud iso-st:

Kasutatud materjalide nimekiri
- Buildrooti käsiraamat
Allikas: habr.com
