From 0a3bf9618403c79b0aa029bfaabd6cfe9d987664 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Fri, 12 Jun 2026 09:05:10 +0200 Subject: [PATCH 1/4] mount: quote the fstype in log messages It may be empty, so the message can be confusing without the quotes. Signed-off-by: Michael Olbrich --- src/mount.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mount.rs b/src/mount.rs index 81d8ae7..38a164d 100644 --- a/src/mount.rs +++ b/src/mount.rs @@ -23,7 +23,7 @@ pub fn do_mount( mount(src, dst, fstype, flags, data).map_err(|e| { format!( - "Failed to mount {} -> {} as {} with flags = {:#x}, data = '{}'): {e}", + "Failed to mount {} -> {} as '{}' with flags = {:#x}, data = '{}'): {e}", src.unwrap_or_default(), dst, fstype.unwrap_or_default(), @@ -76,7 +76,7 @@ pub fn mount_root( mkdir("/root")?; debug!( - "Mounting rootfs {} -> /root as {} with flags = {:#x}, data = '{}'", + "Mounting rootfs {} -> /root as '{}' with flags = {:#x}, data = '{}'", device.ok_or("No root device argument")?, fstype.unwrap_or_default(), fsflags.bits(), From 4070053fbe0e1959a8c0992c367fea1592417079 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Fri, 12 Jun 2026 09:09:10 +0200 Subject: [PATCH 2/4] use level 'info' for most log message With that, the messages are visible with the default CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7. Signed-off-by: Michael Olbrich --- src/dmverity.rs | 4 ++-- src/init.rs | 4 ++-- src/mount.rs | 4 ++-- src/usbg_9pfs.rs | 6 +++--- test/qemu.py | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/dmverity.rs b/src/dmverity.rs index 3689b92..77b3836 100644 --- a/src/dmverity.rs +++ b/src/dmverity.rs @@ -7,7 +7,7 @@ use std::os::fd::IntoRawFd; use std::path::Path; use getrandom::getrandom; -use log::debug; +use log::{debug, info}; use nix::ioctl_readwrite; use nix::libc::dev_t; use nix::sys::stat::minor; @@ -246,7 +246,7 @@ pub fn prepare_dmverity(options: &mut CmdlineOptions) -> Result { let param_data = read_file("/verity-params")?; let params = VerityParams::from_string(¶m_data)?; - debug!( + info!( "Configuring dm-verity rootfs with root-hash = {}", params.root_hash ); diff --git a/src/init.rs b/src/init.rs index 759b310..0eafdac 100644 --- a/src/init.rs +++ b/src/init.rs @@ -12,7 +12,7 @@ use std::os::fd::AsFd; use std::os::unix::ffi::OsStrExt; use std::panic::set_hook; -use log::{debug, error, LevelFilter}; +use log::{error, info, LevelFilter}; #[cfg(feature = "reboot-on-failure")] use nix::sys::reboot::{reboot, RebootMode}; use nix::sys::termios::tcdrain; @@ -260,7 +260,7 @@ impl<'a> InitContext<'a> { write!(buf, "{} ", arg.to_bytes().escape_ascii())?; } writeln!(buf, "...")?; - debug!("{}", &buf); + info!("{}", &buf); execv(&args[0], &args)?; diff --git a/src/mount.rs b/src/mount.rs index 38a164d..c6baefb 100644 --- a/src/mount.rs +++ b/src/mount.rs @@ -4,7 +4,7 @@ use std::fs::{self, remove_dir}; use std::path::{Path, PathBuf}; -use log::{debug, warn}; +use log::{info, warn}; use nix::{ mount::{mount, umount, MsFlags}, sys::utsname::uname, @@ -75,7 +75,7 @@ pub fn mount_root( } mkdir("/root")?; - debug!( + info!( "Mounting rootfs {} -> /root as '{}' with flags = {:#x}, data = '{}'", device.ok_or("No root device argument")?, fstype.unwrap_or_default(), diff --git a/src/usbg_9pfs.rs b/src/usbg_9pfs.rs index c7131e2..525e902 100644 --- a/src/usbg_9pfs.rs +++ b/src/usbg_9pfs.rs @@ -5,7 +5,7 @@ use std::fs::{read_dir, write}; use std::os::unix::fs::symlink; use std::{thread, time}; -use log::debug; +use log::info; use nix::mount::MsFlags; use crate::cmdline::CmdlineOptions; @@ -17,7 +17,7 @@ fn write_file>(path: &str, content: C) -> Result<()> { } fn setup_9pfs_gadget(options: &mut CmdlineOptions) -> Result<()> { - debug!("Initializing USB 9pfs gadget ..."); + info!("Initializing USB 9pfs gadget ..."); let device = if let Some(root) = &mut options.root { if let Some(index) = root.find('/') { @@ -71,7 +71,7 @@ fn setup_9pfs_gadget(options: &mut CmdlineOptions) -> Result<()> { mkdir(&function)?; symlink(&function, &link)?; - debug!("Attaching 9pfs gatget to UDC {device}"); + info!("Attaching 9pfs gatget to UDC {device}"); write_file("/sys/kernel/config/usb_gadget/9pfs/UDC", device)?; let d = time::Duration::new(1, 0); diff --git a/test/qemu.py b/test/qemu.py index 713e28f..88353c5 100755 --- a/test/qemu.py +++ b/test/qemu.py @@ -107,7 +107,7 @@ def __ensure_kernel(self, url, file, sha256): def run(self): args = [f"qemu-system-{self.__arch}"] - cmdline = "loglevel=8 panic=-1" + cmdline = "loglevel=7 panic=-1" match self.__arch: case "x86_64": args += ["-machine", "q35"] From 9e13a259deedddbe54a2a34e4f0ca4d6ecd05da7 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Fri, 12 Jun 2026 10:27:16 +0200 Subject: [PATCH 3/4] refacture logger setup Move activating the logger into the logger code. Signed-off-by: Michael Olbrich --- src/init.rs | 10 ++-------- src/integration.rs | 7 ++++++- src/kmsg.rs | 7 ++++++- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/init.rs b/src/init.rs index 0eafdac..114833a 100644 --- a/src/init.rs +++ b/src/init.rs @@ -12,7 +12,7 @@ use std::os::fd::AsFd; use std::os::unix::ffi::OsStrExt; use std::panic::set_hook; -use log::{error, info, LevelFilter}; +use log::{error, info}; #[cfg(feature = "reboot-on-failure")] use nix::sys::reboot::{reboot, RebootMode}; use nix::sys::termios::tcdrain; @@ -53,12 +53,6 @@ fn setup_console() -> Result<()> { Ok(()) } -pub fn setup_log() -> Result<()> { - let logger = Logger::new()?; - log::set_boxed_logger(Box::new(logger)).map(|()| log::set_max_level(LevelFilter::Trace))?; - Ok(()) -} - fn finalize() { /* Make sure all output is written before exiting */ let _ = tcdrain(io::stdout().as_fd()); @@ -182,7 +176,7 @@ impl<'a> InitContext<'a> { pub fn setup(&mut self) -> Result<()> { mount_special()?; - setup_log()?; + Logger::enable()?; self.options = self.parser.parse_file("/proc/cmdline")?; diff --git a/src/integration.rs b/src/integration.rs index 0f79ec3..7c6ce1a 100644 --- a/src/integration.rs +++ b/src/integration.rs @@ -7,7 +7,7 @@ use std::fs::{File, OpenOptions}; use std::io::Write as _; use std::path::Path; -use log::{Metadata, Record}; +use log::{LevelFilter, Metadata, Record}; use crate::kmsg::KmsgLogger; use crate::util::Result; @@ -38,6 +38,11 @@ impl IntegrationLogger { let kmsg = KmsgLogger::new()?; Ok(IntegrationLogger { next: kmsg, vport }) } + pub fn enable() -> Result<()> { + let logger = IntegrationLogger::new()?; + log::set_boxed_logger(Box::new(logger)).map(|()| log::set_max_level(LevelFilter::Trace))?; + Ok(()) + } } impl log::Log for IntegrationLogger { diff --git a/src/kmsg.rs b/src/kmsg.rs index c45ad26..b8aa198 100644 --- a/src/kmsg.rs +++ b/src/kmsg.rs @@ -5,7 +5,7 @@ use std::borrow::Borrow; use std::fs::{File, OpenOptions}; use std::io::Write as _; -use log::{Level, Metadata, Record}; +use log::{Level, LevelFilter, Metadata, Record}; use crate::util::Result; @@ -38,4 +38,9 @@ impl KmsgLogger { let kmsg = OpenOptions::new().write(true).open("/dev/kmsg")?; Ok(KmsgLogger { kmsg }) } + pub fn enable() -> Result<()> { + let logger = KmsgLogger::new()?; + log::set_boxed_logger(Box::new(logger)).map(|()| log::set_max_level(LevelFilter::Trace))?; + Ok(()) + } } From ee86871edb45a1ef87eec04081ceafd5f54f2177 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Fri, 12 Jun 2026 14:39:46 +0200 Subject: [PATCH 4/4] init: print version after log initialization Signed-off-by: Michael Olbrich --- Cargo.lock | 56 ++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/init.rs | 5 +++++ test/test_basic.py | 6 ++--- 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a20a595..8586b76 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,6 +31,26 @@ dependencies = [ "wasi", ] +[[package]] +name = "git-version" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" +dependencies = [ + "git-version-macro", +] + +[[package]] +name = "git-version-macro" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "json" version = "0.12.4" @@ -61,16 +81,52 @@ dependencies = [ "libc", ] +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + [[package]] name = "rsinit" version = "0.1.0" dependencies = [ "getrandom", + "git-version", "json", "log", "nix", ] +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index e2bc3d4..679e279 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ nix = { version = "0.30.1", features = ["feature", "fs", "mount", "process", "te getrandom = { version = "0.2.15" } log = { version = "0.4.21", features = ["std"], default-features = false} json = { version = "0.12.4", optional = true } +git-version = { version = "0.3.9" } [features] default = ["systemd", "dmverity", "usb9pfs", "reboot-on-failure"] diff --git a/src/init.rs b/src/init.rs index 114833a..d639bf4 100644 --- a/src/init.rs +++ b/src/init.rs @@ -12,6 +12,7 @@ use std::os::fd::AsFd; use std::os::unix::ffi::OsStrExt; use std::panic::set_hook; +use git_version::git_version; use log::{error, info}; #[cfg(feature = "reboot-on-failure")] use nix::sys::reboot::{reboot, RebootMode}; @@ -177,6 +178,10 @@ impl<'a> InitContext<'a> { mount_special()?; Logger::enable()?; + info!( + concat!(env!("CARGO_PKG_NAME"), " version {}"), + git_version!(fallback = env!("CARGO_PKG_VERSION")) + ); self.options = self.parser.parse_file("/proc/cmdline")?; diff --git a/test/test_basic.py b/test/test_basic.py index b5a1322..1cf4674 100644 --- a/test/test_basic.py +++ b/test/test_basic.py @@ -92,9 +92,9 @@ def test_missing_root(genimage, qemu): qemu.set_initramfs(genimage.get_initramfs()) qemu.set_cmdline("root=/dev/vda1") result = qemu.run() - assert result.rsinit_messages == [ - {"message": "Timeout reached while waiting for the device"} - ] + assert result.rsinit_messages[-1] == { + "message": "Timeout reached while waiting for the device" + } assert not result.mountinfo