Loading init/first_stage_init.cpp +29 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,34 @@ bool ForceNormalBoot(const std::string& cmdline) { return cmdline.find("androidboot.force_normal_boot=1") != std::string::npos; } // Move e2fsck before switching root, so that it is available at the same path // after switching root. void PrepareSwitchRoot() { constexpr const char* src = "/system/bin/e2fsck"; constexpr const char* dst = "/first_stage_ramdisk/system/bin/e2fsck"; if (access(dst, X_OK) == 0) { LOG(INFO) << dst << " already exists and it can be executed"; return; } if (access(src, F_OK) != 0) { PLOG(INFO) << "Not moving " << src << " because it cannot be accessed"; return; } auto dst_dir = android::base::Dirname(dst); std::error_code ec; if (!fs::create_directories(dst_dir, ec)) { LOG(FATAL) << "Cannot create " << dst_dir << ": " << ec.message(); } if (rename(src, dst) != 0) { PLOG(FATAL) << "Cannot move " << src << " to " << dst << ". Either install e2fsck.ramdisk so that it is at the correct place (" << dst << "), or make ramdisk writable"; } } } // namespace std::string GetModuleLoadList(bool recovery, const std::string& dir_path) { Loading Loading @@ -298,6 +326,7 @@ int FirstStageMain(int argc, char** argv) { if (ForceNormalBoot(cmdline)) { mkdir("/first_stage_ramdisk", 0755); PrepareSwitchRoot(); // SwitchRoot() must be called with a mount point as the target, so we bind mount the // target directory to itself here. if (mount("/first_stage_ramdisk", "/first_stage_ramdisk", nullptr, MS_BIND, nullptr) != 0) { Loading Loading
init/first_stage_init.cpp +29 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,34 @@ bool ForceNormalBoot(const std::string& cmdline) { return cmdline.find("androidboot.force_normal_boot=1") != std::string::npos; } // Move e2fsck before switching root, so that it is available at the same path // after switching root. void PrepareSwitchRoot() { constexpr const char* src = "/system/bin/e2fsck"; constexpr const char* dst = "/first_stage_ramdisk/system/bin/e2fsck"; if (access(dst, X_OK) == 0) { LOG(INFO) << dst << " already exists and it can be executed"; return; } if (access(src, F_OK) != 0) { PLOG(INFO) << "Not moving " << src << " because it cannot be accessed"; return; } auto dst_dir = android::base::Dirname(dst); std::error_code ec; if (!fs::create_directories(dst_dir, ec)) { LOG(FATAL) << "Cannot create " << dst_dir << ": " << ec.message(); } if (rename(src, dst) != 0) { PLOG(FATAL) << "Cannot move " << src << " to " << dst << ". Either install e2fsck.ramdisk so that it is at the correct place (" << dst << "), or make ramdisk writable"; } } } // namespace std::string GetModuleLoadList(bool recovery, const std::string& dir_path) { Loading Loading @@ -298,6 +326,7 @@ int FirstStageMain(int argc, char** argv) { if (ForceNormalBoot(cmdline)) { mkdir("/first_stage_ramdisk", 0755); PrepareSwitchRoot(); // SwitchRoot() must be called with a mount point as the target, so we bind mount the // target directory to itself here. if (mount("/first_stage_ramdisk", "/first_stage_ramdisk", nullptr, MS_BIND, nullptr) != 0) { Loading