libvirt笔记virDomain的详解

virDomain的实例对象就是一个虚拟机,有三种方法可以查找存在的域,lookupByID,lookupByName,lookupByUUID.每种方法都要域的标识符作为参数,如果没找到则返回None,

import sys
​import libvirt
​
​conn = Nonetry:
​    conn = libvirt.open("qemu:///system")except libvirt.libvirtError as e:print(repr(e), file=sys.stderr)
​    exit(1)
​
​domainID = 6
​dom = conn.lookupByID(domainID)if dom == None:print('Failed to get the domain object', file=sys.stderr)
​
​conn.close()
​exit(0)

需要注意的是对于非活动的domain,lookupByID不适用,非活动domain的ID都为-1.

import sys
​import libvirt
​
​conn = Nonetry:
​    conn = libvirt.open("qemu:///system")except libvirt.libvirtError as e:print(repr(e), file=sys.stderr)
​    exit(1)
​
​domainName = 'someguest'
​dom = conn.lookupByName(domainName)if dom == None:print('Failed to get the domain object', file=sys.stderr)
​
​conn.close()
import sys
​import libvirt
​
​conn = Nonetry:
​    conn = libvirt.open("qemu:///system")except libvirt.libvirtError as e:print(repr(e), file=sys.stderr)
​    exit(1)
​
​domainUUID = '00311636-7767-71d2-e94a-26e7b8bad250'
​dom = conn.lookupByUUID(domainUUID)if dom ==None:
​    ​print('Failed to get the domain object', file=sys.stderr)
​
​conn.close()
​exit(0

libvirt类公开两个域列表,第一个包含运行域,而第二个包含不活动的持久域。这些列表是不重叠的、互斥的集合,尽管在查询每个集合的过程中,域总是有可能停止或开始。本节后面描述的events类提供了一种跟踪所有生命周期更改的方法,以避免这种潜在的竞争条件。
用于列出活动域的方法,返回域id列表。每个运行域都有一个正整数ID,在主机上的所有运行域中唯一标识它。列出活动域的方法listDomainsID不需要参数。如果发生错误,返回值将为None,或表示为整型的id的Python列表。

import sys
import libvirt

conn=None
try:
   conn=libvirt.open("qemu:///system")
   print ('hello world')
except libvirt.libvirtError as e:
   print(repr(e),file=sys.stderr)
   exit(1)
domainIDs=conn.listDomainsID()
if domainIDs==None:
   print('Failed to get a list of domain IDs',file=sys.stderr)
print("Active domain IDs:")
if len(domainIDs)==0:
   print(' None')
else:
   for domainID in domainIDs:
      print(' '+str(domainID))
conn.close()
exit(0)

除了正在运行的域之外,主机上还可能存储一些长期不活动的域配置。由于不活动域没有任何ID标识符,不活动域的列表将公开为名称字符串列表。如果发生错误,返回值将为None,或者返回一个由名称(字符串)填充的Python元素列表。

import sys
​import libvirt
​
​conn = Nonetry:
​    conn = libvirt.open("qemu:///system")except libvirt.libvirtError as e:print(repr(e), file=sys.stderr)
​    exit(1)
​
​domainNames = conn.listDefinedDomains()if domainNames == None:print('Failed to get a list of domain names', file=sys.stderr)
​
​domainIDs = conn.listDomainsID()if domainIDs == None:print('Failed to get a list of domain IDs', file=sys.stderr)
​
​domainNames = ""try:if len(domainIDs) != 0:for domainID in domainIDs:
​            domain = conn.lookupByID(domainID)
​            domainNames.append(domain.name)except libvirt.libvirtError as e:print(repr(e), file=sys.stderr)
​    conn.close()
​    exit(1)
​
​print("All (active and inactive domain names:")if len(domainNames) == 0:print('  None')else:for domainName in domainNames:print('  '+domainName)
​
​conn.close()
​exit(0)

列出域的方法不会直接返回virDomain对象,因为这可能会导致希望频繁查询域列表的应用程序的性能损失。然而,Python libvirt模块提供了listAllDomains方法,用于所有激活或不激活的域。它返回一个virDomain实例的Python列表,如果出现错误则返回None。当不存在持久域时,列表可以为空。
listAllDomains方法接受一个参数,该参数是指定要列出的域的筛选器的标志。如果指定的值为0,那么将列出所有域。否则,可以将下列任何或所有常量添加到一起,以创建要列出的域的筛选器。
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_SNAPSHOT

import sys
​import libvirt
​
​conn = Nonetry:
​    conn = libvirt.open("qemu:///system")except libvirt.libvirtError as e:print(repr(e), file=sys.stderr)
​    exit(1)
​
​print("All (active and inactive) domain names:")
​domains = conn.listAllDomains(0)if len(domains) != 0:for domain in domains:print('  '+domain.name())else:print('  None')
​
​conn.close()
​exit(0)

一旦获得这个域的实例就可以获得该域的信息。

import sys
import libvirt
from xml.dom import minidom
conn=None
try:
   conn=libvirt.open("qemu:///system")
   print ('hello world')
except libvirt.libvirtError as e:
   print(repr(e),file=sys.stderr)
   exit(1)
domName='centos'
dom=None
try:
   dom=conn.lookupByName(domName)
except libvirt.libvirtError as e:
   print(repr(e),file=sys.stderr)
   exit(1)
id=dom.ID()
if id==-1:
   print('The domain is not running so has no ID.')
else:
   print('The ID of the domain is'+str(id))
conn.close()
exit(0)

域的UUID可以通过UUID或uidstring方法获取。UUID方法对于Python程序并不是那么有用,因为它是一个二进制值。UUIDString方法更有用,因为它返回一个易于解析的格式化字符串值。UUID不依赖于域的运行状态,并且总是返回一个有效的UUID。

import sys
​import libvirt
​from xml.dom import minidom
​
​domName ='CentOS7'
​
​conn =Nonetry:
​    conn = libvirt.open("qemu:///system")except libvirt.libvirtError as e:
​    ​print(repr(e), file=sys.stderr)
​    exit(1)
​
​dom =Nonetry:
​    dom = conn.lookupByName(domName)except libvirt.libvirtError as e:
​    ​print(repr(e), file=sys.stderr)
​    ​exit(1)
​
​uuid = dom.UUIDString()print('The UUID of the domain is ' + uuid)
​​
​type= dom.OSType()print('The OS type of the domain is "' + type + '"')
​conn.close()
exit(0)

hasCurrentSnapshot方法返回一个布尔值,指示当前快照是否可用。此方法总是返回一个有效值,并且不依赖于域的运行状态。

​
​flag = dom.hasCurrentSnapshot()print('The value of the current snapshot flag is ' + str(flag))

hasManagedSaveImages方法返回一个布尔值,指示域是否托管保存映像。请注意,一个正在运行的域不应该有一个保存的映像,因为该映像应该在域重新启动时被删除。

flag1=dom.hasManagedSaveImage()
print('The value of the manged save images flag is'+ str(flag1))

hostname方法返回域的主机名。主机名方法高度依赖于管理程序和/或qemu-guest-agent。如果方法不能成功完成,它可能会抛出一个错误。

​name = dom.hostname()print('The hostname of the domain  is ' + str(name))

info方法返回一些关于域硬件的一般信息。托管保存映像。Python列表中应该返回8个条目,其中包括域的状态、maxmemory、内存、cpu和cpu时间。

state, maxmem, mem, cpus, cput = dom.info()print('The state is ' + str(state))print('The max memory is ' + str(maxmem))print('The memory is ' + str(mem))print('The number of cpus is ' + str(cpus))print('The cpu time is ' + str(cput))

isActive方法返回一个boolean来确定一个域是否正在运行。

flag = dom.isActive()if flag == True:print('The domain is active.')else:print('The domain is not active.')

isPersistent方法返回一个布尔标志,指示域是否持久化(域将在重新引导后持久化)。

flag = Nonetry:
​    flag = dom.isPersistent()except libvirt.libvirtError as e:print(repr(e), file=sys.stderr)
​    conn.close()
​    exit(1)
​
​if flag == 1:print('The domain is persistent.')elif flag == 0:print('The domain is not persistent.')

isUpdated()方法判断一个域自创建后是否已经更新。

flag = Nonetry:
​    flag = dom.isUpdated()except libvirt.libvirtError as e:print(repr(e), file=sys.stderr)
​    conn.close()
​    exit(1)
​
​if flag == 1:print('The domain is updated.')elif flag == 0:print('The domain is not updated.')

maxMemory方法返回域可以获得的最大内存,也可以从info方法获得。

mem = dom.maxMemory()if mem > 0:print('The max memory for domain is ' + str(mem) + 'MB')else:print('There was an error.')

maxVcpus方法返回分配给域的最大虚拟cpu数量。同样的信息可以通过info方法获取。

cpus = dom.maxVcpus()if cpus != -1:print('The max Vcpus for domain is ' + str(cpus))else:print('There was an error.')

state方法返回域的状态

state, reason = dom.state()
​
​if state == libvirt.VIR_DOMAIN_NOSTATE:print('The state is VIR_DOMAIN_NOSTATE')elif state == libvirt.VIR_DOMAIN_RUNNING:print('The state is VIR_DOMAIN_RUNNING')elif state == libvirt.VIR_DOMAIN_BLOCKED:print('The state is VIR_DOMAIN_BLOCKED')elif state == libvirt.VIR_DOMAIN_PAUSED:print('The state is VIR_DOMAIN_PAUSED')elif state == libvirt.VIR_DOMAIN_SHUTDOWN:print('The state is VIR_DOMAIN_SHUTDOWN')elif state == libvirt.VIR_DOMAIN_SHUTOFF:print('The state is VIR_DOMAIN_SHUTOFF')elif state == libvirt.VIR_DOMAIN_CRASHED:print('The state is VIR_DOMAIN_CRASHED')elif state == libvirt.VIR_DOMAIN_PMSUSPENDED:print('The state is VIR_DOMAIN_PMSUSPENDED')else:print(' The state is unknown.')print('The reason code is ' + str(reason))

getTime方法可以获取domain的当前时间戳,与Python time.struct_time 函数获得的返回值一样。

# Ensure the domain is running first:if dom.state() == libvirt.VIR_DOMAIN_RUNNING:
​    struct = dom.getTime()
​    timestamp = time.ctime(float(struct['seconds']))print('The domain current time is ' + timestamp)else:print('The domain is not running, cannot get time information!')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值