Signed-off-by: Peter Krempa <pkre...@redhat.com> --- docs/formatdomain-devices-chardev.rst | 682 +++++++++++++++++++++++++ docs/formatdomain-devices.rst | 684 +------------------------- docs/meson.build | 1 + 3 files changed, 684 insertions(+), 683 deletions(-) create mode 100644 docs/formatdomain-devices-chardev.rst
diff --git a/docs/formatdomain-devices-chardev.rst b/docs/formatdomain-devices-chardev.rst new file mode 100644 index 0000000000..120b045b8f --- /dev/null +++ b/docs/formatdomain-devices-chardev.rst @@ -0,0 +1,682 @@ +: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. diff --git a/docs/formatdomain-devices.rst b/docs/formatdomain-devices.rst index 8d8d52731e..0e4ea95d3b 100644 --- a/docs/formatdomain-devices.rst +++ b/docs/formatdomain-devices.rst @@ -53,689 +53,7 @@ following characters: ``[a-zA-Z0-9_-]``. :since:`Since 3.9.0` .. include:: formatdomain-devices-hub.rst .. include:: formatdomain-devices-graphics.rst .. include:: formatdomain-devices-video.rst - -: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. +.. include:: formatdomain-devices-chardev.rst :anchor:`<a id="elementsSound"/>` diff --git a/docs/meson.build b/docs/meson.build index 56791e3258..440356f7ac 100644 --- a/docs/meson.build +++ b/docs/meson.build @@ -138,6 +138,7 @@ docs_rst_files = [ 'formatdomain-devices-hub.rst', 'formatdomain-devices-graphics.rst', 'formatdomain-devices-video.rst', + 'formatdomain-devices-chardev.rst', ] }, { 'name': 'hacking' }, -- 2.26.2