web-dev-qa-db-fra.com

Obtenez la liste des clients DHCP avec KVM + Libvirt?

J'ai plusieurs VMS fonctionnant sur Ubuntu 9.10 via KVM + Libvirt. Je souhaite pouvoir trouver l'adresse IP attribuée à chaque hôte sans ouvrir physiquement une "console" physique à chaque machine et invoquer ifconfig.

Envisager:

 Rascher @ localhost: ~ VIRSH -C QEMU: /// Liste système --all 
 Connexion à Uri: QEMU: /// Système 
 Nom de l'identifiant 
 -------------------------------------------------] 1 machine1 courante 
 2 Machine2 en cours d'exécution 
 - Machine3 éteint 

Ma configuration réseau ressemble à:

<network>
  <name>default</name>
  <uuid>1be...</uuid>
  <forward mode='route' dev="eth0"/>
  <bridge name='virbr0' stp='on' forwardDelay='0' />
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254' />
    </dhcp>
  </ip>
</network>

Alors, comment puis-je obtenir une liste qui dit:

 Adresse IP de la machine1 = 192.168.122.16 
 Adresse IP de la machine2 = 192.168.122238 [.____] ...] ...] ...] ...] ...] ...] ...]

J'ai joué avec arp:

[ 192.168.122.16 Ether 00: 16: 36: 52: E8: 9C C VIRBR0 [.____] ... 

Mais cela ne correspond pas à une pièce d'identité de la machine virtuelle.

Y a-t-il un outil (via la ligne de commande, virsh ou virt-*) Je peux vérifier ces informations? Ou dois-je avoir un script de fantaisie qui fonctionne sur chaque VM, vérifie sa propre adresse IP et le rapporte-t-il à l'OS hôte?

11
rascher

Cette fonctionnalité a été demandée il y a longtemps. Maintenant, Libvirt le supporte en fournissant deux nouvelles commandes: DOMIFADDR et Net-DHCP-Baux

 Usage: domifaddr <domain> [interface] [--full] [--source lease|agent]

 Example outputs:
 virsh # domifaddr f20 --source agent
 Name       MAC address          Protocol     Address
 -------------------------------------------------------------------------------
 lo         00:00:00:00:00:00    ipv4         127.0.0.1/8
 -          -                    ipv6         ::1/128
 eth0       52:54:00:2e:45:ce    ipv4         10.1.33.188/24
 -          -                    ipv6         2001:db8:0:f101::2/64
 -          -                    ipv6         fe80::5054:ff:fe2e:45ce/64
 eth1       52:54:00:b1:70:19    ipv4         192.168.105.201/16
 -          -                    ipv4         192.168.201.195/16
 -          -                    ipv6         2001:db8:ca2:2:1::bd/128
 eth2       52:54:00:36:2a:e5    N/A          N/A
 eth3       52:54:00:20:70:3d    ipv4         192.168.105.240/16
 -          -                    ipv6         fe80::5054:ff:fe20:703d/64

 virsh # domifaddr f20 --full
 Name       MAC address          Protocol     Address
 -------------------------------------------------------------------------------
 vnet0      52:54:00:2e:45:ce    ipv6         2001:db8:0:f101::2/64
 vnet1      52:54:00:b1:70:19    ipv4         192.168.105.201/16
 vnet1      52:54:00:b1:70:19    ipv6         2001:db8:ca2:2:1::bd/128
 vnet3      52:54:00:20:70:3d    ipv4         192.168.105.240/16

 virsh # domifaddr f20 eth0 --source agent --full
 Name       MAC address          Protocol     Address
 -------------------------------------------------------------------------------
 eth0       52:54:00:2e:45:ce    ipv4         10.1.33.188/24
 eth0       52:54:00:2e:45:ce    ipv6         2001:db8:0:f101::2/128
 eth0       52:54:00:2e:45:ce    ipv6         fe80::5054:ff:fe2e:45ce/64

For eth0, ipv6 is managed by libvirt, but ipv4 is not.
For eth1, the second IP is created using ip aliasing.
For eth2, there is no IP configured as of yet.
For eth3, only ipv4 has been configured.
fd00::/8 are private ipv6 ranges. Hence not visible through --source lease

Dans un autre scénario:

 Example Usage: net-dhcp-leases <network> [mac]

 virsh # net-dhcp-leases --network default6
 Expiry Time          MAC address        Protocol  IP address                Hostname        Client ID or DUID
 -------------------------------------------------------------------------------------------------------------------
 2014-06-16 03:40:14  52:54:00:85:90:e2  ipv4      192.168.150.231/24        Fedora20-test   01:52:54:00:85:90:e2
 2014-06-16 03:40:17  52:54:00:85:90:e2  ipv6      2001:db8:ca2:2:1::c0/64   Fedora20-test   00:04:b1:d8:86:42:e1:6a:aa:cf:d5:86:94:23:6f:94:04:cd
 2014-06-16 03:34:42  52:54:00:e8:73:eb  ipv4      192.168.150.181/24        ubuntu14-vm     -
 2014-06-16 03:34:46  52:54:00:e8:73:eb  ipv6      2001:db8:ca2:2:1::5b/64   -               00:01:00:01:1b:30:c6:aa:52:54:00:e8:73:eb
10
Nehal J Wani

libvirt utilise DNSMASQ pour fournir à DHCP aux invités. Vous pouvez donc chalouiller /var/log/daemon.log ou creuser via le fichier de location dans/var/libvirt pour obtenir une adresse IP à la cartographie de l'hôte.

4
James

Lars Kellogg-Stedman a créé un ensemble de scripts pour automatiser une partie de ce processus. Il appelle ça "virt-utils".

Il le décrit dans son article de blog ici: http://blog.odddbit.com/2013/10/04/AUTOMATIC-DNS-ENTRIE/

Il a également un GitHub avec certains des scripts qu'il a écrites, ici:

https://github.com/larsks/virt-utils

Vous pouvez essentiellement juste courir ceci:

git clone https://github.com/larsks/virt-utils 
cd virt-utils 
Sudo make install 
virt-hosts

et vous obtiendrez une liste de chaque machine virtuelle par son "nom de domaine" à l'intérieur de la machine virtuelle-machine de Libvirt. Par exemple, sur ma machine, j'ai 3 VMS en cours d'exécution.

don@serebryanya:~/src/virt-utils$ virt-hosts
192.168.122.23  mageia4.x64-net0.default.virt mageia4.x64.default.virt
192.168.122.197 debian7AMD64-net0.default.virt debian7AMD64.default.virt
192.168.122.15  freebsd10_AMD64-net0.default.virt freebsd10_AMD64.default.virt

Remarque, ce n'est pas le "nom d'hôte" le VM = utiliser, mais pour un grand nombre de cas d'utilisation, il sera "assez bon" et résout le problème de l'avoir à "ifconfig 'de chaque VM dans la terre DHCP.

Le blog de Lars 'L'affichage montre également un moyen de "mettre à jour automatiquement" votre fichier propre/etc/hosts comme Libvirt démarre et/ou arrête de nouveaux VMS. Cela vous permet de faire des choses comme SSH Myname @ Fedora20vm ou SSH Myname @ Debian6vm sans avoir à trouver les adresses de 192.168.122.x à la main.

J'ai ajouté quelques améliorations très mineures, comme un script pour cracher des options ~/.SSH/Config (très très pratique pour utiliser GitHub sur VMS, via un transfert d'agent), ici:

https://github.com/donbright/virt-utils (semble être supprimé?)

J'aimerais également noter que la méthode d'édition dhclient.conf pour "envoyer le nom d'hôte XXXXX" fonctionne uniquement sur des systèmes qui utilisent réellement dhclient.conf de manière standard. MAGEIA, par exemple, a une configuration inhabituelle de la manière dont il fonctionne Dhclient fonctionne, de sorte que les instructions simples ne fonctionnent pas nécessairement. Cependant, avec la méthode de Lars, il travaille régulièrement de la configuration de DHCP invitée, car il ne s'appuie pas sur le VM pour l'envoyer son nom d'hôte - il utilise les "noms de domaine" dans Libvirt's Machine Manager.

2
don bright

J'ai eu le même problème alors j'ai créé le script suivant:

#!/bin/bash



function showMAC(){
    virsh dumpxml ${1}|grep "mac address"|sed "s/.*'\(.*\)'.*/\1/g"
}

function showIP(){
    for mac in $($0 -m $1); do
        grep $mac /var/log/daemon.log | tail -n 1 | awk '{print $7}'
    done
}

if test -z "${1}"; then
    echo "Usage: ${0} [-i | -m] <domain>"
    echo "  -i   Show IP address (the default)."
    echo "  -m   Show MAC address."
    exit
fi

addr_type="-i"

if test ${1} = "-i" || test ${1} = "-m"; then
    addr_type=${1}
    shift
fi

domain=${1}

test $addr_type = "-i" && showIP $domain || showMAC $domain
2
user48801