Introducere
În această serie de articole, vreau să mă uit la sistemul de construire a distribuției buildroot și să împărtășesc experiența mea în personalizarea acestuia. Va exista experiență practică în crearea unui sistem de operare mic, cu o interfață grafică și funcționalitate minimă.
În primul rând, nu trebuie să confundați sistemul de construcție și distribuția. Buildroot poate construi un sistem dintr-un set de pachete care îi sunt oferite. Buildroot este construit pe makefiles și, prin urmare, are capabilități enorme de personalizare. Înlocuiți un pachet cu o altă versiune, adăugați propriul pachet, modificați regulile pentru construirea unui pachet, personalizați sistemul de fișiere după instalarea tuturor pachetelor? buildroot poate face toate acestea.
În Rusia, se folosește buildroot, dar în opinia mea există puține informații în limba rusă pentru începători.
Scopul lucrării este asamblarea unui kit de distribuție cu descărcare live, interfață icewm și browser. Platforma țintă este virtualbox.
De ce să vă construiți propria distribuție? Adesea este nevoie de funcționalitate limitată cu resurse limitate. Chiar mai des în automatizare trebuie să creați firmware. Adaptarea unei distribuții de uz general prin curățarea pachetelor inutile și transformarea acesteia în firmware necesită mai multă muncă decât construirea unei noi distribuții. Utilizarea Gentoo are și limitările sale.
Sistemul Buildroot este foarte puternic, dar nu va face nimic pentru tine. Acesta poate activa și automatiza doar procesul de asamblare.
Sistemele alternative de construcție (yocto, open build system și altele) nu sunt luate în considerare sau comparate.
De unde să-l obțineți și cum să începeți
Site-ul proiectului -
Buildroot operează defconfigs pentru placa țintă a build-ului. Defconfig este un fișier de configurare care stochează numai opțiuni care nu au valori implicite. El este cel care stabilește ce va fi colectat și cum. În acest caz, puteți configura separat configurațiile busybox, linux-kernel, uglibc, u-boot și barebox, dar toate vor fi legate de placa țintă.
După despachetarea arhivei descărcate sau clonarea din git, obținem un buildroot gata de utilizat. Puteți citi mai multe despre structura directoarelor în manual; vă voi spune despre cele mai importante:
bord — un director cu fișiere specifice fiecărei plăci. Acestea pot fi scripturi pentru formarea imaginilor de sistem (iso, sdcart, cpio și altele), un director de suprapunere, configurație kernel etc.
configuri — defconfig reală a plăcii. Defconfig este o configurație incompletă a plăcii. Stochează doar parametrii care diferă de setările implicite
dl — director cu codurile/fișierele sursă descărcate pentru asamblare
ieșire/țintă — sistemul de fișiere asamblat al sistemului de operare rezultat. Ulterior, imaginile sunt create din acesta pentru descărcare/instalare
ieșire/gazdă - gazdă utilitare pentru asamblare
ieșire/construire - pachete asamblate
Ansamblul este configurat prin KConfig. Același sistem este folosit pentru a construi nucleul Linux. Lista celor mai frecvent utilizate comenzi (executate în directorul buildroot):
- make menuconfig - apelați configurația de construcție. De asemenea, puteți utiliza interfața grafică (make nconfig, make xconfig, make gconfig)
- make linux-menuconfig - apelați configurația kernelului.
- make clean - curățați rezultatele construcției (tot ce este stocat în ieșire)
- face - construi un sistem. Acest lucru nu reasambla procesele deja asamblate.
- make defconfig_name - comută configurația la o anumită defconfig
- make list-defconfigs - arată o listă de defconfigs
- make source - doar descărcați fișierele de instalare, fără a construi.
- make help - enumerați comenzile posibile
Note importante și sfaturi utile
Buildroot nu reconstruiește pachetele care au fost deja construite! Prin urmare, poate apărea o situație în care este necesară o reasamblare completă.
Puteți reconstrui un pachet separat cu comanda make packagename-rebuild. De exemplu, puteți reconstrui nucleul Linux:
make linux-rebuild
Buildroot stochează starea oricărui pachet prin crearea fișierelor .stamp în directorul output/build/$packagename:
Prin urmare, puteți reconstrui root-fs și imagini fără a reconstrui pachete:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make
Variabile utile
buildroot are un set de variabile pentru o configurare ușoară
- $TOPDIR - directorul buildroot
- $BASEDIR - directorul OUTPUT
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — gazdă fs, staging fs, țintă fs build directoare.
- $BUILD_DIR - director cu pachete dezambalate și construite
Vizualizare
buildroot are o caracteristică de vizualizare. Puteți construi o diagramă de dependență, un grafic al timpului de construire și un grafic al dimensiunilor pachetelor în sistemul final. Rezultatele sunt sub formă de fișiere pdf (puteți alege dintre svn, png) în directorul output/graph.
Exemple de comenzi de vizualizare:
make graph-depends
construiți un arbore de dependențămake <pkg>-graph-depends
construiți un arbore de dependență pentru un anumit pachetBR2_GRAPH_OUT=png make graph-build
trasați timpul de construire cu ieșire PNGmake graph-size
reprezentați dimensiunea pachetului
Scripturi utile
Există un subdirector în directorul buildroot utils cu scripturi utile. De exemplu, există un script care verifică corectitudinea descrierilor pachetelor. Acest lucru poate fi util atunci când adăugați propriile pachete (voi face asta mai târziu). Fișierul utils/readme.txt conține o descriere a acestor scripturi.
Să construim o distribuție de stoc
Este important să rețineți că toate operațiunile sunt efectuate în numele unui utilizator obișnuit, nu în numele root.
Toate comenzile sunt executate în buildroot. Pachetul buildroot include deja un set de configurații pentru multe plăci comune și virtualizare.
Să ne uităm la lista de configurații:
Comutați la configurația qemu_x86_64_defconfig
make qemu_x86_64_defconfig
Și începem asamblarea
make
Construirea se finalizează cu succes, uită-te la rezultate:
Buildroot a compilat imagini pe care le puteți rula în Qemu și verifica dacă funcționează.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
Rezultatul este un sistem care rulează în qemu:
Crearea propriei configurații de placă
Adăugarea fișierelor de bord
Să ne uităm la lista de configurații:
În listă vedem pc_x86_64_efi_defconfig. Ne vom crea propria placă prin copierea din configurație:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
Să creăm imediat un director de bord pentru a stoca scripturile noastre, rootfs-overlay și alte fișiere necesare:
mkdir board/my_x86_board
Comutați la această defconfig:
make my_x86_board_defconfig
Astfel, acum configurația build (stocat în .config în rădăcina directorului buildroot) corespunde mașinii țintă de pornire x86-64 legacy(bios).
Să copiem configurația linux-kernel (utilă mai târziu):
cp board/pc/linux.config board/my_x86_board/
Setarea parametrilor de compilare prin KConfig
Să începem configurarea:
make menuconfig
Se va deschide fereastra KConfig. Este posibil să se configureze cu o interfață grafică (make nconfig, make xconfig, make gconfig):
Intrăm în prima secțiune Opțiuni țintă. Aici puteți selecta arhitectura țintă pentru care va fi realizată construcția.
Opțiuni de construcție - există diferite setări de construcție aici. Puteți specifica directoare cu coduri sursă, numărul de fire de execuție, oglinzi pentru descărcarea codurilor sursă și alte setări. Să lăsăm setările implicite.
Toolchain – instrumentele de construcție în sine sunt configurate aici. Citiți mai multe despre el.
Tip de lanț de instrumente – tipul de lanț de instrumente utilizat. Acesta poate fi un lanț de instrumente încorporat în buildroot sau unul extern (puteți specifica directorul cu cel deja construit sau adresa URL pentru descărcare). Există opțiuni suplimentare pentru diferite arhitecturi. De exemplu, pentru arm puteți selecta pur și simplu versiunea Linaro a lanțului de instrumente extern.
Biblioteca C – selectarea bibliotecii C. Funcționarea întregului sistem depinde de aceasta. De obicei, se folosește glibc, care acceptă toate funcționalitățile posibile. Dar poate fi prea mare pentru un sistem încorporat, așa că uglibc sau musl sunt adesea alese. Vom selecta glibc (acest lucru va fi necesar mai târziu pentru a utiliza systemd).
Seria Antete kernel și Anteturi kernel personalizate – trebuie să se potrivească cu versiunea nucleului care va fi în sistemul asamblat. Pentru anteturile nucleului, puteți specifica și calea către depozitul tarball sau git.
GCC COMPILER VERSIONS – selectați versiunea compilatorului care va fi folosită pentru creare
Activați suportul C++ – selectați pentru a construi cu suport pentru bibliotecile C++ din sistem. Acest lucru ne va fi de folos în viitor.
Opțiuni suplimentare gcc – puteți seta opțiuni suplimentare pentru compilator. Nu avem nevoie de el deocamdată.
Configurarea sistemului vă permite să setați parametrii viitori ai sistemului creat:
Majoritatea punctelor sunt clare din titlu. Să acordăm atenție următoarelor puncte:
Calea către tabelele utilizatorilor - tabel cu utilizatorii de creat (
Fișier exemplu. Utilizatorul va fi creat cu parola admin, automat gid/uid, /bin/sh shell, utilizatorul implicit al grupului, root membru al grupului, comentariul utilizatorului Foo
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
Directoare de suprapunere a sistemului de fișiere rădăcină - director suprapus deasupra țintei-fs asamblate. Adaugă fișiere noi și le înlocuiește pe cele existente.
Scripturi personalizate de rulat înainte de a crea imagini ale sistemului de fișiere - Scripturi executate imediat înainte de a plia sistemul de fișiere în imagini. Să lăsăm scriptul gol deocamdată.
Să mergem la secțiunea Kernel
Setările kernelului sunt setate aici. Nucleul în sine este configurat prin make linux-menuconfig.
Puteți seta versiunea de kernel în diferite moduri: selectați dintre cele oferite, introduceți versiunea manual, specificați un depozit sau un tarball gata făcut.
Kernel configuration — calea către configurația kernelului. Puteți selecta configurația implicită pentru arhitectura selectată sau defocnfig din Linux. Sursa Linux conține un set de defconfigs pentru diferite sisteme țintă. Îl poți găsi pe cel de care ai nevoie
Secțiunea Pachete țintă vă permite să selectați ce pachete vor fi instalate pe sistemul în curs de construire. Să o lăsăm neschimbată deocamdată. Vom adăuga pachetele noastre la această listă mai târziu.
Imagini ale sistemului de fișiere - o listă de imagini ale sistemului de fișiere care vor fi colectate. Adăugați o imagine ISO
Bootloaders - selecție de bootloadere de colectat. Să alegem isolinix
Configurarea Systemd
Systemd devine unul dintre pilonii Linux, alături de kernel și glibc. Prin urmare, am mutat setarea pe un element separat.
Configurat prin make menuconfig, apoi Target packages → System tools → systemd. Aici puteți specifica ce servicii systemd vor fi instalate și pornite la pornirea sistemului.
Salvarea configurației sistemului
Salvăm această configurație prin KConfig.
Apoi salvați defconfig:
make savedefconfig
Configurarea kernelului Linux
Configurația nucleului Linux este invocată cu următoarea comandă:
make linux-menuconfig
Să adăugăm suport pentru placa video Virtualbox
Să adăugăm suport pentru integrarea Virtualbox Guest
Salvează și ieși. IMPORTANT: configurația va fi salvată în output/build/linux-$version/config, dar nu în board/my_x86_board/linux.config
Prin urmare, trebuie să copiați manual configurația într-o locație de stocare:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
După care vom efectua o reasamblare completă a întregului sistem. buildroot nu reconstruiește ceea ce a fost deja construit, trebuie să specificați manual pachetele pentru reconstrucție. Pentru a nu pierde timpul și nervii, este mai ușor să reconstruiți în întregime un mic sistem):
make clean;make
La finalizarea build-ului, lansați VirtualBox (testat pe versiunile 5.2 și 6.0) pornind de pe CD. Parametri de sistem:
Pornind de la ISO asamblat:
Lista materialelor folosite
- Buildroot manual
Sursa: www.habr.com