一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种软件升级方法、计算设备及可读存储介质与流程

2022-02-22 09:47:02 来源:中国专利 TAG:


1.本发明涉及计算机领域,尤其涉及一种软件升级方法、计算设备及可读存储介质。


背景技术:

2.软件升级,是指软件从低版本向高版本的更新。由于高版本常常修复低版本的部分bug,所以升级后的软件版本一般会比原版本的性能更好,从而能够使用户有更好的体验。然而,软件升级过程中经常会遇到软件升级失败的情况,影响用户的体验。基于此,可回滚的软件升级方法应运而生。可回滚的软件升级方法是指当在系统升级某一软件包后,如发现升级版本不可用,可回退至之前版本。
3.目前,可回滚的软件升级方法主要有两种。指定版本安装:当需要回退至之前版本时,重新安装所指定的之前版本。采用a/b系统:设备上存在两个系统,当前正在运行的叫做a系统(主系统),另外一个备份系统叫做b系统(备份系统)。升级系统时先把a系统磁盘上的数据备份到b系统,然后再进行升级。升级完成后执行重启,此时如果a系统能够正常启动就表示升级成功;如果不能正常启动,就自动切换到b系统使用,这样就相当于回退到了升级前的状态。
4.然而,上述两种方案均存在一定的缺点。具体地,指定版本安装由于没有任何保护机制,相当于直接修改系统,因此使用这种方案如果一旦升级失败,系统被破坏而无法启动时,就回退无门,只有重装系统。采用a/b系统的方案,需要在机器上装两个系统,并且每次升级时,无论对系统修改内容是多还是少,都需要把当前系统整个磁盘数据备份另外一个系统的磁盘上去,所以使用这种方案不仅耗费资源,而且还很耗时,不够轻便。
5.基于此,亟需一种新的软件升级方法以解决上述技术问题。


技术实现要素:

6.为此,本发明提供了一种软件升级方法、计算设备及可读存储介质,以力图解决或者至少缓解上面存在的问题。
7.根据本发明的一个方面,提供一种软件升级方法,在驻留有操作系统的计算设备中执行,该方法包括:创建虚拟磁盘设备文件;以层叠文件模式启动操作系统,其中在层叠文件模式中,在操作系统中构造数据只读的下数据层和数据可读写的上数据层,制作虚拟磁盘设备文件的第一文件副本,将第一文件副本设置成所述上数据层的数据存放介质;在计算设备的操作系统中进行软件升级;在软件升级完成后,将第一文件副本复制为虚拟磁盘设备文件;以层叠文件模式重新启动操作系统,其中制作虚拟磁盘设备文件的第二文件副本,将第二文件副本设置成上数据层的数据存放介质;检测软件升级是否成功;若软件升级成功,则将下数据层设置为数据可读写,并基于上数据层中的数据修改下数据层中的数据,以获得软件升级后的操作系统版本,并以正常模式启动软件升级后的操作系统;若软件升级未成功,则以正常模式启动操作系统,以回退到软件升级前的操作系统版本。
8.可选地,在根据本发明的软件升级方法中,创建虚拟磁盘设备文件的步骤包括:在
操作系统的根分区下创建与根分区格式相同的虚拟磁盘设备文件。
9.可选地,在根据本发明的软件升级方法中,在操作系统中构造数据只读的下数据层和数据可读写的上数据层的步骤包括:将操作系统的根分区所挂载的目录作为下数据层;创建临时文件系统分区,将临时文件系统分区挂载至操作系统的临时文件系统目录的关联目录,以将临时文件系统分区作为上数据层。
10.可选地,在根据本发明的软件升级方法中,制作虚拟磁盘设备文件的第一文件副本,将第一文件副本设置成上数据层的数据存放介质的步骤包括:复制虚拟磁盘设备文件,生成第一文件副本;将第一文件副本拷贝至关联目录,以使得第一文件副本作为上数据层的数据存放介质。
11.可选地,在根据本发明的软件升级方法中,关联目录为临时文件系统目录或临时文件系统目录的子目录。
12.可选地,在根据本发明的软件升级方法中,在计算设备的操作系统中进行软件升级的步骤包括:将软件的升级数据置入上数据层;将软件的原始数据置入下数据层;执行软件升级。
13.可选地,在根据本发明的软件升级方法中,升级数据包括软件的原始数据和修改数据,以及基于上数据层中的数据修改下数据层中的数据,以获得软件升级后的操作系统版本的步骤包括:将上数据层中的数据覆盖下数据层中的数据,以获得软件升级后的操作系统版本。
14.可选地,在根据本发明的软件升级方法中,升级数据为软件的修改数据,以及基于上数据层中的数据修改下数据层中的数据,以获得软件升级后的操作系统版本的步骤包括:将上数据层中的数据合并至下数据层中,以获得软件升级后的操作系统版本。
15.可选地,在根据本发明的软件升级方法中,层叠文件模式为overlayroot模式。
16.根据本发明的又一个方面,提供一种计算设备,包括:至少一个处理器;以及存储器,存储有程序指令,其中,程序指令被配置为适于由至少一个处理器执行,程序指令包括用于执行根据本发明的软件升级方法的指令。
17.根据本发明的又一个方面,提供一种存储有程序指令的可读存储介质,当程序指令被计算设备读取并执行时,使得计算设备执行根据本发明的软件升级方法。
18.根据本发明的方案,创建虚拟磁盘设备文件,在软件升级后,将升级版本数据存储至虚拟磁盘设备文件,从而使得软件升级的版本数据能够被保存下来。这样,当软件升级成功后,基于上述所保存的升级版本数据修改下数据层中的数据便能得到升级后的软件版本,并能实现持久的保存。当软件升级失败后,以正常模式启动操作系统,便能实现软件回滚。可见,本发明的方案在对软件进行升级时,能够灵活地将升级的版本数据进行永久保存或删除,从而可以灵活地实现软件的升级或回退,提升了用户的体验。
19.本发明的方案,与指定版本安装相比,所有的修改都在上数据层上进行,在升级失败后回退非常彻底、安全。与a/b系统相比,不再需要单独划分一块磁盘安装备份系统,减少了对资源的消耗。
附图说明
20.为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方
面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本公开的上述以及其它目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
21.图1示出了根据本发明一个实施例的计算设备100的结构框图;
22.图2示出了根据本发明一个实施例的软件升级方法200的流程图;
23.图3示出了根据本发明一个实施例的overlayfs的基本结构图;
24.图4示出了根据本发明又一个实施例的软件升级方法400的流程图的示意图。
具体实施方式
25.下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
26.软件开发者在编写软件的时候,由于开发人员考虑不全面、软件功能不完善、软件功能增删等因素,在软件发行后经常需要对软件进行升级。但是,软件升级之后,有时会出现版本不符等问题,导致升级后的软件无法运行,并且也无法恢复至之前的版本。
27.为解决上述问题,提出了可回滚的软件升级方案,即在软件升级失败后,可回退至升级前的版本,以保证软件能够正常的使用。常用的可回滚软件升级方案有指定版本安装、采用a/b系统安装等方式。不过,这些方式或多或少的存在一些缺点。例如,指定版本安装由于没有任何保护机制,相当于直接修改系统,所以使用这种方案如果一旦升级失败,系统被破坏而无法启动时,就回退无门,只有重装系统。采用a/b系统的方案,需要在机器上装两个系统,并且每次升级时,无论对系统修改内容是多还是少,都需要把当前系统整个磁盘数据备份另外一个系统的磁盘上去,所以使用这种方案不仅耗费资源,而且还很耗时,不够轻便。
28.基于此,提出本发明的方案。本发明的一个实施例提供了一种软件升级方法,该方法可以在计算设备中执行。图1示出了根据本发明一个实施例的计算设备100的结构框图。需要说明的是,图1所示的计算设备100仅为一个示例,在实践中,用于实施本发明的软件升级方法的计算设备可以是任意型号的设备,其硬件配置情况可以与图1所示的计算设备100相同,也可以与图1所示的计算设备100不同。实践中用于实施本发明的软件升级方法的计算设备可以对图1所示的计算设备100的硬件组件进行增加或删减,本发明对计算设备的具体硬件配置情况不做限制。
29.如图1所示,在基本配置102中,计算设备100典型地包括系统存储器106和一个或者多个处理器104。存储器总线108可以用于在处理器104和系统存储器106之间的通信。
30.取决于期望的配置,处理器104可以是任何类型的处理,包括但不限于:微处理器(μp)、微控制器(μc)、数字信息处理器(dsp)或者它们的任何组合。处理器104可以包括诸如一级高速缓存110和二级高速缓存112之类的一个或者多个级别的高速缓存、处理器核心114和寄存器116。示例的处理器核心114可以包括运算逻辑单元(alu)、浮点数单元(fpu)、数字信号处理核心(dsp核心)或者它们的任何组合。示例的存储器控制器118可以与处理器
104一起使用,或者在一些实现中,存储器控制器118可以是处理器104的一个内部部分。
31.取决于期望的配置,系统存储器106可以是任意类型的存储器,包括但不限于:易失性存储器(诸如ram)、非易失性存储器(诸如rom、闪存等)或者它们的任何组合。计算设备中的物理内存通常指的是易失性存储器ram,磁盘中的数据需要加载至物理内存中才能够被处理器104读取。系统存储器106可以包括操作系统120、一个或者多个应用122以及程序数据124。在一些实施方式中,应用122可以布置为在操作系统上由一个或多个处理器104利用程序数据124执行指令。操作系统120例如可以是linux、windows等,其包括用于处理基本系统服务以及执行依赖于硬件的任务的程序指令。应用122包括用于实现各种用户期望的功能的程序指令,应用122例如可以是浏览器、即时通讯软件、软件开发工具(例如集成开发环境ide、编译器等)等,但不限于此。当应用122被安装到计算设备100中时,可以向操作系统120添加驱动模块。
32.在计算设备100启动运行时,处理器104会从系统存储器106中读取操作系统120的程序指令并执行。应用122运行在操作系统120之上,利用操作系统120以及底层硬件提供的接口来实现各种用户期望的功能。当用户启动应用122时,应用122会加载至系统存储器106中,处理器104从系统存储器106中读取并执行应用122的程序指令。
33.计算设备100还包括储存设备132,储存设备132包括可移除储存器136和不可移除储存器138,可移除储存器136和不可移除储存器138均与储存接口总线134连接。
34.计算设备100还可以包括有助于从各种接口设备(例如,输出设备142、外设接口144和通信设备146)到基本配置102经由总线/接口控制器130的通信的接口总线140。示例的输出设备142包括图形处理单元148和音频处理单元150。它们可以被配置为有助于经由一个或者多个a/v端口152与诸如显示器或者扬声器之类的各种外部设备进行通信。示例外设接口144可以包括串行接口控制器154和并行接口控制器156,它们可以被配置为有助于经由一个或者多个i/o端口158和诸如输入设备(例如,键盘、鼠标、笔、语音输入设备、触摸输入设备)或者其他外设(例如打印机、扫描仪等)之类的外部设备进行通信。示例的通信设备146可以包括网络控制器160,其可以被布置为便于经由一个或者多个通信端口164与一个或者多个其他计算设备162通过网络通信链路的通信。
35.网络通信链路可以是通信介质的一个示例。通信介质通常可以体现为在诸如载波或者其他传输机制之类的调制数据信号中的计算机可读指令、数据结构、程序模块,并且可以包括任何信息递送介质。“调制数据信号”可以这样的信号,它的数据集中的一个或者多个或者它的改变可以在信号中编码信息的方式进行。作为非限制性的示例,通信介质可以包括诸如有线网络或者专线网络之类的有线介质,以及诸如声音、射频(rf)、微波、红外(ir)或者其它无线介质在内的各种无线介质。这里使用的术语计算机可读介质可以包括存储介质和通信介质二者。
36.在根据本发明的计算设备100中,应用122包括用于执行本发明的软件升级方法200的指令,该指令可以指示处理器104执行本发明的软件升级方法。本领域技术人员可以理解,除了用于执行软件升级方法200的指令之外,应用122还可以包括用于实现其他功能的其他应用126。
37.图2示出了根据本发明一个实施例的软件升级方法200的流程图,方法200适于在计算设备(例如图1所示的计算设备200)中执行。该计算设备中驻留有操作系统,其中,该操
作系统可以为linux操作系统,当然也可以为其他的操作系统,对此本发明不作具体限定。
38.本发明的方法200的目的是实现一种基于层叠技术的软件升级方法,具体地,基于overlayroot技术的软件升级方法。其中,overlayroot是overlayfs文件系统的一种特殊应用,overlayfs是一种堆叠文件系统,它依赖并建立在其它的文件系统之上,不直接参与磁盘空间结构的划分,仅将原来文件系统中不同目录和文件进行“合并”,然后向用户呈现。因此对于用户来说,所见到的overlay文件系统根目录下的内容就来自挂载时所指定的不同目录的“合集”。见图3,图3示出了根据本发明一个实施例的overlayfs的基本结构图。
39.其中,下数据层a/下数据层b目录和上数据层目录为来自底层文件系统的不同目录,用户可以自行指定,内部包含了用户想要合并的文件和目录,挂载目录为挂载点。当文件系统挂载后,在挂载目录下将会同时看到来自各下数据层和上数据层目录下的内容,并且用户也无法(无需)感知这些文件分别哪些来自下数据层,哪些来自上数据层,用户看见的只是一个普通的文件系统根目录而已(下数据层可以有多个也可以只有一个)。
40.虽然overlayfs将不同的各层目录进行合并,但是上数据层和各下数据层这几个不同的目录并不完全等价,存在层次关系。首先当上数据层和下数据层两个目录存在同名文件时,下数据层的文件将会被隐藏,用户只能看见来自上数据层的文件,然后各个下数据层也存在相同的层次关系,较上层屏蔽较下层的同名文件。除此之外,如果存在同名的目录,那就继续合并。如图3中所示,下数据层a中的文件夹2会被上数据层中的文件夹2所覆盖。
41.各层目录中的上数据层是可读写的目录,当用户通过挂载目录向其中一个来自上数据层的文件写入数据时,那数据将直接写入上数据层下原来的文件中,删除文件也是同理;而各下数据层则是只读的,在overlayfs挂载后无论如何操作挂载目录中对应来自下数据层的文件或目录,下数据层中的内容均不会发生任何的改变。既然下数据层是只读的,那当用户想要往来自下数据层的文件添加或修改内容时,overlayfs首先会拷贝一份下数据层中的文件副本到上数据层中,后续的写入和修改操作将会在上数据层下的下数据层拷贝副本文件中进行,下数据层原文件被隐藏。
42.overlayroot实际上是修改了overlayfs的挂载点(由原来的根分区挂载点修改为非根分区挂载点),以在整个根分区上加了一层保护层,有点类似ps图层,之后在系统上做的任何对根分区修改的操作都是在保护层(更换后的挂载目录)上进行,不会修改原本的根分区内容,当overlayroot退出后,去掉这层保护层,根分区就恢复到原来的模样。这层保护层便是上数据层。
43.因此,在利用overlayroot技术实现软件升级时,将升级数据存储至上数据层,软件的原始数据(当前版本数据)存储在下数据层所挂载的挂载目录中,这样,在软件升级时,不会对软件的原始数据进行更改,所有的升级工作均在上数据层中执行。当软件升级失败后,可通过原始数据实现软件的回滚。
44.如图2所示,本发明的软件升级方法200始于步骤s210。
45.在步骤s210中,创建虚拟磁盘设备文件。根据本发明的一个实施例,可以创建一虚拟磁盘设备文件来作为overlayroot的上数据层的存放介质。不过,在将所创建的虚拟磁盘设备文件作为上数据层的存放介质时,创建的虚拟磁盘设备文件需要与上数据层的默认存放介质的格式一致,以使得上数据层中的数据能够存放至虚拟磁盘设备文件。具体地,在一
些实施例中,在操作系统的根分区下创建与根分区格式相同的虚拟磁盘设备文件。
46.在一个具体示例中,可以通过overlayroot开启函数来创建虚拟磁盘设备文件。这个函数主要工作:一是使用dd命令在根分区下创建一个虚拟磁盘文件;二是修改overlayroot配置文件,将overlayroot=":"修改为overlayroot="device:dev=/dev/loop0,recurse=0",表示overlayroot被开启,同时上数据层的存放介质为/dev/loop0设备。
47.根据本发明的一个实施例,overlayroot开启函数的示例性代码如下:
[0048][0049]
需要说明的是,虚拟磁盘设备文件的创建在overlayroot的开启阶段执行,在该阶段,overlayroot还未进行挂载。虚拟磁盘设备文件就创建在操作系统的根分区下面,路径不限。在创建好虚拟磁盘设备文件后,重启操作系统。
[0050]
在步骤s220中,以层叠文件模式启动操作系统,其中在层叠文件模式中,在操作系统中构造数据只读的下数据层和数据可读写的上数据层。制作虚拟磁盘设备文件的第一文件副本,将第一文件副本设置成上数据层的数据存放介质。作为优选地,本实施例中采用的层叠文件模式为overlayroot模式。
[0051]
层叠文件模式启动操作系统通过两个阶段完成。
[0052]
第一阶段,在操作系统中构造数据只读的下数据层和数据可读写的上数据层。
[0053]
具体地,一方面,将操作系统的根分区所挂载的目录作为下数据层。在本实施例中,将操作系统的根分区所挂载的目录作为下数据层,可使得操作系统的所有数据均作为下数据层中的数据。软件的原始数据(即软件升级前的版本数据)自然也就归属于下数据层中。
[0054]
另一方面,创建临时文件系统分区,将临时文件系统分区挂载至操作系统的临时文件系统目录的关联目录,以将临时文件系统分区作为上数据层。
[0055]
需要说明的是,分区是一个由从整个磁盘分配的空间组成的逻辑块。依赖于系统
在安装时是如何配置的,在磁盘上可能有一个或多个分区。举例而言,一块新硬盘就像毛坯房,在往里放东西(例如家具)之前,它里边需要有一定的结构和墙。分区是磁盘的第一层基础。磁盘逻辑地划分为分区后,就可以将它想象成带有房间的房子。每个分区(房间)都有一定的大小,这种大小可以通过移动改变大小,但是将造成一些中断,就像挪动东西来腾出空间。分区(房间)创建后,就可以使用选择的文件系统将其格式化。文件系统定下以后,就可以使用文件和文件夹(家具)形式的数据填充分区了。另外,“挂载(mount)”是一个指使文件系统可被系统使用时的术语。
[0056]
在一些实施例中,关联目录为临时文件系统目录或临时文件系统目录的子目录。临时文件系统目录为操作系统的根目录的一级目录,一般指/run目录。以“/a/b”为例,a指根目录的一级目录,b指根目录的二级目录(同时,b为a目录的一级目录,也称b为a目录的子目录)。
[0057]
需要说明的是,/run属于操作系统自身的目录,可以用于存放系统运行时的临时数据,因此可以利用/run目录挂载所创建的tmpfs分区(即临时文件系统分区或内存文件系统分区)。但测试了两个版本后发现,这个目录的容量和机器内存的大小有关,大概是10比1的关系。8g内存,/run空间目录大概接近800m,如果物理内存4g,/run目录空间大概接近400m(这些是测试观察到的规律)。这样,对于内存较小的计算设备,当上数据层中的数据较大时,便会把/run目录撑满,进而会导致后面的overlayroot挂载失败,系统出现问题。因此,为了解决这个问题,可以在/run目录下创建一个子目录/run/overlayroot,将tmpfs挂载至该子目录下,这样便可以避免由于/run存储容量不足而导致的系统问题。
[0058]
第二阶段,制作虚拟磁盘设备文件的第一文件副本,将第一文件副本设置成上数据层的数据存放介质。
[0059]
具体地,首先,复制虚拟磁盘设备文件,生成第一文件副本。
[0060]
然后,将第一文件副本拷贝至关联目录,以使得第一文件副本作为上数据层的数据存放介质。
[0061]
在一个具体示例中,以层叠模式启动操作系统时,会依次执行overlayroot挂载前脚本、overlayroot挂载脚本以及overlayroot挂载后脚本。
[0062]
overlayroot挂载前脚本主要任务是首先判断overlayroot配置文件有没有配上数据层的存放介质,并且当存放介质设备为/dev/loop0时,创建一个tmpfs分区,挂载到/run/overlayroot目录。然后,把根分区的虚拟磁盘设备文件拷贝到/run/overlayroot,生成第一文件副本。最后,使用overlayroot下的losetup命令把第一文件副本设置成loop设备(/dev/loop0)。由于overlayroot开启函数已经把上数据层和/dev/loop0关联起来了,因此此时再执行overlayroot挂载脚本,就能把第一文件副本叠加到原来的根分区之上。这样便实现了,将第一文件副本设置为上数据层的存放介质。
[0063]
根据本发明的一个实施例,overlayroot挂载前脚本的示例性代码如下:
[0064]
#!/bin/sh
[0065]
case"$1"in
[0066]
#no pre-reqs
[0067]
prereqs)echo"";exit 0;;
[0068]
esac
[0069]
path=/usr/sbin:/usr/bin:/sbin:/bin
[0070]
mytag="my"
[0071]
rootmnt=${rootmnt}
[0072]
loop_dev="/dev/loop0"
[0073]
isenableoverlayroot=$(grep"^overlayroot="${rootmnt}/etc/overlayroot.conf|awk-f\"'{print$2}')||isenableoverlayroot=
[0074]
if[-z"${isenableoverlayroot}"];then
[0075]
echo"overlayroot is not enable"
[0076]
else
[0077]
overlayroot_device=$(echo$isenableoverlayroot|awk-f\:'{print$2}'|\
[0078]
awk-f\,'{print$1}'|awk-f\='{print$2}')
[0079]
if["$overlayroot_device"="$loop_dev"];then
[0080]
mkdir/run/overlayroot
[0081]
mount-t tmpfs-o size=1g tmpfs/run/overlayroot
[0082]
cp${rootmnt}/usr/lib/deepin-graphics-driver-manager/working-dir/overlayroot.img/run/overlayroot
[0083]
[-e"${loop_dev}"]||mknod${loop_dev}b 7 0
[0084]
losetup${loop_dev}/run/overlayroot/overlayroot.img
[0085]
fi
[0086]
fi
[0087]
exit 0
[0088]
overlayroot挂载脚本,主要任务首先是把根分区的挂载点更换到/media/root_ro目录,然后把overlayroot的配置文件中指定的upper(即,上数据层)存储设备(/dev/loop0)挂载到/media/root_rw目录,最后挂载overlayroot。
[0089]
根据本发明的一个实施例,overlayroot挂载脚本的示例性代码如下:
[0090]
mount-t overlay-o\
[0091]
lowerdir=/media/root-ro,\
[0092]
upper=/media/root-rw/overlay,\
[0093]
workdir=/media/root-rw/overlay-workdir overlayroot/
[0094]
overlayroot挂载后脚本,该脚本在挂载overlayroot之后执行,具体是还原overlayroot配置文件,让overlayroot关闭。此时关闭overlayroot的目的是,防止此次挂载overlayroot后启动系统时启动失败。在挂载overlayroot之后执行overlayroot挂载后脚本,如果出现启动失败的情况,用户只需要按一下重启键,就可以退出overlayroot,系统便能还原到升级之前的状态。
[0095]
根据本发明的一个实施例,overlayroot挂载后脚本的示例性代码如下:
[0096]
#!/bin/sh
[0097]
case"$1"in
[0098]
#no pre-reqs
[0099]
prereqs)echo"";exit 0;;
[0100]
esac
[0101]
path=/usr/sbin:/usr/bin:/sbin:/bin
[0102]
mytag="my"
[0103]
rootmnt=${rootmnt}
[0104]
sed-i's:overlayroot=".*":overlayroot="":'${rootmnt}/etc/overlayroot.conf
[0105]
需要说明的是,overlayroot挂载前脚本、overlayroot挂载脚本以及overlayroot挂载后脚本均是在系统启动的initrd阶段(具体是init-bottom阶段)完成的,在该阶段系统还没完全启动。另外,需要检测系统是否能正常启动,如果系统不能正常启动,则通过重启系统,便能退出overlayroot。。
[0106]
在步骤s230中,在计算设备的操作系统中进行软件升级。具体地,将软件的升级数据置入上数据层。将软件的原始数据置入下数据层。执行软件升级。
[0107]
需要说明的是,虽然在进行软件升级之前,执行了overlayroot挂载后脚本,关闭了overlayroot,但是,由于没有重启操作系统,因此,在执行软件升级时,此时,仍然是在overlayroot模式下。
[0108]
在步骤s240中,在软件升级完成后,将第一文件副本复制至虚拟磁盘设备文件。第一文件副本作为上数据层的存放介质,软件的更新数据存放在第一文件副本中,将第一文件副本复制至虚拟磁盘设备文件,即将当前状态下第一文件副本替换根分区下的虚拟磁盘设备文件。以保证在软件升级过程中在上数据层中产生的所有数据均能保存至虚拟磁盘设备文件。
[0109]
在一个具体示例中,可通过上数据层保存函数overlayroot_save()来实现将第一文件副本复制至虚拟磁盘设备文件。该函数主要工作首先是执行一下sync,把上数据层同步到第一文件副本中,然后再把第一文件副本中的数据从tmpfs分区拷贝到根分区的虚拟磁盘设备文件中。该函数的示例性代码如下:
[0110]
overlayroot_save(){
[0111]
postos=`cat/proc/mounts|awk'{if($2=="/media/root-ro")print$1}'`
[0112]
mount-o remount,rw$postos/media/root-ro
[0113]
sync
[0114]
cp-f/run/overlayroot/overlayroot.img
[0115]
${overlay_lowdir}/${overlayroot_image}
[0116]
}
[0117]
在步骤s250中,以层叠文件模式重新启动操作系统,其中制作虚拟磁盘设备文件的第二文件副本,将第二文件副本设置成上数据层的数据存放介质。
[0118]
需要说明的是,软件升级完成之后,需要重新启动操作系统,才能使得升级后的软件生效。并且,虽然软件的升级数据已经保存至虚拟磁盘设备中了,但是,升级数据还没有与原始数据进行融合,如果此时以正常模式启动,运行软件依然是升级前的版本。因此,需要在软件升级完成后,以层叠文件模式重新启动操作系统。
[0119]
还需要说明的是,在本实施例中,以层叠文件模式启动操作系统时,会自动删除第一文件副本,此时,需要拷贝存储有软件升级数据的虚拟磁盘设备文件制作第二文件副本。
[0120]
在步骤s260中,检测软件升级是否成功。其中,可以通过检查系统是否运行正常来检测软件是否升级成功。当然,也可以利用相应的测试工具来检测软件是否升级成功。对此,本发明不作限定。
[0121]
在步骤s270中,若软件升级成功,则将下数据层设置为数据可读写,并基于上数据层中的数据修改下数据层中的数据,以获得软件升级后的操作系统版本,并以正常模式启动软件升级后的操作系统。由于下数据层默认是只读(目的是保护下数据层中的数据在软件升级时被更改),因此,在修改下数据层中的数据前,需要将下数据层设置为数据可读写。
[0122]
需要说明的是,在现有的软件升级中,升级包数据可能只包括软件的修改数据,即只有增量数据。也可能包括原始数据和修改数据,即软件的升级包已经为升级后的软件数据。容易理解的是,虽然软件的升级包已经为升级后的软件数据,但是该升级包不一定能够在当前计算设备的操作系统中运行,一旦运行失败,仍然需要将软件回滚至原先的版本。
[0123]
在一些实施例中,若升级数据包括软件的原始数据和修改数据,则基于上数据层中的数据修改下数据层中的数据,以获得软件升级后的操作系统版本的步骤包括:
[0124]
将上数据层中的数据覆盖下数据层中的数据,以获得软件升级后的操作系统版本。所谓的覆盖,就是用上数据层中的升级数据替换下数据层中的原始数据。具体地,可将下数据层中软件的原始数据删除,然后,将上数据层中的升级数据拷贝至下数据层中。拷贝时注意把软件的升级数据权限、路径等文件属性一起带上。之后关闭overlayroot模式,以正常模式启动操作系统,便得到升级后的操作系统的版本。
[0125]
在一个具体示例中,可通过调用overlayroot关闭函数关闭overlayroot模式。该函数和overlayroot开启函数相反,首先是把overlayroot修改给还原,然后是删除虚拟磁盘文件。该函数的示例性代码如下:
[0126]
overlayroot_disable(){
[0127]
if[[-n"${isinoverlayroot}"]];then
[0128]
overlayroot-chrootsed-i's:overlayroot=".*":overlayroot="":'${overlayroot_conf}
[0129]
[-e"${overlayroot_image}"]&&overlayroot-chrootrm-f
[0130]
${overlayroot_image}
[0131]
else
[0132]
sed-i's:overlayroot=".*":overlayroot="":'${overlayroot_conf}
[0133]
[-e"${overlayroot_image}"]&&rm-f${overlayroot_image}
[0134]
fi
[0135]
}
[0136]
在一些实施例中,当升级数据仅仅为软件的修改数据(即软件升级版本数据和升级前版本数据的增量数据),则基于上数据层中的数据修改下数据层中的数据,以获得软件升级后的操作系统版本的步骤包括:
[0137]
将上数据层中的数据合并至下数据层中的数据,以获得软件升级后的操作系统版本。所谓的合并就是把上数据层中的数据合并到下数据层,即将软件的升级数据(所修改的数据)和原始数据合并在一起。例如,可以通过合并函数overlayroot_merge()来将上数据层中的数据合并到下数据层。其中,upper层文件中有一种是字符设备类型文件(类型为c),
当用户要在系统上删除一个文件或目录,而这个文件或目录来自lower层时,由于lower层是只读层不能直接进行修改,就会在upper层创建一个同名的字符设备文件来屏蔽lower文件或目录,然后从系统层面去看效果就相当于删除了文件或目录。所以当遇到字符设备文件时,就需要去lower底层同级目录下把对应的同名文件或目录删除。对于除字符设备类型文件以外的文件,都是系统层面创建文件时创建出来的,所以对于这些文件的处理只需要拷贝到lower层同级目录。同样,拷贝时应把权限、路径等文件属性一起带上。还需说明一点,为了节约磁盘空间,在将上数据层中的数据合并至下数据层中的数据后,还可以将虚拟磁盘设备文件删除。
[0138]
根据本发明的一个实施例,合并函数overlayroot_merge()的示例性代码如下:
[0139]
overlayroot_merge(){
[0140]
postos=`cat/proc/mounts|awk'{if($2=="/media/root-ro")print$1}'`
[0141]
mount-o remount,rw$postos/media/root-ro
[0142]
type_list=("c""f""b""l""s")
[0143]
for t in${type_list[@]}
[0144]
do
[0145]
file_list=$(find/media/root-rw/overlay-type${t}|cut-d/-f5-)
[0146]
for file in${file_list}
[0147]
do
[0148]
case${t}in
[0149]
"c")
[0150]
[-e"/media/root-ro/${file}"]&&rm-rf/media/root-ro/${file}
[0151]
;;
[0152]
"f"|"b"|"l"|"s")
[0153]
cp-af/media/root-rw/overlay/${file}/media/root-ro/${file}
[0154]
;;
[0155]
*)
[0156]
echo"invaild file type"
[0157]
;;
[0158]
esac
[0159]
done
[0160]
done
[0161]
update-initramfs-u
[0162]
}
[0163]
}
[0164]
在步骤s280中,若软件升级未成功,则以正常模式启动操作系统,以回退到软件升级前的操作系统版本。其中,为了节约磁盘空间,当软件升级未成功时,还可以将虚拟磁盘设备文件删除。
[0165]
为了更好的说明本发明的完整实现过程,本发明又给出了一个具体的示例。如图4所示,图4示出了根据本发明一个实施例的利用overlayroot进行软件升级的方法400的流
程图的示意图。如图4所示,本发明的软件升级方法400始于步骤s401。
[0166]
在步骤s401中,修改overlayroot配置文件来开启overlayroot,并在根分区下创建一个虚拟磁盘设备文件。随后,执行步骤s402。
[0167]
其中,虚拟磁盘设备文件的创建以及overlayroot配置文件的修改可以通过overlayroot开启函数来完成。这个函数的主要工作:一是使用dd命令在根分区下创建一个虚拟磁盘文件;二是修改overlayroot配置文件,将overlayroot=":"修改为overlayroot="device:dev=/dev/loop0,recurse=0",表示overlayroot被开启,同时upper层的存放介质为/dev/loop0设备。关于该步骤的具体过程可以参见对上述步骤s210的描述,在此不再赘述。
[0168]
在步骤s402中,重启操作系统。随后,执行步骤s403。
[0169]
需要说明的是,步骤s401中是修改配置文件来开启overlayroot,而要真正的开启overlayroot,还需重启操作系统。
[0170]
在步骤s403中,判断overlayroot是否已开启。若overlayroot未开启,则执行步骤s404,若overlayroot已开启,则执行步骤s405。
[0171]
在步骤s404中,退出overlayroot。即,不挂载overlayroot,以正常模式启动操作系统。
[0172]
在步骤s405中,创建tmpfs分区和/run/overlayroot目录,将所创建的tmpfs分区挂载到/run/overlayroot目录,并将根分区下的虚拟磁盘设备文件拷贝到/run/overlayroot目录下,同时使用losetup工具把/run/overlayroot目录下的虚拟磁盘设备文件设置成/dev/loop0。随后,执行步骤s406。
[0173]
其中,由于上述步骤s401已经在overlayroot的配置文件中把upper层和/dev/loop0关联起来了,因此在将虚拟磁盘设备文件设置成/dev/loop0之后,虚拟磁盘设备文件便成为了upper层数据的存储介质。其中,关于该步骤中tmpfs分区和/run/overlayroot目录的创建、虚拟磁盘设备文件的拷贝以及/dev/loop0的设置等,具体地可以参见上述实施例中关于对overlayroot挂载前脚本的描述,在此不再赘述。
[0174]
在步骤s406中,挂载overlayroot。随后,执行步骤s407。
[0175]
其中,在挂载overlayroot时,主要是把根分区的挂载点更换到/media/root_ro目录,然后把overlayroot的配置文件中指定的upper存储设备(/dev/loop0)挂载到/media/root_rw目录,最后挂载overlayroot。具体地,可以参见上述实施例中关于对overlayroot挂载脚本的描述,在此不再赘述。
[0176]
在步骤s407中,修改overlayroot的配置文件来关闭overlayroot。随后,执行步骤s408。
[0177]
其中,关闭overlayroot的目的是,防止挂载overlayroot后启动系统时启动失败。当修改overlayroot的配置文件关闭overlayroot后,如果出现启动失败的情况,那么用户只需要按一下重启键,就可以退出overlayroot,这样系统便能还原到升级之前的状态。具体地,可以参见上述实施例中关于对overlayroot挂载后脚本的描述,在此不再赘述。另外,在此说明一点,步骤405至407均是在系统启动的initrd阶段(具体是init-bottom阶段)完成的。
[0178]
在步骤s408中,检测系统是否能正常启动。若是,则执行步骤s409,若否,则返回步
骤s402(由于步骤s407中已修改overlayroot的配置文件关闭了overlayroot,因此当返回步骤s402重启操系统后,在执行步骤s403时会判定overlayroot未开启,随之则会进入步骤s404,退出overlayroot,以正常模式启动操作系统)。
[0179]
在步骤s409中,判断软件是否已经升级。若否(说明此时还未进行软件升级,即第一次进行软件升级),则执行步骤s410。若是,则执行步骤s411。
[0180]
在步骤s410中,执行软件升级。随后,执行步骤s412。
[0181]
在步骤s411中,检测软件是否升级成功。若是,则执行步骤s413。若否,则执行步骤s414。
[0182]
在步骤s412中,从/tmpfs分区把虚拟磁盘设备文件拷贝回根分区,并修修改overlayroot的配置文件来开启overlayroot。随后,返回步骤s402。
[0183]
从/tmpfs分区把虚拟磁盘设备文件拷贝回根分区,即将/run/overlayroot/目录下的虚拟设备文件覆盖lower层根分区的原始虚拟设备文件,以保存overlayroot的uppder层数据。为了使升级的软件生效,还需重启操作系统,因此,在保存overlayroot的uppder层数据后,需返回步骤s402。而由于在步骤s407中,已修改overlayroot的配置文件关闭了overlayroot,因此为了重启操作系统后仍能保证overlayroot开启,此时需再修改overlayroot的配置文件来开启overlayroot。
[0184]
在步骤s413中,合并upper层数据到lower层。随后,执行步骤s414。
[0185]
其中,关于将upper层数据合并到lower层的具体过程可以参见上述实施例中步骤s270的描述,在此不再赘述。
[0186]
在步骤s414中,删除根分区下的虚拟磁盘设备文件,并返回步骤s402。
[0187]
其中,若由步骤s411直接进入该步骤,则代表软件升级未成功,此时返回步骤s402重启操作系统后,会自动退出overlayroot,并回退到升级前的操作系统版本。若由步骤s413进入该步骤,则代表软件已升级成功,并已合并upper层数据到lower层,此时返回步骤s402重启操作系统后,会自动退出overlayroot,并仍为升级后的操作系统。另外,删除根分区下的虚拟磁盘设备文件仅是为了清理操作系统的磁盘,即便不删除该虚拟磁盘设备文件对软件的升级与回退均无影响。也就是说,当软件未升级成功时,可以直接返回步骤s402,以回退到升级前的操作系统版本;当合并upper层数据到lower层后,也可以直接返回步骤s402,以启动软件升级后的操作系统版本。
[0188]
根据本发明的软件升级方法,创建虚拟磁盘设备文件,在软件升级后,将升级版本数据存储至虚拟磁盘设备文件,从而使得软件升级的版本数据能够被保存下来。这样,当软件升级成功后,基于上述所保存的升级版本数据修改下数据层中的数据便能得到升级后的软件版本,并能实现持久的保存。当软件升级失败后,以正常模式启动操作系统,便能实现软件回滚。可见,本发明的软件升级方法在对软件进行升级时,能够灵活地将升级的版本数据进行永久保存或删除,从而可以灵活地实现软件的升级或回退,提升了用户的体验。
[0189]
本发明的方案,与指定版本安装相比,所有的修改都在上数据层上进行,在升级失败后回退非常彻底、安全。另外,本方案不需要单独划一块磁盘安装备份系统,并且,可以只保存差异数据,而a/b系统不仅需要单独划一块磁盘安装备份系统,而且不管升级修改内容多少,最终都要把两块磁盘数据全部同步一次,非常耗费资源。因此,本方案与a/b系统相比,资源消耗非常少。
[0190]
这里描述的各种技术可结合硬件或软件,或者它们的组合一起实现。从而,本发明的方法和设备,或者本发明的方法和设备的某些方面或部分可采取嵌入有形媒介,例如可移动硬盘、u盘、软盘、cd-rom或者其它任意机器可读的存储介质中的程序代码(即指令)的形式,其中当程序被载入诸如计算机之类的机器,并被所述机器执行时,所述机器变成实践本发明的设备。
[0191]
在程序代码在可编程计算机上执行的情况下,计算设备一般包括处理器、处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件),至少一个输入装置,和至少一个输出装置。其中,存储器被配置用于存储程序代码;处理器被配置用于根据该存储器中存储的所述程序代码中的指令,执行本发明的软件升级方法。
[0192]
以示例而非限制的方式,可读介质包括可读存储介质和通信介质。可读存储介质存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息。通信介质一般以诸如载波或其它传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其它数据,并且包括任何信息传递介质。以上的任一种的组合也包括在可读介质的范围之内。
[0193]
在此处所提供的说明书中,算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与本发明的示例一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0194]
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0195]
应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。
[0196]
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
[0197]
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0198]
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的
范围之内并且形成不同的实施例。
[0199]
此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
[0200]
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
[0201]
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的,而非限制性的,本发明的范围由所附权利要求书限定。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献