天天看點

擷取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