Je recherche une solution pour récupérer l'adresse ipv4 ou d'autres métadonnées d'un VM fonctionnant sur qemu/kvm avec libvirt? J'ai également examiné l'agent invité ovirt et l'agent invité qemu, mais je Je me demandais s'il y avait un moyen meilleur/plus facile de récupérer ces données?
Fondamentalement, j'ai quelques hôtes exécutant KVM et pour chaque adresse IP privée spécifique, je dois être en mesure de savoir quel VM fonctionne avec cette adresse IP ( fourni par un serveur DHCP).
J'installe avahi sur chaque machine virtuelle, donc ils publieront leurs propres adresses. Cependant, ce n'est pas la seule option disponible (surtout si vous VM contient quelque chose de différent de Linux). Entrez donc dans le monde magique des options virsh!
*) Vous devez d'abord obtenir les adresses MAC des cartes réseau de votre machine virtuelle:
[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 ~]#
*) Jetons maintenant un œil à la table 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 ~]#
*) Maintenant, collons tout ensemble (et ajoutons un peu de magie Shell/regex):
[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 ~]#
Vous pouvez simplement lire le fichier de location:
# 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 *
Ou, encore mieux, utilisez le net-dhcp-leases
commande de 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
Ou en Python:
import libvirt
conn = libvirt.open('qemu+ssh://root@localhost/system')
for lease in conn.networkLookupByName("my_network").DHCPLeases():
print(lease)
Cela fonctionne sur Ubuntu 16.04 Host avec un invité CentOS 7 en cours d'exécution pour moi.
$ 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
Il y a, en général, deux options:
informations plus spécifiques pour VirtualBox ou libvirt + QEM
Aucune des suggestions n'a fonctionné dans mon cas. Voici comment j'ai obtenu l'IP invité.
Obtenez le nom du réseau:
$ virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
Ensuite:
$ virsh net-dhcp-leases default
Expiry Time MAC address Protocol IP address Hostname Client ID or DUID
-------------------------------------------------------------------------------------------------------------
2018-11-06 15:47:33 52:54:00:1b:ee:f6 ipv4 192.168.122.6/24 vm1 -
2018-11-06 15:36:58 52:54:00:d7:1c:2e ipv4 192.168.122.4/24 vm2 -