Úvod
V tejto sérii článkov chcem preskúmať systém zostavovania distribúcie buildroot a zdieľať skúsenosti s jeho prispôsobením. Tu bude praktická skúsenosť s vytvorením malej OS s grafickým rozhraním a minimalizovanou funkčnosťou.
Predovšetkým by sa nemal zamieňať systém zostavovania a distribúcia. Buildroot môže zostaviť systém z množiny balíkov, ktoré mu boli navrhnuté. Buildroot je postavený na make súboroch, a preto má obrovské možnosti prispôsobenia. Nahradiť balík inou verziou, pridať svoj balík, zmeniť pravidlá zostavenia balíka, prispôsobiť súborový systém po inštalácii všetkých balíkov? To všetko zvládne buildroot.
V Rusku sa buildroot používa, ale podľa môjho názoru je málo ruských informácií pre začiatočníkov.
Cieľom práce je zostaviť distribúciu s live bootovaním, rozhraním icewm a webovým prehliadačom. Cieľová platforma je virtualbox.
Prečo zostavovať svoju distribúciu? Často je potrebná obmedzená funkčnosť pri obmedzených zdrojoch. Ešte častejšie je v automatizácii potrebné vytvárať firmware. Prispôsobovať všeobecnú distribúciu tým, že sa vymažú zbytočné balíky a premení sa na firmware, je oveľa náročnejšie ako zostaviť novú distribúciu. Používanie Gentoo má tiež svoje obmedzenia.
Buildroot je veľmi mocný systém, ale neurobí nič za vás. Môže len poskytnúť možnosti a automatizovať proces zostavenia.
Alternatívne systémy zostavovania (yocto, open build system a ďalšie) sa neberú do úvahy a nesrovnávajú.
Kde získať a ako začať
Webová stránka projektu — . Tu si môžete stiahnuť aktuálnu verziu a prečítať si príručku. Tam môžete tiež osloviť komunitu, je tam bug tracker, mail-lists a IRC kanál.
Buildroot operuje s defconfig pre cieľovú dosku zostavenia. Defconfig je konfiguračný súbor, ktorý obsahuje iba možnosti, ktoré nemajú predvolené hodnoty. Práve on určuje, čo a ako bude zostavené. Môžete samostatne nastaviť konfigurácie busybox, linux-kernel, uglibc, bootloaderov u-boot a barebox, ale všetky budú viazané na cieľovú dosku.
Po rozbalení stiahnutého archívu alebo klonovaní z gitu získate buildroot pripravený na prácu. O štruktúre adresárov sa môžete podrobne dočítať v príručke, poviem o najdôležitejších:
board — adresár s súbormi špecifickými pre každý substrát. Môžu to byť skripty na generovanie systémových obrazov (iso, sdcart, cpio a ďalšie), adresár overlay, konfiguračné súbory jadier a ďalšie.
configs — vlastne defconfig substrátu. Defconfig je neúplná konfigurácia substrátu. Ukladá sa v ňom len parametre, ktoré sa líšia od predvolených nastavení.
dl — adresár so stiahnutými zdrojovými kódmi/súbormi na zostavenie.
output/target — zostavený súborový systém získanej OS. Následne sa z neho vytvárajú obrazy na bootovanie/inštaláciu.
output/host — host-nástroje na zostavenie.
output/build — zostavené balíky.
Konfigurácia zostavenia sa realizuje cez KConfig. Táto systém sa používa aj na zostavenie linux jadra. Zoznam najčastejšie používaných príkazov (vykonávajte v adresári buildroot):
- make menuconfig — vyvolať nastavenie zostavenia. Možno tiež použiť grafické rozhranie (make nconfig, make xconfig, make gconfig).
- make linux-menuconfig — vyvolať konfiguráciu jadra.
- make clean — vyčistiť výsledky zostavenia (všetko, čo sa nachádza v output).
- make — zostaviť systém. Predpokladá sa, že už zostavené procesy sa nebudú znovu zostavovať.
- make defconfig_name — prepínanie konfigurácie na konkrétny defconfig.
- make list-defconfigs — zobraziť zoznam defconfigov.
- make source — iba stiahnuť inštalačné súbory, bez zostavenia.
- make help — zobraziť zoznam dostupných príkazov.
Dôležité poznámky a užitočné rady.
Buildroot nezostavuje už zostavené balíky! Preto môže vzniknúť situácia, keď bude potrebná kompletná nová zostava.
Môžete znovu zostaviť konkrétny balík príkazom. make packagename-rebuild. Napríklad, môžete znovu zostaviť linux jadro:
make linux-rebuild.Buildroot uchováva stav každého balíka vytvorením .stamp-súborov v adresári output/build/$packagename:

Tým pádom je možné znovu zostaviť root-fs a obrazy bez nového zostavenia balíkov:
rm output/build/host-gcc-final-*/.stamp_host_installed; rm -rf output/target; find output/ -name ".stamp_target_installed" | xargs rm -rf; make.Užitočné premenné.
V buildroot existuje súbor premenných pre pohodlnú konfiguráciu.
- $TOPDIR — koreňový adresár buildroot.
- $BASEDIR — adresár OUTPUT.
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — adresáre na zostavenie host fs, staging fs, target fs.
- $BUILD_DIR — adresár s rozbalenými a zostavenými balíkmi.
Vizualizácia
V buildroot je možnosť vizualizácie. Môže sa vytvoriť schéma závislostí, graf času zostavenia, graf veľkosti balíkov v konečnom systéme. Výsledky vo forme pdf súborov (na výber sú svn, png) v adresári output/graph.
Príklady príkazov na vizualizáciu:
vyrobiť graph-dependsvytvoriť strom závislostívyrobiť -graph-dependsvytvoriť strom závislostí konkrétneho balíkaBR2_GRAPH_OUT=png vyrobiť graph-buildvytvoriť graf času zostavenia s výstupom do PNGvyrobiť graph-sizevytvoriť graf veľkosti balíkov
Užitočné skripty
V katalógu buildroot je podadresár utils s užitočnými skriptami. Napríklad, tam je skript, ktorý kontroluje správnosť popisu balíkov. Môže to byť užitočné pri pridávaní vlastných balíkov (to urobím neskôr). V súbore utils/readme.txt je popis týchto skriptov.
Zostavíme základný distribúciu
Je dôležité pripomenúť, že všetky operácie sa vykonávajú v mene obyčajného používateľa, nie root.
Všetky príkazy sa vykonávajú v koreňovom adresári buildroot. V dodávke buildroot už je sada konfigurácií pre mnohé rozšírené dosky a virtualizáciu.
Pozrieme sa na zoznam konfigurácií:

Prepneme sa na konfiguráciu qemu_x86_64_defconfig
vyrobiť qemu_x86_64_defconfigA spustíme zostavenie
makeZostavenie sa úspešne dokončilo, pozrime sa na výsledky:
![]()
Buildroot zostavil obrazy, ktoré je možné spustiť v Qemu a overiť, že fungujú.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -SVýsledok — spustený v qemu systém:

Vytvorenie konfigurácie vlastnej dosky
Pridanie súborov dosky
Pozrieme sa na zoznam konfigurácií:

V zozname vidíme pc_x86_64_efi_defconfig. Vytvoríme si svoju dosku tak, že ju skopírujeme z konfigurácie:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfigIhneď vytvoríme adresár dosky na uloženie svojich skriptov, rootfs-overlay a ďalších potrebných súborov:
mkdir board/my_x86_boardPrepneme sa na tento defconfig:
vyrobiť my_x86_board_defconfigTýmto spôsobom, konfigurácia zostavenia (uložená v .config v koreňovom adresári buildrootu) zodpovedá cieľovému stroju x86-64 legacy(bios) zavádzaniu.
Skopírujeme konfiguráciu linux-kernel (bude sa hodiť neskôr):
cp board/pc/linux.config board/my_x86_board/Nastavenie parametrov zostavenia prostredníctvom KConfig
Spustíme nastavenie:
vyrobiť menuconfig Otvorí sa okno KConfig. Je tu možnosť konfigurovať s grafickým rozhraním (vyrobiť nconfig, vyrobiť xconfig, vyrobiť gconfig):

Vstupujeme do prvej sekcie Target Options. Tu si môžete vybrať cieľovú architektúru, pre ktorú sa bude zostavovať.

Možnosti zostavenia — tu sú rôzne nastavenia zostavenia. Môžete uviesť adresáre s pôvodným kódom, počet vláken zostavenia, zrkadlá na sťahovanie pôvodných kódov a ďalšie nastavenia. Necháme nastavenia ako predvolené.
Nástrojový reťazec – tu sa nastavuje samotný nástrojový systém zostavenia. O ňom viac podrobností.

