rpi-image-genlà gì?
rpi-image-gen là một framework nhẹ, có thể viết kịch bản để tạo hình ảnh dựa trên Raspberry Pi OS. Nó lấy một hệ thống tệp gốc cơ sở (Raspberry Pi OS Lite hoặc Full) và áp dụng các tùy chỉnh phân lớp để tạo ra một tệp .img sẵn sàng flash.
Về bản chất, đó là một quy trình làm việc dd có thể tái tạo — tự động, kiểm soát phiên bản và có thể cấu hình cao.
Tại sao sử dụng nó?
Không giống như Yocto hoặc Buildroot, rpi-image-gen không xây dựng lại các gói từ nguồn. Thay vào đó, nó tận dụng các gói nhị phân của Debian và cơ sở hạ tầng Raspberry Pi hiện có. Điều này cho phép bạn:
- Thêm tệp cấu hình, dịch vụ và người dùng
- Bật hoặc tắt các đơn vị systemd
- Cài đặt sẵn các ứng dụng và phần phụ thuộc
- Nhúng khóa SSH, thông tin đăng nhập Wi-Fi và ID thiết bị
Đó là cách nhanh nhất để chuyển từ nguyên mẫu sang sản xuất, trong khi vẫn giữ toàn quyền kiểm soát thiết lập hệ thống của bạn.
Khái niệm cốt lõi
Một dự án rpi-image-gen điển hình bao gồm các thành phần sau:
- Hình ảnh cơ sở — Raspberry Pi OS Lite chính thức
- Thư mục lớp phủ — các tệp, dịch vụ và tập lệnh bổ sung của bạn
- Hook tùy chỉnh — tập lệnh chèn hệ thống tệp trước và sau
- Cấu hình bản dựng — xác định rootf, phân vùng khởi động, bố cục và thẻ phiên bản
Cùng với nhau, các yếu tố này tạo ra một hình ảnh nhất quán, có thể khởi động và sẵn sàng để cung cấp.
Lắp ráp
Làm theo hướng dẫn cài đặt tại https://github.com/raspberrypi/rpi-image-gen.
Ví dụ
Một dự án điển hình có thể trông như thế này:
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.yamlCác tệp quan trọng nhất là các tệp cấu hình YAML — chúng xác định các gói, tệp và cài đặt nào được bao gồm trong hình ảnh được tạo.
Cấu hình Example
config/deb12-cm5-min-desktop.yaml — xác định các tham số toàn cầu như tên máy chủ, thông tin đăng nhập người dùng, kích thước phân vùng và khóa 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 — liệt kê các gói phần mềm, tệp cấu hình và các bổ sung tùy chỉnh, chẳng hạn như ứng dụng 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"Để có một ví dụ làm việc đầy đủ, hãy xem: https://github.com/interelectronix/rpi-image-gen-projects/tree/main/deb12-cm5-min-desktop
Lệnh xây dựng
Để tạo hình ảnh, hãy chạy:
rpi-image-gen build -S path-to-project-folder -c deb12-cm5-min-desktop.yamlCI / CD và khả năng tái tạo
Khi các tập lệnh xây dựng của bạn là xác định, bạn có thể tích hợp rpi-image-gen vào quy trình CI/CD (ví dụ: GitHub Actions, GitLab CI, Jenkins).
Mỗi bản dựng tạo ra một cấu phần phần mềm có thể theo phiên bản, cho phép cập nhật đáng tin cậy và gỡ lỗi dễ dàng hơn — một bước quan trọng để triển khai cấp sản xuất.
Các bài viết trong loạt bài này
- Xây dựng một Linux sẵn sàng sản xuất cho Raspberry Pi Compute Module 5
- Từ hệ điều hành chứng khoán đến nền tảng sản xuất
- Tùy chỉnh Raspberry Pi OS với rpi-image-gen
- Tính mạnh mẽ của hệ thống — Thiết kế bố cục hệ thống tệp gốc A / B
- Provisioning — Tự động hóa Khởi động đầu tiên với rpi-sb-provisioner
- OTA và Lifecycle — Cập nhật phần mềm với SWUpdate
Nguồn
- 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