新建一个虚拟机后,网络上一般是通过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地址。
virsh qemu-agent-command VMNAME '{"execute":"guest-network-get-interfaces"}'
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