11、分区表与GPT:Android分区布局、GPT与MBR的区别、使用fastboot getvar获取分区信息
说到分区表,我脑子里第一个蹦出来的画面,是几年前帮一个朋友救砖的场景。他那台手机刷机刷到一半断电了,重启后直接黑屏。我拿过来一查,分区表坏了。嗯,那时候我就深刻体会到——分区表这东西,平时看不见摸不着,一旦出问题,手机就是一块砖头。
今天咱们就来聊聊Android设备上的分区布局,以及背后的分区表技术。说白了,就是搞清楚你的手机存储空间是怎么划分的,每个区域干什么用。
GPT vs MBR:新老两代分区表
先说说MBR。MBR的全称是Master Boot Record,主引导记录。这东西诞生于1980年代,那时候硬盘才几十MB。MBR的设计很简单:它把分区信息存在磁盘的第一个扇区里,一共512字节。其中前446字节是引导代码,后面64字节是分区表,最后2字节是签名。
问题来了——64字节的分区表,每个分区条目占16字节,所以最多只能有4个主分区。你想多分几个?那就得搞扩展分区和逻辑分区,麻烦得很。而且MBR只支持2TB以下的磁盘,超过2TB就认不全了。
GPT呢?GUID Partition Table,全局唯一标识分区表。它没有4个主分区的限制,理论上可以分无数个分区。支持的磁盘大小?我跟你讲,2^64个扇区,按512字节一个扇区算,大概是9.4ZB——你想想看,这得用到猴年马月去。
我在项目中遇到过一件事:一台老设备用的还是MBR,客户想升级存储到256GB,结果死活认不全。查了半天,发现是MBR的限制。换成GPT后,问题迎刃而解。所以现在Android设备,清一色都是GPT。
核心区别总结:
- MBR:最多4个主分区,最大支持2TB磁盘,分区表存在第一个扇区
- GPT:无分区数量限制(实际受操作系统限制),支持超大磁盘,分区表有备份
- GPT自带CRC校验,分区表损坏了还能从备份恢复
Android分区布局:每个分区都有它的脾气
Android设备的分区布局,不同厂商、不同芯片平台会有些差异,但核心分区是通用的。我挑几个重要的说说。
| 分区名 | 作用 | 个人备注 |
|---|---|---|
| xbl / abl | Bootloader的引导阶段 | 高通平台特有,坏了就真成砖了 |
| boot | 内核+ramdisk | 刷内核就是刷这个分区 |
| system | 系统文件 | Android系统本体 |
| vendor | 厂商专有库和驱动 | 解耦后单独更新 |
| userdata | 用户数据 | 你装的应用、照片都在这里 |
| cache | 缓存 | OTA升级时常用 |
| recovery | 恢复模式 | 刷机救砖的入口 |
| misc | 杂项配置 | 存启动模式等信息 |
你可能会问:为什么要有这么多分区?直接一个大分区不行吗?
我刚开始做Android底层时也这么想。后来发现,分区隔离有几个好处:一是刷机时可以只更新某个分区,不用全量刷;二是某个分区坏了,其他分区还能正常工作;三是安全考虑,比如boot分区加了签名验证,防止被篡改。
举个例子:你OTA升级系统,实际上就是更新system分区和vendor分区。userdata分区里的数据不会丢。如果只有一个大分区,升级就得格式化整个存储,那你的照片、聊天记录全没了——想想就头疼。
使用fastboot getvar获取分区信息
好了,理论说完了,咱们来点实操。fastboot有个很实用的命令——getvar,可以获取设备的各种变量信息,包括分区大小、slot信息等。
我个人习惯先执行这个命令看看设备的基本情况:
fastboot getvar all
这个命令会输出一大堆变量。信息太多?那就针对性查询:
fastboot getvar partition-size:boot
fastboot getvar partition-type:system
fastboot getvar slot-count
我曾经帮一个同事排查问题,他的设备刷完系统后一直卡在开机动画。我让他执行fastboot getvar all,发现partition-size:system只有512MB,但刷入的系统镜像有800MB。这不就找到原因了嘛——分区太小,系统没刷全。
实用技巧:
用fastboot getvar all时,输出内容可能很长。建议重定向到文件里慢慢看:
fastboot getvar all > partition_info.txt
常见的getvar变量:
partition-size:[分区名]— 查看分区大小(单位是字节)partition-type:[分区名]— 查看分区文件系统类型(如ext4、f2fs)slot-count— 查看有几个slot(A/B分区)current-slot— 当前启动的是哪个slotmax-download-size— 单次最大下载大小,刷大镜像时要注意
说到A/B分区,我再多提一嘴。现在很多新设备都支持A/B无缝升级。就是系统有两个完整的分区组(slot A和slot B),你在使用slot A时,OTA可以悄悄更新slot B。下次重启就切到slot B,如果启动失败还能自动回滚到slot A。这个机制依赖GPT分区表的多分区能力,MBR那4个分区根本玩不转。
注意:
不同厂商对getvar的支持程度不一样。有些厂商会隐藏部分变量。如果你发现某个变量查不到,别慌,可能是厂商做了限制,不是你的操作有问题。
一张图看懂分区表与分区布局
下面这张SVG图,把GPT分区表的结构和Android分区布局串起来了。你看一遍应该就能理解整个体系。
这张图里,GPT头部和分区条目都在磁盘开头。每个分区条目记录了分区的起始位置、大小、类型GUID等信息。磁盘末尾还有一份备份,万一头部坏了,可以从尾部恢复。这个设计比MBR靠谱多了——MBR要是坏了,那就真坏了。
好了,关于分区表和Android分区布局,今天就聊到这儿。你可以在自己的设备上试试fastboot getvar all,看看实际的分区情况。我保证,你会对手机存储有全新的认识。