Skip to content

Releases: arighi/virtme-ng

v1.40

01 Dec 15:52

Choose a tag to compare

virtme-ng v1.40 (hotfix release is out)!

No significant change, this is just a very small hotfix release to solve a packaging problem introduced by a conflict with the new vng-mcp tool.

And, while at it, there're also some small improved hints in the MCP server, so that AI agents can better understand how to build the kernel using vng --build.

Detailed ChangeLog:

Andrea Righi (3):
      virtme-ng: MCP: Document kernel build using virtme-ng
      virtme-ng: setup: Remove vng-mcp from scripts
      virtme-ng v1.40

v1.39

30 Nov 09:20

Choose a tag to compare

virtme-ng v1.39 is out!

The most noticeable change in this release is the new Model Context Protocol (MCP) server. This feature lets you connect with AI assistants such as Claude, Cursor, etc., and use natural human language to automate kernel development tasks.

In this way, AI agents can automatically configure kernels, apply patches from lore.kernel.org, and run commands within recompiled kernels. You can even have the AI agent perform bug bisection for you and run specific commands/scripts inside each recompiled version to determine whether the kernel is good or bad.

An additional feature is vCPU pinning (using the --pin CPU_LIST option), which enables binding virtual CPUs to particular physical host CPUs. This ensures more consistent performance testing within the vng guest environment.

The release also adds support for memoryless NUMA nodes, enabling users to specify size=0 with the --numa argument to create NUMA nodes without memory. This capability can be useful for simulating heterogeneous architectures, where devices like GPUs are represented as memoryless NUMA nodes to model their CPU locality relationships.

Last, but not least, there's a new --shell BINARY option which lets users choose a different shell to use within the vng session, rather than using their system's default shell and a new --empty-password option that creates empty passwords in the vng guest, instead of blocking login for other users, enabling easier debugging and SSH access during testing.

Other changes:

  • Updated Python versions in CI (dropped EOL 3.8 and 3.9)
  • Various bug fixes in virtme-init
  • Enhanced documentation and README updates
  • Improved error handling and validation

Detailed ChangeLog:

Andrea Righi (7):
      virtme/architectures: Enable topology extensions for AMD CPUs
      virtme-ng: Introduce --shell
      virtme-ng: Implement vCPU pinning
      virtme: systemd: Disable zram generator
      virtme: Support memoryless NUMA nodes
      virtme-ng: Add MCP server for AI agent integration
      virtme-ng v1.39

Ilya Leoshkevich (3):
      virtme-init: Improve nested virtme-ng performance
      virtme-init: Fix `base64: invalid input`
      virtme-init: Send guest's hostname to the DHCP server

Marc Hartmayer (3):
      virtme/commands/run: Fix TypeError
      vng: Add `--empty-passwords` support
      Improve `vng-mcp` integration

Matthieu Baerts (NGI0) (8):
      virtiofsd: run with -o cache=auto in --rw mode
      github: python: add 3.14, drop 3.9
      project: drop EOL Python 3.8 and 3.9 versions
      github: run: use virtme-ng-init in one of the runs
      github: run: use the verbose option
      github: run: switch to latest ubuntu version
      github: run: sync dependences with README
      README: docker: keep example up-to-date

Oscar Linderholm (2):
      net: option to disable automatic DHCP configuration
      Make --no-dhcp a global configuration option

Ricardo B. Marlière (5):
      virtme/run: Set virtme_root_user=1 also when using `--root` option
      virtme/run: Check read permissions of args.root
      virtme/run: Always mount cache when args.root != '/'
      virtme-sshd-script: Set SSH_HOME to virtme.cache if it's mounted
      virtme-sshd-script: Don't use the default StrictModes

Ricardo Ribalda (1):
      virtme-init: Increase timeout for udevadm settle

v1.38

26 Sep 17:40

Choose a tag to compare

A new version of virtme-ng is out!

