一种软件更新方法及装置与流程

文档序号:12123207阅读:270来源:国知局
一种软件更新方法及装置与流程

本发明涉及计算机软件领域,尤其涉及一种软件更新方法及装置。



背景技术:

随着软件的运行,通常需要对软件进行优化升级,然而对于一些重要的系统和程序需要不间断地运行,任何处理的中断都会造成严重的后果,因此软件动态升级的方式被越来越多的使用,从而能够实现在不影响现有软件正常运行的情况下,对软件的部分组件的功能进行更新。

现有的软件动态升级的方式有通过热补丁的方式实现,具体包括通过编译单元编译补丁函数,使用加载单元加载补丁函数至操作系统的内存中,查找单元查找补丁函数对应的原函数的地址,修改单元依据地址改变原函数的指令,使得原函数与补丁函数之间的能够实现相互调用,调用单元调用原函数,直接通过原函数跳转执行补丁函数,补丁函数执行完后通过原函数返回。

然而,热补丁的方式具有较大局限性,需要通过编译生成特定的补丁函数,对编译器存在依赖,补丁生成也较为复杂。该方法也无法对正在执行的函数进行升级,容易导致升级过程阻塞在某些函数中。

现有的软件动态升级的方法还有基于动态插桩的方式实现,即在二进制级而非源码层次上向正在运行的源程序插入关键代码,使得升级不需要依赖特定编译器,基于异步检查点算法能够确保所有线程在动态升级前处于阻塞状态,从而能够一次性更新所有线程并避免新旧版本维护带来的开销,采用二进制重写的方式实现函数间接跳转,能够升级未在执行的待更新函数,利用堆栈重构的方式能够升级正在执行的待更新函数,使得动态升级消除了诸如更新循环体和主函数等带来的无法预计的等待时间。

以上动态插桩的方式虽然可以升级正在执行的待更新函数,但该方法要求软件在更新时所有线程都执行到插桩的位置,对于虚拟机而言,很可能发生处理器长时间运行在虚拟机中,而不运行需要升级的宿主机中的软件,从而执行不到插桩的位置,导致软件无法快速升级。其次,插桩的位置随着软件的复杂度增加,难度也在增加,从而无法实现大范围软件代码更新。



技术实现要素:

基于上述现有技术中的问题,本发明的目的在于提供一种软件更新方法及装置,不需要依赖编译器,技术难度小,能够实现大范围软件代码更新的方法。

根据本发明的第一个方面,提供一种软件更新方法,包括以下步骤:向本地输入目标版本软件;利用目标版本软件建立一第二虚拟机,作为本地的当前版本软件建立的第一虚拟机的迁移接收端;将对应第一虚拟机的数据迁移到第二虚拟机中;以及中断第一虚拟机,启动第二虚拟机,将第一虚拟机对应的网络流切换到第二虚拟机。

优选地,在中断第一虚拟机之前,第一虚拟机运行当前版本软件。

优选地,在利用目标版本软件建立一第二虚拟机的步骤之前还包括步骤:判断本地是否有足够建立第二虚拟机的存储空间,若是,则建立第二虚拟机;若否,则结束。

优选地,将对应第一虚拟机的数据迁移到第二虚拟机中的步骤包括:确认第一虚拟机中的需要复制的数据;在第一虚拟机工作的同时,将第一虚拟机中的数据复制到第二虚拟机;循环将第一虚拟机中被标记为发生修改的数据复制到第二虚拟机。

优选地,中断第一虚拟机,启动第二虚拟机的步骤包括:中断第一虚拟机;将第一虚拟机中最后的被标记为发生修改的数据复制到第二虚拟机;启动第二虚拟机。

优选地,通过socket端口复制数据。

优选地,第一虚拟机与第二虚拟机运行在本地的内存中。

优选地,将对应第一虚拟机的数据迁移到第二虚拟机中的步骤还包括:将本地硬盘中的数据挂载到第二虚拟机。

优选地,在中断第一虚拟机之前,获取第一虚拟机的第一虚拟网卡信息和第二虚拟机的第一虚拟网卡信息,启动第二虚拟机后将第一虚拟机对应的网络流通过网络流切换到第二虚拟机。

优选地,网络流切换的时间小于1ms。

