1.一种基于Hash的YAFFS2文件各版本恢复方法,其特征在于,包括:
步骤1、对整个YAFFS2文件系统进行扫描,获取文件系统中所有的Block块信息并按照Block块的序列号从大至小排序;
步骤2、所有Block块按照序列号从大到小进行扫描,每个Block块按照Block块中chunk块id值由大到小进行扫描,获取object对象信息和chunk块信息,并将object对象信息和chunk信息存入chunkInfo[]中;所述object对象信息包括对象id和对象类型,所述chunk信息包括chunkid、chunk类型和chunk大小;
步骤3、根据对象类型将chunkInfo[]中的信息进行分类,并通过每个chunkinfo[j]中j所对应的chunk块内容进行读取,获取目录对象头信息和文件对象头信息; 目录对象头信息包括:目录名、父对象id;文件对象头信息包括:文件名、对象id、父对象id、文件大小、文件的三个时间戳;
步骤4、对所述文件对象头信息中每个文件的时间戳进行分析,建立文件操作与时间戳之间的关联,获得文件的版本、文件操作信息,并将版本、文件操作信息以及步骤3中获得的文件对象头信息存入File[]中;对File[]进行扫描将其中只出现一次的对象id的File[]保存并直接跳到步骤6中对File[]中对应文件进行恢复,并将具有相同对象id的File[],以对象id作为Hash链表键值,以File[]作为存储对象存入Hash链表中;
步骤5、将步骤3中的目录信息存入Dir[]中;
步骤6、恢复Dir[]中目录信息,再将Hash链表中File[]的文件信息和步骤4中只出现一次对象id的File[]中的文件信息对应恢复到各目录下,实现YAFFS2文件各版本恢复;
在步骤4中,所述时间戳的分析方法包括:
步骤4-1、获得时间戳:
通过读取文件对象头获得每个版本文件的三个时间戳,并根据所获得的时间戳来获得该文件三种时间戳的间的大小序列S和最大值Θ;所述三个时间戳为访问时间戳、修改时间戳和创建时间戳;
步骤4-2、分析时间戳:
依据S和文件操作对时间戳影响规则,判断该版本文件与文件操作间的对应关系r;
步骤4-3、确定时间戳序列:
所述4-3在File[]存入Hash链表后执行; 在Hash链表中根据相同键值、文件名相同的File[]间,即是对一个文件的不同版本依据其中的Θ对对应关系r进行排序,获得唯一的文件操作与各版本时间戳间的对应关系,确定文件的版本号;
所述步骤6包括:
步骤6-1、对于Dir[]中目录信息的处理:将所有Dir[]中的信息依次遍历,创建路径并通过Dir[]中的父对象id判断目录层级,按层级创建目录到指定文件夹;
步骤6-2、对Hash链表中的File[]文件信息处理:通过将Hash链表中同一键值的多个文件对象头信息提取,通过文件大小判断每一个版本文件所对应的chunk数据块,对文件进行重构,使得每一个版本文件的对象头信息和其数据块拼接在一起,实现YAFFS2文件各版本恢复。
2.如权利要求1所述的基于Hash的YAFFS2文件各版本恢复方法,其特征在于,所述步骤
6-2中,将重构的各版本文件按其数据块依次写入与文件相对应的目录中,文件每一个数据块的写入都需要找到其chunk块对应的物理地址;该物理地址的获取方法,根据Block[i]中的i获得Block块的物理地址,而每个chunk又对应一个chunkinfo[j],依据Block[]和chunkinfo[]二者来推断该chunk的物理地址,读取其中的文件数据,再将其写入恢复文件路径下的文件中,实现文件的恢复。