Android-Native-之-文件系统挂载
Android Native 之 文件系统挂载
一、文件系统挂载流程概述
二、文件系统挂载流程细节
1、Init启动阶段
众所周知,init进程为android系统的第一个进程,也是native世界的开端,要想让整个android世界能够稳定的运行,文件系统的创建和初始化是必不可少的,这个过程需要在android世界的前面。
//aosp/system/core/init/first_stage_init.cpp
int FirstStageMain(int argc, char** argv) {
LOG(INFO) << "init first stage started!";
//.....
bool created_devices = false;
if (want_console == FirstStageConsoleParam::CONSOLE_ON_FAILURE) {
if (!IsRecoveryMode()) {
//第一步:创建设备
created_devices = DoCreateDevices();
if (!created_devices) {
LOG(ERROR) << "Failed to create device nodes early";
}
}
StartConsole(cmdline);
}
//......
//第二步:挂载设备
if (!DoFirstStageMount(!created_devices)) {
LOG(FATAL) << "Failed to mount required partitions early ...";
}
//.....
}
//aosp/system/core/init/first_stage_mount.cpp
// Public functions公共函数
// Creates devices and logical partitions from storage devices
bool DoCreateDevices() {
auto fsm = FirstStageMount::Create();
if (!fsm.ok()) {
LOG(ERROR) << "Failed to create FirstStageMount: " << fsm.error();
return false;
}
//来创建设备/即初始化磁盘逻辑分区
return (*fsm)->DoCreateDevices();
}
// Mounts partitions specified by fstab in device tree.
bool DoFirstStageMount(bool create_devices) {
// Skips first stage mount if we're in recovery mode.
if (IsRecoveryMode()) {
LOG(INFO) << "First stage mount skipped (recovery mode)";
return true;
}
auto fsm = FirstStageMount::Create();
if (!fsm.ok()) {
LOG(ERROR) << "Failed to create FirstStageMount " << fsm.error();
return false;
}
if (create_devices) {
if (!(*fsm)->DoCreateDevices()) return false;
}
//来进行文件系统的挂载
return (*fsm)->DoFirstStageMount();
}
//void SetInitAvbVersionInRecovery() 第三个public函数,看起来是和recovery有关系的
Init进程的通过FirstStageMount::Create()来拿到一个fsm对象,然后依次调用fsm的DoCreateDevices和DoFirstStageMount来初始化挂载文件系统。
1.1 FirstStageMount::Create读取fstab配置表
此步骤主要是读取fstab分区配置表,具体实现逻辑其实移交给了fs_mgr
//aosp/system/core/init/first_stage_mount.cpp
using android::fs_mgr::ReadDefaultFstab;
using android::fs_mgr::ReadFstabFromDt;
Result<std::unique_ptr<FirstStageMount>> FirstStageMount::Create() {
//读取fstab配置表,此表配置了各个目录支持的文件系统相关配置
auto fstab = ReadFirstStageFstab();
if (!fstab.ok()) {
return fstab.error();
}
return std::make_unique<FirstStageMountVBootV2>(std::move(*fstab));
}
static Result<Fstab> ReadFirstStageFstab() {
Fstab fstab;
//从DT里面获取,DT好像跟内核有关系,没有具体研究
if (!ReadFstabFromDt(&fstab)) {
//读取默认的fstab配置表
if (ReadDefaultFstab(&fstab)) {
fstab.erase(std::remove_if(fstab.begin(), fstab.end(),
[](const auto& entry) { return !entry.fs_mgr_flags.first_stage_mount; }),
fstab.end());
} else {
return Error() << "failed to read default fstab for first stage mount";
}
}
return fstab;
}
fs_mgr被编译成为静态库lib_fs_mgr,这部分逻辑其实就是读取fstab.ini配置文件并进行解析:
//aosp/system/core/fs_mgr/fs_mgr_fstab.cpp
// Loads the fstab file and combines with fstab entries passed in from device tree.
bool ReadDefaultFstab(Fstab* fstab) {
fstab->clear();
ReadFstabFromDt(fstab, false /* verbose */);
std::string default_fstab_path;
// Use different fstab paths for normal boot and recovery boot, respectively
if ((access("/sbin/recovery", F_OK) == 0) || (access("/system/bin/recovery", F_OK) == 0)) {
//recovery模式下读取/etc/recovery.fstab
default_fstab_path = "/etc/recovery.fstab";
} else { //正常模式下读取类似于/odm/etc/fstab.
default_fstab_path = GetFstabPath();
}
Fstab default_fstab;
if (!default_fstab_path.empty() && ReadFstabFromFile(default_fstab_path, &default_fstab)) {
for (auto&& entry : default_fstab) {
fstab->emplace_back(std::move(entry));
}
} else {
LINFO << __FUNCTION__ << "(): failed to find device default fstab";
}
return !fstab->empty();
}
// Return the path to the fstab file. There may be multiple fstab files; the
// one that is returned will be the first that exists of fstab.<fstab_suffix>,
// fstab.<hardware>, and fstab.<hardware.platform>. The fstab is searched for
// in /odm/etc/ and /vendor/etc/, as well as in the locations where it may be in
// the first stage ramdisk during early boot. Previously, the first stage
// ramdisk's copy of the fstab had to be located in the root directory, but now
// the system/etc directory is supported too and is the preferred location.
std::string GetFstabPath() {
for (const char* prop : {"fstab_suffix", "hardware", "hardware.platform"}) {
std::string suffix;
if (!fs_mgr_get_boot_config(prop, &suffix)) continue;
for (const char* prefix : {// late-boot/post-boot locations
"/odm/etc/fstab.", "/vendor/etc/fstab.",
// early boot locations
"/system/etc/fstab.", "/first_stage_ramdisk/system/etc/fstab.",
"/fstab.", "/first_stage_ramdisk/fstab."}) {
std::string fstab_path = prefix + suffix;
if (access(fstab_path.c_str(), F_OK) == 0) {
return fstab_path;
}
}
}
return "";
}
如下Android 14的手机的开机日志,在init阶段来读取fstab配置表的打印:这里的dt没有配置fstab,默认路径没有任何打印,但是可以了解到libfs_mgr的入口
1.2 fstab文件是什么样子的?
android系统的文件系统相关参数定义被统一放在fstab.in里面,从上面的流程可以了解到fs_mgr会去读取fstab.*文件,并根据此文件配置的内容去逐一挂载所有的分区,那么它到底长什么样子的呢?
首先cat /vendor/etc/fstab.mtxxxx内容如下:
D50:/vendor/etc # cat fsta
fstab.enableswap fstab.mt6765 fstab.mt8768
D50:/vendor/etc # cat fstab.mt6765
# 1 "vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 341 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765" 2
# 145 "vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765"
system /system ext4 ro wait,avb=vbmeta_system,logical,first_stage_mount,avb_keys=/avb/q-gsi.avbpubkey:/avb/r-gsi.avbpubkey:/avb/s-gsi.avbpubkey,slotselect
system_ext /system_ext ext4 ro wait,avb=vbmeta_system,logical,first_stage_mount,avb_keys=/avb/q-gsi.avbpubkey:/avb/r-gsi.avbpubkey:/avb/s-gsi.avbpubkey,slotselect
vendor /vendor ext4 ro wait,avb,logical,first_stage_mount,slotselect
product /product ext4 ro wait,avb,logical,first_stage_mount,slotselect
# 170 "vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765"
/dev/block/by-name/md_udc /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable,first_stage_mount
/dev/block/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,noflush_merge,reserve_root=134217,resgid=1065,inlinecrypt latemount,wait,check,quota,reservedsize=128M,formattable,resize,,checkpoint=fs,fileencryption=aes-256-xts:aes-256-cts:v2,keydirectory=/metadata/vold/metadata_encryption
/dev/block/by-name/protect1 /mnt/vendor/protect_f ext4 noatime,nosuid,nodev,noauto_da_alloc,commit=1,nodelalloc wait,check,formattable
/dev/block/by-name/protect2 /mnt/vendor/protect_s ext4 noatime,nosuid,nodev,noauto_da_alloc,commit=1,nodelalloc wait,check,formattable
/dev/block/by-name/nvdata /mnt/vendor/nvdata ext4 noatime,nosuid,nodev,noauto_da_alloc,commit=1,nodelalloc wait,check,formattable
/dev/block/by-name/nvcfg /mnt/vendor/nvcfg ext4 noatime,nosuid,nodev,noauto_da_alloc,commit=1,nodelalloc wait,check,formattable
/dev/block/by-name/persist /mnt/vendor/persist ext4 noatime,nosuid,nodev,noauto_da_alloc,commit=1,nodelalloc wait,check,formattable
/devices/platform/externdevice* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
/devices/platform/mt_usb* auto vfat defaults voldmanaged=usbotg:auto
/dev/block/by-name/frp /persistent emmc defaults defaults
/dev/block/by-name/nvram /nvram emmc defaults defaults
/dev/block/by-name/proinfo /proinfo emmc defaults defaults
/dev/block/by-name/lk /bootloader emmc defaults defaults
/dev/block/by-name/lk2 /bootloader2 emmc defaults defaults
/dev/block/by-name/para /misc emmc defaults defaults
/dev/block/by-name/boot /boot emmc defaults first_stage_mount,nofail,slotselect
# 210 "vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765"
/dev/block/by-name/vbmeta_vendor /vbmeta_vendor emmc defaults first_stage_mount,nofail,slotselect
/dev/block/by-name/vbmeta_system /vbmeta_system emmc defaults first_stage_mount,nofail,slotselect,avb=vbmeta
/dev/block/by-name/logo /logo emmc defaults defaults
/dev/block/by-name/expdb /expdb emmc defaults defaults
/dev/block/by-name/seccfg /seccfg emmc defaults defaults
/dev/block/by-name/tee1 /tee1 emmc defaults defaults
/dev/block/by-name/tee2 /tee2 emmc defaults defaults
/dev/block/by-name/scp1 /scp1 emmc defaults defaults
/dev/block/by-name/scp2 /scp2 emmc defaults defaults
/dev/block/by-name/sspm_1 /sspm_1 emmc defaults defaults
/dev/block/by-name/sspm_2 /sspm_2 emmc defaults defaults
/dev/block/by-name/md1img /md1img emmc defaults defaults
/dev/block/by-name/md1dsp /md1dsp emmc defaults defaults
/dev/block/by-name/md1arm7 /md1arm7 emmc defaults defaults
/dev/block/by-name/md3img /md3img emmc defaults defaults
/dev/block/by-name/gz1 /gz1 emmc defaults defaults
/dev/block/by-name/gz2 /gz2 emmc defaults defaults
/dev/block/by-name/spmfw /spmfw emmc defaults defaults
/dev/block/by-name/boot_para /boot_para emmc defaults defaults
/dev/block/by-name/odmdtbo /odmdtbo emmc defaults defaults
/dev/block/by-name/dtbo /dtbo emmc defaults defaults
/dev/block/by-name/vbmeta /vbmeta emmc defaults defaults
D50:/vendor/etc #
如上格式,此文件可以解析如下三部分
那么我们在源代码是如何配置的呢?MTK可以参考如下逻辑,后文详细解读各大配置参数
1.3 FirstStageMount::DoCreateDevices
//aosp/system/core/init/first_stage_mount.cpp
bool FirstStageMount::DoCreateDevices() {
if (!InitDevices()) return false;
// Mount /metadata before creating logical partitions, since we need to
// know whether a snapshot merge is in progress.
auto metadata_partition = std::find_if(fstab_.begin(), fstab_.end(), [](const auto& entry) {
//从fstab配置表中寻找/metadata分区的信息,此分区很重要存储了一些元数据和秘钥相关的东西
return entry.mount_point == "/metadata";
});
if (metadata_partition != fstab_.end()) {
//首先需要挂载/metadata分区,因为它太重要了
if (MountPartition(metadata_partition, true /* erase_same_mounts */)) {
// Copies DSU AVB keys from the ramdisk to /metadata.
// Must be done before the following TrySwitchSystemAsRoot().
// Otherwise, ramdisk will be inaccessible after switching root.
//它为什么重要,就是因为拷贝AVB Key到这个目录,详细的待后续研究
CopyDsuAvbKeys();
}
}
//创建逻辑分区
if (!CreateLogicalPartitions()) return false;
return true;
}
流程1:如上逻辑首先挂载了/metadata分区,为什么要先挂载它?
流程2:/metadata分区挂载流程对应日志:注意这里调用了metadata_partition函数传递了参数,所以只挂载了一个分区
流程3:创建逻辑分区,那么何为逻辑分区?从下面日志来看个人理解它类似与PC的C盘来区别于其他磁盘,因此这里的逻辑分区通常为system/vendor几个目录
如上日志对应逻辑代码如下:
1.4 FirstStageMount::DoFirstStageMount
//aosp/system/core/init/first_stage_mount.cpp
bool FirstStageMount::DoFirstStageMount() {
if (!IsDmLinearEnabled() && fstab_.empty()) {
// Nothing to mount.
LOG(INFO) << "First stage mount skipped (missing/incompatible/empty fstab in device tree)";
return true;
}
//挂载分区
if (!MountPartitions()) return false;
return true;
}
这里的主要流程还是去调用MountPartitions()去挂载分区,注意这里不像metadata哪里传递了参数,因此这里是根据fstab表去挂载所有其他分区,代码如下:
2、fstab文件参数解读
3、mount_all挂载分区
如上的一份开机日志,包括我在fs_mgr里面加的一些日志,可以看出来文件系统的挂载其实是init.rc里面触发执行mount_all命令。
3.1 init解析mount_all语句
mount_all /vendor/etc/fstab.mt6765 –early
init进程将/vendor/etc/fstab.mtxxxx文件传递到mount_all命令,在映射表就对应init进程的do_mount_all函数:
3.2 fs_mgr挂载所有分区
init进程最后在do_mount_all里面通过调用了libfs_mgr库里面的fs_mgr_mount_all函数来实现所有分区的挂载,如下逻辑:
// When multiple fstab records share the same mount_point, it will try to mount each
// one in turn, and ignore any duplicates after a first successful mount.
// Returns -1 on error, and FS_MGR_MNTALL_* otherwise.
MountAllResult fs_mgr_mount_all(Fstab* fstab, int mount_mode) {
int encryptable = FS_MGR_MNTALL_DEV_NOT_ENCRYPTABLE;
int error_count = 0;
CheckpointManager checkpoint_manager;
AvbUniquePtr avb_handle(nullptr);
bool wiped = false;
LINFO << "---------SHEN:fs_mgr fs_mgr_mount_all A";
bool userdata_mounted = false;
if (fstab->empty()) {
return {FS_MGR_MNTALL_FAIL, userdata_mounted};
}
//步骤一:遍历fstab所有分区,依次进行挂载
for (int i = 0; i < static_cast<int>(fstab->size()); i++) {
auto& current_entry = (*fstab)[i];
LINFO << "---------SHEN:fs_mgr fs_mgr_mount_all for fs_type = " << current_entry.fs_type;
LINFO << "---------SHEN:fs_mgr fs_mgr_mount_all for path = " << current_entry.mount_point;
LINFO << "---------SHEN:fs_mgr fs_mgr_mount_all for logical = " << current_entry.fs_mgr_flags.logical;
//步骤二:过滤那些条件下不应该被挂载
//条件一:如果文件系统应该在第一阶段挂载,但不可格式化或挂载点已经被挂载,那么就跳过该文件系统的挂载操作。然而,如果文件系统是可格式化的,且挂载点尚未被挂载,那么允许在这个阶段挂载该文件系统。
if (current_entry.fs_mgr_flags.first_stage_mount &&
(!current_entry.fs_mgr_flags.formattable ||
IsMountPointMounted(current_entry.mount_point))) {
continue;
}
//条件二:过滤那些由 vold 管理、仅用于恢复模式、不符合当前挂载模式的文件系统条目
if (current_entry.fs_mgr_flags.vold_managed || current_entry.fs_mgr_flags.recovery_only ||
((mount_mode == MOUNT_MODE_LATE) && !current_entry.fs_mgr_flags.late_mount) ||
((mount_mode == MOUNT_MODE_EARLY) && current_entry.fs_mgr_flags.late_mount)) {
continue;
}
//条件三:过滤那些交换分区(swap)以及特定原始分区(如 emmc、mtd)的文件系统条目
if (current_entry.fs_type == "swap" || current_entry.fs_type == "emmc" ||
current_entry.fs_type == "mtd") {
continue;
}
//条件四:过滤根目录/和/system目录,因为之前已经挂载过了
// Skip mounting the root partition, as it will already have been mounted.
if (current_entry.mount_point == "/" || current_entry.mount_point == "/system") {
LINFO << "---------SHEN:fs_mgr_mount_all for system";
if ((current_entry.flags & MS_RDONLY) != 0) {
fs_mgr_set_blk_ro(current_entry.blk_device);
}
continue;
}
//条件五:过滤/data目录,此目录貌似需要特殊处理
if (mount_mode == MOUNT_MODE_ONLY_USERDATA && current_entry.mount_point != "/data") {
LINFO << "---------SHEN:fs_mgr_mount_all for data";
continue;
}
//条件六:针对ext文件系统,尝试将文件系统标签转换成对应的块设备,如果转换失败输出日志并跳过此分区
// Translate LABEL= file system labels into block devices.
if (is_extfs(current_entry.fs_type)) {
if (!TranslateExtLabels(¤t_entry)) {
LERROR << "Could not translate label to block device";
continue;
}
}
//条件七:针对逻辑分区的文件系统条目,尝试设置逻辑分区。如果设置逻辑分区失败输出错误日志并跳过此分区
if (current_entry.fs_mgr_flags.logical) {
if (!fs_mgr_update_logical_partition(¤t_entry)) {
LERROR << "Could not set up logical partition, skipping!";
continue;
}
}
//步骤三:针对data分区进行包装,是否需要进行一些特殊处理
LINFO << "---------SHEN:fs_mgr fs_mgr_mount_all for WrapUserdataIfNeeded";
WrapUserdataIfNeeded(¤t_entry);
if (!checkpoint_manager.Update(¤t_entry)) {
continue;
}
if (current_entry.fs_mgr_flags.wait && !WaitForFile(current_entry.blk_device, 20s)) {
LERROR << "Skipping '" << current_entry.blk_device << "' during mount_all";
continue;
}
//步骤四:负责处理在Android系统中进行引导验证(AVB)所需的逻辑,包括打开 AvbHandle、设置 AVB hashtree,以及处理特定情况下的错误情况并跳过文件系统条目的挂载
if (current_entry.fs_mgr_flags.avb) {
if (!avb_handle) {
avb_handle = AvbHandle::Open();
if (!avb_handle) {
LERROR << "Failed to open AvbHandle";
set_type_property(encryptable);
return {FS_MGR_MNTALL_FAIL, userdata_mounted};
}
}
if (avb_handle->SetUpAvbHashtree(¤t_entry, true /* wait_for_verity_dev */) ==
AvbHashtreeResult::kFail) {
LERROR << "Failed to set up AVB on partition: " << current_entry.mount_point
<< ", skipping!";
// Skips mounting the device.
continue;
}
} else if (!current_entry.avb_keys.empty()) {
if (AvbHandle::SetUpStandaloneAvbHashtree(¤t_entry) == AvbHashtreeResult::kFail) {
LERROR << "Failed to set up AVB on standalone partition: "
<< current_entry.mount_point << ", skipping!";
// Skips mounting the device.
continue;
}
}
int last_idx_inspected;
int top_idx = i;
int attempted_idx = -1;
//步骤五:通过mount_with_alternatives函数尝试进行分区挂载
LINFO << "---------SHEN:fs_mgr fs_mgr_mount_all for mount_with_alternatives";
bool mret = mount_with_alternatives(*fstab, i, &last_idx_inspected, &attempted_idx);
auto& attempted_entry = (*fstab)[attempted_idx];
i = last_idx_inspected;
int mount_errno = errno;
// Handle success and deal with encryptability.
if (mret) {
//挂载成功的一些处理,例如handle_encryptable,并处理状态保存在status变量中
int status = handle_encryptable(attempted_entry);
if (status == FS_MGR_MNTALL_FAIL) {
// Fatal error - no point continuing.
return {status, userdata_mounted};
}
if (status != FS_MGR_MNTALL_DEV_NOT_ENCRYPTABLE) {
if (encryptable != FS_MGR_MNTALL_DEV_NOT_ENCRYPTABLE) {
// Log and continue
LERROR << "Only one encryptable/encrypted partition supported";
}
encryptable = status;
if (status == FS_MGR_MNTALL_DEV_NEEDS_METADATA_ENCRYPTION) {
if (!call_vdc({"cryptfs", "encryptFstab", attempted_entry.blk_device,
attempted_entry.mount_point, wiped ? "true" : "false",
attempted_entry.fs_type, attempted_entry.zoned_device},
nullptr)) {
LERROR << "Encryption failed";
set_type_property(encryptable);
return {FS_MGR_MNTALL_FAIL, userdata_mounted};
}
}
}
//如果当前分区是data分区,设置userdata_mounted标记
if (current_entry.mount_point == "/data") {
userdata_mounted = true;
}
// Success! Go get the next one.
continue; //步骤六:当前分区挂载成功,继续挂载下一个分区
}
//步骤七:当前分区挂载失败,检查当前分区是否被擦除
// Mounting failed, understand why and retry.
wiped = partition_wiped(current_entry.blk_device.c_str());
LINFO << "---------SHEN: fs_mgr fs_mgr_mount_all for partition_wiped wiped = " << wiped;
if (mount_errno != EBUSY && mount_errno != EACCES &&
current_entry.fs_mgr_flags.formattable && wiped) {
//挂载失败原因不是EBUSY和EACCES且已经被擦除,输出相关日志
// current_entry and attempted_entry point at the same partition, but sometimes
// at two different lines in the fstab. Use current_entry for formatting
// as that is the preferred one.
LERROR << __FUNCTION__ << "(): " << realpath(current_entry.blk_device)
<< " is wiped and " << current_entry.mount_point << " " << current_entry.fs_type
<< " is formattable. Format it.";
//回滚当前分区让其恢复挂载之前的状态
checkpoint_manager.Revert(¤t_entry);
//如果/data分区挂载失败后尝试对该分区进行元数据加密处理以确保数据的安全性
// EncryptInplace will be used when vdc gives an error or needs to format partitions
// other than /data
if (should_use_metadata_encryption(current_entry) &&
current_entry.mount_point == "/data") {
// vdc->Format requires "ro.crypto.type" to set an encryption flag
encryptable = FS_MGR_MNTALL_DEV_IS_METADATA_ENCRYPTED;
set_type_property(encryptable);
if (!call_vdc({"cryptfs", "encryptFstab", current_entry.blk_device,
current_entry.mount_point, "true" /* shouldFormat */,
current_entry.fs_type, current_entry.zoned_device},
nullptr)) {
//加密处理失败打印日志Encryption failed
LERROR << "Encryption failed";
} else {
//加密处理成功设置userdata_mounted标记
userdata_mounted = true;
continue;
}
}
//对挂载失败的分区进行格式化操作
if (fs_mgr_do_format(current_entry) == 0) {
// Let's replay the mount actions.
i = top_idx - 1;
continue;
} else {
LERROR << __FUNCTION__ << "(): Format failed. "
<< "Suggest recovery...";
encryptable = FS_MGR_MNTALL_DEV_NEEDS_RECOVERY;
continue;
}
}
//步骤八:当前分支挂载失败,检查是否需要元数据加密挂载操作,并处理相关逻辑
// mount(2) returned an error, handle the encryptable/formattable case.
if (mount_errno != EBUSY && mount_errno != EACCES &&
should_use_metadata_encryption(attempted_entry)) {
//注意:调用call_vdc去处理加密相关逻辑,后面cryptfs为参数的传递
if (!call_vdc({"cryptfs", "mountFstab", attempted_entry.blk_device,
attempted_entry.mount_point, attempted_entry.zoned_device},
nullptr)) {
++error_count;
} else if (current_entry.mount_point == "/data") {
userdata_mounted = true;
}
encryptable = FS_MGR_MNTALL_DEV_IS_METADATA_ENCRYPTED;
continue;
} else {
//打印相关状态
// fs_options might be null so we cannot use PERROR << directly.
// Use StringPrintf to output "(null)" instead.
if (attempted_entry.fs_mgr_flags.no_fail) {
PERROR << android::base::StringPrintf(
"Ignoring failure to mount an un-encryptable or wiped "
"partition on %s at %s options: %s",
attempted_entry.blk_device.c_str(), attempted_entry.mount_point.c_str(),
attempted_entry.fs_options.c_str());
} else {
PERROR << android::base::StringPrintf(
"Failed to mount an un-encryptable or wiped partition "
"on %s at %s options: %s",
attempted_entry.blk_device.c_str(), attempted_entry.mount_point.c_str(),
attempted_entry.fs_options.c_str());
++error_count;
}
continue;
}
}
//步骤九:结束循环,所有分区挂载完毕,接下来统计挂载情况,并设置data分区挂载状态
set_type_property(encryptable);
#if ALLOW_ADBD_DISABLE_VERITY == 1 // "userdebug" build
fs_mgr_overlayfs_mount_all(fstab);
#endif
if (error_count) {
return {FS_MGR_MNTALL_FAIL, userdata_mounted};
} else {
return {encryptable, userdata_mounted};
}
}
逻辑总结,根据fstab表的内容进行遍历,依次执行如下流程:
- 过滤那些条件下不应该被挂载
- 针对data分区进行包装,是否需要进行一些特殊处理:WrapUserdataIfNeeded
- 如果设置avb标记进行avb相关逻辑处理
- 尝试进行文件分区挂载:mount_with_alternatives
- 挂载成功处理加密相关信息和状态处理,针对data分区还设置了设置userdata_mounted标记
- 挂载失败依次进行:分区擦除并回滚、should_use_metadata_encryption、格式化操作
3.3 fs_mgr挂载单个分区
从上流程可以了解到单个分区的挂载是在mount_with_alternatives函数中
总结如上主要有两步流程:
- 挂载前的准备:prepare_fs_for_mount
- 系统调用进行挂载:__moun
总结如上代码逻辑,主要做了如下几个步骤:
- tune_quota:Enable/disable quota support on the filesystem if needed
- resize_fs:重置文件系统
- check_fs:校验文件系统
- tune_reserved_size:ext4支持
- tune_encrypt:ext4支持
- tune_verity:ext4支持
- tune_casefold:ext4支持
- tune_metadata_csum:ext4支持
3.4 分区挂载日志
<14>[ 11.515218] .(5)[1:init]init 33: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all A
<14>[ 11.516457] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.517766] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /system
<14>[ 11.519041] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 1
<14>[ 11.520281] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.521550] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /system_ext
<14>[ 11.522861] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 1
<14>[ 11.524077] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.525326] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /vendor
<14>[ 11.526673] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 1
<14>[ 11.527949] .(5)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.529239] .(5)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /product
<14>[ 11.530528] .(5)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 1
<14>[ 11.531760] .(5)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.533077] .(5)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /metadata
<14>[ 11.534389] .(5)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.536745] .(5)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = f2fs
<14>[ 11.538089] .(5)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /data
<14>[ 11.539374] .(5)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.541676] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.542940] .(5)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/protect_f
<14>[ 11.544436] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.545676] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for WrapUserdataIfNeeded
<14>[ 11.547055] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives
<14>[ 11.623443] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives mret = 1
<14>[ 11.624868] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.626170] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/protect_s
<14>[ 11.627563] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.628780] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for WrapUserdataIfNeeded
<14>[ 11.630131] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives
<14>[ 11.693155] .(7)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives mret = 1
<14>[ 11.694582] .(7)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.696030] .(7)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/nvdata
<14>[ 11.697997] .(7)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.700405] .(7)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for WrapUserdataIfNeeded
<14>[ 11.702587] .(7)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives
<14>[ 11.773010] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives mret = 1
<14>[ 11.774436] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.775706] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/nvcfg
<14>[ 11.777046] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.778245] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for WrapUserdataIfNeeded
<14>[ 11.779582] .(4)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives
<14>[ 11.835132] .(7)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives mret = 1
<14>[ 11.836687] .(7)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 11.837919] .(7)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/persist
<14>[ 11.839307] .(7)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.840518] .(7)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for WrapUserdataIfNeeded
<14>[ 11.841861] .(7)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives
<14>[ 11.897315] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives mret = 1
<14>[ 11.898752] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = auto
<14>[ 11.899991] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = auto
<14>[ 11.901200] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.902406] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = vfat
<14>[ 11.903644] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = auto
<14>[ 11.904852] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.906104] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.908371] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /persistent
<14>[ 11.910676] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.912738] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.914768] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /nvram
<14>[ 11.916830] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.918470] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.922484] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /proinfo
<14>[ 11.924922] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.926869] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.928552] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /bootloader
<14>[ 11.931108] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.933713] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.937656] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /bootloader2
<14>[ 11.941517] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.942729] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.943967] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /misc
<14>[ 11.945187] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.946446] .(6)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.948461] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /boot
<14>[ 11.951288] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.953273] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.955305] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /vbmeta_vendor
<14>[ 11.957444] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.959329] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.961991] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /vbmeta_system
<14>[ 11.963430] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.964690] .(6)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.966531] .(1)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /logo
<14>[ 11.968387] .(1)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.969737] .(1)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.971823] .(1)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /expdb
<14>[ 11.973192] .(1)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.982458] .(1)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.984425] .(1)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /seccfg
<14>[ 11.986724] .(1)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.989795] .(1)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.991434] .(1)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /tee1
<14>[ 11.992957] .(1)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 11.994911] .(1)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 11.996592] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /tee2
<14>[ 11.998148] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.000267] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.001958] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /scp1
<14>[ 12.003772] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.005304] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.007251] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /scp2
<14>[ 12.008835] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.010783] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.012133] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /sspm_1
<14>[ 12.013507] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.015231] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.016797] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /sspm_2
<14>[ 12.018340] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.019957] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.021931] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /md1img
<14>[ 12.024265] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.025921] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.028173] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /md1dsp
<14>[ 12.029981] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.032213] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.034292] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /md1arm7
<14>[ 12.036184] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.037924] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.040041] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /md3img
<14>[ 12.042368] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.044674] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.048219] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /gz1
<14>[ 12.051118] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.055860] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.058138] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /gz2
<14>[ 12.060322] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.060337] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.060378] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /spmfw
<14>[ 12.060393] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.060407] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.060421] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /boot_para
<14>[ 12.060435] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.060448] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.060460] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /odmdtbo
<14>[ 12.060474] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.060487] .(2)[1:init]init 6: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.060510] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /dtbo
<14>[ 12.060525] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.060538] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 12.060550] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /vbmeta
<14>[ 12.060564] .(2)[1:init]init 25: [11506][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.553435] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all A
<14>[ 12.554922] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 12.557855] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /system
<14>[ 12.559154] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 1
<14>[ 12.560377] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 12.561625] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /system_ext
<14>[ 12.562931] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 1
<14>[ 12.564192] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 12.565454] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /vendor
<14>[ 12.566956] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 1
<14>[ 12.568203] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 12.569500] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /product
<14>[ 12.570827] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 1
<14>[ 12.572061] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 12.573302] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /metadata
<14>[ 12.574566] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.576993] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = f2fs
<14>[ 12.578236] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /data
<14>[ 12.579488] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 12.580712] .(7)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for WrapUserdataIfNeeded
<14>[ 12.626130] .(7)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives
<14>[ 12.641696] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for mount_with_alternatives mret = 0
<14>[ 12.643123] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for partition_wiped str = /dev/block/by-name/userdata
<14>[ 12.645275] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for partition_wiped wiped = 0
<14>[ 13.026412] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 13.027664] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/protect_f
<14>[ 13.029079] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.030315] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 13.031604] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/protect_s
<14>[ 13.032999] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.034207] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 13.035447] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/nvdata
<14>[ 13.036874] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.038082] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 13.039323] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/nvcfg
<14>[ 13.040672] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.041879] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = ext4
<14>[ 13.043139] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /mnt/vendor/persist
<14>[ 13.044501] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.045759] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = auto
<14>[ 13.047009] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = auto
<14>[ 13.048210] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.049406] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = vfat
<14>[ 13.050635] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = auto
<14>[ 13.051833] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.053029] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.054288] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /persistent
<14>[ 13.055675] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.056884] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.058124] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /nvram
<14>[ 13.059354] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.060561] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.061812] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /proinfo
<14>[ 13.063091] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.064299] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.065632] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /bootloader
<14>[ 13.066909] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.068106] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.069336] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /bootloader2
<14>[ 13.070620] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.071816] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.073044] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /misc
<14>[ 13.074252] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.075448] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.076740] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /boot
<14>[ 13.077971] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.079203] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.080445] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /vbmeta_vendor
<14>[ 13.081762] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.082969] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.084210] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /vbmeta_system
<14>[ 13.085556] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.086765] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.088023] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /logo
<14>[ 13.089232] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.090428] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.091656] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /expdb
<14>[ 13.092876] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.094079] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.095334] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /seccfg
<14>[ 13.096620] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.097818] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.099065] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /tee1
<14>[ 13.100285] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.101492] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.102731] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /tee2
<14>[ 13.103950] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.105156] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.106432] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /scp1
<14>[ 13.107653] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.108859] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.110113] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /scp2
<14>[ 13.111331] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.112555] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.113783] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /sspm_1
<14>[ 13.115014] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.116293] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.117523] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /sspm_2
<14>[ 13.118754] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.119950] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.121196] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /md1img
<14>[ 13.122438] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.123645] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.124884] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /md1dsp
<14>[ 13.126154] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.127370] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.128637] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /md1arm7
<14>[ 13.129891] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.131098] .(5)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.132354] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /md3img
<14>[ 13.133585] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.134781] .(5)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.136329] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /gz1
<14>[ 13.137540] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.138732] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.139955] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /gz2
<14>[ 13.141147] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.142337] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.143662] .(1)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /spmfw
<14>[ 13.144916] .(1)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.146183] .(1)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.147420] .(1)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /boot_para
<14>[ 13.148687] .(1)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.149888] .(1)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.151122] .(1)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /odmdtbo
<14>[ 13.152368] .(1)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.153570] .(1)[1:init]init 25: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.154815] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /dtbo
<14>[ 13.156039] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
<14>[ 13.157231] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for fs_type = emmc
<14>[ 13.158454] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for path = /vbmeta
<14>[ 13.159678] .(1)[1:init]init 6: [12545][0][libfs_mgr] ---------SHEN:fs_mgr_mount_all for logical = 0
此过程中实际挂载的分区并不多:
<14>[ 11.672359] .(0)[1:init]init 6: [11637][0][libfs_mgr] ———SHEN:fs_mgr fs_mgr_mount_all for path = /mnt/vendor/protect_f
<14>[ 11.758712] .(5)[1:init]init 26: [11637][0][libfs_mgr] ———SHEN:fs_mgr fs_mgr_mount_all for path = /mnt/vendor/protect_s
<14>[ 11.832189] .(5)[1:init]init 6: [11637][0][libfs_mgr] ———SHEN:fs_mgr fs_mgr_mount_all for path = /mnt/vendor/nvdata
<14>[ 11.912498] .(4)[1:init]init 6: [11637][0][libfs_mgr] ———SHEN:fs_mgr fs_mgr_mount_all for path = /mnt/vendor/nvcfg
<14>[ 11.981377] .(7)[1:init]init 6: [11637][0][libfs_mgr] ———SHEN:fs_mgr fs_mgr_mount_all for path = /mnt/vendor/persist
4、/data分区加解密
从上面的日志来看,/data目录的挂载并没有在libfs_mgr里面完成,看起来后面移交给了vold进程