掌桥专利:专业的专利平台
掌桥专利
首页

一种CF卡操作系统的更新方法

文献发布时间:2023-06-19 18:37:28


一种CF卡操作系统的更新方法

技术领域

本发明属于存储设备系统更新的技术领域,具体涉及一种CF卡操作系统的更新方法。

背景技术

由于Linux系统具有开源的特性、软件授权费用低和应用开发资源丰富等优点,已经得到了广泛的应用,并且在民用和办公以及开发领域具有越来越多的用户。CF卡(Compact Flash)作为一种存储设备,革命性的使用了闪存,具有可永久性保存信息,无需电源,速度快,重量轻,耗电量小,体积小等特点,CF卡可以直接安装在芯片上的控制器接口,不带驱动器,无移动的部件,发生机械故障的可能性很小,数据更安全,这使它成为优良的多功能的存储系统,这种可随机携带的控制器使CF卡与多种平台相兼容,适合软件生产厂商生产安装有软件产品的操作系统镜像。只要将CF卡插入到电脑的CF卡插槽中,即可启动其中的Linux操作系统。然而,后期如果要对已经生产的CF卡操作系统进行升级,就必须要将CF卡拔出,返厂重新烧写新的操作系统进行升级。

对CF卡的Linux操作系统进行升级比升级普通的Linux操作系统要困难许多,主要是因为在默认情况下,启动过程中,initrd会将squahsFS只读挂载到CF卡目录,而不是加载到内存中,否则会严重影响系统性能。因此,在操作系统运行过程中CF卡是不可写的,如果需要升级必须关机,停止正在运行的操作系统,将CF卡拔下后,将新的操作系统烧写进CF卡中进行升级,这就势必会对当前正在运行的业务产生影响。

现有技术CN200710043619.0公开了基于移动设备存储卡来更新闪存操作系统的方法,需要通过移动设备上的存储卡重新烧录闪存操作系统,在更新操作系统时需要将系统断电,不适合用于对已经出厂的设备进行升级,因为这意味着CF卡必须返厂重新烧录,系统中正在运行的程序必须被迫停止。

squashFS是一套基于Linux内核使用的压缩只读文件系统,大小通常超过1G,解压后的大小可达好几个G。在CF卡操作系统中,squashFS位于CF卡内,系统启动时会将其解压挂载。如果直接挂载到CF卡目录,那么CF卡是只读的,不可进行写入操作。而如果把它加载到内存中,可以对CF卡实现读写的操作,然而,squashFS的大小可达好几个G,将它加载到内存中会严重影响系统性能。

因此,本发明提供了一种CF卡操作系统的更新方法,能够在CF卡操作系统运行时进行升级,无需拔出CF卡或者关闭电源,保证了运行程序的连贯运行。

发明内容

本发明的目的在于提供一种CF卡操作系统的更新方法,旨在解决上述问题。

本发明主要通过以下技术方案实现:

一种CF卡操作系统的更新方法,包括以下步骤:

步骤S100:将升级包上传到插有CF卡的电脑上,所述升级包包含操作系统内核、initrd、根文件系统、extlinux文件以及更新脚本;

步骤S200:运行升级包,解压升级包,运行更新脚本,执行更新;

步骤S300:CF卡的initrd会根据extlinux中的引导参数rd.live.ram的值选择是否挂载squahsFS;首先利用Linux系统的debugfs删除CF卡上的旧extlinux文件,创建新的extlinux文件,添加引导参数rd.live.ram=1,使启动过程中,将CF卡中的squashFS镜像复制到内存中运行,使得CF卡变得可读写;

步骤S400:备份CF卡和电脑硬盘中的文件,以防止后续操作失败导致数据丢失;

步骤S500:替换CF卡中的操作系统内核、initrd、extlinux文件,修改extlinux文件的引导参数rd.live.ram,使initrd在升级完后找到位于硬盘分区上的根文件系统,并切换到根文件系统中,解压新操作系统的根文件系统到硬盘分区上,实现操作系统更新。

