数据人与超自然意识 发表于 2024-8-10 03:42:58

Libvirt学习笔记

 一、Libvirt简介

        libvirt是一个用于假造化管理的库,它提供了一组API,可以用于管理各种假造化技术,例如KVM、QEMU、Xen和LXC等。libvirt库使得管理假造化环境变得更加容易,它可以用于创建、配置、启动、停止、停息和恢复假造机,以及管理假造机的存储和网络等方面。
        在利用libvirt库时,需要注意一些基本概念,例如连接(connection)、域(domain)、存储池(storage pool)、网络(network)等。连接是与假造化环境的通信渠道,域是指假造机实例,存储池是指存储假造机镜像的地方,网络是指假造机利用的网络环境。
 二、Libvirt利用手册

1、建立连接:libvirt.open(uri)

         该函数用于建立假造环境的链接。该函数的有一个参数uri,来确定建立连接的对象。
        URI是一种用于标识和连接到假造化环境的统一资源标识符(Uniform Resource Identifier)。URI由三个部分构成:
        ①scheme:标识利用的假造化技术,例如qemu、xen、lxc等。
        ②hostname:指定连接的目标主机的名称或IP地址。
        ③path:标识假造化环境的位置或范例。
        如,利用QEMU/KVM作为假造化技术,连接到本地体系上的默认假造化环境,URI为qemu:///system。假如要连接到远程主机,可以利用主机名部分指定远程主机的名称或IP地址,如利用qemu+ssh://user@remotehost/system可以连接到远程主机上的假造化环境。
        libvirt.open(uri) 将返回一个 virConnect 对象,它包含了与假造化环境举行通信所需的方法和属性。例如,可以利用 virConnect.listDomains() 方法列出假造化环境中存在的域(假造机实例)。
conn = libvirt.open('qemu:///system')
domains = conn.listAllDomains() 2、域(假造机实例)的各个属性

        在建立连接,并通过 listDomains() 获取连接中的所有假造机实例后,我们可以通过多种方法获取假造机实例的相干信息。
        以下列出了一些常用的属性:
for domain in domains:

# 虚拟机实例的信息
    print(domain.name())         # 虚拟机名称
    print(domain.ID())             # 虚拟机ID
    print(domain.state())          # 虚拟机状态,返回一个二元组:表示状态码和原因码
    print(domain.UUIDString())   # 虚拟机UUID,唯一标识符
    print(domain.info())         # 虚拟机详细信息,返回一个元组,包括了状态、最近一次启动时间、内存使用情况、CPU使用情况等
    print(domain.XMLDesc())      # 返回虚拟机实例的XML描述,包括虚拟机的配置信息和设备信息等

# 对虚拟机实例的操作
    domain.create()                # 启动虚拟机实例
    domain.shutdown()            # 关闭虚拟机实例
    domain.destroy()               # 销毁虚拟机实例
    domain.reboot()                # 重启虚拟机实例
    domain.suspend()               # 暂停虚拟机实例
    domain.resume()                # 恢复暂停的虚拟机实例         此中,domain.info() 返回的元组中:
        ① info :state 表示假造机实例的状态。可以取整数0,1,2,3,4,5,6。
分别表示0:NOSTATE(无状态),1:RUNNING(正在运行),2:BLOCKED(阻塞),3:PAUSED(停息),4:SHUTDOWN(正在关闭),5:SHUTOFF(已经关闭),6:CRASHED(崩溃)。
        ② info :maxMem 表示假造机实例可以利用的最大内存。
        ③ info :memory 表示目前可利用的内存。
        ④ info :nrVirtCpu 表示假造机实例的假造CPU数量。
        ⑤ info :cpuTime 表示假造机实例在假造CPU上运行的时间。

