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,

posted @ 2022-05-10 18:59  梦过无声  阅读(1265)  评论(0编辑  收藏  举报