On Tue, Mar 10, 2009 at 05:18:54PM +0100, Daniel Veillard wrote: > On Mon, Mar 09, 2009 at 11:14:56PM +0900, Matt McCowan wrote: > > OK. Another run at producing a function that helps the likes of me > > backup my kvm Windows servers. > > 'virsh checkpoint domain file [script]' is what the following patch set > > (against cvs) enables. Modelled on the virDomainSave function it takes > > an optional script which it will execute (and pass the name of the > > domain as an argument) while the domain is paused, then resume the > > domain. > > Okay, I quickly looked at the patch and the new API, so no stylistic > review at this point but more a general feedback. I appreciate the > completeness of the patch (only bit missing is filling up the virsh > man page with the new option) > I think this can help administrators in a controlled situation, > but I'm hoping a real snapshotting API will be possible at some point > where libvirt goes though the list of storage resources used by the > domain and properly make a snapshot using a storage API or return > an error if that's not possible. > This looks more as a script extension to virDomainSave/Restore > than really a snapshotting API as I would like libvirt to get at some > point. To me it doesn't implement snapshotting, it implement running a > script on a frozen domain. There is a lot of issues with that: > - the script need to be in place and there is no hint of what > it may contain > - what the script does is unbounded, there is a potential very > serious security issue there > - this does not garantee sucess of the operation and in case of > failure the script can't even propagate back an error code and > description Also this kind of API means that all applications using the API need to know what script to use with what storage in order to take a disk snapshot. This is quite a burden for apps, and means that most of them won't be able to use this snapshot capability in general case. > In my opinion this is a bit too ad-hoc to be turned into a full API > maintained forever, and I'm worried about remote execution capabilities > this opens up. I really hope we will have one day a real checkpointing > API in libvirt, but that requires making more progresses on the storage > management side. In terms of API I think I'd like to see snapshotting available as part of a more generic save/restore API. I tend to think of the current API as providing 'unmanaged save/restore', in so much as libvirt / users of libvirt have no way of knowing whether there is a saved image for the guest available currently. As an example of why this is a problem, consider the often requested ability to save/restore guests across host reboot. When libvirtd starts, it looks at the autostart flag for a guest, and decides may thus automatically boot the guest at that time. libvirtd has no way of knowing whether there was an existing saved image of the guest available to restore, since it doesn't track saved images. Thus I think the first step towards a general snapshot facility would be to provide an API for 'managed save/restore' where we explicitly track saved images. - To save a guest: enum { VIR_DOMAIN_SAVE_LIVE, /* Don't shutdown guest after saving */ } virDomainSaveFlags; virDomainCreateSaveImage(virDomainPtr dom, const char *imagename, unsigned int flags); By default, imagename would be NULL, and flags would be zero. In this case we'd simply be saving to /var/lib/libvirt/saved/qemu/$VMNAME.img Providing equivalence to current virDomainSave(dom, filename), but with libvirt deciding the actual filename used. Now to do snapshots in this scenario, you'd pass a 'imagename' for the snapshot - give each snapshot you take some meaningful name as you desire. And if VIR_DOMAIN_SAVE_LIVE is set then the guest will be allowed to continue running after the snapshot is saved. Obviously this capability would require some way to take a snapshot of the storage, as well as the memory image. We could allow a script to do this, or implement it directly for a handful of storage types we know can do this (eg, LVM, qcow2). - Next, we'd need a way to list saved images virDomainListSaveImages(virDomainPtr dom, const char **imagenames, unsigned int *numimagenames); This would just give back a list of all known imagenames for the VM. - Then a way to restore from an image enum { VIR_DOMAIN_RESTORE_DELETE } virDomainRestoreFlags; virDomainRestoreSaveImage(virDomainPtr dom, const char *imagename, unsigned int flags); This would restore from the named image. If the VIR_DOMAIN_RESTORE_DELETE flag was given, the named image would be deleted after restore (eg to prevent accidental duplicated restore attempts) - Perhaps also need a way to delete saved imaged virDomainDeleteSaveImage(virDomainPtr dom, const char *imagename); If VIR_DOMAIN_SAVE_LIVE is set, the guest won't be shutdown after saving its state. - Perhaps also need a wa yto get more metaata about the save image struct virDomainSaveImageInfo { int savedDate; unsigned long long imageSize; }; virDomainGetSaveImgeInfo(virDomainptr dom, const char *imagename, virDomainSaveImageInfoPtr info); Then again, perhaps the virDomainListSaveImages should just return a list of virDomainSaveImageInfoPtr instances directly, instead of requiring this extra API call - it'd be faster for remote usage in particular because it'd have less round-trips. With this, you could configure libvirtd, so that when starting up, it used virDomainListSaveImages to see if the guest was suspended before the previous host shutdown, and if so, then restore from that saved image automatically. Or make it skip autostart completely, if any save images exist, and allow an admin defined initscript to do auto restore from the save image. Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list