Obtenir la liste des clients DHCP avec KVM + libvirt?

11

J'ai plusieurs machines virtuelles exécutées sur Ubuntu 9.10 via KVM + libvirt. Je veux pouvoir découvrir l'adresse IP qui a été assignée à chaque hôte sans ouvrir physiquement une "console" physique à chaque machine et invoquer ifconfig.

Considérer:

rascher @ localhost: ~ $ virsh -c qemu: /// liste système --all
Connexion au système uri: qemu: ///
 ID Nom État
----------------------------------
  1 machine1 en marche
  2 machine2 en marche
  - arrêt machine3

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 machine1 = 192.168.122.16
adresse IP machine2 = 192.168.122.238
...

J'ai joué avec arp:

rascher @ localhost: ~ $ arp
Adresse HWtype HWaddress Flags Mask Iface
192.168.122.238 éther 00: 16: 36: 00: 61: b0 C virbr0
192.168.122.16 éther 00: 16: 36: 52: e8: 9c C virbr0
...

Mais cela ne correspond pas à l'ID d'une machine virtuelle.

Existe-t-il un outil (via la ligne de commande, virshou virt-*) je peux vérifier ces informations? Ou dois-je avoir un script sophistiqué qui s'exécute sur chaque machine virtuelle individuelle, vérifie sa propre IP et le signale au système d'exploitation hôte?

rascher
la source

Réponses:

10

Cette fonctionnalité a été demandée il y a longtemps. Maintenant libvirt le supporte en fournissant deux nouvelles commandes: domifaddr et net- dhcp - beases

 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 scénario différent:

 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
Nehal J Wani
la source
4

libvirt utilise dnsmasq pour fournir DHCP aux invités, vous pouvez donc parcourir /var/log/daemon.log ou parcourir le fichier des baux dans / var / lib / libvirt pour obtenir une adresse IP sur le mappage du nom d'hôte.

James
la source
2

Ainsi, en étudiant cela, j'ai trouvé que libvirt utilise dnsmasq pour faire DHCP et DNS pour les OS invités.

Et dnsmasq définira le nom d'hôte dans la table DNS des hôtes en fonction du nom d'hôte qu'il reçoit de l'invité.

Donc, conformément à ces instructions et à beaucoup de recherches sur Google, j'avais simplement besoin de créer et d'ajouter ceci à /etc/dhclient.conf:

send host-name "machine1"

Maintenant, depuis mon OS hôte, je peux ping machine1.

Est-ce que quelqu'un sait pourquoi je dois ajouter le "." pour que l'entrée DNS soit résolue? Comment puis-je changer cela?

rascher
la source
1
Sans le point de fin, votre résolveur DNS ajoutera sa liste de domaines de recherche au nom d'hôte lors d'une recherche. Vous pouvez envoyer un nom de domaine complet à la place, par exemple machine1.example.com, puis ajouter example.com à votre ordre de recherche DNS.
James
Merci pour cela. Cependant, les notes liées disent d'aller sur la machine hôte principale et d'éditer /etc/resolv.conf et d'ajouter 192.168.122.1 comme premier serveur de noms (c'est-à-dire ajouter le libvirt dnsmasq en tant que NS), ce qui bien sûr ne fonctionne pas sur la plupart des linux modernes comme il existe aujourd'hui plusieurs abstractions du réseau qui réécrivent /etc/resolv.conf. Je n'ai pas encore tout à fait compris le mien.
don bright
2

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

la source
2

Lars Kellogg-Stedman a créé un ensemble de scripts pour automatiser une partie de ce processus. Il l'appelle «virt-utils».

Il le décrit dans son article de blog ici: http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/

Il a également un github avec certains des scripts qu'il a écrits, ici:

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

Vous pouvez simplement exécuter 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" dans le gestionnaire de machine virtuelle de libvirt. Par exemple, sur ma machine, j'ai 3 vms en marche.

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 '' que la VM elle-même utilise, mais pour un grand nombre de cas d'utilisation, il sera `` assez bon '' et résout le problème d'avoir à `` ifconfig '' à partir de chaque VM dans le pays DHCP.

