rpi-image-genچیست؟
rpi-image-gen یک چارچوب سبک و قابل اسکریپت برای تولید تصاویر مبتنی بر Raspberry Pi OSاست. این سیستم یک سیستم فایل ریشه پایه (Raspberry Pi OS Lite یا Full) را می گیرد و با اعمال سفارشی سازی های لایه ای، یک فایل .img آماده فلش تولید می کند.
در اصل، این یک روند کاری dd قابل تکرار است — خودکار، نسخه کنترل شده و بسیار قابل تنظیم.
چرا از آن استفاده کنیم؟
برخلاف Yocto یا Buildroot، rpi-image-gen بسته ها را از منبع بازسازی نمی کند. در عوض، از بسته های دودویی دبیان و زیرساخت Raspberry Pi موجود بهره می برد. این امکان را به شما می دهد:
- افزودن فایل های پیکربندی، خدمات و کاربران
- فعال یا غیرفعال کردن واحدهای سیستم دار
- برنامه ها و وابستگی های پیش نصب
- جاسازی کلیدهای SSH، اطلاعات ورود وای فای و شناسه های دستگاه
این سریع ترین راه برای رفتن از نمونه اولیه به تولید است، در حالی که کنترل کامل روی تنظیمات سیستم خود را حفظ می کنید.
مفاهیم اصلی
یک پروژه rpi-image-gen معمولی شامل اجزای زیر است:
- تصویر پایه — نسخه رسمی Raspberry Pi OS Lite
- پوشه پوششی — فایل ها، سرویس ها و اسکریپت های اضافی شما
- قلاب های سفارشی سازی — اسکریپت های تزریق سیستم فایل قبل و بعد از
- پیکربندی ساخت — تعریف ریشه ها، پارتیشن های بوت، چیدمان و برچسب های نسخه
این عناصر با هم تصویری منسجم و قابل بوت شدن ایجاد می کنند که آماده تأمین است.
نصب
دستورالعمل های نصب را در https://github.com/raspberrypi/rpi-image-genدنبال کنید.
مثال
یک پروژه معمولی ممکن است این گونه باشد:
deb12-cm5-min-desktop
├── README.md
├── config
│ └── deb12-cm5-min-desktop.yaml
├── device
│ ├── cm5-device.yaml
│ └── rootfs-overlay
│ ├── etc
│ │ ├── lightdm
│ │ └── skel
│ └── usr
│ └── local
└── layer
├── image
│ └── simple-dual-nosparse
│ ├── bdebstrap
│ ├── device
│ ├── genimage.cfg.in.btrfs
│ ├── genimage.cfg.in.ext4
│ ├── image.yaml
│ ├── mke2fs.conf
│ ├── pre-image.sh
│ └── setup.sh
└── packages.yamlمهم ترین فایل ها فایل های پیکربندی YAML هستند — این فایل ها مشخص می کنند کدام بسته ها، فایل ها و تنظیمات در تصویر تولیدشده گنجانده شده اند.
مثال پیکربندی
config/deb12-cm5-min-desktop.yaml — پارامترهای سراسری مانند نام میزبان، اطلاعات ورود کاربر، اندازه پارتیشن ها و کلیدهای SSH را تعریف می کند:
device:
layer: cm5-device
hostname: cm5-dev
user1: pi
user1pass: StrongPass!1
image:
layer: image-rpios-nosparse
rootfs_type: ext4
boot_part_size: 512M
root_part_size: 4G
compression: zstd
name: deb12-cm5-min-desktop
layer:
custom: base-packages
ssh:
pubkey_user1: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB" # your custom public key
pubkey_only: ylayer/packages.yaml — بسته های نرم افزاری، فایل های پیکربندی و افزودنی های سفارشی مانند برنامه Qt را فهرست می کند:
# METABEGIN
# X-Env-Layer-Name: base-packages
# X-Env-Layer-Desc: Installs base packages
# for sw development.
# X-Env-Layer-Version: 1.0.0
# X-Env-Layer-Requires: debian-bookworm-arm64-multi,
# rpi-debian-bookworm,
# rpi-misc-utils,
# rpi-essential-base,
# rpi-misc-skel,
# rpi-user-credentials,
# systemd-net-min,
# fake-hwclock,
# openssh-server
# METAEND
---
mmdebstrap:
setup-hooks:
- echo "hello - no setup-hooks in base-packages"
packages:
# Firmware to enable SHIFT boot manager and EEPROM maintenance
- raspberrypi-bootloader
- rpi-eeprom
- raspberrypi-ui-mods
- lightdm
- lightdm-gtk-greeter
- labwc
- wf-panel-pi
- lxsession
- lxpanel
- pcmanfm
- lxterminal
- gvfs
- xserver-xorg
- xwayland
- wayland-utils
- wlr-randr
- x11-xserver-utils
- xdg-user-dirs
- xdg-utils
- policykit-1
# helper and utilities
- bash
- sudo
- vim-tiny
- less
- nano
- network-manager
- bash-completion
# library manager
- libinput10
- libinput-bin
- libinput-dev
# sqlite
- sqlite3
- libsqlite3-0
- libsqlite3-dev
customize-hooks:
- echo "hello - customize-hooks in base-packages"
- $BDEBSTRAP_HOOKS/enable-units "$1" lightdm
- sed "s|alias ls='ls --color=auto'|alias ll='ls -al --color=auto'|" /home/$IGconf_device_user1/.bashrc > $1/home/$IGconf_device_user1/.bashrc
- uchroot $1 'mkdir -m 0700 -p ${HOME}/.config/labwc'
- cp "${IGconf_device_assetdir}/rootfs-overlay/etc/skel/.config/labwc/autostart" "$1/home/$IGconf_device_user1/.config/labwc/autostart"
- cp "${IGconf_device_assetdir}/rootfs-overlay/etc/skel/.config/labwc/environment" "$1/home/$IGconf_device_user1/.config/labwc/environment"
- cp "${IGconf_device_assetdir}/rootfs-overlay/etc/skel/.config/labwc/rc.xml" "$1/home/$IGconf_device_user1/.config/labwc/rc.xml"
- chown "${IGconf_device_user1}:${IGconf_device_user1}" "$1/home/$IGconf_device_user1/.config/labwc/autostart"
- chown "${IGconf_device_user1}:${IGconf_device_user1}" "$1/home/$IGconf_device_user1/.config/labwc/environment"
- chown "${IGconf_device_user1}:${IGconf_device_user1}" "$1/home/$IGconf_device_user1/.config/labwc/rc.xml"برای یک مثال کامل کاری، نگاه کنید به: https://github.com/interelectronix/rpi-image-gen-projects/tree/main/deb12-cm5-min-desktop
دستور ساخت
برای ساختن تصویر، این ها را اجرا کنید:
rpi-image-gen build -S path-to-project-folder -c deb12-cm5-min-desktop.yamlCI/CD و تکرارپذیری
وقتی اسکریپت های ساخت شما قطعی شدند، می توانید rpi-image-gen را در یک خط لوله CI/CD ادغام کنید (مثلا GitHub Actions، GitLab CI، Jenkins).
هر نسخه یک آرتیفکت قابل ردیابی و نسخه گذاری شده تولید می کند که امکان به روزرسانی های قابل اعتماد و اشکال زدایی آسان تر را فراهم می کند — گامی حیاتی به سوی استقرار در سطح تولید.
مقالات این مجموعه
- <a href="https://www.interelectronix.com/index%2Ephp/fa/sakht-yk-linux-amadh-twlyd-bray-raspberry-pi-compute-module-5.html" title="Building a Production-Ready لینوکس برای Raspberry Pi Compute Module 5«>ساخت یک Linux آماده تولید برای Raspberry Pi Compute Module 5
- از سیستم عامل استاندارد تا پلتفرم تولید
- سفارشی سازی Raspberry Pi OS با rpi-image-gen
- پایداری سیستم — طراحی چیدمان سیستم فایل ریشه A/B
- Provisioning — خودکارسازی اولین بوت با rpi-sb-provisioner
- OTA و چرخه عمر — به روزرسانی های نرم افزاری با SWUpdate
منابع
- rpi-image-gen: https://github.com/raspberrypi/rpi-image-gen
- rpi-sb-provisioner: https://github.com/raspberrypi/rpi-sb-provisioner
- SWUpdate: https://github.com/sbabic/swupdate
- swugenerator: https://github.com/sbabic/swugenerator