open-nomad/website/pages/docs/drivers/qemu.mdx

166 lines
4.9 KiB
Plaintext
Raw Normal View History

2015-09-20 22:31:33 +00:00
---
2020-02-06 23:45:31 +00:00
layout: docs
page_title: 'Drivers: Qemu'
sidebar_title: Qemu
description: The Qemu task driver is used to run virtual machines using Qemu/KVM.
2015-09-20 22:31:33 +00:00
---
# Qemu Driver
Name: `qemu`
The `qemu` driver provides a generic virtual machine runner. Qemu can utilize
2015-09-23 18:58:42 +00:00
the KVM kernel module to utilize hardware virtualization features and provide
great performance. Currently the `qemu` driver can map a set of ports from the
2015-09-23 18:58:42 +00:00
host machine to the guest virtual machine, and provides configuration for
resource allocation.
2015-09-23 18:58:42 +00:00
The `qemu` driver can execute any regular `qemu` image (e.g. `qcow`, `img`,
`iso`), and is currently invoked with `qemu-system-x86_64`.
2015-09-23 18:58:42 +00:00
2016-03-16 16:56:04 +00:00
The driver requires the image to be accessible from the Nomad client via the
2020-02-06 23:45:31 +00:00
[`artifact` downloader](/docs/job-specification/artifact).
2016-03-16 16:56:04 +00:00
2015-09-23 18:58:42 +00:00
## Task Configuration
```hcl
task "webservice" {
driver = "qemu"
config {
image_path = "/path/to/my/linux.img"
accelerator = "kvm"
graceful_shutdown = true
args = ["-nodefaults", "-nodefconfig"]
}
2020-02-06 23:45:31 +00:00
}
```
The `qemu` driver supports the following configuration in the job spec:
2015-09-23 18:58:42 +00:00
2020-02-06 23:45:31 +00:00
- `image_path` - The path to the downloaded image. In most cases this will just
be the name of the image. However, if the supplied artifact is an archive that
2016-03-16 16:56:04 +00:00
contains the image in a subfolder, the path will need to be the relative path
(`subdir/from_archive/my.img`).
2020-02-06 23:45:31 +00:00
- `accelerator` - (Optional) The type of accelerator to use in the invocation.
If the host machine has `qemu` installed with KVM support, users can specify
2016-08-27 12:56:39 +00:00
`kvm` for the `accelerator`. Default is `tcg`.
2020-02-06 23:45:31 +00:00
- `graceful_shutdown` `(bool: false)` - Using the [qemu
2017-10-31 03:19:25 +00:00
monitor](https://en.wikibooks.org/wiki/QEMU/Monitor), send an ACPI shutdown
signal to virtual machines rather than simply terminating them. This emulates
a physical power button press, and gives instances a chance to shut down
2020-02-06 23:45:31 +00:00
cleanly. If the VM is still running after `kill_timeout`, it will be
2017-10-31 03:19:25 +00:00
forcefully terminated. (Note that
[prior to qemu 2.10.1](https://github.com/qemu/qemu/commit/ad9579aaa16d5b385922d49edac2c96c79bcfb6),
the monitor socket path is limited to 108 characters. Graceful shutdown will
be disabled if qemu is < 2.10.1 and the generated monitor path exceeds this
length. You may encounter this issue if you set long
2020-02-06 23:45:31 +00:00
[data_dir](/docs/configuration#data_dir)
2017-10-31 03:19:25 +00:00
or
2020-02-06 23:45:31 +00:00
[alloc_dir](/docs/configuration/client#alloc_dir)
2017-11-03 23:43:16 +00:00
paths.) This feature is currently not supported on Windows.
2020-02-06 23:45:31 +00:00
- `port_map` - (Optional) A key-value map of port labels.
2020-02-06 23:45:31 +00:00
```hcl
config {
# Forward the host port with the label "db" to the guest VM's port 6539.
port_map {
db = 6539
}
2020-02-06 23:45:31 +00:00
}
```
2015-09-23 18:58:42 +00:00
2020-02-06 23:45:31 +00:00
- `args` - (Optional) A list of strings that is passed to qemu as command line
options.
2016-03-16 16:56:04 +00:00
## Examples
A simple config block to run a `qemu` image:
2016-03-16 16:56:04 +00:00
```
task "virtual" {
driver = "qemu"
config {
image_path = "local/linux.img"
2016-03-16 16:56:04 +00:00
accelerator = "kvm"
args = ["-nodefaults", "-nodefconfig"]
2016-03-16 16:56:04 +00:00
}
# Specifying an artifact is required with the "qemu"
# driver. This is the # mechanism to ship the image to be run.
artifact {
source = "https://internal.file.server/linux.img"
2016-03-16 16:56:04 +00:00
options {
checksum = "md5:123445555555555"
}
}
```
## Capabilities
The `qemu` driver implements the following [capabilities](/docs/internals/plugins/task-drivers#capabilities-capabilities-error).
| Feature | Implementation |
| --- | --- |
| `nomad alloc signal` | false |
| `nomad alloc exec` | false |
| filesystem isolation | image |
| network isolation | none |
| volume mounting | none |
2015-09-23 18:58:42 +00:00
## Client Requirements
The `qemu` driver requires Qemu to be installed and in your system's `$PATH`.
2016-08-27 12:56:39 +00:00
The task must also specify at least one artifact to download, as this is the only
2016-03-16 16:56:04 +00:00
way to retrieve the image being run.
2015-09-23 18:58:42 +00:00
## Client Attributes
The `qemu` driver will set the following client attributes:
2015-09-23 18:58:42 +00:00
2020-02-06 23:45:31 +00:00
- `driver.qemu` - Set to `1` if Qemu is found on the host node. Nomad determines
this by executing `qemu-system-x86_64 -version` on the host and parsing the output
- `driver.qemu.version` - Version of `qemu-system-x86_64`, ex: `2.4.0`
2015-09-23 18:58:42 +00:00
Here is an example of using these properties in a job file:
```hcl
job "docs" {
# Only run this job where the qemu version is higher than 1.2.3.
constraint {
attribute = "${driver.qemu.version}"
operator = ">"
value = "1.2.3"
}
}
```
2020-06-24 02:48:52 +00:00
## Plugin Options
```hcl
plugin "qemu" {
config {
image_paths = ["/mnt/image/paths"]
}
}
```
- `image_paths` (`[]string`: `[]`) - Specifies the host paths the Qemu driver is
allowed to load images from.
2015-09-23 18:58:42 +00:00
## Resource Isolation
Nomad uses Qemu to provide full software virtualization for virtual machine
workloads. Nomad can use Qemu KVM's hardware-assisted virtualization to deliver
better performance.
2015-09-20 22:31:33 +00:00
Virtualization provides the highest level of isolation for workloads that
2015-10-25 17:15:14 +00:00
require additional security, and resource use is constrained by the Qemu
hypervisor rather than the host kernel. VM network traffic still flows through
2015-10-11 19:55:23 +00:00
the host's interface(s).