Is there a way to determine which virtual interface belongs to a virtual machine in a kvm host?

46,341

Solution 1

How about this (example for vnet13):

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

Here we use virsh dumpxml to show dynamic properties about the VM, which are not available in the static XML definition of the VM in /etc/libvirt/qemu/foo.xml. Which vnetX interface is attached to which VM is such a dynamic property. Same goes for the VM's MAC addresses.

Solution 2

Try virsh dumpxml $domain, you'll see something like:

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

the alias name is what is used in the qemu-kvm command line, so if you run ps -ef |grep qemu|grep net1 from my example, you will see the actual command syntax used for this interface.

Solution 3

Every one of the solutions given above assumes that the VMs are being managed by libvirt. It is quite possible to run QEMU VMs without that, in which case you cannot use virsh or look at XML to find the answer.

In the case of running QEMU VMs from a "raw" command line:

  1. tcpdump -i tap0 -f 'icmp' (substitute whichever tap interface you're interested in)

  2. Ping each candidate VM until you see packets in the trace. The interface you are tracing when ICMP packets appear is the one you're looking for!

Conversely you can start a ping to a particular VM and then tcpdump each tap interface in turn until one "lights up". Depends whether you're interested in finding the VM that matches the tap interface, or the tap interface that matches the VM.

Solution 4

Run virsh domiflist myVM. This command will list all the interfaces related to VM myVM.

 Interface   Type      Source      Model    MAC
---------------------------------------------------------------
 vnet0       bridge    mgtbridge   virtio   52:54:00:3c:f3:df
 vnet1       bridge    habridge    virtio   52:54:00:8a:b3:b6
 -           hostdev   -           -        52:54:00:b0:eb:b7
 -           hostdev   -           -        52:54:00:44:26:94

Solution 5

Based on @daff response:

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

Output Example:

vm1:
    vnet0
vm2:
    vnet1
vm3:
    vnet2
vm4:
    vnet3
    vnet4
vm5:
    vnet5
Share:
46,341

Related videos on Youtube

theist
Author by

theist

Multiclass Rogue/Developer/SysAdmin at The Cocktail. Day to Day skilled in Linux, AWS Administration, Ruby on Rails stack and any other tech proven useful to our bussiness Naturally attracted to things with large and complex configuration files, like Nginx, Apache, Asterisk, Nagios.

Updated on September 18, 2022

Comments

  • theist
    theist over 1 year

    I'm using qemu/kvm whith bridged networking. In the host machine there are several "vnetX" network interfaces without IP. I'm looking for a way to know which vnetX belong to a virtual machine.

    I tried to match the MAC Address values on these interfaces with the MACs on the virtual machines (or the XML which defines them), but doesn't match.

    There's brctl show which shows the vnet interfaces that belongs to a bridge, but this is not useful info.

    Is there a way to know that relation? Thx!!

  • ethic0
    ethic0 over 9 years
    I use this slight modification to list which vm has which interface: for vm in $(virsh list | grep running | awk '{print $2}'); do echo -n "$vm:"; virsh dumpxml $vm| grep -oP "vnet\d+" ; done
  • karlacio
    karlacio over 8 years
    If you are investigating an oVirt 'node' you can use the same command but virsh should be run in 'read only' mode. Just add -r parameter to each virsh call.
  • Cory Knutson
    Cory Knutson about 6 years
    I submitted a edit for your code quotes, but you should include an explanation along with your code.
  • Ries
    Ries almost 4 years
    Very useful for host-bridge network. I had to make a slight change: arp -i virbr0 -> arp -n -i br0
  • theist
    theist almost 3 years
    wow! I asked this nine years ago! I no longer work with KVM so I can not fact check it ... but I guess it is ok, here's your karma :D