[Libvir] [PATCH][RFC] Adding Cloning Feature

Daniel P. Berrange berrange at redhat.com
Tue Apr 24 15:06:22 UTC 2007

On Tue, Apr 24, 2007 at 10:57:09PM +0900, Kazuki Mizushima wrote:
> Hi all,
> I've been planing to adding cloning feature.
> Then, I tried to make the patch in the following way. 
> 1)Get the XML used virDomainGetXMLDesc
> 2)Delete <uuid>, <mac> node element
>   This intened to automatically generated.
> 3)Changing <name>, <source dev> string node element
> 4)Fork "dd" process
> 5)Define XML used virDomainDefineXML

While this works ok in simple cases, I'm not sure it neccessarily scales
upto handle the more complex cases easily enough. With this prototype the
user only has the option of specifying new device names. Conceivably the
user could want to specify a whole lot more 'new' parameters - eg change
the VNC port if it was not previously auto-allocated, specify a new MAC
address (for any/all NICs), specify a UUID, etc. 

If using LVM for the backing store, instead of dd'ing the disk they could
simply take a (writable) snapshot of the disk - this could even be done 
while the source VM was active (assuming use of a journalling FS inside
the guest).  If doing a flat copy of the disks, it will also be important
to provide progress feedback to the user - when initially allocating guests
it takes a good 30-60 seconds per GB of disk to be allocated - cloning an
existing guest will be longer because instead of just writing zero's you
are reading & writing data.

> This feature is just a first revision, 
> because I make this patch within current libvirt API limitation.
> Also Remote Cloining is Limited.
> But if we can libvirtd for feature, it will be enhance remote cloning
> based on this pach
> (as http://libvirt.org/remote.html#Remote_libvirtd_configuration)
> Finally, to have to communicate with the demon remotely as libvirt library, 
> actually I want to put down to new libvirt API (e.g. virDomainClone).

For remote support, we'd really need to have some basic storage management
APIs to let us allocate new 'chunks' of storage for the virtual disks.

> Could you hear your comments about this ?

I think cloning should be kept separate from the main libvirt API because
there are simply too many different ways to approach it, depending on your
application use-cases. The way I like to look at it, is that we've just got
several different ways to 'install' a guest

  1. Traditional installation media (eg CDROM, HTTP kickstart)
  2. Boot a LiveCD which can install itself to disk
  3. Create from a VM 'template', possibly cloning some base disk
  4. Cloning an existing provisioned VM

Now virt-install currently deals with the first option, and there is some
work going on to experiment with making it do options 2 & 3 too. So I think
that it'd be worth trying to add some form of cloning capability to virt-install

Thinking how it might work..

Currently to install from HTTP you might do

      --name myvm
      --ram 500
      --mac 54:24:52:23:55:43
      --url  http://download.fedora.redhat.com/pub/fedora/linux/core/6/x86_64/os/
      --filesize 5
      --file /var/lib/xen/images/myvm.img

So, how might it work with cloning ? Basically install of the --url arg to point
to an install source, we'd allow  '--clone VMNAME' to point to an existing virtual
machine. The main config would be determined by the settings of that VM, with the
command line args being used to override specific bits. As a bare minimum
example one would do

      --name othervm
      --clone myvm
      --file /var/lib/xen/images/othervm.img

But for a more complex case one could use all the various args

     --name othervm
     --clone myvm
     --uuid 2452:ef23:ee3e:2232:442424252525ffe
     --vncport 5902
     --mac 42:55:23:66:23:44
     --file /var/lib/xen/images/myvm.img
     --file /var/lib/xen/images/myvmdata.img

Now without prototyping it, I'm not sure how much code re-use we'd get within
virt-install, so it may turn out that it is simpler to just have a separate
tool called  virt-clone for this purpose. In either case I reckon we could
distribute this as part of the main  virtinst codebase, so it is still easy 
for us to access the functionality from virt-manager.

|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 

More information about the libvir-list mailing list