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, 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(&current_entry)) {LERROR << "Could not translate label to block device";continue;}}//條件七:針對邏輯分區的文件系統條目,嘗試設置邏輯分區。如果設置邏輯分區失敗輸出錯誤日志并跳過此分區if (current_entry.fs_mgr_flags.logical) {if (!fs_mgr_update_logical_partition(&current_entry)) {LERROR << "Could not set up logical partition, skipping!";continue;}}//步驟三:針對data分區進行包裝,是否需要進行一些特殊處理LINFO << "---------SHEN:fs_mgr fs_mgr_mount_all for WrapUserdataIfNeeded";WrapUserdataIfNeeded(&current_entry);if (!checkpoint_manager.Update(&current_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(&current_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(&current_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 &&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(&current_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) &&current_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進程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897574.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897574.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis--Set類型

目錄 一、引言 二、介紹 三、命令 1.sadd,smembers,sismember 2.spop&#xff0c;srandmember 3.smove&#xff0c;srem 4.sinter&#xff0c;sinterstore 5.sunion,sunionstore,sdiff,sdiffstore 四、內部編碼 1.intset 2.hashtable 五、應用場景 1.使用Set保存用…

for...of的用法與介紹

一、定義 for...of 是 ES6&#xff08;ECMAScript 2015&#xff09;引入的一種用于 遍歷可迭代對象&#xff08;Iterable&#xff09;的循環語句 二、語法 for (const item of iterable) {// 代碼塊 }參數&#xff1a; iterable&#xff1a;一個可迭代對象&#xff08;如數組…

Faster R-CNN原理詳解以及Pytorch實現模型訓練與推理

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

使用dockerfile創建鏡像

1.什么是Dockerfile Dockerfile 是一個用于指導 Docker 鏡像構建過程的腳本文件。它通過一系列指令來詳細描述了構建鏡像所需的步驟和配置細節。利用 Dockerfile&#xff0c;我們可以精確地設定容器的運行環境&#xff0c;安裝必要的軟件&#xff0c;復制項目文件&#xff0c;…

在CentOS系統上安裝Conda的詳細指南

前言 Conda 是一個開源的包管理系統和環境管理系統&#xff0c;廣泛應用于數據科學和機器學習領域。本文將詳細介紹如何在 CentOS 系統上安裝 Conda&#xff0c;幫助您快速搭建開發環境。 準備工作 在開始安裝之前&#xff0c;請確保您的 CentOS 系統已經滿足以下條件&#x…

大腦宏觀結構中的富集俱樂部:圖論分析視角

摘要 大腦是一個高度復雜的網絡。越來越多的證據支持大腦網絡中一組重要腦區的關鍵作用&#xff0c;這些腦區通常被稱為大腦的“核心”或“樞紐”區域。這些區域不僅能量消耗較高&#xff0c;而且在神經信息傳遞方面的效率也極高&#xff0c;因此被稱為“富集俱樂部”。富集俱樂…

Redis7——進階篇(五)

前言&#xff1a;此篇文章系本人學習過程中記錄下來的筆記&#xff0c;里面難免會有不少欠缺的地方&#xff0c;誠心期待大家多多給予指教。 基礎篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

Reflect.get和target[key]有何不同?

主要區別在this指向不同&#xff0c;下面輸出張三還是李四?&#xff1a; const person{name:張三,get FullName(){return this.name;},};let personProxynew Proxy(person,{get(target,key){return Reflect.get(target,key)//或者return target[key]}});const p1{__proto__:pe…

rust語言match模式匹配涉及轉移所有權Error Case

struct S{data:String, }//注意&#xff1a;因為String默認是移動語義&#xff0c;從而決定結構體S也是移動語義&#xff0c;可采用(1)或(2)兩種方法解決編譯錯誤&#xff1b;關鍵思路&#xff1a;放棄獲取結構體S的字段data的所有權&#xff0c;改為借用。fn process(s_ref:&a…

光譜相機檢測肉類新鮮度的原理

光譜相機通過分析肉類樣本在特定波長范圍內的光譜反射特性&#xff0c;結合化學與生物指標的變化規律&#xff0c;實現對其新鮮度的無損檢測。其核心原理可概括為以下方面&#xff1a; 一、光譜特征與物質成分的關聯性 ?物質特異性吸收/反射? 不同化學成分&#xff08;如水分…

