diff options
Diffstat (limited to 'init/init.cpp')
-rw-r--r-- | init/init.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/init/init.cpp b/init/init.cpp index 942feb939..6dcf4a30b 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -50,11 +50,16 @@ #include <android-base/strings.h> #include <backtrace/Backtrace.h> #include <fs_avb/fs_avb.h> +#include <fs_mgr.h> +#include <fs_mgr_dm_linear.h> +#include <fs_mgr_overlayfs.h> #include <fs_mgr_vendor_overlay.h> + #include <keyutils.h> #include <libavb/libavb.h> #include <libgsi/libgsi.h> #include <libsnapshot/snapshot.h> +#include <private/android_filesystem_config.h> #include <processgroup/processgroup.h> #include <processgroup/setup.h> #include <selinux/android.h> @@ -98,10 +103,20 @@ using android::base::Timer; using android::base::Trim; using android::fs_mgr::AvbHandle; using android::snapshot::SnapshotManager; +using android::fs_mgr::Fstab; +using android::fs_mgr::ReadDefaultFstab; namespace android { namespace init { +namespace { +bool DeferOverlayfsMount() { + std::string cmdline; + android::base::ReadFileToString("/proc/cmdline", &cmdline); + return cmdline.find("androidboot.defer_overlayfs_mount=1") != std::string::npos; +} +} + static int property_triggers_enabled = 0; static int signal_fd = -1; @@ -768,6 +783,20 @@ int SecondStageMain(int argc, char** argv) { sigaction(SIGPIPE, &action, nullptr); } + if (DeferOverlayfsMount()) { + 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()); + LOG(INFO) << "Running deferred mounting of overlayfs"; + fs_mgr_overlayfs_mount_all(&fstab); + } + + } + // Set init and its forked children's oom_adj. if (auto result = WriteFile("/proc/1/oom_score_adj", StringPrintf("%d", DEFAULT_OOM_SCORE_ADJUST)); @@ -790,6 +819,7 @@ int SecondStageMain(int argc, char** argv) { if (force_debuggable_env && AvbHandle::IsDeviceUnlocked()) { load_debug_prop = "true"s == force_debuggable_env; } + unsetenv("INIT_FORCE_DEBUGGABLE"); // Umount the debug ramdisk so property service doesn't read .prop files from there, when it |