使用pyvbox在virtualbox中还原快照

时间:2018-12-19 14:04:36

标签: python automation virtual-machine virtualbox

我想编写一个使用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的实例,但我也不知道如何使用它。

感谢您的帮助和时间。

2 个答案:

答案 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)