Buildroot — část 2. Vytváření konfigurace vlastní desky; použití externího stromu, rootfs-overlay, post-build skriptů

V této části zkoumám některé možnosti přizpůsobení, které jsem potřeboval. Není to úplný seznam toho, co Buildroot nabízí, ale tyto jsou funkční a nevyžadují zásah do samotných souborů Buildrootu.

Použití EXTERNAL mechanismu pro přizpůsobení

V předchozím článku byl zvažován jednoduchý příklad přidání vlastní konfigurace, přidáním defconfigu desky a potřebných souborů přímo do katalogu Buildroot.

Ale tato metoda není příliš pohodlná, zejména při aktualizaci Buildrootu. Pro řešení tohoto problému existuje mechanismus external tree. Podstatou je, že v samostatném katalogu lze uchovávat katalogy board, configs, packages a další (například používám katalog patches pro aplikaci patchů na balíčky, podrobněji v samostatné části) a Buildroot je automaticky přidá k těm, které již má ve svém katalogu.

Poznámka: lze aplikovat několik external tree najednou, existuje příklad v dokumentaci Buildrootu

Vytvoříme katalog my_tree, který se nachází vedle katalogu Buildrootu, a přesuneme tam naši konfiguraci. Na výstupu by měla vzniknout následující struktura souborů:

