244°

[日更-2019.5.21] Android 系统的分区和文件系统(一)--Android分区的大概框架

声明

  • 其实我在刚开始接触Android时给手机刷机,很好奇Android的刷机包里面怎么这么多img文件?而且每个img要刷入对应的分区,就有点头大了,就好奇一个破手机分这么多区干什么?;
  • 再加上今天同事问我相关分区的事情,我又细研究了下关于这部分东西,同时很多借鉴了网上很多开源知识及相关书籍内容;

0 写在前面的

    以我的Nexus5手机的cm-14.1的Android AOSP代码来说,编译完成后主要生成的img文件有:boot.img、cache.img、recovery.img、system.img、userdata.img

     而一般刷机时会写一个刷机脚本,执行它刷机就可以了。

#!/bin/bash
echo "Flashing build. If nothing mentions that it flashed anything and it looks stuck, make sure you have the drivers installed."
fastboot flash boot ./boot.img
fastboot flash system ./system.img
fastboot flash recovery ./recovery.img
fastboot flash cache ./cache.img
fastboot flash userdata ./userdata.img

fastboot reboot

    其实,上面列出的就是通常说的Android的五大分区,分区是文件系统的基础,只有在不同分区里才能实现不同的文件系统(就像电脑磁盘有NTFS和FAT,只能在不同的盘里面修改文件系统,而不能在一个盘里分出两种文件系统来,一个道理),手机/平板上的一整块Flash存储器被切割成不交叉的部分,每部分都可以单独格式化,用于不同的使用目的。比如:/system分区就是用来安装操作系统的地方;/data分区就是用来给用户存储数据用的。     说道Flash就不等不说一个坑,以前买U盘买了个16GB的,买回来插在电脑上一看也就14GB左右,因为我们认为的1GB = 102410241024B,而Flash商家的1GB = 100010001000B。

    言归正传,正常的手机/平板的分区可不止这5个,有的厂商的手机分区多达20几个。虽然分这么多区,并不是每个区都会被系统mount上来给用户看到,而且用户也能且仅能向一个分区写入数据(那就是/data分区),以我接触到的一部联发科平板来说,它的分区如下:

      

1 那么问题来了--Android系统为何会分这么多区?

    采用多分区方案的原因是移动设备需要安全和自由,安全方面比如说系统启动时靠的是/boot分区中的内核镜像启动的,在系统升级时,升级包会下载到/cache分区,在刷机时系统进入的是/recovery分区中的内核镜像启动升级的,各个分区各司其职,相互不会冲洗掉彼此。自由方面指的是一些比如像modem或其他组件(比如bootloader)等需要拥有自己独立存储空间来存储配置文件或镜像。

    通过查看/proc/partitions文件中的内容,可查看Android设备的分区映射情况,其中记录了系统中所有块设备:

没带手机,回公司再贴上

还可以使用df或mount命令查看所有的mount点:

没带手机,回公司在贴上

2 文件系统

    目前Flash采用的几乎都是eMMC和MMC,所以后面的Android4.4以后的文件系统普遍升级到了Linux ext4,抛弃了弊端很多的YAFFS文件系统(具体为啥抛弃它就先不管了,感兴趣可以自行百度),而且ext4文件系统自从Linux2.6.27已经成为Linux默认文件系统,因为它经历过很多良好测试而稳定的文件系统。

    但是,ext4并不是针对Flash进行优化的文件系统,所以三星设计了另外一个文件系统F2FS(Flash Friendly File System),某些厂商将此文件系统用在/data分区上,此文件系统专为NAND Flash优化,据说在随机写请求上的性能提升超过了Ext4,但目前还是大部分厂商依然采用ext4文件系统。Linux 3.8已经将F2FS合并入主线版本,高版本内核的Android系统是可以使用的。

    采用文件系统的好处是只要它们能够正常工作,用户就可以完全不用管到底底层使用的是什么文件系统,对于不同的文件系统,Android提供了对应各自文件系统的默认检查/修复的二进制程序(e2fsck、fsck_msdos和fsck.f2fs),当文件系统被vold或init进程mount时这些二进制程序会被自动执行检查。

3 Android设备的分区

    Android设备中的各个分区都是有名字的(通常看不懂名字啥意思),不同的芯片组和制造商还会使用不同的分区,甚至会给功能完全一样的分区取不同的名称。

3.1 标准Android分区

    这类分区都有一个共同的特性:它们是被硬编码到Android系统自身中的, 会出现在源码树的各个不同的位置上。这些分区构成了操作系统的核心。

    标准分区基本上都是可以mount,仅有boot和recovery分区是例外。

分区 文件系统 作用
boot bootimg 内核+ initramfs。含有内核和l默认启动过程中所需的initramfs
cache Ext4 用来进行系统升级或recovery
recovery bootimg 用于把系统启动到recovery模式下,内核将系统启动至recovery 模式的initramfs
system Ext4 用于存放操作系统的二进制可执行文件和框架
data Ext4/F2FS 存放用户数据和配置文件

    Android设备中有一张文件系统mount表,位于/system/etc/vold.fstab或/fstab.hardware目录下,在系统启动过程中会被vold(卷守护进程)加载并指出了哪些分区应该被自动mount上来。

3.2 芯片组专用分区

    芯片组制造商经常需要一些分区用来存储支持芯片组工作的程序和数据。以高通为例,它的MSM芯片组分区如下所示(网上盗图):

       

3.3 厂商专用分区

    Android设备上能找到的其他分区就是厂商专用的了。它们根据自己的目的(大多用于设备配置维护和升级操作)来使用这些分区。这些分区使用的文件系统格式多为专用格式(再从网上盗图一张):

       

Enjoy it

    写的有点粗略,不过分区的大概框架就是这个意思了。下一篇写下各个分区里面存放的都是些什么?

本文由【小馬佩德罗】发布于开源中国,原文链接:https://my.oschina.net/XiaoMaPedro/blog/3062345

全部评论: 0

    我有话说: