利博伟特软件热升级方法及设备与流程

文档序号:11949616阅读:246来源:国知局
利博伟特软件热升级方法及设备与流程

本申请涉及通信及计算机领域,尤其涉及一种利博伟特(libvirt)软件热升级方法及设备。



背景技术:

随着互联网技术的发展,虚拟化技术已经得到了越来越广泛的应用。libvirt软件是一款应用较为广泛的虚拟化软件,用于管理虚拟机和虚拟化功能,如虚拟机创建/关闭,虚拟机热迁移,VCPU(Virtual Central Processing Unit,虚拟处理器)热插拔,磁盘热插拔等。libvirt包含一个守护进程libvirtd,在KVM(Kernel-based Virtual Machine,基于内核的虚拟机)虚拟化环境下,libvirt的相关功能都需要通过libvirtd进程来实现,因此在libvirt软件的使用过程中,需要保证libvirtd进程一直保持运行状态。

在对libvirt软件进行版本升级时,由于原来运行的利博伟德(libvirtd)进程是基于旧版本的软件代码,在完成新版本的软件安装后,libvirtd进程无法在运行状态下直接调用新版本的软件代码。目前采用的方式是,在安装完新版本的软件后,重启libvirtd进程,使得libvirtd进程能够基于新版本的软件代码运行,从而完成libvirt软件的升级。但是,上述方式必然导致libvirtd进程停止运行一段时间,从而造成libvirt软件的相关功能在该段时间内不可用,例如无法创建虚拟机等。

综上所述,现有的libvirt软件升级方法会造成libvirt软件的相关功能在一定时间内中断。



技术实现要素:

本申请的目的是提供一种libvirt软件热升级方法及设备,解决目前存 在的libvirt软件的相关功能会在升级过程中中断的问题。

有鉴于此,本申请提供一种libvirt软件热升级方法,所述方法包括:

完成新版本的libvirt软件的安装;

将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程,其中,所述第一libvirtd进程基于旧版本的libvirt软件运行,所述第二libvirtd进程基于所述新版本的libvirt软件运行;

启动所述第二libvirtd进程,建立所述第二libvirtd进程与机器虚拟器(QEMU)进程的连接;

退出所述第一libvirtd进程。

进一步地,在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前,还包括:

阻塞QEMU进程发往libvirtd进程的第一事件消息,其中,所述第一事件消息包括在虚拟机状态改变时由QEMU进程发送给libvirtd进程的事件消息;以及

在退出所述第一libvirtd进程之后,还包括:

取消对QEMU进程发往libvirtd进程的第一事件消息的阻塞。

进一步地,所述阻塞QEMU进程发往当前运行的第一libvirtd进程的第一事件消息,包括:

由当前运行的所述第一libvirtd进程向所述QEMU进程发送第一命令,所述QEMU进程根据所述第一命令中止向libvirtd进程发送所述第一事件消息;

取消对QEMU进程发往libvirtd进程的第一事件消息的阻塞,包括:

由当前运行的所述第二libvirtd进程向所述QEMU进程发送第二命令,所述QEMU进程根据所述第二命令恢复向libvirtd进程发送所述第一事件消息。

进一步地,启动所述第二libvirtd进程,包括:

启动所述第二libvirtd进程时,所述第二libvirtd进程创建一个对应于所述第二libvirtd进程的连接路径,其中,所述对应于所述第二libvirtd进程连接路径用于建立客户端与所述第二libvirtd进程的连接;

退出所述第一libvirtd进程之前,还包括:

客户端在所述第二libvirtd进程启动后,根据libvirtd进程的连接路径的创建时间,选择对应于所述第二libvirtd进程的连接路径与所述第二libvirtd进程建立连接。

进一步地,在启动所述第二libvirtd进程之前,还包括:

获取所述第一libvirtd进程在第一时间段内创建新虚拟机所新产生的虚拟机状态信息,并将新产生的虚拟机状态信息添加至所述第二libvirtd进程的虚拟机状态信息内,其中,所述第一时间段为将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程至启动所述第二libvirtd进程之间的时间区间。

进一步地,获取所述第一libvirtd进程在第一时间段内创建新虚拟机所新产生的虚拟机状态信息,并将新产生的虚拟机状态信息添加至所述第二libvirtd进程的虚拟机状态信息内,包括:

在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前,启动监听程序,该监听程序与所述第一libvirtd进程建立连接;

所述监听程序获取由所述第一libvirtd进程在所述第一时间段内发出的第二事件消息,其中,所述第二事件消息指向所述第一libvirtd进程创建新虚拟机所新产生的虚拟机状态信息;

所述监听程序建立与所述第二libvirtd进程的连接,并根据所述第二事件消息向所述第二libvirtd进程添加所述新产生的虚拟机状态信息。

进一步地,所述监听程序建立与所述第二libvirtd进程的连接,并向所述根据所述第二事件消息向所述第二libvirtd进程添加所述新产生的虚拟机状态信息,包括:

所述监听程序建立与所述第二libvirtd进程的连接;

所述监听程序将保存有所述第一libvirtd进程创建新虚拟机所新产生的虚拟机状态信息的状态文件拷贝至所述第二libvirtd进程对应的虚拟机状态文件夹中;

所述监听程序通过所述连接调用所述第二libvirtd进程的导入接口, 所述导入接口根据所述第二事件消息,将所述状态文件中将所述新产生的虚拟机状态信息导入至所述第二libvirtd进程。

进一步地,启动所述第二libvirtd进程之后,所述监听程序退出。

进一步地,所述监听程序与所述第一libvirtd进程的连接为只读连接;

所述监听程序退出,包括:

所述第一libvirtd进程检查自身作为服务器端的连接,当确定当前仅存在一个客户端与所述第一libvirtd进程建立连接并且该连接是只读连接时,则指示所述监听程序退出。

进一步地,退出所述第一libvirtd进程,包括:

所述第一libvirtd进程检查自身作为服务器端的连接,当确定当前不存在客户端与所述第一libvirtd进程建立有连接时,则退出所述第一libvirtd进程。

进一步地,所述第一libvirtd进程检查自身作为服务器端的连接之后,还包括:

当确定当前存在客户端与所述第一libvirtd进程建立有连接时,则第一libvirtd进程在满足预设条件后重新检查自身作为服务器端的连接,直至确定当前不存在客户端与所述第一libvirtd进程建立有连接时,退出所述第一libvirtd进程。

进一步地,所述预设条件包括:

有新的客户端与所述第一libvirtd进程建立或者断开连接;或

经过设定的时间间隔。

根据本申请的另一方面,还提供了一种libvirt软件热升级设备,所述设备包括:

第一装置,用于完成新版本的libvirt软件的安装;

第二装置,用于将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程,其中,所述第一libvirtd进程基于旧版本的libvirt软件运行,所述第二libvirtd进程基于所述新版本的libvirt软件运行;

第三装置,用于启动所述第二libvirtd进程,建立所述第二libvirtd进程与QEMU进程的连接;

第四装置,用于退出所述第一libvirtd进程。

进一步地,所述设备还包括:

第五装置,用于在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前,阻塞QEMU进程发往libvirtd进程的第一事件消息,其中,所述第一事件消息包括在虚拟机状态信息改变时由QEMU进程发送给libvirtd进程的事件消息;以及

用于在退出所述第一libvirtd进程之后,取消对QEMU进程发往libvirtd进程的第一事件消息的阻塞。

进一步地,所述第五装置用于:

在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前,指示当前运行的所述第一libvirtd进程向所述QEMU进程发送第一命令,所述QEMU进程根据所述第一命令中止向libvirtd进程发送所述第一事件消息;以及

在退出所述第一libvirtd进程之后,指示当前运行的所述第二libvirtd进程向所述QEMU进程发送第二命令,所述QEMU进程根据所述第二命令恢复向第二libvirtd进程发送所述第一事件消息。

进一步地,所述第三装置,用于:

启动所述第二libvirtd进程时,所述第二libvirtd进程建一个对应于所述第二libvirtd进程的连接路径,其中,所述对应于所述第二libvirtd进程连接路径用于建立客户端与所述第二libvirtd进程的连接;

所述设备还包括:

第六装置,用于在退出所述第一libvirtd进程之前,指示客户端在所述第二libvirtd进程启动后,根据libvirtd进程的连接路径的创建时间,选择对应于所述第二libvirtd进程的连接路径与所述第二libvirtd进程建立连接。

进一步地,所述设备还包括:

第七装置,用于在启动所述第二libvirtd进程之前,获取所述第一libvirtd进程在第一时间段内创建新虚拟机所新产生的虚拟机状态信息,并将新产生的虚拟机状态信息添加至所述第二libvirtd进程的虚拟机状态信 息内,其中,所述第一时间段为将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程至启动所述第二libvirtd进程之间的时间区间。

进一步地,所述第七装置包括:

第七一模块,用于在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前启动一监听程序,该监听程序与所述第一libvirtd进程建立连接;

第七二模块,用于控制所述监听程序获取由所述第一libvirtd进程在所述第一时间段内发出的第二事件消息,其中,所述第二事件消息指向所述第一libvirtd进程创建新虚拟机所新产生的虚拟机状态信息;

第七三模块,用于控制所述监听程序建立与所述第二libvirtd进程的连接,并根据所述第二事件消息向所述第二libvirtd进程添加所述新产生的虚拟机状态信息。

进一步地,所述第七三模块,包括:

第七三一单元,用于控制所述监听程序建立与所述第二libvirtd进程的连接;

第七三二单元,用于控制所述监听程序将保存有所述第一libvirtd进程创建新虚拟机所新产生的虚拟机状态信息的状态文件拷贝至所述第二libvirtd进程对应的虚拟机状态文件夹中;

第七三三单元,用于控制所述监听程序通过所述连接调用所述第二libvirtd进程的导入接口,及控制所述导入接口根据所述第二事件消息,将所述状态文件中将所述新产生的虚拟机状态信息导入至所述第二libvirtd进程。

进一步地,所述设备还包括第八装置,用于在启动所述第二libvirtd进程之后,指示所述监听程序退出。

进一步地,所述监听程序与所述第一libvirtd进程的连接为只读连接;

所述第八装置,用于在启动所述第二libvirtd进程之后,指示所述第一libvirtd进程检查自身作为服务器端的连接,当确定当前仅存在一个客户端与所述第一libvirtd进程建立连接并且该连接是只读连接时,则指示 所述监听程序退出。

进一步地,所述第四装置,用于:

指示所述第一libvirtd进程检查自身作为服务器端的连接,当确定当前不存在客户端与所述第一libvirtd进程建立有连接时,则退出所述第一libvirtd进程。

进一步地,所述第四装置,还用于:

在所述第一libvirtd进程检查自身作为服务器端的连接之后,当确定当前存在客户端与所述第一libvirtd进程建立有连接时,则指示第一libvirtd进程在满足预设条件后重新检查自身作为服务器端的连接,直至确定当前不存在客户端与所述第一libvirtd进程建立有连接时,退出所述第一libvirtd进程。

进一步地,所述预设条件包括:

有新的客户端与所述第一libvirtd进程建立或者断开连接;或

经过设定的时间间隔。

与现有技术相比,本申请在新的第二libvirtd进程启动后,由于此时已经完成新版本的libvirt软件的安装,第二libvirtd进程已经是基于新版本的软件代码运行的,同时该第二libvirtd进程的虚拟机状态信息已经在启动之前更新至与第一libvirtd进程一致,使libvirt软件的相关功能能够通过正确的第二libvirtd进程实现,从而在升级过程中避免libvirt软件的相关功能中断。

此外,本申请中通过在特定时间对QEMU进程发往libvirtd进程的第一事件消息进行阻塞或者取消阻塞,以及通过监听程序对第一时间段内通过第一libvirtd进程创建新虚拟机的操作进行监听,避免第二libvirtd进程的虚拟机状态信息发生错误。

附图说明

通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:

图1示出根据本申请一个方面的一种libvirt软件热升级设备的结构示 意图;

图2示出了本申请涉及的libvirt软件在KVM/QEMU虚拟化环境下的功能示意图;

图3示出了本申请实施例提供的一种优选的libvirt软件热升级设备的结构示意图;

图4示出了本申请实施例提供的另一种优选的libvirt软件热升级设备的结构示意图;

图5示出了本申请实施例提供的libvirt软件热升级设备中第七装置的结构示意图;

图6示出了本申请实施例提供的libvirt软件热升级设备中第七装置中第七三模块的结构示意图;

图7示出了根据本申请另一个方面的一种libvirt软件热升级方法的流程图;

图8示出了本申请实施例提供的一种优选的libvirt软件热升级方法的流程图;

图9示出了本申请实施例提供的进一步优选的libvirt软件热升级方法的流程图;

图10(a)至图10(f)示出了应用本申请实施例提供的方法对KVM/QEMU虚拟化环境下的libvirtd软件进行热升级过程中交互原理图。

附图中相同或相似的附图标记代表相同或相似的部件。

具体实施方式

在本申请一个典型的配置中,终端、服务网络的设备和可信方均包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结 构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。

图1示出根据本发明一个方面的一种libvirt软件热升级设备1的结构示意图,其中,该设备1包括第一装置110、第二装置120、第三装置130和第四装置140。具体地,第一装置110完成新版本的libvirt软件的安装;第二装置120将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程;第三装置130启动所述第二libvirtd进程,建立所述第二libvirtd进程与QEMU进程的连接;第四装置140退出所述第一libvirtd进程。在新的第二libvirtd进程启动后,由于此时已经完成新版本的libvirt软件的安装,第二libvirtd进程已经是基于新版本的软件代码运行的,同时该第二libvirtd进程的虚拟机状态信息已经在启动之前更新至与第一libvirtd进程一致,使libvirt软件的相关功能能够通过正确的第二libvirtd进程实现,从而在升级过程中避免libvirt软件的相关功能中断。

在此,设备1包括但不限于网络设备、触摸终端或网络设备与触摸终端通过网络相集成所构成的设备。在此,所述网络设备包括但不限于如网络主机、单个网络服务器、多个网络服务器集或基于云计算的计算机集合等实现;或者由用户设备实现。在此,云由基于云计算(Cloud Computing)的大量主机或网络服务器构成,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。优选地,设备1还可以是运行于所述网络设备、触摸终端或网络设备与触摸终端通过网络相集成所构成的设备上的脚本程序。

本申请涉及的libvirt软件包括一套API(Application Programming Interface,应用程序接口)库、一个守护进程(libvirtd进程)和一个命令行工具(virsh工具),用以对虚拟机监视器(Hypervisor)进行虚拟化管理。图2示出了libvirt软件在KVM/QEMU虚拟化环境下的功能示意图,在libvirt软件的运行过程中,virsh工具210与libvirtd进程220之间的连接为短连接,在传输一次数据至后两者之间的连接随即断开,在该连接中virsh工具210作为客户端(client),而libvirtd进程220则作为服务器端(server)。而libvirtd进程220与QEMU进程230之间的连接为长连接,在传输完数据后一直保持连接,直至收到断开该连接的请求,在该连接中libvirtd进程220作为客户端,而QEMU进程230则作为服务器端。

在设备1中,第一libvirtd进程和第二libvirtd进程可以通过修改原有的libvirtd进程获得,例如在第一libvirtd进程和第二libvirtd进程中增加一标记参数,在启动可以传入不同的标记参数,以使两个带有不同标记参数的libvirtd进程可以共存,并且保有各自不同的虚拟机状态信息。例如将0和1作为不同的标记参数,则第一libvirtd进程和第二libvirtd进程则分别可以libvirtd-0和libvirtd-1来表示。libvirtd-0和libvirtd-1各自创建有一个用于保存虚拟机状态信息的虚拟机状态文件(这些文件存放在各自的虚拟机状态文件夹中,每个虚拟机对应一个状态文件),在libvirtd-1启动时,可以将libvirtd-0的虚拟机状态文件复制给libvirtd-1,以完成虚拟机状态信息的导入。

以采用KVM/QEMU的虚拟化方案为例,每个虚拟机对应一个QEMU进程,当QEMU进程在启动时,相当于创建了一台新的虚拟机。在如图2所示的虚拟化环境下,libvirtd进程作为服务器端,可以接收来自virsh工具发来的命令,并向其返回结果。同时,libvirtd进程可以根据该来自virsh工具的命令进一步构造发往QEMU进程的命令,并作为客户端向QEMU进程发送该构造的命令,例如暂停/恢复虚拟机等。而QEMU进程在收到相关命令后,则会执行对应的操作,并将结果返回libvirtd进程。此外,QEMU进程还会通过monitor(QEMU监控器)主动向连接到monitor的libvirtd进程发送事件消息(event),例如用户关闭虚拟机后,QEMU进程会发送stop event这一事件消息给libvirtd进程,以更新libvirtd进程的虚 拟机状态信息。

在QEMU进程启动时,会通过libvirtd进程传入配置参数使其提供一个monitor,该monitor是QEMU进程与libvirtd进程进行交互的接口,libvirtd进程与QEMU进程之间的数据收发均会通过monitor进行。本申请为了解决现有技术的缺陷,需要配置两个相对独立的libvirtd进程,即第一libvirtd进程和第二libvirtd进程,那么同样需要提供两个相对独立的monitor,分别用于与第一libvirtd进程、第二libvirtd进程保持独立的通信。本实施例中,同样可以通过传入0和1这两个不同的标记参数,来配置两个monitor,如monitor-0和monitor-1,使得libvirtd-0与monitor-0建立连接,libvirtd-1则与monitor-1建立连接,进行独立的通信。

在此,所述虚拟机状态信息可以通过文件、表格或者内存数据等形式保存。例如,本实施例中所述的虚拟机状态信息采用.xml文件的形式保存,该文件以虚拟机的名称命名,如名称为VM1的虚拟机,其对应的虚拟机状态文件为VM1.xml。对于每个libvirtd进程,都有用于保存该虚拟机状态文件的文件夹,假设在升级前已经有3个虚拟机正在运行,其对应虚拟机状态文件为VM1.xml、VM2.xml、VM3.xml,这些文件内记录有上述三个虚拟机的虚拟机状态信息。第二libvirtd进程启动之前,会将上述3个虚拟机状态文件拷贝至第二libvirtd进程的虚拟机状态文件夹中。在此,本领域技术人员应能理解上述虚拟机状态信息的保存形式仅为举例,其他现有的或今后可能出现的虚拟机状态信息的保存形式如可适用于本申请,也应包含在本申请保护范围以内,并在此以引用方式包含于此。

在实际的处理过程中,第二装置120将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之后,至第三装置130启动所述第二libvirtd进程,建立所述第二libvirtd进程与QEMU进程的连接时,会存在一定的处理时间。在该处理时间内,若发生关闭虚拟机的情形,第二libvirtd进程无法通过导入第一libvirtd进程的虚拟机状态信息获知该状态改变的信息,并且由于此时第二libvirtd进程还未与QEMU进程建立连接,QEMU进程对应的所述关闭虚拟机的消息事件(stop event)无法送达第二libvirtd进程,使得第二libvirtd进程无法获得这一关闭虚拟机所产生 的虚拟机状态信息。因此,在第二libvirtd进程与QEMU进程建立连接后,第二libvirtd进程的虚拟机状态信息与虚拟机的实际运行状态,造成虚拟状态错误。

为了进一步解决上述问题,本申请的提供了一种优选的实施方式,如图3所示。除图1所示的装置外,所述设备1还可以包括第五装置150。具体地,第五装置在第一装置将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前,阻塞QEMU进程发往libvirtd进程的第一事件消息;以及在第四装置退出所述第一libvirtd进程之后,取消对QEMU进程发往libvirtd进程的第一事件消息的阻塞。在此,本领域技术人员应当理解,第一装置110、第二装置120、第三装置130和第四装置140分别与图1实施例中对应装置的内容相同或基本相同,为简明起见,故在此不再赘述,并以引用的方式包含于此。

在此,所述第一事件消息包括在虚拟机状态信息改变时由QEMU进程发送给libvirtd进程的事件消息,用以告知libvirtd进程虚拟机状态发生了变化,使得libvirtd进程能够根据所述第一事件消息更新其虚拟状态信息。仍以KVM/QEMU的虚拟化方案为例,QEMU进程在虚拟机状态改变时会生成相应的第一事件消息并发送给libvirtd进程,所述的第一事件消息可以包括:stop event、pause event和resume event等,这些第一事件消息分别由关闭虚拟机、暂停虚拟机和恢复虚拟机等操作生成。由于QEMU进程中配置了两个monitor,因此第一事件消息生成后会分别通过两个monitor向与该monitor对应的libvirtd进程发送,当libvirtd进程与monitor之间的连接正常时,第一事件消息即会送达libvirtd进程。在本例中,若第一事件消息产生时,第二libvirtd进程还未与QEMU进程建立连接,该第一事件消息的无法送达。

当阻塞QEMU进程发往libvirtd进程的第一事件消息之后,上述第一事件消息在产生后,不会向任何一个libvirtd进程发送,而是由QEMU进程保存在内部。当退出所述第一libvirtd进程后,再取消对QEMU进程发往libvirtd进程的第一事件消息的阻塞。取消阻塞后,所述QEMU进程发往libvirtd进程的第一事件消息可能包括:1、被阻塞而保存在QEMU进 程内部的第一事件消息,如果取消阻塞之前,有第一事件消息产生并被阻塞,那么取消阻塞后会继续发送这些第一事件消息;2、取消阻塞后新产生的第一事件消息。由于此时第二libvirtd进程与QEMU进程已经建立连接,第二libvirtd进程仍然可以收到第二装置将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之后,至第三装置启动所述第二libvirtd进程,建立所述第二libvirtd进程与QEMU进程的连接之前所产生的第一事件消息,由此更新自身的虚拟机状态信息,以避免虚拟机状态错误。其中,上述的libvirtd进程表示第一libvirtd进程与第二libvirtd进程的总称,即QEMU进程发往libvirtd进程的第一事件消息是同时发往第一libvirtd进程与第二libvirtd进程,只要第一libvirtd进程与第二libvirtd进程处于启动状态,并且与QEMU进程的monitor建立了连接,就可以收到所述第一事件消息;同理,进行阻塞后,第一事件消息不会发往第一libvirtd进程和第二libvirtd进程中的任何一个。

