qemu

package
v0.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 31, 2020 License: BSD-3-Clause Imports: 10 Imported by: 0

Documentation

Overview

Package qemu provides a Go API for starting QEMU VMs.

qemu is mainly suitable for running QEMU-based integration tests.

The environment variable `UROOT_QEMU` overrides the path to QEMU and the first few arguments (defaults to "qemu"). For example, I use:

UROOT_QEMU='qemu-system-x86_64 -L . -m 4096 -enable-kvm'

For CI, this environment variable is set in `.circleci/images/integration/Dockerfile`.

Index

Constants

This section is empty.

Variables

View Source
var DefaultTimeout = 7 * time.Second

DefaultTimeout for `Expect` and `ExpectRE` functions.

View Source
var TimeoutMultiplier = 1.0

TimeoutMultiplier increases all timeouts proportionally. Useful when running QEMU on a slow machine.

Functions

This section is empty.

Types

type ArbitraryArgs added in v0.3.0

type ArbitraryArgs []string

ArbitraryArgs is a Device that allows users to add arbitrary arguments to the QEMU command line.

func (ArbitraryArgs) Cmdline added in v0.3.0

func (aa ArbitraryArgs) Cmdline() []string

func (ArbitraryArgs) KArgs added in v0.6.0

func (ArbitraryArgs) KArgs() []string

type Device added in v0.3.0

type Device interface {
	// Cmdline returns arguments to append to the QEMU command line for this device.
	Cmdline() []string
	// KArgs returns arguments that must be passed to the kernel for this device, or nil.
	KArgs() []string
}

Device is a QEMU device to expose to a VM.

type IDEBlockDevice added in v0.7.0

type IDEBlockDevice struct {
	File string
}

IDEBlockDevice emulates an AHCI/IDE block device.

func (IDEBlockDevice) Cmdline added in v0.7.0

func (ibd IDEBlockDevice) Cmdline() []string

func (IDEBlockDevice) KArgs added in v0.7.0

func (IDEBlockDevice) KArgs() []string

type Network added in v0.3.0

type Network struct {
	// contains filtered or unexported fields
}

Network is a Device that can connect multiple QEMU VMs to each other.

Network uses the QEMU socket mechanism to connect multiple VMs with a simple TCP socket.

func NewNetwork added in v0.3.0

func NewNetwork() *Network

NewNetwork creates a new QEMU network between QEMU VMs.

The network is closed from the world and only between the QEMU VMs.

func (*Network) NewVM added in v0.6.0

func (n *Network) NewVM(nopts ...NetworkOpt) Device

NewVM returns a Device that can be used with a new QEMU VM.

type NetworkOpt added in v0.7.0

type NetworkOpt func(netdev string) []string

NetworkOpt returns additional QEMU command-line parameters based on the net device ID.

func WithPCAP added in v0.7.0

func WithPCAP(outputFile string) NetworkOpt

WithPCAP captures network traffic and saves it to outputFile.

type Options added in v0.3.0

type Options struct {
	// QEMUPath is the path to the QEMU binary to invoke.
	//
	// If left unspecified, the UROOT_QEMU env var will be used.
	// If the env var is unspecified, "qemu" is the default.
	QEMUPath string

	// Path to the kernel to boot.
	Kernel string

	// Path to the initramfs.
	Initramfs string

	// Extra kernel command-line arguments.
	KernelArgs string

	// Where to send serial output.
	SerialOutput io.WriteCloser

	// Timeout is the expect timeout.
	Timeout time.Duration

	// Devices are devices to expose to the QEMU VM.
	Devices []Device
}

Options are VM start-up parameters.

func (*Options) Cmdline added in v0.3.0

func (o *Options) Cmdline() ([]string, error)

Cmdline returns the command line arguments used to start QEMU. These arguments are derived from the given QEMU struct.

func (*Options) Start added in v0.3.0

func (o *Options) Start() (*VM, error)

Start starts a QEMU VM.

type P9Directory added in v0.6.0

