1. fstab变量
在文件core/init/first_stage_mount.cpp中:
229 std::unique_ptr<FirstStageMount> FirstStageMount::Create() {
230 auto fstab = ReadFirstStageFstab();
231 if (IsDtVbmetaCompatible(fstab)) {
232 return std::make_unique<FirstStageMountVBootV2>(std::move(fstab));
233 } else {
234 return std::make_unique<FirstStageMountVBootV1>(std::move(fstab));
235 }
236 }
debug信息:
[ 1.381627] init: init first stage started!
[ 1.381996] init: tom L=231
[ 1.382236] init: tom F=ReadFirstStageFstab L=149
[ 1.382623] init: tom F=ReadFstabFromDt L=674
[ 1.383014] init: [libfs_mgr]ReadFstabFromDt(): failed to read fstab from dt
[ 1.383578] init: tom F=ReadFstabFromDt L=674
[ 1.383984] init: [libfs_mgr]tom L=474 line=# Android fstab file for ramdisk
[ 1.384663] init:
[ 1.384837] init: [libfs_mgr]tom L=474 line=#<dev> <mnt_point> <type> <mnt_flags options> <fs_mgr_flags>
[ 1.385621] init:
[ 1.385831] init: [libfs_mgr]tom L=474 line=system /system ext4 ro,barrier=1 wait,logical,avb=vbmeta,first_stage_mount
[ 1.386947] init:
[ 1.387164] init: [libfs_mgr]tom L=474 line=vendor /vendor ext4 ro,barrier=1 wait,logical,first_stage_mount
[ 1.388142] init:
2. 调用流程
FirstStageMount::Create()—>ReadFirstStageFstab() ---->ReadDefaultFstab(Fstab* fstab)---->std::string GetFstabPath()
FirstStageMount::Create的定义如下:
230 std::unique_ptr<FirstStageMount> FirstStageMount::Create() {
231 auto fstab = ReadFirstStageFstab();
232 if (IsDtVbmetaCompatible(fstab)) {
233 return std::make_unique<FirstStageMountVBootV2>(std::move(fstab));
234 } else {
235 return std::make_unique<FirstStageMountVBootV1>(std::move(fstab));
236 }
237 }
ReadFirstStageFstab的定义如下:
147 static Fstab ReadFirstStageFstab() {
148 Fstab fstab;
149 LOG(INFO) << "tom F="<<__FUNCTION__<<" L="<<__LINE__;
150 if (!ReadFstabFromDt(&fstab)) {
151 if (ReadDefaultFstab(&fstab)) {
152 fstab.erase(std::remove_if(fstab.begin(), fstab.end(),
153 [](const auto& entry) {
154 return !entry.fs_mgr_flags.first_stage_mount;
155 }),
156 fstab.end());
157 } else {
158 LOG(INFO) << "Failed to fstab for first stage mount";
159 }
160 }
161 return fstab;
162 }
GetFstabPath的定义如下:
448 // Identify path to fstab file. Lookup is based on pattern fstab.<hardware>,
449 // fstab.<hardware.platform> in folders /odm/etc, vendor/etc, or /.
450 std::string GetFstabPath() {
451 for (const char* prop : {"hardware", "hardware.platform"}) {
452 std::string hw;
453
454 if (!fs_mgr_get_boot_config(prop, &hw)) continue;
455
456 for (const char* prefix : {"/odm/etc/fstab.", "/vendor/etc/fstab.", "/fstab."}) {
457 std::string fstab_path = prefix + hw;
458 if (access(fstab_path.c_str(), F_OK) == 0) {
459 return fstab_path;
460 }
461 }
462 }
463
464 return "";
465 }