[日更-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 = 1024x1024x1024B,而Flash商家的1GB = 1000x1000x1000B。

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

      

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

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

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

hammerhead:/ # cat /proc/partitions                                                                                           
major minor  #blocks  name

 179        0   15388672 mmcblk0
 179        1      65536 mmcblk0p1
 179        2       1024 mmcblk0p2
 179        3        512 mmcblk0p3
 179        4        512 mmcblk0p4
 179        5        512 mmcblk0p5
 179        6        512 mmcblk0p6
 179        7       2048 mmcblk0p7
 179        8       1024 mmcblk0p8
 179        9        512 mmcblk0p9
 179       10        512 mmcblk0p10
 179       11        512 mmcblk0p11
 179       12       3072 mmcblk0p12
 179       13       3072 mmcblk0p13
 179       14        512 mmcblk0p14
 179       15      16384 mmcblk0p15
 179       16      16384 mmcblk0p16
 179       17       3072 mmcblk0p17
 179       18      22528 mmcblk0p18
 179       19      22528 mmcblk0p19
 179       20      22528 mmcblk0p20
 179       21       3072 mmcblk0p21
 179       22        512 mmcblk0p22
 179       23        512 mmcblk0p23
 179       24        512 mmcblk0p24
 179       25    1048576 mmcblk0p25
 179       26      30720 mmcblk0p26
 179       27     716800 mmcblk0p27
 179       28   13404138 mmcblk0p28
 179       29          5 mmcblk0p29
 179       32       4096 mmcblk0rpmb

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

hammerhead:/ # df
Filesystem            1K-blocks   Used Available Use% Mounted on
tmpfs                    949800    488    949312   1% /dev
tmpfs                    949800      0    949800   0% /mnt
/dev/block/mmcblk0p25   1033516 593500    440016  58% /system
/dev/block/mmcblk0p28  13162172 382548  12779624   3% /data
/dev/block/mmcblk0p27    706392  12872    693520   2% /cache
/dev/block/mmcblk0p16     16164   4292     11872  27% /persist
/dev/block/mmcblk0p1      65488  45392     20096  70% /firmware
/dev/fuse              13162172 382548  12779624   3% /mnt/runtime/default/emulated
/dev/fuse              13162172 382548  12779624   3% /mnt/runtime/read/emulated
/dev/fuse              13162172 382548  12779624   3% /mnt/runtime/write/emulated

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分区是例外。

分区文件系统作用
bootbootimg内核+ initramfs。含有内核和l默认启动过程中所需的initramfs
cacheExt4用来进行系统升级或recovery
recoverybootimg用于把系统启动到recovery模式下,内核将系统启动至recovery 模式的initramfs
systemExt4用于存放操作系统的二进制可执行文件和框架
dataExt4/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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值