minimega 2.3 release notes

Introduction

The minimega development team is pleased to announce the release of minimega 2.3. This release includes several key new features designed to make experiments more portable and numerous bug fixes. This release contains many changes to the existing API which will improve user experience and programmability.

What’s new

Major changes and milestones

namespaces

The largest change is the addition of namespaces which is described in a separate article. In short, namespaces allows experimenters to build more portable environments that are automatically scheduled across a cluster by minimega.

minirouter

The second largest change is the addition of minirouter. minirouter also has a separate article describing its use and features. In short, minirouter allows for the configuration of router functionalities such as DHCP, DNS, IPv4/IPv6 assignments and, of course, routing, from the minimega command line.

VLAN aliases

In order to better support experiment portability, minimega now supports VLAN aliases. Instead of manually specifying VLAN numbers, users may now supply an alias which minimega will map to a VLAN. This mapping is per-namespace so the same alias can exist in multiple namespaces. For more information, see the VLAN article.

qos API

We have added a new API, qos, that allows users to add quality-of-service constraints on network interfaces. Currently, we support limiting traffic rates, delaying packets, and dropping packets at different rates. See help qos for more information.

vnc API

The vnc API has been majorly rewritten to add new capabilities and ensure compatibility with experiments built using namespaces. See the updated VNC article for details.

miniccc refactoring

We have made improvements to miniccc that include changes to the wire format between miniccc and minimega. As a result, VM images that include previous versions of miniccc will need to be updated.

Python bindings

We have removed the python bindings from this release.

Additional new features

.filter API

There are now four patterns for filters:

minimega$ .filter host=ccc1 vm info minimega$ .filter host!=ccc1 vm info minimega$ .filter host~ccc vm info minimega$ .filter host!~ccc vm info

The latter two being substring matching.

.alias/.unalias APIs

There are two new APIs to create and delete aliases. Aliases allow you to create shorthands for frequently typed commands. For example:

minimega$ .alias vmr=.column name .filter state=running vm info minimega$ vmr

Note that aliases are not broadcast out to mesh peers — you must create the alias everywhere you wish to use it.

vm save API

minimega’s typical usage makes this API unnecessary so we have removed it.

vm info API

Since the addition of containers, many new columns have been added to vm info which can make it hard to read without nesting it in a .columns command. We have added a new flag, vm info summary, that includes a useful subset of the vm info columns.

host API

Added vms and vmsall columns for the number of running VMs on the host in the current namespace and across namespaces, respectively. Added uptime column for uptime of the host.

read API

There is a new flag on the read API to check whether all the commands in the file are syntactically valid.

disk API

Added a new subcommand, disk info, to inspect a disk image.

debug API

Added memory and CPU profiling to the debug API. This is mostly useful for minimega developers trying to understand and improve the underlying performance of minimega.

log syslog API

minimega can now write logs to the syslog daemon running locally or remotely.

cc process API

In 2.2, we added the cc process API to inspect and kill processes started with cc background. We have extended the cc process kill API to add wildcard support to kill all processes. We also added a cc process killall <name> API to kill processes matching <name> rather than providing a PID.

cc filter tag=… API

cc commands can now additionally filter on VM tags. For example:

minimega$ cc filter tag=foo:bar minimega$ .header false .columns Tags cc filter {"foo":"bar"}

If users wish, they may drop the tag= prefix and key=value pairs will be treated as tags:

minimega$ cc filter x=y minimega$ .header false .columns Tags cc filter {"x":"y"}

minicli improvements

minicli now truncates history to 10,000 entries to avoid an out-of-memory crash. There is currently no API to change this limit.

minicli is smarter about sorting integer columns — it now compares them as integers rather than strings so the values will be in numerical order.

minicli now handles escaped quotes embedded within quoted strings:

minimega$ vm config tag foo "foo bar" minimega$ vm config tag {"foo":"foo bar"} minimega$ vm config tag foo "foo \"bar\"" minimega$ vm config tag {"foo":"foo \"bar\""}

It also now supports empty strings as arguments:

minimega$ vm config tag foo "" minimega$ vm config tag {"foo":""}

And a few new escape sequences:

minimega$ vm config tag foo "test\ntest" minimega$ vm config tag {"foo":"test\ntest"} minimega$ vm config tag foo "test\r\ntest" minimega$ vm config tag {"foo":"test\r\ntest"} minimega$ vm config tag foo \# minimega$ vm config tag {"foo":"#"}

nfcat

minimega has been able to record raw netflow from the capture API since the 1.0 release but there was no tool to actually read the raw data and produce an ASCII output. nfcat does just that — it can read one or more raw netflow files and produce an ASCII output.

minifuzzer

We have added a new tool to test minimega via fuzzing. minifuzzer generates minimega commands with random arguments and executes them until minimega exits.

protonuke improvements

The largest protonuke improvement is client and server support for a new protocol: DNS. Support for http/https has been improved in several ways: there is a new flag, -httpgzip, to enable gzip’d responses; -httpimagesize now supports different suffixes including B, KB, and MB; and on a POST request, the server now responds with a 202 Accepted response. Finally, there is a new flag, -tlsversion, which allows you to control what version of TLS you want to use.

New CLI prefixes

Last release, we added the file: prefix to reference files stored in iomeshage. In this release, we add three new prefix. The http:// and https:// prefixes can be used to reference remote resources hosted on an HTTP or HTTPs server. These resources will be fetched and stored in iomeshage. We have also added an env prefix ($) that replaces strings with the value of the corresponding environment variable. If the environment variable is not set, an error is returned.

-context flag

We renamed the -namespace flag to -context to avoid confusion with the concept of namespaces. The functionality is still the same.

miniccc tag upstreaming

VMs can now control their own destiny — by pushing tags up to minimega. Specifically, VMs can now invoke miniccc -tag <key> <value> to push a tag to the command and control server which will then be recorded in the VM’s tags.

Ctrl-C like bash

We now mostly replicate bash’s Ctrl-C behavior in minimega. The only thing that is different is that the reverse history line gets cleared when searching is aborted by Ctrl-C.

Web interface improvements

We have updated the web interface to include some new features and visual changes. The sections of the web interface have been broken into separate pages, so that users can open different and/or multiple views in different browser tabs or windows. The columns displayed in the VMs list have been expanded with additional information, and can be individually toggled for display. The search functionality has been fixed and will now search the full text of all the columns in a table as expcted. There are additional visual indication improvements for VMs without screenshots, high host resource utilization, etc. Note that the auto-refresh behavior of the tables will automatically disable when there are more than 500 VMs, to prevent browser performance degradation.

Web console for containers and VNC changes

To make it easier to interact with containers, we have added a javascript-based console. In the current implementation, only one user can connect to the console at a time.

Additionally, to make it more seamless to interact with containers and VMs through the web interface, we have consolidated access to a single URL with a single parameter — the name of the container or VM.

Bug fixes

bandwidth on taps

A bug was fixed that was causing minimega to report the wrong bandwidth for taps. The reported bandwidth should be much more accurate now.

Deprecation

The following functionality is deprecated in this release and will be removed in a future release:

vyatta API

This API has been superseded by minirouter.

Addressing VMs by ID

In a namespace environment, it is dangerous to reference VMs by ID. IDs are only unique per-host and, therefore, there may be more than one VM with the same ID in a namespace. VM names are unique across a namespace and are now the preferred way of listing VMs to start, kill, etc.

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.6+ compiler, libreadline, and libpcap headers.