virDomain的实例对象就是一个虚拟机,有三种方法可以查找存在的域,lookupByID,lookupByName,lookupByUUID.每种方法都要域的标识符作为参数,如果没找到则返回None,
import sys
import libvirt
conn = None
try:
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 = None
try:
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 = None
try:
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 = None
try:
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 = None
try:
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 = None
try:
conn = libvirt.open("qemu:///system")
except libvirt.libvirtError as e:
print(repr(e), file=sys.stderr)
exit(1)
dom = None
try:
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 = None
try:
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 = None
try:
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!')