12

autoport=yes在域的(libvirt 中的“虚拟机”)配置文件中进行了设置,以便在运行时自动分配 VNC 端口。

我需要得到这个端口,这样我才能从外部连接到虚拟机,但我找不到合适的 API 来做这件事。在 python 中更好,因为我使用的是 libvirt-python 绑定。

4

4 回答 4

21

我没有找到任何VNC端口的API,不知道新版本的libvirt是否有这个接口?

但是,您可以使用该命令virsh vncdisplay $domainName显示端口。注意:您必须修改/etc/libvirt/qemu.confenable vnc_listen='0.0.0.0'

于 2012-11-14T05:29:59.470 回答
7

没有获取 VNC 端口的 API。您必须获取并解析 XML 文件以找出该端口。当然,如果来宾被破坏(断电/离线),该端口的值将是 -1。

char * virDomainGetXMLDesc (virDomainPtr domain, unsigned int flags)

<domain>
  <devices>
    <graphics type='vnc' port='5900' autoport='yes'/>
  </devices>
</domain>

参考

于 2013-10-17T23:01:49.663 回答
4

这是你在 python 中的操作方法,以防万一有人需要。

另存为 vncport.py

from xml.etree import ElementTree as ET

import sys
import libvirt

conn = libvirt.open()

domain = conn.lookupByName(sys.argv[1])

#get the XML description of the VM
vmXml = domain.XMLDesc(0)
root = ET.fromstring(vmXml)

#get the VNC port
graphics = root.find('./devices/graphics')
port = graphics.get('port')

print port

运行命令

python vncport.py <domain name>
于 2015-12-09T14:27:51.650 回答
0

如果有人需要,这是 PHP 版本的一个:

    $res = libvirt_domain_lookup_by_name($conn, $domname);
    $xmlString = libvirt_domain_get_xml_desc($res, '');

    $xml = simplexml_load_string($xmlString);
    $json = json_encode($xml);
    $data = json_decode($json,TRUE);

    $port = intval($data["devices"]["graphics"]["@attributes"]["port"]);
于 2015-03-30T17:58:39.330 回答