使用 pyvbox 在 virtualbox 中恢复快照
Restoring snapshot in virtualbox using pyvbox
我想编写一段代码,使用 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 实例的参数,但我也不知道如何使用它。
感谢您的帮助和时间。
IMachine
记录了一个 find_snapshot
函数。如果您知道快照的名称或 UUID,则通过它。否则它会说将空 (None
?) 参数传递给它以获取根快照。然后,您可以使用 children
属性遍历快照,检查快照的属性,直到找到您想要的那个。
需要注意的一件事是你说你想要"restore a specific snapshot"。
但是,您的函数不采用指定哪个快照的参数。因此,您将添加参数以便可以找到快照。
您的代码可能如下所示:
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)
我找到了解决办法。问题是我没有包含在代码中的这一行:
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)
我想编写一段代码,使用 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 实例的参数,但我也不知道如何使用它。
感谢您的帮助和时间。
IMachine
记录了一个 find_snapshot
函数。如果您知道快照的名称或 UUID,则通过它。否则它会说将空 (None
?) 参数传递给它以获取根快照。然后,您可以使用 children
属性遍历快照,检查快照的属性,直到找到您想要的那个。
需要注意的一件事是你说你想要"restore a specific snapshot"。 但是,您的函数不采用指定哪个快照的参数。因此,您将添加参数以便可以找到快照。
您的代码可能如下所示:
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)
我找到了解决办法。问题是我没有包含在代码中的这一行:
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)