概述
在某些情况下挂着分区时需要单独做挂载的特性处理,比如小内存优化时,mount时不需要discard特性。因此我们在mount时做判断,符合条件加上相关特性,不符合则去除。这需要确定两点,首先我们要清楚mount流程,用来确定在什么地方做判断最合适。其次明确判断条件,mount data时是该版本去除discard属性,不是该版本保留discard属性。
参考源码: AndroidXref Nougat 7.1.1
mount相关命令介绍
mount - 挂载文件系统
此命令的标准格式是:
-t 文件系统类型 常用的有ext4 ufs vfat
device 设备节点
dir 挂载点
- 原 dir 里面的 内容/属主/权限 将被屏蔽,直到此设备被卸载。
- 如果只给出了 dir 或者只给出了 device ,那么将根据 /etc/fstab 的设置进行挂载。
- 如果想避免 dir 与 device 之间的混淆,可以使用 –target(表示dir) 或 –source(表示device) 进行明确标明:
|
|
常用flag
noatime
常用option
discard
此处以后慢慢补充相关介绍。
在android系统终我们可以使用下面命令查看基本分区信息。
mount流程
Android系统中有很多分区,如”system” “data” “cache”分区等,通常在kernel起来后执行的第一个文件init进程中去挂载这些分区,init进程会根据init.rc的规则进行启动进程或相关服务。
/device/moto/shamu/init.shamu.rc
|
|
在init.rc规则文件中我们看到挂载相关主要使用两个命令mount和mount_all,下面我们将分别分析这两个命令。
system/core/init/builtins.c
|
|
我们可以看到mount对应的函数为do_mount,因此我们继续追踪do_mount函数。
|
|
do_mount函数比较简单,最后使用系统调用mount函数来挂载分区。至此mount命令结束,如果有特殊需求我们也可以在此函数上做简单修改。例如判断为对应版本的flash时追加discard属性:
而mount_all命令对应do_mount_all函数。
do_mount_all函数传入的参数为fstab.shamu文件系统挂载表路径。该函数首先对参数进行了预处理。然后调用mount_fastab函数,进行mount操作。首先我们看下fstab。
/device/moto/shamu/fstab.shamu
|
|
每行对应的是设备节点,挂载点,flag以及options,我们继续追踪mount_fstab函数。
该函数中主要调用两个函数,首先读取fstab挂载表,然后挂载。
我们继续看这两个函数
/system/core/fs_mgr/fs_mgr_fstab.c
|
|
可以看函数到按行读取fstab,返回fstab结构体实例.因此如果有特殊需求我们可以在读取文件系统表时做文章。下面就是fs_mgr_mount_all函数。
进一步调用fs_mgr_do_mount函数。然后走到__mount函数,最终任然使用系统调用mount函数: