文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» Solaris & BSD & Unix » 可适用UNIX 文件恢复 工具finalData       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: [转载] 可适用UNIX 文件恢复 工具finalData  ( 查看:553  回复:2 )   
 
queniao
副版主  点击可查看详细



十二生肖之虎   天秤座   行业勋章   技术勋章   诚信兄弟  
帖子 618
精华 2
无忧币 2579
积分 1033
阅读权限 140
注册日期 2006-4-2
最后登录 2008-10-6 离线

[查看资料]  [发短消息]  [Blog
[个人主页]    QQ       
发表于:2007-12-2 17:26   标题:可适用UNIX 文件恢复 工具finalData
上一帖 |
Unix操作系统自七十年代初在Bell实验室诞生以来,以其高效率、良好的开放性、安全性和稳定性深受用户的欢迎,到目前历经三十余年市场风云变换,依然在企业级操作系统市场上占据巨大份额。特别是与其他主流操作系统相比,Unix系统突出的稳定性和安全性使其成为数据服务器或者文件服务器的首选操作系统,承担着大部分企业的关键业务。
目前能够威胁Unix系统平台的病毒并不多见,而Unix完善的文件系统也使得由于系统崩溃等软件故障造成的数据丢失并不多见。但是由于多年来始终面向企业级用户,Unix的用户界面友好程度和Windows系列平台相比还有一定差距,许多系统管理的任务还需要通过命令行的方式完成,而且能够完全通晓Unix系统管理命令及其选项的专业人员也不多,所以因误操作造成数据丢失的情况屡屡发生。特别是由于Unix系统的超级账号拥有无限的权利,所以如果是使用超级账号的系统管理员进行了误操作,可能造成的数据丢失是非常巨大的。此外,对Unix系统来说,由于突然掉电等原因造成系统不正常退出而发生的数据文件破坏要比在Windows系统下严重得多。所以,研究如何在Unix系统下查找和恢复丢失文件是非常实用和有意义的。但是Unix的磁盘格式和文件系统格式并不为人所熟知,我们在市场上很少见到能够在Unix系统下进行文件恢复的技术和产品。本文通过分析Unix系统的磁盘和文件系统格式,向大家推荐一款能够在这种格式下进行文件恢复的有效工具——FinalData。
Unix系统在发展过程中出现了非常多的分支和变种,其中比较重要的是AT&T公司开发的Unix System V和加州大学伯克利分校开发的BSD Unix。许多Unix平台硬件厂商都开发了自己的Unix版本,但这些Unix版本都是以System V或者BSD为蓝本发展变化来的,如IBM公司的AIX系统、SUN公司的Solaris系统、惠普公司的HP-UX系统、SGI公司的IRIX系统及DEC公司(现已被康柏收购)的DEC Unix系统等。九十年代初诞生的Linux操作系统和Unix系统渊源很深,在很多方面也借鉴了Unix系统的设计思想。所以Linux与Unix系统在磁盘结构和文件系统结构上大同小异,FinalData在这些系统中的使用具有普遍适用性。下面我们将以SUN Solaris系统为例进行分析讨论。

图1
Unix的文件系统和Windows的文件系统一样是采用树状分级目录结构。但在Windows中每一个逻辑分区都是一棵独立的目录树(即都从根目录开始),而在Unix系统中只有一棵完整的目录树。这棵目录树缺省由主磁盘的第一个分区(类似Windows中的C驱动器)承载,而本磁盘上的其他分区及其他磁盘上的分区将安装在目录树的不同节点上,图1是一个Unix文件系统的可能的目录树结构。普通用户通常只需要了解目录信息而无需关心磁盘和分区的情况,但是作为管理员在进行日常系统维护工作和试图恢复丢失的文件时,必须清楚文件和目录具体所在的磁盘及分区位置。 Unix系统采用I节点表来记录文件信息。一个典型的Unix磁盘分区结构如图2所示。

图2
可以看到,有关文件的详细索引信息都记录在I节点表中,进行文件恢复的关键在于查找和修复I节点表中的信息。下面先讨论可能造成文件破坏的原因和一些常规的文件系统维护方法。
除了误操作而删除文件以外(对操作系统来说误删除和正常的文件删除是没有任何区别的),造成文件丢失的最大原因在于系统的不正常退出。这主要是由于在系统运行中,为了提高文件读写效率,很多的修改信息及I节点表内容会暂时保存在内存或者Cache(高速缓存)中,等到CPU及其他资源空闲时再向硬盘回写。突然的退出(如掉电等原因造成)可能导致I节点表内容和硬盘文件不一致而造成文件丢失或者不可用。Unix系统在启动时通常都会进行文件一致性检查,即对I节点表内容和磁盘文件系统进行检查和修复。当Unix系统不能自动进行文件一致性检查时,我们也可以通过“fsck”命令手动进行文件系统修复(关于fsck命令的详细用法和各选项含义可以通过Unix系统的使用手册查看)。
经常进行文件系统备份和磁盘备份是保障数据安全的良好习惯。Unix系统本身带有文件系统备份和磁盘备份的命令。用户可以通过调用ufsdump和ufsrestore命令进行文件系统的备份和恢复;也可以调用dd和volcopy命令进行磁盘内容的备份。
当我们在Windows系统中删除一个文件时,仅仅是目录入口中相应文件的记录项所保留的文件名的首字母被改成一个特殊的ASCII码“E5h”,操作系统即认为该文件已被删除,而文件的其他信息并未被破坏。所以在Windows中,我们只需要在目录入口中查找“E5h”字符,就可以找到被删除文件的大部分相关信息,从而把文件恢复出来。但是在Unix系统中,当删除一个文件时,该文件所对应的I节点记录被完全清除,所以如果事先没有做任何备份,要想把文件完全恢复出来是非常困难的。
冠群联想软件公司新推出的数据恢复工具FinalData不仅可以帮助用户进行Windows系统下的数据恢复,而且是目前仅有的可以支持Unix系统下的数据恢复的专业工具。
FinalData可以帮助用户进行I节点表的备份。这种备份不同于通过ufsdump等命令进行备份,也不同于一些专用存储备份软件所提供的备份。因为它只备份I节点表而不是文件系统本身或者文件内容,所以占用资源非常少,备份速度快,对系统性能几乎没有影响,例如在SUN Ultra10工作站上对12GB的文件系统进行备份,耗时大约10秒钟,占用磁盘空间不足200KB。由于文件删除只是删除文件对应的I节点表,文件内容依然存在,所以利用这种对I节点表的备份,在绝大多数情况下可以帮助我们完整恢复数据。而且由于这种备份资源占用非常少,我们可以通过Unix提供的cron命令,让系统在规定的时间自动进行备份,当发现文件丢失之后,利用丢失前备份的I节点表我们就可以轻松地把文件恢复回来。
在大多数情况下普通用户没有养成数据备份的良好习惯,或者备份的时间间隔过长,难以恢复最近生成或者改动过的数据。FinalData还提供了一个删除检测功能。当Unix系统启动时,一个非常小的后台进程会被自动启动并驻留在内存中,监视用户对磁盘的写操作。当用户删除一个文件或者目录时,该进程会自动抽取一些关键信息予以保留。通过利用这些保留的关键信息,FinalData可以很方便地恢复丢失的数据。
如果事先既没有做任何备份,也没有提前预装FinalData,那么恢复丢失的数据就变得非常困难。在这种情况下,利用FinalData软件,我们有两种方式可以进行文件恢复。其一是完整执行FinalData的磁盘扫描过程。这一过程可能会花费较长的时间(大约几小时,根据磁盘容量大小而有所变化),但是通过磁盘扫描可以从磁盘上识别出大多数丢失的数据文件。使用这种方法的缺点在于由于I节点表被删除,诸如文件名、创建和访问时间、原始目录位置等信息都被破坏,所以找到的文件都以起始存放簇号作为缺省文件名,我们很难从所磁盘扫描识别出的成百上千个被删除的文件中挑出我们需要恢复的文件。另一种方法建立在对丢失的文件内容有一定了解的基础上,通过FinalData的磁盘浏览器,我们可以直接查看指定位置的磁盘内容。在磁盘浏览器的查找功能中键入丢失的文件中比较特殊的字符串,磁盘浏览器可以在整个磁盘范围内查找该字符串,如图3所示,在磁盘上查找“CALEGEND”字符串。

图3
当我们利用查找功能找到磁盘上保存的相应字符串后,就可以从磁盘浏览器中查看该位置附近的磁盘内容。
从磁盘浏览器中可以看到该文件存储在磁盘上的全部内容。我们可以通过鼠标从磁盘浏览器中直接选择需要恢复的文件内容,把它们保存到一个新建文件中去,就完成了对该文件的恢复。这种方法的限制在于必须对文件内容有一定的了解,而且能够恢复的文件格式限于ASCII码文件。
从以上的恢复方法可以看出,即使使用FinalData这样的专业工具,在没有预装、没有任何备份的情况下完全恢复原有文件也是相当困难的。作为Unix系统管理员或者对数据安全非常关心的用户,养成良好的数据备份习惯,以及预先安装类似FinalData这样的专业恢复工具,是维护数据安全的重要保障。



论坛活动:测测你对IT技术大会的了解指数(赠微软礼品、无忧币)
2007-12-2 17:261楼
[ 顶部 ]
 
queniao
副版主  点击可查看详细



十二生肖之虎   天秤座   行业勋章   技术勋章   诚信兄弟  
帖子 618
精华 2
无忧币 2579
积分 1033
阅读权限 140
注册日期 2006-4-2
最后登录 2008-10-6 离线

[查看资料]  [发短消息]  [Blog
[个人主页]    QQ       
发表于:2007-12-2 17:34 
与DOS/Windows不同,Unix文件被删除后很难恢复,这是由Unix独特的文件系统结构决定的。所以,要想恢复这些文件,就需要另辟蹊径。  

(如右图)Un  
ix文件系统的特殊性决定了它不能像Windows系统那样恢复被删除的文件。

Unix文件目录不像DOS/Windows那样,文件即使被删除之后仍保存有完整的文件名、文件长度、始簇号(即文件占有的第一个磁盘块号)等重要信息。相反,它的文件信息全部依靠一种被称为i节点的数据结构来描述,而i节点在相应文件被删除之后即被清空,因此,要想直接恢复被删除的文件内容几乎是不可能的,必须另辟蹊径。本文结合实际,讨论几种文件恢复策略及其关键步骤的具体实现。 

不过,需要说明的是,Unix系统下文件系统恢复的具体实现依赖于不同操作系统和不同版本的具体文件系统结构和磁盘块分配算法(见附文)。本文只是试图总结出一种一般性的思路和策略,限于篇幅,不能详细讨论它们的具体实现过程。

Unix文件系统结构

我们知道,Unix是以文件卷作为其文件系统存储格式的,而不同的Unix系统,文件卷格式是有差异的,甚至即使是同一Unix操作系统的不同版本,其文件系统也未必完全相同,例如: SCO Unix 4.1版与5.0版文件系统结构就有明显差异,但只要是Unix系统,其文件卷的基本结构是一致的。

不管是什么Unix系统,不管什么版本,其文件卷至少包括引导块、超级块、i节点表、数据区等几个部分。

1. 引导块

位于文件卷最开始的第一扇区,这512字节是文件系统的引导代码,为根文件系统所特有,其他文件系统这512字节为空。

2. 超级块

位于文件系统第二扇区,紧跟引导块之后,用于描述本文件系统的结构。如i节点长度、文件系统大小等,其结构存放于/usr/include/sys/filsys.h中,其结构如下:

struct filsys

{ ushort s_isize; /*磁盘索引节点区所占用的数据块数*/

daddr_t s_fsize; /*整个文件系统的数据块数*/

short s_nfree; /*在空闲块登录表中当前登记的空闲块数目*/

daddr_t s_free[NICFREE]; /*空闲块登记表*/

short s_ninode; /*空闲索引节点数*/

ino_t s_inode[NICINOD]; /*空闲节点登记表*/

char s_flock; /*加锁标志位*/

char s_ilock; /*节点加锁标志位*/

char s_fmod; /*超级块修改标志*/

char s_ronly; /*文件系统只读标志*/

time_t s_time; /*超级块上次修改的时间*/

short s_dinfo[4]; /*设备信息*/

daddr_t s_tfree; /*空闲块总数*/

ino_t s_tinode; /*空闲节点总数*/

char s_fname[6]; /*文件系统名称*/

char s_fpack[6];

long s_fill[13]; /*填空位*/

long s_magic; /*指示文件系统的幻数*/

long s_type; /*新文件系统类型*/ };

3. i节点表

i节点表存放在超级块之后,其长度是由超级块中的s_isize字段决定的,其作用是用来描述文件的属性、长度、属主、属组、数据块表等,其数据结构在/usr/include/sys/ino.h中,如下:

struct dinode

{ ushort di_mode;

short di_nlink;

ushort di_uid;

ushort di_gid;

off_t di_size;

char di_addr[40];

time_t di_atime;

time_t di_mtime;

time_t di_ctime; };

4. 目录结构

Unix所有文件均存放于目录中,目录本身也是一个文件。目录存放文件的机制如下: 首先,目录文件本身也象普通文件一样,占用一个索引节点; 其次,由这个索引节点得到目录内容的存放位置; 再次,从其内容中取出一个个的文件名和它对应的节点号,从而访问一个文件。

由此可知文件名是依靠目录来描述的,文件的内容和其他信息则由索引节点来描述。

被删文件的恢复策略

Unix下删除一个文件的过程很简单,那就是释放索引节点表和文件占用的数据块,清空文件占用的索引节点,但不清除文件内容。但删除文件与删除目录的处理不尽相同,不同命令删除文件的过程也不相同。 Unix 删除一个文件的具体步骤是: 根据文件i节点的地址表逐一释放文件占用的磁盘数据块,然后清空相应的节点,最后释放i节点。 删除一个目录的过程是: 首先逐一删除目录里的所有文件,然后删除目录。目录本身也是一个文件,故删除方法与删除文件一致。

要恢复被删除的文件,只能根据删除后留下的东西去做文章。文件被删除后留下了什么呢?由上述分析可知: 其一,留下了文件的内容; 其二,留下了“现场”。文件的恢复策略只能从这两个方面来分析。

1.根据磁盘现场进行恢复

如果文件被删除,现场未被破坏(即文件被删除后硬盘未发生过写操作),而且假定只删除了一个文件,那么可根据系统的分配算法进行恢复。因为系统建立一个文件时,必定根据某一特定的分配算法决定文件占用的数据块位置。而当该文件被删除后,它所占用的数据块被释放,又回到系统的分配表中,这时如果重新建立一个文件,系统根据原来的分配算法分配出的数据块必定跟该文件原来占用的数据块一致。而且我们知道,Unix文件最后一个数据块尾部多出的字节是全部置0的,据此只要调用系统的数据分配算法,在系统中一块一块地申请数据块,只要发现一个分配出的数据块中尾部全为0,即可认为文件结束,由此可确定文件长度和内容,进而实现恢复。方法如下:

● 申请一个索引节点,即向系统申请创建一个新文件名而不写入任何内容。如: #>/tmp/xx。

● 调用系统分配数据块算法getnextfreeblock()得到一个数据块号,记入某一地址表变量中。

● 读出这个数据块,判断其尾部是否全部连续为0,若不是,则回到第二步,若是,则进行第四步。

● 首先用系统函数fstat得到/tmp/xx的i节点号,然后将第二步所得的地址表写入索引节点的地址表中(注意间址问题),并根据数据块个数和最后一块中有效数据长度计算出文件大小,写入i节点的di_size字段。

● 回写系统的索引节点表即可。

需要说明的是: 第一,系统分配数据块的算法因不同的Unix版本而不同; 第二,有的Unix如SCO Unix 5.0版,其空闲数据块的分配和回收是使用一种动态链表的数据结构来实现的,它们的文件恢复更加容易,只要在空闲链表中的表尾去寻找即可。

2. 根据内容恢复

若现场已被破坏,即硬盘发生过写操作,那么只好根据内容来恢复。而且,由于Unix是一个多进程、多用户系统,它每一次开关机或硬件、通信故障等都会记录系统日志、.sh_history等,硬盘现场被破坏的可能性极大。因此讨论按内容恢复的方法具有更大的实用价值。笔者经过实际探索得出下列四种恢复策略供参考。

● 关键字搜索法

如果知道被删除的文件内容中若干字节的内容,而且该文件长度又不超过一个磁盘块,那么可以在整个文件系统中搜索这一字节串,得出一个文件所在的数据块,将它们的块号填入一个i节点,即可恢复一个文件。搜索文件系统的算法很简单,说明如下: 首先,用“#df -k”命令确定文件系统的设备文件名(如/dev/root); 然后,用下述函数搜索,若成功,返回数据块号,反之返回-1。其中fsname是文件系统的设备名,如/dev/root,comp()参数是实现搜索条件的函数。

long searchfs(char *fsname , int comp())

{ FILE *fp;

char buf[1024];

long i=0;

fp=fopen(fsname,"r");

while (!feof(fp))

{ fread(buf,1024,1,fp);

if (comp()) /* 检查是否符合搜索条件 */

return i; /* 若成功返回块号 */

i++;

}

fclose(fp);

return -1; /* 未找到符合条件的块,返回-1*/ }

● 精确长度搜索法

如果知道被删除文件的精确长度(字节数),那么可根据一个数据块的大小,计算出文件的最后一个数据块中数据的精确长度,该数据块中其他字节必然是全0。根据这一条件,通过搜索整个文件系统,找出其中符合条件的数据块,若出现多个块符合要求,则还需要根据其他条件区分。但不管怎样,根据精确长度分析也是恢复数据的一个策略。

● 内容关联法

如果知道文件内容中存在某种可实现的关联,例如文件的校验和或者文件内容的某种上下文关系,那么也可通过搜索整个文件系统,通过反复尝试寻找符合关联条件的磁盘数据块,进而恢复一个文件。

● 环境比较法

如果知道删除文件所在的文件系统的安装过程,那么,另找一台完全相同的机器,按原来完全相同的步骤安装相同版本的Unix和相应的其他软件。可以想象,新的机器环境会与原来的环境基本相同,比较两个机器上相同文件系统的内容,可以推断出被删除文件的大致位置,至少可以大大减少查找的范围,一旦查找的范围足够小时,就可以用逐个观察和尝试的方法结合其他条件恢复数据,降低恢复的难度,增加恢复的可靠性。 (作者单位: 中国人民银行抚州市中心支行 )

链接

SCO Unix磁盘块分配算法

由于一个磁盘块的大小为1024字节,所以一个位图块可以管理0x400×8=0x2000个磁盘块。那么,下一个位图块的块号就是0x61d+0x2000=0x261d。这与位图索引块中的数据是相符的。那么,位图块0x61d管理着块号为0x61d-0x261c的磁盘块。由以上数据可见,在这个位图块中,第一个被使用的磁盘块块号是0x61d,即位图块本身。第一个空闲块块号由0x187401处字节0x1c的第2位指示,是0x627。由于该位图块是文件卷中的第一个位图块,所以0x627号磁盘块也是文件卷中的第一个空闲块。当我们向系统申请磁盘块时,系统通过超级块、位图索引块、位图块来寻找那些标志位为1的块,然后将相应的标置位置0。

当释放一个磁盘块时,系统就将相应的标志位置1。现在,我们就可以判断出文件卷中的每一个磁盘块是否被使用了。但是仅凭这些还不能完全恢复误删的文件,我们还得了解SCO Unix分配磁盘块的算法。为了使一个文件所占用的磁盘块相对集中,SCO Unix是按照特定的算法来选择空闲块分配给文件的。假设某文件所占用的最后一个磁盘块的块号为m,现在要再分配一磁盘块给该文件,若该文件是新文件,则m=0。



论坛活动:测测你对IT技术大会的了解指数(赠微软礼品、无忧币)
2007-12-2 17:342楼
[ 顶部 ]
 
snake_gz
禁止发言  点击可查看详细



帖子 64
精华 0
无忧币 5
积分 64
阅读权限 1
注册日期 2007-3-31
最后登录 2008-4-27 离线

[查看资料]  [发短消息
       
发表于:2008-4-27 20:13  *** 作者被禁止或删除 内容自动屏蔽 ***
2008-4-27 20:133楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号