使用 pyvbox 在 vi​​rtualbox 中恢复快照

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)