Hyrje
Në këtë seri artikujsh dua të shqyrtoj sistemin e ndërtimit të distribucionit buildroot dhe të ndaj përvojën time në personalizimin e tij. Këtu do të jetë përvoja praktike e krijimit të një sistemi të vogël operativ me ndërfaqe grafike dhe funksionalitet minimal.
Së pari, nuk duhet të ngatërrohet sistemi i ndërtimit me distribucionin. Buildroot mund të ndërtosh një sistem nga një grup paketash që i ofrohen. Buildroot është ndërtuar mbi skedarë make dhe për këtë arsye ka mundësi të mëdha për personalizim. A mund të zëvendësohet një paketë me një version tjetër, të shtohet një paketë e vet, të ndryshohen rregullat e ndërtimit të paketës, të personalizohet sistemi i skedarëve pas instalimit të të gjitha paketave? Buildroot e bën këtë.
Në Rusi buildroot përdoret, por sipas mendimit tim ka pak informacion në gjuhën ruse për fillestarët.
Qëllimi i punës është të ndërtohet një distribucion me ngarkesë live, ndërfaqe icewm dhe shfletues. Platforma e synuar është virtualbox.
Pse të krijoni shpërndarjen tuaj? Shpeshherë nevojitet një funksionalitet i kufizuar me burime të kufizuara. Edhe më shpesh, në automatizim, duhet të krijoni firmware. Të përshtatur shpërndarjet e qëllimit të përgjithshëm, duke hequr paketat e panevojshme dhe duke e kthyer atë në firmware është shumë më e lodhshme se sa të krijoni një shpërndarje të re. Përdorimi i Gentoo gjithashtu ka kufizime të veta.
Sistemi Buildroot është shumë i fuqishëm, por nuk do të bëjë asgjë për ju. Ai vetëm mund t'ju ofrojë mundësi dhe të automatizojë procesin e ndërtimit.
Sistemet alternative të ndërtimit (yocto, open build system dhe të tjera) nuk shqyrtohen dhe nuk krahasohen.
Ku të gjeni dhe si të filloni
Faqja e projektit â . KĂ«tu mund tĂ« shkarkoni versionin aktual dhe tĂ« lexoni udhĂ«zuesin. Aty mund tĂ« kontaktoni gjithashtu me komunitetin, ka njĂ« bug tracker, lista postash dhe njĂ« kanal irc.
Buildroot operon me defconfig për tabelën e synuar të ndërtimit. Defconfig është një skedar konfigurimi që ruan vetëm opsionet që nuk kanë vlera defaul. Ai përcakton atë që do të ndërtosh dhe si do të bëhet. Megjithatë, mund të konfigurohen veçmas konfigurimet e busybox, linux-kernel, uglibc, ngarkuesve u-boot dhe barebox, por të gjitha do të lidhen me tabelën e synuar.
Pas pastrimit të arkivit të shkarkuar ose klonimit nga git, ne marrim një buildroot gati për tu punuar. Për hollësi mbi strukturën e katalogëve, mund të lexoni në udhëzues, por do flas për më të rëndësishmet:
board â katalog me skedarĂ«t specifikĂ« pĂ«r çdo bord. KĂ«tu mund tĂ« jenĂ« skenarĂ«t pĂ«r krijimin e imazheve tĂ« sistemit (iso, sdcart, cpio dhe tĂ« tjera), katalogu overlay, konfigurimi i bĂ«rthamave dhe mĂ« shumĂ«.
configs â konfigurimi defconfig i bordit. Defconfig Ă«shtĂ« njĂ« konfigurim i paplotĂ« i bordit. NĂ« tĂ« ruhen vetĂ«m parametrat qĂ« ndryshojnĂ« nga rregullat e paracaktuara.
dl â katalog me kodet burimore/skedarĂ«t e shkarkuar pĂ«r ndĂ«rtim.
output/target â sistemi i dosjeve tĂ« ndĂ«rtuar pĂ«r OS-nĂ« e marrĂ«. MĂ« vonĂ«, prej saj krijohen imazhe pĂ«r ngarkim/instalim.
output/host â utilitare host pĂ«r ndĂ«rtim.
output/build â paketat e ndĂ«rtuara.
Konfigurimi i ndërtimit realizohet përmes KConfig. Kjo sistem përdoret gjithashtu për ndërtimin e bërthamës linux. Lista e komandave më shpesh të përdorura (duhet të ekzekutoni në katalogun buildroot):
- make menuconfig â thirrni konfigurimin e ndĂ«rtimit. Po ashtu mund tĂ« pĂ«rdorni ndĂ«rfaqen grafike (make nconfig, make xconfig, make gconfig).
- make linux-menuconfig â thirrni konfigurimin e bĂ«rthamĂ«s.
- make clean â pastroni rezultatet e ndĂ«rtimit (gjithçka qĂ« ruhet nĂ« output)
- make â ndĂ«rtoni sistemin. NĂ« kĂ«tĂ« rast nuk do tĂ« bĂ«het ri-ndĂ«rtimi i proceseve tĂ« ndĂ«rtuara tashmĂ«
- make defconfig_name â kaloni konfigurimin nĂ« njĂ« defconfig tĂ« caktuar
- make list-defconfigs â tregoni listĂ«n e defconfig-Ă«ve
- make source â shkarkoni vetĂ«m skedarĂ«t instalues, pa ndĂ«rtim.
- make help â nxirrni listĂ«n e komandave tĂ« mundshme
Shënime të rëndësishme dhe këshilla të dobishme
Buildroot nuk e rindërton paketat e ndërtuara tashmë! Prandaj mund të krijohet situata kur është e nevojshme një ri-ndërtim i plotë.
Mund të rindërtohet një paketë e veçantë me komandën make packagename-rebuild. Për shembull, mund të rindërtoni kernelin linux:
make linux-rebuildBuildroot ruan gjendjen e çdo pakete duke krijuar skedarë .stamp në katalogun output/build/$packagename:

