18

我正在寻找一种解决方案来获取使用 libvirt 在 qemu/kvm 上运行的 VM 的 ipv4 地址或其他元数据?我还研究了 ovirt 来宾代理和 qemu 来宾代理,但我想知道是否有更好/更简单的方法来获取这些数据?

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

4

5 回答 5

34

我在每个虚拟机上安装 avahi,所以他们会公布自己的地址。但是,这不是唯一可用的选项(特别是如果您的 VM 包含与 Linux 不同的内容)。所以进入virsh选项的神奇世界!

*) 首先,您需要获取 VM 网卡的 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 ~]# 
于 2013-10-02T14:55:47.697 回答
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 *

或者,更好的是,使用以下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://root@localhost/system')
for lease in conn.networkLookupByName("my_network").DHCPLeases():
    print(lease)
于 2013-10-10T20:15:00.497 回答
10

这适用于为我运行 CentOS 7 来宾的 Ubuntu 16.04 主机。

$ 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
于 2016-09-21T18:47:14.290 回答
1

一般来说,有两种选择:

  1. 为您的虚拟机管理程序安装来宾操作系统并使用特定于虚拟机管理程序的 API 来查询来宾机器的 IP
  2. 依赖本地网络上可用的信息 - 我正在使用 arp-scan

VirtualBox 或 libvirt+QEMU 的更具体信息

于 2016-04-29T15:43:49.417 回答
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             -
于 2018-11-06T15:02:26.900 回答