linux 恢复删除文件 恢复文件

linux 恢复删除文件 恢复文件

linux 误删除了文件怎么办

今天碰到了最倒霉的事情,dba把我一个月的工作量的db给他干掉了。原谅他吧,他也是IT的,也会失误的么,但是我也要付出不少代价,另一面也要感谢他,通过这件事学了些恢复删除文件的一些工具和知识。

几个参考文章:

http://www.ibm.com/developerworks/cn/linux/l-cn-filesrc/

http://simon-zzm.blog.163.com/blog/static/88809522201121675252891/

http://easwy.com/blog/archives/undelete-directories-files-on-ext3-filesystem-via-ext3grep/

http://hi.baidu.com/higkoo/item/9c435a436180b2a961d7b9db

linux管理员不小心rm了数据,会很郁闷,所以需要数据恢复。我记录个人的恢复实验结果。如果可以把硬盘拿下里挂载windows上可以试试Raise Data Recovery for Ext2/Ext3/Ext4、r-linux工具,其它工具也很多,但是收费的居多。用windows恢复后容易造成使用权限错误等问题,所以不能直接恢复到linux盘上使用。据说winpe里也可以用,但是我没有做实验,毕竟用winpe在服务器上也挺怪的。主要实验一下在linux上实际操作。TestDisk、PhotoRec、ext3grep。TestDisk主要用来恢复损坏的分区以及拯救无法引导的磁盘。PhotoRec 主要用于恢复损坏的数据文件和文档等。Ext3grep恢复大部分数据文件。

PhotoRec 下载地址

http://www.cgsecurity.org/wiki/PhotoRec

ext3grep下载地址

http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz

软件主站

http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html

先看ext3grep效果,我的分区如下

781656010327603123

在program下随便放了一个文档pdf。并且见了3个目录a\b\c,在a目录下放了一个txt文件。

# rm -rf 2011.pdf a/

把a目录和2011.pdf删除,删除完毕卸载/program分区,准备测试恢复。

首先安装或升级一下e2fsprogs、e2fslibs库,在CentOS中安装e2fsprogs库。如果是Ubuntu需要安装两个库,命令sudo apt-get install e2fsprogs e2fslibs-dev。我的实验环境是Centos。(任何恢复都需要安装此库)

#yum install  –y  e2fsprogs

# wget http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz

# tar zxvf ext3grep-0.10.2.tar.gz

# cd ext3grep-0.10.2

# ./configure

# make && make install

ext3grep主要参数:

–print   打印块、inode和所有信息

–ls      打印目录、过滤信息

–inode   从某个indoechazhao

–block   从某个块查找

–group  只找某个组

–after   找在某点时间后删除的数据

–before  找在某点时间前删除的数据

–restore-file  恢复文件到某个目录

–restore-all   恢复所有删除,删除的数据会在当前的RESTORED_FILES目录中

开始从第二个inode扫描删除的文件

# ext3grep /dev/sda4 –ls –inode 2

扫描完成如下图

878764877292652059

在第四列为inode值,第五列中写有D的就是被删除的文件。

使用一下命令我看看a目录下有什么东西,a目录的inode值为75777

# # ext3grep /dev/sda4 –ls –deteled –inode 75777

2620532033177448170

# ext3grep /dev/sda4 –restore-file a/123.txt

927741523239000169

 

看到Restoring 已经恢复成功,查看123.txt文件文件内容没有问题,但是pdf的没有成功,不知道为什么。又测试删除mysql数据库的数据,经过恢复的数据也可以使用。总体说效果挺好。

然后试试PhotoRec,官方说明能恢复格式如下:

- RIFF audio/video (.avi/.wav)

- BMP bitmap (.bmp)

- bzip2 compressed data (.bz2)

- Source code written in C (.c)

- Canon Raw picture (.crw)

- Canon catalog (.ctg)

- FAT subdirectory

- Microsoft Office Document (.doc)

- Nikon dsc (.dsc)

- HTML page (.html)

- JPEG picture (.jpg)

- MOV video (.mov)

- MP3 audio (MPEG ADTS, layer III, v1) (.mp3)

- Moving Picture Experts Group video (.mpg)

- Minolta Raw picture (.mrw)

