Libvirt: выбор ipv4-адреса от гостя

Я ищу решение для получения адреса ipv4 или других метаданных VM, работающих на qemu/kvm с libvirt? Я также посмотрел на гостевой агент ovirt и агент qemu guest, но мне было интересно, есть ли лучший/более простой способ получить эти данные?

В основном у меня есть несколько хостов, на которых запущен KVM, и для каждого конкретного частного IP-адреса мне нужно знать, какая виртуальная машина работает с этим IP-адресом (предоставляется DHCP-сервером).

Ответ 1

Я устанавливаю avahi для каждой виртуальной машины, поэтому они будут рекламировать свои собственные адреса. Однако это не единственный доступный вариант (особенно если VM содержит что-то отличное от Linux). Итак, введите магический мир вариантов virsh!

*) Сначала вам нужно получить MAC-адреса своих сетевых сетевых адаптеров:

[[email protected] ~]# virsh domiflist b2bua
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      network    default    virtio      52:54:00:aa:bb:cc
vnet1      bridge     br1        virtio      52:54:00:dd:ee:ff

[[email protected] ~]#

*) Теперь рассмотрим таблицу ARP

[[email protected] ~]# arp -e
 Address                  HWtype  HWaddress           Flags Mask            Iface
 xx.xx.xx.xx              ether   xx:xx:xx:xx:xx:xx   C                     br0
 192.168.122.14           ether   52:54:00:xx:xx:xx   C                     virbr0
 192.168.122.51           ether   52:54:00:aa:bb:cc   C                     virbr0
 [[email protected] ~]# 

*) Теперь давайте склеить все вместе (и добавив немного магии оболочки/регулярного выражения):

[[email protected] ~]# for mac in `virsh domiflist b2bua |grep -o -E "([0-9a-f]{2}:){5}([0-9a-f]{2})"` ; do arp -e |grep $mac  |grep -o -P "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" ; done
192.168.122.51
[[email protected] ~]# 

Ответ 2

Вы можете просто прочитать файл аренды:

# cat /var/lib/libvirt/dnsmasq/default.leases 
1381437666 52:54:00:98:75:eb 192.168.122.240 chat *
1381437643 52:54:00:dc:ee:f8 192.168.122.112 burp *

Или, что еще лучше, используйте команду net-dhcp-leases из virsh:

virsh # net-dhcp-leases nat --help
  NAME
    net-dhcp-leases - print lease info for a given network

  SYNOPSIS
    net-dhcp-leases <network> [<mac>]

  DESCRIPTION
    Print lease info for a given network

  OPTIONS
    [--network] <string>  network name or uuid
    [--mac] <string>  MAC address

Или в Python:

import libvirt
conn = libvirt.open('qemu+ssh://[email protected]/system')
for lease in conn.networkLookupByName("my_network").DHCPLeases():
    print(lease)

Ответ 3

Это работает на хосте Ubuntu 16.04 с гостевой программой CentOS 7 для меня.

$ virsh list
 Id    Name                           State
----------------------------------------------------
 5     centos7.0                      running

$ virsh domifaddr centos7.0
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:a1:28:e5    ipv4         192.168.122.15/24

Ответ 4

Есть, в общем, два варианта:

  • установить в гостевую ОС гостевой агент для вашего гипервизора и использовать API-интерфейс гипервизора для запроса гостевой машины для IP-адреса
  • полагайтесь на информацию, доступную в вашей локальной сети. Я использую arp-scan для этого

более конкретная информация для VirtualBox или libvirt + QEMU