ساخت image سفارشی برای Raspberry Pi با ابزار Packer

لوگوی Packer از HashiCorpابزار Packer یکی از ابزارهایی است که برای ساخت image بر روی سکوی سیستم عامل ها استفاده می‌شود و به راحتی می‌توان در زیر ساخت برنامه های مدرن استفاده کرد. نکته جالب توجه ابزار این است که بصورت Open source (قابل استفاده بصورت Free) است و plugin های مختلف را می‌توان روی آن اعمال کرد. Packer به گونه‌ای عمل می‌کند که می‌توان از plugin های سفارشی شده برای بهتر کردن قابلیت های کلی هم استفاده کرد حتی بدون اینکه source code اصلی آن تغییری کند. بصورت کلی plugin های Packer به دو صورت است:بیلدرها (Builders): که برای راه اندازی زیرساخت استفاده می‌شود.تامین کننده ها (Provisioners): که برای اعمال کردن تغییرات دلخواه به image سیستم عامل استفاده می‌شود.پلاگین (plugin) Packer برای معماری های ARMبصورت پیش فرض Packer ساخت image سیستم عامل های مبتنی بر ARM را پشتیبانی نمی‌کند و ما در این مقاله از plugin به نام solo-io/packer-builder-arm-image که از طریق GitHub در دسترس است، برای ساخت image های مبتنی بر ARM استفاده می‌کنیم.مقدماتبا توجه به مستندات solo-io/packer-builder-arm-image، برای ساخت image های مبتنی بر ARM همانند Raspberry Pi پیش نیازها و باینری هایی نیاز است:یک هاست یا ماشین لینوکسی، ترجیحا Ubuntu نسخه های LTSگیت Gitابزار Packerپلاگین Packer برای معماری ARMبا کامند زیر باینری ها و پیش نیازها را نصب کنید:sudo apt update sudo apt install git wget zip unzip build-essential kpartx qemu binfmt-support qemu-user-static e2fsprogs dosfstoolsدر ادامه Packer را بر روی ماشین خود دانلود و نصب کنید: (دقت به ورژنی که نصب می‌کنید داشته باشید!)export PACKER_RELEASE=&quot1.6.6&quot cd /tmp/ wget https://releases.hashicorp.com/packer/${PACKER_RELEASE}/packer_${PACKER_RELEASE}_linux_amd64.zip unzip packer_${PACKER_RELEASE}_linux_amd64.zip sudo mv packer /usr/local/bin packer --versionو یا برای دانلود و نصب بهتر است به مستندات اصلی خود سایت مراجعه کنید.در این موقعیت، شما Packer و پیش نیازها برای ساخت image بر روی معماری ARM را نصب کرده اید. حال زمان آن رسیده است که plugin ابزار Packer برای ساخت رو معماری ARM را نصب کنید: (دقت به ورژنی که نصب می‌کنید داشته باشید!)export PACKER_ARM_BUILDER_VERSION=&quot0.1.6&quot cd /tmp/ wget https://github.com/solo-io/packer-builder-arm-image/releases/download/v${PACKER_ARM_BUILDER_VERSION}/packer-builder-arm-image sudo mv packer-builder-arm-image /usr/local/bin sudo chmod +x /usr/local/bin/packer-builder-arm-imageساخت image برای Raspberry Pi با Packer ARM Pluginبرای فهمیدن اینکه پلاگین solo-io/packer-builder-arm-image چگونه کار می‌کند، یک نمونه ساده و ابتدایی از آن در GitHub قرار دارد که ریپازیتوری source4learn/raspberry-pi-os-image-builder است:git clone git@github.com:source4learn/raspberry-pi-os-image-builder.git cd raspberry-pi-os-image-builderدر این ریپازیتوری یک فایل اصلی JSON برای تنظیم کردن Packer، تعدادی اسکریپت Bash و فایل های تنظیماتی دیگری قرار دارد.در این مقاله ما از Raspberry Pi Lite Buster image استفاده می‌کنیم و یک splash screen سفارشی را هنگام بالا آمدن درست می‌کنیم. این ورژن از Raspberry Pi هیچگونه محیط گرافیکی ندارد بنابراین ما درایوهای گرافیکی و Linux xserver را نصب نکردیم.قبل از اینکه سراغ ساخت image برای Raspberry Pi بریم، بیایید با هم فایل JSON را بررسی کنیم:{ &quotvariables&quot: { &quotvariable_key&quot : &quotvariable_value&quot }, &quotbuilders&quot: [ { &quottype&quot: &quotarm-image&quot, &quotiso_url&quot: &quot<image-url>&quot, &quotiso_checksum&quot: &quot<image-checksum>&quot, &quottarget_image_size&quot: <image-size-in-Kb> } ], &quotprovisioners&quot: [ { &quottype&quot: &quotfile&quot, &quotsource&quot: &quot<source_file_path>&quot, &quotdestination&quot: &quot<destination_file_path>&quot }, { &quottype&quot: &quotshell&quot, &quotinline&quot: [ <commands_to_execute> ] }, { &quottype&quot: &quotshell&quot, &quotscript&quot: &quot<shell_path_to_execute>&quot } ] }این فایل JSON سه بخش کلی و مهم دارد، اولی variables، دومی builder و سومی provisioner است.در بخش variables، ما متغیرها را بصورت کلید-مقدار (key-value) مشخص و اعمال می‌کنیم. بخش builder حاوی نوع سازنده ما، URL به فایل ISO image ما، مقدار Checksum برای ISO image ما اندازه image معماری ARM ما برای ساخت. بخش آخر یعنی provisioner شامل مجموعه اعمالاتی می‌شود که ما بر روی ایمیج ARM اعمال می‌کنیم. مقادیر متداول بخش provisioner ما شامل shell inline، file و shell است. پارامتر file یک فایل انتخابی را وارد ISO image ما می‌کند، shell اجازه می‌دهد که اسکریپت BASH را اعمال کنیم و shell inline هم به ما اجازه می‌دهد که کامندهای inline را اجرا کنیم.فایل packer-raspberry-pi-os-lite.json در زیر آمده است:{ &quotvariables&quot: { }, &quotbuilders&quot: [ { &quottype&quot: &quotarm-image&quot, &quotiso_url&quot: &quothttps://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-03-25/2021-03-04-raspios-buster-armhf-lite.zip&quot, &quotiso_checksum&quot: &quotsha256:ea92412af99ec145438ddec3c955aa65e72ef88d84f3307cea474da005669d39&quot, &quottarget_image_size&quot: 2147483648 } ], &quotprovisioners&quot: [ { &quottype&quot: &quotfile&quot, &quotsource&quot: &quot./rasp.png&quot, &quotdestination&quot: &quot/home/pi/rasp.png&quot }, { &quottype&quot: &quotfile&quot, &quotsource&quot: &quot./scripts/.bash_profile&quot, &quotdestination&quot: &quot/home/pi/.bash_profile&quot }, { &quottype&quot: &quotfile&quot, &quotsource&quot: &quot./scripts/.xinitrc&quot, &quotdestination&quot: &quot/home/pi/.xinitrc&quot }, { &quottype&quot: &quotfile&quot, &quotsource&quot: &quot./scripts/splashscreen.service&quot, &quotdestination&quot: &quot/etc/systemd/system/splashscreen.service&quot }, { &quottype&quot: &quotshell&quot, &quotinline&quot: [ &quotecho 'Install APT Packages'&quot, &quotecho nameserver 8.8.8.8 > /etc/resolv.conf&quot, &quotapt-get update&quot, &quotapt-get -y install --no-install-recommends xserver-xorg-video-all xserver-xorg-input-all xserver-xorg-core xinit x11-xserver-utils fbi curl&quot, &quotrm -f /etc/motd&quot, &quotchown pi:pi -R /home/pi/&quot ] }, { &quottype&quot: &quotshell&quot, &quotscript&quot: &quot./scripts/run.sh&quot } ] }در ادامه کامند مخصوص ساخت image را در دیرکتوری raspberry-pi-os-image-builder اعمال کنیم:sudo packer build packer-raspberry-pi-os-lite.jsonاین عمل ممکن است مقدار زمان ببرد تا کامل شود. بعد از پایان عمل یک فایل نهایی output-arm-image/image را بدست می‌آورید. با انجام عملیات زیر می‌توانید مکان قرار فایل و اندازه را محاسبه کنید:# Check file location ls -la output-arm-image/image # Check file size du -hs output-arm-image/imageهمچنین در آخر هم می‌توانید فایل را فشرده سازی کنید:zip -r rpi-arm-image.zip output-arm-image/imageدر آخر هم فایل شما آماده است و می‌توانید SD کارت خود را آماده کنید و عملیات boot up را انجام دهید.در این مقاله ما پلاگین Packer که مبتنی بر ARM است و نام آن solo-io/packer-builder-arm-image است استفاده کردیم. پلاگین جایگزین دیگری هم برای اینکار وجود دارد که نام آن kaczanowski/packer-builder-arm است و امکانات اضافه ای همانند افزایش حجم disk و یا ساخت image مبتنی بر ARM از پایه را به ما می‌دهد.این مقاله ترجمه بخشی از مقاله ای است که در medium قرار دارد و نویسنده آن Source4learn است، می‌باشد. امیدوارم این مقاله برای شما کابردی بوده باشد و چیزی یاد گرفته باشید. :)