天天看点

获取KVM虚拟机IP地址

新建一个虚拟机后,网络上一般是通过arp获取MAC与IP映射关系自动获取虚拟机IP的方法,这种方法效率低,arp表没有记录时要挨个ping获取ip。

本篇文章使用qemu-guest-agent获取虚拟机自动分配的ip

1.qemu-guest-agent是什么

QEMU Guest Agent是运行在虚拟机内部的一个守护程序(qemu-guest-agent.service),用它来辅助Hypervisor实现对Guest的管理。QEMU为宿主机和虚拟机提供了一个数据通道(channel),这个通道的两端分别是在虚拟机内看到的串口和在宿主机上看到的unix socket文件。宿主机与虚拟机内的qga通讯就扩展了对虚拟机的控制能力,例如在宿主机上获取虚拟机的ip地址等。

libvrit提供了专门的 virDomainQemuAgentCommand API(对应virsh qemu-agent-command命令)来和qemu-guest-agent通讯,另外有些libvirt内置api也可以支持qga,例如reboot、shutdown等。

2.具体操作

2.1 . 首先在虚拟机模板镜像中安装qemu-guest-agent,以Ubuntu16为例。

关于模板镜像的制作可以看我另一篇文章定制化KVM Ubuntu虚拟机镜像

sudo apt install qemu-guest-agent
           

2.2. 编辑虚拟机xml配置文件,在devices中添加

<channel type="unix">
  <source mode="bind"/>
  <target type="virtio" name="org.qemu.guest_agent.0"/>
</channel>
           

2.3. 重新启动虚拟机,然后终端执行以下命令以获取IP地址。

3.使用python获取虚拟机ip

关于python调用libvirt接口操作虚拟机请看我的另一篇文章通过python调用libivirt接口管理KVM虚拟机

下面直接附上获取虚拟机IP代码

import sys
import libvirt
conn = libvirt.open('qemu:///system')
if conn == None:
    print('Failed to open connection to qemu:///system', file=sys.stderr)
    exit(1)
domainName = 'input your name'
dom = conn.lookupByName(domainName)
if dom == None:
    print('Failed to get the domain object', file=sys.stderr)
ifaces = dom.interfaceAddresses(libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_AGENT, 0)
print("The interface IP addresses:")
print(ifaces)
for (name, val) in ifaces.items():
    if name=='lo':
        continue
    if val['addrs']:
        for ipaddr in val['addrs']:
        	#获取ipv4地址
            if ipaddr['type'] == libvirt.VIR_IP_ADDR_TYPE_IPV4:
                print(ipaddr['addr'] + " VIR_IP_ADDR_TYPE_IPV4")
            #获取ipv6地址
            elif ipaddr['type'] == libvirt.VIR_IP_ADDR_TYPE_IPV6:
            	print(ipaddr['addr'] + " VIR_IP_ADDR_TYPE_IPV6")
conn.close()
exit(0)

#一个ifaces例子
{'lo': {'addrs': [{'addr': '127.0.0.1', 'prefix': 8, 'type': 0}, {'addr': '::1', 'prefix': 128, 'type': 1}],
        'hwaddr': '00:00:00:00:00:00'},
 'ens3': {'addrs': [{'addr': '192.168.175.235', 'prefix': 24, 'type': 0},{'addr': 'fe80::aeb:bf82:6c38:248b', 'prefix': 64,'type': 1}],
          'hwaddr': '52:54:00:1d:61:ab'}}

           

参考链接:

https://serverfault.com/questions/672253/how-to-configure-and-use-qemu-guest-agent-in-ubuntu-12-04-my-main-aim-is-to-get

https://cloud.tencent.com/developer/article/1162113

https://wiki.libvirt.org/page/Qemu_guest_agent