2、AB分区布局详解:系统分区(A/B)、数据分区、缓存分区、misc分区、bootloader分区
上一章我们聊了AB系统的整体思路,说白了就是「双份保险」。但保险箱里到底放了哪些东西?每个分区又扮演什么角色?这章我带你逐个拆解。
先看一张整体布局图,心里有个全局印象。
2.1 系统分区(A/B)—— 双保险的核心
系统分区是AB机制的主角。它包含操作系统内核、系统镜像、vendor分区(硬件驱动相关)等。A和B两套完全独立,大小通常一致。
分区命名规则:常见的有 system_a / system_b,或者 system / system_other。不同厂商略有差异,但本质一样。
关键点:
- 当前运行的槽位叫 active slot,另一个叫 inactive slot。
- 升级时只写 inactive slot,不影响当前系统。
- 重启后如果新系统起不来,自动回滚到 active slot。
2.2 数据分区(userdata)—— 用户的家
数据分区存放用户数据:应用、照片、设置、账号信息等。它由A和B共享,不会因为切换槽位而丢失。
为什么数据分区不搞双份?因为没必要。用户数据是持续增长的,双份会浪费大量存储空间。而且数据分区的内容与系统版本无关,升级后直接复用。
2.3 缓存分区(cache)—— 临时工
缓存分区在AB系统中地位比较微妙。传统非AB系统里,缓存分区用来存放OTA升级包、恢复模式日志等。但在AB系统中,OTA包通常直接下载到数据分区或缓存分区,然后由update_engine处理。
缓存分区的作用:
- 存放OTA下载的临时文件(如果策略配置为使用cache)。
- 恢复模式(recovery)下的日志存储。
- 某些厂商用它做启动优化缓存。
说实话,缓存分区在AB系统中越来越「鸡肋」。很多新设备直接把它砍掉,或者只留一个很小的分区。我个人习惯是保留256MB,够用就行。
2.4 misc分区 —— 指挥中心
misc分区虽然小(通常只有几MB),但作用非常关键。它存储着系统启动的控制信息,比如:
| 字段 | 说明 |
|---|---|
| bootloader_message | 包含当前槽位、回滚计数、恢复模式标记等 |
| slot_suffix | 标记当前启动的是 _a 还是 _b |
| retry_count | 当前槽位启动失败的重试次数 |
| successful_boot | 标记当前槽位是否成功启动过 |
你想想看,如果misc分区损坏了,系统就不知道应该从哪个槽位启动。我遇到过一台设备,misc分区被误擦除,结果每次启动都随机选槽位,用户一脸懵。修复方法是用fastboot重新写入misc分区内容。
dd 命令直接写misc分区,结果写错了偏移量,导致系统一直进恢复模式。后来我学乖了,操作misc分区前一定先备份,用 hexdump 确认内容再动手。
2.5 bootloader分区 —— 守门员
bootloader分区存放引导加载程序,它是系统启动的第一段代码。在AB系统中,bootloader负责:
- 读取misc分区,确定启动哪个槽位。
- 验证系统分区的签名(如果启用了verified boot)。
- 加载内核并跳转。
bootloader在AB系统中的特殊性:
- 有些设备bootloader本身也是A/B双份(比如
bootloader_a/bootloader_b),升级bootloader时可以回滚。 - 更多设备bootloader只有一份,升级bootloader有风险——一旦写坏,设备变砖。
我个人强烈建议:如果硬件支持,尽量把bootloader也做成A/B双份。虽然多占一点空间,但安全性提升一个档次。
2.6 分区布局总结
下面这张表把各分区的核心属性列出来,方便你对照:
| 分区 | 是否A/B双份 | 典型大小 | 主要作用 | 升级时是否受影响 |
|---|---|---|---|---|
| system | 是 | 1~4 GB | 操作系统内核、系统镜像 | 只写 inactive slot |
| userdata | 否(共享) | 剩余空间 | 用户数据、应用 | 不受影响 |
| cache | 否 | 256 MB ~ 1 GB | OTA临时文件、日志 | 可能被清空 |
| misc | 否 | 2~8 MB | 启动控制信息 | 升级时更新 |
| bootloader | 视设备而定 | 4~32 MB | 引导加载程序 | 通常不升级 |