Typ nástroja - typ používaného toolchainu. Môže to byť zabudovaný do buildroot alebo externý toolchain (môžete zadať adresár s už zostaveným alebo url na stiahnutie). Pre rôzne architektúry sú k dispozícii ďalšie možnosti. Napríklad pre arm stačí vybrať verziu externého toolchainu Linaro.
C knižnica - výber C knižnice. Od toho závisí fungovanie celého systému. Zvyčajne sa používa glibc, ktorá podporuje všetku možnú funkcionalitu. Avšak môže byť príliš veľká pre zabudovaný systém, takže sa často vyberajú uglibc alebo musl. Vyberieme glibc (toto bude potrebné na použitie systemd).
Kernel Headers a Custom Kernel Headers series - musia zodpovedať verzii jadra, ktoré bude v zostavovanom systéme. Pre kernel headers môžete tiež zadať cestu k tarballu alebo git-repozitáru.
VERZIE GCC KOMPILÁTORA - výber verzie kompilátora, ktorá sa použije na zostavenie.
Povoliť podporu pre C++ - vyberieme pre zostavenie s podporou knižníc C++ v systéme. Neskôr nám to bude užitočné.
Dodatočné gcc možnosti - môžete zadať ďalšie možnosti kompilátora. Zatiaľ nám to nie je potrebné.
Konfigurácia systému umožňuje zadať budúce parametre vytvoreného systému:

Väčšina položiek je z názvu zrozumiteľná. Zamerajme sa na nasledujúce položky:
Cesta k tabuľkám používateľov - tabuľka s vytváranými používateľmi ().
Príklad súboru. Bude vytvorený používateľ user s heslom admin, automaticky gid/uid, /bin/sh ako shell, predvolená skupina user, člen skupiny root, komentár Foo user
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo userPrekryvné adresáre koreňového súborového systému - adresár, ktorý sa aplikuje na zostavený target-fs. Pridáva nové súbory a nahrádza existujúce.
Vlastné skripty na spustenie pred vytvorením obrazov súborového systému - Skripty, ktoré sa vykonávajú priamo pred zbalením súborového systému do obrazov. Tento skript zatiaľ necháme prázdny.
Prejdeme do časti Jadro

Tu sa nastavujú nastavenia jadra. Samotné jadro sa konfiguruje pomocou make linux-menuconfig.
Verziu jadra môžete zadať rôznymi spôsobmi: vybrať z ponúknutých, zadať verziu ručne, uviesť repozitár alebo hotový tarball.
Konfigurácia jadra - cesta k konfigurácii jadra. Môžete si vybrať predvolenú konfiguráciu pre vybranú architektúru alebo defconfig z Linuxu. V zdrojových kódoch Linuxu je sada defconfigov pre rôzne cieľové systémy. Potrebné nájdete, . Napríklad pre dosku beagle bone black môžete .
Sekcia Target packages umožňuje vybrať, ktoré balíky budú nainštalované do zostavovaného systému. Zatiaľ necháme bez zmien. Neskôr pridáme svoje balíky do tohto zoznamu.
Obrazy súborového systému — zoznam obrazov súborových systémov, ktoré budú zostavené. Pridáme iso-obraz

Bootloaders — výber zostavovaných zavádzačov. Vyberieme isolinux

Konfigurácia Systemd
Systemd sa stáva jedným z pilierov linuxu, spolu s kernelom a glibc. Preto som jeho nastavenie presunul do samostatnej sekcie.
Nastavuje sa prostredníctvom make menuconfig, ďalej Target packages → System tools → systemd. Tu je možné určiť, ktoré služby systemd budú nainštalované a spustené pri štarte systému.

Uloženie konfigurácie systému
Uložujeme túto konfiguráciu cez KConfig.
Potom uložíme náš defconfig:
make savedefconfigKonfigurácia jadra Linux
Konfigurácia jadra linux sa vyžaduje nasledujúcou príkazom:
make linux-menuconfigPridáme podporu grafickej karty Virtualbox

Pridáme podporu integrácie Virtualbox Guest

Uložíme a vyjdeme. DÔLEŽITÉ: konfigurácia sa uloží do output/build/linux-$version/config, ale nie do board/my_x86_board/linux.config

Preto je potrebné ručne skopírovať konfiguráciu na miesto uloženia:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.configPotom vykonáme úplnú znovu zostavenie celého systému. Keďže buildroot nezostavuje už zostavené, je potrebné ručne určiť balíky na znovu zostavenie. Aby sme nestrácali čas a nervy, je menej náročné zostaviť menší systém kompletne):
make clean; makePo dokončení zostavenia spustíme VirtualBox (testované na verziách 5.2 a 6.0) s bootovaním z cd-disku. Parametre systému:

Spustenie zo zostaveného iso:

Zoznam použitých materiálov
- Príručka Buildroot
Zdroj: habr.com
