Skip to main content

Ano ang rpi-image-gen?

rpi-image-gen ay isang magaan, scriptable na balangkas para sa pagbuo ng mga imahe na nakabatay sa Raspberry Pi OS. Ito ay tumatagal ng isang base root filesystem (Raspberry Pi OS Lite o Full) at nag-aaplay layered pagpapasadya upang makabuo ng isang handa na-to-flash .img file.

Sa esensya, ito ay isang reproducible dd workflow - awtomatiko, kinokontrol ng bersyon, at lubos na mai-configure.

Bakit ito gagamitin?

Hindi tulad ng Yocto o Buildroot, hindi rpi-image-gen muling nagtatayo ng mga pakete mula sa pinagmulan. Sa halip, ginagamit nito ang mga binary package ng Debian at ang umiiral na imprastraktura ng Raspberry Pi . Pinapayagan ka nitong upang:

  • Magdagdag ng mga file ng pagsasaayos, serbisyo, at mga gumagamit
  • Paganahin o huwag paganahin ang mga systemd unit
  • Preinstall application at dependencies
  • I-embed ang mga susi ng SSH, mga kredensyal ng Wi-Fi, at mga ID ng aparato

Ito ang pinakamabilis na paraan upang pumunta mula sa prototype hanggang sa produksyon, habang pinapanatili ang ganap na kontrol sa iyong pag-setup ng system.

Mga pangunahing konsepto

Ang isang tipikal na proyekto ng rpi-image-gen ay binubuo ng mga sumusunod na bahagi:

  • Base image — ang opisyal na Raspberry Pi OS Lite
  • Direktoryo ng overlay - ang iyong karagdagang mga file, serbisyo, at script
  • Mga kawit ng pagpapasadya - mga script ng iniksyon bago at pagkatapos ng filesystem
  • Bumuo ng pagsasaayos - pagtukoy sa mga rootf, boot partition, layout, at mga tag ng bersyon

rpi-image-gen scheme

Sama-sama, ang mga elementong ito ay gumagawa ng isang pare-pareho, bootable na imahe na handa na para sa paglalaan.

Pag-install

Halimbawa

Ang isang tipikal na proyekto ay maaaring magmukhang ganito:

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

Ang pinakamahalagang mga file ay ang mga file ng pagsasaayos ng YAML - tinutukoy nito kung aling mga pakete, file, at setting ang kasama sa nabuong imahe.

Halimbawa ng Pagsasaayos

config / deb12-cm5-min-desktop.yaml - tumutukoy sa mga pandaigdigang parameter tulad ng hostname, mga kredensyal ng gumagamit, laki ng partisyon, at mga susi ng 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: y

layer / packages.yaml - naglilista ng mga pakete ng software, mga file ng pagsasaayos, at pasadyang mga karagdagan, tulad ng isang application 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"

Para sa isang kumpletong halimbawa ng pagtatrabaho, tingnan ang: https://github.com/interelectronix/rpi-image-gen-projects/tree/main/deb12-cm5-min-desktop

Bumuo ng utos

Upang bumuo ng larawan, patakbuhin:

rpi-image-gen build -S path-to-project-folder -c deb12-cm5-min-desktop.yaml

CI / CD at reproducibility

Kapag deterministiko na ang iyong mga script ng pagbuo, maaari mong isama rpi-image-gen sa isang pipeline ng CI / CD (hal., GitHub Actions, GitLab CI, Jenkins).

Ang bawat build ay gumagawa ng isang traceable, versioned artifact, na nagpapagana ng maaasahang mga update at mas madaling pag-debug - isang mahalagang hakbang patungo sa pag-deploy ng grade-production.