一、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分区
这个问题,我分三个层面来讲。
1. 解决「更新变砖」的痛点
传统更新方式是这样的:系统进入recovery模式,擦除旧分区,写入新分区。如果中途断电、网络中断、写入错误……恭喜你,设备变砖了。
AB分区怎么做的?更新在后台静默完成,用户正常使用设备。更新完毕后,只需重启一次。就算新系统起不来,bootloader会自动切回旧系统。
我的经验:曾经有个智能家居项目,设备部署在偏远地区。传统更新方式下,变砖率约3%。换成AB分区后,变砖率降到了0.01%以下。那0.01%还是硬件故障导致的。
2. 满足「零停机」的业务需求
很多场景下,设备不能停机。比如:
- 车载系统:升级时车辆正在行驶,不能中断导航和娱乐功能
- 医疗设备:监护仪需要7×24小时运行
- 工业控制器:产线停机一分钟,损失可能上万
- 智能门锁:升级时用户正好要开门,不能因为更新锁死
AB分区让这些设备可以在「服务不中断」的前提下完成系统更新。
3. 降低运维成本
你想想看,没有AB分区时,设备变砖了怎么办?
- 用户联系客服
- 客服指导用户进入recovery模式
- 用户尝试刷机(大部分用户不会)
- 寄回厂家维修(运费+时间)
- 维修站重新烧录固件
这一套流程下来,少说两三天,多则一两周。单台设备的售后成本可能超过200元。
有了AB分区,绝大多数更新失败都能自动恢复。运维人员只需要远程查看一下回滚日志,确认问题原因,然后推送修复版本就行了。
| 对比项 | 传统更新 | AB分区更新 |
|---|---|---|
| 更新时设备可用性 | 不可用(需进入recovery) | 完全可用(后台静默更新) |
| 更新失败后果 | 变砖,需人工干预 | 自动回滚,用户无感知 |
| 存储空间占用 | 1份固件空间 | 2份固件空间 |
| 运维成本 | 高(变砖率高,需现场处理) | 低(自动恢复,远程排查) |
| 用户体验 | 差(更新期间无法使用) | 好(几乎无感) |
注意:AB分区不是银弹。它需要额外的存储空间,对硬件有要求。如果设备存储只有64MB,强行上AB分区反而会挤占运行空间。我建议存储空间至少256MB以上再考虑AB分区方案。
嗯,以上就是AB分区的基本概念。说白了,它就是给系统更新上了一道「双保险」。后面我们会深入聊回滚机制的具体实现,到时候你就知道这套设计有多巧妙了。