Buildroot - частка 2. Стварэнне канфігурацыі сваёй платы; прымяненне external tree, rootfs-overlay, post-build скрыптоў

У дадзеным раздзеле я разглядаю частку магчымасцяў па кастамізацыі, якія запатрабаваліся мне. Гэта не поўны спіс таго, што прапануе buildroot, але яны суцэль працоўныя і не патрабуюць умяшанні ў файлы самога buildroot.

Выкарыстанне EXTERNAL-механізму для кастамізацыі

У папярэднім артыкуле разглядаўся просты прыклад дадання сваёй канфігурацыі, шляхам дадання defconfig'а поплатка і патрэбных файлаў непасрэдна ў каталог Buildroot.

Але гэты метад не вельмі зручны, асабліва пры абнаўленні buildroot. Для вырашэння гэтай праблемы ёсць механізм external tree. Сутнасць яго ў тым, што ў асобным каталогу можна захоўваць каталогі board, configs, packages і іншыя (напрыклад, я выкарыстоўваю каталог patches для накладання патчаў на пакеты, падрабязней у асобнай частцы) і buildroot будзе сам дадаваць іх да наяўных у сваім каталогу.

Заўвага: можна накладваць адразу некалькі external tree, ёсць прыклад у кіраўніцтве buildroot

Створым каталог my_tree, які знаходзіцца побач з каталогам buildroot'а і перанясём туды нашу канфігурацыю. На выхадзе павінны атрымаць наступную структуру файлаў:

