跳转到主要内容

为什么要进行 A/B 分区?

在嵌入式系统中,更新失败会导致设备损坏。A/B 布局通过维护两个根文件系统来解决这个问题:

  • 插槽 A - 活动 rootfs
  • 插槽 B - 用于下一次更新的备用 rootfs

更新成功后,引导加载程序会切换到新的插槽。如果启动失败,则会回滚到上一个已知的好版本。

这种方法的前提条件是插槽 A 和插槽 B 的分区大小相同,这在资源有限的嵌入式系统中有时会很棘手。

swupdate带救援系统

另一种方法是为小型救援系统创建分区,为正常运行的系统创建更大的分区。

分区布局示例

典型的 Raspberry Pi Compute Module 5(CM5)的布局可能是这样的:
分区类型用途
p1FAT32/boot_A(内核、cmdline、引导加载程序)
p2ext4rootfs A
p3FAT32/boot_B(内核、cmdline、救援系统引导程序)
p4ext4rootfs_B
p5ext4数据/配置
引导加载程序可以使用标志(例如 rpi-eeprom 中的 GPIO17=1)来决定是否从应急分区启动。

实例

在两个 rpi-image-gen示例项目中演示:

第一个操作是创建救援系统,第二个操作是将救援系统与另一个运行中的系统合并,在 cmdline.txt和 fstab.

管理更新

您可以手动挂载非活动系统分区,以更新配置、应用程序或系统组件。
对于生产系统,更新通常通过 SWUpdate来管理更新,它能安全地自动执行这一过程。

与 SWUpdate

SWUpdate本机支持双根目录(A/B)更新策略。
分区和更新逻辑直接在 sw-description文件中直接定义。

这种方法可确保原子系统更新,并具有内置的回滚安全性--这对于无法手动恢复的无头或远程设备来说是必不可少的功能。