Apakah ada cara untuk menentukan antarmuka virtual milik mesin virtual di host kvm?

10

Saya menggunakan qemu / kvm dengan jaringan yang dijembatani. Di mesin host ada beberapa "vnetX" antarmuka jaringan tanpa IP. Saya sedang mencari cara untuk mengetahui mana vnetX milik mesin virtual.

Saya mencoba untuk mencocokkan nilai-nilai Alamat MAC pada antarmuka ini dengan MAC pada mesin virtual (atau XML yang mendefinisikannya), tetapi tidak cocok.

Ada acara brctl yang menunjukkan antarmuka vnet yang dimiliki oleh sebuah jembatan, tetapi ini bukan info yang berguna.

Apakah ada cara untuk mengetahui hubungan itu? Terima kasih!!

teis
sumber

Jawaban:

14

Bagaimana dengan ini (contoh untuk vnet13):

$ VNET=vnet13; for vm in $(virsh list | grep running | awk '{print $2}'); do virsh dumpxml $vm|grep -q "$VNET" && echo $vm; done

Di sini kita gunakan virsh dumpxmluntuk menampilkan properti dinamis tentang VM, yang tidak tersedia dalam definisi XML statis VM di /etc/libvirt/qemu/foo.xml. vnetXAntarmuka mana yang dilampirkan dimana VM adalah properti dinamis. Hal yang sama berlaku untuk alamat MAC VM.

Daff
sumber
4
Saya menggunakan sedikit modifikasi ini ke daftar yang vm memiliki interface mana:for vm in $(virsh list | grep running | awk '{print $2}'); do echo -n "$vm:"; virsh dumpxml $vm| grep -oP "vnet\d+" ; done
zje
Jika Anda sedang menyelidiki 'simpul' oVirt Anda dapat menggunakan perintah yang sama tetapi virsh harus dijalankan dalam mode 'hanya baca'. Cukup tambahkan -r parameter untuk setiap panggilan virsh.
karlacio
6

Coba virsh dumpxml $domain, Anda akan melihat sesuatu seperti:

  <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'/>

yang alias nameadalah apa yang digunakan pada command line qemu-kvm, jadi jika Anda menjalankan ps -ef |grep qemu|grep net1dari contoh saya, Anda akan melihat sintaks perintah yang sebenarnya digunakan untuk interface ini.

dyasny
sumber
2

Setiap salah satu solusi yang diberikan di atas mengasumsikan bahwa VM dikelola oleh libvirt. Sangat mungkin untuk menjalankan QEMU VM tanpa itu, dalam hal ini Anda tidak dapat menggunakan virsh atau melihat XML untuk menemukan jawabannya.

Dalam kasus menjalankan QEMU VMs dari baris perintah "raw":

  1. tcpdump -i tap0 -f 'icmp' (ganti antarmuka antarmuka mana saja yang Anda minati)

  2. Ping setiap kandidat VM sampai Anda melihat paket dalam jejak. Antarmuka yang Anda telusuri saat paket ICMP muncul adalah yang Anda cari!

Sebaliknya, Anda dapat memulai ping ke VM tertentu dan kemudian tcpdump setiap antarmuka secara bergantian sampai satu "menyala". Tergantung apakah Anda tertarik untuk menemukan VM yang cocok dengan antarmuka keran, atau antarmuka keran yang cocok dengan VM.

Carlos Konstanski
sumber
0

Alamat MAC dari vnetXantarmuka adalah milik tuan rumah, bukan tamu. brctl showmacs br0akan menunjukkan MAC yang terdeteksi oleh bridge, tetapi Anda kemudian harus referensi silang nomor port dengan daftar antarmuka dari brctl show.

Mgorven
sumber
0

Cocokkan Alamat IP dari Arp cache ke 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

Output sampel:

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
phiphi
sumber
0

Berdasarkan respons @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

Contoh Keluaran:

vm1:
    vnet0
vm2:
    vnet1
vm3:
    vnet2
vm4:
    vnet3
    vnet4
vm5:
    vnet5
0x3333
sumber
0
for vm in $(virsh list  --state-running --name); do \
echo $vm; \
virsh domifaddr $vm; \
done

Contoh output:

client1

Nombre     dirección MAC       Protocol     Address
------------------------------------------------------------------------------

vnet2      52:54:00:2c:7a:f0    ipv4         192.168.122.63/24
Rafael Fernandez
sumber
Saya mengirimkan hasil edit untuk kutipan kode Anda, tetapi Anda harus menyertakan penjelasan beserta kode Anda.
Cory Knutson