[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 directories, 7 files

Як бачна, у цэлым структура паўтарае структуру buildroot.

Каталог савет змяшчае файлы, спецыфічныя кожнай плаце ў нашым выпадку:

  • bef_cr_fs_img.sh — скрыпт, які будзе выконвацца пасля зборкі target-файлавай сістэмы, але перад пакаваннем яе ў выявы. У далейшым мы яго будзем выкарыстоўваць
  • linux.config - канфігурацыя ядра
  • rootfs_overlay - каталог для накладання над target-файлавай сістэмы
  • users.txt - файл з апісаннем ствараных карыстальнікаў

Каталог конфігі змяшчае defconfig'і нашых поплаткаў. У нас ён усяго адзін.

пакет - каталог з нашымі пакетамі. Першапачаткова buildroot утрымоўвае апісанні і правілы зборкі абмежаванай колькасці пакетаў. Пазней мы дадамо сюды аконны мэнэджар icewm і мэнэджар графічнага ўваходу ў сістэму Slim.
Патчы - дазваляе зручна захоўваць свае патчы для розных пакетаў. Больш падрабязна ў асобным раздзеле далей.
Цяпер трэба дадаць файлы апісання нашага external-tree. За гэта адказваюць 3 файлы: external.desc, Config.in, external.mk.

external.desc змяшчае ўласна апісанне:

[alexey@alexey-pc my_tree]$ cat external.desc 
name: my_tree
desc: My simple external-tree for article

Першы радок - назва. У далейшым buildroot стварыць зменную $(BR2_EXTERNAL_MY_TREE_PATH), якую трэба выкарыстоўваць пры канфігураванні зборкі. Напрыклад, шлях да файла з карыстальнікамі можна задаць наступным шляхам:

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

Другі радок - кароткае, зразумелае чалавеку апісанне.

Config.in, external.mk - файлы для апісання пакетаў, якія дадаюцца. Калі свае пакеты не дадаваць, то гэтыя файлы можна пакінуць пустымі. Пакуль што мы так і зробім.
Цяпер у нас гатова наша external-tree, якое змяшчае defconfig нашай платы і патрэбныя яму файлы. Пяройдзем каталог buildroot, пакажам выкарыстоўваць external-tree:

[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuration written to /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfig

У першай камандзе мы выкарыстоўваем аргумент BR2_EXTERNAL=../my_tree/, які паказвае выкарыстанне external-tree.Можна задаць адначасова некалькі external-tree для выкарыстання Пры гэтым дастаткова зрабіць гэта адзін раз, пасля чаго ствараецца файл output/.br-external.mk, які захоўвае інфармацыю аб выкарыстоўваным external-tree:

[alexey@alexey-pc buildroot]$ cat output/.br-external.mk 
#
# Automatically generated file; DO NOT EDIT.
#

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 = My simple external-tree for article

Важна! У гэтым файле шляхі будуць абсалютнымі!

У меню з'явіўся пункт External options:

Buildroot - частка 2. Стварэнне канфігурацыі сваёй платы; прымяненне external tree, rootfs-overlay, post-build скрыптоў

У гэтым падменю будуць змяшчацца нашы пакеты з нашага external-tree. Цяпер гэты раздзел пусты.

Цяпер нам важней перапісаць патрэбныя шляхі на выкарыстанне external-tree.

Звярніце ўвагу, што ў раздзеле Build options → Location to save buildroot config, будзе абсалютны шлях да захаванага defconfig'у. Фармуецца ён у момант указання карыстання extgernal_tree.

Таксама ў падзеле System configuration паправім шляхі. Для табліцы са ствараемымі карыстальнікамі:

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

У падзеле Kernel памяняем шлях да канфігурацыі ядра:

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

Цяпер пры зборцы будуць выкарыстоўвацца нашы файлы з нашага external-tree. Пры пераносе ў іншы каталог, абнаўленні buildroot у нас будзе мінімум праблем.

Даданне root fs overlay:

Дадзены механізм дазваляе лёгка дадаваць/замяняць файлы ў target-файлавай сістэме.
Калі файл ёсць у root fs overlay, але няма ў target, то ён будзе дададзены
Калі файл ёсьць у root fs overlay і ў target, то ён будзе заменены.
Спачатку зададзім шлях да root fs overlay dir. Гэта робіцца ў раздзеле System configuration → Root filesystem overlay directories:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/

Цяпер правядзём створым два файлы.

[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

Першы файл (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) заменіць файл /etc/hosts у гатовай сістэме. Другі файл (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) дадасца.

Збіраны і правяраем:

Buildroot - частка 2. Стварэнне канфігурацыі сваёй платы; прымяненне external tree, rootfs-overlay, post-build скрыптоў

Выкананне скрыптоў кастамізацыі на розных этапах зборкі сістэмы.

Часта трэба выканаць некаторыя дзеянні ўнутры target-файлавай сістэмы да таго, як яна будзе запакаваная ў вобразы.

Гэта можна зрабіць у раздзеле System configuration:

Buildroot - частка 2. Стварэнне канфігурацыі сваёй платы; прымяненне external tree, rootfs-overlay, post-build скрыптоў

Першыя два скрыпты выконваюцца пасля зборкі target-файлавай сістэмы, але да пакавання яе ў выявы. Розніца ў тым, што fakeroot-скрыпт выконваецца ў кантэксце fakeroot, тыя імітуецца праца ад карыстача root.

Апошні скрыпт выконваецца ўжо пасля стварэння выяў сістэмы. У ім можна выконваць дадатковыя дзеянні, напрыклад, скапіяваць патрэбныя файлы на nfs-сервер ці стварыць выяву сваёй прашыўкі прылады.

У якасці прыкладу я ствару скрыпт, які будзе пісаць версію і дату зборкі ў /etc/.
Спачатку пакажу шлях да гэтага файла ў маім external-tree:

Buildroot - частка 2. Стварэнне канфігурацыі сваёй платы; прымяненне external tree, rootfs-overlay, post-build скрыптоў

А зараз сам скрыпт:

[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

Пасля зборкі можна ўбачыць гэты файл у сістэме.

На практыцы, скрыпт можа стаць вялікім. Таму ў рэальным праекце я пайшоў больш прасунутым шляхам:

  1. Стварыў каталог (my_tree/board_my_x86_board/inside_fakeroot_scripts), у якім ляжаць скрыпты для выканання, з парадкавымі нумарамі. Напрыклад, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Напісаў скрыпт(my_tree/board_my_x86_board/run_inside_fakeroot.sh), які праходзіць па гэтым каталогу і паслядоўна выконвае скрыпты, якія ляжалі ў ім
  3. Паказаў гэты скрыпт у наладах платы ў раздзеле System configuration -> Custom scripts to run inside the fakeroot environment ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

Крыніца: habr.com

Дадаць каментар