Answers:
怎么样(例如的示例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
显示有关VM的动态属性,这些动态属性在/etc/libvirt/qemu/foo.xml中VM的静态XML定义中不可用。vnetX
动态属性是连接到哪个VM的哪个接口。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命令行中使用的内容,因此,如果ps -ef |grep qemu|grep net1
从我的示例运行,您将看到此接口使用的实际命令语法。
上面给出的每种解决方案均假定VM由libvirt管理。如果不这样做,很有可能会运行QEMU VM,在这种情况下,您将无法使用virsh或查看XML来找到答案。
从“原始”命令行运行QEMU VM的情况下:
tcpdump -i tap0 -f'icmp'(替换您感兴趣的任何tap接口)
对每个候选VM进行Ping操作,直到在跟踪中看到数据包为止。当出现ICMP数据包时,您正在跟踪的接口就是您要寻找的接口!
相反,您可以对特定的虚拟机执行ping操作,然后依次依次tcpdump每个tap接口,直到一个“点亮”为止。取决于您是要查找与Tap接口匹配的VM,还是与VM匹配的Tap接口。
将IP地址从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
样本输出:
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
for vm in $(virsh list --state-running --name); do \
echo $vm; \
virsh domifaddr $vm; \
done
输出示例:
client1
Nombre dirección MAC Protocol Address
------------------------------------------------------------------------------
vnet2 52:54:00:2c:7a:f0 ipv4 192.168.122.63/24
for vm in $(virsh list | grep running | awk '{print $2}'); do echo -n "$vm:"; virsh dumpxml $vm| grep -oP "vnet\d+" ; done