Buildroot - част 2. Създаване на вашата конфигурация на борда; използване на външно дърво, rootfs-overlay, скриптове след изграждане

В този раздел разглеждам някои от опциите за персонализиране, от които имах нужда. Това не е пълен списък на това, което buildroot предлага, но те са доста функционални и не изискват намеса във файловете на самия buildroot.

Използване на ВЪНШЕН механизъм за персонализиране

В предишна статия Разгледахме прост пример за добавяне на ваша собствена конфигурация чрез добавяне на defconfig на платката и необходимите файлове директно в директорията 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 - част 2. Създаване на вашата конфигурация на борда; използване на външно дърво, rootfs-overlay, скриптове след изграждане

Това подменю ще съдържа нашите пакети от нашето външно дърво. Този раздел в момента е празен.

Сега за нас е по-важно да пренапишем необходимите пътища за използване на външно дърво.

Моля, имайте предвид, че в раздела Опции за изграждане → Местоположение за запазване на конфигурацията на 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) ще бъде добавен.

Събираме и проверяваме:

Buildroot - част 2. Създаване на вашата конфигурация на борда; използване на външно дърво, rootfs-overlay, скриптове след изграждане

Изпълнение на скриптове за персонализиране на различни етапи от сглобяването на системата

Често трябва да извършите някаква работа в целевата файлова система, преди тя да бъде пакетирана в изображения.

Това може да стане в секцията за конфигурация на системата:

Buildroot - част 2. Създаване на вашата конфигурация на борда; използване на външно дърво, rootfs-overlay, скриптове след изграждане

Първите два скрипта се изпълняват след изграждането на целевата файлова система, но преди да бъде пакетирана в изображения. Разликата е, че fakeroot скриптът се изпълнява в контекста на fakeroot, който симулира работа като root потребител.

Последният скрипт се изпълнява след създаването на системните изображения. Можете да извършвате допълнителни действия в него, например да копирате необходимите файлове на NFS сървър или да създадете изображение на фърмуера на вашето устройство.

Като пример, ще създам скрипт, който ще запише версията и датата на компилация в /etc/.
Първо ще посоча пътя до този файл в моето външно дърво:

Buildroot - част 2. Създаване на вашата конфигурация на борда; използване на външно дърво, rootfs-overlay, скриптове след изграждане

А сега самият скрипт:

[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. Посочете този скрипт в настройките на борда в системната конфигурация -> Персонализирани скриптове за изпълнение в средата на fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh) раздел

Източник: www.habr.com

Добавяне на нов коментар