C'è un modo per determinare quale interfaccia virtuale appartiene a una macchina virtuale in un host kvm?


10

Sto usando qemu / kvm con un collegamento in rete. Nella macchina host ci sono diverse interfacce di rete "vnetX" senza IP. Sto cercando un modo per sapere quale vnetX appartiene a una macchina virtuale.

Ho provato ad abbinare i valori dell'indirizzo MAC su queste interfacce con i MAC sulle macchine virtuali (o l'XML che li definisce), ma non corrisponde.

C'è brctl show che mostra le interfacce vnet che appartengono a un bridge, ma queste non sono informazioni utili.

C'è un modo per conoscere quella relazione? Grazie!!

Risposte:


14

Che ne dici di questo (esempio per vnet13):

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

Qui usiamo virsh dumpxmlper mostrare proprietà dinamiche sulla VM, che non sono disponibili nella definizione XML statica della VM in /etc/libvirt/qemu/foo.xml. Quale vnetXinterfaccia è collegata a quale VM è una proprietà così dinamica. Lo stesso vale per gli indirizzi MAC della VM.


4
Uso questa leggera modifica per elencare quale vm ha quale interfaccia:for vm in $(virsh list | grep running | awk '{print $2}'); do echo -n "$vm:"; virsh dumpxml $vm| grep -oP "vnet\d+" ; done
zje

Se stai studiando un 'nodo' oVirt puoi usare lo stesso comando ma virsh dovrebbe essere eseguito in modalità 'sola lettura'. Basta aggiungere il parametro -r ad ogni chiamata virsh.
karlacio,

6

Prova virsh dumpxml $domain, vedrai qualcosa di simile:

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

la alias nameè quello che viene utilizzato nella riga di comando qemu-kvm, quindi se si esegue ps -ef |grep qemu|grep net1dal mio esempio, si vedrà la sintassi del comando effettivo usato per questa interfaccia.


2

Ciascuna delle soluzioni sopra indicate presuppone che le macchine virtuali siano gestite da libvirt. È possibile eseguire VM QEMU senza questo, nel qual caso non è possibile utilizzare virsh o guardare XML per trovare la risposta.

Nel caso di esecuzione di VM QEMU da una riga di comando "non elaborata":

  1. tcpdump -i tap0 -f 'icmp' (sostituisce qualsiasi interfaccia di tocco che ti interessa)

  2. Effettua il ping di ogni VM candidata fino a quando non vedi i pacchetti nella traccia. L'interfaccia che stai tracciando quando appaiono i pacchetti ICMP è quella che stai cercando!

Viceversa è possibile avviare un ping su una particolare VM e quindi tcpdump a turno ogni interfaccia di tocco fino a quando uno "si illumina". Dipende se sei interessato a trovare la VM che corrisponde all'interfaccia di tocco o all'interfaccia di tocco che corrisponde alla VM.


0

L'indirizzo MAC delle vnetXinterfacce appartiene all'host, non al guest. brctl showmacs br0mostrerà i MAC rilevati dal bridge, ma sarà quindi necessario incrociare il numero di porta con l'elenco di interfacce da brctl show.


0

Abbina gli indirizzi IP dalla cache Arp alla 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

Uscita campione:

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

Basato sulla risposta di @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

Esempio di output:

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

0
for vm in $(virsh list  --state-running --name); do \
echo $vm; \
virsh domifaddr $vm; \
done

Esempio di output:

client1

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

vnet2      52:54:00:2c:7a:f0    ipv4         192.168.122.63/24

Ho inviato una modifica per le citazioni del codice, ma è necessario includere una spiegazione insieme al codice.
Cory Knutson,
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.