libvirt:从虚拟机中获取IPv4地址

18

我正在寻找一种解决方案,可以获取在qemu/kvm和libvirt上运行的虚拟机的IPv4地址或其他元数据。我也看过ovirt guest agent和qemu guest agent,但我想知道是否有更好/更容易的方法来获取这些数据?

基本上,我有几个运行KVM的主机,对于每个特定的私有IP地址,我需要能够知道哪个虚拟机正在使用该IP地址(由DHCP服务器提供)。

5个回答

34

我正在每个虚拟机上安装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 ~]# 

这是一个不错的解决方案,但在busybox中可能无法正常工作。kvm # for mac in 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
3
请记住,ARP表可能过时或缺少条目。在调用ARP命令之前,您可能需要对子网进行ping扫描。 - Trevor Merrifield

22

你可以直接阅读租约文件:

# 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)

6
现在有一个新的添加:domifaddr (http://libvirt.org/git/?p=libvirt.git;a=commit;h=2f36e6944e6eb56a00e19fcd85ec8513461597c9)。 - Nehal J Wani

10

对于我而言,在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
使用外部DHCP桥接时,未显示任何地址。 - Xdg

1

一般有两种选择:

  1. 在客户操作系统中安装虚拟机代理程序,并使用特定于虚拟化管理程序的API查询客户机的IP
  2. 依赖于本地网络上可用的信息 - 我使用arp-scan进行扫描

有关VirtualBox或libvirt+QEMU的更多具体信息


1

在我的情况下,这些建议都没有起作用。这是我如何获得客户端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             -

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接