[pve-devel] ceph: clone vm

Stefan Priebe - Profihost AG s.priebe at profihost.ag
Thu Feb 6 08:25:47 CET 2014


I'll test and send patches - can you tell me how to provice the snapshot?

qm clone ID NEWID -snap ABC ?

i'm still not sure how to get the available options.

Stefan

Am 06.02.2014 06:20, schrieb Alexandre DERUMIER:
>>> it adds snapshot support but not linked clones? or do i miss something. 
> 
> this add support to clone from a snapshot from a vm. (at not the default __base__ snapshot, from base-xxx templates ).
> 
> I don't have tested it, but this is almost all we need. (maybe some checks to add in qemuserver.pm, but nothing too big)
> ----- Mail original ----- 
> 
> De: "Stefan Priebe" <s.priebe at profihost.ag> 
> À: "Alexandre DERUMIER" <aderumier at odiso.com>, "Michael Rasmussen" <mir at datanom.net> 
> Cc: pve-devel at pve.proxmox.com 
> Envoyé: Mercredi 5 Février 2014 20:50:34 
> Objet: Re: [pve-devel] ceph: clone vm 
> 
> it adds snapshot support but not linked clones? or do i miss something. 
> 
> Stefan 
> 
> Am 05.02.2014 16:06, schrieb Alexandre DERUMIER: 
>>>> Cloning from snapshot is also an opportunity with ZFS. 
>>
>> yes, sure, for any storage which support snasphot. 
>>
>> It's not a big work, as we have already almost all subroutines in storage plugins 
>>
>>
>>
>> something like this should work (don't have tested it ;) 
>>
>>
>> qemuserver.pm 
>> -------------- 
>>>> sub clone_disk { 
>>>> my ($storecfg, $vmid, $running, $drivename, $drive, $snapname, 
>>>> $newvmid, $storage, $format, $full, $newvollist) = @_; 
>>>>
>>>> my $newvolid; 
>>>>
>>>> if (!$full) { 
>>>> print "create linked clone of drive $drivename ($drive->{file})\n"; 
>>>> $newvolid = PVE::Storage::vdisk_clone($storecfg, $drive->{file}, $newvmid); 
>>
>> sub clone_disk { 
>> my ($storecfg, $vmid, $running, $drivename, $drive, $snapname, 
>> $newvmid, $storage, $format, $full, $newvollist) = @_; 
>>
>> my $newvolid; 
>>
>> if (!$full) { 
>> print "create linked clone of drive $drivename ($drive->{file})\n"; 
>> $newvolid = PVE::Storage::vdisk_clone($storecfg, $drive->{file}, $newvmid, $snapname); 
>>
>>
>> storage.pm 
>> ---------- 
>>>> sub vdisk_clone { 
>>>> my ($cfg, $volid, $vmid) = @_; 
>>>>
>>>> my ($storeid, $volname) = parse_volume_id($volid); 
>>>>
>>>> my $scfg = storage_config($cfg, $storeid); 
>>>>
>>>> my $plugin = PVE::Storage::Plugin->lookup($scfg->{type}); 
>>>>
>>>> activate_storage($cfg, $storeid); 
>>>>
>>>> # lock shared storage 
>>>> return $plugin->cluster_lock_storage($storeid, $scfg->{shared}, undef, sub { 
>>>> my $volname = $plugin->clone_image($scfg, $storeid, $volname, $vmid); 
>>>> return "$storeid:$volname"; 
>>>> }); 
>>>> } 
>>
>>
>> sub vdisk_clone { 
>> my ($cfg, $volid, $vmid, $snap) = @_; 
>>
>> my ($storeid, $volname) = parse_volume_id($volid); 
>>
>> my $scfg = storage_config($cfg, $storeid); 
>>
>> my $plugin = PVE::Storage::Plugin->lookup($scfg->{type}); 
>>
>> activate_storage($cfg, $storeid); 
>>
>> # lock shared storage 
>> return $plugin->cluster_lock_storage($storeid, $scfg->{shared}, undef, sub { 
>> my $volname = $plugin->clone_image($scfg, $storeid, $volname, $vmid, $snap); 
>> return "$storeid:$volname"; 
>> }); 
>> } 
>>
>>
>> storage plugin 
>> -------------- 
>>>> sub clone_image { 
>>>> my ($class, $scfg, $storeid, $volname, $vmid) = @_; 
>>>>
>>>> my $snap = '__base__'; 
>>>>
>>>> my ($vtype, $basename, $basevmid, undef, undef, $isBase) = 
>>>> $class->parse_volname($volname); 
>>>>
>>>> die "clone_image onyl works on base images\n" if !$isBase; 
>>>>
>>>> my $name = &$find_free_diskname($storeid, $scfg, $vmid); 
>>>>
>>>> warn "clone $volname: $basename to $name\n"; 
>>>>
>>>> my $newvol = "$basename/$name"; 
>>>>
>>>> my $cmd = &$rbd_cmd($scfg, $storeid, 'clone', &$add_pool_to_disk($scfg, $basename), '--snap', $snap, &$add_pool_to_disk($scfg, $name)); 
>>>> run_command($cmd, errmsg => "rbd clone $basename' error"); 
>>>>
>>>> return $newvol; 
>>>> } 
>>
>> sub clone_image { 
>> my ($class, $scfg, $storeid, $volname, $vmid, $snapshot) = @_; 
>>
>> my $snap = '__base__'; 
>> $snap = $snapshot if $snapshot; 
>>
>> my ($vtype, $basename, $basevmid, undef, undef, $isBase) = 
>> $class->parse_volname($volname); 
>>
>> die "clone_image onyl works on base images\n" if !$isBase && !$snapshot; 
>>
>> my $name = &$find_free_diskname($storeid, $scfg, $vmid); 
>>
>> warn "clone $volname: $basename to $name\n"; 
>>
>> my $newvol = "$basename/$name"; # Maybe find a way to reference snasphot like "$basename@$snasphot/$name" 
>>
>> my $cmd = &$rbd_cmd($scfg, $storeid, 'clone', &$add_pool_to_disk($scfg, $basename), '--snap', $snap, &$add_pool_to_disk($scfg, $name)); 
>> run_command($cmd, errmsg => "rbd clone $basename' error"); 
>>
>> return $newvol; 
>> } 
>>
>>
>>
>> ----- Mail original ----- 
>>
>> De: "Michael Rasmussen" <mir at datanom.net> 
>> À: pve-devel at pve.proxmox.com 
>> Envoyé: Mercredi 5 Février 2014 15:39:23 
>> Objet: Re: [pve-devel] ceph: clone vm 
>>
>> On 02-05-2014 14:50, Alexandre DERUMIER wrote: 
>>>
>>> Maybe could we introduce this feature (for ceph,sheepdog,..), cloning 
>>> from a snapshot. 
>>>
>> Cloning from snapshot is also an opportunity with ZFS. 
>>



More information about the pve-devel mailing list