This is a fairly calm update, bringing only bug fixes. The most noticeable fix is that the infamous Stale file handle (ESTALE) errors with virtiofsd are finally gone (if you've hit them before, you know how annoying they were).

Other fixes/improvements that are worth mentioning:

  • a fix for systemctl daemon-reload when systemd support is enabled (@marcosps),
  • a fix for a kernel symlink issue affecting openSUSE/SLE (@marcosps),
  • README/docs improvements (@matttbe),
  • various coding style cleanups (@mhartmay).

Detailed ChangeLog:

Andrea Righi (4):
      virtme_ng_init: Fix potential endless loop when reading /proc/consoles
      virtme-ng: Run virtiofsd with -o cache=always to avoid ESTALE errors
      doc: Add a note about stale file handle errors
      virtme-ng v1.38

Cheng-Yang Chou (1):
      docs: Add "cd virtme-ng"

Marc Hartmayer (12):
      virtme/guest/virtme-init: su: Do not use a login shell
      virtme-ng-init: Be in common with the Bash variant
      virtme-ng-init: `cargo clippy` and `cargo fmt` fixes
      setup.py: Remove outdated code
      virtme_ng_init: Set minimal supported Rust version (MSRV) to 1.75.0
      virtme_ng_init: Cargo.toml: Configure linter
      virtme_ng_init: Fix most of the new `cargo clippy` findings
      pre-commit: Add cargo hooks
      pre-commit: Do not use the legacy alias for `ruff`
      github actions: rust: Reuse pre-commit
      Update README.md to suggest setting up pre-commit
      pre-commit: Add more hooks

Marcos Paulo de Souza (3):
      utils.rs: Show the reason of why run_cmd failed
      init: Create a default lvm.conf file when --systemd is specified
      commands: run.py: Resolve symlinks on get_kernel_version

Matthieu Baerts (NGI0) (9):
      pre-commit: cargo: display different names
      github: rust: use one pre-commit command
      README: rework the Installation section
      README: move the Requirements section after Installation
      README: note about shell completion
      README: fix typo and missing backquotes
      README: fix aligments
      README: remove no longer used 'virtme' link
      README: Troubleshooting: poor performances

v1.37

08 Aug 08:14

Choose a tag to compare

A new version of virtme-ng is out!

The most interesting feature in this new version is the initial support for systemd, thanks to @rbmarliere!

Until now, virtme-ng didn’t support systemd because it relied on a custom init system (virtme-ng-init) to speed up boot time. As a result, tests requiring systemd couldn't run inside the virtme-ng session. With the new --systemd option, virtme-ng can now (optionally) boot with systemd in the virtualized environment, enabling full systemd interaction during testing.

Example:

  • without systemd support:
$ vng -r -- systemctl show --property=Version
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to system scope bus via local transport: Host is down
  • with systemd support:
$ vng -r --systemd -- systemctl show --property=Version
Version=257.8-1-arch

Note: You'll need a fully-featured (generic) kernel for systemd to start all expected services. Using --systemd with a minimal kernel may not work reliably.

Moreover, this release also includes a few bug fixes and small improvements. Enjoy!

Detailed ChangeLog:

Andrea Righi (2):
      virtme/commands/run: Do not fail if nr_open can't be accessed
      virtme-ng v1.37

Dafna Hirschfeld (2):
      virtme/commands/run: search vmlinux in kdir for gdb
      virtme/commands/run: support dry run for gdb

Jakub Kicinski (1):
      virtme_ng/utils: resolve symlinks for binary paths

Luis Henriques (1):
      virtme/commands/run: also identify static PIE busybox binaries

Marc Hartmayer (3):
      virtme_ng: run: Use `json` package for creating the JSON messages
      virtme_ng: run: dump: Make sure the temporary file resides on the same file system
      virtme_ng: run: Dump: Check for more errors and print error messages

Matthieu Baerts (1):
      gdb: dry-run: use 'shlex' to print array

Matthieu Baerts (NGI0) (1):
      setup: fix license format

Ricardo B. Marlière (7):
      virtme-init: Do not re-mount /run
      systemd: Add initial support
      virtme-ng: Move get_conf_file_path() from KernelSource to utils.py
      virtme-ng: Make utils.get_conf() accept a path
      systemd: Enable user to customize masks
      virtme_ng/utils: Remove cfg/virtme-ng.conf in favor of CONF_DEFAULT
      README.md: Add "Configuration" section

v1.36

11 May 15:52

Choose a tag to compare

Another hotfix release to address an issue with remote builds and fix a couple of quoting problems in the vng command.

Detailed ChangeLog:

Andrea Righi (2):
      vng: Fix remote build
      virtme-ng v1.36

Marc Hartmayer (3):
      virtme_ng: run: --exec and positional arguments are mutually exclusive
      virtme-ng: run: Fix quoting
      virtme_ng: run: Fix `vng -- ''`

v1.35

04 May 17:44

Choose a tag to compare

Just a hotfix release to revert a change that broke some CI workflows.

Detailed ChangeLog:

Andrea Righi (2):
      Revert "vng: exec: quote envs args"
      virtme-ng v1.35

v1.34

04 May 16:53

Choose a tag to compare

May the 4th be with your kernel tests, virtme-ng v1.34 is out!

This new version includes lots of improvements in the SSH protocol (special thanks to @mhartmay and @matttbe!) and a better support for the s390 architecture.

By default, SSH connections to the guest now use vsock, a lightweight transport that bypasses the full network stack and can speed up testing workflows. You can also use the -- syntax to run remote commands in a guest via SSH, for example vng --ssh-client -- uname -r. In addition, the integration with tools like ssh, scp, and rsync has been improved for connecting to or copying files from/to a vng guest. To view and customize the exact SSH command being used, try vng --ssh-client --dry-run.

Last but not least, there's also the usual set of misc bug fixes and improvements.

Detailed ChangeLog:

Andrea Righi (12):
      init: clean up previous X11 state
      init: allow to create raw ICMP socket as regular user
      setup.py: Build a static virtme-ng-init
      build: support newer pip
      virtme-sshd-script: Enable scp support
      ssh: Move virtme-ssh-proxy to host tools
      doc: Update scp example
      resources: Support importlib_resources with python 3.10
      ci: Fix coding style and make pre-commit hook happy
      virtme-ng: Do not truncate stdout/stderr on process exit
      ssh/vsock: Use "%" as the default CID/port separator
      virtme-ng v1.34

Andreas Grapentin (2):
      enable different user login through virtme ssh client
      mount /run with permissions 755 and use as path for sshd files

Jakub Wilk (1):
      Add missing spaces in help message

Jim Cromie (2):
      configkernel: check for an existing .config before doing new one
      check that --custom arg is an existing file

Marc Hartmayer (51):
      pyproject.yaml: Specify minimum version of Python supported
      Provide a pre-commit configuration file
      run: Add '--disable-monitor'
      virtme/commands/run: Make 'img_name' parameter optional
      run: find_kernel_and_mods: Support multiple img names
      architectures: s390x: Add Ubuntu, RH, and Fedora support to img_name
      architectures: s390x: Fix serial console args
      architectures: s390x: Add earlyconsole args
      Use vmcoreinfo device only on architectures that supports it
      Fix check-executables-have-shebangs findings
      Automatic pyupgrade fixes
      Fix all flake8 and pylint findings
      pre-commit: Avoid removing the blank line from DCO-1.1.txt
      virme/commands/run: find_kernel_and_mods: Fix kernel modules version detection on s390x
      Fix ruff pyupgrade check findings
      Fix ruff flake8-bear finding
      pyproject.toml: Add minimal 'ruff' configuration
      pre-commit config: Replace pyupgrade, flake8 and pylint by the ruff checker
      pre-commit configuration: Add ruff-format hook
      pyproject.toml: Select 'isort' for ruff
      setup.cfg: flake8: Ignore E203
      Reformat code using 'ruff format'
      Add '.git-blame-ignore-revs' file
      virtme/architectures: s390x: Use host CPU model in case of KVM and native run
      virtme/architectures: Add 'numa_support' function to 'Arch' class
      virtme/architectures: Add s390x virtiofs support
      architectures: s390x: Add diag288 watchdog support
      virtme/commands/run: ssh_client: Fix quoting of cmd in dry-run mode
      virtme-sshd-script: Specify the SSH_CONFIG only once
      Fix many ShellCheck findings and some other minor nits
      virtme/guest/virtme-init: Bail out in case change directory has failed
      Fix ShellCheck finding SC2714
      virtme/guest/*: Replace `which` utility by `command -v` bash builtin
      pre-commit configuration: Add local ShellCheck hook
      Add EditorConfig configuration
      pre-commit-config: Add local shfmt hook
      Format all shell source files
      Add the commit formatting the Bash code to '.git-blame-ignore-revs'
      virtme-init: Bash implementation: Make it more similar to the Rust implementation
      virtme/commands/run: ssh_client: Fix quoting of 'args.remote_cmd'
      architectures: Make 'vhost_dev_type' more generic
      virtme: Populate own 'known_hosts' file with our SSH host keys
      virtme/commands/run: Create and use a SSH client configuration
      virtme: Add vsock support for the SSH connection to the guest
      virtme-prep-kdir-mods: Get rid of interactive question when modules.dep is removed
      virtme/commands/run: get_kernel_version: Refactor kernel version pattern
      virtme/run: Fix version detection on s390x if */lib/modules/.../vmlinuz is used
      virtme_ng/version.py: Fix coding style
      README.md: Improve `virtme-ng.conf` example (#278)
      virtme/commands/run: Use `tempfile.TemporaryFile`
      Use `shlex.join()` instead of `" ".join(...)`

Matthieu Baerts (NGI0) (18):
      README: recommended way to build in a separate dir
      README: example with CCache
      config: create build dir if defined
      version: use importlib.metadata instead of pkg_resources
      ssh: disable host key checking
      make: drop submodule update
      resources: replace pkg_resources by importlib_resources
      README: mention 'ssh vsock/<CID>'
      console: abort if socat is not available
      vng: build/quote: quotes envs and args
      vng: build: print make command
      vng: exec: quote envs args
      vng: args: move --ssh-tcp in the remote group
      vng: console/ssh: use envs as remote cmd
      README: example with KBUILD_OUTPUT
      vng: use shlex.split() instead of <str>.split()
      vng: --append: better handled quotes
      vng: build: more readable command

Ricardo B. Marlière (1):
      virtme/run: Set kernel.use_root_mods when user pass `--root`

virtme-ng v1.33

26 Feb 08:55

Choose a tag to compare

virtme-ng v1.33 is now available!

While the changelog looks extensive, this release is quite small and stable with only a few bug fixes. The big changelog is due to the merging of virtme-ng-init into the main virtme-ng project (while keeping the virtme-ng-init git history intact). This merge allows us to simplify the project structure and eliminate the need to manage a separate git submodule.

As a result, you may need to run the following commands to remove the submodule also from your local Git repository (in case somehting isn't working in your regular workflow):

$ git submodule deinit virtme_ng_init
$ git rm -rf virtme_ng_init

After that, just fetch, pull, or reset to the main virtme-ng branch as usual.

Most noticeable changes in this release include restricting the SSH port to localhost (to mitigate potential security risks when --ssh is used), support for running amd64 vng instances on non-x86 platforms (e.g., running an x86 vng instance on arm64), and a number of minor fixes here and there.

Big thanks to all the contributors!

Detailed ChangeLog:

Andrea Righi (53):
      initial commit
      virtme-ng-init: initial implementation in Rust
      doc: add a proper README.md
      create rust.yml
      properly handle GUI support
      workaround to be able to start xinit directly from a console session
      doc: README.md: project merged into virtme-ng
      virtme-ng-init: preserve host path
      virtme_ng_init: properly synchronize udev and network startup
      virtme-ng: allow to run snaps inside virtme-ng instances
      virtme-ng: provide --enable-snaps
      virtme-ng-init: initialize XDG_RUNTIME_DIR
      guest-tools: add a script to automatically start the sound subsystem
      virtme-ng: try to automatically fix permissions of snapd state.json
      virtme: init process refactoring
      virtme-ng: pass --exec command via /proc/cmdline
      virtme-ng-init: support 32-bit architectures
      virtme-ng-init: use usize instead of u64 in do_mount()
      virtme-ng-init: minor coding style fixes
      virtme-ng-init: relax 'nix' and 'users' crate dependencies
      remove Cargo.lock
      update README.md
      github: add coding style checks to the workflows
      virtme-ng-init: support base64 encoded commands
      cargo: use fixed versions for nix and users crate
      virtme-ng-init: fail gracefully when executing external commands
      virtme-ng-init: support long commands in graphic mode
      virtme-ng-init: make virtme-script a constant
      virtme-ng: honor virtme_user when running user script
      virtme-ng-init: always set XDG_RUNTIME_DIR
      virtme-ng-init: set proper ownership of the default console device
      virtme-ng-init: set the proper ownership on the virtio-ports devices
      virtme-ng-init: fix build error with older versions of rustc
      virtme-ng-init: add default secure_path to /etc/sudoers
      virtme-ng-init: drop usage of group when chwon'ing
      virtme-ng-init: docker host support
      virtme-ng-init: channel the return code of a command to the host
      virtme-ng-init: allow virtme-ng to specify a console device
      virtme-ng-init: always override sudoers
      virtme-ng-init: handle command line option nr_open
      virtme-ng-init: apply limits after mounting kernel filesystems
      virtme-ng-init: hide additional sudo settings
      virtme-ng-init: print a hint to exit from virtme-ng
      virtme-ng-init: allow to mount legacy cgroupfs (v1)
      virtme-ng-init: properly configure terminal line settings
      add Cargo.lock
      virtme-ng-init: move all temp files to /run/tmp
      virtme-ng-init: overlayfs: fall back to mounting without xino option
      ssh: support virtme.ssh
      virtme-ng-init: always check return code when executing bash
      virtme-ng: enable amd64 architecture support on non-x86 platforms
      virtme: always print kernel panic / oops in interactive mode
      virtme-ng v1.33

Andreas Grapentin (1):
      properly quoting exec string to avoid breaking virtme-run invocation on more complex guest calls

David Carlier (1):
      virtme_ng_init: replace Err(...) instances for is_err()

Marcos Paulo de Souza (1):
      main.rs: Enable lvm usage

Matthieu Baerts (NGI0) (17):
      init: set the HOME env var if root
      net: support multiple interfaces
      net: setup the loopback iface in a thread
      poweroff: fix irrefutable 'if let' pattern warning
      vsock: socat service for remote console
      vsock: mount virtme_vsockmount if needed
      ssh: only export the port to localhost
      virtme-ng-init: remove the submodule
      gh: import and adapt rust workflow
      console/ssh: properly quote the remote cmd
      vng: run: support O= in interactive mode
      vng: run: support O= with full paths
      vng: run: support KBUILD_OUTPUT
      vng: support --debug with --qemu-opts
      vng: support --nvgpu and --qemu-opts
      vng: fail if --arch is used without --root
      vng: arch: list supported arch in case of errors

Neill Kapron (1):
      virtme-ng-init: do not remount /run

Ondrej Mosnáček (2):
      virtme_ng_init: use uzers instead of users (which is unmaintained)
      virtme_ng_init: update dependencies

Thibault Ferrante (2):
      README.md: add building and installation section
      virtme-ng-init: allow /tmp to be mounted from host

Uli Schlachter (34):
      Use ? on Option where possible
      Add a simple test for extract_user_script()
      Simplify extract_user_script()
      Remove use of HashMap
      Remove Option return from run_misc_services()
      Simplify an env var check
      Simplify(?) some environment lookup
      Simplify lookup of $virtme_user
      Simplify(?) some command construction
      Remove useless Some-wrapping
      Remove unnecessary 'static
      Replace e.g. libc::S_IRWXU with Mode::S_IRWXU
      Fix clippy warnings around logging
      Fix clippy warnings about patterns
      Fix clippy warning about unnecessary return
      Fix clippy warnings about reading lines
      Fix clippy warning about "loop never loops"
      Fix clippy warning about "push() after creation"
      Fix clippy warning about unnecessary matching
      Simplify opening of TTYs
      Use uname() from nix instead of libc
      Remove useless to_string()
      Simplify /etc/shadow generation
      Use utils::create_file() to write some file contents
      Remove an unnecessary Vec
      Refactor logic in find_udevd()
      Allow run_cmd() with non-utf8-strings
      Avoid allocations for static strings for run_shell()
      Use nix' flags instead of libc's in one more place
      Avoid temporary allocation for PathBuf
      Add a log!() macro
      (Needlessly) optimise logging
      Use write_all() instead of write()
      Remove unnecessary trim_end_matches('\n')

Zev Weiss (3):
      utils: Don't log mount failures due to ENOENT
      Don't try to run systemd-tmpfiles on non-systemd systems
      Add guest hostname to /etc/hosts

virtme-ng v1.32

03 Jan 19:02

Choose a tag to compare

Happy new year! virtme-ng v1.32 is out!

We're kicking off with an exciting new release with some new features. The most notable being the remote console (vsock), thanks to @matttbe, and SSH support.

The remote console (--console / --console-client) allows you to open a console session on a running vng instance from another terminal, which can be really useful for inspecting tests/workloads while they're running in the primary console.

The SSH support (--ssh / --ssh-client) enables direct ssh/scp access to a running vng instance, making it particularly useful to transfer data, such as large test outputs, from the guest to the host and vice-versa. Since these are all new features, I expect to see some bugs, so don't hesitate to report them.

Additionally, there's a new command --numa-distance, that can be used to simulate heterogeneous NUMA nodes with different distance costs.

Enjoy!

Detailed ChangeLog:

Andrea Righi (6):
      numa: introduce --numa-distance
      virtme-init: Start udev after mounting all filesystems
      virtme: enable ssh support
      virtme-ng: introduce --console and --ssh shortcuts
      sshd: generate a custom sshd_config
      virtme-ng v1.32

Marcos Paulo de Souza (1):
      virtme-init: Enable lvm usage

Matthieu Baerts (NGI0) (24):
      net: support multiple interfaces
      udhcpc: add default route if announced
      net: allow to specify the bridge iface
      net: option to force net MAC address
      github: pylint: new supported versions
      feat: vsock support for remote console access
      vsock: connect: generate helper script
      vsock: connect: pass command to execute
      vsock: connect: avoid issues with modified script
      make: build virtme-ng-init by default
      vsock: connect: support commands without tty
      vsock: connect: execute given cmd with right user
      vsock: connect: only use 'su' if needed
      vng: pass '--user root' to virtme-run
      vsock: connect: respect '--user' if defined
      vsock: connect: respect '--pwd' and '--cwd' if defined
      vsock: 'socat' is required
      vsock: rename options to --client/--server
      console: port: switch to 2222 by default
      console: --client and --server are mutually excl
      console: client: support --dry-run
      README: mention 'socat' in the requirements
      github: restrict builds on push to the main branch
      sshd: look for overlayfs before modifying auth keys

Michal Suchanek (1):
      setup.py: Do not fail when argparse-manpage is not available

Tamir Duberstein (2):
      Revert "Merge pull request #184 from hramrach/main"
      Restore bash completions

jeromecst (1):
      Update README.md

v1.31

18 Oct 13:43

Choose a tag to compare

virtme-ng v1.31 released!

This is a minor release to fix a packaging issue, after an attempt to modernize the build system we realized that we were not installing the bash completion file anymore, so we have temporarily reverted the change to cut this new release.

This is mostly for distro that may have missed the bash completion and the default config file with the previous release (v1.30).

In addition to this packaging fix, there is also the initial support to run virtme-ng on macOS, which is pretty cool (thanks @tamird)!

Detailed ChangeLog:

Andrea Righi (2):
      setup.py: update contact email
      virtme-ng v1.31

Michal Suchanek (1):
      Revert "Modernize build system"

Tamir Duberstein (4):
      Make it build on macOS
      Remove redundant initialization
      Remove usage of os.uname
      Make qemu work on macOS