From b8082cfb75352a36d9bae449f0c2abd2bbe4da2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Thu, 29 Aug 2024 17:48:45 +0200 Subject: [PATCH 1/8] feat(xtask): allow starting the hypervisor using `sudo` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Kröning --- xtask/src/ci/firecracker.rs | 15 ++++++++++++++- xtask/src/ci/qemu.rs | 10 ++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/xtask/src/ci/firecracker.rs b/xtask/src/ci/firecracker.rs index 4ec63a6f..1f3a26d6 100644 --- a/xtask/src/ci/firecracker.rs +++ b/xtask/src/ci/firecracker.rs @@ -1,3 +1,4 @@ +use std::env; use std::path::Path; use anyhow::Result; @@ -9,6 +10,10 @@ use crate::build::Build; /// Run hermit-rs images on Firecracker. #[derive(Args)] pub struct Firecracker { + /// Run Firecracker using `sudo`. + #[arg(long)] + sudo: bool, + #[command(flatten)] build: Build, @@ -32,9 +37,17 @@ impl Firecracker { let config_path = Path::new("firecracker_vm_config.json"); sh.write_file(config_path, config)?; + let firecracker = env::var("FIRECRACKER").unwrap_or_else(|_| "firecracker".to_string()); + let program = if self.sudo { + "sudo" + } else { + firecracker.as_str() + }; + let arg = self.sudo.then_some(firecracker.as_str()); + let log_path = Path::new("firecracker.log"); sh.write_file(log_path, "")?; - cmd!(sh, "firecracker --no-api --config-file {config_path} --log-path {log_path} --level Info --show-level --show-log-origin").run()?; + cmd!(sh, "{program} {arg...} --no-api --config-file {config_path} --log-path {log_path} --level Info --show-level --show-log-origin").run()?; let log = sh.read_file(log_path)?; eprintln!("firecracker log"); diff --git a/xtask/src/ci/qemu.rs b/xtask/src/ci/qemu.rs index 453b69e9..03dc4781 100644 --- a/xtask/src/ci/qemu.rs +++ b/xtask/src/ci/qemu.rs @@ -16,6 +16,10 @@ pub struct Qemu { #[arg(long)] accel: bool, + /// Run QEMU using `sudo`. + #[arg(long)] + sudo: bool, + /// Enable the `microvm` machine type. #[arg(long)] microvm: bool, @@ -49,9 +53,11 @@ impl Qemu { let target = self.build.target(); let arch = target.arch(); - let qemu = env::var_os("QEMU").unwrap_or_else(|| format!("qemu-system-{arch}").into()); + let qemu = env::var("QEMU").unwrap_or_else(|_| format!("qemu-system-{arch}")); + let program = if self.sudo { "sudo" } else { qemu.as_str() }; + let arg = self.sudo.then_some(qemu.as_str()); - let qemu = cmd!(sh, "{qemu}") + let qemu = cmd!(sh, "{program} {arg...}") .args(&["-display", "none"]) .args(&["-serial", "stdio"]) .args(self.machine_args()) From fd518e96572fe998744072767c6f5bed5a45ba67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Thu, 29 Aug 2024 17:51:54 +0200 Subject: [PATCH 2/8] ci: run all x86-64 Linux jobs using KVM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Kröning --- .github/workflows/ci.yml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f8e670e..5640cc09 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,6 +44,10 @@ jobs: matrix: target: [x86_64, aarch64, riscv64] os: [ubuntu-latest, macos-latest, windows-latest] + include: + - target: x86_64 + os: ubuntu-latest + flags: --accel --sudo runs-on: ${{ matrix.os }} steps: - name: Install QEMU (ubuntu) @@ -85,27 +89,27 @@ jobs: cp /usr/share/OVMF/OVMF_VARS.fd edk2-stable202405-r1-bin/x64/vars.fd if: matrix.os == 'ubuntu-latest' - name: Run VM (hello_world, dev) - run: cargo xtask ci qemu --target ${{ matrix.target }} + run: cargo xtask ci qemu ${{ matrix.flags }} --target ${{ matrix.target }} - name: Run VM (hello_world, release) - run: cargo xtask ci qemu --target ${{ matrix.target }} --release + run: cargo xtask ci qemu ${{ matrix.flags }} --target ${{ matrix.target }} --release - name: Run VM (hello_world, uefi, dev) - run: cargo xtask ci qemu --target ${{ matrix.target }}-uefi + run: cargo xtask ci qemu ${{ matrix.flags }} --target ${{ matrix.target }}-uefi if: matrix.target == 'x86_64' - name: Run VM (hello_world, uefi, release) - run: cargo xtask ci qemu --target ${{ matrix.target }}-uefi --release + run: cargo xtask ci qemu ${{ matrix.flags }} --target ${{ matrix.target }}-uefi --release if: matrix.target == 'x86_64' - name: Run VM (hello_world-microvm, dev) if: matrix.target == 'x86_64' && matrix.os == 'ubuntu-latest' - run: cargo xtask ci qemu --target ${{ matrix.target }} --image hello_world-microvm --microvm + run: cargo xtask ci qemu ${{ matrix.flags }} --target ${{ matrix.target }} --image hello_world-microvm --microvm - name: Run VM (hello_world-microvm, release) if: matrix.target == 'x86_64' && matrix.os == 'ubuntu-latest' - run: cargo xtask ci qemu --target ${{ matrix.target }} --image hello_world-microvm --microvm --release + run: cargo xtask ci qemu ${{ matrix.flags }} --target ${{ matrix.target }} --image hello_world-microvm --microvm --release - name: Run VM (hello_c, dev) if: matrix.target == 'x86_64' - run: cargo xtask ci qemu --target ${{ matrix.target }} --image hello_c + run: cargo xtask ci qemu ${{ matrix.flags }} --target ${{ matrix.target }} --image hello_c - name: Run VM (hello_c, release) if: matrix.target == 'x86_64' - run: cargo xtask ci qemu --target ${{ matrix.target }} --image hello_c --release + run: cargo xtask ci qemu ${{ matrix.flags }} --target ${{ matrix.target }} --image hello_c --release run-kvm: name: Run (KVM) From fd95194cc1af38aaf90ae4647d0f51542d94d335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Thu, 29 Aug 2024 21:21:17 +0200 Subject: [PATCH 3/8] fix(xtask): print firecracker log before returning error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Kröning --- xtask/src/ci/firecracker.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xtask/src/ci/firecracker.rs b/xtask/src/ci/firecracker.rs index 1f3a26d6..7b8884fc 100644 --- a/xtask/src/ci/firecracker.rs +++ b/xtask/src/ci/firecracker.rs @@ -47,11 +47,12 @@ impl Firecracker { let log_path = Path::new("firecracker.log"); sh.write_file(log_path, "")?; - cmd!(sh, "{program} {arg...} --no-api --config-file {config_path} --log-path {log_path} --level Info --show-level --show-log-origin").run()?; + let res = cmd!(sh, "{program} {arg...} --no-api --config-file {config_path} --log-path {log_path} --level Info --show-level --show-log-origin").run(); let log = sh.read_file(log_path)?; eprintln!("firecracker log"); eprintln!("{log}"); + res?; Ok(()) } From 7c5dcc134f635e51f8a8492961f8691a0120d1e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Thu, 29 Aug 2024 21:21:25 +0200 Subject: [PATCH 4/8] dnm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Kröning --- xtask/src/ci/firecracker.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xtask/src/ci/firecracker.rs b/xtask/src/ci/firecracker.rs index 7b8884fc..2beaae7b 100644 --- a/xtask/src/ci/firecracker.rs +++ b/xtask/src/ci/firecracker.rs @@ -47,7 +47,7 @@ impl Firecracker { let log_path = Path::new("firecracker.log"); sh.write_file(log_path, "")?; - let res = cmd!(sh, "{program} {arg...} --no-api --config-file {config_path} --log-path {log_path} --level Info --show-level --show-log-origin").run(); + let res = cmd!(sh, "{program} {arg...} --no-api --config-file {config_path} --log-path {log_path} --level Trace --show-level --show-log-origin").run(); let log = sh.read_file(log_path)?; eprintln!("firecracker log"); From bc2672f0a01de47d6b4d18d53dc1b77e915b3dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Thu, 29 Aug 2024 21:01:49 +0200 Subject: [PATCH 5/8] ci: run KVM job on GitHub runner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Kröning --- .github/workflows/ci.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5640cc09..b39e25cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -113,12 +113,12 @@ jobs: run-kvm: name: Run (KVM) - runs-on: [self-hosted] + runs-on: ubuntu-latest steps: - name: Install QEMU run: | sudo apt-get update - sudo apt-get install -y --no-install-recommends qemu-system-x86 + sudo apt-get install qemu-system-x86 - uses: actions/checkout@v4 with: lfs: true @@ -131,29 +131,29 @@ jobs: curl -L ${release_url}/download/${latest}/firecracker-${latest}-${ARCH}.tgz \ | tar -xz - # Rename the binary to "firecracker" - mv release-${latest}-$(uname -m)/firecracker-${latest}-${ARCH} firecracker - echo "$PWD" >> $GITHUB_PATH - - ./firecracker --version + mkdir -p $HOME/.local/bin + mv release-${latest}-$(uname -m)/firecracker-${latest}-${ARCH} $HOME/.local/bin/firecracker + echo $HOME/.local/bin >> $GITHUB_PATH + + $HOME/.local/bin/firecracker --version - name: Download OVMF run: | gh release download edk2-stable202405-r1 --repo rust-osdev/ovmf-prebuilt --pattern 'edk2-stable*-bin.tar.xz' tar -xvf edk2-stable*-bin.tar.xz edk2-stable202405-r1-bin/x64 - uses: dtolnay/rust-toolchain@stable - name: Run QEMU (hello_world, dev) - run: cargo xtask ci qemu --target x86_64 --accel + run: cargo xtask ci qemu --target x86_64 --accel --sudo - name: Run QEMU (hello_world, release) - run: cargo xtask ci qemu --target x86_64 --accel --release + run: cargo xtask ci qemu --target x86_64 --accel --sudo --release - name: Run QEMU (hello_world-microvm, dev) - run: cargo xtask ci qemu --target x86_64 --accel --image hello_world-microvm --microvm + run: cargo xtask ci qemu --target x86_64 --accel --sudo --image hello_world-microvm --microvm - name: Run QEMU (hello_world-microvm, release) - run: cargo xtask ci qemu --target x86_64 --accel --image hello_world-microvm --microvm --release + run: cargo xtask ci qemu --target x86_64 --accel --sudo --image hello_world-microvm --microvm --release - name: Run UEFI (dev) - run: cargo xtask ci qemu --target x86_64-uefi --accel + run: cargo xtask ci qemu --target x86_64-uefi --accel --sudo - name: Run UEFI (release) - run: cargo xtask ci qemu --target x86_64-uefi --accel --release + run: cargo xtask ci qemu --target x86_64-uefi --accel --sudo --release - name: Run Firecracker (hello_world, dev) - run: cargo xtask ci firecracker --target x86_64-fc --features fc --image hello_world-microvm + run: FIRECRACKER=$HOME/.local/bin/firecracker cargo xtask ci firecracker --target x86_64-fc --sudo --features fc --image hello_world-microvm - name: Run Firecracker (hello_world, release) - run: cargo xtask ci firecracker --target x86_64-fc --features fc --image hello_world-microvm --release + run: FIRECRACKER=$HOME/.local/bin/firecracker cargo xtask ci firecracker --target x86_64-fc --sudo --features fc --image hello_world-microvm --release From 5d8b8b52b669b25040ad55aaeedaf7d4db55cc8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Thu, 29 Aug 2024 21:22:42 +0200 Subject: [PATCH 6/8] dnm lfs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Kröning --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b39e25cd..3c4a3be0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -122,6 +122,8 @@ jobs: - uses: actions/checkout@v4 with: lfs: true + - run: git lfs pull + - run: git lfs checkout - name: Install firecracker run: | # https://github.com/firecracker-microvm/firecracker/blob/v1.5.1/docs/getting-started.md#getting-a-firecracker-binary From abe422e08a6be3a6fcbd0f1de5d4b260d8c74eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Thu, 29 Aug 2024 21:40:54 +0200 Subject: [PATCH 7/8] f MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Kröning --- .github/workflows/ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c4a3be0..026fd87f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -155,7 +155,5 @@ jobs: run: cargo xtask ci qemu --target x86_64-uefi --accel --sudo - name: Run UEFI (release) run: cargo xtask ci qemu --target x86_64-uefi --accel --sudo --release - - name: Run Firecracker (hello_world, dev) - run: FIRECRACKER=$HOME/.local/bin/firecracker cargo xtask ci firecracker --target x86_64-fc --sudo --features fc --image hello_world-microvm - name: Run Firecracker (hello_world, release) run: FIRECRACKER=$HOME/.local/bin/firecracker cargo xtask ci firecracker --target x86_64-fc --sudo --features fc --image hello_world-microvm --release From 64c0b690eb773d63bb2c936e6c391483ba86d090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Thu, 29 Aug 2024 22:00:42 +0200 Subject: [PATCH 8/8] 2404 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Kröning --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 026fd87f..c9885b60 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -113,7 +113,7 @@ jobs: run-kvm: name: Run (KVM) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Install QEMU run: |