<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <body>
    <h1>Driver capabilities XML format</h1>

    <ul id="toc"></ul>

    <h2><a id="elements">Element and attribute overview</a></h2>

    <p>As new virtualization engine support gets added to libvirt, and to
    handle cases like QEMU supporting a variety of emulations, a query
    interface has been added in 0.2.1 allowing to list the set of supported
    virtualization capabilities on the host:</p>

    <pre>char * virConnectGetCapabilities (virConnectPtr conn);</pre>

    <p>The value returned is an XML document listing the virtualization
    capabilities of the host and virtualization engine to which
    <code>@conn</code> is connected. One can test it using <code>virsh</code>
    command line tool command '<code>capabilities</code>', it dumps the XML
    associated to the current connection. </p>

    <p>As can be seen in the <a href="#elementExamples">example</a>, the
    capabilities XML consists of the <code>capabilities</code> element which
    have exactly one <code>host</code> child element to report information on
    host capabilities, and zero or more <code>guest</code> element to express
    the set of architectures the host can run at the moment.</p>


    <h3><a id="elementHost">Host capabilities</a></h3>

    <p>The <code>&lt;host/&gt;</code> element consists of the following child
    elements:</p>
    <dl>
      <dt><code>uuid</code></dt>
      <dd>The host UUID.</dd>

      <dt><code>cpu</code></dt>
      <dd>The host CPU architecture and features.</dd>

      <dt><code>power_management</code></dt>
      <dd>whether host is capable of memory suspend, disk hibernation, or
      hybrid suspend.</dd>

      <dt><code>migration</code></dt>
      <dd>This element exposes information on the hypervisor's migration
      capabilities, like live migration, supported URI transports, and so
      on.</dd>

      <dt><code>topology</code></dt>
      <dd>This element embodies the host internal topology. Management
      applications may want to learn this information when orchestrating new
      guests - e.g. due to reduce inter-NUMA node transfers.</dd>

      <dt><code>secmodel</code></dt>
      <dd>To find out default security labels for different security models you
      need to parse this element. In contrast with the former elements, this is
      repeated for each security model the libvirt daemon currently supports.
      </dd>
    </dl>


    <h3><a id="elementGuest">Guest capabilities</a></h3>

    <p>While the <a href="#elementHost">previous section</a> aims at host
    capabilities, this one focuses on capabilities available to a guest
    using a given hypervisor. The <code>&lt;guest/&gt;</code> element will
    typically wrap up the following elements:</p>

    <dl>
        <dt><code>os_type</code></dt>
        <dd>This expresses what kind of operating system the hypervisor
        is able to run. Possible values are:
        <dl>
          <dt><code>xen</code></dt>
          <dd>for XEN PV</dd>

          <dt><code>linux</code></dt>
          <dd>legacy alias for <code>xen</code></dd>

          <dt><code>xenpvh</code></dt>
          <dd>for XEN PVH</dd>

          <dt><code>hvm</code></dt>
          <dd>Unmodified operating system</dd>

          <dt><code>exe</code></dt>
          <dd>Container based virtualization</dd>
        </dl>
        </dd>

        <dt><code>arch</code></dt>
        <dd>This element brings some information on supported guest
          architecture. Possible subelements are:
          <dl>
            <dt><code>wordsize</code></dt><dd>Size of CPU word in bits, for example 64.</dd>
            <dt><code>emulator</code></dt><dd>Emulator (device model) path, for
              use in <a href="formatdomain.html#elementEmulator">emulator</a>
              element of domain XML.</dd>
            <dt><code>loader</code></dt><dd>Loader path, for use in
              <a href="formatdomain.html#elementLoader">loader</a> element of domain
              XML.</dd>
            <dt><code>machine</code></dt><dd>Machine type, for use in
              <a href="formatdomain.html#attributeOSTypeMachine">machine</a>
              attribute of os/type element in domain XML. For example Xen
              supports <code>xenfv</code> for HVM, <code>xenpv</code> for
              PV, or <code>xenpvh</code> for PVH.</dd>
            <dt><code>domain</code></dt><dd>The <code>type</code> attribute of
              this element specifies the type of hypervisor required to run the
              domain. Use in <a href="formatdomain.html#attributeDomainType">type</a>
              attribute of the domain root element.</dd>
          </dl>
        </dd>

        <dt><code>features</code></dt>
        <dd>This optional element encases possible features that can be used
          with a guest of described type.  Possible subelements are:
          <dl>
            <dt><code>pae</code></dt><dd>If present, 32-bit guests can use PAE
              address space extensions, <span class="since">since
              0.4.1</span></dd>
            <dt><code>nonpae</code></dt><dd>If present, 32-bit guests can be run
              without requiring PAE, <span class="since">since
              0.4.1</span></dd>
            <dt><code>ia64_be</code></dt><dd>If present, IA64 guests can be run in
              big-endian mode, <span class="since">since 0.4.1</span></dd>
            <dt><code>acpi</code></dt><dd>If this element is present,
              the <code>default</code> attribute describes whether the
              hypervisor exposes ACPI to the guest by default, and
              the <code>toggle</code> attribute describes whether the
              user can override this
              default. <span class="since">Since 0.4.1</span></dd>
            <dt><code>apic</code></dt><dd>If this element is present,
              the <code>default</code> attribute describes whether the
              hypervisor exposes APIC to the guest by default, and
              the <code>toggle</code> attribute describes whether the
              user can override this
              default. <span class="since">Since 0.4.1</span></dd>
            <dt><code>cpuselection</code></dt><dd>If this element is present, the
              hypervisor supports the <code>&lt;cpu&gt;</code> element
              within a domain definition for fine-grained control over
              the CPU presented to the
              guest. <span class="since">Since 0.7.5</span></dd>
            <dt><code>deviceboot</code></dt><dd>If this element is present,
              the <code>&lt;boot order='...'/&gt;</code> element can
              be used inside devices, rather than the older boot
              specification by category. <span class="since">Since
              0.8.8</span></dd>
            <dt><code>disksnapshot</code></dt><dd>If this element is present,
              the <code>default</code> attribute describes whether
              external disk snapshots are supported.  If absent,
              external snapshots may still be supported, but it
              requires attempting the API and checking for an error to
              find out for sure. <span class="since">Since
              1.2.3</span></dd>
          </dl>
        </dd>
    </dl>

    <h3><a id="elementExamples">Examples</a></h3>

    <p>For example, in the case of a 64-bit machine with hardware
    virtualization capabilities enabled in the chip and
    BIOS you will see:</p>

    <pre>&lt;capabilities&gt;
  <span style="color: #E50000">&lt;host&gt;
    &lt;cpu&gt;
      &lt;arch&gt;x86_64&lt;/arch&gt;
      &lt;features&gt;
        &lt;vmx/&gt;
      &lt;/features&gt;
      &lt;model&gt;core2duo&lt;/model&gt;
      &lt;vendor&gt;Intel&lt;/vendor&gt;
      &lt;topology sockets="1" cores="2" threads="1"/&gt;
      &lt;feature name="lahf_lm"/&gt;
      &lt;feature name='xtpr'/&gt;
      ...
    &lt;/cpu&gt;
    &lt;power_management&gt;
      &lt;suspend_mem/&gt;
      &lt;suspend_disk/&gt;
      &lt;suspend_hybrid/&gt;
    &lt;/power_management&gt;
  &lt;/host&gt;</span>

  &lt;!-- xen-3.0-x86_64 --&gt;
  <span style="color: #0000E5">&lt;guest&gt;
    &lt;os_type&gt;xen&lt;/os_type&gt;
    &lt;arch name="x86_64"&gt;
      &lt;wordsize&gt;64&lt;/wordsize&gt;
      &lt;domain type="xen"&gt;&lt;/domain&gt;
      &lt;emulator&gt;/usr/lib64/xen/bin/qemu-dm&lt;/emulator&gt;
    &lt;/arch&gt;
    &lt;features&gt;
    &lt;/features&gt;
  &lt;/guest&gt;</span>

  &lt;!-- hvm-3.0-x86_32 --&gt;
  <span style="color: #00B200">&lt;guest&gt;
    &lt;os_type&gt;hvm&lt;/os_type&gt;
    &lt;arch name="i686"&gt;
      &lt;wordsize&gt;32&lt;/wordsize&gt;
      &lt;domain type="xen"&gt;&lt;/domain&gt;
      &lt;emulator&gt;/usr/lib/xen/bin/qemu-dm&lt;/emulator&gt;
      &lt;machine&gt;pc&lt;/machine&gt;
      &lt;machine&gt;isapc&lt;/machine&gt;
      &lt;loader&gt;/usr/lib/xen/boot/hvmloader&lt;/loader&gt;
    &lt;/arch&gt;
    &lt;features&gt;
      &lt;cpuselection/&gt;
      &lt;deviceboot/&gt;
    &lt;/features&gt;
  &lt;/guest&gt;</span>
  ...
&lt;/capabilities&gt;</pre>
  </body>
</html>
