Android Init 文件系统挂载
首先是init加载rc文件: /vendor/etc/init/hw/init.rockchip.rc
在其中引入import /vendor/etc/init/hw/init.mount_all.rc
// cat /vendor/etc/init/hw/init.mount_all.rc
# do mount_all early can imporve boot time when FBE
# is enabled
on early-fs
start vold
on fs
mount_all /vendor/etc/fstab.${ro.hardware} --early
on late-fs
# Start services for bootanim
start servicemanager
start hwcomposer-2-1
start gralloc-2-0
start surfaceflinger
start bootanim
exec_start wait_for_keymaster
# Mount RW partitions which need run fsck
mount_all /vendor/etc/fstab.${ro.hardware} --late
我的源码是Android 12
其中的mount_all对应函数system/core/init/builtins.cpp
中的do_mount_all
函数
并且指定了fstab文件/vendor/etc/fstab.${ro.hardware}
这里看一部分关键代码:
//
static Result<void> do_mount_all(const BuiltinArguments& args) {
... //省略
Fstab fstab;
if (mount_all->fstab_path.empty()) {
if (!ReadDefaultFstab(&fstab)) {
return Error() << "Could not read default fstab";
}
} else {
if (!ReadFstabFromFile(mount_all->fstab_path, &fstab)) {
return Error() << "Could not read fstab";
}
}
auto mount_fstab_result = fs_mgr_mount_all(&fstab, mount_all->mode);
}
fatab文件内容
# Android fstab file.
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
system /system ext4 ro,barrier=1 wait,logical,first_stage_mount
vendor /vendor ext4 ro,barrier=1 wait,logical,first_stage_mount
odm /odm ext4 ro,barrier=1 wait,logical,first_stage_mount
流程大致如下:
流程:
do_mount_all() --> ReadFstabFromFile() ---> fs_mgr_mount_all() ---> mount_with_alternatives()
mount_with_alternatives() -- > prepare_fs_for_mount() --> __mount()
mount_with_alternatives() --> 失败(搞些修复操作) --> fs_mgr_do_format() --> format_f2fs() || format_ext4()
ReadFstabFromFile() //主要是读取fstab文件信息,填充FstabEntry结构体
ParseFsMgrFlags()
ParseMountFlags()
fs_mgr_mount_all() //这是fs_mgr共享库的代码了,主要是判断fs_mgr_flags
mount_with_alternatives() //最终调用到__mount
format_ext4() //执行命令
"/system/bin/mke2fs", "-t", "ext4", "-b", "4096" -I 512
"/system/bin/e2fsdroid", "-e", "-a", fs_mnt_point.c_str(), fs_blkdev.c_str(), nullptr
tune_quota() //如果是ext4,并且开启了fstable里有quota
tune2fs, -Oquota, -Qusrquota,grpquota,prjquota, blk_device.c_str()
format_f2fs() //执行命令
"/system/bin/make_f2fs", "-g", "android" -O project_quota,extra_attr -O casefold -C utf8 -O compression -O extra_attr
prepare_fs_for_mount() //主要是文件系统设备块检查
read_f2fs_superblock()
read_ext4_superblock() // 如果有 quota需要开启 tune_quota ext4 比如:tune_reserved_size,tune_verity 都是通过tune2fs修改ext参数
__mount() //调用底层mount,这里做两两次,一次失败了就fsck后再做一次
ReadFstabFromFile() //init进程 读取fstab,填充结构提fstab,