具体地,所述第五装置在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前,指示当前运行的所述第一libvirtd进程向所述QEMU进程发送第一命令,所述QEMU进程根据所述第一命令中止向libvirtd进程发送所述第一事件消息;以及所述第五装置在退出所述第一libvirtd进程之后,指示当前运行的所述第二libvirtd进程向所述QEMU进程发送第二命令,所述QEMU进程根据所述第二命令恢复向第二libvirtd进程发送所述第一事件消息。接上例,所述第一命令和第二命令可以采用KVM/QEMU的虚拟化方案中常用的QEMU Monitor Command(QEMU监控命令)来实现,添加分别用于阻塞和取消阻塞的QEMU Monitor Command,并且通过QEMU进程,使其能够在接到相应的QEMU Monitor Command后进行阻塞或取消阻塞。

本领域技术人员应能理解上述第一命令和第二命令仅为举例,其他现有的或今后可能出现的能够控制QEMU进程中止或者恢复向libvirtd进程发送所述第一事件消息的命令如可适用于本申请,也应包含在本申请保护范围以内,并在此以引用方式包含于此。

优选地,第三装置在启动所述第二libvirtd进程时,所述第二libvirtd 进程创建一个对应于所述第二libvirtd进程的连接路径,其中,所述对应于所述第二libvirtd进程的连接路径用于建立客户端与所述第二libvirtd进程的连接。对应地,所述设备还包括第六装置(未示出),该第六装置在退出所述第一libvirtd进程之前,指示客户端在所述第二libvirtd进程启动后,根据libvirtd进程的连接路径的创建时间,选择对应于所述第二libvirtd进程的连接路径与所述第二libvirtd进程建立连接。

在此,对于两个先后创建的连接路径,优先选择最近创建的连接路径。接上例,所述连接路径可以是第二libvirtd进程作为服务器端的domain socket(域套接字)路径,该domain socket路径会在libvirtd进程启动时自动创建。仍以前述两个libvirtd进程libvirtd-0和libvirtd-1为例,两个libvirtd进程能够拥有各自独立的domain socket路径,在libvirtd-0和libvirtd-1启动时,所创建的domain socket路径分别为/var/run/libvirt/libvirt-sock-1和/var/run/libvirt/libvirt-sock-2。假设libvirtd-0为在版本升级前开始运行的libvirtd进程,而libvirtd-1为新启动的libvirtd进程,libvirtd-0中作为服务器端的domain socket路径的创建时间为t1,而libvirtd-1中作为服务器端的domain socket路径的创建时间为t2,t2晚于t1。若两个libvirtd进程同时运行,客户端在尝试连接libvirtd进程时(例如配置有virsh工具的设备向libvirtd进程发送命令时)会发现同时存在两个服务器端的domain socket路径,此时客户端会根据libvirtd进程的domain socket路径的创建时间,优先选择最近创建的domain socket路径来建立连接。如实施例中,由于t2晚于t1,客户端会优先选择与libvirtd-1建立连接,那么此时客户端向libvirtd进程发送的命令只会发送到libvirtd-1。

由此,在两个libvirtd进程同时运行时,若配置有virsh工具(或者其它采用C或者python语言编写的管理工具程序)的设备需要对虚拟机进行配置,其配置命令会发送至新启动的第二libvirtd进程。

在第二libvirtd进程还未启动时,尝试连接libvirtd进程的客户端仍然会与原来的第一libvirtd进程连接。在本实施例涉及的KVM/QEMU的虚拟化方案中,创建新虚拟机的操作需要由配置有virsh工具的设备向 libvirtd进程发送命令,再由libvirtd进程根据该命令对QEMU进程配置,因此,在第二装置120将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之后,至第三装置130启动所述第二libvirtd进程之前的这一段时间内,第二libvirtd进程还未完成启动,若在此时创建新虚拟机,是通过原来的第一libvirtd进程完成,则第二libvirtd进程无法更新该新创建的虚拟机状态信息,可能会造成新创建的虚拟机状态信息被遗漏。

针对上述问题,本申请进一步提供了一种优选的实施方式,其结构如图4所示,除图1所示的装置外,所述设备1还包括第七装置170。具体地,第七装置170在启动所述第二libvirtd进程之前,获取所述第一libvirtd进程在第一时间段内创建新虚拟机所新产生的虚拟机状态信息,并将新产生的虚拟机状态信息添加至所述第二libvirtd进程的虚拟机状态信息内;其中,所述第一时间段为将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程至启动所述第二libvirtd进程之间的时间区间。在此,本领域技术人员应当理解,第一装置110、第二装置120、第三装置130和第四装置140分别与图1实施例中对应装置的内容相同或基本相同,为简明起见,故在此不再赘述,并以引用的方式包含于此。

由于在第一时间段之前创建新虚拟机所生成的虚拟机状态信息可以通过导入的方式写入第二libvirtd进程的虚拟机状态文件;而第一时间段之后则是直接通过第二libvirtd进程进行新虚拟机的创建,因此第二libvirtd进程直接可以获知此时的创建新虚拟机所生成的虚拟机状态信息。本申请通过获取所述第一libvirtd进程在第一时间段内创建新虚拟机所新产生的虚拟机状态信息,并将新产生的虚拟机状态信息添加至所述第二libvirtd进程的虚拟机状态信息内,以此来避免新创建的虚拟机状态信息被遗漏。

进一步地,图5示出了图4中所述第七装置的结构图,该第七装置包括:

第七一模块171,用于在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前启动一监听程序,该监听程序将所述监 听程序与所述第一libvirtd进程建立连接;

第七二模块172,用于控制所述监听程序获取由所述第一libvirtd进程在所述第一时间段内发出的第二事件消息,其中,所述第二事件消息指向所述第一libvirtd进程创建新虚拟机所新产生的虚拟机状态信息;

第七三模块173,用于控制所述监听程序建立与所述第二libvirtd进程的连接,并根据所述第二事件消息向所述第二libvirtd进程添加所述新产生的虚拟机状态信息。

在此,所述监听程序与所述第一libvirtd进程和第二libvirtd进程均会建立连接,为了便于在该场景下发送相关的数据,两个连接均为长连接,并且相对于libvirtd进程,该监听程序是作为客户端。例如,虚拟机状态信息是通过文件的形式保存,新创建的虚拟机的名称为VM4和VM5,其虚拟机状态信息保存于VM4.xml和VM5.xml文件中。对应地,为了能够使第二事件消息指向所述第一libvirtd进程创建新虚拟机所新产生的虚拟机状态信息,第二事件消息需要包含的信息至少包括创建了新的虚拟机这一事件,以及新创建的虚拟机的标识(例如虚拟机的名称)。例如,通过VM5这个虚拟机名称,即可找到VM5.xml这个保存有虚拟机状态信息的文件。

在实际应用中,除创建虚拟机之外的操作,例如关闭虚拟机,也可能会由virsh工具(或者其它采用C或者python语言编写的管理工具程序)发起并通过libvirtd进程关闭该虚拟机对应的QEMU进程。此时,监听程序也会监听到这些操作(例如关闭虚拟机)所对应的事件消息,但是针对这些无关的事件消息,监听程序会忽略掉,不作处理。

进一步地,本申请还提供了一种第七三模块的结构,该第七三模块的具体结构如图6所示,包括第七三一单元1731、第七三二单元1732和第七三三单元1733。

其中,第七三一单元1731控制所述监听程序建立与所述第二libvirtd进程之间的连接;在此,监听程序会在所述第二libvirtd进程启动之前等待该第二libvirtd进程启动,在其启动成功后即会自动与第二libvirtd进程建立连接。

第七三二单元1732控制所述监听程序将保存有所述第一libvirtd进程创建新虚拟机所新产生的虚拟机状态信息的状态文件拷贝至所述第二libvirtd进程对应的虚拟机状态文件夹中;接上例,对于新创建的虚拟机VM4和VM5,其虚拟机状态信息保存在VM4.xml和VM5.xml这两个状态文件中,监听程序会将这两个文件拷贝至第二libvirtd进程对应的虚拟机状态文件夹中。

第七三三单元1733控制所述监听程序通过所述连接调用所述第二libvirtd进程的导入接口,及控制所述导入接口根据所述第二事件消息,将所述状态文件中将所述新产生的虚拟机状态信息导入至所述第二libvirtd进程并持久化的存放在对应的虚拟机状态文件夹的虚拟机状态文件中。在此,第二事件消息中包含了事件由于第二事件消息中包含了虚拟机的标识,导入接口可以根据虚拟机的标识,例如通过虚拟机名称VM5找到VM5.xml这个保存有虚拟机状态信息的状态文件,由这个文件中将虚拟机状态信息导入第二libvirtd进程。

作为另一种优选的实施方式,结合图4和图5所示的设备1,该设备还可以包括第八装置(未示出)。该第八装置在启动所述第二libvirtd进程之后,指示所述监听程序退出。例如,所述第二libvirtd进程启动之后,由于监听程序所提供的功能已经没有存在的必要,会通过某一特定信号来对监听程序进行指示,使得监听程序退出。

具体地,所述监听程序与所述第一libvirtd进程之间的连接为只读连接;所述第八装置,具体用于在启动所述第二libvirtd进程之后,指示所述第一libvirtd进程检查自身作为服务器端的连接,当确定当前仅存在一个客户端与所述第一libvirtd进程建立连接并且该连接是只读连接时,则指示所述监听程序退出,实现监听程序在完成工作后有效退出。

优选地,上述设备1中的第四装置具体用于:

指示所述第一libvirtd进程检查自身作为服务器端的连接,当确定当前不存在客户端与所述第一libvirtd进程建立有连接时,则退出所述第一libvirtd进程。第一libvirtd进程退出后,会自动断开与所述QEMU进程的连接。

在实际应用中,如果在第一libvirtd进程退出时,有客户端与第一libvirtd进程存在连接,那么那这些连接当前的功能调用就会失败。比如有连接到第一libvirtd进程的客户端在进行一些操作还未完成,此时直接退出第一libvirtd进程后,那些操作就会失败了。因此,在退出之前首先确定没有客户端与第一libvirtd进程存在连接,能够避免特定时间点上的某些操作失效。

进一步地,所述第四装置在所述第一libvirtd进程检查自身作为服务器端的连接之后,若确定当前存在客户端与所述第一libvirtd进程建立有连接,则指示第一libvirtd进程在满足预设条件后重新进程检查自身作为服务器端的连接,直至确定当前不存在客户端与所述第一libvirtd进程建立有连接时,退出所述第一libvirtd进程。

例如,所述预设条件为:有新的客户端与所述第一libvirtd进程建立或者断开连接。假设所述第一libvirtd进程检查自身作为服务器端的连接,确定当前还存在两个客户端与其建立有连接,分别为client1和client2,当其中一个客户端(例如client2)与第一libvirtd进程断开连接时,则会触发第一libvirtd进程重新检查自身作为服务器端的连接。此外,当另一个客户端client3与第一libvirtd进程建立了连接后,同样会触发第一libvirtd进程重新检查自身作为服务器端的连接。

再如,所述预设条件为:经过设定的时间间隔。假设所述第一libvirtd进程检查自身作为服务器端的连接,确定当前还存在两个客户端与其建立有连接,在检查完成的同时启动计时,当计时达到设定的时间后,触发第一libvirtd进程重新检查自身作为服务器端的连接。

本领域技术人员应能理解上述预定条件仅为举例,其他现有的或今后可能出现的预设条件如可适用于本发明,也应包含在本发明保护范围以内,并在此以引用方式包含于此。

图7示出了根据本申请另一个方面的一种libvirt软件热升级方法的流程图。其中,所述方法包括以下步骤:

步骤S701,完成新版本的libvirt软件的安装;

步骤S702,将当前运行的第一libvirtd进程的虚拟机状态信息导入至 第二libvirtd进程;

步骤S703,启动所述第二libvirtd进程,建立所述第二libvirtd进程与QEMU进程的连接;

步骤S704,退出所述第一libvirtd进程。

在新的第二libvirtd进程启动后,由于此时已经完成新版本的libvirt软件的安装,第二libvirtd进程已经是基于新版本的软件代码运行的,同时该第二libvirtd进程的虚拟机状态信息已经在启动之前更新至与第一libvirtd进程一致,使libvirt软件的相关功能能够通过正确的第二libvirtd进程实现,从而在升级过程中避免libvirt软件的相关功能中断。

本申请涉及的libvirt软件包括一套API(Application Programming Interface,应用程序接口)库、一个守护进程(libvirtd进程)和一个命令行工具(virsh工具),用以对虚拟机监视器(Hypervisor)进行虚拟化管理。图2示出了libvirt软件在KVM/QEMU虚拟化环境下的功能示意图,在libvirt软件的运行过程中,virsh工具210与libvirtd进程220之间的连接为短连接,在传输一次数据至后两者之间的连接随即断开,在该连接中virsh工具210作为客户端(client),而libvirtd进程220则作为服务器端(server)。而libvirtd进程220与QEMU进程230之间的连接为长连接,在传输完数据后一直保持连接,直至收到断开该连接的请求,在该连接中libvirtd进程220作为客户端,而QEMU进程230则作为服务器端。

第一libvirtd进程和第二libvirtd进程可以通过修改原有的libvirtd进程获得,例如在第一libvirtd进程和第二libvirtd进程中增加一标记参数,在启动可以传入不同的标记参数,以使两个带有不同标记参数的libvirtd进程可以共存,并且保有各自不同的虚拟机状态信息。例如将0和1作为不同的标记参数,则第一libvirtd进程和第二libvirtd进程则分别可以libvirtd-0和libvirtd-1来表示。libvirtd-0和libvirtd-1各自创建有一个用于保存虚拟机状态信息的虚拟机状态文件(这些文件存放在各自的虚拟机状态文件夹中,每个虚拟机对应一个状态文件),在libvirtd-1启动时,可以将libvirtd-0的虚拟机状态文件复制给libvirtd-1,以完成虚拟机状态信息的导入。

