Bevezetés
Ebben a cikk sorozatban a buildroot disztribúció összeállítórendszert szeretném megvizsgálni, és elmondani a testreszabás tapasztalataimat. Itt gyakorlati tapasztalatokat osztok meg egy kis grafikus felülettel és minimális funkcióval rendelkező operációs rendszer létrehozásáról.
Először is, nem szabad összekeverni az összeállítórendszert és a disztribúciót. A Buildroot egy csomagokból álló rendszert képes összeállítani, amelyeket javasoltak neki. A Buildroot make fájlokon alapul, ezért hatalmas testreszabási lehetőségekkel rendelkezik. Csomag verziójának lecserélése, saját csomag hozzáadása, csomag összeállítási szabályainak módosítása, fájlrendszer testreszabása az összes csomag telepítése után? A Buildroot mindezt tudja.
Oroszországban a buildroot használatban van, de véleményem szerint kevés orosz nyelvű információ áll rendelkezésre a kezdők számára.
A munka célja — egy live boot disztribúció összeállítása, icewm felülettel és böngészővel. A célplatform — virtualbox.
Miért van szükség saját disztribúció összeállítására? Gyakran korlátozott funkciókra van szükség korlátozott erőforrások mellett. Még gyakrabban az automatizálás során kell firmware-t létrehozni. A disztribúciók, amelyek általános célra készültek, tisztítása a felesleges csomagoktól és a firmware-be való átalakítás sokkal időigényesebb, mint új disztribúciót készíteni. A Gentoo használatának is vannak korlátai.
A Buildroot egy nagyon erőteljes rendszer, de semmit sem tesz meg helyetted. Csak lehetőségeket ad és automatizálja az összeállítási folyamatot.
Alternatív összeállítórendszerek (yocto, open build system és mások) nem kerülnek figyelembe és nem hasonlítanak össze.
Hol található és hogyan kezdjük el
A projekt weboldala — . Itt letöltheted a legfrissebb verziót és elolvashatod a kézikönyvet. Ott a közösséghez is fordulhatsz, van hibakövető, levelezési lista és IRC csatorna.
A Buildroot a célhardverhez tartozó defconfig fájlokkal működik. A Defconfig egy konfigurációs fájl, amely csak az alapértelmezett értékekkel nem rendelkező opciókat tartalmazza. Ez határozza meg, hogy mi és hogyan lesz összeállítva. Emellett külön beállíthatod a busybox, linux-kernel, uClibc, u-boot és barebox konfigurációkat, de mind ezek a célhardverhez lesznek kötve.
A letöltött archívum kicsomagolása vagy a gitből való klónozás után egy működésre kész buildroot-ot kapunk. A mappa struktúrájáról részletesen a kézikönyvben lehet olvasni, most a legfontosabbakról beszélek:
board — fájlok katalógusa, amely minden lemezhez specifikus. Ezek lehetnek a rendszer képek (iso, sdcart, cpio stb.) elkészítési szkriptjei, overlay katalógus, kernel konfigurációk és egyebek.
configs — a lemez alapdefiníciója. Az alapdefiníció nem teljes lemezkonfiguráció. Csak a gyári beállításokhoz képest eltérő paramétereket tárol.
dl — letöltött forráskódok/fájlok katalógusa a fordításhoz.
output/target — a kapott operációs rendszer fájlrendszere. Ebből később képek készülnek a telepítéshez/indításhoz.
output/host — host segédprogramok a fordításhoz.
output/build — elkészített csomagok.
A fordítás konfigurációja a KConfig segítségével történik. Ugyanez a rendszer használatos a Linux kernel fordításához. A leggyakrabban használt parancsok listája (a buildroot könyvtárban kell végrehajtani):
- make menuconfig — a fordítási beállítások hívása. Grafikus felhasználói felülettel is lehetséges (make nconfig, make xconfig, make gconfig).
- make linux-menuconfig — a kernel konfigurációjának hívása.
- make clean — törölni az összes fordítási eredményt (minden, ami az output mappában található).
- make — a rendszer összeszerelése. Ez nem vonja maga után az már elkészített folyamatok újrafordítását.
- make defconfig_name — a konfiguráció átváltása egy adott defconfig-ra.
- make list-defconfigs — a defconfig-ok listájának megjelenítése.
- make source — csak letölteni az installációs fájlokat, fordítás nélkül.
- make help — a lehetséges parancsok listája.
Fontos megjegyzések és hasznos tippek.
A Buildroot nem fordítja újra a már elkészített csomagokat! Ezért kialakulhat olyan helyzet, amikor teljes újrafordításra van szükség.
Egy adott csomag újrafordítása a következő parancs segítségével történhet: make packagename-rebuild. Például, újrafordíthatjuk a Linux kernelt:
make linux-rebuildA Buildroot a csomagok állapotát a .stamp fájlok létrehozásával tárolja az output/build/$packagename könyvtárban:

