У дадзеным раздзеле я разглядаю частку магчымасцяў па кастамізацыі, якія запатрабаваліся мне. Гэта не поўны спіс таго, што прапануе buildroot, але яны суцэль працоўныя і не патрабуюць умяшанні ў файлы самога buildroot.
Выкарыстанне EXTERNAL-механізму для кастамізацыі
Але гэты метад не вельмі зручны, асабліва пры абнаўленні 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:
У гэтым падменю будуць змяшчацца нашы пакеты з нашага 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) дадасца.
Збіраны і правяраем:
Выкананне скрыптоў кастамізацыі на розных этапах зборкі сістэмы.
Часта трэба выканаць некаторыя дзеянні ўнутры target-файлавай сістэмы да таго, як яна будзе запакаваная ў вобразы.
Гэта можна зрабіць у раздзеле System configuration:
Першыя два скрыпты выконваюцца пасля зборкі target-файлавай сістэмы, але да пакавання яе ў выявы. Розніца ў тым, што fakeroot-скрыпт выконваецца ў кантэксце fakeroot, тыя імітуецца праца ад карыстача root.
Апошні скрыпт выконваецца ўжо пасля стварэння выяў сістэмы. У ім можна выконваць дадатковыя дзеянні, напрыклад, скапіяваць патрэбныя файлы на nfs-сервер ці стварыць выяву сваёй прашыўкі прылады.
У якасці прыкладу я ствару скрыпт, які будзе пісаць версію і дату зборкі ў /etc/.
Спачатку пакажу шлях да гэтага файла ў маім external-tree:
А зараз сам скрыпт:
[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
Пасля зборкі можна ўбачыць гэты файл у сістэме.
На практыцы, скрыпт можа стаць вялікім. Таму ў рэальным праекце я пайшоў больш прасунутым шляхам:
- Стварыў каталог (my_tree/board_my_x86_board/inside_fakeroot_scripts), у якім ляжаць скрыпты для выканання, з парадкавымі нумарамі. Напрыклад, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
- Напісаў скрыпт(my_tree/board_my_x86_board/run_inside_fakeroot.sh), які праходзіць па гэтым каталогу і паслядоўна выконвае скрыпты, якія ляжалі ў ім
- Паказаў гэты скрыпт у наладах платы ў раздзеле 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