2015-09-20 22:31:33 +00:00
|
|
|
---
|
2020-02-06 23:45:31 +00:00
|
|
|
layout: docs
|
2020-12-03 00:02:03 +00:00
|
|
|
page_title: 'Drivers: QEMU'
|
|
|
|
description: The QEMU task driver is used to run virtual machines using QEMU/KVM.
|
2015-09-20 22:31:33 +00:00
|
|
|
---
|
|
|
|
|
2020-12-03 00:02:03 +00:00
|
|
|
# QEMU Driver
|
2015-09-20 22:31:33 +00:00
|
|
|
|
|
|
|
Name: `qemu`
|
|
|
|
|
2020-12-03 00:02:03 +00:00
|
|
|
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
|
2016-10-03 21:35:20 +00:00
|
|
|
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
|
2015-09-25 02:33:06 +00:00
|
|
|
resource allocation.
|
2015-09-23 18:58:42 +00:00
|
|
|
|
2016-10-03 21:35:20 +00:00
|
|
|
The `qemu` driver can execute any regular `qemu` image (e.g. `qcow`, `img`,
|
2015-09-25 02:33:06 +00:00
|
|
|
`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
|
2023-01-25 17:31:14 +00:00
|
|
|
[`artifact` downloader](/nomad/docs/job-specification/artifact).
|
2016-03-16 16:56:04 +00:00
|
|
|
|
2015-09-23 18:58:42 +00:00
|
|
|
## Task Configuration
|
|
|
|
|
2016-10-03 21:35:20 +00:00
|
|
|
```hcl
|
|
|
|
task "webservice" {
|
|
|
|
driver = "qemu"
|
|
|
|
|
|
|
|
config {
|
2017-10-18 00:54:22 +00:00
|
|
|
image_path = "/path/to/my/linux.img"
|
|
|
|
accelerator = "kvm"
|
|
|
|
graceful_shutdown = true
|
|
|
|
args = ["-nodefaults", "-nodefconfig"]
|
2016-10-03 21:35:20 +00:00
|
|
|
}
|
2020-02-06 23:45:31 +00:00
|
|
|
}
|
2016-10-03 21:35:20 +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
|
2016-10-03 21:35:20 +00:00
|
|
|
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`).
|
2015-11-18 23:16:42 +00:00
|
|
|
|
2022-06-10 14:03:51 +00:00
|
|
|
- `drive_interface` - (Optional) This option defines on which type of interface
|
|
|
|
the drive is connected. Available types are: `ide`, `scsi`, `sd`, `mtd`,
|
|
|
|
`floppy`, `pflash`, `virtio` and `none`. Default is `ide`.
|
|
|
|
|
2020-02-06 23:45:31 +00:00
|
|
|
- `accelerator` - (Optional) The type of accelerator to use in the invocation.
|
2016-10-03 21:35:20 +00:00
|
|
|
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`.
|
2015-11-18 23:16:42 +00:00
|
|
|
|
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
|
2022-08-04 16:10:35 +00:00
|
|
|
forcefully terminated. This feature uses a Unix socket that is placed within
|
|
|
|
the task directory and operating systems may impose a limit on how long these
|
|
|
|
paths can be. This feature is currently not supported on Windows.
|
|
|
|
|
|
|
|
- `guest_agent` `(bool: false)` - Enable support for the [QEMU Guest
|
|
|
|
Agent](https://wiki.qemu.org/Features/GuestAgent) for this virtual machine.
|
|
|
|
This will add the necessary virtual hardware and create a `qa.sock` file in
|
|
|
|
the task's working directory for interacting with the agent. The QEMU Guest
|
|
|
|
Agent must be running in the guest VM. This feature is currently not
|
|
|
|
supported on Windows.
|
2022-06-09 13:21:38 +00:00
|
|
|
|
2020-02-06 23:45:31 +00:00
|
|
|
- `port_map` - (Optional) A key-value map of port labels.
|
2016-10-03 21:35:20 +00:00
|
|
|
|
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
|
2016-10-03 21:35:20 +00:00
|
|
|
}
|
2020-02-06 23:45:31 +00:00
|
|
|
}
|
|
|
|
```
|
2015-09-23 18:58:42 +00:00
|
|
|
|
2021-11-03 20:27:49 +00:00
|
|
|
- `args` - (Optional) A list of strings that is passed to QEMU as command line
|
2016-10-03 21:35:20 +00:00
|
|
|
options.
|
2016-08-16 03:36:13 +00:00
|
|
|
|
2016-03-16 16:56:04 +00:00
|
|
|
## Examples
|
|
|
|
|
2016-10-03 21:35:20 +00:00
|
|
|
A simple config block to run a `qemu` image:
|
2016-03-16 16:56:04 +00:00
|
|
|
|
|
|
|
```
|
|
|
|
task "virtual" {
|
|
|
|
driver = "qemu"
|
|
|
|
|
|
|
|
config {
|
2016-10-03 21:35:20 +00:00
|
|
|
image_path = "local/linux.img"
|
2016-03-16 16:56:04 +00:00
|
|
|
accelerator = "kvm"
|
2016-10-03 21:35:20 +00:00
|
|
|
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 {
|
2016-10-03 21:35:20 +00:00
|
|
|
source = "https://internal.file.server/linux.img"
|
2016-03-16 16:56:04 +00:00
|
|
|
|
|
|
|
options {
|
|
|
|
checksum = "md5:123445555555555"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-07-21 18:54:31 +00:00
|
|
|
## Capabilities
|
|
|
|
|
2023-01-25 17:31:14 +00:00
|
|
|
The `qemu` driver implements the following [capabilities](/nomad/docs/concepts/plugins/task-drivers#capabilities-capabilities-error).
|
2020-07-21 18:54:31 +00:00
|
|
|
|
2020-09-30 13:48:40 +00:00
|
|
|
| Feature | Implementation |
|
|
|
|
| -------------------- | -------------- |
|
|
|
|
| `nomad alloc signal` | false |
|
|
|
|
| `nomad alloc exec` | false |
|
|
|
|
| filesystem isolation | image |
|
|
|
|
| network isolation | none |
|
|
|
|
| volume mounting | none |
|
2020-07-21 18:54:31 +00:00
|
|
|
|
2015-09-23 18:58:42 +00:00
|
|
|
## Client Requirements
|
|
|
|
|
2020-12-03 00:02:03 +00:00
|
|
|
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
|
|
|
|
|
2016-10-03 21:35:20 +00:00
|
|
|
The `qemu` driver will set the following client attributes:
|
2015-09-23 18:58:42 +00:00
|
|
|
|
2020-12-03 00:02:03 +00:00
|
|
|
- `driver.qemu` - Set to `1` if QEMU is found on the host node. Nomad determines
|
2020-02-06 23:45:31 +00:00
|
|
|
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
|
|
|
|
2016-10-03 21:00:32 +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 {
|
2023-07-14 09:23:26 +00:00
|
|
|
image_paths = ["/mnt/image/paths"]
|
2021-11-03 20:27:49 +00:00
|
|
|
args_allowlist = ["-drive", "-usbdevice"]
|
2020-06-24 02:48:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2021-11-03 20:27:49 +00:00
|
|
|
- `image_paths` (`[]string`: `[]`) - Specifies the host paths the QEMU
|
|
|
|
driver is allowed to load images from.
|
|
|
|
- `args_allowlist` (`[]string`: `[]`) - Specifies the command line
|
|
|
|
flags that the [`args`] option is permitted to pass to QEMU. If
|
|
|
|
unset, a job submitter can pass any command line flag into QEMU,
|
|
|
|
including flags that provide the VM with access to host devices such
|
|
|
|
as USB drives. Refer to the [QEMU documentation] for the available
|
|
|
|
flags.
|
2020-06-24 02:48:52 +00:00
|
|
|
|
2015-09-23 18:58:42 +00:00
|
|
|
## Resource Isolation
|
|
|
|
|
2020-12-03 00:02:03 +00:00
|
|
|
Nomad uses QEMU to provide full software virtualization for virtual machine
|
|
|
|
workloads. Nomad can use QEMU KVM's hardware-assisted virtualization to deliver
|
2015-09-25 02:33:06 +00:00
|
|
|
better performance.
|
2015-09-20 22:31:33 +00:00
|
|
|
|
2015-09-25 02:33:06 +00:00
|
|
|
Virtualization provides the highest level of isolation for workloads that
|
2020-12-03 00:02:03 +00:00
|
|
|
require additional security, and resource use is constrained by the QEMU
|
2015-09-25 02:33:06 +00:00
|
|
|
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).
|
2021-11-03 20:27:49 +00:00
|
|
|
|
|
|
|
Note that the strong isolation provided by virtualization only applies
|
|
|
|
to the workload once the VM is started. Operators should use the
|
|
|
|
`args_allowlist` option to prevent job submitters from accessing
|
|
|
|
devices and resources they are not allowed to access.
|
|
|
|
|
2023-01-25 17:31:14 +00:00
|
|
|
[`args`]: /nomad/docs/drivers/qemu#args
|
2021-11-03 20:27:49 +00:00
|
|
|
[QEMU documentation]: https://www.qemu.org/docs/master/system/invocation.html
|