Prandaj, mund të rindërtoni root-fs dhe imazhet pa ri-ndërtimin e paketeve:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; makeVariables të dobishme
Në buildroot ka një grup variablash për konfigurim më të lehtë
- $TOPDIR â katalogu rrĂ«njor i buildroot
- $BASEDIR â katalogu OUTPUT
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR â kataloget e ndĂ«rtimit tĂ« host fs, staging fs, target fs.
- $BUILD_DIR â katalogu me paketat e shpĂ«rndara dhe tĂ« ndĂ«rtuara
Vizualizimi
Në buildroot ka mundësi për vizualizim. Mund të ndërtohet një diagram varësish, një grafik i kohës së ndërtimit, një grafik i madhësisë së pakove në sistemin përfundimtar. Rezultatet janë në formën e skedarëve pdf (ka zgjedhje si svn, png) në katalogun output/graph.
Shembuj të komandave të vizualizimit:
make graph-dependsndërto pemën e varësivemake -graph-dependsndërto pemën e varësive për një paketë specifikeBR2_GRAPH_OUT=png make graph-buildndërto grafikun e kohës së ndërtimit me daljen në PNGmake graph-sizendërto grafikun e madhësisë së pakove
Skripte të dobishme
Në katalogun buildroot ka një nënkatalog utils me skripte të dobishme. Për shembull, aty ka një skript që kontrollon saktësinë e përshkrimit të pakove. Kjo mund të jetë e dobishme kur shtoni paketat tuaja (do ta bëj këtë më vonë). Në skedarin utils/readme.txt ka përshkrim të këtyre skripteve.
TĂ« mbledhim distribucionin standart
ĂshtĂ« e rĂ«ndĂ«sishme tĂ« pĂ«rmendet se tĂ« gjitha operacionet kryhen si njĂ« pĂ«rdorues i zakonshĂ«m, jo root.
Të gjitha komandat kryhen në rrënjën e buildroot. Në paketimin e buildroot tashmë ka një grup konfiguracionesh për shumë bordet e zakonshme dhe virtualizimin.
Shikojmë listën e konfigurimeve:

Kalim në konfigurimin qemu_x86_64_defconfig
make qemu_x86_64_defconfigDhe fillojmë ndërtimin
makeMontimi përfundon me sukses, le t'i shikojmë rezultatet:
![]()
Buildroot ka ndërtuar imazhet që mund të ekzekutohen në Qemu dhe të sigurohemi që ato funksionojnë.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -SRezultati â njĂ« sistem i nisur nĂ« qemu:

Krijimi i konfigurimit të bordit tuaj
Shtimi i skedarëve të bordit
Shikojmë listën e konfigurimeve:

Në listë shohim pc_x86_64_efi_defconfig. Ne do të krijojmë bordin tonë, duke e kopjuar atë nga konfigurimi:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfigMenjëherë do të krijojmë direktorinë e bordit për të ruajtur skenaret tanë, rootfs-overlay dhe skedarë të tjerë të nevojshëm:
mkdir board/my_x86_boardKalim në këtë defconfig:
make my_x86_board_defconfigKështu, tani konfigurimi i ndërtimit (ruhet në .config në rrënjën e katalogut buildroot) i përkasin makinës synuese x86-64 me ngarkesë legacy (bios).
Kopjojmë konfigurimin e linux-kernel (do të jetë i dobishëm më vonë):
cp board/pc/linux.config board/my_x86_board/Caktimi i parametrave të ndërtimit përmes KConfig
Nisim caktimin:
make menuconfig Do të hapet dritarja KConfig. Ka mundësi për të konfiguruar me ndërfaqe grafike (make nconfig, make xconfig, make gconfig):

Hyrni në seksionin e parë Target Options. Këtu mund të zgjidhni arkitekturën synuese për të cilën do të bëhet ndërtimi.

Opsionet e ndĂ«rtimit â kĂ«tu ka mundĂ«si tĂ« ndryshme pĂ«r konfigurimin e ndĂ«rtimit. Mund tĂ« tregoni kataloget me kodin burimor, numrin e proceseve tĂ« ndĂ«rtimit, pasqyrat pĂ«r shkarkimin e kodit burimor dhe cilĂ«sime tĂ« tjera. TĂ« lĂ«mĂ« cilĂ«simet si parametra tĂ« paracaktuar.
Toolchain â kĂ«tu konfigurohet vetĂ« instrumenti i ndĂ«rtimit. MĂ« shumĂ« rreth tij.

Lloji i toolchain â lloji i toolchain-it tĂ« pĂ«rdorur. Ky mund tĂ« jetĂ« i integruar nĂ« buildroot ose njĂ« toolchain tjetĂ«r (mund tĂ« tregoni katalogun me atĂ« tĂ« ndĂ«rtuar tashmĂ« ose url pĂ«r shkarkim). PĂ«r arkitektura tĂ« ndryshme ka mundĂ«si shtesĂ«. PĂ«r shembull, pĂ«r arm mund tĂ« zgjidhni thjesht versionin e toolchain-it tĂ« jashtĂ«m Linaro.
Biblioteka C â pĂ«rzgjedhja e bibliotekĂ«s C. Kjo ndikon nĂ« funksionimin e tĂ«rĂ« sistemit. Zakonisht pĂ«rdoret glibc, e cila mbĂ«shtet tĂ« gjithĂ« funksionalitetin e mundshĂ«m. Por kjo mund tĂ« jetĂ« shumĂ« e madhe pĂ«r njĂ« sistem tĂ« integruar, prandaj shpesh zgjidhen uglibc ose musl. Ne do tĂ« zgjedhim glibc (kjo do tĂ« nevojitet mĂ« vonĂ« pĂ«r pĂ«rdorimin e systemd).
Headerat Kernel dhe Seria e Headerave Kernel tĂ« Personalizuar â duhet tĂ« pĂ«rputhen me versionin e kernel-it, i cili do tĂ« jetĂ« nĂ« sistemin e ndĂ«rtuar. PĂ«r headerat kernel gjithashtu mund tĂ« tregoni rrugĂ«n pĂ«r tarball-in ose repozitorin git.
VERSIONET E KOMPILATORIT GCC â zgjidhni versionin e kompjuterit qĂ« do tĂ« pĂ«rdoret pĂ«r ndĂ«rtimin
Aktivizo mbĂ«shtetje C++ â pĂ«rzgjedhim ndĂ«rtimin me mbĂ«shtetje pĂ«r bibliotekat C++ nĂ« sistem. Kjo do tĂ« na ndihmojĂ« nĂ« tĂ« ardhmen.
Opsionet shtesĂ« gcc â mund tĂ« caktoni opsione tĂ« tjera pĂ«r kompilatorin. Nuk na duhen pĂ«r momentin.
Konfigurimi i sistemit lejon përcaktimin e parametrave të ardhshëm për sistemin e krijuar:

