操作系统恢复方法、设备、存储介质及计算机程序产品与流程

文档序号:28055039发布日期:2021-12-17 22:02阅读:643来源:国知局
操作系统恢复方法、设备、存储介质及计算机程序产品与流程

1.本技术涉及计算机技术领域,具体地涉及一种操作系统恢复方法、设备、存储介质及计算机程序产品。


背景技术:

2.在现有技术的应用场景中,用户终端需要安装操作系统才可以被用户使用。例如,手机上需要安装手机操作系统(例如:ios系统、安卓系统)才可以被用户使用。
3.在终端设备安装操作系统后,当操作系统出现版本升级时,需要升级终端设备上所安装的操作系统。在升级操作系统过程中,由于数据错误(例如,操作系统升级安装包数据错误)、设备异常(例如,内存地址跳变、数据传输异常)等原因,会导致操作系统升级失败。因此,需要一种针对操作系统升级失败的应对方法。


技术实现要素:

4.有鉴于此,本技术提供一种操作系统恢复方法、设备、存储介质及计算机程序产品,以利于解决现有技术中操作系统升级失败的问题。
5.第一方面,本技术实施例提供了一种操作系统恢复方法,应用于电子设备,所述电子设备包括处理器以及存储器,所述存储器包括基础分区、第一静态分区、第二静态分区、动态分区以及用户数据分区,所述方法包括:
6.当所述电子设备的启动过程包含失败的落盘操作时,更新落盘操作失败记录信息,所述落盘操作失败记录信息用于记录所述电子设备的失败的落盘操作;
7.基于所述更新后的落盘操作失败记录信息,确定需要恢复操作系统时,获取当前版本的操作系统的完整安装镜像;
8.重启所述电子设备进入恢复模式;
9.在所述恢复模式下,使用所述当前版本的操作系统的完整安装镜像恢复所述电子设备的操作系统;
10.重启所述电子设备,加载所述基础分区、所述第一静态分区或所述第二静态分区、所述动态分区的数据以运行操作系统。
11.在第一方面的一种实现方式中,所述当所述电子设备的启动过程包含失败的落盘操作时,更新落盘操作失败记录信息之前,所述方法还包括:
12.在所述电子设备启动并成功运行操作系统后,读取落盘状态信息;
13.当所述落盘状态信息表示未落盘时,判定所述电子设备的启动过程包含失败的落盘操作。
14.在第一方面的一种实现方式中,所述在所述电子设备启动并成功运行操作系统后,读取落盘状态信息,包括:
15.在所述电子设备启动并成功运行操作系统后,在第一预设时长后读取所述落盘状态信息。
16.在第一方面的一种实现方式中,所述落盘操作失败记录信息用于记录所述电子设备的落盘操作的失败次数;
17.在所述更新落盘操作失败记录信息之后,所述方法还包括:
18.当所述落盘操作失败记录信息中的落盘操作的失败次数大于第一值时,获取当前版本的操作系统的完整安装镜像。
19.在第一方面的一种实现方式中,所述落盘操作失败记录信息包括落盘失败项,所述方法包括:
20.在所述电子设备启动并成功运行操作系统后,读取落盘状态信息;
21.当所述落盘状态信息表示未落盘时,将所述落盘操作失败记录信息中的落盘失败项的值加1;
22.当所述落盘操作失败记录信息中的落盘失败项的值大于所述第一值时,获取当前版本的操作系统的完整安装镜像。
23.在第一方面的一种实现方式中,所述方法还包括:
24.当所述落盘状态信息表示已落盘时,将所述落盘操作失败记录信息中的落盘失败项的值置为0。
25.在第一方面的一种实现方式中,同一天内的多次落盘操作失败,在所述落盘操作失败记录信息中被记录为一次落盘操作失败。
26.在第一方面的一种实现方式中,所述落盘操作失败记录信息包括落盘失败项以及日期项,所述方法包括:
27.在所述电子设备启动并成功运行操作系统后,读取落盘状态信息;
28.当所述落盘状态信息表示未落盘时,读取所述落盘操作失败记录信息中所述落盘失败项的值;
29.当所述落盘失败项的值不为0时,读取所述落盘操作失败记录信息中所述日期项的值;
30.当所述日期项的值不为当前日期时,将所述落盘失败项的值加1,将日期项的值置为当前日期;
31.当所述落盘操作失败记录信息中的落盘失败项的值大于所述第一值时,判断需要恢复操作系统。
32.在第一方面的一种实现方式中,所述方法还包括:
33.当所述落盘状态信息表示已落盘时,将所述落盘操作失败记录信息中的落盘失败项的值置为0。
34.在第一方面的一种实现方式中,所述方法还包括:
35.当所述落盘失败项的值为0时,将所述落盘失败项的值加1,将日期项的值置为当前日期。
36.在第一方面的一种实现方式中,所述在所述恢复模式下,使用所述当前版本的操作系统的完整安装镜像恢复所述电子设备的操作系统,包括:
37.从所述完整安装镜像中提取基础分区镜像、静态分区镜像以及动态分区镜像,将所述基础分区镜像、静态分区镜像以及动态分区镜像烧录到所述基础分区、所述第一静态分区、所述第二静态分区以及所述动态分区。
38.第二方面,本技术还提供一种电子设备,所述电子设备包括处理器以及存储器,所述存储器包括基础分区、第一静态分区、第二静态分区、动态分区以及用户数据分区,所述处理器用于执行所述存储器上存储的软件代码,以使得所述电子设备执行如第一方面所述的方法流程。
39.第三方面,本技术还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,当其在计算机上运行时,使得计算机执行如权第一方面所述的方法。
40.第四方面,本技术还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,当其在计算机上运行时,使得计算机执行如第一方面所述的方法。
41.根据本技术实施例所提出的上述技术方案,至少可以实现下述技术效果:
42.根据本技术实施例的方法,可以在落盘操作失败后恢复操作系统数据,从而有效避免落盘失败导致重复循环执行落盘操作状况的发生,进而提高操作系统运行稳定性,及时释放用户存储空间。
附图说明
43.为了更清楚地说明本技术实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
44.图1所示为根据本技术一实施例的数据存储结构示意图;
45.图2所示为根据本技术一实施例的操作系统升级的流程图;
46.图3所示为根据本技术一实施例恢复操作系统的流程图;
47.图4所示为根据本技术一实施例恢复操作系统的流程图;
48.图5所示为根据本技术一实施例恢复操作系统的流程图。
具体实施方式
49.为了更好的理解本技术的技术方案,下面结合附图对本技术实施例进行详细描述。
50.应当明确,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
51.在本技术实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本技术。在本技术实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。
52.应当理解,本文中使用的术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,甲和/或乙,可以表示:单独存在甲,同时存在甲和乙,单独存在乙这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
53.图1所示为根据本技术一实施例的数据存储结构示意图。如图1所示,安卓系统数据存储区包含基础分区(common)、静态分区(a)(第一静态分区)、静态分区(b)(第二静态分区)、动态分区(super)、用户数据分区(userdata)。
54.用户数据分区(userdata)用于保存用户的个人数据,例如,用户个人安装的app、用户个人保存的图片、文档以及视频等个人数据。基础部分中保存的数据为不参与操作系统升级的系统数据。静态分区(a)与静态分区(b)的结构相互对应,子分区命名通过后缀_a以及_b相互区分。例如,静态分区(a)包括bootloader_a、boot_a、vendor_boot_a、dtbo_a、vbmeta_a;静态分区(b)包括bootloader_b、boot_b、vendor_boot_b、dtbo_b、vbmeta_b。动态分区(super)包含多个子分区(system、system_ext、vendor、product、cust、odm)。
55.在设备启动时,从一个静态分区启动。例如,设备从静态分区(a)启动:依次加载基础分区(common)、静态分区(a)以及动态分区(super);设备从静态分区(b)启动:依次加载基础分区(common)、静态分区(b)以及动态分区(super)。
56.图2所示为针对图1所示实施例的操作系统数据存储结构进行操作系统升级的流程图,当设备当前是从静态分区(a)启动时,设备按照如图2所示的流程实现操作系统的升级。
57.s200,设备依次加载基础分区(common)、静态分区(a)以及动态分区(super),从静态分区(a)启动。
58.s210,设备获取操作系统升级安装包。
59.示例的,在一种可行的实现方案中,设备定期向搜包服务器发起搜包请求,搜包请求包含设备当前运行的操作系统的版本号(例如版本1.1);搜包服务器根据搜包请求中的操作系统版本号,检索当前是否存在更新版本号的操作系统安装包(例如版本1.2);当存在更新版本的操作系统安装包时,搜包服务器向设备反馈操作系统升级安装包(例如,由版本1.1升级到版本1.2的系统增量升级安装包)的下载地址;设备根据操作系统升级安装包的下载地址下载操作系统升级安装包,并将操作系统升级安装包保存到用户数据分区(userdata)。
60.s220,设备根据操作系统升级安装包针对静态分区(b)进行数据写入操作以升级静态分区。
61.例如,版本1.1升级到版本1.2的系统增量升级安装包包含版本1.2的静态分区的全量数据,设备将版本1.2的静态分区的数据覆写到静态分区(b)中。
62.s230,设备根据操作系统升级安装包在用户数据分区(userdata)创建虚拟动态分区,在虚拟动态分区写入动态分区(super)的升级数据。例如,在操作系统升级安装包中包含版本1.2的动态分区的数据,设备在虚拟动态分区中写入版本1.2的动态分区(super)的数据。
63.进一步的,在虚拟a/b升级方案中,针对动态分区(super),采用增量升级方式。在升级过程中,用户数据分区(userdata)的虚拟动态分区中保存的并不是升级后新版本的动态分区(super)的全部文件,而是旧版本的动态分区(super)中需要升级的数据在升级后的升级结果。即,用户数据分区(userdata)的虚拟动态分区中保存的是动态分区的更新数据。
64.以system子分区为例,假设在版本1.1中,system子分区中的数据可以分为system1、system2两部分。从版本1.1升级到版本1.2,数据system2没有发生变化,数据syetem1被升级为system3。那么,在s230中,设备在用户数据分区(userdata)创建虚拟动态分区,在虚拟动态分区中写入数据system3。
65.例如,版本1.1升级到版本1.2的系统增量升级安装包包含版本1.1升级到版本1.2
的动态分区(super)更新数据,该动态分区(super)更新数据包含数据system3。
66.进一步的,在虚拟a/b升级方案中,基于快照技术(snapshot)实现动态分区(super)的增量升级。具体的,用户数据分区(userdata)的虚拟动态分区中,采用写时拷贝(copy

on

write,cow)文件保存动态分区(super)的升级数据。
67.具体的,用户数据分区(userdata)中保存的动态分区(super)的升级数据包含多个cow文件,每个cow文件对应一个动态分区(super)的子分区,cow文件的命名与其所针对的动态分区(super)子分区相对应。
68.在s210所获取的操作系统升级安装包中,动态分区(super)的升级数据的cow文件以二进制代码形式压缩保存。在操作系统升级安装包中,每个cow文件根据其所针对的动态分区(super)子分区所命名。例如,针对system子分区的cow文件被命名为system

