发明内容
针对上述问题中存在的不足之处,本发明提出一种基于时间戳的YAFFS2文件最终版恢复方法,该方法在NAND闪存的特性和YAFFS2文件系统的存储、回收机制的基础上,根据YAFFS2数据结构特征,利用Yst_atime时间戳信息为依据可以恢复出数据文件的最终版本。
为实现上述目的,本发明的基于时间戳的YAFFS2文件最终版恢复方法,其包括以下步骤:
1.一种基于时间戳的YAFFS2文件最终版恢复方法,其特征在于,包括:
步骤1,从YAFFS2文件中的最大块序号的数据块开始扫描,最大块序号标记为N,块序号为N的数据块标记为BlockN,扫描所述BlockN;
步骤2,从所述BlockN的最后一个页面开始扫描,该最后一个页面标记为M,数据块内第M个页面标记为PageM,扫描所述PageM,并对该PageM进行判断:如果所述PageM是所述BlockN中第一个页面,则执行步骤4,如果所述PageM不是所述BlockN中第一个页面,则执行步骤3;
步骤3,令M=M-1,执行步骤2;
步骤4,对所述BlockN进行判断,如果所述BlockN是最小块,则找到当前块的当前页的对象号和页面号,扫描结束,执行步骤6,否则执行步骤5;
步骤5,令N=N-1,执行步骤1;
步骤6,对闪存的当前块的当前页进行解析,读取页面号;
步骤7,如果所述页面号为0,则该页面是对象头,查找所述对象头的对象号和Yst_atime字段,并根据所述Yst_atime字段的访问时间戳确定文件最终版本对象头,否则寻找当前页的前一个页面,执行步骤6;
步骤8,查寻与所述最终版本对象头具有相同对象号的页面,并按从大到小的页面号和从远到近的时间顺序排序,得到排序结果;
步骤9,根据所述排序结果获取定位存储创建时间距Yst_atime字段最近的页面,验证所述最近的页面的文件相关信息,并将其拼装恢复并输出最终文件数据;
其中,所述Yst_atime字段:表示访问时间(access time),是文件最后一次被读取的时间。
本发明的有益效果在于:
本发明在NAND闪存的特性和YAFFS2文件系统的存储、回收机制的基础上,根据YAFFS2数据结构特征,利用Yst_atime时间戳信息为依据可以恢复出数据文件的最终版本,提出了基于Yst_atime时间戳的YAFFS2文件最终版本恢复方法,从物理芯片上擦除的数据重新拼装进行恢复。
具体实施方式
为了使发明的目的、技术方案及优点更加清楚明白,下面结合附图与实例对本发明作进一步详细说明。但所举实例不作为对本发明的限定。
本发明提出一种从用户角度出发,根据YAFFS2数据结构特征,NAND闪存下面向Android利用文件的最后访问时间戳Yst_atime为依据,恢复文件最终版本的方法。
YAFFS2文件系统下储存的每个文件都会有一个文件头,存储文件名、文件大小等信息。并且,YAFFS2采用递增的数字序列来标记每一个块,每当一个新块被分配,块序号加1。从具有最大块序号的数据块开始,到具有最小块序号的数据块,对每个块从最后一个页面到第一个页面依次扫描。用上述方法遍历NAND闪存,根据用户输入的文件名,寻找目标文件的所有对象头页面。
YAFFS的每个页面都有各自的标签,其中对象号ObjectID是该页面所属对象的ID号,页面号Chunkid用于标识该页面在所处对象中的逻辑位置,如Chunkid为0表示该页面是对象头,Chunkid为1表示该页面是所属对象的第一个数据页面。由于NAND闪存异地更新的特性,经过修改操作的文件会有不同历史版本存在于闪存上,所以搜索到的文件头页面可能为一个或多个。对于用户来说,仅需要恢复最新版本的文件。文件头储存的一些字段信息对文件恢复十分有用。其中,字段Yst_mtime:表示修改时间(modification time),是文件本身的内容发生了变化,是在写入文件时随文件内容的更改而更改的;字段Yst_ctime:表示改变时间(change time),是文件的索引节点发生了改变,是在写入文件、更改所有者、权限或链接设置时随Inode的内容更改而更改的;字段Yst_atime:表示访问时间(accesstime),是文件最后一次被读取的时间;是在读取文件或者执行文件时更改的。
若找到目标文件的对象头只有一个,说明文件只有一个版本存在于闪存上,读取其objectID,寻找所有具有相同objectID的数据页面。若找到多个目标文件的对象头,说明对象被修改过,具有相同ObjectID同时chunkID也相同的页面属于该文件的不同版本。读取所有chunkID为0的对象头中Yst_atime时间戳。在Android系统中,时间戳一般表示自1970年1月1日至今的毫秒数,所以我们可以直接比较Yst_atime值的大小,值最大的一个为最后一次访问时间。YAFFS2文件系统是根据对象头来决定把哪些文件内容呈现给用户。我们则根据最后一次访问的对象头,找到该版本下的所有数据页面。将找到的所有数据页面的内容拷贝到新的空闲块中,按照chunk ID由小到大排序,重组成完整的目标文件。拷贝数据时调用文件系统的写操作,将数据内容作为新的文件写入闪存,文件系统重新为其分配一个新的对象头,这样数据页面的状态全部为有效。
如图1,2所示,本发明提供一种NAND闪存下面向Android基于时间戳的YAFFS2文件恢复方法,包括:
用BlockN表示块序号为N的数据块,PageM表示块内第M个页面。采用从当前块BlockN到BlockN-1的遍历顺序逐块扫描整个闪存,对当前块BlockN内数据页面的扫描也从PageM到PageM-1逐页扫描,直至整个块扫描结束,跳转至BlockN-1继续。其扫描算法流程步骤如下:
步骤1 S101Scan BlockN;
步骤2 S102Scan当前Block中pageM;如果PageM是当前block中第一个页面,则转到(4);
步骤3 S103M=M-1,转到(2);
步骤4 S104如果当前block块是当前块中最小块,则扫描结束;
步骤5 S105N=N-1,转到(1)。
在上述扫描过程中,寻找对象头页面,根据访问时间戳Yst_atime字段确定文件最新版本对象头,从最终对象头Object header页面中获取文件的描述信息。其算法思想如下:
步骤1 S201从NAND Flash每页的spare区读取yaffs_tags中的chunkID,经解包后判断是对象头页面还是数据页面。
步骤2 S202chunkID=0,该Flash Page存放的数据为ObjectHeader,查找此tags中的ObjectID和Yst_atime字段,根据访问时间戳Yst_atime字段确定文件最新版本对象头ObjectID;
步骤3 S203从最终对象头Object header页面中获取文件的描述信息,用于恢复数据和验证文件数据恢复是否成功;
步骤4 S204查寻具有相同ObjectID的页面,判断chunkID>0:表示该Page存放的数据为某个Object的Data,并按从大到小的Chunkid和从远到近的时间顺序排序;
步骤5 S205定位存储创建时间距Yst_atime最近的页面,验证文件相关信息,拼装恢复并输出最终文件数据。
本方案适用于NAND闪存下面向Android基于时间戳的YAFFS2文件恢复,根据YAFFS2文件系统的存储、回收机制和数据结构特征、NAND闪存的特性,结合数据块和页的倒序遍历算法实现最终文件版本的恢复。
其中,字段Yst_mtime:表示修改时间(modification time),是文件本身的内容发生了变化,是在写入文件时随文件内容的更改而更改的;
字段Yst_ctime:表示改变时间(change time),是文件的索引节点发生了改变,是在写入文件、更改所有者、权限或链接设置时随Inode的内容更改而更改的;
字段Yst_atime:表示访问时间(access time),是文件最后一次被读取的时间;是在读取文件或者执行文件时更改的。
对时间戳的比较分析可以看出,访问时间Yst_atime是文件最后一次被读取的时间。因此阅读一个文件会更新它的访问时间,此时它的改变时间Yst_ctime并没有变化(文件的信息没有被改变),它的修改时间Yst_mtime也同样如此(文件本身没有被改变)。因此,根据Yst_atime时间戳信息为依据可以恢复出数据文件的最终版本。根据Yst_mtime时间戳信息为依据可以恢复出数据文件的不同版本。
惟以上所述者,仅为本发明的较佳实施例而已,举凡熟悉此项技艺的专业人士。在了解本发明的技术手段之后,自然能依据实际的需要,在本发明的教导下加以变化。因此凡依本发明申请专利范围所作的同等变化与修饰,都应仍属本发明专利涵盖的范围内。