Add qcow2 support
CI / build (push) Successful in 13s

This commit is contained in:
2026-08-30 17:08:08 +02:00
parent 46a86116b0
commit 286def05c1
7 changed files with 303 additions and 50 deletions
+36 -18
View File
@@ -5,7 +5,10 @@ use anyhow::{Context, Result, bail};
use clap::Args;
use std::process::Command;
use crate::registry::registry_dir;
use crate::{
meta::Meta,
registry::{registry_base_dir, registry_dir},
};
#[derive(Args, Debug)]
pub struct RunCmd {
@@ -19,14 +22,38 @@ pub struct RunCmd {
pub(crate) fn run(RunCmd { name, memory }: RunCmd) -> Result<()> {
let reg_dir = registry_dir(&name)?;
let vmlinuz_path = reg_dir.join("vmlinuz");
let vmlinuz_path = registry_base_dir()?.join("vmlinuz");
let initrd_path = reg_dir.join("initrd");
if !vmlinuz_path.exists() || !initrd_path.exists() {
bail!(
"Registry missing vmlinuz/initrd for '{}'. Run `slim build` first.",
name
);
let qcow2_path = reg_dir.join("image.qcow2");
if !vmlinuz_path.exists() {
// TODO: guide user in how to set up a kernel
bail!("No kernel available.")
}
let meta = Meta::load(&name).context("Failed to load meta.toml. Run `slim build` first.")?;
// TODO: sanity-check for spaces
let init_arg = format!("init={}", meta.init);
let fs_args;
let mut cmdline = vec![
"console=ttyS0,115200",
"rw",
"earlyprintk=serial",
"nokaslr",
&init_arg,
];
let qcow2_arg = format!("file={},format=qcow2,if=virtio", qcow2_path.display());
if qcow2_path.exists() {
fs_args = vec!["-drive", &qcow2_arg];
cmdline.extend_from_slice(&["root=/dev/vda", "rootfstype=ext4"]);
} else if initrd_path.exists() {
fs_args = vec!["-initrd", initrd_path.to_str().context("Invalid UTF-8")?];
cmdline.push("root=/dev/ram0");
} else {
bail!("Registry missing rootfs/initrd for '{name}'. Run `slim build` first.");
}
println!("Booting {name} from registry: {}", reg_dir.display());
println!(
" qemu-system-x86_64 -m 256 -nographic -kernel {} -initrd {} -append 'console=ttyS0'",
@@ -34,23 +61,14 @@ pub(crate) fn run(RunCmd { name, memory }: RunCmd) -> Result<()> {
initrd_path.display()
);
let cmdline = [
"console=ttyS0,115200",
"root=/dev/ram0",
"rw",
"earlyprintk=serial",
"nokaslr",
"raid=noautodetect",
]
.join(" ");
let cmdline = cmdline.join(" ");
let mut command = Command::new("qemu-system-x86_64");
command
.args(["-m", &memory])
.arg("-kernel")
.arg(vmlinuz_path.as_os_str())
.arg("-initrd")
.arg(initrd_path.as_os_str())
.args(fs_args)
.args(["-append", &cmdline])
.args(["-nographic"])
.args(["-nic", "user,model=virtio-net-pci"]);