[pve-devel] [PATCH qemu-server 3/4] add function importing disk image to existing vm
Wolfgang Bumiller
w.bumiller at proxmox.com
Wed Feb 17 15:05:57 CET 2016
On Mon, Feb 15, 2016 at 02:33:48PM +0100, Timo Grodzinski wrote:
> Signed-off-by: Timo Grodzinski <t.grodzinski at profihost.ag>
> ---
> PVE/QemuServer.pm | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 60 insertions(+), 1 deletion(-)
>
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index 6fafa59..6c777d5 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -6368,7 +6368,7 @@ sub is_template {
> }
>
> sub qemu_img_convert {
> - my ($src_volid, $dst_volid, $size, $snapname, $dont_create_target) = @_;
> + my ($src_volid, $dst_volid, $size, $snapname, %params) = @_;
As mentioned in my reply to patch 1 this looks like it should be part of
patch 1.
>
> my $storecfg = PVE::Storage::config();
> my ($src_storeid, $src_volname) = PVE::Storage::parse_volume_id($src_volid, 1);
> @@ -6547,6 +6547,65 @@ sub clone_disk {
> return $disk;
> }
>
> +sub import_disk {
> + my ( $storecfg, $vmid, $img_volid, $drive ) = @_;
> +
> + print "\nimport disk $img_volid\n";
> +
> + my $old_volid = $drive->{file};
> +
> + my $size_existing = $drive->{size};
> + my $size_new = get_image_size( $storecfg, $img_volid );
> +
> + die "cannot determine of existing drive\n" if !$size_existing;
+ size ;-)
> + die "cannot determine virtual image size of uploaded image\n" if !$size_new;
> +
> + print "\n";
> + print "size of uploaded image: $size_new bytes\n";
> + print "size of drive: $size_existing bytes\n";
> +
> + die "virtual image size ($size_new bytes) is bigger than existing drive ($size_existing bytes)\n"
> + if $size_new > $size_existing;
> +
> + my ( $size ) = PVE::Storage::volume_size_info( $storecfg, $img_volid, 3 );
> +
> + PVE::Storage::activate_volumes( $storecfg, [$old_volid] );
> +
> + my ( $dst_storeid, $dst_volname ) = PVE::Storage::parse_volume_id( $old_volid );
> + my $dst_scfg = PVE::Storage::storage_config( $storecfg, $dst_storeid );
> + my $dst_format = qemu_img_format( $dst_scfg, $dst_volname );
> +
> + print "\nremove existing disk '$old_volid'...\n";
> + PVE::Storage::vdisk_free( $storecfg, $old_volid );
> +
> + print "\n";
> + print "create new disk on storage '$dst_storeid'...\n";
> + my $new_volid = PVE::Storage::vdisk_alloc( $storecfg, $dst_storeid, $vmid, $dst_format, undef, ( $size / 1024 ) );
> + print "new disk '$new_volid' created\n";
> +
> + print "\nconverting image...";
> + eval {
> + qemu_img_convert(
> + $img_volid, $old_volid, $size, undef,
> + dont_create_target => 1,
Is there any place where you need this 0 currently? Since this was the
default anyhow.
> + auto_src_format => 1,
> + verbose => 1
> + );
> + };
> + die "converting image failed: '$@'\n" if $@;
> +
> + ( $size ) = PVE::Storage::volume_size_info( $storecfg, $old_volid, 3 );
> +
> + if ( $size_new != $size_existing ) {
> + print "\nstarting resize of image...\n";
> + PVE::Storage::volume_resize( $storecfg, $old_volid, $size_existing, check_running( $vmid ) );
> + }
> +
> + print "\nimport of disk $img_volid complete\n";
> +
> + return $drive;
> +}
> +
> sub get_image_size {
> my ( $storecfg, $volid ) = @_;
More information about the pve-devel
mailing list