Buildroot — 2. rész. Saját deszka konfiguráció létrehozása; external tree, rootfs-overlay, post-build szkriptek alkalmazása

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

Az előző cikkben 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ájl

Mint 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 cikkhez

Az 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.txt

A 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 menuconfig

Az 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 cikkhez

Fontos! Ebben a fájlban az elérési utak abszolútak lesznek!

Megjelent az External options menüpont:

Buildroot — 2. rész. Saját deszka konfiguráció létrehozása; external tree, rootfs-overlay, post-build szkriptek alkalmazása

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.txt

A Kernel részben megváltoztatjuk a kernel konfiguráció útját:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config

Most 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 overlay

Az 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:

Buildroot — 2. rész. Saját deszka konfiguráció létrehozása; external tree, rootfs-overlay, post-build szkriptek alkalmazása

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:

Buildroot — 2. rész. Saját deszka konfiguráció létrehozása; external tree, rootfs-overlay, post-build szkriptek alkalmazása

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:

Buildroot — 2. rész. Saját deszka konfiguráció létrehozása; external tree, rootfs-overlay, post-build szkriptek alkalmazása

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-release

A 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:

  1. 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.
  2. Í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.
  3. 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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster