2012-12-12 11 views
8

Chciałbym napisać program w języku Java, który uruchamia program (np. Firefox) na maszynie gościnnej VirtualBox. Gospodarzem jest Windows, a gościem jest Ubuntu. Zgodnie z dokumentacją SDK powinno to być możliwe. Oto moja próba w Javie na podstawie tego, co widziałem w dokumentacji (ta zakłada VM jest gotowy do pracy):VirtualBox: Używanie SDK API do uruchamiania programu u gościa?

String machineName = "MyMachine"; 
String url = "http://localhost:18083"; 
String user = ""; 
String passwd = ""; 

VirtualBoxManager mgr = VirtualBoxManager.createInstance(null); 
mgr.connect(url, user, passwd); 
IVirtualBox vbox = mgr.getVBox(); 
System.out.println("Running VirtualBox version " + vbox.getVersion()); 

IMachine machine = vbox.findMachine(machineName); 
ISession session = mgr.getSessionObject(); 
machine.lockMachine(session, LockType.Shared); 
IConsole console = session.getConsole(); 
IGuest guest = console.getGuest(); 

IGuestSession guestSession = guest.createSession("bob","password", "", ""); 
guestSession.processCreate("/usr/bin/firefox", null, null, null, 0L); 

session.unlockMachine(); 

Kiedy uruchamiam to uzyskać:

Exception in thread "main" org.virtualbox_4_2.VBoxException: VirtualBox error: The session is not locked (session state: Unlocked) (0x8000FFFF) 
at org.virtualbox_4_2.ISession.getConsole(ISession.java:145) 
at Test1.main(Test1.java:27) 

I Próbowałem różnych opcji z blokadami i sesjami, ale zawsze dostaję jakiś błąd. Jeśli ustawię LockType na Write, otrzymam komunikat "Błąd przypisania maszyny do sesji".

Czy ktoś to zrobił? Czy istnieją dostępne w Internecie samouczki Java VirtualBox? Nie mogę znaleźć żadnego z Google.

Wszelkie porady są mile widziane.

+0

Znalazłeś @TrentCoder naprawić? – aandis

Odpowiedz

0

Również nie wiem, jak to zrobić z SDK. Ale czy próbowałeś wysłać commend przez SSH do maszyny wirtualnej? Sue, musisz skonfigurować sieć i tak dalej, ale byłaby to dobra alternatywa, ponieważ brak dokumentacji VirtualBox SDK utrudnia archiwizację.

0

Czy próbowałeś czekać na rozpoczęcie sesji gościa? W Twoim przypadku powinno to być coś takiego

guestSession = guest.CreateSession (....

guestSession.waitFor (1L, 0L)

+0

Masz na myśli 'GuestSessionWaitForFlag_Start' zamiast" 1L'? –

+0

Tak. Mam takie samo zadanie i proces rozpoczyna się, gdy moja aplikacja czeka na sesję gościa jest w stanie uruchomienia.Podczas komentowania waitFor (lub waitForArray) stan sesji gościa będzie w błędzie. Możliwe, że musisz wypróbować różne flagi, na przykład flaga GuestSessionWaitForFlag_Status (lub 4L) w celu oczekiwania na zmianę statusu sesji – Sergey