minimega 2.4 release notes¶
Introduction¶
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¶
miniplumber¶
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.
namespaces¶
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).
Scheduler¶
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 http://minimega.org/minimega.git 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¶
miniweb¶
Created standalone webserver based on web API. Added many
new features, see the miniweb article for more
information.
vmbetter¶
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.
uminiccc/uminirouterfs¶
Added a busybox-based container filesystem that includes miniccc based on the busybox-based minirouter filesystem (renamed to uminirouterfs).
igor¶
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.
passwordify¶
Added new tool to modify credentials for a ramdisk image.
vmconfiger¶
Added new tool to automatically generate the vm config APIs. This helps keep
documentation consistent and simplifies adding new vm config APIs.
protonuke¶
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.
powerbot¶
Add IPMI support.
minitest¶
Added recursive mode and new distributed tests.
rond¶
Added new standalone ron server that can be used separate from minimega to
provide command-and-control to physical machines. Partially implemented.
Bug fixes¶
containers¶
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.
miniccc¶
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.
Availability¶
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.
tarball¶
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 github.com. In order to build minimega, you will need a Go 1.8+ compiler and libpcap headers.