为了更好地实现本发明,进一步地,所述步骤S500中,选择硬盘中另一个分区作为新操作系统的root分区,root分区就是根文件系统所在的分区;对该分区进行格式化,将分区的标签设置为root,以便解压新操作系统的根文件系统到硬盘分区上。

为了更好地实现本发明,进一步地,所述步骤S500中,在修改extlinux文件的引导参数rd.live.ram时,将原来的引导参数rd.live.ram=1删除,然后,添加新的内核参数告知内核新的根文件系统所在位置,修改后的rd.live.ram=LABEL=root,使initrd在升级完后找到位于硬盘上root分区的根文件系统,且在initrd完成准备工作后,执行pivot_root指令切换到root分区的根文件系统中。

为了更好地实现本发明,进一步地,所述步骤S300包括以下步骤:

步骤S301:CF卡上新建的extlinux读取extlinux引导文件,根据配置文件将内核参数传递给内核,加载内核并初始化内存;

步骤S302:内核把initrd转化成正常的内存文件系统并释放initrd使用的内存;

步骤S303:initrd作为root被挂载,赋予CF卡读写权限。

为了更好地实现本发明,进一步地,所述步骤S500包括以下步骤:

步骤S501:linuxrc被执行,任何可执行文件做初始化;

步骤S502:Linuxrc解压CF卡中的SquashFS镜像,只读挂载真正的根文件系统;

步骤S503:linuxrc使用pivot_root系统调用把根文件系统并放在根目录;

步骤S504:在根文件系统上执行正常的启动程序;

步骤S505:升级成功后,移去initrd文件系统。

为了更好地实现本发明,进一步地,所述步骤S500中,在解压成功后,删除CF卡上的squashFS镜像文件,因为之后系统不再需要将squashFS解压挂载,删除squashFS文件可以节约CF卡空间。

为了更好地实现本发明,进一步地,若系统升级成功,则删除步骤S400中的备份文件。

本发明的有益效果如下:

(1)本发明能够在不需要拔出CF卡的情况下升级操作系统,避免了业务停止和返厂重新烧录的成本;

(2)本发明通过Linux系统的debugfs工具,可以删除并重新创建CF卡上的extlinux文件,添加引导参数rd.live.ram=1,使得CF卡可读写;并没有直接通过debugfs替换CF卡中的文件,极大地降低了升级过程中的风险;

(3)原本的CF卡操作系统采用了压缩的只读根文件系统,受限于CF卡本身的读写速度,性能方面不如安装在硬盘上的操作系统,而本发明将新的根文件系统直接解压到硬盘上,使得新操作系统在读写性能上远好于旧操作系统;与此同时,内核与initrd仍然保留在CF卡中,可以保留原本CF卡操作系统兼容硬盘阵列(RAID)或者加密硬盘场景的能力;

(4)本发明将新的根文件系统解压到硬盘上,删除CF卡上的旧squashFS,使得后续启动过程中不再需要将squashFS解压挂载。一方面可以简化将来的升级流程,使得CF卡能够一直保持可读写状态;另一方面节省了CF卡空间,保证新的内核和initrd有足够的空间释放;最后提升了操作系统的读写性能。

附图说明

图1为本发明的流程图。

具体实施方式

实施例1:

一种CF卡操作系统的更新方法,如图1所示,包括以下步骤:

步骤S100:将升级包上传到插有CF卡的电脑上,所述升级包包含操作系统内核、initrd、根文件系统、extlinux文件以及更新脚本;

步骤S200:运行升级包,解压升级包,运行更新脚本,执行更新;

步骤S300:CF卡的initrd会根据extlinux中的引导参数rd.live.ram的值选择是否挂载squahsFS;首先利用Linux系统的debugfs删除CF卡上的旧extlinux文件,创建新的extlinux文件,添加引导参数rd.live.ram=1,使启动过程中,将CF卡中的squashFS镜像复制到内存中运行,使得CF卡变得可读写;

步骤S400:备份CF卡和电脑硬盘中的文件,以防止后续操作失败导致数据丢失;

