Predstavitev
V tej seriji člankov si želim ogledati gradbeni sistem distribucije buildroot in deliti svoje izkušnje pri njegovem prilagajanju. Praktične izkušnje bodo pri ustvarjanju majhnega OS z grafičnim vmesnikom in minimalno funkcionalnostjo.
Najprej ne smete zamenjevati sistema gradnje in distribucije. Buildroot lahko zgradi sistem iz niza paketov, ki so mu ponujeni. Buildroot je zgrajen na make datotekah in ima zato ogromno možnosti prilagajanja. Zamenjati paket z drugo različico, dodati svoj paket, spremeniti pravila za gradnjo paketa, prilagoditi datotečni sistem po namestitvi vseh paketov? buildroot zmore vse to.
V Rusiji se uporablja buildroot, vendar je po mojem mnenju malo informacij v ruskem jeziku za začetnike.
Cilj dela je sestaviti distribucijski komplet s prenosom v živo, vmesnikom icewm in brskalnikom. Ciljna platforma je virtualbox.
Zakaj zgraditi lastno distribucijo? Pogosto je potrebna omejena funkcionalnost z omejenimi viri. Še pogosteje pri avtomatizaciji morate ustvariti vdelano programsko opremo. Prilagajanje splošne distribucije s čiščenjem nepotrebnih paketov in spreminjanjem v vdelano programsko opremo je bolj delovno intenzivno kot izgradnja nove distribucije. Uporaba Gentooja ima tudi svoje omejitve.
Sistem Buildroot je zelo močan, vendar vam ne bo naredil ničesar. Omogoči in avtomatizira lahko le proces montaže.
Alternativni gradbeni sistemi (yocto, odprti sistem gradnje in drugi) niso upoštevani in primerjani.
Kje ga dobiti in kako začeti
Spletna stran projekta -
Buildroot upravlja defconfigs za ciljno ploščo gradnje. Defconfig je konfiguracijska datoteka, ki shranjuje samo možnosti, ki nimajo privzetih vrednosti. On je tisti, ki določa, kaj se bo zbiralo in kako. V tem primeru lahko ločeno konfigurirate konfiguracije zagonskih nalagalnikov busybox, linux-kernel, uglibc, u-boot in barebox, vendar bodo vsi povezani s ciljno ploščo.
Po razpakiranju prenesenega arhiva ali kloniranju iz gita dobimo za uporabo pripravljen buildroot. Več o strukturi imenika si lahko preberete v priročniku; povedal vam bom o najpomembnejših:
svet — imenik z datotekami, značilnimi za vsako ploščo. To so lahko skripti za oblikovanje sistemskih slik (iso, sdcart, cpio in drugi), prekrivni imenik, konfiguracija jedra itd.
konfiguracije — dejanska defconfig plošče. Defconfig je nepopolna konfiguracija plošče. Shranjuje samo parametre, ki se razlikujejo od privzetih nastavitev
dl — imenik s prenesenimi izvornimi kodami/datotekami za sestavljanje
izhod/cilj — sestavljen datotečni sistem nastalega OS. Nato se iz njega ustvarijo slike za prenos/namestitev
izhod/gostitelj - gostiteljski pripomočki za sestavljanje
izhod/gradnja - sestavljeni paketi
Sklop je konfiguriran prek KConfig. Isti sistem se uporablja za izdelavo jedra Linuxa. Seznam najpogosteje uporabljenih ukazov (izvedite v imeniku buildroot):
- make menuconfig - pokličite konfiguracijo gradnje. Uporabite lahko tudi grafični vmesnik (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig - pokličite konfiguracijo jedra.
- make clean - očisti rezultate gradnje (vse, kar je shranjeno v izhodu)
- narediti - zgraditi sistem. S tem se že sestavljeni procesi ne sestavijo znova.
- make defconfig_name - preklopite konfiguracijo na določeno defconfig
- make list-defconfigs - prikaži seznam defconfigs
- make source - samo prenesite namestitvene datoteke, brez gradnje.
- make help - seznam možnih ukazov
Pomembne opombe in koristni nasveti
Buildroot ne obnovi paketov, ki so že bili zgrajeni! Zato lahko pride do situacije, ko je potrebna popolna ponovna sestava.
Z ukazom lahko znova sestavite ločen paket make packagename-rebuild. Na primer, lahko obnovite jedro Linuxa:
make linux-rebuild
Buildroot shrani stanje katerega koli paketa tako, da ustvari datoteke .stamp v imeniku output/build/$packagename:
Zato lahko znova zgradite root-fs in slike brez ponovne gradnje paketov:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make
Uporabne spremenljivke
buildroot ima nabor spremenljivk za enostavno konfiguracijo
- $TOPDIR - imenik buildroot
- $BASEDIR - IZHODNI imenik
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — imeniki za gradnjo gostiteljskih fs, uprizoritvenih fs, ciljnih fs.
- $BUILD_DIR - imenik z nepakiranimi in zgrajenimi paketi
Vizualizacija
buildroot ima funkcijo vizualizacije.Lahko zgradite diagram odvisnosti, graf časa gradnje in graf velikosti paketov v končnem sistemu. Rezultati so v obliki datotek pdf (izbirate lahko med svn,png) v imeniku output/graph.
Primeri ukazov za vizualizacijo:
make graph-depends
zgradi drevo odvisnostimake <pkg>-graph-depends
zgraditi drevo odvisnosti za določen paketBR2_GRAPH_OUT=png make graph-build
čas izgradnje ploskve z izhodom PNGmake graph-size
velikost paketa
Uporabne skripte
V imeniku buildroot je podimenik pripomočki z uporabnimi skripti. Na primer, obstaja skripta, ki preverja pravilnost opisov paketov. To je lahko koristno pri dodajanju lastnih paketov (to bom naredil pozneje). Datoteka utils/readme.txt vsebuje opis teh skriptov.
Zgradimo distribucijo delnic
Pomembno si je zapomniti, da se vse operacije izvajajo v imenu običajnega uporabnika, ne root.
Vsi ukazi se izvajajo v buildroot. Paket buildroot že vključuje nabor konfiguracij za številne običajne plošče in virtualizacijo.
Poglejmo seznam konfiguracij:
Preklopite na konfiguracijo qemu_x86_64_defconfig
make qemu_x86_64_defconfig
In začnemo z montažo
make
Gradnja je uspešno končana, poglejte rezultate:
Buildroot je sestavil slike, ki jih lahko zaženete v Qemu in preverite, ali delujejo.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Rezultat je sistem, ki deluje v qemu:
Ustvarjanje lastne konfiguracije plošče
Dodajanje datotek plošče
Poglejmo seznam konfiguracij:
Na seznamu vidimo pc_x86_64_efi_defconfig. Svojo tablo bomo ustvarili tako, da jo kopiramo iz konfiguracije:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Takoj ustvarimo imenik plošče za shranjevanje naših skriptov, rootfs-overlay in drugih potrebnih datotek:
mkdir board/my_x86_board
Preklopite na to defconfig:
make my_x86_board_defconfig
Tako zdaj konfiguracija gradnje (shranjena v .config v korenu imenika buildroot) ustreza ciljnemu zagonskemu stroju x86-64 legacy (bios).
Kopirajmo konfiguracijo jedra linux (uporabno pozneje):
cp board/pc/linux.config board/my_x86_board/
Nastavitev gradbenih parametrov prek KConfig
Začnimo z namestitvijo:
make menuconfig
Odpre se okno KConfig. Možna je konfiguracija z grafičnim vmesnikom (make nconfig, make xconfig, make gconfig):
Vstopimo v prvi razdelek Ciljne možnosti. Tukaj lahko izberete ciljno arhitekturo, za katero bo izvedena gradnja.
Možnosti gradnje - tukaj so različne nastavitve gradnje. Določite lahko imenike z izvornimi kodami, število gradbenih niti, zrcala za prenos izvornih kod in druge nastavitve. Pustimo nastavitve privzete.
Toolchain – tukaj so konfigurirana sama orodja za gradnjo. Preberite več o njem.
Vrsta orodne verige – vrsta uporabljene orodne verige. To je lahko orodna veriga, vgrajena v buildroot, ali zunanja (lahko določite imenik z že zgrajenim ali url za prenos). Obstajajo dodatne možnosti za različne arhitekture. Na primer, za roko lahko preprosto izberete različico Linaro zunanje verige orodij.
Knjižnica C – izbira knjižnice C. Od tega je odvisno delovanje celotnega sistema. Običajno se uporablja glibc, ki podpira vse možne funkcionalnosti. Lahko pa je prevelik za vgrajen sistem, zato se pogosto izbereta uglibc ali musl. Izbrali bomo glibc (to bo potrebno pozneje za uporabo systemd).
Serije glav jedra in glave jedra po meri – se morajo ujemati z različico jedra, ki bo v sestavljenem sistemu. Za glave jedra lahko podate tudi pot do repozitorija tarball ali git.
RAZLIČICE PREVAJALNIKA GCC – izberite različico prevajalnika, ki bo uporabljena za gradnjo
Omogoči podporo za C++ – izberite gradnjo s podporo za knjižnice C++ v sistemu. To nam bo koristilo v prihodnosti.
Dodatne možnosti gcc – nastavite lahko dodatne možnosti prevajalnika. Zaenkrat ga ne potrebujemo.
Konfiguracija sistema vam omogoča nastavitev prihodnjih parametrov ustvarjenega sistema:
Večina točk je razvidnih iz naslova. Bodimo pozorni na naslednje točke:
Pot do tabel uporabnikov - tabela z uporabniki, ki jih je treba ustvariti (
Primer datoteke. Uporabniški uporabnik bo ustvarjen z geslom admin, samodejno gid/uid, /bin/sh shell, privzeti uporabnik skupine, član skupine root, komentar Foo uporabnik
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
Prekrivni imeniki korenskega datotečnega sistema - imenik prekrit na vrhu sestavljenih ciljnih fs. Dodaja nove datoteke in zamenja obstoječe.
Skripti po meri za zagon pred ustvarjanjem slik datotečnega sistema - skripti, ki se izvedejo tik pred zlaganjem datotečnega sistema v slike. Pustimo skript zaenkrat prazen.
Pojdimo na razdelek Kernel
Tu se nastavijo nastavitve jedra. Samo jedro je konfigurirano prek make linux-menuconfig.
Različico jedra lahko nastavite na različne načine: izberite med ponujenimi, ročno vnesite različico, določite repozitorij ali že pripravljen arhiv.
Konfiguracija jedra — pot do konfiguracije jedra. Izberete lahko privzeto konfiguracijo za izbrano arhitekturo ali defocnfig iz Linuxa. Vir Linuxa vsebuje nabor defconfigs za različne ciljne sisteme. Lahko najdete tistega, ki ga potrebujete
Razdelek Ciljni paketi vam omogoča, da izberete, kateri paketi bodo nameščeni v sistemu, ki se gradi. Pustimo zaenkrat nespremenjeno. Svoje pakete bomo na ta seznam dodali pozneje.
Slike datotečnega sistema - seznam slik datotečnega sistema, ki bodo zbrane. Dodajte iso sliko
Zagonski nalagalniki - izbor zagonskih nalagalnikov za zbiranje. Izberimo izoliniks
Konfiguriranje Systemd
Systemd postaja eden od stebrov Linuxa, skupaj z jedrom in glibc. Zato sem njegovo nastavitev premaknil v ločen element.
Konfigurirano prek make menuconfig, nato Target packages → System tools → systemd. Tukaj lahko določite, katere sistemske storitve bodo nameščene in zagnane ob zagonu sistema.
Shranjevanje sistemske konfiguracije
To konfiguracijo shranimo prek KConfig.
Nato shranite našo defconfig:
make savedefconfig
Konfiguracija jedra Linuxa
Konfiguracija jedra Linuxa se prikliče z naslednjim ukazom:
make linux-menuconfig
Dodajmo podporo za video kartico Virtualbox
Dodajmo podporo za integracijo Virtualbox Guest
Shrani in zapusti. POMEMBNO: konfiguracija bo shranjena v output/build/linux-$version/config, ne pa v board/my_x86_board/linux.config
Zato morate ročno kopirati konfiguracijo na lokacijo za shranjevanje:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Po tem bomo izvedli popolno ponovno montažo celotnega sistema. buildroot ne obnovi že zgrajenega, morate ročno določiti pakete za ponovno gradnjo. Da ne bi izgubljali časa in živcev, je lažje v celoti obnoviti majhen sistem):
make clean;make
Po končani gradnji zaženite VirtualBox (preizkušeno na različicah 5.2 in 6.0), ki se zažene s CD-ja.
Zagon iz sestavljenega iso:
Seznam uporabljenih materialov
- Priročnik za Buildroot
Vir: www.habr.com