A couple more bits of XML (potentially) need changing: - In the <graphics> tag, if the 'port' attribute is not already -1, then we need to set it to -1 - otherwise the VNC ports will clash. - In the <interface> tag, if there is a <target> element present, we need to remove it completely. The <target> element is very rarely used, but since it refers to the backend device name (ie to change from the default of vifN.M) we need to remove it otherwise backend devices will clash. - In the <console> tag, if there is a 'pty' attribute we need to remove it. - In the <interface> tag, if there is a <ip> element that needs removing. That is basically all. Most important changes of MAC & UUID are already done.
Thank you for this information. The patch which I attached does not yet depend on this change.
That's a reasonable limitation to start off with - should be easy enough to fix it later.
O.K. I also think it is easy.
There's no easy way to detect if a file is sparse - particularly in python. I think the best option is to detect sequences of zeros. eg, if you are reading the source file 4096 bytes at a time, check to see if that 4096 set of bytes are all zeros. If they are, then seek() forward 4096 bytes instead of writing the set of zeros.
This proposal is good for me. First of all, I will try by this way next development.
Also how about is the below idea ? ・ virt-clone has "--nonsparse" args as same as virt-install. A new sparse device file is made by lseek(os.path.getsize(soucefile or sourcedisk)) whenever the destination device that the user specified is not found andthe option "-- nosparse" is NOT specified, then destination device is copied. A new normal device file that had all zeros is made by write('\x00')
Only when the destination device that the user specified is not found and the option "-- nosparse" is specified, then destination device is copied.
I think I'd swap these 2 around. Have --name / -n refer to the name of the new VM to be created. And have a '--source NAME|UUID' arg to specify the original VM, based on its name or uuid. I'd also make --name compulsory rather than appending _CLONE to the original name.
Ohh, it is certainly confusing. I agree and define the below. Original guest -- source guest(domain) Clone guest -- destination guest(domain) So I take the '--original NAME| UUID' args and make '--name' compulsory.
We should add a few more args here that we've already got with virt-install In particular the --debug flag is very useful for debugging problems -eg it will print out XML of new domain in virt-install. To support QEMU/KVM, we should also have the --connect URI flag, and pass it down into the libvirt.open() call, rather than hardcoding a Xen connection. Finally a --uuid arg too, to let people pre-define the UUID if needed. With the VNC port stripping & the --connect URI arg to let it work with QEMU+ KVM, I'd be happy to see this code included in the repo.
Thank you for commets.I made it again referring to virt-install and retested.
Attached patches shows help below --------------------------------------------------------------------------- # ./virt-clone --help Usage: virt-clone [options] Options: -h, --help show this help message and exit -o ORIGINAL_GUEST, --original=ORIGINAL_GUEST Name or uuid for the original guest; The status must be shut off -n NEW_NAME, --name=NEW_NAME New name for the clone guest -u NEW_UUID, --uuid=NEW_UUID New UUID for the clone guest; if none is given a random UUID will be generated -m NEW_MAC, --mac=NEW_MAC New fixed MAC address for the clone guest; if none or RANDOM is given a random address will be used -f NEW_DISKFILE, --file=NEW_DISKFILE New file to use as the disk image for the clone guest -c CONNECT, --connect=CONNECT Connect to hypervisor with URI -d, --debug Print debugging information Signed-off-by: Kazuki Mizushima <mizushima.kazuk@xxxxxxxxxxxxxx> Thanks, Kazuki Mizushima
Attachment:
virt-clone.patch
Description: Binary data
Attachment:
CloneManager.py.patch
Description: Binary data