恢复Ext3/Ext4中已彻底删除文件的方法

文档序号:9349824阅读:752来源:国知局
恢复Ext3/Ext4中已彻底删除文件的方法
【技术领域】
[0001] 本发明属于数据恢复领域,具体涉及一种恢复Ext3/Ext4中已彻底删除文件的方 法。
【背景技术】
[0002] 对于ext3、ext4文件系统来说,彻底删除一个文件后,由于存储文件的节点信息 被破坏,使其无法通过常规方式进行恢复。Ext3\Ext4文件系统是一种日志型文件系统,对 文件系统的写操作,都会通过日志文件进行预写,因此,通过日志文件,就有极大的几率恢 复彻底执行删除操作的文件。目前,部分专门针对ext3, ext4文件系统的恢复技术,其删除 文件的恢复率普遍都不高,且存在着以下弊端:
[0003] 1.采用上下文的节点信息进行类比,使用小范围的Raw扫描方式,使得恢复的文 件不确定因素增多,成功率极低。
[0004] 2.采用基于.Journal的方式进行恢复,但只对完整的事务支持,被覆盖的事务无 法进行数据块定位,使得恢复的成功率底下。
[0005] 3.对于已被其它文件占用的节点,显得束手无策。

【发明内容】

[0006] 本发明针对现有技术的不足,提供了一种恢复Ext3/Ext4中已彻底删除文件的方 法,能够解决现有技术恢复Ext4中已彻底删除的文件成功率低的问题。
[0007] 为解决以上问题,本发明采用的技术方案如下:一种恢复Ext3/Ext4中已彻底删 除文件的方法,包括以下步骤:
[0008] 101-根据节点号,计算节点所在的块号以及块内偏移,并读取该节点的信息,获取 节点属性、节点UUID、GID、创建时间、文件版本及文件大小;
[0009] 102-判断.Journal文件是否已解析完成,如果数据块链非为空,则执行104 ;否 贝IJ,执行103 ;
[0010] 103-解析.Journal文件,并输出.Journal中所有的数据块,输出的数据块分为两 种,一种是带有逻辑块号的数据块,另一种是不带逻辑块号的数据块,输出的数据块的结构 定义为【数据逻辑块号,journal文件中的相对块号,是否有逻辑块号标记】;
[0011] 104-依次遍历输出的数据块链,判断输出的数据块链中,是否存在下一个带有逻 辑块号的数据块,如果是,取出该数据块,执行105 ;否则,执行109 ;
[0012] 105-将104取出的块号与101计算得到的块号进行比较,如果相等,执行106 ;否 则执行104 ;
[0013] 106-根据journal文件中的相对块号读出该数据块,并根据101中计算的节点偏 移量,定位Journal中的节点信息,然后和101中的节点信息进行匹配,如果匹配成功,则执 行107 ;如果匹配失败,则执行104 ;
[0014] 107-根据Journal中匹配得到的节点,读取该节点中含有的文件块链,如果读取 成功,执行108 ;否则执行104 ;
[0015] 108-检查所有读取到的块是否都是空闲块,将不是空闲块的块号,从文件块链中 去除,然后输出文件块链并结束;
[0016] 109-依次遍历输出的数据块链,判断输出的数据块链中,是否存在下一个不带逻 辑块号的数据块,如果是,取出该数据块,执行106 ;否则,结束。
[0017] 作为优选,103的具体步骤如下:
[0018] 301-. journal文件的节点号为8,读取8号节点中的文件块链,并将所有块的 数据加载至内存,此处可一次性解析.Journal文件,读取.Journal文件的第一块,此块 为.Journal文件的超级块,从超级块中获取.Journal文件的总块数,块大小,V2或V3校 验和方式,是否支持64位的块号;
[0019] 302-检查.Journal的游标指针是否已到.Journal文件的尾部,以判断.Journal 文件是否遍历完成,如果遍历完成,执行310,如果未遍历完成执行303 ;
[0020] 303-将游标指针下移一个块,读取下一个块的内容;
[0021] 304-检查块头标记是否为0Xc03b2998,且块类型标记是否为2 ;如果是,代表该块 为日志提交块执行302 ;否则,执行305 ;
[0022] 305-检查块头标记是否为0Xc03b2998,且块类型标记是否为1 ;如果是,代表该块 为日志描述块,执行309 ;否则,执行306 ;
[0023] 306-检查块头标记是否为0Xc03b2998,且块类型标记是否为5 ;如果是,代表该块 为日志回滚块,执行309 ;否则,执行307 ;
[0024] 307-检查块头标记是否为0Xc03b2998,如果是,代表该块为日志特殊类型的块, 执行302 ;否则,执行308 ;
[0025] 308-标记当前数据块,设置当前数据块结构为【0, .Journal中的相对块号, false】,并将该结构插入待输出的数据块链,然后执行302 ;
[0026] 309-根据日志描述块或回滚块中描述的原数据块号,以及当前数据块在日志中的 相对位置,设置当前数据块结构为【原数据块块号,.Journal中的相对块号,true】,并将该 结构插入待输出的数据块链,然后执行302 ;
[0027] 作为优选,309的具体步骤如下:
[0028] 3091-根据描述块或回滚块的结构,初始化其信息,提取该事务的事务ID,以及所 包含的数据块块号;
[0029] 3092-根据当前事务所包含的数据块的个数X,该个数为描述块或回滚块中提取 所包含数据块的块数,其范围为1到101的整数,读取从当前块跳转到(x+1)个块后的那个 块的块内容,如果该块是一个日志提交块,且日志提交块中的事务ID等于3091中获取的事 务ID,则初步判断该事务是一个完整的事务,执行3093,否则,结束;
[0030] 3093-将游标指针下移一个块,读取下一个块的内容;
[0031] 3094-如果该块的前4个字节为.Journal块标记0Xc03b2998,则表明从该块开 始,到当前事务日志提交块之前的所有数据块已遭破坏,直接结束;如果不是块标记,代表 它是当前事务的数据块,执行3095 ;
[0032] 3095-根据顺序对应的原数据块号,以及当前数据块在日志中的相对位置,设置当 前数据块结构为【原数据块块号,.Journal中的相对块号,true】,并将该结构插入待输出 的数据块链,然后执行3096;
[0033] 3096-判断包含的原数据块号是否都按顺序遍历完成,如果完成,则结束;如果未 完成,执彳丁 3093。
[0034] 作为优选,106的具体步骤如下:
[0035] 601-根据节点在块内偏移,从当前游标指针所指向的块中读取待比较节点的信 息,获取节点属性、节点UUID、GID、创建时间、文件版本信息;
[0036] 602-如果601获取的节点信息中,节点的文件大小为0且硬件链接数为0且数据 块指针被清零,且对应的节点位图为空闲位则说明该节点是删除节点,即为不可用的恢复 节点,返回false,执行610 ;如果是一个可用的恢复节点,则执行603 ;
[0037] 603-判断101中获取的已知节点是否为已被占用的节点,如果已被占用,执行 608 ;如果未被占用,执行604 ;
[0038] 604-比较当前获取的节点信息中的文件版本是否与已知节点相同,如果是,执行 605 ;如果否,返回false,执行610 ;
[0039] 605-比较当前获取的节点信息中的创建时间是否与已知节点相同,如果是,执行 606 ;如果否,返回false,执行610 ;
[0040] 606-比较当前获取的节点信息中的UUID是否与已知节点相同,如果是,执行607 ; 如果否,返回false,执行610 ;
[0041] 607-比较当前获取的节点信息中的GID是否与已知节点相同,如果是,返回true, 执行610 ;如果否,返回false,执行610 ;
[0042] 608-比较当前获取的节点信息中的文件版本是否与已知节点相同,如果是,代表 当前节点信息与已占用的节点信息相同,并非先前删除的节点信息,返回false,执行610 ; 如果否,执行609 ;
[0043] 609-比较当前获取的节点信息中的创建时间是否比已知节点的创建时间早,如 果是,代表当
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1