一、AB分区系统概述
什么是AB分区
AB分区,说白了就是把系统存储区一分为二。
一块叫A分区(slot A),一块叫B分区(slot B)。两个分区里都装着完整的系统镜像——内核、驱动、文件系统、应用,一个都不少。你想想看,这就像你家里备了两把钥匙,一把丢了还有另一把。
我最早接触AB分区是在做某款车载设备的时候。客户要求设备在OTA升级过程中不能黑屏超过3秒。嗯,传统的单分区方案根本做不到,AB分区几乎是唯一的选择。
核心概念:AB分区不是把系统拆成两半,而是两个完整的系统副本。A区和B区各自独立,互不干扰。
AB分区的优势
为什么越来越多的设备采用AB分区?我总结了三个最实在的好处:
| 优势 | 说明 | 我见过的坑 |
|---|---|---|
| 无缝升级 | 升级在后台进行,用户无感知 | 某次升级中用户正在玩游戏,传统方案直接重启,被投诉到产品经理那里 |
| 安全回滚 | 升级失败自动切回旧分区 | 曾经有个项目,升级到一半断电,AB分区自动切回旧系统,设备完好无损 |
| 降低变砖风险 | 始终有一个可启动的系统 | 单分区设备刷机失败就是真砖,AB分区至少还能进recovery |
我个人习惯把AB分区比作「飞机的双引擎」。一个引擎出问题了,另一个还能撑住。单分区就像只有一个引擎的螺旋桨飞机——出点事就往下掉。
AB分区的工作原理
工作原理其实不复杂。我画了一张图,你看完就明白了:
流程其实就这几步:
- 设备在A分区正常运行——用户该干嘛干嘛
- 后台下载升级包到B分区——完全不影响A分区
- 写入并校验B分区——确保数据完整
- 标记B分区为活动分区——告诉bootloader下次从B启动
- 重启设备——从B分区启动,升级完成
我的经验:校验这一步千万别省。我曾经遇到过一个案例,升级包下载过程中网络波动导致数据损坏,但因为校验机制完善,系统自动丢弃了损坏的包并重新下载。如果没做校验,刷进去就是一块砖。
分区布局与元数据
AB分区不只是两块存储区域。每个分区还附带一个元数据区域,里面存着关键信息:
| 元数据字段 | 作用 | 取值示例 |
|---|---|---|
| 分区状态 | 标记分区是否可启动 | active / inactive / unbootable |
| 升级计数 | 记录尝试启动次数 | 0 ~ 7(超过阈值回滚) |
| 版本号 | 标识系统版本 | v2.1.0 / v2.2.0 |
| 校验哈希 | 验证分区完整性 | SHA256 值 |
bootloader在启动时会读取这些元数据。如果当前活动分区启动失败,计数会递增。超过阈值后,bootloader自动切换到另一个分区。
注意:元数据区域通常放在独立的小分区里(比如misc分区),或者放在分区末尾的预留空间。千万不要把元数据和系统数据混在一起,否则格式化系统分区时会把启动信息一起干掉。我见过有人这么干过,后果很惨。
AB分区 vs 传统单分区
做个对比,你就知道为什么AB分区是趋势了:
| 对比项 | 传统单分区 | AB分区 |
|---|---|---|
| 升级方式 | 覆盖写入,必须重启进入recovery | 后台写入,重启即切换 |
| 升级耗时 | 设备不可用期间(5~15分钟) | 几乎为零(重启时间) |
| 失败恢复 | 需要人工干预或进recovery刷机 | 自动回滚,无需用户操作 |
| 存储占用 | 1份系统镜像 | 2份系统镜像(约多占1~2GB) |
| 适用场景 | 低端设备、存储受限设备 | 中高端设备、车机、IoT网关 |
嗯,这里要注意。AB分区不是银弹。如果你的设备存储空间只有4GB,硬上AB分区会导致用户可用空间被严重压缩。我建议存储低于8GB的设备慎重考虑。
小结
AB分区的核心思想就一句话:用空间换可靠性。多占一份存储,换来的是无缝升级和自动恢复能力。在车机、医疗设备、工业控制这些「不能挂」的场景里,AB分区几乎是标配。
我个人做过的项目里,AB分区帮我救过至少三次场。一次是升级包在传输过程中被截断,一次是文件系统写入时掉电,还有一次是内核新驱动有bug导致无法启动。三次都是AB分区自动回滚,设备完好如初。要是单分区,这三台设备都得返厂。