已经获取虚拟机的所有信息,怎么用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资源的合理利用和运行环境的健康可靠性。
温馨提示:内容为网友见解,仅供参考
无其他回答

用Python 写爬虫时应该注意哪些坑
4. 速度很重要,放ec2或者国内的云上跑,很重要的指标是你每一亿网页爬下来成本多少,爬的时候比如4核一个虚拟机节点,你能inbound贷款用足100mbps吗。5. beautifulsoup太慢,全网的爬,encoding的分析也要要快,c实现的chardet还行 最关键的,永远是爬下来以后的信息的提取、分析、使用,就是另外一个...

纯干货!python 在运维中的应用 (一):批量 ssh\/sftp
不能直接传目录,那换个思路,遍历路径中的目录和文件,先创建目录再传文件就能达到一样的效果了。在paramiko的sftp中sftp.listdir_attr()方法可以获取远程路径中的文件、目录信息。那么我们可以写一个递归来遍历远程路径中的所有文件和目录(传入一个列表是为了接收递归返回的值)。python自带的os模块中的o...

VMware虚拟机 CentOS7并行环境安装
在Linux CentOS7中,配置网络环境的第一步是获取网络设备信息,使用`ifconfig`命令找到ens33设备的网络地址和子网掩码。编辑网络设备配置文件`\/etc\/sysconfig\/network-scripts\/ifcfg-ens33`,更新网络参数,如IP地址、子网掩码和网关,以及DNS服务器地址。执行`systemctl restart network`重启网络服务,以应...

Linux服务器如何查看GPU信息
[python] view plain copy lspci | grep -i vga 使用nvidia GPU可以:[python] view plain copy lspci | grep -i nvidia 前边的序号 "00:0f.0"是显卡的代号(这里是用的虚拟机);查看指定显卡的详细信息用以下指令:[python] view plain copy lspci -v -s 00:0f.0 Linux查看Nvidia显卡信息...

使用Python自动给Esxi虚拟机打快照
首先,获取虚拟机ID、名称与文件信息等。接着,根据ID获取虚拟机的快照ID,用于旧快照ID的记录。然后,创建新的快照,删除旧快照。最后,打印操作记录并发送给管理员。操作前需提前登录ESXi获取ID号。对于多台虚拟机,需添加相应步骤。定义发送邮件的函数,传入当前日期与操作日志。输入IP信息、账户密码,...

学python必须装虚拟机吗
所以现在好的方法是:使用pnux虚拟机,这样可以随时和windows系统进行切换,在网上查资料,qq聊天,做笔记这些都在windows上操作,在pnux上跑python程序。如果是早些年,可能不容易实现,但是现在可以虚拟化技术来实现,现在主流的虚拟化产品有三种,这里我就介绍下VMware。vmware这款软件跑在本地的操作系统...

一篇文章告诉你python爬虫原理,知其然更知其所以然,从此爬虫无忧
Python虚拟机几乎能在所有作业系统中运行,通过工具如py2exe、PyPy、PyInstaller可将Python源代码转换为可独立运行的程序。爬虫教程通常会从页面提取数据、介绍HTTP协议、讲解模拟登录和反爬虫策略,最后提供简单Scrapy教程。这些教程往往忽略了爬虫的核心逻辑抽象,即如何遍历网页。实际上,只需要使用两个队列和...

OpenStack虚拟机如何获取metadata
OpenStack虚拟机通过访问169.254.169.254获取诸如uuid、name等信息,这个过程涉及三次转发:首先到DHCP地址,再由haproxy转发到一个本地socket文件,最后neutron-metadata-agent根据network id和IP信息确定虚拟机uuid。Nova Metadata服务通过uuid查询metadata信息,并在转发前验证secret以确保安全性。在虚拟机外部...

教你WEditor(APP元素定位)怎么用
配置环境接下来,打开一个新的维度。在终端中执行 python -m uiautomator2 init,这个命令会在你的虚拟机中悄悄安装一个关键插件,为 Weditor 的顺畅运行做好准备。连接设备获取设备的实时信息,通过 adb devices,确保你的设备已连接。然后,激动人心的时刻来了,启动定位之旅:在终端中输入 python -m...

vSphere 通过 python API接口创建虚拟机及修改配置
背景:自动化创建虚拟机,提高系统工程师效率。利用vSphere接口与Python API结合,实现自动部署和配置。通过vsphere-automation-sdk-python创建虚拟机,pyvmomi工具用于添加磁盘、开启虚拟机和获取IP地址。系统环境:Windows操作系统,Python版本3.8。脚本执行流程:1. 安装Git,为后续脚本开发和依赖管理做好准备...

相似回答