Creating a backup, whether full or incremental, is done
via virDomainBackupBegin(), which takes an XML
description of the actions to perform, as well as an optional
second XML document describing a
checkpoint to create at the same point in time. See
also a comparison between
the various state capture APIs.
There are two general modes for backups: a push mode (where the hypervisor writes out the data to the destination file, which may be local or remote), and a pull mode (where the hypervisor creates an NBD server that a third-party client can then read as needed, and which requires the use of temporary storage, typically local, until the backup is complete).
The instructions for beginning a backup job are provided as
attributes and elements of the
top-level domainbackup element. This element
includes an optional attribute mode which can be
either "push" or "pull" (default
push). virDomainBackupGetXMLDesc() can be used to
see the actual values selected for elements omitted during
creation (for example, learning which port the NBD server is
using in the pull model or what file names libvirt generated
when none were supplied). The following child elements and attributes
are supported:
incrementalserverprotocol
element of a disk attached via NBD in the domain (such as
transport, socket, name, port, or tls), necessary to set up an
NBD server that exposes the content of each disk at the time
the backup is started.
disksbackup='no' will participate. On output, this
is the state of each of the domain's disk in relation to the
backup operation.
diskname<target dev='name'/>
of one of
the disk
devices specified for the domain at the time of
the checkpoint.backupyes(default) specifies
that the disk should take part in the backup and using
no excludes the disk from the backup.typebackup='no' is
used. Valid values include file,
block, or network.
Similar to a disk declaration for a domain, the choice of type
controls what additional sub-elements are needed to describe
the destination (such as protocol for a
network destination).targetsource sub-element of a domain
disk. An optional sub-element driver can
also be used, with an attribute type to
specify a destination format different from
qcow2. scratchsource
sub-element of a domain disk. Currently only file
and block scratch storage is supported. The
file scratch file is created and deleted by
libvirt in the given location. A block scratch
device must exist prior to starting the backup and is formatted.
The block device must have enough space for the corresponding
disk data including format overhead.
If VIR_DOMAIN_BACKUP_BEGIN_REUSE_EXTERNAL flag is
used the file for a scratch of file type must
exist with the correct format and size to hold the copy and is
used without modification. The file is not deleted after the
backup but the contents of the file don't make sense outside
of the backup. The same applies for the block device which
must be formatted appropriately.Use virDomainBackupBegin() to perform a full
backup using push mode. The example lets libvirt pick the
destination and format for 'vda', fully specifies that we want a
raw backup of 'vdb', and omits 'vdc' from the operation.
<domainbackup>
<disks>
<disk name='vda' backup='yes'/>
<disk name='vdb' type='file'>
<target file='/path/to/vdb.backup'/>
<driver type='raw'/>
</disk>
<disk name='vdc' backup='no'/>
</disks>
</domainbackup>
If the previous full backup also passed a parameter describing
checkpoint XML that resulted
in a checkpoint named 1525889631, we can make
another call to virDomainBackupBegin() to perform
an incremental backup of just the data changed since that
checkpoint, this time using the following XML to start a pull
model export of the 'vda' and 'vdb' disks, where a third-party
NBD client connecting to '/path/to/server' completes the backup
(omitting 'vdc' from the explicit list has the same effect as
the backup='no' from the previous example):
<domainbackup mode="pull">
<incremental>1525889631</incremental>
<server transport="unix" socket="/path/to/server"/>
<disks>
<disk name='vda' backup='yes' type='file'>
<scratch file='/path/to/file1.scratch'/>
</disk>
</disks>
</domainbackup>