qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Krempa <pkrempa@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: Christopher Pereira <kripper@imatronix.cl>,
	qemu-devel@nongnu.org, qemu-block@nongnu.org,
	users@lists.libvirt.org
Subject: Re: Compact backing chain (sparsify + compress)
Date: Mon, 10 Nov 2025 10:53:32 +0100	[thread overview]
Message-ID: <aRG2HK8nNMo_ySPt@angien.pipo.sk> (raw)
In-Reply-To: <87wm3y2zet.fsf@pond.sub.org>

On Mon, Nov 10, 2025 at 07:07:54 +0100, Markus Armbruster via Users wrote:
> Adding cc:s.
> 
> Christopher Pereira <kripper@imatronix.cl> writes:
> 
> > Hi,
> >
> > I would like to revisit this old thread from 2016 with a special use case that I believe should be a standard `virsh` command:
> > https://lists.gnu.org/archive/html/qemu-devel/2016-12/msg03571.html
> >
> > **Summary:**
> >
> > Given this QEMU backing chain:
> > `base <- snap1 <- snap2 <- snap3 (active)`
> >
> > We want to merge `base <- snap1 <- snap2` into a new snapshot `collapsed-base` that is:
> > 1. Sparsified (`virt-sparsify`)
> > 2. Compressed
> >
> > The resulting backing chain would be:
> > `collapsed-base <- snap3 (active)`

So collapsing 'snap1' and 'snap2' into 'base' is currently possible
directly via libvirt's 'virsh blockcommit'. Select 'snap2' as 'top'
argument.

Unfornunately 'virt-sparsify' can be used only on inactive VMs as it
modifies the disk. You could sparisify the VM directly from within the
guest OS if you enable discard propagation.

Regarding qcow2 compression, libvirt currently doesn't support adding
'compress' filters to the backing chain which could theoretically make
the base to be compressed. Compression has performance impact also on
reads and thus users will not normally want to use it, especially if the
majority of the image (for reads) is still in the backing image.

> > **Motivation:**
> >
> > - We perform daily backup snapshots and never modify existing files (too dangerous). We only rebase.

For backups we now have specific APIs to perform block-level
incremental backups via qemu's support to track block changes.

See

https://www.libvirt.org/kbase/live_full_disk_backup.html
https://www.libvirt.org/formatbackup.html

> > - We collapse older chains into a new `collapsed-base` snapshot to limit chain size and avoid performance degradation.
> >
> > We have been doing this successfully for over 10 years using:
> >
> > - `qemu-img convert`
> > - `virt-sparsify`
> > - `virsh save`
> > - `qemu-img rebase`
> > - `virsh resume`
> >
> > **Problems:**
> >
> > - There is a small downtime due to `virsh save`/`resume`.
> > - In recent QEMU versions, `virsh` adds a `backingStore` tag to the XML even when using the `--no-metadata` option. This causes inconsistencies after `qemu-img rebase`.

That's a libvirt change that added backing store tracking. When you
collapse the backing chain via libvirt it modifies the <backingStore>
elements approrpiately.

> >
> > We didn’t use QMP because it didn’t support sparsify + compression in the past.
> >
> > **Questions:**
> >
> > - Is there now a better way to achieve this?

Consider using the backup APIs; see above.

> > - Could this feature be implemented or supported directly in `virsh`?
> >
> > In my opinion, this would be the ideal backup solution: we could travel in time, sync immutable snapshots to a remote backup server, and maintain performance.

So current state:
- for backups libvirt now supports the backup APIs to use qemu's changed
  block tracking
- backing chani merging is already implemented
- sparsification for a live VM needs to be driven via the VM itself
  (virt-sparsify can't be used while the VM is running or saved)
- compression support (while technically feasible) is unlikely to be ever
  implemented in libvirt



      reply	other threads:[~2025-11-10 10:04 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-10  2:31 Compact backing chain (sparsify + compress) Christopher Pereira
2025-11-10  6:07 ` Markus Armbruster
2025-11-10  9:53   ` Peter Krempa [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aRG2HK8nNMo_ySPt@angien.pipo.sk \
    --to=pkrempa@redhat.com \
    --cc=armbru@redhat.com \
    --cc=kripper@imatronix.cl \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=users@lists.libvirt.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).