3、对指定假造机举行检察或操作

        重要用到了 conn.lookupByName(domainName)  这个函数。该函数可以通过假造机实例的名称查找并返回 virDomain 对象,具体来说,它会在当前连接的假造化环境中查找名称与 domainName 相同的假造机实例,并返回一个 virDomain 对象,用于对该假造机实例举行操作。
        同理,也可以用 domain 的其他属性来查找,如 lookupByID(domainID) 、 lookupByUUIDString(domainUUID) 等。
        找到指定假造机后,通过上面讲到的对假造机实例的操作方法举行操作。
        示例:
# 查找指定虚拟机(通过名称查找)
vm = conn.lookupByName(domain_Name)

# 开启虚拟机
if not vm.isActive():
    vm.create()

# 关闭虚拟机
if vm.isActive():
    vm.shutdown()

# 暂停虚拟机
if vm.isActive():
    vm.suspend()

# 继续运行虚拟机
if vm.state() == libvirt.VIR_DOMAIN_PAUSED:
    vm.resume()
4、监视假造机网络状态

4.1、判断网络状态

        这里利用paramiko库建立主机与远程假造机的SSH连接,通过是否可以或许连接成功,来判断假造机的网络状态是否正常。
        创建一个SSH客户端连接对象。这个对象可以用来连接到远程主机并实行命令。
client = paramiko.SSHClient()         设置客户端连接对象的主秘密钥计谋。在默认环境下,当客户端连接到远程主机时,paramiko会检查本地是否存在该主机的密钥,假如不存在则会引发一个警告。paramiko.AutoAddPolicy() 是一种密钥计谋,它会自动接受远程主机的密钥,而不会引发警告。
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())         利用指定的参数连接到远程主机。hostname 参数指定要连接的远程主机的IP地址或域名, username 参数指定登录远程主机时利用的用户名, password 参数指定登录远程主机时利用的密码。这个函数会实验连接远程主机并举行身份验证,假如验证成功则会建立一个SSH会话,并返回一个新的通道(channel)对象,可以利用这个对象实行远程命令或传输文件等操作。
client.connect(hostname='192.168.43.61', username='root002', password='*******') 4.2、超时处置惩罚 

        假如connect函数实行成功,说明假造机网络状态良好,假如connect函数实行失败,说明假造机网络状态出现题目。
        由于假如网络出现异常,connect函数会实行很长时间,我们将这种环境直接视为网络异常。
        关于 connect 函数实行时间长的题目,可以通过signal库处置惩罚,即超出一定时间,引发TimeoutError异常,返回网络错误信息。
def run_with_timeout(func, timeout):
    def _handle_timeout(signum, frame):
      raise TimeoutError("Function call timed out")

    # Set the signal handler and alarm
    signal.signal(signal.SIGALRM, _handle_timeout)
    signal.alarm(timeout)
    try:
      # Run the function and return the result
      result = func()
    finally:
      # Cancel the alarm and reset the signal handler
      signal.alarm(0)
      signal.signal(signal.SIGALRM, signal.SIG_DFL)
    return result         参数func是一个函数对象,它表示要运行的函数;参数timeout表示函数运行的最长时间(以秒为单位)。
        在函数内部,首先定义了一个名为_handle_timeout的内部函数,它是一个信号处置惩罚函数,用于在函数运行超时时引发TimeoutError异常。
        利用signal.signal()函数设置了一个信号处置惩罚步伐,用于在超时时调用_handle_timeout函数。signal.SIGALRM表示设置的是闹钟信号,_handle_timeout是信号处置惩罚步伐的回调函数。
        然后,利用signal.alarm()函数设置一个定时器,用于在timeout秒后发送一个闹钟信号。假如函数在这个时间内没有完成运行,就会触发闹钟信号,从而引发TimeoutError异常。
        利用try-finally语句运行函数func。假如函数在规定时间内完成运行,则取消定时器并返回函数的返回值;否则,闹钟信号会引发 TimeoutError 异常。在这种环境下,finally块中的代码会取消定时器并重置信号处置惩罚步伐,以确保步伐的正确性并制止影响后续的代码实行。
        

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Libvirt学习笔记