web-dev-qa-db-ja.com

libvirtを使用してVNCポート番号を取得するにはどうすればよいですか?

ドメインの(libvirtの「仮想マシン」)構成ファイルにautoport=yesを設定して、実行時にVNCポートが自動的に割り当てられるようにしました。

外部からVMに接続できるように、このポートを取得する必要がありますが、接続するための適切なAPIが見つかりません。私はlibvirt-pythonバインディングを使用しているので、pythonの方が良いです。

11
can.

VNCポート用のAPIが見つかりません。新しいバージョンのlibvirtにこのインターフェイスがあるかどうかわかりませんか?

ただし、コマンドvirsh vncdisplay $domainNameを使用してポートを表示することはできます。 注:/etc/libvirt/qemu.conf enable vnc_listen='0.0.0.0'を変更する必要があります。

20
liuzhijun

VNCポートを取得するためのAPIはありません。そのポートを見つけるには、XMLファイルを取得して解析する必要があります。もちろん、ゲストが破壊された場合(電源がオフ/オフラインの場合)、そのポートの値は-1になります。

char * virDomainGetXMLDesc (virDomainPtr domain, unsigned int flags)

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

参考文献

7
Cyb.org

誰かがこれを必要とする場合に備えて、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>
3
Pandrei

誰かがこれを必要とする場合、これは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"]);
0
Benjamin Piette