Existe uma maneira de determinar qual interface virtual pertence a uma máquina virtual em um host kvm?

10

Estou usando qemu / kvm com rede em ponte. Na máquina host, existem várias interfaces de rede "vnetX" sem IP. Estou procurando uma maneira de saber qual vnetX pertence a uma máquina virtual.

Tentei combinar os valores de endereço MAC nessas interfaces com os MACs nas máquinas virtuais (ou o XML que os define), mas não corresponde.

Há o brctl show que mostra as interfaces vnet que pertencem a uma ponte, mas isso não é uma informação útil.

Existe uma maneira de conhecer essa relação? Valeu!!

teísta
fonte

Respostas:

14

Que tal isso (exemplo para vnet13):

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

Aqui, usamos virsh dumpxmlpara mostrar propriedades dinâmicas sobre a VM, que não estão disponíveis na definição XML estática da VM em /etc/libvirt/qemu/foo.xml. Qual vnetXinterface está conectada à qual VM é uma propriedade tão dinâmica. O mesmo vale para os endereços MAC da VM.

daff
fonte
4
Eu uso essa pequena modificação à lista que vm tem a interface:for vm in $(virsh list | grep running | awk '{print $2}'); do echo -n "$vm:"; virsh dumpxml $vm| grep -oP "vnet\d+" ; done
zje
Se você está investigando um 'nó' do oVirt, pode usar o mesmo comando, mas o virsh deve ser executado no modo 'somente leitura'. Basta adicionar o parâmetro -r a cada chamada virsh.
karlacio
6

Tente virsh dumpxml $domain, você verá algo como:

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

o alias nameé o que é usado na linha de comando qemu-kvm, por isso, se você executar ps -ef |grep qemu|grep net1do meu exemplo, você vai ver a sintaxe do comando real usado para essa interface.

dyasny
fonte
2

Todas as soluções fornecidas acima assumem que as VMs estão sendo gerenciadas pela libvirt. É bem possível executar VMs QEMU sem isso; nesse caso, você não pode usar o virsh ou consultar o XML para encontrar a resposta.

No caso de executar VMs QEMU a partir de uma linha de comando "bruta":

  1. tcpdump -i tap0 -f 'icmp' (substitua a interface de toque em que você estiver interessado)

  2. Faça ping em cada VM candidata até ver pacotes no rastreamento. A interface que você está rastreando quando os pacotes ICMP aparecem é a que você está procurando!

Por outro lado, você pode iniciar um ping em uma VM específica e, em seguida, tcpdump cada interface de toque até que uma "acenda". Depende se você está interessado em encontrar a VM que corresponde à interface de toque ou a interface de toque que corresponde à VM.

Carlos Konstanski
fonte
0

O endereço MAC das vnetXinterfaces pertence ao host, não ao convidado. brctl showmacs br0mostrará os MACs detectados pela ponte, mas você precisará cruzar o número da porta com a lista de interfaces de brctl show.

mgorven
fonte
0

Corresponder endereços IP do cache do 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

Saída de amostra:

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

Com base na resposta @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

Exemplo de saída:

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

Exemplo de saída:

client1

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

vnet2      52:54:00:2c:7a:f0    ipv4         192.168.122.63/24
Rafael Fernandez
fonte
Enviei uma edição para suas citações de código, mas você deve incluir uma explicação junto com seu código.
Cory Knutson