2013-09-27 11 views
12

Ich suche nach einer Lösung, um die IPv4-Adresse oder andere Metadaten einer VM auf qemu/kvm mit libvirt zu holen? Ich habe auch nach einem Gastagenten und einem Qemu-Gastagenten gesucht, aber ich habe mich gefragt, ob es einen besseren/einfacheren Weg gibt, diese Daten zu holen?libvirt: hole ipv4-Adresse von Gast

Grundsätzlich habe ich ein paar Hosts mit KVM und für jede spezifische private IP-Adresse muss ich in der Lage zu wissen, welche VM mit dieser IP-Adresse (von einem DHCP-Server bereitgestellt) ausgeführt wird.

Antwort

28

Ich installiere Avahi auf jeder VM, also werben sie ihre eigenen Adressen an. Dies ist jedoch nicht die einzige verfügbare Option (insbesondere, wenn Ihre VM etwas anderes als Linux enthält). Betreten Sie die magische Welt der Virsh Optionen!

*) Zuerst müssen Sie die MAC-Adressen Ihrer VM NICs erhalten:

[[email protected] ~]# 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 

[[email protected] ~]# 

*) Lassen Sie uns jetzt an der ARP-Tabelle nun einen Blick

[[email protected] ~]# 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 
[[email protected] ~]# 

*) des kleben lassen alles zusammen (und das Hinzufügen von ein wenig von Shell/regex Magie):

[[email protected] ~]# 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 
[[email protected] ~]# 
+0

das ist schöne Lösung, aber würde nicht genau in busybox arbeiten, --------> kvm # für mac in 'virsh domiflist yoc6 | 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 grep: ungültige Option - 'P' arp: ungültige Option - 'e' BusyBox v1.22.1 (2015-11-04 15:02:18 PST) BusyBox v1.22.1 (2015-11-04 15 : 02: 18 PST) Multi-Call-Binär. Verwendung: grep [-HhnlLoqvsriwFE] [-m N] [-A/B/CN] Muster/-e Muster .../- f-Datei [Datei] ... –

+1

Beachten Sie, dass die Arp-Tabelle sein könnte veraltete oder fehlende Einträge. Vielleicht möchten Sie vor dem Aufruf des arp-Befehls das Subnetz pingen. –

21

Sie können nur die Lease-Datei lesen:

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

Oder, noch besser, verwenden Sie den net-dhcp-leases Befehl von 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 

Oder in Python:

import libvirt 
conn = libvirt.open('qemu+ssh://[email protected]/system') 
for lease in conn.networkLookupByName("my_network").DHCPLeases(): 
    print(lease) 
+5

Es gibt jetzt eine neue Ergänzung: domifaddr (http://libvirt.org/git/?p=libvirt.git;a=commit;h=2f36e6944e6eb56a00e19fcd85ec8513461597c9) –

+0

beste Antwort .. danke ... –

+0

Upvoted für Python Beispiel – Flippym

0

Es gibt in der Regel zwei Möglichkeiten:

  1. in das Gastbetriebssystem ein Gastalter installieren nt für Ihren Hypervisor und Hypervisor-spezifischen API verwenden, um die Gastmaschine für die IP-
  2. stützen sich auf Informationen in Ihrem lokalen Netzwerk abzufragen - Ich bin mit arp-scan für die

more specific info for VirtualBox or libvirt+QEMU

7

Dies funktioniert auf Ubuntu 16.04 Host mit einem CentOS 7 Gast, der für mich läuft.

$ 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 
+0

Dies zeigt keine Adresse, wenn Bridge mit externem DHCP verwendet wird. – Xdg