升级方法及装置与流程

文档序号:14394501阅读:192来源:国知局

本申请涉及软件领域,具体而言,涉及一种升级方法及装置。



背景技术:

在云计算环境中,一个数据中心的计算资源通过虚拟化技术切分为大量虚拟机(virtualmachine,简称为vm,vm是一台服务器上虚拟出来的多个可以运行os的实例),用户可以在vm中灵活部署自己的应用或者服务,例如,web、社交、游戏、金融等,在这些应用或服务中,有些应用或服务保存着重要的数据,需要较低的数据读写时延,并需要7*24小时不间断服务、以及足够好的可用性和sla(service-levelagreement,服务等级协议)保障。随着数据中心后台软件的迭代,不断有新功能的加入,以及性能优化、缺陷修复等,因此这些应用或服务也需要频繁的升级。

由于vm虚拟机再易用性、可用性、性能、成本等多方面越来越完善,越来越多的用户将应用部署在数据中心里集中管理的vm里,数据中心的后台软件迭代、升级的需求也越来越多。随着数据中心后台软件的迭代,新功能开发、性能优化、缺陷修复等都会需要进行软件升级。这些软件也包括虚拟机磁盘的后端驱动软件,而后端驱动软件位于物理机的内核态,升级这种驱动软件现有的方法主要是停机方式(这种方式成为冷升级):将物理机上的所有vm关机,让所有磁盘对应后端驱动里的对象释放,再卸载后端驱动软件并安装新的驱动软件,最后将所有vm重新启动,vm磁盘基于新的驱动运行,升级完成。这个升级过程需要花费数分钟,停止一台vm可能比较快,在vm较多的情况下,有的vm可能关机慢,将其它vm的停机时间也拖长,对于那些部署了重要业务的vm,web应用可能会长时间不可访问,游戏应用可能会导致玩家掉线,严重影响了用户体验,。

针对现有技术中冷升级需要关闭vm虚拟机再进行升级,导致升级过程中用户不能访问vm虚拟机的技术问题,目前尚未提出有效的解决方案。



技术实现要素:

本申请实施例提供了一种升级方法及装置,以至少解决采用冷升级的方式对vm的后端服务进行升级所导致的服务中断的技术问题。

根据本申请实施例的一个方面,提供了一种升级方法,包括:安装新的驱动模块,其中,新的驱动模块用于驱动后端服务,后端服务为运行在计算设备上用于接收并处理io请求的服务,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘进行io操作的请求,虚拟化平台运行在计算设备上;查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备,其中,虚拟字符设备用于通知存储设备处理io请求,存储设备用于存储io请求对应的数据;将查找到的虚拟块设备和虚拟字符设备与新的驱动模块关联,其中,每个查找到的所述虚拟块设备和字符设备停止接收新的io请求;在确定旧的驱动模块处理完成已经接收到的io请求,并重新启用所述虚拟块设备和所述虚拟字符设备之后,使用新的驱动模块替换所述旧的驱动模块来处理io请求的替换。

根据本申请实施例的另一个方面,还提供了一种升级装置,包括:安装模块,用于安装新的驱动模块,其中,新的驱动模块用于驱动后端服务,后端服务为运行在计算设备上用于接收并处理io请求的服务,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘进行io请求,虚拟化平台运行在计算设备上;查找模块,用于查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备,其中,虚拟字符设备用于通知存储设备处理io请求,存储设备用于存储io请求对应的数据;关联模块,用于将查找到的虚拟块设备和虚拟字符设备与新的驱动模块关联,其中,每个查找到的虚拟块设备和字符设备停止接收新的io请求;处理模块,用于在确定旧的驱动模块处理完成已经接收到的io请求,并重新启用虚拟块设备和虚拟字符设备之后,使用新的驱动模块替换旧的驱动模块来处理io请求的替换。

根据本申请实施例的一个方面,提供了一种升级方法,包括:关闭虚拟机的前端驱动与旧的后端驱动之间的io链路;在旧的后端驱动处理完成已经接收到的io请求之后,停用虚拟机的虚拟块设备和虚拟字符设备;安装新的驱动模块,并将新的驱动模块接入虚拟块设备和虚拟字符设备的入口函数,其中,新的驱动模块用于将前端驱动下发的新io请求转发给后端服务进程;重新启动虚拟块设备和虚拟字符设备,并打开前端驱动与新的驱动模块之间的io链路,完成旧的后端驱动升级为新的驱动模块。

根据本申请实施例的另一个方面,还提供了一种升级装置,包括:关闭模块,用于关闭虚拟机的前端驱动与旧的后端驱动之间的io链路。停止模块,用于在旧的后端驱动处理完成已经接收到的io请求之后,停用虚拟机的虚拟块设备和虚拟字符设备。安装模块,用于安装新的驱动模块,并将新的驱动模块接入虚拟块设备和虚拟字符设备的入口函数,其中,新的驱动模块用于将前端驱动下发的新io请求转发给后端服务进程。驱动模块,用于重新启动虚拟块设备和虚拟字符设备,并打开前端驱动与新的驱动模块之间的io链路,完成旧的后端驱动升级为新的驱动模块。

在本申请实施例中,在安装新的驱动模块之后,该新的驱动的内容就被安装在了计算设备上,从而可以通过查找设备以及复制的方式进行驱动的替换,查找设备以及复制替换不需要消耗太长时间,对vmio操作的影响较小,提高了升级的速度,进而解决了采用冷升级的方式对vm的后端服务进行升级所导致的服务中断的技术问题。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1是根据本申请实施例1的升级方法的计算设备的硬件结构图;

图2是根据本申请实施例1的vm磁盘io处理整体结构示意图;

图3是根据本申请实施例1的升级方法的流程图;

图4是根据本申请实施例1的升级方法的交互图;

图5是根据本申请实施例1的热升级设备的结构示意图;

图6是根据本申请实施例1的热升级示意图;

图7是根据本申请实施例1的热升级方法的流程图;

图8是根据本申请实施例2的升级装置的结构框图;

图9是根据本申请实施例3的热升级方法的流程图;

图10是根据本申请实施例4的升级装置的结构框图;以及

图11是根据本发明实施例5的一种计算机终端的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

以下实施例中涉及到的英文缩写的中文含义如下:

vm:vmware虚拟机,一台服务器上虚拟出来的多个可以运行os的实例,可以使用户在一台物理机上同时运行两个或更多windows、dos、linux系统;

disk:磁盘,存储数据的介质;

io:读写请求;

bio:bio是内核中通用块层的一个核心数据结构,用于描述块设备的i/o操作,联系了内存缓冲区与块设备;

poll:字符设备驱动中的一个函数,在系统调用select内部时被使用,作用是把当前的文件指针挂到设备内部定义的等待队列中;

私有数据:应用程序设计中需要提供线程私有的全局变量,这个变量仅在线程有效,但却可以跨过多个函数访问。例如,在程序里需要每个线程维护一个链表,而使用相同的函数来操作这个链表,可以使用同名而不同变量地址的线程相关数据结构,成为线程私有数据;

latency:io的时延,发出请求到完成所花费的时间;

sla:service-levelagreement,服务等级协议;

xen:开源虚拟化平台;

xenbus:xen虚拟化平台的虚拟设备总线;

eventchannel:xen虚拟化平台前后端事件通道;

raid:磁盘阵列,由多个磁盘自合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果,提升整个磁盘系统效能。

实施例1

根据本申请实施例,还提供了一种读写请求处理方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

本申请实施例一所提供的方法实施例可以在计算设备或者类似的运算装置中执行。这种计算设备可以是现有的计算机,例如,个人电脑pc,或者也可以是服务器。随着技术的发展,当移动终端的计算能力逐渐加强的时候,移动终端也可以充当这种计算设备。计算设备可以基于现有的架构,例如,图1是根据本申请实施例的实施读写请求处理方法的计算设备的硬件结构图。如图1所示,计算设备10可以包括一个或多个(图中仅示出一个)处理器102(处理器102可以包括但不限于微处理器mcu或可编程逻辑器件fpga等的处理装置)、用于存储数据的存储器104、以及用于通信功能的输入/输出接口106。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,计算设备10还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。

存储器104可用于存储应用软件的软件程序以及模块,如本申请实施例中的io请求处理方法对应的程序指令/模块,处理器102通过运行存储在存储器104内的软件程序以及模块,从而执行各种功能应用、也可以执行各种服务以及数据处理。即实现上述的io请求处理方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至计算设备10。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

