回答:
これはどうですか(の例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
、/ etc / libvirt / qemu / foo.xmlのVMの静的XML定義では使用できないVMに関する動的プロパティを表示するために使用します。どの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'(興味のあるタップインターフェイスに置き換えてください)
トレースにパケットが表示されるまで、各候補VMをpingします。ICMPパケットが表示されたときにトレースしているインターフェイスが、探しているものです。
逆に、特定のVMへのpingを開始し、1つが「点灯」するまで各タップインターフェイスをtcpdumpで順番に実行することもできます。タップインターフェイスに一致するVMを検索するか、VMに一致するタップインターフェイスを検索するかによって異なります。
ArpキャッシュからVMにIPアドレスを一致させる
# 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