libvirt:从guest中获取ipv4地址

Joc*_*hen 17 kvm qemu libvirt

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

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

小智 33

我在每个VM上安装avahi,因此他们将宣传自己的地址.但是,这不是唯一可用的选项(特别是如果您的VM包含与Linux不同的内容).所以进入virsh选项的神奇世界!

*)首先,您需要获取VM的NIC的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 ~]#
Run Code Online (Sandbox Code Playgroud)

*)现在让我们来看看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 ~]# 
Run Code Online (Sandbox Code Playgroud)

*)现在让我们将所有东西粘合在一起(并添加一些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 ~]# 
Run Code Online (Sandbox Code Playgroud)

  • 请记住,arp表可能是陈旧的或缺少条目.您可能希望在调用arp命令之前ping子网. (3认同)

gon*_*eri 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 *
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,使用以下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
Run Code Online (Sandbox Code Playgroud)

或者在Python中:

import libvirt
conn = libvirt.open('qemu+ssh://root@localhost/system')
for lease in conn.networkLookupByName("my_network").DHCPLeases():
    print(lease)
Run Code Online (Sandbox Code Playgroud)

  • 现在有一个新的补充:domifaddr(http://libvirt.org/git/?p=libvirt.git;a=commit;h=2f36e6944e6eb56a00e19fcd85ec8513461597c9) (6认同)

小智 9

这适用于运行CentOS 7 guest的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
Run Code Online (Sandbox Code Playgroud)

  • 使用与外部DHCP的桥接时,这不显示任何地址. (3认同)