Android SDCard Mount 流程分析
16lz
2021-01-23
本篇大纲
android系统如何开机启动监听mount服务
默认设备节点在Android系统的哪个目录
vold.fstab配置文件的分析
vold里面启动页面main做了些什么
android系统如何开机启动监听mount服务
androidsdcard热插拔监测和执行操作是由一个启动文件vold所统领的,系统开机会读取初始化配置文件init.rc,该文件位于比如我的板子是:device/ti/omap3evm/init.rc,具体根据自己平台查找。里面有一个是默认启动vold服务的代码,如下:
servicevold/system/bin/vold
socketvoldstream0660rootmount
iopriobe2
如果要对该文件做出修改之类,要重新编一下boot.img镜像文件,烧录进android系统,之后可以在android的文件系统根目录找到init.rc文件。上述代码为启动vold启动文件,也可以在init.rc增加多一些我们想要的文件目录,比如增加一个可以存放多分区挂载的目录等,这个是后话。
默认设备节点在Android系统的哪个目录
usbdisk或者sdcard热插拔的时候,kernel会发出命令执行mount或者unmount操作,但这都是驱动级的。而mount目录会在android的文件系统目录下:/dev/block/vold这个目录由vold生成,用来存放所有的usbdisk或者sdcard的设备节点。代码位于main里面最优先执行:
mkdir("/dev/block/vold",0755);
可以根据这个目录找到如下节点:
sh-4.1#ls/dev/block/vold/
179:0179:18:08:18:28:38:4
节点的小介绍:
0代表当前的整个设备,1代码当前设备的分区名称代号。
所以你会发现,sdcard只有一个分区它却生成了两个如:179:0179:1
而usbdisk有四个分区,它会生成五个设备节点:8:08:18:28:38:4就是这个原因。
vold.fstab配置文件的分析
vold里面会通过指定文件来读取预先配置好的sdcard或者多分区配置文件,该文件位于
/system/core/rootdir/etc/vold.fstab
如以下的配置文件为:
dev_mountsdcard/mnt/sdcardauto/devices/platform/goldfish_mmc.0/devices/platform/msm_sdcc.2/mmc_host/mmc1
dev_mount代表挂载格式
sdcard代表挂载的标签
/mnt/sdcard代表挂载点
auto为自定义选项可以为任何,但必须在main里面自己判断比如这里的意思为自动挂载
后面两个目录为设备路径,第一个如果被占用会选择第二个
配置文件可以根据自己的需要编写,并不是固定的,但最好遵循googlevold启动文件代码的格式编写,要不然会给我们修改代码或者增加多分区功能带来不小的麻烦,如以下我自己编写的多分区挂载支持vold.fstab配置文件:
dev_mountsdcardexternal/mnt/sdcardauto/devices/platform/mmci-omap-hs.0/mmc_host/mmc0/devices/platform/mmci-omap-hs.0/mmc_host/mmc1
dev_mountusb1external/mnt/usbdisk/usb1-disk%dall/devices/platform/ehci-omap.0/usb1/1-2/1-2.1/
dev_mountusb2external/mnt/usbdisk/usb2-disk%dall/devices/platform/ehci-omap.0/usb1/1-2/1-2.2/
dev_mountusb3external/mnt/usbdisk/usb3-disk%dall/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/
该文件修改后经系统编译会在android系统目录里/system/etc/vold.fstab找到。
/devices/platform/ehci-omap.0/usb1/1-2/1-2.1/代表要挂载的USB口。
vold.fstab只是一个单纯的配置文件,具体的读取和取数据还是要靠main里面的process_config函数。看代码,里面正有一段用来读取配置文件:
if(!(fp=fopen("/etc/vold.fstab","r"))){
return-1;
}
在这个函数里面会根据读取到的数据存放起来,然后满足条件时执行操作。比如代码里面的:
if(!strcmp(type,"dev_mount")){
DirectVolume*dv=NULL;
char*part;
if(!(part=strtok_r(NULL,delim,&save_ptr))){
SLOGE("Errorparsingpartition");
gotoout_syntax;
}
if(strcmp(part,"auto")&&atoi(part)==0){
SLOGE("Partitionmusteitherbe’auto’or1basedindexinsteadof’%s’",part);
gotoout_syntax;
}
if(!strcmp(part,"auto")){
dv=newDirectVolume(vm,label,mount_point,-1);
}else{
dv=newDirectVolume(vm,label,mount_point,atoi(part));
}
while((sysfs_path=strtok_r(NULL,delim,&save_ptr))){
if(*sysfs_path!=’/’){
/*Ifthefirstcharacterisnota’/’,itmustbeflags*/
break;
}
if(dv->addPath(sysfs_path)){
SLOGE("Failedtoadddevpath%stovolume%s",sysfs_path,
label);
gotoout_fail;
}
}
/*Ifsysfs_pathisnon-nullatthispoint,thenitcontains
*theoptionalflagsforthisvolume
*/
if(sysfs_path)
flags=parse_mount_flags(sysfs_path);
else
flags=0;
dv->setFlags(flags);
vm->addVolume(dv);
}
DirectVolume后面会讲到,执行mount和unmount都是它在做。
另外,有时后读取配置文件会有问题,这是因为它读取是通过指标下标递增的方式在读,如果有问题可以跟踪打印一下配置文件,看哪里需要修改。
android系统如何开机启动监听mount服务
默认设备节点在Android系统的哪个目录
vold.fstab配置文件的分析
vold里面启动页面main做了些什么
android系统如何开机启动监听mount服务
androidsdcard热插拔监测和执行操作是由一个启动文件vold所统领的,系统开机会读取初始化配置文件init.rc,该文件位于比如我的板子是:device/ti/omap3evm/init.rc,具体根据自己平台查找。里面有一个是默认启动vold服务的代码,如下:
servicevold/system/bin/vold
socketvoldstream0660rootmount
iopriobe2
如果要对该文件做出修改之类,要重新编一下boot.img镜像文件,烧录进android系统,之后可以在android的文件系统根目录找到init.rc文件。上述代码为启动vold启动文件,也可以在init.rc增加多一些我们想要的文件目录,比如增加一个可以存放多分区挂载的目录等,这个是后话。
默认设备节点在Android系统的哪个目录
usbdisk或者sdcard热插拔的时候,kernel会发出命令执行mount或者unmount操作,但这都是驱动级的。而mount目录会在android的文件系统目录下:/dev/block/vold这个目录由vold生成,用来存放所有的usbdisk或者sdcard的设备节点。代码位于main里面最优先执行:
mkdir("/dev/block/vold",0755);
可以根据这个目录找到如下节点:
sh-4.1#ls/dev/block/vold/
179:0179:18:08:18:28:38:4
节点的小介绍:
0代表当前的整个设备,1代码当前设备的分区名称代号。
所以你会发现,sdcard只有一个分区它却生成了两个如:179:0179:1
而usbdisk有四个分区,它会生成五个设备节点:8:08:18:28:38:4就是这个原因。
vold.fstab配置文件的分析
vold里面会通过指定文件来读取预先配置好的sdcard或者多分区配置文件,该文件位于
/system/core/rootdir/etc/vold.fstab
如以下的配置文件为:
dev_mountsdcard/mnt/sdcardauto/devices/platform/goldfish_mmc.0/devices/platform/msm_sdcc.2/mmc_host/mmc1
dev_mount代表挂载格式
sdcard代表挂载的标签
/mnt/sdcard代表挂载点
auto为自定义选项可以为任何,但必须在main里面自己判断比如这里的意思为自动挂载
后面两个目录为设备路径,第一个如果被占用会选择第二个
配置文件可以根据自己的需要编写,并不是固定的,但最好遵循googlevold启动文件代码的格式编写,要不然会给我们修改代码或者增加多分区功能带来不小的麻烦,如以下我自己编写的多分区挂载支持vold.fstab配置文件:
dev_mountsdcardexternal/mnt/sdcardauto/devices/platform/mmci-omap-hs.0/mmc_host/mmc0/devices/platform/mmci-omap-hs.0/mmc_host/mmc1
dev_mountusb1external/mnt/usbdisk/usb1-disk%dall/devices/platform/ehci-omap.0/usb1/1-2/1-2.1/
dev_mountusb2external/mnt/usbdisk/usb2-disk%dall/devices/platform/ehci-omap.0/usb1/1-2/1-2.2/
dev_mountusb3external/mnt/usbdisk/usb3-disk%dall/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/
该文件修改后经系统编译会在android系统目录里/system/etc/vold.fstab找到。
/devices/platform/ehci-omap.0/usb1/1-2/1-2.1/代表要挂载的USB口。
vold.fstab只是一个单纯的配置文件,具体的读取和取数据还是要靠main里面的process_config函数。看代码,里面正有一段用来读取配置文件:
if(!(fp=fopen("/etc/vold.fstab","r"))){
return-1;
}
在这个函数里面会根据读取到的数据存放起来,然后满足条件时执行操作。比如代码里面的:
if(!strcmp(type,"dev_mount")){
DirectVolume*dv=NULL;
char*part;
if(!(part=strtok_r(NULL,delim,&save_ptr))){
SLOGE("Errorparsingpartition");
gotoout_syntax;
}
if(strcmp(part,"auto")&&atoi(part)==0){
SLOGE("Partitionmusteitherbe’auto’or1basedindexinsteadof’%s’",part);
gotoout_syntax;
}
if(!strcmp(part,"auto")){
dv=newDirectVolume(vm,label,mount_point,-1);
}else{
dv=newDirectVolume(vm,label,mount_point,atoi(part));
}
while((sysfs_path=strtok_r(NULL,delim,&save_ptr))){
if(*sysfs_path!=’/’){
/*Ifthefirstcharacterisnota’/’,itmustbeflags*/
break;
}
if(dv->addPath(sysfs_path)){
SLOGE("Failedtoadddevpath%stovolume%s",sysfs_path,
label);
gotoout_fail;
}
}
/*Ifsysfs_pathisnon-nullatthispoint,thenitcontains
*theoptionalflagsforthisvolume
*/
if(sysfs_path)
flags=parse_mount_flags(sysfs_path);
else
flags=0;
dv->setFlags(flags);
vm->addVolume(dv);
}
DirectVolume后面会讲到,执行mount和unmount都是它在做。
另外,有时后读取配置文件会有问题,这是因为它读取是通过指标下标递增的方式在读,如果有问题可以跟踪打印一下配置文件,看哪里需要修改。
更多相关文章
- Android存储访问及目录
- Android学习目录
- android获取文件目录
- android 使用VideoView加载raw目录内视频资源
- android的文件、目录操作
- 高通 rom 分区表
- Android 4.0系统源码目录结构详解
- 【Android的从零单排开发日记】之入门篇(三)——Android目录结构
- android developers api guides 文档学习笔记(目录)