『壹』 如何通過python創建kvm虛擬機
調用libvirt介面。可以參考下openstack中的libvirt驅動。 不過把openstack整透了也得下番功夫。
『貳』 已經獲取虛擬機的所有信息,怎麼用python提取網卡信息
KVM(Kernel-based Virtual Machine)作為一個開源的系統虛擬化模塊,已經成為虛擬機虛擬化技術的主流,在越來越多的Cloud環境中使用。為了保證Cloud環境的正常運行,需要在運維過程中對Cloud環境中的VM狀態進行監控,比如CPU,內存,Disk,Disk I/O,Network I/O等信息,可以利用這些信息及時的調整分配Cloud環境的資源,保證VM的正常運行。Libvirt是基於KVM的上層封裝,提供了操作KVM的原生層介面,可以實現對虛擬機的日常管理操作,如虛擬機的生命周期(創建,刪除,查看,管理),開機,關機,重啟,網路管理,存儲管理等。本文以查看hypervisor的instance為例,講述通過Libvirt-python模塊,查看當前HOST的KVM虛擬機常用監控信息。文章主要包括如下幾個方面的內容:
1、 Libvirt-python模塊的簡單介紹與環境安裝配置;
2、 利用Python調用API獲取 VM相關監控信息;
1. Libvirt-python模塊的簡單介紹與安裝配置
Libvirt提供一種虛擬機監控程序不可知的 API 來安全管理運行於主機上的客戶操作系統,是一種可以建立工具來管理客戶操作系統的 API。Libvirt 本身構建於一種抽象的概念之上。它為受支持的虛擬機監控程序實現的常用功能提供通用的API,適用於包括基於KVM/QEMU, Xen, LXC, OpenVZ, Virtualbox, VMware, PowerVM等多種虛擬機化技術的虛擬機。Libvirt-python是基於libvirt API的python語言綁定工具包,通過該包,可以使用python對VM進行日常管理操作和監控數據獲取。需要運行的Python監控程序可以在KVM的HOST中運行,也可以在基於KVM虛擬機化的任意環境運行,需要做的配置如下:
1) 環境准備:
安裝python 2.6及以上
安裝libvirt 1.2及以上
安裝libvirt-client 1.2及以上
安裝libvirt-python1.2及以上
以上環境如果已經在操作系統中存在並且滿足要求,不需要進行重復安裝,可以在libvirt的官方網站選擇不同的站點和適合自己操作系統的安裝包進行下載安裝。
2) 驗證安裝環境:
安裝完上述安裝包後,在命令行運行rpm -qa | grep libvirt 查看相關安裝信息是否正確如圖:
在命令行運行python命令查看python環境
在命令行運行virsh進入virsh命令行窗口
執行list –all,列出所有虛擬機,執行dommemstat domainID驗證windows虛擬機內存信息
unused代表虛機內部未使用的內存量,available代表虛機內部識別出的總內存量,那麼虛機內部的內存使用量則是(available-unused)。
如果windows虛擬機中沒有unused值,
按下一步安裝virtio-win驅動和balloon service,並且啟動balloon service
3) windows虛擬機Windows Virtio Drivers安裝。
1、下載地址,根據自己需求下載相應版本,這里以下載Stable virtio-win iso為例。
2、安裝驅動
3、安裝Balloon Services,
在python應用運行環境驗證servie,查看該VM 內存信息。
2. 利用Python調用API獲取 VM相關監控信息
2.1創建連接
Python的管理應用程序可以和域位於同一節點上,管理應用程序通過libvirt工作,以控制本地域,如下圖:
也可以運行在遠端,通過本地libvirt連接遠端libvirt,以控制本地域,該模式使用一種運行於遠程節點上的libvirtd守護進程。當在新節點上安裝libvirt時該程序會自動啟動,且可自動確定本地虛擬機監控程序並為其安裝驅動程序。該管理應用程序通過一種通用協議從本地libvirt連接到遠程libvirtd。
提供不同的連接方式,注意連接使用過後需要關閉。
from __future__ import print_function
import sys
import libvirt
# conn = libvirt.open('qemu+ssh://IP/system'
conn = libvirt.open('qemu:///system')
if conn == None:
print('Failed to open connection to qemu:///system', file=sys.stderr)
exit(1)
conn.close()
2.2 列出Domains
conn.listAllDomains(type)方法返回指定類型的domains列表,type參數可以設置以下類型
VIR_CONNECT_LIST_DOMAINS_ACTIVE
VIR_CONNECT_LIST_DOMAINS_INACTIVE
VIR_CONNECT_LIST_DOMAINS_PERSISTENT
VIR_CONNECT_LIST_DOMAINS_TRANSIENT
VIR_CONNECT_LIST_DOMAINS_RUNNING
VIR_CONNECT_LIST_DOMAINS_PAUSED
VIR_CONNECT_LIST_DOMAINS_SHUTOFF
VIR_CONNECT_LIST_DOMAINS_OTHER
VIR_CONNECT_LIST_DOMAINS_MANAGEDSAVE
VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE
VIR_CONNECT_LIST_DOMAINS_AUTOSTART
VIR_CONNECT_LIST_DOMAINS_NO_AUTOSTART
VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT
VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHO
如果設置為0,則返回所有活動和關機的domain
2.2 獲取監控數據
VM的監控信息主要是CPU使用率,內存使用率,Disk使用率,Disk I/O,Network I/O。其中,CPU的使用率,Disk I/O,Network I/O並不能直接獲取,需要經過計算獲得。
2.2.1 CPU使用率
libvirt中並不能直接獲取到虛擬機的CPU使用率,但是可以通過CPUTIME來計算出實際使用率。計算的公式為:
首先得到一個周期差:cpu_time_diff = cpuTimenow — cpuTimet seconds ago
然後根據這個差值計算實際使用率:%CPU = 100 × cpu_time_diff / ((now- seconds ago) × vcpus × 109).CPUtime可以使用domain的info函數獲得,如下:
from __future__ import print_function
import sys
import libvirt
from xml.dom import minidom
conn = libvirt.open('qemu:///system')
dom = conn.lookupByName(domName)
dominfo = dom.info()
print('The state is ' + str(dominfo[0]))
print('The max memory is ' + str(dominfo[1]))
print('The memory is ' + str(dominfo[2]))
print('The number of cpus is ' + str(dominfo[3]))
print('The cpu time is ' + str(dominfo[4]))
conn.close()
info()函數返回一個數組,下標為4的值即為CPUTime。
2.2.2 內存使用率
內存的使用情況可以函數dom.memoryStats()獲得,如下:
from __future__ import print_function
import sys
import libvirt
domName = 'Fedora22-x86_64-1'
conn = libvirt.open('qemu:///system')
if conn == None:
print('Failed to open connection to qemu:///system', file=sys.stderr)
exit(1)
dom = conn.lookupByID(5)
if dom == None:
print('Failed to find the domain '+domName, file=sys.stderr)
exit(1)
stats = dom.memoryStats()
print('memory used:')
for name in stats:
print(' '+str(stats[name])+' ('+name+')')
conn.close()
exit(0)
可以在Virsh命令行中驗證獲取的值是否正確。
2.2.3 Disk使用率
對於一個VM的DISK,在DOMAIN XML的device根據標示獲取,有關Disk部分的XML如下所示。
<devices>
<disk type='file' snapshot='external'>
<driver name="tap" type="aio" cache="default"/>
<source file='/var/lib/xen/images/fv0' startupPolicy='optional'>
<seclabel relabel='no'/>
</source>
<target dev='hda' bus='ide'/>
/*這個'hda'就是需要的參數 */
<iotune>
<total_bytes_sec>10000000</total_bytes_sec>
<read_iops_sec>400000</read_iops_sec>
<write_iops_sec>100000</write_iops_sec>
</iotune>
<boot order='2'/>
<encryption type='...'>
...
</encryption>
<shareable/>
<serial>
...
</serial>
</disk>
...
</devices>
使用函數domain.blockInfo(disk,0)獲得磁碟的總量和已使用量
2.2.4 Disk I/O
可以使用 domain. blockStats ()方法,該方法需要傳遞一個Disk的參數,這個參數可以通過XML文件取得:
<devices>
<disk type='file' snapshot='external'>
<driver name="tap" type="aio" cache="default"/>
<source file='/var/lib/xen/images/fv0' startupPolicy='optional'>
<seclabel relabel='no'/>
</source>
<target dev='hda' bus='ide'/>
/*這個'hda'就是需要的參數 */
<iotune>
<total_bytes_sec>10000000</total_bytes_sec>
<read_iops_sec>400000</read_iops_sec>
<write_iops_sec>100000</write_iops_sec>
</iotune>
<boot order='2'/>
<encryption type='...'>
...
</encryption>
<shareable/>
<serial>
...
</serial>
</disk>
...
</devices>
2.2.5 Network I/O
可以使用 domain.interfaceStats()方法,該方法需要傳遞一個虛擬網卡介面的參數,這個參數可以通過XML文件取得:
<interface type='bridge'>
<mac address='00:16:3e:74:03:53'/>
<source bridge='xenbr0'/>
<script path='vif-bridge'/>
<target dev='vif1.0 '/>
/*這個vif1.0就是需要的參數 */
</interface>
網卡的I/O值返回是一個數組,根據自己需要獲取對應的值。
3. 總結
通過對VM監控信息的獲取,可以實時的了解Cloud環境中各個VM的負載和使用情況,合理的調配計算資源,或者關閉長時間沒有使用的VM,做到Cloud資源的合理利用和運行環境的健康可靠性。