libvirt: fetch ipv4 адрес от гостя
Я ищу решение для извлечения адреса ipv4 или других метаданных виртуальной машины, работающей на qemu/kvm с libvirt? Я также посмотрел в oVirt guest agent и QEMU guest agent, но мне было интересно, есть ли лучший/простой способ получить эти данные?
в основном у меня есть несколько хостов, работающих под управлением KVM, и для каждого конкретного частного ip-адреса мне нужно знать, какая VM работает с этим ip-адресом (предоставляется DHCP-сервером).
4 ответов
Я устанавливаю avahi на каждой виртуальной машине, поэтому они будут рекламировать свои собственные адреса. Однако это не единственный доступный вариант (особенно, если ваша виртуальная машина содержит что-то отличное от Linux). Так что войдите в волшебный мир вариантов virsh!
*) сначала вам нужно получить MAC-адреса NICs вашей виртуальной машины:
[root@5844 ~]# virsh domiflist b2bua
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default virtio 52:54:00:aa:bb:cc
vnet1 bridge br1 virtio 52:54:00:dd:ee:ff
[root@5844 ~]#
*) Теперь давайте посмотрим на таблицу ARP
[root@5844 ~]# arp -e
Address HWtype HWaddress Flags Mask Iface
xx.xx.xx.xx ether xx:xx:xx:xx:xx:xx C br0
192.168.122.14 ether 52:54:00:xx:xx:xx C virbr0
192.168.122.51 ether 52:54:00:aa:bb:cc C virbr0
[root@5844 ~]#
*) Теперь давайте склеим все вместе (и добавив немного оболочки / regex magic):
[root@5844 ~]# for mac in `virsh domiflist b2bua |grep -o -E "([0-9a-f]{2}:){5}([0-9a-f]{2})"` ; do arp -e |grep $mac |grep -o -P "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" ; done
192.168.122.51
[root@5844 ~]#
вы можете просто прочитать файл лизинга:
# cat /var/lib/libvirt/dnsmasq/default.leases
1381437666 52:54:00:98:75:eb 192.168.122.240 chat *
1381437643 52:54:00:dc:ee:f8 192.168.122.112 burp *
или, еще лучше, используйте С virsh
:
virsh # net-dhcp-leases nat --help
NAME
net-dhcp-leases - print lease info for a given network
SYNOPSIS
net-dhcp-leases <network> [<mac>]
DESCRIPTION
Print lease info for a given network
OPTIONS
[--network] <string> network name or uuid
[--mac] <string> MAC address
или на Python:
import libvirt
conn = libvirt.open('qemu+ssh://root@localhost/system')
for lease in conn.networkLookupByName("my_network").DHCPLeases():
print(lease)
это работает на хосте Ubuntu 16.04 с гостем CentOS 7, работающим для меня.
$ virsh list
Id Name State
----------------------------------------------------
5 centos7.0 running
$ virsh domifaddr centos7.0
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet0 52:54:00:a1:28:e5 ipv4 192.168.122.15/24
есть, в общем, два варианта:
- установите в гостевой ОС гостевой агент для вашего гипервизора и используйте API гипервизора для запроса гостевой машины для IP
- полагайтесь на информацию, доступную в вашей локальной сети - я использую arp-scan для этого