我使用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虚拟机的情况下:
tcpdump -i tap0 -f'icmp'(replace你感兴趣的那个tap接口)
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