3. 为什么需要A/B双分区

在嵌入式设备、物联网终端、车载控制器和工业网关中,固件升级是产品生命周期里最危险的操作之一。升级过程一旦失败,设备可能无法启动、无法联网,甚至需要返厂或现场拆机烧录。很多团队最初采用单分区方案:整个Flash只放一份固件,升级时直接擦除旧固件并写入新固件。这个方案实现简单、占用空间小,但它把设备置于一个非常脆弱的状态——在擦除和写入期间,设备没有可启动的完整固件。

核心结论:A/B双分区的本质不是“多存一份固件”,而是把“升级动作”和“启动动作”解耦。设备永远从一份已验证可启动的固件运行,新固件在后台写入另一个分区,只有确认成功后才切换启动目标。

一、单分区升级的风险链

单分区升级的风险并不是单点,而是一条连续的失效链。我们可以把它拆成几个关键阶段来看:

  • 擦除阶段:旧固件被擦除后,设备失去可启动镜像。此时若断电、复位或看门狗触发,设备将无法恢复。
  • 写入阶段:新固件写入过程中若发生电源波动、Flash坏块、通信中断,写入数据不完整,校验必然失败。
  • 校验阶段:即使写入完成,若没有独立校验机制,设备可能带着损坏镜像重启,直接卡在Bootloader或死机。
  • 回滚缺失:单分区没有旧固件备份,升级失败后无法自动回退,只能依赖外部工具重新烧录。
  • 远程不可达:对于部署在野外、高空或封闭场景的设备,一旦升级变砖,维护成本极高,甚至超过设备本身价值。

下面这张图展示了单分区升级与A/B双分区升级在风险路径上的本质差异。左侧是单分区:升级时直接覆盖唯一镜像,失败即“无路可退”;右侧是A/B双分区:运行分区与升级分区分离,失败可回滚,成功才切换。

单分区升级 vs A/B双分区升级:风险路径对比 单分区升级:唯一镜像被覆盖 Flash 中仅一份固件镜像 运行中 = 升级目标,无备份 擦除旧固件 → 写入新固件 期间设备无完整可启动镜像 断电 / 复位 / 写入中断 镜像不完整,校验失败 设备变砖,无法启动 只能返厂 / 现场烧录 / 拆机 A/B双分区:运行与升级分离 分区 A 当前运行固件 状态:已验证 分区 B 待升级 / 备份 状态:空闲 写入 后台写入分区 B,分区 A 继续运行 升级期间业务不中断 校验通过 → 切换启动标志到 B 失败则保留 A,自动回滚 设备始终有可启动固件 升级失败可回滚,远程可恢复

二、A/B双分区的核心优势

A/B方案的优势可以归纳为“四个不”:不中断、不变砖、可回滚、可验证。具体来说:

  • 不中断:设备从A分区正常运行,新固件在B分区后台写入,业务不因升级而停机。
  • 不变砖:即使B分区写入失败或新固件启动异常,Bootloader仍可回退到A分区,设备保持可用。
  • 可回滚:通过启动标志位和版本状态管理,可以明确“当前应启动哪个分区”,失败时自动切回旧版本。
  • 可验证:新固件写入后先做CRC/SHA校验,再尝试启动;启动后由应用层上报“健康状态”,确认无误才正式提交。
A/B双分区不是简单地把Flash切成两块。它需要Bootloader、分区表、启动标志、校验算法、回滚策略和升级代理协同工作。缺少任何一环,A/B的优势都会打折扣。

三、典型应用场景与行业案例

A/B双分区特别适合“升级失败代价高、设备难以物理接触、业务连续性要求强”的场景。下面用表格列出典型行业与对应诉求:

行业/场景 升级痛点 A/B方案带来的价值
车联网T-Box / 车载控制器 车辆行驶中不能停机,升级失败可能影响行车安全 后台静默升级,失败自动回滚,保障车辆始终可启动
工业网关 / PLC 产线连续运行,停机损失大,现场维护成本高 不中断业务升级,远程回滚,减少现场出差
智能摄像头 / 门禁终端 设备分布广、安装位置高,拆机困难 远程升级失败可恢复,避免批量变砖
医疗设备 / 仪器仪表 法规要求可追溯,升级必须安全可控 双分区保留旧版本,支持审计与快速回退
消费电子 / 路由器 用户无感升级,失败会导致退货和售后压力 后台下载、校验、切换,用户体验平滑

行业案例方面,Android系统的A/B无缝更新是典型代表:系统在后台把新镜像写入非活动槽位,重启后直接切换到新槽位,失败则回退。很多车载OTA、工业物联网平台也采用类似机制,例如通过MCUboot、U-Boot的A/B启动、或自研Bootloader实现双分区切换。这些方案的共同点是:把“升级成功”定义为“新固件启动并自检通过”,而不是“写入完成”。

四、常见误区与复盘

误区一:认为“双分区就是多占一倍Flash,成本太高”。实际上,很多场景下Flash容量已经足够,且A/B带来的可维护性收益远大于存储成本。误区二:认为“有了双分区就万事大吉”。如果启动标志写入不是原子操作,或回滚逻辑有缺陷,仍然可能变砖。误区三:忽略升级代理的看门狗和超时处理,导致升级卡死。

一个可靠的A/B升级流程通常包含以下关键步骤,可以用伪代码表示:

1. 设备从 slot A 启动,运行正常
2. 收到升级包,写入 slot B
3. 对 slot B 做 CRC/SHA 校验
4. 校验通过,设置 boot_flag = B,并标记 B 为“待验证”
5. 重启,Bootloader 根据 boot_flag 启动 B
6. B 启动后,应用层上报健康状态
7. 若健康,提交 boot_flag = B 为“正式”
8. 若不健康或超时,回滚 boot_flag = A,重启回 A

复盘时,团队应重点检查:分区表是否清晰、启动标志是否具备掉电保护、回滚是否经过真实断电测试、升级包是否带签名防篡改、以及是否有远程恢复通道。只有把这些细节做到位,A/B双分区才能真正成为设备升级的安全底座,而不是一个“看起来很美”的架构。