cow

img.img.0000。
69.在s230中,设备解包操作系统升级安装包以获取所有的cow文件,为每个cow文件附加a/b分区标记。具体的,当设备当前从静态分区(a)启动时,可以理解为设备当前运行操作系统所加载的动态分区(super)为动态分区(a)。在升级操作系统时,用户数据分区(userdata)中创建的虚拟动态分区是针对动态分区(b)。因此,为cow文件附加对应动态分区(b)的名称标记_b。例如,为system

cow

img.img.0000附加_b生成system_b

cow

img.img.0000。
70.进一步的,在s230中,在用户数据分区(userdata)中创建update文件夹,将重命名的cow文件保存到update文件夹下。例如,在一应用场景中,在向用户数据分区(userdata)写入cow文件后,用户数据分区(userdata)的update文件夹中包含下述文件:
71.system_b

cow

img.img.0000;
72.system_ext_b

cow

img.img.0000;
73.vendor_b

cow

img.img.0000;
74.product_b

cow

img.img.0000;
75.cust_b

cow

img.img.0000;
76.odm_b

cow

img.img.0000。
77.具体的,cow文件中包含cow文件自身的cow文件地图(快照map)以及升级数据。cow文件地图(快照)与cow文件所针对的动态分区(super)的子分区的文件地图相对应。动态分区(super)的子分区的文件地图用于描述当前版本的操作系统(本次升级之前的版本,例如,版本1.1)动态分区(super)的子分区中的所有文件以及各个文件的保存地址。
78.cow文件中的升级数据为相较于当前版本的子分区数据,新版本的子分区数据中被更新的文件;cow文件自身的cow文件地图则用于描述被更新的文件与当前版本的子分区中的文件间的对应关系以及被更新的文件的保存地址。
79.基于动态分区(super)的子分区的文件地图以及cow文件中的cow文件地图,就可以使用cow文件中的升级数据替换动态分区(super)的子分区中的对应文件,从而实现动态分区(super)数据的升级。具体的,在需要获取动态分区(super)的子分区的文件地图时,可以基于snapshot对动态分区(super)的子分区的数据进行快照操作以生成动态分区(super)的子分区的文件地图。也可以在制作操作系统升级安装包时,预先生成动态分区(super)的子分区的文件地图,将该文件地图加入到cow文件中。
80.以system子分区为例,假设system子分区中按照以下路径保存数据:
81./system/app/a0.xxx;
82./system/app/a1.xxx;
83./system/app/a2.xxx;
84./system/b0.xxx;
85./system/b1.xxx;
86./system/user/c0.xxx;
87./system/user/c1.xxx;
88./system/user/c2.xxx;
89./system/user/c3.xxx。
90.system子分区的文件地图可以是:
91./system/app/a0.xxx:024010~024013;
92./system/app/a1.xxx:024014~024017;
93./system/app/a2.xxx:024018~024020;
94./system/b0.xxx:024021~024026;
95./system/b1.xxx:024027~024028;
96./system/user/c0.xxx:024029~024032;
97./system/user/c1.xxx:024033~024035;
98./system/user/c2.xxx:024036~024040;
99./system/user/c3.xxx:024041~024044。
100.文件名后的数值(例如,/system/app/a0.xxx:024010~024013中的024010~024013)为该文件在动态分区(super)的system子分区的物理保存地址(块地址)。
101.假设当前操作系统升级需要更新数据/system/app/a2.xxx以及/system/user/c2.xxx。
102.可以视为:
103./system/app/a2.xxx以及/system/user/c2.xxx为system子分区数据的system1部分;
104./system/app/a0.xxx、/system/app/a1.xxx、/system/b0.xxx、/system/b1.xxx、/system/user/c0.xxx、/system/user/c1.xxx以及/system/user/c3.xxx为system子分区数据的system2部分。
105.那么,针对system子分区的cow文件(system_b

cow

img.img.0000)就包含最新版的/system/app/a2.xxx以及/system/user/c2.xxx。
106.可以视为,最新版的/system/app/a2.xxx以及/system/user/c2.xxx为system3。升级目标是使用system3更新掉system1。
107.当cow文件中的更新数据的大小与其所要更新的原始数据的大小一致,并且,cow文件中的更新数据在数据更新后在子分区中的保存位置与其所要更新的原始数据在子分区中的保存位置一致时,cow文件(system_b

cow

img.img.0000)自身的cow文件地图可以为:
108./system/app/a2.xxx:
109.map1(原super分区中待更新数据的地址):起始地址address start:024018(相对于system起始地址的偏移量);偏移量大小size:2(即024018~024020地址段的数据)
110.map2(cow文件中存储的更新数据的地址):起始地址address start:045033(相对于cow文件存储的起始地址的偏移量);偏移量大小size:2(即045033~045035地址段的数据);
111./system/user/c2.xxx:
112.map1(原super分区中待更新数据的地址):起始地址address start:024036(相对于system起始地址的偏移量);偏移量大小size:4(即024036~024040地址段的数据)
113.map2(cow文件中存储的更新数据的地址):起始地址address start:045036(相对于cow文件存储的起始地址的偏移量);偏移量大小size:4(即045036~045040地址段的数据)。
114.当cow文件中的更新数据的大小与其所要更新的原始数据的大小不一致时,cow文件(system_b

cow

img.img.0000)自身的cow文件地图可以为:
115./system/app/a2.xxx:
116.map1.1(原super分区中待更新数据的地址):起始地址address start:024018(相对于system起始地址的偏移量);偏移量大小size:2(即024018~024020地址段的数据)
117.map2.1(cow文件中存储的,需要覆盖map1.1地址的更新数据的地址):起始地址address start:045033(相对于cow文件存储的起始地址的偏移量);偏移量大小size:2(即045033~045035地址段的数据);
118.map1.2(cow文件中更新数据超出待更新数据大小的那一部分在原super分区中的待写入地址):起始地址address start:025018(相对于system起始地址的偏移量);偏移量大小size:1(即025018~025020地址段的数据)
119.map2.2(cow文件中存储的,需要覆盖map1.2地址的更新数据的地址):起始地址address start:046033(相对于cow文件存储的起始地址的偏移量);偏移量大小size:2(即046033~046035地址段的数据)。
120.在接下来的说明书描述中,为便于描述,仅以当cow文件中的更新数据的大小与其所要更新的原始数据的大小一致,并且,cow文件中的更新数据在数据更新后在子分区中的保存位置与其所要更新的原始数据在子分区中的保存位置一致的应用场景进行举例说明。
121.在上述例子中,地址段(045033~045035以及045036~045040)分别为cow文件(system_b

cow

img.img.0000)中最新版的/system/app/a2.xxx以及/system/user/c2.xxx在用户数据分区(userdata)的物理保存地址(块地址)。
122.这样,如果使用地址045033~045035上的a2.xxx替换掉地址024018~024020上的a2.xxx,并且,使用地址045036~045040上的c2.xxx替换掉地址024036~024040上的c2.xxx,就可以完成动态分区(super)的system子分区的数据升级。
123.进一步的,在s230中,在将cow文件写入用户数据分区(userdata)后,还需要对动态分区(super)+cow文件进行整体校验,校验动态分区(super)+cow文件的有效性,验证当前版本的动态分区(super)数据+cow文件的合成结果是否为新版本的动态分区(super)数据。
124.具体的,以从1.1版本升级到1.3版本为例,计算动态分区(super)中不需要升级的
数据(从版本1.1到版本1.2未发生变化的数据)与cow文件中升级数据(从版本1.1到版本1.2需要升级的数据)的合成结果的哈希值,判断该哈希值与1.3版本中动态分区(super)的完整数据的哈希值是否一致,如果一致,则说明cow文件有效;如果不一致,则说明cow文件无效,升级失败,中断升级进程并报错;其中,1.3版本中动态分区(super)的完整数据的哈希值被保存在操作系统升级安装包中。
125.具体的,在校验过程中,基于snapshot合并动态分区(super)+cow文件。在snapshot的实现过程中,动态分区(super)与cow文件的合并并不是物理意义上的合并,而是将cow文件中子分区的整体文件地图与cow文件自身的cow文件地图进行合并,生成新版本的子分区数据的文件地图。
126.例如,将system子分区的文件地图:
127./system/app/a0.xxx:024010~024013;
128./system/app/a1.xxx:024014~024017;
129./system/app/a2.xxx:024018~024020;
130./system/b0.xxx:024021~024026;
131./system/b1.xxx:024027~024028;
132./system/user/c0.xxx:024029~024032;
133./system/user/c1.xxx:024033~024035;
134./system/user/c2.xxx:024036~024040;
135./system/user/c3.xxx:024041~024044。
136.与cow文件地图:
137./system/app/a2.xxx:
138.map1:address start:024018;size:2(即024018~024020地址段的数据)
139.map2:address start:045033;size:2(即045033~045035地址段的数据);
140./system/user/c2.xxx:
141.map1:address start:024036;size:4(即024036~024040地址段的数据)
142.map2:address start:045036;size:4(即045036~045040地址段的数据)。
143.合并。则得到system子分区的新版本的文件地图:
144./system/app/a0.xxx:024010~024013;
145.(指向动态分区(super)中/system/app下的a0.xxx)
146./system/app/a1.xxx:024014~024017;
147.(指向动态分区(super)中/system/app下的a1.xxx)
148./system/app/a2.xxx:045033~045035;
149.(指向用户数据分区(userdata)中/update/system_b

cow

img.img.0000中的a2.xxx)
150./system/b0.xxx:024021~024026;
151.(指向动态分区(super)中/system下的b0.xxx)
152./system/b1.xxx:024027~024028;
153.(指向动态分区(super)中/system下的b1.xxx)
154./system/user/c0.xxx:024029~024032;
155.(指向动态分区(super)中/system/user下的c0.xxx)
156./system/user/c1.xxx:024033~024035;
157.(指向动态分区(super)中/system/user下的c1.xxx)
158./system/user/c2.xxx:045036~045040;
159.(指向用户数据分区(userdata)中/update/system_b

cow

img.img.0000中的c2.xxx)
160./system/user/c3.xxx:024041~024044。
161.(指向动态分区(super)中/system/user下的c3.xxx)
162.在新版本的system子分区的文件地图中,/system/app/a2.xxx的保存地址并不是指向存储器上动态分区(super)上的/system/app/a2.xxx,而是指向存储器上用户数据分区(userdata)中system_b

