Use xm save or xm save -c. Disk snapshot will have the name based on the original name of the device with '-checkpoint-$timestamp' appended.
diff -ru /usr/lib/xen-4.0/lib/python/xen/xend/XendCheckpoint.py xen/xend/XendCheckpoint.py
--- /usr/lib/xen-4.0/lib/python/xen/xend/XendCheckpoint.py 2010-09-03 19:38:06.000000000 +0400
+++ xen/xend/XendCheckpoint.py 2012-04-12 02:40:31.000000000 +0400
@@ -11,6 +11,8 @@
import string
import threading
import fcntl
+import time
+import subprocess
from struct import pack, unpack, calcsize
from xen.util.xpopen import xPopen3
@@ -94,6 +96,26 @@
continue
backend[1] = bkdominfo.getName()
+ if checkpoint:
+ disk_snapshots = dict() # will be used later to create the snapshots before domain resume
+ timestamp = str(time.time())
+ for device_sxp in sxp.children(sxprep, 'device'):
+ vbd_sxp = sxp.child(device_sxp, 'vbd')
+ if vbd_sxp == None:
+ continue
+ uname_sxp = sxp.child(vbd_sxp, 'uname')
+ if uname_sxp == None:
+ continue
+ uname = uname_sxp[1]
+ if uname.startswith('phy:'):
+ devpath = uname.split('phy:')[-1]
+ dirname, basename = os.path.split(devpath)
+ newname = basename + '-checkpoint-' + timestamp
+ disk_snapshots['devpath'] = newname
+ log.debug("Substitute %s with snapshot name %s", devpath, newname)
+ # update the disk name in the configuration
+ uname_sxp[1] = 'phy:' + dirname + '/' + newname
+
config = sxp.to_string(sxprep)
domain_name = dominfo.getName()
@@ -160,6 +182,13 @@
os.remove("/var/lib/xen/qemu-save.%d" % dominfo.getDomid())
if checkpoint:
+ # create LVM-snapshots for each disk device attached, assume all disks are LVM volumes
+ # default disk snapshot size is 1G, we can do lvresize later if needed
+ for origin, clone in disk_snapshots.iteritems():
+ try:
+ subprocess.call(['/sbin/lvm', 'lvcreate', '-s', '-n', clone, '-L', '1G', origin])
+ except Exception exn:
+ log.error("cannot create clone %s for %s", clone, origin)
dominfo.resumeDomain()
else:
dominfo.destroy()