优选地,数据包括第一虚拟机的内存数据和处理器数据、输入输出设备状态数据。

根据本发明的第二个方面,提供一种软件更新装置,包括:输入模块,输入模块向本地输入目标版本软件;创建模块,创建模块利用目标版本软件建立一第二虚拟机,作为本地的当前版本软件建立的第一虚拟机的迁移接收端;迁移模块,迁移模块将对应第一虚拟机的数据迁移到第二虚拟机中;切换模块,切换模块中断第一虚拟机,启动第二虚拟机,将第一虚拟机对应的网络流切换到第二虚拟机。

本发明通过虚拟机迁移的方法实现目标版本软件更新,由于第二虚拟机是通过目标版本软件创建的,因此当第二虚拟机取代第一虚拟机处理外部请求时,软件就自然地从当前版本软件升级为了目标版本软件,从而无需生成特定的软件代码补丁或二进制补丁,只需要准备一份目标版本软件。因此本发明的软件更新方法不需要依赖编译器,避免了生成补丁的步骤,降低了技术难度。由于不受限于复杂的计算,因此能够针对大范围软件代码更新。不需要为不同软件生成不同更新方案,因此具有通用性。

通过第一虚拟机与第二虚拟机间的迁移采用动态迁移的方式,保证了对于外部请求的正常响应。

第一虚拟机与第二虚拟机运行在同一宿主机的内存中,虚拟机动态迁移时,仅需要内存数据迁移,从而软件更新速度快。

整体的更新方法使得对于外部请求的中断时间很短,从而实现接近无损的软件更新过程。

附图说明

以下结合附图和具体实施例对本发明的技术方案进行详细的说明,以使本发明的特性和优点更为明显。

图1为本发明的宿主机的一个实例的结构示意图;

图2为本发明的软件更新方法的一个实例的流程图;

图3为图2中的步骤S105以及步骤S106的详细流程图;

图4为本发明的软件更新装置的一个实例的模块示意图。

具体实施方式

以下将对本发明的实施例给出详细的说明。尽管本发明将结合一些具体实施方式进行阐述和说明,但需要注意的是本发明并不仅仅只局限于这些实施方式。相反,对本发明进行的修改或者等同替换,均应涵盖在本发明的权利要求范围当中。

一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作描述成顺序的处理,但是其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。

本发明通过虚拟机迁移的方法实现宿主机中的软件更新,本发明所提供软件更新方法以及装置适用于宿主机-虚拟机下的虚拟环境,不适用于普通软件的动态升级。

图1为本发明的宿主机的一个实例的结构示意图。如图1所示,宿主机101包括处理器102、内存103以及硬盘104。

当前版本软件301存储在宿主机101的硬盘104中,当前版本软件301即是需要更新的软件。在其他实施例中,当前版本软件301也能存储在宿主机101的其他存储设备中。

第一虚拟机201通过当前版本软件301运行在宿主机101的内存103中。

目标版本软件302存储同样在宿主机101的硬盘104中。本发明所采用的软件更新方法是在同一宿主机101的本地完成,从而不需要进行虚拟机远程热迁移,加快了软件更新速度。

第二虚拟机202通过目标版本软件302在宿主机101的内存103中被创建。也就是说,第一虚拟机201与第二虚拟机202运行在同一宿主机101的内存中,这样的设置使得虚拟机在动态迁移时,仅需要内存数据迁移,从而有效缩短动态迁移时间,帮助实现接近无损的软件更新过程。需要注意的是,第一虚拟机201与第二虚拟机202虽然运行在同一宿主机101的内存中,但为了避免配置冲突两者并不是同时启动。

下面具体介绍本发明所提供软件更新方法。

图2为本发明的软件更新方法的一个实例的流程图。结合图1和图2所示,软件更新方法S100主要实施以下步骤:

步骤S101:向本地输入目标版本软件302。

步骤S102:判断本地是否有足够建立第二虚拟机202的内存空间。

步骤S103:利用目标版本软件302创建第二虚拟机202。

步骤S104:获取发送至第一虚拟机201的网络流,获取第一虚拟网卡(vnet)信息以及第二vnet信息。

步骤S105:将对应第一虚拟机201的数据动态迁移到第二虚拟机202中。

步骤S106:中断第一虚拟机201,启动第二虚拟机202。

步骤S107:将第一虚拟机201对应的网络流切换到第二虚拟机202。

结合图1与图2,首先如步骤S101,向宿主机101的硬盘104输入目标版本软件302,在此步骤时,目标版本软件302仅被存储在宿主机101的本地,还没有宿主机101的处理器102被实际运行。同时,在整个软件更新过程中,第一虚拟机201仍然通过当前版本软件301运行在宿主机101中,从而保证第一虚拟机201的运行不受软件更新的影响。

如步骤S102,判断本地是否有足够建立第二虚拟机202的存储空间。在本实施例中,第一虚拟软件201与第二虚拟软件202均运行在宿主机101的内存103中,也就是说在步骤S102中,判断宿主机101的内存103是否在第一虚拟机101存在的同时,具有足够的存储空间建立第二虚拟机202,如是则进行下面的步骤,如否则结束软件更新。

接着,如步骤S103,利用目标版本软件302创建第二虚拟机202。需要注意的是,此时第一虚拟机201中的应用仍然提供服务,因此不会对外部请求方产生影响。在此步骤中的第二虚拟机202仅包括虚拟机功能框架而不包括具体的内容数据,例如内存数据,输入输出状态数据,处理器数据等。

如步骤S104,获取发送至第一虚拟机201的网络流,获取第一vnet信息以及第二vnet信息。这里的第一vnet信息是指第一虚拟机201的虚拟网卡信息,第二vnet信息是指第二虚拟机202的虚拟网卡信息。步骤S104是为了之后第二虚拟机202启动时,能够将网络流从第一虚拟机201切换至第二虚拟机202做准备。

接着如步骤S105,将对应第一虚拟机201的数据动态迁移到第二虚拟机202中。如步骤S106,中断第一虚拟机201,启动第二虚拟机202。

由于第二虚拟机202是通过目标版本软件302创建的,因此当第二虚拟机202取代第一虚拟机201处理外部请求时,软件就自然地从当前版本软件301升级为了目标版本软件302。

图3为图2中的步骤S105以及步骤S106的详细流程图。下面参考图3和图1具体说明步骤S105以及步骤S106。

如图3所示,步骤S105包括:

步骤S1051:确认对应第一虚拟机201的需要复制的数据。

步骤S1052:第二虚拟机202接收准备。

步骤S1053:第一虚拟机201复制数据。

步骤S1054:第一虚拟机201发送数据。

步骤S1055:第二虚拟机202接收数据。

步骤S1056:第一虚拟机201复制标记为发生修改的数据。

步骤S1057:第一虚拟机201判断复制是否完成。

具体而言,首先如步骤S1051,确认对应第一虚拟机201需要复制的数据,由于第一虚拟机201与第二虚拟机202均运行在同一宿主机101的内存中,因此需要复制的数据不包括硬盘中的数据。需要复制的数据包括第一虚拟机的内存数据,输入输出设备状态数据,处理器数据。与此相对,如步骤S1052,第二虚拟机202进行接收准备。在本实施例中,在第一虚拟机201与第二虚拟机202中分别建立socket端口,并通过两个socket端口建立一个双向的通讯连接,从而通过socket端口复制数据。socket原本是为网络通讯设计的,但socket也可以实现同一宿主机的不同进程(即不同虚拟机)间的通信。socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同,例如网络通信的socket地址是IP地址加端口号,而进程通信的socket地址是一个socket类型的文件在文件系统中的路径。

接着在第一虚拟机201中的应用提供服务的同时,将第一虚拟机201中的数据复制到第二虚拟机,即如步骤S1053第一虚拟机201复制数据,步骤S1054第一虚拟机201发送数据,如步骤S1055第二虚拟机202接收数据。

采用socket文件传输实施步骤S1054以及步骤S1055,由于socket文件传输速率很快,因此能够在很短时间内将第一虚拟机中的数据复制到第二虚拟机,缩短软件更新时间。

由于第一虚拟机201与第二虚拟机202均运行在同一宿主机101的内存103中,因此复制以及传输发生在同一物理机中的内存至内存之间,可以完全省略硬盘中数据的复制,从而缩短软件更新时间。

