Как получить номер порта VNC с помощью libvirt?

Я установил autoport=yes в файле конфигурации домена ( "виртуальная машина" в libvirt), поэтому порт VNC назначается автоматически в течение времени выполнения.

Мне нужно получить этот порт, чтобы я мог подключиться к vm извне, но я не могу найти подходящий API для этого. Лучше в python, потому что я использую привязки libvirt-python.

Ответ 1

Я не нашел API для порта VNC, не уверен, что новая версия libvirt имеет этот интерфейс?

Однако вы можете использовать команду virsh vncdisplay $domainName для отображения порта. ПРИМЕЧАНИЕ: вы должны изменить /etc/libvirt/qemu.conf enable vnc_listen='0.0.0.0'.

Ответ 2

Там нет API для получения порта VNC. Вы должны взять и проанализировать XML файл, чтобы узнать этот порт. Конечно, если гость будет уничтожен (выключен/отключен), этот порт будет равен -1.

char * virDomainGetXMLDesc (virDomainPtr domain, unsigned int flags)

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

Ссылки

Ответ 3

Вот как вы это делаете в 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>

Ответ 4

Вот один для версии 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"]);