一、AB分区概述

什么是AB分区

AB分区,说白了就是给系统准备两套完整的固件分区。一套叫A分区,一套叫B分区。系统启动时,要么从A跑,要么从B跑。

我刚开始接触这个概念时,也觉得有点浪费——明明一套分区就能跑,干嘛要搞两套?后来在项目里吃过亏才明白,这多出来的一套分区,就是系统的「安全气囊」。

具体来说,AB分区通常包含以下关键区域:

分区组件 说明
bootloader 引导加载程序,决定从A还是B启动
boot分区 内核镜像所在分区
system分区 系统文件、库、框架等
vendor分区 厂商专有驱动和配置
misc分区 存储启动控制信息、回滚计数等

每一组A/B分区都是完整的、可独立启动的系统副本。你想想看,这就像飞机有两个引擎——一个出问题了,另一个立刻顶上。

AB分区的核心思想

核心思想就八个字:冗余备份,无缝切换。

具体来说,它遵循三条基本原则:

  • 独立性:A和B分区互不干扰,各自拥有完整的系统资源。更新A时,B照常运行。
  • 原子性:系统更新要么全部成功,要么全部失败。不会出现「更新到一半断电了,系统变砖」的情况。
  • 可回滚性:新版本启动失败,自动切回旧版本。用户甚至感知不到发生过切换。

我参与过一个车机项目,OTA升级时网络中断了三次。要是没有AB分区,那台车就得进维修站刷机了。但因为有AB分区,每次失败后系统都自动回滚到旧版本,车主第二天开车完全没发现异常。

一句话总结:AB分区让系统更新变成了「先准备好,再切换」的安全操作,而不是「边拆边装」的危险操作。

下面这张图展示了AB分区的基本工作流程:

AB分区核心工作流程 当前运行:A分区 系统正常启动,用户无感知 触发OTA 下载更新到B分区 A分区继续提供服务 下载完成 校验B分区 完整性检查 校验通过? 是 重启到B分区 新版本上线 否 回滚到A分区 保持旧版本运行 💡 关键点: 整个过程中,用户只经历一次重启。如果B分区启动失败,bootloader自动切回A分区。

为什么需要AB分区

这个问题,我分三个层面来讲。

1. 解决「更新变砖」的痛点

传统更新方式是这样的:系统进入recovery模式,擦除旧分区,写入新分区。如果中途断电、网络中断、写入错误……恭喜你,设备变砖了。

AB分区怎么做的?更新在后台静默完成,用户正常使用设备。更新完毕后,只需重启一次。就算新系统起不来,bootloader会自动切回旧系统。

我的经验:曾经有个智能家居项目,设备部署在偏远地区。传统更新方式下,变砖率约3%。换成AB分区后,变砖率降到了0.01%以下。那0.01%还是硬件故障导致的。

2. 满足「零停机」的业务需求

很多场景下,设备不能停机。比如:

  • 车载系统:升级时车辆正在行驶,不能中断导航和娱乐功能
  • 医疗设备:监护仪需要7×24小时运行
  • 工业控制器:产线停机一分钟,损失可能上万
  • 智能门锁:升级时用户正好要开门,不能因为更新锁死

AB分区让这些设备可以在「服务不中断」的前提下完成系统更新。

3. 降低运维成本

你想想看,没有AB分区时,设备变砖了怎么办?

  1. 用户联系客服
  2. 客服指导用户进入recovery模式
  3. 用户尝试刷机(大部分用户不会)
  4. 寄回厂家维修(运费+时间)
  5. 维修站重新烧录固件

这一套流程下来,少说两三天,多则一两周。单台设备的售后成本可能超过200元。

有了AB分区,绝大多数更新失败都能自动恢复。运维人员只需要远程查看一下回滚日志,确认问题原因,然后推送修复版本就行了。

对比项 传统更新 AB分区更新
更新时设备可用性 不可用(需进入recovery) 完全可用(后台静默更新)
更新失败后果 变砖,需人工干预 自动回滚,用户无感知
存储空间占用 1份固件空间 2份固件空间
运维成本 高(变砖率高,需现场处理) 低(自动恢复,远程排查)
用户体验 差(更新期间无法使用) 好(几乎无感)

注意:AB分区不是银弹。它需要额外的存储空间,对硬件有要求。如果设备存储只有64MB,强行上AB分区反而会挤占运行空间。我建议存储空间至少256MB以上再考虑AB分区方案。

嗯,以上就是AB分区的基本概念。说白了,它就是给系统更新上了一道「双保险」。后面我们会深入聊回滚机制的具体实现,到时候你就知道这套设计有多巧妙了。