我想编写一个使用pyvbox在特定虚拟机上还原特定快照的代码。
我有这个:
def readSnap(mach_name):
vbox = virtualbox.VirtualBox()
vm = vbox.find_machine(mach_name)
snap = vm.restore_snapshot()
但最后一行抛出:
virtualbox.library_base.VBoxError: 0x80020009
(Method Machine::restoreSnapshot is not implemented)
我对使用此模块感到非常困惑。 我知道 restore_snapshot()带有一个参数,该参数必须是ISnapshot的实例,但我也不知道如何使用它。
感谢您的帮助和时间。
答案 0 :(得分:1)
IMachine
介绍了find_snapshot
函数。如果知道快照的名称或UUID,则传递该快照。否则,它会传递一个null(None
?)参数以获取根快照。然后,您可以使用children
属性遍历快照,检查快照的属性,直到找到所需的快照为止。
要注意的一件事是您说要“还原特定的快照”。 但是,您的函数不使用参数来指定是哪个快照。因此,您将添加参数,以便可以找到快照。
您的代码可能如下:
def readSnap(mach_name, snapshot_name):
vbox = virtualbox.VirtualBox()
vm = vbox.find_machine(mach_name)
snap = vm.find_snapshot(snapshot_name)
vm.restore_snapshot(snap)
答案 1 :(得分:1)
我找到了解决方案。问题是我没有在代码中包含以下行:
snap = vm.find_snapshot(s_name)
还原快照后,您需要使用以下方法解锁会话:
session.unlock_machine()
这是我的最终代码:
def read_snapshot(m_name, s_name):
start = time.time()
name = "read_snapshot"
vb = virtualbox.VirtualBox()
session = virtualbox.Session()
try:
vm = vb.find_machine(m_name)
snap = vm.find_snapshot(s_name)
vm.create_session(session=session)
except virtualbox.library.VBoxError as e:
return Report(name, "failed", e.msg, True)
except Exception as e:
return Report(name, "failed", str(e), True)
restoring = session.machine.restore_snapshot(snap)
while restoring.operation_percent < 100:
time.sleep(0.5)
session.unlock_machine()
if restoring.completed == 1:
return Report(name, "success", "restoring completed in {:>.4} sec".format(str(time.time() - start)), False)
else:
return Report(name, "failed", "restoring not completed", True)