Uvod
U ovoj seriji članaka želim da pregledam sistem izgradnje distribucije buildroot i podijelim svoje iskustvo u njegovom prilagođavanju. Biće praktičnog iskustva u kreiranju malog OS-a sa grafičkim interfejsom i minimalnom funkcionalnošću.
Prije svega, nemojte brkati sistem izgradnje sa distribucijom. Buildroot može izgraditi sistem iz skupa paketa koji su mu ponuđeni. Buildroot je izgrađen na make fajlovima i stoga ima mnogo opcija prilagođavanja. Zamijeniti paket drugom verzijom, dodati svoj paket, promijeniti pravila za pravljenje paketa, prilagoditi sistem datoteka nakon instaliranja svih paketa? Sve ovo može izgraditi root.
U Rusiji se koristi buildroot, ali po mom mišljenju ima malo informacija na ruskom jeziku za početnike.
Svrha rada je da se napravi distributivni komplet sa preuzimanjem uživo, icewm interfejsom i pretraživačem. Ciljna platforma je virtualbox.
Zašto izgraditi vlastitu distribuciju? Često vam je potrebna ograničena funkcionalnost sa ograničenim resursima. Češće u automatizaciji morate kreirati firmver. Prilagođavanje distribucije opće namjene čišćenjem suvišnih paketa i pretvaranjem u firmver je način koji oduzima više vremena od sastavljanja nove distribucije. Upotreba Gentooa takođe ima svoja ograničenja.
Buildroot sistem je veoma moćan, ali vam neće ništa učiniti. Može samo omogućiti i automatizirati proces montaže.
Alternativni sistemi izgradnje (yocto, open build system, itd.) se ne razmatraju niti upoređuju.
Gdje doći i kako početi
Web stranica projekta -
Buildroot radi sa defconfigama za ciljnu ploču za izgradnju. Defconfig je konfiguracijska datoteka koja sadrži samo opcije koje nemaju zadanu vrijednost. On je taj koji određuje šta i kako će biti prikupljeno. U ovom slučaju, možete zasebno konfigurirati konfiguracije busybox, linux-kernel, uglibc, u-boot i barebox bootloader-a, ali će sve one biti vezane za ciljnu ploču.
Nakon raspakivanja preuzete arhive ili kloniranja sa git-a, dobijamo buildroot spreman za rad. Više o strukturi direktorija možete pročitati u priručniku, a ja ću vam reći o najvažnijim:
odbor — direktorij sa datotekama specifičnim za svaku ploču. To mogu biti skripte za snimanje sistema (iso, sdcart, cpio i druge), direktorij za prekrivanje, konfiguracija kernela itd.
configs - stvarni defconfig ploče. Defconfig je nekompletna konfiguracija ploče. Pohranjuje samo parametre osim zadanih postavki.
dl - direktorij sa preuzetim izvornim kodovima / datotekama za sklapanje
izlaz/cilj - sastavljeni sistem datoteka primljenog OS-a. U budućnosti se iz njega kreiraju slike za preuzimanje / instalaciju
izlaz/host - host uslužni programi za sklapanje
output/build - sastavljena pakovanja
Konfiguracija montaže se vrši preko KConfig-a. Isti sistem se koristi za izgradnju linux kernela. Lista najčešće korišćenih naredbi (izvršite u buildroot direktoriju):
- make menuconfig - pozvati konfiguraciju izgradnje. Također možete koristiti GUI (napravi nconfig, napravi xconfig, napravi gconfig)
- make linux-menuconfig - pozvati konfiguraciju kernela.
- napravi čiste - čiste rezultate izgradnje (sve što je pohranjeno u izlazu)
- napravi - izgradi sistem. Ovo ne obnavlja već izgrađene procese.
- make defconfig_name - prebaciti konfiguraciju na određeni defconfig
- make list-defconfigs - prikaži listu defconfigs
- make source - preuzimajte samo instalacione datoteke, bez sklapanja.
- make help - prikaz liste mogućih komandi
Važne napomene i korisni savjeti
Buildroot ne obnavlja već izgrađene pakete! Stoga može doći do situacije kada je potrebna potpuna ponovna montaža.
Možete ponovo izgraditi jedan paket pomoću naredbe napravi naziv paketa-rebuild. Na primjer, možete ponovo izgraditi linux kernel:
make linux-rebuild
Buildroot pohranjuje stanje bilo kojeg paketa kreiranjem .stamp fajlova u direktoriju output/build/$packagename:
Stoga je moguće ponovo izgraditi root-fs i slike bez ponovne izgradnje paketa:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make
Korisne varijable
buildroot ima skup varijabli za jednostavnu konfiguraciju
- $TOPDIR - korijenski direktorij izgradnje
- $BASEDIR - IZLAZNI direktorij
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR - host fs, staging fs, ciljni fs build direktoriji.
- $BUILD_DIR - direktorij sa raspakovanim i izgrađenim paketima
Vizualizacija
buildroot ima mogućnost vizualizacije.Možete napraviti dijagram zavisnosti, graf vremena izgradnje, graf veličine paketa u konačnom sistemu. Rezultati kao pdf fajlovi (možete birati između svn,png) u izlaznom/grafskom direktorijumu.
Primjeri naredbi za renderiranje:
make graph-depends
izgraditi stablo zavisnostimake <pkg>-graph-depends
izgraditi stablo zavisnosti određenog paketaBR2_GRAPH_OUT=png make graph-build
iscrtati vremenski graf izgradnje sa PNG izlazommake graph-size
nacrtajte veličinu paketa
Korisne skripte
Buildroot direktorij ima poddirektorij komunalne usluge sa korisnim skriptama. Na primjer, postoji skripta koja provjerava ispravnost opisa paketa. Ovo može biti korisno prilikom dodavanja prilagođenih paketa (to ću učiniti kasnije). Datoteka utils/readme.txt ima opis ovih skripti.
Hajde da napravimo distribuciju zaliha
Važno je podsjetiti da se sve operacije izvode u ime redovnog korisnika, a ne u ime root-a.
Sve naredbe se izvršavaju u buildroot-u. Distribucija buildroot već ima skup konfiguracija za mnoge uobičajene ploče i virtuelizaciju.
Pogledajte listu konfiguracija:
Prebacite se na qemu_x86_64_defconfig konfiguraciju
make qemu_x86_64_defconfig
I započnite izgradnju
make
Izgradnja je uspješno završena, pogledajte rezultate:
Buildroot je sastavio slike koje možete pokrenuti u Qemu-u i vidjeti da li rade.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Rezultat je sistem koji radi u qemu:
Kreirajte vlastitu konfiguraciju ploče
Dodavanje fajlova na ploči
Pogledajte listu konfiguracija:
Na listi vidimo pc_x86_64_efi_defconfig. Napravit ćemo našu ploču kopirajući je iz konfiguracije:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Odmah kreirajte direktorij na ploči za pohranjivanje naših skripti, rootfs-overlay-a i drugih potrebnih datoteka:
mkdir board/my_x86_board
Prebacite se na ovu defconfifikaciju:
make my_x86_board_defconfig
Dakle, sada se konfiguracija izgradnje (pohranjena u .config u korijenu buildroot direktorija) podudara sa x86-64 naslijeđenom (bios) ciljnom mašinom pri pokretanju.
Kopirajte konfiguraciju linux kernela (korisno kasnije):
cp board/pc/linux.config board/my_x86_board/
Konfigurisanje opcija izgradnje putem KConfig
Započnimo postavljanje:
make menuconfig
Otvoriće se prozor KConfig. Moguće je konfigurirati pomoću grafičkog interfejsa (napraviti nconfig, napraviti xconfig, napraviti gconfig):
Ulazimo u prvi odjeljak Target Options. Ovdje možete odabrati ciljnu arhitekturu za koju će se sklopiti.
Opcije izgradnje - ovdje postoje različite opcije za izradu. Možete odrediti direktorije s izvornim kodovima, brojem niti izgradnje, ogledalima za preuzimanje izvornih kodova i drugim postavkama. Ostavimo zadane postavke.
Toolchain - ovdje je konfiguriran sam komplet alata za izgradnju. Više o njemu.
Tip lanca alata - tip lanca alata koji se koristi. Ovo može biti ugrađeno u buildroot ili eksterni lanac alata (možete odrediti direktorij s već izgrađenim ili url za preuzimanje). Postoje dodatne opcije za različite arhitekture. Na primjer, za ruku, možete jednostavno odabrati verziju vanjskog Linaro lanca alata.
C biblioteka - izbor biblioteke C. Od toga zavisi rad celog sistema. Obično se koristi glibc, koji podržava sve moguće funkcionalnosti. Ali može biti prevelik za ugrađeni sistem, pa se često biraju uglibc ili musl. Mi ćemo izabrati glibc (ovo će biti potrebno kasnije za korištenje systemd).
Zaglavlja jezgra i serija prilagođenih zaglavlja kernela - moraju odgovarati verziji kernela koja će biti u sistemu koji se gradi. Za zaglavlja kernela, također možete odrediti putanju do tarball-a ili git spremišta.
VERZIJE GCC COMPILER - izaberite verziju kompajlera koja će se koristiti za izgradnju
Omogući podršku za C++ - odaberite za izgradnju s podrškom za C++ biblioteke u sistemu. Ovo će nam trebati kasnije.
Dodatne gcc opcije - možete postaviti dodatne opcije kompajlera. Ne treba nam za sada.
Konfiguracija sistema vam omogućava da postavite buduće parametre kreiranog sistema:
Većina poenta je jasna iz naslova. Obratimo pažnju na sljedeće tačke:
Put do tabela korisnika - tabela sa kreiranim korisnicima (
Primjer datoteke. Korisnički korisnik će biti kreiran sa lozinkom admin, automatski gid/uid, /bin/sh shell, default korisnik grupe, član root grupe, komentar Foo korisnik
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
Root filesystem overlay direktoriji - direktorij koji je prekriven na vrhu prevedenog target-fs. Dodaje nove datoteke i zamjenjuje postojeće.
Prilagođene skripte za pokretanje prije kreiranja slika sistema datoteka Ostavite skriptu praznom za sada.
Idemo na odjeljak Kernel
Ovdje se postavljaju postavke kernela. Sam kernel se konfiguriše preko make linux-menuconfig.
Verziju kernela možete podesiti na različite načine: izaberite neku od ponuđenih, unesite verziju ručno, navedite spremište ili gotov tarball.
Konfiguracija kernela - put do konfiguracije kernela. Možete odabrati zadanu konfiguraciju za odabranu arhitekturu ili defocnfig iz Linuxa. Linux izvori imaju skup defconfigova za različite ciljne sisteme. Možete pronaći onaj koji vam je potreban
Odjeljak Ciljni paketi vam omogućava da odaberete koji će paketi biti instalirani na ciljnom sistemu. Ostavimo to za sada nepromijenjeno. Kasnije ćemo dodati naše pakete ovoj listi.
Slike sistema datoteka - Lista slika sistema datoteka koje treba izgraditi. Dodajte iso sliku
Bootloaderi - izbor prikupljenih pokretačkih programa. Odaberite isolinix
Konfiguriranje Systemd
Systemd postaje jedan od stubova linuxa, zajedno sa kernelom i glibc-om. Stoga sam njegovu postavku izdvojio u posebnom pasusu.
Konfiguriše se preko make menuconfig, zatim Target paketi → Sistemski alati → systemd. Ovdje možete odrediti koji će systemd servisi biti instalirani i pokrenuti pri pokretanju sistema.
Čuvanje konfiguracije sistema
Ovu konfiguraciju čuvamo preko KConfig.
Zatim spremamo našu defconfig:
make savedefconfig
Konfiguracija Linux kernela
Konfiguracija linux kernela se poziva sljedećom naredbom:
make linux-menuconfig
Dodajte podršku za Virtualbox video karticu
Dodajte podršku za integraciju Virtualbox Guest
Čuvamo i izlazimo. VAŽNO: konfiguracija će biti sačuvana u output/build/linux-$version/config, ali ne u board/my_x86_board/linux.config
Stoga morate ručno kopirati konfiguraciju na lokaciju za pohranu:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Nakon toga ćemo izvršiti kompletnu remontažu cijelog sistema. buildroot ne obnavlja ono što je već izgrađeno, morate ručno navesti pakete za ponovnu izgradnju. Da ne biste gubili vrijeme i živce, lakše je obnoviti mali sistem u cjelini):
make clean;make
Po završetku sklapanja pokrećemo VirtualBox (testiran na verzijama 5.2 i 6.0) sa dizanjem sa cd-diska. Sistemski parametri:
Počevši od izgrađenog iso-a:
Spisak korišćenih materijala
- Buildroot priručnik
izvor: www.habr.com