步骤S500:替换CF卡中的操作系统内核、initrd、extlinux文件,修改extlinux文件的引导参数rd.live.ram,使initrd在升级完后找到位于硬盘分区上的根文件系统,并切换到根文件系统中,解压新操作系统的根文件系统到硬盘分区上,实现操作系统更新。

优选地,所述步骤S500中,选择硬盘中另一个分区作为新操作系统的root分区,root分区就是根文件系统所在的分区;对该分区进行格式化,将分区的标签设置为root,以便解压新操作系统的根文件系统到硬盘分区上。

优选地,所述步骤S500中,在修改extlinux文件的引导参数rd.live.ram时,将原来的引导参数rd.live.ram=1删除,然后,添加新的内核参数告知内核新的根文件系统所在位置,修改后的rd.live.ram=LABEL=root,使initrd在升级完后找到位于硬盘上root分区的根文件系统,且在initrd完成准备工作后,执行pivot_root指令切换到root分区的根文件系统中。

优选地,所述步骤S500中,在解压成功后,删除CF卡上的squashFS镜像文件,因为之后系统不再需要将squashFS解压挂载,删除squashFS文件可以节约CF卡空间。

本发明能够在不需要拔出CF卡的情况下升级操作系统,避免了业务停止和返厂重新烧录的成本。本发明通过Linux系统的debugfs工具,可以删除并重新创建CF卡上的extlinux文件,添加引导参数rd.live.ram=1,使得CF卡可读写;并没有直接通过debugfs替换CF卡中的文件,极大地降低了升级过程中的风险。原本的CF卡操作系统采用了压缩的只读根文件系统,受限于CF卡本身的读写速度,性能方面不如安装在硬盘上的操作系统。而本发明将新的根文件系统直接解压到硬盘上,使得新操作系统在读写性能上远好于旧操作系统;与此同时,内核与initrd仍然保留在CF卡中,可以保留原本CF卡操作系统兼容硬盘阵列(RAID)或者加密硬盘场景的能力。

实施例2:

一种CF卡操作系统的更新方法,本发明利用debugfs在启动后可以将CF卡设置为可读写的特性,通过Linux系统的debugfs工具,可以删除并重新创建CF卡上的extlinux文件,添加引导参数rd.live.ram=1,使得CF卡可读写。

然后,再将新操作系统的根文件系统解压到硬盘上。将CF卡中的操作系统内核,initrd和extlinux文件替换为新操作系统的操作系统内核,initrd和extlinux文件,更新extlinux文件的引导参数rd.live.ram=LABEL=root,使initrd在升级完后找到位于硬盘上root分区的根文件系统,且在initrd完成准备工作后,执行pivot_root指令切换到root分区的根文件系统中,实现对运行中的CF卡操作系统的升级。

具体的,所述CF卡操作系统更新的步骤如下:

① CF卡上的extlinux读取extlinux引导文件,根据配置文件将内核参数传递给内核,加载内核并初始化内存。

② 内核把initrd转化成正常的内存文件系统并释放initrd使用的内存。

③ initrd作为root被挂载,赋予读写权限。

④ /linuxrc被执行(这可以是任何可执行文件,如脚本,运行在uid 0,可以做任何初始化)。

⑤ Linuxrc解压CF卡中的SquashFS镜像,只读挂载真正的根文件系统,这一步会导致CF卡不可写。

⑥ linuxrc使用pivot_root系统调用把根文件系统放在根目录。

⑦ 正常的启动程序(/sbin/init)在根文件系统上执行。

⑧ initrd文件系统被移去。

本发明能够在不需要拔出CF卡的情况下升级操作系统,避免了业务停止和返厂重新烧录的成本。本发明通过Linux系统的debugfs工具,可以删除并重新创建CF卡上的extlinux文件,添加引导参数rd.live.ram=1,使得CF卡可读写;并没有直接通过debugfs替换CF卡中的文件,极大地降低了升级过程中的风险。原本的CF卡操作系统采用了压缩的只读根文件系统,受限于CF卡本身的读写速度,性能方面不如安装在硬盘上的操作系统,而本发明将新的根文件系统直接解压到硬盘上,使得新操作系统在读写性能上远好于旧操作系统;与此同时,内核与initrd仍然保留在CF卡中,可以保留原本CF卡操作系统兼容硬盘阵列(RAID)或者加密硬盘场景的能力。

