Liste der DHCP-Clients mit KVM + libvirt abrufen?


11

Ich habe mehrere VMs unter Ubuntu 9.10 über KVM + libvirt. Ich möchte in der Lage sein, die IP-Adresse herauszufinden, die jedem Host zugewiesen wurde, ohne physisch eine physische "Konsole" für jeden Computer zu öffnen und aufzurufen ifconfig.

Erwägen:

rascher @ localhost: ~ $ virsh -c qemu: /// Systemliste --all
Verbindung zum uri: qemu: /// System herstellen
 ID Name Status
---------------------------------- ------------------
  1 Maschine1 läuft
  2 Maschine2 läuft
  - Maschine3 abschalten

Meine Netzwerkkonfiguration sieht folgendermaßen aus:

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

Wie kann ich eine Auflistung erhalten, in der steht:

IP-Adresse von Maschine1 = 192.168.122.16
IP-Adresse von machine2 = 192.168.122.238
...

Ich habe gespielt mit arp:

rascher @ localhost: ~ $ arp
Adresse HW-Typ HWaddress Flags Mask Iface
192.168.122.238 Ether 00: 16: 36: 00: 61: b0 C virbr0
192.168.122.16 Ether 00: 16: 36: 52: e8: 9c C virbr0
...

Dies ist jedoch nicht der ID einer virtuellen Maschine zugeordnet.

Gibt es ein Tool (über die Befehlszeile virshoder virt-*), mit dem ich diese Informationen ermitteln kann? Oder brauche ich ein ausgefallenes Skript, das auf jeder einzelnen VM ausgeführt wird, ihre eigene IP überprüft und an das Host-Betriebssystem zurückmeldet?

Antworten:


9

Diese Funktion wurde vor langer Zeit angefordert. Jetzt unterstützt libvirt es mit zwei neuen Befehlen: domifaddr und net-dhcp-leases

 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 einem anderen Szenario:

 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 verwendet dnsmasq, um den Gästen DHCP bereitzustellen, sodass Sie /var/log/daemon.log durchsuchen oder die Leases-Datei in / var / lib / libvirt durchsuchen können, um eine Zuordnung von IP zu Hostname zu erhalten.


2

Als ich dies untersuchte, stellte ich fest, dass libvirt dnsmasq verwendet, um DHCP und DNS für Gastbetriebssysteme auszuführen.

Und dnsmasq setzt den Hostnamen in der DNS-Tabelle des Hosts basierend auf dem Hostnamen, den es vom Gast erhält.

In Übereinstimmung mit diesen Anweisungen und viel googeln musste ich dies einfach erstellen und zu /etc/dhclient.conf hinzufügen:

send host-name "machine1"

Jetzt kann ich von meinem Host-Betriebssystem aus ping machine1.

Weiß jemand, warum ich das nachfolgende "" hinzufügen muss. damit der DNS-Eintrag aufgelöst wird? Wie kann ich das ändern?


1
Ohne den nachgestellten Punkt hängt Ihr DNS-Resolver bei der Suche die Liste der Suchdomänen an den Hostnamen an. Sie können stattdessen einen vollqualifizierten Domänennamen senden, z. B. machine1.example.com, und dann example.com zu Ihrer DNS-Suchreihenfolge hinzufügen.
James

Danke dafür. Die verknüpften Notizen besagen jedoch, dass Sie auf dem Haupthostcomputer /etc/resolv.conf bearbeiten und 192.168.122.1 als ersten Nameserver hinzufügen (dh den libvirt dnsmasq als NS hinzufügen), was unter den meisten modernen Linux-Versionen natürlich nicht funktioniert Heutzutage gibt es mehrere Abstraktionen des Netzwerks, die /etc/resolv.conf neu schreiben. Ich habe meine noch nicht ganz herausgefunden.
Don Bright

2

Ich hatte das gleiche Problem und habe das folgende Skript erstellt:

#!/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 hat eine Reihe von Skripten erstellt, um einen Teil dieses Prozesses zu automatisieren. Er nennt es "Virt-Utils".

Er beschreibt es in seinem Blog-Beitrag hier: http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/

Er hat auch einen Github mit einigen der Skripte, die er hier geschrieben hat:

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

Sie können dies einfach ausführen:

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

und Sie erhalten eine Liste jeder virtuellen Maschine anhand ihres "Domänennamens" im Virtual-Machine-Manager von libvirt. Auf meinem Computer laufen beispielsweise 3 VMS.

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

Beachten Sie, dass dies nicht der 'Hostname' ist, den die VM selbst verwendet, aber für eine große Anzahl von Anwendungsfällen ist er 'gut genug' und löst das Problem, dass innerhalb jeder VM im DHCP-Land 'ifconfig' ausgeführt werden muss.

Lars 'Blog-Posting zeigt auch eine Möglichkeit, Ihre eigene / etc / hosts-Datei automatisch zu aktualisieren, wenn libvirt neue VMs startet und / oder stoppt. Auf diese Weise können Sie beispielsweise ssh myname @ fedora20vm oder ssh myname @ debian6vm ausführen, ohne die Adressen 192.168.122.x manuell suchen zu müssen.

Ich habe hier einige sehr geringfügige Verbesserungen hinzugefügt, wie z. B. ein Skript zum Ausspucken einiger ~ / .ssh / config-Optionen (sehr, sehr praktisch für die Verwendung von Github auf VMs über Agent Forwarding):

https://github.com/donbright/virt-utils (scheint gelöscht zu sein?)

Ich möchte auch darauf hinweisen, dass die Methode zum Bearbeiten von dhclient.conf zum Senden des Hostnamens xxxxx nur auf Systemen funktioniert, die dhclient.conf tatsächlich auf standardmäßige Weise verwenden. Mageia hat zum Beispiel eine ungewöhnliche Konfiguration der Funktionsweise von dhclient, sodass die einfachen Anweisungen nicht unbedingt funktionieren. Mit der Methode von Lars funktioniert es jedoch unabhängig vom DHCP-Setup des Gastbetriebssystems, da er sich nicht darauf verlässt, dass die VM ihren Hostnamen sendet - er verwendet die 'Domänennamen' im Maschinenmanager von libvirt.


1

Wie kann ich eine Auflistung erhalten, in der steht:

IP-Adresse von Maschine1 = 192.168.122.16

IP-Adresse von machine2 = 192.168.122.238

Zumindest auf Fedora können Sie diese Informationen folgendermaßen erhalten:

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

hat eine Ausgabe ähnlich wie:

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

obwohl das ein bisschen mehr ist, als Sie verlangt haben


0

Unter Ubuntu wird dnsmasq verwendet, um DNS- und DHCP-Dienste für die VMs bereitzustellen. Die dnsmasq-Prozesse auf dem Host speichern ihre Leases in dieser Datei:

/var/lib/misc/dnsmasq.leases

Dies ist eine normale Textdatei, und die darin enthaltenen Zeilen sehen hier möglicherweise ähnlich aus:

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

Die für Sie interessanten Felder sind die dritte und die vierte Spalte: Das dritte Feld enthält die IPv4-Adresse der VM und das vierte Feld enthält entweder ein Sternchen oder den Hostnamen der VM. Dies hängt von der DHCP-Antwort ab, die der Gast an den dnsmasq-Dienstprozess sendet.


Danke dafür. Auf meinem Ubuntu-Computer lautet die Datei /var/lib/libvirt/dnsmasq/default.leases, wobei die Datei dhclient.conf so eingestellt ist, dass der Hostname "myvirtmachine" gesendet wird. wie oben aufgeführt
Don Bright

0

Sie können die defaultNetzwerkdefinition ändern und MAC innerhalb der XML der IP zuordnen:

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

Sobald Sie einen Gast gestartet haben, können Sie die MAC-Adresse aller Gäste über auflisten

# virsh list --all --mac

Entsprechend dem letzten Byte einer MAC-Adresse können Sie die IP-Adresse eines Gastes ableiten.


Für welche Version von Virsh sollte dies funktionieren? virsh list --all --macfunktioniert nicht in Version 3.0.0
Reox
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.