Hyrje
Në këtë seri artikujsh, do të shqyrtoj sistemin e ndërtimit të distribucionit Buildroot dhe do të ndaj përvojën time në personalizimin e tij. Këtu do të jetë një përvojë praktike për krijimin e një OS të vogël me ndërfaqe grafike dhe funksionalitet minimal.
Së pari, nuk duhet të ngatërrohet sistemi i ndërtimit me distribucionin. Buildroot mund të ndihmojë në ndërtimin e një sistemi nga një set paketash që i janë propozuar. Buildroot është ndërtuar mbi skedat make dhe për këtë arsye ka mundësi të mëdha për personalizim. Të zëvendësosh një paketë me një version tjetër, të shtosh paketën tuaj, të ndryshosh rregullat e ndërtimit të paketës, të personalizosh sistemin e skedarëve pas instalimit të të gjitha pakove? Të gjitha këto mundësi i ofron Buildroot.
Në Rusi, Buildroot përdoret, por në mendimin tim, ka pak informacion në gjuhën ruse për fillestarët.
Qëllimi i këtij projekti është të ndërtohet një distribucion me ngarkim të drejtpërdrejtë, ndërfaqe icewm dhe një shfletues. Platforma e synuar është VirtualBox.
Pse duhet të ndërtojmë distribucionin tonë? Shpesh, nevojitet një funksionalitet i kufizuar me burime të kufizuara. Edhe më shpesh, në automatizim, është e nevojshme të krijohen firmware. Të përshtatsh një distribucion të përgjithshëm, duke pastruar paketat e tepërta dhe duke e transformuar atë në firmware, është një rrugë më e lodhshme sesa të ndërtohet një distribucion i ri. Përdorimi i Gentoo gjithashtu ka kufizimet e tij.
Buildroot është një sistem shumë i fuqishëm, por ai nuk do të bëjë asgjë për ju. Ai mund vetëm të 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ë gjej dhe si të filloj
Faqja e projektit — . Këtu mund të shkarkoni versionin aktual dhe të lexoni manualin. Aty gjithashtu mund të kontaktoni me komunitetin, ka bug tracker, lista të postave dhe një kanal IRC.
Buildroot operon me defconfig për platinë e destinacionit të ndërtimit. Defconfig është një skedar konfigurimi, që përmban vetëm opsione pa vlera të paracaktuara. Ai përcakton se çfarë dhe si do të ndërtohet. Në të njëjtën kohë, mund të konfigurohen ndaras konfigurimet e busybox, linux-kernel, uClibc, bootloader-ave u-boot dhe barebox, por të gjitha do të jenë të lidhura me platinë e synuar.
Pas nxjerrjes së arkivës së shkarkuar ose klonimit nga git, marrim një Buildroot të gatshëm për përdorim. Mund të lexoni më shumë për strukturën e katalogëve në manual, do të përmend disa nga më të rëndësishmit:
board — katalogu me skedarët specifik për çdo bord. Këto mund të jenë skriptet për formimin e imazheve të sistemit (iso, sdcart, cpio etj.), katalogu overlay, konfigurimi i bërthamave dhe të tjera.
configs — specifikimi i defconfig të bordit. Defconfig — është një konfigurim i paplotë i bordit. Ajo përmban vetëm parametra që i përkasin cilësimeve ndryshe nga ato padrão.
dl — katalogu me kodet e rëna/ skedarë për ndërtim.
output/target — sistemi i skedarëve të ndërtuar të OS. Në vazhdim, prej saj krijohen imazhet për ngarkim/instalimin.
output/host — utilitarët e host për ndërtim.
output/build — paketat e ndërtuara.
Konfigurimi i ndërtimit realizohet përmes KConfig. Ky sistem përdoret gjithashtu për ndërtimin e bërthamës linux. Lista e komandave më të përdorura (shkruani në katalogun buildroot):
- make menuconfig — aktivizo konfigurimin e ndërtimit. Gjithashtu mund të përdorni ndërfaqen grafike (make nconfig, make xconfig, make gconfig).
- make linux-menuconfig — aktivizo konfigurimin e bërthamës.
- make clean — pastroni rezultatet e ndërtimit (gjithçka që ruhet në output).
- make — ndihmon ndërtimin e sistemit. Gjatë kësaj procedure, paketat e ndërtuara më parë nuk rindërtohen.
- make defconfig_name — kaloni në një defconfig të përcaktuar.
- make list-defconfigs — shfaqni listën e defconfig-eve.
- make source — shkarkoni vetëm skedarët instalues, pa ndërtim.
- make help — tregoni listën e komandave të mundshme.
Vërejtje dhe këshilla të rëndësishme.
Buildroot nuk rindërton paketat që janë ndërtuar më parë! Prandaj, mund të ndodhi situata ku kërkohet një rindërtim i plotë.
Është e mundur të rindërtohet një paketë të veçantë me komandën. make packagename-rebuild. Për shembull, mund të rindërtohet bërthama linux:
make linux-rebuild.Buildroot ruan gjendjen e çdo pakete duke krijuar skedarët .stamp në katalogun output/build/$packagename:

Prandaj, është e mundur të rindërtoni root-fs dhe imazhet pa rindërtimin e paketave:
rm output/build/host-gcc-final-*/.stamp_host_installed; rm -rf output/target; find output/ -name ".stamp_target_installed" | xargs rm -rf; make.Variablat e dobishme.
Në buildroot ka një grup variablash për konfigurimin e lehtë.
- $TOPDIR — katalogu kryesor buildroot.
- $BASEDIR — katalogu OUTPUT.
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — katalogët për ndërtimin e host fs, staging fs, target fs.
- $BUILD_DIR — katalogu me paketat e shpërndara dhe të ndërtuara.
Vizualizimi
Në buildroot ka mundësinë e vizualizimit. Mund të krijoni një diagram të varësive, një grafik të kohës së ndërtimit, një grafik të madhësisë së paketave në sistemin përfundimtar. Rezultatet janë në formë skedarësh pdf (përzgjedhje e svn, png) në katalogun output/graph.
Shembuj të komandave për vizualizim:
krijo graf-dependsndërto pemën e varësivekrijo <pkg>-graf-dependsndërto pemën e varësive për paketën e caktuarBR2_GRAPH_OUT=png krijo graf-buildndërto grafikun e kohës së ndërtimit me dalje në PNGkrijo graf-sizendërto grafikun e madhësisë së pakove
Skripte të dobishme
Në katalogun buildroot ka një podkatalg 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 më vonë). Në skedarin utils/readme.txt ka përshkrim të këtyre skripteve.
Do të ndërtojmë një distribucion bazë
Është e rëndësishme të kujtohet se të gjitha operacionet kryhen nga një përdorues i zakonshëm, jo root.
Të gjitha komandat ekzekutohen në rrënjën e buildroot. Në dorëzim buildroot tashmë ka një grup konfigurimesh për shumë karta të zakonshme dhe virtualizim.
Shikojmë listën e konfigurimeve:

Kalojmë në konfigurimin qemu_x86_64_defconfig
krijo qemu_x86_64_defconfigDhe fillojmë ndërtimin
makeNdërtimi mbaron me sukses, shikojmë rezultatet:
![]()
Buildroot nd Build images që mund të ekzekutohen në Qemu dhe të sigurohemi se ato funksionojnë.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -SRezultati — sistemi i ekzekutuar në qemu:

Krijimi i konfigurimit të kartës sime
Shtimi i skedave të kartës
Shikojmë listën e konfigurimeve:

Në listë shohim pc_x86_64_efi_defconfig. Ne do të krijojmë kartën tonë, duke e kopjuar atë nga konfigurimi:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfigMenjëherë do të krijojmë një katalog të kartës për ruajtjen e skripteve tona, rootfs-overlay dhe skedarëve të tjerë të nevojshëm:
mkdir board/my_x86_boardKalojmë në këtë defconfig:
krijo my_x86_board_defconfigKështu, tani konfigurimi i ndërtimit (ruhet në .config në rrënjën e katalogut buildroot) përputhet me makinën e synuar x86-64 legacy(bios) boot.
Do të kopjojmë konfigurimin linux-kernel (do të na nevojitet më vonë):
cp board/pc/linux.config board/my_x86_board/Konfigurimi i parametrave të ndërtimit përmes KConfig
Nisim konfigurimin:
krijo menuconfig Do të hapet një dritare KConfig. Ka mundësi të konfigurohet me një ndërfaqe grafike (krijo nconfig, krijo xconfig, krijo gconfig):

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

Opcione ndërtimi — këtu ka konfigurime të ndryshme të ndërtimit. Mund të përcaktoni katalogët me kodin burimor, numrin e proceseve të ndërtimit, pasqyrat për shkarkimin e kodeve burimore dhe konfigurime të tjera. Do t’i lëmë cilësimet siç janë.
Toolchain – këtu konfigurohet angazhimi i vetë ndërtimit. Më shumë për këtë më vonë.

Lloji i toolchain - lloji i toolchain-it të përdorur. Mund të jetë e integruar në buildroot ose një toolchain i jashtëm (mund të specifikoni katalogun me një toolchain të ndërtuar tashmë ose url për shkarkim). Për arkitekturë të ndryshme ka opsione të tjera. 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ë gjitha funksionalitetet e mundshme. Por ajo mund të jetë shumë e madhe për një sistem të integruar, kështu që shpesh zgjidhen uglibc ose musl. Ne do të zgjedhim glibc (kjo do të nevojitet për përdorimin e systemd).
Krenat e Kernelit dhe seritë e Krenave të Personalizuara - duhet të përputhen me versionin e kernelit që do të jetë në sistemin e ndërtuar. Për krenat e kernelit mund të specifikoni gjithashtu rrugën për tarball ose një repo git.
VERSIONET E KOMPILATORIT GCC - përzgjedhja e versionit të kompajlerit që do të përdoret për ndërtim.
Aktivizo mbështetje për C++ - do të zgjedhim për ndërtim me mbështetje për bibliotekat C++ në sistem. Kjo do të na nevojitet më pas.
Opsionet shtesë të gcc - mund të specifikoni opsione të tjera për kompajlerin. Në këtë moment nuk kemi nevojë për to.
Konfigurimi i sistemit lejon të përcaktoni parametrat e ardhshëm të sistemit të krijuar:

Shumica e pikave janë të qarta nga emri. Le të kushtojmë vëmendje për piketat e mëposhtme:
Rruga për tabelat e përdoruesve - tabela me përdoruesit e krijuar ().
Shembulli i skedarit. Do të krijohet një përdorues user me fjalëkalimin admin, automatikisht gid/uid, shelly /bin/sh, grupi default 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 mbështjelljes së sistemit të skedarëve të Root - 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ë skedarëve - Skripte, që ekzekutohen drejtpërdrejt para paketimit të sistemit të skedarëve në imazhe. Ne do ta lëmë skriptin aktualisht bosh.
Të kalojmë në seksionin Kernel

Këtu përcaktohen cilësimet e kernelit. Kerneli konfigurrohet përmes make linux-menuconfig.
Versioni i kernelit mund të përcaktohet në shumë mënyra: duke zgjedhur nga të ofruara, duke shkruar versionin manualisht, duke specifikuar një repo ose një tarball të gatshëm.
Konfigurimi i kernelit - rruga për config-un e kernelit. Mund të zgjidhni konfigurimin default për arkitekturën e zgjedhur ose defconfig nga Linux. Në burimet e Linux ka një grup defconfig’esh për sisteme të ndryshme të synuara. Mund të 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 e ndërtuar. Për momentin do ta lëmë pa ndryshime. Më vonë do të shtojmë paketat tona në këtë listë.
Imazhet e sistemit files – lista e imazheve të sistemeve të skedarëve që do të mblidhen. Do të shtojmë imazhin iso

Bootloaders – zgjedhja e bootloader-ëve që do të mblidhen. Do të zgjedhim isolinix

Konfigurimi i Systemd
Systemd bëhet një nga shtyllat e linux-it, përveç kernel dhe glibc. Prandaj e kam nxjerrë konfigurimin e tij në një pikë të veçantë.
Konfigurohet nëpërmjet make menuconfig, më pas Target packages → System tools → systemd. Këtu mund të specifikoni se cilat shërbime systemd do të instalohen dhe nisen kur të fillojë sistemi.

Ruajtja e konfiguracionit të sistemit
E ruajmë këtë konfigurim përmes KConfig.
Pas kësaj do ta ruajmë defconfig-in tonë:
make savedefconfigKonfigurimi i kernel-it Linux
Konfigurimi i kernel-it linux thirret me komandën e mëposhtme:
make linux-menuconfigDo të shtojmë mbështetje për kartën grafike Virtualbox

Do të shtojmë mbështetje për Virtualbox Guest integration

E 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 duhet ta kopjonim 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ë rindërtim të plotë të gjithë sistemit. Duke qenë se buildroot nuk rindërton atë që është ndërtuar tashmë, duhet specifikuar manualisht paketa për rindërtim. Për të mos humbur kohë dhe nerva, një sistem të vogël është më e lehtë ta rindërtoni tërësisht):
make clean; makePas përfundimit të ndërtimit, nisi VirtualBox (testuar në versionin 5.2 dhe 6.0) me ngarkesë nga cd-disk. Parametrat e sistemit:

Nisja nga iso e ndërtuar:

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