linux不像windows有个回收站,使用rm -rf *基本上文件是找不回来的。

那么问题来了:
对于linux下误删的文件,我们是否真的无法通过软件进行恢复呢?

答案当然是否定的,对于误删的文件,我们还是能通过软件恢复过来的。对于误删文件还原可以分为两种情况:

  • 一种是删除以后在进程存在删除信息
  • 一种是删除以后进程都找不到,只有借助于工具还原。

接下来以例子分别解说下两种不同的误删还原方式:

误删除文件进程还在的情况:
这种一般是有活动的进程存在持续标准输入或输出,到时文件被删除后,进程PID依旧存在。这也是有些服务器删除一些文件但是磁盘不释放的原因。

打开一个终端对一个测试文件做cat追加操作:

  1. [root@docking ~]# echo "This is DeleteFile test." > deletefile.txt
  2. [root@docking ~]# ls
  3. deletefile.txt
  4. [root@docking ~]# cat >> deletefile.txt
  5. Add SomeLine into deletefile for fun.

打开另外一个终端查看这个文件可以清楚看到内容:

  1. [root@docking ~]# ls
  2. deletefile.txt
  3. [root@docking ~]# cat deletefile.txt
  4. This is DeleteFile test.
  5. Add SomeLine into deletefile for fun.

此时,删除文件rm -f deletefile.txt

  1. [root@docking ~]# rm -f deletefile.txt
  2. [root@docking ~]# ls
  3. #命令查看这个目录,文件已经不存在了,那么现在我们将其恢复出来。
  • lsof查看删除的文件进程是否还存在。
  • 如没有安装请自行yum install lsof或者apt-get install lsof
    1.类似这种情况,我们可以先lsof查看删除的文件 是否还在
  1. [root@docking ~]# lsof | grep deletefile
  2. cat 21796 root 1w REG 253,1 63 138860 /root/deletefile.txt (deleted)

2.恢复cp /proc/pid/fd/1 /指定目录/文件名
进入 进程目录,一般是进入/proc/pid/fd/,针对当前情况:

  1. [root@docking ~]# cd /proc/21796/fd
  2. [root@docking fd]# ll
  3. 总用量 0
  4. lrwx------ 1 root root 64 1 18 22:21 0 -> /dev/pts/0
  5. l-wx------ 1 root root 64 1 18 22:21 1 -> /root/deletefile.txt (deleted)
  6. lrwx------ 1 root root 64 1 18 22:21 2 -> /dev/pts/0

恢复操作:

  1. [root@docking fd]# cp 1 ~/deletefile.txt.backup
  2. [root@docking fd]# cat ~/deletefile.txt.backup
  3. This is DeleteFile test.
  4. Add SomeLine into deletefile for fun.

3.恢复完成。


误删除的文件进程已经不存在,借助于工具还原
准备一些文件目录

  1. #准备一份挂载的盘
  2. mkdir backuptest
  3. cd backuptest
  4. mkdir deletetest
  5. mkdir deletetest/innerfolder
  6. echo "Delete a folder test." > deletetest/innerfolder/deletefile.txt
  7. echo "tcpdump:x:172:72::/:/sbin/nologin" > tmppasswd

最后准备的目录结构如下:

  1. taroballs@taroballs-PC:/media/taroballs/taroballs/backuptest$ cd ..
  2. taroballs@taroballs-PC:/media/taroballs/taroballs$ tree backuptest/
  3. backuptest/
  4. ├── deletetest
  5. └── innerfolder
  6. └── deletefile.txt
  7. └── tmppasswd
  8. 2 directories, 2 files

现在开始删除该目录rm -rf backuptest/

  1. taroballs@taroballs-PC:/media/taroballs/taroballs$ rm -rf backuptest/
  2. taroballs@taroballs-PC:/media/taroballs/taroballs$ ls -l
  3. 总用量 0

这种情况一般是没有守护进行或者后台进程对其持续输入,所以删除就真的删除了。lsof也看不到,故需要采用工具进行恢复。