[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 katalogů, 7 souborů

Jak je vidět, celková struktura se podobá struktuře Buildrootu.

Katalog board obsahuje soubory specifické pro každou desku, v našem případě:

  • bef_cr_fs_img.sh — skript, který se provede po sestavení targetového souborového systému, ale před jeho zabalením do obrazů. V budoucnu ho budeme používat
  • linux.config — konfigurace jádra
  • rootfs_overlay — katalog pro překrytí nad targetovým souborovým systémem
  • users.txt — soubor s popisem vytvářených uživatelů

Katalog configs obsahuje defconfigy našich desek. Máme jen jeden.

Package — katalog s našimi balíčky. Původně Buildroot obsahuje popisy a pravidla sestavení omezeného počtu balíčků. Později přidáme správce oken icewm a správce grafického přihlášení Slim.
Patches — umožňuje pohodlně uchovávat své patche pro různé balíčky. Podrobněji v samostatné části dále.
Nyní je potřeba přidat soubory popisu našeho external-tree. Za to odpovídají 3 soubory: external.desc, Config.in, external.mk.

external.desc obsahuje vlastně popis:

[alexey@alexey-pc my_tree]$ cat external.desc 
name: my_tree
desc: Můj jednoduchý external-tree pro článek

První řádek – název. Později buildroot vytvoří proměnnou $(BR2_EXTERNAL_MY_TREE_PATH), kterou je třeba použít při konfiguraci buildu. Například cestu k souboru s uživateli lze zadat následujícím způsobem:

$(BR2_EXTERNAL_my_tree_PATH)\/board\/my_x86_board\/users.txt

Druhý řádek – stručný, srozumitelný popis pro člověka.

Config.in, external.mk – soubory pro popis přidávaných balíčků. Pokud se žádné balíčky nepřidávají, lze tyto soubory ponechat prázdné. Prozatím takto také učiníme.
Nyní máme připravené naše external-tree, obsahující defconfig naší desky a potřebné soubory. Přejděme do adresáře buildroot a určeme, že chceme použít external-tree:

[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=..\/my_tree\/ my_x86_board_defconfig
#
# konfigurace zapsaná do \/home\/alexey\/dev\/article\/ramdisk\/buildroot\/.config
#
[alexey@alexey-pc buildroot]$ make menuconfig

V prvním příkazu používáme argument BR2_EXTERNAL=..\/my_tree\/, který označuje použití external tree. Lze zároveň určit více external-tree. Přitom stačí to udělat jednou, pak se vytvoří soubor output\/.br-external.mk, který ukládá informace o používaném external-tree:

[alexey@alexey-pc buildroot]$ cat output\/.br-external.mk 
#
# Automaticky generovaný soubor; NEEDITUJTE.
#

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 = Můj jednoduchý external-tree pro článek

Důležité! V tomto souboru budou cesty absolutní!

V menu se objevil položka External options:

Buildroot — část 2. Vytváření konfigurace vlastní desky; použití externího stromu, rootfs-overlay, post-build skriptů

V tomto podmenu budou obsaženy naše balíčky z našeho external-tree. V tuto chvíli je tato sekce prázdná.

Nyní je pro nás důležitější upravit potřebné cesty k použití external-tree.

Všimněte si, že v sekci Build options → Location to save buildroot config, bude absolutní cesta k ukládanému defconfigu. Ta se vytváří v okamžiku, kdy určujeme použití external_tree.

Také v sekci System configuration upravíme cesty. Pro tabulku se vytvářenými uživateli:

$(BR2_EXTERNAL_my_tree_PATH)\/board\/my_x86_board\/users.txt

V sekci Kernel změníme cestu k konfiguraci jádra:

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

Nyní při sestavování budou použity naše soubory z našeho external-tree. Při přesunu do jiného adresáře nebo aktualizaci buildroot budeme mít co nejméně problémů.

Přidání root fs overlay:

Tento mechanismus umožňuje snadno přidávat/zaměňovat soubory v cílovém souborovém systému.
Pokud je soubor v root fs overlay, ale není v cílovém, bude přidán.
Pokud je soubor v root fs overlay i v cílovém, bude nahrazen.
Nejprve nastavíme cestu k adresáři root fs overlay. To se provádí v sekci Konfigurace systému → Adresáře overlay kořenového souborového systému:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/

Nyní vytvoříme dva soubory.

[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

První soubor (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) nahradí soubor /etc/hosts v hotovém systému. Druhý soubor (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) bude přidán.

Sestavujeme a kontrolujeme:

Buildroot — část 2. Vytváření konfigurace vlastní desky; použití externího stromu, rootfs-overlay, post-build skriptů

Provádění skriptů přizpůsobení v různých fázích sestavení systému

Často je třeba provést některé úkony uvnitř cílového souborového systému, než bude zabalena do obrazů.

To lze provést v sekci Konfigurace systému:

Buildroot — část 2. Vytváření konfigurace vlastní desky; použití externího stromu, rootfs-overlay, post-build skriptů

První dva skripty se provádějí po sestavení cílového souborového systému, ale před jeho zabalením do obrazů. Rozdíl je v tom, že skript fakeroot se provádí v kontextu fakeroot, tedy napodobuje práci pod uživatelským účtem root.

Poslední skript se provádí již po vytvoření obrazů systému. V něm lze provádět další úkony, například zkopírovat potřebné soubory na nfs server nebo vytvořit obraz firmwaru zařízení.

Jako příklad vytvořím skript, který zapíše verzi a datum sestavení do /etc/.
Nejprve uvedu cestu k tomuto souboru ve svém external-tree:

Buildroot — část 2. Vytváření konfigurace vlastní desky; použití externího stromu, rootfs-overlay, post-build skriptů

A teď samotný skript:

[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

Po sestavení lze tento soubor v systému vidět.

V praxi může skript narůst do větších rozměrů. Proto jsem v reálném projektu zvolil sofistikovanější přístup:

  1. Vytvořil jsem adresář (my_tree/board_my_x86_board/inside_fakeroot_scripts), ve kterém jsou uloženy skripty k provedení s pořadovými čísly. Například 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Napsal jsem skript(my_tree/board_my_x86_board/run_inside_fakeroot.sh), který prochází tímto adresářem a postupně vykonává skripty, které se v něm nacházejí
  3. Tento skript jsem uvedl v nastavení desky v sekci System configuration -> Custom scripts to run inside the fakeroot environment ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster