linux怎么找回误删的文件,Linux:恢复被删除的文件

一、利用FD恢复

FD(文件描述符)是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符,linux的话fd一般位于"/proc/进程ID/fd"。如果被删除的文件正被某一进程打开,那么这种情况的恢复最为简单,只要通过FD来恢复就行。

示例:运行当中的apache访问日志被删

[root@localhost]# wc -l /etc/httpd/logs/access_log

0/etc/httpd/logs/access_log

[root@localhost]#lsof /etc/httpd/logs/access_log

COMMAND  PID  USER   FD   TYPE DEVICE SIZE   NODE NAME

httpd4888root   12w   REG 253,0    0 555517 /etc/httpd/../../var/log/httpd/access_log

访问1次后的记录数:

[root@localhostlogs]# wc -l /etc/httpd/logs/access_log

3/etc/httpd/logs/access_log

[root@localhost~]# echo "after rm" >> /etc/httpd/logs/access_log

删除:

[root@localhostlogs]# rm -f /etc/httpd/logs/access_log

[root@localhostlogs]# ls /etc/httpd/logs/access_log

ls:/etc/httpd/logs/access_log:没有那个文件或目录

再1次访问apache

恢复:

root@localhost~]# ll /proc/4888/fd

总计0

lr-x------1 root root 64 05-09 02:48 0 -> /dev/null

l-wx------1 root root 64 05-09 02:48 1 -> /dev/null

l-wx------1 root root 64 05-09 02:48 10 -> /var/log/httpd/error_log

l-wx------1 root root 64 05-09 02:48 11 -> /var/log/httpd/ssl_error_log

l-wx------1 root root 64 05-09 02:48 12 -> /var/log/httpd/access_log (deleted)

l-wx------1 root root 64 05-09 02:48 13 -> /var/log/httpd/ssl_access_log

l-wx------1 root root 64 05-09 02:48 14 -> /var/log/httpd/ssl_request_log

l-wx------1 root root 64 05-09 02:48 2 -> /var/log/httpd/error_log

lr-x------1 root root 64 05-09 02:48 3 -> /dev/urandom

lrwx------1 root root 64 05-09 02:48 4 -> socket:[16633]

lrwx------1 root root 64 05-09 02:48 5 -> socket:[16634]

lrwx------1 root root 64 05-09 02:48 6 -> socket:[16638]

lrwx------1 root root 64 05-09 02:48 7 -> socket:[16639]

lr-x------1 root root 64 05-09 02:48 8 -> pipe:[16659]

l-wx------1 root root 64 05-09 02:48 9 -> pipe:[16659]

[root@localhost~]#

[root@localhost~]# cp /proc/4888/fd/12 httpd_accesslog

[root@localhost~]# wc -l httpd_accesslog

7 httpd_accesslog

style=

可以看到删除后的访问记录也可以恢复

二、使用恢复工具

2.1 ext3grep

安装很简单,我用rhel5.4来测,直接用yum安装。

[root@localhost~]#mkfs.ext3 /dev/sdb1

[root@localhost~]#mount /dev/sdb1 /data

[root@localhost~]# cp extundelete-0.2.3.tar.bz2 /data

[root@localhost~]# cp extundelete-0.2.4.tar.gz  /data

[root@localhost~]# cp extundelete-0.2.4.tar.bz2 /data

[root@localhost~]# rm /data/*.bz2

[root@localhost~]# rm /data/*.gz

恢复:

umount分区

[root@localhost~]# umount /data

查看分区文件列表:

[root@localhost~]# ext3grep --ls --inode 2 /dev/sdb1

Runningext3grep version 0.10.2

WARNING:I don't know what EXT3_FEATURE_COMPAT_EXT_ATTR is.

Number ofgroups: 40

Loadinggroup metadata... done

Minimum /maximum journal block: 841 / 34478

Loadingjournal descriptors... sorting... done

Theoldest inode block that is still in the journal, appears to be from 1398895997= Thu May  1 06:13:17 2014

Number ofdescriptors in journal: 38; min / max sequence numbers: 2 / 10

Inode isAllocated

Loadingsdb1.ext3grep.stage2... done

The firstblock of the directory is 835.

Inode 2is directory "".

Directoryblock 835:

.-- File type in dir_entry (r=regularfile, d=directory, l=symlink)

|          .-- D: Deleted ; R: Reallocated

Indx Next|  Inode  | Deletion time                       Mode        File name

==========+==========+----------------data-from-inode------+-----------+=========

0    1d       2                                        drwxr-xr-x  .

1    2d       2                                        drwxr-xr-x  ..

2  endd      11                                        drwx------  lost+found

3    4r   49153 D 1398898164 Thu May  1 06:49:242014  rrw-r--r--  extundelete-0.2.3.tar.bz2

4  endr   49154 D 1398898164 Thu May  1 06:49:242014  rrw-r--r--  extundelete-0.2.4.tar.gz

5  endr   49155 D 1398898164 Thu May  1 06:49:242014  rrw-r--r--  extundelete-0.2.4.tar.bz2

标记为"D"的为被删掉的文件。

