ابزار Packer یکی از ابزارهایی است که برای ساخت image بر روی سکوی سیستم عامل ها استفاده میشود و به راحتی میتوان در زیر ساخت برنامه های مدرن استفاده کرد. نکته جالب توجه ابزار این است که بصورت Open source (قابل استفاده بصورت Free) است و plugin های مختلف را میتوان روی آن اعمال کرد. Packer به گونهای عمل میکند که میتوان از plugin های سفارشی شده برای بهتر کردن قابلیت های کلی هم استفاده کرد حتی بدون اینکه source code اصلی آن تغییری کند. بصورت کلی plugin های Packer به دو صورت است:
پلاگین (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 پیش نیازها و باینری هایی نیاز است:
با کامند زیر باینری ها و پیش نیازها را نصب کنید:
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="1.6.6" 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="0.1.6" 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 را بررسی کنیم:
{ "variables": { "variable_key" : "variable_value" }, "builders": [ { "type": "arm-image", "iso_url": "<image-url>", "iso_checksum": "<image-checksum>", "target_image_size": <image-size-in-Kb> } ], "provisioners": [ { "type": "file", "source": "<source_file_path>", "destination": "<destination_file_path>" }, { "type": "shell", "inline": [ <commands_to_execute> ] }, { "type": "shell", "script": "<shell_path_to_execute>" } ] }
این فایل 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 در زیر آمده است:
{ "variables": { }, "builders": [ { "type": "arm-image", "iso_url": "https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-03-25/2021-03-04-raspios-buster-armhf-lite.zip", "iso_checksum": "sha256:ea92412af99ec145438ddec3c955aa65e72ef88d84f3307cea474da005669d39", "target_image_size": 2147483648 } ], "provisioners": [ { "type": "file", "source": "./rasp.png", "destination": "/home/pi/rasp.png" }, { "type": "file", "source": "./scripts/.bash_profile", "destination": "/home/pi/.bash_profile" }, { "type": "file", "source": "./scripts/.xinitrc", "destination": "/home/pi/.xinitrc" }, { "type": "file", "source": "./scripts/splashscreen.service", "destination": "/etc/systemd/system/splashscreen.service" }, { "type": "shell", "inline": [ "echo 'Install APT Packages'", "echo nameserver 8.8.8.8 > /etc/resolv.conf", "apt-get update", "apt-get -y install --no-install-recommends xserver-xorg-video-all xserver-xorg-input-all xserver-xorg-core xinit x11-xserver-utils fbi curl", "rm -f /etc/motd", "chown pi:pi -R /home/pi/" ] }, { "type": "shell", "script": "./scripts/run.sh" } ] }
در ادامه کامند مخصوص ساخت 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 است، میباشد. امیدوارم این مقاله برای شما کابردی بوده باشد و چیزی یاد گرفته باشید. :)