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 <s.reiter@proxmox.com>
This commit is contained in:
Stefan Reiter 2021-07-01 11:37:29 +02:00 committed by Thomas Lamprecht
parent 628937f53a
commit 6f94e1625b

View File

@ -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");