my ($sid, $volname) = PVE::Storage::parse_volume_id($volid);
my $scfg = PVE::Storage::storage_config($self->{storecfg}, $sid);
- my $migratable = ($scfg->{type} eq 'dir') || ($scfg->{type} eq 'zfspool') ||
- ($scfg->{type} eq 'lvmthin') || ($scfg->{type} eq 'lvm');
+ my $migratable = $scfg->{type} =~ /^(?:dir|zfspool|lvmthin|lvm)$/;
die "can't migrate '$volid' - storage type '$scfg->{type}' not supported\n"
if !$migratable;
'PVE::QemuConfig', $jobcfg, $start_time, $start_time, $logfunc);
}
+ # sizes in config have to be accurate for remote node to correctly
+ # allocate disks, rescan to be sure
+ my $volid_hash = PVE::QemuServer::scan_volids($self->{storecfg}, $vmid);
+ PVE::QemuServer::foreach_drive($conf, sub {
+ my ($key, $drive) = @_;
+ my ($updated, $old_size, $new_size) = PVE::QemuServer::update_disksize($drive, $volid_hash);
+ if (defined($updated)) {
+ $conf->{$key} = PVE::QemuServer::print_drive($updated);
+ $self->log('info', "size of disk '$updated->{file}' ($key) updated from $old_size to $new_size\n");
+ }
+ });
+
$self->log('info', "copying local disk images") if scalar(%$local_volumes);
foreach my $volid (keys %$local_volumes) {
sync_disks($self, $vmid);
+ # sync_disks fixes disk sizes to match their actual size, write changes so
+ # target allocates correct volumes
+ PVE::QemuConfig->write_config($vmid, $conf);
};
sub phase1_cleanup {
if (my $err = $@) {
eval { PVE::QemuServer::qemu_blockjobs_cancel($vmid, $self->{storage_migration_jobs}) };
eval { PVE::QemuMigrate::cleanup_remotedisks($self) };
- die "Failed to complete storage migration\n";
+ die "Failed to complete storage migration: $err\n";
} else {
foreach my $target_drive (keys %{$self->{target_drive}}) {
my $drive = PVE::QemuServer::parse_drive($target_drive, $self->{target_drive}->{$target_drive}->{volid});
- $conf->{$target_drive} = PVE::QemuServer::print_drive($vmid, $drive);
+ $conf->{$target_drive} = PVE::QemuServer::print_drive($drive);
PVE::QemuConfig->write_config($vmid, $conf);
}
}