diff --git a/init.d/00_logd.service b/init.d/00_logd.service new file mode 100644 index 0000000000..b2293176c7 --- /dev/null +++ b/init.d/00_logd.service @@ -0,0 +1,7 @@ +[unit] +description = "Logger" +default_dependencies = false + +[service] +cmd = "logd" +type = { scheme = "log" } diff --git a/init.d/00_runtime.target b/init.d/00_runtime.target index 6a74498ec7..dee0f7217f 100644 --- a/init.d/00_runtime.target +++ b/init.d/00_runtime.target @@ -2,6 +2,7 @@ description = "Services that relibc needs to function" default_dependencies = false requires_weak = [ + "00_logd.service", "00_nulld.service", "00_randd.service", "00_rtcd.service", diff --git a/init/src/main.rs b/init/src/main.rs index 16c2b3a7ca..75940c4a5a 100644 --- a/init/src/main.rs +++ b/init/src/main.rs @@ -137,20 +137,20 @@ fn main() { Path::new("/scheme/initfs/etc"), ); + // Start logd first such that we can pass /scheme/log as stdio to all other services + scheduler + .schedule_start_and_report_errors(&mut unit_store, UnitId("00_logd.service".to_owned())); + scheduler.step(&mut unit_store, &mut init_config); + if let Err(err) = switch_stdio("/scheme/log") { + eprintln!("init: failed to switch stdio to '/scheme/log': {err}"); + } + let runtime_target = UnitId("00_runtime.target".to_owned()); scheduler.schedule_start_and_report_errors(&mut unit_store, runtime_target.clone()); unit_store.set_runtime_target(runtime_target); scheduler .schedule_start_and_report_errors(&mut unit_store, UnitId("90_initfs.target".to_owned())); - - let mut command = std::process::Command::new("logd"); - command.env_clear().envs(&init_config.envs); - daemon::SchemeDaemon::spawn(command, "log"); - if let Err(err) = switch_stdio("/scheme/log") { - eprintln!("init: failed to switch stdio to '/scheme/log': {err}"); - } - scheduler.step(&mut unit_store, &mut init_config); switch_root(