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


10

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

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

有brctl show显示了属于网桥的vnet接口,但这不是有用的信息。

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

Answers:


14

怎么样(例如的示例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地址也是如此。


4
我使用此轻微修改来列出哪个vm具有哪个接口:for vm in $(virsh list | grep running | awk '{print $2}'); do echo -n "$vm:"; virsh dumpxml $vm| grep -oP "vnet\d+" ; done
zje 2014年

如果要研究oVirt的“节点”,则可以使用相同的命令,但virsh应该以“只读”模式运行。只需在每个virsh调用中添加-r参数即可。
karlacio '16

6

试试看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从我的示例运行,您将看到此接口使用的实际命令语法。


2

上面给出的每种解决方案均假定VM由libvirt管理。如果不这样做,很有可能会运行QEMU VM,在这种情况下,您将无法使用virsh或查看XML来找到答案。

从“原始”命令行运行QEMU VM的情况下:

  1. tcpdump -i tap0 -f'icmp'(替换您感兴趣的任何tap接口)

  2. 对每个候选VM进行Ping操作,直到在跟踪中看到数据包为止。当出现ICMP数据包时,您正在跟踪的接口就是您要寻找的接口!

相反,您可以对特定的虚拟机执行ping操作,然后依次依次tcpdump每个tap接口,直到一个“点亮”为止。取决于您是要查找与Tap接口匹配的VM,还是与VM匹配的Tap接口。


0

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


0

将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

0

基于@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

输出示例:

vm1:
    vnet0
vm2:
    vnet1
vm3:
    vnet2
vm4:
    vnet3
    vnet4
vm5:
    vnet5

0
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

我为您的代码引号提交了一个编辑,但是您应该在代码中附上说明。
科里·纳特森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.