一个域可以被使用两种方法停止,shutdown和destroy.shutdown方法是软关机,发送给guest OS信号,立即关闭。而destroy的作用是硬关机如直接拔掉电源。
suspend和resume方法是指获取正在运行的客户机并临时保存其内存状态的过程。稍后,可以将来宾程序恢复到最初的运行状态,继续在它停止的地方执行。暂停不会保存客户内存中的持久图像。为此,使用save。
save和restore方法是指获取正在运行的客户机并将其内存状态保存到文件的过程。稍后,可以将客户机恢复到最初的运行状态,继续在停止的地方执行。
需要注意的是,保存/恢复方法只保存内存状态,而不保存存储状态。因此,在恢复来宾操作系统时,底层来宾存储必须处于与最初保存来宾操作系统时完全相同的状态。对于基本用法,这意味着guest只能从任何给定的保存状态映像恢复一次。要允许多次从相同的保存状态还原客户,应用程序还必须在保存时拍摄客户存储的快照,并在还原时显式还原到该存储快照。libvirt的未来增强将允许自动快照功能,它可以在一次操作中保存内存和存储状态。
保存操作需要将客户内存状态保存在其中的文件的完全限定路径。这个文件名位于系统管理程序的文件系统中,而不是libvirt客户机应用程序的文件系统中。如果管理本地管理程序,两者之间没有区别,但如果通过网络远程连接到管理程序,则这一点非常重要。下面的示例演示如何将名为“demo-guest”的来宾保存到文件中。它在保存之前检查客户端是否正在运行,尽管这在技术上是多余的,因为管理程序驱动程序将自己执行这样的检查。
import sys
import libvirt
filename = '/var/lib/libvirt/save/demo-guest.img'
conn = None
try:
conn = libvirt.open("qemu:///system")
except libvirt.libvirtError as e:
print(repr(e), file=sys.stderr)
exit(1)
dom = conn.lookupByName('demo-guest')
if dom == None:
print('Cannot find guest to be saved.', file=sys.stderr)
exit(1)
info = dom.info()
if info == None:
print('Cannot check guest state', file=sys.stderr)
exit(1)
if info.state == VIR_DOMAIN_SHUTOFF:
print('Not saving guest that is not running', file=sys.stderr)
exit(1)
if dom.save(filename) < 0:
print('Unable to save guest to '+filename, file=sys.stderr)
print('Guest state saved to '+filename, file=sys.stderr)
conn.close()
exit(0)
一段时间之后,可以使用virDomainRestore方法,将保存的状态文件用于重新启动客户机。如果客户机已经在运行,管理程序驱动程序将返回一个错误,但是,它不会阻止多次尝试从相同的状态文件进行恢复。如前所述,应用程序有责任确保客户存储处于与创建保存映像时完全相同的状态.
另外,saveFlags方法允许保存域,并同时更改保存的映像的配置。当域恢复时,新的配置将应用到正在运行的域.
还有另一种保存域名的方法。managedSave方法也可以保存正在运行的域状态,只是在这种情况下,系统会为保存的映像选择位置。另外,重新启动时,域也会恢复到保存状态。
import sys
import libvirt
filename = '/var/lib/libvirt/save/demo-guest.img'
conn = None
try:
conn = libvirt.open("qemu:///system")
except libvirt.libvirtError as e:
print(repr(e), file=sys.stderr)
exit(1)
if id = conn.restore(filename)) < 0:
print('Unable to restore guest from '+filename, file=sys.stderr)
exit(1)
dom = conn.lookupByID(id);
if dom == None:
print('Cannot find guest that was restored', file=sys.stderr)
exit(1)
print('Guest state restored from '+filename, file=sys.stderr)
conn.close()
exit(0)
当客户域恢复时,它将返回到保存时的状态。这将包括域名保存的日期和时间。客户域通常无法确定保存时间已经过了一段时间。这意味着当前时间不会在恢复操作期间或之后自动更新。