输入/输出接口106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算设备10的通信供应商提供的无线网络。在一个实例中,输入/输出接口106包括一个网络适配器(networkinterfacecontroller,nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,输入/输出接口106可以为射频(radiofrequency,rf)模块,其用于通过无线方式与互联网进行通讯。

此处需要说明的是,在一些可选实施例中,上述图1所示的计算机设备(或移动设备)可以包括硬件元件(包括电路)、软件元件(包括存储在计算机可读介质上的计算机代码)、或硬件元件和软件元件两者的结合。应当指出的是,图1仅为特定具体实例的一个实例,并且旨在示出可存在于上述计算机设备(或移动设备)中的部件的类型

上述的计算设备可以是单独的一台设备,上述计算设备也可以是服务器集群,或者是构成云计算平台的基础。

本申请实施例应用于虚拟机,虚拟机运行在虚拟平台上,该虚拟平台运行在计算设备上。虚拟平台上可以运行一个或多个虚拟机。虚拟机vm可以通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实操作系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对计算设备上的真正的系统产生任何影响。并且,虚拟机中的操作系统还可以与还具有能够在计算设备上的操作系统进行灵活切换。虚拟机中可以运行多种类的操作系统,例如,windows系统、各种版本的linux系统、macos系统。

现有的虚拟平台有vmware、virtualbox和virtualpc,它们都能在操作系统为windows系统的计算设备上虚拟出多个虚拟机。现有的虚拟平台还有xen、openvz、kvm。其中,xen是半虚拟化技术,相当于自己运行了一个内核的实例,可以自由的加载内核模块,虚拟的内存和io,稳定而且可预测。xen计算分为xen+pv和xen+hvm,区别就是pv只支持linux,而hvm支持win系统。openvz是操作系统级别的虚拟化技术,是底层操作系统上的一层应用,这意味着易于理解和低权重开销,一般来说也意味着更优的性能,并且是openvz配置起来也比较灵活。kvm和xen类似,比xen更好的一点是,kvm是完全虚拟的,所以不分pv和hvm的区别,所有的kvm类+型的虚拟技术都可以装各种linux的发行版和各种win的发行版。

图2是根据本申请实施例1的vm磁盘io处理整体结构示意图,如图2所示,使用xen部署虚拟化平台以后,一台物理机可以虚拟出很多个vm,该示例中的计算设备运行了多个虚拟机vm1……vmn,每个虚拟机上可以有一个或多个磁盘,例如,系统盘和数据盘,用户在这些vm内部署的应用(如web、游戏、财务等)会读取和存放数据到vm内的磁盘,vm至少会有一个系统盘,存放操作系统,可能有多个数据盘,数据盘存放自己的业务数据,每个磁盘都连接前端驱动,前端驱动是虚拟机中的磁盘驱动,前端驱动通过虚拟化平台连接后端驱动,io请求经过vm内的前端驱动,再经过虚拟化平台到达后端驱动,后端驱动需要将io请求转发给一个后端服务进程,后端服务进程将请求提交给后端存储,如分布式文件系统或者本地raid存储。虚拟化平台运行在计算设备上,通过计算设备连接存储设备(或称为后端设备),提供后端存储服务。该存储设备可以包括:分布式存储设备和/或本地磁盘阵列raid存储设备。

选择采用哪些类型的存储设备,可以根据不同的虚拟机的功能来进行选择。例如,有的虚拟机中运行的服务要求有足够好的数据可靠性,此时数据需要有多个冗余备份,这样即使单个虚拟机宕机也不影响使用,这种情况下,可以将vm磁盘接入到分布式存储。又例如,有的虚拟机中运行的服务要求比较高的性能,此时io的延时要求比较低,如果这些服务不需要进行冗余备份或者已经解决了冗余备份的问题,此时,这些服务可以接入本地raid存储。

在上述运行环境下,本申请实施例提供了如图3所示的升级方法。在以下实施例中涉及到后端服务,后端服务为运行在计算设备上用于接收并处理io请求的服务,该计算设备上运行了虚拟化平台,虚拟化平台上运行了一个或多个虚拟机,每个虚拟机都可能对该虚拟的磁盘提交io请求。在每个虚拟机上,可以分为系统磁盘和至少一个数据磁盘。对于这些磁盘均可能被虚拟机中的应用或服务访问,即虚拟机会提交对磁盘的io请求,以进行io操作。图3是根据本申请实施例1的升级方法的流程图,如图3所示,该流程包括如下步骤:

步骤s302,安装新的驱动模块,其中,新的驱动模块用于驱动后端服务,后端服务为运行在计算设备上用于接收并处理io请求的服务,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘进行io操作的请求,虚拟化平台运行在计算设备上。

步骤s304,查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备,其中,虚拟字符设备用于通知存储设备处理io请求,存储设备用于存储io请求对应的数据。

作为一种可选的实施例,在一些vm的具体应用中,虚拟块设备(tap块设备)和虚拟字符设备(tap字符设备)并不是真实的外接设备,二者的驱动实现也是后端驱动的一部分。虚拟块设备的驱动用于接收内核线程所提交的bio请求,虚拟字符设备的驱动用于通过mmap接口将请求映射给用户态服务进程,虚拟字符设备驱动也可以实现poll事件通知,通知用户态服务进程处理io请求,用户态服务进程最后再将io提交给后端分布式存储或者本地raid存储。

步骤s306,将查找到的虚拟块设备和虚拟字符设备与新的驱动模块关联,其中,每个查找到的所述虚拟块设备和字符设备停止接收新的io请求。

在上述步骤中,保留查找到的虚拟块设备和虚拟字符设备,用于在安装新的驱动模块后,采用新的驱动模块来处理io请求时,能够使新的驱动模块与后端驱动的虚拟块设备和虚拟字符设备通信,从而使用新的驱动模块处理io请求。

步骤s308,在确定旧的驱动模块处理完成已经接收到的io请求,并重新启用所述虚拟块设备和所述虚拟字符设备之后,使用新的驱动模块替换所述旧的驱动模块来处理io请求。

在上述步骤中,通过新的驱动模块与旧的驱动模块的替换,使得在重新启动处理io请求时,io请求能够通过升级后的新的驱动模块进行处理,实现了后端服务的升级过程。

通过上述步骤,采用在安装新的驱动模块之后,该新的驱动的内容就被安装在了计算设备上,从而可以通过查找设备以及复制的方式进行驱动的替换,由于查找设备以及复制替换消耗时间少,对vm虚拟机的io操作影响较小,因此能够达到提高了升级速度的技术效果,进而解决了采用冷升级的方式对vm的后端服务进行升级所导致的服务中断的技术问题。

此处需要说明的是,上述方案在旧的驱动模块完成已经接收到的请求后,安装新的驱动模块,并通过重新启用虚拟块设备和虚拟字符设备来使用新的驱动模块处理请求。由此可知,上述方案直接采用新的驱动模块来处理新的请求,由于应用于虚拟机平台的后端服务升级,虚拟机平台可以运行多种软件或程序,因此相对于现有技术中仅为某个单独的web服务器的升级,使用上述升级方法无需对虚拟机上的每一个程序和软件进行一一升级,而是对整个后端服务进行升级,也就是说,上述方案所适用更多的场景和范围,具有更好的效果。

还需要注意的是,由于上述方案中包括步骤“查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备”以及“将查找到的所述虚拟块设备和所述虚拟字符设备与所述新的驱动模块关联”,而上述方案是在“内核态”中进行才具有特征,因此,与现有技术中在“用户态”进行的升级相比,“内核态”的升级过程能够适用于更多的应用场景。

图4是根据本申请实施例1的升级方法的交互图,在一种可选的实施例中,该升级系统包括新的驱动模块40以及升级模块42,结合图4所示,步骤s401,安装新的驱动模块40;步骤s403,升级模块42查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备;步骤s405,升级模块42将查找到的虚拟块设备和虚拟字符设备与新的驱动模块40关联;步骤s407,升级模块42使用新的驱动模块40替换旧的驱动模块来处理io请求。

根据本申请上述实施例,在执行步骤s302的过程中,采用复制的方式完成所述新的驱动模块与所述旧的驱动模块的替换包括以下至少之一:

步骤s3021,复制新的驱动模块中的函数替换旧的驱动模块的函数。

结合图5所示的示例,可以通过数据拷贝与替换模块进行新旧驱动模块中函数的替换,在一种可选的实施例中,在无需保存旧的驱动模块中的函数的情况下,可以获取新的驱动模块中的函数,并使用新的驱动模块中的函数来替换就的驱动模块中的函数,采用这种实施方式,被替换的旧的驱动模块中的函数将不被保留,在使用新的驱动模块进行io请求处理的情况下,当调用旧的驱动模块的函数时,由于旧的驱动模块函数已经被新的驱动模块的函数替代,因此可以直接调用新的驱动模块的函数。

例如,上述函数可以包括:建立连接函数、断开连接函数、事件通知函数的情况下,使用新的驱动函数中的建立连接函数、断开连接函数、事件通知函数分别替换旧的驱动函数中的建立连接函数、断开连接函数、事件通知函数,在启动新的驱动模块进行io处理后,在调用旧的建立连接函数、断开连接函数、事件通知函数时,由于对旧的函数进行了替换,因此就能够直接调用新的启动模块的建立连接函数、断开连接函数、事件通知函数。

步骤s3023,复制旧的驱动模块中的数据到新的驱动模块中,其中,数据至少包括:全局变量。

在一个可选的实施例中,如果需要保存旧的驱动模块中的数据,就可以复制旧的驱动模块中的数据到新的驱动模块中。复制数据可以是复制数据的本身,或者,复制也可以包括数据结构的调整,例如,如果新的驱动模块的数据数据结构发生了变化,则可以按照新的数据结构拷贝到新的驱动模块中。

在一种可选的实施例中,仍然结合图5所示的示例,采用数据拷贝与替换模块将旧的驱动模块中的数据复制到新的驱动模块数据中,以上述数据为全局变量作为示例,由于全局变量可以被程序中的所有函数引用,无论使用旧的驱动模块从处理io请求,还是使用新的驱动模块处理io请求,都无需改变,因此将旧的驱动模块中的全局变量复制到新的驱动模块中即可,新的驱动模块在处理io请求时就可以调用全局变量,无需对全局变量进行添加或改变。

此处需要说明的是,在上述步骤中复制到新的驱动模块中的数据包括全局变量,但不限于全局变量,在使用新的驱动模块来处理io请求时仍需要使用的旧的驱动模块中的数据,都应该复制到新的驱动模块中。

此处还需要说明的是,函数的复制与数据的复制可以同时实施,也可以单独实施,可以根据升级的实际内容来进行确定。

图6是根据本申请实施例1的升级方法的示意图,结合图6所示,采用本申请提供的后端服务的升级方法,需要准备一个新的驱动模块和一个升级模块,新的驱动模块安装以后,可以让所有新创建的vm的io链路走新的驱动,但仍然会有正在运行的vm是在旧的驱动模块的基础上创建的,并且我们不能停止这些vm,因此安装升级模块时,会执行驱动的热升级,即将所有正在运行的vm的io链路基于新的驱动模块进行升级,在一种可选的实施例中,步骤s3021或步骤s3023都可以是基于新的驱动模块对正在运行的vm的io链路进行升级的方法。

上述步骤通过复制新的驱动模块中的函数替换旧的驱动模块的函数,复制旧的驱动模块中的数据到新的驱动模块中,从而达到了在重新启动虚拟块设备和虚拟字符设备之后,使用新的驱动模块替换旧的驱动模块的目的。

根据本申请上述实施例,步骤s3021,复制所述新的驱动模块中的函数替换旧的驱动模块的函数可以通过如下方式进行:

步骤s3023,将注册的后端驱动的驱动函数使用新的驱动模块中的驱动函数覆盖,其中,驱动函数包括如下至少之一:建立连接函数、断开连接函数、事件通知函数。

在一种可选的实施例中,结合图5所示,仍以虚拟平台为xen平台为例,后端驱动的驱动函数需要通过xenbus驱动升级/回退模块进行升级,则可以复制新的驱动模块中的建立连接函数、断开连接函数、事件通知函数,分别来替换旧的驱动模块中的建立连接函数、断开连接函数、事件通知函数。

在另一种可选的实施例中,在升级的过程中可以选择发生变化的函数,仅对发生变化的函数进行升级,例如,事件通知函数发生了变化,则升级事件通知函数,没有变化的函数则可以不升级。在这一实施例中,为了区分发生变化的函数和未发生变化的函数,可以在新的驱动模块中添加一个标识,该标识用于表明该函数发生了变化。

作为又一个可选的实施例,还可以在新的驱动模块中只包括变化的函数,这样在升级的过程中就不需要根据标识来进行判断了。或者,作为一种比较简单的处理方式,可以不进行标识,只要是新的驱动模块中的函数,无论其是否发生变化,均进行升级。

通过上述步骤,在重新启动处理io请求的情况下,在调用旧的后端驱动函数时,由于旧的后端驱动函数已经被新的驱动模块函数所替换,因此就能够直接调用到新的驱动模块函数。

根据本申请上述实施例,步骤s3021,复制所述新的驱动模块中的函数替换旧的驱动模块的函数还可以通过如下方式进行:

步骤s3025,获取所述新的驱动模块中的所述虚拟块设备和/或虚拟所述字符设备的入口函数。

在一种可选的实施例中,结合图5所示的示例,通过符号查找模块查找新驱动的符号,即新的驱动模块中的虚拟块设备和/或虚拟字符设备的入口函数。

步骤s3027,复制所述新的驱动模块中的驱动入口函数替换所述虚拟块设备和/或所述虚拟字符设备的驱动入口函数。

在一种可选的实施例中,结合图5所示的示例,通过入口函数替换模块采用新驱动里的符号替换tap字符设备和tap块设备的驱动入口函数,其中,新的驱动模块里的符合包括新的驱动模块的tap字符设备和tap块设备的驱动入口函数。

在使用虚拟块设备和/或虚拟字符设备的情况下,则需要考虑这两个设备的驱动的升级,其中,计算设备上的每个虚拟机磁盘分别对应一个虚拟块设备和一个虚拟字符设备,虚拟块设备的驱动用于接收内核线程提交的io操作的请求;虚拟字符设备的驱动用于将io操作的请求映射给用户态服务进程,以供用户态服务进程将io操作的请求提交给存储设备。

通过这两个设备的驱动入口函数的复制,在这两个虚拟设备需要升级的时候完成了升级。该升级的过程也是通过复制的方式进行的,从而消耗时间较少。

根据本申请上述实施例,步骤s3021,复制所述新的驱动模块中的函数替换旧的驱动模块的函数还可以通过如下方式进行:

步骤s3029,获取所述新的驱动模块中用来表示所述虚拟块设备结构的文件系统的入口函数。

步骤s3031,复制所述新的驱动模块中的用来表示所述虚拟块设备结构的文件系统的入口函数,替换所述旧的驱动模块中的所述虚拟块设备对应的入口函数。

此处需要说明的是,虚拟块设备还可以通过用来表示虚拟块设备结构的文件系统(例如,sysfs接口函数)实现与用户态的一些配置交互,例如pause/unpause/remove/状态查看等。在对后端驱动进行升级后,也需要对虚拟块设备结构的文件系统的入口函数进行升级,从而使得在后端驱动升级后,虚拟块设备能够重新于用户态的一些配置进行交互。

在一种可选的实施例中,结合图5所示的示例,文件系统的入口函数可以为sysfs函数,通过入口函数替换模块,采用新驱动里的sysfs入口函数替换tap块设备时的sysfs入口函数,使得虚拟块设备能够通过新的sysfs入口函数与童虎太的一些配置进行交互。

根据本申请上述实施例,在复制旧的驱动模块中的数据到新的驱动模块中之前,上述方法还包括:

步骤s3033,基于新的驱动模块分配新的驱动私有数据替代旧的驱动模块的私有数据。

步骤s3035,复制旧的驱动模块中的数据到新的驱动模块中包括:复制旧的驱动模块中的全局变量到新的驱动模块中。

在一种可选的实施例中,结合图5所示的示例,通过数据拷贝与替换模块将旧的驱动模块中的全局变量复制到新的驱动模块中。

根据本申请上述实施例,上述方案还可以包括步骤s310,对于每个查找到的虚拟机磁盘设备停止接收新的io请求,其中,步骤s310包括:

步骤s3101,关闭事件中断处理使后端服务接收不到io操作的请求。

需要说明的是,在vm虚拟机中,不仅仅包含虚拟机磁盘设备,还包含有网络设备,因此,在进行后端服务升级之前,需要查找虚拟机中的磁盘设备。在一种可选的实施例中,结合图5所示的示例,可以通过后端设备查找模块来查找虚拟机磁盘,如果查找到网络设备,则忽略即可,如果查找到虚拟机磁盘设备,则可以根据虚拟机磁盘采用的不同的io处理方式来暂停其接收新的io操作。

在上述步骤中,io操作的请求是通过事件中断的方式来进行通知的,在关闭了时间中断之后,那么,就无法接收到io操作的请求了。

根据本申请上述实施例,上述方案还可以包括如下步骤s312,确定处理完成已经接收到的io请求,其中,步骤s312包括:

步骤s3121,在接收到的io请求处理完成之后,保持后端服务为空闲状态。

在一种可选的实施例中,为了保持后端服务为空闲状态,可以每个查找到的磁盘设备执行停止io的操作,先关闭前后端之间的事件通道中断,不让前端io提交io到后端,等前后端ioring(环形缓冲区)、虚拟块设备请求队列、虚拟块设备等待队列中的请求都完成,则确保后端已经将接收到的请求都完成,此时,后端保持在一个空闲的状态。

以虚拟化平台为xen作为示例,用户应用的读写请求会经过文件系统提交给vm磁盘的前端驱动,前端驱动是一个块设备驱动,它与后端驱动为每个磁盘建立一个事件通道和一个基于内存映射的ioring(缓冲区),前端驱动将io封装后插入ioring,并由事件通道(eventchannel)通知后端驱动,事件通道是xen虚拟化平台提供的一种domain(域名)与domain之前互相通知的通道,在io链路上,事件通道通知后端驱动io请求已经放入ioring,以及通知前端驱动io回复已经放入ioring,前后端驱动会以中断的方式收到eventchannel通知,注册对应中断函数后,就可以实现io请求后续的处理,每个vm磁盘会创建一个eventchannel。后端驱动比较复杂且在内核态,为了数据安全和系统稳定,热升级的过程中需要短暂的停止io的处理,因此需要通过io处理停止/启动模块停止eventchannel的事件通知。

步骤s3123,停止虚拟块设备和虚拟字符设备之后,停止后端服务中的内核线程。

仍以虚拟化平台为xen作为示例,由于中断处理函数不能太复杂,因此eventchanel事件对应的中断处理函数,只负责通知后端驱动io请求已经到达,后端驱动里每个磁盘由一个内核线程从ioring里取出io请求,解析io请求上下文,并将io请求数据部分通过xen虚拟化平台提供的内存映射接口映射到后端驱动,并封装为内核io数据结构bio提交给tap块设备,这个内核线程也是io请求处理的重要部分。升级驱动时需要通过内核线程停止/启动模块将内核线程退出,并使用新的处理函数启动新的内核线程。

通过上述步骤,将所有的旧驱动创建的链路都清理完毕。

同理,确定io操作处理完成在采用虚拟块设备的情况下,也可以包括停止虚拟块设备以及内核线程。例如,确定已经接收到的io操作处理完成包括:在接收到的io操作处理完成之后,保持后端服务为空闲状态;停止虚拟块设备的队列,其中,计算设备上的每个虚拟机磁盘分别对应一个虚拟块设备,虚拟块设备用于接收内核线程提交的io操作的请求;停止后端服务中的内核线程。

根据本申请上述实施例,在复制所述新的驱动模块中的驱动入口函数替换所述虚拟块设备和/或所述虚拟字符设备的驱动入口函数之后,所述方法还包括:

步骤s3125,启动虚拟块设备的队列。

步骤s3127,根据升级后的后端驱动的函数,建立新的内核线程。

步骤s3129,启动事件中断处理。

本申请上述步骤重启虚拟块设备队列,让虚拟块设备可以处理io。用户新驱动里的处理函数创建新的后端链路内核线程。这些准备工作都完成后,就可以打开前后端事件通道(eventchannel)中断,将vm的读写请求放行到新的驱动模块。

根据本申请上述实施例,当升级虚拟机的后端驱动的过程中,或升级虚拟机的后端驱动之后,出现异常,还可以包括如下步骤:

步骤s314,当升级虚拟机的后端驱动的过程中,或升级虚拟机的后端驱动之后,出现异常,则采用升级方法将旧的驱动模块进行恢复。

在一种可选的实施例中,结合图5所示的示例,可以通过升级回滚模块在升级出现异常时,或升级后出现异常时,采用旧的驱动模块中的函数和数据来替换新的驱动模块中的函数和数据。

需要说明的是,如果升级的过程中出现了问题,则还可以按照本实施例的方法进行还原,不同的是,需要使用旧的驱动模块将新的驱动模块替换掉。

上述介绍了多种虚拟化平台,例如,vmware、virtualbox、virtualpc、xen、openvz、kvm。下面以xen为例进行说明,以xen为例的原因是:目前比较倾向于选择xen,因为它是对供应商和和客户来说都是可以接受的折衷方案。其他虚拟化平台上也可以采用相同的方式进行处理,在此不再赘述。

为了不中断用户的应用,在升级后端驱动时,最好采用热升级,不能用冷升级。所谓热升级是在不需要用户vm关机的情况下,将旧的软件替换为新的软件,而且不严重影响用户的使用。vm的磁盘链路上一个io的处理会经过很多模块,热升级既需要不重启vm,也需要不停止后端服务进程,只升级驱动,不影响上下依赖的模块。

对于vm存储而言,在升级的过程中,任何一块vm磁盘都有可能正在提交io请求,而且这些io请求的数据可能是用户的重要信息,或者是某个流程中的重要步骤,因此热升级既需要保证io数据正常,也需要确保iolatency不能因为升级而提高太多。例如,web应用会导致用户访问卡或者慢,游戏应用可能导致玩家无故掉线等。

本实施例的虚拟化平台为xen虚拟化平台,每台物理机可以基于xen虚拟化虚拟出多个vm,vm的每块磁盘独立提交读写io请求,后端接入服务运行时能同时接收每个磁盘的前后端驱动下发的io请求,后端驱动负责从vm的前端驱动中映射、获取io请求,并转发给后端存储服务进程,最终提交给后端存储,例如,分布式文件系统或者本地raid存储。

本实施例提出一种的虚所机存储后端驱动热升级的装置,能实现存储后端驱动的热升级,无论在vm磁盘空闲还是繁忙的时候,都可以实现将旧驱动在线替换为新驱动,不影响其它模块的运行。下面结合附图进行说明。

vm磁盘位于vm内部,处理io请求需要与后端驱动对接,xen平台提供一套xenbus总线完成前后端设备的对接,当前端磁盘驱动加载时会通过xenbus在后端也创建一条io链路,这个io链路包括前后端eventchannel事件通道、前后端ioring、后端处理io的内核线程、后端的tap块设备与字符设备。建立的所有io链路也可以在xenbus上查找到。

tap块设备与tap字符设备都是虚拟设备,并不是真实外接设备,二者的驱动实现也是后端驱动的一部分。tap块设备的驱动实现接收内核线程所提交的bio请求,通过tap字符设备驱动实现的mmap接口将请求映射给用户态服务进程,tap字符设备驱动也实现了poll事件通知,通知用户态服务进程处理io请求,用户态服务进程最后再将io提交给后端分布式存储或者本地raid存储。tap块设备通过sysfs实现与用户态的一些配置交互,如pause/unpause/remove/状态查看等。升级后端驱动,也需要升级tap块设备和tap字符设备的驱动,以及tap块的sysfs接口函数。

下面结合图5所示的装置的示意图,以虚拟平台为xenbus作为示例,对上述实施例提出的升级方法的一种可选的实施例进行描述:

首先,通过后端设备查找模块来查找磁盘设备,其中,虚拟机后端设备既包括网络设备也包括磁盘设备,由于只需要对磁盘设备进行升级,因此需要在所有的后端设备中,查找得到磁盘设备。

然后在采用xenbus驱动升级/回退模块进行xenbus驱动的升级。在进行xenbus驱动的升级前,还需要保存所有磁盘设备的设备地址和后端数据结构地址。需要说明的是,新的驱动模块安装以后,可以让新创建虚拟机的io链路从新的驱动模块中进行处理,但仍存在由正在运行的虚拟机是在旧的驱动模块的基础上创建的,为了不让这些虚拟机上的io请求,在安装了新的驱动模块后,还需要对旧的驱动模块进行升级。

在升级xenbus启动后,通过io处理停止/启动模块来停止处理io请求,在这一过程中,可以关闭后端驱动与前端驱动之间的事件通道、将缓冲区和请求队列中的请求全部处理完成,并停止虚拟块设备的队列。

在使用io处理停止/启动模块停止处理io请求后,使后端保持在一个空闲的状态,在这种情况下,使用内核线程停止/启动模块停止后端链路的内核线程。

通过上述模块的处理,旧的驱动模块创建的io链路都已经被清理完毕,此处可以通过符号查找模块查找新的驱动模块中的符号,其中,新的驱动模块中的符号包括虚拟块设备和虚拟字符设备的区东入口函数。

在通过符号查找模块获取到新的驱动模块的符号后,通过入口函数替换模块,采用新的驱动模块中的符号替换虚拟块设备和虚拟字符设备的驱动入口函数,并采用新的驱动模块的文件系统入口函数sysfs替换虚拟块设备对应的sysfs函数。

然后通过数据拷贝与替换函数使用新的驱动模块分配的驱动私有数据替换旧的驱动私有数据,并将就的驱动模块中的全局变量拷贝到新的驱动模块中。

通过上述多个模块的处理,完成了所有驱动函数和依赖数据的升级,在升级的过程中,任意一个环节都可能出现问题,在新的驱动升级后,也可能会出现问题,因此在出现上述情况时,可以采用升级回滚模块来进行升级回滚。

需要说明的是,由于图5所示的装置都具有双向功能,例如,io处理停止/启动模块既可以进行io停止,也可以进行io启动,入口函数替换功能既可以使用新的驱动模块的入口函数替换旧的驱动模块的入口函数,也可以使用就的驱动模块的入口函数替换新的驱动的入口函数,因此,在升级回滚的过程中,仍然使用上述模块清理新的驱动模块创建的io链路,然后使用就的驱动模块中的数据来替换新的驱动模块中的数据即可。

图7是根据本申请实施例1的热升级方法的流程图,下面结合图7对本申请的一种可选的实施例进行详细描述,如图7所示,以虚拟化平台为xenbus平台作为示例,该流程包括如下步骤:

s71,查找xenbus后端总线上的所有xenbus设备。

在后端驱动热升级开始之后,查找虚拟化平台后端总线上的所有虚拟化设备,其中,所由的虚拟化设备可以包括网络设备或磁盘设备。

s72,是否为磁盘设备。

在上述步骤中判断查找到的虚拟化设备是否为磁盘设备,如果是,则进入步骤s74,否则进入步骤s73。

s73,返回。

在上述步骤中,在查找到的虚拟化设备不是磁盘设备的情况下,返回继续查找的步骤。

s74,保存xenbus设备地址和后端数据结构地址。

在上述步骤中,如果查找到的设备是磁盘设备,则在一个已分配的内存里保存这些设备的地址及其对应的后端数据结构的地址;再将原来注册的xenbus后端驱动的驱动函数用户新的驱动模块里的函数升级掉,这些函数包括前后端建立连接、断开连接、事件通知等函数,这样旧的xenbus后端驱动函数被调用时就会使用新的驱动函数。

s75,升级xenbus后端驱动。

在进行xenbus驱动的升级前,还需要保存所有磁盘设备的设备地址和后端数据结构地址。需要说明的是,新的驱动模块安装以后,可以让新创建虚拟机的io链路从新的驱动模块中进行处理,但仍存在由正在运行的虚拟机是在旧的驱动模块的基础上创建的,为了不让这些虚拟机上的io请求,在安装了新的驱动模块后,还需要对旧的驱动模块进行升级。

s76,关闭后端驱动与前端驱动之间的eventchannel中断。

在上述步骤中,关闭后端驱动与前端驱动的eventchannel(事件通道),已用于停止前端继续向后端提交io请求。

s77,等待ioring和请求队列里的请求都完成。

在上述步骤中,缓冲区(ioring)和请求队列中包含有等待中或未完成的io请求,该步骤需要将等待中和未处理完成的io请求全部处理完成。

s78,停止tap块设备队列。

在上述步骤中,tap块设备为虚拟块设备,停止tap块设备用于使后端保持一个空闲的状态。

s79,停止后端链路内核线程。

在停止虚拟块设备和虚拟字符设备之后,停止所述后端服务中的内核线程

s710,分配新的驱动私有数据结构代替旧驱动的私有数据结构。

s711,用新驱动里的符号,替换tap字符设备和tap块设备的驱动入口函数。

具体的,新的驱动模块中的符号包括虚拟块设备(tap块设备)和/或所述虚拟字符设备(tap字符设备)的入口函数,可以从采用复制新的驱动模块中的驱动入口函数的方式替换原虚拟块设备和/或所述虚拟字符设备的入口函数。

s712,用新驱动里的符号替换tap块设备对应sysfs入口函数。

具体的,上述新的驱动模块的符号还包括虚拟块设备的系统文件入口函数sysfs,上述步骤使用新的驱动模块中的用来表示虚拟块设备结构的文件系统的入口函数,替换所述旧的驱动模块中的虚拟块设备对应的入口函数。

s713,将旧驱动全局变量中的内容拷贝到新驱动中。

在上述步骤中,在上述步骤中,所有基于旧驱动创建的io链路都清理完毕后,再基于新驱动分配新的驱动私有数据代替旧驱动私有数据;查找新驱动里的符号,这些新驱动里的符号替换tap字符设备和tap块设备的驱动入口函数,并用户新驱动里的sysfs入口函数替换tap块设备时的sysfs入口函数。再将旧驱动里的使用到的全局变量等数据,拷贝一份到新驱动里,至此完成所有驱动函数与依赖数据的升级。

s714,重启tap块设备队列。

在完成了所有驱动函数和依赖数据的升级之后,重新启动tap块设备队列,接收并存放等待处理的新的io请求。

s715,用新处理函数重新创建后端链路内核线程。

在上述步骤中,使用升级后的后端驱动的函数建立新的内核线程,由于将新的驱动模块中的符号替换了tap字符设备和tap块设备的驱动入口函数,以及tap块设备对应sysfs入口函数,因此可以使用新处理函数来重新创建后端链路的内核线程。

s716,打开前后端驱动之间的eventchannel中断。

在上述步骤中,通过打开前后端驱动之间的事件通道中断,以使前端驱动能够重现向后端驱动发送接收到的io请求。

s717,io链路重新接通开始处理io。

以上这些升级流程只是查找设备、分配内存、替换函数与数据,大部分是些内存操作,因此不需要消耗太长时间,正常情况下执行时间为毫秒级,对vmio的影响较小。

热升级有可能在中间某一步出问题,或者新驱动在升级后发现有问题,因此,也可以准备一个升级回滚模块防止万一,执行回滚时,需要将原来旧模块中的所有函数与数据,来替换新的驱动模块中的数据,流程与热升级一样。

通过上述实施例实现xen虚拟化平台后端存储驱动模块的热升级,在vm仍在运行的情况下,能将内核态的旧驱动替换为新驱动,不需要让vm停机,对vmio的影响降低到毫秒级,对io链路其它模块没有影响;同时实现一个升级回滚模块,在升级失败等情况下将驱动回滚为旧驱动。

实施例2

根据本申请实施例,还提供了一种用于实施上述升级方法的装置,2是根据本申请实施例的升级装置的结构框图,如图8所示,该装置800包括:

安装模块802,用于安装新的驱动模块,其中,新的驱动模块用于驱动后端服务,后端服务为运行在计算设备上用于接收并处理io请求的服务,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘进行io请求,虚拟化平台运行在计算设备上。

查找模块804,用于查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备,其中,虚拟字符设备用于通知存储设备处理io请求,存储设备用于存储io请求对应的数据。

关联模块806,用于将查找到的虚拟块设备和虚拟字符设备与新的驱动模块关联,其中,每个查找到的所述虚拟块设备和字符设备停止接收新的io请求。

处理模块808,用于在确定旧的驱动模块处理完成已经接收到的io请求,并重新启用所述虚拟块设备和所述虚拟字符设备之后,使用新的驱动模块替换所述旧的驱动模块来处理io请求的替换。

通过上述模块,采用在安装新的驱动模块之后,该新的驱动的内容就被安装在了计算设备上,从而可以通过查找设备以及复制的方式进行驱动的替换,查找设备以及复制替换不需要消耗太长时间,对vmio操作的影响较小,提高了升级的速度,进而解决了采用冷升级的方式对vm的后端服务进行升级所导致的服务中断的技术问题。

关联模块806和启动模块,实现了实施例1的io处理停止/启动模块、内核线程停止启动模块的部分或全部功能。

处理模块808以及下述恢复模块实现了上述实施例1的xenbus驱动升级回退模块、升级回滚模块、数据拷贝与替换模块、入口函数替换模块的部分与全部功能。

查找模块804实现了上述实施例1的后端设备查找模块和内核符号查找模块的部分或全部功能。

通过上述步骤,采用在安装新的驱动模块之后,该新的驱动的内容就被安装在了计算设备上,从而可以通过查找设备以及复制的方式进行驱动的替换,查找设备以及复制替换不需要消耗太长时间,对vmio操作的影响较小,提高了升级的速度,进而解决了采用冷升级的方式对vm的后端服务进行升级所导致的服务中断的技术问题。

在一些情况下,需要进行数据和/或函数的替代,如果升级的过程仅仅是函数的替换,在一个可选的实施例中,可以从新的驱动模块中复制新的驱动模块的函数来覆盖旧的驱动模块中的函数。

在另外一个可选的实施例中,如果需要保存旧的驱动模块中的数据,这可以复制旧的驱动模块中的数据到新的驱动模块中。复制数据可以是复制数据的本身,或者,复制也可以包括数据结构的调整,例如,如果新的驱动模块的数据数据结构发生了变化,则可以按照新的数据结构拷贝到新的驱动模块中。

即,处理模块808可以用于执行:在使用所述新的驱动模块替换所述旧的驱动模块来处理io请求之前,复制新的驱动模块中的函数替换旧的驱动模块的函数;复制旧的驱动模块中的数据到新的驱动模块中,其中,数据至少包括:全局变量。

函数的复制与数据的复制可以同时实施,也可以单独实施,这需要根据升级的内容来进行确定。

例如,如果后端驱动的驱动函数需要升级,则复制新的驱动模块中的函数替换旧的驱动模块的函数可以包括:将注册的后端驱动的驱动函数使用新的驱动模块中的驱动函数覆盖。即,处理模块808用于将注册的后端驱动的驱动函数使用新的驱动模块中的驱动函数覆盖。驱动函数有很多种类,例如,该驱动函数可以包括以下至少之一:建立连接函数、断开连接函数、事件通知函数。升级的时候可以选择发生变化的函数来进行升级,例如,事件通知函数发生了变化,则升级事件通知函数,没有变化的函数则可以不升级。

为了做到区分哪些函数发生了变化,可以在新的驱动模块中添加一个标识,该标识用于表明该函数发生了变化。作为另一个可选的实施例,还可以在新的驱动模块中只包括变化的函数,这样在升级的过程中就不需要根据标识来进行判断了。或者,作为一种比较简单的处理方式,可以不进行标识,只要是新的驱动模块中的函数,无论其是否发生变化,均进行升级。

在有些vm的具体应用的过程中,可能会使用虚拟块设备和/或虚拟字符设备,虚拟块和虚拟字符设备都是虚拟设备,并不是真实外接设备,二者的驱动实现也是后端驱动的一部分。虚拟块设备(tap块设备)的驱动实现接收内核线程所提交的请求,通过虚拟字符设备(例如,tap字符设备)驱动实现的接口将请求映射给用户态服务进程,虚拟字符设备驱动也可以实现事件通知,通知用户态服务进程处理io请求,用户态服务进程最后再将io提交给后端分布式存储或者本地raid存储。

根据本申请上述实施例,在使用虚拟块设备和/或虚拟字符设备的情况下,则需要考虑这两个设备的驱动的升级,此时,关联模块808包括:

第一获取模块810,用于获取新的驱动模块中的虚拟块设备和/或虚拟字符设备的驱动入口函数,其中,计算设备上的每个虚拟机磁盘分别对应一个虚拟块设备和一个虚拟字符设备,虚拟块设备的驱动用于接收内核线程提交的io操作的请求;虚拟字符设备的驱动用于将io操作的请求映射给用户态服务进程,以供用户态服务进程将io操作的请求提交给存储设备;

第一复制模块812,用于复制新的驱动模块中的驱动入口函数替换虚拟块设备和/或虚拟字符设备的驱动入口函数。

通过这两个设备的驱动入口函数的复制,在这两个虚拟设备需要升级的时候完成了升级。该升级的过程也是通过复制的方式进行的,从而比较消耗较少的时间。

在可选的实施例中,虚拟块设备还可以通过用来表示虚拟块设备结构的文件系统(例如,sysfs)实现与用户态的一些配置交互。

根据本申请上述实施例,也需要对该文件系统的入口函数进行升级,即作为一个可选的实施方式,处理模块808包括:

第二获取模块814,用于获取新的驱动模块中用来表示虚拟块设备结构的文件系统的入口函数;

第二复制模块816,用于复制新的驱动模块中的用来表示虚拟块设备结构的文件系统的入口函数,替换旧的驱动模块中的虚拟块设备对应的入口函数。

上述几个可选的实施方式中主要介绍了函数的复制,作为数据的复制,根据本申请上述实施例,在某些实施方式中,涉及到私有数据和/或全局变量,此时,作为一个可选的实施方式,处理模块808还可以包括:

替代模块818,用于在复制旧的驱动模块中的数据到新的驱动模块中之前,基于新的驱动模块分配新的驱动私有数据替代旧的驱动模块的私有数据。

第三复制模块820,用于复制旧的驱动模块中的全局变量到新的驱动模块中。

在vm中,不仅仅有虚拟机磁盘设备,因此,需要进行查找设备的步骤。在找到虚拟机磁盘设备之后,根据虚拟机磁盘采用的不同的io处理方式来暂停其接收新的io操作。

例如,对于每个查找到的虚拟机磁盘设备停止接收新的io请求可以包括:关闭事件中断处理使后端服务接收不到io请求的请求。即,关联模块806用于关闭事件中断处理。在该例子中,io请求的请求是通过事件中断的方式来进行通知的,在关闭了时间中断之后,那么,就无法接收到io请求的请求了。

根据本申请上述实施例,确定io操作处理完成在采用虚拟块设备的情况下,也可以包括停止虚拟块设备以及内核线程。关联模块806包括:

保持模块822,用于在接收到的io操作处理完成之后,保持后端服务为空闲状态。

停止模块824,用于停止虚拟块设备的队列,其中,计算设备上的每个虚拟机磁盘分别对应一个虚拟块设备,虚拟块设备用于接收内核线程提交的io操作的请求;停止后端服务中的内核线程。

通过上述可选的实施例,可以做到将驱动的替换,如果涉及到虚拟块设备,那么在函数替换完成之后,还需要启动虚拟块设备。

根据本申请上述实施例,上述装置还可以包括启动模块826,其中,启动模块用于启动虚拟块设备的队列;根据升级后的后端驱动的函数,建立新的内核线程;启动事件中断处理。

需要说明的是,如果升级的过程中出现了问题,则还可以按照本实施例的方法进行还原,不同的是,需要使用旧的驱动模块将新的驱动模块替换掉。

根据本申请上述实施例,上述装置还可以包括恢复模块828,恢复模块用于:调用升级装置中的安装模块802、查找模块804、关联模块806以及处理模块808将旧的驱动模块进行恢复。

实施例3

根据本申请实施例,还提供了一种升级方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

本申请实施例提供了如图9所示的升级方法。图9是根据本申请实施例3的升级方法的流程图,如图9所示,该流程包括如下步骤。

步骤s902,关闭虚拟机的前端驱动与旧的后端驱动之间的io链路。

在上述步骤中,io链路用于将io请求从前端驱动传输或转发至后端驱动,在关闭io链路的情况下,前端的io请求无法继续传输至后端进行处理。

在一种可选的情况下,上述io链路可以包括前端驱动和后端驱动之间的事件通道、前端驱动和后端驱动的缓冲区、后端处理io的内核线程以及后端的虚拟块设备与字符设备。

以虚拟化平台为xen作为示例,用户应用的读写请求会经过文件系统提交给vm磁盘的前端驱动,前端驱动是一个块设备驱动,它与后端驱动为每个磁盘建立一个事件通道和一个基于内存映射的ioring(缓冲区),前端驱动将io封装后插入ioring,并由事件通道(eventchannel)通知后端驱动,事件通道是xen虚拟化平台提供的一种domain(域名)与domain之前互相通知的通道,在io链路上,事件通道通知后端驱动io请求已经放入ioring,以及通知前端驱动io回复已经放入ioring,前后端驱动会以中断的方式收到eventchannel通知,注册对应中断函数后,就可以实现io请求后续的处理,每个vm磁盘会创建一个eventchannel。后端驱动比较复杂且在内核态,为了数据安全和系统稳定,热升级的过程中需要短暂的停止io的处理,因此需要通过io处理停止/启动模块停止eventchannel的事件通知。

步骤s904,在旧的后端驱动处理完成已经接收到的io请求之后,停用虚拟机的虚拟块设备和虚拟字符设备。

作为一种可选的实施例,在一些vm的具体应用中,虚拟块设备(tap块设备)和虚拟字符设备(tap字符设备)并不是真实的外接设备,二者的驱动实现也是后端驱动的一部分。虚拟块设备的驱动用于接收内核线程所提交的bio请求,虚拟字符设备的驱动用于通过mmap接口将请求映射给用户态服务进程,虚拟字符设备驱动也可以实现poll事件通知,通知用户态服务进程处理io请求,用户态服务进程最后再将io提交给后端分布式存储或者本地raid存储。

步骤s906,安装新的驱动模块,并将新的驱动模块接入虚拟块设备和虚拟字符设备的入口函数,其中,新的驱动模块用于将前端驱动下发的新io请求转发给后端服务进程。

步骤s908,重新启动虚拟块设备和虚拟字符设备,并打开前端驱动与新的驱动模块之间的io链路,完成旧的后端驱动升级为新的驱动模块。

在一种可选的实施例中,在重新启动虚拟块设备和虚拟字符设备后,虚拟块设备的驱动重新开始接收内核线程所提交的bio请求,虚拟字符设备的驱动也重新通过mmap接口将请求映射给用户态服务进程,并实现poll事件通知,通知用户态服务进程处理io请求,用户态服务进程最后再将io提交给后端分布式存储或者本地raid存储。

此处需要说明的是,本申请上述实施例通过将新的驱动模块接入虚拟块设备和虚拟字符设备的入口函数,使得在重新启动处理io请求时,io请求能够通过升级后的新的驱动模块进行处理,实现了后端服务的升级过程。

通过上述步骤,采用在安装新的驱动模块之后,该新的驱动的内容就被安装在了计算设备上,从而可以通过查找设备以及复制的方式进行驱动的替换,由于查找设备以及复制替换消耗时间少,对vm虚拟机的io操作影响较小,因此能够达到提高了升级速度的技术效果,进而解决了采用冷升级的方式对vm的后端服务进行升级所导致的服务中断的技术问题。

根据本申请上述实施例,将新的驱动模块接入虚拟块设备和虚拟字符设备的入口函数,包括:

步骤s9061,查找新的驱动模块中的符号,使用新的驱动模块中的符号替换虚拟块设备和虚拟字符设备的驱动入口函数,并使用新的驱动模块中的系统文件入口函数替换虚拟块设备的系统文件入口函数。

在上述步骤中,上述新的驱动模块中的符号包括新的驱动模块的虚拟块设备和虚拟字符设备的驱动入口函数。

在一种可选的实施例中,结合图5所示的示例,通过入口函数替换模块,采用新的驱动模块里的符号所包含的虚拟块设备和虚拟字符设备的驱动入口函数分别替换虚拟字符设备和虚拟块设备的驱动入口函数。

此处需要说明的是,虚拟块设备通过用来表示虚拟块设备结构的文件系统(例如,sysfs接口函数)实现与用户态的一些配置交互,例如pause/unpause/remove/状态查看等。在对后端驱动进行升级后,也需要对虚拟块设备结构的文件系统的入口函数进行升级,从而使得在后端驱动升级后,虚拟块设备能够重新与用户态的一些配置进行交互。

在上述步骤中,sysfs入口函数为文件系统的入口函数,结合图5所示的示例,可以通过入口函数替换模块采用新驱动里的sysfs入口函数替换虚拟块设备里的sysfs入口函数。

根据本申请上述实施例,在重新启动虚拟块设备和虚拟字符设备之前,方法还包括:

步骤s910,分配新的驱动模块的数据结构替换旧的后端驱动的数据结构;和/或,

步骤s912,将旧的后端驱动的全局变量中的数据内容复制到新的驱动模块中。

在上述步骤中,如果新的驱动模块的数据结构发生了变化,则可以将新的数据结构拷贝到旧的驱动模块中。例如,在使用新的驱动模块的驱动私有数据替换旧的驱动函数的驱动私有数据的过程中,新的私有数据与旧的私有数据的数据结构不同,因此可以使用新的私有数据的数据结构替换旧的私有数据的数据结构。

对于全局变量,由于全局变量可以被线程中的所有函数引用,无论使用旧的驱动模块从处理io请求,还是使用新的驱动模块处理io请求,都无需改变,因此将旧的驱动模块中的全局变量复制到新的驱动模块中即可,新的驱动模块在处理io请求时就可以调用全局变量,无需对全局变量进行添加或改变。

根据本申请上述实施例,在关闭虚拟机的前端驱动与旧的后端驱动之间的io链路之前,方法还包括:

步骤s912,启动后端驱动的热升级,查找虚拟机后端总线上关联的所有虚拟设备。

在上述步骤中,虚拟机后端总线上关联的所有虚拟设备可以包括网络设备和磁盘设备。

步骤s914,如果虚拟设备是磁盘设备,则保存磁盘设备的设备地址和后端数据结构的地址。

在一种可选的实施例中,可以将上述磁盘设备的设备地址和后端数据结构存储于提前分配的内存中,以使得在磁盘设备进行升级后,新的驱动模块仍然可以使用原来的设备地址和后端数据结构地址查找到升级后的磁盘设备,从而使得在磁盘设备升级后,能够通过新的驱动模块重新处理io请求。

步骤s916,根据磁盘设备的设备地址确定需要升级的旧的后端驱动。

需要说明的是,在vm虚拟机中,不仅仅包含虚拟机磁盘设备,还包含有网络设备,因此,在进行后端服务升级之前,需要查找虚拟机中的磁盘设备。在一种可选的实施例中,结合图5所示的示例,可以通过后端设备查找模块来查找虚拟机磁盘,如果查找到网络设备,则忽略即可,如果查找到虚拟机磁盘设备,则保存磁盘设备的设备地址和后端数据结构的地址,从而确定需要升级的后端驱动。

实施例4

根据本申请实施例,还提供了一种用于实施上述升级方法的装置,图10是根据本申请实施例4的升级装置的结构框图,如图10所示,该装置1000包括:

关闭模块1002,用于关闭虚拟机的前端驱动与旧的后端驱动之间的io链路。

在一种可选的情况下,上述io链路可以包括前端驱动和后端驱动之间的事件通道、前端驱动和后端驱动的缓冲区、后端处理io的内核线程以及后端的虚拟块设备与字符设备。

以虚拟化平台为xen作为示例,用户应用的读写请求会经过文件系统提交给vm磁盘的前端驱动,前端驱动是一个块设备驱动,它与后端驱动为每个磁盘建立一个事件通道和一个基于内存映射的ioring(缓冲区),前端驱动将io封装后插入ioring,并由事件通道(eventchannel)通知后端驱动,事件通道是xen虚拟化平台提供的一种domain(域名)与domain之前互相通知的通道,在io链路上,事件通道通知后端驱动io请求已经放入ioring,以及通知前端驱动io回复已经放入ioring,前后端驱动会以中断的方式收到eventchannel通知,注册对应中断函数后,就可以实现io请求后续的处理,每个vm磁盘会创建一个eventchannel。后端驱动比较复杂且在内核态,为了数据安全和系统稳定,热升级的过程中需要短暂的停止io的处理,因此需要通过io处理停止/启动模块停止eventchannel的事件通知。

停止模块1004,用于在所述旧的后端驱动处理完成已经接收到的io请求之后,停用所述虚拟机的虚拟块设备和虚拟字符设备。

作为一种可选的实施例,在一些vm的具体应用中,虚拟块设备(tap块设备)和虚拟字符设备(tap字符设备)并不是真实的外接设备,二者的驱动实现也是后端驱动的一部分。虚拟块设备的驱动用于接收内核线程所提交的bio请求,虚拟字符设备的驱动用于通过mmap接口将请求映射给用户态服务进程,虚拟字符设备驱动也可以实现poll事件通知,通知用户态服务进程处理io请求,用户态服务进程最后再将io提交给后端分布式存储或者本地raid存储。

安装模块1006,用于安装新的驱动模块,并将所述新的驱动模块接入所述虚拟块设备和虚拟字符设备的入口函数,其中,所述新的驱动模块用于将所述前端驱动下发的新io请求转发给后端服务进程。

驱动模块1008,用于重新启动所述虚拟块设备和虚拟字符设备,并打开所述前端驱动与所述新的驱动模块之间的io链路,完成所述旧的后端驱动升级为所述新的驱动模块。

在一种可选的实施例中,在重新启动虚拟块设备和虚拟字符设备后,虚拟块设备的驱动重新开始接收内核线程所提交的bio请求,虚拟字符设备的驱动也重新通过mmap接口将请求映射给用户态服务进程,并实现poll事件通知,通知用户态服务进程处理io请求,用户态服务进程最后再将io提交给后端分布式存储或者本地raid存储。

此处需要说明的是,本申请上述实施例通过将所述新的驱动模块接入所述虚拟块设备和虚拟字符设备的入口函数,使得在重新启动处理io请求时,io请求能够通过升级后的新的驱动模块进行处理,实现了后端服务的升级过程。

通过上述装置,采用在安装新的驱动模块之后,该新的驱动的内容就被安装在了计算设备上,从而可以通过查找设备以及复制的方式进行驱动的替换,由于查找设备以及复制替换消耗时间少,对vm虚拟机的io操作影响较小,因此能够达到提高了升级速度的技术效果,进而解决了采用冷升级的方式对vm的后端服务进行升级所导致的服务中断的技术问题。

实施例5

本申请的实施例可以提供一种计算设备,该计算设备可以是计算设备群中的任意一个计算设备。可选地,在本实施例中,随着移动终端的运算能力的提高,上述计算设备也可以替换为移动终端等终端设备。

可选地,在本实施例中,上述计算设备可以位于计算机网络的多个网络设备中的至少一个网络设备。

在本实施例中,上述计算机终端可以执行升级方法中以下步骤的程序代码:安装新的驱动模块,其中,新的驱动模块用于驱动后端服务,后端服务为运行在计算设备上用于接收并处理io请求的服务,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘进行io操作的请求,虚拟化平台运行在计算设备上;查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备,其中,虚拟字符设备用于通知存储设备处理io请求,存储设备用于存储io请求对应的数据;将查找到的虚拟块设备和虚拟字符设备与新的驱动模块关联,其中,每个查找到的所述虚拟块设备和字符设备停止接收新的io请求;在确定旧的驱动模块处理完成已经接收到的io请求,并重新启用所述虚拟块设备和所述虚拟字符设备之后,使用新的驱动模块替换所述旧的驱动模块来处理io请求的替换。

可选地,图11是根据本发明实施例5的一种计算机终端的结构框图,如图11所示,该计算设备1100可以包括:一个或多个(图中仅示出一个)处理器1102、存储器1104以及外设接口1106。

存储器可用于存储软件程序以及模块,如本申请实施例中的升级方法和装置对应的程序指令/模块,处理器通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的系统漏洞攻击的检测方法。存储器可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至计算设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

在本实施例中,上述计算设备或者处理器可以执行升级方法中以下步骤的程序代码:安装新的驱动模块,其中,新的驱动模块用于驱动后端服务,后端服务为运行在计算设备上用于接收并处理io请求的服务,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘进行io操作的请求,虚拟化平台运行在计算设备上;查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备,其中,虚拟字符设备用于通知存储设备处理io请求,存储设备用于存储io请求对应的数据;将查找到的虚拟块设备和虚拟字符设备与新的驱动模块关联,其中,每个查找到的所述虚拟块设备和字符设备停止接收新的io请求;在确定旧的驱动模块处理完成已经接收到的io请求,并重新启用所述虚拟块设备和所述虚拟字符设备之后,使用新的驱动模块替换所述旧的驱动模块来处理io请求的替换。

通过上述代码的执行,采用在安装新的驱动模块之后,该新的驱动的内容就被安装在了计算设备上,从而可以通过查找设备以及复制的方式进行驱动的替换,查找设备以及复制替换不需要消耗太长时间,对vmio操作的影响较小,提高了升级的速度,进而解决了采用冷升级的方式对vm的后端服务进行升级所导致的服务中断的技术问题。

可选的,上述处理器还可以执行如下步骤的程序代码:新的驱动模块中复制新的驱动模块的函数来覆盖旧的驱动模块中的函数。复制旧的驱动模块中的数据到新的驱动模块中。

函数的复制与数据的复制可以同时实施,也可以单独实施,这需要根据升级的内容来进行确定。

可选的,上述处理器还可以执行如下步骤的程序代码:将注册的后端驱动的驱动函数使用新的驱动模块中的驱动函数覆盖。驱动函数有很多种类,例如,该驱动函数可以包括以下至少之一:建立连接函数、断开连接函数、事件通知函数。

为了做到区分哪些函数发生了变化,可以在新的驱动模块中添加一个标识,该标识用于表明该函数发生了变化。作为另一个可选的实施例,还可以在新的驱动模块中只包括变化的函数,这样在升级的过程中就不需要根据标识来进行判断了。或者,作为一种比较简单的处理方式,可以不进行标识,只要是新的驱动模块中的函数,无论其是否发生变化,均进行升级。

在有些vm的具体应用的过程中,可能会使用虚拟块设备和/或虚拟字符设备,虚拟块和虚拟字符设备都是虚拟设备,并不是真实外接设备,二者的驱动实现也是后端驱动的一部分。虚拟块设备(tap块设备)的驱动实现接收内核线程所提交的请求,通过虚拟字符设备(例如,tap字符设备)驱动实现的接口将请求映射给用户态服务进程,虚拟字符设备驱动也可以实现事件通知,通知用户态服务进程处理io请求,用户态服务进程最后再将io提交给后端分布式存储或者本地raid存储。

可选的,上述处理器还可以执行如下步骤的程序代码:获取新的驱动模块中的虚拟块设备和/或虚拟字符设备的驱动入口函数,其中,计算设备上的每个虚拟机磁盘分别对应一个虚拟块设备和一个虚拟字符设备,虚拟块设备的驱动用于接收内核线程提交的io操作的请求;虚拟字符设备的驱动用于将io操作的请求映射给用户态服务进程,以供用户态服务进程将io操作的请求提交给存储设备;复制新的驱动模块中的驱动入口函数替换虚拟块设备和/或虚拟字符设备的驱动入口函数。

通过这两个设备的驱动入口函数的复制,在这两个虚拟设备需要升级的时候完成了升级。该升级的过程也是通过复制的方式进行的,从而比较消耗较少的时间。

在可选的实施例中,虚拟块设备还可以通过用来表示虚拟块设备结构的文件系统(例如,sysfs)实现与用户态的一些配置交互。

可选的,上述处理器还可以执行如下步骤的程序代码:获取新的驱动模块中用来表示虚拟块设备结构的文件系统的入口函数;复制新的驱动模块中的用来表示虚拟块设备结构的文件系统的入口函数,替换旧的驱动模块中的虚拟块设备对应的入口函数。

可选的,上述处理器还可以执行如下步骤的程序代码:在复制旧的驱动模块中的数据到新的驱动模块中之前,基于新的驱动模块分配新的驱动私有数据替代旧的驱动模块的私有数据;复制旧的驱动模块中的全局变量到新的驱动模块中。

在vm中,不仅仅有虚拟机磁盘设备,因此,需要进行查找设备的步骤。在找到虚拟机磁盘设备之后,根据虚拟机磁盘采用的不同的io处理方式来暂停其接收新的io操作。

可选的,上述处理器还可以执行如下步骤的程序代码:关闭事件中断处理使后端服务接收不到io操作的请求。在该例子中,io操作的请求是通过事件中断的方式来进行通知的,在关闭了时间中断之后,那么,就无法接收到io操作的请求了。

可选的,上述处理器还可以执行如下步骤的程序代码:在接收到的io操作处理完成之后,保持后端服务为空闲状态;停止虚拟块设备的队列,其中,计算设备上的每个虚拟机磁盘分别对应一个虚拟块设备,停止虚拟块设备和虚拟字符设备之后,停止后端服务中的内核线程。

通过上述可选的实施例,可以做到将驱动的替换,如果涉及到虚拟块设备,那么在函数替换完成之后,还需要启动虚拟块设备。

可选的,上述处理器还可以执行如下步骤的程序代码:启动虚拟块设备的队列;根据升级后的后端驱动的函数,建立新的内核线程;启动事件中断处理。

可选的,上述处理器还可以执行如下步骤的程序代码:当升级虚拟机的后端驱动的过程中,或升级虚拟机的后端驱动之后,出现异常,则采用升级方法将旧的驱动模块进行恢复。

例如,当升级虚拟机的后端驱动的过程中,或升级虚拟机的后端驱动之后,出现异常,则可以采用本实施例中的升级方法将旧的驱动模块进行恢复。

这些代码也可以保存在存储器中。

本领域普通技术人员可以理解,计算设备也可以是智能手机(如android手机、ios手机等)、平板电脑、掌声电脑以及移动互联网设备(mobileinternetdevices,mid)、pad等终端设备。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(read-onlymemory,rom)、随机存取器(randomaccessmemory,ram)、磁盘或光盘等。

实施例6

本申请的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于保存上述实施例1所提供的升级方法所执行的程序代码。

可选地,在本实施例中,上述存储介质可以位于计算机网络中计算设备中的任意一个计算设备中,或者位于移动终端群中的任意一个移动终端中。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:安装新的驱动模块,其中,新的驱动模块用于驱动后端服务,后端服务为运行在计算设备上用于接收并处理io请求的服务,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘进行io操作的请求,虚拟化平台运行在计算设备上;查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备,其中,虚拟字符设备用于通知存储设备处理io请求,存储设备用于存储io请求对应的数据;将查找到的虚拟块设备和虚拟字符设备与新的驱动模块关联,其中,每个查找到的所述虚拟块设备和字符设备停止接收新的io请求;在确定旧的驱动模块处理完成已经接收到的io请求,并重新启用所述虚拟块设备和所述虚拟字符设备之后,使用新的驱动模块替换所述旧的驱动模块来处理io请求的替换。

在本实施例中,上述计算设备或者处理器可以执行升级方法中以下步骤的程序代码:安装新的驱动模块,其中,新的驱动模块用于驱动后端服务,后端服务为运行在计算设备上用于接收并处理io请求的服务,io请求为虚拟化平台上的一个或多个虚拟机提交的对虚拟机磁盘进行io操作的请求,虚拟化平台运行在计算设备上;查找所有的虚拟机磁盘对应的虚拟块设备和虚拟字符设备,其中,虚拟字符设备用于通知存储设备处理io请求,存储设备用于存储io请求对应的数据;将查找到的虚拟块设备和虚拟字符设备与新的驱动模块关联,其中,每个查找到的所述虚拟块设备和字符设备停止接收新的io请求;在确定旧的驱动模块处理完成已经接收到的io请求,并重新启用所述虚拟块设备和所述虚拟字符设备之后,使用新的驱动模块替换所述旧的驱动模块来处理io请求的替换。

通过上述代码的执行,采用在安装新的驱动模块之后,该新的驱动的内容就被安装在了计算设备上,从而可以通过查找设备以及复制的方式进行驱动的替换,查找设备以及复制替换不需要消耗太长时间,对vmio操作的影响较小,提高了升级的速度,进而解决了采用冷升级的方式对vm的后端服务进行升级所导致的服务中断的技术问题。

可选地,在本实施例中,存储介质还可以被设置为存储用于执行以下步骤的程序代码:新的驱动模块中复制新的驱动模块的函数来覆盖旧的驱动模块中的函数。复制旧的驱动模块中的数据到新的驱动模块中。

函数的复制与数据的复制可以同时实施,也可以单独实施,这需要根据升级的内容来进行确定。

可选地,在本实施例中,存储介质还可以被设置为存储用于执行以下步骤的程序代码:将注册的后端驱动的驱动函数使用新的驱动模块中的驱动函数覆盖。驱动函数有很多种类,例如,该驱动函数可以包括以下至少之一:建立连接函数、断开连接函数、事件通知函数。

为了做到区分哪些函数发生了变化,可以在新的驱动模块中添加一个标识,该标识用于表明该函数发生了变化。作为另一个可选的实施例,还可以在新的驱动模块中只包括变化的函数,这样在升级的过程中就不需要根据标识来进行判断了。或者,作为一种比较简单的处理方式,可以不进行标识,只要是新的驱动模块中的函数,无论其是否发生变化,均进行升级。

在有些vm的具体应用的过程中,可能会使用虚拟块设备和/或虚拟字符设备,虚拟块和虚拟字符设备都是虚拟设备,并不是真实外接设备,二者的驱动实现也是后端驱动的一部分。虚拟块设备(tap块设备)的驱动实现接收内核线程所提交的请求,通过虚拟字符设备(例如,tap字符设备)驱动实现的接口将请求映射给用户态服务进程,虚拟字符设备驱动也可以实现事件通知,通知用户态服务进程处理io请求,用户态服务进程最后再将io提交给后端分布式存储或者本地raid存储。

可选地,在本实施例中,存储介质还可以被设置为存储用于执行以下步骤的程序代码:获取新的驱动模块中的虚拟块设备和/或虚拟字符设备的驱动入口函数,其中,计算设备上的每个虚拟机磁盘分别对应一个虚拟块设备和一个虚拟字符设备,虚拟块设备的驱动用于接收内核线程提交的io操作的请求;虚拟字符设备的驱动用于将io操作的请求映射给用户态服务进程,以供用户态服务进程将io操作的请求提交给存储设备;复制新的驱动模块中的驱动入口函数替换虚拟块设备和/或虚拟字符设备的驱动入口函数。

通过这两个设备的驱动入口函数的复制,在这两个虚拟设备需要升级的时候完成了升级。该升级的过程也是通过复制的方式进行的,从而比较消耗较少的时间。

在可选的实施例中,虚拟块设备还可以通过用来表示虚拟块设备结构的文件系统(例如,sysfs)实现与用户态的一些配置交互。

可选地,在本实施例中,存储介质还可以被设置为存储用于执行以下步骤的程序代码:获取新的驱动模块中用来表示虚拟块设备结构的文件系统的入口函数;复制新的驱动模块中的用来表示虚拟块设备结构的文件系统的入口函数,替换旧的驱动模块中的虚拟块设备对应的入口函数。

可选地,在本实施例中,存储介质还可以被设置为存储用于执行以下步骤的程序代码:在复制旧的驱动模块中的数据到新的驱动模块中之前,基于新的驱动模块分配新的驱动私有数据替代旧的驱动模块的私有数据;复制旧的驱动模块中的全局变量到新的驱动模块中。

在vm中,不仅仅有虚拟机磁盘设备,因此,需要进行查找设备的步骤。在找到虚拟机磁盘设备之后,根据虚拟机磁盘采用的不同的io处理方式来暂停其接收新的io操作。

可选地,在本实施例中,存储介质还可以被设置为存储用于执行以下步骤的程序代码:关闭事件中断处理使后端服务接收不到io操作的请求。在该例子中,io操作的请求是通过事件中断的方式来进行通知的,在关闭了时间中断之后,那么,就无法接收到io操作的请求了。

可选地,在本实施例中,存储介质还可以被设置为存储用于执行以下步骤的程序代码:在接收到的io操作处理完成之后,保持后端服务为空闲状态;停止虚拟块设备的队列,其中,计算设备上的每个虚拟机磁盘分别对应一个虚拟块设备,停止虚拟块设备和虚拟字符设备之后,停止后端服务中的内核线程。

通过上述可选的实施例,可以做到将驱动的替换,如果涉及到虚拟块设备,那么在函数替换完成之后,还需要启动虚拟块设备。

可选地,在本实施例中,存储介质还可以被设置为存储用于执行以下步骤的程序代码:启动虚拟块设备的队列;根据升级后的后端驱动的函数,建立新的内核线程;启动事件中断处理。

可选地,在本实施例中,存储介质还可以被设置为存储用于执行以下步骤的程序代码:当升级虚拟机的后端驱动的过程中,或升级虚拟机的后端驱动之后,出现异常,则采用升级方法将旧的驱动模块进行恢复。

这些代码可以通过c语言等语言完成。其他语言也可以实现这些代码,并起到相应的效果,在此不再一一赘述。

上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。

在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

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