type P9Directory struct {
	// Dir is the directory to expose as read-write 9p filesystem.
	Dir string

	// Boot: if true, indicates this is the root volume. For this to work,
	// kernel args will need to be added - use KArgs() to get the args. There
	// can only be one boot 9pfs at a time.
	Boot bool

	// Tag is an identifier that is used within the VM when mounting an fs,
	// e.g. 'mount -t 9p my-vol-ident mountpoint'. If not specified, a default
	// tag of 'tmpdir' will be used.
	//
	// Ignored if Boot is true, as the tag in that case is special.
	//
	// For non-boot devices, this is also used as the id linking the `-fsdev`
	// and `-device` args together.
	//
	// Because the tag must be unique for each dir, if multiple non-boot
	// P9Directory's are used, tag may be omitted for no more than one.
	Tag string

	// Arch is the architecture under test. This is used to determine the
	// QEMU command line args.
	Arch string
}

P9Directory is a Device that exposes a directory as a Plan9 (9p) read-write filesystem in the VM.

func (P9Directory) Cmdline added in v0.6.0

func (p P9Directory) Cmdline() []string

func (P9Directory) KArgs added in v0.6.0

func (p P9Directory) KArgs() []string

type ReadOnlyDirectory added in v0.3.0

type ReadOnlyDirectory struct {
	// Dir is the directory to expose as a read-only vfat partition.
	Dir string
}

ReadOnlyDirectory is a Device that exposes a directory as a /dev/sda1 readonly vfat partition in the VM.

func (ReadOnlyDirectory) Cmdline added in v0.3.0

func (rod ReadOnlyDirectory) Cmdline() []string

func (ReadOnlyDirectory) KArgs added in v0.6.0

func (ReadOnlyDirectory) KArgs() []string

type VM added in v0.3.0

type VM struct {
	Options *Options
	// contains filtered or unexported fields
}

VM is a running QEMU virtual machine.

func (*VM) Close added in v0.3.0

func (v *VM) Close()

Close stops QEMU.

func (*VM) Cmdline added in v0.3.0

func (v *VM) Cmdline() []string

Cmdline is the command-line the VM was started with.

func (*VM) CmdlineQuoted added in v0.3.0

func (v *VM) CmdlineQuoted() string

CmdlineQuoted quotes any of QEMU's command line arguments containing a space so it is easy to copy-n-paste into a shell for debugging.

func (*VM) Expect added in v0.3.0

func (v *VM) Expect(search string) error

Expect returns an error if the given string is not found in vEMU's serial output within `DefaultTimeout`.

func (*VM) ExpectBatch added in v0.7.0

func (v *VM) ExpectBatch(batch []expect.Batcher, timeout time.Duration) ([]expect.BatchRes, error)

ExpectBatch matches many regular expressions.

func (*VM) ExpectRE added in v0.3.0

func (v *VM) ExpectRE(pattern *regexp.Regexp) (string, error)

ExpectRE returns an error if the given regular expression is not found in vEMU's serial output within `DefaultTimeout`. The matched string is returned.

func (*VM) ExpectRETimeout added in v0.3.0

func (v *VM) ExpectRETimeout(pattern *regexp.Regexp, timeout time.Duration) (string, error)

ExpectRETimeout returns an error if the given regular expression is not found in vEMU's serial output within the given timeout. The matched string is returned.

func (*VM) ExpectTimeout added in v0.3.0

func (v *VM) ExpectTimeout(search string, timeout time.Duration) error

ExpectTimeout returns an error if the given string is not found in vEMU's serial output within the given timeout.

func (*VM) Send added in v0.3.0

func (v *VM) Send(in string)

Send sends a string to QEMU's serial.

func (*VM) TimeoutOr added in v0.3.0

func (v *VM) TimeoutOr() time.Duration

func (*VM) Wait added in v0.3.0

func (v *VM) Wait() error

Wait waits for the VM to exit.

type VirtioRandom added in v0.3.0

type VirtioRandom struct{}

VirtioRandom is a Device that exposes a PCI random number generator to the QEMU VM.

func (VirtioRandom) Cmdline added in v0.3.0

func (VirtioRandom) Cmdline() []string

func (VirtioRandom) KArgs added in v0.6.0

func (VirtioRandom) KArgs() []string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL