2、动态分区核心概念:super分区、逻辑分区、物理分区、COW分区
好,咱们今天来啃硬骨头。动态分区这套东西,说白了就是Android系统里管理存储空间的一套新玩法。我当年刚接触的时候,也被这几个概念绕得头晕——super分区、逻辑分区、物理分区、COW分区,名字长得像,干的活却完全不同。
别急,我一个一个给你拆开讲。讲完之后你会发现,其实没那么复杂。
2.1 物理分区:最底层的“硬划分”
先说说物理分区。这个最好理解——它就是你在parted或者fdisk里看到的那一串分区。比如/dev/block/sda1、/dev/block/sda2,这些都是物理分区。
物理分区是烧录在eMMC或UFS芯片上的,大小固定,不能动态调整。你想想看,如果系统A分区只有2GB,那它永远就是2GB,想多要100MB都不行。
关键点:物理分区是硬件层面的划分,由分区表(GPT)定义。系统启动时,Bootloader会直接读取这些分区。
我记得有一次做项目,客户要求把system分区从3GB改成4GB。嗯,听着简单对吧?但实际上你得重新烧录整个分区表,所有数据都得清空。这就是物理分区的痛点——不灵活。
2.2 super分区:动态分区的“大管家”
好,那super分区是干嘛的?
super分区其实也是一个物理分区。但它里面不直接放数据,而是放了一堆“子分区”——也就是逻辑分区。你可以把super分区想象成一个容器,里面装着system、product、vendor这些逻辑分区。
为什么要这么设计?说白了就是为了灵活。以前每个逻辑分区都是独立的物理分区,大小固定。现在它们全挤在super这个“大池子”里,空间可以互相借用。
我的经验:super分区的大小一般在4GB到8GB之间,具体看设备。我建议留出10%-15%的空余空间,给OTA升级留点缓冲。
来看一个实际的super分区布局:
物理分区: /dev/block/sda10 (super, 6GB)
├── 逻辑分区: system_a (1.5GB)
├── 逻辑分区: system_b (1.5GB)
├── 逻辑分区: product_a (800MB)
├── 逻辑分区: product_b (800MB)
├── 逻辑分区: vendor_a (500MB)
├── 逻辑分区: vendor_b (500MB)
└── 剩余空间: ~900MB (用于COW或扩容)
你看到了吗?super分区里既有A槽也有B槽,这就是为无缝OTA升级准备的。
2.3 逻辑分区:真正干活的“虚拟分区”
逻辑分区是动态分区的核心。它不像物理分区那样有固定的磁盘位置,而是由super分区动态分配的。
逻辑分区的特点:
- 大小可变:可以在super分区的总容量内动态调整
- 位置不固定:每次分配可能落在不同的物理块上
- 支持快照:这是OTA升级的关键能力
你可能会问:“逻辑分区在磁盘上到底存不存在?”
存在,但它的位置是由一个叫LVM(逻辑卷管理器)的模块管理的。系统通过一个映射表,把逻辑分区的块地址翻译成物理分区的块地址。这个过程对上层应用是完全透明的。
注意:逻辑分区不能单独存在。它必须寄生在super分区里。如果你把super分区删了,所有逻辑分区也跟着没了。
2.4 COW分区:OTA升级的“临时工”
COW,全称是Copy-On-Write,写时复制。这个名字听着高大上,其实干的事很简单——记录变化。
假设你现在要OTA升级system分区。新版本的数据和旧版本不一样,但你又不能直接覆盖旧的,因为万一升级失败还要回滚。怎么办?
COW分区就是用来解决这个问题的。它记录了两类数据:
- 旧数据备份:被新数据覆盖前的原始数据
- 新数据增量:新旧版本之间的差异部分
升级过程中,系统会这样工作:
1. 读取旧system分区数据
2. 将即将被覆盖的旧数据写入COW分区(备份)
3. 将新数据写入system分区
4. 如果升级成功 → 删除COW分区
5. 如果升级失败 → 从COW分区恢复旧数据
我曾经遇到过一个坑:COW分区空间不够。那次OTA升级包比较大,COW分区只有200MB,但需要备份的数据有300MB。结果升级到一半直接报错,设备变砖了。后来我们学乖了,COW分区至少留出super分区总容量的5%作为保底。
COW分区的两种类型:
- 内联COW:在super分区内部划出一块空间做COW
- 外置COW:在super分区之外单独建一个物理分区做COW
我个人更推荐外置COW,因为它不受super分区大小限制,更安全。
2.5 四者关系:一张图说清楚
讲了这么多,咱们用一张SVG图把关系理清楚:
这张图你看懂了吗?从上到下是:物理分区 → super分区 → 逻辑分区 → COW分区。每一层都依赖下一层,但每一层又都有自己的职责。
2.6 实际项目中的避坑指南
最后,我把自己踩过的坑总结一下,你以后遇到了能少走弯路:
| 坑点 | 表现 | 解决方案 |
|---|---|---|
| super分区空间不足 | OTA升级失败,设备变砖 | 预留10%-15%空余空间 |
| COW分区太小 | 升级过程中报错“no space” | COW至少占super的5% |
| 逻辑分区表损坏 | 所有逻辑分区无法挂载 | 备份分区表,使用lpdump工具 |
| A/B槽大小不一致 | 升级后空间分配异常 | 确保A/B槽逻辑分区大小对称 |
我的小技巧:调试动态分区时,多用lpdump和lpflash这两个工具。前者看分区表,后者刷写分区。我每次改分区配置前,都会先lpdump一把,留个备份。
好了,动态分区的四个核心概念就讲到这里。你只要记住:物理分区是地基,super分区是房子,逻辑分区是房间,COW分区是装修时的临时仓库。这样一想,是不是清晰多了?