实施例3:

一种CF卡操作系统的更新方法,如图1所示,包括以下步骤:

(1)用户通过网络上传升级包到插有CF卡的电脑上,运行升级包,升级包包含有内核,initrd,根文件系统,extlinux文件以及更新脚本。

(2) 升级包解压,运行更新脚本,执行更新逻辑

CF卡initrd会根据extlinux中的引导参数live_ram的值选择是否只读挂载squashFS,因此首先利用debugfs删除CF卡上的旧extlinux文件,创建新的extlinux文件,添加内核引导参数rd.live.ram=1,在extlinux引导文件中,内核参数可以实现指定根文件系统分区,livecd加载配置,是否启用raid等诸多功能。rd.live.ram=1这个参数使得启动过程中系统将CF卡中的squashFS镜像复制到内存中运行,实现系统对CF卡进行读写,因为squashFS被加载到内存后,CF卡不再处于只读挂载状态。

(3)备份CF卡和硬盘中的数据到硬盘未使用的分区中,这一步是为了防止之后替换CF卡文件和解压根文件系统失败时可能导致的数据丢失。

(4)选择硬盘中另一个分区作为新操作系统的root分区,root分区就是新根文件系统所在的分区。对该分区进行格式化,将分区的标签设置为root,解压新操作系统的根文件系统到硬盘分区上,如果解压失败则回滚恢复CF卡和硬盘数据。

(5)删除CF卡上的旧squashFS文件,因为更新之后系统不再需要将squashFS解压挂载,删除squashFS文件可以节约CF卡空间,对于一些容量比较小的CF卡,如果不进行这一步删除操作,可能后续替换CF卡文件的时候会遇到容量不足的问题导致替换失败,升级中止。替换CF卡中的操作系统内核,initrd文件;修改extlinux文件,首先将原来的引导参数rd.live.ram=1删除,因为更新完毕后系统不再是LiveCD格式,squashFS镜像在前述步骤中被删除。其次,需要添加新的内核参数告知内核新的根文件系统所在位置。因为现在新根文件系统位于硬盘上的root分区,所以需要添加内核引导参数root=LABEL=root。这样在升级完重启后,initrd能够找到位于硬盘上root分区的根文件系统,并且在initrd完成准备工作后执行pivot_root指令切换到root分区的根文件系统中。如果替换失败则回滚恢复CF卡数据。

(6)升级成功后,将备份的CF卡和硬盘中的数据删除,重启电脑。

进一步地,CF卡操作系统的启动顺序如下:

① CF卡上的extlinux读取extlinux引导文件,根据配置文件将内核参数传递给内核,加载内核并初始化内存

② 内核把initrd转化成正常的内存文件系统并释放initrd使用的内存

③ initrd作为root被挂载,赋予读写权限。

④ /linuxrc被执行(这可以是任何可执行文件,如脚本,运行在uid 0,可以做任何初始化)。

⑤ Linuxrc解压CF卡中的SquashFS镜像,只读挂载真正的根文件系统,这一步会导致CF卡不可写

⑥ linuxrc使用pivot_root系统调用把根文件系统放在根目录。

⑦ 正常的启动程序(/sbin/init)在根文件系统上执行。

⑧ initrd文件系统被移去。

其中:Linux初始RAM硬盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

initrd文件中包含了各种可执行程序和驱动程序,在完成加载驱动模块等任务后,第二阶段会切换到真正的根文件系统,执行根文件系统中的init程序,完成系统启动工作。然后再将这个initrd RAM硬盘卸载,并释放内存。linux发行版必须适应各种不同的硬件架构,将所有的驱动编译进内核是不现实的,initrd技术是解决该问题的关键技术。Linux发行版在内核中只编译了基本的硬件驱动,在安装过程中通过检测系统硬件,生成包含安装系统硬件驱动的initrd,无非是一种即可行又灵活的解决方案。livecd可能会面对更加复杂的硬件环境,所以也必须使用initrd.