Következésképpen a root-fs és a képek újrafordítása anélkül történhet, hogy a csomagokat újra kellene fordítani:
rm output/build/host-gcc-final-* / .stamp_host_installed; rm -rf output/target; find output/ -name ".stamp_target_installed" | xargs rm -rf; makeHasznos változók.
A Buildrootban egy sor változó áll rendelkezésre a kényelmes konfiguráláshoz.
- $TOPDIR — a Buildroot gyökérkönyvtára.
- $BASEDIR — az OUTPUT könyvtár.
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR — a host fs, staging fs, target fs fordítási könyvtárai.
- $BUILD_DIR — a kibővített és fordított csomagok könyvtára.
Vizualizáció.
A Buildroot lehetőséget biztosít vizualizációra. Felépíthető a függőségek diagramja, a fordítási idő grafikája, a csomagok méretének grafikája a végső rendszerben. Az eredmények pdf fájlokban (választás szerint svn vagy png) találhatók az output/graph könyvtárban.
A megjelenítés parancsainak példái:
make graph-dependsfüggőségi fa létrehozásamake <pkg>-graph-dependsa megadott csomag függőségi fájának létrehozásaBR2_GRAPH_OUT=png make graph-builda build időgrafikon létrehozása PNG kimenettelmake graph-sizecsomagok méretét ábrázoló grafikon létrehozása
Hasznos szkriptek
A buildroot könyvtárban található egy almappa utils hasznos szkriptekkel. Például van egy szkript, ami ellenőrzi a csomagok leírásának helyességét. Ez hasznos lehet, ha saját csomagokat adunk hozzá (ezt később meg fogom tenni). A utils/readme.txt fájl tartalmazza ezeknek a szkripteknek a leírását.
Létrehozzuk a stock disztribúciót
Fontos megjegyezni, hogy minden műveletet egy normál felhasználó nevében hajtunk végre, nem root.
Minden parancsot a buildroot gyökerében hajtanak végre. A buildroot szállítmány már tartalmaz egy sor konfigurációt sok elterjedt lapka és virtualizáció számára.
Nézzük meg a konfigurációk listáját:

Váltunk a qemu_x86_64_defconfig konfigurációra
make qemu_x86_64_defconfigÉs elindítjuk a buildet
makeA build sikeresen befejeződik, nézzük meg az eredményeket:
![]()
A Buildroot elkészítette azokat a képeket, amelyeket elindíthatunk Qemu-ban, és megbizonyosodhatunk arról, hogy működnek.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -SAz eredmény — Qemu-ban futó rendszer:

Saját lap konfigurálásának létrehozása
Lap fájljainak hozzáadása
Nézzük meg a konfigurációk listáját:

A listában látjuk a pc_x86_64_efi_defconfig-et. Létrehozunk egy saját lapot, amelyet a konfiguráció másolásával készítünk:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfigAzonnal létrehozzuk a lap könyvtárát, ahol a saját szkripteinket, rootfs overlay-t és egyéb szükséges fájlokat tárolunk:
mkdir board/my_x86_boardVáltunk erre a defconfig-ra:
make my_x86_board_defconfigÍgy most a build konfiguráció (a buildroot gyökerében található .config fájlban tárolva) megfelel a célszámítógép x86-64 legacy (bios) indításának.
Másoljuk a linux-kernel konfigurációt (később hasznos lesz):
cp board/pc/linux.config board/my_x86_board/Build paraméterek beállítása a KConfig segítségével
Indítsuk el a beállítást:
make menuconfig Megnyílik a KConfig ablaka. Lehetőség van grafikus interfésszel konfigurálni (make nconfig, make xconfig, make gconfig):

Belépünk az első szakaszba, a Target Options-ba. Itt kiválasztható az a célarhitektúra, amelyre a build folyik.

A Build options — itt különféle build beállítások találhatók. Megadhatja a forráskódok könyvtárait, a build szálak számát, a forráskódok letöltésére szolgáló tükörszervereket és egyéb beállításokat. Hagyjuk az alapértelmezett beállításokat.
Toolchain – itt állítható be a build eszközkészlete. Erről bővebben.

