معرفی
در این سری از مقالات، من می خواهم به سیستم ساخت توزیع بیلد روت نگاه کنم و تجربه خود را در سفارشی سازی آن به اشتراک بگذارم. تجربه عملی در ایجاد یک سیستم عامل کوچک با رابط گرافیکی و حداقل عملکرد وجود خواهد داشت.
اول از همه، شما نباید سیستم ساخت و توزیع را با هم اشتباه بگیرید. Buildroot می تواند از مجموعه بسته هایی که به آن ارائه می شود، یک سیستم بسازد. Buildroot بر روی فایلهای makefi ساخته شده است و بنابراین قابلیت سفارشیسازی بسیار زیادی دارد. یک بسته را با نسخه دیگری جایگزین کنید، بسته خود را اضافه کنید، قوانین ساخت یک بسته را تغییر دهید، پس از نصب همه بسته ها، سیستم فایل را سفارشی کنید؟ buildroot می تواند همه این کارها را انجام دهد.
در روسیه از buildroot استفاده می شود، اما به نظر من اطلاعات کمی به زبان روسی برای مبتدیان وجود دارد.
هدف از کار، مونتاژ یک کیت توزیع با دانلود زنده، رابط icewm و مرورگر است. پلتفرم هدف مجازی باکس است.
چرا توزیع خود را بسازید؟ اغلب عملکرد محدود با منابع محدود مورد نیاز است. حتی بیشتر اوقات در اتوماسیون شما نیاز به ایجاد سیستم عامل دارید. انطباق یک توزیع همه منظوره با پاک کردن بستههای غیر ضروری و تبدیل آن به سیستمافزار نسبت به ساخت یک توزیع جدید، کار فشردهتری دارد. استفاده از جنتو نیز محدودیت هایی دارد.
سیستم Buildroot بسیار قدرتمند است، اما هیچ کاری برای شما انجام نمی دهد. فقط می تواند فرآیند مونتاژ را فعال و خودکار کند.
سیستم های ساخت جایگزین (yocto، سیستم ساخت باز و سایرین) در نظر گرفته نمی شوند و مقایسه نمی شوند.
از کجا باید تهیه کرد و چگونه شروع کرد
وب سایت پروژه -
Buildroot تنظیمات defconfig را برای برد هدف بیلد اجرا می کند. Defconfig یک فایل پیکربندی است که فقط گزینه هایی را ذخیره می کند که مقادیر پیش فرض ندارند. این اوست که تعیین می کند چه چیزی و چگونه جمع آوری شود. در این حالت میتوانید پیکربندیهای بوتلودرهای busybox، linux-kernel، uglibc، u-boot و barebox را بهطور جداگانه پیکربندی کنید، اما همه آنها به برد هدف متصل میشوند.
پس از باز کردن آرشیو دانلود شده یا شبیه سازی از git، یک بیلد روت آماده برای استفاده دریافت می کنیم. شما می توانید اطلاعات بیشتری در مورد ساختار دایرکتوری در راهنما بخوانید؛ من در مورد مهمترین آنها به شما خواهم گفت:
تخته - یک دایرکتوری با فایل های خاص برای هر برد. اینها می توانند اسکریپت هایی برای تشکیل تصاویر سیستم (iso، sdcart، cpio و غیره)، دایرکتوری همپوشانی، پیکربندی هسته و غیره باشند.
configs - پیکربندی واقعی برد. Defconfig یک پیکربندی تخته ناقص است. فقط پارامترهایی را ذخیره می کند که با تنظیمات پیش فرض متفاوت هستند
dl - دایرکتوری با کدهای منبع/فایل های دانلود شده برای مونتاژ
خروجی/هدف - سیستم فایل مونتاژ شده سیستم عامل حاصل. متعاقباً تصاویری از آن برای دانلود/نصب ایجاد می شود
خروجی/میزبان - ابزارهای میزبان برای مونتاژ
خروجی/ساخت - بسته های مونتاژ شده
اسمبلی از طریق KConfig پیکربندی می شود. از همین سیستم برای ساخت هسته لینوکس استفاده می شود. لیستی از رایج ترین دستورات مورد استفاده (اجرا در فهرست buildroot):
- make menuconfig - تنظیمات ساخت را فراخوانی کنید. شما همچنین می توانید از رابط گرافیکی استفاده کنید (ایجاد nconfig، ساخت xconfig، ساخت gconfig)
- ایجاد linux-menuconfig - پیکربندی هسته را فراخوانی کنید.
- تمیز کردن - نتایج ساخت را تمیز کنید (همه چیزهایی که در خروجی ذخیره می شوند)
- ساختن - ساختن یک سیستم. این فرآیندهای از قبل مونتاژ شده را دوباره جمع نمی کند.
- make defconfig_name - پیکربندی را به یک defconfig خاص تغییر دهید
- make list-defconfigs - نمایش لیستی از defconfigs
- ساخت سورس - فقط فایل های نصب را بدون ساختن دانلود کنید.
- کمک ایجاد کنید - دستورات ممکن را فهرست کنید
نکات مهم و نکات مفید
Buildroot پکیج هایی که قبلا ساخته شده اند را بازسازی نمی کند! بنابراین، ممکن است شرایطی پیش بیاید که نیاز به مونتاژ مجدد کامل باشد.
با دستور می توانید یک بسته جداگانه را بازسازی کنید نام بسته را بازسازی کنید. به عنوان مثال، می توانید هسته لینوکس را بازسازی کنید:
make linux-rebuild
Buildroot وضعیت هر بسته را با ایجاد فایلهای stamp. در دایرکتوری output/build/$packagename ذخیره میکند:
بنابراین، می توانید root-fs و تصاویر را بدون بازسازی بسته ها بازسازی کنید:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make
متغیرهای مفید
buildroot دارای مجموعه ای از متغیرها برای پیکربندی آسان است
- $TOPDIR - دایرکتوری buildroot
- $BASEDIR - دایرکتوری OUTPUT
- $HOST_DIR، $STAGING_DIR، $TARGET_DIR — میزبان fs، مرحلهبندی fs، دایرکتوریهای ساخت fs هدف.
- $BUILD_DIR - دایرکتوری با بسته های بسته بندی نشده و ساخته شده
تجسم
buildroot یک ویژگی تجسم دارد.شما می توانید یک نمودار وابستگی، یک نمودار زمان ساخت و یک نمودار اندازه بسته در سیستم نهایی بسازید. نتایج بهصورت فایلهای pdf (شما میتوانید از بین svn، png انتخاب کنید) در فهرست خروجی/گراف هستند.
نمونه هایی از دستورات تجسم:
make graph-depends
ساخت درخت وابستگیmake <pkg>-graph-depends
یک درخت وابستگی برای یک بسته خاص بسازیدBR2_GRAPH_OUT=png make graph-build
زمان ساخت طرح با خروجی PNGmake graph-size
اندازه بسته طرح
اسکریپت های مفید
یک زیر شاخه در دایرکتوری buildroot وجود دارد سودمند با اسکریپت های مفید به عنوان مثال، یک اسکریپت وجود دارد که صحت توضیحات بسته را بررسی می کند. این ممکن است هنگام اضافه کردن بسته های خود مفید باشد (این کار را بعداً انجام خواهم داد). فایل utils/readme.txt حاوی توضیحاتی درباره این اسکریپت ها است.
بیایید توزیع سهام بسازیم
مهم است که به یاد داشته باشید که همه عملیات از طرف یک کاربر معمولی انجام می شود، نه ریشه.
تمام دستورات در بیلد روت اجرا می شوند. بسته buildroot قبلاً شامل مجموعه ای از تنظیمات برای بسیاری از بردهای رایج و مجازی سازی است.
بیایید به لیست تنظیمات نگاه کنیم:
به پیکربندی qemu_x86_64_defconfig بروید
make qemu_x86_64_defconfig
و مونتاژ را شروع می کنیم
make
ساخت با موفقیت کامل شد، به نتایج نگاه کنید:
Buildroot تصاویری را گردآوری کرده است که می توانید آنها را در Qemu اجرا کنید و بررسی کنید که آنها کار می کنند.
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
نتیجه سیستمی است که در qemu اجرا می شود:
ایجاد پیکربندی برد خود
افزودن فایل های برد
بیایید به لیست تنظیمات نگاه کنیم:
در لیست ما pc_x86_64_efi_defconfig را می بینیم. ما تابلوی خودمان را با کپی کردن آن از پیکربندی ایجاد خواهیم کرد:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
بیایید فوراً یک دایرکتوری برد برای ذخیره اسکریپت ها، rootfs-overlay و سایر فایل های ضروری ایجاد کنیم:
mkdir board/my_x86_board
به این defconfig تغییر دهید:
make my_x86_board_defconfig
بنابراین، اکنون پیکربندی ساخت (ذخیره شده در .config در ریشه دایرکتوری buildroot) با دستگاه هدف بوت legacy (bios) x86-64 مطابقت دارد.
بیایید پیکربندی هسته لینوکس را کپی کنیم (مفید بعداً):
cp board/pc/linux.config board/my_x86_board/
تنظیم پارامترهای ساخت از طریق KConfig
بیایید راه اندازی را شروع کنیم:
make menuconfig
پنجره KConfig باز می شود. امکان پیکربندی با یک رابط گرافیکی وجود دارد (ایجاد nconfig، ساخت xconfig، ساخت gconfig):
وارد قسمت اول Target Options می شویم. در اینجا می توانید معماری هدفی را که ساخت برای آن انجام می شود انتخاب کنید.
گزینه های ساخت - تنظیمات ساخت مختلفی در اینجا وجود دارد. میتوانید فهرستهایی را با کدهای منبع، تعداد رشتههای ساخت، آینههایی برای دانلود کدهای منبع و تنظیمات دیگر مشخص کنید. بیایید تنظیمات را در حالت پیش فرض قرار دهیم.
Toolchain – خود ابزارهای ساخت در اینجا پیکربندی می شوند. درباره او بیشتر بخوانید.
نوع زنجیره ابزار – نوع زنجیره ابزار مورد استفاده. این می تواند یک Toolchain ساخته شده در buildroot یا یک ابزار خارجی باشد (شما می توانید دایرکتوری را با پوشه از قبل ساخته شده یا آدرس اینترنتی برای دانلود مشخص کنید). گزینه های اضافی برای معماری های مختلف وجود دارد. برای مثال، برای بازو میتوانید به سادگی نسخه Linaro زنجیره ابزار خارجی را انتخاب کنید.
کتابخانه C – انتخاب کتابخانه C. عملکرد کل سیستم به این بستگی دارد. معمولاً از glibc استفاده می شود که از همه عملکردهای ممکن پشتیبانی می کند. اما ممکن است برای یک سیستم تعبیه شده خیلی بزرگ باشد، بنابراین اغلب uglibc یا musl انتخاب می شوند. ما glibc را انتخاب می کنیم (این مورد بعداً برای استفاده از systemd مورد نیاز خواهد بود).
سری هدرهای هسته و سرصفحه های کرنل سفارشی – باید با نسخه هسته ای که در سیستم مونتاژ شده قرار دارد مطابقت داشته باشند. برای هدرهای هسته، می توانید مسیر مخزن tarball یا git را نیز مشخص کنید.
نسخه های کامپایلر GCC - نسخه کامپایلر مورد استفاده برای ساخت را انتخاب کنید
پشتیبانی از C++ را فعال کنید – برای ساخت با پشتیبانی از کتابخانه های C++ در سیستم انتخاب کنید. این در آینده برای ما مفید خواهد بود.
گزینه های اضافی gcc - می توانید گزینه های کامپایلر اضافی را تنظیم کنید. فعلا بهش نیاز نداریم
پیکربندی سیستم به شما امکان می دهد پارامترهای آینده سیستم ایجاد شده را تنظیم کنید:
بیشتر نکات از عنوان مشخص است. بیایید به نکات زیر توجه کنیم:
مسیر به جداول کاربران - جدول با کاربرانی که باید ایجاد شود (
فایل نمونه. کاربر کاربر با رمز عبور admin، به طور خودکار gid/uid، /bin/sh shell، کاربر پیشفرض گروه، ریشه عضو گروه، کاربر Foo ایجاد میشود.
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
دایرکتوری های همپوشانی سیستم فایل ریشه - دایرکتوری که در بالای target-fs مونتاژ شده قرار گرفته است. فایل های جدید اضافه می کند و فایل های موجود را جایگزین می کند.
اسکریپت های سفارشی برای اجرا قبل از ایجاد تصاویر سیستم فایل - اسکریپت هایی که بلافاصله قبل از تا کردن فایل سیستم در تصاویر اجرا می شوند. بیایید اسکریپت را فعلا خالی بگذاریم.
بیایید به بخش Kernel برویم
تنظیمات هسته در اینجا تنظیم شده است. خود هسته از طریق make linux-menuconfig پیکربندی شده است.
شما می توانید نسخه هسته را به روش های مختلف تنظیم کنید: از بین موارد ارائه شده انتخاب کنید، نسخه را به صورت دستی وارد کنید، یک مخزن یا یک تاربال آماده را مشخص کنید.
پیکربندی هسته - مسیر به پیکربندی هسته. می توانید پیکربندی پیش فرض را برای معماری انتخاب شده یا defocnfig از لینوکس انتخاب کنید. منبع لینوکس شامل مجموعهای از تنظیمات defconfig برای سیستمهای هدف مختلف است. شما می توانید مورد نیاز خود را پیدا کنید
بخش Target packages به شما این امکان را می دهد که انتخاب کنید کدام بسته ها روی سیستم در حال ساخت نصب شوند. فعلاً آن را بدون تغییر بگذاریم. ما بعداً بسته های خود را به این لیست اضافه خواهیم کرد.
تصاویر سیستم فایل - لیستی از تصاویر سیستم فایل که جمع آوری می شوند. یک تصویر iso اضافه کنید
بوت لودرها - انتخابی از بوت لودرها برای جمع آوری. بیایید ایزولینیکس را انتخاب کنیم
پیکربندی Systemd
Systemd در کنار هسته و glibc در حال تبدیل شدن به یکی از ارکان لینوکس است. بنابراین، تنظیمات آن را به یک مورد جداگانه منتقل کردم.
از طریق make menuconfig، سپس Target packages → System tools → systemd پیکربندی شده است. در اینجا می توانید مشخص کنید که کدام سرویس های systemd با راه اندازی سیستم نصب و راه اندازی شوند.
ذخیره پیکربندی سیستم
ما این پیکربندی را از طریق KConfig ذخیره می کنیم.
سپس defconfig ما را ذخیره کنید:
make savedefconfig
پیکربندی هسته لینوکس
پیکربندی هسته لینوکس با دستور زیر فراخوانی می شود:
make linux-menuconfig
بیایید پشتیبانی از کارت گرافیک Virtualbox را اضافه کنیم
بیایید پشتیبانی Virtualbox Guest را اضافه کنیم
ذخیره و خروج. مهم: پیکربندی در output/build/linux-$version/config ذخیره خواهد شد، اما نه در board/my_x86_board/linux.config
بنابراین، باید پیکربندی را به صورت دستی در یک مکان ذخیره سازی کپی کنید:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
پس از آن ما یک مونتاژ مجدد کامل کل سیستم را انجام خواهیم داد. buildroot آنچه قبلا ساخته شده را بازسازی نمی کند، شما باید به صورت دستی بسته هایی را برای بازسازی مشخص کنید. برای اینکه زمان و اعصاب را هدر ندهید، بازسازی یک سیستم کوچک به طور کامل آسان تر است:
make clean;make
پس از اتمام ساخت، VirtualBox (تست شده در نسخههای 5.2 و 6.0) را در حال راهاندازی از CD راهاندازی کنید. پارامترهای سیستم:
اجرا از ISO مونتاژ شده:
لیست مواد استفاده شده
- کتابچه راهنمای بیلد روت
منبع: www.habr.com