有没有办法确定哪个虚拟接口属于kvm主机中的虚拟机?

我使用qemu / kvm连接networking。 在主机中有几个没有IP的“vnetX”networking接口。 我正在寻找一种方法来知道哪个vnetX属于一个虚拟机。

我尝试将这些接口上的MAC地址值与虚拟机上的MAC(或定义它们的XML)进行匹配,但不匹配。

有brctl显示,它显示属于梁的vnet接口,但这不是有用的信息。

有没有办法知道这种关系? 谢谢!!

这个怎么样( vnet13例子):

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

在这里,我们使用virsh dumpxml来显示有关虚拟机的dynamic属性,这些虚拟机在/etc/libvirt/qemu/foo.xml中的静态XML定义中不可用。 哪个vnetX接口连接到哪个VM是这样一个dynamic属性。 VM的MAC地址也一样。

尝试virsh dumpxml $domain ,你会看到类似于:

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

alias name是qemu-kvm命令行中使用的alias name ,所以如果在我的示例中运行ps -ef |grep qemu|grep net1 ,将会看到用于此接口的实际命令语法。

上面给出的每个解决scheme都假定虚拟机由libvirtpipe理。 没有这种情况下运行QEMU虚拟机是非常有可能的,在这种情况下,您不能使用virsh或查看XML来find答案。

在从“原始”命令行运行QEMU虚拟机的情况下:

  1. tcpdump -i tap0 -f'icmp'(replace你感兴趣的那个tap接口)

  2. Ping每个候选VM,直到在跟踪中看到数据包。 您正在跟踪的ICMP数据包出现的接口是您正在寻找的接口!

相反,你可以开始ping一个特定的虚拟机,然后tcpdump每个点击界面,直到一个“点亮”。 取决于您是否有兴趣find与分接接口匹配的虚拟机,或与虚拟机相匹配的分接接口。

vnetX接口的MAC地址属于主机,而不是来宾。 brctl showmacs br0将显示桥检测到的MAC,但是您需要将端口号与brctl show的接口列表进行交叉引用。

将IP地址从Arpcaching匹配到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 

示例输出:

 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