以采用KVM/QEMU的虚拟化方案为例,每个虚拟机对应一个QEMU进程,当QEMU进程在启动时,相当于创建了一台新的虚拟机。在如图2所示的虚拟化环境下,libvirtd进程作为服务器端,可以接收来自virsh工具发来的命令,并向其返回结果。同时,libvirtd进程可以根据该来自virsh工具的命令进一步构造发往QEMU进程的命令,并作为客户端向QEMU进程发送该构造的命令,例如暂停/恢复虚拟机等。而QEMU进程在收到相关命令后,则会执行对应的操作,并将结果返回libvirtd进程。此外,QEMU进程还会通过monitor主动向连接到monitor的libvirtd进程发送事件消息(event),例如用户关闭虚拟机后,QEMU进程会发送stop event这一事件消息给libvirtd进程,以更新libvirtd进程的虚拟机状态信息。

在QEMU进程启动时,会通过libvirtd进程传入配置参数使其提供一个monitor,该monitor是QEMU进程与libvirtd进程进行交互的接口,libvirtd进程与QEMU进程之间的数据收发均会通过monitor进行。本申请为了解决现有技术的缺陷,需要配置两个相对独立的libvirtd进程,即第一libvirtd进程和第二libvirtd进程,那么同样需要提供两个相对独立的monitor,分别用于与第一libvirtd进程、第二libvirtd进程保持独立的通信。本实施例中,同样可以通过传入0和1这两个不同的标记参数,来配置两个monitor,如monitor-0和monitor-1,使得libvirtd-0与monitor-0建立连接,libvirtd-1则与monitor-1建立连接,进行独立的通信。

在此,所述虚拟机状态信息可以通过文件、表格或者内存数据等形式保存。例如,本实施例中所述的虚拟机状态信息采用.xml文件的形式保存,该文件以虚拟机的名称命名,如名称为VM1的虚拟机,其对应的虚拟机状态文件为VM1.xml。对于每个libvirtd进程,都有用于保存该虚拟机状态文件的文件夹,假设在升级前已经有3个虚拟机正在运行,其对应虚拟机状态文件为VM1.xml、VM2.xml、VM3.xml,这些文件内记录有上述三个虚拟机的虚拟机状态信息。第二libvirtd进程启动之前,会将上述3个虚拟机状态文件拷贝至第二libvirtd进程的虚拟机状态文件夹中。在此,本领域技术人员应能理解上述虚拟机状态信息的保存形式仅为举例,其他现有的或今后可能出现的虚拟机状态信息的保存形式如可适用于本申请, 也应包含在本申请保护范围以内,并在此以引用方式包含于此。

在实际的处理过程中,将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之后,至启动所述第二libvirtd进程,建立所述第二libvirtd进程与QEMU进程的连接时,会存在一定的处理时间。在该处理时间内,若发生关闭虚拟机的情形,第二libvirtd进程无法通过导入第一libvirtd进程的虚拟机状态信息获知该状态改变的信息,并且由于此时第二libvirtd进程还未与QEMU进程建立连接,QEMU进程对应的所述关闭虚拟机的事件消息(stop event)无法送达第二libvirtd进程,使得第二libvirtd进程无法获得这一关闭虚拟机所产生的虚拟机状态信息。因此,在第二libvirtd进程与QEMU进程建立连接后,第二libvirtd进程的虚拟机状态信息与虚拟机的实际运行状态,造成虚拟状态错误。

为了进一步解决上述问题,本申请的提供了一种优选的实施方式,在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前,阻塞QEMU进程发往libvirtd进程的第一事件消息;以及在退出所述第一libvirtd进程之后,取消对QEMU进程发往libvirtd进程的第一事件消息的阻塞。

在此,所述第一事件消息包括在虚拟机状态改变时由QEMU进程发送给libvirtd进程的事件消息,用以告知libvirtd进程虚拟机状态发生了变化,使得libvirtd进程能够根据所述第一事件消息更新其虚拟状态信息。仍以KVM/QEMU的虚拟化方案为例,QEMU进程在虚拟机状态改变时会生成相应的第一事件消息并发送给libvirtd进程,所述的第一事件消息可以包括:stop event、pause event和resume event等,这些第一事件消息分别由关闭虚拟机、暂停虚拟机和恢复虚拟机等操作生成。由于QEMU进程中配置了两个monitor,因此第一事件消息生成后会分别通过两个monitor向与该monitor对应的libvirtd进程发送,当libvirtd进程与monitor之间的连接正常时,第一事件消息即会送达libvirtd进程。在本例中,若第一事件消息产生时,第二libvirtd进程还未与QEMU进程建立连接,该第一事件消息的无法送达。

当阻塞QEMU进程发往libvirtd进程的第一事件消息之后,上述第一 事件消息在产生后,不会向任何一个libvirtd进程发送,而是由QEMU进程保存在内部。当退出所述第一libvirtd进程后,再取消对QEMU进程发往libvirtd进程的第一事件消息的阻塞。取消阻塞后,所述QEMU进程发往所述libvirtd进程的第一事件消息可能包括:1、被阻塞而保存在QEMU进程内部的第一事件消息,如果取消阻塞之前,有第一事件消息产生并被阻塞,那么取消阻塞后会继续发送这些第一事件消息;2、取消阻塞后新产生的第一事件消息。由于此时第二libvirtd进程与QEMU进程已经建立连接,第二libvirtd进程仍然可以收到将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之后,至启动所述第二libvirtd进程,建立所述第二libvirtd进程与QEMU进程的连接之前所产生的第一事件消息,由此更新自身的虚拟机状态信息,以避免虚拟机状态错误。其中,上述的libvirtd进程表示第一libvirtd进程与第二libvirtd进程的总称,即QEMU进程发往libvirtd进程的第一事件消息是同时发往第一libvirtd进程与第二libvirtd进程,只要第一libvirtd进程与第二libvirtd进程处于启动状态,并且与QEMU进程的monitor建立了连接,就可以收到所述第一事件消息;同理,进行阻塞后,第一事件消息不会发往第一libvirtd进程和第二libvirtd进程中的任何一个。

具体地,所述阻塞QEMU进程发往当前运行的第一libvirtd进程的第一事件消息,包括:由当前运行的所述第一libvirtd进程向所述QEMU进程发送第一命令,所述QEMU进程根据所述第一命令中止向libvirtd进程发送所述第一事件消息。取消对QEMU进程发往libvirtd进程的第一事件消息的阻塞,包括:由当前运行的所述第二libvirtd进程向所述QEMU进程发送第二命令,所述QEMU进程根据所述第二命令恢复向libvirtd进程发送所述第一事件消息。接上例,所述第一命令和第二命令可以采用KVM/QEMU的虚拟化方案中常用的QEMU Monitor Command(QEMU监控命令)来实现,添加分别用于阻塞和取消阻塞的QEMU Monitor Command,并且通过QEMU进程,使其能够在接到相应的QEMU Monitor Command后进行阻塞或取消阻塞。

本领域技术人员应能理解上述第一命令和第二命令仅为举例,其他现 有的或今后可能出现的能够控制QEMU进程中止或者恢复向libvirtd进程发送所述第一事件消息的命令如可适用于本申请,也应包含在本申请保护范围以内,并在此以引用方式包含于此。

优选地,所述启动所述第二libvirtd进程,具体包括:启动所述第二libvirtd进程时,所述第二libvirtd进程创建一个对应于所述第二libvirtd进程的连接路径,其中,所述对应于所述第二libvirtd进程的连接路径用于建立客户端与所述第二libvirtd进程的连接。客户端在所述第二libvirtd进程启动后,根据libvirtd进程的连接路径的创建时间,选择对应于所述第二libvirtd进程的连接路径与所述第二libvirtd进程建立连接。其中,所述客户端除了配置有virsh工具的设备之外,还可以是其它尝试与libvirtd进程进行连接的设备或者程序。

在此,对于两个先后创建的连接路径,优先选择最近创建的连接路径。接上例,所述连接路径可以是第二libvirtd进程作为服务器端的domain socket(域套接字)路径,该domain socket路径会在libvirtd进程启动时自动创建。仍以前述两个libvirtd进程libvirtd-0和libvirtd-1为例,两个libvirtd进程能够拥有各自独立的domain socket路径,在libvirtd-0和libvirtd-1启动时,所创建的domain socket路径分别为/var/run/libvirt/libvirt-sock-1和/var/run/libvirt/libvirt-sock-2。假设libvirtd-0为在版本升级前开始运行的libvirtd进程,而libvirtd-1为新启动的libvirtd进程,libvirtd-0中作为服务器端的domain socket路径的创建时间为t1,而libvirtd-1中作为服务器端的domain socket路径的创建时间为t2,t2晚于t1。若两个libvirtd进程同时运行,客户端在尝试连接libvirtd进程时(例如配置有virsh工具的设备向libvirtd进程发送命令时)会发现同时存在两个服务器端的domain socket路径,此时客户端会根据libvirtd进程的domain socket路径的创建时间,优先选择最近创建的domain socket路径来建立连接。如实施例中,由于t2晚于t1,客户端会优先选择与libvirtd-1建立连接,那么此时客户端向libvirtd进程发送的命令只会发送到libvirtd-1。

由此,在两个libvirtd进程同时运行时,若配置有virsh工具(或者其 它采用C或者python语言编写的管理工具程序)的设备需要对虚拟机进行配置,其配置命令会发送至新启动的第二libvirtd进程。

在第二libvirtd进程还未启动时,尝试连接libvirtd进程的客户端仍然会与原来的第一libvirtd进程连接。在本实施例涉及的创建新虚拟机的操作需要由配置有virsh工具的设备向libvirtd进程发送命令,再由libvirtd进程根据该命令对QEMU进程配置,因此,在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之后,至启动所述第二libvirtd进程之前的这一段时间内,第二libvirtd进程还未完成启动,若在此时创建新虚拟机,是通过原来的第一libvirtd进程完成,则第二libvirtd进程无法更新该新创建的虚拟机状态信息,可能会造成新创建的虚拟机状态信息被遗漏。

针对上述问题,本申请进一步提供了一种优选的实施方式,通过增加一获取并添加新产生的虚拟机状态信息的步骤来实现。该步骤为:获取所述第一libvirtd进程在第一时间段内创建新虚拟机所新产生的虚拟机状态信息,并将新产生的虚拟机状态信息添加至所述第二libvirtd进程的虚拟机状态信息内,其中,所述第一时间段为将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程至启动所述第二libvirtd进程之间的时间区间。

由于在第一时间段之前创建新虚拟机所生成的虚拟机状态信息可以通过导入的方式写入第二libvirtd进程的虚拟机状态文件;而第一时间段之后则是直接通过第二libvirtd进程进行新虚拟机的创建,因此第二libvirtd进程直接可以获知此时的创建新虚拟机所生成的虚拟机状态信息。本申请通过获取所述第一libvirtd进程在第一时间段内创建新虚拟机所新产生的虚拟机状态信息,并将新产生的虚拟机状态信息添加至所述第二libvirtd进程的虚拟机状态信息内,以此来避免新创建的虚拟机状态信息被遗漏。

进一步地,结合图7,图8示出了本申请实施例提供的一种优选的libvirt软件热升级方法的流程图,其中前述获取并添加新产生的虚拟机状态信息的步骤具体包括以下步骤:

步骤S801,在将当前运行的第一libvirtd进程的虚拟机状态信息导入至第二libvirtd进程之前,启动监听程序,该监听程序与所述第一libvirtd进程建立连接;

步骤S802,所述监听程序获取由所述第一libvirtd进程在所述第一时间段内发出的第二事件消息,其中,所述第二事件消息指向所述第一libvirtd进程创建新虚拟机所新产生的虚拟机状态信息;

步骤S803,所述监听程序建立与所述第二libvirtd进程的连接,并根据所述第二事件消息向所述第二libvirtd进程添加所述新产生的虚拟机状态信息。

在此,所述监听程序与所述第一libvirtd进程和第二libvirtd进程均会建立连接,为了便于在该场景下发送相关的数据,两个连接均为长连接,并且相对于libvirtd进程,该监听程序是作为客户端。例如,虚拟机状态信息是通过文件的形式保存,新创建的虚拟机的名称为VM4和VM5,其虚拟机状态信息保存于VM4.xml和VM5.xml文件中。对应地,为了能够使第二事件消息指向所述第一libvirtd进程创建新虚拟机所新产生的虚拟机状态信息,第二事件消息需要包含的信息至少包括创建了新的虚拟机这一事件,以及新创建的虚拟机的标识(例如虚拟机的名称)。例如,通过VM5这个虚拟机名称,即可找到VM5.xml这个保存有虚拟机状态信息的文件。

在实际应用中,除创建虚拟机之外的操作,例如关闭虚拟机,也可能会由virsh工具发起并通过libvirtd进程关闭该虚拟机对应的QEMU进程。此时,监听程序也会监听到这些操作(例如关闭虚拟机)所对应的事件消息,但是针对这些无关的事件消息,监听程序会忽略掉,不作处理。

进一步地,结合图7、图8,图9示出了一种进一步优选的libvirt软件热升级方法的流程图,上述步骤S803的具体处理步骤,包括:

步骤S901,所述监听程序建立与所述第二libvirtd进程之间的连接。在此,监听程序会在所述第二libvirtd进程启动之前等待该第二libvirtd进程启动,在其启动成功后即会自动与第二libvirtd进程建立连接。

步骤S902,所述监听程序将保存有所述第一libvirtd进程创建新虚拟 机所新产生的虚拟机状态信息的状态文件拷贝至所述第二libvirtd进程对应的虚拟机状态文件夹中。接上例,对于新创建的虚拟机VM4和VM5,其虚拟机状态信息保存在VM4.xml和VM5.xml这两个状态文件中,监听程序会将这两个文件拷贝至第二libvirtd进程对应的虚拟机状态文件夹中。

步骤S903,所述监听程序通过所述连接调用所述第二libvirtd进程的导入接口,所述导入接口根据所述第二事件消息,将所述状态文件中将所述新产生的虚拟机状态信息导入至所述第二libvirtd进程,并持久化的存放在对应的虚拟机状态文件夹的虚拟机状态文件。在此,第二事件消息中包含了事件由于第二事件消息中包含了虚拟机的标识,导入接口可以根据虚拟机的标识,例如通过虚拟机名称VM5找到VM5.xml这个保存有虚拟机状态信息的状态文件,将这个文件中将虚拟机状态信息导入第二libvirtd进程。

作为另一种优选的实施方式,上述方法中在启动所述第二libvirtd进程之后,所述监听程序退出。例如,所述第二libvirtd进程启动之后,由于监听程序所提供的功能已经没有存在的必要,会通过某一特定信号来对监听程序进行指示,使得监听程序退出。

具体地,所述监听程序与所述第一libvirtd进程之间的连接为只读连接;所述监听程序退出,具体包括:所述第一libvirtd进程检查自身作为服务器端的连接,当确定当前仅存在一个客户端与所述第一libvirtd进程建立连接并且该连接是只读连接时,则指示所述监听程序退出,实现监听程序在完成工作后有效退出。

优选地,所述退出所述第一libvirtd进程,具体包括:所述第一libvirtd进程检查自身作为服务器端的连接,当确定当前不存在客户端与所述第一libvirtd进程建立有连接时,则退出所述第一libvirtd进程。第一libvirtd进程退出后,会自动断开与所述QEMU进程的连接。

在实际应用中,如果在第一libvirtd进程退出上,有客户端与第一libvirtd进程存在连接,那么那这些连接当前的功能调用就会失败。比如有连接到第一libvirtd进程的客户端在进行一些操作还未完成,此时直接退出第一libvirtd进程后,那些操作就会失败了。因此,在退出之前首先确 定没有客户端与第一libvirtd进程存在连接,能够避免特定时间点上的某些操作失效。

进一步地,所述第一libvirtd进程检查自身作为服务器端的连接之后,还包括:当确定当前存在客户端与所述第一libvirtd进程建立有连接时,则第一libvirtd进程在满足预设条件后重新检查自身作为服务器端的连接,直至确定当前不存在客户端与所述第一libvirtd进程建立有连接时,退出所述第一libvirtd进程。

例如,所述预设条件为:有新的客户端与所述第一libvirtd进程建立或者断开连接。假设所述第一libvirtd进程检查自身作为服务器端的连接,确定当前还存在两个客户端与其建立有连接,分别为client1和client2,当其中一个客户端(例如client2)与第一libvirtd进程断开连接时,则会触发第一libvirtd进程重新检查自身作为服务器端的连接。此外,当另一个客户端client3与第一libvirtd进程建立了连接后,同样会触发第一libvirtd进程重新检查自身作为服务器端的连接。

再如,所述预设条件为:经过设定的时间间隔。假设所述第一libvirtd进程检查自身作为服务器端的连接,确定当前还存在两个客户端与其建立有连接,在检查完成的同时启动计时,当计时达到设定的时间后,触发第一libvirtd进程重新检查自身作为服务器端的连接。

本领域技术人员应能理解上述预定条件仅为举例,其他现有的或今后可能出现的预设条件如可适用于本发明,也应包含在本发明保护范围以内,并在此以引用方式包含于此。

图10(a)至图10(f)示出了应用本申请提供的方法对KVM/QEMU虚拟化环境下的libvirtd软件进行热升级过程中交互原理图。在实际应用中,为实现本申请的方案,至少需要在现有libvirt软件的基础上对其软件代码进行如下改动:

1、为每个libvirtd进程增加一个标记参数,启动时可以传入标记参数0或者1,使带0和1标记的两个libvirtd可以共存,分别记为libvirtd-0和libvirtd-1。两个libvirtd进程有各自的保存虚拟机状态信息的文件,各自的作为服务器端的domain socket路径。

2、libvirtd进程在创建虚拟机配置QEMU进程时配置两个monitor,分别传入不同的标记参数,即monitor-0,monitor-1,libvirtd-0会连接monitor-0,libvirtd-1会连接monitor-1。

3、客户端(如virsh工具)连接libvirtd进程时,如果存在两个domain socket路径,则优先连接最近创建那个domain socket路径。

4、为libvirtd进程增加一个SIG_USR1信号处理函数,在收到SIG_USR1信号时,检查其作为服务器端的连接,在当前client时连接只有一个只读连接时往指定程序发送SIG_TERM信号,在当前没有连接时进程自动退出。

5、修改QEMU进程,增加可以pending(阻塞)或者取消pending发往libvirtd进程的event的功能,添加相应的QEMU Monitor Command来控制QEMU进程进行pending或者取消pending。

6、为libvirtd进程增加一导入接口,通过调用该接口可以从另一libvirtd进程的虚拟机状态文件中读取并导入虚拟机状态信息。

假设在当前情况下,libvirtd-0处于运行状态,libvirtd-1未启动,如图10(a)所示。Virsh会在需要时,作为客户端与libvirtd-0建立短连接,发送相关命令。在此,图中所示的Virsh应当理解为一个或者同一类用以实现类似功能的设备或程序,并不以图中所示的数量为限,其功能参考图2中的virsh工具210。QEMU进程能够通过配置的monitor向libvirtd进程发event。任一event均会通过monitor-0和monitor-1分别向libvirtd-0和libvirtd-1发送event。此时,由于libvirtd-1未启动,则event仅会被发送至libvirtd-0。

进行热升级时可以采用如下的处理流程:

1、安装新版本的libvirt软件。

2、pending QEMU进程发往libvirtd进程的event。图10(b)示出了此时的数据交互图。由于QEMU进程pending其发往libvirtd进程的event,原本需要发送的event会被保存在QEMU进程内部,暂停发送。

3、启动一监听程序C1,并且以只读方式连接(长连接)当前运行的libvirtd-0,对libvirtd-0进行监听。图10(c)示出了此时的数据交互图, 当通过libvirtd-0创建新的虚拟机时,libvirtd-0会发送相应的event给监听程序C1。

4、将libvirtd-0的虚拟机状态信息导入到libvirtd-1,然后启动libvirtd-1。图10(d)示出了此时的数据交互图,由于libvirtd-1启动时,会创建domain socket路径,当libvirtd-0和libvirtd-1同时运行时,客户端在尝试建立连接时,会优先连接至最近创建的domain socket路劲。因此,libvirtd-1启动后尝试建立短连接的Virsh均会自动连接至libvirtd-1。

同时,如果在将libvirtd-0的虚拟机状态信息导入到libvirtd-1后,还有通过libvirtd-0的连接创建了新的虚拟机,则上一步启动的监听程序会监听到对应的event’,监听程序会通过libvirtd-1的导入接口将新产生的虚拟机状态信息导入到libvirtd-1中。

5、发送SIG_USR1信号到libvirtd-0,libvirtd-0在收到后对其作为服务器端的连接进行检查,当只有一个客户端与其建立有只读连接时,发送一个SIG_TERM信号给监听程序,监听程序退出;当没有客户端与其连接时,Libvirtd-0退出。Libvirtd-0退出后,会自动断开其作为客户端的连接(与monitor-0的连接)。图10(e)示出了此时的数据交互图。

6、取消pending QEMU进程发往libvirtd进程的event。图10(f)示出了此时的数据交互图,对于pending后保存在内部、暂停发送的那些event,恢复发送,后续产生的event也可以正常进行发送。

此时由于libvirtd-1已经是基于更新后的libvirtd软件代码运行,即已经完成了整个升级过程。此后,仅需要重复上述过程,启动libvirtd-0并退出libvirtd-1,即可实现再一次热升级。

综上所述,在新的第二libvirtd进程启动后,由于此时已经完成新版本的libvirt软件的安装,第二libvirtd进程已经是基于新版本的软件代码运行的,同时该第二libvirtd进程的虚拟机状态信息已经在启动之前更新至与第一libvirtd进程一致,使libvirt软件的相关功能能够通过正确的第二libvirtd进程实现,从而在升级过程中避免libvirt软件的相关功能中断。

此外,本申请中通过在特定时间对QEMU进程发往libvirtd进程的第一事件消息进行阻塞或者取消阻塞,以及通过监听程序对第一时间段内通 过第一libvirtd进程创建新虚拟机的操作进行监听,避免第二libvirtd进程的虚拟机状态信息发生错误。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。

另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本申请的多个实施例的方法和/或技术方案。

对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装 置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1