Uvod
U ovoj seriji članaka želim pregledati sustav izgradnje buildroot distribucije i podijeliti svoje iskustvo u njegovoj prilagodbi. Postojat će praktično iskustvo u stvaranju malog OS-a s grafičkim sučeljem i minimalnom funkcionalnošću.
Prije svega, nemojte brkati sustav izgradnje s distribucijom. Buildroot može izgraditi sustav iz skupa paketa koji su mu ponuđeni. Buildroot je izgrađen na make datotekama i stoga ima puno mogućnosti prilagodbe. Zamijeniti paket drugom verzijom, dodati vlastiti paket, promijeniti pravila za izgradnju paketa, prilagoditi datotečni sustav nakon instaliranja svih paketa? Sve ovo može izgraditi korijen.
U Rusiji se koristi buildroot, ali po mom mišljenju ima malo informacija na ruskom jeziku za početnike.
Svrha rada je izgraditi distribucijski komplet sa live downloadom, icewm sučeljem i preglednikom. Ciljana platforma je virtualbox.
Zašto izgraditi vlastitu distribuciju? Često vam je potrebna ograničena funkcionalnost s ograničenim resursima. Češće u automatizaciji morate izraditi firmware. Prilagodba distribucije opće namjene čišćenjem suvišnih paketa i pretvaranjem u firmware je dugotrajniji način od sastavljanja nove distribucije. Korištenje Gentooa također ima svoja ograničenja.
Buildroot sustav je vrlo moćan, ali neće učiniti ništa za vas. Može samo omogućiti i automatizirati proces montaže.
Alternativni sustavi izrade (yocto, otvoreni sustav izrade itd.) se ne razmatraju niti uspoređuju.
Gdje nabaviti i kako započeti
Web stranica projekta -
Buildroot radi s defconfigs 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 što će se i kako prikupljati. U ovom slučaju, možete zasebno konfigurirati konfiguracije busyboxa, linux-kernela, uglibc, u-boot i barebox bootloadera, ali sve će one biti povezane s ciljnom pločom.
Nakon raspakiranja preuzete arhive ili kloniranja iz gita, dobivamo buildroot spreman za rad. Više o strukturi imenika možete pročitati u priručniku, a ja ću vam reći o najvažnijima:
odbor — direktorij s datotekama specifičnim za svaku ploču. To mogu biti skripte za slike sustava (iso, sdcart, cpio i druge), direktorij preklapanja, konfiguracija kernela itd.
Konfiguracije - stvarna defconfig ploče. Defconfig je nepotpuna konfiguracija ploče. Pohranjuje samo parametre osim zadanih postavki.
dl - direktorij s preuzetim izvornim kodovima / datotekama za montažu
izlaz/cilj - sastavljeni datotečni sustav primljenog OS-a. U budućnosti se iz njega stvaraju slike za preuzimanje / instalaciju
izlaz/domaćin - pomoćni programi domaćina za montažu
izlaz/izgradnja - sklopljeni paketi
Konfiguracija sklopa se vrši preko KConfig. Isti sustav se koristi za izgradnju Linux kernela. Popis najčešće korištenih naredbi (izvršite u buildroot direktoriju):
- make menuconfig - pozivanje konfiguracije izgradnje. Također možete koristiti GUI (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig - poziv konfiguracije jezgre.
- make clean - čisti rezultate izgradnje (sve što je pohranjeno u izlazu)
- napraviti - izgraditi sustav. Time se ne obnavljaju već izgrađeni procesi.
- make defconfig_name - prebaci konfiguraciju na određeni defconfig
- make list-defconfigs - prikaži popis defconfigs
- make source - preuzmite samo instalacijske datoteke, bez sklapanja.
- napraviti pomoć - prikazati popis mogućih naredbi
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 ponovno izgraditi jedan paket s naredbom napravi paketnaziv-rebuild. Na primjer, možete ponovno izgraditi jezgru linuxa:
make linux-rebuild
Buildroot pohranjuje stanje bilo kojeg paketa stvaranjem .stamp datoteka u direktoriju output/build/$packagename:
Stoga je moguće ponovno 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 za izgradnju
- $BASEDIR - IZLAZNI direktorij
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR - host fs, staging fs, target fs build direktoriji.
- $BUILD_DIR - direktorij s raspakiranim i izgrađenim paketima
Vizualizacija
buildroot ima mogućnost vizualizacije. Možete izgraditi dijagram ovisnosti, vremenski grafikon izgradnje, grafikon veličine paketa u konačnom sustavu. Rezultati kao pdf datoteke (možete birati između svn,png) u direktoriju output/graph.
Primjeri naredbi renderiranja:
make graph-depends
izgraditi stablo ovisnostimake <pkg>-graph-depends
izgraditi stablo ovisnosti određenog paketaBR2_GRAPH_OUT=png make graph-build
grafikon vremena izgradnje parcele s PNG izlazommake graph-size
iscrtajte veličinu paketa
Korisne skripte
Direktorij buildroot ima poddirektorij utils s korisnim skriptama. Na primjer, postoji skripta koja provjerava ispravnost opisa paketa. Ovo može biti korisno prilikom dodavanja prilagođenih paketa (učinit ću to kasnije). Datoteka utils/readme.txt sadrži opis ovih skripti.
Izgradimo distribuciju dionica
Važno je podsjetiti da se sve operacije izvode u ime običnog korisnika, a ne roota.
Sve naredbe se izvršavaju u buildroot-u. Distribucija buildroot već ima skup konfiguracija za mnoge uobičajene ploče i virtualizaciju.
Pogledajte popis konfiguracija:
Prebacite se na konfiguraciju qemu_x86_64_defconfig
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 Qemuu i vidjeti rade li.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Rezultat je sustav koji radi u qemu:
Napravite vlastitu konfiguraciju ploče
Dodavanje datoteka ploče
Pogledajte popis konfiguracija:
Na popisu vidimo pc_x86_64_efi_defconfig. Napravit ćemo našu ploču kopiranjem iz konfiguracije:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Odmah stvorite direktorij ploče za pohranjivanje naših skripti, rootfs-prekrivanja i drugih potrebnih datoteka:
mkdir board/my_x86_board
Prebacite se na ovu defconfig:
make my_x86_board_defconfig
Dakle, sada konfiguracija izgradnje (pohranjena u .config u korijenu buildroot direktorija) odgovara ciljnom stroju x86-64 legacy (bios) pokretanjem.
Kopirajte konfiguraciju linux kernela (korisno kasnije):
cp board/pc/linux.config board/my_x86_board/
Konfiguriranje opcija izgradnje preko KConfig
Započnimo postavljanje:
make menuconfig
Otvorit će se prozor KConfig. Moguće je konfigurirati pomoću grafičkog sučelja (make nconfig, make xconfig, make gconfig):
Ulazimo u prvi odjeljak Target Options. Ovdje možete odabrati ciljnu arhitekturu za koju će se izvršiti sklop.
Mogućnosti izrade - ovdje postoje različite mogućnosti izrade. Možete odrediti direktorije s izvornim kodovima, broj niti za izgradnju, zrcala za preuzimanje izvornih kodova i druge postavke. Ostavimo zadane postavke.
Toolchain - ovdje se konfigurira sam skup alata za izradu. Više o njemu.
Vrsta alatnog lanca - tip alatnog lanca koji se koristi. Ovo se može ugraditi u buildroot ili vanjski alatni lanac (možete odrediti direktorij s već izgrađenim ili url za preuzimanje). Postoje dodatne mogućnosti za različite arhitekture. Na primjer, za ruku možete jednostavno odabrati verziju vanjskog lanca alata Linaro.
C biblioteka - odabir biblioteke C. O tome ovisi rad cijelog sustava. Obično se koristi glibc koji podržava sve moguće funkcionalnosti. Ali može biti prevelik za ugrađeni sustav, pa se često bira uglibc ili musl. Odabrat ćemo glibc (ovo će biti potrebno kasnije za korištenje systemd).
Kernel Headers i Custom Kernel Headers serije - moraju odgovarati verziji kernela koja će biti u sustavu koji se gradi. Za zaglavlja kernela također možete navesti stazu do tarball-a ili git repozitorija.
GCC VERZIJE PREVODILACA - odaberite verziju prevoditelja koja će se koristiti za izgradnju
Omogući C++ podršku - odaberite izgradnju s podrškom za C++ biblioteke u sustavu. Ovo će nam trebati kasnije.
Dodatne gcc opcije - možete postaviti dodatne opcije kompilatora. Za sada nam ne treba.
Konfiguracija sustava omogućuje vam postavljanje budućih parametara stvorenog sustava:
Većina točaka je jasna iz naslova. Obratimo pozornost na sljedeće točke:
Put do tablica korisnika - tablica sa kreiranim korisnicima (
Primjer datoteke. Korisnik korisnik bit će kreiran s lozinkom admin, automatski gid/uid, /bin/sh shell, zadani 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
Preklopni direktoriji korijenskog datotečnog sustava - direktorij koji je prekriven povrh kompajliranog target-fs-a. Dodaje nove datoteke i zamjenjuje postojeće.
Prilagođene skripte za pokretanje prije stvaranja slika datotečnog sustava Za sada ostavite skriptu praznu.
Idemo u odjeljak Kernel
Ovdje se postavljaju postavke kernela. Sam kernel se konfigurira preko make linux-menuconfig.
Verziju kernela možete postaviti na različite načine: birati između ponuđenih, ručno unijeti verziju, odrediti repozitorij ili gotovu arhivu.
Konfiguracija jezgre - put do konfiguracije jezgre. Možete odabrati zadanu konfiguraciju za odabranu arhitekturu ili defocnfig iz Linuxa. Linux izvori imaju skup defconfigova za različite ciljne sustave. Možete pronaći onu koja vam je potrebna
Odjeljak Ciljni paketi omogućuje vam da odaberete koji će paketi biti instalirani na ciljni sustav. Ostavimo to za sada nepromijenjeno. Kasnije ćemo dodati naše pakete na ovaj popis.
Slike datotečnog sustava - popis slika datotečnog sustava koje treba izgraditi. Dodajte iso sliku
Bootloaderi - izbor prikupljenih bootloadera. Odaberite isolinix
Konfiguriranje Systemd
Systemd postaje jedan od stupova linuxa, zajedno s kernelom i glibc-om. Stoga sam njegovu postavku izdvojio u zasebnom paragrafu.
Konfigurira se preko make menuconfig, zatim Target packages → System tools → systemd. Ovdje možete odrediti koji će se systemd servisi instalirati i pokrenuti pri pokretanju sustava.
Spremanje konfiguracije sustava
Ovu konfiguraciju spremamo putem KConfiga.
Zatim spremamo naš defconfig:
make savedefconfig
Konfiguracija jezgre Linuxa
Konfiguracija jezgre linuxa poziva se sljedećom naredbom:
make linux-menuconfig
Dodajte podršku za Virtualbox video karticu
Dodajte podršku za integraciju Virtualbox Guest
Spremamo i izlazimo. VAŽNO: konfiguracija će biti spremljena u output/build/linux-$version/config, ali ne u board/my_x86_board/linux.config
Stoga trebate 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 sustava. buildroot ne obnavlja ono što je već izgrađeno, morate ručno specificirati pakete za obnovu. Kako ne biste gubili vrijeme i živce, lakše je ponovno izgraditi mali sustav u cjelini):
make clean;make
Po završetku montaže pokrećemo VirtualBox (testiran na verzijama 5.2 i 6.0) s boot-om s cd-diska Parametri sustava:
Počevši od izgrađenog iso-a:
Popis korištenih materijala
- Buildroot priručnik
Izvor: www.habr.com