В този раздел разглеждам някои от опциите за персонализиране, от които имах нужда. Това не е пълен списък на това, което buildroot предлага, но те са доста функционални и не изискват намеса във файловете на самия buildroot.
Използване на ВЪНШЕН механизъм за персонализиране
Но този метод не е много удобен, особено при актуализиране на buildroot. Има механизъм за решаване на този проблем външно дърво. Същността му е, че можете да съхранявате board, configs, packages и други директории в отделна директория (например аз използвам директорията patches, за да прилагам пачове към пакети, повече подробности в отделен раздел) и самият buildroot ще ги добави към тези в неговата директория.
Забележка: можете да наслагвате няколко външни дървета наведнъж, има пример в ръководството за 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 е скрипт, който ще бъде изпълнен след изграждането на целевата файлова система, но преди пакетирането й в изображения. Ще го използваме в бъдеще
- linux.config - конфигурация на ядрото
- rootfs_overlay - директория за наслагване върху целевата файлова система
- users.txt - файл, описващ потребителите, които ще бъдат създадени
указател довереник съдържа defconfig на нашите дъски. Имаме само един.
Пакет - каталог с нашите пакети. Първоначално buildroot съдържа описания и правила за изграждане на ограничен брой пакети. По-късно ще добавим тук мениджъра на прозорци icewm и Slim графичния мениджър за влизане.
Кръпки — ви позволява удобно да съхранявате вашите пластири за различни пакети. Повече подробности в отделен раздел по-долу.
Сега трябва да добавим файловете с описание за нашето външно дърво. Има 3 файла, отговорни за това: external.desc, Config.in, external.mk.
външен.дес съдържа действителното описание:
[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 — файлове за описание на добавените пакети. Ако не добавите свои собствени пакети, тези файлове могат да останат празни. Засега това ще направим.
Сега имаме готово нашето външно дърво, съдържащо defconfig на нашата платка и файловете, от които се нуждае. Нека отидем в директорията buildroot и да посочим да използваме външно дърво:
[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/, което показва използването на външно дърво. Можете да посочите няколко външни дървета за използване едновременно. В този случай трябва да направите това само веднъж, след което се създава файл output/.br-external.mk, който съхранява информация за използваното външно дърво:
[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
важно! Пътищата в този файл ще бъдат абсолютни!
В менюто се появи елемент Външни опции:
Това подменю ще съдържа нашите пакети от нашето външно дърво. Този раздел в момента е празен.
Сега за нас е по-важно да пренапишем необходимите пътища за използване на външно дърво.
Моля, имайте предвид, че в раздела Опции за изграждане → Местоположение за запазване на конфигурацията на buildroot ще има абсолютен път до запазената defconfig. Той се формира в момента на указване на използването на extgernal_tree.
Също така ще коригираме пътищата в раздела Системна конфигурация. За таблица със създадени потребители:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt
В раздела Ядро променете пътя до конфигурацията на ядрото:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config
Сега нашите файлове от нашето външно дърво ще бъдат използвани по време на асемблирането. При преместване в друга директория или актуализиране на buildroot ще имаме минимум проблеми.
Добавяне на root fs наслагване:
Този механизъм ви позволява лесно да добавяте/заменяте файлове в целевата файлова система.
Ако файлът е в 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) ще бъде добавен.
Събираме и проверяваме:
Изпълнение на скриптове за персонализиране на различни етапи от сглобяването на системата
Често трябва да извършите някаква работа в целевата файлова система, преди тя да бъде пакетирана в изображения.
Това може да стане в секцията за конфигурация на системата:
Първите два скрипта се изпълняват след изграждането на целевата файлова система, но преди да бъде пакетирана в изображения. Разликата е, че fakeroot скриптът се изпълнява в контекста на fakeroot, който симулира работа като root потребител.
Последният скрипт се изпълнява след създаването на системните изображения. Можете да извършвате допълнителни действия в него, например да копирате необходимите файлове на NFS сървър или да създадете изображение на фърмуера на вашето устройство.
Като пример, ще създам скрипт, който ще запише версията и датата на компилация в /etc/.
Първо ще посоча пътя до този файл в моето външно дърво:
А сега самият скрипт:
[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), който минава през тази директория и последователно изпълнява скриптовете, съдържащи се в нея
- Посочете този скрипт в настройките на борда в системната конфигурация -> Персонализирани скриптове за изпълнение в средата на fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh) раздел
Източник: www.habr.com