Gibt es eine Möglichkeit zu bestimmen, welche virtuelle Schnittstelle zu einer virtuellen Maschine in einem kvm-Host gehört?

10

Ich verwende qemu / kvm mit überbrücktem Netzwerk. Auf dem Host-Computer gibt es mehrere "vnetX" -Netzwerkschnittstellen ohne IP. Ich suche nach einer Möglichkeit zu wissen, welche vnetX zu einer virtuellen Maschine gehören.

Ich habe versucht, die MAC-Adresswerte auf diesen Schnittstellen mit den MACs auf den virtuellen Maschinen (oder dem XML, das sie definiert) abzugleichen, aber es stimmt nicht überein.

Es gibt eine brctl-Show, die die vnet-Schnittstellen zeigt, die zu einer Bridge gehören, aber dies sind keine nützlichen Informationen.

Gibt es eine Möglichkeit, diese Beziehung zu kennen? Danke!!

Theist
quelle

Antworten:

14

Wie wäre es damit (Beispiel für vnet13):

$ VNET=vnet13; for vm in $(virsh list | grep running | awk '{print $2}'); do virsh dumpxml $vm|grep -q "$VNET" && echo $vm; done

Hier werden virsh dumpxmldynamische Eigenschaften der VM angezeigt, die in der statischen XML-Definition der VM in /etc/libvirt/qemu/foo.xml nicht verfügbar sind. Welche vnetXSchnittstelle an welche VM angeschlossen ist, ist eine solche dynamische Eigenschaft. Gleiches gilt für die MAC-Adressen der VM.

daff
quelle
4
Ich benutze diese geringfügige Änderung, um aufzulisten, welche VM welche Schnittstelle hat:for vm in $(virsh list | grep running | awk '{print $2}'); do echo -n "$vm:"; virsh dumpxml $vm| grep -oP "vnet\d+" ; done
zje
Wenn Sie einen oVirt-Knoten untersuchen, können Sie denselben Befehl verwenden, aber virsh sollte im schreibgeschützten Modus ausgeführt werden. Fügen Sie einfach jedem virsh-Aufruf den Parameter -r hinzu.
Karlacio
6

Versuchen Sie virsh dumpxml $domain, Sie werden etwas sehen wie:

  <interface type='network'>
  <mac address='52:54:00:9d:9d:10'/>
  <source network='default'/>
  <target dev='vnet1'/>
  <model type='e1000'/>
  <alias name='net1'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x0c' function='0x0'/>

das alias nameist das, was in der qemu-kvm Befehlszeile verwendet wird, so dass , wenn Sie laufen ps -ef |grep qemu|grep net1von meinem Beispiel werden Sie die tatsächliche Befehlssyntax für diese Schnittstelle verwendet sehen.

dyasny
quelle
2

Bei jeder der oben angegebenen Lösungen wird davon ausgegangen, dass die VMs von libvirt verwaltet werden. Es ist durchaus möglich, QEMU-VMs ohne diese auszuführen. In diesem Fall können Sie weder virsh noch XML verwenden, um die Antwort zu finden.

Im Fall der Ausführung von QEMU-VMs über eine "rohe" Befehlszeile:

  1. tcpdump -i tap0 -f 'icmp' (ersetzen Sie die Tap-Schnittstelle, an der Sie interessiert sind)

  2. Pingen Sie jede Kandidaten-VM an, bis Sie Pakete in der Ablaufverfolgung sehen. Die Schnittstelle, die Sie verfolgen, wenn ICMP-Pakete angezeigt werden, ist die, nach der Sie suchen!

Umgekehrt können Sie einen Ping an eine bestimmte VM starten und dann nacheinander jede Tap-Schnittstelle tcpdumpen, bis eine "aufleuchtet". Hängt davon ab, ob Sie die VM suchen möchten, die der Tap-Schnittstelle entspricht, oder die Tap-Schnittstelle, die der VM entspricht.

Carlos Konstanski
quelle
0

Die MAC-Adresse der vnetXSchnittstellen gehört dem Host, nicht dem Gast. brctl showmacs br0zeigt die von der Bridge erkannten MACs an, aber Sie müssen dann die Portnummer mit der Liste der Schnittstellen von vergleichen brctl show.

mgorven
quelle
0

Passen Sie die IP-Adressen vom Arp-Cache an die VM an

# vm mac address list
for vm in $(virsh list | grep running | awk '{print $2}'); do \
  echo -n "$vm "; \
  virsh dumpxml $vm| grep -oP "52:54:[\da-f:]+" ; 
done > vm_mac.list

# vm ip list
arp -i virbr0 | grep '52:' | while read addr ; do \
  ip=$(echo $addr | awk '{print $1}'); \
  mac=$(echo $addr | awk '{print $3}'); \
  vm=$(grep "$mac" vm_mac.list | awk '{print $1}'); \
  echo "$vm $ip $mac"; \
done | sort

Beispielausgabe:

vm66 192.168.191.112 52:54:00:ab:e8:cb
vm67 192.168.191.207 52:54:00:88:66:e7
vm67 192.168.191.241 52:54:00:88:66:e7
vm68 192.168.191.197 52:54:00:c5:e1:30
vm69 192.168.191.254 52:54:00:b6:f6:0f
vm70 192.168.191.232 52:54:00:08:7f:49
vm71 192.168.191.113 52:54:00:e7:6f:2b
Phiphi
quelle
0

Basierend auf der Antwort von @daff:

for vm in $(virsh list | grep running | awk '{print $2}'); do echo "$vm: " && virsh dumpxml $vm | grep  "vnet" | sed 's/[^'']*''\([^'']*\)''[^'']*/\t\1/g'; done

Ausgabebeispiel:

vm1:
    vnet0
vm2:
    vnet1
vm3:
    vnet2
vm4:
    vnet3
    vnet4
vm5:
    vnet5
0x3333
quelle
0
for vm in $(virsh list  --state-running --name); do \
echo $vm; \
virsh domifaddr $vm; \
done

Beispielausgabe:

client1

Nombre     dirección MAC       Protocol     Address
------------------------------------------------------------------------------

vnet2      52:54:00:2c:7a:f0    ipv4         192.168.122.63/24
Rafael Fernandez
quelle
Ich habe eine Bearbeitung für Ihre Code-Anführungszeichen eingereicht, aber Sie sollten Ihrem Code eine Erklärung beifügen.
Cory Knutson