Buildroot - قسمت 2. ایجاد پیکربندی برد خود. با استفاده از اسکریپت های درخت خارجی، rootfs-overlay، پس از ساخت

در این بخش به برخی از گزینه های سفارشی سازی که نیاز داشتم نگاه می کنم. این لیست کاملی از آنچه بیلد روت ارائه می دهد نیست، اما کاملاً کاربردی هستند و نیازی به مداخله در فایل های خود بیلد روت ندارند.

استفاده از مکانیزم EXTERNAL برای سفارشی سازی

در مقاله قبلی ما به یک مثال ساده از افزودن پیکربندی خود با افزودن defconfig برد و فایل‌های لازم مستقیماً به فهرست Buildroot نگاه کردیم.

اما این روش به خصوص هنگام به روز رسانی بیلد روت خیلی راحت نیست. مکانیزمی برای حل این مشکل وجود دارد درخت خارجی. ماهیت آن این است که شما می توانید برد، تنظیمات، بسته ها و سایر دایرکتوری ها را در یک دایرکتوری جداگانه ذخیره کنید (به عنوان مثال، من از دایرکتوری 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

همانطور که می بینید، به طور کلی ساختار ساختار بیلد روت را تکرار می کند.

راهنمای تخته حاوی فایل های خاص برای هر برد در مورد ما:

  • bef_cr_fs_img.sh اسکریپتی است که پس از ساختن فایل سیستم هدف، اما قبل از بسته بندی آن در تصاویر اجرا می شود. در آینده از آن استفاده خواهیم کرد
  • linux.config - پیکربندی هسته
  • rootfs_overlay - دایرکتوری برای همپوشانی در بالای سیستم فایل هدف
  • users.txt - فایلی که کاربرانی که باید ایجاد شوند را توصیف می کند

راهنمای configs شامل 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

خط اول عنوان است. در بیلد روت آینده یک متغیر ایجاد کنید $(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، پس از ساخت

این زیر منو شامل بسته های ما از درخت خارجی ما خواهد بود. این بخش در حال حاضر خالی است.

اکنون برای ما مهم تر است که مسیرهای لازم برای استفاده از درخت خارجی را بازنویسی کنیم.

لطفاً توجه داشته باشید که در بخش 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

اکنون فایل های ما از درخت خارجی ما در هنگام مونتاژ استفاده می شود. هنگام انتقال به دایرکتوری دیگر یا به روز رسانی بیلد روت، حداقل مشکل را خواهیم داشت.

افزودن همپوشانی root fs:

این مکانیزم به شما اجازه می دهد تا به راحتی فایل ها را در سیستم فایل هدف اضافه یا جایگزین کنید.
اگر فایل در root fs overlay باشد، اما در target نباشد، اضافه خواهد شد
اگر فایل در روت fs overlay و در target باشد، جایگزین خواهد شد.
ابتدا مسیر روت 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 اجرا می شود که کار را به عنوان کاربر ریشه شبیه سازی می کند.

آخرین اسکریپت پس از ایجاد تصاویر سیستم اجرا می شود. می توانید اقدامات اضافی را در آن انجام دهید، به عنوان مثال، فایل های لازم را در یک سرور 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

اضافه کردن نظر