Shumica e pikave janë të qarta nga emri. Le të përqëndrohemi në pikat në vazhdim:
Rruga pĂ«r tabelat e pĂ«rdoruesve â tabela me pĂ«rdoruesit e krijuar ().
Shembulli i skedarit. Përdoruesi user do të krijohet me fjalëkalimin admin, automatikisht gid/uid, shelli /bin/sh, grupi në mënyrë parazgjedhëse user, anëtar i grupit root, komenti Foo user.
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo userDirektoritĂ« e mbulojĂ«s sĂ« sistemit rrĂ«njĂ« â katalogu, qĂ« mbulohet mbi target-fs tĂ« ndĂ«rtuar. Shton skedarĂ« tĂ« rinj dhe zĂ«vendĂ«son ato ekzistues.
Skripte tĂ« personalizuara pĂ«r t'u ekzekutuar para krijimit tĂ« imazheve tĂ« sistemit tĂ« files â Skripte qĂ« ekzekutohen menjĂ«herĂ« para se sistemi i files tĂ« paketohen nĂ« imazhe. Skripti pĂ«r momentin le ta lĂ«mĂ« bosh.
Të kalojmë në seksionin Kernel

Këtu përcaktohen cilësimet e kernelit. Kernel-i konfigurohet përmes make linux-menuconfig.
Versioni e bërjes e kernel-it mund të bëhet në disa mënyra: duke zgjedhur nga opsionet e ofruara, duke futur versionin manualisht, duke treguar repository-në ose një tarball të gatshëm.
Konfigurimi i kernel-it â rruga drejt konfigurimit tĂ« kernel-it. Mund tĂ« zgjidhni konfigurimin e parazgjedhur pĂ«r arkitekturĂ«n e zgjedhur ose defconfig nga Linux. NĂ« kodin burimor tĂ« Linux ka njĂ« bollĂ«k defconfig pĂ«r sisteme tĂ« ndryshme. Mund ta gjeni atĂ« qĂ« ju nevojitet, . PĂ«r shembull, pĂ«r bordin beagle bone black, mund tĂ« .
Sekcioni Target packages lejon të zgjidhni se cilat paketa do të instalohen në sistemin që do të ndërtohet. Për tani le ta lëmë pa ndryshime. Më vonë do të shtojmë paketat tona në këtë listë.
Imazhet e sistemit tĂ« skedarĂ«ve â lista e imazheve tĂ« sistemit tĂ« skedarĂ«ve qĂ« do tĂ« ndĂ«rtohen. Le tĂ« shtojmĂ« njĂ« imazh iso

Bootloaders â zgjedhja e boot-loader-ave qĂ« do tĂ« ndĂ«rtohen. Le tĂ« zgjedhim isolinix

Konfigurimi i Systemd
Systemd po bëhet një nga shtyllat e linux-it, shumë përkrah kernel-it dhe glibc. Prandaj, e kam nxjerrë konfigurimin e tij në një pikë të veçantë.
Konfigurohet pĂ«rmes make menuconfig, pastaj Target packages â System tools â systemd. KĂ«tu mund tĂ« tregoni se cilat shĂ«rbime systemd do tĂ« instalohen dhe startohen gjatĂ« nisjes sĂ« sistemit.

Ruajtja e konfigurimit të sistemit
E ruajmë këtë konfigurim përmes KConfig.
Pasi ta kemi bërë këtë, do ta ruajmë defconfig tonë:
make savedefconfigKonfigurimi i kernelit Linux
Konfigurimi i kernelit linux i thirret komandës së mëposhtme:
make linux-menuconfigShtojmë mbështetje për kartën grafike Virtualbox

Shtojmë mbështetje për integrimin e Virtualbox Guest

RuajmĂ« dhe dalim. E RĂNDĂSISHME: konfigurimi do tĂ« ruhet nĂ« output/build/linux-$version/config, por jo nĂ« board/my_x86_board/linux.config

Prandaj, ne duhet ta kopjojmë manualisht konfigurimin në vendin e ruajtjes:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.configPas kësaj, do të kryejmë një rikonstruim të plotë të sistemit. Pasi buildroot nuk e rindërton atë që është ndërtuar tashmë, duhet të tregojmë manualisht paketat për rindërtim. Për të mos humbur kohë dhe nerva, është më e lehtë të rindërtohet një sistem i vogël tërësisht):
make clean;makePasi të përfundojë ndërtimi, nisni VirtualBox (verifikuar në versionet 5.2 dhe 6.0) duke ngarkuar nga cd-disk. Parametrat e sistemit:

Nisja nga iso e ndërtuar:

Lista e materialeve të përdorura
- Manuali i Buildroot
Burimi: habr.com
