为什么要进行 A/B 分区?
在嵌入式系统中,更新失败会导致设备损坏。A/B 布局通过维护两个根文件系统来解决这个问题:
- 插槽 A - 活动 rootfs
- 插槽 B - 用于下一次更新的备用 rootfs
更新成功后,引导加载程序会切换到新的插槽。如果启动失败,则会回滚到上一个已知的好版本。
这种方法的前提条件是插槽 A 和插槽 B 的分区大小相同,这在资源有限的嵌入式系统中有时会很棘手。
另一种方法是为小型救援系统创建分区,为正常运行的系统创建更大的分区。
分区布局示例
| 分区 | 类型 | 用途 |
|---|---|---|
| p1 | FAT32 | /boot_A(内核、cmdline、引导加载程序) |
| p2 | ext4 | rootfs A |
| p3 | FAT32 | /boot_B(内核、cmdline、救援系统引导程序) |
| p4 | ext4 | rootfs_B |
| p5 | ext4 | 数据/配置 |
实例
在两个 rpi-image-gen示例项目中演示:
- https://github.com/interelectronix/rpi-image-gen-projects/blob/main/deb12-cm5-rescue/README.md
- https://github.com/interelectronix/rpi-image-gen-projects/blob/main/deb12-cm5-ix-base/README.md
第一个操作是创建救援系统,第二个操作是将救援系统与另一个运行中的系统合并,在 cmdline.txt和 fstab.
管理更新
您可以手动挂载非活动系统分区,以更新配置、应用程序或系统组件。
对于生产系统,更新通常通过 SWUpdate来管理更新,它能安全地自动执行这一过程。
与 SWUpdate
SWUpdate本机支持双根目录(A/B)更新策略。
分区和更新逻辑直接在 sw-description文件中直接定义。
这种方法可确保原子系统更新,并具有内置的回滚安全性--这对于无法手动恢复的无头或远程设备来说是必不可少的功能。
资料来源
- 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