3. 多分区系统架构
在多分区OTA升级部署中,分区架构决定了升级的可靠性、回滚能力与数据安全性。理解各分区的职责边界与依赖关系,是设计升级方案的第一步。本节从分区表出发,逐层拆解Bootloader、Recovery、A/B系统分区与数据分区的作用与协作关系。
一、分区表:存储布局的“地图”
分区表定义了Flash/eMMC上每个分区的名称、起始偏移、大小与属性。它通常由Bootloader在启动早期解析,是系统识别“从哪里加载内核、从哪里挂载根文件系统”的依据。常见分区表格式包括GPT、MTD分区表、Rockchip parameter、Allwinner sys_config等。
分区表设计需遵循三条原则:对齐与预留(按擦除块/页大小对齐,预留坏块管理空间)、职责单一(每个分区只承担一种用途)、可扩展(为OTA、日志、校准数据预留独立分区)。一个典型的分区表如下:
# 名称 偏移 大小 用途
bootloader 0x00000000 4MB U-Boot/SPL
misc 0x00400000 1MB 升级命令与状态标志
boot_a 0x00500000 32MB Kernel + DTB (A槽)
boot_b 0x02500000 32MB Kernel + DTB (B槽)
system_a 0x04500000 512MB RootFS (A槽)
system_b 0x24500000 512MB RootFS (B槽)
recovery 0x44500000 64MB 恢复模式镜像
userdata 0x48500000 剩余空间 用户数据与配置
二、Bootloader分区:启动链的第一环
Bootloader分区存放SPL与U-Boot等引导程序,负责初始化DDR、加载内核、传递启动参数,并在A/B方案中决定从哪个槽启动。它通常不参与常规OTA,因为一旦升级失败设备将无法启动。若必须升级Bootloader,应采用双备份(bootloader_a/bootloader_b)或由Recovery在受控条件下写入,并保留串口/USB烧录兜底通道。
三、Recovery分区:独立的最小恢复系统
Recovery是一个独立的小型Linux系统,包含恢复内核与恢复根文件系统。它的核心价值在于:当主系统升级失败或无法启动时,仍能进入Recovery执行恢复操作。Recovery通常承担以下职责:
- 读取misc分区中的升级命令(如
boot-recovery、recovery --update_package=...); - 校验并写入OTA包到目标分区;
- 执行双清(wipe data/cache)或回滚操作;
- 通过ADB/SD卡/U盘加载外部升级包。
四、A/B分区:无缝升级与自动回滚
A/B分区方案将系统分区(boot、system、vendor等)成对存在,同一时刻只有一个槽处于“活动”状态。升级时,OTA包写入非活动槽,写入完成后通过misc分区设置slot标志,重启后Bootloader切换到新槽。若新槽启动失败,Bootloader可自动回退到旧槽。
A/B方案的关键机制包括:
- 槽元数据:记录每个槽的优先级、成功标志、重试次数;
- 启动成功标记:新系统首次启动后需调用
markBootSuccessful(),否则下次启动回滚; - misc分区:作为Bootloader与Recovery之间的命令通道;
- 空间代价:A/B方案通常需要额外一份系统分区空间,对存储紧张的设备需权衡。
五、系统分区与数据分区:职责分离
系统分区(system/vendor/product)存放只读的操作系统与预置应用,OTA升级主要更新这些分区。数据分区(userdata)存放用户数据、应用私有数据与配置,升级时通常不擦除,但跨大版本升级可能因数据库schema变更需要迁移或双清。
两者的关系可概括为:系统分区提供“可替换的代码”,数据分区提供“需保留的状态”。OTA设计必须保证升级后数据分区中的用户数据仍可被新系统正确读取,这要求升级包中包含数据迁移脚本或版本兼容逻辑。
六、分区协作关系总览
下图展示了各分区在启动与升级流程中的位置与数据流向:
七、常见误区与复盘
误区一:把Recovery当作“万能恢复”。若Recovery分区本身损坏或Bootloader无法加载Recovery,设备仍会变砖。因此Recovery升级必须与Bootloader升级一样谨慎。
误区二:A/B分区一定安全。若misc分区写入失败或slot标志未正确更新,可能导致两个槽都无法启动。建议在升级前后对misc分区做校验与备份。
误区三:userdata永远不需要处理。跨Android大版本或数据库schema变更时,userdata中的旧数据可能导致新系统崩溃,需在OTA包中集成迁移脚本或引导用户双清。
总结来说,多分区架构的核心是职责分离与冗余设计:Bootloader负责引导与槽选择,misc负责传递升级意图,Recovery提供兜底恢复能力,A/B分区实现无缝切换与回滚,system与userdata分离保证升级不丢数据。只有各分区协同正确,OTA升级才能既可靠又安全。