From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id A2DEF1FF163 for ; Thu, 7 Nov 2024 17:53:07 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 433C234D4A; Thu, 7 Nov 2024 17:52:26 +0100 (CET) From: Fiona Ebner To: pve-devel@lists.proxmox.com Date: Thu, 7 Nov 2024 17:51:31 +0100 Message-Id: <20241107165146.125935-20-f.ebner@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241107165146.125935-1-f.ebner@proxmox.com> References: <20241107165146.125935-1-f.ebner@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.056 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH qemu-server v3 19/34] backup: keep track of block-node size for fleecing X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" For fleecing, the size needs to match exactly 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 used for fleecing since then, but the accurate size information needs to be queried via QMP. Should also help with the following issue reported in the community forum: https://forum.proxmox.com/threads/152202 Signed-off-by: Fiona Ebner --- Changes in v3: * only use query-block QMP command after the VM is enforced running PVE/VZDump/QemuServer.pm | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm index c46e607c..1ebafe6d 100644 --- a/PVE/VZDump/QemuServer.pm +++ b/PVE/VZDump/QemuServer.pm @@ -551,7 +551,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 +600,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; @@ -609,7 +609,7 @@ my sub attach_fleecing_images { } my sub check_and_prepare_fleecing { - my ($self, $vmid, $fleecing_opts, $disks, $is_template, $qemu_support) = @_; + my ($self, $task, $vmid, $fleecing_opts, $disks, $is_template, $qemu_support) = @_; # Even if the VM was started specifically for fleecing, it's possible that the VM is resumed and # then starts doing IO. For VMs that are not resumed the fleecing images will just stay empty, @@ -626,6 +626,8 @@ my sub check_and_prepare_fleecing { } if ($use_fleecing) { + $self->query_block_node_sizes($vmid, $task); + my ($default_format, $valid_formats) = PVE::Storage::storage_default_format( $self->{storecfg}, $fleecing_opts->{storage}); my $format = scalar(grep { $_ eq 'qcow2' } $valid_formats->@*) ? 'qcow2' : 'raw'; @@ -721,7 +723,7 @@ sub archive_pbs { my $is_template = PVE::QemuConfig->is_template($self->{vmlist}->{$vmid}); $task->{'use-fleecing'} = check_and_prepare_fleecing( - $self, $vmid, $opts->{fleecing}, $task->{disks}, $is_template, $qemu_support); + $self, $task, $vmid, $opts->{fleecing}, $task->{disks}, $is_template, $qemu_support); my $fs_frozen = $self->qga_fs_freeze($task, $vmid); @@ -905,7 +907,7 @@ sub archive_vma { $attach_tpmstate_drive->($self, $task, $vmid); $task->{'use-fleecing'} = check_and_prepare_fleecing( - $self, $vmid, $opts->{fleecing}, $task->{disks}, $is_template, $qemu_support); + $self, $task, $vmid, $opts->{fleecing}, $task->{disks}, $is_template, $qemu_support); my $outfh; if ($opts->{stdout}) { @@ -1042,6 +1044,31 @@ sub qga_fs_thaw { $self->logerr($@) if $@; } +# The size for fleecing images needs to be exactly the same size as QEMU sees. E.g. EFI disk can bex +# attached with a smaller size then the underyling image on the storage. +sub query_block_node_sizes { + my ($self, $vmid, $task) = @_; + + my $block_info = mon_cmd($vmid, "query-block"); + $block_info = { map { $_->{device} => $_ } $block_info->@* }; + + for my $diskinfo ($task->{disks}->@*) { + my $drive_key = $diskinfo->{virtdev}; + $drive_key .= "-backup" if $drive_key eq 'tpmstate0'; + my $block_node_size = + eval { $block_info->{"drive-$drive_key"}->{inserted}->{image}->{'virtual-size'}; }; + if (!$block_node_size) { + $self->loginfo( + "could not determine block node size of drive '$drive_key' - using fallback"); + $block_node_size = $diskinfo->{size} + or die "could not determine size of drive '$drive_key'\n"; + } + $diskinfo->{'block-node-size'} = $block_node_size; + } + + return; +} + # we need a running QEMU/KVM process for backup, starts a paused (prelaunch) # one if VM isn't already running sub enforce_vm_running_for_backup { -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel