use IPC::Open2;
use Time::HiRes qw( usleep );
+use PVE::AccessControl;
use PVE::Cluster;
use PVE::Format qw(render_bytes);
use PVE::GuestHelpers qw(safe_boolean_ne safe_string_ne);
use PVE::INotify;
+use PVE::JSONSchema;
use PVE::RPCEnvironment;
use PVE::Replication;
use PVE::ReplicationConfig;
use PVE::ReplicationState;
+use PVE::Storage::Plugin;
use PVE::Storage;
use PVE::StorageTunnel;
use PVE::Tools;
}
}
- $self->{vm_was_paused} = 1 if PVE::QemuServer::vm_is_paused($vmid);
+ # Do not treat a suspended VM as paused, as it might wake up
+ # during migration and remain paused after migration finishes.
+ $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 $vga = PVE::QemuServer::parse_vga($conf->{vga});
+ if ($running && $vga->{'clipboard'} && $vga->{'clipboard'} eq 'vnc') {
+ die "VMs with 'clipboard' set to 'vnc' are not live migratable!\n";
+ }
+
my $vollist = PVE::QemuServer::get_vm_volumes($conf);
my $storages = {};
my $tunnel = $self->{tunnel};
+ my $sourcevollist = PVE::QemuServer::get_vm_volumes($conf);
+
if ($self->{volume_map} && !$self->{opts}->{remote}) {
my $target_drives = $self->{target_drive};
$self->log('info', "stopping NBD storage migration server on target.");
# stop nbd server on remote vm - requirement for resume since 2.9
if ($tunnel && $tunnel->{version} && $tunnel->{version} >= 2) {
- PVE::Tunnel::write_tunnel($tunnel, 30, 'nbdstop');
+ eval {
+ PVE::Tunnel::write_tunnel($tunnel, 30, 'nbdstop');
+ };
+ if (my $err = $@) {
+ $self->log('err', $err);
+ $self->{errors} = 1;
+ }
} else {
my $cmd = [@{$self->{rem_ssh}}, 'qm', 'nbdstop', $vmid];
# always deactivate volumes - avoid lvm LVs to be active on several nodes
eval {
- my $vollist = PVE::QemuServer::get_vm_volumes($conf);
- PVE::Storage::deactivate_volumes($self->{storecfg}, $vollist);
+ PVE::Storage::deactivate_volumes($self->{storecfg}, $sourcevollist);
};
if (my $err = $@) {
$self->log('err', $err);