一、文件系統掛載流程概述
二、文件系統掛載流程細節
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, respectivelyif ((access("/sbin/recovery", F_OK) == 0) || (access("/system/bin/recovery", F_OK) == 0)) {//recovery模式下讀取/etc/recovery.fstabdefault_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,slotselectvendor /vendor ext4 ro wait,avb,logical,first_stage_mount,slotselectproduct /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 continueLERROR << "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 &¤t_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 /dataif (should_use_metadata_encryption(current_entry) &¤t_entry.mount_point == "/data") {// vdc->Format requires "ro.crypto.type" to set an encryption flagencryptable = 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 failedLERROR << "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" buildfs_mgr_overlayfs_mount_all(fstab);
#endifif (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進程