Prepare, configure, and manage Firecracker microVMs in seconds!
virtualization linux microvm firecracker
8
fork

Configure Feed

Select the types of activity you want to include in your feed.

add --vcpu and --memory options

+42 -9
+1
Cargo.lock
··· 178 178 "firecracker-process", 179 179 "firecracker-vm", 180 180 "glob", 181 + "num_cpus", 181 182 "owo-colors", 182 183 ] 183 184
+1
crates/firecracker-up/Cargo.toml
··· 15 15 owo-colors = "4.2.2" 16 16 glob = "0.3.2" 17 17 dirs = "6.0.0" 18 + num_cpus = "1.17.0"
+3 -1
crates/firecracker-up/src/cmd/up.rs
··· 12 12 pub alpine: Option<bool>, 13 13 pub ubuntu: Option<bool>, 14 14 pub nixos: Option<bool>, 15 + pub vcpu: u16, 16 + pub memory: u16, 15 17 } 16 18 17 19 impl Into<Distro> for UpOptions { ··· 44 46 } 45 47 46 48 firecracker_prepare::prepare(options.clone().into())?; 47 - firecracker_vm::setup(options.into())?; 49 + firecracker_vm::setup(options.clone().into(), options.vcpu, options.memory)?; 48 50 Ok(()) 49 51 } 50 52
+25
crates/firecracker-up/src/main.rs
··· 38 38 .arg(arg!(--alpine "Prepare Alpine rootfs").default_value("false")) 39 39 .arg(arg!(--nixos "Prepare NixOS rootfs").default_value("false")) 40 40 .arg(arg!(--ubuntu "Prepare Ubuntu rootfs").default_value("true")) 41 + .arg(arg!(--vcpu <n> "Number of vCPUs")) 42 + .arg(arg!(--memory <m> "Memory size in MiB")) 41 43 .about("Start Firecracker MicroVM"), 42 44 ) 43 45 .subcommand(Command::new("down").about("Stop Firecracker MicroVM")) ··· 58 60 .arg(arg!(--alpine "Prepare Alpine rootfs").default_value("false")) 59 61 .arg(arg!(--nixos "Prepare NixOS rootfs").default_value("false")) 60 62 .arg(arg!(--ubuntu "Prepare Ubuntu rootfs").default_value("true")) 63 + .arg(arg!(--vcpu <n> "Number of vCPUs")) 64 + .arg(arg!(--memory <m> "Memory size in MiB")) 61 65 } 62 66 63 67 fn main() -> Result<()> { ··· 65 69 66 70 match matches.subcommand() { 67 71 Some(("up", args)) => { 72 + let vcpu = matches 73 + .get_one::<String>("vcpu") 74 + .map(|s| s.parse::<u16>().unwrap()) 75 + .unwrap_or(num_cpus::get() as u16); 76 + let memory = matches 77 + .get_one::<String>("memory") 78 + .map(|s| s.parse::<u16>().unwrap()) 79 + .unwrap_or(512); 68 80 let options = UpOptions { 69 81 debian: args.get_one::<bool>("debian").copied(), 70 82 alpine: args.get_one::<bool>("alpine").copied(), 71 83 ubuntu: args.get_one::<bool>("ubuntu").copied(), 72 84 nixos: args.get_one::<bool>("nixos").copied(), 85 + vcpu, 86 + memory, 73 87 }; 74 88 up(options)? 75 89 } ··· 86 100 let alpine = matches.get_one::<bool>("alpine").copied().unwrap_or(false); 87 101 let nixos = matches.get_one::<bool>("nixos").copied().unwrap_or(false); 88 102 let ubuntu = matches.get_one::<bool>("ubuntu").copied().unwrap_or(false); 103 + let vcpu = matches 104 + .get_one::<String>("vcpu") 105 + .map(|s| s.parse::<u16>().unwrap()) 106 + .unwrap_or(num_cpus::get() as u16); 107 + let memory = matches 108 + .get_one::<String>("memory") 109 + .map(|s| s.parse::<u16>().unwrap()) 110 + .unwrap_or(if nixos { 2048 } else { 512 }); 111 + 89 112 let options = UpOptions { 90 113 debian: Some(debian), 91 114 alpine: Some(alpine), 92 115 ubuntu: Some(ubuntu), 93 116 nixos: Some(nixos), 117 + vcpu, 118 + memory, 94 119 }; 95 120 up(options)? 96 121 }
+10 -6
crates/firecracker-vm/src/firecracker.rs
··· 8 8 9 9 const NIXOS_BOOT_ARGS: &str = "init=/nix/store/pq529c6dd6x5vaxak4vpyxrv17ydvnwr-nixos-system-nixos-firecracker-25.05.802216.55d1f923c480/init root=/dev/vda ro console=ttyS0 reboot=k panic=1"; 10 10 11 - pub fn configure(logfile: &str, kernel: &str, rootfs: &str, arch: &str) -> Result<()> { 11 + pub fn configure( 12 + logfile: &str, 13 + kernel: &str, 14 + rootfs: &str, 15 + arch: &str, 16 + vcpu: u16, 17 + memory: u16, 18 + ) -> Result<()> { 12 19 configure_logger(logfile)?; 13 20 setup_boot_source(kernel, arch, rootfs.contains("nixos"))?; 14 21 setup_rootfs(rootfs)?; 15 22 setup_network_interface()?; 16 - setup_vcpu_and_memory( 17 - num_cpus::get(), 18 - if rootfs.contains("nixos") { 2048 } else { 512 }, 19 - )?; 23 + setup_vcpu_and_memory(vcpu, memory)?; 20 24 21 25 // Wait before starting instance 22 26 sleep(Duration::from_millis(15)); ··· 160 164 Ok(()) 161 165 } 162 166 163 - fn setup_vcpu_and_memory(n: usize, memory: usize) -> Result<()> { 167 + fn setup_vcpu_and_memory(n: u16, memory: u16) -> Result<()> { 164 168 println!("[+] Setting vCPU and memory..."); 165 169 let payload = json!({ 166 170 "vcpu_count": n,
+2 -2
crates/firecracker-vm/src/lib.rs
··· 12 12 mod guest; 13 13 mod network; 14 14 15 - pub fn setup(distro: Distro) -> Result<()> { 15 + pub fn setup(distro: Distro, vcpu: u16, memory: u16) -> Result<()> { 16 16 let app_dir = get_config_dir().with_context(|| "Failed to get configuration directory")?; 17 17 18 18 let logfile = format!("{}/firecracker.log", app_dir); ··· 73 73 let arch = command::run_command("uname", &["-m"], false)?.stdout; 74 74 let arch = String::from_utf8_lossy(&arch).trim().to_string(); 75 75 network::setup_network()?; 76 - firecracker::configure(&logfile, &kernel, &rootfs, &arch)?; 76 + firecracker::configure(&logfile, &kernel, &rootfs, &arch, vcpu, memory)?; 77 77 78 78 if !rootfs.contains("nixos") { 79 79 guest::configure_guest_network(&key_name)?;