我打算使用libvirt来控制网络上的一些KVM。 到目前为止,连接正在发挥作用。我使用以下代码建立连接
Connect conn = null;
try
{
ConnectAuth ca = new ConnectAuthDefault();
conn = new Connect("qemu+ssh://targetUser@targetIP/system", ca, 0);
}
catch(LibvirtException e)
{
System.out.println("exception caught:" + e);
System.out.println(e.getError());
}
我正在通过
获得对域名的引用Domain d = conn.domainLookupByName("win7");
但是当我尝试连接或分离设备时(我想修改vnc端口)
d.detachDevice("<graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0'/>");
我收到异常读取 请求的操作无效:无法在非活动域上分离设备
好的,似乎错误消息告诉我VM没有运行。所以,如果我通过
启动域名d.create();
并且我从上面执行detachDevice我收到以下错误 不支持的配置:此类型的设备无法热插拔 。
是的,那又怎样?如果域未运行我无法更改配置,如果它正在运行,我也无法更改配置?有谁能告诉我,我做错了什么?如何在不启动域的情况下激活域?我没有找到任何帮助在网上搜索。
非常感谢您的帮助。 问候,-chris -
答案 0 :(得分:1)
您可以使用virsh edit $domainName
修改xml配置文件
答案 1 :(得分:1)
我尝试了这个并得到了同样的错误,然后我尝试了detachDeviceFlags
方法也失败了。
我认为detachDevice
方法用于分离某种 hotplus 设备,例如USB设备。分离vnc图形设备的唯一方法是重新定义它,就像@liuzhijun一样。
而不是在CLI
中执行此操作,这是我的API使用版本:
// Assume you have got the Connect as virtConn, and Domian as dom
// I did it after the vm is shutdown
String xml = dom.getXMLDesc(0);
int[] uuid = dom.getUUID();
// I use a very simple way to erase graphic element, not recommended
// The best way to do it is to use some XML library.
xml = xml.substring(0, xml.indexOf("<graphics type='vnc'")) +
xml.substring(xml.indexOf("graphics>")+10);
virtCon.domainDefineXML(xml);
dom = virtCon.domainLookupByUUID(uuid);
dom.create();