در این پست سعی خواهیم کرد تا یک نسخه ی ساده از یک image لینوکس را با استفاده از پروژه ی yocto ایجاد و آن را تست کنیم. در پست قبل در مورد معماری و مولفه های موجود در Yocto را مورد بررسی قرار دادیم. در آن پست گفته شد که معماری پروژه ی yocto شامل سه مولفه ی OE-core، bitbake و poky می شود. در ادامه به آموزش ساخت image لینوکس با الستفاده از Yokto می پردازیم.
با توجه به کاربرد روز افزون سیستم های IOT، خودرو های هوشمند و خانه های هوشمند یادگیری روش ایجاد یک Embedded لینوکس برای مهندسین حوزه ی کامپیوتر و برق الزامی شده است. با توجه به اینکه راه اندازی و ایجاد image های شخصی سازی شده ی لینوکس با پروزه ی yocto به راحتی انجام می شود در این پست سعی خواهیم کرد تا یک سناریوی ساده را به عنوان مثال پیش بریم.
مهارت های مورد نیاز برای ساخت image لینوکس با الستفاده از Yokto
- آشنایی مقدماتی با لینوکس (کار با ترمینال) و مفهوم سیستم های embedded
- آشنایی با برنامه نویسی و مفاهیم مرتبط با build و سیستم های پیکربندی
حداقل سیستم مورد نیاز:
- یک سیستم با سیستم عامل لینوکس (ترجیحاً ubuntu)
- حداقل ۱۰۰ گیگابایت حافظه ی دیسک خالی
- حداقل ۸ گیگابایت حافظه ی RAM
راه اندازی محیط توسعه:
ابتدا یک سیستم با مشخصات مشخص شده در بخش قبلی که دارای سیستم عامل لینوکس می باشد را آماده سازی کنید و سپس برای شروع کار ابزار ها و کتابخانه های مورد نیاز پروژه ی yocto را با اجرای دستورات زیر نصب کنید:
$ sudo apt update
$ sudo apt install build-essential chrpath cpio debianutils diffstat file gawk gcc \
git iputils-ping libacl1 liblz4-tool locales python3 python3-git python3-jinja2 \
python3-pexpect python3-pip python3-subunit socat texinfo unzip wget xz-utils zstd
$ locale --all-locales | grep en_US.utf8
علاوه بر این کتابخانه ها، برای ایجاد مستندات سیستم عامل می توانید کتابخانه های زیر را نیز نصب نمایید:
$ sudo apt install git librsvg2-bin locales make python3-saneyaml python3-sphinx-rtd-theme sphinx
و در صورتی که می خواهید این مستندات کاربری در PDF ایجاد شوند باید کتابخانه های زیر را نصب کنید:
$ sudo apt install fonts-freefont-otf latexmk tex-gyre texlive-fonts-extra texlive-fonts-recommended texlive-lang-all texlive-latex-extra texlive-latex-recommended texlive-xetex
جهت اینکه بتوانید پروژه ی yocto را build کنید باید نسخه ی نرم افزار های زیر را بر روی سیستم خود داشته باشد:
- Git نسخه ی ۱.۸.۳.۱ یا بیشتر
- Tar نسخه ی ۱.۲۸ یا بیشتر
- Python نسخه ی 3.8.0 یا بیشتر
- GNUMake نسخه ی 4.0 یا بیشتر
- Gcc نسخه ی ۸.۰ یا بیشتر
قبل از شروع توضیحی توضیح تکمیلی تری نسبت به poky و bitbake ارائه خواهیم داد:
Poky یک توزیع مرجع از پروژه Yocto است. در این زمینه، واژه "مرجع" به معنای "مثال" استفاده شده است.
برای ساخت image لینوکس در پروژه Yocto از Poky (شامل کرنل، سیستم و نرمافزارهای کاربردی) برای سختافزار هدف استفاده میکند. از نظر فنی، Poky یک مخزن ترکیبی از اجزای زیر است:
- BitBake
- OpenEmbedded Core
- meta-yocto-bsp
نکته:Poky شامل فایلهای باینری نیست، بلکه یک نمونه عملی از نحوه ساخت یک توزیع سفارشی لینوکس از کد منبع است.
تفاوت بین Poky و Yocto چیست؟
Yocto Project یک چارچوب (Framework) برای ساخت توزیعهای لینوکسی سفارشی است، در حالی که Poky یک توزیع مرجع (یا نمونه) در این چارچوب است که نحوه استفاده از Yocto را نشان میدهد.
Bitbake یکی از اجزای اصلی پروژه Yocto است. عملکرد آن اساساً مشابه make است. این ابزار یک زمانبند وظایف (Task Scheduler)است که کدهای ترکیبی از پایتون و اسکریپتهای شل را پردازش میکند.
کدی که پردازش میشود، وظایفی را تولید و اجرا میکند. این وظایف مجموعهای از مراحل هستند که بر اساس وابستگیهای کد به ترتیب اجرا میشوند.
Bitbake دستورالعملها(Recipeها)را خوانده و طبق آنها عمل میکند. این فرآیند شامل دریافت بستهها، ساخت آنها و ادغام نتایج در bootable image ها است.
همچنین، تمام وظایف در حال پردازش را ردیابی میکند تا از تکمیل صحیح آنها اطمینان حاصل کند، حداکثر استفاده را از منابع پردازشی ببرد و زمان ساخت را کاهش دهد، و همچنان قابل پیشبینی باقی بماند.
همچنین در پست قبل در مورد متادیتا نیز نکاتی گفته شد و در این پست به صورت دقیق تر می خواهیم در مورد meta-yocto-bsp توضیحاتی ارائه دهیم.
Board Support Package (BSP) یا بسته پشتیبانی برد، مجموعهای از اطلاعات است که نحوه پشتیبانی از یک دستگاه سختافزاری خاص، مجموعهای از دستگاهها یا یک پلتفرم سختافزاری را تعریف میکند.
BSP شامل اطلاعاتی درباره ویژگیهای سختافزاری دستگاه، پیکربندی کرنل و هرگونه درایور سختافزاری اضافی مورد نیاز است.
همچنین، این بسته فهرستی از اجزای نرمافزاری اضافی را که علاوه بر پشته نرمافزاری عمومی لینوکس برای ویژگیهای ضروری و اختیاری پلتفرم نیاز هستند، شامل میشود.
لایه meta-yocto-bsp در Poky چندین BSP مختلف را مدیریت میکند، از جمله Beaglebone، EdgeRouter و نسخههای عمومی سیستمهای ۳۲ بیتی و ۶۴ بیتیلینوکسی ارائه داده است.
روش build و تست یک نسخه ی ساده از پروژه ی yocto
گام اول: دانلود سورس کد Poky:
$ git clone git://git.yoctoproject.org/poky
گام دوم: به آخرین branch از نسخه ی release باید checkout کنید.
$ git checkout zeus
گام سوم: باید محیط توسعه را آماده سازی نمایید. برای این کار باید اسکریپت ‘oe-init-build-env’ را اجرا نمایید. در این اسکریپت محیط build پروژه ی yocto آماده سازی شده و مسیر اجرایی BitBake به متغیر محیطی سیستم عامل (PATH) اضافه می شود.
$ source poky/oe-init-build-env
در این جا build_dir یک پارامتر اختیاری می باشد که مشخص کننده مسیر قرار گیری خروجی فعالیت های مرتبط با build در آن قرار می گیرد و پس از اتمام فرآیند build نسخه ی نهایی image لینوکس ایجاد شده در این مسیر قرار خواهد گرفت. در صورتی که این پارامتر ارائه نشود خود اسکریپت oe-init-build-env یک دایرکتوری build را در دایکرتوری کنونی شما ایجاد کرده و داده های مربوطه را در آن قرار می دهد.
پس از اجرای این اسکریپ ترمینال به داخل دایرکتوری <build_dir> هدایت می شود. در این دایرکتوری دو فایل local.conf و bblayers.conf وجود دارد.
- local.conf این فایل شامل تنظیمات محلی و سفارشیسازیهای مربوط به بیلد است. برخی از مهمترین مقادیر پیکربندی در این فایل عبارتاند از:
- مکان خروجی بیلد (DL_DIR، TMPDIR و غیره)
- نوع معماری هدف (MACHINE)
- تعداد هستههای پردازشی مورد استفاده (PARALLEL_MAKE و BB_NUMBER_THREADS)
- فعالسازی ویژگیهای خاص مانند بستههای اضافی یا بهینهسازیها
- bblayers.conf این فایل لایههای موجود در بیلد را مشخص میکند. هر لایه حاوی دستورالعملها (Recipes)، تنظیمات و پیکربندیهای مربوط به نرمافزارها است. فایل bblayers.conf مسیرهای لایههای مختلف را تعریف میکند تا BitBake بتواند آنها را پردازش کند.
به طور خلاصه، local.conf تنظیمات مربوط به بیلد سیستم را مشخص میکند، در حالی که bblayers.conf تعیین میکند که کدام لایهها در فرآیند بیلد استفاده شوند.
گام چهارم: build کردن توزیع لینوکس مورد نظر
$ bitbake
به عنوان مثال:
$ time bitbake core-image-minimal
که در این خط فرمان، دستور time جهت اندازه گیری زمان اجرا، دستور bitbake جهت اجرای این ابزار و core-image-minimal پارمتر نوع image در خواستی را مشخص می کند.
در پروژه Yocto، انواع مختلفی از تصاویر پیشفرض وجود دارند که هر یک برای موارد استفاده خاصی طراحی شدهاند. برخی از رایجترین آنها عبارتاند از:
core-image-minimal
یک تصویر کوچک و پایه که فقط شامل اجزای ضروری برای بوت شدن دستگاه است.
برای تست کرنل و بوتلودر مفید است.
core-image-base
نسخهای گسترشیافته از core-image-minimal با ابزارها و ویژگیهای بیشتر که کاربردیتر است.
مناسب برای توسعه سیستمهای نهفته (Embedded Systems).
core-image-full-cmdline
- دارای یک محیط کامل خط فرمان همراه با ابزارهای اضافی و قابلیتهای اشکالزدایی.
- برای سیستمهایی که به یک محیط خط فرمان پیشرفته نیاز دارند، مناسب است.
core-image-sato
- یک تصویر گرافیکی سبکوزن که شامل رابط کاربری Sato است (طراحیشده برای صفحهنمایشهای لمسی کوچک).
- مناسب برای تست رابط کاربری در سیستمهای نهفته.
core-image-weston
- یک محیط گرافیکی مبتنی بر Wayland را با استفاده از Weston compositor ارائه میدهد.
- برای توسعه رابط کاربری گرافیکی مدرن در لینوکس نهفته استفاده میشود.
core-image-x11
- دارای یک محیط گرافیکی مبتنی بر X11 است.
- برای اجرای برنامههایی که به X11 نیاز دارند (بهجای Wayland)، مفید است.
core-image-lsb
- تصویری مطابق با استاندارد LSB (Linux Standard Base) که سازگاری با برنامههای تأیید شده توسط LSB را تضمین میکند.
core-image-rt
یک تصویر لینوکس بلادرنگ (Real-Time) که با کرنل بلادرنگ پیشگیرانه (Preemptive RT Kernel) ساخته شده است.
در برنامههای صنعتی و حیاتی که نیاز به تأخیر کم دارند، استفاده میشود.
core-image-tiny
- یک تصویر بسیار کوچک که حتی کوچکتر از core-image-minimal است.
- معمولاً برای سیستمهای لینوکس مبتنی بر میکروکنترلر استفاده میشود.
تست image ایجاد شده با استفاده از qemu:
QEMU(Quick Emulator) یک نرمافزار رایگان و opensource است که مجازیسازی سختافزار را انجام میدهد. ماشینهای مبتنی بر QEMUامکان تست و توسعه را بدون نیاز به سختافزار واقعی فراهم میکنند.در حال حاضر، شبیهسازی برای معماریهای زیر در این نرم افزار پشتیبانی میشود:
- ARM
- MIPS
- MIPS64
- PowerPC
- X86
- X86_64
Poky یک اسکریپت به نام runqemu ارائه میدهد که به شما امکان میدهد QEMU را با استفاده از imageهای ساختهشده در Yocto اجرا کنید.فرمت اجرای این اسکریپت به شکل زیر است:
$ runqemu
پارامترها:
- <machine>: مشخصکننده نوع ماشین یا معماری مورد استفاده (مانند qemuarm، qemumips، qemuppc، qemux86، qemux86-64)
- <image>:مسیر کرنل مورد استفاده (مثلاً zimage-qemuarm.bin)
- <filesystem>:مسیر یک فایل سیستم ext2 (مثلاً filesystem-qemuarm.ext2)یا یک دایرکتوری NFS
به عنوان مثال:
$ runqemu qemux86-64 core-image-minimal
حال که نحوه ساخت image لینوکس با Yokto را یاد گرفتید، می توانید از دیگر مقالات سایت ایوولرن دیدن کنید.