From e538d53f2fe9addb10b40a269079ae2b45d93109 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jeremy@system76.com> Date: Sat, 6 Jul 2019 08:28:44 -0600 Subject: [PATCH] 0.2.8 - Use redoxfs library to archive, add free space to image --- Cargo.lock | 10 +++++---- Cargo.toml | 4 +++- Dockerfile | 3 --- src/exec.rs | 62 +++++++++++++++++++++++++++++++++++++++++------------ src/main.rs | 4 ++++ 5 files changed, 61 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d9abf9..ec50309 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -668,7 +668,7 @@ dependencies = [ "liner 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "redox_pkgutils 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "redoxfs 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "redoxfs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -723,18 +723,20 @@ dependencies = [ [[package]] name = "redoxer" -version = "0.2.7" +version = "0.2.8" dependencies = [ "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "proc-mounts 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "redox_installer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", + "redoxfs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "redoxfs" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuse 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1187,7 +1189,7 @@ dependencies = [ "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe5204c3a17e97dde73f285d49be585df59ed84b50a872baf416e73b62c3828" -"checksum redoxfs 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4d5b94177303e4c07b8da7f90fb86c1d194630dc08c2676aa866be1d25892783" +"checksum redoxfs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "801d7b3f9ba3f5a68fb1738545ea074cf2f6361e7f4cbf4133a5ecf6086f6ded" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" "checksum ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2c4db68a2e35f3497146b7e4563df7d4773a2433230c5e4b448328e31740458a" "checksum rle-decode-fast 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cabe4fa914dec5870285fa7f71f602645da47c486e68486d2b4ceb4a343e90ac" diff --git a/Cargo.toml b/Cargo.toml index 77f59cd..9c0385d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "redoxer" -version = "0.2.7" +version = "0.2.8" description = "Method for quickly running programs inside of Redox from a KVM capable OS." license = "MIT" authors = ["Jeremy Soller <jackpot51@gmail.com>"] @@ -10,6 +10,8 @@ edition = "2018" [dependencies] dirs = "1.0" redox_installer = "0.2" +redox_syscall = "0.1" +redoxfs = "0.3.6" tempfile = "3.0" toml = "0.5" diff --git a/Dockerfile b/Dockerfile index 3c0b4dd..3273812 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,9 +16,6 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \ # Set path ENV PATH=/root/.cargo/bin:$PATH -# Install redoxfs -RUN cargo install redoxfs - # Install redoxer COPY . /root/redoxer RUN cargo install --path /root/redoxer diff --git a/src/exec.rs b/src/exec.rs index 3e26040..f281fe5 100644 --- a/src/exec.rs +++ b/src/exec.rs @@ -1,9 +1,11 @@ +use redoxfs::{archive_at, BLOCK_SIZE, DiskSparse, FileSystem}; use std::{env, fs, io}; use std::io::{Seek, Write}; use std::path::{Path, PathBuf}; use std::process::{self, Command}; +use std::time::{SystemTime, UNIX_EPOCH}; -use crate::{installed, redoxer_dir, status_error}; +use crate::{installed, redoxer_dir, status_error, syscall_error}; use crate::redoxfs::RedoxFs; static BASE_TOML: &'static str = include_str!("../res/base.toml"); @@ -110,13 +112,40 @@ fn base(bootloader_bin: &Path, gui: bool, fuse: bool) -> io::Result<PathBuf> { Ok(base_bin) } -fn inner(arguments: &[String], folder_opt: Option<String>, gui: bool) -> io::Result<i32> { - let fuse = Path::new("/dev/fuse").exists(); - if ! fuse && ! installed("tar")? { - eprintln!("redoxer: tar not found, please install before continuing"); - process::exit(1); - } +fn archive_free_space(disk_path: &Path, folder_path: &Path, bootloader_path: &Path, free_space: u64) -> io::Result<()> { + let disk = DiskSparse::create(&disk_path).map_err(syscall_error)?; + + let bootloader = fs::read(bootloader_path)?; + + let ctime = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); + let mut fs = FileSystem::create_reserved( + disk, + &bootloader, + ctime.as_secs(), + ctime.subsec_nanos() + ).map_err(syscall_error)?; + + let root_block = fs.header.1.root; + archive_at(&mut fs, folder_path, root_block)?; + + let free_block = fs.header.1.free; + let mut free = fs.node(free_block).map_err(syscall_error)?; + let end_block = free.1.extents[0].block; + free.1.extents[0].length = free_space; + let end_size = end_block * BLOCK_SIZE + free.1.extents[0].length; + fs.write_at(free.0, &free.1).map_err(syscall_error)?; + + fs.header.1.size = end_size; + let header = fs.header; + fs.write_at(header.0, &header.1).map_err(syscall_error)?; + + let size = header.0 * BLOCK_SIZE + end_size; + fs.disk.file.set_len(size)?; + Ok(()) +} + +fn inner(arguments: &[String], folder_opt: Option<String>, gui: bool) -> io::Result<i32> { let kvm = Path::new("/dev/kvm").exists(); if ! installed("qemu-system-x86_64")? { @@ -124,7 +153,12 @@ fn inner(arguments: &[String], folder_opt: Option<String>, gui: bool) -> io::Res process::exit(1); } - if ! installed("redoxfs")? { + let fuse = Path::new("/dev/fuse").exists(); + if ! fuse && ! installed("tar")? { + eprintln!("redoxer: tar not found, please install before continuing"); + process::exit(1); + } + if fuse && ! installed("redoxfs")? { eprintln!("redoxer: redoxfs not found, installing with cargo"); Command::new("cargo") .arg("install") @@ -212,12 +246,12 @@ fn inner(arguments: &[String], folder_opt: Option<String>, gui: bool) -> io::Res } if ! fuse { - Command::new("redoxfs-ar") - .arg(&redoxer_bin) - .arg(&redoxer_dir) - .arg(&bootloader_bin) - .status() - .and_then(status_error)?; + archive_free_space( + &redoxer_bin, + &redoxer_dir, + &bootloader_bin, + 1024 * 1024 * 1024 + )?; } // Set default bootloader configuration diff --git a/src/main.rs b/src/main.rs index 3161639..4c015ac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,6 +44,10 @@ fn status_error(status: process::ExitStatus) -> io::Result<()> { } } +fn syscall_error(err: syscall::Error) -> io::Error { + io::Error::from_raw_os_error(err.errno) +} + fn usage() { eprintln!("redoxer bench - cargo bench with Redox target in Redox VM"); eprintln!("redoxer build - cargo build with Redox target"); -- GitLab