首页 / OSTree回滚方法、装置及存储介质

OSTree回滚方法、装置及存储介质公开 发明

技术领域

[0001] 本发明涉及OSTree技术领域,尤其涉及一种OSTree回滚方法、装置及存储介质。

相关背景技术

[0002] 在工业控制和机器人控制领域,Linux嵌入式操作系统的使用日益增多。然而,Linux系统在部署到终端设备后,系统镜像的更新和升级通常需要重新进行物理部署,无法确保最佳的操作体验和系统正常运行时间。为改善Linux系统的升级体验,实现安全的远程OTA升级成为重要需求。
[0003] OStree是一个用于操作系统和容器二进制部署及更新的技术,它结合了类似Git的模型来提交和下载可引导的文件系统树,并且有一层用于部署它们以及管理引导程序配置的机制。基于OSTree改造的Linux升级系统,具备安全的远程OTA升级,并在升级过程中传输的数据量非常小。
[0004] OSTree升级到新的版本后,如果新的版本存在问题不能正常进入系统,就需要用户手动选择老版本的系统启动菜单,进入原来的系统,但现实中存在大量用户直接接触非常不方便的Linux设备,针对此类设备,一旦升级后的新版本存在问题,将产生严重的可靠性隐患。

具体实施方式

[0011] 下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
[0012] 实施例一图1是本发明实施例一提供的OSTree回滚方法的流程图,本实施例可适用于在Linux系统利用Ostree进行新版本升级,并在新版本系统异常时,自动回滚到原有版本系统的情况,该方法可以由OSTree回滚装置来执行,具体包括如下步骤:
步骤110,在新版本被正确配置后首次启动时,根据启动菜单项标识启动新版本系统,利用预设的看门狗在新版本系统启动超过定时参数时,触发重新启动。
[0013] 在本实施例中,服务器存放OSTree远程仓库,Linux嵌入式操作系统正常运行原有版本系统,并可从服务器拉取新版本系统的OSTree文件,在拉取完成后,进行配置。以新版本系统为VersionC为例,采用如下方式实现拉取和配置:ostreepullVersionC
ostreedeployversionC。
[0014] 在正确配置后,可以生成新版本系统的启动项,并利用在引导加载程序内新增的启动菜单项标识,根据启动菜单项标识确定启动原有版本系统或者新版本系统。利用启动菜单项标识,识别当前需要启动新版本系统,并启动新版本系统。
[0015] 相应的,可以在内核中设置看门狗程序,该开门狗程序可以在系统启动超时,触发重新启动系统。相应的,所述方法还包括:在系统中增加设置在系统服务,用于在早期启动阶段启动,负责定期喂狗,监控systemd和其它开机服务的状态。以在系统能够正常启动时,进行定期喂狗,避免重新启动。
[0016] 步骤120,利用预设的计数变量统计重新启动次数,在超过预设的重新启动阈值时,将所述新版本启动菜单项标识设置为假,并将原有版本系统启动菜单项标识设置为真,并将回滚标识设为真。
[0017] 在本系统中,可以在系统启动程序中新增一个计数变量,用于统计重新启动次数。并判断计数变量是否超过预设的重新启动阈值,所述重新启动阈值可以根据经验设置,示例性的,可以设定为5。在超过时,可以将前述在启动程序中设定的新版本启动菜单项标识设置为假,并对应将原有版本系统启动菜单项标识设置为真,并将在启动程序中的新增的回滚标识设为真,以便于系统再次启动时,通过查找回滚标识,确定为回滚状态。由于原有版本系统能够正常启动,且回滚操作只能在系统正常启动后执行。否则,根据新版本启动菜单项标识和回滚标识依然正常启动新版本系统。
[0018] 步骤130,根据启动菜单项标识启动原有版本系统,在原有版本系统正常启动后,查询所述回滚标识,在回滚标识为真时,利用OSTree从存储器上删除内核、启动临时系统文件系统和根文件系统中与新版本关联的内容,并将新版本对应的配置文件删除,同时将原有版本系统对应的配置文件名称中优先级内容进行修改,形成原有版本系统启动菜单。
[0019] 在系统每次启动时,首先基于系统启动程序中的中的启动菜单项标识确定当前启动的是原有版本系统,进而正常启动原有版本系统。在原有版本系统正常启动后,查询所述回滚标识,在回滚标识为真时,利用OSTree从存储器上删除内核、启动临时系统文件系统和根文件系统中与新版本关联的内容。示例性的,可采用OSTree命令从存储器中将内核、临时根文件系统initramfs和根文件系统rootfs中与新版本关联内容的删除。并将新版本系统对应的启动配置文件entries/ostree‑1‑*.conf删除。所述将新版本对应的配置文件名称中优先级内容进行修改,可以包括:原有版本系统对应的配置文件entries/ostree‑2‑*.conf命名为entries/ostree‑1‑*.conf,并根据所述配置文件重新设置启动菜单项,以使得启动菜单项中将只存在原有版本系统的启动菜单。
[0020] 利用上述方式可以确保回滚成功,并消除存在问题的新版本系统对于启动系统的影响。并修改启动菜单,以便于后期每次启动都能够正常启动原有版本系统,保证系统能够自动完成问题版本系统的回滚,保证系统能够正常运行。
[0021] 本实施例通过在新版本被正确配置后首次启动时,根据启动菜单项标识启动新版本系统,利用预设的看门狗在新版本系统启动超过定时参数时,触发重新启动;利用预设的计数变量统计重新启动次数,在超过预设的重新启动阈值时,将所述新版本启动菜单项标识设置为假,并将原有版本系统启动菜单项标识设置为真,并将回滚标识设为真;根据启动菜单项标识启动原有版本系统,在原有版本系统正常启动后,查询所述回滚标识,在回滚标识为真时,利用OSTree从存储器上删除内核、启动临时系统文件系统和根文件系统中与新版本关联的内容,并将新版本对应的配置文件删除,同时将原有版本系统对应的配置文件名称中优先级内容进行修改,形成原有版本系统启动菜单。通过新版本系统的配置信息形成新版本系统的启动菜单项,能够自动启动新版本系统,并利用内核编译的看门狗监控新版本的启动情况,在新版本系统无法正常启动时,利用OSTree消除新版本系统的影响。并再次修改系统启动菜单,将原有版本系统作为新的系统启动项,能够在新版本系统出现问题时,能够采用原有版本系统继续使用。
[0022] 在本实施例的一个优选实施方式中,所述在新版本被正确配置后首次启动前,所述方法还可增加如下步骤:在新版本系统被拉取配置后,解析ostree部署新版本时生成的启动配置文件,读取新版本启动属性元素;利用启动菜单项的模板,将启动属性元素作为参数进行填充,生成新版本启动菜单项;将所述新版本启动菜单项标识设置为真。示例性的,可以解析ostree部署新版本系统时生成的启动配置文件entries/ostree‑1‑*.conf,读取其中包括新版本的启动菜单名称,内核路径,内核命令行参数,初始RAM文件系统路径,rootfs路径等元素按照启动菜单项的模板,将上一步骤读取到的元素作为参数,生成一条标准的启动菜单项.即为新版本系统的启动菜单入口。利用上述方式可自动生成启动菜单项,利用启动菜单项实现新版本系统的正常启动,并便于后期调整,启动原有版本系统。
[0023] 在本实施例的另一优选实施方式中,所述方法还可增加如下步骤:在内核编译时启用软锁死和硬锁死异常检测功能,并在内核启动参数中增加硬件看门狗定时参数;利用initramfs启动软件看门狗,利用initramfs脚本增加向启用initramfs看门狗的指令和参数,并对应增加停止initramfs看门狗的指令。示例性的,可以在系统中开启多种类型的看门狗,包括内核、initramfs和服务的看门狗。可选的,启动内核看门狗,在内核编译时启用softlockup和hardlockup功能,且在内核启动参数中增加”watchdog_thresh=20”,内核超过20s无响应自动触发系统重启,并启动initramfs软件看门狗,在initramfs脚本开始阶段增加向/dev/watchdog写入30启用initramfs看门狗,在脚本结束阶段向/dev/watchdog/写入stop停止initramfs看门狗,如果initramfs执行过程中超过30s无响应会自动触发系统重启。
[0024] 实施例二图2是本发明实施例二提供的OSTree回滚方法的流程示意图,本实施例以上述实施例为基础进行优化,所述方法还可增加如下步骤:创建自动回滚抽象类,用于封装OSTree回滚方法对应的处理逻辑,并开放关键要素启动计数、启动限制和触发条件抽象元素的对外接口;读取系统服务的配置文件,读取其中的约定引导加载程序类型;根据所述约定引导加载程序类型设定自动回滚抽象类中类型处理方法。
[0025] 参见图2,所述OSTree回滚方法,包括:步骤210,创建自动回滚抽象类,用于封装OSTree回滚方法对应的处理逻辑,并开放关键要素启动计数、启动限制和触发条件抽象元素的对外接口。
[0026] 由于因为设备的引导加载程序不同,可能是grub,uboot,pmon,openSBI,它们向系统服务传递信息的方式不同。因此,可能会导致上述实施例提供的OSTree回滚方法无法适用于不同架构的设备,因此,在本实施例中,对此进行优化处理。
[0027] 示例性的,可以创建自动回滚抽象类,该类可以被实例化,进而实现OSTree回滚方法。并将上述处理逻辑通过该类进行封装,同时,为了便于用户灵活自定义回滚的条件,预留相应的接口,便于用户输入一些关键要素。例如启动计数、启动限制和触发条件等抽象元素。即新版本系统的重新启动次数,看门狗的定时参数和重启的触发条件等。利用设计结构体,将影响自动回滚的关键要素启动计数,启动限制等抽象形成抽像类bootloader_state,而不同引导加载器通过定义各自具体的类来实现bootloader_state_uboot_ext,这具体的类描述不同引导加载程序特点的方法.以解决设备无关性问题。定义抽象类bootloader_state,包含以下关键要素:启动计数器(bootcounter):记录系统启动的次数。
[0028] 启动限制(bootlimit):设置允许失败启动的最大次数。
[0029] 回滚触发条件(rollbacktrigger):当启动次数超过启动限制时,触发回滚操作。
[0030] 步骤220,读取系统服务的配置文件,读取其中的约定引导加载程序类型;根据所述约定引导加载程序类型设定自动回滚抽象类中类型处理方法。
[0031] 在启动系统服务时,读取系统服务的配置文件,其中约定引导加载程序类型,根据此创建对应的bootloader_state_uboot_ext中的方法,从/boot/uboot.cnt获取相应的值。
[0032] 步骤230,利用所述类型处理方法实例化与类型对应的对象。
[0033] 利用所述类型处理方法返回的内容,可以确定当前系统采用的引导加载程序。并对应类进行实例化,处理与所述引导加载程序的对象。示例性的,可以包括:将引导指针初始化空值,所述引导指针用于指向约定引导加载程序的状态对象;根据所述引导指针的指向确定对象的类型。利用指针指向的内存中对象的类型。代码首先将一个名为bootloader的指针(类型为bootloader_state*)初始化为NULL,这个指针的作用是将来指向创建的引导加载器状态对象。随后根据bootloader_type字符串变量的不同值来决定创建哪种引导加载器状态类的实例。例如:根据不同引导加载器的特点,定义具体的类来实现抽象类bootloader_state的功能。例如:bootloader_state_grub:针对GRUB引导加载器,通过grubenv配置文件读取和写入启动计数器。
[0034] bootloader_state_uboot:针对U‑Boot引导加载器,通过环境变量或配置文件读取和写入启动计数器。
[0035] bootloader_state_pmon:针对PMON引导加载器,通过指定文件读取和写入启动计数器。
[0036] bootloader_state_opensbi:针对OpenSBI引导加载器,通过NVMe或其它存储介质读取和写入启动计数器。
[0037] 步骤240,在新版本被正确配置后首次启动时,根据启动菜单项标识启动新版本系统,利用预设的看门狗在新版本系统启动超过定时参数时,触发重新启动。
[0038] 步骤250,利用预设的计数变量统计重新启动次数,在超过预设的重新启动阈值时,将所述新版本启动菜单项标识设置为假,并将原有版本系统启动菜单项标识设置为真,并将回滚标识设为真。
[0039] 步骤260,根据启动菜单项标识启动原有版本系统,在原有版本系统正常启动后,查询所述回滚标识,在回滚标识为真时,利用OSTree从存储器上删除内核、启动临时系统文件系统和根文件系统中与新版本关联的内容,并将新版本对应的配置文件删除,同时将原有版本系统对应的配置文件名称中优先级内容进行修改,形成原有版本系统启动菜单。
[0040] 本实施例通过增加如下步骤:创建自动回滚抽象类,用于封装OSTree回滚方法对应的处理逻辑,并开放关键要素启动计数、启动限制和触发条件抽象元素的对外接口;读取系统服务的配置文件,读取其中的约定引导加载程序类型;根据所述约定引导加载程序类型设定自动回滚抽象类中类型处理方法;利用所述类型处理方法实例化与类型对应的对象。利用所述类型处理方法实例化与类型对应的对象。可以针对不同平台实现OSTree回滚方法,实现跨平台通用。
[0041] 实施例三图3是本发明实施例三提供的OSTree回滚装置的结构示意图,参见图3,所述OSTree回滚装置,包括:
识别模块310,用于在新版本被正确配置后首次启动时,根据启动菜单项标识启动新版本系统,利用预设的看门狗在新版本系统启动超过定时参数时,触发重新启动;
设置模块320,用于利用预设的计数变量统计重新启动次数,在超过预设的重新启动阈值时,将所述新版本启动菜单项标识设置为假,并将原有版本系统启动菜单项标识设置为真,并将回滚标识设为真;
删除模块330,用于根据启动菜单项标识启动原有版本系统,在原有版本系统正常启动后,查询所述回滚标识,在回滚标识为真时,利用OSTree从存储器上删除内核、启动临时系统文件系统和根文件系统中与新版本关联的内容,并将新版本对应的配置文件删除,同时将原有版本系统对应的配置文件名称中优先级内容进行修改,形成原有版本系统启动菜单。
[0042] 本实施例提供的OSTree回滚装置,通过在新版本被正确配置后首次启动时,根据启动菜单项标识启动新版本系统,利用预设的看门狗在新版本系统启动超过定时参数时,触发重新启动;利用预设的计数变量统计重新启动次数,在超过预设的重新启动阈值时,将所述新版本启动菜单项标识设置为假,并将原有版本系统启动菜单项标识设置为真,并将回滚标识设为真;根据启动菜单项标识启动原有版本系统,在原有版本系统正常启动后,查询所述回滚标识,在回滚标识为真时,利用OSTree从存储器上删除内核、启动临时系统文件系统和根文件系统中与新版本关联的内容,并将新版本对应的配置文件删除,同时将原有版本系统对应的配置文件名称中优先级内容进行修改,形成原有版本系统启动菜单。通过新版本系统的配置信息形成新版本系统的启动菜单项,能够自动启动新版本系统,并利用内核编译的看门狗监控新版本的启动情况,在新版本系统无法正常启动时,利用OSTree消除新版本系统的影响。并再次修改系统启动菜单,将原有版本系统作为新的系统启动项,能够在新版本系统出现问题时,能够采用原有版本系统继续使用。
[0043] 在上述各实施例的基础上,所述装置还包括:解析模块,用于在新版本系统被拉取配置后,解析ostree部署新版本时生成的启动配置文件,读取新版本启动属性元素;
填充模块,用于利用启动菜单项的模板,将启动属性元素作为参数进行填充,生成新版本启动菜单项;
设置模块,用于将所述新版本启动菜单项标识设置为真。
[0044] 在上述各实施例的基础上,所述装置还包括:增加模块,用于在内核编译时启用软锁死和硬锁死异常检测功能,并在内核启动参数中增加硬件看门狗定时参数;
启动模块,用于利用initramfs启动软件看门狗,利用initramfs脚本增加向启用initramfs看门狗的指令和参数,并对应增加停止initramfs看门狗的指令。
[0045] 在上述各实施例的基础上,所述判断模块还包括:服务项增加模块,用于在系统中增加设置在系统服务,用于在早期启动阶段启动,负责定期喂狗,监控systemd和其它开机服务的状态。
[0046] 在上述各实施例的基础上,所述删除模块包括:命名单元,用于将原有版本系统对应的配置文件entries/ostree‑2‑*.conf命名为entries/ostree‑1‑*.conf,并根据所述配置文件重新设置启动菜单项,以使得启动菜单项中将只存在原有版本系统的启动菜单。
[0047] 在上述各实施例的基础上,所述装置还包括:类创建模块,用于创建自动回滚抽象类,用于封装OSTree回滚方法对应的处理逻辑,并开放关键要素启动计数、启动限制和触发条件抽象元素的对外接口;
读取模块,用于读取系统服务的配置文件,读取其中的约定引导加载程序类型;
方法设定模块,用于根据所述约定引导加载程序类型设定自动回滚抽象类中类型处理方法;
实例化模块,用于利用所述类型处理方法实例化与类型对应的对象。
[0048] 在上述各实施例的基础上,所述实例化模块包括:初始化单元,用于将引导指针初始化空值,所述引导指针用于指向约定引导加载程序的状态对象;
指向单元,用于根据所述引导指针的指向确定对象的类型。
[0049] 在上述各实施例的基础上,所述实例化模块,还包括:第一读取和写入单元,用于针对GRUB引导加载器,通过grubenv配置文件读取和写入启动计数器;
第二读取和写入单元,用于针对U‑Boot引导加载器,通过环境变量或配置文件读取和写入启动计数器;
第三读取和写入单元,用于针对PMON引导加载器,通过指定文件读取和写入启动计数器;
第四读取和写入单元,用于针对OpenSBI引导加载器,通过NVMe或其它存储介质读取和写入启动计数器。
[0050] 本发明实施例所提供的OSTree回滚装置可执行本发明任意实施例所提供的OSTree回滚方法,具备执行方法相应的功能模块和有益效果。
[0051] 实施例四本发明实施例四还提供了一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行如上述实施例提供的任一所述的OSTree回滚方法。
[0052] 本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是,但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD‑ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0053] 计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0054] 计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括,但不限于无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0055] 可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或设备上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0056] 注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其它等效实施例,而本发明的范围由所附的权利要求范围决定。

当前第1页 第1页 第2页 第3页