android fstab文件,[Android6.0][RK3399] fstab 文件格式说明和解析代码跟踪
Author: Younix
Platform: RK3399
OS: Android 6.0
Kernel: 4.4
Version: v2017.04
一、格式说明
以 RK3399 的 Android 系统为例。
我们看看根目录下的 fstab.rk30board 文件。
/dev/.. /mnt/internal_sd vfat defaults voldmanaged=internal_sd:14,nomulated
1.1 src
表示 待挂载的设备节点路径
1.2 mount point
表示 挂载点,即 被挂载的目录
1.3 filesystem type
表示 所挂载磁盘的文件系统类型
1.4 mount flags parameters
表示 指定所挂载的文件系统的一些参数,如下
async/sync : 设置是否为同步方式运行
auto/noauto : 当下载mount -a 的命令时,此文件系统是否被主动挂载。默认为auto
rw/ro : 是否以以只读或者读写模式挂载
exec/noexec : 限制此文件系统内是否能够进行”执行”的操作
user/nouser : 是否允许用户使用mount命令挂载
suid/nosuid : 是否允许SUID的存在
usrquota : 启动文件系统支持磁盘配额模式
grpquota : 启动文件系统对群组磁盘配额模式的支持
defaults : 同时具有rw,suid,dev,exec,auto,nouser,async等默认参数的设置
二、加载、解析、执行
2.1 从 init 开始
kernel 加载完后第一个执行的就是 init 进程,init 进程会根据 init.rc 规则启动进程或者服务。
对于我们 rk3399 的板子:
我采用的是 rk3399_mid 工程
./rk3399/rk3399_mid/init.rc:9:import /init.${ro.hardware}.rc
./common/init.rk30board.bootmode.emmc.rc:7: mount_all fstab.rk30board
这个 fstab.rk30board 实际上是 /fstab.rk30board.bootmode.emmc 的软链接。
2.2 mount_all
mount_all 定义在 system/core/init/keywords.h
KEYWORD(mount_all, COMMAND, 1, do_mount_all)
即会调用 do_mount_all(fstab.rk30board)
2.3 do_mount_all
代码在 system/core/init/builtins.c
/* * This function might request a reboot, in which case it will * not return. */
int do_mount_all(int nargs, char **args)
{
pid_t pid;
int ret = -1;
int child_ret = -1;
int status;
const char *prop;
struct fstab *fstab;
if (nargs != 2) {
return -1;
}
/* * Call fs_mgr_mount_all() to mount all filesystems. We fork(2) and * do the call in the child to provide protection to the main init * process if anything goes wrong (crash or memory leak), and wait for * the child to finish in the parent. */
pid = fork();
if (pid > 0) {
/* Parent. Wait for the child to return */
int wp_ret = TEMP_FAILURE_RETRY(waitpid(pid, &status, 0));
if (wp_ret < 0) {
/* Unexpected error code. We will continue anyway. */
NOTICE("waitpid failed rc=%d, errno=%d\n", wp_ret, errno);
}
if (WIFEXITED(status)) {
ret = WEXITSTATUS(status);
} else {
ret = -1;
}
} else if (pid == 0) {
/* child, call fs_mgr_mount_all() */
klog_set_level(6); /* So we can see what fs_mgr_mount_all() does */
fstab = fs_mgr_read_fstab(args[1]); //解析分区文件fstab
child_ret = fs_mgr_mount_all(fstab);
fs_mgr_free_fstab(fstab);
if (child_ret == -1) {
ERROR("fs_mgr_mount_all returned an error\n");
}
_exit(child_ret);
} else {
/* fork failed, return an error */
return -1;
}
if (ret == FS_MGR_MNTALL_DEV_NEEDS_ENCRYPTION) {
property_set("vold.decrypt", "trigger_encryption");
} else if (ret == FS_MGR_MNTALL_DEV_MIGHT_BE_ENCRYPTED) {
property_set("ro.crypto.state", "encrypted");
property_set("vold.decrypt", "trigger_default_encryption");
} else if (ret == FS_MGR_MNTALL_DEV_NOT_ENCRYPTED) {
property_set("ro.crypto.state", "unencrypted");
/* If fs_mgr determined this is an unencrypted device, then trigger * that action. */
action_for_each_trigger("nonencrypted", action_add_queue_tail);
} else if (ret == FS_MGR_MNTALL_DEV_NEEDS_RECOVERY) {
/* Setup a wipe via recovery, and reboot into recovery */
ERROR("fs_mgr_mount_all suggested recovery, so wiping data via recovery.\n");
ret = wipe_data_via_recovery();
/* If reboot worked, there is no return. */
} else if (ret > 0) {
ERROR("fs_mgr_mount_all returned unexpected error %d\n", ret);
}
/* else ... < 0: error */
return ret;
}
我们看到,首先会通过 fs_mgr_read_fstab 读取/解析
fstab文件 将其中的内容存在名为 fstab 的结构体中。
2.4 fs_mgr_read_fstab
./fs_mgr_fstab.c
fstab->recs[cnt].fs_mgr_flags = parse_flags(p, fs_mgr_flags,
&flag_vals, NULL, 0);
fstab->recs[cnt].key_loc = flag_vals.key_loc;
fstab->recs[cnt].verity_loc = flag_vals.verity_loc;
fstab->recs[cnt].length = flag_vals.part_length;
fstab->recs[cnt].label = flag_vals.label;
fstab->recs[cnt].partnum = flag_vals.partnum;
fstab->recs[cnt].swap_prio = flag_vals.swap_prio;
fstab->recs[cnt].zram_size = flag_vals.zram_size;
然后通过 fs_mgr_mount_all 对文件系统进行挂载。
2.5 fs_mgr_mount_all
其代码在 .system/core/fs_mgr/fs_mgr.c 这里不再进一步分析。
参考文章
android fstab文件,[Android6.0][RK3399] fstab 文件格式说明和解析代码跟踪相关推荐
- [Android6.0][RK3399] PCIe 转 SATA 调试步骤
Author: Younix Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017.04 一PCI 设备调试手段 busybox ls ...
- [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录
原址 Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017.04 4G Module: EC20-CE 一基本概念 USB 部 ...
- Android教程 -05 Android6.0权限的管理
视频为本篇博客知识的讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 height="498" width="510" src="http://pl ...
- android+桌面歌词,Android6.0系统适配桌面歌词效果
在360手机助手及各家的音乐播放器软件上,都使用了桌面浮动窗功能,桌面歌词都是在音乐客户端显示在前台时隐藏,在用户把软件切换到后台后显示出来,此效果在Android 6.0以前,大部分都是使用系统的A ...
- android闪光灯参数,android6.0中的闪光灯
在android6.0中,加入了Camera相关新特性,在做开发过程中,遇到闪光灯的操作,如下: 1.导入包: import android.hardware.camera2.CameraManage ...
- 这可能是最精简的Android6.0运行时权限处理,百行代码的工具类,支持Rationale,附:各种权限详细处理
0x00:前言 对于Android6.0运行时权限的处理方式网上有很多,包括注解,RxJava等等.一直没有正面提到我关心的问题–如果我不在Activity或者Fragment里面,需要运行时权限该怎 ...
- android 6.0 电池曲线,Android6.0 RK3399 电池系统(一)BQ25700 IC 驱动分析 · Younix’s Studio...
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017. ...
- [Android6.0][RK3399] 双屏异显代码实现流程分析(二)
Patch Code dtsi rk3399-androiddtsi rk3399-evb-rev3-androiddts lcdc 控制器 rk322x_lcdcc rk_fbc timing 初始 ...
- [Android6.0][RK3399] 双屏异显代码实现流程分析(二)【转】
本文转载自:http://blog.csdn.net/dearsq/article/details/55050125 Patch Code dtsi rk3399-androiddtsi rk3399 ...
最新文章
- 使用squid在阿里云服务器(centos7)上搭建自己的代理服务器
- mac java+selenium 实现UI自动化1_琉璃
- 关于realarm S5P4418的u-boot显示内存大小问题解决方法
- from表单提交和JSON区别
- 携程元旦出游数据:冰雪运动热度升级 张家口酒店一房难求
- nginx编译包含perl模块
- iOS开发之cocoapods报错问题You need at least git version 1.8.5 to use CocoaPods
- KNN--K近邻算法
- Apache Commons Net 实现 FTP 上传/下载/删除/同步
- grasshopper python_【转】精华教学 | GH_Cpython——将原生的 Python 与机器学习框架引入Grasshopper...
- 按要求写mysql语句_根据要求写SQL 语句
- 阴阳师2017 7服务器维护,《阴阳师》手游4月17日维护更新公告
- 推荐一些非常好用的网盘搜索神器
- 【LeetCode】377. 组合总和 Ⅳ(错题2刷)
- Python手写汉字(中文)识别~单字/多字推荐模式
- 多年经验的程序员迷失了自己,该怎么办
- matlab 中的del2函数
- (PC+WAP)美女图片大全类网站pbootcms模板 明星写真网站源码下载
- iOS 设计主题(迟来的总结)
- ggplot2-局部整体型图表