Toolchain type – a használt eszközkészlet típusa. Ez lehet beépített buildroot vagy külső eszközkészlet (megadható a már összeállított könyvtár vagy letöltési url). Különböző architektúrákhoz további lehetőségek állnak rendelkezésre. Például az arm esetében egyszerűen választhat egy külső Linaro eszközkészlet verziót.
C library – a C könyvtár kiválasztása. Ez meghatározza a rendszer működését. Általában a glibc-t használják, amely támogatja a teljes funkcionalitást. De túl nagynak bizonyulhat beágyazott rendszerekhez, ezért gyakran választják az uClibc-t vagy a musl-t. Mi a glibc-t választjuk (ez később szükséges lesz a systemd használatához).
Kernel Headers és Custom Kernel Headers series – meg kell egyeznie az összeállított rendszerben lévő kernel verziójával. A kernel header-hez ugyanúgy megadhatja a tarball vagy git-repozitórium útját.
GCC COMPILER VERSIONS – a használandó fordítóverzió választása a fordításhoz.
Enable C++ support – válasszuk a C++ könyvtárak támogatásával történő fordítást a rendszerben. Később hasznos lesz.
Additional gcc options – további fordítóopciók adhatók meg. Jelenleg nincs rá szükségünk.
System configuration lehetővé teszi a létrehozandó rendszer jövőbeli paramétereinek megadását:

A legtöbb pont neve alapján érthető. Figyeljünk a következő pontokra:
Path to the users tables — a létrehozandó felhasználók táblázata ().
Példa fájl. Létrejön a user felhasználó admin jelszóval, automatikus gid/uid, /bin/sh shell, alapértelmezett csoport user, root csoport tag, Foo user megjegyzés.
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo userRoot filesystem overlay directories — könyvtár, amely a létrehozott target-fs fölé kerül. Új fájlokat ad hozzá, és felülírja a meglévőket.
Custom scripts to run before creating filesystem images — A fájlrendszer képek létrehozása előtt végrehajtandó szkriptek. A szkriptet egyelőre üresen hagyjuk.
Lépjünk a Kernel szekcióba.

Itt állíthatók be a kernel beállításai. Maga a kernel a make linux-menuconfig paranccsal konfigurálható.
A kernel verziójának megadása többféleképpen lehetséges: válasszon a felkínáltak közül, adja meg a verziót manuálisan, adja meg a repót vagy a kész tarball-t.
Kernel configuration — a kernel konfigurációs fájlja. Választhat alapértelmezett konfigurációt a választott architektúrához vagy defconfig-et a Linux-ból. A Linux forrásaiban védett defconfig-ok állnak rendelkezésre különböző célrendszerekhez. A szükséges megtalálható, . Például a beagle bone black lap számára lehet .
A Target packages szakaszban választható, hogy mely csomagok kerülnek telepítésre az összeszerelendő rendszerbe. Ezt egyelőre hagyjuk változatlanul. Később saját csomagjainkat hozzáadjuk majd ehhez a listához.
Filesystem images — az összeszerelendő fájlrendszer képek listája. Hozzáadunk egy iso-képet

Bootloaders — az összeszerelt betöltők kiválasztása. Válasszuk az isolinix-t

Systemd konfigurálása
A Systemd a linux egyik pillére, a kernel és a glibc mellett. Ezért vittem a konfigurálását külön pontra.
A make menuconfig segítségével állítható be, majd Target packages → System tools → systemd. Itt megadható, hogy mely systemd szolgáltatások kerülnek telepítésre és indításra a rendszer indulásakor.

A rendszer konfigurációjának mentése
Mentjük ezt a konfigurációt a KConfig segítségével.
Ezután mentjük a defconfig-unkat:
make savedefconfigA Linux kernel konfigurálása
A linux kernel konfigurációját a következő parancs indítja:
make linux-menuconfigHozzáadjuk a Virtualbox videokártya támogatását

Hozzáadjuk a Virtualbox Guest integrációs támogatást

Mentjük és kilépünk. FONTOS: a konfiguráció az output/build/linux-$version/config mappába mentésre kerül, de nem a board/my_x86_board/linux.config mappába

Ezért manuálisan kell átmásolni a konfigurációt a tárolási helyre:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.configEzután teljes újraépítjük az egész rendszert. Mivel a buildroot nem építi újra az már összeszerelt csomagokat, manuálisan kell megadni a csomagokat az újraépítéshez. Hogy ne pazaroljunk időt és energiát, egy kisebb rendszert egyszerűbb teljesen újraépíteni):
make clean;makeAz építés befejeztével elindítjuk a VirtualBox-ot (5.2-es és 6.0-s verzióval ellenőrizve), boot a cd-lemezről. A rendszer paraméterei:

Indítás az összeszerelt iso-ból:

Felhasznált anyagok listája
- Buildroot kézikönyv
Forrás: habr.com
