kvmホストの仮想マシンに属する仮想インターフェイスを判別する方法はありますか?


10

ブリッジネットワークでqemu / kvmを使用しています。ホストマシンには、IPなしの「vnetX」ネットワークインターフェイスがいくつかあります。どのvnetXが仮想マシンに属しているかを知る方法を探しています。

これらのインターフェイスのMACアドレス値を仮想マシンのMAC(またはそれらを定義するXML)と一致させようとしましたが、一致しません。

ブリッジに属するvnetインターフェースを表示するbrctl showがありますが、これは有用な情報ではありません。

その関係を知る方法はありますか?THX!!

回答:


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、/ etc / libvirt / qemu / foo.xmlのVMの静的XML定義では使用できないVMに関する動的プロパティを表示するために使用します。どの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

oVirt「ノード」を調査している場合は、同じコマンドを使用できますが、virshは「読み取り専用」モードで実行する必要があります。各virsh呼び出しに-rパラメータを追加するだけです。
karlacio

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'(興味のあるタップインターフェイスに置き換えてください)

  2. トレースにパケットが表示されるまで、各候補VMをpingします。ICMPパケットが表示されたときにトレースしているインターフェイスが、探しているものです。

逆に、特定のVMへのpingを開始し、1つが「点灯」するまで各タップインターフェイスをtcpdumpで順番に実行することもできます。タップインターフェイスに一致するVMを検索するか、VMに一致するタップインターフェイスを検索するかによって異なります。


0

vnetXインターフェイスのMACアドレスは、ゲストではなくホストに属しています。brctl showmacs br0ブリッジによって検出されたMACが表示されますが、ポート番号とのインターフェースのリストを相互参照する必要がありますbrctl show


0

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

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

コードクォートの編集を送信しましたが、コードとともに説明を含める必要があります。
Cory Knutson、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.