现在开始进行误删除文件的恢复。

我们采用的工具是extundelete第三方工具。恢复步骤以及注意事项如下:

  • 停止对当前分区做任何操作,防止inode被覆盖。inode被覆盖基本就告别恢复了。
  • 夸张一点讲,比如停止所在分区的服务,卸载目录所在的设备,有必要的情况下都可以断网。
  • 通过dd命令对 当前分区进行备份,防止第三方软件恢复失败导致数据丢失。
  • 适合数据非常重要的情况,这里是例子,所以就没有备份,如备份可以考虑如下方式:dd if=/path/filename of=/dev/vdc1
  • 通过umount命令,对当前设备分区卸载。或者fuser 命令umount /dev/vdb1
  • 如果提示设备busy,可以用fuser命令强制卸载:fuser -m -v -i -k ./
  • 下载第三方工具extundelete安装,搜索误删除的文件进行还原

extundelete工具安装

  1. wget https://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2

解压该文件tar jxvf extundelete-0.2.4.tar.bz2

若报这种错误

  1. [root@docking ~]# tar jxvf extundelete-0.2.4.tar.bz2
  2. tar (child): bzip2:无法 exec: 没有那个文件或目录
  3. tar (child): Error is not recoverable: exiting now
  4. tar: Child returned status 2
  5. tar: Error is not recoverable: exiting now

则使用yum -y install bzip2进行解决

  1. [root@docking ~]# tar jxvf extundelete-0.2.4.tar.bz2
  2. extundelete-0.2.4/
  3. extundelete-0.2.4/acinclude.m4
  4. extundelete-0.2.4/missing
  5. extundelete-0.2.4/autogen.sh
  6. extundelete-0.2.4/aclocal.m4
  7. extundelete-0.2.4/configure
  8. extundelete-0.2.4/LICENSE
  9. extundelete-0.2.4/README
  10. ...................................................
  1. cd extundelete-0.2.4
  2. ./configure

若这步骤报错

  1. [root@docking extundelete-0.2.4]# ./configure
  2. Configuring extundelete 0.2.4
  3. configure: error: in `/root/extundelete-0.2.4':
  4. configure: error: C++ compiler cannot create executables
  5. See `config.log' for more details

则使用yum -y install gcc-c++解决.

若执行上一步仍然报错,

  1. [root@docking extundelete-0.2.4]# ./configure
  2. Configuring extundelete 0.2.4
  3. configure: error: Can't find ext2fs library

则使用yum -y install e2fsprogs e2fsprogs-devel来解决。
#Ubuntu的解决办法为sudo apt-get install e2fslibs-dev e2fslibs-dev

不出意外的话到这里应该configure能够顺利完成.

  1. [root@docking extundelete-0.2.4]# ./configure
  2. Configuring extundelete 0.2.4
  3. Writing generated files to disk
  4. [root@docking extundelete-0.2.4]#

最后make然后 make install

  1. [root@docking extundelete-0.2.4]# make
  2. make -s all-recursive
  3. Making all in src
  4. extundelete.cc: 在函数‘ext2_ino_t find_inode(ext2_filsys, ext2_filsys, ext2_inode*, std::string, int)’中:
  5. extundelete.cc:1272:29: 警告:在 {} 内将‘search_flags’从‘int’转换为较窄的类型‘ext2_ino_t {aka unsigned int}’ [-Wnarrowing]
  6. buf, match_name2, priv, 0};
  7. ^
  8. [root@docking extundelete-0.2.4]# make install
  9. Making install in src
  10. /usr/bin/install -c extundelete '/usr/local/bin'

extundelete安装完成.


扫描误删除的文件:

使用df -lh查看挂载:

  1. taroballs@taroballs-PC:~$ df -lh
  2. 文件系统 容量 已用 可用 已用% 挂载点
  3. udev 1.9G 0 1.9G 0% /dev
  4. tmpfs 387M 1.8M 385M 1% /run
  5. /dev/sda2 92G 61G 26G 71% /
  6. tmpfs 1.9G 49M 1.9G 3% /dev/shm
  7. tmpfs 5.0M 4.0K 5.0M 1% /run/lock
  8. tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
  9. /dev/sda3 104G 56G 44G 57% /home
  10. tmpfs 387M 40K 387M 1% /run/user/1000
  11. /dev/sda4 70G 20G 47G 30% /media/taroballs/d8423f8c-d687-4c03-a7c8-06a7fb57f96d
  12. /dev/sdb1 6.8G 4.1G 2.8G 60% /media/taroballs/taroballs
  13. /dev/sr0 4.0G 4.0G 0 100% /media/taroballs/2018-01-16-12-36-00-00
  14. taroballs@taroballs-PC:~$ cd /media/taroballs/taroballs/
  15. taroballs@taroballs-PC:/media/taroballs/taroballs$

可以看到,我们的目录/media/taroballs/taroballs
挂载到/dev/sdb1 这个文件系统中.


umount我们的挂载盘
比如:

  1. taroballs@taroballs-PC:~$ df -lh | grep /dev/sdb1
  2. /dev/sdb1 6.8G 4.1G 2.8G 60% /media/taroballs/taroballs

umount这个目录

  1. taroballs@taroballs-PC:~$ umount /media/taroballs/taroballs
  2. taroballs@taroballs-PC:~$ df -lh | grep /dev/sdb1
  3. taroballs@taroballs-PC:~$
  4. #记得删除一定要后umount哦,不然二次写入谁也帮不了你呢。

通过inode节点恢复

  1. taroballs@taroballs-PC:~$ mkdir recovertest
  2. taroballs@taroballs-PC:~$ cd recovertest/
  3. taroballs@taroballs-PC:~/recovertest$

执行恢复extundelete /dev/sdb1 --inode 2

  1. taroballs@taroballs-PC:/media/taroballs/taroballs$ sudo extundelete /dev/sdb1 --inode 2
  2. NOTICE: Extended attributes are not restored.
  3. Loading filesystem metadata ... 8 groups loaded.
  4. Group: 0
  5. Contents of inode 2:
  6. .
  7. .省略N
  8. File name | Inode number | Deleted status
  9. . 2
  10. .. 2
  11. deletetest 12 Deleted
  12. tmppasswd 14 Deleted

通过扫描发现了我们删除的文件夹,现在执行恢复操作。
(1)恢复单一文件tmppasswd

  1. taroballs@taroballs-PC:~/recovertest$ extundelete /dev/sdb1 --restore-file passwd
  2. NOTICE: Extended attributes are not restored.
  3. Loading filesystem metadata ... 8 groups loaded.
  4. Loading journal descriptors ... 46 descriptors loaded.
  5. Successfully restored file tmppasswd

恢复文件是放到了当前目录RECOVERED_FILES。
查看恢复的文件:

  1. taroballs@taroballs-PC:~/recovertest$ cat tmppasswd
  2. tcpdump:x:172:72::/:/sbin/nologin

(2)恢复目录deletetest

  1. extundelete /dev/sdb1 --restore-directory deletetest
  2. NOTICE: Extended attributes are not restored.
  3. Loading filesystem metadata ... 8 groups loaded.
  4. Loading journal descriptors ... 46 descriptors loaded.
  5. Searching for recoverable inodes in directory deletetest ...
  6. 5 recoverable inodes found.
  7. Looking through the directory structure for deleted files ...

(3)恢复所有

  1. taroballs@taroballs-PC:~/recovertest$ extundelete /dev/sdb1 --restore-all
  2. NOTICE: Extended attributes are not restored.
  3. Loading filesystem metadata ... 8 groups loaded.
  4. Loading journal descriptors ... 46 descriptors loaded.
  5. Searching for recoverable inodes in directory / ...
  6. 5 recoverable inodes found.
  7. Looking through the directory structure for deleted files ...
  8. 0 recoverable inodes still lost.
  9. taroballs@taroballs-PC:~/recovertest$ tree
  10. backuptest/
  11. ├── deletetest
  12. └── innerfolder
  13. └── deletefile.txt
  14. └── tmppasswd
  15. 2 directories, 2 files

