Start splitting the massive document into smaller pieces using the
.. include:: directive.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
docs/formatdomain-devices.rst.in | 5051 +++++++++++++++++++++++++++++
docs/formatdomain.rst | 5052 +-----------------------------
2 files changed, 5052 insertions(+), 5051 deletions(-)
create mode 100644 docs/formatdomain-devices.rst.in
diff --git a/docs/formatdomain-devices.rst.in b/docs/formatdomain-devices.rst.in
new file mode 100644
index 0000000000..935794980c
--- /dev/null
+++ b/docs/formatdomain-devices.rst.in
@@ -0,0 +1,5051 @@
+:anchor:`<a id="elementsDevices"/>`
+
+Devices
+-------
+
+The final set of XML elements are all used to describe devices provided to the
+guest domain. All devices occur as children of the main ``devices`` element.
+:since:`Since 0.1.3`
+
+::
+
+ ...
+ <devices>
+ <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
+ </devices>
+ ...
+
+``emulator``
+ The contents of the ``emulator`` element specify the fully qualified path to
+ the device model emulator binary. The `capabilities XML <formatcaps.html>`__
+ specifies the recommended default emulator to use for each particular domain
+ type / architecture combination.
+
+To help users identifying devices they care about, every device can have direct
+child ``alias`` element which then has ``name`` attribute where users can store
+identifier for the device. The identifier has to have "ua-" prefix and must be
+unique within the domain. Additionally, the identifier must consist only of the
+following characters: ``[a-zA-Z0-9_-]``. :since:`Since 3.9.0`
+
+::
+
+ <devices>
+ <disk type='file'>
+ <alias name='ua-myDisk'/>
+ </disk>
+ <interface type='network' trustGuestRxFilters='yes'>
+ <alias name='ua-myNIC'/>
+ </interface>
+ ...
+ </devices>
+
+:anchor:`<a id="elementsDisks"/>`
+
+Hard drives, floppy disks, CDROMs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Any device that looks like a disk, be it a floppy, harddisk, cdrom, or
+paravirtualized driver is specified via the ``disk`` element.
+
+::
+
+ ...
+ <devices>
+ <disk type='file' snapshot='external'>
+ <driver name="tap" type="aio"
cache="default"/>
+ <source file='/var/lib/xen/images/fv0'
startupPolicy='optional'>
+ <seclabel relabel='no'/>
+ </source>
+ <target dev='hda' bus='ide'/>
+ <iotune>
+ <total_bytes_sec>10000000</total_bytes_sec>
+ <read_iops_sec>400000</read_iops_sec>
+ <write_iops_sec>100000</write_iops_sec>
+ </iotune>
+ <boot order='2'/>
+ <encryption type='...'>
+ ...
+ </encryption>
+ <shareable/>
+ <serial>
+ ...
+ </serial>
+ </disk>
+ ...
+ <disk type='network'>
+ <driver name="qemu" type="raw" io="threads"
ioeventfd="on" event_idx="off"/>
+ <source protocol="sheepdog" name="image_name">
+ <host name="hostname" port="7000"/>
+ </source>
+ <target dev="hdb" bus="ide"/>
+ <boot order='1'/>
+ <transient/>
+ <address type='drive' controller='0' bus='1'
unit='0'/>
+ </disk>
+ <disk type='network'>
+ <driver name="qemu" type="raw"/>
+ <source protocol="rbd" name="image_name2">
+ <host name="hostname" port="7000"/>
+ <snapshot name="snapname"/>
+ <config file="/path/to/file"/>
+ <auth username='myuser'>
+ <secret type='ceph' usage='mypassid'/>
+ </auth>
+ </source>
+ <target dev="hdc" bus="ide"/>
+ </disk>
+ <disk type='block' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <target dev='hdd' bus='ide' tray='open'/>
+ <readonly/>
+ </disk>
+ <disk type='network' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source protocol="http" name="url_path"
query="foo=bar&baz=flurb>
+ <host name="hostname" port="80"/>
+ <cookies>
+ <cookie name="test">somevalue</cookie>
+ </cookies>
+ <readahead size='65536'/>
+ <timeout seconds='6'/>
+ </source>
+ <target dev='hde' bus='ide' tray='open'/>
+ <readonly/>
+ </disk>
+ <disk type='network' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source protocol="https" name="url_path">
+ <host name="hostname" port="443"/>
+ <ssl verify="no"/>
+ </source>
+ <target dev='hdf' bus='ide' tray='open'/>
+ <readonly/>
+ </disk>
+ <disk type='network' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source protocol="ftp" name="url_path">
+ <host name="hostname" port="21"/>
+ </source>
+ <target dev='hdg' bus='ide' tray='open'/>
+ <readonly/>
+ </disk>
+ <disk type='network' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source protocol="ftps" name="url_path">
+ <host name="hostname" port="990"/>
+ </source>
+ <target dev='hdh' bus='ide' tray='open'/>
+ <readonly/>
+ </disk>
+ <disk type='network' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source protocol="tftp" name="url_path">
+ <host name="hostname" port="69"/>
+ </source>
+ <target dev='hdi' bus='ide' tray='open'/>
+ <readonly/>
+ </disk>
+ <disk type='block' device='lun'>
+ <driver name='qemu' type='raw'/>
+ <source dev='/dev/sda'>
+ <slices>
+ <slice type='storage' offset='12345'
size='123'/>
+ </slices>
+ <reservations managed='no'>
+ <source type='unix' path='/path/to/qemu-pr-helper'
mode='client'/>
+ </reservations>
+ </source>
+ <target dev='sda' bus='scsi'/>
+ <address type='drive' controller='0' bus='0'
target='3' unit='0'/>
+ </disk>
+ <disk type='block' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source dev='/dev/sda'/>
+ <geometry cyls='16383' heads='16' secs='63'
trans='lba'/>
+ <blockio logical_block_size='512'
physical_block_size='4096'/>
+ <target dev='hdj' bus='ide'/>
+ </disk>
+ <disk type='volume' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source pool='blk-pool0' volume='blk-pool0-vol0'/>
+ <target dev='hdk' bus='ide'/>
+ </disk>
+ <disk type='network' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source protocol='iscsi'
name='iqn.2013-07.com.example:iscsi-nopool/2'>
+ <host name='example.com' port='3260'/>
+ <auth username='myuser'>
+ <secret type='iscsi' usage='libvirtiscsi'/>
+ </auth>
+ </source>
+ <target dev='vda' bus='virtio'/>
+ </disk>
+ <disk type='network' device='lun'>
+ <driver name='qemu' type='raw'/>
+ <source protocol='iscsi'
name='iqn.2013-07.com.example:iscsi-nopool/1'>
+ <host name='example.com' port='3260'/>
+ <auth username='myuser'>
+ <secret type='iscsi' usage='libvirtiscsi'/>
+ </auth>
+ </source>
+ <target dev='sdb' bus='scsi'/>
+ </disk>
+ <disk type='network' device='lun'>
+ <driver name='qemu' type='raw'/>
+ <source protocol='iscsi'
name='iqn.2013-07.com.example:iscsi-nopool/0'>
+ <host name='example.com' port='3260'/>
+ <initiator>
+ <iqn name='iqn.2013-07.com.example:client'/>
+ </initiator>
+ </source>
+ <target dev='sdb' bus='scsi'/>
+ </disk>
+ <disk type='volume' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source pool='iscsi-pool' volume='unit:0:0:1'
mode='host'/>
+ <target dev='vdb' bus='virtio'/>
+ </disk>
+ <disk type='volume' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source pool='iscsi-pool' volume='unit:0:0:2'
mode='direct'/>
+ <target dev='vdc' bus='virtio'/>
+ </disk>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='qcow2' queues='4'/>
+ <source file='/var/lib/libvirt/images/domain.qcow'/>
+ <backingStore type='file'>
+ <format type='qcow2'/>
+ <source file='/var/lib/libvirt/images/snapshot.qcow'/>
+ <backingStore type='block'>
+ <format type='raw'/>
+ <source dev='/dev/mapper/base'/>
+ <backingStore/>
+ </backingStore>
+ </backingStore>
+ <target dev='vdd' bus='virtio'/>
+ </disk>
+ <disk type='nvme' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source type='pci' managed='yes' namespace='1'>
+ <address domain='0x0000' bus='0x01' slot='0x00'
function='0x0'/>
+ </source>
+ <target dev='vde' bus='virtio'/>
+ </disk>
+ </devices>
+ ...
+
+``disk``
+ The ``disk`` element is the main container for describing disks and supports
+ the following attributes:
+
+ ``type``
+ Valid values are "file", "block", "dir" (
:since:`since 0.7.5` ),
+ "network" ( :since:`since 0.8.7` ), or "volume" ( :since:`since
1.0.5` ),
+ or "nvme" ( :since:`since 6.0.0` ) and refer to the underlying source
for
+ the disk. :since:`Since 0.0.3`
+ ``device``
+ Indicates how the disk is to be exposed to the guest OS. Possible values
+ for this attribute are "floppy", "disk", "cdrom", and
"lun", defaulting to
+ "disk".
+
+ Using "lun" ( :since:`since 0.9.10` ) is only valid when the ``type`` is
+ "block" or "network" for ``protocol='iscsi'`` or when
the ``type`` is
+ "volume" when using an iSCSI source ``pool`` for ``mode``
"host" or as an
+ `NPIV <
http://wiki.libvirt.org/page/NPIV_in_libvirt>`__ virtual Host Bus
+ Adapter (vHBA) using a Fibre Channel storage pool. Configured in this
+ manner, the LUN behaves identically to "disk", except that generic SCSI
+ commands from the guest are accepted and passed through to the physical
+ device. Also note that device='lun' will only be recognized for actual raw
+ devices, but never for individual partitions or LVM partitions (in those
+ cases, the kernel will reject the generic SCSI commands, making it
+ identical to device='disk'). :since:`Since 0.1.4`
+
+ ``model``
+ Indicates the emulated device model of the disk. Typically this is
+ indicated solely by the ``bus`` property but for ``bus`` "virtio" the
+ model can be specified further with "virtio-transitional",
+ "virtio-non-transitional", or "virtio". See `Virtio
transitional
+ devices <#elementsVirtioTransitional>`__ for more details. :since:`Since
+ 5.2.0`
+ ``rawio``
+ Indicates whether the disk needs rawio capability. Valid settings are
+ "yes" or "no" (default is "no"). If any one disk in a
domain has
+ rawio='yes', rawio capability will be enabled for all disks in the domain
+ (because, in the case of QEMU, this capability can only be set on a
+ per-process basis). This attribute is only valid when device is "lun".
NB,
+ ``rawio`` intends to confine the capability per-device, however, current
+ QEMU implementation gives the domain process broader capability than that
+ (per-process basis, affects all the domain disks). To confine the
+ capability as much as possible for QEMU driver as this stage, ``sgio`` is
+ recommended, it's more secure than ``rawio``. :since:`Since 0.9.10`
+ ``sgio``
+ If supported by the hypervisor and OS, indicates whether unprivileged
+ SG_IO commands are filtered for the disk. Valid settings are "filtered"
or
+ "unfiltered" where the default is "filtered". Only available
when the
+ ``device`` is 'lun'. :since:`Since 1.0.2`
+ ``snapshot``
+ Indicates the default behavior of the disk during disk snapshots:
+ "``internal``" requires a file format such as qcow2 that can store both
+ the snapshot and the data changes since the snapshot; "``external``"
will
+ separate the snapshot from the live data; and "``no``" means the disk
will
+ not participate in snapshots. Read-only disks default to "``no``", while
+ the default for other disks depends on the hypervisor's capabilities. Some
+ hypervisors allow a per-snapshot choice as well, during `domain snapshot
+ creation <formatsnapshot.html>`__. Not all snapshot modes are supported;
+ for example, enabling snapshots with a transient disk generally does not
+ make sense. :since:`Since 0.9.5`
+
+``source``
+ Representation of the disk ``source`` depends on the disk ``type`` attribute
+ value as follows:
+
+ ``file``
+ The ``file`` attribute specifies the fully-qualified path to the file
+ holding the disk. :since:`Since 0.0.3`
+ ``block``
+ The ``dev`` attribute specifies the fully-qualified path to the host
+ device to serve as the disk. :since:`Since 0.0.3`
+ ``dir``
+ The ``dir`` attribute specifies the fully-qualified path to the directory
+ to use as the disk. :since:`Since 0.7.5`
+ ``network``
+ The ``protocol`` attribute specifies the protocol to access to the
+ requested image. Possible values are "nbd", "iscsi",
"rbd", "sheepdog",
+ "gluster", "vxhs", "http", "https",
"ftp", ftps", or "tftp".
+
+ For any ``protocol`` other than ``nbd`` an additional attribute ``name``
+ is mandatory to specify which volume/image will be used.
+
+ For "nbd", the ``name`` attribute is optional. TLS transport for NBD can
+ be enabled by setting the ``tls`` attribute to ``yes``. For the QEMU
+ hypervisor, usage of a TLS environment can also be globally controlled on
+ the host by the ``nbd_tls`` and ``nbd_tls_x509_cert_dir`` in
+ /etc/libvirt/qemu.conf. ('tls' :since:`Since 4.5.0` )
+
+ For protocols ``http`` and ``https`` an optional attribute ``query``
+ specifies the query string. ( :since:`Since 6.2.0` )
+
+ For "iscsi" ( :since:`since 1.0.4` ), the ``name`` attribute may include
a
+ logical unit number, separated from the target's name by a slash (e.g.,
+ ``iqn.2013-07.com.example:iscsi-pool/1``). If not specified, the default
+ LUN is zero.
+
+ For "vxhs" ( :since:`since 3.8.0` ), the ``name`` is the UUID of the
+ volume, assigned by the HyperScale server. Additionally, an optional
+ attribute ``tls`` (QEMU only) can be used to control whether a VxHS block
+ device would utilize a hypervisor configured TLS X.509 certificate
+ environment in order to encrypt the data channel. For the QEMU hypervisor,
+ usage of a TLS environment can also be globally controlled on the host by
+ the ``vxhs_tls`` and ``vxhs_tls_x509_cert_dir`` or
+ ``default_tls_x509_cert_dir`` settings in the file /etc/libvirt/qemu.conf.
+ If ``vxhs_tls`` is enabled, then unless the domain ``tls`` attribute is
+ set to "no", libvirt will use the host configured TLS environment. If
the
+ ``tls`` attribute is set to "yes", then regardless of the qemu.conf
+ setting, TLS authentication will be attempted.
+
+ :since:`Since 0.8.7`
+
+ ``volume``
+ The underlying disk source is represented by attributes ``pool`` and
+ ``volume``. Attribute ``pool`` specifies the name of the `storage
+ pool <formatstorage.html>`__ (managed by libvirt) where the disk source
+ resides. Attribute ``volume`` specifies the name of storage volume
+ (managed by libvirt) used as the disk source. The value for the ``volume``
+ attribute will be the output from the "Name" column of a
+ ``virsh vol-list [pool-name]`` command.
+
+ Use the attribute ``mode`` ( :since:`since 1.1.1` ) to indicate how to
+ represent the LUN as the disk source. Valid values are "direct" and
+ "host". If ``mode`` is not specified, the default is to use
"host". Using
+ "direct" as the ``mode`` value indicates to use the `storage
+ pool's <formatstorage.html>`__ ``source`` element ``host`` attribute as
+ the disk source to generate the libiscsi URI (e.g.
+ 'file=iscsi://example.com:3260/iqn.2013-07.com.example:iscsi-pool/1').
+ Using "host" as the ``mode`` value indicates to use the LUN's path as
it
+ shows up on host (e.g.
+
'file=/dev/disk/by-path/ip-example.com:3260-iscsi-iqn.2013-07.com.example:iscsi-pool-lun-1').
+ Using a LUN from an iSCSI source pool provides the same features as a
+ ``disk`` configured using ``type`` 'block' or 'network' and
``device`` of
+ 'lun' with respect to how the LUN is presented to and may be used by the
+ guest. :since:`Since 1.0.5`
+
+ ``nvme``
+ To specify disk source for NVMe disk the ``source`` element has the
+ following attributes:
+
+ ``type``
+ The type of address specified in ``address`` sub-element. Currently,
+ only ``pci`` value is accepted.
+ ``managed``
+ This attribute instructs libvirt to detach NVMe controller
+ automatically on domain startup (``yes``) or expect the controller to
+ be detached by system administrator (``no``).
+ ``namespace``
+ The namespace ID which should be assigned to the domain. According to
+ NVMe standard, namespace numbers start from 1, including.
+
+ The difference between ``<disk type='nvme'>`` and
``<hostdev/>`` is that
+ the latter is plain host device assignment with all its limitations (e.g.
+ no live migration), while the former makes hypervisor to run the NVMe disk
+ through hypervisor's block layer thus enabling all features provided by
+ the layer (e.g. snapshots, domain migration, etc.). Moreover, since the
+ NVMe disk is unbinded from its PCI driver, the host kernel storage stack
+ is not involved (compared to passing say ``/dev/nvme0n1`` via
+ ``<disk type='block'>`` and therefore lower latencies can be
achieved.
+
+ With "file", "block", and "volume", one or more optional
sub-elements
+ ``seclabel``, `described below <#seclabel>`__ (and :since:`since 0.9.9` ),
+ can be used to override the domain security labeling policy for just that
+ source file. (NB, for "volume" type disk, ``seclabel`` is only valid when
the
+ specified storage volume is of 'file' or 'block' type).
+
+ The ``source`` element may also have the ``index`` attribute with same
+ semantics the `index <#elementsDiskBackingStoreIndex>`__ attribute of
+ ``backingStore``
+
+ The ``source`` element may contain the following sub elements:
+
+ ``host``
+ When the disk ``type`` is "network", the ``source`` may have zero or
more
+ ``host`` sub-elements used to specify the hosts to connect. The ``host``
+ element supports 4 attributes, viz. "name", "port",
"transport" and
+ "socket", which specify the hostname, the port number, transport type
and
+ path to socket, respectively. The meaning of this element and the number
+ of the elements depend on the protocol attribute.
+
+ ======== =======================================================
============================================================ ================
+ Protocol Meaning Number of hosts
Default port
+ ======== =======================================================
============================================================ ================
+ nbd a server running nbd-server only one
10809
+ iscsi an iSCSI server only one
3260
+ rbd monitor servers of RBD one or more
librados default
+ sheepdog one of the sheepdog servers (default is localhost:7000) zero or one
7000
+ gluster a server running glusterd daemon one or more (
:since:`Since 2.1.0` ), just one prior to that 24007
+ vxhs a server running Veritas HyperScale daemon only one
9999
+ ======== =======================================================
============================================================ ================
+
+ gluster supports "tcp", "rdma", "unix" as valid
values for the transport
+ attribute. nbd supports "tcp" and "unix". Others only support
"tcp". If
+ nothing is specified, "tcp" is assumed. If the transport is
"unix", the
+ socket attribute specifies the path to an AF_UNIX socket.
+
+ ``snapshot``
+ The ``name`` attribute of ``snapshot`` element can optionally specify an
+ internal snapshot name to be used as the source for storage protocols.
+ Supported for 'rbd' :since:`since 1.2.11 (QEMU only).`
+ ``config``
+ The ``file`` attribute for the ``config`` element provides a fully
+ qualified path to a configuration file to be provided as a parameter to
+ the client of a networked storage protocol. Supported for 'rbd'
+ :since:`since 1.2.11 (QEMU only).`
+ ``auth``
+ :since:`Since libvirt 3.9.0` , the ``auth`` element is supported for a
+ disk ``type`` "network" that is using a ``source`` element with the
+ ``protocol`` attributes "rbd" or "iscsi". If present, the
``auth`` element
+ provides the authentication credentials needed to access the source. It
+ includes a mandatory attribute ``username``, which identifies the username
+ to use during authentication, as well as a sub-element ``secret`` with
+ mandatory attribute ``type``, to tie back to a `libvirt secret
+ object <formatsecret.html>`__ that holds the actual password or other
+ credentials (the domain XML intentionally does not expose the password,
+ only the reference to the object that does manage the password). Known
+ secret types are "ceph" for Ceph RBD network sources and
"iscsi" for CHAP
+ authentication of iSCSI targets. Both will require either a ``uuid``
+ attribute with the UUID of the secret object or a ``usage`` attribute
+ matching the key that was specified in the secret object.
+ ``encryption``
+ :since:`Since libvirt 3.9.0` , the ``encryption`` can be a sub-element of
+ the ``source`` element for encrypted storage sources. If present,
+ specifies how the storage source is encrypted See the `Storage
+ Encryption <formatstorageencryption.html>`__ page for more information.
+ Note that the 'qcow' format of encryption is broken and thus is no longer
+ supported for use with disk images. ( :since:`Since libvirt 4.5.0` )
+ ``reservations``
+ :since:`Since libvirt 4.4.0` , the ``reservations`` can be a sub-element
+ of the ``source`` element for storage sources (QEMU driver only). If
+ present it enables persistent reservations for SCSI based disks. The
+ element has one mandatory attribute ``managed`` with accepted values
+ ``yes`` and ``no``. If ``managed`` is enabled libvirt prepares and manages
+ any resources needed. When the persistent reservations are unmanaged, then
+ the hypervisor acts as a client and the path to the server socket must be
+ provided in the child element ``source``, which currently accepts only the
+ following attributes: ``type`` with one value ``unix``, ``path`` path to
+ the socket, and finally ``mode`` which accepts one value ``client``
+ specifying the role of hypervisor. It's recommended to allow libvirt
+ manage the persistent reservations.
+ ``initiator``
+ :since:`Since libvirt 4.7.0` , the ``initiator`` element is supported for
+ a disk ``type`` "network" that is using a ``source`` element with the
+ ``protocol`` attribute "iscsi". If present, the ``initiator`` element
+ provides the initiator IQN needed to access the source via mandatory
+ attribute ``name``.
+ ``address``
+ For disk of type ``nvme`` this element specifies the PCI address of the
+ host NVMe controller. :since:`Since 6.0.0`
+ ``slices``
+ The ``slices`` element using its ``slice`` sub-elements allows configuring
+ offset and size of either the location of the image format
+ (``slice type='storage'``) inside the storage source or the guest data
+ inside the image format container (future expansion). The ``offset`` and
+ ``size`` values are in bytes. :since:`Since 6.1.0`
+ ``ssl``
+ For ``https`` and ``ftps`` accessed storage it's possible to tweak the SSL
+ transport parameters with this element. The ``verify`` attribute allows to
+ turn on or off SSL certificate validation. Supported values are ``yes``
+ and ``no``. :since:`Since 6.2.0`
+ ``cookies``
+ For ``http`` and ``https`` accessed storage it's possible to pass one or
+ more cookies. The cookie name and value must conform to the HTTP
+ specification. :since:`Since 6.2.0`
+ ``readahead``
+ Specifies the size of the readahead buffer for protocols which support it.
+ (all 'curl' based drivers in qemu). The size is in bytes. Note that
'0' is
+ considered as if the value is not provided. :since:`Since 6.2.0`
+ ``timeout``
+ Specifies the connection timeout for protocols which support it. Note that
+ '0' is considered as if the value is not provided. :since:`Since 6.2.0`
+
+ For a "file" or "volume" disk type which represents a cdrom or
floppy (the
+ ``device`` attribute), it is possible to define policy what to do with the
+ disk if the source file is not accessible. (NB, ``startupPolicy`` is not
+ valid for "volume" disk unless the specified storage volume is of
"file"
+ type). This is done by the ``startupPolicy`` attribute ( :since:`since 0.9.7`
+ ), accepting these values:
+
+ ========= =====================================================================
+ mandatory fail if missing for any reason (the default)
+ requisite fail if missing on boot up, drop if missing on migrate/restore/revert
+ optional drop if missing at any start attempt
+ ========= =====================================================================
+
+ :since:`Since 1.1.2` the ``startupPolicy`` is extended to support hard disks
+ besides cdrom and floppy. On guest cold bootup, if a certain disk is not
+ accessible or its disk chain is broken, with startupPolicy 'optional' the
+ guest will drop this disk. This feature doesn't support migration currently.
+
+``backingStore``
+ This element describes the backing store used by the disk specified by
+ sibling ``source`` element. :since:`Since 1.2.4.` If the hypervisor driver
+ does not support the
+ `backingStoreInput <formatdomaincaps.html#featureBackingStoreInput>`__ (
+ :since:`Since 5.10.0` ) domain feature the ``backingStore`` is ignored on
+ input and only used for output to describe the detected backing chains of
+ running domains. If ``backingStoreInput`` is supported the ``backingStore``
+ is used as the backing image of ``source`` or other ``backingStore``
+ overriding any backing image information recorded in the image metadata. An
+ empty ``backingStore`` element means the sibling source is self-contained and
+ is not based on any backing store. For the detected backing chain information
+ to be accurate, the backing format must be correctly specified in the
+ metadata of each file of the chain (files created by libvirt satisfy this
+ property, but using existing external files for snapshot or block copy
+ operations requires the end user to pre-create the file correctly). The
+ following attributes are supported in ``backingStore``:
+
+ ``type``
+ The ``type`` attribute represents the type of disk used by the backing
+ store, see disk type attribute above for more details and possible values.
+ ``index``
+ This attribute is only valid in output (and ignored on input) and it can
+ be used to refer to a specific part of the disk chain when doing block
+ operations (such as via the ``virDomainBlockRebase`` API). For example,
+ ``vda[2]`` refers to the backing store with ``index='2'`` of the disk with
+ ``vda`` target.
+
+ Moreover, ``backingStore`` supports the following sub-elements:
+
+ ``format``
+ The ``format`` element contains ``type`` attribute which specifies the
+ internal format of the backing store, such as ``raw`` or ``qcow2``.
+ ``source``
+ This element has the same structure as the ``source`` element in ``disk``.
+ It specifies which file, device, or network location contains the data of
+ the described backing store.
+ ``backingStore``
+ If the backing store is not self-contained, the next element in the chain
+ is described by nested ``backingStore`` element.
+
+``mirror``
+ This element is present if the hypervisor has started a long-running block
+ job operation, where the mirror location in the ``source`` sub-element will
+ eventually have the same contents as the source, and with the file format in
+ the sub-element ``format`` (which might differ from the format of the
+ source). The details of the ``source`` sub-element are determined by the
+ ``type`` attribute of the mirror, similar to what is done for the overall
+ ``disk`` device element. The ``job`` attribute mentions which API started the
+ operation ("copy" for the ``virDomainBlockRebase`` API, or
"active-commit"
+ for the ``virDomainBlockCommit`` API), :since:`since 1.2.7` . The attribute
+ ``ready``, if present, tracks progress of the job: ``yes`` if the disk is
+ known to be ready to pivot, or, :since:`since 1.2.7` , ``abort`` or ``pivot``
+ if the job is in the process of completing. If ``ready`` is not present, the
+ disk is probably still copying. For now, this element only valid in output;
+ it is ignored on input. The ``source`` sub-element exists for all two-phase
+ jobs :since:`since 1.2.6` . Older libvirt supported only block copy to a
+ file, :since:`since 0.9.12` ; for compatibility with older clients, such jobs
+ include redundant information in the attributes ``file`` and ``format`` in
+ the ``mirror`` element.
+``target``
+ The ``target`` element controls the bus / device under which the disk is
+ exposed to the guest OS. The ``dev`` attribute indicates the "logical"
device
+ name. The actual device name specified is not guaranteed to map to the device
+ name in the guest OS. Treat it as a device ordering hint. The optional
+ ``bus`` attribute specifies the type of disk device to emulate; possible
+ values are driver specific, with typical values being "ide",
"scsi",
+ "virtio", "xen", "usb", "sata", or
"sd" :since:`"sd" since 1.1.2` . If
+ omitted, the bus type is inferred from the style of the device name (e.g. a
+ device named 'sda' will typically be exported using a SCSI bus). The optional
+ attribute ``tray`` indicates the tray status of the removable disks (i.e.
+ CDROM or Floppy disk), the value can be either "open" or "closed",
defaults
+ to "closed". NB, the value of ``tray`` could be updated while the domain is
+ running. The optional attribute ``removable`` sets the removable flag for USB
+ disks, and its value can be either "on" or "off", defaulting to
"off".
+ :since:`Since 0.0.3; ``bus`` attribute since 0.4.3; ``tray`` attribute since
+ 0.9.11; "usb" attribute value since after 0.4.4; "sata" attribute
value since
+ 0.9.7; "removable" attribute value since 1.1.3`
+``iotune``
+ The optional ``iotune`` element provides the ability to provide additional
+ per-device I/O tuning, with values that can vary for each device (contrast
+ this to the `<blkiotune> <#elementsBlockTuning>`__ element, which applies
+ globally to the domain). Currently, the only tuning available is Block I/O
+ throttling for qemu. This element has optional sub-elements; any sub-element
+ not specified or given with a value of 0 implies no limit. :since:`Since
+ 0.9.8`
+
+ ``total_bytes_sec``
+ The optional ``total_bytes_sec`` element is the total throughput limit in
+ bytes per second. This cannot appear with ``read_bytes_sec`` or
+ ``write_bytes_sec``.
+ ``read_bytes_sec``
+ The optional ``read_bytes_sec`` element is the read throughput limit in
+ bytes per second.
+ ``write_bytes_sec``
+ The optional ``write_bytes_sec`` element is the write throughput limit in
+ bytes per second.
+ ``total_iops_sec``
+ The optional ``total_iops_sec`` element is the total I/O operations per
+ second. This cannot appear with ``read_iops_sec`` or ``write_iops_sec``.
+ ``read_iops_sec``
+ The optional ``read_iops_sec`` element is the read I/O operations per
+ second.
+ ``write_iops_sec``
+ The optional ``write_iops_sec`` element is the write I/O operations per
+ second.
+ ``total_bytes_sec_max``
+ The optional ``total_bytes_sec_max`` element is the maximum total
+ throughput limit in bytes per second. This cannot appear with
+ ``read_bytes_sec_max`` or ``write_bytes_sec_max``.
+ ``read_bytes_sec_max``
+ The optional ``read_bytes_sec_max`` element is the maximum read throughput
+ limit in bytes per second.
+ ``write_bytes_sec_max``
+ The optional ``write_bytes_sec_max`` element is the maximum write
+ throughput limit in bytes per second.
+ ``total_iops_sec_max``
+ The optional ``total_iops_sec_max`` element is the maximum total I/O
+ operations per second. This cannot appear with ``read_iops_sec_max`` or
+ ``write_iops_sec_max``.
+ ``read_iops_sec_max``
+ The optional ``read_iops_sec_max`` element is the maximum read I/O
+ operations per second.
+ ``write_iops_sec_max``
+ The optional ``write_iops_sec_max`` element is the maximum write I/O
+ operations per second.
+ ``size_iops_sec``
+ The optional ``size_iops_sec`` element is the size of I/O operations per
+ second.
+
+ :since:`Throughput limits since 1.2.11 and QEMU 1.7`
+
+ ``group_name``
+ The optional ``group_name`` provides the cability to share I/O throttling
+ quota between multiple drives. This prevents end-users from circumventing
+ a hosting provider's throttling policy by splitting 1 large drive in N
+ small drives and getting N times the normal throttling quota. Any name may
+ be used.
+
+ :since:`group_name since 3.0.0 and QEMU 2.4`
+
+ ``total_bytes_sec_max_length``
+ The optional ``total_bytes_sec_max_length`` element is the maximum
+ duration in seconds for the ``total_bytes_sec_max`` burst period. Only
+ valid when the ``total_bytes_sec_max`` is set.
+ ``read_bytes_sec_max_length``
+ The optional ``read_bytes_sec_max_length`` element is the maximum duration
+ in seconds for the ``read_bytes_sec_max`` burst period. Only valid when
+ the ``read_bytes_sec_max`` is set.
+ ``write_bytes_sec_max``
+ The optional ``write_bytes_sec_max_length`` element is the maximum
+ duration in seconds for the ``write_bytes_sec_max`` burst period. Only
+ valid when the ``write_bytes_sec_max`` is set.
+ ``total_iops_sec_max_length``
+ The optional ``total_iops_sec_max_length`` element is the maximum duration
+ in seconds for the ``total_iops_sec_max`` burst period. Only valid when
+ the ``total_iops_sec_max`` is set.
+ ``read_iops_sec_max_length``
+ The optional ``read_iops_sec_max_length`` element is the maximum duration
+ in seconds for the ``read_iops_sec_max`` burst period. Only valid when the
+ ``read_iops_sec_max`` is set.
+ ``write_iops_sec_max``
+ The optional ``write_iops_sec_max_length`` element is the maximum duration
+ in seconds for the ``write_iops_sec_max`` burst period. Only valid when
+ the ``write_iops_sec_max`` is set.
+
+ :since:`Throughput length since 2.4.0 and QEMU 2.6`
+
+``driver``
+ The optional driver element allows specifying further details related to the
+ hypervisor driver used to provide the disk. :since:`Since 0.1.8`
+
+ - If the hypervisor supports multiple backend drivers, then the ``name``
+ attribute selects the primary backend driver name, while the optional
+ ``type`` attribute provides the sub-type. For example, xen supports a name
+ of "tap", "tap2", "phy", or "file", with a
type of "aio", while qemu only
+ supports a name of "qemu", but multiple types including "raw",
"bochs",
+ "qcow2", and "qed".
+ - The optional ``cache`` attribute controls the cache mechanism, possible
+ values are "default", "none", "writethrough",
"writeback", "directsync"
+ (like "writethrough", but it bypasses the host page cache) and
"unsafe"
+ (host may cache all disk io, and sync requests from guest are ignored).
+ :since:` Since 0.6.0, "directsync" since 0.9.5, "unsafe" since
0.9.7 `
+ - The optional ``error_policy`` attribute controls how the hypervisor will
+ behave on a disk read or write error, possible values are "stop",
+ "report", "ignore", and "enospace". :since:`Since
0.8.0, "report" since
+ 0.9.7` The default is left to the discretion of the hypervisor. There is
+ also an optional ``rerror_policy`` that controls behavior for read errors
+ only. :since:`Since 0.9.7` . If no rerror_policy is given, error_policy is
+ used for both read and write errors. If rerror_policy is given, it
+ overrides the ``error_policy`` for read errors. Also note that
"enospace"
+ is not a valid policy for read errors, so if ``error_policy`` is set to
+ "enospace" and no ``rerror_policy`` is given, the read error policy will
+ be left at its default.
+ - The optional ``io`` attribute controls specific policies on I/O; qemu
+ guests support "threads" and "native" :since:`Since 0.8.8` ,
io_uring
+ :since:`Since 6.3.0 (QEMU 5.0)` .
+ - The optional ``ioeventfd`` attribute allows users to set `domain I/O
+ asynchronous handling <
https://patchwork.kernel.org/patch/43390/>`__ for
+ disk device. The default is left to the discretion of the hypervisor.
+ Accepted values are "on" and "off". Enabling this allows qemu
to execute
+ VM while a separate thread handles I/O. Typically guests experiencing high
+ system CPU utilization during I/O will benefit from this. On the other
+ hand, on overloaded host it could increase guest I/O latency.
+ :since:`Since 0.9.3 (QEMU and KVM only)` **In general you should leave
+ this option alone, unless you are very certain you know what you are
+ doing.**
+ - The optional ``event_idx`` attribute controls some aspects of device event
+ processing. The value can be either 'on' or 'off' - if it is on, it
will
+ reduce the number of interrupts and exits for the guest. The default is
+ determined by QEMU; usually if the feature is supported, default is on. In
+ case there is a situation where this behavior is suboptimal, this
+ attribute provides a way to force the feature off. :since:`Since 0.9.5
+ (QEMU and KVM only)` **In general you should leave this option alone,
+ unless you are very certain you know what you are doing.**
+ - The optional ``copy_on_read`` attribute controls whether to copy read
+ backing file into the image file. The value can be either "on" or
"off".
+ Copy-on-read avoids accessing the same backing file sectors repeatedly and
+ is useful when the backing file is over a slow network. By default
+ copy-on-read is off. :since:`Since 0.9.10 (QEMU and KVM only)`
+ - The optional ``discard`` attribute controls whether discard requests (also
+ known as "trim" or "unmap") are ignored or passed to the
filesystem. The
+ value can be either "unmap" (allow the discard request to be passed) or
+ "ignore" (ignore the discard request). :since:`Since 1.0.6 (QEMU and KVM
+ only)`
+ - The optional ``detect_zeroes`` attribute controls whether to detect zero
+ write requests. The value can be "off", "on" or
"unmap". First two values
+ turn the detection off and on, respectively. The third value ("unmap")
+ turns the detection on and additionally tries to discard such areas from
+ the image based on the value of ``discard`` above (it will act as "on"
if
+ ``discard`` is set to "ignore"). NB enabling the detection is a compute
+ intensive operation, but can save file space and/or time on slow media.
+ :since:`Since 2.0.0`
+ - The optional ``iothread`` attribute assigns the disk to an IOThread as
+ defined by the range for the domain
+ `iothreads <#elementsIOThreadsAllocation>`__ value. Multiple disks may be
+ assigned to the same IOThread and are numbered from 1 to the domain
+ iothreads value. Available for a disk device ``target`` configured to use
+ "virtio" ``bus`` and "pci" or "ccw" ``address``
types. :since:`Since 1.2.8
+ (QEMU 2.1)`
+ - The optional ``queues`` attribute specifies the number of virt queues for
+ virtio-blk. ( :since:`Since 3.9.0` )
+ - For virtio disks, `Virtio-specific options <#elementsVirtio>`__ can also
+ be set. ( :since:`Since 3.5.0` )
+
+``backenddomain``
+ The optional ``backenddomain`` element allows specifying a backend domain
+ (aka driver domain) hosting the disk. Use the ``name`` attribute to specify
+ the backend domain name. :since:`Since 1.2.13 (Xen only)`
+``boot``
+ Specifies that the disk is bootable. The ``order`` attribute determines the
+ order in which devices will be tried during boot sequence. On the S390
+ architecture only the first boot device is used. The optional ``loadparm``
+ attribute is an 8 character string which can be queried by guests on S390 via
+ sclp or diag 308. Linux guests on S390 can use ``loadparm`` to select a boot
+ entry. :since:`Since 3.5.0` The per-device ``boot`` elements cannot be used
+ together with general boot elements in `BIOS bootloader <#elementsOSBIOS>`__
+ section. :since:`Since 0.8.8`
+``encryption``
+ Starting with :since:`libvirt 3.9.0` the ``encryption`` element is preferred
+ to be a sub-element of the ``source`` element. If present, specifies how the
+ volume is encrypted using "qcow". See the `Storage
+ Encryption <formatstorageencryption.html>`__ page for more information.
+``readonly``
+ If present, this indicates the device cannot be modified by the guest. For
+ now, this is the default for disks with attribute ``device='cdrom'``.
+``shareable``
+ If present, this indicates the device is expected to be shared between
+ domains (assuming the hypervisor and OS support this), which means that
+ caching should be deactivated for that device.
+``transient``
+ If present, this indicates that changes to the device contents should be
+ reverted automatically when the guest exits. With some hypervisors, marking a
+ disk transient prevents the domain from participating in migration or
+ snapshots. :since:`Since 0.9.5`
+``serial``
+ If present, this specify serial number of virtual hard drive. For example, it
+ may look like ``<serial>WD-WMAP9A966149</serial>``. Not supported for
+ scsi-block devices, that is those using disk ``type`` 'block' using
+ ``device`` 'lun' on ``bus`` 'scsi'. :since:`Since 0.7.1`
+``wwn``
+ If present, this element specifies the WWN (World Wide Name) of a virtual
+ hard disk or CD-ROM drive. It must be composed of 16 hexadecimal digits.
+ :since:`Since 0.10.1`
+``vendor``
+ If present, this element specifies the vendor of a virtual hard disk or
+ CD-ROM device. It must not be longer than 8 printable characters.
+ :since:`Since 1.0.1`
+``product``
+ If present, this element specifies the product of a virtual hard disk or
+ CD-ROM device. It must not be longer than 16 printable characters.
+ :since:`Since 1.0.1`
+``address``
+ If present, the ``address`` element ties the disk to a given slot of a
+ controller (the actual ``<controller>`` device can often be inferred by
+ libvirt, although it can be `explicitly specified <#elementsControllers>`__).
+ The ``type`` attribute is mandatory, and is typically "pci" or
"drive". For a
+ "pci" controller, additional attributes for ``bus``, ``slot``, and
+ ``function`` must be present, as well as optional ``domain`` and
+ ``multifunction``. Multifunction defaults to 'off'; any other value requires
+ QEMU 0.1.3 and :since:`libvirt 0.9.7` . For a "drive" controller,
additional
+ attributes ``controller``, ``bus``, ``target`` ( :since:`libvirt 0.9.11` ),
+ and ``unit`` are available, each defaulting to 0.
+``auth``
+ Starting with :since:`libvirt 3.9.0` the ``auth`` element is preferred to be
+ a sub-element of the ``source`` element. The element is still read and
+ managed as a ``disk`` sub-element. It is invalid to use ``auth`` as both a
+ sub-element of ``disk`` and ``source``. The ``auth`` element was introduced
+ as a ``disk`` sub-element in :since:`libvirt 0.9.7.`
+``geometry``
+ The optional ``geometry`` element provides the ability to override geometry
+ settings. This mostly useful for S390 DASD-disks or older DOS-disks.
+ :since:`0.10.0`
+
+ ``cyls``
+ The ``cyls`` attribute is the number of cylinders.
+ ``heads``
+ The ``heads`` attribute is the number of heads.
+ ``secs``
+ The ``secs`` attribute is the number of sectors per track.
+ ``trans``
+ The optional ``trans`` attribute is the BIOS-Translation-Modus (none, lba
+ or auto)
+
+``blockio``
+ If present, the ``blockio`` element allows to override any of the block
+ device properties listed below. :since:`Since 0.10.2 (QEMU and KVM)`
+
+ ``logical_block_size``
+ The logical block size the disk will report to the guest OS. For Linux
+ this would be the value returned by the BLKSSZGET ioctl and describes the
+ smallest units for disk I/O.
+ ``physical_block_size``
+ The physical block size the disk will report to the guest OS. For Linux
+ this would be the value returned by the BLKPBSZGET ioctl and describes the
+ disk's hardware sector size which can be relevant for the alignment of
+ disk data.
+
+:anchor:`<a id="elementsFilesystems"/>`
+
+Filesystems
+~~~~~~~~~~~
+
+A directory on the host that can be accessed directly from the guest.
+:since:`since 0.3.3, since 0.8.5 for QEMU/KVM`
+
+::
+
+ ...
+ <devices>
+ <filesystem type='template'>
+ <source name='my-vm-template'/>
+ <target dir='/'/>
+ </filesystem>
+ <filesystem type='mount' accessmode='passthrough'
multidevs='remap'>
+ <driver type='path' wrpolicy='immediate'/>
+ <source dir='/export/to/guest'/>
+ <target dir='/import/from/host'/>
+ <readonly/>
+ </filesystem>
+ <filesystem type='file' accessmode='passthrough'>
+ <driver type='loop' format='raw'/>
+ <driver type='path' wrpolicy='immediate'/>
+ <source file='/export/to/guest.img'/>
+ <target dir='/import/from/host'/>
+ <readonly/>
+ </filesystem>
+ <filesystem type='mount' accessmode='passthrough'>
+ <driver type='virtiofs' queue='1024'/>
+ <binary path='/usr/libexec/virtiofsd' xattr='on'>
+ <cache mode='always'/>
+ <lock posix='on' flock='on'/>
+ </binary>
+ <source dir='/path'/>
+ <target dir='mount_tag'/>
+ </filesystem>
+ ...
+ </devices>
+ ...
+
+``filesystem``
+ The filesystem attribute ``type`` specifies the type of the ``source``. The
+ possible values are:
+
+ ``mount``
+ A host directory to mount in the guest. Used by LXC, OpenVZ :since:`(since
+ 0.6.2)` and QEMU/KVM :since:`(since 0.8.5)` . This is the default ``type``
+ if one is not specified. This mode also has an optional sub-element
+ ``driver``, with an attribute ``type='path'`` or ``type='handle'``
+ :since:`(since 0.9.7)` . The driver block has an optional attribute
+ ``wrpolicy`` that further controls interaction with the host page cache;
+ omitting the attribute gives default behavior, while the value
+ ``immediate`` means that a host writeback is immediately triggered for all
+ pages touched during a guest file write operation :since:`(since 0.9.10)`
+ . :since:`Since 6.2.0` , ``type='virtiofs'`` is also supported. Using
+ virtiofs requires setting up shared memory, see the guide:
+ `Virtio-FS <kbase/virtiofs.html>`__
+ ``template``
+ OpenVZ filesystem template. Only used by OpenVZ driver.
+ ``file``
+ A host file will be treated as an image and mounted in the guest. The
+ filesystem format will be autodetected. Only used by LXC driver.
+ ``block``
+ A host block device to mount in the guest. The filesystem format will be
+ autodetected. Only used by LXC driver :since:`(since 0.9.5)` .
+ ``ram``
+ An in-memory filesystem, using memory from the host OS. The source element
+ has a single attribute ``usage`` which gives the memory usage limit in
+ KiB, unless units are specified by the ``units`` attribute. Only used by
+ LXC driver. :since:` (since 0.9.13)`
+ ``bind``
+ A directory inside the guest will be bound to another directory inside the
+ guest. Only used by LXC driver :since:` (since 0.9.13)`
+
+ The filesystem element has an optional attribute ``accessmode`` which
+ specifies the security mode for accessing the source :since:`(since 0.8.5)` .
+ Currently this only works with ``type='mount'`` for the QEMU/KVM driver. For
+ driver type ``virtiofs``, only ``passthrough`` is supported. For other driver
+ types, the possible values are:
+
+ ``passthrough``
+ The ``source`` is accessed with the permissions of the user inside the
+ guest. This is the default ``accessmode`` if one is not specified. `More
+ info <
http://lists.gnu.org/archive/html/qemu-devel/2010-05/msg02673.html>`__
+ ``mapped``
+ The ``source`` is accessed with the permissions of the hypervisor (QEMU
+ process). `More
+ info <
http://lists.gnu.org/archive/html/qemu-devel/2010-05/msg02673.html>`__
+ ``squash``
+ Similar to 'passthrough', the exception is that failure of privileged
+ operations like 'chown' are ignored. This makes a passthrough-like mode
+ usable for people who run the hypervisor as non-root. `More
+ info <
http://lists.gnu.org/archive/html/qemu-devel/2010-09/msg00121.html>`__
+
+ :since:`Since 5.2.0` , the filesystem element has an optional attribute
+ ``model`` with supported values "virtio-transitional",
+ "virtio-non-transitional", or "virtio". See `Virtio transitional
+ devices <#elementsVirtioTransitional>`__ for more details.
+
+ The filesystem element has an optional attribute ``multidevs`` which
+ specifies how to deal with a filesystem export containing more than one
+ device, in order to avoid file ID collisions on guest when using 9pfs (
+ :since:`since 6.3.0, requires QEMU 4.2` ). This attribute is not available
+ for virtiofs. The possible values are:
+
+ ``default``
+ Use QEMU's default setting (which currently is ``warn``).
+ ``remap``
+ This setting allows guest to access multiple devices per export without
+ encountering misbehaviours. Inode numbers from host are automatically
+ remapped on guest to actively prevent file ID collisions if guest accesses
+ one export containing multiple devices.
+ ``forbid``
+ Only allow to access one device per export by guest. Attempts to access
+ additional devices on the same export will cause the individual filesystem
+ access by guest to fail with an error and being logged (once) as error on
+ host side.
+ ``warn``
+ This setting resembles the behaviour of 9pfs prior to QEMU 4.2, that is no
+ action is performed to prevent any potential file ID collisions if an
+ export contains multiple devices, with the only exception: a warning is
+ logged (once) on host side now. This setting may lead to misbehaviours on
+ guest side if more than one device is exported per export, due to the
+ potential file ID collisions this may cause on guest side in that case.
+
+``driver``
+ The optional driver element allows specifying further details related to the
+ hypervisor driver used to provide the filesystem. :since:`Since 1.0.6`
+
+ - If the hypervisor supports multiple backend drivers, then the ``type``
+ attribute selects the primary backend driver name, while the ``format``
+ attribute provides the format type. For example, LXC supports a type of
+ "loop", with a format of "raw" or "nbd" with any
format. QEMU supports a
+ type of "path" or "handle", but no formats. Virtuozzo driver
supports a
+ type of "ploop" with a format of "ploop".
+ - For virtio-backed devices, `Virtio-specific options <#elementsVirtio>`__
+ can also be set. ( :since:`Since 3.5.0` )
+ - For ``virtiofs``, the ``queue`` attribute can be used to specify the queue
+ size (i.e. how many requests can the queue fit). ( :since:`Since 6.2.0` )
+
+``binary``
+ The optional ``binary`` element can tune the options for virtiofsd. All of
+ the following attributes and elements are optional. The attribute ``path``
+ can be used to override the path to the daemon. Attribute ``xattr`` enables
+ the use of filesystem extended attributes. Caching can be tuned via the
+ ``cache`` element, possible ``mode`` values being ``none`` and ``always``.
+ Locking can be controlled via the ``lock`` element - attributes ``posix`` and
+ ``flock`` both accepting values ``on`` or ``off``. ( :since:`Since 6.2.0` )
+``source``
+ The resource on the host that is being accessed in the guest. The ``name``
+ attribute must be used with ``type='template'``, and the ``dir`` attribute
+ must be used with ``type='mount'``. The ``usage`` attribute is used with
+ ``type='ram'`` to set the memory limit in KiB, unless units are specified by
+ the ``units`` attribute.
+``target``
+ Where the ``source`` can be accessed in the guest. For most drivers this is
+ an automatic mount point, but for QEMU/KVM this is merely an arbitrary string
+ tag that is exported to the guest as a hint for where to mount.
+``readonly``
+ Enables exporting filesystem as a readonly mount for guest, by default
+ read-write access is given (currently only works for QEMU/KVM driver).
+``space_hard_limit``
+ Maximum space available to this guest's filesystem. :since:`Since 0.9.13`
+``space_soft_limit``
+ Maximum space available to this guest's filesystem. The container is
+ permitted to exceed its soft limits for a grace period of time. Afterwards
+ the hard limit is enforced. :since:`Since 0.9.13`
+
+:anchor:`<a id="elementsAddress"/>`
+
+Device Addresses
+~~~~~~~~~~~~~~~~
+
+Many devices have an optional ``<address>`` sub-element to describe where the
+device is placed on the virtual bus presented to the guest. If an address (or
+any optional attribute within an address) is omitted on input, libvirt will
+generate an appropriate address; but an explicit address is required if more
+control over layout is required. See below for device examples including an
+address element.
+
+Every address has a mandatory attribute ``type`` that describes which bus the
+device is on. The choice of which address to use for a given device is
+constrained in part by the device and the architecture of the guest. For
+example, a ``<disk>`` device uses ``type='drive'``, while a
``<console>`` device
+would use ``type='pci'`` on i686 or x86_64 guests, or
``type='spapr-vio'`` on
+PowerPC64 pseries guests. Each address type has further optional attributes that
+control where on the bus the device will be placed:
+
+``pci``
+ PCI addresses have the following additional attributes: ``domain`` (a 2-byte
+ hex integer, not currently used by qemu), ``bus`` (a hex value between 0 and
+ 0xff, inclusive), ``slot`` (a hex value between 0x0 and 0x1f, inclusive), and
+ ``function`` (a value between 0 and 7, inclusive). Also available is the
+ ``multifunction`` attribute, which controls turning on the multifunction bit
+ for a particular slot/function in the PCI control register ( :since:`since
+ 0.9.7, requires QEMU 0.13` ). ``multifunction`` defaults to 'off', but should
+ be set to 'on' for function 0 of a slot that will have multiple functions
+ used. ( :since:`Since 4.10.0` ), PCI address extensions depending on the
+ architecture are supported. For example, PCI addresses for S390 guests will
+ have a ``zpci`` child element, with two attributes: ``uid`` (a hex value
+ between 0x0001 and 0xffff, inclusive), and ``fid`` (a hex value between
+ 0x00000000 and 0xffffffff, inclusive) used by PCI devices on S390 for
+ User-defined Identifiers and Function Identifiers.
+ :since:`Since 1.3.5` , some hypervisor drivers may accept an
+ ``<address type='pci'/>`` element with no other attributes as an
explicit
+ request to assign a PCI address for the device rather than some other type of
+ address that may also be appropriate for that same device (e.g. virtio-mmio).
+ The relationship between the PCI addresses configured in the domain XML and
+ those seen by the guest OS can sometime seem confusing: a separate document
+ describes `how PCI addresses work <pci-addresses.html>`__ in more detail.
+``drive``
+ Drive addresses have the following additional attributes: ``controller`` (a
+ 2-digit controller number), ``bus`` (a 2-digit bus number), ``target`` (a
+ 2-digit target number), and ``unit`` (a 2-digit unit number on the bus).
+``virtio-serial``
+ Each virtio-serial address has the following additional attributes:
+ ``controller`` (a 2-digit controller number), ``bus`` (a 2-digit bus number),
+ and ``slot`` (a 2-digit slot within the bus).
+``ccid``
+ A CCID address, for smart-cards, has the following additional attributes:
+ ``bus`` (a 2-digit bus number), and ``slot`` attribute (a 2-digit slot within
+ the bus). :since:`Since 0.8.8.`
+``usb``
+ USB addresses have the following additional attributes: ``bus`` (a hex value
+ between 0 and 0xfff, inclusive), and ``port`` (a dotted notation of up to
+ four octets, such as 1.2 or 2.1.3.1).
+``spapr-vio``
+ On PowerPC pseries guests, devices can be assigned to the SPAPR-VIO bus. It
+ has a flat 32-bit address space; by convention, devices are generally
+ assigned at a non-zero multiple of 0x00001000, but other addresses are valid
+ and permitted by libvirt. Each address has the following additional
+ attribute: ``reg`` (the hex value address of the starting register).
+ :since:`Since 0.9.9.`
+``ccw``
+ S390 guests with a ``machine`` value of s390-ccw-virtio use the native CCW
+ bus for I/O devices. CCW bus addresses have the following additional
+ attributes: ``cssid`` (a hex value between 0 and 0xfe, inclusive), ``ssid``
+ (a value between 0 and 3, inclusive) and ``devno`` (a hex value between 0 and
+ 0xffff, inclusive). Partially specified bus addresses are not allowed. If
+ omitted, libvirt will assign a free bus address with cssid=0xfe and ssid=0.
+ Virtio-ccw devices must have their cssid set to 0xfe. :since:`Since 1.0.4`
+``virtio-mmio``
+ This places the device on the virtio-mmio transport, which is currently only
+ available for some ``armv7l`` and ``aarch64`` virtual machines. virtio-mmio
+ addresses do not have any additional attributes. :since:`Since 1.1.3`
+ If the guest architecture is ``aarch64`` and the machine type is ``virt``,
+ libvirt will automatically assign PCI addresses to devices; however, the
+ presence of a single device with virtio-mmio address in the guest
+ configuration will cause libvirt to assign virtio-mmio addresses to all
+ further devices. :since:`Since 3.0.0`
+``isa``
+ ISA addresses have the following additional attributes: ``iobase`` and
+ ``irq``. :since:`Since 1.2.1`
+``unassigned``
+ For PCI hostdevs, ``<address type='unassigned'/>`` allows the admin to
+ include a PCI hostdev in the domain XML definition, without making it
+ available for the guest. This allows for configurations in which Libvirt
+ manages the device as a regular PCI hostdev, regardless of whether the guest
+ will have access to it. ``<address type='unassigned'/>`` is an invalid
+ address type for all other device types. :since:`Since 6.0.0`
+
+:anchor:`<a id="elementsVirtio"/>`
+
+Virtio-related options
+~~~~~~~~~~~~~~~~~~~~~~
+
+QEMU's virtio devices have some attributes related to the virtio transport under
+the ``driver`` element: The ``iommu`` attribute enables the use of emulated
+IOMMU by the device. The attribute ``ats`` controls the Address Translation
+Service support for PCIe devices. This is needed to make use of IOTLB support
+(see `IOMMU device <#elementsIommu>`__). Possible values are ``on`` or ``off``.
+:since:`Since 3.5.0`
+
+The attribute ``packed`` controls if QEMU should try to use packed virtqueues.
+Compared to regular split queues, packed queues consist of only a single
+descriptor ring replacing available and used ring, index and descriptor buffer.
+This can result in better cache utilization and performance. If packed
+virtqueues are actually used depends on the feature negotiation between QEMU,
+vhost backends and guest drivers. Possible values are ``on`` or ``off``.
+:since:`Since 6.3.0 (QEMU and KVM only)`
+
+:anchor:`<a id="elementsVirtioTransitional"/>`
+
+Virtio transitional devices
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+:since:`Since 5.2.0` , some of QEMU's virtio devices, when used with PCI/PCIe
+machine types, accept the following ``model`` values:
+
+``virtio-transitional``
+ This device can work both with virtio 0.9 and virtio 1.0 guest drivers, so
+ it's the best choice when compatibility with older guest operating systems is
+ desired. libvirt will plug the device into a conventional PCI slot.
+``virtio-non-transitional``
+ This device can only work with virtio 1.0 guest drivers, and it's the
+ recommended option unless compatibility with older guest operating systems is
+ necessary. libvirt will plug the device into either a PCI Express slot or a
+ conventional PCI slot based on the machine type, resulting in a more
+ optimized PCI topology.
+``virtio``
+ This device will work like a ``virtio-non-transitional`` device when plugged
+ into a PCI Express slot, and like a ``virtio-transitional`` device otherwise;
+ libvirt will pick one or the other based on the machine type. This is the
+ best choice when compatibility with libvirt versions older than 5.2.0 is
+ necessary, but it's otherwise not recommended to use it.
+
+While the information outlined above applies to most virtio devices, there are a
+few exceptions:
+
+- for SCSI controllers, ``virtio-scsi`` must be used instead of ``virtio`` for
+ backwards compatibility reasons;
+- some devices, such as GPUs and input devices (keyboard, tablet and mouse),
+ are only defined in the virtio 1.0 spec and as such don't have a transitional
+ variant: the only accepted model is ``virtio``, which will result in a
+ non-transitional device.
+
+For more details see the `qemu patch
+posting <
https://lists.gnu.org/archive/html/qemu-devel/2018-12/msg00923.html>`__
+and the `virtio-1.0
+spec <
http://docs.oasis-open.org/virtio/virtio/v1.0/virtio-v1.0.html>`__.
+
+:anchor:`<a id="elementsControllers"/>`
+
+Controllers
+~~~~~~~~~~~
+
+Depending on the guest architecture, some device buses can appear more than
+once, with a group of virtual devices tied to a virtual controller. Normally,
+libvirt can automatically infer such controllers without requiring explicit XML
+markup, but sometimes it is necessary to provide an explicit controller element,
+notably when planning the `PCI topology <pci-hotplug.html>`__ for guests where
+device hotplug is expected.
+
+::
+
+ ...
+ <devices>
+ <controller type='ide' index='0'/>
+ <controller type='virtio-serial' index='0' ports='16'
vectors='4'/>
+ <controller type='virtio-serial' index='1'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x0a' function='0x0'/>
+ </controller>
+ <controller type='scsi' index='0'
model='virtio-scsi'>
+ <driver iothread='4'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x0b' function='0x0'/>
+ </controller>
+ <controller type='xenbus' maxGrantFrames='64'
maxEventChannels='2047'/>
+ ...
+ </devices>
+ ...
+
+Each controller has a mandatory attribute ``type``, which must be one of 'ide',
+'fdc', 'scsi', 'sata', 'usb', 'ccid',
'virtio-serial' or 'pci', and a mandatory
+attribute ``index`` which is the decimal integer describing in which order the
+bus controller is encountered (for use in ``controller`` attributes of
+``<address>`` elements). :since:`Since 1.3.5` the index is optional; if not
+specified, it will be auto-assigned to be the lowest unused index for the given
+controller type. Some controller types have additional attributes that control
+specific features, such as:
+
+``virtio-serial``
+ The ``virtio-serial`` controller has two additional optional attributes
+ ``ports`` and ``vectors``, which control how many devices can be connected
+ through the controller. :since:`Since 5.2.0` , it supports an optional
+ attribute ``model`` which can be 'virtio', 'virtio-transitional', or
+ 'virtio-non-transitional'. See `Virtio transitional
+ devices <#elementsVirtioTransitional>`__ for more details.
+``scsi``
+ A ``scsi`` controller has an optional attribute ``model``, which is one of
+ 'auto', 'buslogic', 'ibmvscsi', 'lsilogic',
'lsisas1068', 'lsisas1078',
+ 'virtio-scsi', 'vmpvscsi', 'virtio-transitional',
'virtio-non-transitional'.
+ See `Virtio transitional devices <#elementsVirtioTransitional>`__ for more
+ details.
+``usb``
+ A ``usb`` controller has an optional attribute ``model``, which is one of
+ "piix3-uhci", "piix4-uhci", "ehci",
"ich9-ehci1", "ich9-uhci1", "ich9-uhci2",
+ "ich9-uhci3", "vt82c686b-uhci", "pci-ohci",
"nec-xhci", "qusb1" (xen pvusb
+ with qemu backend, version 1.1), "qusb2" (xen pvusb with qemu backend,
+ version 2.0) or "qemu-xhci". Additionally, :since:`since 0.10.0` , if the
USB
+ bus needs to be explicitly disabled for the guest, ``model='none'`` may be
+ used. :since:`Since 1.0.5` , no default USB controller will be built on s390.
+ :since:`Since 1.3.5` , USB controllers accept a ``ports`` attribute to
+ configure how many devices can be connected to the controller.
+``ide``
+ :since:`Since 3.10.0` for the vbox driver, the ``ide`` controller has an
+ optional attribute ``model``, which is one of "piix3", "piix4" or
"ich6".
+``xenbus``
+ :since:`Since 5.2.0` , the ``xenbus`` controller has an optional attribute
+ ``maxGrantFrames``, which specifies the maximum number of grant frames the
+ controller makes available for connected devices. :since:`Since 6.3.0` , the
+ xenbus controller supports the optional ``maxEventChannels`` attribute, which
+ specifies maximum number of event channels (PV interrupts) that can be used
+ by the guest.
+
+Note: The PowerPC64 "spapr-vio" addresses do not have an associated
controller.
+
+For controllers that are themselves devices on a PCI or USB bus, an optional
+sub-element ``<address>`` can specify the exact relationship of the controller
+to its master bus, with semantics `given above <#elementsAddress>`__.
+
+An optional sub-element ``driver`` can specify the driver specific options:
+
+``queues``
+ The optional ``queues`` attribute specifies the number of queues for the
+ controller. For best performance, it's recommended to specify a value
+ matching the number of vCPUs. :since:`Since 1.0.5 (QEMU and KVM only)`
+``cmd_per_lun``
+ The optional ``cmd_per_lun`` attribute specifies the maximum number of
+ commands that can be queued on devices controlled by the host. :since:`Since
+ 1.2.7 (QEMU and KVM only)`
+``max_sectors``
+ The optional ``max_sectors`` attribute specifies the maximum amount of data
+ in bytes that will be transferred to or from the device in a single command.
+ The transfer length is measured in sectors, where a sector is 512 bytes.
+ :since:`Since 1.2.7 (QEMU and KVM only)`
+``ioeventfd``
+ The optional ``ioeventfd`` attribute specifies whether the controller should
+ use `I/O asynchronous handling <
https://patchwork.kernel.org/patch/43390/>`__
+ or not. Accepted values are "on" and "off". :since:`Since 1.2.18`
+``iothread``
+ Supported for controller type ``scsi`` using model ``virtio-scsi`` for
+ ``address`` types ``pci`` and ``ccw`` :since:`since 1.3.5 (QEMU 2.4)` . The
+ optional ``iothread`` attribute assigns the controller to an IOThread as
+ defined by the range for the domain
+ `iothreads <#elementsIOThreadsAllocation>`__ value. Each SCSI ``disk``
+ assigned to use the specified ``controller`` will utilize the same IOThread.
+ If a specific IOThread is desired for a specific SCSI ``disk``, then multiple
+ controllers must be defined each having a specific ``iothread`` value. The
+ ``iothread`` value must be within the range 1 to the domain iothreads value.
+virtio options
+ For virtio controllers, `Virtio-specific options <#elementsVirtio>`__ can
+ also be set. ( :since:`Since 3.5.0` )
+
+USB companion controllers have an optional sub-element ``<master>`` to specify
+the exact relationship of the companion to its master controller. A companion
+controller is on the same bus as its master, so the companion ``index`` value
+should be equal. Not all controller models can be used as companion controllers
+and libvirt might provide some sensible defaults (settings of
+``master startport`` and ``function`` of an address) for some particular models.
+Preferred companion controllers are ``ich-uhci[123]``.
+
+::
+
+ ...
+ <devices>
+ <controller type='usb' index='0' model='ich9-ehci1'>
+ <address type='pci' domain='0' bus='0' slot='4'
function='7'/>
+ </controller>
+ <controller type='usb' index='0' model='ich9-uhci1'>
+ <master startport='0'/>
+ <address type='pci' domain='0' bus='0' slot='4'
function='0' multifunction='on'/>
+ </controller>
+ ...
+ </devices>
+ ...
+
+PCI controllers have an optional ``model`` attribute; possible values for this
+attribute are
+
+- ``pci-root``, ``pci-bridge`` ( :since:`since 1.0.5` )
+- ``pcie-root``, ``dmi-to-pci-bridge`` ( :since:`since 1.1.2` )
+- ``pcie-root-port``, ``pcie-switch-upstream-port``,
+ ``pcie-switch-downstream-port`` ( :since:`since 1.2.19` )
+- ``pci-expander-bus``, ``pcie-expander-bus`` ( :since:`since 1.3.4` )
+- ``pcie-to-pci-bridge`` ( :since:`since 4.3.0` )
+
+The root controllers (``pci-root`` and ``pcie-root``) have an optional
+``pcihole64`` element specifying how big (in kilobytes, or in the unit specified
+by ``pcihole64``'s ``unit`` attribute) the 64-bit PCI hole should be. Some
+guests (like Windows XP or Windows Server 2003) might crash when QEMU and
+Seabios are recent enough to support 64-bit PCI holes, unless this is disabled
+(set to 0). :since:`Since 1.1.2 (QEMU only)`
+
+PCI controllers also have an optional subelement ``<model>`` with an attribute
+``name``. The name attribute holds the name of the specific device that qemu is
+emulating (e.g. "i82801b11-bridge") rather than simply the class of device
+("pcie-to-pci-bridge", "pci-bridge"), which is set in the controller
element's
+model **attribute**. In almost all cases, you should not manually add a
+``<model>`` subelement to a controller, nor should you modify one that is
+automatically generated by libvirt. :since:`Since 1.2.19 (QEMU only).`
+
+PCI controllers also have an optional subelement ``<target>`` with the
+attributes and subelements listed below. These are configurable items that 1)
+are visible to the guest OS so must be preserved for guest ABI compatibility,
+and 2) are usually left to default values or derived automatically by libvirt.
+In almost all cases, you should not manually add a ``<target>`` subelement to a
+controller, nor should you modify the values in the those that are automatically
+generated by libvirt. :since:`Since 1.2.19 (QEMU only).`
+
+``chassisNr``
+ PCI controllers that have attribute model="pci-bridge", can also have a
+ ``chassisNr`` attribute in the ``<target>`` subelement, which is used to
+ control QEMU's "chassis_nr" option for the pci-bridge device (normally
+ libvirt automatically sets this to the same value as the index attribute of
+ the pci controller). If set, chassisNr must be between 1 and 255.
+``chassis``
+ pcie-root-port and pcie-switch-downstream-port controllers can also have a
+ ``chassis`` attribute in the ``<target>`` subelement, which is used to set
+ the controller's "chassis" configuration value, which is visible to the
+ virtual machine. If set, chassis must be between 0 and 255.
+``port``
+ pcie-root-port and pcie-switch-downstream-port controllers can also have a
+ ``port`` attribute in the ``<target>`` subelement, which is used to set the
+ controller's "port" configuration value, which is visible to the
virtual
+ machine. If set, port must be between 0 and 255.
+``hotplug``
+ pcie-root-port and pcie-switch-downstream-port controllers can also have a
+ ``hotplug`` attribute in the ``<target>`` subelement, which is used to
+ disable hotplug/unplug of devices on a particular controller. The default
+ setting of ``hotplug`` is ``on``; it should be set to ``off`` to disable
+ hotplug/unplug of devices on a particular controller. :since:`Since 6.3.0`
+``busNr``
+ pci-expander-bus and pcie-expander-bus controllers can have an optional
+ ``busNr`` attribute (1-254). This will be the bus number of the new bus; All
+ bus numbers between that specified and 255 will be available only for
+ assignment to PCI/PCIe controllers plugged into the hierarchy starting with
+ this expander bus, and bus numbers less than the specified value will be
+ available to the next lower expander-bus (or the root-bus if there are no
+ lower expander buses). If you do not specify a busNumber, libvirt will find
+ the lowest existing busNumber in all other expander buses (or use 256 if
+ there are no others) and auto-assign the busNr of that found bus - 2, which
+ provides one bus number for the pci-expander-bus and one for the pci-bridge
+ that is automatically attached to it (if you plan on adding more pci-bridges
+ to the hierarchy of the bus, you should manually set busNr to a lower value).
+
+ A similar algorithm is used for automatically determining the busNr attribute
+ for pcie-expander-bus, but since the pcie-expander-bus doesn't have any
+ built-in pci-bridge, the 2nd bus-number is just being reserved for the
+ pcie-root-port that must necessarily be connected to the bus in order to
+ actually plug in an endpoint device. If you intend to plug multiple devices
+ into a pcie-expander-bus, you must connect a pcie-switch-upstream-port to the
+ pcie-root-port that is plugged into the pcie-expander-bus, and multiple
+ pcie-switch-downstream-ports to the pcie-switch-upstream-port, and of course
+ for this to work properly, you will need to decrease the pcie-expander-bus'
+ busNr accordingly so that there are enough unused bus numbers above it to
+ accommodate giving out one bus number for the upstream-port and one for each
+ downstream-port (in addition to the pcie-root-port and the pcie-expander-bus
+ itself).
+
+``node``
+ Some PCI controllers (``pci-expander-bus`` for the pc machine type,
+ ``pcie-expander-bus`` for the q35 machine type and, :since:`since 3.6.0` ,
+ ``pci-root`` for the pseries machine type) can have an optional ``<node>``
+ subelement within the ``<target>`` subelement, which is used to set the NUMA
+ node reported to the guest OS for that bus - the guest OS will then know that
+ all devices on that bus are a part of the specified NUMA node (it is up to
+ the user of the libvirt API to attach host devices to the correct
+ pci-expander-bus when assigning them to the domain).
+``index``
+ pci-root controllers for pSeries guests use this attribute to record the
+ order they will show up in the guest. :since:`Since 3.6.0`
+
+For machine types which provide an implicit PCI bus, the pci-root controller
+with index=0 is auto-added and required to use PCI devices. pci-root has no
+address. PCI bridges are auto-added if there are too many devices to fit on the
+one bus provided by pci-root, or a PCI bus number greater than zero was
+specified. PCI bridges can also be specified manually, but their addresses
+should only refer to PCI buses provided by already specified PCI controllers.
+Leaving gaps in the PCI controller indexes might lead to an invalid
+configuration.
+
+::
+
+ ...
+ <devices>
+ <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='1' model='pci-bridge'>
+ <address type='pci' domain='0' bus='0' slot='5'
function='0' multifunction='off'/>
+ </controller>
+ </devices>
+ ...
+
+For machine types which provide an implicit PCI Express (PCIe) bus (for example,
+the machine types based on the Q35 chipset), the pcie-root controller with
+index=0 is auto-added to the domain's configuration. pcie-root has also no
+address, provides 31 slots (numbered 1-31) that can be used to attach PCIe or
+PCI devices (although libvirt will never auto-assign a PCI device to a PCIe
+slot, it will allow manual specification of such an assignment). Devices
+connected to pcie-root cannot be hotplugged. If traditional PCI devices are
+present in the guest configuration, a ``pcie-to-pci-bridge`` controller will
+automatically be added: this controller, which plugs into a ``pcie-root-port``,
+provides 31 usable PCI slots (1-31) with hotplug support ( :since:`since 4.3.0`
+). If the QEMU binary doesn't support the corresponding device, then a
+``dmi-to-pci-bridge`` controller will be added instead, usually at the defacto
+standard location of slot=0x1e. A dmi-to-pci-bridge controller plugs into a PCIe
+slot (as provided by pcie-root), and itself provides 31 standard PCI slots
+(which also do not support device hotplug). In order to have hot-pluggable PCI
+slots in the guest system, a pci-bridge controller will also be automatically
+created and connected to one of the slots of the auto-created dmi-to-pci-bridge
+controller; all guest PCI devices with addresses that are auto-determined by
+libvirt will be placed on this pci-bridge device. ( :since:`since 1.1.2` ).
+
+Domains with an implicit pcie-root can also add controllers with
+``model='pcie-root-port'``, ``model='pcie-switch-upstream-port'``, and
+``model='pcie-switch-downstream-port'``. pcie-root-port is a simple type of
+bridge device that can connect only to one of the 31 slots on the pcie-root bus
+on its upstream side, and makes a single (PCIe, hotpluggable) port available on
+the downstream side (at slot='0'). pcie-root-port can be used to provide a
+single slot to later hotplug a PCIe device (but is not itself hotpluggable - it
+must be in the configuration when the domain is started). ( :since:`since
+1.2.19` )
+
+pcie-switch-upstream-port is a more flexible (but also more complex) device that
+can only plug into a pcie-root-port or pcie-switch-downstream-port on the
+upstream side (and only before the domain is started - it is not hot-pluggable),
+and provides 32 ports on the downstream side (slot='0' - slot='31') that
accept
+only pcie-switch-downstream-port devices; each pcie-switch-downstream-port
+device can only plug into a pcie-switch-upstream-port on its upstream side
+(again, not hot-pluggable), and on its downstream side provides a single
+hotpluggable pcie port that can accept any standard pci or pcie device (or
+another pcie-switch-upstream-port), i.e. identical in function to a
+pcie-root-port. ( :since:`since 1.2.19` )
+
+::
+
+ ...
+ <devices>
+ <controller type='pci' index='0' model='pcie-root'/>
+ <controller type='pci' index='1'
model='pcie-root-port'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
+ </controller>
+ <controller type='pci' index='2'
model='pcie-to-pci-bridge'>
+ <address type='pci' domain='0x0000' bus='0x01'
slot='0x00' function='0x0'/>
+ </controller>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsLease"/>`
+
+Device leases
+~~~~~~~~~~~~~
+
+When using a lock manager, it may be desirable to record device leases against a
+VM. The lock manager will ensure the VM won't start unless the leases can be
+acquired.
+
+::
+
+ ...
+ <devices>
+ ...
+ <lease>
+ <lockspace>somearea</lockspace>
+ <key>somekey</key>
+ <target path='/some/lease/path' offset='1024'/>
+ </lease>
+ ...
+ </devices>
+ ...
+
+``lockspace``
+ This is an arbitrary string, identifying the lockspace within which the key
+ is held. Lock managers may impose extra restrictions on the format, or length
+ of the lockspace name.
+``key``
+ This is an arbitrary string, uniquely identifying the lease to be acquired.
+ Lock managers may impose extra restrictions on the format, or length of the
+ key.
+``target``
+ This is the fully qualified path of the file associated with the lockspace.
+ The offset specifies where the lease is stored within the file. If the lock
+ manager does not require an offset, just pass 0.
+
+:anchor:`<a id="elementsHostDev"/>`
+
+Host device assignment
+~~~~~~~~~~~~~~~~~~~~~~
+
+:anchor:`<a id="elementsHostDevSubsys"/>`
+
+USB / PCI / SCSI devices
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+USB, PCI and SCSI devices attached to the host can be passed through to the
+guest using the ``hostdev`` element. :since:`since after 0.4.4 for USB, 0.6.0
+for PCI (KVM only) and 1.0.6 for SCSI (KVM only)` :
+
+::
+
+ ...
+ <devices>
+ <hostdev mode='subsystem' type='usb'>
+ <source startupPolicy='optional'>
+ <vendor id='0x1234'/>
+ <product id='0xbeef'/>
+ </source>
+ <boot order='2'/>
+ </hostdev>
+ </devices>
+ ...
+
+or:
+
+::
+
+ ...
+ <devices>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x02'
function='0x0'/>
+ </source>
+ <boot order='1'/>
+ <rom bar='on' file='/etc/fake/boot.bin'/>
+ </hostdev>
+ </devices>
+ ...
+
+or:
+
+::
+
+ ...
+ <devices>
+ <hostdev mode='subsystem' type='scsi' sgio='filtered'
rawio='yes'>
+ <source>
+ <adapter name='scsi_host0'/>
+ <address bus='0' target='0' unit='0'/>
+ </source>
+ <readonly/>
+ <address type='drive' controller='0' bus='0'
target='0' unit='0'/>
+ </hostdev>
+ </devices>
+ ...
+
+or:
+
+::
+
+ ...
+ <devices>
+ <hostdev mode='subsystem' type='scsi'>
+ <source protocol='iscsi'
name='iqn.2014-08.com.example:iscsi-nopool/1'>
+ <host name='example.com' port='3260'/>
+ <auth username='myuser'>
+ <secret type='iscsi' usage='libvirtiscsi'/>
+ </auth>
+ </source>
+ <address type='drive' controller='0' bus='0'
target='0' unit='0'/>
+ </hostdev>
+ </devices>
+ ...
+
+or:
+
+::
+
+ ...
+ <devices>
+ <hostdev mode='subsystem' type='scsi_host'>
+ <source protocol='vhost' wwpn='naa.50014057667280d8'/>
+ </hostdev>
+ </devices>
+ ...
+
+or:
+
+::
+
+ ...
+ <devices>
+ <hostdev mode='subsystem' type='mdev'
model='vfio-pci'>
+ <source>
+ <address uuid='c2177883-f1bb-47f0-914d-32a22e3a8804'/>
+ </source>
+ </hostdev>
+ <hostdev mode='subsystem' type='mdev'
model='vfio-ccw'>
+ <source>
+ <address uuid='9063cba3-ecef-47b6-abcf-3fef4fdcad85'/>
+ </source>
+ <address type='ccw' cssid='0xfe' ssid='0x0'
devno='0x0001'/>
+ </hostdev>
+ </devices>
+ ...
+
+``hostdev``
+ The ``hostdev`` element is the main container for describing host devices.
+ For each device, the ``mode`` is always "subsystem" and the ``type`` is one
+ of the following values with additional attributes noted.
+
+ ``usb``
+ USB devices are detached from the host on guest startup and reattached
+ after the guest exits or the device is hot-unplugged.
+ ``pci``
+ For PCI devices, when ``managed`` is "yes" it is detached from the host
+ before being passed on to the guest and reattached to the host after the
+ guest exits. If ``managed`` is omitted or "no", the user is responsible
to
+ call ``virNodeDeviceDetachFlags`` (or ``virsh nodedev-detach`` before
+ starting the guest or hot-plugging the device and
+ ``virNodeDeviceReAttach`` (or ``virsh nodedev-reattach``) after hot-unplug
+ or stopping the guest.
+ ``scsi``
+ For SCSI devices, user is responsible to make sure the device is not used
+ by host. If supported by the hypervisor and OS, the optional ``sgio`` (
+ :since:`since 1.0.6` ) attribute indicates whether unprivileged SG_IO
+ commands are filtered for the disk. Valid settings are "filtered" or
+ "unfiltered", where the default is "filtered". The optional
``rawio`` (
+ :since:`since 1.2.9` ) attribute indicates whether the lun needs the rawio
+ capability. Valid settings are "yes" or "no". See the rawio
description
+ within the `disk <#elementsDisks>`__ section. If a disk lun in the domain
+ already has the rawio capability, then this setting not required.
+ ``scsi_host``
+ :since:`since 2.5.0` For SCSI devices, user is responsible to make sure
+ the device is not used by host. This ``type`` passes all LUNs presented by
+ a single HBA to the guest. :since:`Since 5.2.0,` the ``model`` attribute
+ can be specified further with "virtio-transitional",
+ "virtio-non-transitional", or "virtio". See `Virtio
transitional
+ devices <#elementsVirtioTransitional>`__ for more details.
+ ``mdev``
+ For mediated devices ( :since:`Since 3.2.0` ) the ``model`` attribute
+ specifies the device API which determines how the host's vfio driver will
+ expose the device to the guest. Currently, ``model='vfio-pci'``,
+ ``model='vfio-ccw'`` ( :since:`Since 4.4.0` ) and
``model='vfio-ap'`` (
+ :since:`Since 4.9.0` ) is supported. `MDEV <drvnodedev.html#MDEV>`__
+ section provides more information about mediated devices as well as how to
+ create mediated devices on the host. :since:`Since 4.6.0 (QEMU 2.12)` an
+ optional ``display`` attribute may be used to enable or disable support
+ for an accelerated remote desktop backed by a mediated device (such as
+ NVIDIA vGPU or Intel GVT-g) as an alternative to emulated `video
+ devices <#elementsVideo>`__. This attribute is limited to
+ ``model='vfio-pci'`` only. Supported values are either ``on`` or ``off``
+ (default is 'off'). It is required to use a `graphical
+ framebuffer <#elementsGraphics>`__ in order to use this attribute,
+ currently only supported with VNC, Spice and egl-headless graphics
+ devices. :since:`Since version 5.10.0` , there is an optional ``ramfb``
+ attribute for devices with ``model='vfio-pci'``. Supported values are
+ either ``on`` or ``off`` (default is 'off'). When enabled, this attribute
+ provides a memory framebuffer device to the guest. This framebuffer will
+ be used as a boot display when a vgpu device is the primary display.
+
+ Note: There are also some implications on the usage of guest's address
+ type depending on the ``model`` attribute, see the ``address`` element
+ below.
+
+ Note: The ``managed`` attribute is only used with ``type='pci'`` and is
+ ignored by all the other device types, thus setting ``managed`` explicitly
+ with other than a PCI device has the same effect as omitting it. Similarly,
+ ``model`` attribute is only supported by mediated devices and ignored by all
+ other device types.
+
+``source``
+ The source element describes the device as seen from the host using the
+ following mechanism to describe:
+
+ ``usb``
+ The USB device can either be addressed by vendor / product id using the
+ ``vendor`` and ``product`` elements or by the device's address on the host
+ using the ``address`` element.
+
+ :since:`Since 1.0.0` , the ``source`` element of USB devices may contain
+ ``startupPolicy`` attribute which can be used to define policy what to do
+ if the specified host USB device is not found. The attribute accepts the
+ following values:
+
+ ========= =====================================================================
+ mandatory fail if missing for any reason (the default)
+ requisite fail if missing on boot up, drop if missing on migrate/restore/revert
+ optional drop if missing at any start attempt
+ ========= =====================================================================
+
+ ``pci``
+ PCI devices can only be described by their ``address``.
+ ``scsi``
+ SCSI devices are described by both the ``adapter`` and ``address``
+ elements. The ``address`` element includes a ``bus`` attribute (a 2-digit
+ bus number), a ``target`` attribute (a 10-digit target number), and a
+ ``unit`` attribute (a 20-digit unit number on the bus). Not all
+ hypervisors support larger ``target`` and ``unit`` values. It is up to
+ each hypervisor to determine the maximum value supported for the adapter.
+
+ :since:`Since 1.2.8` , the ``source`` element of a SCSI device may contain
+ the ``protocol`` attribute. When the attribute is set to "iscsi", the
host
+ device XML follows the network `disk <#elementsDisks>`__ device using the
+ same ``name`` attribute and optionally using the ``auth`` element to
+ provide the authentication credentials to the iSCSI server.
+
+ ``scsi_host``
+ :since:`Since 2.5.0` , multiple LUNs behind a single SCSI HBA are
+ described by a ``protocol`` attribute set to "vhost" and a ``wwpn``
+ attribute that is the vhost_scsi wwpn (16 hexadecimal digits with a prefix
+ of "naa.") established in the host configfs.
+ ``mdev``
+ Mediated devices ( :since:`Since 3.2.0` ) are described by the ``address``
+ element. The ``address`` element contains a single mandatory attribute
+ ``uuid``.
+
+``vendor``, ``product``
+ The ``vendor`` and ``product`` elements each have an ``id`` attribute that
+ specifies the USB vendor and product id. The ids can be given in decimal,
+ hexadecimal (starting with 0x) or octal (starting with 0) form.
+``boot``
+ Specifies that the device is bootable. The ``order`` attribute determines the
+ order in which devices will be tried during boot sequence. The per-device
+ ``boot`` elements cannot be used together with general boot elements in `BIOS
+ bootloader <#elementsOSBIOS>`__ section. :since:`Since 0.8.8` for PCI
+ devices, :since:`Since 1.0.1` for USB devices.
+``rom``
+ The ``rom`` element is used to change how a PCI device's ROM is presented to
+ the guest. The optional ``bar`` attribute can be set to "on" or
"off", and
+ determines whether or not the device's ROM will be visible in the guest's
+ memory map. (In PCI documentation, the "rombar" setting controls the
presence
+ of the Base Address Register for the ROM). If no rom bar is specified, the
+ qemu default will be used (older versions of qemu used a default of "off",
+ while newer qemus have a default of "on"). :since:`Since 0.9.7 (QEMU and
KVM
+ only)` . The optional ``file`` attribute contains an absolute path to a
+ binary file to be presented to the guest as the device's ROM BIOS. This can
+ be useful, for example, to provide a PXE boot ROM for a virtual function of
+ an sr-iov capable ethernet device (which has no boot ROMs for the VFs).
+ :since:`Since 0.9.10 (QEMU and KVM only)` . The optional ``enabled``
+ attribute can be set to ``no`` to disable PCI ROM loading completely for the
+ device; if PCI ROM loading is disabled through this attribute, attempts to
+ tweak the loading process further using the ``bar`` or ``file`` attributes
+ will be rejected. :since:`Since 4.3.0 (QEMU and KVM only)` .
+``address``
+ The ``address`` element for USB devices has a ``bus`` and ``device``
+ attribute to specify the USB bus and device number the device appears at on
+ the host. The values of these attributes can be given in decimal, hexadecimal
+ (starting with 0x) or octal (starting with 0) form. For PCI devices the
+ element carries 4 attributes allowing to designate the device as can be found
+ with the ``lspci`` or with ``virsh nodedev-list``. For SCSI devices a 'drive'
+ address type must be used. For mediated devices, which are software-only
+ devices defining an allocation of resources on the physical parent device,
+ the address type used must conform to the ``model`` attribute of element
+ ``hostdev``, e.g. any address type other than PCI for ``vfio-pci`` device API
+ or any address type other than CCW for ``vfio-ccw`` device API will result in
+ an error. `See above <#elementsAddress>`__ for more details on the address
+ element.
+``driver``
+ PCI devices can have an optional ``driver`` subelement that specifies which
+ backend driver to use for PCI device assignment. Use the ``name`` attribute
+ to select either "vfio" (for the new VFIO device assignment backend, which
is
+ compatible with UEFI SecureBoot) or "kvm" (the legacy device assignment
+ handled directly by the KVM kernel module) :since:`Since 1.0.5 (QEMU and KVM
+ only, requires kernel 3.6 or newer)` . When specified, device assignment will
+ fail if the requested method of device assignment isn't available on the
+ host. When not specified, the default is "vfio" on systems where the VFIO
+ driver is available and loaded, and "kvm" on older systems, or those where
+ the VFIO driver hasn't been loaded :since:`Since 1.1.3` (prior to that the
+ default was always "kvm").
+``readonly``
+ Indicates that the device is readonly, only supported by SCSI host device
+ now. :since:`Since 1.0.6 (QEMU and KVM only)`
+``shareable``
+ If present, this indicates the device is expected to be shared between
+ domains (assuming the hypervisor and OS support this). Only supported by SCSI
+ host device. :since:`Since 1.0.6`
+
+ Note: Although ``shareable`` was introduced :since:`in 1.0.6` , it did not
+ work as as expected until :since:`1.2.2` .
+
+:anchor:`<a id="elementsHostDevCaps"/>`
+
+Block / character devices
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Block / character devices from the host can be passed through to the guest using
+the ``hostdev`` element. This is only possible with container based
+virtualization. Devices are specified by a fully qualified path. :since:`since
+after 1.0.1 for LXC` :
+
+::
+
+ ...
+ <hostdev mode='capabilities' type='storage'>
+ <source>
+ <block>/dev/sdf1</block>
+ </source>
+ </hostdev>
+ ...
+
+::
+
+ ...
+ <hostdev mode='capabilities' type='misc'>
+ <source>
+ <char>/dev/input/event3</char>
+ </source>
+ </hostdev>
+ ...
+
+::
+
+ ...
+ <hostdev mode='capabilities' type='net'>
+ <source>
+ <interface>eth0</interface>
+ </source>
+ </hostdev>
+ ...
+
+``hostdev``
+ The ``hostdev`` element is the main container for describing host devices.
+ For block/character device passthrough ``mode`` is always "capabilities"
and
+ ``type`` is "storage" for a block device, "misc" for a character
device and
+ "net" for a host network interface.
+``source``
+ The source element describes the device as seen from the host. For block
+ devices, the path to the block device in the host OS is provided in the
+ nested "block" element, while for character devices the "char"
element is
+ used. For network interfaces, the name of the interface is provided in the
+ "interface" element.
+
+:anchor:`<a id="elementsRedir"/>`
+
+Redirected devices
+~~~~~~~~~~~~~~~~~~
+
+USB device redirection through a character device is supported :since:`since
+after 0.9.5 (KVM only)` :
+
+::
+
+ ...
+ <devices>
+ <redirdev bus='usb' type='tcp'>
+ <source mode='connect' host='localhost'
service='4000'/>
+ <boot order='1'/>
+ </redirdev>
+ <redirfilter>
+ <usbdev class='0x08' vendor='0x1234' product='0xbeef'
version='2.56' allow='yes'/>
+ <usbdev allow='no'/>
+ </redirfilter>
+ </devices>
+ ...
+
+``redirdev``
+ The ``redirdev`` element is the main container for describing redirected
+ devices. ``bus`` must be "usb" for a USB device. An additional attribute
+ ``type`` is required, matching one of the supported `serial
+ device <#elementsConsole>`__ types, to describe the host side of the tunnel;
+ ``type='tcp'`` or ``type='spicevmc'`` (which uses the usbredir channel
of a
+ `SPICE graphics device <#elementsGraphics>`__) are typical. The redirdev
+ element has an optional sub-element ``<address>`` which can tie the device to
+ a particular controller. Further sub-elements, such as ``<source>``, may be
+ required according to the given type, although a ``<target>`` sub-element is
+ not required (since the consumer of the character device is the hypervisor
+ itself, rather than a device visible in the guest).
+``boot``
+ Specifies that the device is bootable. The ``order`` attribute determines the
+ order in which devices will be tried during boot sequence. The per-device
+ ``boot`` elements cannot be used together with general boot elements in `BIOS
+ bootloader <#elementsOSBIOS>`__ section. ( :since:`Since 1.0.1` )
+``redirfilter``
+ The\ ``redirfilter``\ element is used for creating the filter rule to filter
+ out certain devices from redirection. It uses sub-element ``<usbdev>`` to
+ define each filter rule. ``class`` attribute is the USB Class code, for
+ example, 0x08 represents mass storage devices. The USB device can be
+ addressed by vendor / product id using the ``vendor`` and ``product``
+ attributes. ``version`` is the device revision from the bcdDevice field (not
+ the version of the USB protocol). These four attributes are optional and
+ ``-1`` can be used to allow any value for them. ``allow`` attribute is
+ mandatory, 'yes' means allow, 'no' for deny.
+
+:anchor:`<a id="elementsSmartcard"/>`
+
+Smartcard devices
+~~~~~~~~~~~~~~~~~
+
+A virtual smartcard device can be supplied to the guest via the ``smartcard``
+element. A USB smartcard reader device on the host cannot be used on a guest
+with simple device passthrough, since it will then not be available on the host,
+possibly locking the host computer when it is "removed". Therefore, some
+hypervisors provide a specialized virtual device that can present a smartcard
+interface to the guest, with several modes for describing how credentials are
+obtained from the host or even a from a channel created to a third-party
+smartcard provider. :since:`Since 0.8.8`
+
+::
+
+ ...
+ <devices>
+ <smartcard mode='host'/>
+ <smartcard mode='host-certificates'>
+ <certificate>cert1</certificate>
+ <certificate>cert2</certificate>
+ <certificate>cert3</certificate>
+ <database>/etc/pki/nssdb/</database>
+ </smartcard>
+ <smartcard mode='passthrough' type='tcp'>
+ <source mode='bind' host='127.0.0.1'
service='2001'/>
+ <protocol type='raw'/>
+ <address type='ccid' controller='0' slot='0'/>
+ </smartcard>
+ <smartcard mode='passthrough' type='spicevmc'/>
+ </devices>
+ ...
+
+The ``<smartcard>`` element has a mandatory attribute ``mode``. The following
+modes are supported; in each mode, the guest sees a device on its USB bus that
+behaves like a physical USB CCID (Chip/Smart Card Interface Device) card.
+
+``host``
+ The simplest operation, where the hypervisor relays all requests from the
+ guest into direct access to the host's smartcard via NSS. No other attributes
+ or sub-elements are required. See below about the use of an optional
+ ``<address>`` sub-element.
+``host-certificates``
+ Rather than requiring a smartcard to be plugged into the host, it is possible
+ to provide three NSS certificate names residing in a database on the host.
+ These certificates can be generated via the command
+ ``certutil -d /etc/pki/nssdb -x -t CT,CT,CT -S -s CN=cert1 -n cert1``,
+ and the resulting three certificate names must be supplied as the content of
+ each of three ``<certificate>`` sub-elements. An additional sub-element
+ ``<database>`` can specify the absolute path to an alternate directory
+ (matching the ``-d`` option of the ``certutil`` command when creating the
+ certificates); if not present, it defaults to /etc/pki/nssdb.
+``passthrough``
+ Rather than having the hypervisor directly communicate with the host, it is
+ possible to tunnel all requests through a secondary character device to a
+ third-party provider (which may in turn be talking to a smartcard or using
+ three certificate files). In this mode of operation, an additional attribute
+ ``type`` is required, matching one of the supported `serial
+ device <#elementsConsole>`__ types, to describe the host side of the tunnel;
+ ``type='tcp'`` or ``type='spicevmc'`` (which uses the smartcard
channel of a
+ `SPICE graphics device <#elementsGraphics>`__) are typical. Further
+ sub-elements, such as ``<source>``, may be required according to the given
+ type, although a ``<target>`` sub-element is not required (since the consumer
+ of the character device is the hypervisor itself, rather than a device
+ visible in the guest).
+
+Each mode supports an optional sub-element ``<address>``, which fine-tunes the
+correlation between the smartcard and a ccid bus controller, `documented
+above <#elementsAddress>`__. For now, qemu only supports at most one smartcard,
+with an address of bus=0 slot=0.
+
+:anchor:`<a id="elementsNICS"/>`
+
+Network interfaces
+~~~~~~~~~~~~~~~~~~
+
+::
+
+ ...
+ <devices>
+ <interface type='direct' trustGuestRxFilters='yes'>
+ <source dev='eth0'/>
+ <mac address='52:54:00:5d:c7:9e'/>
+ <boot order='1'/>
+ <rom bar='off'/>
+ </interface>
+ </devices>
+ ...
+
+There are several possibilities for specifying a network interface visible to
+the guest. Each subsection below provides more details about common setup
+options.
+
+:since:`Since 1.2.10` ), the ``interface`` element property
+``trustGuestRxFilters`` provides the capability for the host to detect and trust
+reports from the guest regarding changes to the interface mac address and
+receive filters by setting the attribute to ``yes``. The default setting for the
+attribute is ``no`` for security reasons and support depends on the guest
+network device model as well as the type of connection on the host - currently
+it is only supported for the virtio device model and for macvtap connections on
+the host.
+
+Each ``<interface>`` element has an optional ``<address>`` sub-element that
can
+tie the interface to a particular pci slot, with attribute ``type='pci'`` as
+`documented above <#elementsAddress>`__.
+
+:since:`Since 6.6.0` , one can force libvirt to keep the provided MAC address
+when it's in the reserved VMware range by adding a ``type="static"``
attribute
+to the ``<mac/>`` element. Note that this attribute is useless if the provided
+MAC address is outside of the reserved VMWare ranges.
+
+:anchor:`<a id="elementsNICSVirtual"/>`
+
+Virtual network
+^^^^^^^^^^^^^^^
+
+**This is the recommended config for general guest connectivity on hosts with
+dynamic / wireless networking configs (or multi-host environments where the host
+hardware details are described separately in a ``<network>`` definition
+:since:`Since 0.9.4` ).**
+
+Provides a connection whose details are described by the named network
+definition. Depending on the virtual network's "forward mode"
configuration, the
+network may be totally isolated (no ``<forward>`` element given), NAT'ing to
an
+explicit network device or to the default route (``<forward
mode='nat'>``),
+routed with no NAT (``<forward mode='route'/>``), or connected directly to
one
+of the host's network interfaces (via macvtap) or bridge devices
+((``<forward mode='bridge|private|vepa|passthrough'/>``
:since:`Since
+0.9.4` )
+
+For networks with a forward mode of bridge, private, vepa, and passthrough, it
+is assumed that the host has any necessary DNS and DHCP services already setup
+outside the scope of libvirt. In the case of isolated, nat, and routed networks,
+DHCP and DNS are provided on the virtual network by libvirt, and the IP range
+can be determined by examining the virtual network config with
+'``virsh net-dumpxml [networkname]``'. There is one virtual network called
+'default' setup out of the box which does NAT'ing to the default route and
has
+an IP range of ``192.168.122.0/255.255.255.0``. Each guest will have an
+associated tun device created with a name of vnetN, which can also be overridden
+with the <target> element (see `overriding the target
+element <#elementsNICSTargetOverride>`__).
+
+When the source of an interface is a network, a ``portgroup`` can be specified
+along with the name of the network; one network may have multiple portgroups
+defined, with each portgroup containing slightly different configuration
+information for different classes of network connections. :since:`Since 0.9.4` .
+
+When a guest is running an interface of type ``network`` may include a
+``portid`` attribute. This provides the UUID of an associated virNetworkPortPtr
+object that records the association between the domain interface and the
+network. This attribute is read-only since port objects are create and deleted
+automatically during startup and shutdown. :since:`Since 5.1.0`
+
+Also, similar to ``direct`` network connections (described below), a connection
+of type ``network`` may specify a ``virtualport`` element, with configuration
+data to be forwarded to a vepa (802.1Qbg) or 802.1Qbh compliant switch (
+:since:`Since 0.8.2` ), or to an Open vSwitch virtual switch ( :since:`Since
+0.9.11` ).
+
+Since the actual type of switch may vary depending on the configuration in the
+``<network>`` on the host, it is acceptable to omit the virtualport ``type``
+attribute, and specify attributes from multiple different virtualport types (and
+also to leave out certain attributes); at domain startup time, a complete
+``<virtualport>`` element will be constructed by merging together the type and
+attributes defined in the network and the portgroup referenced by the interface.
+The newly-constructed virtualport is a combination of them. The attributes from
+lower virtualport can't make change on the ones defined in higher virtualport.
+Interface takes the highest priority, portgroup is lowest priority. (
+:since:`Since 0.10.0` ). For example, in order to work properly with both an
+802.1Qbh switch and an Open vSwitch switch, you may choose to specify no type,
+but both a ``profileid`` (in case the switch is 802.1Qbh) and an ``interfaceid``
+(in case the switch is Open vSwitch) (you may also omit the other attributes,
+such as managerid, typeid, or profileid, to be filled in from the network's
+``<virtualport>``). If you want to limit a guest to connecting only to certain
+types of switches, you can specify the virtualport type, but still omit some/all
+of the parameters - in this case if the host's network has a different type of
+virtualport, connection of the interface will fail.
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ </interface>
+ ...
+ <interface type='network'>
+ <source network='default' portgroup='engineering'/>
+ <target dev='vnet7'/>
+ <mac address="00:11:22:33:44:55"/>
+ <virtualport>
+ <parameters instanceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
+ </virtualport>
+ </interface>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNICSBridge"/>`
+
+Bridge to LAN
+^^^^^^^^^^^^^
+
+**This is the recommended config for general guest connectivity on hosts with
+static wired networking configs.**
+
+Provides a bridge from the VM directly to the LAN. This assumes there is a
+bridge device on the host which has one or more of the hosts physical NICs
+attached. The guest VM will have an associated tun device created with a name of
+vnetN, which can also be overridden with the <target> element (see `overriding
+the target element <#elementsNICSTargetOverride>`__). The tun device will be
+attached to the bridge. The IP range / network configuration is whatever is used
+on the LAN. This provides the guest VM full incoming & outgoing net access just
+like a physical machine.
+
+On Linux systems, the bridge device is normally a standard Linux host bridge. On
+hosts that support Open vSwitch, it is also possible to connect to an Open
+vSwitch bridge device by adding a ``<virtualport type='openvswitch'/>`` to
the
+interface definition. ( :since:`Since 0.9.11` ). The Open vSwitch type
+virtualport accepts two parameters in its ``<parameters>`` element - an
+``interfaceid`` which is a standard uuid used to uniquely identify this
+particular interface to Open vSwitch (if you do not specify one, a random
+interfaceid will be generated for you when you first define the interface), and
+an optional ``profileid`` which is sent to Open vSwitch as the interfaces
+"port-profile".
+
+::
+
+ ...
+ <devices>
+ ...
+ <interface type='bridge'>
+ <source bridge='br0'/>
+ </interface>
+ <interface type='bridge'>
+ <source bridge='br1'/>
+ <target dev='vnet7'/>
+ <mac address="00:11:22:33:44:55"/>
+ </interface>
+ <interface type='bridge'>
+ <source bridge='ovsbr'/>
+ <virtualport type='openvswitch'>
+ <parameters profileid='menial'
interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
+ </virtualport>
+ </interface>
+ ...
+ </devices>
+ ...
+
+On hosts that support Open vSwitch on the kernel side and have the Midonet Host
+Agent configured, it is also possible to connect to the 'midonet' bridge device
+by adding a ``<virtualport type='midonet'/>`` to the interface definition.
(
+:since:`Since 1.2.13` ). The Midonet virtualport type requires an
+``interfaceid`` attribute in its ``<parameters>`` element. This interface id is
+the UUID that specifies which port in the virtual network topology will be bound
+to the interface.
+
+::
+
+ ...
+ <devices>
+ ...
+ <interface type='bridge'>
+ <source bridge='br0'/>
+ </interface>
+ <interface type='bridge'>
+ <source bridge='br1'/>
+ <target dev='vnet7'/>
+ <mac address="00:11:22:33:44:55"/>
+ </interface>
+ <interface type='bridge'>
+ <source bridge='midonet'/>
+ <virtualport type='midonet'>
+ <parameters interfaceid='0b2d64da-3d0e-431e-afdd-804415d6ebbb'/>
+ </virtualport>
+ </interface>
+ ...
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNICSSlirp"/>`
+
+Userspace SLIRP stack
+^^^^^^^^^^^^^^^^^^^^^
+
+Provides a virtual LAN with NAT to the outside world. The virtual network has
+DHCP & DNS services and will give the guest VM addresses starting from
+``10.0.2.15``. The default router will be ``10.0.2.2`` and the DNS server will
+be ``10.0.2.3``. This networking is the only option for unprivileged users who
+need their VMs to have outgoing access. :since:`Since 3.8.0` it is possible to
+override the default network address by including an ``ip`` element specifying
+an IPv4 address in its one mandatory attribute, ``address``. Optionally, a
+second ``ip`` element with a ``family`` attribute set to "ipv6" can be
specified
+to add an IPv6 address to the interface. ``address``. Optionally, address
+``prefix`` can be specified.
+
+::
+
+ ...
+ <devices>
+ <interface type='user'/>
+ ...
+ <interface type='user'>
+ <mac address="00:11:22:33:44:55"/>
+ <ip family='ipv4' address='172.17.2.0'
prefix='24'/>
+ <ip family='ipv6' address='2001:db8:ac10:fd01::'
prefix='64'/>
+ </interface>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNICSEthernet"/>`
+
+Generic ethernet connection
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Provides a means to use a new or existing tap device (or veth device pair,
+depening on the needs of the hypervisor driver) that is partially or wholly
+setup external to libvirt (either prior to the guest starting, or while the
+guest is being started via an optional script specified in the config).
+
+The name of the tap device can optionally be specified with the ``dev``
+attribute of the ``<target>`` element. If no target dev is specified, libvirt
+will create a new standard tap device with a name of the pattern "vnetN",
where
+"N" is replaced with a number. If a target dev is specified and that device
+doesn't exist, then a new standard tap device will be created with the exact dev
+name given. If the specified target dev does exist, then that existing device
+will be used. Usually some basic setup of the device is done by libvirt,
+including setting a MAC address, and the IFF_UP flag, but if the ``dev`` is a
+pre-existing device, and the ``managed`` attribute of the ``target`` element is
+also set to "no" (the default value is "yes"), even this basic setup
will not be
+performed - libvirt will simply pass the device on to the hypervisor with no
+setup at all. :since:`Since 5.7.0` Using managed='no' with a pre-created tap
+device is useful because it permits a virtual machine managed by an unprivileged
+libvirtd to have emulated network devices based on tap devices.
+
+After creating/opening the tap device, an optional shell script (given in the
+``path`` attribute of the ``<script>`` element) will be run. :since:`Since
+0.2.1` Also, after detaching/closing the tap device, an optional shell script
+(given in the ``path`` attribute of the ``<downscript>`` element) will be run.
+:since:`Since 5.1.0` These can be used to do whatever extra host network
+integration is required.
+
+::
+
+ ...
+ <devices>
+ <interface type='ethernet'>
+ <script path='/etc/qemu-ifup-mynet'/>
+ <downscript path='/etc/qemu-ifdown-mynet'/>
+ </interface>
+ ...
+ <interface type='ethernet'>
+ <target dev='mytap1' managed='no'/>
+ <model type='virtio'/>
+ </interface>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNICSDirect"/>`
+
+Direct attachment to physical interface
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+| Provides direct attachment of the virtual machine's NIC to the given physical
+ interface of the host. :since:`Since 0.7.7 (QEMU and KVM only)`
+| This setup requires the Linux macvtap driver to be available. :since:`(Since
+ Linux 2.6.34.)` One of the modes 'vepa' ( `'Virtual Ethernet Port
+ Aggregator'
<
http://www.ieee802.org/1/files/public/docs2009/new-evb-congdon-vepa-modul...),
+ 'bridge' or 'private' can be chosen for the operation mode of the
macvtap
+ device, 'vepa' being the default mode. The individual modes cause the delivery
+ of packets to behave as follows:
+
+If the model type is set to ``virtio`` and interface's ``trustGuestRxFilters``
+attribute is set to ``yes``, changes made to the interface mac address,
+unicast/multicast receive filters, and vlan settings in the guest will be
+monitored and propagated to the associated macvtap device on the host (
+:since:`Since 1.2.10` ). If ``trustGuestRxFilters`` is not set, or is not
+supported for the device model in use, an attempted change to the mac address
+originating from the guest side will result in a non-working network connection.
+
+``vepa``
+ All VMs' packets are sent to the external bridge. Packets whose destination
+ is a VM on the same host as where the packet originates from are sent back to
+ the host by the VEPA capable bridge (today's bridges are typically not VEPA
+ capable).
+``bridge``
+ Packets whose destination is on the same host as where they originate from
+ are directly delivered to the target macvtap device. Both origin and
+ destination devices need to be in bridge mode for direct delivery. If either
+ one of them is in ``vepa`` mode, a VEPA capable bridge is required.
+``private``
+ All packets are sent to the external bridge and will only be delivered to a
+ target VM on the same host if they are sent through an external router or
+ gateway and that device sends them back to the host. This procedure is
+ followed if either the source or destination device is in ``private`` mode.
+``passthrough``
+ This feature attaches a virtual function of a SRIOV capable NIC directly to a
+ VM without losing the migration capability. All packets are sent to the VF/IF
+ of the configured network device. Depending on the capabilities of the device
+ additional prerequisites or limitations may apply; for example, on Linux this
+ requires kernel 2.6.38 or newer. :since:`Since 0.9.2`
+
+::
+
+ ...
+ <devices>
+ ...
+ <interface type='direct' trustGuestRxFilters='no'>
+ <source dev='eth0' mode='vepa'/>
+ </interface>
+ </devices>
+ ...
+
+The network access of direct attached virtual machines can be managed by the
+hardware switch to which the physical interface of the host machine is connected
+to.
+
+The interface can have additional parameters as shown below, if the switch is
+conforming to the IEEE 802.1Qbg standard. The parameters of the virtualport
+element are documented in more detail in the IEEE 802.1Qbg standard. The values
+are network specific and should be provided by the network administrator. In
+802.1Qbg terms, the Virtual Station Interface (VSI) represents the virtual
+interface of a virtual machine. :since:`Since 0.8.2`
+
+Please note that IEEE 802.1Qbg requires a non-zero value for the VLAN ID.
+
+``managerid``
+ The VSI Manager ID identifies the database containing the VSI type and
+ instance definitions. This is an integer value and the value 0 is reserved.
+``typeid``
+ The VSI Type ID identifies a VSI type characterizing the network access. VSI
+ types are typically managed by network administrator. This is an integer
+ value.
+``typeidversion``
+ The VSI Type Version allows multiple versions of a VSI Type. This is an
+ integer value.
+``instanceid``
+ The VSI Instance ID Identifier is generated when a VSI instance (i.e. a
+ virtual interface of a virtual machine) is created. This is a globally unique
+ identifier.
+
+::
+
+ ...
+ <devices>
+ ...
+ <interface type='direct'>
+ <source dev='eth0.2' mode='vepa'/>
+ <virtualport type="802.1Qbg">
+ <parameters managerid="11" typeid="1193047"
typeidversion="2"
instanceid="09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f"/>
+ </virtualport>
+ </interface>
+ </devices>
+ ...
+
+The interface can have additional parameters as shown below if the switch is
+conforming to the IEEE 802.1Qbh standard. The values are network specific and
+should be provided by the network administrator. :since:`Since 0.8.2`
+
+``profileid``
+ The profile ID contains the name of the port profile that is to be applied to
+ this interface. This name is resolved by the port profile database into the
+ network parameters from the port profile, and those network parameters will
+ be applied to this interface.
+
+::
+
+ ...
+ <devices>
+ ...
+ <interface type='direct'>
+ <source dev='eth0' mode='private'/>
+ <virtualport type='802.1Qbh'>
+ <parameters profileid='finance'/>
+ </virtualport>
+ </interface>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNICSHostdev"/>`
+
+PCI Passthrough
+^^^^^^^^^^^^^^^
+
+A PCI network device (specified by the <source> element) is directly assigned to
+the guest using generic device passthrough, after first optionally setting the
+device's MAC address to the configured value, and associating the device with an
+802.1Qbh capable switch using an optionally specified <virtualport> element (see
+the examples of virtualport given above for type='direct' network devices). Note
+that - due to limitations in standard single-port PCI ethernet card driver
+design - only SR-IOV (Single Root I/O Virtualization) virtual function (VF)
+devices can be assigned in this manner; to assign a standard single-port PCI or
+PCIe ethernet card to a guest, use the traditional <hostdev> device definition
+and :since:`Since 0.9.11`
+
+To use VFIO device assignment rather than traditional/legacy KVM device
+assignment (VFIO is a new method of device assignment that is compatible with
+UEFI Secure Boot), a type='hostdev' interface can have an optional ``driver``
+sub-element with a ``name`` attribute set to "vfio". To use legacy KVM device
+assignment you can set ``name`` to "kvm" (or simply omit the
``<driver>``
+element, since "kvm" is currently the default). :since:`Since 1.0.5 (QEMU and
+KVM only, requires kernel 3.6 or newer)`
+
+Note that this "intelligent passthrough" of network devices is very similar to
+the functionality of a standard <hostdev> device, the difference being that this
+method allows specifying a MAC address and <virtualport> for the passed-through
+device. If these capabilities are not required, if you have a standard
+single-port PCI, PCIe, or USB network card that doesn't support SR-IOV (and
+hence would anyway lose the configured MAC address during reset after being
+assigned to the guest domain), or if you are using a version of libvirt older
+than 0.9.11, you should use standard <hostdev> to assign the device to the guest
+instead of <interface type='hostdev'/>.
+
+Similar to the functionality of a standard <hostdev> device, when ``managed`` is
+"yes", it is detached from the host before being passed on to the guest, and
+reattached to the host after the guest exits. If ``managed`` is omitted or
"no",
+the user is responsible to call ``virNodeDeviceDettach`` (or
+``virsh nodedev-detach``) before starting the guest or hot-plugging the device,
+and ``virNodeDeviceReAttach`` (or ``virsh nodedev-reattach``) after hot-unplug
+or stopping the guest.
+
+::
+
+ ...
+ <devices>
+ <interface type='hostdev' managed='yes'>
+ <driver name='vfio'/>
+ <source>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x07' function='0x0'/>
+ </source>
+ <mac address='52:54:00:6d:90:02'/>
+ <virtualport type='802.1Qbh'>
+ <parameters profileid='finance'/>
+ </virtualport>
+ </interface>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsTeaming"/>`
+
+Teaming a virtio/hostdev NIC pair
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+:since:`Since 6.1.0 (QEMU and KVM only, requires QEMU 4.2.0 or newer and a guest
+virtio-net driver supporting the "failover" feature, such as the one included
in
+Linux kernel 4.18 and newer) ` The ``<teaming>`` element of two interfaces can
+be used to connect them as a team/bond device in the guest (assuming proper
+support in the hypervisor and the guest network driver).
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='mybridge'/>
+ <mac address='00:11:22:33:44:55'/>
+ <model type='virtio'/>
+ <teaming type='persistent'/>
+ <alias name='ua-backup0'/>
+ </interface>
+ <interface type='network'>
+ <source network='hostdev-pool'/>
+ <mac address='00:11:22:33:44:55'/>
+ <model type='virtio'/>
+ <teaming type='transient' persistent='ua-backup0'/>
+ </interface>
+ </devices>
+ ...
+
+The ``<teaming>`` element required attribute ``type`` will be set to either
+``"persistent"`` to indicate a device that should always be present in the
+domain, or ``"transient"`` to indicate a device that may periodically be
+removed, then later re-added to the domain. When type="transient", there
should
+be a second attribute to ``<teaming>`` called ``"persistent"`` - this
attribute
+should be set to the alias name of the other device in the pair (the one that
+has ``<teaming type="persistent'/>``).
+
+In the particular case of QEMU, libvirt's ``<teaming>`` element is used to
setup
+a virtio-net "failover" device pair. For this setup, the persistent device
must
+be an interface with ``<model type="virtio"/>``, and the transient
device
+must be ``<interface type='hostdev'/>`` (or ``<interface
type='network'/>``
+where the referenced network defines a pool of SRIOV VFs). The guest will then
+have a simple network team/bond device made of the virtio NIC + hostdev NIC
+pair. In this configuration, the higher-performing hostdev NIC will normally be
+preferred for all network traffic, but when the domain is migrated, QEMU will
+automatically unplug the VF from the guest, and then hotplug a similar device
+once migration is completed; while migration is taking place, network traffic
+will use the virtio NIC. (Of course the emulated virtio NIC and the hostdev NIC
+must be connected to the same subnet for bonding to work properly).
+
+NB1: Since you must know the alias name of the virtio NIC when configuring the
+hostdev NIC, it will need to be manually set in the virtio NIC's configuration
+(as with all other manually set alias names, this means it must start with
+"ua-").
+
+NB2: Currently the only implementation of the guest OS virtio-net driver
+supporting virtio-net failover requires that the MAC addresses of the virtio and
+hostdev NIC must match. Since that may not always be a requirement in the
+future, libvirt doesn't enforce this limitation - it is up to the
+person/management application that is creating the configuration to assure the
+MAC addresses of the two devices match.
+
+NB3: Since the PCI addresses of the SRIOV VFs on the hosts that are the source
+and destination of the migration will almost certainly be different, either
+higher level management software will need to modify the ``<source>`` of the
+hostdev NIC (``<interface type='hostdev'>``) at the start of migration, or
(a
+simpler solution) the configuration will need to use a libvirt "hostdev"
virtual
+network that maintains a pool of such devices, as is implied in the example's
+use of the libvirt network named "hostdev-pool" - as long as the hostdev
network
+pools on both hosts have the same name, libvirt itself will take care of
+allocating an appropriate device on both ends of the migration. Similarly the
+XML for the virtio interface must also either work correctly unmodified on both
+the source and destination of the migration (e.g. by connecting to the same
+bridge device on both hosts, or by using the same virtual network), or the
+management software must properly modify the interface XML during migration so
+that the virtio device remains connected to the same network segment before and
+after migration.
+
+:anchor:`<a id="elementsNICSMulticast"/>`
+
+Multicast tunnel
+^^^^^^^^^^^^^^^^
+
+A multicast group is setup to represent a virtual network. Any VMs whose network
+devices are in the same multicast group can talk to each other even across
+hosts. This mode is also available to unprivileged users. There is no default
+DNS or DHCP support and no outgoing network access. To provide outgoing network
+access, one of the VMs should have a 2nd NIC which is connected to one of the
+first 4 network types and do the appropriate routing. The multicast protocol is
+compatible with that used by user mode linux guests too. The source address used
+must be from the multicast address block.
+
+::
+
+ ...
+ <devices>
+ <interface type='mcast'>
+ <mac address='52:54:00:6d:90:01'/>
+ <source address='230.0.0.1' port='5558'/>
+ </interface>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNICSTCP"/>`
+
+TCP tunnel
+^^^^^^^^^^
+
+A TCP client/server architecture provides a virtual network. One VM provides the
+server end of the network, all other VMS are configured as clients. All network
+traffic is routed between the VMs via the server. This mode is also available to
+unprivileged users. There is no default DNS or DHCP support and no outgoing
+network access. To provide outgoing network access, one of the VMs should have a
+2nd NIC which is connected to one of the first 4 network types and do the
+appropriate routing.
+
+::
+
+ ...
+ <devices>
+ <interface type='server'>
+ <mac address='52:54:00:22:c9:42'/>
+ <source address='192.168.0.1' port='5558'/>
+ </interface>
+ ...
+ <interface type='client'>
+ <mac address='52:54:00:8b:c9:51'/>
+ <source address='192.168.0.1' port='5558'/>
+ </interface>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNICSUDP"/>`
+
+UDP unicast tunnel
+^^^^^^^^^^^^^^^^^^
+
+A UDP unicast architecture provides a virtual network which enables connections
+between QEMU instances using QEMU's UDP infrastructure. The xml "source"
address
+is the endpoint address to which the UDP socket packets will be sent from the
+host running QEMU. The xml "local" address is the address of the interface
from
+which the UDP socket packets will originate from the QEMU host. :since:`Since
+1.2.20`
+
+::
+
+ ...
+ <devices>
+ <interface type='udp'>
+ <mac address='52:54:00:22:c9:42'/>
+ <source address='127.0.0.1' port='11115'>
+ <local address='127.0.0.1' port='11116'/>
+ </source>
+ </interface>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNICSModel"/>`
+
+Setting the NIC model
+^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet1'/>
+ <model type='ne2k_pci'/>
+ </interface>
+ </devices>
+ ...
+
+For hypervisors which support this, you can set the model of emulated network
+interface card.
+
+The values for ``type`` aren't defined specifically by libvirt, but by what the
+underlying hypervisor supports (if any). For QEMU and KVM you can get a list of
+supported models with these commands:
+
+::
+
+ qemu -net nic,model=? /dev/null
+ qemu-kvm -net nic,model=? /dev/null
+
+Typical values for QEMU and KVM include: ne2k_isa i82551 i82557b i82559er
+ne2k_pci pcnet rtl8139 e1000 virtio. :since:`Since 5.2.0` ,
+``virtio-transitional`` and ``virtio-non-transitional`` values are supported.
+See `Virtio transitional devices <#elementsVirtioTransitional>`__ for more
+details.
+
+:anchor:`<a id="elementsDriverBackendOptions"/>`
+
+Setting NIC driver-specific options
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet1'/>
+ <model type='virtio'/>
+ <driver name='vhost' txmode='iothread' ioeventfd='on'
event_idx='off' queues='5' rx_queue_size='256'
tx_queue_size='256'>
+ <host csum='off' gso='off' tso4='off'
tso6='off' ecn='off' ufo='off' mrg_rxbuf='off'/>
+ <guest csum='off' tso4='off' tso6='off'
ecn='off' ufo='off'/>
+ </driver>
+ </interface>
+ </devices>
+ ...
+
+Some NICs may have tunable driver-specific options. These are set as attributes
+of the ``driver`` sub-element of the interface definition. Currently the
+following attributes are available for the ``"virtio"`` NIC driver:
+
+``name``
+ The optional ``name`` attribute forces which type of backend driver to use.
+ The value can be either 'qemu' (a user-space backend) or 'vhost' (a
kernel
+ backend, which requires the vhost module to be provided by the kernel); an
+ attempt to require the vhost driver without kernel support will be rejected.
+ If this attribute is not present, then the domain defaults to 'vhost' if
+ present, but silently falls back to 'qemu' without error. :since:`Since 0.8.8
+ (QEMU and KVM only)`
+ For interfaces of type='hostdev' (PCI passthrough devices) the ``name``
+ attribute can optionally be set to "vfio" or "kvm".
"vfio" tells libvirt to
+ use VFIO device assignment rather than traditional KVM device assignment
+ (VFIO is a new method of device assignment that is compatible with UEFI
+ Secure Boot), and "kvm" tells libvirt to use the legacy device assignment
+ performed directly by the kvm kernel module (the default is currently
"kvm",
+ but is subject to change). :since:`Since 1.0.5 (QEMU and KVM only, requires
+ kernel 3.6 or newer)`
+ For interfaces of type='vhostuser', the ``name`` attribute is ignored. The
+ backend driver used is always vhost-user.
+``txmode``
+ The ``txmode`` attribute specifies how to handle transmission of packets when
+ the transmit buffer is full. The value can be either 'iothread' or
'timer'.
+ :since:`Since 0.8.8 (QEMU and KVM only)`
+ If set to 'iothread', packet tx is all done in an iothread in the bottom half
+ of the driver (this option translates into adding "tx=bh" to the qemu
+ commandline -device virtio-net-pci option).
+ If set to 'timer', tx work is done in qemu, and if there is more tx data than
+ can be sent at the present time, a timer is set before qemu moves on to do
+ other things; when the timer fires, another attempt is made to send more
+ data.
+ The resulting difference, according to the qemu developer who added the
+ option is: "bh makes tx more asynchronous and reduces latency, but
+ potentially causes more processor bandwidth contention since the CPU doing
+ the tx isn't necessarily the CPU where the guest generated the packets."
+ **In general you should leave this option alone, unless you are very certain
+ you know what you are doing.**
+``ioeventfd``
+ This optional attribute allows users to set `domain I/O asynchronous
+ handling <
https://patchwork.kernel.org/patch/43390/>`__ for interface device.
+ The default is left to the discretion of the hypervisor. Accepted values are
+ "on" and "off". Enabling this allows qemu to execute VM while a
separate
+ thread handles I/O. Typically guests experiencing high system CPU utilization
+ during I/O will benefit from this. On the other hand, on overloaded host it
+ could increase guest I/O latency. :since:`Since 0.9.3 (QEMU and KVM only)`
+ **In general you should leave this option alone, unless you are very certain
+ you know what you are doing.**
+``event_idx``
+ The ``event_idx`` attribute controls some aspects of device event processing.
+ The value can be either 'on' or 'off' - if it is on, it will reduce
the
+ number of interrupts and exits for the guest. The default is determined by
+ QEMU; usually if the feature is supported, default is on. In case there is a
+ situation where this behavior is suboptimal, this attribute provides a way to
+ force the feature off. :since:`Since 0.9.5 (QEMU and KVM only)`
+ **In general you should leave this option alone, unless you are very certain
+ you know what you are doing.**
+``queues``
+ The optional ``queues`` attribute controls the number of queues to be used
+ for either `Multiqueue
+ virtio-net <
https://www.linux-kvm.org/page/Multiqueue>`__ or
+ `vhost-user <#elementVhostuser>`__ network interfaces. Use of multiple packet
+ processing queues requires the interface having the
+ ``<model type='virtio'/>`` element. Each queue will potentially be
handled by
+ a different processor, resulting in much higher throughput.
+ :since:`virtio-net since 1.0.6 (QEMU and KVM only)` :since:`vhost-user since
+ 1.2.17 (QEMU and KVM only)`
+``rx_queue_size``
+ The optional ``rx_queue_size`` attribute controls the size of virtio ring for
+ each queue as described above. The default value is hypervisor dependent and
+ may change across its releases. Moreover, some hypervisors may pose some
+ restrictions on actual value. For instance, latest QEMU (as of 2016-09-01)
+ requires value to be a power of two from [256, 1024] range. :since:`Since
+ 2.3.0 (QEMU and KVM only)`
+ **In general you should leave this option alone, unless you are very certain
+ you know what you are doing.**
+``tx_queue_size``
+ The optional ``tx_queue_size`` attribute controls the size of virtio ring for
+ each queue as described above. The default value is hypervisor dependent and
+ may change across its releases. Moreover, some hypervisors may pose some
+ restrictions on actual value. For instance, QEMU v2.9 requires value to be a
+ power of two from [256, 1024] range. In addition to that, this may work only
+ for a subset of interface types, e.g. aforementioned QEMU enables this option
+ only for ``vhostuser`` type. :since:`Since 3.7.0 (QEMU and KVM only)`
+ **In general you should leave this option alone, unless you are very certain
+ you know what you are doing.**
+virtio options
+ For virtio interfaces, `Virtio-specific options <#elementsVirtio>`__ can also
+ be set. ( :since:`Since 3.5.0` )
+
+Offloading options for the host and guest can be configured using the following
+sub-elements:
+
+``host``
+ The ``csum``, ``gso``, ``tso4``, ``tso6``, ``ecn`` and ``ufo`` attributes
+ with possible values ``on`` and ``off`` can be used to turn off host
+ offloading options. By default, the supported offloads are enabled by QEMU.
+ :since:`Since 1.2.9 (QEMU only)` The ``mrg_rxbuf`` attribute can be used to
+ control mergeable rx buffers on the host side. Possible values are ``on``
+ (default) and ``off``. :since:`Since 1.2.13 (QEMU only)`
+``guest``
+ The ``csum``, ``tso4``, ``tso6``, ``ecn`` and ``ufo`` attributes with
+ possible values ``on`` and ``off`` can be used to turn off guest offloading
+ options. By default, the supported offloads are enabled by QEMU.
+ :since:`Since 1.2.9 (QEMU only)`
+
+:anchor:`<a id="elementsBackendOptions"/>`
+
+Setting network backend-specific options
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet1'/>
+ <model type='virtio'/>
+ <backend tap='/dev/net/tun' vhost='/dev/vhost-net'/>
+ <driver name='vhost' txmode='iothread' ioeventfd='on'
event_idx='off' queues='5'/>
+ <tune>
+ <sndbuf>1600</sndbuf>
+ </tune>
+ </interface>
+ </devices>
+ ...
+
+For tuning the backend of the network, the ``backend`` element can be used. The
+``vhost`` attribute can override the default vhost device path
+(``/dev/vhost-net``) for devices with ``virtio`` model. The ``tap`` attribute
+overrides the tun/tap device path (default: ``/dev/net/tun``) for network and
+bridge interfaces. This does not work in session mode. :since:`Since 1.2.9`
+
+For tap devices there is also ``sndbuf`` element which can adjust the size of
+send buffer in the host. :since:`Since 0.8.8`
+
+:anchor:`<a id="elementsNICSTargetOverride"/>`
+
+Overriding the target element
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet1'/>
+ </interface>
+ </devices>
+ ...
+
+If no target is specified, certain hypervisors will automatically generate a
+name for the created tun device. This name can be manually specified, however
+the name *should not start with either 'vnet', 'vif', 'macvtap',
or 'macvlan'*,
+which are prefixes reserved by libvirt and certain hypervisors. Manually
+specified targets using these prefixes may be ignored.
+
+Note that for LXC containers, this defines the name of the interface on the host
+side. :since:`Since 1.2.7` , to define the name of the device on the guest side,
+the ``guest`` element should be used, as in the following snippet:
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <guest dev='myeth'/>
+ </interface>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNICSBoot"/>`
+
+Specifying boot order
+^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet1'/>
+ <boot order='1'/>
+ </interface>
+ </devices>
+ ...
+
+For hypervisors which support this, you can set a specific NIC to be used for
+network boot. The ``order`` attribute determines the order in which devices will
+be tried during boot sequence. The per-device ``boot`` elements cannot be used
+together with general boot elements in `BIOS bootloader <#elementsOSBIOS>`__
+section. :since:`Since 0.8.8`
+
+:anchor:`<a id="elementsNICSROM"/>`
+
+Interface ROM BIOS configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet1'/>
+ <rom bar='on' file='/etc/fake/boot.bin'/>
+ </interface>
+ </devices>
+ ...
+
+For hypervisors which support this, you can change how a PCI Network device's
+ROM is presented to the guest. The ``bar`` attribute can be set to "on" or
+"off", and determines whether or not the device's ROM will be visible in
the
+guest's memory map. (In PCI documentation, the "rombar" setting controls
the
+presence of the Base Address Register for the ROM). If no rom bar is specified,
+the qemu default will be used (older versions of qemu used a default of "off",
+while newer qemus have a default of "on"). The optional ``file`` attribute is
+used to point to a binary file to be presented to the guest as the device's ROM
+BIOS. This can be useful to provide an alternative boot ROM for a network
+device. :since:`Since 0.9.10 (QEMU and KVM only)` .
+
+:anchor:`<a id="elementDomain"/>`
+
+Setting up a network backend in a driver domain
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ ...
+ <interface type='bridge'>
+ <source bridge='br0'/>
+ <backenddomain name='netvm'/>
+ </interface>
+ ...
+ </devices>
+ ...
+
+The optional ``backenddomain`` element allows specifying a backend domain (aka
+driver domain) for the interface. Use the ``name`` attribute to specify the
+backend domain name. You can use it to create a direct network link between
+domains (so data will not go through host system). Use with type 'ethernet' to
+create plain network link, or with type 'bridge' to connect to a bridge inside
+the backend domain. :since:`Since 1.2.13 (Xen only)`
+
+:anchor:`<a id="elementQoS"/>`
+
+Quality of service
+^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet0'/>
+ <bandwidth>
+ <inbound average='1000' peak='5000' floor='200'
burst='1024'/>
+ <outbound average='128' peak='256' burst='256'/>
+ </bandwidth>
+ </interface>
+ </devices>
+ ...
+
+This part of interface XML provides setting quality of service. Incoming and
+outgoing traffic can be shaped independently. The ``bandwidth`` element and its
+child elements are described in the `QoS <formatnetwork.html#elementQoS>`__
+section of the Network XML.
+
+:anchor:`<a id="elementVlanTag"/>`
+
+Setting VLAN tag (on supported network types only)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='bridge'>
+ <vlan>
+ <tag id='42'/>
+ </vlan>
+ <source bridge='ovsbr0'/>
+ <virtualport type='openvswitch'>
+ <parameters interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
+ </virtualport>
+ </interface>
+ <interface type='bridge'>
+ <vlan trunk='yes'>
+ <tag id='42'/>
+ <tag id='123' nativeMode='untagged'/>
+ </vlan>
+ ...
+ </interface>
+ </devices>
+ ...
+
+If (and only if) the network connection used by the guest supports VLAN tagging
+transparent to the guest, an optional ``<vlan>`` element can specify one or more
+VLAN tags to apply to the guest's network traffic :since:`Since 0.10.0` .
+Network connections that support guest-transparent VLAN tagging include 1)
+type='bridge' interfaces connected to an Open vSwitch bridge :since:`Since
+0.10.0` , 2) SRIOV Virtual Functions (VF) used via type='hostdev' (direct device
+assignment) :since:`Since 0.10.0` , and 3) SRIOV VFs used via type='direct' with
+mode='passthrough' (macvtap "passthru" mode) :since:`Since 1.3.5` . All
other
+connection types, including standard linux bridges and libvirt's own virtual
+networks, **do not** support it. 802.1Qbh (vn-link) and 802.1Qbg (VEPA) switches
+provide their own way (outside of libvirt) to tag guest traffic onto a specific
+VLAN. Each tag is given in a separate ``<tag>`` subelement of ``<vlan>``
(for
+example: ``<tag id='42'/>``). For VLAN trunking of multiple tags
(which is
+supported only on Open vSwitch connections), multiple ``<tag>`` subelements can
+be specified, which implies that the user wants to do VLAN trunking on the
+interface for all the specified tags. In the case that VLAN trunking of a single
+tag is desired, the optional attribute ``trunk='yes'`` can be added to the
+toplevel ``<vlan>`` element to differentiate trunking of a single tag from
+normal tagging.
+
+For network connections using Open vSwitch it is also possible to configure
+'native-tagged' and 'native-untagged' VLAN modes :since:`Since 1.1.0.`
This is
+done with the optional ``nativeMode`` attribute on the ``<tag>`` subelement:
+``nativeMode`` may be set to 'tagged' or 'untagged'. The ``id`` attribute
of the
+``<tag>`` subelement containing ``nativeMode`` sets which VLAN is considered to
+be the "native" VLAN for this interface, and the ``nativeMode`` attribute
+determines whether or not traffic for that VLAN will be tagged.
+
+:anchor:`<a id="elementPort"/>`
+
+Isolating guests's network traffic from each other
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <port isolated='yes'/>
+ </interface>
+ </devices>
+ ...
+
+:since:`Since 6.1.0.` The ``port`` element property ``isolated``, when set to
+``yes`` (default setting is ``no``) is used to isolate this interface's network
+traffic from that of other guest interfaces connected to the same network that
+also have ``<port isolated='yes'/>``. This setting is only supported for
+emulated interface devices that use a standard tap device to connect to the
+network via a Linux host bridge. This property can be inherited from a libvirt
+network, so if all guests that will be connected to the network should be
+isolated, it is better to put the setting in the network configuration. (NB:
+this only prevents guests that have ``isolated='yes'`` from communicating with
+each other; if there is a guest on the same bridge that doesn't have
+``isolated='yes'``, even the isolated guests will be able to communicate with
+it.)
+
+:anchor:`<a id="elementLink"/>`
+
+Modifying virtual link state
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet0'/>
+ <link state='down'/>
+ </interface>
+ </devices>
+ ...
+
+This element provides means of setting state of the virtual network link.
+Possible values for attribute ``state`` are ``up`` and ``down``. If ``down`` is
+specified as the value, the interface behaves as if it had the network cable
+disconnected. Default behavior if this element is unspecified is to have the
+link state ``up``. :since:`Since 0.9.5`
+
+:anchor:`<a id="mtu"/>`
+
+MTU configuration
+^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet0'/>
+ <mtu size='1500'/>
+ </interface>
+ </devices>
+ ...
+
+This element provides means of setting MTU of the virtual network link.
+Currently there is just one attribute ``size`` which accepts a non-negative
+integer which specifies the MTU size for the interface. :since:`Since 3.1.0`
+
+:anchor:`<a id="coalesce"/>`
+
+Coalesce settings
+^^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet0'/>
+ <coalesce>
+ <rx>
+ <frames max='7'/>
+ </rx>
+ </coalesce>
+ </interface>
+ </devices>
+ ...
+
+This element provides means of setting coalesce settings for some interface
+devices (currently only type ``network`` and ``bridge``. Currently there is just
+one attribute, ``max``, to tweak, in element ``frames`` for the ``rx`` group,
+which accepts a non-negative integer that specifies the maximum number of
+packets that will be received before an interrupt. :since:`Since 3.3.0`
+
+:anchor:`<a id="ipconfig"/>`
+
+IP configuration
+^^^^^^^^^^^^^^^^
+
+::
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet0'/>
+ <ip address='192.168.122.5' prefix='24'/>
+ <ip address='192.168.122.5' prefix='24'
peer='10.0.0.10'/>
+ <route family='ipv4' address='192.168.122.0'
prefix='24' gateway='192.168.122.1'/>
+ <route family='ipv4' address='192.168.122.8'
gateway='192.168.122.1'/>
+ </interface>
+ ...
+ <hostdev mode='capabilities' type='net'>
+ <source>
+ <interface>eth0</interface>
+ </source>
+ <ip address='192.168.122.6' prefix='24'/>
+ <route family='ipv4' address='192.168.122.0'
prefix='24' gateway='192.168.122.1'/>
+ <route family='ipv4' address='192.168.122.8'
gateway='192.168.122.1'/>
+ </hostdev>
+ ...
+ </devices>
+ ...
+
+:since:`Since 1.2.12` network devices and hostdev devices with network
+capabilities can optionally be provided one or more IP addresses to set on the
+network device in the guest. Note that some hypervisors or network device types
+will simply ignore them or only use the first one. The ``family`` attribute can
+be set to either ``ipv4`` or ``ipv6``, and the ``address`` attribute contains
+the IP address. The optional ``prefix`` is the number of 1 bits in the netmask,
+and will be automatically set if not specified - for IPv4 the default prefix is
+determined according to the network "class" (A, B, or C - see RFC870), and for
+IPv6 the default prefix is 64. The optional ``peer`` attribute holds the IP
+address of the other end of a point-to-point network device :since:`(since
+2.1.0)` .
+
+:since:`Since 1.2.12` route elements can also be added to define IP routes to
+add in the guest. The attributes of this element are described in the
+documentation for the ``route`` element in `network
+definitions <formatnetwork.html#elementsStaticroute>`__. This is used by the LXC
+driver.
+
+::
+
+ ...
+ <devices>
+ <interface type='ethernet'>
+ <source/>
+ <ip address='192.168.123.1' prefix='24'/>
+ <ip address='10.0.0.10' prefix='24'
peer='192.168.122.5'/>
+ <route family='ipv4' address='192.168.42.0'
prefix='24' gateway='192.168.123.4'/>
+ <source/>
+ ...
+ </interface>
+ ...
+ </devices>
+ ...
+
+:since:`Since 2.1.0` network devices of type "ethernet" can optionally be
+provided one or more IP addresses and one or more routes to set on the **host**
+side of the network device. These are configured as subelements of the
+``<source>`` element of the interface, and have the same attributes as the
+similarly named elements used to configure the guest side of the interface
+(described above).
+
+:anchor:`<a id="elementVhostuser"/>`
+
+vhost-user interface
+^^^^^^^^^^^^^^^^^^^^
+
+:since:`Since 1.2.7` the vhost-user enables the communication between a QEMU
+virtual machine and other userspace process using the Virtio transport protocol.
+A char dev (e.g. Unix socket) is used for the control plane, while the data
+plane is based on shared memory.
+
+::
+
+ ...
+ <devices>
+ <interface type='vhostuser'>
+ <mac address='52:54:00:3b:83:1a'/>
+ <source type='unix' path='/tmp/vhost1.sock'
mode='server'/>
+ <model type='virtio'/>
+ </interface>
+ <interface type='vhostuser'>
+ <mac address='52:54:00:3b:83:1b'/>
+ <source type='unix' path='/tmp/vhost2.sock'
mode='client'>
+ <reconnect enabled='yes' timeout='10'/>
+ </source>
+ <model type='virtio'/>
+ <driver queues='5'/>
+ </interface>
+ </devices>
+ ...
+
+The ``<source>`` element has to be specified along with the type of char device.
+Currently, only type='unix' is supported, where the path (the directory path of
+the socket) and mode attributes are required. Both ``mode='server'`` and
+``mode='client'`` are supported. vhost-user requires the virtio model type, thus
+the ``<model>`` element is mandatory. :since:`Since 4.1.0` the element has an
+optional child element ``reconnect`` which configures reconnect timeout if the
+connection is lost. It has two attributes ``enabled`` (which accepts ``yes`` and
+``no``) and ``timeout`` which specifies the amount of seconds after which
+hypervisor tries to reconnect.
+
+:anchor:`<a id="elementNwfilter"/>`
+
+Traffic filtering with NWFilter
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+:since:`Since 0.8.0` an ``nwfilter`` profile can be assigned to a domain
+interface, which allows configuring traffic filter rules for the virtual
+machine. See the `nwfilter <formatnwfilter.html>`__ documentation for more
+complete details.
+
+::
+
+ ...
+ <devices>
+ <interface ...>
+ ...
+ <filterref filter='clean-traffic'/>
+ </interface>
+ <interface ...>
+ ...
+ <filterref filter='myfilter'>
+ <parameter name='IP' value='104.207.129.11'/>
+ <parameter name='IP6_ADDR' value='2001:19f0:300:2102::'/>
+ <parameter name='IP6_MASK' value='64'/>
+ ...
+ </filterref>
+ </interface>
+ </devices>
+ ...
+
+The ``filter`` attribute specifies the name of the nwfilter to use. Optional
+``<parameter>`` elements may be specified for passing additional info to the
+nwfilter via the ``name`` and ``value`` attributes. See the
+`nwfilter <formatnwfilter.html#nwfconceptsvars>`__ docs for info on parameters.
+
+:anchor:`<a id="elementsInput"/>`
+
+Input devices
+~~~~~~~~~~~~~
+
+Input devices allow interaction with the graphical framebuffer in the guest
+virtual machine. When enabling the framebuffer, an input device is automatically
+provided. It may be possible to add additional devices explicitly, for example,
+to provide a graphics tablet for absolute cursor movement.
+
+::
+
+ ...
+ <devices>
+ <input type='mouse' bus='usb'/>
+ <input type='keyboard' bus='usb'/>
+ <input type='mouse' bus='virtio'/>
+ <input type='keyboard' bus='virtio'/>
+ <input type='tablet' bus='virtio'/>
+ <input type='passthrough' bus='virtio'>
+ <source evdev='/dev/input/event1'/>
+ </input>
+ </devices>
+ ...
+
+``input``
+ The ``input`` element has one mandatory attribute, the ``type`` whose value
+ can be 'mouse', 'tablet', ( :since:`since 1.2.2` ) 'keyboard'
or (
+ :since:`since 1.3.0` ) 'passthrough'. The tablet provides absolute cursor
+ movement, while the mouse uses relative movement. The optional ``bus``
+ attribute can be used to refine the exact device type. It takes values
"xen"
+ (paravirtualized), "ps2" and "usb" or ( :since:`since 1.3.0` )
"virtio".
+
+The ``input`` element has an optional sub-element ``<address>`` which can tie
+the device to a particular PCI slot, `documented above <#elementsAddress>`__. On
+S390, ``address`` can be used to provide a CCW address for an input device (
+:since:`since 4.2.0` ). For type ``passthrough``, the mandatory sub-element
+``source`` must have an ``evdev`` attribute containing the absolute path to the
+event device passed through to guests. (KVM only) :since:`Since 5.2.0` , the
+``input`` element accepts a ``model`` attribute which has the values 'virtio',
+'virtio-transitional' and 'virtio-non-transitional'. See `Virtio
transitional
+devices <#elementsVirtioTransitional>`__ for more details.
+
+The subelement ``driver`` can be used to tune the virtio options of the device:
+`Virtio-specific options <#elementsVirtio>`__ can also be set. ( :since:`Since
+3.5.0` )
+
+:anchor:`<a id="elementsHub"/>`
+
+Hub devices
+~~~~~~~~~~~
+
+A hub is a device that expands a single port into several so that there are more
+ports available to connect devices to a host system.
+
+::
+
+ ...
+ <devices>
+ <hub type='usb'/>
+ </devices>
+ ...
+
+``hub``
+ The ``hub`` element has one mandatory attribute, the ``type`` whose value can
+ only be 'usb'.
+
+The ``hub`` element has an optional sub-element ``<address>`` with
+``type='usb'``\ which can tie the device to a particular controller, `documented
+above <#elementsAddress>`__.
+
+:anchor:`<a id="elementsGraphics"/>`
+
+Graphical framebuffers
+~~~~~~~~~~~~~~~~~~~~~~
+
+A graphics device allows for graphical interaction with the guest OS. A guest
+will typically have either a framebuffer or a text console configured to allow
+interaction with the admin.
+
+::
+
+ ...
+ <devices>
+ <graphics type='sdl' display=':0.0'/>
+ <graphics type='vnc' port='5904'
sharePolicy='allow-exclusive'>
+ <listen type='address' address='1.2.3.4'/>
+ </graphics>
+ <graphics type='rdp' autoport='yes' multiUser='yes'
/>
+ <graphics type='desktop' fullscreen='yes'/>
+ <graphics type='spice'>
+ <listen type='network' network='rednet'/>
+ </graphics>
+ </devices>
+ ...
+
+``graphics``
+ The ``graphics`` element has a mandatory ``type`` attribute which takes the
+ value ``sdl``, ``vnc``, ``spice``, ``rdp``, ``desktop`` or ``egl-headless``:
+
+ ``sdl``
+ This displays a window on the host desktop, it can take 3 optional
+ arguments: a ``display`` attribute for the display to use, an ``xauth``
+ attribute for the authentication identifier, and an optional
+ ``fullscreen`` attribute accepting values ``yes`` or ``no``.
+
+ You can use a ``gl`` with the ``enable="yes"`` property to enable OpenGL
+ support in SDL. Likewise you can explicitly disable OpenGL support with
+ ``enable="no"``.
+
+ ``vnc``
+ Starts a VNC server. The ``port`` attribute specifies the TCP port number
+ (with -1 as legacy syntax indicating that it should be auto-allocated).
+ The ``autoport`` attribute is the new preferred syntax for indicating
+ auto-allocation of the TCP port to use. The ``passwd`` attribute provides
+ a VNC password in clear text. If the ``passwd`` attribute is set to an
+ empty string, then VNC access is disabled. The ``keymap`` attribute
+ specifies the keymap to use. It is possible to set a limit on the validity
+ of the password by giving a timestamp
+ ``passwdValidTo='2010-04-09T15:51:00'`` assumed to be in UTC. The
+ ``connected`` attribute allows control of connected client during password
+ changes. VNC accepts ``keep`` value only :since:`since 0.9.3` . NB, this
+ may not be supported by all hypervisors.
+
+ The optional ``sharePolicy`` attribute specifies vnc server display
+ sharing policy. ``allow-exclusive`` allows clients to ask for exclusive
+ access by dropping other connections. Connecting multiple clients in
+ parallel requires all clients asking for a shared session (vncviewer:
+ -Shared switch). This is the default value. ``force-shared`` disables
+ exclusive client access, every connection has to specify -Shared switch
+ for vncviewer. ``ignore`` welcomes every connection unconditionally
+ :since:`since 1.0.6` .
+
+ Rather than using listen/port, QEMU supports a ``socket`` attribute for
+ listening on a unix domain socket path :since:`Since 0.8.8` .
+
+ For VNC WebSocket functionality, ``websocket`` attribute may be used to
+ specify port to listen on (with -1 meaning auto-allocation and
+ ``autoport`` having no effect due to security reasons) :since:`Since
+ 1.0.6` .
+
+ Although VNC doesn't support OpenGL natively, it can be paired with
+ graphics type ``egl-headless`` (see below) which will instruct QEMU to
+ open and use drm nodes for OpenGL rendering.
+
+ ``spice`` :since:`Since 0.8.6`
+ Starts a SPICE server. The ``port`` attribute specifies the TCP port
+ number (with -1 as legacy syntax indicating that it should be
+ auto-allocated), while ``tlsPort`` gives an alternative secure port
+ number. The ``autoport`` attribute is the new preferred syntax for
+ indicating auto-allocation of needed port numbers. The ``passwd``
+ attribute provides a SPICE password in clear text. If the ``passwd``
+ attribute is set to an empty string, then SPICE access is disabled. The
+ ``keymap`` attribute specifies the keymap to use. It is possible to set a
+ limit on the validity of the password by giving a timestamp
+ ``passwdValidTo='2010-04-09T15:51:00'`` assumed to be in UTC.
+
+ The ``connected`` attribute allows control of connected client during
+ password changes. SPICE accepts ``keep`` to keep client connected,
+ ``disconnect`` to disconnect client and ``fail`` to fail changing password
+ . NB, this may not be supported by all hypervisors. :since:`Since 0.9.3`
+
+ The ``defaultMode`` attribute sets the default channel security policy,
+ valid values are ``secure``, ``insecure`` and the default ``any`` (which
+ is secure if possible, but falls back to insecure rather than erroring out
+ if no secure path is available). :since:`Since 0.9.12`
+
+ When SPICE has both a normal and TLS secured TCP port configured, it can
+ be desirable to restrict what channels can be run on each port. This is
+ achieved by adding one or more ``<channel>`` elements inside the main
+ ``<graphics>`` element and setting the ``mode`` attribute to either
+ ``secure`` or ``insecure``. Setting the mode attribute overrides the
+ default value as set by the ``defaultMode`` attribute. (Note that
+ specifying ``any`` as mode discards the entry as the channel would inherit
+ the default mode anyways.) Valid channel names include ``main``,
+ ``display``, ``inputs``, ``cursor``, ``playback``, ``record`` (all
+ :since:` since 0.8.6` ); ``smartcard`` ( :since:`since 0.8.8` ); and
+ ``usbredir`` ( :since:`since 0.9.12` ).
+
+ ::
+
+ <graphics type='spice' port='-1' tlsPort='-1'
autoport='yes'>
+ <channel name='main' mode='secure'/>
+ <channel name='record' mode='insecure'/>
+ <image compression='auto_glz'/>
+ <streaming mode='filter'/>
+ <clipboard copypaste='no'/>
+ <mouse mode='client'/>
+ <filetransfer enable='no'/>
+ <gl enable='yes'
rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>
+ </graphics>
+
+ Spice supports variable compression settings for audio, images and
+ streaming. These settings are accessible via the ``compression`` attribute
+ in all following elements: ``image`` to set image compression (accepts
+ ``auto_glz``, ``auto_lz``, ``quic``, ``glz``, ``lz``, ``off``), ``jpeg``
+ for JPEG compression for images over wan (accepts ``auto``, ``never``,
+ ``always``), ``zlib`` for configuring wan image compression (accepts
+ ``auto``, ``never``, ``always``) and ``playback`` for enabling audio
+ stream compression (accepts ``on`` or ``off``). :since:`Since 0.9.1`
+
+ Streaming mode is set by the ``streaming`` element, settings its ``mode``
+ attribute to one of ``filter``, ``all`` or ``off``. :since:`Since 0.9.2`
+
+ Copy & Paste functionality (via Spice agent) is set by the ``clipboard``
+ element. It is enabled by default, and can be disabled by setting the
+ ``copypaste`` property to ``no``. :since:`Since 0.9.3`
+
+ Mouse mode is set by the ``mouse`` element, setting its ``mode`` attribute
+ to one of ``server`` or ``client``. If no mode is specified, the qemu
+ default will be used (client mode). :since:`Since 0.9.11`
+
+ File transfer functionality (via Spice agent) is set using the
+ ``filetransfer`` element. It is enabled by default, and can be disabled by
+ setting the ``enable`` property to ``no``. :since:`Since 1.2.2`
+
+ Spice may provide accelerated server-side rendering with OpenGL. You can
+ enable or disable OpenGL support explicitly with the ``gl`` element, by
+ setting the ``enable`` property. (QEMU only, :since:`since 1.3.3` ). Note
+ that this only works locally, since this requires usage of UNIX sockets,
+ i.e. using ``listen`` types 'socket' or 'none'. For accelerated
OpenGL
+ with remote support, consider pairing this element with type
+ ``egl-headless`` (see below). However, this will deliver weaker
+ performance compared to native Spice OpenGL support.
+
+ By default, QEMU will pick the first available GPU DRM render node. You
+ may specify a DRM render node path to use instead. (QEMU only,
+ :since:`since 3.1.0` ).
+
+ ``rdp``
+ Starts a RDP server. The ``port`` attribute specifies the TCP port number
+ (with -1 as legacy syntax indicating that it should be auto-allocated).
+ The ``autoport`` attribute is the new preferred syntax for indicating
+ auto-allocation of the TCP port to use. In the VirtualBox driver, the
+ ``autoport`` will make the hypervisor pick available port from 3389-3689
+ range when the VM is started. The chosen port will be reflected in the
+ ``port`` attribute. The ``multiUser`` attribute is a boolean deciding
+ whether multiple simultaneous connections to the VM are permitted. The
+ ``replaceUser`` attribute is a boolean deciding whether the existing
+ connection must be dropped and a new connection must be established by the
+ VRDP server, when a new client connects in single connection mode.
+
+ ``desktop``
+ This value is reserved for VirtualBox domains for the moment. It displays
+ a window on the host desktop, similarly to "sdl", but using the
VirtualBox
+ viewer. Just like "sdl", it accepts the optional attributes ``display``
+ and ``fullscreen``.
+
+ ``egl-headless`` :since:`Since 4.6.0`
+ This display type provides support for an OpenGL accelerated display
+ accessible both locally and remotely (for comparison, Spice's native
+ OpenGL support only works locally using UNIX sockets at the moment, but
+ has better performance). Since this display type doesn't provide any
+ window or graphical console like the other types, for practical reasons it
+ should be paired with either ``vnc`` or ``spice`` graphics types. This
+ display type is only supported by QEMU domains (needs QEMU :since:`2.10`
+ or newer). :since:`5.0.0` this element accepts a ``<gl/>`` sub-element
+ with an optional attribute ``rendernode`` which can be used to specify an
+ absolute path to a host's DRI device to be used for OpenGL rendering.
+
+ ::
+
+ <graphics type='spice' autoport='yes'/>
+ <graphics type='egl-headless'>
+ <gl rendernode='/dev/dri/renderD128'/>
+ </graphics>
+
+Graphics device uses a ``<listen>`` to set up where the device should listen for
+clients. It has a mandatory attribute ``type`` which specifies the listen type.
+Only ``vnc``, ``spice`` and ``rdp`` supports ``<listen>`` element. :since:`Since
+0.9.4` . Available types are:
+
+``address``
+ Tells a graphics device to use an address specified in the ``address``
+ attribute, which will contain either an IP address or hostname (which will be
+ resolved to an IP address via a DNS query) to listen on.
+
+ It is possible to omit the ``address`` attribute in order to use an address
+ from config files :since:`Since 1.3.5` .
+
+ The ``address`` attribute is duplicated as ``listen`` attribute in
+ ``graphics`` element for backward compatibility. If both are provided they
+ must be equal.
+
+``network``
+ This is used to specify an existing network in the ``network`` attribute from
+ libvirt's list of configured networks. The named network configuration will
+ be examined to determine an appropriate listen address and the address will
+ be stored in live XML in ``address`` attribute. For example, if the network
+ has an IPv4 address in its configuration (e.g. if it has a forward type of
+ ``route``, ``nat``, or no forward type (isolated)), the first IPv4 address
+ listed in the network's configuration will be used. If the network is
+ describing a host bridge, the first IPv4 address associated with that bridge
+ device will be used, and if the network is describing one of the 'direct'
+ (macvtap) modes, the first IPv4 address of the first forward dev will be
+ used.
+
+``socket`` :since:`since 2.0.0 (QEMU only)`
+ This listen type tells a graphics server to listen on unix socket. Attribute
+ ``socket`` contains a path to unix socket. If this attribute is omitted
+ libvirt will generate this path for you. Supported by graphics type ``vnc``
+ and ``spice``.
+
+ For ``vnc`` graphics be backward compatible the ``socket`` attribute of first
+ ``listen`` element is duplicated as ``socket`` attribute in ``graphics``
+ element. If ``graphics`` element contains a ``socket`` attribute all
+ ``listen`` elements are ignored.
+
+``none`` :since:`since 2.0.0 (QEMU only)`
+ This listen type doesn't have any other attribute. Libvirt supports passing a
+ file descriptor through our APIs virDomainOpenGraphics() and
+ virDomainOpenGraphicsFD(). No other listen types are allowed if this one is
+ used and the graphics device doesn't listen anywhere. You need to use one of
+ the two APIs to pass a FD to QEMU in order to connect to this graphics
+ device. Supported by graphics type ``vnc`` and ``spice``.
+
+:anchor:`<a id="elementsVideo"/>`
+
+Video devices
+~~~~~~~~~~~~~
+
+A video device.
+
+::
+
+ ...
+ <devices>
+ <video>
+ <model type='vga' vram='16384' heads='1'>
+ <acceleration accel3d='yes' accel2d='yes'/>
+ </model>
+ <driver name='qemu'/>
+ </video>
+ </devices>
+ ...
+
+``video``
+ The ``video`` element is the container for describing video devices. For
+ backwards compatibility, if no ``video`` is set but there is a ``graphics``
+ in domain xml, then libvirt will add a default ``video`` according to the
+ guest type.
+
+ For a guest of type "kvm", the default ``video`` is: ``type`` with value
+ "cirrus", ``vram`` with value "16384" and ``heads`` with value
"1". By
+ default, the first video device in domain xml is the primary one, but the
+ optional attribute ``primary`` ( :since:`since 1.0.2` ) with value 'yes' can
+ be used to mark the primary in cases of multiple video device. The
+ non-primary must be type of "qxl" or ( :since:`since 2.4.0` )
"virtio".
+
+``model``
+ The ``model`` element has a mandatory ``type`` attribute which takes the
+ value "vga", "cirrus", "vmvga", "xen",
"vbox", "qxl" ( :since:`since 0.8.6`
+ ), "virtio" ( :since:`since 1.3.0` ), "gop" ( :since:`since 3.2.0`
), "bochs"
+ ( :since:`since 5.6.0` ), "ramfb" ( :since:`since 5.9.0` ), or
"none" (
+ :since:`since 4.6.0` , depending on the hypervisor features available. The
+ purpose of the type ``none`` is to instruct libvirt not to add a default
+ video device in the guest (see the paragraph above). This legacy behaviour
+ can be inconvenient in cases where GPU mediated devices are meant to be the
+ only rendering device within a guest and so specifying another ``video``
+ device along with type ``none``. Refer to Host device assignment to see how
+ to add a mediated device into a guest.
+
+ You can provide the amount of video memory in kibibytes (blocks of 1024
+ bytes) using ``vram``. This is supported only for guest type of "vz",
"qemu",
+ "vbox", "vmx" and "xen". If no value is provided the
default is used. If the
+ size is not a power of two it will be rounded to closest one.
+
+ The number of screen can be set using ``heads``. This is supported only for
+ guests type of "vz", "kvm", "vbox" and "vmx".
+
+ For guest type of "kvm" or "qemu" and model type "qxl"
there are optional
+ attributes. Attribute ``ram`` ( :since:` since 1.0.2` ) specifies the size of
+ the primary bar, while the attribute ``vram`` specifies the secondary bar
+ size. If ``ram`` or ``vram`` are not supplied a default value is used. The
+ ``ram`` should also be rounded to power of two as ``vram``. There is also
+ optional attribute ``vgamem`` ( :since:`since 1.2.11` ) to set the size of
+ VGA framebuffer for fallback mode of QXL device. Attribute ``vram64`` (
+ :since:`since 1.3.3` ) extends secondary bar and makes it addressable as
+ 64bit memory.
+
+ :since:`Since 5.9.0` , the ``model`` element may also have an optional
+ ``resolution`` sub-element. The ``resolution`` element has attributes ``x``
+ and ``y`` to set the minimum resolution for the video device. This
+ sub-element is valid for model types "vga", "qxl",
"bochs", and "virtio".
+
+``acceleration``
+ Configure if video acceleration should be enabled.
+
+ ``accel2d``
+ Enable 2D acceleration (for vbox driver only, :since:`since 0.7.1` )
+ ``accel3d``
+ Enable 3D acceleration (for vbox driver :since:`since 0.7.1` , qemu driver
+ :since:`since 1.3.0` )
+ ``rendernode``
+ Absolute path to a host's DRI device to be used for rendering (for
+ 'vhostuser' driver only, :since:`since 5.8.0` ). If none is specified,
+ libvirt will pick one available.
+
+``address``
+ The optional ``address`` sub-element can be used to tie the video device to a
+ particular PCI slot. On S390, ``address`` can be used to provide the CCW
+ address for the video device ( :since:` since 4.2.0` ).
+``driver``
+ The subelement ``driver`` can be used to tune the device:
+
+ ``name``
+ Specify the backend driver to use, either "qemu" or "vhostuser"
depending
+ on the hypervisor features available ( :since:`since 5.8.0` ). "qemu" is
+ the default QEMU backend. "vhostuser" will use a separate vhost-user
+ process backend (for ``virtio`` device).
+ virtio options
+ `Virtio-specific options <#elementsVirtio>`__ can also be set (
+ :since:`Since 3.5.0` )
+ VGA configuration
+ Control how the video devices exposed to the guest using the ``vgaconf``
+ attribute which takes the value "io", "on" or "off".
At present, it's only
+ applicable to the bhyve's "gop" video model type ( :since:`Since
3.5.0` )
+
+:anchor:`<a id="elementsConsole"/>`
+
+Consoles, serial, parallel & channel devices
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A character device provides a way to interact with the virtual machine.
+Paravirtualized consoles, serial ports, parallel ports and channels are all
+classed as character devices and so represented using the same syntax.
+
+::
+
+ ...
+ <devices>
+ <parallel type='pty'>
+ <source path='/dev/pts/2'/>
+ <target port='0'/>
+ </parallel>
+ <serial type='pty'>
+ <source path='/dev/pts/3'/>
+ <target port='0'/>
+ </serial>
+ <serial type='file'>
+ <source path='/tmp/file' append='on'>
+ <seclabel model='dac' relabel='no'/>
+ </source>
+ <target port='0'/>
+ </serial>
+ <console type='pty'>
+ <source path='/dev/pts/4'/>
+ <target port='0'/>
+ </console>
+ <channel type='unix'>
+ <source mode='bind' path='/tmp/guestfwd'/>
+ <target type='guestfwd' address='10.0.2.1'
port='4600'/>
+ </channel>
+ </devices>
+ ...
+
+In each of these directives, the top-level element name (parallel, serial,
+console, channel) describes how the device is presented to the guest. The guest
+interface is configured by the ``target`` element.
+
+The interface presented to the host is given in the ``type`` attribute of the
+top-level element. The host interface is configured by the ``source`` element.
+
+The ``source`` element may contain an optional ``seclabel`` to override the way
+that labelling is done on the socket path. If this element is not present, the
+`security label is inherited from the per-domain setting <#seclabel>`__.
+
+If the interface ``type`` presented to the host is "file", then the ``source``
+element may contain an optional attribute ``append`` that specifies whether or
+not the information in the file should be preserved on domain restart. Allowed
+values are "on" and "off" (default). :since:`Since 1.3.1` .
+
+Regardless of the ``type``, character devices can have an optional log file
+associated with them. This is expressed via a ``log`` sub-element, with a
+``file`` attribute. There can also be an ``append`` attribute which takes the
+same values described above. :since:`Since 1.3.3` .
+
+::
+
+ ...
+ <log file="/var/log/libvirt/qemu/guestname-serial0.log"
append="off"/>
+ ...
+
+Each character device element has an optional sub-element ``<address>`` which
+can tie the device to a particular `controller <#elementsControllers>`__ or PCI
+slot.
+
+For character device with type ``unix`` or ``tcp`` the ``source`` has an
+optional element ``reconnect`` which configures reconnect timeout if the
+connection is lost. There are two attributes, ``enabled`` where possible values
+are "yes" and "no" and ``timeout`` which is in seconds. The
``reconnect``
+attribute is valid only for ``connect`` mode. :since:`Since 3.7.0 (QEMU driver
+only)` .
+
+:anchor:`<a id="elementsCharGuestInterface"/>`
+
+Guest interface
+^^^^^^^^^^^^^^^
+
+A character device presents itself to the guest as one of the following types.
+
+:anchor:`<a id="elementCharParallel"/>`
+
+Parallel port
+'''''''''''''
+
+::
+
+ ...
+ <devices>
+ <parallel type='pty'>
+ <source path='/dev/pts/2'/>
+ <target port='0'/>
+ </parallel>
+ </devices>
+ ...
+
+``target`` can have a ``port`` attribute, which specifies the port number. Ports
+are numbered starting from 0. There are usually 0, 1 or 2 parallel ports.
+
+:anchor:`<a id="elementCharSerial"/>`
+
+Serial port
+'''''''''''
+
+::
+
+ ...
+ <devices>
+ <!-- Serial port -->
+ <serial type='pty'>
+ <source path='/dev/pts/3'/>
+ <target port='0'/>
+ </serial>
+ </devices>
+ ...
+
+::
+
+ ...
+ <devices>
+ <!-- USB serial port -->
+ <serial type='pty'>
+ <target type='usb-serial' port='0'>
+ <model name='usb-serial'/>
+ </target>
+ <address type='usb' bus='0' port='1'/>
+ </serial>
+ </devices>
+ ...
+
+The ``target`` element can have an optional ``port`` attribute, which specifies
+the port number (starting from 0), and an optional ``type`` attribute: valid
+values are, :since:`since 1.0.2` , ``isa-serial`` (usable with x86 guests),
+``usb-serial`` (usable whenever USB support is available) and ``pci-serial``
+(usable whenever PCI support is available); :since:`since 3.10.0` ,
+``spapr-vio-serial`` (usable with ppc64/pseries guests), ``system-serial``
+(usable with aarch64/virt and, :since:`since 4.7.0` , riscv/virt guests) and
+``sclp-serial`` (usable with s390 and s390x guests) are available as well.
+
+:since:`Since 3.10.0` , the ``target`` element can have an optional ``model``
+subelement; valid values for its ``name`` attribute are: ``isa-serial`` (usable
+with the ``isa-serial`` target type); ``usb-serial`` (usable with the
+``usb-serial`` target type); ``pci-serial`` (usable with the ``pci-serial``
+target type); ``spapr-vty`` (usable with the ``spapr-vio-serial`` target type);
+``pl011`` and, :since:`since 4.7.0` , ``16550a`` (usable with the
+``system-serial`` target type); ``sclpconsole`` and ``sclplmconsole`` (usable
+with the ``sclp-serial`` target type). Providing a target model is usually
+unnecessary: libvirt will automatically pick one that's suitable for the chosen
+target type, and overriding that value is generally not recommended.
+
+If any of the attributes is not specified by the user, libvirt will choose a
+value suitable for most users.
+
+Most target types support configuring the guest-visible device address as
+`documented above <#elementsAddress>`__; more specifically, acceptable address
+types are ``isa`` (for ``isa-serial``), ``usb`` (for ``usb-serial``), ``pci``
+(for ``pci-serial``) and ``spapr-vio`` (for ``spapr-vio-serial``). The
+``system-serial`` and ``sclp-serial`` target types don't support specifying an
+address.
+
+For the relationship between serial ports and consoles, `see
+below <#elementCharSerialAndConsole>`__.
+
+:anchor:`<a id="elementCharConsole"/>`
+
+Console
+'''''''
+
+::
+
+ ...
+ <devices>
+ <!-- Serial console -->
+ <console type='pty'>
+ <source path='/dev/pts/2'/>
+ <target type='serial' port='0'/>
+ </console>
+ </devices>
+ ...
+
+::
+
+ ...
+ <devices>
+ <!-- KVM virtio console -->
+ <console type='pty'>
+ <source path='/dev/pts/5'/>
+ <target type='virtio' port='0'/>
+ </console>
+ </devices>
+ ...
+
+The ``console`` element is used to represent interactive serial consoles.
+Depending on the type of guest in use and the specifics of the configuration,
+the ``console`` element might represent the same device as an existing
+``serial`` element or a separate device.
+
+A ``target`` subelement is supported and works the same way as with the
+``serial`` element (`see above <#elementCharSerial>`__ for details). Valid
+values for the ``type`` attribute are: ``serial`` (described below); ``virtio``
+(usable whenever VirtIO support is available); ``xen``, ``lxc`` and ``openvz``
+(available when the corresponding hypervisor is in use). ``sclp`` and ``sclplm``
+(usable for s390 and s390x QEMU guests) are supported for compatibility reasons
+but should not be used for new guests: use the ``sclpconsole`` and
+``sclplmconsole`` target models, respectively, with the ``serial`` element
+instead.
+
+Of the target types listed above, ``serial`` is special in that it doesn't
+represents a separate device, but rather the same device as the first ``serial``
+element. Due to this, there can only be a single ``console`` element with target
+type ``serial`` per guest.
+
+Virtio consoles are usually accessible as ``/dev/hvc[0-7]`` from inside the
+guest; for more information, see
+http://fedoraproject.org/wiki/Features/VirtioSerial. :since:`Since 0.8.3`
+
+For the relationship between serial ports and consoles, `see
+below <#elementCharSerialAndConsole>`__.
+
+:anchor:`<a id="elementCharSerialAndConsole"/>`
+
+Relationship between serial ports and consoles
+''''''''''''''''''''''''''''''''''''''''''''''
+
+Due to hystorical reasons, the ``serial`` and ``console`` elements have
+partially overlapping scopes.
+
+In general, both elements are used to configure one or more serial consoles to
+be used for interacting with the guest. The main difference between the two is
+that ``serial`` is used for emulated, usually native, serial consoles, whereas
+``console`` is used for paravirtualized ones.
+
+Both emulated and paravirtualized serial consoles have advantages and
+disadvantages:
+
+- emulated serial consoles are usually initialized much earlier than
+ paravirtualized ones, so they can be used to control the bootloader and
+ display both firmware and early boot messages;
+- on several platforms, there can only be a single emulated serial console per
+ guest but paravirtualized consoles don't suffer from the same limitation.
+
+A configuration such as:
+
+::
+
+ ...
+ <devices>
+ <console type='pty'>
+ <target type='serial'/>
+ </console>
+ <console type='pty'>
+ <target type='virtio'/>
+ </console>
+ </devices>
+ ...
+
+will work on any platform and will result in one emulated serial console for
+early boot logging / interactive / recovery use, and one paravirtualized serial
+console to be used eg. as a side channel. Most people will be fine with having
+just the first ``console`` element in their configuration, but if a specific
+configuration is desired then both elements should be specified.
+
+Note that, due to the compatibility concerns mentioned earlier, all the
+following configurations:
+
+::
+
+ ...
+ <devices>
+ <serial type='pty'/>
+ </devices>
+ ...
+
+::
+
+ ...
+ <devices>
+ <console type='pty'/>
+ </devices>
+ ...
+
+::
+
+ ...
+ <devices>
+ <serial type='pty'/>
+ <console type='pty'/>
+ </devices>
+ ...
+
+will be treated the same and will result in a single emulated serial console
+being available to the guest.
+
+:anchor:`<a id="elementCharChannel"/>`
+
+Channel
+'''''''
+
+This represents a private communication channel between the host and the guest.
+
+::
+
+ ...
+ <devices>
+ <channel type='unix'>
+ <source mode='bind' path='/tmp/guestfwd'/>
+ <target type='guestfwd' address='10.0.2.1'
port='4600'/>
+ </channel>
+
+ <!-- KVM virtio channel -->
+ <channel type='pty'>
+ <target type='virtio'
name='arbitrary.virtio.serial.port.name'/>
+ </channel>
+ <channel type='unix'>
+ <source mode='bind'
path='/var/lib/libvirt/qemu/f16x86_64.agent'/>
+ <target type='virtio' name='org.qemu.guest_agent.0'
state='connected'/>
+ </channel>
+ <channel type='spicevmc'>
+ <target type='virtio' name='com.redhat.spice.0'/>
+ </channel>
+ </devices>
+ ...
+
+This can be implemented in a variety of ways. The specific type of channel is
+given in the ``type`` attribute of the ``target`` element. Different channel
+types have different ``target`` attributes.
+
+``guestfwd``
+ TCP traffic sent by the guest to a given IP address and port is forwarded to
+ the channel device on the host. The ``target`` element must have ``address``
+ and ``port`` attributes. :since:`Since 0.7.3`
+``virtio``
+ Paravirtualized virtio channel. Channel is exposed in the guest under
+ /dev/vport*, and if the optional element ``name`` is specified,
+ /dev/virtio-ports/$name (for more info, please see
+
http://fedoraproject.org/wiki/Features/VirtioSerial). The optional element
+ ``address`` can tie the channel to a particular ``type='virtio-serial'``
+ controller, `documented above <#elementsAddress>`__. With qemu, if ``name``
+ is "org.qemu.guest_agent.0", then libvirt can interact with a guest agent
+ installed in the guest, for actions such as guest shutdown or file system
+ quiescing. :since:`Since 0.7.7, guest agent interaction since 0.9.10`
+ Moreover, :since:`since 1.0.6` it is possible to have source path auto
+ generated for virtio unix channels. This is very useful in case of a qemu
+ guest agent, where users don't usually care about the source path since it's
+ libvirt who talks to the guest agent. In case users want to utilize this
+ feature, they should leave ``<source>`` element out. :since:`Since 1.2.11`
+ the active XML for a virtio channel may contain an optional ``state``
+ attribute that reflects whether a process in the guest is active on the
+ channel. This is an output-only attribute. Possible values for the ``state``
+ attribute are ``connected`` and ``disconnected``.
+``xen``
+ Paravirtualized Xen channel. Channel is exposed in the guest as a Xen console
+ but identified with a name. Setup and consumption of a Xen channel depends on
+ software and configuration in the guest (for more info, please see
+
http://xenbits.xen.org/docs/unstable/misc/channel.txt). Channel source path
+ semantics are the same as the virtio target type. The ``state`` attribute is
+ not supported since Xen channels lack the necessary probing mechanism.
+ :since:`Since 2.3.0`
+``spicevmc``
+ Paravirtualized SPICE channel. The domain must also have a SPICE server as a
+ `graphics device <#elementsGraphics>`__, at which point the host piggy-backs
+ messages across the ``main`` channel. The ``target`` element must be present,
+ with attribute ``type='virtio'``; an optional attribute ``name`` controls how
+ the guest will have access to the channel, and defaults to
+ ``name='com.redhat.spice.0'``. The optional ``address`` element can tie the
+ channel to a particular ``type='virtio-serial'`` controller. :since:`Since
+ 0.8.8`
+
+:anchor:`<a id="elementsCharHostInterface"/>`
+
+Host interface
+^^^^^^^^^^^^^^
+
+A character device presents itself to the host as one of the following types.
+
+:anchor:`<a id="elementsCharSTDIO"/>`
+
+Domain logfile
+''''''''''''''
+
+This disables all input on the character device, and sends output into the
+virtual machine's logfile
+
+::
+
+ ...
+ <devices>
+ <console type='stdio'>
+ <target port='1'/>
+ </console>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsCharFle"/>`
+
+Device logfile
+''''''''''''''
+
+A file is opened and all data sent to the character device is written to the
+file.
+
+::
+
+ ...
+ <devices>
+ <serial type="file">
+ <source path="/var/log/vm/vm-serial.log"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsCharVC"/>`
+
+Virtual console
+'''''''''''''''
+
+Connects the character device to the graphical framebuffer in a virtual console.
+This is typically accessed via a special hotkey sequence such as "ctrl+alt+3"
+
+::
+
+ ...
+ <devices>
+ <serial type='vc'>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsCharNull"/>`
+
+Null device
+'''''''''''
+
+Connects the character device to the void. No data is ever provided to the
+input. All data written is discarded.
+
+::
+
+ ...
+ <devices>
+ <serial type='null'>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsCharPTY"/>`
+
+Pseudo TTY
+''''''''''
+
+A Pseudo TTY is allocated using /dev/ptmx. A suitable client such as 'virsh
+console' can connect to interact with the serial port locally.
+
+::
+
+ ...
+ <devices>
+ <serial type="pty">
+ <source path="/dev/pts/3"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+NB special case if <console type='pty'>, then the TTY path is also
duplicated as
+an attribute tty='/dev/pts/3' on the top level <console> tag. This
provides
+compat with existing syntax for <console> tags.
+
+:anchor:`<a id="elementsCharHost"/>`
+
+Host device proxy
+'''''''''''''''''
+
+The character device is passed through to the underlying physical character
+device. The device types must match, eg the emulated serial port should only be
+connected to a host serial port - don't connect a serial port to a parallel
+port.
+
+::
+
+ ...
+ <devices>
+ <serial type="dev">
+ <source path="/dev/ttyS0"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsCharPipe"/>`
+
+Named pipe
+''''''''''
+
+The character device writes output to a named pipe. See pipe(7) for more info.
+
+::
+
+ ...
+ <devices>
+ <serial type="pipe">
+ <source path="/tmp/mypipe"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsCharTCP"/>`
+
+TCP client/server
+'''''''''''''''''
+
+The character device acts as a TCP client connecting to a remote server.
+
+::
+
+ ...
+ <devices>
+ <serial type="tcp">
+ <source mode="connect" host="0.0.0.0"
service="2445"/>
+ <protocol type="raw"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+Or as a TCP server waiting for a client connection.
+
+::
+
+ ...
+ <devices>
+ <serial type="tcp">
+ <source mode="bind" host="127.0.0.1"
service="2445"/>
+ <protocol type="raw"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+Alternatively you can use ``telnet`` instead of ``raw`` TCP in order to utilize
+the telnet protocol for the connection.
+
+:since:`Since 0.8.5,` some hypervisors support use of either ``telnets`` (secure
+telnet) or ``tls`` (via secure sockets layer) as the transport protocol for
+connections.
+
+::
+
+ ...
+ <devices>
+ <serial type="tcp">
+ <source mode="connect" host="0.0.0.0"
service="2445"/>
+ <protocol type="telnet"/>
+ <target port="1"/>
+ </serial>
+ ...
+ <serial type="tcp">
+ <source mode="bind" host="127.0.0.1"
service="2445"/>
+ <protocol type="telnet"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+:since:`Since 2.4.0,` the optional attribute ``tls`` can be used to control
+whether a chardev TCP communication channel would utilize a hypervisor
+configured TLS X.509 certificate environment in order to encrypt the data
+channel. For the QEMU hypervisor, usage of a TLS environment can be controlled
+on the host by the ``chardev_tls`` and ``chardev_tls_x509_cert_dir`` or
+``default_tls_x509_cert_dir`` settings in the file /etc/libvirt/qemu.conf. If
+``chardev_tls`` is enabled, then unless the ``tls`` attribute is set to "no",
+libvirt will use the host configured TLS environment. If ``chardev_tls`` is
+disabled, but the ``tls`` attribute is set to "yes", then libvirt will attempt
+to use the host TLS environment if either the ``chardev_tls_x509_cert_dir`` or
+``default_tls_x509_cert_dir`` TLS directory structure exists.
+
+::
+
+ ...
+ <devices>
+ <serial type="tcp">
+ <source mode='connect' host="127.0.0.1"
service="5555" tls="yes"/>
+ <protocol type="raw"/>
+ <target port="0"/>
+ </serial>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsCharUDP"/>`
+
+UDP network console
+'''''''''''''''''''
+
+The character device acts as a UDP netconsole service, sending and receiving
+packets. This is a lossy service.
+
+::
+
+ ...
+ <devices>
+ <serial type="udp">
+ <source mode="bind" host="0.0.0.0"
service="2445"/>
+ <source mode="connect" host="0.0.0.0"
service="2445"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsCharUNIX"/>`
+
+UNIX domain socket client/server
+''''''''''''''''''''''''''''''''
+
+The character device acts as a UNIX domain socket server, accepting connections
+from local clients.
+
+::
+
+ ...
+ <devices>
+ <serial type="unix">
+ <source mode="bind" path="/tmp/foo"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsCharSpiceport"/>`
+
+Spice channel
+'''''''''''''
+
+The character device is accessible through spice connection under a channel name
+specified in the ``channel`` attribute. :since:`Since 1.2.2`
+
+Note: depending on the hypervisor, spiceports might (or might not) be enabled on
+domains with or without `spice graphics <#elementsGraphics>`__.
+
+::
+
+ ...
+ <devices>
+ <serial type="spiceport">
+ <source channel="org.qemu.console.serial.0"/>
+ <target port="1"/>
+ </serial>
+ </devices>
+ ...
+
+:anchor:`<a id="elementsNmdm"/>`
+
+Nmdm device
+'''''''''''
+
+The nmdm device driver, available on FreeBSD, provides two tty devices connected
+together by a virtual null modem cable. :since:`Since 1.2.4`
+
+::
+
+ ...
+ <devices>
+ <serial type="nmdm">
+ <source master="/dev/nmdm0A" slave="/dev/nmdm0B"/>
+ </serial>
+ </devices>
+ ...
+
+The ``source`` element has these attributes:
+
+``master``
+ Master device of the pair, that is passed to the hypervisor. Device is
+ specified by a fully qualified path.
+``slave``
+ Slave device of the pair, that is passed to the clients for connection to the
+ guest console. Device is specified by a fully qualified path.
+
+:anchor:`<a id="elementsSound"/>`
+
+Sound devices
+~~~~~~~~~~~~~
+
+A virtual sound card can be attached to the host via the ``sound`` element.
+:since:`Since 0.4.3`
+
+::
+
+ ...
+ <devices>
+ <sound model='es1370'/>
+ </devices>
+ ...
+
+``sound``
+ The ``sound`` element has one mandatory attribute, ``model``, which specifies
+ what real sound device is emulated. Valid values are specific to the
+ underlying hypervisor, though typical choices are 'es1370', 'sb16',
'ac97',
+ 'ich6' and 'usb'. ( :since:` 'ac97' only since 0.6.0,
'ich6' only since
+ 0.8.8, 'usb' only since 1.2.7` )
+
+:since:`Since 0.9.13` , a sound element with ``ich6`` model can have optional
+sub-elements ``<codec>`` to attach various audio codecs to the audio device. If
+not specified, a default codec will be attached to allow playback and recording.
+
+Valid values are:
+
+- 'duplex' - advertise a line-in and a line-out
+- 'micro' - advertise a speaker and a microphone
+- 'output' - advertise a line-out :since:`Since 4.4.0`
+
+::
+
+ ...
+ <devices>
+ <sound model='ich6'>
+ <codec type='micro'/>
+ </sound>
+ </devices>
+ ...
+
+Each ``sound`` element has an optional sub-element ``<address>`` which can tie
+the device to a particular PCI slot, `documented above <#elementsAddress>`__.
+
+:anchor:`<a id="elementsWatchdog"/>`
+
+Watchdog device
+~~~~~~~~~~~~~~~
+
+A virtual hardware watchdog device can be added to the guest via the
+``watchdog`` element. :since:`Since 0.7.3, QEMU and KVM only`
+
+The watchdog device requires an additional driver and management daemon in the
+guest. Just enabling the watchdog in the libvirt configuration does not do
+anything useful on its own.
+
+Currently libvirt does not support notification when the watchdog fires. This
+feature is planned for a future version of libvirt.
+
+::
+
+ ...
+ <devices>
+ <watchdog model='i6300esb'/>
+ </devices>
+ ...
+
+::
+
+ ...
+ <devices>
+ <watchdog model='i6300esb' action='poweroff'/>
+ </devices>
+ </domain>
+
+``model``
+ The required ``model`` attribute specifies what real watchdog device is
+ emulated. Valid values are specific to the underlying hypervisor.
+
+ QEMU and KVM support:
+
+ - 'i6300esb' - the recommended device, emulating a PCI Intel 6300ESB
+ - 'ib700' - emulating an ISA iBase IB700
+ - 'diag288' - emulating an S390 DIAG288 device :since:`Since 1.2.17`
+
+``action``
+ The optional ``action`` attribute describes what action to take when the
+ watchdog expires. Valid values are specific to the underlying hypervisor.
+
+ QEMU and KVM support:
+
+ - 'reset' - default, forcefully reset the guest
+ - 'shutdown' - gracefully shutdown the guest (not recommended)
+ - 'poweroff' - forcefully power off the guest
+ - 'pause' - pause the guest
+ - 'none' - do nothing
+ - 'dump' - automatically dump the guest :since:`Since 0.8.7`
+ - 'inject-nmi' - inject a non-maskable interrupt into the guest
+ :since:`Since 1.2.17`
+
+ Note 1: the 'shutdown' action requires that the guest is responsive to ACPI
+ signals. In the sort of situations where the watchdog has expired, guests are
+ usually unable to respond to ACPI signals. Therefore using 'shutdown' is not
+ recommended.
+
+ Note 2: the directory to save dump files can be configured by
+ ``auto_dump_path`` in file /etc/libvirt/qemu.conf.
+
+:anchor:`<a id="elementsMemBalloon"/>`
+
+Memory balloon device
+~~~~~~~~~~~~~~~~~~~~~
+
+A virtual memory balloon device is added to all Xen and KVM/QEMU guests. It will
+be seen as ``memballoon`` element. It will be automatically added when
+appropriate, so there is no need to explicitly add this element in the guest XML
+unless a specific PCI slot needs to be assigned. :since:`Since 0.8.3, Xen, QEMU
+and KVM only` Additionally, :since:`since 0.8.4` , if the memballoon device
+needs to be explicitly disabled, ``model='none'`` may be used.
+
+Example: automatically added device with KVM
+
+::
+
+ ...
+ <devices>
+ <memballoon model='virtio'/>
+ </devices>
+ ...
+
+Example: manually added device with static PCI slot 2 requested
+
+::
+
+ ...
+ <devices>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
+ <stats period='10'/>
+ <driver iommu='on' ats='on'/>
+ </memballoon>
+ </devices>
+ </domain>
+
+``model``
+ The required ``model`` attribute specifies what type of balloon device is
+ provided. Valid values are specific to the virtualization platform
+
+ - 'virtio' - default with QEMU/KVM
+ - 'virtio-transitional' :since:`Since 5.2.0`
+ - 'virtio-non-transitional' :since:`Since 5.2.0`
+ - 'xen' - default with Xen
+
+ See `Virtio transitional devices <#elementsVirtioTransitional>`__ for more
+ details.
+
+``autodeflate``
+ The optional ``autodeflate`` attribute allows to enable/disable (values
+ "on"/"off", respectively) the ability of the QEMU virtio memory
balloon to
+ release some memory at the last moment before a guest's process get killed by
+ Out of Memory killer. :since:`Since 1.3.1, QEMU and KVM only`
+
+``period``
+ The optional ``period`` allows the QEMU virtio memory balloon driver to
+ provide statistics through the ``virsh dommemstat [domain]``
+ command. By default, collection is not enabled. In order to enable, use the
+ ``virsh dommemstat [domain] --period [number]`` command or
+ ``virsh edit`` command to add the option to the XML definition. The
+ ``virsh dommemstat`` will accept the options ``--live``, ``--current``, or
+ ``--config``. If an option is not provided, the change for a running domain
+ will only be made to the active guest. If the QEMU driver is not at the right
+ revision, the attempt to set the period will fail. Large values (e.g. many
+ years) might be ignored. :since:`Since 1.1.1, requires QEMU 1.5`
+
+``driver``
+ For model ``virtio`` memballoon, `Virtio-specific
+ options <#elementsVirtio>`__ can also be set. ( :since:`Since 3.5.0` )
+
+:anchor:`<a id="elementsRng"/>`
+
+Random number generator device
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The virtual random number generator device allows the host to pass through
+entropy to guest operating systems. :since:`Since 1.0.3`
+
+Example: usage of the RNG device:
+
+::
+
+ ...
+ <devices>
+ <rng model='virtio'>
+ <rate period="2000" bytes="1234"/>
+ <backend model='random'>/dev/random</backend>
+ <!-- OR -->
+ <backend model='egd' type='udp'>
+ <source mode='bind' service='1234'/>
+ <source mode='connect' host='1.2.3.4'
service='1234'/>
+ </backend>
+ <!-- OR -->
+ <backend model='builtin'/>
+ </rng>
+ </devices>
+ ...
+
+``model``
+ The required ``model`` attribute specifies what type of RNG device is
+ provided. Valid values are specific to the virtualization platform:
+
+ - 'virtio' - supported by qemu and virtio-rng kernel module
+ - 'virtio-transitional' :since:`Since 5.2.0`
+ - 'virtio-non-transitional' :since:`Since 5.2.0`
+
+ See `Virtio transitional devices <#elementsVirtioTransitional>`__ for more
+ details.
+
+``rate``
+ The optional ``rate`` element allows limiting the rate at which entropy can
+ be consumed from the source. The mandatory attribute ``bytes`` specifies how
+ many bytes are permitted to be consumed per period. An optional ``period``
+ attribute specifies the duration of a period in milliseconds; if omitted, the
+ period is taken as 1000 milliseconds (1 second). :since:`Since 1.0.4`
+
+``backend``
+ The ``backend`` element specifies the source of entropy to be used for the
+ domain. The source model is configured using the ``model`` attribute.
+ Supported source models are:
+
+ ``random``
+ This backend type expects a non-blocking character device as input. The
+ file name is specified as contents of the ``backend`` element.
+ :since:`Since 1.3.4` any path is accepted. Before that ``/dev/random`` and
+ ``/dev/hwrng`` were the only accepted paths. When no file name is
+ specified, the hypervisor default is used. For QEMU, the default is
+ ``/dev/random``. However, the recommended source of entropy is
+ ``/dev/urandom`` (as it doesn't have the limitations of ``/dev/random``).
+
+ ``egd``
+ This backend connects to a source using the EGD protocol. The source is
+ specified as a character device. Refer to `character device host
+ interface <#elementsCharHostInterface>`__ for more information.
+
+ ``builtin``
+ This backend uses qemu builtin random generator, which uses
+ ``getrandom()`` syscall as the source of entropy. ( :since:`Since 6.1.0
+ and QEMU 4.2` )
+
+``driver``
+ The subelement ``driver`` can be used to tune the device:
+
+ virtio options
+ `Virtio-specific options <#elementsVirtio>`__ can also be set. (
+ :since:`Since 3.5.0` )
+
+:anchor:`<a id="elementsTpm"/>`
+
+TPM device
+~~~~~~~~~~
+
+The TPM device enables a QEMU guest to have access to TPM functionality. The TPM
+device may either be a TPM 1.2 or a TPM 2.0.
+
+The TPM passthrough device type provides access to the host's TPM for one QEMU
+guest. No other software may be using the TPM device, typically /dev/tpm0, at
+the time the QEMU guest is started. :since:`'passthrough' since 1.0.5`
+
+Example: usage of the TPM passthrough device
+
+::
+
+ ...
+ <devices>
+ <tpm model='tpm-tis'>
+ <backend type='passthrough'>
+ <device path='/dev/tpm0'/>
+ </backend>
+ </tpm>
+ </devices>
+ ...
+
+The emulator device type gives access to a TPM emulator providing TPM
+functionality for each VM. QEMU talks to it over a Unix socket. With the
+emulator device type each guest gets its own private TPM. :since:`'emulator'
+since 4.5.0` The state of the TPM emulator can be encrypted by providing an
+``encryption`` element. :since:`'encryption' since 5.6.0`
+
+Example: usage of the TPM Emulator
+
+::
+
+ ...
+ <devices>
+ <tpm model='tpm-tis'>
+ <backend type='emulator' version='2.0'>
+ <encryption secret='6dd3e4a5-1d76-44ce-961f-f119f5aad935'/>
+ </backend>
+ </tpm>
+ </devices>
+ ...
+
+``model``
+ The ``model`` attribute specifies what device model QEMU provides to the
+ guest. If no model name is provided, ``tpm-tis`` will automatically be chosen
+ for non-PPC64 architectures. :since:`Since 4.4.0` , another available choice
+ is the ``tpm-crb``, which should only be used when the backend device is a
+ TPM 2.0. :since:`Since 6.1.0` , pSeries guests on PPC64 are supported and the
+ default is ``tpm-spapr``. :since:`Since 6.5.0` , a new model called
+ ``spapr-tpm-proxy`` was added for pSeries guests. This model only works with
+ the ``passthrough`` backend. It creates a TPM Proxy device that communicates
+ with an existing TPM Resource Manager in the host, for example
+ ``/dev/tpmrm0``, enabling the guest to run in secure virtual machine mode
+ with the help of an Ultravisor. Adding a TPM Proxy to a pSeries guest brings
+ no security benefits unless the guest is running on a PPC64 host that has an
+ Ultravisor and a TPM Resource Manager. Only one TPM Proxy device is allowed
+ per guest, but a TPM Proxy device can be added together with other TPM
+ devices.
+
+``backend``
+ The ``backend`` element specifies the type of TPM device. The following types
+ are supported:
+
+ ``passthrough``
+ Use the host's TPM or TPM Resource Manager device.
+
+ This backend type requires exclusive access to a TPM device on the host.
+ An example for such a device is /dev/tpm0. The fully qualified file name
+ is specified by path attribute of the ``source`` element. If no file name
+ is specified then /dev/tpm0 is automatically used. :since:`Since 6.5.0` ,
+ when choosing the ``spapr-tpm-proxy`` model, the file name specified is
+ expected to be a TPM Resource Manager device, e.g. ``/dev/tpmrm0``.
+
+ ``emulator``
+ For this backend type the 'swtpm' TPM Emulator must be installed on the
+ host. Libvirt will automatically start an independent TPM emulator for
+ each QEMU guest requesting access to it.
+
+``version``
+ The ``version`` attribute indicates the version of the TPM. By default a TPM
+ 1.2 is created. This attribute only works with the ``emulator`` backend. The
+ following versions are supported:
+
+ - '1.2' : creates a TPM 1.2
+ - '2.0' : creates a TPM 2.0
+
+``encryption``
+ The ``encryption`` element allows the state of a TPM emulator to be
+ encrypted. The ``secret`` must reference a secret object that holds the
+ passphrase from which the encryption key will be derived.
+
+:anchor:`<a id="elementsNVRAM"/>`
+
+NVRAM device
+~~~~~~~~~~~~
+
+nvram device is always added to pSeries guest on PPC64, and its address is
+allowed to be changed. Element ``nvram`` (only valid for pSeries guest,
+:since:`since 1.0.5` ) is provided to enable the address setting.
+
+Example: usage of NVRAM configuration
+
+::
+
+ ...
+ <devices>
+ <nvram>
+ <address type='spapr-vio' reg='0x00003000'/>
+ </nvram>
+ </devices>
+ ...
+
+``spapr-vio``
+ VIO device address type, only valid for PPC64.
+
+``reg``
+ Device address
+
+:anchor:`<a id="elementsPanic"/>`
+
+panic device
+~~~~~~~~~~~~
+
+panic device enables libvirt to receive panic notification from a QEMU guest.
+:since:`Since 1.2.1, QEMU and KVM only`
+
+This feature is always enabled for:
+
+- pSeries guests, since it's implemented by the guest firmware
+- S390 guests, since it's an integral part of the S390 architecture
+
+For the guest types listed above, libvirt automatically adds a ``panic`` element
+to the domain XML.
+
+Example: usage of panic configuration
+
+::
+
+ ...
+ <devices>
+ <panic model='hyperv'/>
+ <panic model='isa'>
+ <address type='isa' iobase='0x505'/>
+ </panic>
+ </devices>
+ ...
+
+``model``
+ The optional ``model`` attribute specifies what type of panic device is
+ provided. The panic model used when this attribute is missing depends on the
+ hypervisor and guest arch.
+
+ - 'isa' - for ISA pvpanic device
+ - 'pseries' - default and valid only for pSeries guests.
+ - 'hyperv' - for Hyper-V crash CPU feature. :since:`Since 1.3.0, QEMU and
+ KVM only`
+ - 's390' - default for S390 guests. :since:`Since 1.3.5`
+
+``address``
+ address of panic. The default ioport is 0x505. Most users don't need to
+ specify an address, and doing so is forbidden altogether for s390, pseries
+ and hyperv models.
+
+:anchor:`<a id="elementsShmem"/>`
+
+Shared memory device
+~~~~~~~~~~~~~~~~~~~~
+
+A shared memory device allows to share a memory region between different virtual
+machines and the host. :since:`Since 1.2.10, QEMU and KVM only`
+
+::
+
+ ...
+ <devices>
+ <shmem name='my_shmem0'>
+ <model type='ivshmem-plain'/>
+ <size unit='M'>4</size>
+ </shmem>
+ <shmem name='shmem_server'>
+ <model type='ivshmem-doorbell'/>
+ <size unit='M'>2</size>
+ <server path='/tmp/socket-shmem'/>
+ <msi vectors='32' ioeventfd='on'/>
+ </shmem>
+ </devices>
+ ...
+
+``shmem``
+ The ``shmem`` element has one mandatory attribute, ``name`` to identify the
+ shared memory. This attribute cannot be directory specific to ``.`` or ``..``
+ as well as it cannot involve path separator ``/``.
+``model``
+ Attribute ``type`` of the optional element ``model`` specifies the model of
+ the underlying device providing the ``shmem`` device. The models currently
+ supported are ``ivshmem`` (supports both server and server-less shmem, but is
+ deprecated by newer QEMU in favour of the -plain and -doorbell variants),
+ ``ivshmem-plain`` (only for server-less shmem) and ``ivshmem-doorbell`` (only
+ for shmem with the server).
+``size``
+ The optional ``size`` element specifies the size of the shared memory. This
+ must be power of 2 and greater than or equal to 1 MiB.
+``server``
+ The optional ``server`` element can be used to configure a server socket the
+ device is supposed to connect to. The optional ``path`` attribute specifies
+ the absolute path to the unix socket and defaults to
+ ``/var/lib/libvirt/shmem/$shmem-$name-sock``.
+``msi``
+ The optional ``msi`` element enables/disables (values "on"/"off",
+ respectively) MSI interrupts. This option can currently be used only together
+ with the ``server`` element. The ``vectors`` attribute can be used to specify
+ the number of interrupt vectors. The ``ioeventd`` attribute enables/disables
+ (values "on"/"off", respectively) ioeventfd.
+
+:anchor:`<a id="elementsMemory"/>`
+
+Memory devices
+~~~~~~~~~~~~~~
+
+In addition to the initial memory assigned to the guest, memory devices allow
+additional memory to be assigned to the guest in the form of memory modules. A
+memory device can be hot-plugged or hot-unplugged depending on the guests'
+memory resource needs. Some hypervisors may require NUMA configured for the
+guest.
+
+Example: usage of the memory devices
+
+::
+
+ ...
+ <devices>
+ <memory model='dimm' access='private' discard='yes'>
+ <target>
+ <size unit='KiB'>524287</size>
+ <node>0</node>
+ </target>
+ </memory>
+ <memory model='dimm'>
+ <source>
+ <pagesize unit='KiB'>4096</pagesize>
+ <nodemask>1-3</nodemask>
+ </source>
+ <target>
+ <size unit='KiB'>524287</size>
+ <node>1</node>
+ </target>
+ </memory>
+ <memory model='nvdimm'>
+ <uuid>
+ <source>
+ <path>/tmp/nvdimm</path>
+ </source>
+ <target>
+ <size unit='KiB'>524288</size>
+ <node>1</node>
+ <label>
+ <size unit='KiB'>128</size>
+ </label>
+ <readonly/>
+ </target>
+ </memory>
+ <memory model='nvdimm' access='shared'>
+ <uuid>
+ <source>
+ <path>/dev/dax0.0</path>
+ <alignsize unit='KiB'>2048</alignsize>
+ <pmem/>
+ </source>
+ <target>
+ <size unit='KiB'>524288</size>
+ <node>1</node>
+ <label>
+ <size unit='KiB'>128</size>
+ </label>
+ </target>
+ </memory>
+ </devices>
+ ...
+
+``model``
+ Provide ``dimm`` to add a virtual DIMM module to the guest. :since:`Since
+ 1.2.14` Provide ``nvdimm`` model adds a Non-Volatile DIMM module.
+ :since:`Since 3.2.0`
+
+``access``
+ An optional attribute ``access`` ( :since:`since 3.2.0` ) that provides
+ capability to fine tune mapping of the memory on per module basis. Values are
+ the same as `Memory Backing <#elementsMemoryBacking>`__: ``shared`` and
+ ``private``. For ``nvdimm`` model, if using real NVDIMM DAX device as
+ backend, ``shared`` is required.
+
+``discard``
+ An optional attribute ``discard`` ( :since:`since 4.4.0` ) that provides
+ capability to fine tune discard of data on per module basis. Accepted values
+ are ``yes`` and ``no``. The feature is described here: `Memory
+ Backing <#elementsMemoryBacking>`__. This attribute is allowed only for
+ ``model='dimm'``.
+
+``uuid``
+ For pSeries guests, an uuid can be set to identify the nvdimm module. If
+ absent, libvirt will generate an uuid. automatically. This attribute is
+ allowed only for ``model='nvdimm'`` for pSeries guests. :since:`Since 6.2.0`
+
+``source``
+ For model ``dimm`` this element is optional and allows to fine tune the
+ source of the memory used for the given memory device. If the element is not
+ provided defaults configured via ``numatune`` are used. If ``dimm`` is
+ provided, then the following optional elements can be provided as well:
+
+ ``pagesize``
+ This element can be used to override the default host page size used for
+ backing the memory device. The configured value must correspond to a page
+ size supported by the host.
+
+ ``nodemask``
+ This element can be used to override the default set of NUMA nodes where
+ the memory would be allocated.
+
+ For model ``nvdimm`` this element is mandatory. The mandatory child element
+ ``path`` represents a path in the host that backs the nvdimm module in the
+ guest. The following optional elements may be used:
+
+ ``alignsize``
+ The ``alignsize`` element defines the page size alignment used to mmap the
+ address range for the backend ``path``. If not supplied the host page size
+ is used. For example, to mmap a real NVDIMM device a 2M-aligned page may
+ be required, and host page size is 4KB, then we need to set this element
+ to 2MB. :since:`Since 5.0.0`
+
+ ``pmem``
+ If persistent memory is supported and enabled by the hypervisor in order
+ to guarantee the persistence of writes to the vNVDIMM backend, then use
+ the ``pmem`` element in order to utilize the feature. :since:`Since 5.0.0`
+
+``target``
+ The mandatory ``target`` element configures the placement and sizing of the
+ added memory from the perspective of the guest.
+
+ The mandatory ``size`` subelement configures the size of the added memory as
+ a scaled integer.
+
+ The ``node`` subelement configures the guest NUMA node to attach the memory
+ to. The element shall be used only if the guest has NUMA nodes configured.
+
+ The following optional elements may be used:
+
+ ``label``
+ For NVDIMM type devices one can use ``label`` and its subelement ``size``
+ to configure the size of namespaces label storage within the NVDIMM
+ module. The ``size`` element has usual meaning described
+ `here <#elementsMemoryAllocation>`__. ``label`` is mandatory for pSeries
+ guests and optional for all other architectures. For QEMU domains the
+ following restrictions apply:
+
+ #. the minimum label size is 128KiB,
+ #. the remaining size (total-size - label-size) will be aligned to 4KiB as
+ default.
+
+ ``readonly``
+ The ``readonly`` element is used to mark the vNVDIMM as read-only. Only
+ the real NVDIMM device backend can guarantee the guest write persistence,
+ so other backend types should use the ``readonly`` element. :since:`Since
+ 5.0.0`
+
+:anchor:`<a id="elementsIommu"/>`
+
+IOMMU devices
+~~~~~~~~~~~~~
+
+The ``iommu`` element can be used to add an IOMMU device. :since:`Since 2.1.0`
+
+Example:
+
+::
+
+ ...
+ <devices>
+ <iommu model='intel'>
+ <driver intremap='on'/>
+ </iommu>
+ </devices>
+ ...
+
+``model``
+ Supported values are ``intel`` (for Q35 guests) and, :since:`since 5.5.0` ,
+ ``smmuv3`` (for ARM virt guests).
+
+``driver``
+ The ``driver`` subelement can be used to configure additional options, some
+ of which might only be available for certain IOMMU models:
+
+ ``intremap``
+ The ``intremap`` attribute with possible values ``on`` and ``off`` can be
+ used to turn on interrupt remapping, a part of the VT-d functionality.
+ Currently this requires split I/O APIC (``<ioapic
driver='qemu'/>``).
+ :since:`Since 3.4.0` (QEMU/KVM only)
+
+ ``caching_mode``
+ The ``caching_mode`` attribute with possible values ``on`` and ``off`` can
+ be used to turn on the VT-d caching mode (useful for assigned devices).
+ :since:`Since 3.4.0` (QEMU/KVM only)
+
+ ``eim``
+ The ``eim`` attribute (with possible values ``on`` and ``off``) can be
+ used to configure Extended Interrupt Mode. A q35 domain with split I/O
+ APIC (as described in `hypervisor features <#elementsFeatures>`__), and
+ both interrupt remapping and EIM turned on for the IOMMU, will be able to
+ use more than 255 vCPUs. :since:`Since 3.4.0` (QEMU/KVM only)
+
+ ``iotlb``
+ The ``iotlb`` attribute with possible values ``on`` and ``off`` can be
+ used to turn on the IOTLB used to cache address translation requests from
+ devices. :since:`Since 3.5.0` (QEMU/KVM only)
+
+ ``aw_bits``
+ The ``aw_bits`` attribute can be used to set the address width to allow
+ mapping larger iova addresses in the guest. :since:`Since 6.5.0` (QEMU/KVM
+ only)
+
+:anchor:`<a id="vsock"/>`
+
+Vsock
+-----
+
+A vsock host/guest interface. The ``model`` attribute defaults to ``virtio``.
+:since:`Since 5.2.0` ``model`` can also be 'virtio-transitional' and
+'virtio-non-transitional', see `Virtio transitional
+devices <#elementsVirtioTransitional>`__ for more details. The optional
+attribute ``address`` of the ``cid`` element specifies the CID assigned to the
+guest. If the attribute ``auto`` is set to ``yes``, libvirt will assign a free
+CID automatically on domain startup. :since:`Since 4.4.0`
+
+::
+
+ ...
+ <devices>
+ <vsock model='virtio'>
+ <cid auto='no' address='3'/>
+ </vsock>
+ </devices>
+ ...
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index bb385e4b02..3af8e21d81 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -2170,5057 +2170,7 @@ event name Description
``emulation_faults`` the count of emulation faults, that is when the kernel traps
on unimplemented instrucions and emulates them for user space, by applications running on
the platform ``perf.emulation_faults``
===========================
=======================================================================================================================================================================================
================================
-:anchor:`<a id="elementsDevices"/>`
-
-Devices
--------
-
-The final set of XML elements are all used to describe devices provided to the
-guest domain. All devices occur as children of the main ``devices`` element.
-:since:`Since 0.1.3`
-
-::
-
- ...
- <devices>
- <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
- </devices>
- ...
-
-``emulator``
- The contents of the ``emulator`` element specify the fully qualified path to
- the device model emulator binary. The `capabilities XML <formatcaps.html>`__
- specifies the recommended default emulator to use for each particular domain
- type / architecture combination.
-
-To help users identifying devices they care about, every device can have direct
-child ``alias`` element which then has ``name`` attribute where users can store
-identifier for the device. The identifier has to have "ua-" prefix and must be
-unique within the domain. Additionally, the identifier must consist only of the
-following characters: ``[a-zA-Z0-9_-]``. :since:`Since 3.9.0`
-
-::
-
- <devices>
- <disk type='file'>
- <alias name='ua-myDisk'/>
- </disk>
- <interface type='network' trustGuestRxFilters='yes'>
- <alias name='ua-myNIC'/>
- </interface>
- ...
- </devices>
-
-:anchor:`<a id="elementsDisks"/>`
-
-Hard drives, floppy disks, CDROMs
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Any device that looks like a disk, be it a floppy, harddisk, cdrom, or
-paravirtualized driver is specified via the ``disk`` element.
-
-::
-
- ...
- <devices>
- <disk type='file' snapshot='external'>
- <driver name="tap" type="aio"
cache="default"/>
- <source file='/var/lib/xen/images/fv0'
startupPolicy='optional'>
- <seclabel relabel='no'/>
- </source>
- <target dev='hda' bus='ide'/>
- <iotune>
- <total_bytes_sec>10000000</total_bytes_sec>
- <read_iops_sec>400000</read_iops_sec>
- <write_iops_sec>100000</write_iops_sec>
- </iotune>
- <boot order='2'/>
- <encryption type='...'>
- ...
- </encryption>
- <shareable/>
- <serial>
- ...
- </serial>
- </disk>
- ...
- <disk type='network'>
- <driver name="qemu" type="raw" io="threads"
ioeventfd="on" event_idx="off"/>
- <source protocol="sheepdog" name="image_name">
- <host name="hostname" port="7000"/>
- </source>
- <target dev="hdb" bus="ide"/>
- <boot order='1'/>
- <transient/>
- <address type='drive' controller='0' bus='1'
unit='0'/>
- </disk>
- <disk type='network'>
- <driver name="qemu" type="raw"/>
- <source protocol="rbd" name="image_name2">
- <host name="hostname" port="7000"/>
- <snapshot name="snapname"/>
- <config file="/path/to/file"/>
- <auth username='myuser'>
- <secret type='ceph' usage='mypassid'/>
- </auth>
- </source>
- <target dev="hdc" bus="ide"/>
- </disk>
- <disk type='block' device='cdrom'>
- <driver name='qemu' type='raw'/>
- <target dev='hdd' bus='ide' tray='open'/>
- <readonly/>
- </disk>
- <disk type='network' device='cdrom'>
- <driver name='qemu' type='raw'/>
- <source protocol="http" name="url_path"
query="foo=bar&baz=flurb>
- <host name="hostname" port="80"/>
- <cookies>
- <cookie name="test">somevalue</cookie>
- </cookies>
- <readahead size='65536'/>
- <timeout seconds='6'/>
- </source>
- <target dev='hde' bus='ide' tray='open'/>
- <readonly/>
- </disk>
- <disk type='network' device='cdrom'>
- <driver name='qemu' type='raw'/>
- <source protocol="https" name="url_path">
- <host name="hostname" port="443"/>
- <ssl verify="no"/>
- </source>
- <target dev='hdf' bus='ide' tray='open'/>
- <readonly/>
- </disk>
- <disk type='network' device='cdrom'>
- <driver name='qemu' type='raw'/>
- <source protocol="ftp" name="url_path">
- <host name="hostname" port="21"/>
- </source>
- <target dev='hdg' bus='ide' tray='open'/>
- <readonly/>
- </disk>
- <disk type='network' device='cdrom'>
- <driver name='qemu' type='raw'/>
- <source protocol="ftps" name="url_path">
- <host name="hostname" port="990"/>
- </source>
- <target dev='hdh' bus='ide' tray='open'/>
- <readonly/>
- </disk>
- <disk type='network' device='cdrom'>
- <driver name='qemu' type='raw'/>
- <source protocol="tftp" name="url_path">
- <host name="hostname" port="69"/>
- </source>
- <target dev='hdi' bus='ide' tray='open'/>
- <readonly/>
- </disk>
- <disk type='block' device='lun'>
- <driver name='qemu' type='raw'/>
- <source dev='/dev/sda'>
- <slices>
- <slice type='storage' offset='12345'
size='123'/>
- </slices>
- <reservations managed='no'>
- <source type='unix' path='/path/to/qemu-pr-helper'
mode='client'/>
- </reservations>
- </source>
- <target dev='sda' bus='scsi'/>
- <address type='drive' controller='0' bus='0'
target='3' unit='0'/>
- </disk>
- <disk type='block' device='disk'>
- <driver name='qemu' type='raw'/>
- <source dev='/dev/sda'/>
- <geometry cyls='16383' heads='16' secs='63'
trans='lba'/>
- <blockio logical_block_size='512'
physical_block_size='4096'/>
- <target dev='hdj' bus='ide'/>
- </disk>
- <disk type='volume' device='disk'>
- <driver name='qemu' type='raw'/>
- <source pool='blk-pool0' volume='blk-pool0-vol0'/>
- <target dev='hdk' bus='ide'/>
- </disk>
- <disk type='network' device='disk'>
- <driver name='qemu' type='raw'/>
- <source protocol='iscsi'
name='iqn.2013-07.com.example:iscsi-nopool/2'>
- <host name='example.com' port='3260'/>
- <auth username='myuser'>
- <secret type='iscsi' usage='libvirtiscsi'/>
- </auth>
- </source>
- <target dev='vda' bus='virtio'/>
- </disk>
- <disk type='network' device='lun'>
- <driver name='qemu' type='raw'/>
- <source protocol='iscsi'
name='iqn.2013-07.com.example:iscsi-nopool/1'>
- <host name='example.com' port='3260'/>
- <auth username='myuser'>
- <secret type='iscsi' usage='libvirtiscsi'/>
- </auth>
- </source>
- <target dev='sdb' bus='scsi'/>
- </disk>
- <disk type='network' device='lun'>
- <driver name='qemu' type='raw'/>
- <source protocol='iscsi'
name='iqn.2013-07.com.example:iscsi-nopool/0'>
- <host name='example.com' port='3260'/>
- <initiator>
- <iqn name='iqn.2013-07.com.example:client'/>
- </initiator>
- </source>
- <target dev='sdb' bus='scsi'/>
- </disk>
- <disk type='volume' device='disk'>
- <driver name='qemu' type='raw'/>
- <source pool='iscsi-pool' volume='unit:0:0:1'
mode='host'/>
- <target dev='vdb' bus='virtio'/>
- </disk>
- <disk type='volume' device='disk'>
- <driver name='qemu' type='raw'/>
- <source pool='iscsi-pool' volume='unit:0:0:2'
mode='direct'/>
- <target dev='vdc' bus='virtio'/>
- </disk>
- <disk type='file' device='disk'>
- <driver name='qemu' type='qcow2' queues='4'/>
- <source file='/var/lib/libvirt/images/domain.qcow'/>
- <backingStore type='file'>
- <format type='qcow2'/>
- <source file='/var/lib/libvirt/images/snapshot.qcow'/>
- <backingStore type='block'>
- <format type='raw'/>
- <source dev='/dev/mapper/base'/>
- <backingStore/>
- </backingStore>
- </backingStore>
- <target dev='vdd' bus='virtio'/>
- </disk>
- <disk type='nvme' device='disk'>
- <driver name='qemu' type='raw'/>
- <source type='pci' managed='yes' namespace='1'>
- <address domain='0x0000' bus='0x01' slot='0x00'
function='0x0'/>
- </source>
- <target dev='vde' bus='virtio'/>
- </disk>
- </devices>
- ...
-
-``disk``
- The ``disk`` element is the main container for describing disks and supports
- the following attributes:
-
- ``type``
- Valid values are "file", "block", "dir" (
:since:`since 0.7.5` ),
- "network" ( :since:`since 0.8.7` ), or "volume" ( :since:`since
1.0.5` ),
- or "nvme" ( :since:`since 6.0.0` ) and refer to the underlying source
for
- the disk. :since:`Since 0.0.3`
- ``device``
- Indicates how the disk is to be exposed to the guest OS. Possible values
- for this attribute are "floppy", "disk", "cdrom", and
"lun", defaulting to
- "disk".
-
- Using "lun" ( :since:`since 0.9.10` ) is only valid when the ``type`` is
- "block" or "network" for ``protocol='iscsi'`` or when
the ``type`` is
- "volume" when using an iSCSI source ``pool`` for ``mode``
"host" or as an
- `NPIV <
http://wiki.libvirt.org/page/NPIV_in_libvirt>`__ virtual Host Bus
- Adapter (vHBA) using a Fibre Channel storage pool. Configured in this
- manner, the LUN behaves identically to "disk", except that generic SCSI
- commands from the guest are accepted and passed through to the physical
- device. Also note that device='lun' will only be recognized for actual raw
- devices, but never for individual partitions or LVM partitions (in those
- cases, the kernel will reject the generic SCSI commands, making it
- identical to device='disk'). :since:`Since 0.1.4`
-
- ``model``
- Indicates the emulated device model of the disk. Typically this is
- indicated solely by the ``bus`` property but for ``bus`` "virtio" the
- model can be specified further with "virtio-transitional",
- "virtio-non-transitional", or "virtio". See `Virtio
transitional
- devices <#elementsVirtioTransitional>`__ for more details. :since:`Since
- 5.2.0`
- ``rawio``
- Indicates whether the disk needs rawio capability. Valid settings are
- "yes" or "no" (default is "no"). If any one disk in a
domain has
- rawio='yes', rawio capability will be enabled for all disks in the domain
- (because, in the case of QEMU, this capability can only be set on a
- per-process basis). This attribute is only valid when device is "lun".
NB,
- ``rawio`` intends to confine the capability per-device, however, current
- QEMU implementation gives the domain process broader capability than that
- (per-process basis, affects all the domain disks). To confine the
- capability as much as possible for QEMU driver as this stage, ``sgio`` is
- recommended, it's more secure than ``rawio``. :since:`Since 0.9.10`
- ``sgio``
- If supported by the hypervisor and OS, indicates whether unprivileged
- SG_IO commands are filtered for the disk. Valid settings are "filtered"
or
- "unfiltered" where the default is "filtered". Only available
when the
- ``device`` is 'lun'. :since:`Since 1.0.2`
- ``snapshot``
- Indicates the default behavior of the disk during disk snapshots:
- "``internal``" requires a file format such as qcow2 that can store both
- the snapshot and the data changes since the snapshot; "``external``"
will
- separate the snapshot from the live data; and "``no``" means the disk
will
- not participate in snapshots. Read-only disks default to "``no``", while
- the default for other disks depends on the hypervisor's capabilities. Some
- hypervisors allow a per-snapshot choice as well, during `domain snapshot
- creation <formatsnapshot.html>`__. Not all snapshot modes are supported;
- for example, enabling snapshots with a transient disk generally does not
- make sense. :since:`Since 0.9.5`
-
-``source``
- Representation of the disk ``source`` depends on the disk ``type`` attribute
- value as follows:
-
- ``file``
- The ``file`` attribute specifies the fully-qualified path to the file
- holding the disk. :since:`Since 0.0.3`
- ``block``
- The ``dev`` attribute specifies the fully-qualified path to the host
- device to serve as the disk. :since:`Since 0.0.3`
- ``dir``
- The ``dir`` attribute specifies the fully-qualified path to the directory
- to use as the disk. :since:`Since 0.7.5`
- ``network``
- The ``protocol`` attribute specifies the protocol to access to the
- requested image. Possible values are "nbd", "iscsi",
"rbd", "sheepdog",
- "gluster", "vxhs", "http", "https",
"ftp", ftps", or "tftp".
-
- For any ``protocol`` other than ``nbd`` an additional attribute ``name``
- is mandatory to specify which volume/image will be used.
-
- For "nbd", the ``name`` attribute is optional. TLS transport for NBD can
- be enabled by setting the ``tls`` attribute to ``yes``. For the QEMU
- hypervisor, usage of a TLS environment can also be globally controlled on
- the host by the ``nbd_tls`` and ``nbd_tls_x509_cert_dir`` in
- /etc/libvirt/qemu.conf. ('tls' :since:`Since 4.5.0` )
-
- For protocols ``http`` and ``https`` an optional attribute ``query``
- specifies the query string. ( :since:`Since 6.2.0` )
-
- For "iscsi" ( :since:`since 1.0.4` ), the ``name`` attribute may include
a
- logical unit number, separated from the target's name by a slash (e.g.,
- ``iqn.2013-07.com.example:iscsi-pool/1``). If not specified, the default
- LUN is zero.
-
- For "vxhs" ( :since:`since 3.8.0` ), the ``name`` is the UUID of the
- volume, assigned by the HyperScale server. Additionally, an optional
- attribute ``tls`` (QEMU only) can be used to control whether a VxHS block
- device would utilize a hypervisor configured TLS X.509 certificate
- environment in order to encrypt the data channel. For the QEMU hypervisor,
- usage of a TLS environment can also be globally controlled on the host by
- the ``vxhs_tls`` and ``vxhs_tls_x509_cert_dir`` or
- ``default_tls_x509_cert_dir`` settings in the file /etc/libvirt/qemu.conf.
- If ``vxhs_tls`` is enabled, then unless the domain ``tls`` attribute is
- set to "no", libvirt will use the host configured TLS environment. If
the
- ``tls`` attribute is set to "yes", then regardless of the qemu.conf
- setting, TLS authentication will be attempted.
-
- :since:`Since 0.8.7`
-
- ``volume``
- The underlying disk source is represented by attributes ``pool`` and
- ``volume``. Attribute ``pool`` specifies the name of the `storage
- pool <formatstorage.html>`__ (managed by libvirt) where the disk source
- resides. Attribute ``volume`` specifies the name of storage volume
- (managed by libvirt) used as the disk source. The value for the ``volume``
- attribute will be the output from the "Name" column of a
- ``virsh vol-list [pool-name]`` command.
-
- Use the attribute ``mode`` ( :since:`since 1.1.1` ) to indicate how to
- represent the LUN as the disk source. Valid values are "direct" and
- "host". If ``mode`` is not specified, the default is to use
"host". Using
- "direct" as the ``mode`` value indicates to use the `storage
- pool's <formatstorage.html>`__ ``source`` element ``host`` attribute as
- the disk source to generate the libiscsi URI (e.g.
- 'file=iscsi://example.com:3260/iqn.2013-07.com.example:iscsi-pool/1').
- Using "host" as the ``mode`` value indicates to use the LUN's path as
it
- shows up on host (e.g.
-
'file=/dev/disk/by-path/ip-example.com:3260-iscsi-iqn.2013-07.com.example:iscsi-pool-lun-1').
- Using a LUN from an iSCSI source pool provides the same features as a
- ``disk`` configured using ``type`` 'block' or 'network' and
``device`` of
- 'lun' with respect to how the LUN is presented to and may be used by the
- guest. :since:`Since 1.0.5`
-
- ``nvme``
- To specify disk source for NVMe disk the ``source`` element has the
- following attributes:
-
- ``type``
- The type of address specified in ``address`` sub-element. Currently,
- only ``pci`` value is accepted.
- ``managed``
- This attribute instructs libvirt to detach NVMe controller
- automatically on domain startup (``yes``) or expect the controller to
- be detached by system administrator (``no``).
- ``namespace``
- The namespace ID which should be assigned to the domain. According to
- NVMe standard, namespace numbers start from 1, including.
-
- The difference between ``<disk type='nvme'>`` and
``<hostdev/>`` is that
- the latter is plain host device assignment with all its limitations (e.g.
- no live migration), while the former makes hypervisor to run the NVMe disk
- through hypervisor's block layer thus enabling all features provided by
- the layer (e.g. snapshots, domain migration, etc.). Moreover, since the
- NVMe disk is unbinded from its PCI driver, the host kernel storage stack
- is not involved (compared to passing say ``/dev/nvme0n1`` via
- ``<disk type='block'>`` and therefore lower latencies can be
achieved.
-
- With "file", "block", and "volume", one or more optional
sub-elements
- ``seclabel``, `described below <#seclabel>`__ (and :since:`since 0.9.9` ),
- can be used to override the domain security labeling policy for just that
- source file. (NB, for "volume" type disk, ``seclabel`` is only valid when
the
- specified storage volume is of 'file' or 'block' type).
-
- The ``source`` element may also have the ``index`` attribute with same
- semantics the `index <#elementsDiskBackingStoreIndex>`__ attribute of
- ``backingStore``
-
- The ``source`` element may contain the following sub elements:
-
- ``host``
- When the disk ``type`` is "network", the ``source`` may have zero or
more
- ``host`` sub-elements used to specify the hosts to connect. The ``host``
- element supports 4 attributes, viz. "name", "port",
"transport" and
- "socket", which specify the hostname, the port number, transport type
and
- path to socket, respectively. The meaning of this element and the number
- of the elements depend on the protocol attribute.
-
- ======== =======================================================
============================================================ ================
- Protocol Meaning Number of hosts
Default port
- ======== =======================================================
============================================================ ================
- nbd a server running nbd-server only one
10809
- iscsi an iSCSI server only one
3260
- rbd monitor servers of RBD one or more
librados default
- sheepdog one of the sheepdog servers (default is localhost:7000) zero or one
7000
- gluster a server running glusterd daemon one or more (
:since:`Since 2.1.0` ), just one prior to that 24007
- vxhs a server running Veritas HyperScale daemon only one
9999
- ======== =======================================================
============================================================ ================
-
- gluster supports "tcp", "rdma", "unix" as valid
values for the transport
- attribute. nbd supports "tcp" and "unix". Others only support
"tcp". If
- nothing is specified, "tcp" is assumed. If the transport is
"unix", the
- socket attribute specifies the path to an AF_UNIX socket.
-
- ``snapshot``
- The ``name`` attribute of ``snapshot`` element can optionally specify an
- internal snapshot name to be used as the source for storage protocols.
- Supported for 'rbd' :since:`since 1.2.11 (QEMU only).`
- ``config``
- The ``file`` attribute for the ``config`` element provides a fully
- qualified path to a configuration file to be provided as a parameter to
- the client of a networked storage protocol. Supported for 'rbd'
- :since:`since 1.2.11 (QEMU only).`
- ``auth``
- :since:`Since libvirt 3.9.0` , the ``auth`` element is supported for a
- disk ``type`` "network" that is using a ``source`` element with the
- ``protocol`` attributes "rbd" or "iscsi". If present, the
``auth`` element
- provides the authentication credentials needed to access the source. It
- includes a mandatory attribute ``username``, which identifies the username
- to use during authentication, as well as a sub-element ``secret`` with
- mandatory attribute ``type``, to tie back to a `libvirt secret
- object <formatsecret.html>`__ that holds the actual password or other
- credentials (the domain XML intentionally does not expose the password,
- only the reference to the object that does manage the password). Known
- secret types are "ceph" for Ceph RBD network sources and
"iscsi" for CHAP
- authentication of iSCSI targets. Both will require either a ``uuid``
- attribute with the UUID of the secret object or a ``usage`` attribute
- matching the key that was specified in the secret object.
- ``encryption``
- :since:`Since libvirt 3.9.0` , the ``encryption`` can be a sub-element of
- the ``source`` element for encrypted storage sources. If present,
- specifies how the storage source is encrypted See the `Storage
- Encryption <formatstorageencryption.html>`__ page for more information.
- Note that the 'qcow' format of encryption is broken and thus is no longer
- supported for use with disk images. ( :since:`Since libvirt 4.5.0` )
- ``reservations``
- :since:`Since libvirt 4.4.0` , the ``reservations`` can be a sub-element
- of the ``source`` element for storage sources (QEMU driver only). If
- present it enables persistent reservations for SCSI based disks. The
- element has one mandatory attribute ``managed`` with accepted values
- ``yes`` and ``no``. If ``managed`` is enabled libvirt prepares and manages
- any resources needed. When the persistent reservations are unmanaged, then
- the hypervisor acts as a client and the path to the server socket must be
- provided in the child element ``source``, which currently accepts only the
- following attributes: ``type`` with one value ``unix``, ``path`` path to
- the socket, and finally ``mode`` which accepts one value ``client``
- specifying the role of hypervisor. It's recommended to allow libvirt
- manage the persistent reservations.
- ``initiator``
- :since:`Since libvirt 4.7.0` , the ``initiator`` element is supported for
- a disk ``type`` "network" that is using a ``source`` element with the
- ``protocol`` attribute "iscsi". If present, the ``initiator`` element
- provides the initiator IQN needed to access the source via mandatory
- attribute ``name``.
- ``address``
- For disk of type ``nvme`` this element specifies the PCI address of the
- host NVMe controller. :since:`Since 6.0.0`
- ``slices``
- The ``slices`` element using its ``slice`` sub-elements allows configuring
- offset and size of either the location of the image format
- (``slice type='storage'``) inside the storage source or the guest data
- inside the image format container (future expansion). The ``offset`` and
- ``size`` values are in bytes. :since:`Since 6.1.0`
- ``ssl``
- For ``https`` and ``ftps`` accessed storage it's possible to tweak the SSL
- transport parameters with this element. The ``verify`` attribute allows to
- turn on or off SSL certificate validation. Supported values are ``yes``
- and ``no``. :since:`Since 6.2.0`
- ``cookies``
- For ``http`` and ``https`` accessed storage it's possible to pass one or
- more cookies. The cookie name and value must conform to the HTTP
- specification. :since:`Since 6.2.0`
- ``readahead``
- Specifies the size of the readahead buffer for protocols which support it.
- (all 'curl' based drivers in qemu). The size is in bytes. Note that
'0' is
- considered as if the value is not provided. :since:`Since 6.2.0`
- ``timeout``
- Specifies the connection timeout for protocols which support it. Note that
- '0' is considered as if the value is not provided. :since:`Since 6.2.0`
-
- For a "file" or "volume" disk type which represents a cdrom or
floppy (the
- ``device`` attribute), it is possible to define policy what to do with the
- disk if the source file is not accessible. (NB, ``startupPolicy`` is not
- valid for "volume" disk unless the specified storage volume is of
"file"
- type). This is done by the ``startupPolicy`` attribute ( :since:`since 0.9.7`
- ), accepting these values:
-
- ========= =====================================================================
- mandatory fail if missing for any reason (the default)
- requisite fail if missing on boot up, drop if missing on migrate/restore/revert
- optional drop if missing at any start attempt
- ========= =====================================================================
-
- :since:`Since 1.1.2` the ``startupPolicy`` is extended to support hard disks
- besides cdrom and floppy. On guest cold bootup, if a certain disk is not
- accessible or its disk chain is broken, with startupPolicy 'optional' the
- guest will drop this disk. This feature doesn't support migration currently.
-
-``backingStore``
- This element describes the backing store used by the disk specified by
- sibling ``source`` element. :since:`Since 1.2.4.` If the hypervisor driver
- does not support the
- `backingStoreInput <formatdomaincaps.html#featureBackingStoreInput>`__ (
- :since:`Since 5.10.0` ) domain feature the ``backingStore`` is ignored on
- input and only used for output to describe the detected backing chains of
- running domains. If ``backingStoreInput`` is supported the ``backingStore``
- is used as the backing image of ``source`` or other ``backingStore``
- overriding any backing image information recorded in the image metadata. An
- empty ``backingStore`` element means the sibling source is self-contained and
- is not based on any backing store. For the detected backing chain information
- to be accurate, the backing format must be correctly specified in the
- metadata of each file of the chain (files created by libvirt satisfy this
- property, but using existing external files for snapshot or block copy
- operations requires the end user to pre-create the file correctly). The
- following attributes are supported in ``backingStore``:
-
- ``type``
- The ``type`` attribute represents the type of disk used by the backing
- store, see disk type attribute above for more details and possible values.
- ``index``
- This attribute is only valid in output (and ignored on input) and it can
- be used to refer to a specific part of the disk chain when doing block
- operations (such as via the ``virDomainBlockRebase`` API). For example,
- ``vda[2]`` refers to the backing store with ``index='2'`` of the disk with
- ``vda`` target.
-
- Moreover, ``backingStore`` supports the following sub-elements:
-
- ``format``
- The ``format`` element contains ``type`` attribute which specifies the
- internal format of the backing store, such as ``raw`` or ``qcow2``.
- ``source``
- This element has the same structure as the ``source`` element in ``disk``.
- It specifies which file, device, or network location contains the data of
- the described backing store.
- ``backingStore``
- If the backing store is not self-contained, the next element in the chain
- is described by nested ``backingStore`` element.
-
-``mirror``
- This element is present if the hypervisor has started a long-running block
- job operation, where the mirror location in the ``source`` sub-element will
- eventually have the same contents as the source, and with the file format in
- the sub-element ``format`` (which might differ from the format of the
- source). The details of the ``source`` sub-element are determined by the
- ``type`` attribute of the mirror, similar to what is done for the overall
- ``disk`` device element. The ``job`` attribute mentions which API started the
- operation ("copy" for the ``virDomainBlockRebase`` API, or
"active-commit"
- for the ``virDomainBlockCommit`` API), :since:`since 1.2.7` . The attribute
- ``ready``, if present, tracks progress of the job: ``yes`` if the disk is
- known to be ready to pivot, or, :since:`since 1.2.7` , ``abort`` or ``pivot``
- if the job is in the process of completing. If ``ready`` is not present, the
- disk is probably still copying. For now, this element only valid in output;
- it is ignored on input. The ``source`` sub-element exists for all two-phase
- jobs :since:`since 1.2.6` . Older libvirt supported only block copy to a
- file, :since:`since 0.9.12` ; for compatibility with older clients, such jobs
- include redundant information in the attributes ``file`` and ``format`` in
- the ``mirror`` element.
-``target``
- The ``target`` element controls the bus / device under which the disk is
- exposed to the guest OS. The ``dev`` attribute indicates the "logical"
device
- name. The actual device name specified is not guaranteed to map to the device
- name in the guest OS. Treat it as a device ordering hint. The optional
- ``bus`` attribute specifies the type of disk device to emulate; possible
- values are driver specific, with typical values being "ide",
"scsi",
- "virtio", "xen", "usb", "sata", or
"sd" :since:`"sd" since 1.1.2` . If
- omitted, the bus type is inferred from the style of the device name (e.g. a
- device named 'sda' will typically be exported using a SCSI bus). The optional
- attribute ``tray`` indicates the tray status of the removable disks (i.e.
- CDROM or Floppy disk), the value can be either "open" or "closed",
defaults
- to "closed". NB, the value of ``tray`` could be updated while the domain is
- running. The optional attribute ``removable`` sets the removable flag for USB
- disks, and its value can be either "on" or "off", defaulting to
"off".
- :since:`Since 0.0.3; ``bus`` attribute since 0.4.3; ``tray`` attribute since
- 0.9.11; "usb" attribute value since after 0.4.4; "sata" attribute
value since
- 0.9.7; "removable" attribute value since 1.1.3`
-``iotune``
- The optional ``iotune`` element provides the ability to provide additional
- per-device I/O tuning, with values that can vary for each device (contrast
- this to the `<blkiotune> <#elementsBlockTuning>`__ element, which applies
- globally to the domain). Currently, the only tuning available is Block I/O
- throttling for qemu. This element has optional sub-elements; any sub-element
- not specified or given with a value of 0 implies no limit. :since:`Since
- 0.9.8`
-
- ``total_bytes_sec``
- The optional ``total_bytes_sec`` element is the total throughput limit in
- bytes per second. This cannot appear with ``read_bytes_sec`` or
- ``write_bytes_sec``.
- ``read_bytes_sec``
- The optional ``read_bytes_sec`` element is the read throughput limit in
- bytes per second.
- ``write_bytes_sec``
- The optional ``write_bytes_sec`` element is the write throughput limit in
- bytes per second.
- ``total_iops_sec``
- The optional ``total_iops_sec`` element is the total I/O operations per
- second. This cannot appear with ``read_iops_sec`` or ``write_iops_sec``.
- ``read_iops_sec``
- The optional ``read_iops_sec`` element is the read I/O operations per
- second.
- ``write_iops_sec``
- The optional ``write_iops_sec`` element is the write I/O operations per
- second.
- ``total_bytes_sec_max``
- The optional ``total_bytes_sec_max`` element is the maximum total
- throughput limit in bytes per second. This cannot appear with
- ``read_bytes_sec_max`` or ``write_bytes_sec_max``.
- ``read_bytes_sec_max``
- The optional ``read_bytes_sec_max`` element is the maximum read throughput
- limit in bytes per second.
- ``write_bytes_sec_max``
- The optional ``write_bytes_sec_max`` element is the maximum write
- throughput limit in bytes per second.
- ``total_iops_sec_max``
- The optional ``total_iops_sec_max`` element is the maximum total I/O
- operations per second. This cannot appear with ``read_iops_sec_max`` or
- ``write_iops_sec_max``.
- ``read_iops_sec_max``
- The optional ``read_iops_sec_max`` element is the maximum read I/O
- operations per second.
- ``write_iops_sec_max``
- The optional ``write_iops_sec_max`` element is the maximum write I/O
- operations per second.
- ``size_iops_sec``
- The optional ``size_iops_sec`` element is the size of I/O operations per
- second.
-
- :since:`Throughput limits since 1.2.11 and QEMU 1.7`
-
- ``group_name``
- The optional ``group_name`` provides the cability to share I/O throttling
- quota between multiple drives. This prevents end-users from circumventing
- a hosting provider's throttling policy by splitting 1 large drive in N
- small drives and getting N times the normal throttling quota. Any name may
- be used.
-
- :since:`group_name since 3.0.0 and QEMU 2.4`
-
- ``total_bytes_sec_max_length``
- The optional ``total_bytes_sec_max_length`` element is the maximum
- duration in seconds for the ``total_bytes_sec_max`` burst period. Only
- valid when the ``total_bytes_sec_max`` is set.
- ``read_bytes_sec_max_length``
- The optional ``read_bytes_sec_max_length`` element is the maximum duration
- in seconds for the ``read_bytes_sec_max`` burst period. Only valid when
- the ``read_bytes_sec_max`` is set.
- ``write_bytes_sec_max``
- The optional ``write_bytes_sec_max_length`` element is the maximum
- duration in seconds for the ``write_bytes_sec_max`` burst period. Only
- valid when the ``write_bytes_sec_max`` is set.
- ``total_iops_sec_max_length``
- The optional ``total_iops_sec_max_length`` element is the maximum duration
- in seconds for the ``total_iops_sec_max`` burst period. Only valid when
- the ``total_iops_sec_max`` is set.
- ``read_iops_sec_max_length``
- The optional ``read_iops_sec_max_length`` element is the maximum duration
- in seconds for the ``read_iops_sec_max`` burst period. Only valid when the
- ``read_iops_sec_max`` is set.
- ``write_iops_sec_max``
- The optional ``write_iops_sec_max_length`` element is the maximum duration
- in seconds for the ``write_iops_sec_max`` burst period. Only valid when
- the ``write_iops_sec_max`` is set.
-
- :since:`Throughput length since 2.4.0 and QEMU 2.6`
-
-``driver``
- The optional driver element allows specifying further details related to the
- hypervisor driver used to provide the disk. :since:`Since 0.1.8`
-
- - If the hypervisor supports multiple backend drivers, then the ``name``
- attribute selects the primary backend driver name, while the optional
- ``type`` attribute provides the sub-type. For example, xen supports a name
- of "tap", "tap2", "phy", or "file", with a
type of "aio", while qemu only
- supports a name of "qemu", but multiple types including "raw",
"bochs",
- "qcow2", and "qed".
- - The optional ``cache`` attribute controls the cache mechanism, possible
- values are "default", "none", "writethrough",
"writeback", "directsync"
- (like "writethrough", but it bypasses the host page cache) and
"unsafe"
- (host may cache all disk io, and sync requests from guest are ignored).
- :since:` Since 0.6.0, "directsync" since 0.9.5, "unsafe" since
0.9.7 `
- - The optional ``error_policy`` attribute controls how the hypervisor will
- behave on a disk read or write error, possible values are "stop",
- "report", "ignore", and "enospace". :since:`Since
0.8.0, "report" since
- 0.9.7` The default is left to the discretion of the hypervisor. There is
- also an optional ``rerror_policy`` that controls behavior for read errors
- only. :since:`Since 0.9.7` . If no rerror_policy is given, error_policy is
- used for both read and write errors. If rerror_policy is given, it
- overrides the ``error_policy`` for read errors. Also note that
"enospace"
- is not a valid policy for read errors, so if ``error_policy`` is set to
- "enospace" and no ``rerror_policy`` is given, the read error policy will
- be left at its default.
- - The optional ``io`` attribute controls specific policies on I/O; qemu
- guests support "threads" and "native" :since:`Since 0.8.8` ,
io_uring
- :since:`Since 6.3.0 (QEMU 5.0)` .
- - The optional ``ioeventfd`` attribute allows users to set `domain I/O
- asynchronous handling <
https://patchwork.kernel.org/patch/43390/>`__ for
- disk device. The default is left to the discretion of the hypervisor.
- Accepted values are "on" and "off". Enabling this allows qemu
to execute
- VM while a separate thread handles I/O. Typically guests experiencing high
- system CPU utilization during I/O will benefit from this. On the other
- hand, on overloaded host it could increase guest I/O latency.
- :since:`Since 0.9.3 (QEMU and KVM only)` **In general you should leave
- this option alone, unless you are very certain you know what you are
- doing.**
- - The optional ``event_idx`` attribute controls some aspects of device event
- processing. The value can be either 'on' or 'off' - if it is on, it
will
- reduce the number of interrupts and exits for the guest. The default is
- determined by QEMU; usually if the feature is supported, default is on. In
- case there is a situation where this behavior is suboptimal, this
- attribute provides a way to force the feature off. :since:`Since 0.9.5
- (QEMU and KVM only)` **In general you should leave this option alone,
- unless you are very certain you know what you are doing.**
- - The optional ``copy_on_read`` attribute controls whether to copy read
- backing file into the image file. The value can be either "on" or
"off".
- Copy-on-read avoids accessing the same backing file sectors repeatedly and
- is useful when the backing file is over a slow network. By default
- copy-on-read is off. :since:`Since 0.9.10 (QEMU and KVM only)`
- - The optional ``discard`` attribute controls whether discard requests (also
- known as "trim" or "unmap") are ignored or passed to the
filesystem. The
- value can be either "unmap" (allow the discard request to be passed) or
- "ignore" (ignore the discard request). :since:`Since 1.0.6 (QEMU and KVM
- only)`
- - The optional ``detect_zeroes`` attribute controls whether to detect zero
- write requests. The value can be "off", "on" or
"unmap". First two values
- turn the detection off and on, respectively. The third value ("unmap")
- turns the detection on and additionally tries to discard such areas from
- the image based on the value of ``discard`` above (it will act as "on"
if
- ``discard`` is set to "ignore"). NB enabling the detection is a compute
- intensive operation, but can save file space and/or time on slow media.
- :since:`Since 2.0.0`
- - The optional ``iothread`` attribute assigns the disk to an IOThread as
- defined by the range for the domain
- `iothreads <#elementsIOThreadsAllocation>`__ value. Multiple disks may be
- assigned to the same IOThread and are numbered from 1 to the domain
- iothreads value. Available for a disk device ``target`` configured to use
- "virtio" ``bus`` and "pci" or "ccw" ``address``
types. :since:`Since 1.2.8
- (QEMU 2.1)`
- - The optional ``queues`` attribute specifies the number of virt queues for
- virtio-blk. ( :since:`Since 3.9.0` )
- - For virtio disks, `Virtio-specific options <#elementsVirtio>`__ can also
- be set. ( :since:`Since 3.5.0` )
-
-``backenddomain``
- The optional ``backenddomain`` element allows specifying a backend domain
- (aka driver domain) hosting the disk. Use the ``name`` attribute to specify
- the backend domain name. :since:`Since 1.2.13 (Xen only)`
-``boot``
- Specifies that the disk is bootable. The ``order`` attribute determines the
- order in which devices will be tried during boot sequence. On the S390
- architecture only the first boot device is used. The optional ``loadparm``
- attribute is an 8 character string which can be queried by guests on S390 via
- sclp or diag 308. Linux guests on S390 can use ``loadparm`` to select a boot
- entry. :since:`Since 3.5.0` The per-device ``boot`` elements cannot be used
- together with general boot elements in `BIOS bootloader <#elementsOSBIOS>`__
- section. :since:`Since 0.8.8`
-``encryption``
- Starting with :since:`libvirt 3.9.0` the ``encryption`` element is preferred
- to be a sub-element of the ``source`` element. If present, specifies how the
- volume is encrypted using "qcow". See the `Storage
- Encryption <formatstorageencryption.html>`__ page for more information.
-``readonly``
- If present, this indicates the device cannot be modified by the guest. For
- now, this is the default for disks with attribute ``device='cdrom'``.
-``shareable``
- If present, this indicates the device is expected to be shared between
- domains (assuming the hypervisor and OS support this), which means that
- caching should be deactivated for that device.
-``transient``
- If present, this indicates that changes to the device contents should be
- reverted automatically when the guest exits. With some hypervisors, marking a
- disk transient prevents the domain from participating in migration or
- snapshots. :since:`Since 0.9.5`
-``serial``
- If present, this specify serial number of virtual hard drive. For example, it
- may look like ``<serial>WD-WMAP9A966149</serial>``. Not supported for
- scsi-block devices, that is those using disk ``type`` 'block' using
- ``device`` 'lun' on ``bus`` 'scsi'. :since:`Since 0.7.1`
-``wwn``
- If present, this element specifies the WWN (World Wide Name) of a virtual
- hard disk or CD-ROM drive. It must be composed of 16 hexadecimal digits.
- :since:`Since 0.10.1`
-``vendor``
- If present, this element specifies the vendor of a virtual hard disk or
- CD-ROM device. It must not be longer than 8 printable characters.
- :since:`Since 1.0.1`
-``product``
- If present, this element specifies the product of a virtual hard disk or
- CD-ROM device. It must not be longer than 16 printable characters.
- :since:`Since 1.0.1`
-``address``
- If present, the ``address`` element ties the disk to a given slot of a
- controller (the actual ``<controller>`` device can often be inferred by
- libvirt, although it can be `explicitly specified <#elementsControllers>`__).
- The ``type`` attribute is mandatory, and is typically "pci" or
"drive". For a
- "pci" controller, additional attributes for ``bus``, ``slot``, and
- ``function`` must be present, as well as optional ``domain`` and
- ``multifunction``. Multifunction defaults to 'off'; any other value requires
- QEMU 0.1.3 and :since:`libvirt 0.9.7` . For a "drive" controller,
additional
- attributes ``controller``, ``bus``, ``target`` ( :since:`libvirt 0.9.11` ),
- and ``unit`` are available, each defaulting to 0.
-``auth``
- Starting with :since:`libvirt 3.9.0` the ``auth`` element is preferred to be
- a sub-element of the ``source`` element. The element is still read and
- managed as a ``disk`` sub-element. It is invalid to use ``auth`` as both a
- sub-element of ``disk`` and ``source``. The ``auth`` element was introduced
- as a ``disk`` sub-element in :since:`libvirt 0.9.7.`
-``geometry``
- The optional ``geometry`` element provides the ability to override geometry
- settings. This mostly useful for S390 DASD-disks or older DOS-disks.
- :since:`0.10.0`
-
- ``cyls``
- The ``cyls`` attribute is the number of cylinders.
- ``heads``
- The ``heads`` attribute is the number of heads.
- ``secs``
- The ``secs`` attribute is the number of sectors per track.
- ``trans``
- The optional ``trans`` attribute is the BIOS-Translation-Modus (none, lba
- or auto)
-
-``blockio``
- If present, the ``blockio`` element allows to override any of the block
- device properties listed below. :since:`Since 0.10.2 (QEMU and KVM)`
-
- ``logical_block_size``
- The logical block size the disk will report to the guest OS. For Linux
- this would be the value returned by the BLKSSZGET ioctl and describes the
- smallest units for disk I/O.
- ``physical_block_size``
- The physical block size the disk will report to the guest OS. For Linux
- this would be the value returned by the BLKPBSZGET ioctl and describes the
- disk's hardware sector size which can be relevant for the alignment of
- disk data.
-
-:anchor:`<a id="elementsFilesystems"/>`
-
-Filesystems
-~~~~~~~~~~~
-
-A directory on the host that can be accessed directly from the guest.
-:since:`since 0.3.3, since 0.8.5 for QEMU/KVM`
-
-::
-
- ...
- <devices>
- <filesystem type='template'>
- <source name='my-vm-template'/>
- <target dir='/'/>
- </filesystem>
- <filesystem type='mount' accessmode='passthrough'
multidevs='remap'>
- <driver type='path' wrpolicy='immediate'/>
- <source dir='/export/to/guest'/>
- <target dir='/import/from/host'/>
- <readonly/>
- </filesystem>
- <filesystem type='file' accessmode='passthrough'>
- <driver type='loop' format='raw'/>
- <driver type='path' wrpolicy='immediate'/>
- <source file='/export/to/guest.img'/>
- <target dir='/import/from/host'/>
- <readonly/>
- </filesystem>
- <filesystem type='mount' accessmode='passthrough'>
- <driver type='virtiofs' queue='1024'/>
- <binary path='/usr/libexec/virtiofsd' xattr='on'>
- <cache mode='always'/>
- <lock posix='on' flock='on'/>
- </binary>
- <source dir='/path'/>
- <target dir='mount_tag'/>
- </filesystem>
- ...
- </devices>
- ...
-
-``filesystem``
- The filesystem attribute ``type`` specifies the type of the ``source``. The
- possible values are:
-
- ``mount``
- A host directory to mount in the guest. Used by LXC, OpenVZ :since:`(since
- 0.6.2)` and QEMU/KVM :since:`(since 0.8.5)` . This is the default ``type``
- if one is not specified. This mode also has an optional sub-element
- ``driver``, with an attribute ``type='path'`` or ``type='handle'``
- :since:`(since 0.9.7)` . The driver block has an optional attribute
- ``wrpolicy`` that further controls interaction with the host page cache;
- omitting the attribute gives default behavior, while the value
- ``immediate`` means that a host writeback is immediately triggered for all
- pages touched during a guest file write operation :since:`(since 0.9.10)`
- . :since:`Since 6.2.0` , ``type='virtiofs'`` is also supported. Using
- virtiofs requires setting up shared memory, see the guide:
- `Virtio-FS <kbase/virtiofs.html>`__
- ``template``
- OpenVZ filesystem template. Only used by OpenVZ driver.
- ``file``
- A host file will be treated as an image and mounted in the guest. The
- filesystem format will be autodetected. Only used by LXC driver.
- ``block``
- A host block device to mount in the guest. The filesystem format will be
- autodetected. Only used by LXC driver :since:`(since 0.9.5)` .
- ``ram``
- An in-memory filesystem, using memory from the host OS. The source element
- has a single attribute ``usage`` which gives the memory usage limit in
- KiB, unless units are specified by the ``units`` attribute. Only used by
- LXC driver. :since:` (since 0.9.13)`
- ``bind``
- A directory inside the guest will be bound to another directory inside the
- guest. Only used by LXC driver :since:` (since 0.9.13)`
-
- The filesystem element has an optional attribute ``accessmode`` which
- specifies the security mode for accessing the source :since:`(since 0.8.5)` .
- Currently this only works with ``type='mount'`` for the QEMU/KVM driver. For
- driver type ``virtiofs``, only ``passthrough`` is supported. For other driver
- types, the possible values are:
-
- ``passthrough``
- The ``source`` is accessed with the permissions of the user inside the
- guest. This is the default ``accessmode`` if one is not specified. `More
- info <
http://lists.gnu.org/archive/html/qemu-devel/2010-05/msg02673.html>`__
- ``mapped``
- The ``source`` is accessed with the permissions of the hypervisor (QEMU
- process). `More
- info <
http://lists.gnu.org/archive/html/qemu-devel/2010-05/msg02673.html>`__
- ``squash``
- Similar to 'passthrough', the exception is that failure of privileged
- operations like 'chown' are ignored. This makes a passthrough-like mode
- usable for people who run the hypervisor as non-root. `More
- info <
http://lists.gnu.org/archive/html/qemu-devel/2010-09/msg00121.html>`__
-
- :since:`Since 5.2.0` , the filesystem element has an optional attribute
- ``model`` with supported values "virtio-transitional",
- "virtio-non-transitional", or "virtio". See `Virtio transitional
- devices <#elementsVirtioTransitional>`__ for more details.
-
- The filesystem element has an optional attribute ``multidevs`` which
- specifies how to deal with a filesystem export containing more than one
- device, in order to avoid file ID collisions on guest when using 9pfs (
- :since:`since 6.3.0, requires QEMU 4.2` ). This attribute is not available
- for virtiofs. The possible values are:
-
- ``default``
- Use QEMU's default setting (which currently is ``warn``).
- ``remap``
- This setting allows guest to access multiple devices per export without
- encountering misbehaviours. Inode numbers from host are automatically
- remapped on guest to actively prevent file ID collisions if guest accesses
- one export containing multiple devices.
- ``forbid``
- Only allow to access one device per export by guest. Attempts to access
- additional devices on the same export will cause the individual filesystem
- access by guest to fail with an error and being logged (once) as error on
- host side.
- ``warn``
- This setting resembles the behaviour of 9pfs prior to QEMU 4.2, that is no
- action is performed to prevent any potential file ID collisions if an
- export contains multiple devices, with the only exception: a warning is
- logged (once) on host side now. This setting may lead to misbehaviours on
- guest side if more than one device is exported per export, due to the
- potential file ID collisions this may cause on guest side in that case.
-
-``driver``
- The optional driver element allows specifying further details related to the
- hypervisor driver used to provide the filesystem. :since:`Since 1.0.6`
-
- - If the hypervisor supports multiple backend drivers, then the ``type``
- attribute selects the primary backend driver name, while the ``format``
- attribute provides the format type. For example, LXC supports a type of
- "loop", with a format of "raw" or "nbd" with any
format. QEMU supports a
- type of "path" or "handle", but no formats. Virtuozzo driver
supports a
- type of "ploop" with a format of "ploop".
- - For virtio-backed devices, `Virtio-specific options <#elementsVirtio>`__
- can also be set. ( :since:`Since 3.5.0` )
- - For ``virtiofs``, the ``queue`` attribute can be used to specify the queue
- size (i.e. how many requests can the queue fit). ( :since:`Since 6.2.0` )
-
-``binary``
- The optional ``binary`` element can tune the options for virtiofsd. All of
- the following attributes and elements are optional. The attribute ``path``
- can be used to override the path to the daemon. Attribute ``xattr`` enables
- the use of filesystem extended attributes. Caching can be tuned via the
- ``cache`` element, possible ``mode`` values being ``none`` and ``always``.
- Locking can be controlled via the ``lock`` element - attributes ``posix`` and
- ``flock`` both accepting values ``on`` or ``off``. ( :since:`Since 6.2.0` )
-``source``
- The resource on the host that is being accessed in the guest. The ``name``
- attribute must be used with ``type='template'``, and the ``dir`` attribute
- must be used with ``type='mount'``. The ``usage`` attribute is used with
- ``type='ram'`` to set the memory limit in KiB, unless units are specified by
- the ``units`` attribute.
-``target``
- Where the ``source`` can be accessed in the guest. For most drivers this is
- an automatic mount point, but for QEMU/KVM this is merely an arbitrary string
- tag that is exported to the guest as a hint for where to mount.
-``readonly``
- Enables exporting filesystem as a readonly mount for guest, by default
- read-write access is given (currently only works for QEMU/KVM driver).
-``space_hard_limit``
- Maximum space available to this guest's filesystem. :since:`Since 0.9.13`
-``space_soft_limit``
- Maximum space available to this guest's filesystem. The container is
- permitted to exceed its soft limits for a grace period of time. Afterwards
- the hard limit is enforced. :since:`Since 0.9.13`
-
-:anchor:`<a id="elementsAddress"/>`
-
-Device Addresses
-~~~~~~~~~~~~~~~~
-
-Many devices have an optional ``<address>`` sub-element to describe where the
-device is placed on the virtual bus presented to the guest. If an address (or
-any optional attribute within an address) is omitted on input, libvirt will
-generate an appropriate address; but an explicit address is required if more
-control over layout is required. See below for device examples including an
-address element.
-
-Every address has a mandatory attribute ``type`` that describes which bus the
-device is on. The choice of which address to use for a given device is
-constrained in part by the device and the architecture of the guest. For
-example, a ``<disk>`` device uses ``type='drive'``, while a
``<console>`` device
-would use ``type='pci'`` on i686 or x86_64 guests, or
``type='spapr-vio'`` on
-PowerPC64 pseries guests. Each address type has further optional attributes that
-control where on the bus the device will be placed:
-
-``pci``
- PCI addresses have the following additional attributes: ``domain`` (a 2-byte
- hex integer, not currently used by qemu), ``bus`` (a hex value between 0 and
- 0xff, inclusive), ``slot`` (a hex value between 0x0 and 0x1f, inclusive), and
- ``function`` (a value between 0 and 7, inclusive). Also available is the
- ``multifunction`` attribute, which controls turning on the multifunction bit
- for a particular slot/function in the PCI control register ( :since:`since
- 0.9.7, requires QEMU 0.13` ). ``multifunction`` defaults to 'off', but should
- be set to 'on' for function 0 of a slot that will have multiple functions
- used. ( :since:`Since 4.10.0` ), PCI address extensions depending on the
- architecture are supported. For example, PCI addresses for S390 guests will
- have a ``zpci`` child element, with two attributes: ``uid`` (a hex value
- between 0x0001 and 0xffff, inclusive), and ``fid`` (a hex value between
- 0x00000000 and 0xffffffff, inclusive) used by PCI devices on S390 for
- User-defined Identifiers and Function Identifiers.
- :since:`Since 1.3.5` , some hypervisor drivers may accept an
- ``<address type='pci'/>`` element with no other attributes as an
explicit
- request to assign a PCI address for the device rather than some other type of
- address that may also be appropriate for that same device (e.g. virtio-mmio).
- The relationship between the PCI addresses configured in the domain XML and
- those seen by the guest OS can sometime seem confusing: a separate document
- describes `how PCI addresses work <pci-addresses.html>`__ in more detail.
-``drive``
- Drive addresses have the following additional attributes: ``controller`` (a
- 2-digit controller number), ``bus`` (a 2-digit bus number), ``target`` (a
- 2-digit target number), and ``unit`` (a 2-digit unit number on the bus).
-``virtio-serial``
- Each virtio-serial address has the following additional attributes:
- ``controller`` (a 2-digit controller number), ``bus`` (a 2-digit bus number),
- and ``slot`` (a 2-digit slot within the bus).
-``ccid``
- A CCID address, for smart-cards, has the following additional attributes:
- ``bus`` (a 2-digit bus number), and ``slot`` attribute (a 2-digit slot within
- the bus). :since:`Since 0.8.8.`
-``usb``
- USB addresses have the following additional attributes: ``bus`` (a hex value
- between 0 and 0xfff, inclusive), and ``port`` (a dotted notation of up to
- four octets, such as 1.2 or 2.1.3.1).
-``spapr-vio``
- On PowerPC pseries guests, devices can be assigned to the SPAPR-VIO bus. It
- has a flat 32-bit address space; by convention, devices are generally
- assigned at a non-zero multiple of 0x00001000, but other addresses are valid
- and permitted by libvirt. Each address has the following additional
- attribute: ``reg`` (the hex value address of the starting register).
- :since:`Since 0.9.9.`
-``ccw``
- S390 guests with a ``machine`` value of s390-ccw-virtio use the native CCW
- bus for I/O devices. CCW bus addresses have the following additional
- attributes: ``cssid`` (a hex value between 0 and 0xfe, inclusive), ``ssid``
- (a value between 0 and 3, inclusive) and ``devno`` (a hex value between 0 and
- 0xffff, inclusive). Partially specified bus addresses are not allowed. If
- omitted, libvirt will assign a free bus address with cssid=0xfe and ssid=0.
- Virtio-ccw devices must have their cssid set to 0xfe. :since:`Since 1.0.4`
-``virtio-mmio``
- This places the device on the virtio-mmio transport, which is currently only
- available for some ``armv7l`` and ``aarch64`` virtual machines. virtio-mmio
- addresses do not have any additional attributes. :since:`Since 1.1.3`
- If the guest architecture is ``aarch64`` and the machine type is ``virt``,
- libvirt will automatically assign PCI addresses to devices; however, the
- presence of a single device with virtio-mmio address in the guest
- configuration will cause libvirt to assign virtio-mmio addresses to all
- further devices. :since:`Since 3.0.0`
-``isa``
- ISA addresses have the following additional attributes: ``iobase`` and
- ``irq``. :since:`Since 1.2.1`
-``unassigned``
- For PCI hostdevs, ``<address type='unassigned'/>`` allows the admin to
- include a PCI hostdev in the domain XML definition, without making it
- available for the guest. This allows for configurations in which Libvirt
- manages the device as a regular PCI hostdev, regardless of whether the guest
- will have access to it. ``<address type='unassigned'/>`` is an invalid
- address type for all other device types. :since:`Since 6.0.0`
-
-:anchor:`<a id="elementsVirtio"/>`
-
-Virtio-related options
-~~~~~~~~~~~~~~~~~~~~~~
-
-QEMU's virtio devices have some attributes related to the virtio transport under
-the ``driver`` element: The ``iommu`` attribute enables the use of emulated
-IOMMU by the device. The attribute ``ats`` controls the Address Translation
-Service support for PCIe devices. This is needed to make use of IOTLB support
-(see `IOMMU device <#elementsIommu>`__). Possible values are ``on`` or ``off``.
-:since:`Since 3.5.0`
-
-The attribute ``packed`` controls if QEMU should try to use packed virtqueues.
-Compared to regular split queues, packed queues consist of only a single
-descriptor ring replacing available and used ring, index and descriptor buffer.
-This can result in better cache utilization and performance. If packed
-virtqueues are actually used depends on the feature negotiation between QEMU,
-vhost backends and guest drivers. Possible values are ``on`` or ``off``.
-:since:`Since 6.3.0 (QEMU and KVM only)`
-
-:anchor:`<a id="elementsVirtioTransitional"/>`
-
-Virtio transitional devices
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-:since:`Since 5.2.0` , some of QEMU's virtio devices, when used with PCI/PCIe
-machine types, accept the following ``model`` values:
-
-``virtio-transitional``
- This device can work both with virtio 0.9 and virtio 1.0 guest drivers, so
- it's the best choice when compatibility with older guest operating systems is
- desired. libvirt will plug the device into a conventional PCI slot.
-``virtio-non-transitional``
- This device can only work with virtio 1.0 guest drivers, and it's the
- recommended option unless compatibility with older guest operating systems is
- necessary. libvirt will plug the device into either a PCI Express slot or a
- conventional PCI slot based on the machine type, resulting in a more
- optimized PCI topology.
-``virtio``
- This device will work like a ``virtio-non-transitional`` device when plugged
- into a PCI Express slot, and like a ``virtio-transitional`` device otherwise;
- libvirt will pick one or the other based on the machine type. This is the
- best choice when compatibility with libvirt versions older than 5.2.0 is
- necessary, but it's otherwise not recommended to use it.
-
-While the information outlined above applies to most virtio devices, there are a
-few exceptions:
-
-- for SCSI controllers, ``virtio-scsi`` must be used instead of ``virtio`` for
- backwards compatibility reasons;
-- some devices, such as GPUs and input devices (keyboard, tablet and mouse),
- are only defined in the virtio 1.0 spec and as such don't have a transitional
- variant: the only accepted model is ``virtio``, which will result in a
- non-transitional device.
-
-For more details see the `qemu patch
-posting <
https://lists.gnu.org/archive/html/qemu-devel/2018-12/msg00923.html>`__
-and the `virtio-1.0
-spec <
http://docs.oasis-open.org/virtio/virtio/v1.0/virtio-v1.0.html>`__.
-
-:anchor:`<a id="elementsControllers"/>`
-
-Controllers
-~~~~~~~~~~~
-
-Depending on the guest architecture, some device buses can appear more than
-once, with a group of virtual devices tied to a virtual controller. Normally,
-libvirt can automatically infer such controllers without requiring explicit XML
-markup, but sometimes it is necessary to provide an explicit controller element,
-notably when planning the `PCI topology <pci-hotplug.html>`__ for guests where
-device hotplug is expected.
-
-::
-
- ...
- <devices>
- <controller type='ide' index='0'/>
- <controller type='virtio-serial' index='0' ports='16'
vectors='4'/>
- <controller type='virtio-serial' index='1'>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x0a' function='0x0'/>
- </controller>
- <controller type='scsi' index='0'
model='virtio-scsi'>
- <driver iothread='4'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x0b' function='0x0'/>
- </controller>
- <controller type='xenbus' maxGrantFrames='64'
maxEventChannels='2047'/>
- ...
- </devices>
- ...
-
-Each controller has a mandatory attribute ``type``, which must be one of 'ide',
-'fdc', 'scsi', 'sata', 'usb', 'ccid',
'virtio-serial' or 'pci', and a mandatory
-attribute ``index`` which is the decimal integer describing in which order the
-bus controller is encountered (for use in ``controller`` attributes of
-``<address>`` elements). :since:`Since 1.3.5` the index is optional; if not
-specified, it will be auto-assigned to be the lowest unused index for the given
-controller type. Some controller types have additional attributes that control
-specific features, such as:
-
-``virtio-serial``
- The ``virtio-serial`` controller has two additional optional attributes
- ``ports`` and ``vectors``, which control how many devices can be connected
- through the controller. :since:`Since 5.2.0` , it supports an optional
- attribute ``model`` which can be 'virtio', 'virtio-transitional', or
- 'virtio-non-transitional'. See `Virtio transitional
- devices <#elementsVirtioTransitional>`__ for more details.
-``scsi``
- A ``scsi`` controller has an optional attribute ``model``, which is one of
- 'auto', 'buslogic', 'ibmvscsi', 'lsilogic',
'lsisas1068', 'lsisas1078',
- 'virtio-scsi', 'vmpvscsi', 'virtio-transitional',
'virtio-non-transitional'.
- See `Virtio transitional devices <#elementsVirtioTransitional>`__ for more
- details.
-``usb``
- A ``usb`` controller has an optional attribute ``model``, which is one of
- "piix3-uhci", "piix4-uhci", "ehci",
"ich9-ehci1", "ich9-uhci1", "ich9-uhci2",
- "ich9-uhci3", "vt82c686b-uhci", "pci-ohci",
"nec-xhci", "qusb1" (xen pvusb
- with qemu backend, version 1.1), "qusb2" (xen pvusb with qemu backend,
- version 2.0) or "qemu-xhci". Additionally, :since:`since 0.10.0` , if the
USB
- bus needs to be explicitly disabled for the guest, ``model='none'`` may be
- used. :since:`Since 1.0.5` , no default USB controller will be built on s390.
- :since:`Since 1.3.5` , USB controllers accept a ``ports`` attribute to
- configure how many devices can be connected to the controller.
-``ide``
- :since:`Since 3.10.0` for the vbox driver, the ``ide`` controller has an
- optional attribute ``model``, which is one of "piix3", "piix4" or
"ich6".
-``xenbus``
- :since:`Since 5.2.0` , the ``xenbus`` controller has an optional attribute
- ``maxGrantFrames``, which specifies the maximum number of grant frames the
- controller makes available for connected devices. :since:`Since 6.3.0` , the
- xenbus controller supports the optional ``maxEventChannels`` attribute, which
- specifies maximum number of event channels (PV interrupts) that can be used
- by the guest.
-
-Note: The PowerPC64 "spapr-vio" addresses do not have an associated
controller.
-
-For controllers that are themselves devices on a PCI or USB bus, an optional
-sub-element ``<address>`` can specify the exact relationship of the controller
-to its master bus, with semantics `given above <#elementsAddress>`__.
-
-An optional sub-element ``driver`` can specify the driver specific options:
-
-``queues``
- The optional ``queues`` attribute specifies the number of queues for the
- controller. For best performance, it's recommended to specify a value
- matching the number of vCPUs. :since:`Since 1.0.5 (QEMU and KVM only)`
-``cmd_per_lun``
- The optional ``cmd_per_lun`` attribute specifies the maximum number of
- commands that can be queued on devices controlled by the host. :since:`Since
- 1.2.7 (QEMU and KVM only)`
-``max_sectors``
- The optional ``max_sectors`` attribute specifies the maximum amount of data
- in bytes that will be transferred to or from the device in a single command.
- The transfer length is measured in sectors, where a sector is 512 bytes.
- :since:`Since 1.2.7 (QEMU and KVM only)`
-``ioeventfd``
- The optional ``ioeventfd`` attribute specifies whether the controller should
- use `I/O asynchronous handling <
https://patchwork.kernel.org/patch/43390/>`__
- or not. Accepted values are "on" and "off". :since:`Since 1.2.18`
-``iothread``
- Supported for controller type ``scsi`` using model ``virtio-scsi`` for
- ``address`` types ``pci`` and ``ccw`` :since:`since 1.3.5 (QEMU 2.4)` . The
- optional ``iothread`` attribute assigns the controller to an IOThread as
- defined by the range for the domain
- `iothreads <#elementsIOThreadsAllocation>`__ value. Each SCSI ``disk``
- assigned to use the specified ``controller`` will utilize the same IOThread.
- If a specific IOThread is desired for a specific SCSI ``disk``, then multiple
- controllers must be defined each having a specific ``iothread`` value. The
- ``iothread`` value must be within the range 1 to the domain iothreads value.
-virtio options
- For virtio controllers, `Virtio-specific options <#elementsVirtio>`__ can
- also be set. ( :since:`Since 3.5.0` )
-
-USB companion controllers have an optional sub-element ``<master>`` to specify
-the exact relationship of the companion to its master controller. A companion
-controller is on the same bus as its master, so the companion ``index`` value
-should be equal. Not all controller models can be used as companion controllers
-and libvirt might provide some sensible defaults (settings of
-``master startport`` and ``function`` of an address) for some particular models.
-Preferred companion controllers are ``ich-uhci[123]``.
-
-::
-
- ...
- <devices>
- <controller type='usb' index='0' model='ich9-ehci1'>
- <address type='pci' domain='0' bus='0' slot='4'
function='7'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci1'>
- <master startport='0'/>
- <address type='pci' domain='0' bus='0' slot='4'
function='0' multifunction='on'/>
- </controller>
- ...
- </devices>
- ...
-
-PCI controllers have an optional ``model`` attribute; possible values for this
-attribute are
-
-- ``pci-root``, ``pci-bridge`` ( :since:`since 1.0.5` )
-- ``pcie-root``, ``dmi-to-pci-bridge`` ( :since:`since 1.1.2` )
-- ``pcie-root-port``, ``pcie-switch-upstream-port``,
- ``pcie-switch-downstream-port`` ( :since:`since 1.2.19` )
-- ``pci-expander-bus``, ``pcie-expander-bus`` ( :since:`since 1.3.4` )
-- ``pcie-to-pci-bridge`` ( :since:`since 4.3.0` )
-
-The root controllers (``pci-root`` and ``pcie-root``) have an optional
-``pcihole64`` element specifying how big (in kilobytes, or in the unit specified
-by ``pcihole64``'s ``unit`` attribute) the 64-bit PCI hole should be. Some
-guests (like Windows XP or Windows Server 2003) might crash when QEMU and
-Seabios are recent enough to support 64-bit PCI holes, unless this is disabled
-(set to 0). :since:`Since 1.1.2 (QEMU only)`
-
-PCI controllers also have an optional subelement ``<model>`` with an attribute
-``name``. The name attribute holds the name of the specific device that qemu is
-emulating (e.g. "i82801b11-bridge") rather than simply the class of device
-("pcie-to-pci-bridge", "pci-bridge"), which is set in the controller
element's
-model **attribute**. In almost all cases, you should not manually add a
-``<model>`` subelement to a controller, nor should you modify one that is
-automatically generated by libvirt. :since:`Since 1.2.19 (QEMU only).`
-
-PCI controllers also have an optional subelement ``<target>`` with the
-attributes and subelements listed below. These are configurable items that 1)
-are visible to the guest OS so must be preserved for guest ABI compatibility,
-and 2) are usually left to default values or derived automatically by libvirt.
-In almost all cases, you should not manually add a ``<target>`` subelement to a
-controller, nor should you modify the values in the those that are automatically
-generated by libvirt. :since:`Since 1.2.19 (QEMU only).`
-
-``chassisNr``
- PCI controllers that have attribute model="pci-bridge", can also have a
- ``chassisNr`` attribute in the ``<target>`` subelement, which is used to
- control QEMU's "chassis_nr" option for the pci-bridge device (normally
- libvirt automatically sets this to the same value as the index attribute of
- the pci controller). If set, chassisNr must be between 1 and 255.
-``chassis``
- pcie-root-port and pcie-switch-downstream-port controllers can also have a
- ``chassis`` attribute in the ``<target>`` subelement, which is used to set
- the controller's "chassis" configuration value, which is visible to the
- virtual machine. If set, chassis must be between 0 and 255.
-``port``
- pcie-root-port and pcie-switch-downstream-port controllers can also have a
- ``port`` attribute in the ``<target>`` subelement, which is used to set the
- controller's "port" configuration value, which is visible to the
virtual
- machine. If set, port must be between 0 and 255.
-``hotplug``
- pcie-root-port and pcie-switch-downstream-port controllers can also have a
- ``hotplug`` attribute in the ``<target>`` subelement, which is used to
- disable hotplug/unplug of devices on a particular controller. The default
- setting of ``hotplug`` is ``on``; it should be set to ``off`` to disable
- hotplug/unplug of devices on a particular controller. :since:`Since 6.3.0`
-``busNr``
- pci-expander-bus and pcie-expander-bus controllers can have an optional
- ``busNr`` attribute (1-254). This will be the bus number of the new bus; All
- bus numbers between that specified and 255 will be available only for
- assignment to PCI/PCIe controllers plugged into the hierarchy starting with
- this expander bus, and bus numbers less than the specified value will be
- available to the next lower expander-bus (or the root-bus if there are no
- lower expander buses). If you do not specify a busNumber, libvirt will find
- the lowest existing busNumber in all other expander buses (or use 256 if
- there are no others) and auto-assign the busNr of that found bus - 2, which
- provides one bus number for the pci-expander-bus and one for the pci-bridge
- that is automatically attached to it (if you plan on adding more pci-bridges
- to the hierarchy of the bus, you should manually set busNr to a lower value).
-
- A similar algorithm is used for automatically determining the busNr attribute
- for pcie-expander-bus, but since the pcie-expander-bus doesn't have any
- built-in pci-bridge, the 2nd bus-number is just being reserved for the
- pcie-root-port that must necessarily be connected to the bus in order to
- actually plug in an endpoint device. If you intend to plug multiple devices
- into a pcie-expander-bus, you must connect a pcie-switch-upstream-port to the
- pcie-root-port that is plugged into the pcie-expander-bus, and multiple
- pcie-switch-downstream-ports to the pcie-switch-upstream-port, and of course
- for this to work properly, you will need to decrease the pcie-expander-bus'
- busNr accordingly so that there are enough unused bus numbers above it to
- accommodate giving out one bus number for the upstream-port and one for each
- downstream-port (in addition to the pcie-root-port and the pcie-expander-bus
- itself).
-
-``node``
- Some PCI controllers (``pci-expander-bus`` for the pc machine type,
- ``pcie-expander-bus`` for the q35 machine type and, :since:`since 3.6.0` ,
- ``pci-root`` for the pseries machine type) can have an optional ``<node>``
- subelement within the ``<target>`` subelement, which is used to set the NUMA
- node reported to the guest OS for that bus - the guest OS will then know that
- all devices on that bus are a part of the specified NUMA node (it is up to
- the user of the libvirt API to attach host devices to the correct
- pci-expander-bus when assigning them to the domain).
-``index``
- pci-root controllers for pSeries guests use this attribute to record the
- order they will show up in the guest. :since:`Since 3.6.0`
-
-For machine types which provide an implicit PCI bus, the pci-root controller
-with index=0 is auto-added and required to use PCI devices. pci-root has no
-address. PCI bridges are auto-added if there are too many devices to fit on the
-one bus provided by pci-root, or a PCI bus number greater than zero was
-specified. PCI bridges can also be specified manually, but their addresses
-should only refer to PCI buses provided by already specified PCI controllers.
-Leaving gaps in the PCI controller indexes might lead to an invalid
-configuration.
-
-::
-
- ...
- <devices>
- <controller type='pci' index='0' model='pci-root'/>
- <controller type='pci' index='1' model='pci-bridge'>
- <address type='pci' domain='0' bus='0' slot='5'
function='0' multifunction='off'/>
- </controller>
- </devices>
- ...
-
-For machine types which provide an implicit PCI Express (PCIe) bus (for example,
-the machine types based on the Q35 chipset), the pcie-root controller with
-index=0 is auto-added to the domain's configuration. pcie-root has also no
-address, provides 31 slots (numbered 1-31) that can be used to attach PCIe or
-PCI devices (although libvirt will never auto-assign a PCI device to a PCIe
-slot, it will allow manual specification of such an assignment). Devices
-connected to pcie-root cannot be hotplugged. If traditional PCI devices are
-present in the guest configuration, a ``pcie-to-pci-bridge`` controller will
-automatically be added: this controller, which plugs into a ``pcie-root-port``,
-provides 31 usable PCI slots (1-31) with hotplug support ( :since:`since 4.3.0`
-). If the QEMU binary doesn't support the corresponding device, then a
-``dmi-to-pci-bridge`` controller will be added instead, usually at the defacto
-standard location of slot=0x1e. A dmi-to-pci-bridge controller plugs into a PCIe
-slot (as provided by pcie-root), and itself provides 31 standard PCI slots
-(which also do not support device hotplug). In order to have hot-pluggable PCI
-slots in the guest system, a pci-bridge controller will also be automatically
-created and connected to one of the slots of the auto-created dmi-to-pci-bridge
-controller; all guest PCI devices with addresses that are auto-determined by
-libvirt will be placed on this pci-bridge device. ( :since:`since 1.1.2` ).
-
-Domains with an implicit pcie-root can also add controllers with
-``model='pcie-root-port'``, ``model='pcie-switch-upstream-port'``, and
-``model='pcie-switch-downstream-port'``. pcie-root-port is a simple type of
-bridge device that can connect only to one of the 31 slots on the pcie-root bus
-on its upstream side, and makes a single (PCIe, hotpluggable) port available on
-the downstream side (at slot='0'). pcie-root-port can be used to provide a
-single slot to later hotplug a PCIe device (but is not itself hotpluggable - it
-must be in the configuration when the domain is started). ( :since:`since
-1.2.19` )
-
-pcie-switch-upstream-port is a more flexible (but also more complex) device that
-can only plug into a pcie-root-port or pcie-switch-downstream-port on the
-upstream side (and only before the domain is started - it is not hot-pluggable),
-and provides 32 ports on the downstream side (slot='0' - slot='31') that
accept
-only pcie-switch-downstream-port devices; each pcie-switch-downstream-port
-device can only plug into a pcie-switch-upstream-port on its upstream side
-(again, not hot-pluggable), and on its downstream side provides a single
-hotpluggable pcie port that can accept any standard pci or pcie device (or
-another pcie-switch-upstream-port), i.e. identical in function to a
-pcie-root-port. ( :since:`since 1.2.19` )
-
-::
-
- ...
- <devices>
- <controller type='pci' index='0' model='pcie-root'/>
- <controller type='pci' index='1'
model='pcie-root-port'>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
- </controller>
- <controller type='pci' index='2'
model='pcie-to-pci-bridge'>
- <address type='pci' domain='0x0000' bus='0x01'
slot='0x00' function='0x0'/>
- </controller>
- </devices>
- ...
-
-:anchor:`<a id="elementsLease"/>`
-
-Device leases
-~~~~~~~~~~~~~
-
-When using a lock manager, it may be desirable to record device leases against a
-VM. The lock manager will ensure the VM won't start unless the leases can be
-acquired.
-
-::
-
- ...
- <devices>
- ...
- <lease>
- <lockspace>somearea</lockspace>
- <key>somekey</key>
- <target path='/some/lease/path' offset='1024'/>
- </lease>
- ...
- </devices>
- ...
-
-``lockspace``
- This is an arbitrary string, identifying the lockspace within which the key
- is held. Lock managers may impose extra restrictions on the format, or length
- of the lockspace name.
-``key``
- This is an arbitrary string, uniquely identifying the lease to be acquired.
- Lock managers may impose extra restrictions on the format, or length of the
- key.
-``target``
- This is the fully qualified path of the file associated with the lockspace.
- The offset specifies where the lease is stored within the file. If the lock
- manager does not require an offset, just pass 0.
-
-:anchor:`<a id="elementsHostDev"/>`
-
-Host device assignment
-~~~~~~~~~~~~~~~~~~~~~~
-
-:anchor:`<a id="elementsHostDevSubsys"/>`
-
-USB / PCI / SCSI devices
-^^^^^^^^^^^^^^^^^^^^^^^^
-
-USB, PCI and SCSI devices attached to the host can be passed through to the
-guest using the ``hostdev`` element. :since:`since after 0.4.4 for USB, 0.6.0
-for PCI (KVM only) and 1.0.6 for SCSI (KVM only)` :
-
-::
-
- ...
- <devices>
- <hostdev mode='subsystem' type='usb'>
- <source startupPolicy='optional'>
- <vendor id='0x1234'/>
- <product id='0xbeef'/>
- </source>
- <boot order='2'/>
- </hostdev>
- </devices>
- ...
-
-or:
-
-::
-
- ...
- <devices>
- <hostdev mode='subsystem' type='pci' managed='yes'>
- <source>
- <address domain='0x0000' bus='0x06' slot='0x02'
function='0x0'/>
- </source>
- <boot order='1'/>
- <rom bar='on' file='/etc/fake/boot.bin'/>
- </hostdev>
- </devices>
- ...
-
-or:
-
-::
-
- ...
- <devices>
- <hostdev mode='subsystem' type='scsi' sgio='filtered'
rawio='yes'>
- <source>
- <adapter name='scsi_host0'/>
- <address bus='0' target='0' unit='0'/>
- </source>
- <readonly/>
- <address type='drive' controller='0' bus='0'
target='0' unit='0'/>
- </hostdev>
- </devices>
- ...
-
-or:
-
-::
-
- ...
- <devices>
- <hostdev mode='subsystem' type='scsi'>
- <source protocol='iscsi'
name='iqn.2014-08.com.example:iscsi-nopool/1'>
- <host name='example.com' port='3260'/>
- <auth username='myuser'>
- <secret type='iscsi' usage='libvirtiscsi'/>
- </auth>
- </source>
- <address type='drive' controller='0' bus='0'
target='0' unit='0'/>
- </hostdev>
- </devices>
- ...
-
-or:
-
-::
-
- ...
- <devices>
- <hostdev mode='subsystem' type='scsi_host'>
- <source protocol='vhost' wwpn='naa.50014057667280d8'/>
- </hostdev>
- </devices>
- ...
-
-or:
-
-::
-
- ...
- <devices>
- <hostdev mode='subsystem' type='mdev'
model='vfio-pci'>
- <source>
- <address uuid='c2177883-f1bb-47f0-914d-32a22e3a8804'/>
- </source>
- </hostdev>
- <hostdev mode='subsystem' type='mdev'
model='vfio-ccw'>
- <source>
- <address uuid='9063cba3-ecef-47b6-abcf-3fef4fdcad85'/>
- </source>
- <address type='ccw' cssid='0xfe' ssid='0x0'
devno='0x0001'/>
- </hostdev>
- </devices>
- ...
-
-``hostdev``
- The ``hostdev`` element is the main container for describing host devices.
- For each device, the ``mode`` is always "subsystem" and the ``type`` is one
- of the following values with additional attributes noted.
-
- ``usb``
- USB devices are detached from the host on guest startup and reattached
- after the guest exits or the device is hot-unplugged.
- ``pci``
- For PCI devices, when ``managed`` is "yes" it is detached from the host
- before being passed on to the guest and reattached to the host after the
- guest exits. If ``managed`` is omitted or "no", the user is responsible
to
- call ``virNodeDeviceDetachFlags`` (or ``virsh nodedev-detach`` before
- starting the guest or hot-plugging the device and
- ``virNodeDeviceReAttach`` (or ``virsh nodedev-reattach``) after hot-unplug
- or stopping the guest.
- ``scsi``
- For SCSI devices, user is responsible to make sure the device is not used
- by host. If supported by the hypervisor and OS, the optional ``sgio`` (
- :since:`since 1.0.6` ) attribute indicates whether unprivileged SG_IO
- commands are filtered for the disk. Valid settings are "filtered" or
- "unfiltered", where the default is "filtered". The optional
``rawio`` (
- :since:`since 1.2.9` ) attribute indicates whether the lun needs the rawio
- capability. Valid settings are "yes" or "no". See the rawio
description
- within the `disk <#elementsDisks>`__ section. If a disk lun in the domain
- already has the rawio capability, then this setting not required.
- ``scsi_host``
- :since:`since 2.5.0` For SCSI devices, user is responsible to make sure
- the device is not used by host. This ``type`` passes all LUNs presented by
- a single HBA to the guest. :since:`Since 5.2.0,` the ``model`` attribute
- can be specified further with "virtio-transitional",
- "virtio-non-transitional", or "virtio". See `Virtio
transitional
- devices <#elementsVirtioTransitional>`__ for more details.
- ``mdev``
- For mediated devices ( :since:`Since 3.2.0` ) the ``model`` attribute
- specifies the device API which determines how the host's vfio driver will
- expose the device to the guest. Currently, ``model='vfio-pci'``,
- ``model='vfio-ccw'`` ( :since:`Since 4.4.0` ) and
``model='vfio-ap'`` (
- :since:`Since 4.9.0` ) is supported. `MDEV <drvnodedev.html#MDEV>`__
- section provides more information about mediated devices as well as how to
- create mediated devices on the host. :since:`Since 4.6.0 (QEMU 2.12)` an
- optional ``display`` attribute may be used to enable or disable support
- for an accelerated remote desktop backed by a mediated device (such as
- NVIDIA vGPU or Intel GVT-g) as an alternative to emulated `video
- devices <#elementsVideo>`__. This attribute is limited to
- ``model='vfio-pci'`` only. Supported values are either ``on`` or ``off``
- (default is 'off'). It is required to use a `graphical
- framebuffer <#elementsGraphics>`__ in order to use this attribute,
- currently only supported with VNC, Spice and egl-headless graphics
- devices. :since:`Since version 5.10.0` , there is an optional ``ramfb``
- attribute for devices with ``model='vfio-pci'``. Supported values are
- either ``on`` or ``off`` (default is 'off'). When enabled, this attribute
- provides a memory framebuffer device to the guest. This framebuffer will
- be used as a boot display when a vgpu device is the primary display.
-
- Note: There are also some implications on the usage of guest's address
- type depending on the ``model`` attribute, see the ``address`` element
- below.
-
- Note: The ``managed`` attribute is only used with ``type='pci'`` and is
- ignored by all the other device types, thus setting ``managed`` explicitly
- with other than a PCI device has the same effect as omitting it. Similarly,
- ``model`` attribute is only supported by mediated devices and ignored by all
- other device types.
-
-``source``
- The source element describes the device as seen from the host using the
- following mechanism to describe:
-
- ``usb``
- The USB device can either be addressed by vendor / product id using the
- ``vendor`` and ``product`` elements or by the device's address on the host
- using the ``address`` element.
-
- :since:`Since 1.0.0` , the ``source`` element of USB devices may contain
- ``startupPolicy`` attribute which can be used to define policy what to do
- if the specified host USB device is not found. The attribute accepts the
- following values:
-
- ========= =====================================================================
- mandatory fail if missing for any reason (the default)
- requisite fail if missing on boot up, drop if missing on migrate/restore/revert
- optional drop if missing at any start attempt
- ========= =====================================================================
-
- ``pci``
- PCI devices can only be described by their ``address``.
- ``scsi``
- SCSI devices are described by both the ``adapter`` and ``address``
- elements. The ``address`` element includes a ``bus`` attribute (a 2-digit
- bus number), a ``target`` attribute (a 10-digit target number), and a
- ``unit`` attribute (a 20-digit unit number on the bus). Not all
- hypervisors support larger ``target`` and ``unit`` values. It is up to
- each hypervisor to determine the maximum value supported for the adapter.
-
- :since:`Since 1.2.8` , the ``source`` element of a SCSI device may contain
- the ``protocol`` attribute. When the attribute is set to "iscsi", the
host
- device XML follows the network `disk <#elementsDisks>`__ device using the
- same ``name`` attribute and optionally using the ``auth`` element to
- provide the authentication credentials to the iSCSI server.
-
- ``scsi_host``
- :since:`Since 2.5.0` , multiple LUNs behind a single SCSI HBA are
- described by a ``protocol`` attribute set to "vhost" and a ``wwpn``
- attribute that is the vhost_scsi wwpn (16 hexadecimal digits with a prefix
- of "naa.") established in the host configfs.
- ``mdev``
- Mediated devices ( :since:`Since 3.2.0` ) are described by the ``address``
- element. The ``address`` element contains a single mandatory attribute
- ``uuid``.
-
-``vendor``, ``product``
- The ``vendor`` and ``product`` elements each have an ``id`` attribute that
- specifies the USB vendor and product id. The ids can be given in decimal,
- hexadecimal (starting with 0x) or octal (starting with 0) form.
-``boot``
- Specifies that the device is bootable. The ``order`` attribute determines the
- order in which devices will be tried during boot sequence. The per-device
- ``boot`` elements cannot be used together with general boot elements in `BIOS
- bootloader <#elementsOSBIOS>`__ section. :since:`Since 0.8.8` for PCI
- devices, :since:`Since 1.0.1` for USB devices.
-``rom``
- The ``rom`` element is used to change how a PCI device's ROM is presented to
- the guest. The optional ``bar`` attribute can be set to "on" or
"off", and
- determines whether or not the device's ROM will be visible in the guest's
- memory map. (In PCI documentation, the "rombar" setting controls the
presence
- of the Base Address Register for the ROM). If no rom bar is specified, the
- qemu default will be used (older versions of qemu used a default of "off",
- while newer qemus have a default of "on"). :since:`Since 0.9.7 (QEMU and
KVM
- only)` . The optional ``file`` attribute contains an absolute path to a
- binary file to be presented to the guest as the device's ROM BIOS. This can
- be useful, for example, to provide a PXE boot ROM for a virtual function of
- an sr-iov capable ethernet device (which has no boot ROMs for the VFs).
- :since:`Since 0.9.10 (QEMU and KVM only)` . The optional ``enabled``
- attribute can be set to ``no`` to disable PCI ROM loading completely for the
- device; if PCI ROM loading is disabled through this attribute, attempts to
- tweak the loading process further using the ``bar`` or ``file`` attributes
- will be rejected. :since:`Since 4.3.0 (QEMU and KVM only)` .
-``address``
- The ``address`` element for USB devices has a ``bus`` and ``device``
- attribute to specify the USB bus and device number the device appears at on
- the host. The values of these attributes can be given in decimal, hexadecimal
- (starting with 0x) or octal (starting with 0) form. For PCI devices the
- element carries 4 attributes allowing to designate the device as can be found
- with the ``lspci`` or with ``virsh nodedev-list``. For SCSI devices a 'drive'
- address type must be used. For mediated devices, which are software-only
- devices defining an allocation of resources on the physical parent device,
- the address type used must conform to the ``model`` attribute of element
- ``hostdev``, e.g. any address type other than PCI for ``vfio-pci`` device API
- or any address type other than CCW for ``vfio-ccw`` device API will result in
- an error. `See above <#elementsAddress>`__ for more details on the address
- element.
-``driver``
- PCI devices can have an optional ``driver`` subelement that specifies which
- backend driver to use for PCI device assignment. Use the ``name`` attribute
- to select either "vfio" (for the new VFIO device assignment backend, which
is
- compatible with UEFI SecureBoot) or "kvm" (the legacy device assignment
- handled directly by the KVM kernel module) :since:`Since 1.0.5 (QEMU and KVM
- only, requires kernel 3.6 or newer)` . When specified, device assignment will
- fail if the requested method of device assignment isn't available on the
- host. When not specified, the default is "vfio" on systems where the VFIO
- driver is available and loaded, and "kvm" on older systems, or those where
- the VFIO driver hasn't been loaded :since:`Since 1.1.3` (prior to that the
- default was always "kvm").
-``readonly``
- Indicates that the device is readonly, only supported by SCSI host device
- now. :since:`Since 1.0.6 (QEMU and KVM only)`
-``shareable``
- If present, this indicates the device is expected to be shared between
- domains (assuming the hypervisor and OS support this). Only supported by SCSI
- host device. :since:`Since 1.0.6`
-
- Note: Although ``shareable`` was introduced :since:`in 1.0.6` , it did not
- work as as expected until :since:`1.2.2` .
-
-:anchor:`<a id="elementsHostDevCaps"/>`
-
-Block / character devices
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Block / character devices from the host can be passed through to the guest using
-the ``hostdev`` element. This is only possible with container based
-virtualization. Devices are specified by a fully qualified path. :since:`since
-after 1.0.1 for LXC` :
-
-::
-
- ...
- <hostdev mode='capabilities' type='storage'>
- <source>
- <block>/dev/sdf1</block>
- </source>
- </hostdev>
- ...
-
-::
-
- ...
- <hostdev mode='capabilities' type='misc'>
- <source>
- <char>/dev/input/event3</char>
- </source>
- </hostdev>
- ...
-
-::
-
- ...
- <hostdev mode='capabilities' type='net'>
- <source>
- <interface>eth0</interface>
- </source>
- </hostdev>
- ...
-
-``hostdev``
- The ``hostdev`` element is the main container for describing host devices.
- For block/character device passthrough ``mode`` is always "capabilities"
and
- ``type`` is "storage" for a block device, "misc" for a character
device and
- "net" for a host network interface.
-``source``
- The source element describes the device as seen from the host. For block
- devices, the path to the block device in the host OS is provided in the
- nested "block" element, while for character devices the "char"
element is
- used. For network interfaces, the name of the interface is provided in the
- "interface" element.
-
-:anchor:`<a id="elementsRedir"/>`
-
-Redirected devices
-~~~~~~~~~~~~~~~~~~
-
-USB device redirection through a character device is supported :since:`since
-after 0.9.5 (KVM only)` :
-
-::
-
- ...
- <devices>
- <redirdev bus='usb' type='tcp'>
- <source mode='connect' host='localhost'
service='4000'/>
- <boot order='1'/>
- </redirdev>
- <redirfilter>
- <usbdev class='0x08' vendor='0x1234' product='0xbeef'
version='2.56' allow='yes'/>
- <usbdev allow='no'/>
- </redirfilter>
- </devices>
- ...
-
-``redirdev``
- The ``redirdev`` element is the main container for describing redirected
- devices. ``bus`` must be "usb" for a USB device. An additional attribute
- ``type`` is required, matching one of the supported `serial
- device <#elementsConsole>`__ types, to describe the host side of the tunnel;
- ``type='tcp'`` or ``type='spicevmc'`` (which uses the usbredir channel
of a
- `SPICE graphics device <#elementsGraphics>`__) are typical. The redirdev
- element has an optional sub-element ``<address>`` which can tie the device to
- a particular controller. Further sub-elements, such as ``<source>``, may be
- required according to the given type, although a ``<target>`` sub-element is
- not required (since the consumer of the character device is the hypervisor
- itself, rather than a device visible in the guest).
-``boot``
- Specifies that the device is bootable. The ``order`` attribute determines the
- order in which devices will be tried during boot sequence. The per-device
- ``boot`` elements cannot be used together with general boot elements in `BIOS
- bootloader <#elementsOSBIOS>`__ section. ( :since:`Since 1.0.1` )
-``redirfilter``
- The\ ``redirfilter``\ element is used for creating the filter rule to filter
- out certain devices from redirection. It uses sub-element ``<usbdev>`` to
- define each filter rule. ``class`` attribute is the USB Class code, for
- example, 0x08 represents mass storage devices. The USB device can be
- addressed by vendor / product id using the ``vendor`` and ``product``
- attributes. ``version`` is the device revision from the bcdDevice field (not
- the version of the USB protocol). These four attributes are optional and
- ``-1`` can be used to allow any value for them. ``allow`` attribute is
- mandatory, 'yes' means allow, 'no' for deny.
-
-:anchor:`<a id="elementsSmartcard"/>`
-
-Smartcard devices
-~~~~~~~~~~~~~~~~~
-
-A virtual smartcard device can be supplied to the guest via the ``smartcard``
-element. A USB smartcard reader device on the host cannot be used on a guest
-with simple device passthrough, since it will then not be available on the host,
-possibly locking the host computer when it is "removed". Therefore, some
-hypervisors provide a specialized virtual device that can present a smartcard
-interface to the guest, with several modes for describing how credentials are
-obtained from the host or even a from a channel created to a third-party
-smartcard provider. :since:`Since 0.8.8`
-
-::
-
- ...
- <devices>
- <smartcard mode='host'/>
- <smartcard mode='host-certificates'>
- <certificate>cert1</certificate>
- <certificate>cert2</certificate>
- <certificate>cert3</certificate>
- <database>/etc/pki/nssdb/</database>
- </smartcard>
- <smartcard mode='passthrough' type='tcp'>
- <source mode='bind' host='127.0.0.1'
service='2001'/>
- <protocol type='raw'/>
- <address type='ccid' controller='0' slot='0'/>
- </smartcard>
- <smartcard mode='passthrough' type='spicevmc'/>
- </devices>
- ...
-
-The ``<smartcard>`` element has a mandatory attribute ``mode``. The following
-modes are supported; in each mode, the guest sees a device on its USB bus that
-behaves like a physical USB CCID (Chip/Smart Card Interface Device) card.
-
-``host``
- The simplest operation, where the hypervisor relays all requests from the
- guest into direct access to the host's smartcard via NSS. No other attributes
- or sub-elements are required. See below about the use of an optional
- ``<address>`` sub-element.
-``host-certificates``
- Rather than requiring a smartcard to be plugged into the host, it is possible
- to provide three NSS certificate names residing in a database on the host.
- These certificates can be generated via the command
- ``certutil -d /etc/pki/nssdb -x -t CT,CT,CT -S -s CN=cert1 -n cert1``,
- and the resulting three certificate names must be supplied as the content of
- each of three ``<certificate>`` sub-elements. An additional sub-element
- ``<database>`` can specify the absolute path to an alternate directory
- (matching the ``-d`` option of the ``certutil`` command when creating the
- certificates); if not present, it defaults to /etc/pki/nssdb.
-``passthrough``
- Rather than having the hypervisor directly communicate with the host, it is
- possible to tunnel all requests through a secondary character device to a
- third-party provider (which may in turn be talking to a smartcard or using
- three certificate files). In this mode of operation, an additional attribute
- ``type`` is required, matching one of the supported `serial
- device <#elementsConsole>`__ types, to describe the host side of the tunnel;
- ``type='tcp'`` or ``type='spicevmc'`` (which uses the smartcard
channel of a
- `SPICE graphics device <#elementsGraphics>`__) are typical. Further
- sub-elements, such as ``<source>``, may be required according to the given
- type, although a ``<target>`` sub-element is not required (since the consumer
- of the character device is the hypervisor itself, rather than a device
- visible in the guest).
-
-Each mode supports an optional sub-element ``<address>``, which fine-tunes the
-correlation between the smartcard and a ccid bus controller, `documented
-above <#elementsAddress>`__. For now, qemu only supports at most one smartcard,
-with an address of bus=0 slot=0.
-
-:anchor:`<a id="elementsNICS"/>`
-
-Network interfaces
-~~~~~~~~~~~~~~~~~~
-
-::
-
- ...
- <devices>
- <interface type='direct' trustGuestRxFilters='yes'>
- <source dev='eth0'/>
- <mac address='52:54:00:5d:c7:9e'/>
- <boot order='1'/>
- <rom bar='off'/>
- </interface>
- </devices>
- ...
-
-There are several possibilities for specifying a network interface visible to
-the guest. Each subsection below provides more details about common setup
-options.
-
-:since:`Since 1.2.10` ), the ``interface`` element property
-``trustGuestRxFilters`` provides the capability for the host to detect and trust
-reports from the guest regarding changes to the interface mac address and
-receive filters by setting the attribute to ``yes``. The default setting for the
-attribute is ``no`` for security reasons and support depends on the guest
-network device model as well as the type of connection on the host - currently
-it is only supported for the virtio device model and for macvtap connections on
-the host.
-
-Each ``<interface>`` element has an optional ``<address>`` sub-element that
can
-tie the interface to a particular pci slot, with attribute ``type='pci'`` as
-`documented above <#elementsAddress>`__.
-
-:since:`Since 6.6.0` , one can force libvirt to keep the provided MAC address
-when it's in the reserved VMware range by adding a ``type="static"``
attribute
-to the ``<mac/>`` element. Note that this attribute is useless if the provided
-MAC address is outside of the reserved VMWare ranges.
-
-:anchor:`<a id="elementsNICSVirtual"/>`
-
-Virtual network
-^^^^^^^^^^^^^^^
-
-**This is the recommended config for general guest connectivity on hosts with
-dynamic / wireless networking configs (or multi-host environments where the host
-hardware details are described separately in a ``<network>`` definition
-:since:`Since 0.9.4` ).**
-
-Provides a connection whose details are described by the named network
-definition. Depending on the virtual network's "forward mode"
configuration, the
-network may be totally isolated (no ``<forward>`` element given), NAT'ing to
an
-explicit network device or to the default route (``<forward
mode='nat'>``),
-routed with no NAT (``<forward mode='route'/>``), or connected directly to
one
-of the host's network interfaces (via macvtap) or bridge devices
-((``<forward mode='bridge|private|vepa|passthrough'/>``
:since:`Since
-0.9.4` )
-
-For networks with a forward mode of bridge, private, vepa, and passthrough, it
-is assumed that the host has any necessary DNS and DHCP services already setup
-outside the scope of libvirt. In the case of isolated, nat, and routed networks,
-DHCP and DNS are provided on the virtual network by libvirt, and the IP range
-can be determined by examining the virtual network config with
-'``virsh net-dumpxml [networkname]``'. There is one virtual network called
-'default' setup out of the box which does NAT'ing to the default route and
has
-an IP range of ``192.168.122.0/255.255.255.0``. Each guest will have an
-associated tun device created with a name of vnetN, which can also be overridden
-with the <target> element (see `overriding the target
-element <#elementsNICSTargetOverride>`__).
-
-When the source of an interface is a network, a ``portgroup`` can be specified
-along with the name of the network; one network may have multiple portgroups
-defined, with each portgroup containing slightly different configuration
-information for different classes of network connections. :since:`Since 0.9.4` .
-
-When a guest is running an interface of type ``network`` may include a
-``portid`` attribute. This provides the UUID of an associated virNetworkPortPtr
-object that records the association between the domain interface and the
-network. This attribute is read-only since port objects are create and deleted
-automatically during startup and shutdown. :since:`Since 5.1.0`
-
-Also, similar to ``direct`` network connections (described below), a connection
-of type ``network`` may specify a ``virtualport`` element, with configuration
-data to be forwarded to a vepa (802.1Qbg) or 802.1Qbh compliant switch (
-:since:`Since 0.8.2` ), or to an Open vSwitch virtual switch ( :since:`Since
-0.9.11` ).
-
-Since the actual type of switch may vary depending on the configuration in the
-``<network>`` on the host, it is acceptable to omit the virtualport ``type``
-attribute, and specify attributes from multiple different virtualport types (and
-also to leave out certain attributes); at domain startup time, a complete
-``<virtualport>`` element will be constructed by merging together the type and
-attributes defined in the network and the portgroup referenced by the interface.
-The newly-constructed virtualport is a combination of them. The attributes from
-lower virtualport can't make change on the ones defined in higher virtualport.
-Interface takes the highest priority, portgroup is lowest priority. (
-:since:`Since 0.10.0` ). For example, in order to work properly with both an
-802.1Qbh switch and an Open vSwitch switch, you may choose to specify no type,
-but both a ``profileid`` (in case the switch is 802.1Qbh) and an ``interfaceid``
-(in case the switch is Open vSwitch) (you may also omit the other attributes,
-such as managerid, typeid, or profileid, to be filled in from the network's
-``<virtualport>``). If you want to limit a guest to connecting only to certain
-types of switches, you can specify the virtualport type, but still omit some/all
-of the parameters - in this case if the host's network has a different type of
-virtualport, connection of the interface will fail.
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- </interface>
- ...
- <interface type='network'>
- <source network='default' portgroup='engineering'/>
- <target dev='vnet7'/>
- <mac address="00:11:22:33:44:55"/>
- <virtualport>
- <parameters instanceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
- </virtualport>
- </interface>
- </devices>
- ...
-
-:anchor:`<a id="elementsNICSBridge"/>`
-
-Bridge to LAN
-^^^^^^^^^^^^^
-
-**This is the recommended config for general guest connectivity on hosts with
-static wired networking configs.**
-
-Provides a bridge from the VM directly to the LAN. This assumes there is a
-bridge device on the host which has one or more of the hosts physical NICs
-attached. The guest VM will have an associated tun device created with a name of
-vnetN, which can also be overridden with the <target> element (see `overriding
-the target element <#elementsNICSTargetOverride>`__). The tun device will be
-attached to the bridge. The IP range / network configuration is whatever is used
-on the LAN. This provides the guest VM full incoming & outgoing net access just
-like a physical machine.
-
-On Linux systems, the bridge device is normally a standard Linux host bridge. On
-hosts that support Open vSwitch, it is also possible to connect to an Open
-vSwitch bridge device by adding a ``<virtualport type='openvswitch'/>`` to
the
-interface definition. ( :since:`Since 0.9.11` ). The Open vSwitch type
-virtualport accepts two parameters in its ``<parameters>`` element - an
-``interfaceid`` which is a standard uuid used to uniquely identify this
-particular interface to Open vSwitch (if you do not specify one, a random
-interfaceid will be generated for you when you first define the interface), and
-an optional ``profileid`` which is sent to Open vSwitch as the interfaces
-"port-profile".
-
-::
-
- ...
- <devices>
- ...
- <interface type='bridge'>
- <source bridge='br0'/>
- </interface>
- <interface type='bridge'>
- <source bridge='br1'/>
- <target dev='vnet7'/>
- <mac address="00:11:22:33:44:55"/>
- </interface>
- <interface type='bridge'>
- <source bridge='ovsbr'/>
- <virtualport type='openvswitch'>
- <parameters profileid='menial'
interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
- </virtualport>
- </interface>
- ...
- </devices>
- ...
-
-On hosts that support Open vSwitch on the kernel side and have the Midonet Host
-Agent configured, it is also possible to connect to the 'midonet' bridge device
-by adding a ``<virtualport type='midonet'/>`` to the interface definition.
(
-:since:`Since 1.2.13` ). The Midonet virtualport type requires an
-``interfaceid`` attribute in its ``<parameters>`` element. This interface id is
-the UUID that specifies which port in the virtual network topology will be bound
-to the interface.
-
-::
-
- ...
- <devices>
- ...
- <interface type='bridge'>
- <source bridge='br0'/>
- </interface>
- <interface type='bridge'>
- <source bridge='br1'/>
- <target dev='vnet7'/>
- <mac address="00:11:22:33:44:55"/>
- </interface>
- <interface type='bridge'>
- <source bridge='midonet'/>
- <virtualport type='midonet'>
- <parameters interfaceid='0b2d64da-3d0e-431e-afdd-804415d6ebbb'/>
- </virtualport>
- </interface>
- ...
- </devices>
- ...
-
-:anchor:`<a id="elementsNICSSlirp"/>`
-
-Userspace SLIRP stack
-^^^^^^^^^^^^^^^^^^^^^
-
-Provides a virtual LAN with NAT to the outside world. The virtual network has
-DHCP & DNS services and will give the guest VM addresses starting from
-``10.0.2.15``. The default router will be ``10.0.2.2`` and the DNS server will
-be ``10.0.2.3``. This networking is the only option for unprivileged users who
-need their VMs to have outgoing access. :since:`Since 3.8.0` it is possible to
-override the default network address by including an ``ip`` element specifying
-an IPv4 address in its one mandatory attribute, ``address``. Optionally, a
-second ``ip`` element with a ``family`` attribute set to "ipv6" can be
specified
-to add an IPv6 address to the interface. ``address``. Optionally, address
-``prefix`` can be specified.
-
-::
-
- ...
- <devices>
- <interface type='user'/>
- ...
- <interface type='user'>
- <mac address="00:11:22:33:44:55"/>
- <ip family='ipv4' address='172.17.2.0'
prefix='24'/>
- <ip family='ipv6' address='2001:db8:ac10:fd01::'
prefix='64'/>
- </interface>
- </devices>
- ...
-
-:anchor:`<a id="elementsNICSEthernet"/>`
-
-Generic ethernet connection
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Provides a means to use a new or existing tap device (or veth device pair,
-depening on the needs of the hypervisor driver) that is partially or wholly
-setup external to libvirt (either prior to the guest starting, or while the
-guest is being started via an optional script specified in the config).
-
-The name of the tap device can optionally be specified with the ``dev``
-attribute of the ``<target>`` element. If no target dev is specified, libvirt
-will create a new standard tap device with a name of the pattern "vnetN",
where
-"N" is replaced with a number. If a target dev is specified and that device
-doesn't exist, then a new standard tap device will be created with the exact dev
-name given. If the specified target dev does exist, then that existing device
-will be used. Usually some basic setup of the device is done by libvirt,
-including setting a MAC address, and the IFF_UP flag, but if the ``dev`` is a
-pre-existing device, and the ``managed`` attribute of the ``target`` element is
-also set to "no" (the default value is "yes"), even this basic setup
will not be
-performed - libvirt will simply pass the device on to the hypervisor with no
-setup at all. :since:`Since 5.7.0` Using managed='no' with a pre-created tap
-device is useful because it permits a virtual machine managed by an unprivileged
-libvirtd to have emulated network devices based on tap devices.
-
-After creating/opening the tap device, an optional shell script (given in the
-``path`` attribute of the ``<script>`` element) will be run. :since:`Since
-0.2.1` Also, after detaching/closing the tap device, an optional shell script
-(given in the ``path`` attribute of the ``<downscript>`` element) will be run.
-:since:`Since 5.1.0` These can be used to do whatever extra host network
-integration is required.
-
-::
-
- ...
- <devices>
- <interface type='ethernet'>
- <script path='/etc/qemu-ifup-mynet'/>
- <downscript path='/etc/qemu-ifdown-mynet'/>
- </interface>
- ...
- <interface type='ethernet'>
- <target dev='mytap1' managed='no'/>
- <model type='virtio'/>
- </interface>
- </devices>
- ...
-
-:anchor:`<a id="elementsNICSDirect"/>`
-
-Direct attachment to physical interface
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-| Provides direct attachment of the virtual machine's NIC to the given physical
- interface of the host. :since:`Since 0.7.7 (QEMU and KVM only)`
-| This setup requires the Linux macvtap driver to be available. :since:`(Since
- Linux 2.6.34.)` One of the modes 'vepa' ( `'Virtual Ethernet Port
- Aggregator'
<
http://www.ieee802.org/1/files/public/docs2009/new-evb-congdon-vepa-modul...),
- 'bridge' or 'private' can be chosen for the operation mode of the
macvtap
- device, 'vepa' being the default mode. The individual modes cause the delivery
- of packets to behave as follows:
-
-If the model type is set to ``virtio`` and interface's ``trustGuestRxFilters``
-attribute is set to ``yes``, changes made to the interface mac address,
-unicast/multicast receive filters, and vlan settings in the guest will be
-monitored and propagated to the associated macvtap device on the host (
-:since:`Since 1.2.10` ). If ``trustGuestRxFilters`` is not set, or is not
-supported for the device model in use, an attempted change to the mac address
-originating from the guest side will result in a non-working network connection.
-
-``vepa``
- All VMs' packets are sent to the external bridge. Packets whose destination
- is a VM on the same host as where the packet originates from are sent back to
- the host by the VEPA capable bridge (today's bridges are typically not VEPA
- capable).
-``bridge``
- Packets whose destination is on the same host as where they originate from
- are directly delivered to the target macvtap device. Both origin and
- destination devices need to be in bridge mode for direct delivery. If either
- one of them is in ``vepa`` mode, a VEPA capable bridge is required.
-``private``
- All packets are sent to the external bridge and will only be delivered to a
- target VM on the same host if they are sent through an external router or
- gateway and that device sends them back to the host. This procedure is
- followed if either the source or destination device is in ``private`` mode.
-``passthrough``
- This feature attaches a virtual function of a SRIOV capable NIC directly to a
- VM without losing the migration capability. All packets are sent to the VF/IF
- of the configured network device. Depending on the capabilities of the device
- additional prerequisites or limitations may apply; for example, on Linux this
- requires kernel 2.6.38 or newer. :since:`Since 0.9.2`
-
-::
-
- ...
- <devices>
- ...
- <interface type='direct' trustGuestRxFilters='no'>
- <source dev='eth0' mode='vepa'/>
- </interface>
- </devices>
- ...
-
-The network access of direct attached virtual machines can be managed by the
-hardware switch to which the physical interface of the host machine is connected
-to.
-
-The interface can have additional parameters as shown below, if the switch is
-conforming to the IEEE 802.1Qbg standard. The parameters of the virtualport
-element are documented in more detail in the IEEE 802.1Qbg standard. The values
-are network specific and should be provided by the network administrator. In
-802.1Qbg terms, the Virtual Station Interface (VSI) represents the virtual
-interface of a virtual machine. :since:`Since 0.8.2`
-
-Please note that IEEE 802.1Qbg requires a non-zero value for the VLAN ID.
-
-``managerid``
- The VSI Manager ID identifies the database containing the VSI type and
- instance definitions. This is an integer value and the value 0 is reserved.
-``typeid``
- The VSI Type ID identifies a VSI type characterizing the network access. VSI
- types are typically managed by network administrator. This is an integer
- value.
-``typeidversion``
- The VSI Type Version allows multiple versions of a VSI Type. This is an
- integer value.
-``instanceid``
- The VSI Instance ID Identifier is generated when a VSI instance (i.e. a
- virtual interface of a virtual machine) is created. This is a globally unique
- identifier.
-
-::
-
- ...
- <devices>
- ...
- <interface type='direct'>
- <source dev='eth0.2' mode='vepa'/>
- <virtualport type="802.1Qbg">
- <parameters managerid="11" typeid="1193047"
typeidversion="2"
instanceid="09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f"/>
- </virtualport>
- </interface>
- </devices>
- ...
-
-The interface can have additional parameters as shown below if the switch is
-conforming to the IEEE 802.1Qbh standard. The values are network specific and
-should be provided by the network administrator. :since:`Since 0.8.2`
-
-``profileid``
- The profile ID contains the name of the port profile that is to be applied to
- this interface. This name is resolved by the port profile database into the
- network parameters from the port profile, and those network parameters will
- be applied to this interface.
-
-::
-
- ...
- <devices>
- ...
- <interface type='direct'>
- <source dev='eth0' mode='private'/>
- <virtualport type='802.1Qbh'>
- <parameters profileid='finance'/>
- </virtualport>
- </interface>
- </devices>
- ...
-
-:anchor:`<a id="elementsNICSHostdev"/>`
-
-PCI Passthrough
-^^^^^^^^^^^^^^^
-
-A PCI network device (specified by the <source> element) is directly assigned to
-the guest using generic device passthrough, after first optionally setting the
-device's MAC address to the configured value, and associating the device with an
-802.1Qbh capable switch using an optionally specified <virtualport> element (see
-the examples of virtualport given above for type='direct' network devices). Note
-that - due to limitations in standard single-port PCI ethernet card driver
-design - only SR-IOV (Single Root I/O Virtualization) virtual function (VF)
-devices can be assigned in this manner; to assign a standard single-port PCI or
-PCIe ethernet card to a guest, use the traditional <hostdev> device definition
-and :since:`Since 0.9.11`
-
-To use VFIO device assignment rather than traditional/legacy KVM device
-assignment (VFIO is a new method of device assignment that is compatible with
-UEFI Secure Boot), a type='hostdev' interface can have an optional ``driver``
-sub-element with a ``name`` attribute set to "vfio". To use legacy KVM device
-assignment you can set ``name`` to "kvm" (or simply omit the
``<driver>``
-element, since "kvm" is currently the default). :since:`Since 1.0.5 (QEMU and
-KVM only, requires kernel 3.6 or newer)`
-
-Note that this "intelligent passthrough" of network devices is very similar to
-the functionality of a standard <hostdev> device, the difference being that this
-method allows specifying a MAC address and <virtualport> for the passed-through
-device. If these capabilities are not required, if you have a standard
-single-port PCI, PCIe, or USB network card that doesn't support SR-IOV (and
-hence would anyway lose the configured MAC address during reset after being
-assigned to the guest domain), or if you are using a version of libvirt older
-than 0.9.11, you should use standard <hostdev> to assign the device to the guest
-instead of <interface type='hostdev'/>.
-
-Similar to the functionality of a standard <hostdev> device, when ``managed`` is
-"yes", it is detached from the host before being passed on to the guest, and
-reattached to the host after the guest exits. If ``managed`` is omitted or
"no",
-the user is responsible to call ``virNodeDeviceDettach`` (or
-``virsh nodedev-detach``) before starting the guest or hot-plugging the device,
-and ``virNodeDeviceReAttach`` (or ``virsh nodedev-reattach``) after hot-unplug
-or stopping the guest.
-
-::
-
- ...
- <devices>
- <interface type='hostdev' managed='yes'>
- <driver name='vfio'/>
- <source>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x07' function='0x0'/>
- </source>
- <mac address='52:54:00:6d:90:02'/>
- <virtualport type='802.1Qbh'>
- <parameters profileid='finance'/>
- </virtualport>
- </interface>
- </devices>
- ...
-
-:anchor:`<a id="elementsTeaming"/>`
-
-Teaming a virtio/hostdev NIC pair
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-:since:`Since 6.1.0 (QEMU and KVM only, requires QEMU 4.2.0 or newer and a guest
-virtio-net driver supporting the "failover" feature, such as the one included
in
-Linux kernel 4.18 and newer) ` The ``<teaming>`` element of two interfaces can
-be used to connect them as a team/bond device in the guest (assuming proper
-support in the hypervisor and the guest network driver).
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='mybridge'/>
- <mac address='00:11:22:33:44:55'/>
- <model type='virtio'/>
- <teaming type='persistent'/>
- <alias name='ua-backup0'/>
- </interface>
- <interface type='network'>
- <source network='hostdev-pool'/>
- <mac address='00:11:22:33:44:55'/>
- <model type='virtio'/>
- <teaming type='transient' persistent='ua-backup0'/>
- </interface>
- </devices>
- ...
-
-The ``<teaming>`` element required attribute ``type`` will be set to either
-``"persistent"`` to indicate a device that should always be present in the
-domain, or ``"transient"`` to indicate a device that may periodically be
-removed, then later re-added to the domain. When type="transient", there
should
-be a second attribute to ``<teaming>`` called ``"persistent"`` - this
attribute
-should be set to the alias name of the other device in the pair (the one that
-has ``<teaming type="persistent'/>``).
-
-In the particular case of QEMU, libvirt's ``<teaming>`` element is used to
setup
-a virtio-net "failover" device pair. For this setup, the persistent device
must
-be an interface with ``<model type="virtio"/>``, and the transient
device
-must be ``<interface type='hostdev'/>`` (or ``<interface
type='network'/>``
-where the referenced network defines a pool of SRIOV VFs). The guest will then
-have a simple network team/bond device made of the virtio NIC + hostdev NIC
-pair. In this configuration, the higher-performing hostdev NIC will normally be
-preferred for all network traffic, but when the domain is migrated, QEMU will
-automatically unplug the VF from the guest, and then hotplug a similar device
-once migration is completed; while migration is taking place, network traffic
-will use the virtio NIC. (Of course the emulated virtio NIC and the hostdev NIC
-must be connected to the same subnet for bonding to work properly).
-
-NB1: Since you must know the alias name of the virtio NIC when configuring the
-hostdev NIC, it will need to be manually set in the virtio NIC's configuration
-(as with all other manually set alias names, this means it must start with
-"ua-").
-
-NB2: Currently the only implementation of the guest OS virtio-net driver
-supporting virtio-net failover requires that the MAC addresses of the virtio and
-hostdev NIC must match. Since that may not always be a requirement in the
-future, libvirt doesn't enforce this limitation - it is up to the
-person/management application that is creating the configuration to assure the
-MAC addresses of the two devices match.
-
-NB3: Since the PCI addresses of the SRIOV VFs on the hosts that are the source
-and destination of the migration will almost certainly be different, either
-higher level management software will need to modify the ``<source>`` of the
-hostdev NIC (``<interface type='hostdev'>``) at the start of migration, or
(a
-simpler solution) the configuration will need to use a libvirt "hostdev"
virtual
-network that maintains a pool of such devices, as is implied in the example's
-use of the libvirt network named "hostdev-pool" - as long as the hostdev
network
-pools on both hosts have the same name, libvirt itself will take care of
-allocating an appropriate device on both ends of the migration. Similarly the
-XML for the virtio interface must also either work correctly unmodified on both
-the source and destination of the migration (e.g. by connecting to the same
-bridge device on both hosts, or by using the same virtual network), or the
-management software must properly modify the interface XML during migration so
-that the virtio device remains connected to the same network segment before and
-after migration.
-
-:anchor:`<a id="elementsNICSMulticast"/>`
-
-Multicast tunnel
-^^^^^^^^^^^^^^^^
-
-A multicast group is setup to represent a virtual network. Any VMs whose network
-devices are in the same multicast group can talk to each other even across
-hosts. This mode is also available to unprivileged users. There is no default
-DNS or DHCP support and no outgoing network access. To provide outgoing network
-access, one of the VMs should have a 2nd NIC which is connected to one of the
-first 4 network types and do the appropriate routing. The multicast protocol is
-compatible with that used by user mode linux guests too. The source address used
-must be from the multicast address block.
-
-::
-
- ...
- <devices>
- <interface type='mcast'>
- <mac address='52:54:00:6d:90:01'/>
- <source address='230.0.0.1' port='5558'/>
- </interface>
- </devices>
- ...
-
-:anchor:`<a id="elementsNICSTCP"/>`
-
-TCP tunnel
-^^^^^^^^^^
-
-A TCP client/server architecture provides a virtual network. One VM provides the
-server end of the network, all other VMS are configured as clients. All network
-traffic is routed between the VMs via the server. This mode is also available to
-unprivileged users. There is no default DNS or DHCP support and no outgoing
-network access. To provide outgoing network access, one of the VMs should have a
-2nd NIC which is connected to one of the first 4 network types and do the
-appropriate routing.
-
-::
-
- ...
- <devices>
- <interface type='server'>
- <mac address='52:54:00:22:c9:42'/>
- <source address='192.168.0.1' port='5558'/>
- </interface>
- ...
- <interface type='client'>
- <mac address='52:54:00:8b:c9:51'/>
- <source address='192.168.0.1' port='5558'/>
- </interface>
- </devices>
- ...
-
-:anchor:`<a id="elementsNICSUDP"/>`
-
-UDP unicast tunnel
-^^^^^^^^^^^^^^^^^^
-
-A UDP unicast architecture provides a virtual network which enables connections
-between QEMU instances using QEMU's UDP infrastructure. The xml "source"
address
-is the endpoint address to which the UDP socket packets will be sent from the
-host running QEMU. The xml "local" address is the address of the interface
from
-which the UDP socket packets will originate from the QEMU host. :since:`Since
-1.2.20`
-
-::
-
- ...
- <devices>
- <interface type='udp'>
- <mac address='52:54:00:22:c9:42'/>
- <source address='127.0.0.1' port='11115'>
- <local address='127.0.0.1' port='11116'/>
- </source>
- </interface>
- </devices>
- ...
-
-:anchor:`<a id="elementsNICSModel"/>`
-
-Setting the NIC model
-^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet1'/>
- <model type='ne2k_pci'/>
- </interface>
- </devices>
- ...
-
-For hypervisors which support this, you can set the model of emulated network
-interface card.
-
-The values for ``type`` aren't defined specifically by libvirt, but by what the
-underlying hypervisor supports (if any). For QEMU and KVM you can get a list of
-supported models with these commands:
-
-::
-
- qemu -net nic,model=? /dev/null
- qemu-kvm -net nic,model=? /dev/null
-
-Typical values for QEMU and KVM include: ne2k_isa i82551 i82557b i82559er
-ne2k_pci pcnet rtl8139 e1000 virtio. :since:`Since 5.2.0` ,
-``virtio-transitional`` and ``virtio-non-transitional`` values are supported.
-See `Virtio transitional devices <#elementsVirtioTransitional>`__ for more
-details.
-
-:anchor:`<a id="elementsDriverBackendOptions"/>`
-
-Setting NIC driver-specific options
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet1'/>
- <model type='virtio'/>
- <driver name='vhost' txmode='iothread' ioeventfd='on'
event_idx='off' queues='5' rx_queue_size='256'
tx_queue_size='256'>
- <host csum='off' gso='off' tso4='off'
tso6='off' ecn='off' ufo='off' mrg_rxbuf='off'/>
- <guest csum='off' tso4='off' tso6='off'
ecn='off' ufo='off'/>
- </driver>
- </interface>
- </devices>
- ...
-
-Some NICs may have tunable driver-specific options. These are set as attributes
-of the ``driver`` sub-element of the interface definition. Currently the
-following attributes are available for the ``"virtio"`` NIC driver:
-
-``name``
- The optional ``name`` attribute forces which type of backend driver to use.
- The value can be either 'qemu' (a user-space backend) or 'vhost' (a
kernel
- backend, which requires the vhost module to be provided by the kernel); an
- attempt to require the vhost driver without kernel support will be rejected.
- If this attribute is not present, then the domain defaults to 'vhost' if
- present, but silently falls back to 'qemu' without error. :since:`Since 0.8.8
- (QEMU and KVM only)`
- For interfaces of type='hostdev' (PCI passthrough devices) the ``name``
- attribute can optionally be set to "vfio" or "kvm".
"vfio" tells libvirt to
- use VFIO device assignment rather than traditional KVM device assignment
- (VFIO is a new method of device assignment that is compatible with UEFI
- Secure Boot), and "kvm" tells libvirt to use the legacy device assignment
- performed directly by the kvm kernel module (the default is currently
"kvm",
- but is subject to change). :since:`Since 1.0.5 (QEMU and KVM only, requires
- kernel 3.6 or newer)`
- For interfaces of type='vhostuser', the ``name`` attribute is ignored. The
- backend driver used is always vhost-user.
-``txmode``
- The ``txmode`` attribute specifies how to handle transmission of packets when
- the transmit buffer is full. The value can be either 'iothread' or
'timer'.
- :since:`Since 0.8.8 (QEMU and KVM only)`
- If set to 'iothread', packet tx is all done in an iothread in the bottom half
- of the driver (this option translates into adding "tx=bh" to the qemu
- commandline -device virtio-net-pci option).
- If set to 'timer', tx work is done in qemu, and if there is more tx data than
- can be sent at the present time, a timer is set before qemu moves on to do
- other things; when the timer fires, another attempt is made to send more
- data.
- The resulting difference, according to the qemu developer who added the
- option is: "bh makes tx more asynchronous and reduces latency, but
- potentially causes more processor bandwidth contention since the CPU doing
- the tx isn't necessarily the CPU where the guest generated the packets."
- **In general you should leave this option alone, unless you are very certain
- you know what you are doing.**
-``ioeventfd``
- This optional attribute allows users to set `domain I/O asynchronous
- handling <
https://patchwork.kernel.org/patch/43390/>`__ for interface device.
- The default is left to the discretion of the hypervisor. Accepted values are
- "on" and "off". Enabling this allows qemu to execute VM while a
separate
- thread handles I/O. Typically guests experiencing high system CPU utilization
- during I/O will benefit from this. On the other hand, on overloaded host it
- could increase guest I/O latency. :since:`Since 0.9.3 (QEMU and KVM only)`
- **In general you should leave this option alone, unless you are very certain
- you know what you are doing.**
-``event_idx``
- The ``event_idx`` attribute controls some aspects of device event processing.
- The value can be either 'on' or 'off' - if it is on, it will reduce
the
- number of interrupts and exits for the guest. The default is determined by
- QEMU; usually if the feature is supported, default is on. In case there is a
- situation where this behavior is suboptimal, this attribute provides a way to
- force the feature off. :since:`Since 0.9.5 (QEMU and KVM only)`
- **In general you should leave this option alone, unless you are very certain
- you know what you are doing.**
-``queues``
- The optional ``queues`` attribute controls the number of queues to be used
- for either `Multiqueue
- virtio-net <
https://www.linux-kvm.org/page/Multiqueue>`__ or
- `vhost-user <#elementVhostuser>`__ network interfaces. Use of multiple packet
- processing queues requires the interface having the
- ``<model type='virtio'/>`` element. Each queue will potentially be
handled by
- a different processor, resulting in much higher throughput.
- :since:`virtio-net since 1.0.6 (QEMU and KVM only)` :since:`vhost-user since
- 1.2.17 (QEMU and KVM only)`
-``rx_queue_size``
- The optional ``rx_queue_size`` attribute controls the size of virtio ring for
- each queue as described above. The default value is hypervisor dependent and
- may change across its releases. Moreover, some hypervisors may pose some
- restrictions on actual value. For instance, latest QEMU (as of 2016-09-01)
- requires value to be a power of two from [256, 1024] range. :since:`Since
- 2.3.0 (QEMU and KVM only)`
- **In general you should leave this option alone, unless you are very certain
- you know what you are doing.**
-``tx_queue_size``
- The optional ``tx_queue_size`` attribute controls the size of virtio ring for
- each queue as described above. The default value is hypervisor dependent and
- may change across its releases. Moreover, some hypervisors may pose some
- restrictions on actual value. For instance, QEMU v2.9 requires value to be a
- power of two from [256, 1024] range. In addition to that, this may work only
- for a subset of interface types, e.g. aforementioned QEMU enables this option
- only for ``vhostuser`` type. :since:`Since 3.7.0 (QEMU and KVM only)`
- **In general you should leave this option alone, unless you are very certain
- you know what you are doing.**
-virtio options
- For virtio interfaces, `Virtio-specific options <#elementsVirtio>`__ can also
- be set. ( :since:`Since 3.5.0` )
-
-Offloading options for the host and guest can be configured using the following
-sub-elements:
-
-``host``
- The ``csum``, ``gso``, ``tso4``, ``tso6``, ``ecn`` and ``ufo`` attributes
- with possible values ``on`` and ``off`` can be used to turn off host
- offloading options. By default, the supported offloads are enabled by QEMU.
- :since:`Since 1.2.9 (QEMU only)` The ``mrg_rxbuf`` attribute can be used to
- control mergeable rx buffers on the host side. Possible values are ``on``
- (default) and ``off``. :since:`Since 1.2.13 (QEMU only)`
-``guest``
- The ``csum``, ``tso4``, ``tso6``, ``ecn`` and ``ufo`` attributes with
- possible values ``on`` and ``off`` can be used to turn off guest offloading
- options. By default, the supported offloads are enabled by QEMU.
- :since:`Since 1.2.9 (QEMU only)`
-
-:anchor:`<a id="elementsBackendOptions"/>`
-
-Setting network backend-specific options
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet1'/>
- <model type='virtio'/>
- <backend tap='/dev/net/tun' vhost='/dev/vhost-net'/>
- <driver name='vhost' txmode='iothread' ioeventfd='on'
event_idx='off' queues='5'/>
- <tune>
- <sndbuf>1600</sndbuf>
- </tune>
- </interface>
- </devices>
- ...
-
-For tuning the backend of the network, the ``backend`` element can be used. The
-``vhost`` attribute can override the default vhost device path
-(``/dev/vhost-net``) for devices with ``virtio`` model. The ``tap`` attribute
-overrides the tun/tap device path (default: ``/dev/net/tun``) for network and
-bridge interfaces. This does not work in session mode. :since:`Since 1.2.9`
-
-For tap devices there is also ``sndbuf`` element which can adjust the size of
-send buffer in the host. :since:`Since 0.8.8`
-
-:anchor:`<a id="elementsNICSTargetOverride"/>`
-
-Overriding the target element
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet1'/>
- </interface>
- </devices>
- ...
-
-If no target is specified, certain hypervisors will automatically generate a
-name for the created tun device. This name can be manually specified, however
-the name *should not start with either 'vnet', 'vif', 'macvtap',
or 'macvlan'*,
-which are prefixes reserved by libvirt and certain hypervisors. Manually
-specified targets using these prefixes may be ignored.
-
-Note that for LXC containers, this defines the name of the interface on the host
-side. :since:`Since 1.2.7` , to define the name of the device on the guest side,
-the ``guest`` element should be used, as in the following snippet:
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <guest dev='myeth'/>
- </interface>
- </devices>
- ...
-
-:anchor:`<a id="elementsNICSBoot"/>`
-
-Specifying boot order
-^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet1'/>
- <boot order='1'/>
- </interface>
- </devices>
- ...
-
-For hypervisors which support this, you can set a specific NIC to be used for
-network boot. The ``order`` attribute determines the order in which devices will
-be tried during boot sequence. The per-device ``boot`` elements cannot be used
-together with general boot elements in `BIOS bootloader <#elementsOSBIOS>`__
-section. :since:`Since 0.8.8`
-
-:anchor:`<a id="elementsNICSROM"/>`
-
-Interface ROM BIOS configuration
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet1'/>
- <rom bar='on' file='/etc/fake/boot.bin'/>
- </interface>
- </devices>
- ...
-
-For hypervisors which support this, you can change how a PCI Network device's
-ROM is presented to the guest. The ``bar`` attribute can be set to "on" or
-"off", and determines whether or not the device's ROM will be visible in
the
-guest's memory map. (In PCI documentation, the "rombar" setting controls
the
-presence of the Base Address Register for the ROM). If no rom bar is specified,
-the qemu default will be used (older versions of qemu used a default of "off",
-while newer qemus have a default of "on"). The optional ``file`` attribute is
-used to point to a binary file to be presented to the guest as the device's ROM
-BIOS. This can be useful to provide an alternative boot ROM for a network
-device. :since:`Since 0.9.10 (QEMU and KVM only)` .
-
-:anchor:`<a id="elementDomain"/>`
-
-Setting up a network backend in a driver domain
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- ...
- <interface type='bridge'>
- <source bridge='br0'/>
- <backenddomain name='netvm'/>
- </interface>
- ...
- </devices>
- ...
-
-The optional ``backenddomain`` element allows specifying a backend domain (aka
-driver domain) for the interface. Use the ``name`` attribute to specify the
-backend domain name. You can use it to create a direct network link between
-domains (so data will not go through host system). Use with type 'ethernet' to
-create plain network link, or with type 'bridge' to connect to a bridge inside
-the backend domain. :since:`Since 1.2.13 (Xen only)`
-
-:anchor:`<a id="elementQoS"/>`
-
-Quality of service
-^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet0'/>
- <bandwidth>
- <inbound average='1000' peak='5000' floor='200'
burst='1024'/>
- <outbound average='128' peak='256' burst='256'/>
- </bandwidth>
- </interface>
- </devices>
- ...
-
-This part of interface XML provides setting quality of service. Incoming and
-outgoing traffic can be shaped independently. The ``bandwidth`` element and its
-child elements are described in the `QoS <formatnetwork.html#elementQoS>`__
-section of the Network XML.
-
-:anchor:`<a id="elementVlanTag"/>`
-
-Setting VLAN tag (on supported network types only)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='bridge'>
- <vlan>
- <tag id='42'/>
- </vlan>
- <source bridge='ovsbr0'/>
- <virtualport type='openvswitch'>
- <parameters interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
- </virtualport>
- </interface>
- <interface type='bridge'>
- <vlan trunk='yes'>
- <tag id='42'/>
- <tag id='123' nativeMode='untagged'/>
- </vlan>
- ...
- </interface>
- </devices>
- ...
-
-If (and only if) the network connection used by the guest supports VLAN tagging
-transparent to the guest, an optional ``<vlan>`` element can specify one or more
-VLAN tags to apply to the guest's network traffic :since:`Since 0.10.0` .
-Network connections that support guest-transparent VLAN tagging include 1)
-type='bridge' interfaces connected to an Open vSwitch bridge :since:`Since
-0.10.0` , 2) SRIOV Virtual Functions (VF) used via type='hostdev' (direct device
-assignment) :since:`Since 0.10.0` , and 3) SRIOV VFs used via type='direct' with
-mode='passthrough' (macvtap "passthru" mode) :since:`Since 1.3.5` . All
other
-connection types, including standard linux bridges and libvirt's own virtual
-networks, **do not** support it. 802.1Qbh (vn-link) and 802.1Qbg (VEPA) switches
-provide their own way (outside of libvirt) to tag guest traffic onto a specific
-VLAN. Each tag is given in a separate ``<tag>`` subelement of ``<vlan>``
(for
-example: ``<tag id='42'/>``). For VLAN trunking of multiple tags
(which is
-supported only on Open vSwitch connections), multiple ``<tag>`` subelements can
-be specified, which implies that the user wants to do VLAN trunking on the
-interface for all the specified tags. In the case that VLAN trunking of a single
-tag is desired, the optional attribute ``trunk='yes'`` can be added to the
-toplevel ``<vlan>`` element to differentiate trunking of a single tag from
-normal tagging.
-
-For network connections using Open vSwitch it is also possible to configure
-'native-tagged' and 'native-untagged' VLAN modes :since:`Since 1.1.0.`
This is
-done with the optional ``nativeMode`` attribute on the ``<tag>`` subelement:
-``nativeMode`` may be set to 'tagged' or 'untagged'. The ``id`` attribute
of the
-``<tag>`` subelement containing ``nativeMode`` sets which VLAN is considered to
-be the "native" VLAN for this interface, and the ``nativeMode`` attribute
-determines whether or not traffic for that VLAN will be tagged.
-
-:anchor:`<a id="elementPort"/>`
-
-Isolating guests's network traffic from each other
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <port isolated='yes'/>
- </interface>
- </devices>
- ...
-
-:since:`Since 6.1.0.` The ``port`` element property ``isolated``, when set to
-``yes`` (default setting is ``no``) is used to isolate this interface's network
-traffic from that of other guest interfaces connected to the same network that
-also have ``<port isolated='yes'/>``. This setting is only supported for
-emulated interface devices that use a standard tap device to connect to the
-network via a Linux host bridge. This property can be inherited from a libvirt
-network, so if all guests that will be connected to the network should be
-isolated, it is better to put the setting in the network configuration. (NB:
-this only prevents guests that have ``isolated='yes'`` from communicating with
-each other; if there is a guest on the same bridge that doesn't have
-``isolated='yes'``, even the isolated guests will be able to communicate with
-it.)
-
-:anchor:`<a id="elementLink"/>`
-
-Modifying virtual link state
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet0'/>
- <link state='down'/>
- </interface>
- </devices>
- ...
-
-This element provides means of setting state of the virtual network link.
-Possible values for attribute ``state`` are ``up`` and ``down``. If ``down`` is
-specified as the value, the interface behaves as if it had the network cable
-disconnected. Default behavior if this element is unspecified is to have the
-link state ``up``. :since:`Since 0.9.5`
-
-:anchor:`<a id="mtu"/>`
-
-MTU configuration
-^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet0'/>
- <mtu size='1500'/>
- </interface>
- </devices>
- ...
-
-This element provides means of setting MTU of the virtual network link.
-Currently there is just one attribute ``size`` which accepts a non-negative
-integer which specifies the MTU size for the interface. :since:`Since 3.1.0`
-
-:anchor:`<a id="coalesce"/>`
-
-Coalesce settings
-^^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet0'/>
- <coalesce>
- <rx>
- <frames max='7'/>
- </rx>
- </coalesce>
- </interface>
- </devices>
- ...
-
-This element provides means of setting coalesce settings for some interface
-devices (currently only type ``network`` and ``bridge``. Currently there is just
-one attribute, ``max``, to tweak, in element ``frames`` for the ``rx`` group,
-which accepts a non-negative integer that specifies the maximum number of
-packets that will be received before an interrupt. :since:`Since 3.3.0`
-
-:anchor:`<a id="ipconfig"/>`
-
-IP configuration
-^^^^^^^^^^^^^^^^
-
-::
-
- ...
- <devices>
- <interface type='network'>
- <source network='default'/>
- <target dev='vnet0'/>
- <ip address='192.168.122.5' prefix='24'/>
- <ip address='192.168.122.5' prefix='24'
peer='10.0.0.10'/>
- <route family='ipv4' address='192.168.122.0'
prefix='24' gateway='192.168.122.1'/>
- <route family='ipv4' address='192.168.122.8'
gateway='192.168.122.1'/>
- </interface>
- ...
- <hostdev mode='capabilities' type='net'>
- <source>
- <interface>eth0</interface>
- </source>
- <ip address='192.168.122.6' prefix='24'/>
- <route family='ipv4' address='192.168.122.0'
prefix='24' gateway='192.168.122.1'/>
- <route family='ipv4' address='192.168.122.8'
gateway='192.168.122.1'/>
- </hostdev>
- ...
- </devices>
- ...
-
-:since:`Since 1.2.12` network devices and hostdev devices with network
-capabilities can optionally be provided one or more IP addresses to set on the
-network device in the guest. Note that some hypervisors or network device types
-will simply ignore them or only use the first one. The ``family`` attribute can
-be set to either ``ipv4`` or ``ipv6``, and the ``address`` attribute contains
-the IP address. The optional ``prefix`` is the number of 1 bits in the netmask,
-and will be automatically set if not specified - for IPv4 the default prefix is
-determined according to the network "class" (A, B, or C - see RFC870), and for
-IPv6 the default prefix is 64. The optional ``peer`` attribute holds the IP
-address of the other end of a point-to-point network device :since:`(since
-2.1.0)` .
-
-:since:`Since 1.2.12` route elements can also be added to define IP routes to
-add in the guest. The attributes of this element are described in the
-documentation for the ``route`` element in `network
-definitions <formatnetwork.html#elementsStaticroute>`__. This is used by the LXC
-driver.
-
-::
-
- ...
- <devices>
- <interface type='ethernet'>
- <source/>
- <ip address='192.168.123.1' prefix='24'/>
- <ip address='10.0.0.10' prefix='24'
peer='192.168.122.5'/>
- <route family='ipv4' address='192.168.42.0'
prefix='24' gateway='192.168.123.4'/>
- <source/>
- ...
- </interface>
- ...
- </devices>
- ...
-
-:since:`Since 2.1.0` network devices of type "ethernet" can optionally be
-provided one or more IP addresses and one or more routes to set on the **host**
-side of the network device. These are configured as subelements of the
-``<source>`` element of the interface, and have the same attributes as the
-similarly named elements used to configure the guest side of the interface
-(described above).
-
-:anchor:`<a id="elementVhostuser"/>`
-
-vhost-user interface
-^^^^^^^^^^^^^^^^^^^^
-
-:since:`Since 1.2.7` the vhost-user enables the communication between a QEMU
-virtual machine and other userspace process using the Virtio transport protocol.
-A char dev (e.g. Unix socket) is used for the control plane, while the data
-plane is based on shared memory.
-
-::
-
- ...
- <devices>
- <interface type='vhostuser'>
- <mac address='52:54:00:3b:83:1a'/>
- <source type='unix' path='/tmp/vhost1.sock'
mode='server'/>
- <model type='virtio'/>
- </interface>
- <interface type='vhostuser'>
- <mac address='52:54:00:3b:83:1b'/>
- <source type='unix' path='/tmp/vhost2.sock'
mode='client'>
- <reconnect enabled='yes' timeout='10'/>
- </source>
- <model type='virtio'/>
- <driver queues='5'/>
- </interface>
- </devices>
- ...
-
-The ``<source>`` element has to be specified along with the type of char device.
-Currently, only type='unix' is supported, where the path (the directory path of
-the socket) and mode attributes are required. Both ``mode='server'`` and
-``mode='client'`` are supported. vhost-user requires the virtio model type, thus
-the ``<model>`` element is mandatory. :since:`Since 4.1.0` the element has an
-optional child element ``reconnect`` which configures reconnect timeout if the
-connection is lost. It has two attributes ``enabled`` (which accepts ``yes`` and
-``no``) and ``timeout`` which specifies the amount of seconds after which
-hypervisor tries to reconnect.
-
-:anchor:`<a id="elementNwfilter"/>`
-
-Traffic filtering with NWFilter
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-:since:`Since 0.8.0` an ``nwfilter`` profile can be assigned to a domain
-interface, which allows configuring traffic filter rules for the virtual
-machine. See the `nwfilter <formatnwfilter.html>`__ documentation for more
-complete details.
-
-::
-
- ...
- <devices>
- <interface ...>
- ...
- <filterref filter='clean-traffic'/>
- </interface>
- <interface ...>
- ...
- <filterref filter='myfilter'>
- <parameter name='IP' value='104.207.129.11'/>
- <parameter name='IP6_ADDR' value='2001:19f0:300:2102::'/>
- <parameter name='IP6_MASK' value='64'/>
- ...
- </filterref>
- </interface>
- </devices>
- ...
-
-The ``filter`` attribute specifies the name of the nwfilter to use. Optional
-``<parameter>`` elements may be specified for passing additional info to the
-nwfilter via the ``name`` and ``value`` attributes. See the
-`nwfilter <formatnwfilter.html#nwfconceptsvars>`__ docs for info on parameters.
-
-:anchor:`<a id="elementsInput"/>`
-
-Input devices
-~~~~~~~~~~~~~
-
-Input devices allow interaction with the graphical framebuffer in the guest
-virtual machine. When enabling the framebuffer, an input device is automatically
-provided. It may be possible to add additional devices explicitly, for example,
-to provide a graphics tablet for absolute cursor movement.
-
-::
-
- ...
- <devices>
- <input type='mouse' bus='usb'/>
- <input type='keyboard' bus='usb'/>
- <input type='mouse' bus='virtio'/>
- <input type='keyboard' bus='virtio'/>
- <input type='tablet' bus='virtio'/>
- <input type='passthrough' bus='virtio'>
- <source evdev='/dev/input/event1'/>
- </input>
- </devices>
- ...
-
-``input``
- The ``input`` element has one mandatory attribute, the ``type`` whose value
- can be 'mouse', 'tablet', ( :since:`since 1.2.2` ) 'keyboard'
or (
- :since:`since 1.3.0` ) 'passthrough'. The tablet provides absolute cursor
- movement, while the mouse uses relative movement. The optional ``bus``
- attribute can be used to refine the exact device type. It takes values
"xen"
- (paravirtualized), "ps2" and "usb" or ( :since:`since 1.3.0` )
"virtio".
-
-The ``input`` element has an optional sub-element ``<address>`` which can tie
-the device to a particular PCI slot, `documented above <#elementsAddress>`__. On
-S390, ``address`` can be used to provide a CCW address for an input device (
-:since:`since 4.2.0` ). For type ``passthrough``, the mandatory sub-element
-``source`` must have an ``evdev`` attribute containing the absolute path to the
-event device passed through to guests. (KVM only) :since:`Since 5.2.0` , the
-``input`` element accepts a ``model`` attribute which has the values 'virtio',
-'virtio-transitional' and 'virtio-non-transitional'. See `Virtio
transitional
-devices <#elementsVirtioTransitional>`__ for more details.
-
-The subelement ``driver`` can be used to tune the virtio options of the device:
-`Virtio-specific options <#elementsVirtio>`__ can also be set. ( :since:`Since
-3.5.0` )
-
-:anchor:`<a id="elementsHub"/>`
-
-Hub devices
-~~~~~~~~~~~
-
-A hub is a device that expands a single port into several so that there are more
-ports available to connect devices to a host system.
-
-::
-
- ...
- <devices>
- <hub type='usb'/>
- </devices>
- ...
-
-``hub``
- The ``hub`` element has one mandatory attribute, the ``type`` whose value can
- only be 'usb'.
-
-The ``hub`` element has an optional sub-element ``<address>`` with
-``type='usb'``\ which can tie the device to a particular controller, `documented
-above <#elementsAddress>`__.
-
-:anchor:`<a id="elementsGraphics"/>`
-
-Graphical framebuffers
-~~~~~~~~~~~~~~~~~~~~~~
-
-A graphics device allows for graphical interaction with the guest OS. A guest
-will typically have either a framebuffer or a text console configured to allow
-interaction with the admin.
-
-::
-
- ...
- <devices>
- <graphics type='sdl' display=':0.0'/>
- <graphics type='vnc' port='5904'
sharePolicy='allow-exclusive'>
- <listen type='address' address='1.2.3.4'/>
- </graphics>
- <graphics type='rdp' autoport='yes' multiUser='yes'
/>
- <graphics type='desktop' fullscreen='yes'/>
- <graphics type='spice'>
- <listen type='network' network='rednet'/>
- </graphics>
- </devices>
- ...
-
-``graphics``
- The ``graphics`` element has a mandatory ``type`` attribute which takes the
- value ``sdl``, ``vnc``, ``spice``, ``rdp``, ``desktop`` or ``egl-headless``:
-
- ``sdl``
- This displays a window on the host desktop, it can take 3 optional
- arguments: a ``display`` attribute for the display to use, an ``xauth``
- attribute for the authentication identifier, and an optional
- ``fullscreen`` attribute accepting values ``yes`` or ``no``.
-
- You can use a ``gl`` with the ``enable="yes"`` property to enable OpenGL
- support in SDL. Likewise you can explicitly disable OpenGL support with
- ``enable="no"``.
-
- ``vnc``
- Starts a VNC server. The ``port`` attribute specifies the TCP port number
- (with -1 as legacy syntax indicating that it should be auto-allocated).
- The ``autoport`` attribute is the new preferred syntax for indicating
- auto-allocation of the TCP port to use. The ``passwd`` attribute provides
- a VNC password in clear text. If the ``passwd`` attribute is set to an
- empty string, then VNC access is disabled. The ``keymap`` attribute
- specifies the keymap to use. It is possible to set a limit on the validity
- of the password by giving a timestamp
- ``passwdValidTo='2010-04-09T15:51:00'`` assumed to be in UTC. The
- ``connected`` attribute allows control of connected client during password
- changes. VNC accepts ``keep`` value only :since:`since 0.9.3` . NB, this
- may not be supported by all hypervisors.
-
- The optional ``sharePolicy`` attribute specifies vnc server display
- sharing policy. ``allow-exclusive`` allows clients to ask for exclusive
- access by dropping other connections. Connecting multiple clients in
- parallel requires all clients asking for a shared session (vncviewer:
- -Shared switch). This is the default value. ``force-shared`` disables
- exclusive client access, every connection has to specify -Shared switch
- for vncviewer. ``ignore`` welcomes every connection unconditionally
- :since:`since 1.0.6` .
-
- Rather than using listen/port, QEMU supports a ``socket`` attribute for
- listening on a unix domain socket path :since:`Since 0.8.8` .
-
- For VNC WebSocket functionality, ``websocket`` attribute may be used to
- specify port to listen on (with -1 meaning auto-allocation and
- ``autoport`` having no effect due to security reasons) :since:`Since
- 1.0.6` .
-
- Although VNC doesn't support OpenGL natively, it can be paired with
- graphics type ``egl-headless`` (see below) which will instruct QEMU to
- open and use drm nodes for OpenGL rendering.
-
- ``spice`` :since:`Since 0.8.6`
- Starts a SPICE server. The ``port`` attribute specifies the TCP port
- number (with -1 as legacy syntax indicating that it should be
- auto-allocated), while ``tlsPort`` gives an alternative secure port
- number. The ``autoport`` attribute is the new preferred syntax for
- indicating auto-allocation of needed port numbers. The ``passwd``
- attribute provides a SPICE password in clear text. If the ``passwd``
- attribute is set to an empty string, then SPICE access is disabled. The
- ``keymap`` attribute specifies the keymap to use. It is possible to set a
- limit on the validity of the password by giving a timestamp
- ``passwdValidTo='2010-04-09T15:51:00'`` assumed to be in UTC.
-
- The ``connected`` attribute allows control of connected client during
- password changes. SPICE accepts ``keep`` to keep client connected,
- ``disconnect`` to disconnect client and ``fail`` to fail changing password
- . NB, this may not be supported by all hypervisors. :since:`Since 0.9.3`
-
- The ``defaultMode`` attribute sets the default channel security policy,
- valid values are ``secure``, ``insecure`` and the default ``any`` (which
- is secure if possible, but falls back to insecure rather than erroring out
- if no secure path is available). :since:`Since 0.9.12`
-
- When SPICE has both a normal and TLS secured TCP port configured, it can
- be desirable to restrict what channels can be run on each port. This is
- achieved by adding one or more ``<channel>`` elements inside the main
- ``<graphics>`` element and setting the ``mode`` attribute to either
- ``secure`` or ``insecure``. Setting the mode attribute overrides the
- default value as set by the ``defaultMode`` attribute. (Note that
- specifying ``any`` as mode discards the entry as the channel would inherit
- the default mode anyways.) Valid channel names include ``main``,
- ``display``, ``inputs``, ``cursor``, ``playback``, ``record`` (all
- :since:` since 0.8.6` ); ``smartcard`` ( :since:`since 0.8.8` ); and
- ``usbredir`` ( :since:`since 0.9.12` ).
-
- ::
-
- <graphics type='spice' port='-1' tlsPort='-1'
autoport='yes'>
- <channel name='main' mode='secure'/>
- <channel name='record' mode='insecure'/>
- <image compression='auto_glz'/>
- <streaming mode='filter'/>
- <clipboard copypaste='no'/>
- <mouse mode='client'/>
- <filetransfer enable='no'/>
- <gl enable='yes'
rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>
- </graphics>
-
- Spice supports variable compression settings for audio, images and
- streaming. These settings are accessible via the ``compression`` attribute
- in all following elements: ``image`` to set image compression (accepts
- ``auto_glz``, ``auto_lz``, ``quic``, ``glz``, ``lz``, ``off``), ``jpeg``
- for JPEG compression for images over wan (accepts ``auto``, ``never``,
- ``always``), ``zlib`` for configuring wan image compression (accepts
- ``auto``, ``never``, ``always``) and ``playback`` for enabling audio
- stream compression (accepts ``on`` or ``off``). :since:`Since 0.9.1`
-
- Streaming mode is set by the ``streaming`` element, settings its ``mode``
- attribute to one of ``filter``, ``all`` or ``off``. :since:`Since 0.9.2`
-
- Copy & Paste functionality (via Spice agent) is set by the ``clipboard``
- element. It is enabled by default, and can be disabled by setting the
- ``copypaste`` property to ``no``. :since:`Since 0.9.3`
-
- Mouse mode is set by the ``mouse`` element, setting its ``mode`` attribute
- to one of ``server`` or ``client``. If no mode is specified, the qemu
- default will be used (client mode). :since:`Since 0.9.11`
-
- File transfer functionality (via Spice agent) is set using the
- ``filetransfer`` element. It is enabled by default, and can be disabled by
- setting the ``enable`` property to ``no``. :since:`Since 1.2.2`
-
- Spice may provide accelerated server-side rendering with OpenGL. You can
- enable or disable OpenGL support explicitly with the ``gl`` element, by
- setting the ``enable`` property. (QEMU only, :since:`since 1.3.3` ). Note
- that this only works locally, since this requires usage of UNIX sockets,
- i.e. using ``listen`` types 'socket' or 'none'. For accelerated
OpenGL
- with remote support, consider pairing this element with type
- ``egl-headless`` (see below). However, this will deliver weaker
- performance compared to native Spice OpenGL support.
-
- By default, QEMU will pick the first available GPU DRM render node. You
- may specify a DRM render node path to use instead. (QEMU only,
- :since:`since 3.1.0` ).
-
- ``rdp``
- Starts a RDP server. The ``port`` attribute specifies the TCP port number
- (with -1 as legacy syntax indicating that it should be auto-allocated).
- The ``autoport`` attribute is the new preferred syntax for indicating
- auto-allocation of the TCP port to use. In the VirtualBox driver, the
- ``autoport`` will make the hypervisor pick available port from 3389-3689
- range when the VM is started. The chosen port will be reflected in the
- ``port`` attribute. The ``multiUser`` attribute is a boolean deciding
- whether multiple simultaneous connections to the VM are permitted. The
- ``replaceUser`` attribute is a boolean deciding whether the existing
- connection must be dropped and a new connection must be established by the
- VRDP server, when a new client connects in single connection mode.
-
- ``desktop``
- This value is reserved for VirtualBox domains for the moment. It displays
- a window on the host desktop, similarly to "sdl", but using the
VirtualBox
- viewer. Just like "sdl", it accepts the optional attributes ``display``
- and ``fullscreen``.
-
- ``egl-headless`` :since:`Since 4.6.0`
- This display type provides support for an OpenGL accelerated display
- accessible both locally and remotely (for comparison, Spice's native
- OpenGL support only works locally using UNIX sockets at the moment, but
- has better performance). Since this display type doesn't provide any
- window or graphical console like the other types, for practical reasons it
- should be paired with either ``vnc`` or ``spice`` graphics types. This
- display type is only supported by QEMU domains (needs QEMU :since:`2.10`
- or newer). :since:`5.0.0` this element accepts a ``<gl/>`` sub-element
- with an optional attribute ``rendernode`` which can be used to specify an
- absolute path to a host's DRI device to be used for OpenGL rendering.
-
- ::
-
- <graphics type='spice' autoport='yes'/>
- <graphics type='egl-headless'>
- <gl rendernode='/dev/dri/renderD128'/>
- </graphics>
-
-Graphics device uses a ``<listen>`` to set up where the device should listen for
-clients. It has a mandatory attribute ``type`` which specifies the listen type.
-Only ``vnc``, ``spice`` and ``rdp`` supports ``<listen>`` element. :since:`Since
-0.9.4` . Available types are:
-
-``address``
- Tells a graphics device to use an address specified in the ``address``
- attribute, which will contain either an IP address or hostname (which will be
- resolved to an IP address via a DNS query) to listen on.
-
- It is possible to omit the ``address`` attribute in order to use an address
- from config files :since:`Since 1.3.5` .
-
- The ``address`` attribute is duplicated as ``listen`` attribute in
- ``graphics`` element for backward compatibility. If both are provided they
- must be equal.
-
-``network``
- This is used to specify an existing network in the ``network`` attribute from
- libvirt's list of configured networks. The named network configuration will
- be examined to determine an appropriate listen address and the address will
- be stored in live XML in ``address`` attribute. For example, if the network
- has an IPv4 address in its configuration (e.g. if it has a forward type of
- ``route``, ``nat``, or no forward type (isolated)), the first IPv4 address
- listed in the network's configuration will be used. If the network is
- describing a host bridge, the first IPv4 address associated with that bridge
- device will be used, and if the network is describing one of the 'direct'
- (macvtap) modes, the first IPv4 address of the first forward dev will be
- used.
-
-``socket`` :since:`since 2.0.0 (QEMU only)`
- This listen type tells a graphics server to listen on unix socket. Attribute
- ``socket`` contains a path to unix socket. If this attribute is omitted
- libvirt will generate this path for you. Supported by graphics type ``vnc``
- and ``spice``.
-
- For ``vnc`` graphics be backward compatible the ``socket`` attribute of first
- ``listen`` element is duplicated as ``socket`` attribute in ``graphics``
- element. If ``graphics`` element contains a ``socket`` attribute all
- ``listen`` elements are ignored.
-
-``none`` :since:`since 2.0.0 (QEMU only)`
- This listen type doesn't have any other attribute. Libvirt supports passing a
- file descriptor through our APIs virDomainOpenGraphics() and
- virDomainOpenGraphicsFD(). No other listen types are allowed if this one is
- used and the graphics device doesn't listen anywhere. You need to use one of
- the two APIs to pass a FD to QEMU in order to connect to this graphics
- device. Supported by graphics type ``vnc`` and ``spice``.
-
-:anchor:`<a id="elementsVideo"/>`
-
-Video devices
-~~~~~~~~~~~~~
-
-A video device.
-
-::
-
- ...
- <devices>
- <video>
- <model type='vga' vram='16384' heads='1'>
- <acceleration accel3d='yes' accel2d='yes'/>
- </model>
- <driver name='qemu'/>
- </video>
- </devices>
- ...
-
-``video``
- The ``video`` element is the container for describing video devices. For
- backwards compatibility, if no ``video`` is set but there is a ``graphics``
- in domain xml, then libvirt will add a default ``video`` according to the
- guest type.
-
- For a guest of type "kvm", the default ``video`` is: ``type`` with value
- "cirrus", ``vram`` with value "16384" and ``heads`` with value
"1". By
- default, the first video device in domain xml is the primary one, but the
- optional attribute ``primary`` ( :since:`since 1.0.2` ) with value 'yes' can
- be used to mark the primary in cases of multiple video device. The
- non-primary must be type of "qxl" or ( :since:`since 2.4.0` )
"virtio".
-
-``model``
- The ``model`` element has a mandatory ``type`` attribute which takes the
- value "vga", "cirrus", "vmvga", "xen",
"vbox", "qxl" ( :since:`since 0.8.6`
- ), "virtio" ( :since:`since 1.3.0` ), "gop" ( :since:`since 3.2.0`
), "bochs"
- ( :since:`since 5.6.0` ), "ramfb" ( :since:`since 5.9.0` ), or
"none" (
- :since:`since 4.6.0` , depending on the hypervisor features available. The
- purpose of the type ``none`` is to instruct libvirt not to add a default
- video device in the guest (see the paragraph above). This legacy behaviour
- can be inconvenient in cases where GPU mediated devices are meant to be the
- only rendering device within a guest and so specifying another ``video``
- device along with type ``none``. Refer to Host device assignment to see how
- to add a mediated device into a guest.
-
- You can provide the amount of video memory in kibibytes (blocks of 1024
- bytes) using ``vram``. This is supported only for guest type of "vz",
"qemu",
- "vbox", "vmx" and "xen". If no value is provided the
default is used. If the
- size is not a power of two it will be rounded to closest one.
-
- The number of screen can be set using ``heads``. This is supported only for
- guests type of "vz", "kvm", "vbox" and "vmx".
-
- For guest type of "kvm" or "qemu" and model type "qxl"
there are optional
- attributes. Attribute ``ram`` ( :since:` since 1.0.2` ) specifies the size of
- the primary bar, while the attribute ``vram`` specifies the secondary bar
- size. If ``ram`` or ``vram`` are not supplied a default value is used. The
- ``ram`` should also be rounded to power of two as ``vram``. There is also
- optional attribute ``vgamem`` ( :since:`since 1.2.11` ) to set the size of
- VGA framebuffer for fallback mode of QXL device. Attribute ``vram64`` (
- :since:`since 1.3.3` ) extends secondary bar and makes it addressable as
- 64bit memory.
-
- :since:`Since 5.9.0` , the ``model`` element may also have an optional
- ``resolution`` sub-element. The ``resolution`` element has attributes ``x``
- and ``y`` to set the minimum resolution for the video device. This
- sub-element is valid for model types "vga", "qxl",
"bochs", and "virtio".
-
-``acceleration``
- Configure if video acceleration should be enabled.
-
- ``accel2d``
- Enable 2D acceleration (for vbox driver only, :since:`since 0.7.1` )
- ``accel3d``
- Enable 3D acceleration (for vbox driver :since:`since 0.7.1` , qemu driver
- :since:`since 1.3.0` )
- ``rendernode``
- Absolute path to a host's DRI device to be used for rendering (for
- 'vhostuser' driver only, :since:`since 5.8.0` ). If none is specified,
- libvirt will pick one available.
-
-``address``
- The optional ``address`` sub-element can be used to tie the video device to a
- particular PCI slot. On S390, ``address`` can be used to provide the CCW
- address for the video device ( :since:` since 4.2.0` ).
-``driver``
- The subelement ``driver`` can be used to tune the device:
-
- ``name``
- Specify the backend driver to use, either "qemu" or "vhostuser"
depending
- on the hypervisor features available ( :since:`since 5.8.0` ). "qemu" is
- the default QEMU backend. "vhostuser" will use a separate vhost-user
- process backend (for ``virtio`` device).
- virtio options
- `Virtio-specific options <#elementsVirtio>`__ can also be set (
- :since:`Since 3.5.0` )
- VGA configuration
- Control how the video devices exposed to the guest using the ``vgaconf``
- attribute which takes the value "io", "on" or "off".
At present, it's only
- applicable to the bhyve's "gop" video model type ( :since:`Since
3.5.0` )
-
-:anchor:`<a id="elementsConsole"/>`
-
-Consoles, serial, parallel & channel devices
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-A character device provides a way to interact with the virtual machine.
-Paravirtualized consoles, serial ports, parallel ports and channels are all
-classed as character devices and so represented using the same syntax.
-
-::
-
- ...
- <devices>
- <parallel type='pty'>
- <source path='/dev/pts/2'/>
- <target port='0'/>
- </parallel>
- <serial type='pty'>
- <source path='/dev/pts/3'/>
- <target port='0'/>
- </serial>
- <serial type='file'>
- <source path='/tmp/file' append='on'>
- <seclabel model='dac' relabel='no'/>
- </source>
- <target port='0'/>
- </serial>
- <console type='pty'>
- <source path='/dev/pts/4'/>
- <target port='0'/>
- </console>
- <channel type='unix'>
- <source mode='bind' path='/tmp/guestfwd'/>
- <target type='guestfwd' address='10.0.2.1'
port='4600'/>
- </channel>
- </devices>
- ...
-
-In each of these directives, the top-level element name (parallel, serial,
-console, channel) describes how the device is presented to the guest. The guest
-interface is configured by the ``target`` element.
-
-The interface presented to the host is given in the ``type`` attribute of the
-top-level element. The host interface is configured by the ``source`` element.
-
-The ``source`` element may contain an optional ``seclabel`` to override the way
-that labelling is done on the socket path. If this element is not present, the
-`security label is inherited from the per-domain setting <#seclabel>`__.
-
-If the interface ``type`` presented to the host is "file", then the ``source``
-element may contain an optional attribute ``append`` that specifies whether or
-not the information in the file should be preserved on domain restart. Allowed
-values are "on" and "off" (default). :since:`Since 1.3.1` .
-
-Regardless of the ``type``, character devices can have an optional log file
-associated with them. This is expressed via a ``log`` sub-element, with a
-``file`` attribute. There can also be an ``append`` attribute which takes the
-same values described above. :since:`Since 1.3.3` .
-
-::
-
- ...
- <log file="/var/log/libvirt/qemu/guestname-serial0.log"
append="off"/>
- ...
-
-Each character device element has an optional sub-element ``<address>`` which
-can tie the device to a particular `controller <#elementsControllers>`__ or PCI
-slot.
-
-For character device with type ``unix`` or ``tcp`` the ``source`` has an
-optional element ``reconnect`` which configures reconnect timeout if the
-connection is lost. There are two attributes, ``enabled`` where possible values
-are "yes" and "no" and ``timeout`` which is in seconds. The
``reconnect``
-attribute is valid only for ``connect`` mode. :since:`Since 3.7.0 (QEMU driver
-only)` .
-
-:anchor:`<a id="elementsCharGuestInterface"/>`
-
-Guest interface
-^^^^^^^^^^^^^^^
-
-A character device presents itself to the guest as one of the following types.
-
-:anchor:`<a id="elementCharParallel"/>`
-
-Parallel port
-'''''''''''''
-
-::
-
- ...
- <devices>
- <parallel type='pty'>
- <source path='/dev/pts/2'/>
- <target port='0'/>
- </parallel>
- </devices>
- ...
-
-``target`` can have a ``port`` attribute, which specifies the port number. Ports
-are numbered starting from 0. There are usually 0, 1 or 2 parallel ports.
-
-:anchor:`<a id="elementCharSerial"/>`
-
-Serial port
-'''''''''''
-
-::
-
- ...
- <devices>
- <!-- Serial port -->
- <serial type='pty'>
- <source path='/dev/pts/3'/>
- <target port='0'/>
- </serial>
- </devices>
- ...
-
-::
-
- ...
- <devices>
- <!-- USB serial port -->
- <serial type='pty'>
- <target type='usb-serial' port='0'>
- <model name='usb-serial'/>
- </target>
- <address type='usb' bus='0' port='1'/>
- </serial>
- </devices>
- ...
-
-The ``target`` element can have an optional ``port`` attribute, which specifies
-the port number (starting from 0), and an optional ``type`` attribute: valid
-values are, :since:`since 1.0.2` , ``isa-serial`` (usable with x86 guests),
-``usb-serial`` (usable whenever USB support is available) and ``pci-serial``
-(usable whenever PCI support is available); :since:`since 3.10.0` ,
-``spapr-vio-serial`` (usable with ppc64/pseries guests), ``system-serial``
-(usable with aarch64/virt and, :since:`since 4.7.0` , riscv/virt guests) and
-``sclp-serial`` (usable with s390 and s390x guests) are available as well.
-
-:since:`Since 3.10.0` , the ``target`` element can have an optional ``model``
-subelement; valid values for its ``name`` attribute are: ``isa-serial`` (usable
-with the ``isa-serial`` target type); ``usb-serial`` (usable with the
-``usb-serial`` target type); ``pci-serial`` (usable with the ``pci-serial``
-target type); ``spapr-vty`` (usable with the ``spapr-vio-serial`` target type);
-``pl011`` and, :since:`since 4.7.0` , ``16550a`` (usable with the
-``system-serial`` target type); ``sclpconsole`` and ``sclplmconsole`` (usable
-with the ``sclp-serial`` target type). Providing a target model is usually
-unnecessary: libvirt will automatically pick one that's suitable for the chosen
-target type, and overriding that value is generally not recommended.
-
-If any of the attributes is not specified by the user, libvirt will choose a
-value suitable for most users.
-
-Most target types support configuring the guest-visible device address as
-`documented above <#elementsAddress>`__; more specifically, acceptable address
-types are ``isa`` (for ``isa-serial``), ``usb`` (for ``usb-serial``), ``pci``
-(for ``pci-serial``) and ``spapr-vio`` (for ``spapr-vio-serial``). The
-``system-serial`` and ``sclp-serial`` target types don't support specifying an
-address.
-
-For the relationship between serial ports and consoles, `see
-below <#elementCharSerialAndConsole>`__.
-
-:anchor:`<a id="elementCharConsole"/>`
-
-Console
-'''''''
-
-::
-
- ...
- <devices>
- <!-- Serial console -->
- <console type='pty'>
- <source path='/dev/pts/2'/>
- <target type='serial' port='0'/>
- </console>
- </devices>
- ...
-
-::
-
- ...
- <devices>
- <!-- KVM virtio console -->
- <console type='pty'>
- <source path='/dev/pts/5'/>
- <target type='virtio' port='0'/>
- </console>
- </devices>
- ...
-
-The ``console`` element is used to represent interactive serial consoles.
-Depending on the type of guest in use and the specifics of the configuration,
-the ``console`` element might represent the same device as an existing
-``serial`` element or a separate device.
-
-A ``target`` subelement is supported and works the same way as with the
-``serial`` element (`see above <#elementCharSerial>`__ for details). Valid
-values for the ``type`` attribute are: ``serial`` (described below); ``virtio``
-(usable whenever VirtIO support is available); ``xen``, ``lxc`` and ``openvz``
-(available when the corresponding hypervisor is in use). ``sclp`` and ``sclplm``
-(usable for s390 and s390x QEMU guests) are supported for compatibility reasons
-but should not be used for new guests: use the ``sclpconsole`` and
-``sclplmconsole`` target models, respectively, with the ``serial`` element
-instead.
-
-Of the target types listed above, ``serial`` is special in that it doesn't
-represents a separate device, but rather the same device as the first ``serial``
-element. Due to this, there can only be a single ``console`` element with target
-type ``serial`` per guest.
-
-Virtio consoles are usually accessible as ``/dev/hvc[0-7]`` from inside the
-guest; for more information, see
-http://fedoraproject.org/wiki/Features/VirtioSerial. :since:`Since 0.8.3`
-
-For the relationship between serial ports and consoles, `see
-below <#elementCharSerialAndConsole>`__.
-
-:anchor:`<a id="elementCharSerialAndConsole"/>`
-
-Relationship between serial ports and consoles
-''''''''''''''''''''''''''''''''''''''''''''''
-
-Due to hystorical reasons, the ``serial`` and ``console`` elements have
-partially overlapping scopes.
-
-In general, both elements are used to configure one or more serial consoles to
-be used for interacting with the guest. The main difference between the two is
-that ``serial`` is used for emulated, usually native, serial consoles, whereas
-``console`` is used for paravirtualized ones.
-
-Both emulated and paravirtualized serial consoles have advantages and
-disadvantages:
-
-- emulated serial consoles are usually initialized much earlier than
- paravirtualized ones, so they can be used to control the bootloader and
- display both firmware and early boot messages;
-- on several platforms, there can only be a single emulated serial console per
- guest but paravirtualized consoles don't suffer from the same limitation.
-
-A configuration such as:
-
-::
-
- ...
- <devices>
- <console type='pty'>
- <target type='serial'/>
- </console>
- <console type='pty'>
- <target type='virtio'/>
- </console>
- </devices>
- ...
-
-will work on any platform and will result in one emulated serial console for
-early boot logging / interactive / recovery use, and one paravirtualized serial
-console to be used eg. as a side channel. Most people will be fine with having
-just the first ``console`` element in their configuration, but if a specific
-configuration is desired then both elements should be specified.
-
-Note that, due to the compatibility concerns mentioned earlier, all the
-following configurations:
-
-::
-
- ...
- <devices>
- <serial type='pty'/>
- </devices>
- ...
-
-::
-
- ...
- <devices>
- <console type='pty'/>
- </devices>
- ...
-
-::
-
- ...
- <devices>
- <serial type='pty'/>
- <console type='pty'/>
- </devices>
- ...
-
-will be treated the same and will result in a single emulated serial console
-being available to the guest.
-
-:anchor:`<a id="elementCharChannel"/>`
-
-Channel
-'''''''
-
-This represents a private communication channel between the host and the guest.
-
-::
-
- ...
- <devices>
- <channel type='unix'>
- <source mode='bind' path='/tmp/guestfwd'/>
- <target type='guestfwd' address='10.0.2.1'
port='4600'/>
- </channel>
-
- <!-- KVM virtio channel -->
- <channel type='pty'>
- <target type='virtio'
name='arbitrary.virtio.serial.port.name'/>
- </channel>
- <channel type='unix'>
- <source mode='bind'
path='/var/lib/libvirt/qemu/f16x86_64.agent'/>
- <target type='virtio' name='org.qemu.guest_agent.0'
state='connected'/>
- </channel>
- <channel type='spicevmc'>
- <target type='virtio' name='com.redhat.spice.0'/>
- </channel>
- </devices>
- ...
-
-This can be implemented in a variety of ways. The specific type of channel is
-given in the ``type`` attribute of the ``target`` element. Different channel
-types have different ``target`` attributes.
-
-``guestfwd``
- TCP traffic sent by the guest to a given IP address and port is forwarded to
- the channel device on the host. The ``target`` element must have ``address``
- and ``port`` attributes. :since:`Since 0.7.3`
-``virtio``
- Paravirtualized virtio channel. Channel is exposed in the guest under
- /dev/vport*, and if the optional element ``name`` is specified,
- /dev/virtio-ports/$name (for more info, please see
-
http://fedoraproject.org/wiki/Features/VirtioSerial). The optional element
- ``address`` can tie the channel to a particular ``type='virtio-serial'``
- controller, `documented above <#elementsAddress>`__. With qemu, if ``name``
- is "org.qemu.guest_agent.0", then libvirt can interact with a guest agent
- installed in the guest, for actions such as guest shutdown or file system
- quiescing. :since:`Since 0.7.7, guest agent interaction since 0.9.10`
- Moreover, :since:`since 1.0.6` it is possible to have source path auto
- generated for virtio unix channels. This is very useful in case of a qemu
- guest agent, where users don't usually care about the source path since it's
- libvirt who talks to the guest agent. In case users want to utilize this
- feature, they should leave ``<source>`` element out. :since:`Since 1.2.11`
- the active XML for a virtio channel may contain an optional ``state``
- attribute that reflects whether a process in the guest is active on the
- channel. This is an output-only attribute. Possible values for the ``state``
- attribute are ``connected`` and ``disconnected``.
-``xen``
- Paravirtualized Xen channel. Channel is exposed in the guest as a Xen console
- but identified with a name. Setup and consumption of a Xen channel depends on
- software and configuration in the guest (for more info, please see
-
http://xenbits.xen.org/docs/unstable/misc/channel.txt). Channel source path
- semantics are the same as the virtio target type. The ``state`` attribute is
- not supported since Xen channels lack the necessary probing mechanism.
- :since:`Since 2.3.0`
-``spicevmc``
- Paravirtualized SPICE channel. The domain must also have a SPICE server as a
- `graphics device <#elementsGraphics>`__, at which point the host piggy-backs
- messages across the ``main`` channel. The ``target`` element must be present,
- with attribute ``type='virtio'``; an optional attribute ``name`` controls how
- the guest will have access to the channel, and defaults to
- ``name='com.redhat.spice.0'``. The optional ``address`` element can tie the
- channel to a particular ``type='virtio-serial'`` controller. :since:`Since
- 0.8.8`
-
-:anchor:`<a id="elementsCharHostInterface"/>`
-
-Host interface
-^^^^^^^^^^^^^^
-
-A character device presents itself to the host as one of the following types.
-
-:anchor:`<a id="elementsCharSTDIO"/>`
-
-Domain logfile
-''''''''''''''
-
-This disables all input on the character device, and sends output into the
-virtual machine's logfile
-
-::
-
- ...
- <devices>
- <console type='stdio'>
- <target port='1'/>
- </console>
- </devices>
- ...
-
-:anchor:`<a id="elementsCharFle"/>`
-
-Device logfile
-''''''''''''''
-
-A file is opened and all data sent to the character device is written to the
-file.
-
-::
-
- ...
- <devices>
- <serial type="file">
- <source path="/var/log/vm/vm-serial.log"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-:anchor:`<a id="elementsCharVC"/>`
-
-Virtual console
-'''''''''''''''
-
-Connects the character device to the graphical framebuffer in a virtual console.
-This is typically accessed via a special hotkey sequence such as "ctrl+alt+3"
-
-::
-
- ...
- <devices>
- <serial type='vc'>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-:anchor:`<a id="elementsCharNull"/>`
-
-Null device
-'''''''''''
-
-Connects the character device to the void. No data is ever provided to the
-input. All data written is discarded.
-
-::
-
- ...
- <devices>
- <serial type='null'>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-:anchor:`<a id="elementsCharPTY"/>`
-
-Pseudo TTY
-''''''''''
-
-A Pseudo TTY is allocated using /dev/ptmx. A suitable client such as 'virsh
-console' can connect to interact with the serial port locally.
-
-::
-
- ...
- <devices>
- <serial type="pty">
- <source path="/dev/pts/3"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-NB special case if <console type='pty'>, then the TTY path is also
duplicated as
-an attribute tty='/dev/pts/3' on the top level <console> tag. This
provides
-compat with existing syntax for <console> tags.
-
-:anchor:`<a id="elementsCharHost"/>`
-
-Host device proxy
-'''''''''''''''''
-
-The character device is passed through to the underlying physical character
-device. The device types must match, eg the emulated serial port should only be
-connected to a host serial port - don't connect a serial port to a parallel
-port.
-
-::
-
- ...
- <devices>
- <serial type="dev">
- <source path="/dev/ttyS0"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-:anchor:`<a id="elementsCharPipe"/>`
-
-Named pipe
-''''''''''
-
-The character device writes output to a named pipe. See pipe(7) for more info.
-
-::
-
- ...
- <devices>
- <serial type="pipe">
- <source path="/tmp/mypipe"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-:anchor:`<a id="elementsCharTCP"/>`
-
-TCP client/server
-'''''''''''''''''
-
-The character device acts as a TCP client connecting to a remote server.
-
-::
-
- ...
- <devices>
- <serial type="tcp">
- <source mode="connect" host="0.0.0.0"
service="2445"/>
- <protocol type="raw"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-Or as a TCP server waiting for a client connection.
-
-::
-
- ...
- <devices>
- <serial type="tcp">
- <source mode="bind" host="127.0.0.1"
service="2445"/>
- <protocol type="raw"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-Alternatively you can use ``telnet`` instead of ``raw`` TCP in order to utilize
-the telnet protocol for the connection.
-
-:since:`Since 0.8.5,` some hypervisors support use of either ``telnets`` (secure
-telnet) or ``tls`` (via secure sockets layer) as the transport protocol for
-connections.
-
-::
-
- ...
- <devices>
- <serial type="tcp">
- <source mode="connect" host="0.0.0.0"
service="2445"/>
- <protocol type="telnet"/>
- <target port="1"/>
- </serial>
- ...
- <serial type="tcp">
- <source mode="bind" host="127.0.0.1"
service="2445"/>
- <protocol type="telnet"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-:since:`Since 2.4.0,` the optional attribute ``tls`` can be used to control
-whether a chardev TCP communication channel would utilize a hypervisor
-configured TLS X.509 certificate environment in order to encrypt the data
-channel. For the QEMU hypervisor, usage of a TLS environment can be controlled
-on the host by the ``chardev_tls`` and ``chardev_tls_x509_cert_dir`` or
-``default_tls_x509_cert_dir`` settings in the file /etc/libvirt/qemu.conf. If
-``chardev_tls`` is enabled, then unless the ``tls`` attribute is set to "no",
-libvirt will use the host configured TLS environment. If ``chardev_tls`` is
-disabled, but the ``tls`` attribute is set to "yes", then libvirt will attempt
-to use the host TLS environment if either the ``chardev_tls_x509_cert_dir`` or
-``default_tls_x509_cert_dir`` TLS directory structure exists.
-
-::
-
- ...
- <devices>
- <serial type="tcp">
- <source mode='connect' host="127.0.0.1"
service="5555" tls="yes"/>
- <protocol type="raw"/>
- <target port="0"/>
- </serial>
- </devices>
- ...
-
-:anchor:`<a id="elementsCharUDP"/>`
-
-UDP network console
-'''''''''''''''''''
-
-The character device acts as a UDP netconsole service, sending and receiving
-packets. This is a lossy service.
-
-::
-
- ...
- <devices>
- <serial type="udp">
- <source mode="bind" host="0.0.0.0"
service="2445"/>
- <source mode="connect" host="0.0.0.0"
service="2445"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-:anchor:`<a id="elementsCharUNIX"/>`
-
-UNIX domain socket client/server
-''''''''''''''''''''''''''''''''
-
-The character device acts as a UNIX domain socket server, accepting connections
-from local clients.
-
-::
-
- ...
- <devices>
- <serial type="unix">
- <source mode="bind" path="/tmp/foo"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-:anchor:`<a id="elementsCharSpiceport"/>`
-
-Spice channel
-'''''''''''''
-
-The character device is accessible through spice connection under a channel name
-specified in the ``channel`` attribute. :since:`Since 1.2.2`
-
-Note: depending on the hypervisor, spiceports might (or might not) be enabled on
-domains with or without `spice graphics <#elementsGraphics>`__.
-
-::
-
- ...
- <devices>
- <serial type="spiceport">
- <source channel="org.qemu.console.serial.0"/>
- <target port="1"/>
- </serial>
- </devices>
- ...
-
-:anchor:`<a id="elementsNmdm"/>`
-
-Nmdm device
-'''''''''''
-
-The nmdm device driver, available on FreeBSD, provides two tty devices connected
-together by a virtual null modem cable. :since:`Since 1.2.4`
-
-::
-
- ...
- <devices>
- <serial type="nmdm">
- <source master="/dev/nmdm0A" slave="/dev/nmdm0B"/>
- </serial>
- </devices>
- ...
-
-The ``source`` element has these attributes:
-
-``master``
- Master device of the pair, that is passed to the hypervisor. Device is
- specified by a fully qualified path.
-``slave``
- Slave device of the pair, that is passed to the clients for connection to the
- guest console. Device is specified by a fully qualified path.
-
-:anchor:`<a id="elementsSound"/>`
-
-Sound devices
-~~~~~~~~~~~~~
-
-A virtual sound card can be attached to the host via the ``sound`` element.
-:since:`Since 0.4.3`
-
-::
-
- ...
- <devices>
- <sound model='es1370'/>
- </devices>
- ...
-
-``sound``
- The ``sound`` element has one mandatory attribute, ``model``, which specifies
- what real sound device is emulated. Valid values are specific to the
- underlying hypervisor, though typical choices are 'es1370', 'sb16',
'ac97',
- 'ich6' and 'usb'. ( :since:` 'ac97' only since 0.6.0,
'ich6' only since
- 0.8.8, 'usb' only since 1.2.7` )
-
-:since:`Since 0.9.13` , a sound element with ``ich6`` model can have optional
-sub-elements ``<codec>`` to attach various audio codecs to the audio device. If
-not specified, a default codec will be attached to allow playback and recording.
-
-Valid values are:
-
-- 'duplex' - advertise a line-in and a line-out
-- 'micro' - advertise a speaker and a microphone
-- 'output' - advertise a line-out :since:`Since 4.4.0`
-
-::
-
- ...
- <devices>
- <sound model='ich6'>
- <codec type='micro'/>
- </sound>
- </devices>
- ...
-
-Each ``sound`` element has an optional sub-element ``<address>`` which can tie
-the device to a particular PCI slot, `documented above <#elementsAddress>`__.
-
-:anchor:`<a id="elementsWatchdog"/>`
-
-Watchdog device
-~~~~~~~~~~~~~~~
-
-A virtual hardware watchdog device can be added to the guest via the
-``watchdog`` element. :since:`Since 0.7.3, QEMU and KVM only`
-
-The watchdog device requires an additional driver and management daemon in the
-guest. Just enabling the watchdog in the libvirt configuration does not do
-anything useful on its own.
-
-Currently libvirt does not support notification when the watchdog fires. This
-feature is planned for a future version of libvirt.
-
-::
-
- ...
- <devices>
- <watchdog model='i6300esb'/>
- </devices>
- ...
-
-::
-
- ...
- <devices>
- <watchdog model='i6300esb' action='poweroff'/>
- </devices>
- </domain>
-
-``model``
- The required ``model`` attribute specifies what real watchdog device is
- emulated. Valid values are specific to the underlying hypervisor.
-
- QEMU and KVM support:
-
- - 'i6300esb' - the recommended device, emulating a PCI Intel 6300ESB
- - 'ib700' - emulating an ISA iBase IB700
- - 'diag288' - emulating an S390 DIAG288 device :since:`Since 1.2.17`
-
-``action``
- The optional ``action`` attribute describes what action to take when the
- watchdog expires. Valid values are specific to the underlying hypervisor.
-
- QEMU and KVM support:
-
- - 'reset' - default, forcefully reset the guest
- - 'shutdown' - gracefully shutdown the guest (not recommended)
- - 'poweroff' - forcefully power off the guest
- - 'pause' - pause the guest
- - 'none' - do nothing
- - 'dump' - automatically dump the guest :since:`Since 0.8.7`
- - 'inject-nmi' - inject a non-maskable interrupt into the guest
- :since:`Since 1.2.17`
-
- Note 1: the 'shutdown' action requires that the guest is responsive to ACPI
- signals. In the sort of situations where the watchdog has expired, guests are
- usually unable to respond to ACPI signals. Therefore using 'shutdown' is not
- recommended.
-
- Note 2: the directory to save dump files can be configured by
- ``auto_dump_path`` in file /etc/libvirt/qemu.conf.
-
-:anchor:`<a id="elementsMemBalloon"/>`
-
-Memory balloon device
-~~~~~~~~~~~~~~~~~~~~~
-
-A virtual memory balloon device is added to all Xen and KVM/QEMU guests. It will
-be seen as ``memballoon`` element. It will be automatically added when
-appropriate, so there is no need to explicitly add this element in the guest XML
-unless a specific PCI slot needs to be assigned. :since:`Since 0.8.3, Xen, QEMU
-and KVM only` Additionally, :since:`since 0.8.4` , if the memballoon device
-needs to be explicitly disabled, ``model='none'`` may be used.
-
-Example: automatically added device with KVM
-
-::
-
- ...
- <devices>
- <memballoon model='virtio'/>
- </devices>
- ...
-
-Example: manually added device with static PCI slot 2 requested
-
-::
-
- ...
- <devices>
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
- <stats period='10'/>
- <driver iommu='on' ats='on'/>
- </memballoon>
- </devices>
- </domain>
-
-``model``
- The required ``model`` attribute specifies what type of balloon device is
- provided. Valid values are specific to the virtualization platform
-
- - 'virtio' - default with QEMU/KVM
- - 'virtio-transitional' :since:`Since 5.2.0`
- - 'virtio-non-transitional' :since:`Since 5.2.0`
- - 'xen' - default with Xen
-
- See `Virtio transitional devices <#elementsVirtioTransitional>`__ for more
- details.
-
-``autodeflate``
- The optional ``autodeflate`` attribute allows to enable/disable (values
- "on"/"off", respectively) the ability of the QEMU virtio memory
balloon to
- release some memory at the last moment before a guest's process get killed by
- Out of Memory killer. :since:`Since 1.3.1, QEMU and KVM only`
-
-``period``
- The optional ``period`` allows the QEMU virtio memory balloon driver to
- provide statistics through the ``virsh dommemstat [domain]``
- command. By default, collection is not enabled. In order to enable, use the
- ``virsh dommemstat [domain] --period [number]`` command or
- ``virsh edit`` command to add the option to the XML definition. The
- ``virsh dommemstat`` will accept the options ``--live``, ``--current``, or
- ``--config``. If an option is not provided, the change for a running domain
- will only be made to the active guest. If the QEMU driver is not at the right
- revision, the attempt to set the period will fail. Large values (e.g. many
- years) might be ignored. :since:`Since 1.1.1, requires QEMU 1.5`
-
-``driver``
- For model ``virtio`` memballoon, `Virtio-specific
- options <#elementsVirtio>`__ can also be set. ( :since:`Since 3.5.0` )
-
-:anchor:`<a id="elementsRng"/>`
-
-Random number generator device
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The virtual random number generator device allows the host to pass through
-entropy to guest operating systems. :since:`Since 1.0.3`
-
-Example: usage of the RNG device:
-
-::
-
- ...
- <devices>
- <rng model='virtio'>
- <rate period="2000" bytes="1234"/>
- <backend model='random'>/dev/random</backend>
- <!-- OR -->
- <backend model='egd' type='udp'>
- <source mode='bind' service='1234'/>
- <source mode='connect' host='1.2.3.4'
service='1234'/>
- </backend>
- <!-- OR -->
- <backend model='builtin'/>
- </rng>
- </devices>
- ...
-
-``model``
- The required ``model`` attribute specifies what type of RNG device is
- provided. Valid values are specific to the virtualization platform:
-
- - 'virtio' - supported by qemu and virtio-rng kernel module
- - 'virtio-transitional' :since:`Since 5.2.0`
- - 'virtio-non-transitional' :since:`Since 5.2.0`
-
- See `Virtio transitional devices <#elementsVirtioTransitional>`__ for more
- details.
-
-``rate``
- The optional ``rate`` element allows limiting the rate at which entropy can
- be consumed from the source. The mandatory attribute ``bytes`` specifies how
- many bytes are permitted to be consumed per period. An optional ``period``
- attribute specifies the duration of a period in milliseconds; if omitted, the
- period is taken as 1000 milliseconds (1 second). :since:`Since 1.0.4`
-
-``backend``
- The ``backend`` element specifies the source of entropy to be used for the
- domain. The source model is configured using the ``model`` attribute.
- Supported source models are:
-
- ``random``
- This backend type expects a non-blocking character device as input. The
- file name is specified as contents of the ``backend`` element.
- :since:`Since 1.3.4` any path is accepted. Before that ``/dev/random`` and
- ``/dev/hwrng`` were the only accepted paths. When no file name is
- specified, the hypervisor default is used. For QEMU, the default is
- ``/dev/random``. However, the recommended source of entropy is
- ``/dev/urandom`` (as it doesn't have the limitations of ``/dev/random``).
-
- ``egd``
- This backend connects to a source using the EGD protocol. The source is
- specified as a character device. Refer to `character device host
- interface <#elementsCharHostInterface>`__ for more information.
-
- ``builtin``
- This backend uses qemu builtin random generator, which uses
- ``getrandom()`` syscall as the source of entropy. ( :since:`Since 6.1.0
- and QEMU 4.2` )
-
-``driver``
- The subelement ``driver`` can be used to tune the device:
-
- virtio options
- `Virtio-specific options <#elementsVirtio>`__ can also be set. (
- :since:`Since 3.5.0` )
-
-:anchor:`<a id="elementsTpm"/>`
-
-TPM device
-~~~~~~~~~~
-
-The TPM device enables a QEMU guest to have access to TPM functionality. The TPM
-device may either be a TPM 1.2 or a TPM 2.0.
-
-The TPM passthrough device type provides access to the host's TPM for one QEMU
-guest. No other software may be using the TPM device, typically /dev/tpm0, at
-the time the QEMU guest is started. :since:`'passthrough' since 1.0.5`
-
-Example: usage of the TPM passthrough device
-
-::
-
- ...
- <devices>
- <tpm model='tpm-tis'>
- <backend type='passthrough'>
- <device path='/dev/tpm0'/>
- </backend>
- </tpm>
- </devices>
- ...
-
-The emulator device type gives access to a TPM emulator providing TPM
-functionality for each VM. QEMU talks to it over a Unix socket. With the
-emulator device type each guest gets its own private TPM. :since:`'emulator'
-since 4.5.0` The state of the TPM emulator can be encrypted by providing an
-``encryption`` element. :since:`'encryption' since 5.6.0`
-
-Example: usage of the TPM Emulator
-
-::
-
- ...
- <devices>
- <tpm model='tpm-tis'>
- <backend type='emulator' version='2.0'>
- <encryption secret='6dd3e4a5-1d76-44ce-961f-f119f5aad935'/>
- </backend>
- </tpm>
- </devices>
- ...
-
-``model``
- The ``model`` attribute specifies what device model QEMU provides to the
- guest. If no model name is provided, ``tpm-tis`` will automatically be chosen
- for non-PPC64 architectures. :since:`Since 4.4.0` , another available choice
- is the ``tpm-crb``, which should only be used when the backend device is a
- TPM 2.0. :since:`Since 6.1.0` , pSeries guests on PPC64 are supported and the
- default is ``tpm-spapr``. :since:`Since 6.5.0` , a new model called
- ``spapr-tpm-proxy`` was added for pSeries guests. This model only works with
- the ``passthrough`` backend. It creates a TPM Proxy device that communicates
- with an existing TPM Resource Manager in the host, for example
- ``/dev/tpmrm0``, enabling the guest to run in secure virtual machine mode
- with the help of an Ultravisor. Adding a TPM Proxy to a pSeries guest brings
- no security benefits unless the guest is running on a PPC64 host that has an
- Ultravisor and a TPM Resource Manager. Only one TPM Proxy device is allowed
- per guest, but a TPM Proxy device can be added together with other TPM
- devices.
-
-``backend``
- The ``backend`` element specifies the type of TPM device. The following types
- are supported:
-
- ``passthrough``
- Use the host's TPM or TPM Resource Manager device.
-
- This backend type requires exclusive access to a TPM device on the host.
- An example for such a device is /dev/tpm0. The fully qualified file name
- is specified by path attribute of the ``source`` element. If no file name
- is specified then /dev/tpm0 is automatically used. :since:`Since 6.5.0` ,
- when choosing the ``spapr-tpm-proxy`` model, the file name specified is
- expected to be a TPM Resource Manager device, e.g. ``/dev/tpmrm0``.
-
- ``emulator``
- For this backend type the 'swtpm' TPM Emulator must be installed on the
- host. Libvirt will automatically start an independent TPM emulator for
- each QEMU guest requesting access to it.
-
-``version``
- The ``version`` attribute indicates the version of the TPM. By default a TPM
- 1.2 is created. This attribute only works with the ``emulator`` backend. The
- following versions are supported:
-
- - '1.2' : creates a TPM 1.2
- - '2.0' : creates a TPM 2.0
-
-``encryption``
- The ``encryption`` element allows the state of a TPM emulator to be
- encrypted. The ``secret`` must reference a secret object that holds the
- passphrase from which the encryption key will be derived.
-
-:anchor:`<a id="elementsNVRAM"/>`
-
-NVRAM device
-~~~~~~~~~~~~
-
-nvram device is always added to pSeries guest on PPC64, and its address is
-allowed to be changed. Element ``nvram`` (only valid for pSeries guest,
-:since:`since 1.0.5` ) is provided to enable the address setting.
-
-Example: usage of NVRAM configuration
-
-::
-
- ...
- <devices>
- <nvram>
- <address type='spapr-vio' reg='0x00003000'/>
- </nvram>
- </devices>
- ...
-
-``spapr-vio``
- VIO device address type, only valid for PPC64.
-
-``reg``
- Device address
-
-:anchor:`<a id="elementsPanic"/>`
-
-panic device
-~~~~~~~~~~~~
-
-panic device enables libvirt to receive panic notification from a QEMU guest.
-:since:`Since 1.2.1, QEMU and KVM only`
-
-This feature is always enabled for:
-
-- pSeries guests, since it's implemented by the guest firmware
-- S390 guests, since it's an integral part of the S390 architecture
-
-For the guest types listed above, libvirt automatically adds a ``panic`` element
-to the domain XML.
-
-Example: usage of panic configuration
-
-::
-
- ...
- <devices>
- <panic model='hyperv'/>
- <panic model='isa'>
- <address type='isa' iobase='0x505'/>
- </panic>
- </devices>
- ...
-
-``model``
- The optional ``model`` attribute specifies what type of panic device is
- provided. The panic model used when this attribute is missing depends on the
- hypervisor and guest arch.
-
- - 'isa' - for ISA pvpanic device
- - 'pseries' - default and valid only for pSeries guests.
- - 'hyperv' - for Hyper-V crash CPU feature. :since:`Since 1.3.0, QEMU and
- KVM only`
- - 's390' - default for S390 guests. :since:`Since 1.3.5`
-
-``address``
- address of panic. The default ioport is 0x505. Most users don't need to
- specify an address, and doing so is forbidden altogether for s390, pseries
- and hyperv models.
-
-:anchor:`<a id="elementsShmem"/>`
-
-Shared memory device
-~~~~~~~~~~~~~~~~~~~~
-
-A shared memory device allows to share a memory region between different virtual
-machines and the host. :since:`Since 1.2.10, QEMU and KVM only`
-
-::
-
- ...
- <devices>
- <shmem name='my_shmem0'>
- <model type='ivshmem-plain'/>
- <size unit='M'>4</size>
- </shmem>
- <shmem name='shmem_server'>
- <model type='ivshmem-doorbell'/>
- <size unit='M'>2</size>
- <server path='/tmp/socket-shmem'/>
- <msi vectors='32' ioeventfd='on'/>
- </shmem>
- </devices>
- ...
-
-``shmem``
- The ``shmem`` element has one mandatory attribute, ``name`` to identify the
- shared memory. This attribute cannot be directory specific to ``.`` or ``..``
- as well as it cannot involve path separator ``/``.
-``model``
- Attribute ``type`` of the optional element ``model`` specifies the model of
- the underlying device providing the ``shmem`` device. The models currently
- supported are ``ivshmem`` (supports both server and server-less shmem, but is
- deprecated by newer QEMU in favour of the -plain and -doorbell variants),
- ``ivshmem-plain`` (only for server-less shmem) and ``ivshmem-doorbell`` (only
- for shmem with the server).
-``size``
- The optional ``size`` element specifies the size of the shared memory. This
- must be power of 2 and greater than or equal to 1 MiB.
-``server``
- The optional ``server`` element can be used to configure a server socket the
- device is supposed to connect to. The optional ``path`` attribute specifies
- the absolute path to the unix socket and defaults to
- ``/var/lib/libvirt/shmem/$shmem-$name-sock``.
-``msi``
- The optional ``msi`` element enables/disables (values "on"/"off",
- respectively) MSI interrupts. This option can currently be used only together
- with the ``server`` element. The ``vectors`` attribute can be used to specify
- the number of interrupt vectors. The ``ioeventd`` attribute enables/disables
- (values "on"/"off", respectively) ioeventfd.
-
-:anchor:`<a id="elementsMemory"/>`
-
-Memory devices
-~~~~~~~~~~~~~~
-
-In addition to the initial memory assigned to the guest, memory devices allow
-additional memory to be assigned to the guest in the form of memory modules. A
-memory device can be hot-plugged or hot-unplugged depending on the guests'
-memory resource needs. Some hypervisors may require NUMA configured for the
-guest.
-
-Example: usage of the memory devices
-
-::
-
- ...
- <devices>
- <memory model='dimm' access='private' discard='yes'>
- <target>
- <size unit='KiB'>524287</size>
- <node>0</node>
- </target>
- </memory>
- <memory model='dimm'>
- <source>
- <pagesize unit='KiB'>4096</pagesize>
- <nodemask>1-3</nodemask>
- </source>
- <target>
- <size unit='KiB'>524287</size>
- <node>1</node>
- </target>
- </memory>
- <memory model='nvdimm'>
- <uuid>
- <source>
- <path>/tmp/nvdimm</path>
- </source>
- <target>
- <size unit='KiB'>524288</size>
- <node>1</node>
- <label>
- <size unit='KiB'>128</size>
- </label>
- <readonly/>
- </target>
- </memory>
- <memory model='nvdimm' access='shared'>
- <uuid>
- <source>
- <path>/dev/dax0.0</path>
- <alignsize unit='KiB'>2048</alignsize>
- <pmem/>
- </source>
- <target>
- <size unit='KiB'>524288</size>
- <node>1</node>
- <label>
- <size unit='KiB'>128</size>
- </label>
- </target>
- </memory>
- </devices>
- ...
-
-``model``
- Provide ``dimm`` to add a virtual DIMM module to the guest. :since:`Since
- 1.2.14` Provide ``nvdimm`` model adds a Non-Volatile DIMM module.
- :since:`Since 3.2.0`
-
-``access``
- An optional attribute ``access`` ( :since:`since 3.2.0` ) that provides
- capability to fine tune mapping of the memory on per module basis. Values are
- the same as `Memory Backing <#elementsMemoryBacking>`__: ``shared`` and
- ``private``. For ``nvdimm`` model, if using real NVDIMM DAX device as
- backend, ``shared`` is required.
-
-``discard``
- An optional attribute ``discard`` ( :since:`since 4.4.0` ) that provides
- capability to fine tune discard of data on per module basis. Accepted values
- are ``yes`` and ``no``. The feature is described here: `Memory
- Backing <#elementsMemoryBacking>`__. This attribute is allowed only for
- ``model='dimm'``.
-
-``uuid``
- For pSeries guests, an uuid can be set to identify the nvdimm module. If
- absent, libvirt will generate an uuid. automatically. This attribute is
- allowed only for ``model='nvdimm'`` for pSeries guests. :since:`Since 6.2.0`
-
-``source``
- For model ``dimm`` this element is optional and allows to fine tune the
- source of the memory used for the given memory device. If the element is not
- provided defaults configured via ``numatune`` are used. If ``dimm`` is
- provided, then the following optional elements can be provided as well:
-
- ``pagesize``
- This element can be used to override the default host page size used for
- backing the memory device. The configured value must correspond to a page
- size supported by the host.
-
- ``nodemask``
- This element can be used to override the default set of NUMA nodes where
- the memory would be allocated.
-
- For model ``nvdimm`` this element is mandatory. The mandatory child element
- ``path`` represents a path in the host that backs the nvdimm module in the
- guest. The following optional elements may be used:
-
- ``alignsize``
- The ``alignsize`` element defines the page size alignment used to mmap the
- address range for the backend ``path``. If not supplied the host page size
- is used. For example, to mmap a real NVDIMM device a 2M-aligned page may
- be required, and host page size is 4KB, then we need to set this element
- to 2MB. :since:`Since 5.0.0`
-
- ``pmem``
- If persistent memory is supported and enabled by the hypervisor in order
- to guarantee the persistence of writes to the vNVDIMM backend, then use
- the ``pmem`` element in order to utilize the feature. :since:`Since 5.0.0`
-
-``target``
- The mandatory ``target`` element configures the placement and sizing of the
- added memory from the perspective of the guest.
-
- The mandatory ``size`` subelement configures the size of the added memory as
- a scaled integer.
-
- The ``node`` subelement configures the guest NUMA node to attach the memory
- to. The element shall be used only if the guest has NUMA nodes configured.
-
- The following optional elements may be used:
-
- ``label``
- For NVDIMM type devices one can use ``label`` and its subelement ``size``
- to configure the size of namespaces label storage within the NVDIMM
- module. The ``size`` element has usual meaning described
- `here <#elementsMemoryAllocation>`__. ``label`` is mandatory for pSeries
- guests and optional for all other architectures. For QEMU domains the
- following restrictions apply:
-
- #. the minimum label size is 128KiB,
- #. the remaining size (total-size - label-size) will be aligned to 4KiB as
- default.
-
- ``readonly``
- The ``readonly`` element is used to mark the vNVDIMM as read-only. Only
- the real NVDIMM device backend can guarantee the guest write persistence,
- so other backend types should use the ``readonly`` element. :since:`Since
- 5.0.0`
-
-:anchor:`<a id="elementsIommu"/>`
-
-IOMMU devices
-~~~~~~~~~~~~~
-
-The ``iommu`` element can be used to add an IOMMU device. :since:`Since 2.1.0`
-
-Example:
-
-::
-
- ...
- <devices>
- <iommu model='intel'>
- <driver intremap='on'/>
- </iommu>
- </devices>
- ...
-
-``model``
- Supported values are ``intel`` (for Q35 guests) and, :since:`since 5.5.0` ,
- ``smmuv3`` (for ARM virt guests).
-
-``driver``
- The ``driver`` subelement can be used to configure additional options, some
- of which might only be available for certain IOMMU models:
-
- ``intremap``
- The ``intremap`` attribute with possible values ``on`` and ``off`` can be
- used to turn on interrupt remapping, a part of the VT-d functionality.
- Currently this requires split I/O APIC (``<ioapic
driver='qemu'/>``).
- :since:`Since 3.4.0` (QEMU/KVM only)
-
- ``caching_mode``
- The ``caching_mode`` attribute with possible values ``on`` and ``off`` can
- be used to turn on the VT-d caching mode (useful for assigned devices).
- :since:`Since 3.4.0` (QEMU/KVM only)
-
- ``eim``
- The ``eim`` attribute (with possible values ``on`` and ``off``) can be
- used to configure Extended Interrupt Mode. A q35 domain with split I/O
- APIC (as described in `hypervisor features <#elementsFeatures>`__), and
- both interrupt remapping and EIM turned on for the IOMMU, will be able to
- use more than 255 vCPUs. :since:`Since 3.4.0` (QEMU/KVM only)
-
- ``iotlb``
- The ``iotlb`` attribute with possible values ``on`` and ``off`` can be
- used to turn on the IOTLB used to cache address translation requests from
- devices. :since:`Since 3.5.0` (QEMU/KVM only)
-
- ``aw_bits``
- The ``aw_bits`` attribute can be used to set the address width to allow
- mapping larger iova addresses in the guest. :since:`Since 6.5.0` (QEMU/KVM
- only)
-
-:anchor:`<a id="vsock"/>`
-
-Vsock
------
-
-A vsock host/guest interface. The ``model`` attribute defaults to ``virtio``.
-:since:`Since 5.2.0` ``model`` can also be 'virtio-transitional' and
-'virtio-non-transitional', see `Virtio transitional
-devices <#elementsVirtioTransitional>`__ for more details. The optional
-attribute ``address`` of the ``cid`` element specifies the CID assigned to the
-guest. If the attribute ``auto`` is set to ``yes``, libvirt will assign a free
-CID automatically on domain startup. :since:`Since 4.4.0`
-
-::
-
- ...
- <devices>
- <vsock model='virtio'>
- <cid auto='no' address='3'/>
- </vsock>
- </devices>
- ...
+.. include:: formatdomain-devices.rst.in
:anchor:`<a id="seclabel"/>`
--
2.26.2