嵌入式linux文件系统格式,嵌入式Linux的文件系统分区及数据读写方法与流程

本发明涉及Linux系统的数据存储管理领域,特别是涉及一种基于NANDFlash存储器和UBIFS文件系统的嵌入式Linux的文件系统分区及数据读写方法。

背景技术:

::目前Linux操作系统由于源码开放及技术成熟,从而大量使用在嵌入式产品的软件设计中。而嵌入式Linux的文件系统也由最初的jiffs2、yaffs2等系统发展到目前的UBIFS文件系统。UBIFS是Nokia工程师在theuniversityofSzeged大学帮助下开发的新的flashfilesystem,被认为是jiffs2文件系统的下一代。UBIFS涉及了三个子系统:1、MTD子系统,提供对flash芯片的访问接口,MTD子系统提供了MTDdevice的概念,比如/dev/mtdx,MTD可以认为是rawflash。MTD在内核层的API是structmtd_device、而用户空间的API接口是/dev/mtd0,这些接口提供了设备信息,读写可擦除块,擦除一个可擦除块,标记一个可擦除块是坏块,检查可擦除块是否是坏块。但是,MTD的API并不隐藏坏的可擦除块、也不做任何损耗平衡。2、UBIsubsystem,为flashdevice提供了损耗平衡以及坏块管理,UBI(UnsortedBlockImages)的内核API是include/mtd/ubi-user.h,用户空间的则是/dev/ubi0,提供损耗平衡,隐藏坏块,允许运行时容量创建、删除和修改,有点类似LVM功能。3、UBIFS文件系统,工作于UBI之上。目前常规Linux+UBIFS文件系统的MTD分区是这样的:将MTD分为2个区,其中第一区存放BootStrap、uboot及kernel,该区只读、长度8M,第二区存放rootfs(UBIFS)文件系统,长度为所有剩余长度,是可读/写的。系统启动时,先加载BootStrap,BoostStrap加载uboot,并把控制权交由uboo,uboot加载kernel再将控制权交由kernel,kernel启动后挂载根文件系统rootfs(ubifs),之后由启动角本启动应用程序。UBIFS文件系统属于日志型文件系统,无论速度、性能还是对NANDFlash的损益均衡都相对于jiffs2和yaffs2有了很大的改变。但UBIFS文件系统需要经常记录日志,在设备突然停电而系统又正在进行日志记录时,往往由于没有操作完而中断,会导致很多“unstablebits(不稳定位)”出现,这些“unstablebits”每次读取结果可能为1也可能为0,造成文件系统的数据校验不一致,导致系统挂载失败。在实际应用中,还有一些作法是分为三个区,即第一区存放BootStrap、uboot及kernel,该区只读、长度8M,第二区存放rootfs(UBIFS)文件系统,长度为32M,是可读/写的,第三个分区为用户数据分区,长度为剩余长度,是可读写的。将rootfs与用户数据分离的作法一定程度上可以保护rootfs不被破坏,增加系统健壮性,但用户数据区并未实现动态挂载、以及挂载失败后的恢复,还是可能出现系统不能正常运行的问题。技术实现要素:为解决现有的UBI文件系统在抗掉电能力方面的不足,本发明通过将内核NANDFlash划分为系统分区和用户分区,动态挂载用户分区,并对挂载结果进行准确判断,如果挂载失败通过mtd-utils、ubi-utils等工具格式化用户分区,之后重新挂载用户分区,并通过mtd-utils恢复用户数据等,进一步提高嵌入式linux下文件系统的健壮性以及用户数据的安全性。本发明所采用的技术方案如下:嵌入式Linux的文件系统分区及数据读写方法,基于NANDFlash存储器和UBIFS文件系统,包括以下步骤:步骤1、设置内核NANDFlash分区,用于实现用户数据分区与系统数据分区的分离;步骤2、启动嵌入式Linux设备,Kernel启动后自动挂载rootfs,并启动应用程序;步骤3、应用程序启动后使用mount命令挂载用户数据分区至根目录下结点/userdata,如果挂载成功则转步骤6,否则转下一步;如果能挂载成功说明系统之前运行正常,用户数据分区没有损坏、无数据丢失;如果挂载不成功可能由于上次意外停电导致用户数据分区损坏,则需执行后面的步骤4、5来清除错误重新挂载;步骤4、使用mtd-utils工具包中的flash_erase擦除用户数据分区,使用ubi-utils工具包中的ubiformat格式化用户数据分区;步骤5、使用ubi-utils工具包挂载用户数据分区为UBI卷1,并转步骤3;步骤6、使用ubi-utils工具包挂载参数备份分区为UBI卷2,用于实现基于UBI的参数备份;步骤7、应用程序校验/userdata目录下的参数文件是否正确,如果正确转步骤9,否则转下一步;步骤8、读取UBI卷2,将其中备份的参数恢复至参数文件;步骤9、应用程序正常运行,当参数变化时使用ubi-utils工具包中的ubiformat-f命令将参数备份至UBI卷2。优选地,步骤1中将内核NANDFlash设置为四个分区,分区的大小与其要存储的内容相适应。优选地,所述四个分区中分区1存储系统映像,分区2存储基于UBI卷的参数备份,分区3存储rootfs根文件系统和应用程序,分区4存储用户数据。优选地,步骤3中通过分析/proc/mounts判断挂载是否成功。优选地,步骤5、步骤6中使用ubi-utils工具包中的ubiattach、ubimkvol进行挂载。优选地,步骤7中应用程序校验/userdata目录下的参数文件是否正确的方法是:采用参数的开头、结尾,以及CRC校验。用户数据一般包含参数和数据,其中参数是指系统运行所需的各类配置、参数,参数丢失将导致系统运行故障,故需使用另外一种方式存储于mtd1,而数据是指应用程序运行过程中存储的运行数据,丢失是可接受的。步骤6、7、8、9中使用基于UBI卷的参数备份是因为其它类似的读写NANDFlash指令如nandwrite、dd、nanddump都没有坏块隐藏和损耗平衡功能。本发明的有益效果如下:1、用户分区与系统分区的分离设计,可以大大减少系统分区被破坏、导致系统启动时发生故障的概率;2、由应用程序动态地挂载和处理挂载结果,提高了分区损坏、挂载失败时的自恢复能力;3、用户参数的备份,在挂载失败需要格式化时、可以确保大大减少用户参数的丢失;4、使用基于UBI卷的参数备份方法可以更好地隐藏坏块和保证损耗平衡;5、使用基于UBI卷的参数备份方法可以独立于任何文件系统,对数据进行原始读写,与文件系统形成原子操作,确保重要数据不丢失。附图说明图1是本发明的逻辑流程框图。具体实施方式下面结合附图,具体说明本发明的实施方式。如图1所示,是本发明的逻辑流程框图。嵌入式Linux的文件系统分区及数据读写方法,基于NANDFlash存储器和UBIFS文件系统,包括以下步骤:步骤1、设置内核NANDFlash分区,用于实现用户数据分区与系统数据分区的分离。本实施例以128M字节NANDFlash为例,将内核NANDFlash分为四个分区,具体的分区方式如下表所示。名称mtd0mtd1mtd2mtd3大小8M8M50M62M存储内容Bootstrap/uboot/kernel参数备份(UBI卷)Rootfs(ubifs)Datafs(ubifs)其中,mtd0存放系统映像一般为bootstrap/uboot/kernel,mtd1用于存储基于UBI卷的参数备份,mtd2用于存储rootfs即根文件系统、应用程序也存放于此,而mtd3则用于存放用户数据。步骤2、启动嵌入式Linux设备,Kernel启动后自动挂载rootfs,并启动应用程序。步骤3、应用程序启动后使用mount命令挂载用户数据分区至根目录下结点/userdata,通过分析/proc/mounts判断挂载是否成功;如果挂载成功则转步骤6,否则转下一步。/proc/mounts是一个文件,文件的内容记载了所有挂载成功的设备以及挂载的方式,通过对文件内容的分析就可以准确地判断挂载是否成功。步骤4、使用mtd-utils工具包中的flash_erase擦除用户数据分区,使用ubi-utils工具包中的ubiformat格式化用户数据分区。步骤5、使用ubi-utils工具包中的ubiattach、ubimkvol挂载用户数据分区(mtd3设备)为UBI卷1,并转步骤3。步骤6、使用ubi-utils工具包中的ubiattach、ubimkvol挂载参数备份分区(mtd1设备)为UBI卷2,用于实现基于UBI的参数备份。步骤7、应用程序校验/userdata目录下的参数文件是否正确,如果正确转步骤9,否则转下一步。应用程序校验/userdata目录下的参数文件是否正确的具体方法是:采用参数的开头、结尾,以及CRC校验。比如:参数文件长度为100个字节,第一个字节为0x55,最后一个字节为0xaa,这100个字节的CRC校验为0x5678。只要任何一点不符合,就可以判定参数不合法。步骤8、读取UBI卷2,将其中备份的参数恢复至参数文件。步骤9、应用程序正常运行,当参数变化时使用ubi-utils工具包中的ubiformat-f命令将参数备份至UBI卷2。当前第1页1 2 3 当前第1页1 2 3 

你可能感兴趣的:(嵌入式linux文件系统格式)