web-dev-qa-db-fra.com

Existe-t-il un moyen de déterminer quelle interface virtuelle appartient à une machine virtuelle dans un hôte KVM?

J'utilise QEMU/KVM Whith Bridged Networking. Dans la machine hôte, il existe plusieurs interfaces réseau "vnetx" sans IP. Je cherche un moyen de savoir quel vetex appartient à une machine virtuelle.

J'ai essayé de faire correspondre les valeurs d'adresse MAC sur ces interfaces avec les MAC sur les machines virtuelles (ou le XML qui les définissent), mais ne correspond pas.

Il y a une émission de brctl qui affiche les interfaces VNET appartenant à un pont, mais ce n'est pas une information utile.

Y a-t-il un moyen de savoir cette relation? THX!!

10
theist

Que diriez-vous de cela (exemple pour vnet13):

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

Ici, nous utilisons virsh dumpxml Pour afficher les propriétés dynamiques sur le VM, qui ne sont pas disponibles dans la définition statique XML de VM dans /etc/libvirt/qemu/foo.xml. L'interface vnetX est jointe à laquelle VM est une propriété dynamique. Même chose pour les adresses MAC du VM.

14
daff

Essayer virsh dumpxml $domain, tu verras quelque chose comme:

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

les alias name est ce qui est utilisé dans la ligne de commande QEMU-KVM, donc si vous exécutez ps -ef |grep qemu|grep net1 De mon exemple, vous verrez la syntaxe de commande réelle utilisée pour cette interface.

6
dyasny

Chacune des solutions données ci-dessus suppose que les VMS sont gérés par Libvirt. Il est tout à fait possible d'exécuter Qemu VMS sans cela, auquel cas vous ne pouvez pas utiliser viesh ou regarder XML pour trouver la réponse.

Dans le cas d'exécuter QEMU VMS d'une ligne de commande "brute":

  1. tCPDump -I Tap0 -F 'ICMP' (remplaçant quelle que soit l'interface de TAP qui vous intéresse)

  2. Ping chaque candidat =VM jusqu'à ce que vous voyiez des paquets dans la trace. L'interface que vous traçez lorsque l'apparaissez sur les paquets ICMP est celui que vous recherchez!

Inversement, vous pouvez démarrer un ping à un fichier particulier VM et ensuite tcpdump chaque interface Tap Taper à son tour jusqu'à ce qu'un "s'allume". Dépend si vous souhaitez trouver le VM qui correspond à l'interface TAP ou à l'interface TAP correspondant au VM.

2
Carlos Konstanski

L'adresse MAC des interfaces vnetX appartient à l'hôte, pas à l'invité. brctl showmacs br0 montrera les Macs détectés par le pont, mais vous devez ensuite transversir le numéro de port avec la liste des interfaces de brctl show.

0
mgorven

Correspondre aux adresses IP du cache ARP à VM

# 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

Sortie d'échantillon:

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

Basé sur la réponse @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

Exemple de sortie:

vm1:
    vnet0
vm2:
    vnet1
vm3:
    vnet2
vm4:
    vnet3
    vnet4
vm5:
    vnet5
0
0x3333