The function checks for resources that cannot be migrated, snapshoted, or suspended.
To run this function while the snapshot lock is active, the pve-guest-common patch 'AbstractConfig: add abstract method to check for resources preventing a snapshot.' is required. Signed-off-by: Markus Frank <m.fr...@proxmox.com> --- PVE/API2/Qemu.pm | 5 ++++- PVE/QemuConfig.pm | 5 +++++ PVE/QemuMigrate.pm | 2 +- PVE/QemuServer.pm | 23 ++++++++++++++++++++++- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index c50c42be..ece98a30 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -4550,7 +4550,7 @@ __PACKAGE__->register_method({ $res->{running} = PVE::QemuServer::check_running($vmid) ? 1:0; my ($local_resources, $mapped_resources, $missing_mappings_by_node) = - PVE::QemuServer::check_local_resources($vmconf, 1); + PVE::QemuServer::check_local_resources($vmconf, $res->{running}, 1); delete $missing_mappings_by_node->{$localnode}; my $vga = PVE::QemuServer::parse_vga($vmconf->{vga}); @@ -5238,6 +5238,9 @@ __PACKAGE__->register_method({ die "unable to use snapshot name 'pending' (reserved name)\n" if lc($snapname) eq 'pending'; + my $vmconf = PVE::QemuConfig->load_config($vmid); + PVE::QemuServer::check_non_migratable_resources($vmconf, $param->{vmstate}, 0); + my $realcmd = sub { PVE::Cluster::log_msg('info', $authuser, "snapshot VM $vmid: $snapname"); PVE::QemuConfig->snapshot_create($vmid, $snapname, $param->{vmstate}, diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm index 8e8a7828..ffdf9f03 100644 --- a/PVE/QemuConfig.pm +++ b/PVE/QemuConfig.pm @@ -199,6 +199,11 @@ sub get_backup_volumes { return $return_volumes; } +sub __snapshot_assert_no_blockers { + my ($class, $vmconf, $save_vmstate) = @_; + PVE::QemuServer::check_non_migratable_resources($vmconf, $save_vmstate, 0); +} + sub __snapshot_save_vmstate { my ($class, $vmid, $conf, $snapname, $storecfg, $statestorage, $suspend) = @_; diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm index 6591f3f7..09e97268 100644 --- a/PVE/QemuMigrate.pm +++ b/PVE/QemuMigrate.pm @@ -233,7 +233,7 @@ sub prepare { $self->{vm_was_paused} = 1 if PVE::QemuServer::vm_is_paused($vmid, 0); } - my ($loc_res, $mapped_res, $missing_mappings_by_node) = PVE::QemuServer::check_local_resources($conf, 1); + my ($loc_res, $mapped_res, $missing_mappings_by_node) = PVE::QemuServer::check_local_resources($conf, $running, 1); my $blocking_resources = []; for my $res ($loc_res->@*) { if (!grep($res, $mapped_res->@*)) { diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index a3446c3d..fe42122a 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -2571,13 +2571,32 @@ sub config_list { return $res; } +sub check_non_migratable_resources { + my ($conf, $state, $noerr) = @_; + + my @blockers = (); + if ($state && $conf->{"amd-sev"}) { + push @blockers, "amd-sev"; + } + + if (scalar(@blockers) && !$noerr) { + die "Cannot live-migrate, snapshot (with RAM), or hibernate a VM with:" + ." @blockers\n"; + } + + return @blockers; +} + # test if VM uses local resources (to prevent migration) sub check_local_resources { - my ($conf, $noerr) = @_; + my ($conf, $state, $noerr) = @_; my @loc_res = (); my $mapped_res = []; + my @non_migratable_resources = check_non_migratable_resources($conf, $state, $noerr); + push(@loc_res, @non_migratable_resources); + my $nodelist = PVE::Cluster::get_nodelist(); my $pci_map = PVE::Mapping::PCI::config(); my $usb_map = PVE::Mapping::USB::config(); @@ -6455,6 +6474,8 @@ sub vm_suspend { die "cannot suspend to disk during backup\n" if $is_backing_up && $includestate; + check_non_migratable_resources($conf, $includestate, 0); + if ($includestate) { $conf->{lock} = 'suspending'; my $date = strftime("%Y-%m-%d", localtime(time())); -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel