From: "Fabian Grünbichler" <f.gruenbichler@proxmox.com>
To: Proxmox VE development discussion <pve-devel@lists.proxmox.com>
Cc: Wolfgang Bumiller <w.bumiller@proxmox.com>,
Thomas Lamprecht <t.lamprecht@proxmox.com>
Subject: Re: [pve-devel] [PATCH-SERIES v8 pve-storage/qemu-server] add external qcow2 snapshot support
Date: Thu, 10 Jul 2025 17:13:43 +0200 (CEST) [thread overview]
Message-ID: <573493064.5243.1752160423097@webmail.proxmox.com> (raw)
In-Reply-To: <mailman.1227.1752078163.395.pve-devel@lists.proxmox.com>
> Alexandre Derumier via pve-devel <pve-devel@lists.proxmox.com> hat am 09.07.2025 18:21 CEST geschrieben:
> This patch series implement qcow2 external snapshot support for files && lvm volumes
>
> The current internal qcow2 snapshots have bad write performance because no metadatas can be preallocated.
>
> This is particulary visible on a shared filesystem like ocfs2 or gfs2.
>
> Also other bugs are freeze/lock reported by users since years on snapshots delete on nfs
> (The disk access seem to be frozen during all the delete duration)
>
> This also open doors for remote snapshot export-import for storage replication.
>
> Changelog v8:
> storage :
> - fix Fabian comments
> - add rename_snapshot
> - add qemu_resize
> - plugin: restrict volnames
> - plugin: use 'external-snapshots' instead 'snapext'
> qemu-server:
> - fix efi test with wrong volnames vm-disk-100-0.raw
> - use rename_snapshot
> MAIN TODO:
> - add snapshots tests in both pve-storage && qemu-server
> - better handle snapshot failure with multiple disks
sent a few follow-ups, as I didn't manage to fully test things and depending on the outcome of such tests, it might be okay to apply the series with those follow-ups, and fix up the rest later, or not..
some open issues that I discovered that still need fixing:
1. missing activation when snapshotting an LVM volume if the VM is not running
snapshotting 'drive-scsi0' (test:123/vm-123-disk-0.qcow2)
snapshotting 'drive-scsi1' (lvm:vm-123-disk-0.qcow2)
Renamed "vm-123-disk-0.qcow2" to "snap_vm-123-disk-0_test.qcow2" in volume group "lvm"
failed to stat '/dev/lvm/snap_vm-123-disk-0_test.qcow2' <============
Use of uninitialized value $size in division (/) at /usr/share/perl5/PVE/Storage/LVMPlugin.pm line 671.
Rounding up size to full physical extent 4.00 MiB
Logical volume "vm-123-disk-0.qcow2" created.
Logical volume "vm-123-disk-0.qcow2" successfully removed.
Renamed "snap_vm-123-disk-0_test.qcow2" to "vm-123-disk-0.qcow2" in volume group "lvm"
2. storage migration with external snapshots needs to be implemented or disabled (LVM is raw-only at the moment)
3. moving a 'raw' lvm volume to the same storage with format 'qcow2' fails with "you can't move to the same storage with same format (500)" (UI and CLI, other way round works)
4. all snapshot volumes on extsnap dir storages will print warnings like
`this volume filename is not supported anymore`
when hitting `parse_namedir` - those can likely be avoided by skipping the warning if the name matches the snapshot format and external-snapshots are enabled..
5. the backing file paths are not relative for LVM
6. it's fairly easy to accidentally create qcow2-formatted LVM volumes, as opposed to the requirement to enable a non-UI storage option at storage creation time for dir storages, we might want to add some warning to the UI at least? or we could also guard usage of the format with a config option..
7. the snapshot name related helpers being public would be nice to avoid - one way would be to inline them and duplicate volume_snapshot_info in the LVM plugin, but if a better option is found that would be great
8. renaming a volume needs to be forbidden if snapshots exist, or the whole chain needs to be renamed (this is currently caught higher up in the stack, not sure if we need/want to also check in the storage layer?)
the parse_namedir change also need a close look to see if some other plugins get broken.. (@Wolfgang - since you are working on related changes!)
I am sure there are more rough edges to be found, so don't consider the list above complete!
>
>
> pve-storage:
>
> Alexandre Derumier (13):
> plugin: add qemu_img_create
> plugin: add qemu_img_create_qcow2_backed
> plugin: add qemu_img_info
> plugin: add qemu_img_measure
> plugin: add qemu_img_resize
> rbd && zfs : create_base : remove $running param from volume_snapshot
> storage: volume_snapshot: add $running param
> storage: add rename_snapshot method
> storage: add volume_support_qemu_snapshot
> plugin: fix volname parsing
> qcow2: add external snapshot support
> lvmplugin: add qcow2 snapshot
> tests: add lvmplugin test
>
> ApiChangeLog | 15 +
> src/PVE/Storage.pm | 45 ++-
> src/PVE/Storage/BTRFSPlugin.pm | 6 +
> src/PVE/Storage/CIFSPlugin.pm | 1 +
> src/PVE/Storage/Common.pm | 33 ++
> src/PVE/Storage/DirPlugin.pm | 11 +
> src/PVE/Storage/ESXiPlugin.pm | 8 +-
> src/PVE/Storage/ISCSIDirectPlugin.pm | 2 +-
> src/PVE/Storage/LVMPlugin.pm | 571 +++++++++++++++++++++-----
> src/PVE/Storage/LvmThinPlugin.pm | 8 +-
> src/PVE/Storage/NFSPlugin.pm | 1 +
> src/PVE/Storage/PBSPlugin.pm | 2 +-
> src/PVE/Storage/Plugin.pm | 518 +++++++++++++++++++++---
> src/PVE/Storage/RBDPlugin.pm | 18 +-
> src/PVE/Storage/ZFSPlugin.pm | 4 +-
> src/PVE/Storage/ZFSPoolPlugin.pm | 8 +-
> src/test/Makefile | 5 +-
> src/test/run_test_lvmplugin.pl | 577 +++++++++++++++++++++++++++
> 18 files changed, 1662 insertions(+), 171 deletions(-)
> create mode 100755 src/test/run_test_lvmplugin.pl
>
> qemu-server :
>
> Alexandre Derumier (4):
> qemu_img convert : add external snapshot support
> blockdev: add backing_chain support
> qcow2: add external snapshot support
> tests: fix efi vm-disk-100-0.raw -> vm-100-disk-0.raw
>
> src/PVE/QemuConfig.pm | 4 +-
> src/PVE/QemuServer.pm | 132 +++++--
> src/PVE/QemuServer/Blockdev.pm | 345 +++++++++++++++++-
> src/PVE/QemuServer/QemuImage.pm | 6 +-
> src/test/cfg2cmd/efi-raw-old.conf | 2 +-
> src/test/cfg2cmd/efi-raw-old.conf.cmd | 2 +-
> src/test/cfg2cmd/efi-raw-template.conf | 2 +-
> src/test/cfg2cmd/efi-raw-template.conf.cmd | 2 +-
> src/test/cfg2cmd/efi-raw.conf | 2 +-
> src/test/cfg2cmd/efi-raw.conf.cmd | 2 +-
> src/test/cfg2cmd/efi-secboot-and-tpm-q35.conf | 2 +-
> .../cfg2cmd/efi-secboot-and-tpm-q35.conf.cmd | 2 +-
> src/test/cfg2cmd/efi-secboot-and-tpm.conf | 2 +-
> src/test/cfg2cmd/efi-secboot-and-tpm.conf.cmd | 2 +-
> src/test/cfg2cmd/sev-es.conf | 2 +-
> src/test/cfg2cmd/sev-es.conf.cmd | 2 +-
> src/test/cfg2cmd/sev-std.conf | 2 +-
> src/test/cfg2cmd/sev-std.conf.cmd | 2 +-
> src/test/cfg2cmd/simple-backingchain.conf | 25 ++
> src/test/cfg2cmd/simple-backingchain.conf.cmd | 33 ++
> src/test/run_config2command_tests.pl | 47 +++
> src/test/run_qemu_img_convert_tests.pl | 59 +++
> src/test/snapshot-test.pm | 4 +-
> 23 files changed, 634 insertions(+), 49 deletions(-)
> create mode 100644 src/test/cfg2cmd/simple-backingchain.conf
> create mode 100644 src/test/cfg2cmd/simple-backingchain.conf.cmd
>
>
> --
> 2.39.5
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-07-10 15:13 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-09 16:21 Alexandre Derumier via pve-devel
2025-07-10 15:09 ` [pve-devel] [PATCH FOLLOW-UP storage 1/3] helpers: make qemu_img* storage config independent Fabian Grünbichler
2025-07-10 15:09 ` [pve-devel] [PATCH FOLLOW-UP storage 2/3] helpers: move qemu_img* to Common module Fabian Grünbichler
2025-07-10 15:09 ` [pve-devel] [PATCH FOLLOW-UP storage 3/3] rename_snapshot: fix parameter checks Fabian Grünbichler
2025-07-14 6:34 ` [pve-devel] [PATCH FOLLOW-UP storage 1/3] helpers: make qemu_img* storage config independent DERUMIER, Alexandre via pve-devel
[not found] ` <6b7eaeb6af6af22ebdd034236e9e88bc1b5e1e3f.camel@groupe-cyllene.com>
2025-07-14 11:02 ` Fabian Grünbichler
2025-07-10 15:13 ` Fabian Grünbichler [this message]
2025-07-10 15:46 ` [pve-devel] [PATCH-SERIES v8 pve-storage/qemu-server] add external qcow2 snapshot support DERUMIER, Alexandre via pve-devel
[not found] ` <c6c3457906642a30ddffc0f6b9d28ea6a745ac7c.camel@groupe-cyllene.com>
2025-07-10 16:29 ` Thomas Lamprecht
2025-07-11 12:04 ` DERUMIER, Alexandre via pve-devel
2025-07-14 6:25 ` DERUMIER, Alexandre via pve-devel
2025-07-14 8:18 ` DERUMIER, Alexandre via pve-devel
2025-07-14 8:42 ` DERUMIER, Alexandre via pve-devel
[not found] ` <26badbf66613a89e63eaad8b24dd05567900250b.camel@groupe-cyllene.com>
2025-07-14 11:02 ` Fabian Grünbichler
2025-07-15 4:15 ` DERUMIER, Alexandre via pve-devel
[not found] ` <719c71b1148846e0cdd7e5c149d8b20146b4d043.camel@groupe-cyllene.com>
2025-07-14 11:04 ` Fabian Grünbichler
2025-07-14 11:11 ` Thomas Lamprecht
2025-07-14 11:15 ` Fabian Grünbichler
2025-07-14 11:27 ` Thomas Lamprecht
2025-07-14 11:46 ` Fabian Grünbichler
2025-07-14 15:12 ` Tiago Sousa via pve-devel
[not found] <20250709162202.2952597-1-alexandre.derumier@groupe-cyllene.com>
2025-07-16 15:15 ` Thomas Lamprecht
2025-07-17 8:01 ` DERUMIER, Alexandre via pve-devel
2025-07-17 14:49 ` Tiago Sousa via pve-devel
[not found] ` <1fddff1a-b806-475a-ac75-1dd0107d1013@eurotux.com>
2025-07-17 15:08 ` DERUMIER, Alexandre via pve-devel
[not found] ` <47b76678f969ba97926c85af4bf8e50c9dda161d.camel@groupe-cyllene.com>
2025-07-17 15:42 ` Tiago Sousa via pve-devel
[not found] ` <58c2db18-c2c2-4c91-9521-bdb42a302e93@eurotux.com>
2025-07-17 15:53 ` DERUMIER, Alexandre via pve-devel
2025-07-17 16:05 ` DERUMIER, Alexandre via pve-devel
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=573493064.5243.1752160423097@webmail.proxmox.com \
--to=f.gruenbichler@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
--cc=t.lamprecht@proxmox.com \
--cc=w.bumiller@proxmox.com \
/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