در این بخش به برخی از گزینه های سفارشی سازی که نیاز داشتم نگاه می کنم. این لیست کاملی از آنچه بیلد روت ارائه می دهد نیست، اما کاملاً کاربردی هستند و نیازی به مداخله در فایل های خود بیلد روت ندارند.
استفاده از مکانیزم EXTERNAL برای سفارشی سازی
اما این روش به خصوص هنگام به روز رسانی بیلد روت خیلی راحت نیست. مکانیزمی برای حل این مشکل وجود دارد درخت خارجی. ماهیت آن این است که شما می توانید برد، تنظیمات، بسته ها و سایر دایرکتوری ها را در یک دایرکتوری جداگانه ذخیره کنید (به عنوان مثال، من از دایرکتوری 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
مهم! مسیرهای این فایل مطلق خواهند بود!
یک مورد گزینه های خارجی در منو ظاهر شده است:
این زیر منو شامل بسته های ما از درخت خارجی ما خواهد بود. این بخش در حال حاضر خالی است.
اکنون برای ما مهم تر است که مسیرهای لازم برای استفاده از درخت خارجی را بازنویسی کنیم.
لطفاً توجه داشته باشید که در بخش 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) اضافه خواهد شد.
ما جمع آوری و بررسی می کنیم:
اجرای اسکریپت های سفارشی سازی در مراحل مختلف مونتاژ سیستم
اغلب شما نیاز دارید که قبل از بستهبندی فایل سیستم هدف، کارهایی را در داخل فایل انجام دهید.
این را می توان در بخش پیکربندی سیستم انجام داد:
دو اسکریپت اول پس از ساخته شدن فایل سیستم هدف، اما قبل از بسته بندی در تصاویر اجرا می شوند. تفاوت این است که اسکریپت fakeroot در زمینه fakeroot اجرا می شود که کار را به عنوان کاربر ریشه شبیه سازی می کند.
آخرین اسکریپت پس از ایجاد تصاویر سیستم اجرا می شود. می توانید اقدامات اضافی را در آن انجام دهید، به عنوان مثال، فایل های لازم را در یک سرور 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