Ebben a részben a testreszabás néhány lehetőségét tárgyalom, amelyekre szükségem volt. Ez nem egy teljes lista arról, amit a buildroot kínál, de ezek jól működnek, és nem igénylik a buildroot fájljaiba való beavatkozást.
Az EXTERNAL-mechanizmus használata a testreszabáshoz
egy egyszerű példát néztünk, ahol saját konfigurációnkat adtuk hozzá a deszkához tartozó defconfig fájlok és szükséges fájlok közvetlenül a Buildroot könyvtárába való elhelyezésével.
De ez a módszer nem túl kényelmes, különösen a buildroot frissítésekor. Ennek a problémának a megoldására létezik egy mechanizmus external tree. A lényege, hogy külön könyvtárban tárolhatjuk a board, configs, packages és egyéb könyvtárakat (például én a patches könyvtárat használom, hogy a csomagokra vonatkozó javításokat alkalmazzak, részletesebben egy külön szakaszban), és a buildroot automatikusan hozzáadja őket a saját könyvtárához.
Megjegyzés: több external tree-t is alkalmazhatunk, van példa a buildroot útmutatójában.
Hozzunk létre egy my_tree könyvtárat, amely a buildroot könyvtár mellett található, és mozgassuk át oda a konfigurációnkat. A kimenet a következő fájlszerkezetet kell hogy mutassa:
[alexey@alexey-pc my_tree]$ tree
.
├── board
│ └── my_x86_board
│ ├── bef_cr_fs_img.sh
│ ├── linux.config
│ ├── rootfs_overlay
│ └── users.txt
├── Config.in
├── configs
│ └── my_x86_board_defconfig
├── external.desc
├── external.mk
├── package
└── patches
6 könyvtár, 7 fájlMint látható, az egész struktúra megismétli a buildroot struktúráját.
Mappa board tartalmazza az egyes deszkákra jellemző fájlokat az esetünkben:
- bef_cr_fs_img.sh — olyan szkript, amely a target fájlrendszer összesítése után fut le, de még a képekbe való csomagolás előtt. Később ezt fogjuk használni.
- linux.config — a kernel konfigurációja
- rootfs_overlay — könyvtár a target fájlrendszerre történő rétegzéshez
- users.txt — a létrehozott felhasználók leírását tartalmazó fájl
Mappa configs tartalmazza a deszkáink defconfig fájljait. Jelenleg csak egy van belőle.
Package — a csomagjaink könyvtára. Eredetileg a buildroot korlátozott számú csomag leírását és összesítési szabályait tartalmazza. Később ide fogjuk hozzáadni az icewm ablakkezelőt és a Slim grafikus bejelentkezési kezelőt.
Patches — lehetővé teszi, hogy a különböző csomagokhoz tartozó javításokat kényelmesen tároljuk. Részletesebben egy külön szakaszban később.
Most hozzá kell adni a leíró fájlokat a külső fájlstruktúránkhoz. Ehhez 3 fájl felelős: external.desc, Config.in, external.mk.
external.desc tartalmazza a tényleges leírást:
[alexey@alexey-pc my_tree]$ cat external.desc
name: my_tree
desc: Az egyszerű külső fáam az cikkhezAz első sor a név. Később a buildroot létrehoz egy változót $(BR2_EXTERNAL_MY_TREE_PATH), amelyet a gyártás konfigurálásakor kell használnunk. Például a felhasználók fájlának elérhetőségét a következőképpen lehet megadni:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtA második sor egy rövid, az ember számára érthető leírás.
Config.in, external.mk — fájlok az hozzáadott csomagok leírásához. Ha nem adunk hozzá saját csomagokat, akkor ezeket a fájlokat üresen is hagyhatjuk. Eddig így fogunk eljárni.
Most, hogy kész a külső fáam, amely tartalmazza a designt a panelünkhöz és a szükséges fájlokat. Ugrunk a buildroot könyvtárba, és megadjuk az externál fáám használatát:
[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# konfiguráció írva ide: /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfigAz első parancsban az argumentumot BR2_EXTERNAL=../my_tree/, ami az externál fáám használatát jelöli. Több externál fáámat egyszerre is meg lehet adni. Ezt elegendő egyszer megtenni, és létrejön az output/.br-external.mk fájl, amely tárolja a használt externál fáámra vonatkozó információkat:
[alexey@alexey-pc buildroot]$ cat output/.br-external.mk
#
# Automatikusan generált fájl; NE MÓDOSÍTSA.
#
BR2_EXTERNAL ?= /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_NAMES =
BR2_EXTERNAL_DIRS =
BR2_EXTERNAL_MKS =
BR2_EXTERNAL_NAMES += my_tree
BR2_EXTERNAL_DIRS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_MKS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree/external.mk
export BR2_EXTERNAL_my_tree_PATH = /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
export BR2_EXTERNAL_my_tree_DESC = Az egyszerű külső fáam a cikkhezFontos! Ebben a fájlban az elérési utak abszolútak lesznek!
Megjelent az External options menüpont:

Ebben a menüben a csomagjaink találhatóak a külső fáánkból. Jelenleg ez a rész üres.
Most fontosabb, hogy átírjuk a szükséges elérési utakat a külső fáám használatával.
Felhívjuk a figyelmet arra, hogy a Build options → Location to save buildroot config részben abszolút elérhetőség fog megjelenni a mentett defconfighez. Az extgernal_tree használatának megadásakor keletkezik.
Szintén a System configuration részben javítjuk az elérési utakat. A létrehozott felhasználók táblázatának:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtA Kernel részben megváltoztatjuk a kernel konfiguráció útját:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.configMost a gyártás során a külső fáám fájlait fogjuk használni. Ha áthelyezzük egy másik könyvtárba, a buildroot frissítésekor minimális problémánk lesz.
Könyvtár fs overlay hozzáadása:
Ez a mechanizmus lehetővé teszi fájlok egyszerű hozzáadását/változtatását a target fájlrendszerben.
Ha a fájl megtalálható a root fs overlay-ben, de hiányzik a targetből, akkor hozzá lesz adva.
Ha a fájl megtalálható a root fs overlay-ben és a targetben is, akkor fel lesz cserélve.
Először adjuk meg a root fs overlay könyvtárának elérési útját. Ezt a System configuration → Root filesystem overlay directories szekcióban tehetjük meg:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/Most két fájlt fogunk létrehozni.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/etc/hosts
127.0.0.1 localhost
127.0.1.1 my_small_linux
8.8.8.8 google-public-dns-a.google.com.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt
This is new file from overlayAz első fájl (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) felül fogja írni a fájlt /etc/hosts a kész rendszerben. A második fájl (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) hozzá lesz adva.
Összegyűjtjük és ellenőrizzük:

A testreszabási szkriptek végrehajtása a rendszerépítési folyamat különböző szakaszaiban.
Gyakran szükséges, hogy bizonyos lépéseket végrehajtsunk a target fájlrendszerben, mielőtt azt képekbe csomagolnánk.
Ezt a System configuration részben tehetjük meg:

Az első két szkript a target fájlrendszer felépítése után fut le, de még a képekbe csomagolása előtt. A különbség az, hogy a fakeroot szkript a fakeroot környezetében fut, tehát root felhasználói jogokat imitál.
Az utolsó szkript már a rendszerképek létrehozása után fut le. Ebben további lépéseket végezhetünk, például fájlokat másolhatunk NFS szerverre vagy létrehozhatunk egy firmware képet az eszközünkhöz.
Példaként készítek egy szkriptet, amely a verziót és a build dátumát írja a /etc/ könyvtárba.
Először megadom a fájl elérési útját az external-tree-emben:

Most pedig a szkript:
[alexey@alexey-pc buildroot]$ cat ../my_tree/board/my_x86_board/bef_cr_fs_img.sh
#! /bin/sh
echo "my small linux 1.0 pre alpha" > output/target/etc/mysmalllinux-release
date >> output/target/etc/mysmalllinux-releaseA build után ezt a fájlt megláthatjuk a rendszerben.
A gyakorlatban a szkript nagyobbá válhat. Ezért egy valós projektben egy fejlettebb megoldásra ugráltam:
- Létrehoztam egy könyvtárat (my_tree/board_my_x86_board/inside_fakeroot_scripts), amely tartalmazza a végrehajtandó szkripteket, sorszámokkal ellátva. Például, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh.
- Írtam egy szkriptet (my_tree/board_my_x86_board/run_inside_fakeroot.sh), amely végigmegy ezen a könyvtáron és sorban végrehajtja a benne lévő szkripteket.
- Megadtam ezt a szkriptet az alaplap beállításaiban a System configuration -> Custom scripts to run inside the fakeroot environment szekcióban ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh).
Forrás: habr.com