恢复文件:

[root@localhost~]# ext3grep --restore-all /dev/sdb1

Runningext3grep version 0.10.2

WARNING:I don't know what EXT3_FEATURE_COMPAT_EXT_ATTR is.

Number ofgroups: 40

Minimum /maximum journal block: 841 / 34478

Loadingjournal descriptors... sorting... done

Theoldest inode block that is still in the journal, appears to be from 1398895997= Thu May  1 06:13:17 2014

Number ofdescriptors in journal: 38; min / max sequence numbers: 2 / 10

Loadingsdb1.ext3grep.stage2... done

Restoringextundelete-0.2.3.tar.bz2

Restoringextundelete-0.2.4.tar.bz2

Restoringextundelete-0.2.4.tar.gz

用ex3grep恢复时会在当前目录创建一个名为RESTORED_FILES的目录用于存放恢复的数据

[root@localhost~]# ll RESTORED_FILES/

总计956

-rw-r--r--1 root root 108691 05-01 06:13 extundelete-0.2.3.tar.bz2

-rw-r--r--1 root root 108472 05-01 06:13 extundelete-0.2.4.tar.bz2

-rw-r--r--1 root root 722298 05-01 06:13 extundelete-0.2.4.tar.gz

drwx------2 root root   4096 05-01 06:10 lost+found

[root@localhost~]# cd RESTORED_FILES/

[root@localhostRESTORED_FILES]# ls

extundelete-0.2.3.tar.bz2  extundelete-0.2.4.tar.bz2  extundelete-0.2.4.tar.gz  lost+found

[root@localhostRESTORED_FILES]# tar jxvf extundelete-0.2.3.tar.bz2

extundelete-0.2.3/

extundelete-0.2.3/acinclude.m4

extundelete-0.2.3/missing

extundelete-0.2.3/autogen.sh

extundelete-0.2.3/aclocal.m4

extundelete-0.2.3/configure

......

2.2 extundelete

extundelete支持ext3和ext4文件系统

安装:

[root@localhost~]# yum search e2fsprogs e2fsprogs-devel

[root@localhost~]# tar jxvf extundelete-0.2.4.tar.bz2

[root@localhost~]# cd extundelete-0.2.4

[root@localhostextundelete-0.2.4]# ./configure --prefix=/opt/undelete

Configuringextundelete 0.2.4

Writinggenerated files to disk

[root@localhostextundelete-0.2.4]# make

make -sall-recursive

Makingall in src

extundelete.cc:105:警告:未使用的参数‘ret_flags’

extundelete.cc:571:警告:未使用的参数‘flags’

block.c:In function ‘extundelete_block_iterate3’:

block.c:840:警告:标号‘errout’定义后未使用

block.c:620:警告:未使用的变量‘r’

上面的警告不影响使用

[root@localhostextundelete-0.2.4]# make install

恢复:

[root@localhost~]# /opt/undelete/bin/extundelete --inode 2 /dev/sdb1

NOTICE:Extended attributes are not restored.

Loadingfilesystem metadata ... 40 groups loaded.

Group: 0

Contentsof inode 2:

0000 | ed41 00 00 00 10 00 00 35 87 61 53 35 87 61 53 | .A......5.aS5.aS

0010 | 3587 61 53 00 00 00 00 00 00 02 00 08 00 00 00 | 5.aS............

0020 | 0000 00 00 00 00 00 00 43 03 00 00 00 00 00 00 | ........C.......

0030 | 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................

0040 | 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................

0050 | 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................

0060 | 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................

0070 | 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................

Inode isAllocated

Filemode: 16877

Low 16bits of Owner Uid: 0

Size inbytes: 4096

Accesstime: 1398900533

Creationtime: 1398900533

Modificationtime: 1398900533

DeletionTime: 0

Low 16bits of Group Id: 0

Linkscount: 2

Blockscount: 8

Fileflags: 0

Fileversion (for NFS): 0

File ACL:0

DirectoryACL: 0

Fragmentaddress: 0

Directblocks: 835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

Indirectblock: 0

Doubleindirect block: 0

Tripleindirect block: 0

Filename              | Inode number      |Deleted status

.                              2

..                             2

lost+found                     11             Deleted

extundelete-0.2.3.tar.bz2      49153          Deleted

extundelete-0.2.4.tar.bz2      49154          Deleted

extundelete-0.2.4.tar.gz       49155          Deleted

[root@localhost~]# /opt/undelete/bin/extundelete --restore-all /dev/sdb1

NOTICE:Extended attributes are not restored.

Loadingfilesystem metadata ... 40 groups loaded.

Loadingjournal descriptors ... 25 descriptors loaded.

Searchingfor recoverable inodes in directory / ...

4recoverable inodes found.

Lookingthrough the directory structure for deleted files ...

0recoverable inodes still lost.

用extundelete恢复时会在当前目录创建一个名为RECOVERED_FILES的目录用于存放恢复的数据

[root@localhost~]# ls -lh  RECOVERED_FILES/

总计948K

-rw-r--r--1 root root 107K 05-01 07:30 extundelete-0.2.3.tar.bz2

