From e30a46d62b624ab44b7af86948fe8f5e637b1234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Cluseau?= Date: Wed, 9 Jul 2025 05:45:35 +0200 Subject: [PATCH] bootstrap: --- Cargo.lock | 11 +++++++++++ Cargo.toml | 1 + src/cmd/init/bootstrap.rs | 32 ++++++++++++++++++++++---------- src/main.rs | 5 +++-- src/utils.rs | 12 +++++------- 5 files changed, 42 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 08f1451..b0355f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -247,6 +247,7 @@ dependencies = [ "serde_json", "serde_yaml", "shell-escape", + "sys-info", "termios", "tokio", "unix_mode", @@ -577,6 +578,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sys-info" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "termios" version = "0.3.3" diff --git a/Cargo.toml b/Cargo.toml index 45bf2d3..44b64c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,3 +29,4 @@ unix_mode = "0.1.4" cpio = "0.4.1" lz4 = "1.28.1" base64 = "0.22.1" +sys-info = "0.9.1" diff --git a/src/cmd/init/bootstrap.rs b/src/cmd/init/bootstrap.rs index b68d1f8..b3e05b7 100644 --- a/src/cmd/init/bootstrap.rs +++ b/src/cmd/init/bootstrap.rs @@ -1,5 +1,5 @@ use eyre::{format_err, Result}; -use log::info; +use log::{info, warn}; use std::path::Path; use tokio::{ fs, @@ -20,7 +20,7 @@ pub async fn bootstrap(cfg: Config) { }) .await; - let boot_version = utils::param("version", "current"); + let boot_version = utils::param("version").unwrap_or("current"); let base_dir = &format!("/bootstrap/{boot_version}"); retry_or_ignore(async || { @@ -169,9 +169,25 @@ async fn fetch_bootstrap(seed_url: &str, output_file: &str) -> Result<()> { Ok(()) } +fn default_root_tmpfs_opts() -> Option { + let mem = sys_info::mem_info() + .inspect_err(|e| warn!("failed to get system memory info, using default tmpfs size: {e}")) + .ok()?; + + let mem_size = mem.total /* kiB */ / 1024; + let fs_size = 1024.min(mem_size / 2); + info!("system has {mem_size} MiB of memory, allowing {fs_size} MiB for root tmpfs"); + Some(format!("size={fs_size}m")) +} + async fn mount_system(cfg: &dkl::Config, bs_dir: &str, verifier: &Verifier) { + let opts = match utils::param("root-opts") { + Some(s) => Some(s.to_string()), + None => default_root_tmpfs_opts(), + }; + let mem_dir = "/mem"; - mount(None, mem_dir, "tmpfs", Some("size=512m")).await; + mount(None, mem_dir, "tmpfs", opts.as_deref()).await; let layers_dir = &format!("{mem_dir}/layers"); let mut lower_dir = String::new(); @@ -316,14 +332,10 @@ async fn mount_filesystems(mounts: &[dkl::Mount], root: &str) { mount( Some(&m.dev), &path, - m.r#type - .as_ref() + (m.r#type.as_deref()) .filter(|s| !s.is_empty()) - .map_or("ext4", |s| s.as_str()), - m.options - .as_ref() - .filter(|v| !v.is_empty()) - .map(|s| s.as_str()), + .unwrap_or("ext4"), + m.options.as_deref().filter(|v| !v.is_empty()), ) .await; } diff --git a/src/main.rs b/src/main.rs index 28ddf2d..b5fd120 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,8 +11,9 @@ async fn main() -> Result<()> { dklog::init(); - let call_name = env::args().next().unwrap_or("init".into()); - let call_name = (call_name.rsplit_once('/').map(|(_, n)| n)).unwrap_or(call_name.as_str()); + let call_name = env::args().next(); + let call_name = call_name.as_deref().unwrap_or("init"); + let call_name = call_name.rsplit_once('/').map_or(call_name, |(_, n)| n); let result = match call_name { "init" => { diff --git a/src/utils.rs b/src/utils.rs index 71dcdf6..66f34d9 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -20,16 +20,14 @@ pub fn bool_param(name: &str) -> bool { cmdline().any(|part| part == name1 || part == name2) } -pub fn param<'t>(name: &'t str, default: &'t str) -> &'t str { +pub fn param(name: &str) -> Option<&'static str> { let prefix1 = &format!("dkl.{name}="); let prefix2 = &format!("direktil.{name}="); - cmdline() - .find_map(|part| { - part.strip_prefix(prefix1) - .or_else(|| part.strip_prefix(prefix2)) - }) - .unwrap_or(default) + cmdline().find_map(|part| { + part.strip_prefix(prefix1) + .or_else(|| part.strip_prefix(prefix2)) + }) } pub struct NameAliases {