[pve-devel] [PATCH v2 container 2/4] implement copy_volume

Fabian Grünbichler f.gruenbichler at proxmox.com
Tue Dec 20 11:34:12 CET 2016


On Mon, Dec 05, 2016 at 04:06:25PM +0100, Wolfgang Bumiller wrote:
> ---
>  src/PVE/LXC.pm | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 64 insertions(+)
> 
> diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
> index c61da3e..c3116b6 100644
> --- a/src/PVE/LXC.pm
> +++ b/src/PVE/LXC.pm
> @@ -1540,5 +1540,69 @@ sub userns_command {
>      return [];
>  }
>  
> +sub copy_volume {
> +    my ($mp, $vmid, $storage, $storage_cfg, $conf, $snapname) = @_;
> +
> +    die "cannot copy volumes of type $mp->{type}\n" if $mp->{type} ne 'volume';
> +    my $mount_dir = "/tmp/ct$vmid.copy-volume";
> +    my $dest = "$mount_dir\/dest";
> +    my $src =  "$mount_dir\/src";
> +
> +    # get id's for unprivileged container
> +    my (undef, $rootuid, $rootgid) = parse_id_maps($conf);
> +
> +    my $new_volid;
> +    my $mounted = 0;
> +    $mp = {%$mp};
> +    eval {
> +	mkdir $mount_dir;
> +	mkdir $src or die "failed to create temporary mount directory: $!";
> +	mkdir $dest or die "failed to create temporary mount directory: $!";
> +
> +	my $needs_chown;
> +	($new_volid, $needs_chown) = alloc_disk($storage_cfg, $vmid, $storage, $mp->{size}/1024, $rootuid, $rootgid);
> +	if ($needs_chown) {
> +	    PVE::Storage::activate_volumes($storage_cfg, [$new_volid], undef);
> +	    my $path = PVE::Storage::path($storage_cfg, $new_volid, undef);
> +	    chown($rootuid, $rootgid, $path);
> +	}
> +
> +	#simplify mount struct. See mountpoint_mount().
> +	$mp->{mp} = '/';
> +
> +	my $new_mp = {%$mp};
> +	$new_mp->{volume} = $new_volid;
> +
> +	# mount and copy
> +	mountpoint_mount($mp, $src, $storage_cfg, $snapname);
> +	$mounted = 1;
> +	mountpoint_mount($new_mp, $dest, $storage_cfg);
> +	$mounted = 2;
> +
> +	PVE::Tools::run_command(['/usr/bin/rsync', '--stats', '-X', '-A', '--numeric-ids',
> +				 '-aH', '--whole-file', '--sparse', '--one-file-system',
> +				 "$src/", $dest]);
> +    };
> +    my $err = $@;
> +    if ($mounted >= 2) {
> +	eval { PVE::Tools::run_command(['/bin/umount', '--lazy', $dest], errfunc => sub{})};
> +	warn "Can't umount $src\n" if $@;

this should be $dest , not $src

> +    }
> +    if ($mounted >= 1) {
> +	eval { PVE::Tools::run_command(['/bin/umount', '--lazy', $src], errfunc => sub{})};
> +	warn "Can't umount $src\n" if $@;
> +    }
> +
> +    rmdir $dest;
> +    rmdir $src;
> +    rmdir $mount_dir or warn "failed to remove $mount_dir: $!\n";
> +
> +    if ($err) {
> +	PVE::Storage::vdisk_free($storage_cfg, $new_volid)
> +	    if defined($new_volid);
> +	die $err;
> +    }
> +    return $new_volid;
> +}
>  
>  1;
> -- 
> 2.1.4
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel




More information about the pve-devel mailing list