[libvirt PATCH 1/2] docs: kbase: Add a doc on live full disk backup

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a rewrite of:

    https://wiki.libvirt.org/page/Live-disk-backup-with-active-blockcommit

Once this commit merges, the above wiki should point to this kbase
document.

Signed-off-by: Kashyap Chamarthy <kchamart@xxxxxxxxxx>
---
 docs/kbase/index.rst                 |   3 +
 docs/kbase/live_full_disk_backup.rst | 111 +++++++++++++++++++++++++++
 2 files changed, 114 insertions(+)
 create mode 100644 docs/kbase/live_full_disk_backup.rst

diff --git a/docs/kbase/index.rst b/docs/kbase/index.rst
index 532804fe05..5ee3b5fce8 100644
--- a/docs/kbase/index.rst
+++ b/docs/kbase/index.rst
@@ -12,6 +12,9 @@ Usage
    Explanation of how disk backing chain specification impacts libvirt's
    behaviour and basic troubleshooting steps of disk problems.
 
+`Live full disk backup <live_full_disk_backup.html>`__
+   A walkthrough of how to take effective live full disk backups.
+
 `Virtio-FS <virtiofs.html>`__
    Share a filesystem between the guest and the host
 
diff --git a/docs/kbase/live_full_disk_backup.rst b/docs/kbase/live_full_disk_backup.rst
new file mode 100644
index 0000000000..f4ef7f2cc7
--- /dev/null
+++ b/docs/kbase/live_full_disk_backup.rst
@@ -0,0 +1,111 @@
+Efficient live full disk backup
+===============================
+
+Overview
+--------
+
+Live full disk backups are preferred in many scenarios, *despite* their
+space requirements.  The following outlines an efficient method to do
+that using libvirt's APIs.  This method involves concepts: the notion of
+`backing chains <https://libvirt.org/kbase/backing_chains.html>`_,
+`QCOW2 overlays
+<https://qemu.readthedocs.io/en/latest/interop/live-block-operations.html#disk-image-backing-chain-notation>`_,
+and a special operation called "active block-commit", which allows
+live-merging an overlay disk image into its backing file.
+
+At a high-level, this is the approach to take a live ful disk backup:
+Assuming a guest with a single disk image, create a temporary live QCOW2
+overlay (commonly called as "external snapshot") to track the live guest
+writes.  Then backup the original disk image while the guest (live QEMU)
+keeps writing to the temporary overlay.  Finally, perform the "active
+block-commit" opertion to live-merge the temporary overlay disk contents
+into the original image — i.e. the backing file — and "pivot" the live
+QEMU process to point to it.
+
+The below assumes you're using *at least* these versions (preferably
+much newer): QEMU 2.1 and libvirt-1.2.9.
+
+Detailed procedure
+------------------
+
+1. Start with a guest with a single disk image, ``base.raw``, which is
+   where the live QEMU is pointing at, and recording the guest writes::
+
+     base.raw (live QEMU)
+
+2. List the current block device(s) in use::
+
+    $ virsh domblklist vm1
+    Target     Source
+    ------------------------------------------------
+    vda        /var/lib/libvirt/images/base.raw
+
+3. Create the live "external disk snapshot" (or more correctly, "an
+   overlay")::
+
+    $ virsh snapshot-create-as --domain vm1 overlay1 \
+        --diskspec vda,file=/var/lib/libvirt/images/overlay1.qcow2 \
+        --disk-only
+
+   The disk image chain looks as follows::
+
+    base.raw <-- overlay1.qcow2 (live QEMU)
+
+.. note::
+    Above, if you have QEMU guest agent installed in your virtual
+    machine, use the ``--quiesce`` option with ``virsh
+    snapshot-create-as [...]`` to ensure you have a consistent disk
+    state.
+
+    Optionally, you can also supply the ``--no-metadata`` option to
+    ``virsh snapshot-create-as`` to tell libvirt not track the snapshot
+    metadata.  Otherwise, when you decide to merge snapshot overlays,
+    you have to explicitly clean the libvirt metadata using ``virsh
+    snapshot-delete vm1 --metadata [name|--current]``.
+
+4. Now, take a backup the orignal image, ``base.raw``, to a different
+   location using ``cp`` or ``rsync``::
+
+    $ cp /var/lib/libvirt/images/base.raw
+        /export/backups/copy1_base.raw
+
+    # Or:
+
+    $ rsync -avhW --progress /var/lib/libvirt/images/base.raw \
+        /export/backups/copy1_base.raw
+
+5. Enumerate the current block device(s) in use, again.  Notice that the
+   current disk image in use is the above-created overlay,
+   ``overlay1.qcow2``::
+
+    $ virsh domblklist vm1
+    Target     Source
+    ------------------------------------------------
+    vda        vda,file=/var/lib/libvirt/images/overlay1.qcow2
+
+6. Once the backup of the original image completes, now perform the
+   "active block-commit" to live-merge the contents of
+   ``overlay1.qcow2`` into ``base.raw`` *and* pivot the live QEMU back
+   to the original::
+
+    $ virsh blockcommit vm1 vda --active --verbose --pivot
+
+7. After the above operation completes, again list the current block
+   device(s) in use.  And notice that the live QEMU is now writing to
+   the original base image::
+
+    $ virsh domblklist vm1
+    Target     Source
+    ------------------------------------------------
+    vda        /var/lib/libvirt/images/base.raw
+
+
+The final updated disk image "chain" will be a single consolidated
+disk::
+
+    [base.raw] (live QEMU)
+
+
+Now you can safely **discard the overlay image**, ``overlay1.qcow2`` —
+it is no longer valid; and its contents are now fully merged into the
+base image.
-- 
2.30.2




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux