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í
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ánekPrvní řá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.txtDruhý řá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 menuconfigV 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ánekDůležité! V tomto souboru budou cesty absolutní!
V menu se objevil položka External options:

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.txtV sekci Kernel změníme cestu k konfiguraci jádra:
$(BR2_EXTERNAL_my_tree_PATH)\/board\/my_x86_board\/linux.configNyní 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 overlayPrvní 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:

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:

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:

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-releasePo 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:
- 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
- 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í
- 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