cow

img.img.0000中的a2.xxx;/system/user/c2.xxx的保存地址并不是指向存储器上动态分区(super)上的/system/user/c2.xxx,而是指向存储器上用户数据分区(userdata)中system_b

cow

img.img.0000中的c2.xxx。
163.在校验过程中,按照上述合成方式,获取动态分区(super)的所有子分区的新版本的文件地图(如果用户数据分区(userdata)中并未写入某个子分区的对应cow文件,则直接以该子分区的文件地图为新版本的文件地图)。将所有子分区的新版本的文件地图组合生成动态分区(super)的新版本的文件系统。
164.基于动态分区(super)的新版本的文件系统读取数据,读取动态分区(super)的新版本的文件系统所包含的所有文件并计算哈希值。
165.当cow文件有效时,将基础分区(common)的元数据分区(/metadata)中的落盘状态信息由“已落盘(merged)”改为“未落盘(wait for merge)”。落盘状态信息用于表示当前是否存在需要落盘到动态分区(super)的cow文件。具体的,落盘状态信息包含针对动态分区(super)的整体标识以及针对每个子分区的子分区标识。当整体标识为“已落盘(merged)”时,代表动态分区(super)的所有子分区均不需要进行落盘操作;当整体标识为“未落盘(wait for merge)”时,代表动态分区(super)的一个或多个子分区需要进行落盘操作;当子分区标识为“已落盘(merged)”时,代表该子分区不需要进行落盘操作;当子分区标识为“未落盘(wait for merge)”时,代表该子分区需要进行落盘操作。
166.s231,将设备的启动顺序由从静态分区(a)启动变更为从静态分区(b)启动。
167.例如,改写主引导记录(master boot record,mbr)的启动顺序标识,将启动顺序标识由a改写为b。在设备上电后,当设备读取到启动顺序标识为a,设备从静态分区(a)启动,启动过程中加载静态分区(a);当设备读取到启动顺序标识为b,设备从静态分区(b)启动,启动过程中加载静态分区(b)。
168.s232,设备重启。退出当前的操作系统,切断设备电源,再次开启设备电源。
169.s240,设备依次加载基础分区(common)、静态分区(b)。
170.s241,设备加载动态分区(super)以及用户数据分区(userdata)的虚拟动态分区。
171.具体的,设备读取元数据(/metadata)中的落盘状态信息,基于落盘状态信息确定是否需要从用户数据分区(userdata)的指定路径中检索cow文件,并采用snapshot合并加载动态分区(super)以及cow文件。
172.进一步的,在s241中,设备并不加载动态分区(super)以及用户数据分区
(userdata)中的全部cow文件,而是根据操作系统运行需求加载对应的文件。具体的,在s241中,设备根据操作系统运行需求确定需要加载的文件,基于snapshot从动态分区(super)或虚拟动态分区中的cow文件中提取对应的文件进行加载。
173.具体的,在s241中,当动态分区(super)的子分区首存在对应的cow文件时,先基于snapshot生成动态分区(super)各个子分区的新版本的文件地图。生成新版本的文件地图的过程可以参照s230。设备根据操作系统运行需求确定需要加载的文件,基于动态分区(super)子分区的新版本的文件地图进行文件加载。
174.例如,操作系统运行需求加载system子分区下目录user(/system/user)中的所有数据。设备读取元数据(/metadata)中的落盘状态信息,落盘状态信息中system子分区的子分区标识为“未落盘(wait for merge)”,因此,设备在用户数据分区(userdata)中/update下搜索cow文件,在update下搜索到cow文件system_b

cow

img.img.0000后,基于snapshot,根据system_b

cow

img.img.0000中的cow文件的文件地图生成system子分区的新版本的文件地图。按照system子分区的新版本的文件地图中/system/user下所有文件的保存地址进行数据加载,例如,根据system子分区的新版本的文件地图中:
175./system/user/c0.xxx:024029~024032;
176./system/user/c1.xxx:024033~024035;
177./system/user/c2.xxx:045036~045040;
178./system/user/c3.xxx:024041~024044。
179.加载地址024029~024032处的c0.xxx、地址024033~024035处的c1.xxx、地址045036~045040处的c2.xxx以及地址024041~024044处的c3.xxx。
180.进一步的,在加载system子分区下目录user(/system/user)中的所有数据时,当落盘状态信息中system子分区的子分区标识为“已落盘(merged)”时,设备就不会在用户数据分区(userdata)中/update下搜索cow文件,而是直接加载system子分区下目录user(/system/user)中的所有数据。
181.进一步的,在加载system子分区下目录user(/system/user)中的所有数据时,当落盘状态信息中system子分区的子分区标识为“未落盘(wait for merge)”时,如果设备在用户数据分区(userdata)中/update下未搜索到对应system子分区的cow文件时,则说明升级过程中数据写入错误(cow文件写入错误或者落盘状态信息写入错误),此时设备回滚系统并报错。
182.进一步的,在s241中,在加载文件之前,设备还需要对加载文件进行校验。不同于s230,在s241中,不对动态分区(super)+cow文件进行整体验证,而是仅对需要加载的文件进行验证。例如,基于dmverity进行校验(dm

verity是dm(device mapper)的一个目标(target),是一个虚拟块设备,专门用于文件系统的校验)。校验成功则加载文件,校验失败则重启设备,回滚系统或者尝试再次加载文件。
183.s250,设备成功启动,进入用户交互界面。
184.s251,设备将虚拟动态分区的数据落盘到动态分区(super)。
185.在本技术说明书的描述中,落盘操作指的是,在操作系统升级过程中,将用户数据分区(userdata)上虚拟动态分区中保存的动态分区(super)升级文件(cow文件)写入到动态分区(super)中,使得动态分区(super)的文件完成数据升级,以便设备在下次启动时不
需要加载动态分区(super)和虚拟动态分区,只需加载动态分区(super)就可以完成设备启动。
186.具体的,设备在启动成功后进行开机广播,开机广播后开启升级进程。升级进程读取基础分区(common)的元数据(/metadata)中的落盘状态信息,如果落盘状态信息为“已落盘(merged)”,则设备进入正常运行模式。
187.如果落盘状态信息为“未落盘(wait for merge)”,升级进程将用户数据分区(userdata)中的cow文件落盘到动态分区(super)中。
188.具体的,升级进程将用户数据分区(userdata)中的cow文件中的升级数据写入到动态分区(super)中的对应地址上,使得动态分区(super)中的全部数据均为升级后的新版本的数据。
189.例如,基于system子分区的文件地图中的/system/app/a2.xxx:024018~024020以及cow文件地图中的/system/app/a2.xxx:045033~045035,将地址045033~045035上的数据写入到地址024014~024017上;基于system子分区的文件地图中的/system/user/c2.xxx:024036~024040以及cow文件地图中的/system/user/c2.xxx:045036~045040,将地址045036~045040上的数据写入到地址024036~024040上。
190.在此之后升级进程删除用户数据分区(userdata)中的cow文件,将存储空间归还给用户数据分区(userdata);并且,将基础分区(common)的元数据(/metadata)中的落盘状态信息由“未落盘(wait for merge)”改为“已落盘(merged)”。
191.在s220中,静态分区升级的数据操作是针对静态分区(b)中的操作系统数据的,其并不会影响到当前启动的静态分区(a)的操作系统数据;并且,在s230中,动态分区升级的数据操作是在用户数据分区(userdata)中所创建的虚拟动态分区上完成的,其并不会影响到当前挂载的动态分区(super)。因此,在整个操作系统升级的过程中,用户可以正常使用设备;并且,在s231完成后,设备并不需要立即重启,可以由用户自行选择重启时机;这样,操作系统的升级过程并不会对用户的正常手机操作产生影响,从而大大提高了用户体验。进一步的,针对动态分区(super),仅在需要进行升级时才会在用户数据分区(userdata)上创建虚拟动态分区,因此有效提高了数据存储空间利用率。
192.进一步的,在s251中,落盘操作存在操作失败的情况。例如,在设备进行落盘操作的过程中,在设备将内存中的数据写入动态分区(super)时,设备内存地址跳变,写入操作失败,导致落盘进程中断。又例如,在设备进行落盘操作的过程中,在设备读取用户数据分区(userdata)上的cow文件时,用户数据分区(userdata)出现数据错误,读取操作失败,导致落盘进程中断。
193.在s251中,如果落盘操作失败,则升级进程就不会删除用户数据分区(userdata)中的cow文件;并且,也不会将元数据(/metadata)中的落盘状态信息由“未落盘(wait for merge)”改为“已落盘(merged)”。这样,在设备下次重启时,就会再次执行s240~s251。一般的,设备重启会修复导致落盘失败的错误因素(例如,重启后设备内存地址跳变被修复),因此,重启后设备会顺利执行s240~s251,成功完成落盘操作,设备的操作系统成功完成升级。
194.然而,在某些应用场景中,导致落盘失败的错误因素是无法修复的,这就会导致设备每次重启后都会执行s240~s251,始终无法完成操作系统升级。
195.针对上述问题,本技术一实施例提出了一种恢复操作系统的方法,以解决操作系统过程中无法落盘的问题。图3所示为根据本技术一实施例恢复操作系统的流程图。设备执行图2所示流程,在s251中,如果落盘操作失败,升级进程不删除用户数据分区(userdata)中的cow文件;并且,也不将元数据(/metadata)中的落盘状态信息由“未落盘(wait for merge)”改为“已落盘(merged)”。
196.在s251之后,设备执行如图3所示的下述步骤:
197.s300,判断本次设备启动过程是否包含失败的落盘操作;
198.示例的,在s300中,设备读取元数据(/metadata)中的落盘状态信息;当落盘状态信息为“未落盘(wait for merge)”时,则说明在本次设备启动过程中执行了落盘操作并且落盘操作失败;当落盘状态信息为“已落盘(merged)”时,则说明在本次设备启动过程中没有执行落盘操作,或者执行了落盘操作并且落盘操作成功。
199.当本次设备启动过程不包含失败的落盘操作(没有执行落盘操作,或者执行了落盘操作并且落盘操作成功)时,流程结束。
200.当本次设备启动过程包含失败的落盘操作时,执行s310,更新落盘操作失败记录信息,落盘操作失败记录信息用于保存落盘操作失败历史记录;
201.s320,根据落盘操作失败记录信息判断是否需要恢复操作系统;
202.例如,当落盘操作失败记录信息记录的落盘操作重复执行次数超过预设的阈值时,判定需要恢复操作系统;
203.当不需要恢复操作系统时,流程结束;
204.当需要恢复操作系统时,执行s330,获取当前版本操作系统的完整安装镜像(包括静态分区安装镜像以及动态分区安装镜像),保存到用户数据分区(userdata);s330的具体执行可以参照s210;
205.s340,将设备的启动顺序变更为从恢复(recovery)模式启动;例如,改写主引导记录(master boot record,mbr)的启动顺序标识,将启动顺序标识由a改写为r,其中,在设备上电后,当设备读取到启动顺序标识为a,设备从静态分区(a)启动,启动过程中加载静态分区(a);当设备读取到启动顺序标识为b,设备从静态分区(b)启动,启动过程中加载静态分区(b);当设备读取到启动顺序标识为r,设备加载运行recovery模式的数据,进入recovery模式;;
206.进一步的,在s340中,在主引导记录(master boot record,mbr)中增加“进入recovery执行升级”command命令用于升级
207.s350,设备重启;参照s232;
208.s360,重启后的设备进入recovery模式;
209.s361,使用用户数据分区(userdata)中保存的操作系统的完整安装镜像恢复静态分区以及动态分区的操作系统数据;
210.例如,在s350之后,设备读取主引导记录(master boot record,mbr),确认需要进入recovery模式,设备执行“进入recovery执行升级”的command命令,以实现s361的操作。s362,将设备的启动顺序变更为从静态分区启动;
211.具体的,在s361中,可以仅恢复一个静态分区,也可以恢复两个静态分区。例如,在s361中,恢复静态分区(a)的数据以及动态分区(super)的数据;在s362中,将设备的启动顺
序变更为从静态分区(a)启动。又例如,在s361中,恢复静态分区(a)的数据、静态分区(b)的数据(静态分区(a)与静态分区(b)的数据一致)以及动态分区(super)的数据;在s362中,将设备的启动顺序变更为从静态分区(a)或静态分区(b)启动。
212.进一步的,考虑到落盘操作失败只会影响到动态分区(super)的数据,静态分区上的数据是可以正常加载的正确数据。因此,在一实施例中,在s330中,获取当前版本操作系统的动态分区安装镜像;在s361中,仅恢复动态分区(super)的数据;在s362中,将设备的启动顺序变更为从静态分区(b)启动;
213.示例性的,考虑到设备出厂前通常被设置为从静态分区(a)启动,因此,以重启后从静态分区(a)启动为例进行说明,在s362中,将设备的启动顺序变更为从静态分区(a)启动;
214.s370,设备重启;参照s232;
215.s380,终端设备加载基础分区(common)、静态分区(a)以及动态分区(super)的数据,从静态分区(a)启动运行操作系统;
216.s390,设备成功启动,进入用户交互界面。
217.进一步的,在s340中,操作系统的数据恢复并不会涉及到用户数据分区(userdata)上的数据,而落盘操作失败会使得用户数据分区(userdata)上的cow文件不会被删除。因此,在一实施例中,在s390之后,设备还执行s391,删除用户数据分区(userdata)上的cow文件,以释放用户可自由使用的存储空间。
218.进一步的,在s390之后,设备还执行s392,删除用户数据分区(userdata)上的操作系统的完整安装镜像,以释放用户可自由使用的存储空间。
219.根据本技术实施例的方法,可以在落盘操作失败后恢复操作系统数据,从而有效避免落盘失败导致重复循环执行落盘操作状况的发生,进而提高操作系统运行稳定性,及时释放用户存储空间
220.进一步的,在本技术的方案中,执行s300的时间节点为s251之后。本技术对s300的执行时序不做具体限制,本领域的技术人员可以根据实际需求设定s300的执行时刻或者触发s300的触发条件。
221.例如,在一实施例中,设定设备每次启动后的5分钟触发s300的执行。又例如,在一实施例中,设定s300每隔3天被触发执行一次。又例如,在一实施例中,设定设备在进行定期操作系统搜包时触发s300执行一次。
222.进一步的,本技术对落盘操作失败记录信息的数据结构以及根据落盘操作失败记录信息判断是否需要恢复系统数据的判断逻辑不做具体限制。本领域的技术人员可以采用多种可行的实现方式实现s300~s320。以下通过具体实施例举例说明回复操作系统数据的具体执行过程。
223.图4所示为根据本技术一实施例恢复操作系统的流程图。设备执行图2所示流程,在s251中,如果落盘操作失败,升级进程不删除用户数据分区(userdata)中的cow文件;并且,也不将基础分区(common)的元数据(/metadata)中的落盘状态信息由“未落盘(wait for merge)”改为“已落盘(merged)”。
224.在s251之后,设备执行如图4所示的下述步骤:
225.s400,读取基础分区(common)的元数据(/metadata)中的落盘状态信息以及落盘
操作失败记录信息。
226.具体的,落盘操作失败记录信息的数据结构如下表所示:
227.编号项目名称项目值1error_merge0
228.表1
229.表1中,项目名称:error_merge表示该项为落盘失败的记录,error_merge项的项目值为记录上的落盘失败的次数。
230.s410,判断落盘状态信息是否为“已落盘(merged)”。
231.当落盘状态信息为“已落盘(merged)”时,执行s411,将error_merge的项目值置为0,流程结束。
232.当落盘状态信息为“未落盘(wait for merge)”时,执行s412,令error_merge的项目值+1。
233.s420,判断error_merge的值是否大于预设的阈值,例如,预设阈值为3,判断error_merge的值是否大于3。
234.当error_merge的值小于或等于预设的阈值时,流程结束。
235.当error_merge的值大于预设的阈值时,执行s430~s490,参照s330~s390。
236.进一步的,在某些应用场景中,短期内设备的多次重启可能不会重置设备状态,也就可能无法修复导致落盘失败的错误因素。例如,短期内设备的多次重启可能无法修复内存地址跳变。这样,短期内设备多次重启并多次落盘操作失败并不能说明导致落盘失败的错误因素是无法修复的。
237.因此,在本技术一实施例中,在记录落盘操作失败时,会参考设备的重启时间间隔,只有重启时间间隔超过预设时长阈值时,本次落盘操作失败才需要记录。
238.图5所示为根据本技术一实施例恢复操作系统的流程图。设备执行图2所示流程,在s251中,如果落盘操作失败,升级进程不删除动态分区(super)的元数据(/supermetadata)中的cow块信息以及用户数据分区(userdata)中的cow文件;并且,也不将元数据(/metadata)中的落盘状态信息由“未落盘(wait for merge)”改为“已落盘(merged)”。
239.在s251之后,设备执行如图5所示的下述步骤:
240.s500,读取元数据(/metadata)中的落盘状态信息以及落盘操作失败记录信息。
241.具体的,落盘操作失败记录信息的数据结构如下表所示:
242.编号项目名称项目值1error_merge02date_mergex年/x月/x日
243.表2
244.表2中,项目名称:error_merge表示该项为落盘失败的记录,error_merge项的项目值为记录上的落盘失败的次数;date_merge表示该项为记录落盘失败的时间,date_merge项的项目值最后一次记录落盘失败的日期。
245.s510,判断落盘状态信息是否为“已落盘(merged)”。
246.当落盘状态信息为“已落盘(merged)”时,执行s511,,将error_merge的项目值置
为0。流程结束。
247.当落盘状态信息为“未落盘(wait for merge)”时,执行s512,判断error_merge的项目值是否为0;
248.如果为0,执行s515。
249.如果不为0,执行s514,判断当前日期与date_merge的项目值是否一致。
250.如果一致,说明当前的落盘失败与记录中的上一次落盘失败是在同一天发生的,由于设定为同一天只进行一次落盘失败记录,因此本次落盘失败并不需要进行记录,也不需要判定是否需要恢复操作系统,流程结束。
251.如果不一致,执行s515,令error_merge的项目值+1,并且,将date_merge的项目值置为当前日期。
252.s520~s590,参照s420~s490。
253.可以理解的是,上述实施例中的部分或全部步骤或操作仅是示例,本技术实施例还可以执行其它操作或者各种操作的变形。此外,各个步骤可以按照上述实施例呈现的不同的顺序来执行,并且有可能并非要执行上述实施例中的全部操作。
254.进一步的,一般的,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmable logic device,pld)(例如现场可编程门阵列(field programmable gate array,fpga))就是这样一种集成电路,其逻辑功能由访问方对器件编程来确定。由设计人员自行编程来把一个数字装置“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardware description language,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advanced boolean expression language)、ahdl(altera hardware description language)、confluence、cupl(cornell university programming language)、hdcal、jhdl(java hardware description language)、lava、lola、myhdl、palasm、rhdl(ruby hardware description language)等,目前最普遍使用的是vhdl(very

high

speed integrated circuit hardware description language)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
255.因此,本技术实施例所提出的方法流程可以以硬件方式实现,例如,使用控制器,控制器控制触摸屏以实现本技术实施例所提出的方法流程。
256.控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(application specific integrated circuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制
器:arc 625d、atmel at91sam、microchip pic18f26k20以及silicone labs c8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
257.与上述实施例对应,本技术还提供了一种电子设备。电子设备包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发电子设备执行如本技术实施例所述的方法步骤。
258.本技术还提供一种计算机程序产品,计算机程序产品包括计算机程序,当其在计算机上运行时,使得计算机执行本技术实施例提供的部分或全部步骤。
259.本领域的技术人员可以清楚地了解到本发明实施例中的技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明实施例中的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
260.本说明书中各个实施例之间相同相似的部分互相参见即可。尤其,对于装置实施例和终端实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例中的说明即可。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1