vmexec 0.7.1

Run a single command in a speedy virtual machine with zero-setup
Documentation
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

<!-- next-header -->

## [Unreleased] - ReleaseDate

## [0.7.1] - 2026-09-07
- Improve developer ergonomics by having better default values [!41]https://gitlab.archlinux.org/archlinux/vmexec/-/merge_requests/41
- Fix VMs started via the library never reporting as running [!42]https://gitlab.archlinux.org/archlinux/vmexec/-/merge_requests/42
- Get rid of a lot of transitive deps

## [0.7.0] - 2026-09-01
- `vmexec` is now usable as a library [#20]https://gitlab.archlinux.org/archlinux/vmexec/-/work_items/20
- Make sure `clean` and `prune` don't race with other operations by locking them
- Make `exec` exit with the command's exit code (`run` already did that so this was an oversight)
- Log to stderr instead of stdout so that log output can't mix with regular command output

## [0.6.0] - 2026-07-28
- Fix custom image handling [!15]https://gitlab.archlinux.org/archlinux/vmexec/-/merge_requests/15
- Merge `daemon.stdout` and `daemon.stderr` of detached VMs into a single `daemon.log` [!17]https://gitlab.archlinux.org/archlinux/vmexec/-/merge_requests/17
- Unify locking into a single lock dir in the state dir; this also fixes a race where cleanup could delete a held lock during CID allocation [!17]https://gitlab.archlinux.org/archlinux/vmexec/-/merge_requests/17
- Log a VM's terminal output to `session.log` in its state dir [!17]https://gitlab.archlinux.org/archlinux/vmexec/-/merge_requests/17
- Add `logs` subcommand to show a VM's terminal output (with `-f/--follow` to keep following it) [#16]https://gitlab.archlinux.org/archlinux/vmexec/-/work_items/16
- Add `inspect` subcommand to display detailed information on a virtual machine [#17]https://gitlab.archlinux.org/archlinux/vmexec/-/work_items/17
- Add `pull` subcommand to download the newest image without running a VM (with `--prepare` to also pre-warm it) [#4]https://gitlab.archlinux.org/archlinux/vmexec/-/work_items/4
- Add `images` subcommand to list locally cached images [#19]https://gitlab.archlinux.org/archlinux/vmexec/-/work_items/19

## [0.5.3] - 2026-04-08
- Improve error handling and reporting when the vsock module is unavailable [#14]https://gitlab.archlinux.org/archlinux/vmexec/-/work_items/14
- Fix superuser detection for ksm subcommand
- Handle negative `general_profit` in ksm subcommand [#13]https://gitlab.archlinux.org/archlinux/vmexec/-/work_items/13

## [0.5.2] - 2026-03-31
- Truncate device tags for long paths because QEMU limits those

## [0.5.1] - 2026-03-30
- Change vmid and memory arguments to be optional

## [0.5.0] - 2026-03-29
- Allow limiting VM memory usage
- Make sure that `--rm` is respected when calling `stop` on a detached VM
- Fix a crash that would occasionally occur when stdout wasn't ready for flushing
- Add `-a/--all` flag to `ps` and only show running VMs by default
- Limit output of `ps` to a single line per row
- Get rid of `whoami` crate since we can do the same with `nix` which we already have

## [0.4.0] - 2026-03-26
- Add `ready` subcommand (with `--wait` flag to block until ready) to check if a VM is ready to accept SSH connections
- Add `prune` subcommand to delete all overlay images from the cache
  This can be useful when you've nuked your `.local/state/vmexec` dir for some reason
- Add VM config file in `vms/<vm id>/vm.json` and stop writing separate files for QEMU and SSH run data
- Move state directory from `~/.local/share/vmexec/` to `~/.local/state/vmexec/`
- Make VM run state handling more robust
- Rename `runs` to `vms`, this terminology should hopefully be more obvious ([!12]https://gitlab.archlinux.org/archlinux/vmexec/-/merge_requests/12)
- Make sure `unshare` call isn't influenced by system locale ([#12]https://gitlab.archlinux.org/archlinux/vmexec/-/work_items/12)
- Fix deadlock in `virtiofsd` when `RUST_LOG` is set caused by pipe filling up ([!13]https://gitlab.archlinux.org/archlinux/vmexec/-/merge_requests/13)

## [0.3.0] - 2026-02-21
- Add `-w/--workdir` to `exec` and `run` to allow setting working dir

## [0.2.0] - 2025-06-04
- Pass along exit code from process inside VM
- Fix missing stderr output
- Add `--detach` to `run` to enable VM backgrounding
- Add `stop` subcommand to stop running VMs by id
- Add `exec` subcommand to run a command in an already running VM
- Add `clean` subcommand to clean up old run dirs
- Add `--rm` to `run` to optionally clean up run dirs after exiting
- Add `--disable-kvm` to `run` to allow for disabling KVM (might be useful in CI)

## [0.1.5] - 2025-05-21
- Add `ps` subcommand to list active VMs
- Fix race condition when starting VMs quickly
- Fix `--tty` and `--interactive` behavior

## [0.1.4] - 2025-03-21
- Remove `--image` and `--os` flags as this is now merged into a new positional argument
- Add `-i/--interactive` and `-t/-tty` flags for more control over the terminal

## [0.1.3] - 2025-03-19
- Add dead run dir reaping
- Add locking when pulling images

## [0.1.2] - 2025-03-18
- Add some flags to `virtiofsd` call to improve performance and decrease guest memory usage
- Fix multiple `-v` options not working due to incorrect fstab getting generated
- Add virtio-pmem device support with `--pmem`

## [0.1.1] - 2025-03-13
- Fix NvVars file getting created in mounted dirs

## [0.1.0] - 2025-03-13
- First somewhat working version

<!-- next-url -->
[Unreleased]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.7.1...HEAD
[0.7.1]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.7.0...v0.7.1
[0.7.0]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.6.0...v0.7.0
[0.6.0]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.5.3...v0.6.0
[0.5.3]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.5.2...v0.5.3
[0.5.2]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.5.1...v0.5.2
[0.5.1]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.5.0...v0.5.1
[0.5.0]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.4.0...v0.5.0
[0.4.0]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.3.0...v0.4.0
[0.3.0]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.2.0...v0.3.0
[0.2.0]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.1.5...v0.2.0
[0.1.5]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.1.4...v0.1.5
[0.1.4]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.1.3...v0.1.4
[0.1.3]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.1.2...v0.1.3
[0.1.2]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.1.1...v0.1.2
[0.1.1]: https://gitlab.archlinux.org/archlinux/vmexec/-/compare/v0.1.0...v0.1.1