Extlinux:extlinux是一个启动加载器集合,可以在CF卡上引导启动系统。支持的文件系统包括FAT,ext2,ext3,ext4和非压缩单设备Btrfs文件系统。电脑启动时,BIOS会先加载硬盘开始的440字节MBR启动代码(/usr/lib/extlinux/bios/mbr.bin或/usr/lib/extlinux/bios/gptmbr.bin)。第一阶段的MBR启动代码会寻找活动分区(设置了可启动标记的MBR分区),此处是CF卡上的boot分区。

执行卷启动记录程序MBR启动代码会执行上面找到的boot分区的卷启动记录程序(VBR,volume boot record)。对于Extlinux来说,VBR就是由extlinux--install命令创建的/boot/extlinux/ldlinux.sys位于开始扇区的部分。

执行/boot/extlinux/ldlinux.sys VBR会加载ldlinux.sys剩余的部分。ldlinux.sys所处在的扇区位置不可更改,否则extlinux无法启动。注意对于Btrfs来说,因为文件不断移动导致ldlinux.sys扇区的位置不断变化,上述的方法将不会工作。因此在Btrfs中整个ldlinux.sys文件会直接紧接着嵌入卷启动记录程序,而不是像其他文件系统那样保存在/boot/syslinux/ldlinux.sys处。ldlinux.sys加载剩下的extlinux的核心部分/boot/extlinux/ldlinux.c32(这部分是因为文件大小限制无法放入ldlinux.sys中的核心模块)。ldlinux.c32文件应该在每一个装有extlinux的实例中出现,并且与分区中的ldlinux.sys版本相匹配,否则Extlinux将无法启动。当extlinux完全加载完毕,它将自动查找引导配置文件extlinux.conf,如果找到即加载,根据extlinux.conf的配置寻找内核和initrd文件。

debugfs是一种用于内核调试的虚拟文件系统,它可以直接对硬盘上的inode节点进行创建或者删除,不受只读挂载的限制。然而通过debugfs对文件进行操作同时也具有很高的丰风险,因为debugfs是直接对文件系统底层的inode进行操作,一旦出现故障会导致CF卡上的文件系统损坏,CF卡上的所有文件都会丢失,同时基于squashFS运行的操作系统也会直接宕机。因此直接使用debugfs替换CF卡上的所有文件是风险很高的,无法作为常规手段使用。其次,由于操作系统运行中会占用squashFS,因此debugfs无法删除squashFS。本发明通过Linux系统的debugfs工具,可以删除并重新创建CF卡上的extlinux文件,添加引导参数rd.live.ram=1,使得CF卡可读写。并没有直接通过debugfs替换CF卡中的文件,极大地降低了升级过程中的风险。本发明仅仅利用debugfs删除和创建extlinux文件,由于extlinux文件大小只有几十字节,因此可以将debugfs的风险降至最低。

原本的CF卡操作系统采用了压缩的只读根文件系统,受限于CF卡本身的读写速度,性能方面不如安装在硬盘上的操作系统。而本发明将新的根文件系统直接解压到硬盘上,使得新操作系统在读写性能上远好于旧操作系统;与此同时,内核与initrd仍然保留在CF卡中,可以保留原本CF卡操作系统兼容硬盘阵列(RAID)或者加密硬盘场景的能力。

其次,本发明将新的根文件系统解压到硬盘上,删除CF卡上的旧squashFS,使得后续启动过程中不再需要将squashFS解压挂载。一方面可以简化将来的升级流程,使得CF卡能够一直保持可读写状态;另一方面节省了CF卡空间,保证新的内核和initrd有足够的空间释放;最后提升了操作系统的读写性能。

以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。

技术分类

06120115638538