La publication du blog de Lars montre également un moyen pour cela de «mettre à jour automatiquement» votre propre fichier / etc / hosts lorsque libvirt démarre et / ou arrête de nouvelles machines virtuelles. Cela vous permet de faire des choses comme ssh myname @ fedora20vm ou ssh myname @ debian6vm sans avoir à trouver les adresses 192.168.122.x à la main.

J'ai ajouté quelques améliorations très mineures, comme un script pour cracher quelques options ~ / .ssh / config (très très pratique pour utiliser github sur les VM, via le transfert d'agent), ici:

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

Je voudrais également noter que la méthode d'édition de dhclient.conf pour «envoyer le nom d'hôte xxxxx» ne fonctionne que sur les systèmes qui utilisent réellement dhclient.conf de manière standard. Mageia, par exemple, a une configuration inhabituelle de la façon dont fonctionne dhclient, donc les instructions simples ne fonctionneront pas nécessairement. Cependant, avec la méthode de Lars, cela fonctionne sans régularisation de la configuration DHCP du système d'exploitation invité, car il ne s'appuie pas sur la machine virtuelle pour envoyer son nom d'hôte - il utilise les `` noms de domaine '' dans le gestionnaire de machine de libvirt.

Don Bright
la source
1

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

adresse IP machine1 = 192.168.122.16

adresse IP machine2 = 192.168.122.238

au moins sur fedora, vous pouvez obtenir ces informations de cette façon:

cat /var/lib/libvirt/dnsmasq/default.leases

a une sortie similaire à:

1412006226 52:54:00:fe:b3:c0 192.168.122.117 coreos0 01:52:54:00:fe:b3:c0

bien que ce soit un peu plus que ce que vous aviez demandé

blq
la source
0

Sur Ubuntu, dnsmasq est utilisé pour fournir des services DNS et DHCP aux machines virtuelles. Les processus dnsmasq sur l'hôte stockent leurs baux dans ce fichier:

/var/lib/misc/dnsmasq.leases

Il s'agit d'un fichier texte normal et les lignes qu'il contient peuvent ressembler à ceci ici:

1362729847 52:54:de:ad:be:ef 192.168.122.254 vm-win7 01:52:54:de:ad:be:ef

Les champs qui vous intéressent sont la troisième et la quatrième colonne: le troisième champ contient l'adresse IPv4 de la machine virtuelle et le quatrième champ contient soit un astérisque, soit le nom d'hôte de la machine virtuelle. Cela dépend de la réponse DHCP envoyée par l'invité au processus de service dnsmasq.

pefu
la source
Merci pour cela. sur ma machine Ubuntu, le fichier est /var/lib/libvirt/dnsmasq/default.leases avec le fichier dhclient.conf défini pour envoyer le nom d'hôte "myvirtmachine"; comme indiqué ci-dessus
don bright
0

Vous pouvez changer la defaultdéfinition du réseau, mapper MAC à IP dans le xml:

# virsh net-edit default
...
<range start='192.168.122.2' end='192.168.122.254' />
<host mac='52:54:00:6c:3c:02' ip='192.168.122.2' />
<host mac='52:54:00:6c:3c:03' ip='192.168.122.3' />
...
<host mac='52:54:00:6c:3c:fe' ip='192.168.122.254' />

# /etc/init.d/libvirtd restart (restart libvirt service)
# virsh net-destroy default    (remove old settings)
# virsh net-start default      (make changes working)

Une fois que vous démarrez un invité, vous pouvez répertorier l'adresse MAC de tous les invités via

# virsh list --all --mac

Selon le dernier octet d'une adresse MAC, vous pouvez déduire l'adresse IP d'un invité.

coanor
la source
pour quelle version de virsh cela devrait-il fonctionner? virsh list --all --macne fonctionne pas dans la version 3.0.0
reox