为避免专业术语和概念产生歧义,将其定义如下:
Domain: 一个运行了操作系统的虚拟机
Hypervisor: 虚拟化监视层
Node:一台物理服务器,节点可以是任意类型,通常根据用途划分,例如,存储节点,集群节点和数据节点。
Storage Pool: 存储媒体的集合,例如物理硬盘,一个存储池可以划分为更小的存储单元为卷,可以被分配给一个或多个域。
Volume:存储空间,从存储池中分配,一个卷可以被一个或多个Domain使用,通常再Domain中作为虚拟硬盘
1.在libvirt中,连接是系统中每个操作和对象的基础。每个想要与libvirt进行交互的实体,无论是virsh、virt-manager还是使用libvirt库的程序,都需要首先获得与它感兴趣的主机上的libvirt守护进程的连接。连接不仅描述了代理想要与之交互的虚拟化技术(qemu、xen、uml等)的类型,而且还描述了连接到该资源所需的任何身份验证方法。
ibvirt代理必须做的第一件事是调用virInitialize函数,或Python libvirt连接函数之一,以获得virConnect类的实例。该实例将在后续操作中使用。Python libvirt模块提供了3个不同的函数来连接资源:
conn = libvirt.open(name)
conn = libvirt.openAuth(uri, auth, flags)
conn = libvirt.openReadOnly(name)
在这三种情况中,都有一个name参数,该参数实际上引用了要连接的管理程序的URI,如果URI为None,那么libvirt将应用一些试探法和探测来寻找合适的hypervisor驱动程序。虽然这对开发人员进行特别测试可能很方便,但强烈建议应用程序不要依赖探测逻辑,因为它可能随时更改。应用程序应该始终通过提供URI显式地请求需要哪个hypervisor连接。
上述三种方法之间的区别在于它们进行身份验证的方式以及它们提供的最终授权级别。
open函数将尝试打开一个连接以进行完全的读写访问。它对提供身份验证回调没有任何作用域,因此它只会在可以基于应用程序的凭证进行身份验证的连接中成功。
···
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)
conn.close()
exit(0)
···
上面的示例打开到系统qemu管理程序驱动程序的读写连接,检查以确保它是成功的,如果是,则关闭连接。
openReadOnly函数将尝试打开连接进行只读访问。这样的连接有一组受限制的方法调用,这些方法调用通常用于监视不应该允许进行更改的应用程序。与open一样,此方法没有身份验证回调的作用域,因此它依赖于凭据。
import sys
import libvirt
conn = None
try:
conn = libvirt.openReadOnly("qemu:///system")
except libvirt.libvirtError as e:
print(repr(e), file=sys.stderr)
exit(1)
conn.close()
exit(0)
openAuth函数是最灵活的,它有效地取代了前面两个函数。它接受一个额外的参数,提供一个Python列表,其中包含来自客户端应用程序的认证凭据。flags参数允许应用程序请求一个带有VIR_CONNECT_RO标志的只读连接(如果需要的话)。下面是一个简单的Python示例程序,它使用带有用户名和密码凭据的openAuth。与open一样,此方法没有身份验证回调的作用域,因此它依赖于凭据。
import sys
import libvirt
SASL_USER = "my-super-user"
SASL_PASS = "my-super-pass"
def request_cred(credentials, user_data):
for credential in credentials:
if credential[0] == libvirt.VIR_CRED_AUTHNAME:
credential[4] = SASL_USER
elif credential[0] == libvirt.VIR_CRED_PASSPHRASE:
credential[4] = SASL_PASS
return 0
auth = [[libvirt.VIR_CRED_AUTHNAME, libvirt.VIR_CRED_PASSPHRASE], request_cred, None]
conn = None
try:
conn = libvirt.openAuth('qemu+tcp://localhost/system', auth, 0)
except libvirt.libvirtError as e:
print(repr(e), file=sys.stderr)
exit(1)
conn.close()
exit(0)
要测试上述程序,必须具备以下配置:
1./etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
auth_tcp = "sasl"
2./etc/sasl2/libvirt.conf
mech_list: digest-md5
3.一个virt用户需要加入SASL数据库
$ saslpasswd2 -a libvirt virt
Password:
Again (for verification):
4.libvirtd 必须开始–listen
当不再需要连接时,必须通过调用virConnection类的close方法来释放连接。连接是引用计数的对象,因此对于每个打开的函数调用,都应该有一个对应的close方法调用。
连接被引用计数;计数显式地增加了初始值(open, openAuth等);依赖于连接保持活动状态的其他方法也会临时增加它。open函数调用应该有一个匹配的close,所有其他的引用将在相应的操作完成后被释放。在Python中,当类实例超出作用域或程序结束时,引用计数可以自动减少。
import sys
import libvirt
conn1 = libvirt.open('qemu:///system')
if conn1 == None:
print('Failed to open connection to qemu:///system', file=sys.stderr)
exit(1)
conn2 = libvirt.open('qemu:///system')
if conn2 == None:
print('Failed to open connection to qemu:///system', file=sys.stderr)
exit(1)
conn1.close()
conn2.close()
exit(0)
还要注意,每个与连接关联的其他类实例(virDomain、virNetwork等)也将持有连接上的引用。