Hardpass
hardpass is a small Rust CLI for managing local Ubuntu cloud-image VMs with QEMU.
It exists for people who want a simpler, more predictable local VM workflow than Multipass:
- macOS and Linux hosts
- Ubuntu guest images only
- host-native guest architecture only
- QEMU user networking
- stable per-VM SSH port forwarding
Commands
doctorchecks for required local tools and firmware.image prefetchdownloads and verifies a cloud image into the local cache.createcreates a named VM.startboots a named VM and waits for SSH.stopgracefully stops a named VM.deletestops and removes a named VM.listshows known VMs.info [--json]prints VM details.sshopens an interactive SSH session.execruns a remote command over SSH.
Install
From crates.io:
That installs the hp executable.
From the GitHub repository:
From a local checkout:
That installs hp into Cargo's bin directory so the examples below can be run directly.
Quick Start
create defaults to Ubuntu 24.04 on the host-native guest architecture. You can override VM size and forwarding when needed:
If you want to warm the image cache before the first VM boot:
Use info --json when another tool needs machine-readable state:
The JSON payload includes ssh.alias, so other tools can discover the SSH alias directly.
State and SSH
Hardpass stores state under ~/.hardpass by default. Set HARDPASS_HOME if you want a different root.
When using the default ~/.hardpass root, Hardpass automatically:
- adds
Include ~/.hardpass/ssh/configto~/.ssh/config - rewrites
~/.hardpass/ssh/configto match the current VM aliases
Each VM name becomes an SSH alias with the stored loopback port and identity file:
With the default ~/.hardpass root, hp create and hp delete keep the alias file up to date automatically.
Host Requirements
qemu-imgqemu-system-x86_64orqemu-system-aarch64sshssh-keygen- Linux hosts need
/dev/kvm; Hardpass does not fall back to TCG - AArch64 hosts also need discoverable UEFI firmware for QEMU
Run hp doctor to confirm the local environment before creating a VM.
Security Notes
- SSH connections disable host key checking and known-host persistence for loopback convenience.
- The default cloud-init config creates an
ubuntuuser with passwordless sudo. - Guest networking uses QEMU user networking, not bridged networking.
Testing
The real-QEMU integration smoke test is opt-in:
HARDPASS_REAL_QEMU_TEST=1
The heavier GitHub Actions e2e test is also opt-in locally on macOS and Linux hosts:
HARDPASS_REAL_QEMU_TEST=1
Both real-QEMU tests use the current HOME and the normal Hardpass state at ~/.hardpass, so they share the default image cache and exercise the same SSH-config behavior a user would get in CI. While they run, you can inspect them with ordinary cargo run -- list, cargo run -- info <name>, and cargo run -- ssh <name>.
In GitHub Actions, the e2e workflow requires /dev/kvm and intentionally fails instead of falling back to TCG.
Set HARDPASS_E2E_PROFILE=stress to run the 2-VM profile locally.