ドメインの(libvirtの「仮想マシン」)構成ファイルにautoport=yes
を設定して、実行時にVNCポートが自動的に割り当てられるようにしました。
外部からVMに接続できるように、このポートを取得する必要がありますが、接続するための適切なAPIが見つかりません。私はlibvirt-pythonバインディングを使用しているので、pythonの方が良いです。
VNCポート用のAPIが見つかりません。新しいバージョンのlibvirtにこのインターフェイスがあるかどうかわかりませんか?
ただし、コマンドvirsh vncdisplay $domainName
を使用してポートを表示することはできます。 注:/etc/libvirt/qemu.conf
enable vnc_listen='0.0.0.0'
を変更する必要があります。
VNCポートを取得するためのAPIはありません。そのポートを見つけるには、XMLファイルを取得して解析する必要があります。もちろん、ゲストが破壊された場合(電源がオフ/オフラインの場合)、そのポートの値は-1になります。
char * virDomainGetXMLDesc (virDomainPtr domain, unsigned int flags)
<domain>
<devices>
<graphics type='vnc' port='5900' autoport='yes'/>
</devices>
</domain>
誰かがこれを必要とする場合に備えて、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>
誰かがこれを必要とする場合、これは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"]);