Есть ли способ определить, какой виртуальный интерфейс принадлежит виртуальной машине на хосте kvm?

10

Я использую QEMU / KVM с мостовыми сетями. В хост-машине есть несколько сетевых интерфейсов "vnetX" без IP. Я ищу способ узнать, какие vnetX принадлежат виртуальной машине.

Я пытался сопоставить значения MAC-адресов на этих интерфейсах с MAC-адресами на виртуальных машинах (или XML, который их определяет), но не совпадает.

Есть brctl show, которое показывает интерфейсы vnet, которые принадлежат мосту, но это не полезная информация.

Есть ли способ узнать это отношение? Спасибо!!

теист
источник

Ответы:

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чтобы показать динамические свойства виртуальной машины, которые недоступны в статическом XML-определении виртуальной машины в /etc/libvirt/qemu/foo.xml. Какой vnetXинтерфейс подключен к какой ВМ - такое динамическое свойство. То же самое касается 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 должен быть запущен в режиме «только для чтения». Просто добавьте параметр -r к каждому вызову virsh.
Карласио
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из моего примера, вы увидите , фактический синтаксис команды , используемый для этого интерфейса.

dyasny
источник
2

Каждое из приведенных выше решений предполагает, что виртуальные машины управляются libvirt. Вполне возможно запустить виртуальные машины QEMU без этого, и в этом случае вы не можете использовать virsh или смотреть на XML, чтобы найти ответ.

В случае запуска виртуальных машин QEMU из «сырой» командной строки:

  1. tcpdump -i tap0 -f 'icmp' (замените тот интерфейс интерфейса, который вас интересует)

  2. Проверяйте каждую виртуальную виртуальную машину, пока не увидите пакеты в трассировке. Интерфейс, который вы отслеживаете, когда появляются ICMP-пакеты, это тот, который вы ищете!

И наоборот, вы можете запустить ping для определенной виртуальной машины и затем tcpdump каждый интерфейс крана по очереди, пока один из них не загорится. Зависит от того, заинтересованы ли вы в поиске виртуальной машины, которая соответствует интерфейсу касания, или в интерфейсе касания, который соответствует виртуальной машине.

Карлос Констанский
источник
0

MAC-адрес vnetXинтерфейсов принадлежит хосту, а не гостю. brctl showmacs br0покажет MAC-адреса, обнаруженные мостом, но вам нужно будет сопоставить номер порта со списком интерфейсов brctl show.

mgorven
источник
0

Сопоставить IP-адреса из кэша Arp с виртуальной машиной

# 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
PhiPhi
источник
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
0x3333
источник
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
Рафаэль Фернандес
источник
Я отправил правку для ваших кавычек, но вы должны добавить объяснение вместе с вашим кодом.
Кори Кнутсон