2014-01-27 2 views
1

Я пытаюсь управлять некоторыми виртуальными машинами через vboxapi, поставляемый с SDK. До сих пор мне удалось запустить виртуальную машину, восстановить снимок, но я не в состоянии восстановить снимок и увидеть результат ...Как восстановить моментальный снимок с помощью 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) 

Я получаю сообщение об ошибке:

[ERROR] 0x80bb0007 (данный сеанс занят)

Я, вероятно, не называю хорошие функции ... Спасибо!

ответ

2

Я восстановил моментальный снимок, используя виртуальный бокс api в C#.

Рассматривая свой код, вы пытаетесь восстановить мгновенный снимок после запуска VMProcess. В документации указано: «Машина не должна работать, иначе операция завершится неудачей». https://www.virtualbox.org/sdkref/interface_i_console.html

Кроме того, запускVMProcess автоматически блокирует сеанс, который вы передаете, поэтому может быть причиной, по которой вы получаете сеанс, занят. Ниже приведен код, как я получил свою секцию, надеюсь, это поможет.

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

Прежде всего запускVMProcess заблокирует машину, поэтому вам не нужно будет ее снова блокировать.

Во-вторых, был ли ваш онлайн-снимок, вживую или в автономном режиме?

Еще одна вещь, о которой вы должны позаботиться, заключается в том, что функция waitForCompletion() не ждет загрузки ОС, она просто запускает ОС, и это считается завершенным, поэтому вам может потребоваться сделать цикл занятости самостоятельно дождитесь загрузки ОС.

Смежные вопросы