a distributed VM management tool

minimega 2.4 release notes


The minimega team is pleased to announce the release of minimega 2.4. This release includes improvements to make experiments more portable, an effort that started in 2.3, and numerous bug fixes. This release contains changes to the existing API which will improve user experience and programmability.

What's new

Major changes and milestones


Add plumbing support to minimega and miniccc to facilitate non-networked communication between VMs, processes on guests or hosts, and instances of minimega. See the miniplumber article and presentation for details.


In 2.3, we introduced namespaces as the first step towards more portable experiments. In 2.4, we have refactored namespaces to be more comprehensive. minimega is now always in a namespace -- minimega by default. All state associated with a namespace (e.g. VMs, taps, captures, VNC) is now automatically cleaned up when it is destroyed.

As part of this refactor, we have made several APIs work properly with namespaces. Specifically, there is now a separate vm config per namespace. vm config clone and vm config qemu-override now work with namespaces. There is also a separate router and cc instances per namespace (including a separate cc filter and cc prefix).

One notable change is that miniccc_responses are now separated by namespace. Each namespace includes its own command-and-control server that writes to a separate directory. This addresses an issue with clients having the same UUIDs in different namespaces (before, they would have written responses to the same directory).


The scheduler has been vastly improved in this release. In 2.3, we did round-robin scheduling to distribute VMs across hosts. Now, the scheduler attempts to load balance based on CPU, memory, or network commit. There are also two new APIs to fine-tune the scheduler: vm config schedule and vm config coschedule. See the namespaces article for details.

ns API

The ns API replaces nsmod to configure the active namespace. See help ns for more information.

We added ns run to run a command on all nodes in the namespace.

capture API

The capture API was rewritten and is now much more stable than before. We have used it with thousands of captures without crashing.

Added new APIs to configure the snaplen and BPF for new PCAP captures. Added new APIs to configure ASCII or Raw and compression for new netflow captures. Simplified the capture netflow API to use the stored configuration rather than pass it in the command.

container VCPUs

Containers had a VCPUs parameter but no CPU limit was actually enforced. Now, we use the cpu cgroup to set a quota on processing time for the container based on the value of vm config vcpus.

Additional new features

cc listen API

To support the above changes to cc, we removed the -ccport flag and replaced it with the cc listen API. This runs on all hosts in the namespace.

cc listen must be run manually if users wish to use a network-based backchannel for command and control.

cc log level API

Added new API to change miniccc's log level at runtime: cc log level.

It uses the value of cc filter to determine which VMs to update.

file API

file delete now supports globs (e.g. file delete *.qcow).

router API

Added router <vm> gw API to set the routers default gateway.

vm top API

Added vm top API to show the memory and CPU resources that VMs and containers are actively using.

vm info API

Moved the bandwidth column to vm top.

Added an uptime column for the time since the VM was launched. Added pid column for QEMU process for VMs and for init process for containers.

vm config volume API

Added vm config volume API to specify additional directories to mount into the container's filesystem.

vm config backchannel API

Added vm config backchannel to control whether a network-less backchannel is created for the VM/container or not. Solved an issue where some VMs only recognized one virtio port.

This defaults to true so existing scripts do not need to change.

vm cdrom API

vm cdrom can now address one or more VMs using the same syntax as vm start. This allows users to add or remove disks for multiple VMs in one command.

Modified the QEMU arguments so that VMs have an empty CD device by default. This allows users to add a CD to all VMs, not just ones that were launched with a CD in vm config cdrom.

vm hotplug API

Similarly to the vm cdrom API, vm hotplug now supports addressing one or more VMs using the syntax from vm start.

vm hotplug also now includes two optional parameters: the USB version and USB serial number. The USB version controls which bus the device is connected to -- either 1.1 or 2.0. The serial number is visible to the VM.

Renamed vm hotplug show to vm hotplug. To limit results to a particular VM, use .filter.

vm net API

Similarly to the vm cdrom API, vm net now supports addressing one or more VMs using the syntax from vm start.

The bridge parameter is now optional and defaults to the bridge that the tap is already connected to (or mega_bridge if the tap is disconnected).

Changed the parameter order in order to support the above changes.

host API

Added many new columns to support the scheduler. See help host for details.

debug API

Added debug goroutine to dump goroutine stack traces to file.

clear all API

Added clear all API to reset minimega to a vanilla state. Restarting is still preferred.

help API

Added support for sub-command help (e.g. `help vnc record`).

vyatta API

Removed deprecated API.

web API

Removed API. See replacement, miniweb.

vnc API

Changed the default location for reading and writing recordings to the iomeshage directory rather than the current directory.

.preprocess API

