Hangi sanal arabirimin kvm ana bilgisayarındaki bir sanal makineye ait olduğunu belirlemenin bir yolu var mı?


10

Köprülü ağ ile qemu / kvm kullanıyorum. Ana makinede IP olmayan birkaç "vnetX" ağ arabirimi vardır. Hangi vnetX'in sanal bir makineye ait olduğunu bilmenin bir yolunu arıyorum.

Bu arabirimlerdeki MAC Adresi değerlerini sanal makinelerdeki MAC'larla (veya bunları tanımlayan XML) eşleştirmeye çalıştım, ancak eşleşmedi.

Bir köprüye ait vnet arabirimlerini gösteren brctl gösterisi var, ancak bu yararlı bilgi değil.

Bu ilişkiyi bilmenin bir yolu var mı? Teşekkür!!

Yanıtlar:


14

Buna ne dersiniz (örnek vnet13):

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

Burada virsh dumpxml/etc/libvirt/qemu/foo.xml dosyasında VM'nin statik XML tanımında bulunmayan VM ile ilgili dinamik özellikleri göstermek için kullanıyoruz. Hangi vnetXarayüzün hangi VM'ye bağlı olduğu gibi dinamik bir özellik. VM'nin MAC adresleri için de aynı şey geçerlidir.


4
Hangi vm hangi arayüze sahip olduğunu listelemek için bu hafif değişiklik kullanın:for vm in $(virsh list | grep running | awk '{print $2}'); do echo -n "$vm:"; virsh dumpxml $vm| grep -oP "vnet\d+" ; done
zje

Bir oVirt 'düğümü' araştırıyorsanız aynı komutu kullanabilirsiniz, ancak virsh 'salt okunur' modunda çalıştırılmalıdır. Sadece her virsh çağrısına -r parametresi ekleyin.
16:56

6

Deneyin virsh dumpxml $domain, şöyle bir şey göreceksiniz:

  <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Çalıştırmak eğer öyleyse, qemu-kvm komut satırında kullanılan budur ps -ef |grep qemu|grep net1benim örnekten, bu arayüz için kullanılan gerçek komut sözdizimi göreceksiniz.


2

Yukarıda verilen çözümlerin her biri VM'lerin libvirt tarafından yönetildiğini varsayar. QEMU VM'lerini bu olmadan çalıştırmak oldukça mümkündür, bu durumda cevabı bulmak için virsh kullanamaz veya XML'ye bakamazsınız.

QEMU VM'lerinin bir "raw" komut satırından çalıştırılması durumunda:

  1. tcpdump -i tap0 -f 'icmp' (ilgilendiğiniz musluk arayüzünü değiştirin)

  2. İzlemede paketleri görene kadar her aday VM'yi pingleyin. ICMP paketleri göründüğünde izlediğiniz arabirim, aradığınız arabirimdir!

Bunun tersine, belirli bir VM'ye bir ping başlatabilir ve ardından her bir musluk arayüzünü bir "yanana" kadar sırayla tcpdump yapabilirsiniz. Dokunma arayüzüyle eşleşen VM'yi mi yoksa VM ile eşleşen musluk arayüzünü mi bulmak istediğinize bağlıdır.


1

IP Adreslerini Arp önbelleğinden VM'ye Eşleştirme

# 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

Örnek çıktı:

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

Ana bilgisayar köprüsü ağı için çok yararlıdır. Küçük bir değişiklik yapmak zorunda kaldım: arp -i virbr0->arp -n -i br0
Ries

0

vnetXArayüzlerin MAC adresi konağa değil, konağa aittir. brctl showmacs br0köprü tarafından algılanan MAC'leri gösterecektir, ancak daha sonra bağlantı noktası numarasını arabirimler listesiyle çapraz referans yapmanız gerekir brctl show.


0

@Daff yanıtına göre:

for vm in $(virsh list | grep running | awk '{print $2}'); do echo "$vm: " && virsh dumpxml $vm | grep  "vnet" | sed 's/[^'']*''\([^'']*\)''[^'']*/\t\1/g'; done

Çıktı Örneği:

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

Örnek çıktı:

client1

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

vnet2      52:54:00:2c:7a:f0    ipv4         192.168.122.63/24

Kod teklifleriniz için bir düzenleme gönderdim, ancak kodunuzla birlikte bir açıklama eklemelisiniz.
Cory Knutson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.