我正在尝试通过SDK提供的vboxapi来管理一些虚拟机。到目前为止,我设法启动VM,恢复快照,但我无法恢复快照并查看结果......
def launch_vm(target):
manager = VirtualBoxManager(None, None)
vbox = manager.vbox
session = manager.mgr.getSessionObject(vbox)
pinfo("Reverting to snapshot '%s'" % target['vm_snapshot_name'])
try:
vm = vbox.findMachine(target['vm_name'])
snap = vm.findSnapshot(target['vm_snapshot_name']);
progStart = vm.launchVMProcess(session, "gui", "");
progStart.waitForCompletion(5000);
vm.lockMachine(session,1)
progress = session.console.restoreSnapshot(snap)
progress.waitForCompletion(5000);
session.unlockMachine()
except Exception, e:
perror(e)
我收到此错误消息:
[ERROR] 0x80bb0007(给定的会话正忙)
我可能不会称之为好功能......谢谢!
答案 0 :(得分:2)
我已使用c#中的virtualbox api恢复了快照。
查看代码,您尝试在启动VMProcess后恢复快照。文档说“机器不能运行,否则操作将失败”。 https://www.virtualbox.org/sdkref/interface_i_console.html
此外,launchVMProcess将自动锁定您传入的会话,因此可能是您使会话忙碌的原因。下面的代码是我如何运行我的部分,我希望它有所帮助。
VirtualBox.VirtualBox virtualBox = new VirtualBox.VirtualBox();
IMachine vmMachine = virtualBox.FindMachine("Windows 8");
Session session = new Session();
vmMachine.LockMachine(session, LockType.LockType_Shared);
IConsole console = session.Console;
// Restore snapshot
ISnapshot snapShot = vmMachine.FindSnapshot("Snapshot 1");
IProgress snapShotProgress = console.RestoreSnapshot(snapShot);
snapShotProgress.WaitForCompletion(300000);
// unlock before launch VMProcess
session.UnlockMachine();
IProgress launchVmProgess = vmMachine.LaunchVMProcess(session, "gui", "None");
launchVmProgess.WaitForCompletion(300000);
答案 1 :(得分:0)
首先,launchVMProcess将锁定机器,因此您无需再次锁定它。
其次,您的在线快照是实时还是离线?
你必须注意的另一件事是waitForCompletion()函数不等待操作系统启动,它只是启动操作系统,这被认为已经完成,所以你可能需要自己做一个忙循环来等待用于操作系统加载。