VirtualBox:如何使用SDK API在虚拟机中启动程序?

11

我想编写一个Java程序,启动虚拟机客户机中的一个程序(例如Firefox)。主机是Windows,客户机是Ubuntu。根据SDK文档,应该可以做到这一点。以下是我在Java中的尝试,基于我在文档中看到的内容(这假设VM正在运行):

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

运行代码后,我得到了:

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)

我已经尝试了锁定和会话的不同选项,但总是会遇到某种类型的错误。如果将LockType设置为Write,则会出现“无法将机器分配给会话”的错误。

有没有人做过这个?有没有在线的Java VirtualBox教程?我在谷歌上找不到任何资料。

非常感谢您的任何建议。


@TrentCoder,你找到解决方法了吗? - aandis
2个回答

1

您是否尝试过等待客户会话启动。在您的情况下,应该是这样的:

guestSession = guest.CreateSession(....

guestSession.waitFor(1L, 0L)


你的意思是 GuestSessionWaitForFlag_Start 而不是 1L 吗? - Paul Hicks
是的。我有相同的工作,当我的应用程序等待客人会话处于启动状态时,进程开始。当我注释掉waitFor(或waitForArray)时,客人会话状态将出现错误。可能需要尝试不同的标志。例如,使用GuestSessionWaitForFlag_Status标志(或4L)等待会话状态发生更改。 - Serhii Ivanskoi

1
我也不知道如何使用SDK来完成这个任务。但是你尝试过通过SSH将命令发送到虚拟机吗?虽然需要设置网络等操作,但这是一个很好的替代方案,因为VirtualBox SDK文档缺乏,使得实现变得复杂。请保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接