技巧之:恢复linux被误删文件(方案有3)

一、首先我们先来了解下文件删除原理:

1)

linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count和i_nlink。

2)当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

3) 当你发现你误删除了文件后,要做的第一件事是马上卸载被误删除文件所在的分区,或者以只读的方式来挂载该分区。原因大家都很清楚,文件被删除后,文件中的数据还存在磁盘上,除非存放这些数据的数据块又被操作系统分配出去了。我们这一步就是尽量降低数据块中数据被覆盖的风险,以提高恢复数据成功的比率。

二、了解完后,实战演练

方案1)现在我向大家介绍使用extundelete恢复文件(适合rhel6.X系统的ext4)

#上传extundelete-0.2.4.tar.bz2包传到/usr/local/src下

#tar -jxvf  extundelete-0.2.4.tar.bz2

# cd extundelete-0.2.4

#./configure (这步出现错误,请看下文)

#mount /dev/cdrom /mnt

#rpm -ivh  /mnt/Packages/e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm
 (必须安装否则,前面./configure报错)

#./configure (成功)

make && make install

软件安装完毕,下面我们来恢复文件吧

1)我先创建一个恢复目录

mkdir recover

cd recover

extundelete  /dev/sda4 --inode  2  (看到你所删除的文件)

#extundelete  /dev/sda4 -restore-inode 15 (按对应的节点来恢复文件)

#extundelete  /dev/sda4 -restore-file  a.txt   (按对应文件名来恢复文件)

#extundelete  /dev/sda4 -restore-dirctory etc  (按对应的目录,这里我以etc目录)

##extundelete  /dev/sda4 -restore-all (全部恢复)

方案2)使用lsof自带一个的神秘功能

原理:大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中

假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法

如下:

首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:

# lsof |grep /var/log/messages

syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)


上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为
2。同时还可以看到/var/log

/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2
(fd下的每个以数字命名的文件表示

进程对应的文件描述符)中查看相应的信息,如下:

# head -n 10 /proc/1283/fd/2

Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.

Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.

Aug
4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8
([email protected])

(gcc version 4.2.0) #1 SMP Wed Jul
18 11:18:32 EDT 2007 Aug 4 13:50:15 holmes86 kernel:

BIOS-provided
physical RAM map: Aug 4 13:50:15 holmes86 kernel: BIOS-e820:

0000000000000000 - 000000000009f000 (usable) Aug 4 13:50:15 holmes86
kernel: BIOS-e820:

000000000009f000 - 00000000000a0000 (reserved) Aug 4
13:50:15 holmes86 kernel:

BIOS-e820: 0000000000100000 - 000000001f7d3800
(usable) Aug 4 13:50:15 holmes86 kernel:

BIOS-e820: 000000001f7d3800 -
0000000020000000 (reserved) Aug 4 13:50:15 holmes86

kernel: BIOS-e820:
00000000e0000000 - 00000000f0007000 (reserved) Aug 4 13:50:15

holmes86
kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)

从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述

符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:
cat /proc/1283/fd/2 > /var/log/messages

对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。

方案3)使用ext3grep恢复文件(适合rhel5.X系统的ext3)

#上传ext3grep-0.10.1.tar.gz包传到/usr/local/src下

#tar -jxvf  ext3grep-0.10.1.tar.gz

# cd ext3grep-0.10.1

#./configure (成功)

make && make install

软件安装完毕,下面我们来恢复文件吧

1)我先创建一个恢复目录

mkdir recover

cd recover

ext3grep /dev/your-device --restore-filepath/to/your/file/filename

需要注意的是,上面的文件路径,是在该分区上文件路径。假设我们要恢复/dev/sda3分区上文件,这个分区原来的安装点是/home,现在想恢复文件/home/easwy/vi/tips.xml,那么输入的命令应该是:

ext3grep /dev/sda3--restore-file easwy/vi/tips.xml

所有恢复的文件都会放在当前目下在RESTORED_FILES目录下,大小也一样,这里RESTORED_FILES目录是执行ext3grep的当前目录下

如果你忘记了文件名,或者你误删除的是一个目录而你无法记全该目录中的文件,你可以先用下面的命令查询一下文件名:

ext3grep /dev/sda3 --dump-names | tee filename.txt

上面的命令把ext3grep命令的输出记录到文件filename.txt中,你可以慢慢查看,或者使用grep命令过滤出你需要的信息。

当你知道了目录/文件的信息后,就可以用上面说的命令进行恢复了。

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

ext3grep /termite/cc-disk --restore-all

ext3grep /dev/sda3  --ls --inode 2 创建扫描分区文件:sda5.ext3grep.stage1和sda5.ext3grep.stage2

如果想要重新生成可以删除这个两个文件,再次执行这条命令。另外当第一次执行ext3grep /dev/sda3 --restore-file test/a.txt进行还原时也会自动生成扫描分区文件。

时间: 2024-10-27 00:03:41

技巧之:恢复linux被误删文件(方案有3)的相关文章

Linux下误删文件恢复

