ما هو rpi-image-gen?
rpi-image-gen هو إطار عمل خفيف الوزن وقابل للبرمجة النصية لتوليد Raspberry Pi OS-الصور المستندة إلى نظام الجذر. يأخذ نظام ملفات جذر أساسي (Raspberry Pi OS لايت أو كامل) ويطبق تخصيصات متعددة الطبقات لإنتاج ملف .img جاهز للفلاش.
وهو في جوهره عبارة عن سير عمل dd قابل للتكرار - مؤتمت ومضبوط الإصدار وقابل للتكوين بدرجة كبيرة.
لماذا تستخدمه؟
على عكس Yocto أو Buildroot, rpi-image-gen لا يعيد بناء الحزم من المصدر. وبدلاً من ذلك، فإنه يستفيد من حزم دبيان الثنائية والبنية التحتية Raspberry Pi الموجودة. هذا يسمح لك ب:
- إضافة ملفات التكوين والخدمات والمستخدمين
- تمكين أو تعطيل وحدات Systemd
- التثبيت المسبق للتطبيقات والتبعيات
- تضمين مفاتيح SSH وبيانات اعتماد Wi-Fi ومعرفات الأجهزة
إنها أسرع طريقة للانتقال من النموذج الأولي إلى الإنتاج، مع الحفاظ على التحكم الكامل في إعداد نظامك.
المفاهيم الأساسية
يتكون المشروع النموذجي rpi-image-gen المشروع النموذجي من المكونات التالية:
- الصورة الأساسية - الرسمية Raspberry Pi OS لايت
- دليل التراكب - الملفات والخدمات والبرامج النصية الإضافية الخاصة بك
- خطاطيف التخصيص - البرامج النصية قبل وبعد حقن نظام الملفات
- تكوين الإنشاء - تحديد الجذور وأقسام الإقلاع والتخطيط وعلامات الإصدار
تنتج هذه العناصر معاً صورة متسقة وقابلة للتمهيد وجاهزة للتزويد.
التركيب
اتبع تعليمات التثبيت على 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/CDD وقابلية التكرار
بمجرد أن تصبح البرامج النصية للبناء حتمية، يمكنك الدمج rpi-image-gen في خط أنابيب CI/CD (على سبيل المثال: GitHub Actions ، GitLab CI ، Jenkins).
تنتج كل عملية بناء قطعة أثرية يمكن تتبعها وإصدارها، مما يتيح تحديثات موثوقة وتصحيح الأخطاء بشكل أسهل - وهي خطوة حاسمة نحو النشر على مستوى الإنتاج.
مقالات في هذه السلسلة
- Building a Production-Ready Linux for Raspberry Pi Compute Module 5
- من نظام تشغيل المخزون إلى منصة الإنتاج
- التخصيص Raspberry Pi OS مع rpi-image-gen
- متانة النظام - تصميم تخطيط نظام ملفات الجذر A/B
- Provisioning — Automating First Boot with rpi-sb-provisioner
- OTA and Lifecycle — Software Updates with 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