Ottieni l'elenco dei client DHCP con KVM + libvirt?


11

Ho diverse macchine virtuali in esecuzione su Ubuntu 9.10 tramite KVM + libvirt. Voglio essere in grado di scoprire l'indirizzo IP che è stato assegnato a ciascun host senza aprire fisicamente una "console" fisica su ogni macchina e invocare ifconfig.

Prendere in considerazione:

rascher @ localhost: ~ $ virsh -c qemu: /// elenco di sistemi - tutti
Connessione al sistema uri: qemu: ///
 ID nome stato
----------------------------------
  1 macchina1 in funzione
  2 machine2 in esecuzione
  - macchina3 spenta

La mia configurazione di rete è simile a:

<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>

Quindi, come posso ottenere un elenco che dice:

indirizzo IP macchina1 = 192.168.122.16
indirizzo IP machine2 = 192.168.122.238
...

Ho giocato con arp:

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

Ma questo non è associato all'ID di una macchina virtuale.

Esiste uno strumento (tramite la riga di comando virsho virt-*) posso accertare queste informazioni? O devo avere uno script elaborato che viene eseguito su ogni singola macchina virtuale, controlla il proprio IP e lo riporta al sistema operativo host?

Risposte:


10

Questa funzione è stata richiesta molto tempo fa. Ora libvirt lo supporta fornendo due nuovi comandi: domifaddr e net-dhcp-leasing

 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

In uno scenario diverso:

 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

4

libvirt usa dnsmasq per fornire DHCP agli ospiti, in modo da poter trawl /var/log/daemon.log o scavare nel file di leasing in / var / lib / libvirt per ottenere un IP per la mappatura del nome host.


2

Quindi, investigando questo, ho scoperto che libvirt usa dnsmasq per fare DHCP e DNS per i SO guest.

E dnsmasq imposterà il nome host nella tabella DNS degli host in base al nome host che riceve dal guest.

Quindi, in conformità con queste istruzioni e molti googling, ho semplicemente bisogno di creare e aggiungere questo a /etc/dhclient.conf:

send host-name "machine1"

Ora, dal mio sistema operativo host, posso ping machine1.

Qualcuno sa perché devo aggiungere il finale "." per risolvere la voce DNS? Come posso cambiarlo?


1
Senza il punto finale, il risolutore DNS aggiungerà il suo elenco di domini di ricerca al nome host quando esegue una ricerca. È possibile invece inviare un nome di dominio completo, ad esempio machine1.example.com, quindi aggiungere example.com al proprio ordine di ricerca DNS.
James,

grazie per questo. tuttavia le note collegate dicono di andare sulla macchina host principale e modificare /etc/resolv.conf e aggiungere 192.168.122.1 come First nameserver (cioè aggiungere libvirt dnsmasq come NS), che ovviamente non funziona sulla maggior parte dei linux moderni come al giorno d'oggi ci sono più astrazioni della rete che riscrivono /etc/resolv.conf. non ho ancora capito bene il mio.
don luminoso

2

Ho avuto lo stesso problema, quindi ho creato il seguente script:

#!/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

Lars Kellogg-Stedman ha creato una serie di script per automatizzare parte di questo processo. Lo chiama "virt-utils".

Lo descrive nel suo post sul blog qui: http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/

Ha anche un github con alcuni degli script che ha scritto, qui:

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

Fondamentalmente puoi semplicemente eseguire questo:

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

e otterrai un elenco di ogni macchina virtuale dal suo "nome di dominio" all'interno del gestore della macchina virtuale di libvirt. Ad esempio, sulla mia macchina ho 3 vms in esecuzione.

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

Nota, questo non è il "nome host" utilizzato dalla VM stessa, ma per un gran numero di casi d'uso, sarà "abbastanza buono" e risolverà il problema di dover "ifconfig" all'interno di ogni VM in dhcp land.

I post sul blog di Lars mostrano anche un modo per "aggiornare automaticamente" il proprio file / etc / hosts all'avvio e / o arresto di nuove macchine virtuali. Questo ti permette di fare cose come ssh myname @ fedora20vm o ssh myname @ debian6vm senza dover trovare manualmente gli indirizzi 192.168.122.x.

Ho aggiunto alcuni miglioramenti minori, come uno script per sputare alcune opzioni ~ / .ssh / config (molto utili per usare github su VM, tramite Forwarding dell'agente), qui:

https://github.com/donbright/virt-utils (sembra essere eliminato?)

Vorrei anche notare che il metodo di modifica di dhclient.conf in "invia nome-host xxxxx" funziona solo su sistemi che utilizzano effettivamente dhclient.conf in modo standard. Mageia, ad esempio, ha una configurazione insolita di come funziona dhclient, quindi le semplici istruzioni non funzioneranno necessariamente. Tuttavia, con il metodo di Lars, funziona come regarldess della configurazione dhcp del SO guest, perché non si affida alla VM per inviare il suo nome host, ma utilizza i "nomi di dominio" all'interno del machine manager di libvirt.


1

Quindi, come posso ottenere un elenco che dice:

indirizzo IP macchina1 = 192.168.122.16

indirizzo IP machine2 = 192.168.122.238

almeno su fedora puoi ottenere queste informazioni in questo modo:

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

ha un output simile a:

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

anche se è un po 'più di quello che hai chiesto


0

Su Ubuntu dnsmasq viene utilizzato per fornire servizi DNS e DHCP alle macchine virtuali. I processi dnsmasq sull'host ospitano i loro contratti di locazione in questo file:

/var/lib/misc/dnsmasq.leases

Questo è un normale file di testo e le righe al suo interno potrebbero essere simili a questo qui:

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

I campi di interesse per te sono la terza e la quarta colonna: il terzo campo contiene l'indirizzo IPv4 della VM e il quarto campo contiene un asterisco o il nome host della VM. Ciò dipende dalla risposta DHCP inviata dall'ospite al processo di servizio dnsmasq.


grazie per questo. sulla mia macchina Ubuntu il file è /var/lib/libvirt/dnsmasq/default.leases con il file dhclient.conf impostato per inviare il nome host "myvirtmachine"; come elencato sopra
don luminoso

0

È possibile modificare la defaultdefinizione di rete, mappare MAC su IP all'interno dell'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)

Una volta avviato un ospite, puoi elencare tutti gli indirizzi MAC dell'ospite tramite

# virsh list --all --mac

In base all'ultimo byte di un indirizzo MAC, è possibile dedurre l'indirizzo IP di un guest.


per quale versione di Virsh dovrebbe funzionare? virsh list --all --macnon funziona nella versione 3.0.0
reox del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.