首页 文章

libvirt:从guest中获取ipv4地址

提问于
浏览
16

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

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

5 回答

  • 31

    我在每个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 ~]#
    

    *)现在让我们来看看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 ~]#
    
  • 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)
    
  • 1

    这适用于运行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
    
  • 8

    一般来说,有两种选择:

    • 将guest虚拟机管理程序的guest虚拟机代理安装到guest虚拟机操作系统中,并使用特定于虚拟机管理程序的API查询来宾计算机上的IP

    • 依赖于本地网络上的可用信息 - 我正在使用arp-scan

    more specific info for VirtualBox or 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             -
    

相关问题