VirtualBox Python API还原快照

VirtualBox Python API还原快照,python,api,virtualbox,Python,Api,Virtualbox,我正试图通过SDK提供的vboxapi管理一些虚拟机。 到目前为止,我成功地启动了虚拟机并关闭了它的电源,但我无法恢复快照。 看起来关机过程会锁定虚拟机,直到脚本终止,事实上这就是我得到的错误: progress = self.session.console.restoreSnapshot(self.mach.currentSnapshot) File "", line 3, in restoreSnapshot xpcom.Exception: 0x80070005 (The object

我正试图通过SDK提供的vboxapi管理一些虚拟机。 到目前为止,我成功地启动了虚拟机并关闭了它的电源,但我无法恢复快照。 看起来关机过程会锁定虚拟机,直到脚本终止,事实上这就是我得到的错误:

progress = self.session.console.restoreSnapshot(self.mach.currentSnapshot) File "", line 3, in restoreSnapshot xpcom.Exception: 0x80070005 (The object is not ready) 进度=self.session.console.restoreSnapshot(self.mach.currentSnapshot) restoreSnapshot中第3行的文件“” xpcom.Exception:0x80070005(对象未就绪) 下面是我依次调用的停止vm和恢复快照的特定函数

def stop(self): if self.mach: # Poweroff the virtual machine. progress = self.session.console.powerDown() # Wait for task to complete with a 60 seconds timeout. progress.waitForCompletion(VIRTUALBOX_TIMEOUT) # Check if poweroff was successful. if progress.resultCode != 0: log("[Virtual Machine] [PowerOff] [ERROR] Unable to poweroff virtual machine \"%s\"." % self.mach.name) return False else: log("[Virtual Machine] [PowerOff] Virtual machine \"%s\" powered off successfully." % self.mach.name) else: log("[Virtual Machine] [PowerOff] [ERROR] No virtual machine handle.") return False return True def restore_snapshot(self): if self.mach: # Restore virtual machine snapshot. progress = self.session.console.restoreSnapshot(self.mach.currentSnapshot) # Wait for task to complete with a 60 seconds timeout. progress.waitForCompletion(VIRTUALBOX_TIMEOUT) # Check if snapshot restoring was successful. if progress.resultCode != 0: log("[Virtual Machine] [Restore Snapshot] [ERROR] Unable to restore virtual machine \"%s\" snapshot." % self.mach.name) return False else: log("[Virtual Machine] [Restore Snapshot] Virtual machine \"%s\" successfully restored to current snashot." % self.mach.name) else: log("[Virtual Machine] [Restore Snapshot] [ERROR] No virtual machine handle.") return False return True
def restore_snapshot(self):
    if self.mach:
         self.mach.lockMachine(self.session,1)
         console = self.session.console
         progress = console.restoreSnapshot(self.mach.currentSnapshot)
def停止(自): 如果self.mach: #关闭虚拟机的电源。 progress=self.session.console.powerDown() #等待任务完成,超时60秒。 进度。等待完成(VIRTUALBOX\u超时) #检查断电是否成功。 如果progress.resultCode!=0: 日志(“[Virtual Machine][PowerOff][ERROR]无法关闭虚拟机\%s\”“%self.mach.name”) 返回错误 其他: 日志(“[虚拟机][关机]虚拟机\%s\”已成功关机。“%self.mach.name) 其他: 日志(“[虚拟机][关机][错误]没有虚拟机句柄。”) 返回错误 返回真值 def恢复_快照(自): 如果self.mach: #还原虚拟机快照。 进度=self.session.console.restoreSnapshot(self.mach.currentSnapshot) #等待任务完成,超时60秒。 进度。等待完成(VIRTUALBOX\u超时) #检查快照还原是否成功。 如果progress.resultCode!=0: 日志(“[虚拟机][还原快照][错误]无法还原虚拟机\%s\”快照。“%self.mach.name) 返回错误 其他: 日志(“[虚拟机][还原快照]虚拟机\%s\”已成功还原到当前快照。“%self.mach.name) 其他: 日志(“[虚拟机][还原快照][错误]没有虚拟机句柄。”) 返回错误 返回真值 我想我可能遗漏了什么,有什么线索吗? 谢谢
C.

如果关闭计算机电源,则必须创建新的IConsole对象来恢复快照。在代码中,可以在恢复快照之前添加以下行

def stop(self): if self.mach: # Poweroff the virtual machine. progress = self.session.console.powerDown() # Wait for task to complete with a 60 seconds timeout. progress.waitForCompletion(VIRTUALBOX_TIMEOUT) # Check if poweroff was successful. if progress.resultCode != 0: log("[Virtual Machine] [PowerOff] [ERROR] Unable to poweroff virtual machine \"%s\"." % self.mach.name) return False else: log("[Virtual Machine] [PowerOff] Virtual machine \"%s\" powered off successfully." % self.mach.name) else: log("[Virtual Machine] [PowerOff] [ERROR] No virtual machine handle.") return False return True def restore_snapshot(self): if self.mach: # Restore virtual machine snapshot. progress = self.session.console.restoreSnapshot(self.mach.currentSnapshot) # Wait for task to complete with a 60 seconds timeout. progress.waitForCompletion(VIRTUALBOX_TIMEOUT) # Check if snapshot restoring was successful. if progress.resultCode != 0: log("[Virtual Machine] [Restore Snapshot] [ERROR] Unable to restore virtual machine \"%s\" snapshot." % self.mach.name) return False else: log("[Virtual Machine] [Restore Snapshot] Virtual machine \"%s\" successfully restored to current snashot." % self.mach.name) else: log("[Virtual Machine] [Restore Snapshot] [ERROR] No virtual machine handle.") return False return True
def restore_snapshot(self):
    if self.mach:
         self.mach.lockMachine(self.session,1)
         console = self.session.console
         progress = console.restoreSnapshot(self.mach.currentSnapshot)
在SDK中: 当为特定会话(客户端)锁定计算机时,将创建控制台对象 进程)使用IMachine::lockMachine()或IMachine::launchVMProcess()


twitter@dsanchezlavado

您需要先锁定机器,以便为您创建控制台对象