资深的Linux玩家,一般不会误删文件,就算误删文件,往往提前做过备份.如果有像我一样的菜鸟误删文件并且没有备份的话该怎么办呢?我就故作高深的讲讲. 在Linux中有许多文件修复工具,在咱51cto上有大师介绍过,我就不多说,我就把我的方法介绍一下吧!我用的是debugfs工具. 具体步骤如下: 1.删除任一文件 2.查看你删除文件所在的磁盘,我的在/dev/sda2. 3.启动debugfs(在命令行输入debugfs即可),并打开删除文件所在的分区,我的是/dev/sda2 4.查找删除文件

Ubuntu中恢复rm命令误删文件(转)

计算机系统:Ubuntu 16.04 1 背景 在做项目的时候,本来想使用rm命令删除以14开头的文件,结果写成如下形式: [cpp] view plain copy rm 14 * 注意,本来14和*之间不应该有空格的,但是误写了一个空格,结果导致所有文件都被删除了!为了找回被误删的文件,根据网上的一些资料进行探索. 2 ext3grep [cpp] view plain copy sudo apt-get install ext3grep 参考资料[4]中对这个工具的使用有比较详细的说明过程

多学一点(十二)——使用extundelete恢复Linux下误删除文件

通常来说,对于重要文件我们都应该定期备份(如 /etc 下的配置文件),以免在喝醉了手残了等异常状态下将重要文件误删除.然而,如果意外真的发生,而我们又没有做好备份,那赶紧试试手动恢复吧,这里使用的文件恢复软件为 extundelete . 1.重新挂载分区为只读状态: 这是恢复文件的第一步,也是最关键的步骤之一.假如我们误删除的文件为 /data/catalina.out , /data 目录为 /dev/sdb5 的挂载点,因为对分区的写操作可能会导致我们恢复文件失败,所以要将该分区重新挂载

如何恢复u盘误删文件,看完就不会觉得自己很菜了

在工作和生活中,U盘发挥着不可替代的作用,别看它体积小,但是却能保存大量的数据,厉害着呢.但是一切都是两面的,U盘虽然能保存很多数据,但是却不能让数据一直安全的存在,一个不小心就能将文件删除. U盘里面的文件删除了,没有回收站,那么怎么恢复文件呢?这就需要用到U盘数据恢复软件了,推荐使用Ontrack EasyRecovery这款软件,毕竟是全能的,能恢复各种文件. 图1:U盘文件恢复 EasyRecovery软件获取地址:http://wm.makeding.com/iclk/?zoneid=

Linux下恢复误删文件:思路+实践

周五篮球群里有人问误删文件了怎么恢复,得知是ext4文件系统之后我推荐了ext4magic这个工具,然后又有人提到了xfs的话怎么办,正好前几天看到Dave Chinner在邮件列表里提到了这个问题,他推荐的工具是xfs_irecover.这里就稍微总结一下Linux下误删文件如何恢复. 1. 当发现误删了文件之后,立即把文件系统卸载掉,或者remount成ro状态,就是不要再写了,让数据不要被其他数据覆盖.因为大部分文件系统在删除文件的时候只是把这个文件标记成删除,把文件所使用的数据块标记成可

ext3 文件系统中误删文件的恢复方法

如果oracle进程已经关闭,无法再通过利用ora_进程跟踪文件句柄进行恢复,那么还有无方法来对误删除的文件进行恢复呢?下面介绍一下用第三方软件进行恢复 --首先确保已经安装了e2fsprogs包 [[email protected] ext3grep-0.10.2]# rpm -qa | grep e2fsprogs e2fsprogs-1.39-20.el5 e2fsprogs-devel-1.39-20.el5 e2fsprogs-libs-1.39-20.el5 --软件下载: http

Linux Ext3、Ext4误删文件恢复 extundelete

使用linux难免遇到误删文件的情况,使用extundlete 即可恢复误删文件 记下操作流程:1. 安装Linux数据恢复软件extundelete需要依赖两个包 sudo aptitude install e2fsprogs e2fslibs-dev 下载页面http://extundelete.sourceforge.net/ 快速下载: download extundelete 编译三部曲 ./configuremakesudo make install 2.如果分区已经挂载,先umou

linux 误删文件后 恢复

LINUX误删文件后,为了把损失降低到最低,进行如下操作: 一:卸载或者以只读的方式挂载需要恢复的分区: example:  umount  /dev/sdb1      #卸载挂载的sdb1 二:安装extundelete   (需要epel源进行支持) example:yum -y install extundelete 三:查看sdb1分区里文件对应的inode example:extundelete /dev/sdb1  --inode 2 文件名    inode    deltete

linux下误删数据文件恢复

linux下文件被删除可以用很多工具进行恢复,例如undelete(适合ext2,ext3).giis(不能恢复安装giis之前的文件).ext3grep(仅限ext3).R-linux(支持ext3,但是需要操作系统是32位的).还有testdisk等等就不一一介绍了.需要注意的是,我们误删文件后,最好保持现场. 下面不用工具来恢复误删的数据文件: [email protected]>select * from zbdba; select * from zbdba * ERROR at lin