[pve-devel] [PATCH v2 qemu-server] fix #2100: skip local cloudinit image on offline migrate
Mira Limbeck
m.limbeck at proxmox.com
Thu Mar 7 15:15:31 CET 2019
forgot to add the changes v1 -> v2:
* complete rework as v1 was not functional
* cloudinit disk is no longer deleted from $local_volumes but instead
treated differently ('generated' ref type)
the check for cloudinit could not be moved into the 'if
($attr->{cdrom}){} scope (suggested by thomas) as it depends on code run
later on
On 3/7/19 3:10 PM, Mira Limbeck wrote:
> ignore local cloudinit disks on offline migrate but delete it
> afterwards. introduces the 'generated' ref type. delete the old
> cloudinit disk on vm start and create a new one with a sized based on
> the generated iso. this allows the disk to exceed the original 5MB limit
> which might be required for custom cloudinit yaml files supplied via
> snippets.
>
> Signed-off-by: Mira Limbeck <m.limbeck at proxmox.com>
> ---
> PVE/QemuMigrate.pm | 18 ++++++++++++++++--
> PVE/QemuServer/Cloudinit.pm | 37 ++++++++++++++++++++++++++++---------
> 2 files changed, 44 insertions(+), 11 deletions(-)
>
> diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm
> index ee605d8..6bb19db 100644
> --- a/PVE/QemuMigrate.pm
> +++ b/PVE/QemuMigrate.pm
> @@ -246,6 +246,7 @@ sub prepare {
> if !$plugin->check_connection($sid, $scfg);
> } else {
> # only activate if not shared
> + next if ($volid =~ m/vm-\d+-cloudinit/);
> push @$need_activate, $volid;
> }
> }
> @@ -353,7 +354,13 @@ sub sync_disks {
>
> $local_volumes->{$volid}->{ref} = $attr->{referenced_in_config} ? 'config' : 'snapshot';
>
> - die "local cdrom image\n" if $attr->{cdrom};
> + if ($attr->{cdrom}) {
> + if ($volid =~ /vm-\d+-cloudinit/) {
> + $local_volumes->{$volid}->{ref} = 'generated';
> + return;
> + }
> + die "local cdrom image\n";
> + }
>
> my ($path, $owner) = PVE::Storage::path($self->{storecfg}, $volid);
>
> @@ -394,6 +401,8 @@ sub sync_disks {
> $self->log('info', "found local disk '$vol' (in current VM config)\n");
> } elsif ($ref eq 'snapshot') {
> $self->log('info', "found local disk '$vol' (referenced by snapshot(s))\n");
> + } elsif ($ref eq 'generated') {
> + $self->log('info', "found generated disk '$vol' (in current VM config)\n");
> } else {
> $self->log('info', "found local disk '$vol'\n");
> }
> @@ -445,8 +454,13 @@ sub sync_disks {
> foreach my $volid (keys %$local_volumes) {
> my ($sid, $volname) = PVE::Storage::parse_volume_id($volid);
> my $targetsid = $override_targetsid // $sid;
> - if ($self->{running} && $local_volumes->{$volid}->{ref} eq 'config') {
> + my $ref = $local_volumes->{$volid}->{ref};
> + if ($self->{running} && $ref eq 'config') {
> push @{$self->{online_local_volumes}}, $volid;
> + } elsif ($ref eq 'generated') {
> + # skip all generated volumes but queue them for deletion in phase3_cleanup
> + push @{$self->{volumes}}, $volid;
> + next;
> } else {
> next if $rep_volumes->{$volid};
> push @{$self->{volumes}}, $volid;
> diff --git a/PVE/QemuServer/Cloudinit.pm b/PVE/QemuServer/Cloudinit.pm
> index 0f8fc7a..eb85b1d 100644
> --- a/PVE/QemuServer/Cloudinit.pm
> +++ b/PVE/QemuServer/Cloudinit.pm
> @@ -26,23 +26,42 @@ sub commit_cloudinit_disk {
> my $contents = $files->{$filepath};
> file_set_contents("$path/$filepath", $contents);
> }
> + my $iso_path = "/run/pve/cloudinit/$vmid.iso";
> +
> + eval {
> + run_command(['genisoimage', '-R', '-V', $label, '-o', $iso_path, $path]);
> + };
> + my $err = $@;
> + rmtree($path);
> + die $err if $err;
> +
> + my $size = PVE::Storage::file_size_info($iso_path);
>
> my $storecfg = PVE::Storage::config();
> - my $iso_path = PVE::Storage::path($storecfg, $drive->{file});
> + my $disk_path = PVE::Storage::path($storecfg, $drive->{file});
> +
> my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
> - my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
> - $plugin->activate_volume($storeid, $scfg, $volname);
> my $format = PVE::QemuServer::qemu_img_format($scfg, $volname);
> + $volname =~ m/(vm-$vmid-cloudinit(.(qcow2|raw))?)/;
> + my $name = $1;
>
> - my $size = PVE::Storage::file_size_info($iso_path);
> + if (-e $disk_path) {
> + print "cloudinit disk exists, deleting it\n";
> + PVE::Storage::vdisk_free($storecfg, $drive->{file});
> + }
> + print "creating cloudinit disk\n";
> + # $size/1024 should always be valid as ISO-9660 has a sector size of 2048 bytes;
> + PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $format, $name, $size/1024);
> +
> + my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
> + $plugin->activate_volume($storeid, $scfg, $volname);
>
> eval {
> - run_command([['genisoimage', '-R', '-V', $label, $path],
> - ['qemu-img', 'dd', '-n', '-f', 'raw', '-O', $format,
> - 'isize=0', "osize=$size", "of=$iso_path"]]);
> + run_command(['qemu-img', 'dd', '-n', '-f', 'raw', '-O', $format,
> + 'isize=0', "osize=$size", "if=$iso_path", "of=$disk_path"]);
> };
> - my $err = $@;
> - rmtree($path);
> + $err = $@;
> + unlink $iso_path;
> die $err if $err;
> }
>
More information about the pve-devel
mailing list