(4)恢复指定inode

  1. taroballs@taroballs-PC:~/recovertest$ extundelete /dev/sdb1 --restore-inode 14
  2. NOTICE: Extended attributes are not restored.
  3. Loading filesystem metadata ... 8 groups loaded.
  4. Loading journal descriptors ... 46 descriptors loaded.
  5. taroballs@taroballs-PC:~/recovertest$ cat file.14
  6. tcpdump:x:172:72::/:/sbin/nologin
  7. #注意恢复inode的时候,恢复 出来的文件名和之前不一样,需要单独进行改名。

最后附上extundelete的用法:

  1. $ extundelete --help
  2. Usage: extundelete [options] [--] device-file
  3. Options:
  4. --version, -[vV] Print version and exit successfully.
  5. --help, Print this help and exit successfully.
  6. --superblock Print contents of superblock in addition to the rest.
  7. If no action is specified then this option is implied.
  8. --journal Show content of journal.
  9. --after dtime Only process entries deleted on or after 'dtime'.
  10. --before dtime Only process entries deleted before 'dtime'.
  11. Actions:
  12. --inode ino Show info on inode 'ino'.
  13. --block blk Show info on block 'blk'.
  14. --restore-inode ino[,ino,...]
  15. Restore the file(s) with known inode number 'ino'.
  16. The restored files are created in ./RECOVERED_FILES
  17. with their inode number as extension (ie, file.12345).
  18. --restore-file 'path' Will restore file 'path'. 'path' is relative to root
  19. of the partition and does not start with a '/'
  20. The restored file is created in the current
  21. directory as 'RECOVERED_FILES/path'.
  22. --restore-files 'path' Will restore files which are listed in the file 'path'.
  23. Each filename should be in the same format as an option
  24. to --restore-file, and there should be one per line.
  25. --restore-directory 'path'
  26. Will restore directory 'path'. 'path' is relative to the
  27. root directory of the file system. The restored
  28. directory is created in the output directory as 'path'.
  29. --restore-all Attempts to restore everything.
  30. -j journal Reads an external journal from the named file.
  31. -b blocknumber Uses the backup superblock at blocknumber when opening
  32. the file system.
  33. -B blocksize Uses blocksize as the block size when opening the file
  34. system. The number should be the number of bytes.
  35. --log 0 Make the program silent.
  36. --log filename Logs all messages to filename.
  37. --log D1=0,D2=filename Custom control of log messages with comma-separated
  38. Examples below: list of options. Dn must be one of info, warn, or
  39. --log info,error error. Omission of the '=name' results in messages
  40. --log warn=0 with the specified level to be logged to the console.
  41. --log error=filename If the parameter is '=0', logging for the specified
  42. level will be turned off. If the parameter is
  43. '=filename', messages with that level will be written
  44. to filename.
  45. -o directory Save the recovered files to the named directory.
  46. The restored files are created in a directory
  47. named 'RECOVERED_FILES/' by default.

