ToB企服应用市场:ToB评测及商务社交产业平台

标题: Libvirt学习笔记 [打印本页]

作者: 数据人与超自然意识    时间: 2024-8-10 03:42
标题: 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() 方法列出假造化环境中存在的域(假造机实例)。
  1. conn = libvirt.open('qemu:///system')
  2. domains = conn.listAllDomains()
复制代码
2、域(假造机实例)的各个属性

        在建立连接,并通过 listDomains() 获取连接中的所有假造机实例后,我们可以通过多种方法获取假造机实例的相干信息。
        以下列出了一些常用的属性:
  1. for domain in domains:
  2. # 虚拟机实例的信息
  3.     print(domain.name())           # 虚拟机名称
  4.     print(domain.ID())             # 虚拟机ID
  5.     print(domain.state())          # 虚拟机状态,返回一个二元组:[a,b]表示状态码和原因码
  6.     print(domain.UUIDString())     # 虚拟机UUID,唯一标识符
  7.     print(domain.info())           # 虚拟机详细信息,返回一个元组,包括了状态、最近一次启动时间、内存使用情况、CPU使用情况等
  8.     print(domain.XMLDesc())        # 返回虚拟机实例的XML描述,包括虚拟机的配置信息和设备信息等
  9. # 对虚拟机实例的操作
  10.     domain.create()                # 启动虚拟机实例
  11.     domain.shutdown()              # 关闭虚拟机实例
  12.     domain.destroy()               # 销毁虚拟机实例
  13.     domain.reboot()                # 重启虚拟机实例
  14.     domain.suspend()               # 暂停虚拟机实例
  15.     domain.resume()                # 恢复暂停的虚拟机实例
复制代码
        此中,domain.info() 返回的元组中:
        ① info[0] :state 表示假造机实例的状态。可以取整数0,1,2,3,4,5,6。
分别表示0:NOSTATE(无状态),1:RUNNING(正在运行),2:BLOCKED(阻塞),3:PAUSED(停息),4:SHUTDOWN(正在关闭),5:SHUTOFF(已经关闭),6:CRASHED(崩溃)。
        ② info[1] :maxMem 表示假造机实例可以利用的最大内存。
        ③ info[2] :memory 表示目前可利用的内存。
        ④ info[3] :nrVirtCpu 表示假造机实例的假造CPU数量。
        ⑤ info[4] :cpuTime 表示假造机实例在假造CPU上运行的时间。

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

        重要用到了 conn.lookupByName(domainName)  这个函数。该函数可以通过假造机实例的名称查找并返回 virDomain 对象,具体来说,它会在当前连接的假造化环境中查找名称与 domainName 相同的假造机实例,并返回一个 virDomain 对象,用于对该假造机实例举行操作。
        同理,也可以用 domain 的其他属性来查找,如 lookupByID(domainID) 、 lookupByUUIDString(domainUUID) 等。
        找到指定假造机后,通过上面讲到的对假造机实例的操作方法举行操作。
        示例:
  1. # 查找指定虚拟机(通过名称查找)
  2. vm = conn.lookupByName(domain_Name)
  3. # 开启虚拟机
  4. if not vm.isActive():
  5.     vm.create()
  6. # 关闭虚拟机
  7. if vm.isActive():
  8.     vm.shutdown()
  9. # 暂停虚拟机
  10. if vm.isActive():
  11.     vm.suspend()
  12. # 继续运行虚拟机
  13. if vm.state()[0] == libvirt.VIR_DOMAIN_PAUSED:
  14.     vm.resume()
复制代码
4、监视假造机网络状态

4.1、判断网络状态

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

        假如connect函数实行成功,说明假造机网络状态良好,假如connect函数实行失败,说明假造机网络状态出现题目。
        由于假如网络出现异常,connect函数会实行很长时间,我们将这种环境直接视为网络异常。
        关于 connect 函数实行时间长的题目,可以通过signal库处置惩罚,即超出一定时间,引发TimeoutError异常,返回网络错误信息。
  1. def run_with_timeout(func, timeout):
  2.     def _handle_timeout(signum, frame):
  3.         raise TimeoutError("Function call timed out")
  4.     # Set the signal handler and alarm
  5.     signal.signal(signal.SIGALRM, _handle_timeout)
  6.     signal.alarm(timeout)
  7.     try:
  8.         # Run the function and return the result
  9.         result = func()
  10.     finally:
  11.         # Cancel the alarm and reset the signal handler
  12.         signal.alarm(0)
  13.         signal.signal(signal.SIGALRM, signal.SIG_DFL)
  14.     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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4