From 6f94e1625b1c12c7a64e439f8527168e7db69fc8 Mon Sep 17 00:00:00 2001 From: Stefan Reiter Date: Thu, 1 Jul 2021 11:37:29 +0200 Subject: [PATCH] live-restore: preload efidisk before starting VM The efidisk never got restored correctly before, since we don't use the generic print_drive_commandline_full for it, and as such it didn't get a backing image attached. This not only causes the efidisk data to be lost on restore, but also an error at the end, since we try to remove a non-existing PBS blockdev. Since it is attached differently to a regular drive, adding PBS backing would be more difficult, but not to worry: an efidisk is small enough that it doesn't hurt performance to just restore it via the regular mechanism before starting the VM, and simply excluding it from the live restore entirely. Signed-off-by: Stefan Reiter --- PVE/QemuServer.pm | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index f7604674..ce5a1b15 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -6365,35 +6365,36 @@ sub restore_proxmox_backup_archive { # allocate volumes my $map = $restore_allocate_devices->($storecfg, $virtdev_hash, $vmid); - if (!$options->{live}) { - foreach my $virtdev (sort keys %$virtdev_hash) { - my $d = $virtdev_hash->{$virtdev}; - next if $d->{is_cloudinit}; # no need to restore cloudinit + foreach my $virtdev (sort keys %$virtdev_hash) { + my $d = $virtdev_hash->{$virtdev}; + next if $d->{is_cloudinit}; # no need to restore cloudinit - my $volid = $d->{volid}; + # for live-restore we only want to preload the efidisk + next if $options->{live} && $virtdev ne 'efidisk0'; - my $path = PVE::Storage::path($storecfg, $volid); + my $volid = $d->{volid}; - my $pbs_restore_cmd = [ - '/usr/bin/pbs-restore', - '--repository', $repo, - $pbs_backup_name, - "$d->{devname}.img.fidx", - $path, - '--verbose', - ]; + my $path = PVE::Storage::path($storecfg, $volid); - push @$pbs_restore_cmd, '--format', $d->{format} if $d->{format}; - push @$pbs_restore_cmd, '--keyfile', $keyfile if -e $keyfile; + my $pbs_restore_cmd = [ + '/usr/bin/pbs-restore', + '--repository', $repo, + $pbs_backup_name, + "$d->{devname}.img.fidx", + $path, + '--verbose', + ]; - if (PVE::Storage::volume_has_feature($storecfg, 'sparseinit', $volid)) { - push @$pbs_restore_cmd, '--skip-zero'; - } + push @$pbs_restore_cmd, '--format', $d->{format} if $d->{format}; + push @$pbs_restore_cmd, '--keyfile', $keyfile if -e $keyfile; - my $dbg_cmdstring = PVE::Tools::cmd2string($pbs_restore_cmd); - print "restore proxmox backup image: $dbg_cmdstring\n"; - run_command($pbs_restore_cmd); + if (PVE::Storage::volume_has_feature($storecfg, 'sparseinit', $volid)) { + push @$pbs_restore_cmd, '--skip-zero'; } + + my $dbg_cmdstring = PVE::Tools::cmd2string($pbs_restore_cmd); + print "restore proxmox backup image: $dbg_cmdstring\n"; + run_command($pbs_restore_cmd); } $fh->seek(0, 0) || die "seek failed - $!\n"; @@ -6448,6 +6449,7 @@ sub restore_proxmox_backup_archive { my $conf = PVE::QemuConfig->load_config($vmid); die "cannot do live-restore for template\n" if PVE::QemuConfig->is_template($conf); + delete $devinfo->{'drive-efidisk0'}; pbs_live_restore($vmid, $conf, $storecfg, $devinfo, $repo, $keyfile, $pbs_backup_name); PVE::QemuConfig->remove_lock($vmid, "create");