diff --git a/init/first_stage_init.cpp b/init/first_stage_init.cpp index 438b44e04..ad546bf07 100644 --- a/init/first_stage_init.cpp +++ b/init/first_stage_init.cpp @@ -234,7 +234,16 @@ int FirstStageMain(int argc, char** argv) { old_root_dir.reset(); } - Modprobe m({"/lib/modules"}); + std::string module_load_file = "modules.load"; + if (IsRecoveryMode() && !ForceNormalBoot(cmdline)) { + struct stat fileStat; + std::string recovery_load_path = "/lib/modules/modules.load.recovery"; + if (!stat(recovery_load_path.c_str(), &fileStat)) { + module_load_file = "modules.load.recovery"; + } + } + + Modprobe m({"/lib/modules"}, module_load_file); auto want_console = ALLOW_FIRST_STAGE_CONSOLE && FirstStageConsole(cmdline); if (!m.LoadListedModules(!want_console)) { if (want_console) { diff --git a/libmodprobe/include/modprobe/modprobe.h b/libmodprobe/include/modprobe/modprobe.h index ee6ae7a45..297036e41 100644 --- a/libmodprobe/include/modprobe/modprobe.h +++ b/libmodprobe/include/modprobe/modprobe.h @@ -24,7 +24,7 @@ class Modprobe { public: - Modprobe(const std::vector&); + Modprobe(const std::vector&, const std::string load_file = "modules.load"); bool LoadListedModules(bool strict = true); bool LoadWithAliases(const std::string& module_name, bool strict, diff --git a/libmodprobe/libmodprobe.cpp b/libmodprobe/libmodprobe.cpp index f22bbf18b..d19379676 100644 --- a/libmodprobe/libmodprobe.cpp +++ b/libmodprobe/libmodprobe.cpp @@ -312,7 +312,7 @@ void Modprobe::ParseKernelCmdlineOptions(void) { } } -Modprobe::Modprobe(const std::vector& base_paths) { +Modprobe::Modprobe(const std::vector& base_paths, const std::string load_file) { using namespace std::placeholders; for (const auto& base_path : base_paths) { @@ -326,7 +326,7 @@ Modprobe::Modprobe(const std::vector& base_paths) { ParseCfg(base_path + "/modules.softdep", softdep_callback); auto load_callback = std::bind(&Modprobe::ParseLoadCallback, this, _1); - ParseCfg(base_path + "/modules.load", load_callback); + ParseCfg(base_path + "/" + load_file, load_callback); auto options_callback = std::bind(&Modprobe::ParseOptionsCallback, this, _1); ParseCfg(base_path + "/modules.options", options_callback);