c#面試題整理9

1.遍歷xml文檔 2.解釋一下這段 String s new String("xyz"); 這段在C#平臺中&#xff0c;編譯失敗 3.說明一下抽象類 抽象類可以有構造函數 抽象類不能是靜態和密封的類&#xff0c;密封的類表示無法繼承&#xff0c;抽象類本身就不可實例化&#xff0c;加不好…

《React 屬性與狀態江湖:從驗證到表單受控的實戰探險》

屬性初識 屬性能解決兩個大問題&#xff1a;通信和復用 props.js: import React, { Component } from react import Navbar from ./Navbarexport default class App extends Component {state {a:100}render() {return (<div><div><h2>首頁</h2>&l…

Qwen/QwQ-32B 基礎模型上構建agent實現ppt自動生成

關心Qwen/QwQ-32B 性能測試結果可以參考下 https://zhuanlan.zhihu.com/p/28600079208https://zhuanlan.zhihu.com/p/28600079208 官方宣傳上是該模型性能比肩滿血版 DeepSeek-R1&#xff08;671B&#xff09;&#xff01; 我們實現一個 使用Qwen/QwQ-32B 自動生成 PowerPoi…

Javascript基礎語法詳解

面向對象的語言.腳本語言,不需要編譯,瀏覽器解釋即可運行 .用于控制網頁的行為.瀏覽器的source可以打斷點調試, console輸入代碼可以執行 use strict指令: 在“嚴格模式”下運行js代碼, 防止意外創建全局變量等, 提高代碼安全性和執行效率. 使用: 全局嚴格模式&#xff1a;…

[雜學筆記] TCP和UDP的區別,對http接口解釋 , Cookie和Session的區別 ,http和https的區別 , 智能指針 ,斷點續傳

文章目錄 1. TCP和UDP的區別2. 對http接口解釋3. Cookie和Session的區別4. http和https的區別5. 智能指針6.斷點續傳 1. TCP和UDP的區別 tcp的特點&#xff1a; 面向連接&#xff0c;可靠性高&#xff0c;全雙工&#xff0c;面向字節流udp特點&#xff1a;無連接&#xff0c;不…

JAVASE(五)

目錄 一、成員變量和局部變量 1.定義 2.區別 &#xff08;1&#xff09;相同 &#xff08;2&#xff09;不同 二、方法和構造方法 1.定義 2.構造方法細節 3.方法重載 一、成員變量和局部變量 1.定義 &#xff08;1&#xff09;成員變量是…

Matlab中快速查找元素索引號

1、背景介紹 在算法設計過程中&#xff0c;有時候需要從一維/二維數組中&#xff0c;快速查找是否某個元素&#xff0c;以及該元素所在的位置。如一維矩陣[1 2 3 4 5 6 6 7 8]所示&#xff0c;元素6所在的位置為6 7。 2、函數測試 matlab中函數find()可以快速查找到指定元素所…

【DuodooTEKr 】多度科技 以開源之力,驅動企業數字化轉型

多度科技 背景 / Background 在全球產業鏈重構與國內經濟雙循環的浪潮下&#xff0c;中國制造業與貿易企業正面臨數字化升級的迫切需求。開源技術作為數字化轉型的基石&#xff0c;不僅能打破技術壁壘、降低企業成本&#xff0c;更能通過協作創新加速產業智能化進程。 多度科技…

【HarmonyOS Next】鴻蒙應用故障處理思路詳解

【HarmonyOS Next】鴻蒙應用崩潰處理思路詳解 一、崩潰問題發現后定位 1. 崩潰現象&#xff1a; 常見的崩潰問題表現為&#xff0c;應用操作后白屏閃退&#xff0c;或者應用顯示無響應卡死。 2.定位問題&#xff1a; 發現崩潰后&#xff0c;我們首先需要了解復現步驟&#x…

linunx ubuntu24.04.02裝libfuse2導致無法開機進不了桌面解決辦法

osu.appimage運行需要libfuse2 然后我就下了fuse,打了兩把第二天無法開機 這樣是不能開機的 這樣是可以開機的 解決辦法一&#xff1a;玩星火商店的osu&#xff0c;好了問題解決 解決辦法二&#xff1a; 在這個頁面 ctrl alt f2進入tty6 sudo apt install ubuntu-desktop 進…