[pve-devel] [PATCH qemu-server v2 17/25] backup: keep track of block-node size instead of volume size

Fiona Ebner f.ebner at proxmox.com
Tue Aug 13 15:28:21 CEST 2024


For fleecing, the size needs to match exactly with what QEMU sees. In
particular, EFI disks might be attached with a 'size=' option, meaning
that size can be different from the volume's size. Commit 36377acf
("backup: disk info: also keep track of size") introduced size
tracking and it was only used for fleecing since then, so replace the
existing 'size' key in the device info hash and replace it with an
explicit 'block-node-size' for clarity.

Should also help with the following issue reported in the community
forum:
https://forum.proxmox.com/threads/152202

Fixes: 36377acf ("backup: disk info: also keep track of size")
Signed-off-by: Fiona Ebner <f.ebner at proxmox.com>
---

New in v2.

 PVE/VZDump/QemuServer.pm | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm
index c46e607c..98685127 100644
--- a/PVE/VZDump/QemuServer.pm
+++ b/PVE/VZDump/QemuServer.pm
@@ -106,6 +106,9 @@ sub prepare {
 
     PVE::Storage::activate_volumes($self->{storecfg}, $vollist);
 
+    my $block_info = mon_cmd($vmid, "query-block");
+    $block_info = { map { $_->{device} => $_ } $block_info->@* };
+
     foreach my $ds (sort keys %$drivehash) {
 	my $drive = $drivehash->{$ds};
 
@@ -133,11 +136,22 @@ sub prepare {
 	    die "cannot determine size and format of volume '$volid' - $@\n" if $@;
 	}
 
+	# The size for fleecing images needs to be exactly the same size as QEMU sees. E.g. EFI disk
+	# can be attached with a smaller size then the underyling image on the storage.
+	my $block_node_size =
+	    eval { $block_info->{"drive-$ds"}->{inserted}->{image}->{'virtual-size'}; };
+	if (!$block_node_size) {
+	    # TPM state is not attached yet and will be attached with same size, so don't warn then.
+	    $self->loginfo("could not determine block node size of drive '$ds' - using fallback")
+		if $ds !~ m/^tpmstate\d+/;
+	    $block_node_size = $size;
+	}
+
 	my $diskinfo = {
 	    path => $path,
 	    volid => $volid,
 	    storeid => $storeid,
-	    size => $size,
+	    'block-node-size' => $block_node_size,
 	    format => $format,
 	    virtdev => $ds,
 	    qmdevice => "drive-$ds",
@@ -551,7 +565,7 @@ my sub allocate_fleecing_images {
 		my $name = "vm-$vmid-fleece-$n";
 		$name .= ".$format" if $scfg->{path};
 
-		my $size = PVE::Tools::convert_size($di->{size}, 'b' => 'kb');
+		my $size = PVE::Tools::convert_size($di->{'block-node-size'}, 'b' => 'kb');
 
 		$di->{'fleece-volid'} = PVE::Storage::vdisk_alloc(
 		    $self->{storecfg}, $fleecing_storeid, $vmid, $format, $name, $size);
@@ -600,7 +614,7 @@ my sub attach_fleecing_images {
 	    my $drive = "file=$path,if=none,id=$devid,format=$format,discard=unmap";
 	    # Specify size explicitly, to make it work if storage backend rounded up size for
 	    # fleecing image when allocating.
-	    $drive .= ",size=$di->{size}" if $format eq 'raw';
+	    $drive .= ",size=$di->{'block-node-size'}" if $format eq 'raw';
 	    $drive =~ s/\\/\\\\/g;
 	    my $ret = PVE::QemuServer::Monitor::hmp_cmd($vmid, "drive_add auto \"$drive\"", 60);
 	    die "attaching fleecing image $volid failed - $ret\n" if $ret !~ m/OK/s;
-- 
2.39.2





More information about the pve-devel mailing list