Úvod
V tejto sérii článkov sa chcem pozrieť na zostavovací systém distribúcie buildroot a podeliť sa o svoje skúsenosti s jeho prispôsobením. K dispozícii budú praktické skúsenosti s tvorbou malého OS s grafickým rozhraním a minimálnou funkčnosťou.
V prvom rade si nezamieňajte systém zostavovania s distribúciou. Buildroot dokáže zostaviť systém zo sady balíkov, ktoré sú mu ponúkané. Buildroot je postavený na makefiles, a preto má veľa možností prispôsobenia. Nahradiť balík inou verziou, pridať vlastný balík, zmeniť pravidlá zostavovania balíka, prispôsobiť súborový systém po nainštalovaní všetkých balíkov? To všetko môže zakoreniť.
V Rusku sa používa buildroot, ale podľa mňa je málo informácií v ruskom jazyku pre začiatočníkov.
Účelom práce je zostaviť distribučný kit s live downloadom, icewm rozhraním a prehliadačom. Cieľovou platformou je virtualbox.
Prečo si vybudovať vlastnú distribúciu? Často je potrebná obmedzená funkčnosť s obmedzenými zdrojmi. Ešte častejšie v automatizácii musíte vytvoriť firmvér. Prispôsobenie univerzálnej distribúcie vyčistením nepotrebných balíkov a ich premenou na firmvér je náročnejšie na prácu ako vytvorenie novej distribúcie. Používanie Gentoo má tiež svoje obmedzenia.
Systém Buildroot je veľmi výkonný, ale nič za vás neurobí. Môže iba povoliť a automatizovať proces montáže.
Alternatívne zostavovacie systémy (yocto, open build system a iné) sa nezohľadňujú ani neporovnávajú.
Kde ho získať a ako začať
Webová stránka projektu -
Buildroot prevádzkuje defconfigy pre cieľovú dosku zostavy. Defconfig je konfiguračný súbor, ktorý ukladá iba voľby, ktoré nemajú predvolené hodnoty. Je to on, kto určuje, čo sa bude zbierať a ako. V tomto prípade môžete samostatne nakonfigurovať konfigurácie bootloaderov busybox, linux-kernel, uglibc, u-boot a barebox, ale všetky budú viazané na cieľovú dosku.
Po rozbalení stiahnutého archívu alebo naklonovaní z git získame buildroot pripravený na použitie. Viac o štruktúre adresárov si môžete prečítať v príručke, poviem vám o tých najdôležitejších:
doska — adresár so súbormi špecifickými pre každú dosku. Môžu to byť skripty na vytváranie systémových obrazov (iso, sdcart, cpio a iné), prekryvný adresár, konfigurácia jadra atď.
configs - aktuálna defconfig dosky. Defconfig je neúplná konfigurácia dosky. Ukladá iba parametre iné ako predvolené nastavenia.
dl - adresár so stiahnutými zdrojovými kódmi / súbormi na zostavenie
výstup/cieľ — zostavený súborový systém výsledného OS. Následne sa z neho vytvoria obrázky na stiahnutie/inštaláciu
výstup/hostiteľ - hostiteľské nástroje na montáž
výstup/vybudovanie - zostavené balíky
Konfigurácia zostavy sa vykonáva cez KConfig. Rovnaký systém sa používa na zostavenie linuxového jadra. Zoznam najčastejšie používaných príkazov (spúšťajte v adresári buildroot):
- make menuconfig - zavolajte konfiguráciu zostavy. Môžete tiež použiť GUI (make nconfig,make xconfig,make gconfig)
- make linux-menuconfig - zavolajte konfiguráciu jadra.
- make clean - vyčistiť výsledky zostavenia (všetko uložené vo výstupe)
- make - build system. Tým sa neprestavujú už vytvorené procesy.
- make defconfig_name - prepnite konfiguráciu na konkrétny defconfig
- make list-defconfigs - zobrazí zoznam defconfigov
- make source - iba stiahnite inštalačné súbory, bez zostavovania.
- make help - zoznam možných príkazov
Dôležité poznámky a užitočné rady
Buildroot neprestavuje už vytvorené balíčky! Preto môže nastať situácia, keď je potrebná kompletná opätovná montáž.
Pomocou príkazu môžete prebudovať jeden balík make packagename-rebuild. Môžete napríklad prebudovať linuxové jadro:
make linux-rebuild
Buildroot ukladá stav akéhokoľvek balíka vytvorením súborov .stamp v adresári output/build/$packagename:
Preto je možné prebudovať root-fs a obrazy bez prestavby 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é
buildroot má sadu premenných pre jednoduchú konfiguráciu
- $TOPDIR - adresár buildroot
- $BASEDIR - OUTPUT adresár
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR - hostiteľské fs, prípravné fs, cieľové fs zostavovacie adresáre.
- $BUILD_DIR - adresár s rozbalenými a zostavenými balíkmi
Vizualizácia
buildroot má schopnosť vizualizácie. Môžete vytvoriť diagram závislosti, graf času zostavenia, graf veľkosti balíka v konečnom systéme. Výsledky ako súbory pdf (môžete si vybrať svn,png) v adresári output/graph.
Príklady príkazov na vykreslenie:
make graph-depends
vytvoriť strom závislostímake <pkg>-graph-depends
vytvoriť strom závislostí konkrétneho balíkaBR2_GRAPH_OUT=png make graph-build
vykresliť čas zostavenia s výstupom PNGmake graph-size
nakreslite veľkosť balíka
Užitočné skripty
Adresár buildroot má podadresár náradie s užitočnými skriptami. Existuje napríklad skript, ktorý kontroluje správnosť popisov balíkov. To môže byť užitočné pri pridávaní vlastných balíkov (urobím to neskôr). Súbor utils/readme.txt obsahuje popis týchto skriptov.
Vytvorme distribúciu akcií
Je dôležité pripomenúť, že všetky operácie sa vykonávajú v mene bežného používateľa, nie root.
Všetky príkazy sa vykonávajú v buildroot. Balík buildroot už obsahuje sadu konfigurácií pre mnohé bežné dosky a virtualizáciu.
Pozrime sa na zoznam konfigurácií:
Prepnite na konfiguráciu qemu_x86_64_defconfig
make qemu_x86_64_defconfig
A začnite stavať
make
Zostavenie je úspešne dokončené, pozrite sa na výsledky:
Buildroot dal dokopy obrázky, ktoré môžete spustiť v Qemu a zistiť, či fungujú.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Výsledkom je systém spustený v qemu:
Vytvorte si vlastnú konfiguráciu dosky
Pridávanie súborov dosky
Pozrime sa na zoznam konfigurácií:
V zozname vidíme pc_x86_64_efi_defconfig. Našu dosku vytvoríme skopírovaním z konfigurácie:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Okamžite si vytvoríme adresár dosky na uloženie našich skriptov, rootfs-overlay a ďalších potrebných súborov:
mkdir board/my_x86_board
Prepnite na tento defconfig:
make my_x86_board_defconfig
Teraz teda zostava konfigurácie (uložená v .config v koreňovom adresári buildroot) zodpovedá x86-64 legacy(bios) cieľovému bootovaciemu počítaču.
Skopírujte konfiguráciu linux-kernel (užitočné neskôr):
cp board/pc/linux.config board/my_x86_board/
Konfigurácia možností zostavenia cez KConfig
Začnime s nastavením:
make menuconfig
Otvorí sa okno KConfig. Je možné konfigurovať pomocou grafického rozhrania (make nconfig, make xconfig, make gconfig):
Vstupujeme do prvej sekcie Target Options. Tu môžete vybrať cieľovú architektúru, pre ktorú sa bude zostavovať.
Možnosti zostavenia – tu sú rôzne možnosti zostavenia. Môžete určiť adresáre so zdrojovými kódmi, počet vlákien zostavenia, zrkadlá na sťahovanie zdrojových kódov a ďalšie nastavenia. Nechajme predvolené nastavenia.
Toolchain – tu sa konfiguruje samotná súprava nástrojov na zostavovanie. Viac o ňom.
Toolchain type – typ použitého toolchainu. Toto môže byť zabudované do buildroot alebo externého toolchainu (môžete zadať adresár s už vytvoreným adresárom alebo url na stiahnutie). Existujú ďalšie možnosti pre rôzne architektúry. Napríklad pre rameno si môžete jednoducho vybrať verziu externého súboru nástrojov Linaro.
Knižnica C – výber knižnice C. Od toho závisí chod celého systému. Typicky sa používa glibc, ktorý podporuje všetky možné funkcie. Ale môže byť príliš veľký pre vstavaný systém, takže sa často volí uglibc alebo musl. Vyberieme glibc (toto bude neskôr potrebné na použitie systemd).
Séria hlavičiek jadra a vlastných hlavičiek jadra – sa musia zhodovať s verziou jadra, ktoré bude v zostavenom systéme. Pre hlavičky jadra môžete zadať aj cestu k úložisku tarball alebo git.
VERZIE PREkladača GCC - vyberte verziu kompilátora, ktorá sa použije na zostavenie
Povoliť podporu C++ – vyberte, či chcete zostaviť s podporou knižníc c++ v systéme. Budeme to potrebovať neskôr.
Ďalšie možnosti gcc – môžete nastaviť ďalšie možnosti kompilátora. Zatiaľ to nepotrebujeme.
Konfigurácia systému vám umožňuje nastaviť budúce parametre vytvoreného systému:
Väčšina bodov je jasná z názvu. Venujme pozornosť nasledujúcim bodom:
Cesta k tabuľkám používateľov - tabuľka s vytvorenými používateľmi (
Príklad súboru. Používateľ používateľ bude vytvorený s heslom admin, automaticky gid/uid, /bin/sh shell, predvolený používateľ skupiny, člen root skupiny, 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 user
Prekryvné adresáre koreňového súborového systému – adresár, ktorý je prekrytý nad skompilovaným target-fs. Pridáva nové súbory a nahrádza existujúce.
Vlastné skripty, ktoré sa majú spustiť pred vytvorením obrazov súborového systému Nechajte skript zatiaľ prázdny.
Poďme do sekcie Kernel
Tu sa nastavujú nastavenia jadra. Samotné jadro sa konfiguruje cez make linux-menuconfig.
Verziu jadra môžete nastaviť rôznymi spôsobmi: vyberte si z ponúkaných, zadajte verziu manuálne, zadajte úložisko alebo hotový tarball.
Konfigurácia jadra – cesta ku konfigurácii jadra. Môžete si vybrať predvolenú konfiguráciu pre zvolenú architektúru alebo defocnfig z Linuxu. Zdroje Linuxu majú sadu defconfigov pre rôzne cieľové systémy. Môžete nájsť ten, ktorý potrebujete
Časť Cieľové balíky vám umožňuje vybrať, ktoré balíky sa nainštalujú na zostavovaný systém. Nechajme to zatiaľ nezmenené. Naše balíčky pridáme do tohto zoznamu neskôr.
Obrazy súborového systému – zoznam obrazov súborových systémov, ktoré sa majú zostaviť. Pridajte obrázok iso
Bootloaders - výber zozbieraných bootloaderov. Vyberme si isolinix
Konfigurácia Systemd
Systemd sa stáva jedným z pilierov linuxu spolu s jadrom a glibc. Preto som jeho nastavenie vytiahol v samostatnom odseku.
Konfiguruje sa cez make menuconfig, potom Target packages → System tools → systemd. Tu môžete určiť, ktoré služby systemd sa nainštalujú a spustia pri spustení systému.
Ukladanie konfigurácie systému
Túto konfiguráciu uložíme cez KConfig.
Potom uložíme náš defconfig:
make savedefconfig
Konfigurácia jadra Linuxu
Konfigurácia jadra Linuxu sa vyvolá nasledujúcim príkazom:
make linux-menuconfig
Pridajte podporu pre grafickú kartu Virtualbox
Pridajme podporu integrácie Virtualbox Guest
Uložiť a ukončiť. DÔLEŽITÉ: konfigurácia sa uloží do output/build/linux-$version/config, ale nie do board/my_x86_board/linux.config
Preto musíte manuálne skopírovať konfiguráciu do umiestnenia úložiska:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
Potom vykonáme kompletnú opätovnú montáž celého systému. buildroot neprestavuje to, čo už bolo vytvorené, musíte manuálne zadať balíčky na prestavbu. Aby ste nestrácali čas a nervy, je jednoduchšie úplne prebudovať malý systém):
make clean;make
Po dokončení montáže spustíme VirtualBox (testované na verziách 5.2 a 6.0) s bootovaním z cd-disku Parametre systému:
Počnúc vytvoreným iso:
Zoznam použitých materiálov
- Buildroot manuál
Zdroj: hab.com