本篇大綱
- android 系統如何開機啓動監聽mount服務
- 默認掛載點在Android 系統的哪一個目錄
- vold.fstab 配置文件的分析
- vold 裏面啓動頁面main作了些什麼
android 系統如何開機啓動監聽mount服務
android sdcard 熱插拔監測和執行操做是由一個啓動文件vold 所統領的,系統開機會讀取初始化配置文件init.rc,該文件位於好比個人板子是:device/ti/omap3evm/init.rc,具體根據本身平臺查找。裏面有一個是默認啓動vold 服務的代碼,以下:socket
service vold /system/bin/vold
socket vold stream 0660 root mount
ioprio be 2
若是要對該文件作出修改之類,要從新編一下boot.img 鏡像文件,燒錄進android 系統,以後能夠在android的文件系統根目錄找到init.rc文件。上述代碼爲啓動vold 啓動文件,也能夠在init.rc 增長多一些咱們想要的文件目錄,好比增長一個能夠存放多分區掛載的目錄等,這個是後話。ide
默認掛載點在Android 系統的哪一個目錄
usbdisk 或者 sdcard 熱插拔的時候,kernel 會發出命令執行mount或者unmount 操做,但這都是驅動級的。而mount 目錄會在android 的文件系統目錄下:/dev/block/vold 這個目錄由vold 生成,用來存放全部的usbdisk 或者 sdcard 的掛載點。代碼位於main裏面最優先執行:函數
mkdir("/dev/block/vold", 0755)
;
能夠根據這個目錄找到以下節點:post
sh-4.1# ls /dev/block/vold/
179:0 179:1 8:0 8:1 8:2 8:3 8:4
節點的小介紹:this
0表明當前的整個設備,1代碼當前設備的分區名稱代號。google
因此你會發現,sdcard只有一個分區它卻生成了兩個如:179:0 179:1url
而usbdisk 有四個分區,它會生成五個掛載點: 8:0 8:1 8:2 8:3 8:4 就是這個緣由。spa
vold.fstab 配置文件的分析
vold 裏面會經過指定文件來讀取預先配置好的sdcard或者多分區配置文件,該文件位於code
/system/core/rootdir/etc/vold.fstab
如如下的配置文件爲:
dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1
dev_mount 表明掛載格式
sdcard 表明掛載的標籤
/mnt/sdcard 表明掛載點
auto 爲自定義選項能夠爲任何,但必須在main 裏面本身判斷好比這裏的意思爲自動掛載
後面兩個目錄爲設備路徑,第一個若是被佔用會選擇第二個
配置文件能夠根據本身的須要編寫,並非固定的,但最好遵循google vold 啓動文件代碼的格式編寫,要否則會給咱們修改代碼或者增長多分區功能帶來不小的麻煩,如如下我本身編寫的多分區掛載支持vold.fstab 配置文件:
dev_mount sdcard external /mnt/sdcard auto /devices/platform/mmci-omap-hs.0/mmc_host/mmc0 /devices/platform/mmci-omap-hs.0/mmc_host/mmc1
dev_mount usb1 external /mnt/usbdisk/usb1-disk%d all /devices/platform/ehci-omap.0/usb1/1-2/1-2.1/
dev_mount usb2 external /mnt/usbdisk/usb2-disk%d all /devices/platform/ehci-omap.0/usb1/1-2/1-2.2/
dev_mount usb3 external /mnt/usbdisk/usb3-disk%d all /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(
"
Error parsing partition
");
goto out_syntax;
}
if (strcmp(part,
"
auto
") && atoi(part) ==
0) {
SLOGE(
"
Partition must either be 'auto' or 1 based index instead of '%s'
", part);
goto out_syntax;
}
if (!strcmp(part, "auto")) {
dv = new DirectVolume(vm, label, mount_point, -1);
} else {
dv = new DirectVolume(vm, label, mount_point, atoi(part));
}
while ((sysfs_path = strtok_r(NULL, delim, &save_ptr))) {
if (*sysfs_path !=
'
/
') {
/*
If the first character is not a '/', it must be flags
*/
break;
}
if (dv->addPath(sysfs_path)) {
SLOGE(
"
Failed to add devpath %s to volume %s
", sysfs_path,
label);
goto out_fail;
}
}
/*
If sysfs_path is non-null at this point, then it contains
* the optional flags for this volume
*/
if (sysfs_path)
flags = parse_mount_flags(sysfs_path);
else
flags =
0;
dv->setFlags(flags);
vm->addVolume(dv);
}
DirectVolume後面會講到,執行mount 和unmount 都是它在作。
另外,有時後讀取配置文件會有問題,這是由於它讀取是經過指標下標遞增的方式在讀,若是有問題能夠跟蹤打印一下配置文件,看哪裏須要修改。
vold 裏面啓動頁面main作了些什麼
main 主要是初始化socket 鏈接監聽數據變化,在系統起來時第一時間啓動,而且經過讀取配置文件來識別usb口或者sdcard 的設備地址,來mount 或者unmount 。其它執行mount 、 unmount 或者刪除節點等操做都是由上層或者framework 發送命令給main讓其通知volumeManage 執行相應的操做。