然后循环将第一虚拟机201中被标记为发生修改的数据复制到第二虚拟机202。对于复制过程中发生修改的数据需要进行标记,并对标记为发生修改的数据进行多次循环更新,从而确保第二虚拟机202与第一虚拟机201中数据的一致性。具体如步骤S1056第一虚拟机201复制标记为发生修改的数据,步骤S1054第一虚拟机201发送复制数据,步骤S1055第二虚拟机202接收复制数据,并通过步骤S1057第一虚拟机201判断复制是否完成来进行步骤S1056、步骤S1054以及步骤S1055的循环。复制完成的条件可以通过预先设置的条件进行判断,例如剩余的标记为发生修改的数据量小于一个阈值。

针对宿主机101硬盘104中的数据,通过挂载操作将数据从第一虚拟机201迁移到第二虚拟机202。挂载操作即不对数据进行拷贝,而是将数据对应的第一虚拟机201的文件在第二虚拟机202进行挂载。从而在对虚拟机的迁移过程中,避免了对硬盘中数据的复制操作,减少迁移消耗,提升迁移速度。

在第一虚拟机201判断复制完成时,进入步骤S106。步骤S106包括:

步骤S1061:第一虚拟机201中断应用。

步骤S1062:第一虚拟机201复制最后的标记为发生修改的数据。

步骤S1054:第一虚拟机201发送复制数据。

步骤S1055:第二虚拟机202接收复制数据。

步骤S1063:第二虚拟机202启动应用。

具体而言,首先如步骤S1061,中断第一虚拟机201运行,在此之前的步骤执行时,第一虚拟机201中仍然提供服务,直到此步骤执行时外部请求将无法再被处理。如步骤S1062,将第一虚拟机201中最后的被标记为发生修改的数据复制到第二虚拟机202,其中最后的被标记为发生修改的数据是指在步骤S105执行后还没有迁移至第二虚拟机202的数据。即将在步骤S105执行后还没有被复制的标记为发生修改的数据进行复制,从而保证数据完整性,不被遗失。如步骤S1054,第一虚拟机201发送复制数据,如步骤S1055第二虚拟机202接收复制数据。最后执行步骤S1063,启动第二虚拟机202。

在第二虚拟机202启动后,执行步骤S107,将第一虚拟机201对应的网络流切换到第二虚拟机202。具体而言,根据在步骤S104获取第一vnet信息以及第二vnet信息,在执行步骤S107时,只需要宿主机101将实时监控并接收到的网络流从第一vnet信息转换为第二vnet信息,即能完成网络流切换。当流量切换完成时,外部请求将重新得到响应。由于采取本发明的上述方法,网络流切换的时间小于1ms,从而外部流量中断响应的时间非常短,因此不会引起外部请求人感知变化,从而实现接近无损的软件更新过程。

需要注意的是,上述实施例以及变形实施例中介绍的软件更新方法中的虚拟机动态迁移方法并不是唯一的方法,凡是能够实现将第一虚拟机201动态迁移至第二虚拟机202的其他方法均能适用在本发明中。

本发明还提供了一种软件更新装置,图4为本发明的软件更新装置的一个实例的模块示意图。如图4以及图1所示,软件更新装置401设置在宿主机101中,包括输入模块402、创建模块403、迁移模块404以及切换模块405。输入模块402用于向本地输入目标版本软件302。创建模块403利用目标版本软件302建立第二虚拟机202,作为本地的当前版本软件301建立的第一虚拟机201的迁移接收端。迁移模块404将对应第一虚拟机201的数据迁移到第二虚拟机202中。切换模块405中断第一虚拟机201,启动第二虚拟机202,将第一虚拟机201对应的网络流切换到第二虚拟机202。具体各个模块的运行方法如上述的软件更新方法,此处不再赘述。

本发明通过虚拟机迁移的方法以及装置实现软件更新,无需任何形式的补丁,从而避免了补丁所带来的需要依赖编译器,技术难度大,不具有通用性等问题。由于不受限于复杂的计算,因此能够针对大范围软件代码更新。

本发明所提供的软件更新方法更新时间短,能够实现接近无损的软件更新过程。

以上仅是本发明的具体应用范例,对本发明的保护范围不构成任何限制。除上述实施例外,本发明还可以有其它实施方式。凡采用等同替换或等效变换形成的技术方案,均落在本发明所要求保护的范围之内。

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