Sys::Virt で仮想マシンに割り当てられているVNC port を取得する

perldoc Sys::Virt::Domain を見ても"vnc" という記述が見当たらないので直接取ってくることはできなさそうだけど、get_xml_description で仮想マシンの情報をxmlで取ってきて、そこのgraphics タグの中身を見ればいけた。

my $xml = $dom->get_xml_description($flags=0);


このxml仮想マシンの設定ファイル(/etc/libvirt/qemu/hostname.xml) の値ではなくて、起動状態の設定を抜いてくるので、vnc port を自動起動にしていても、その都度割り当てられているportを取ってこれる。

use strict;
use warnings;
use Sys::Virt;
use XML::Simple;
use Data::Dump qw(dump);
my $user = 'user';
my $host = 'host';
my $vm   = 'hoge';
my $uri  = "qemu+ssh://$user\@$host/system";

my $vmm = Sys::Virt->new(uri => $uri);
my $dom = $vmm->get_domain_by_name($vm);

my $xml = $dom->get_xml_description();
my $xs  = XML::Simple->new();
my $ref = $xs->XMLin($xml);
	
dump $ref->{devices}->{graphics};

  • 停止時
$ perl get_libvirt_graphics_config.pl
{ autoport => "yes", port => -1, type => "vnc" }	

  • 起動中
$ perl get_libvirt_graphics_config.pl
{ autoport => "yes", port => 5900, type => "vnc" }