Linux恢复误删除的文件或者目录(转)的更多相关文章

  1. Linux恢复误删除的文件或者目录

    文章转载自:https://www.jianshu.com/p/662293f12a47 linux不像windows有个回收站,使用rm -rf *基本上文件是找不回来的. 那么问题来了: 对于li ...

  2. 如何在Linux上恢复误删除的文件或目录

    Linux不像windows有那么显眼的回收站,不是简单的还原就可以了.linux删除文件还原可以分为两种情况,一种是删除以后在进程存在删除信息,一种是删除以后进程都找不到,只有借助于工具还原,这里分 ...

  3. linux下恢复误删除的文件方法(ext2及ext3)

     linux下恢复误删除的文件方法(ext2及ext3) 2009-12-19 15:23:47 分类: LINUX 如果是ext2文件系统的,直接用debugfs是可以恢复出来的,但对于ext3,d ...

  4. Linux中找回误删除的文件

    Linux中找回误删除的文件 作为一个多用户.多任务的Linux操作系统,会出现在没有备份的情况下将一些用户文件误删的情况,Linux下的文件一旦被删除,是难以恢复的.尽管删除命令只是在文件节点中作删 ...

  5. linux系统下修改文件夹目录权限

    linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...

  6. Linux命令(20)linux服务器之间复制文件和目录

    linux的scp命令: scp就是secure copy的简写,用于在linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 有时我们需要获得远程服务器上 ...

  7. 在linux服务器之间复制文件和目录命令scp

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  8. Linux常用命令之文件和目录处理命令

    目录 1.Linux命令的普遍语法格式 2.目录处理命令 一.显示目录文件命令:ls 二.创建目录命令:mkdir 三.切换目录命令:cd 四.shell内置命令和外部命令的区别 五.显示当前目录命令 ...

  9. Linux系列教程(四)——Linux常用命令之文件和目录处理命令

    这个系列教程的前面我们讲解了如何安装Linux系统,以及学习Linux系统的一些方法.那么从这篇博客开始,我们就正式进入Linux命令的学习.学习命令,首先要跟大家纠正的一点就是,我们不需要记住每一条 ...

随机推荐

  1. keras神经网络做简单的回归问题

    咸鱼了半个多月了,要干点正经事了. 最近在帮老师用神经网络做多变量非线性的回归问题,没有什么心得,但是也要写个博文当个日记. 该回归问题是四个输入,一个输出.自己并不清楚这几个变量有什么关系,因为是跟 ...

  2. 【转】package control安装成功,但是ctrl+shiif+p调不出来面板,preference里面也没有Package Control

    原文:http://blog.csdn.net/fangfanggaogao/article/details/54405866 sublime text2 用了很长很长时间了,和package con ...

  3. composer 自动加载(php-amqplib)

    最近要使用RabbitMQ 做消息队列,也是刚接触到.因为用的的TP框架,comoser又下载不下来,所以只能手动下载拓展包,做手动加载,在php-amqplib是我手动下载下来的拓展包,创建一个co ...

  4. 利用pom配置实现静态文件拷贝

    java项目有时候需要将一些静态文件拷贝到生成的test-class文件夹或者其他地方,虽然手动拷贝可以做到,但是很麻烦.今天主要讲解如何利用pom.xml进行动态的拷贝. 具体的配置信息如下,在de ...

  5. 通讯录管理系统(C语言)

    /* * 对通讯录进行插入.删除.排序.查找.单个显示功能 */ #include <stdio.h> #include <malloc.h> #include <str ...

  6. git(二) 分支管理

    概念 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇 ...

  7. 银行卡卡bin

    卡BIN指的是发卡行识别码,英文全称是 Bank Identification Number,缩写为 BIN.中文即“银行识别代码”  银行卡的卡号是标识发卡机构和持卡人信息的号码 一般是13-19位 ...

  8. 发现sql注入的一些技巧

    1.如果一个'导致错误,试着查看\'能否成功(因为反斜杠在MySQL中取消了单引号)2.你也可以尝试注释掉,--',看页面返回是否正常.3.如果正常的输入只是一个整数,你可以尝试减去一些量,然后查看减 ...

  9. SharedPreference映射Java类

    package com.overlook.weagree.util; import android.app.Activity; import android.content.Context; impo ...

  10. js中!和!!的区别及用法

    js中!的用法是比较灵活的,它除了做逻辑运算常常会用!做类型判断,可以用!与上对象来求得一个布尔值,1.!可将变量转换成boolean类型,null.undefined和空字符串取反都为false,其 ...