-rw-r--r--1 root root 106K 05-01 07:30 extundelete-0.2.4.tar.bz2

-rw-r--r--1 root root 706K 05-01 07:30 extundelete-0.2.4.tar.gz

2.3使用photorec

如果不小心把磁盘给分区并格式化,这个时候可以使用photo来恢复,我很佩服这个工具的强大。

测试过程:

清空磁盘、从新分区格式化

[root@localhost~]# dd if=/dev/zero of=/dev/sdb

[root@localhost~]# fdisk /dev/sdb <

> n

> p

> 1

>

>

> wq

> EOF

[root@localhost~]# mkfs.ext3 /dev/sdb1

[root@localhost~]# cp  epel-release-5-4.noarch.rpm /disk/

[root@localhost~]# cp /u01/oracle/oradata/orcl/users01.dbf /disk/

[root@localhost~]# ll -h /disk/

总计5.2M

-rw-r--r--1 root root  12K 05-09 03:55epel-release-5-4.noarch.rpm

drwx------2 root root  16K 05-09 03:54 lost+found

-rw-r-----1 root root 5.1M 05-09 03:56 users01.dbf

目录disk有一个rpm包和一个oracle的数据文件

格式化磁盘

[root@localhost~]# mkfs.ext3 /dev/sdb1

#恢复过程:

photorec支持多种文件类型,如果需要恢复的文件类型不支持,那么就需要自已定义,比如上面的oracle数据文件。可以用fidentify来确认文件格式photorec是否支持。

[root@localhost~]# fidentify /u01/oracle/oradata/orcl/users01.dbf

/u01/oracle/oradata/orcl/users01.dbf:unknown

自定义文件格式

语法为:文件后缀 内容位置 内容

photorec自定义的文件格式位于当前执行目录的一个名为photorec.sig的文件中,如果没有这个文件则可以新建一个。

先确定oracle的数据文件头部内容:

[root@localhost~]# hexdump -C /u01/oracle/oradata/orcl/users01.dbf  |head

00000000  00 a2 00 00 00 00 c0 ff  00 00 00 00 00 00 00 00  |................|

00000010  e6 f8 00 00 00 20 00 00  80 02 00 00 7d 7c 7b 7a  |..... ......}|{z|

00000020  a0 81 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

*

00002000  0b a2 00 00 01 00 00 01  00 00 00 00 00 00 01 04  |................|

00002010  35 3d 00 00 00 00 00 00  00 01 20 0a 0d b6 e5 51  |5=........ ....Q|

00002020  4f 52 43 4c 00 00 00 00  9e 01 00 00 80 02 00 00  |ORCL............|

00002030  00 20 00 00 04 00 03 00  00 00 00 00 00 00 00 00  |. ..............|

00002040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

自定义photorec.sig

[root@localhost ~]# vi photorec.sig根据上面的信息输入以下内容

dbf 0 0x00a200000000c0ff0000000000000000

重新确认photorec是否支持

[root@localhost~]# fidentify /u01/oracle/oradata/orcl/users01.dbf

/u01/oracle/oradata/orcl/users01.dbf:dbf

新建一目录用来存放恢复出来的文件后开始恢复,实际中要注意此目录所在磁盘的剩余空间大小。

[root@localhost~]# mkdir res_pho

[root@localhost~]# photorec /dev/sdb

style=

processd->enter

style=

wholedisk File opt选择要恢复的文件类型

style=

按s取消全选并勾选需要恢复的文件类型

[X] customOwn custom signatures      --自定义的dbf文件

[X]rpm  RPM package --rpm包

选好后按enter返回

style=

[search]

style=

选择文件系统类型[ext2/ext3]

style=

选择恢复文件的存放目录,然后按c开始进行恢复

style=

恢复完成后可以到恢复目录查看,一般来说photorec是获取不到需恢复文件的文件名的,恢复的文件名会以扇区号命名。

[root@localhost~]# ls res_pho/recup_dir.1/

f0950423.rpm  f0983103.dbf report.xml

[root@localhost~]# rpm -qlp res_pho/recup_dir.1/f0950423.rpm

/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL

/etc/yum.repos.d/epel-testing.repo

/etc/yum.repos.d/epel.repo

/usr/share/doc/epel-release-5

/usr/share/doc/epel-release-5/GPL

[root@localhost~]# rpm -qlp epel-release-5-4.noarch.rpm

/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL

/etc/yum.repos.d/epel-testing.repo

/etc/yum.repos.d/epel.repo

/usr/share/doc/epel-release-5

/usr/share/doc/epel-release-5/GPL

从上可以看到2个文件都已经从格式化后的磁盘中恢复。

四、使用哪个软件好点?

此外还测过scalpel,foremost,ext4magic等,软件无分优劣,适用自己的就行,就个人来说,当有文件被删时,首先是用方法1来恢复就行;如果需要用到软件,那么用extundelete和ext3grep是相当好的选择,过程简单,并能使用原始文件名;如果磁盘、文件系统损坏或磁盘被分区格式化,那就使用photorec、scalpel或foremost

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值