From 09661ec9e007be9c8eae88e45af7b2124ea9cfe1 Mon Sep 17 00:00:00 2001 From: Valentin Haudiquet Date: Wed, 17 Jun 2026 16:35:28 +0200 Subject: [PATCH] feat: use uncompressed initramfs --- src/qemu_vm.rs | 46 ++++++++++------------------------------------ 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/src/qemu_vm.rs b/src/qemu_vm.rs index 07152de..8998926 100644 --- a/src/qemu_vm.rs +++ b/src/qemu_vm.rs @@ -160,56 +160,30 @@ fn get_arch_package_suffix(arch: &str) -> &str { } } -/// Create a gzipped cpio initramfs from a directory +/// Create an uncompressed cpio initramfs from a directory fn create_initramfs(rootfs: &PathBuf) -> Result { - // Create a temporary file for the initramfs - let initramfs_path = rootfs.parent().unwrap().join("initramfs.cpio.gz"); + // Create a temporary file for the initramfs (uncompressed cpio) + let initramfs_path = rootfs.parent().unwrap().join("initramfs.cpio"); // Create progress bar let pb = ProgressBar::new_spinner(); pb.set_style(ProgressStyle::default_spinner() .template("{spinner:.green} {msg} ({pos} files)") .unwrap()); - pb.set_message("Scanning rootfs..."); + pb.set_message("Creating initramfs..."); // Create the cpio archive with progress let cpio_data = create_cpio_archive(rootfs, &pb)?; let total_bytes = cpio_data.len() as u64; let file_count = pb.position(); - // Finish the scanning progress bar + // Write directly to file (no compression) + std::fs::write(&initramfs_path, &cpio_data) + .context("Failed to write initramfs file")?; + + // Finish progress bar pb.finish_and_clear(); - - // Create progress bar for compression - let compress_pb = ProgressBar::new(total_bytes); - compress_pb.set_style(ProgressStyle::default_bar() - .template("{spinner:.green} Compressing initramfs... {bytes}/{total_bytes} ({eta})") - .unwrap() - .progress_chars("##-")); - - // Compress with gzip, writing in chunks to update progress - let mut output_file = std::fs::File::create(&initramfs_path) - .context("Failed to create initramfs file")?; - - let mut encoder = flate2::write::GzEncoder::new(&mut output_file, flate2::Compression::fast()); - - // Write in 64KB chunks to provide progress updates - const CHUNK_SIZE: usize = 64 * 1024; - let mut offset = 0; - while offset < cpio_data.len() { - let end = std::cmp::min(offset + CHUNK_SIZE, cpio_data.len()); - encoder.write_all(&cpio_data[offset..end]) - .context("Failed to write compressed initramfs")?; - offset = end; - compress_pb.set_position(offset as u64); - } - encoder.finish() - .context("Failed to finalize gzip compression")?; - - // Clear progress bar and print message only in verbose mode - compress_pb.finish_and_clear(); - veprintln!("Initramfs created: {} bytes -> {} bytes compressed, {} files", - total_bytes, output_file.metadata().ok().map(|m| m.len()).unwrap_or(0), file_count); + veprintln!("Initramfs created: {} bytes, {} files", total_bytes, file_count); Ok(initramfs_path) }