我正在寻找一种解决方案,可以获取在qemu/kvm和libvirt上运行的虚拟机的IPv4地址或其他元数据。我也看过ovirt guest agent和qemu guest agent,但我想知道是否有更好/更容易的方法来获取这些数据?
基本上,我有几个运行KVM的主机,对于每个特定的私有IP地址,我需要能够知道哪个虚拟机正在使用该IP地址(由DHCP服务器提供)。
我正在每个虚拟机上安装avahi,这样它们就会广告自己的地址。然而,这并不是唯一可用的选项(特别是如果您的虚拟机包含与Linux不同的内容)。因此,请进入virsh选项的神奇世界!
*) 首先,您需要获取虚拟机网卡的MAC地址:
[root@5844 ~]# 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
[root@5844 ~]#
*) 现在让我们来看一下ARP表
[root@5844 ~]# 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
[root@5844 ~]#
*) 现在让我们把一切粘合在一起(并添加一些shell/regex魔法):
[root@5844 ~]# 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
[root@5844 ~]#
你可以直接阅读租约文件:
# 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 *
或者,更好的办法是使用virsh
中的net-dhcp-leases
命令:
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://root@localhost/system')
for lease in conn.networkLookupByName("my_network").DHCPLeases():
print(lease)
对于我而言,在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
一般有两种选择:
在我的情况下,这些建议都没有起作用。这是我如何获得客户端IP的方法。
获取网络名称:
$ virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
然后:
$ virsh net-dhcp-leases default
Expiry Time MAC address Protocol IP address Hostname Client ID or DUID
-------------------------------------------------------------------------------------------------------------
2018-11-06 15:47:33 52:54:00:1b:ee:f6 ipv4 192.168.122.6/24 vm1 -
2018-11-06 15:36:58 52:54:00:d7:1c:2e ipv4 192.168.122.4/24 vm2 -
virsh domiflist yoc6 |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 grep:无效选项 -- 'P' arp:无效选项 -- 'e' BusyBox v1.22.1 (2015-11-04 15:02:18 PST)BusyBox v1.22.1 (2015-11-04 15:02:18 PST) multi-call binary。用法:grep [-HhnlLoqvsriwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]... - ravi.zombie