Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
docs/formatsnapshot.html.in | 352 ------------------------------------
docs/formatsnapshot.rst | 297 ++++++++++++++++++++++++++++++
docs/meson.build | 2 +-
3 files changed, 298 insertions(+), 353 deletions(-)
delete mode 100644 docs/formatsnapshot.html.in
create mode 100644 docs/formatsnapshot.rst
diff --git a/docs/formatsnapshot.html.in b/docs/formatsnapshot.html.in
deleted file mode 100644
index e481284aa8..0000000000
--- a/docs/formatsnapshot.html.in
+++ /dev/null
@@ -1,352 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html>
-<html
xmlns="http://www.w3.org/1999/xhtml">
- <body>
- <h1>Snapshot XML format</h1>
-
- <ul id="toc"></ul>
-
- <h2><a id="SnapshotAttributes">Snapshot
XML</a></h2>
-
- <p>
- Snapshots are one form
- of <a href="kbase/domainstatecapture.html">domain state
- capture</a>. There are several types of snapshots:
- </p>
- <dl>
- <dt>disk snapshot</dt>
- <dd>Contents of disks (whether a subset or all disks associated
- with the domain) are saved at a given point of time, and can
- be restored back to that state. On a running guest, a disk
- snapshot is likely to be only crash-consistent rather than
- clean (that is, it represents the state of the disk on a
- sudden power outage, and may need fsck or journal replays to
- be made consistent); on an inactive guest, a disk snapshot is
- clean if the disks were clean when the guest was last shut
- down. Disk snapshots exist in two forms: internal (file
- formats such as qcow2 track both the snapshot and changes
- since the snapshot in a single file) and external (the
- snapshot is one file, and the changes since the snapshot are
- in another file).</dd>
- <dt>memory state (or VM state)</dt>
- <dd>Tracks only the state of RAM and all other resources in use
- by the VM. If the disks are unmodified between the time a VM
- state snapshot is taken and restored, then the guest will
- resume in a consistent state; but if the disks are modified
- externally in the meantime, this is likely to lead to data
- corruption.</dd>
- <dt>full system</dt>
- <dd>A combination of disk snapshots for all disks as well as VM
- memory state, which can be used to resume the guest from where it
- left off with symptoms similar to hibernation (that is, TCP
- connections in the guest may have timed out, but no files or
- processes are lost).</dd>
- </dl>
-
- <p>
- Libvirt can manage all three types of snapshots. For now, VM
- state (memory) snapshots are created only by
- the <code>virDomainSave()</code>,
<code>virDomainSaveFlags</code>,
- and <code>virDomainManagedSave()</code> functions, and restored
- via the <code>virDomainRestore()</code>,
- <code>virDomainRestoreFlags()</code>,
<code>virDomainCreate()</code>,
- and <code>virDomainCreateWithFlags()</code> functions (as well
- as via domain autostart). With managed snapshots, libvirt
- tracks all information internally; with save images, the user
- tracks the snapshot file, but libvirt provides functions such
- as <code>virDomainSaveImageGetXMLDesc()</code> to work with
- those files.
- </p>
- <p>Full system snapshots are created
- by <code>virDomainSnapshotCreateXML()</code> with no flags, while
- disk snapshots are created by the same function with
- the <code>VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY</code>
- flag. Regardless of the flags provided, restoration of the
- snapshot is handled by
- the <code>virDomainRevertToSnapshot()</code> function. For
- these types of snapshots, libvirt tracks each snapshot as a
- separate <code>virDomainSnapshotPtr</code> object, and maintains
- a tree relationship of which snapshots descended from an earlier
- point in time.
- </p>
-
- <p>
- Attributes of libvirt snapshots are stored as child elements of
- the <code>domainsnapshot</code> element. At snapshot creation
- time, normally only the <code>name</code>,
<code>description</code>,
- and <code>disks</code> elements are settable; the rest of the
- fields are ignored on creation, and will be filled in by
- libvirt in for informational purposes
- by <code>virDomainSnapshotGetXMLDesc()</code>. However, when
- redefining a snapshot (<span class="since">since
0.9.5</span>),
- with the <code>VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE</code> flag
- of <code>virDomainSnapshotCreateXML()</code>, all of the XML
- described here is relevant on input, even the fields that are
- normally described as readonly for output.
- </p>
- <p>
- Snapshots are maintained in a hierarchy. A domain can have a
- current snapshot, which is the most recent snapshot compared to
- the current state of the domain (although a domain might have
- snapshots without a current snapshot, if snapshots have been
- deleted in the meantime). Creating or reverting to a snapshot
- sets that snapshot as current, and the prior current snapshot is
- the parent of the new snapshot. Branches in the hierarchy can
- be formed by reverting to a snapshot with a child, then creating
- another snapshot. For now, the creation of external snapshots
- when checkpoints exist is forbidden, although future work will
- make it possible to integrate these two concepts.
- </p>
- <p>
- The top-level <code>domainsnapshot</code> element may contain
- the following elements:
- </p>
- <dl>
- <dt><code>name</code></dt>
- <dd>The optional name for this snapshot. If the name is
- omitted, libvirt will create a name based on the time of the
- creation.
- </dd>
- <dt><code>description</code></dt>
- <dd>An optional human-readable description of the snapshot. If
- the description is omitted when initially creating the
- snapshot, then this field will be empty.
- </dd>
- <dt><code>memory</code></dt>
- <dd>On input, this is an optional request for how to handle VM
- memory state. For an offline domain or a disk-only snapshot,
- attribute <code>snapshot</code> must be <code>no</code>,
since
- there is no VM state saved; otherwise, the attribute can
- be <code>internal</code> if the memory state is piggy-backed with
- other internal disk state, or <code>external</code> along with
- a second attribute <code>file</code> giving the absolute path
- of the file holding the VM memory state. <span
class="since">Since
- 1.0.1</span>
- </dd>
- <dt><code>disks</code></dt>
- <dd>On input, this is an optional listing of specific
- instructions for disk snapshots; it is needed when making a
- snapshot of only a subset of the disks associated with a
- domain, or when overriding the domain defaults for how to
- snapshot each disk, or for providing specific control over
- what file name is created in an external snapshot. On output,
- this is fully populated to show the state of each disk in the
- snapshot, including any properties that were generated by the
- hypervisor defaults. For full system snapshots, this field is
- ignored on input and omitted on output (a full system snapshot
- implies that all disks participate in the snapshot process).
- This element has a list of <code>disk</code>
- sub-elements, describing anywhere from zero to all of the
- disks associated with the domain. <span class="since">Since
- 0.9.5</span>
- <dl>
- <dt><code>disk</code></dt>
- <dd>This sub-element describes the snapshot properties of a
- specific disk. The attribute <code>name</code> is
- mandatory, and must match either the <code><target
- dev='name'/></code> (recommended) or an unambiguous
- <code><source file='name'/></code> of one
of
- the <a href="formatdomain.html#elementsDisks">disk
- devices</a> specified for the domain at the time of the
- snapshot. The attribute <code>snapshot</code> is
- optional, and the possible values are the same as the
- <code>snapshot</code> attribute for
- <a href="formatdomain.html#elementsDisks">disk
devices</a>
- (<code>no</code>, <code>internal</code>,
- or <code>external</code>). Some hypervisors like ESX
- require that if specified, the snapshot mode must not
- override any snapshot mode attached to the corresponding
- domain disk, while others like qemu allow this field to
- override the domain default.
-
- <dl>
- <dt><code>source</code></dt>
- <dd>If the snapshot mode is external (whether specified
- or inherited), then there is an optional sub-element
- <code>source</code>, with an attribute
<code>file</code>
- giving the name of the new file.
- If <code>source</code> is not
- given and the disk is backed by a local image file (not
- a block device or remote storage), a file name is
- generated that consists of the existing file name
- with anything after the trailing dot replaced by the
- snapshot name. Remember that with external
- snapshots, the original file name becomes the read-only
- snapshot, and the new file name contains the read-write
- delta of all disk changes since the snapshot.
- <p/>
- The <code>source</code> element also may contain the
- <code>seclabel</code> element (described in the
- <a href="formatdomain.html#seclabel">domain XML
documentation</a>)
- which can be used to override the domain security labeling policy
- for <code>source</code>.
- </dd>
- <dt><code>driver</code></dt>
- <dd>An optional sub-element <code>driver</code>,
- with an attribute <code>type</code> giving the driver type
(such
- as qcow2), of the new file created by the external
- snapshot of the new file.
-
- Optionally <code>metadata_cache</code> sub-element can be used
- with same semantics as the identically named subelement of the
- domain definition disk's driver.
- </dd>
- <dt><code>seclabel</code></dt>
- </dl>
-
- <span class="since">Since 1.2.2</span> the
<code>disk</code> element
- supports an optional attribute <code>type</code> if the
- <code>snapshot</code> attribute is set to
<code>external</code>.
- This attribute specifies the snapshot target storage type and allows
- to overwrite the default <code>file</code> type. The
<code>type</code>
- attribute along with the format of the <code>source</code>
- sub-element is identical to the <code>source</code> element used
in
- domain disk definitions. See the
- <a href="formatdomain.html#elementsDisks">disk
devices</a> section
- documentation for further information.
-
- Libvirt currently supports the <code>type</code> element in the
qemu
- driver and supported values are <code>file</code>,
<code>block</code>
- and <code>network</code> with a protocol of
<code>gluster</code>
- <span class="since">(since 1.2.2)</span>.
- </dd>
- </dl>
- </dd>
- <dt><code>creationTime</code></dt>
- <dd>A readonly representation of the time this snapshot was
- created. The time is specified in seconds since the Epoch,
- UTC (i.e. Unix time).
- </dd>
- <dt><code>state</code></dt>
- <dd>A readonly representation of the state of the domain at the
- time this snapshot was taken. If a full system snapshot was
- created, then this is the state of the domain at that
- time. When the domain is reverted to this snapshot, the
- domain's state will default to this state, unless overridden
- by <code>virDomainRevertToSnapshot()</code> flags to revert to
- a running or paused state. Additionally, this field can be the
- value "disk-snapshot" (<span class="since">since
0.9.5</span>)
- when it represents only a disk snapshot (no VM memory state),
- and reverting to this snapshot will default to an inactive
- guest.
- </dd>
- <dt><code>parent</code></dt>
- <dd>Readonly, present only if this snapshot has a parent. The
- parent name is given by the sub-element <code>name</code>. The
- parent relationship allows tracking a tree of related snapshots.
- </dd>
- <dt><code>domain</code></dt>
- <dd>A readonly representation of the domain that this snapshot
- was taken against. Older versions of libvirt stored only a
- single child element, uuid; reverting to a snapshot like this
- is risky if the current state of the domain differs from the
- state that the domain was created in, and requires the use of
- the <code>VIR_DOMAIN_SNAPSHOT_REVERT_FORCE</code> flag
- in <code>virDomainRevertToSnapshot()</code>. Newer versions
- of libvirt (<span class="since">since 0.9.5</span>) store
the
- entire inactive <a href="formatdomain.html">domain
- configuration</a> at the time of the snapshot
- (<span class="since">since 0.9.5</span>). The domain will
have
- security-sensitive information omitted
- unless the flag <code>VIR_DOMAIN_SNAPSHOT_XML_SECURE</code> is
- provided on a read-write connection.
- </dd>
- <dt><code>cookie</code></dt>
- <dd>An optional readonly representation of a save image cookie
- containing additional data libvirt may need to properly
- restore a domain from an active snapshot when such data cannot
- be stored directly in the <code>domain</code> to maintain
- compatibility with older libvirt or hypervisor.
- </dd>
- </dl>
-
- <h2><a id="example">Examples</a></h2>
-
- <p>Using this XML to create a disk snapshot of just vda on a qemu
- domain with two disks:</p>
- <pre>
-<domainsnapshot>
- <description>Snapshot of OS install and
updates</description>
- <disks>
- <disk name='vda'>
- <source file='/path/to/new'/>
- </disk>
- <disk name='vdb' snapshot='no'/>
- <disk name='vdc'>
- <source file='/path/to/newc'>
- <seclabel model='dac' relabel='no'/>
- </source>
- </disk>
- </disks>
-</domainsnapshot></pre>
-
- <p>will result in XML similar to this from
- <code>virDomainSnapshotGetXMLDesc()</code>:</p>
- <pre>
-<domainsnapshot>
- <name>1270477159</name>
- <description>Snapshot of OS install and
updates</description>
- <state>running</state>
- <creationTime>1270477159</creationTime>
- <parent>
- <name>bare-os-install</name>
- </parent>
- <memory snapshot='no'/>
- <disks>
- <disk name='vda' snapshot='external'>
- <driver type='qcow2'/>
- <b><source file='/path/to/new'/></b>
- </disk>
- <disk name='vdb' snapshot='no'/>
- </disks>
- <domain>
- <name>fedora</name>
- <uuid>93a5c045-6457-2c09-e56c-927cdf34e178</uuid>
- <memory>1048576</memory>
- ...
- <devices>
- <disk type='file' device='disk'>
- <driver name='qemu' type='raw'/>
- <b><source file='/path/to/old'/></b>
- <target dev='vda' bus='virtio'/>
- </disk>
- <disk type='file' device='disk'
snapshot='external'>
- <driver name='qemu' type='raw'/>
- <source file='/path/to/old2'/>
- <target dev='vdb' bus='virtio'/>
- </disk>
- ...
- </devices>
- </domain>
-</domainsnapshot></pre>
-
- <p>With that snapshot created, <code>/path/to/old</code> is the
- read-only backing file to the new active
- file <code>/path/to/new</code>. The
<code><domain></code>
- element within the snapshot xml records the state of the domain
- just before the snapshot; a call
- to <code>virDomainGetXMLDesc()</code> will show that the domain
- has been changed to reflect the snapshot:
- </p>
- <pre>
-<domain>
- <name>fedora</name>
- <uuid>93a5c045-6457-2c09-e56c-927cdf34e178</uuid>
- <memory>1048576</memory>
- ...
- <devices>
- <disk type='file' device='disk'>
- <driver name='qemu' type='qcow2'/>
- <b><source file='/path/to/new'/></b>
- <target dev='vda' bus='virtio'/>
- </disk>
- <disk type='file' device='disk'
snapshot='external'>
- <driver name='qemu' type='raw'/>
- <source file='/path/to/old2'/>
- <target dev='vdb' bus='virtio'/>
- </disk>
- ...
- </devices>
-</domain></pre>
- </body>
-</html>
diff --git a/docs/formatsnapshot.rst b/docs/formatsnapshot.rst
new file mode 100644
index 0000000000..0ad397316c
--- /dev/null
+++ b/docs/formatsnapshot.rst
@@ -0,0 +1,297 @@
+.. role:: since
+
+===================
+Snapshot XML format
+===================
+
+.. contents::
+
+Snapshot XML
+------------
+
+Snapshots are one form of `domain state
+capture <kbase/domainstatecapture.html>`__. There are several types of
+snapshots:
+
+disk snapshot
+ Contents of disks (whether a subset or all disks associated with the domain)
+ are saved at a given point of time, and can be restored back to that state.
+ On a running guest, a disk snapshot is likely to be only crash-consistent
+ rather than clean (that is, it represents the state of the disk on a sudden
+ power outage, and may need fsck or journal replays to be made consistent); on
+ an inactive guest, a disk snapshot is clean if the disks were clean when the
+ guest was last shut down. Disk snapshots exist in two forms: internal (file
+ formats such as qcow2 track both the snapshot and changes since the snapshot
+ in a single file) and external (the snapshot is one file, and the changes
+ since the snapshot are in another file).
+memory state (or VM state)
+ Tracks only the state of RAM and all other resources in use by the VM. If the
+ disks are unmodified between the time a VM state snapshot is taken and
+ restored, then the guest will resume in a consistent state; but if the disks
+ are modified externally in the meantime, this is likely to lead to data
+ corruption.
+full system
+ A combination of disk snapshots for all disks as well as VM memory state,
+ which can be used to resume the guest from where it left off with symptoms
+ similar to hibernation (that is, TCP connections in the guest may have timed
+ out, but no files or processes are lost).
+
+Libvirt can manage all three types of snapshots. For now, VM state (memory)
+snapshots are created only by the ``virDomainSave()``, ``virDomainSaveFlags``,
+and ``virDomainManagedSave()`` functions, and restored via the
+``virDomainRestore()``, ``virDomainRestoreFlags()``, ``virDomainCreate()``, and
+``virDomainCreateWithFlags()`` functions (as well as via domain autostart). With
+managed snapshots, libvirt tracks all information internally; with save images,
+the user tracks the snapshot file, but libvirt provides functions such as
+``virDomainSaveImageGetXMLDesc()`` to work with those files.
+
+Full system snapshots are created by ``virDomainSnapshotCreateXML()`` with no
+flags, while disk snapshots are created by the same function with the
+``VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY`` flag. Regardless of the flags provided,
+restoration of the snapshot is handled by the ``virDomainRevertToSnapshot()``
+function. For these types of snapshots, libvirt tracks each snapshot as a
+separate ``virDomainSnapshotPtr`` object, and maintains a tree relationship of
+which snapshots descended from an earlier point in time.
+
+Attributes of libvirt snapshots are stored as child elements of the
+``domainsnapshot`` element. At snapshot creation time, normally only the
+``name``, ``description``, and ``disks`` elements are settable; the rest of the
+fields are ignored on creation, and will be filled in by libvirt in for
+informational purposes by ``virDomainSnapshotGetXMLDesc()``. However, when
+redefining a snapshot ( :since:`since 0.9.5` ), with the
+``VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE`` flag of
+``virDomainSnapshotCreateXML()``, all of the XML described here is relevant on
+input, even the fields that are normally described as readonly for output.
+
+Snapshots are maintained in a hierarchy. A domain can have a current snapshot,
+which is the most recent snapshot compared to the current state of the domain
+(although a domain might have snapshots without a current snapshot, if snapshots
+have been deleted in the meantime). Creating or reverting to a snapshot sets
+that snapshot as current, and the prior current snapshot is the parent of the
+new snapshot. Branches in the hierarchy can be formed by reverting to a snapshot
+with a child, then creating another snapshot. For now, the creation of external
+snapshots when checkpoints exist is forbidden, although future work will make it
+possible to integrate these two concepts.
+
+The top-level ``domainsnapshot`` element may contain the following elements:
+
+``name``
+
+ The optional name for this snapshot. If the name is omitted, libvirt will
+ create a name based on the time of the creation.
+
+``description``
+
+ An optional human-readable description of the snapshot. If the description
+ is omitted when initially creating the snapshot, then this field will be
+ empty.
+
+``memory``
+
+ On input, this is an optional request for how to handle VM memory state. For
+ an offline domain or a disk-only snapshot, attribute ``snapshot`` must be
+ ``no``, since there is no VM state saved; otherwise, the attribute can be
+ ``internal`` if the memory state is piggy-backed with other internal disk
+ state, or ``external`` along with a second attribute ``file`` giving the
+ absolute path of the file holding the VM memory state. :since:`Since 1.0.1`
+
+``disks``
+
+ On input, this is an optional listing of specific instructions for disk
+ snapshots; it is needed when making a snapshot of only a subset of the disks
+ associated with a domain, or when overriding the domain defaults for how to
+ snapshot each disk, or for providing specific control over what file name is
+ created in an external snapshot. On output, this is fully populated to show
+ the state of each disk in the snapshot, including any properties that were
+ generated by the hypervisor defaults. For full system snapshots, this field
+ is ignored on input and omitted on output (a full system snapshot implies
+ that all disks participate in the snapshot process). This element has a list
+ of ``disk`` sub-elements, describing anywhere from zero to all of the disks
+ associated with the domain. :since:`Since 0.9.5`
+
+ ``disk``
+
+ This sub-element describes the snapshot properties of a specific disk.
+ The attribute ``name`` is mandatory, and must match either the ``<target
+ dev='name'/>`` (recommended) or an unambiguous ``<source
file='name'/>``
+ of one of the `disk devices <formatdomain.html#elementsDisks>`__
+ specified for the domain at the time of the snapshot. The attribute
+ ``snapshot`` is optional, and the possible values are the same as the
+ ``snapshot`` attribute for `disk devices
+ <formatdomain.html#elementsDisks>`__ (``no``, ``internal``, or
+ ``external``). Some hypervisors like ESX require that if specified, the
+ snapshot mode must not override any snapshot mode attached to the
+ corresponding domain disk, while others like qemu allow this field to
+ override the domain default.
+
+ ``source``
+
+ If the snapshot mode is external (whether specified or inherited),
+ then there is an optional sub-element ``source``, with an attribute
+ ``file`` giving the name of the new file. If ``source`` is not given
+ and the disk is backed by a local image file (not a block device or
+ remote storage), a file name is generated that consists of the
+ existing file name with anything after the trailing dot replaced by
+ the snapshot name. Remember that with external snapshots, the original
+ file name becomes the read-only snapshot, and the new file name
+ contains the read-write delta of all disk changes since the snapshot.
+
+ The ``source`` element also may contain the ``seclabel`` element
+ (described in the `domain XML documentation
+ <formatdomain.html#seclabel>`__) which can be used to override the
+ domain security labeling policy for ``source``.
+
+ ``driver``
+
+ An optional sub-element ``driver``, with an attribute ``type`` giving
+ the driver type (such as qcow2), of the new file created by the
+ external snapshot of the new file. Optionally ``metadata_cache``
+ sub-element can be used with same semantics as the identically named
+ subelement of the domain definition disk's driver.
+
+ ``seclabel``
+
+ :since:`Since 1.2.2` the ``disk`` element supports an optional attribute
+ ``type`` if the ``snapshot`` attribute is set to ``external``. This
+ attribute specifies the snapshot target storage type and allows to
+ overwrite the default ``file`` type. The ``type`` attribute along with
+ the format of the ``source`` sub-element is identical to the ``source``
+ element used in domain disk definitions. See the `disk devices
+ <formatdomain.html#elementsDisks>`__ section documentation for further
+ information. Libvirt currently supports the ``type`` element in the qemu
+ driver and supported values are ``file``, ``block`` and ``network`` with
+ a protocol of ``gluster`` :since:`(since 1.2.2)` .
+
+``creationTime``
+
+ A readonly representation of the time this snapshot was created. The time is
+ specified in seconds since the Epoch, UTC (i.e. Unix time).
+
+``state``
+
+ A readonly representation of the state of the domain at the time this
+ snapshot was taken. If a full system snapshot was created, then this is the
+ state of the domain at that time. When the domain is reverted to this
+ snapshot, the domain's state will default to this state, unless overridden
+ by ``virDomainRevertToSnapshot()`` flags to revert to a running or paused
+ state. Additionally, this field can be the value "disk-snapshot" (
+ :since:`since 0.9.5`) when it represents only a disk snapshot (no VM memory
+ state), and reverting to this snapshot will default to an inactive guest.
+
+``parent``
+
+ Readonly, present only if this snapshot has a parent. The parent name is
+ given by the sub-element ``name``. The parent relationship allows tracking a
+ tree of related snapshots.
+
+``domain``
+
+ A readonly representation of the domain that this snapshot was taken
+ against. Older versions of libvirt stored only a single child element,
+ uuid; reverting to a snapshot like this is risky if the current state of the
+ domain differs from the state that the domain was created in, and requires
+ the use of the ``VIR_DOMAIN_SNAPSHOT_REVERT_FORCE`` flag in
+ ``virDomainRevertToSnapshot()``. Newer versions of libvirt ( :since:`since
+ 0.9.5` ) store the entire inactive `domain configuration
+ <formatdomain.html>`__ at the time of the snapshot ( :since:`since 0.9.5` ).
+ The domain will have security-sensitive information omitted unless the flag
+ ``VIR_DOMAIN_SNAPSHOT_XML_SECURE`` is provided on a read-write connection.
+
+``cookie``
+
+ An optional readonly representation of a save image cookie containing
+ additional data libvirt may need to properly restore a domain from an active
+ snapshot when such data cannot be stored directly in the ``domain`` to
+ maintain compatibility with older libvirt or hypervisor.
+
+Examples
+--------
+
+Using this XML to create a disk snapshot of just vda on a qemu domain with two
+disks:
+
+::
+
+ <domainsnapshot>
+ <description>Snapshot of OS install and updates</description>
+ <disks>
+ <disk name='vda'>
+ <source file='/path/to/new'/>
+ </disk>
+ <disk name='vdb' snapshot='no'/>
+ <disk name='vdc'>
+ <source file='/path/to/newc'>
+ <seclabel model='dac' relabel='no'/>
+ </source>
+ </disk>
+ </disks>
+ </domainsnapshot>
+
+will result in XML similar to this from ``virDomainSnapshotGetXMLDesc()``:
+
+::
+
+ <domainsnapshot>
+ <name>1270477159</name>
+ <description>Snapshot of OS install and updates</description>
+ <state>running</state>
+ <creationTime>1270477159</creationTime>
+ <parent>
+ <name>bare-os-install</name>
+ </parent>
+ <memory snapshot='no'/>
+ <disks>
+ <disk name='vda' snapshot='external'>
+ <driver type='qcow2'/>
+ <source file='/path/to/new'/>
+ </disk>
+ <disk name='vdb' snapshot='no'/>
+ </disks>
+ <domain>
+ <name>fedora</name>
+ <uuid>93a5c045-6457-2c09-e56c-927cdf34e178</uuid>
+ <memory>1048576</memory>
+ ...
+ <devices>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source file='/path/to/old'/>
+ <target dev='vda' bus='virtio'/>
+ </disk>
+ <disk type='file' device='disk'
snapshot='external'>
+ <driver name='qemu' type='raw'/>
+ <source file='/path/to/old2'/>
+ <target dev='vdb' bus='virtio'/>
+ </disk>
+ ...
+ </devices>
+ </domain>
+ </domainsnapshot>
+
+With that snapshot created, ``/path/to/old`` is the read-only backing file to
+the new active file ``/path/to/new``. The ``<domain>`` element within the
+snapshot xml records the state of the domain just before the snapshot; a call to
+``virDomainGetXMLDesc()`` will show that the domain has been changed to reflect
+the snapshot:
+
+::
+
+ <domain>
+ <name>fedora</name>
+ <uuid>93a5c045-6457-2c09-e56c-927cdf34e178</uuid>
+ <memory>1048576</memory>
+ ...
+ <devices>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='qcow2'/>
+ <source file='/path/to/new'/>
+ <target dev='vda' bus='virtio'/>
+ </disk>
+ <disk type='file' device='disk'
snapshot='external'>
+ <driver name='qemu' type='raw'/>
+ <source file='/path/to/old2'/>
+ <target dev='vdb' bus='virtio'/>
+ </disk>
+ ...
+ </devices>
+ </domain>
diff --git a/docs/meson.build b/docs/meson.build
index 3caaa76735..adb7ac091e 100644
--- a/docs/meson.build
+++ b/docs/meson.build
@@ -51,7 +51,6 @@ docs_html_in_files = [
'formatnode',
'formatnwfilter',
'formatsecret',
- 'formatsnapshot',
'formatstoragecaps',
'formatstorageencryption',
'goals',
@@ -99,6 +98,7 @@ docs_rst_files = [
'formatbackup',
'formatcheckpoint',
'formatdomain',
+ 'formatsnapshot',
'formatstorage',
'glib-adoption',
'hacking',
--
2.35.1