Added .preprocess API to disable preprocessor. minimega automatically fetches files with a file: or http:// prefix -- this API allows you to disable that preprocessing. For example, .preprocess false cc exec curl http://....

.env API

Added .env API to print/update/unset environment variables.

Apropos for .columns, .filter APIs

Added apropos support for .columns and .filter. Users can now uses a distinct prefix for column names rather than the full column name.

QEMU flags

Changed the default video driver from cirrus to std.

VLANs file

minimega now writes out the VLAN mappings to the filesystem.

Tabbed completion

minimega now completes commands when using the -attach interface.

Added completion for namespace, tap, and bridge names in supporting APIs.

Added environment variable completions.

Header uniformity

Updated the headers on several API to make them easier to use with .columns and .filter:

  • bridge
  • capture
  • cc
  • debug
  • disk
  • dnsmasq
  • file status
  • mesh status
  • optimize
  • vm hotplug
  • vm tag

All column names should now be one word and lowercase.

Readline replacement

Replaced the GNU Readline library in minimega with a pure Go implementation, eliminating a C dependency. Users may notice slightly different behaviors between the implementations.

Vanity URL

Users can now clone minimega via which redirects to the Github repo.

Travis Integration

Added Travis integration to Github. Added new script check.bash to ensure source code meets gofmt and go vet standards.

Auxillary Tools


Created standalone webserver based on web API. Added many new features, see the miniweb article for more information.


The vmbetter configs included with minimega have been heavily refactored. Specifically, we:

  • Added new host config for CARNAC.
  • Renamed ccc_host_ovs to ccc_host.
  • Added new configs to build images with the dependencies to build minimega.
  • Renamed miniccc_virtio to miniccc.
  • Deleted protonuke.
  • Changed ccc_host to set experiment IP from management IP.
  • Set motd throughout.
  • Added symbolic links to miniccc and minirouter (so that they copy in automatically from bin/).

The last change means that users no longer have to copy binaries into the overlay directory before building.


Added a busybox-based container filesystem that includes miniccc based on the busybox-based minirouter filesystem (renamed to uminirouterfs).


igor has had a significant overhaul. It now performs scheduling, rather that just reservation. Users specify how many nodes they need and for how long; igor looks through its schedule to find a time when it has enough nodes available and reserves them then. When the reservation starts, igor will copy in the boot files as usual. It can now also reboot nodes automatically when the reservation starts (if desired), and has experimental support to put each reservation in a different Q-in-Q (802.1ad) network segment to avoid network conflicts. Users can also make reservations at a specific time in the future rather than next available, reserve specific nodes rather than the next available, or ask igor to show them some available reservation slots without actually creating a reservation.


Added new tool to modify credentials for a ramdisk image.


Added new tool to automatically generate the `vm config` APIs. This helps keep documentation consistent and simplifies adding new `vm config` APIs.


Added a flag to enable cookie jar for protonuke http and https clients.

Added simple FTP server and client.

Added size query parameter to image.png to request image of specified size. protonuke generates the image on the first request and stores it for future requests.


Add IPMI support.


Added recursive mode and new distributed tests.


Added new standalone ron server that can be used separate from minimega to provide command-and-control to physical machines. Partially implemented.

Bug fixes


minimega now creates /proc, /dev, /dev/shm, /dev/pts, /sys in the container filesystem if they do not exist. Solved an issue where containers would fail to start.

bandwidth on VMs

There was a bug where the bandwidth statistics were reversed (Rx and Tx were swapped). Changed to a weighted moving average to show changes in transfer rates faster.

qos API

Use tbf instead of netem for rate limiting since netem does not seem to behave correctly between VMs on different hosts. Unfortunately, this means that rate and loss/delay are mutually exclusive now.


In 2.3, miniccc added support to set upstream tags using a UDS. This socket was not properly cleaned up and would prevent miniccc from restarting if the VM reboots. Changed miniccc so that it deletes the UDS if it does not detect that there is an instance on miniccc running.

Fix UUID handler for Windows.


minimega is available in several ways, both as pre-built distributions and source. See the installing guide for more information.

Debian package

minimega is available as an x86-64 debian package, available here. It is known to work in debian 7 (wheezy) and 8 (testing/jessie) and ubuntu 16.04.


A pre-built, x86-64 distribution is available in a single distributable tarball here. It should be sufficient to simply unpack the tarball and run tools from the bin/ directory directly. Most default paths in minimega, vmbetter, and other tools are built to be used in this way (i.e. bin/minimega, which will then look for the web directory in misc/web).

Building from source

Source of the entire distribution is available on Github. Follow the directions for cloning or forking minimega on In order to build minimega, you will need a Go 1.8+ compiler and libpcap headers.