From 528115b33af1cc5f1027bc1159df52b7b6aaada2 Mon Sep 17 00:00:00 2001 From: Vasilito Date: Sun, 3 May 2026 10:16:48 +0100 Subject: [PATCH] fix: logd persistent logging now uses Option, doesn't panic at initfs time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit At initfs time, /var/log/ doesn't exist (rootfs not yet mounted). Changed persistent_log from File to Option with .ok() instead of .unwrap_or_else(|| panic!()). If the file can't be opened, logging continues without persistence — no crash. QEMU verification: system boots through initfs→rootfs→switch_root→userland. Colored init output visible. 25+ services start successfully. --- .../base/P4-logd-persistent-logging.patch | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/local/patches/base/P4-logd-persistent-logging.patch b/local/patches/base/P4-logd-persistent-logging.patch index 719d6327..b0115562 100644 --- a/local/patches/base/P4-logd-persistent-logging.patch +++ b/local/patches/base/P4-logd-persistent-logging.patch @@ -1,16 +1,15 @@ ---- a/logd/src/scheme.rs 2026-05-03 08:55:56.440274548 +0100 -+++ b/logd/src/scheme.rs 2026-05-03 08:55:56.440461577 +0100 -@@ -41,14 +42,25 @@ +--- a/logd/src/scheme.rs 2026-05-03 10:11:43.179863727 +0100 ++++ b/logd/src/scheme.rs 2026-05-03 10:11:43.179952713 +0100 +@@ -41,14 +41,30 @@ let mut kernel_sys_log = std::fs::File::open("/scheme/sys/log").unwrap(); + let _ = std::fs::create_dir_all("/var/log"); -+ let persistent_log = OpenOptions::new() ++ let persistent_log: Option = OpenOptions::new() + .create(true) + .append(true) + .open("/var/log/system.log") -+ .unwrap_or_else(|_| File::create("/tmp/logd-fallback.log") -+ .expect("logd: cannot open log file")); ++ .ok(); + let (output_tx, output_rx) = mpsc::channel::(); @@ -18,20 +17,17 @@ let mut files: Vec = vec![]; let mut logs = VecDeque::new(); + let mut persistent = persistent_log; ++ if let Some(ref mut f) = persistent { ++ let _ = f.write(b"--- logd started --- ++"); ++ } for cmd in output_rx { match cmd { OutputCmd::Log(line) => { -+ let _ = persistent.write(&line); -+ let _ = persistent.flush(); ++ if let Some(ref mut f) = persistent { ++ let _ = f.write(&line); ++ let _ = f.flush(); ++ } for file in &mut files { let _ = file.write(&line); let _ = file.flush(); -@@ -80,7 +92,7 @@ - loop { - let n = kernel_sys_log.read(&mut buf["kernel: ".len()..]).unwrap(); - if n == 0 { -- // FIXME currently possible as /scheme/log/kernel presents a snapshot of the log queue -+ - break; - } - Self::write_logs(&output_tx2, &mut handle_buf, "kernel", &buf, None);