- Olympus Raw Format picture (.orf)

- Portable Document Format (.pdf)

- Perl script (.pl)

- Portable Network Graphics (.png)

- Raw Fujifilm picture (.raf)

- Contax picture (.raw)

- Rollei picture (.rdc)

- Rich Text Format (.rtf)

- Shell script (.sh)

- Tar archive (.tar )

- Tag Image File Format (.tiff)

- Microsoft ASF (.wma)

- Sigma/Foveon X3 raw picture (.x3f)

- zip archive (.zip)

支持的磁盘格式如下:

- DOS/Windows FAT12, FAT16 and FAT32

- NTFS ( Windows NT/2K/XP )

- Linux Ext2 and Ext3

- BeFS ( BeOS )

- BSD disklabel ( FreeBSD/OpenBSD/NetBSD )

- CramFS (Compressed File System)

- HFS and HFS+, Hierarchical File System

- JFS, IBM’s Journaled File System

- Linux Raid

- Linux Swap (versions 1 and 2)

- LVM and LVM2, Linux Logical Volume Manager

- Netware NSS

- ReiserFS 3.5, 3.6 and 4

- Sun Solaris i386 disklabel

- UFS and UFS2 (Sun/BSD/…)

- XFS, SGI’s Journaled File System

试试看

# wget http://www.cgsecurity.org/testdisk-6.11.3.linux26.tar.bz2

# bunzip2 testdisk-6.11.3.linux26.tar.bz2

# tar xvf testdisk-6.11.3.linux26.tar

# cd /root/testdisk-6.11.3/linux

# ./testdisk_static

2804053717992853070

 

英文提示很简。测试了一下图片格式恢复没有问题,其它格式没有试,但是名称都变成索引名了,有点不方便。

还存在一个问题就是ext4格式。ext4在rehdat5中已经支持,但是需要安装e4fsprogs,在redhat6中已经是默认安装,所以将来使用ext4的几率也很大。Ext3grep工具在ext4下已经无能为力,所以需要其它工具的支持。上网上找找是否会有ext4grep,发现了http://tjworld.net/wiki/Linux/Ext4Undelete,没有搞清楚。

介绍较多的是extundelete。

extundelete的下载地址

http://extundelete.sourceforge.net/

651614571086704276

首先安装e2fsprogs和e2fslibs,然后编译

# cd extundelete-0.2.0

# ./configure

# make

不安装了直接用

#cd src

# /extundelete /dev/sda9 –restore-all

应该是我系统内核版本太低,虽然支持ext4,但软件恢复却没有成功。内核2.6.28以上的应该没有问题。Fedora上有人测试过没有问题,redhat和centos就应该没有问题。

试试PhotoRec是否可以恢复ext4的盘。步骤抓图如下:

启动

2834734490454345123

 

选择磁盘

2294865485123992200

 

选择好分区类型

2170453545417925534

 

选择要恢复的盘

615867249044332534

 

不知道为什么支持了,和介绍里说的不一样,选第一项

1264948545338969263

 

选第一项

1563593495628865312

 

选择恢复后的路径,直接点y,保存到当前目录的recup_dir.1目录中

2737907098465594499
       进入recup_dir.1目录查看jpg文件恢复了,并且可以使用,但是名称有变化了。pdf的好像没有成功。
3071454945868043722

照目前看txt等文本类和图片类的恢复也没有问题,但是只能靠grep在去找那个是需要的文件了。

 

经验总结:

使用rm需要格外小心(会出人命的)。在不小心删除后,最好及时卸载分区,避免数据覆盖写入。如果必须挂载,可以使用只读模式。

 

===========================================

10个G的数据被误删除了,差点崩溃,试遍了所有常规恢复软件,无用,就要放弃的时候,发现了ext3grep这个开源东东!

顺利恢复所有数据,所以linux下数据删除并不可怕,可怕的是删除后没有恢复的方法,看看下面的操作吧!

[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
其实什么版本的系统无所谓 !

所需的相关库
[root@localhost ~]# rpm -qa |grep e2fsprogs
e2fsprogs-libs-1.39-8.el5
e2fsprogs-1.39-8.el5
e2fsprogs-devel-1.39-8.el5

必须要有e2fsprogs-libs,不然在后面ext3grep的安装会有问题。

分区情况:
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
6.2G 1.8G 4.2G 30% /
/dev/sda1 99M 11M 83M 12% /boot
/dev/mapper/VolGroup00-LogVol02
1008M 34M 924M 4% /data
tmpfs 125M 0 125M 0% /dev/shm

需要软件
http://code.google.com/p/ext3grep/downloads/list

先下载软件
[root@localhost ~]# cd /root/src/
[root@localhost src]# wget http://ext3grep.googlecode.com/files/ext3grep-0.6.0.tar.gz src
[root@localhost src]# ls
ext3grep-0.6.0.tar.gz
[root@localhost src]# tar xfvz ext3grep-0.6.0.tar.gz
[root@localhost ext3grep-0.6.0]# ./configure
[root@localhost ext3grep-0.6.0]# make install
[root@localhost ext3grep-0.6.0]# ext3grep
Running ext3grep version 0.6.0

编译然后测试可以使用了,一切做好了以后开始我们的恢复过程。
我的目录是/data分区,我先格式化了分区,我放一个文件在根目录下和一个子目录下的文件。

/dev/mapper/VolGroup00-LogVol02 1008M 34M 924M 4% /data

下面斜体部分不是必须的:

其实这里用什么分区倒是无所谓,也可以模拟一个出来,下面是模拟步骤:

1.        mkdir /data1/
2.        cd /data1/
3.        dd if=/dev/zero of=disk1 count=2048000
4.        mkfs.ext3 disk1
5.        mkdir -p /dfs/a
6.        mount -o loop /data1/disk1 /dfs/a

这里,我们用/data分区,先拷贝些文件过去
[root@localhost ~]# ]# cp /bin/ls /data/
[root@localhost ~]# ]# cp -rf /bin /data/
[root@localhost ~]# ]# ls -la /data/
total 136
drwxr-xr-x 4 root root 4096 Apr 21 17:37 .
drwxr-xr-x 25 root root 4096 Apr 21 17:11 ..
drwxr-xr-x 2 root root 4096 Apr 21 17:37 bin
drwx—— 2 root root 16384 Apr 21 17:15 lost+found
-rwxr-xr-x 1 root root 93560 Apr 21 17:37 ls

[root@localhost ~]#
一个子目录一个可执行文件

现在删除ls文件和bin下面的zcat
[root@localhost ~]# rm /data/ls
rm: remove regular file `/data/ls’? y
[root@localhost ~]# rm /data/bin/zcat
rm: remove regular file `/data/bin/zcat’? y
[root@localhost ~]# ls -la /data/ls /data/bin/zcat
ls: /data/ls: No such file or directory
ls: /data/bin/zcat: No such file or directory

文件没有了然后我们来恢复:
首先必须umount掉误删除数据的分区:
[root@localhost ~]# umount /dev/mapper/VolGroup00-LogVol02
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
6.2G 1.8G 4.2G 30% /
/dev/sda1 99M 11M 83M 12% /boot
tmpfs 125M 0 125M 0% /dev/shm

确认卸载,然后使用ext3grep来恢复。

[root@localhost ~]# ext3grep  /dev/mapper/VolGroup00-LogVol02 –ls –inode 2
这里会创建扫描分区

[root@localhost ~]# ext3grep /dev/mapper/VolGroup00-LogVol02 –ls –inode 2
[root@localhost ~]# ext3grep /dev/mapper/VolGroup00-LogVol02 –restore-file ls
Running ext3grep version 0.6.0
WARNING: I don’t know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
Number of groups: 8
Minimum / maximum journal block: 585 / 8787
Loading journal descriptors… sorting… done
Number of descriptors in journal: 58; min / max sequence numbers: 2 / 5
Loading VolGroup00-LogVol02.ext3grep.stage2… done
Restoring ls
[root@localhost ~]# ext3grep /dev/mapper/VolGroup00-LogVol02 –restore-file bin/ls
Running ext3grep version 0.6.0
WARNING: I don’t know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
Number of groups: 8
Minimum / maximum journal block: 585 / 8787
Loading journal descriptors… sorting… done
Number of descriptors in journal: 58; min / max sequence numbers: 2 / 5
Loading VolGroup00-LogVol02.ext3grep.stage2… done
Restoring bin/ls
[root@localhost ~]# ls -la RESTORED_FILES/
total 124
drwxr-xr-x 3 root root 4096 Apr 21 18:01 .
drwxr-x— 5 root root 4096 Apr 21 17:55 ..
-rwxr-xr-x 1 root root 93560 Apr 21 17:48 ls
[root@localhost ~]# ext3grep /dev/mapper/VolGroup00-LogVol02 –restore-file bin/zcat
Running ext3grep version 0.6.0
WARNING: I don’t know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
Number of groups: 8
Minimum / maximum journal block: 585 / 8787
Loading journal descriptors… sorting… done
Number of descriptors in journal: 58; min / max sequence numbers: 2 / 5
Loading VolGroup00-LogVol02.ext3grep.stage2… done
Restoring bin/zcat
[root@localhost ~]# ls -la RESTORED_FILES/bin/
total 188
drwxr-xr-x 2 root root 4096 Apr 21 18:01 .
drwxr-xr-x 3 root root 4096 Apr 21 18:01 ..
-rwxr-xr-x 1 root root 62136 Apr 21 17:48 zcat

看看都恢复在RESTORED_FILES目录下,大小也一样,这里RESTORED_FILES目录是执行ext3grep的当前目录下!

也可以使用:

ext3grep /termite/cc-disk –restore-all

恢复所有文件和目录,但是目录的话,如果删除时间较长,不一定能完全恢复,压缩文件一般都能恢复。

如果想详细的了解ext3grep,可以到它的的HOW TO页去看看:

http://carlo17.home.xs4all.nl/howto/undelete_ext3.html

========================================

如何在linux下恢复被误删除的文件

http://www.lishiming.net/thread-444-1-1.html

注:本文转自互联网
【场景】

Tencent:/data # df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda1             9.9G  1.6G  7.9G  17% /

udev                 1011M  120K 1011M   1% /dev

/dev/sda3              20G  240M   19G   2% /usr/local

/dev/sda4              42G  129M   40G   1% /data

Tencent:/data # cd  test

Tencent:/data/test # ls -lrt

total 800

-rw-r–r– 1 root root 814739 May 20 14:45 rtagent.tar.gz

Tencent:/data/test # rm rtagent.tar.gz  (假设这个是个误操作)

我们现在要做的,就是恢复/data/test/rtagent.tar.gz这个文件。

【停止写入】大家应该都清楚,在ext2/ext3中,删除文件操作只是将该文件的节点做删除标记,并没有实际删除该文件的内容块;但是如果有新内容写入,就很有可能覆盖掉这些内容块,所以,一旦发生误删除的情况,必须马上停止向磁盘写入,方法可以是umoun掉该磁盘。

【安装ext3grep】接下来,我们需要在服务器上安装ext3grep这个工具:ext3grep-0.10.1.tar.gz;安装这个工具之前,必须安装好e2fsprogs-devel:e2fsprogs-devel-1.38-25.30.i586.rpm,可以用通用的安装方法进行安装,这里就不介绍了。

【扫描磁盘】先让ext3grep扫描文件所在磁盘,获取磁盘的inode和对应内容信息(包括标记为删除的inode)(在/usr/local目录下执行,后面会解析为什么):

Tencent:/usr/local # ext3grep /dev/sda4   –ls  –inode 2   (inode=2表示的是最顶层的inode)

Running ext3grep version 0.10.1

Number of groups: 341

Loading group metadata… done

Minimum / maximum journal block: 522 / 33841

Loading journal descriptors… sorting… done

The oldest inode block that is still in the journal, appears to be from 1240191984 = Mon Apr 20 09:46:24 2009

Journal transaction 3642 wraps around, some data blocks might have been lost of this transaction.

Number of descriptors in journal: 29110; min / max sequence numbers: 1423 / 5763

Inode is Allocated

Finding all blocks that might be directories.

D: block containing directory start, d: block containing more directory entries.

Each plus represents a directory start that references the same inode as a directory start that we found previously.

Searching group 1:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Searching group 2:

Searching group 3:

Searching group 4:

Searching group 5:

Searching group 6:

。。。。。

。。。。。

。。。。。

.– File type in dir_entry (r=regular file, d=directory, l=symlink)

|          .– D: Deleted ; R: Reallocated

Indx Next |  Inode   | Deletion time                        Mode        File name

==========+==========+—————-data-from-inode——+———–+=========

0    1 d       2                                         drwxr-xr-x  .

1    2 d       2                                         drwxr-xr-x  ..

2    3 d      11                                         drwx——  lost+found

3    4 d  719489                                         drwxrwxrwx  corefile

4    5 d 1684257                                         drwxr-xr-x  test

5  end r   49057                                         rrw-r–r–  2

6  end r   49058  D 1242805686 Wed May 20 15:48:06 2009  rrw——-  tmp_agent_9RowP3

最后面的是扫描的结果。

扫描完成之后,会在执行命令当前目录下生成2个文件:sda4.ext3grep.stage1和sda4.ext3grep.stage2。这两个文件应该是包含了该磁盘的所有inode信息,下次再运行ext3grep命令的时候,都会从2个文件里面去寻找结果(所以别删除,否则又得扫描一次。。。时间挺久的,不过如果希望重新扫描,请删除这两个文件)。

【寻找文件】这个时候,我们就要寻找刚才被误删的rtagent.tar.gz文件了。可以通过如下方式,一步步的找到改文件:从上面的结果中我们可以看到被删除文件所在目录test的inode是1684257,所以执行:ext3grep /dev/sda4   –ls  –inode 1684257

Tencent:/usr/local # ext3grep /dev/sda4   –ls  –inode 1684257
Running ext3grep version 0.10.1
WARNING: EXT3_FEATURE_INCOMPAT_RECOVER is set. This either means that your partition is still mounted, and/or the file system is in an unclean state.
Number of groups: 341
Minimum / maximum journal block: 522 / 33841
Loading journal descriptors…

sorting… done
The oldest inode block that is still in the journal, appears to be from 1240191984 = Mon Apr 20 09:46:24 2009
Journal transaction 3642 wraps around, some data blocks might have been lost of this transaction.
Number of descriptors in journal: 29109; min / max sequence numbers: 1423 / 5767
Inode is Allocated
Loading sda4.ext3grep.stage2… done
The first block of the directory is 3405824.
Inode 1684257 is directory “test”.
Directory block 3405824:
.– File type in dir_entry (r=regular file, d=directory, l=symlink)
|          .– D: Deleted ; R: Reallocated
Indx Next |  Inode   | Deletion time                        Mode        File name
==========+==========+—————-data-from-inode——+———–+=========
0    1 d 1684257                                         drwxr-xr-x  .
1  end d       2                                         drwxr-xr-x  ..
2  end r 1684258  D 1242802212 Wed May 20 14:50:12 2009  rrw-r–r–  rtagent.tar.gz

看到了看到了,被删除的文件找到了,而且标记的确是为D。

【恢复文件】执行如下命令可以恢复这个文件:ext3grep /dev/sda4   –restore-file  test/rtagent.tar.gz

该文件现在已经被恢复到了当前目录下的RESTORED_FILES中,所以执行该命令的时候,一定要保证当前分区有足够的空间,这就是之前为什么要在/usr/local下面执行所有的操作的原因:

当然,我们还可以指定inode进行恢复。

至此,该文件恢复完成。

在实际操作中,以下信息可能对操作者有用:

1、  扫描磁盘时,磁盘可以不umount,而是以只读的方式mount(mount的时候带上-r参数),这样只读的业务可以继续提供服务。

2、  恢复文件的时候,如果指定inode进行恢复,恢复出来的文件将以inode.***作为文件名。

3、  目前还没有找到批量恢复一批文件的方法,不过可以用–restore-all参数进行全恢复。

4、  如果被删除的文件本身就在根分区,考虑到恢复本身会写跟分区,安全起见,还是建议立即停机,并将硬盘拔插到另外一台服务器上进行恢复。

5、  如果文件个数太多,恢复成功的概率比较小,我在恢复5W多个文件的时候,使用–restore-all参数进行全恢复,最终只恢复了600多个。。。

6、  更多参数含义请参考ext3grep –help

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>