2014-01-27 110 views
1

我试图通过随SDK提供的vboxapi来管理一些虚拟机。到目前为止,我设法启动VM,恢复快照,但我不能够恢复快照,看看结果......如何使用virtualbox api恢复快照

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) 

我收到此错误信息:

[错误] 0x80bb0007(给定的会话很忙)

我可能不会称为好功能......谢谢!

回答

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); 
0

首先launchVMProcess会锁定机器,所以你不需要再次锁定它。

二,是你的在线快照,直播还是离线?

另一件需要注意的事情是,waitForCompletion()函数不会等待操作系统启动,它只是启动操作系统,这被认为是完成的,因此您可能需要自己忙于循环等待操作系统加载。

相关问题