【文件存储原理】
Linux下删除文件并不是真实的删除磁盘分区中的文件,而是将文件的 inode 节点中的扇区指针清除,同时释放这些数据对应的数据块,当释放的数据块被操作系统重新分配时,那些被删除的数据就会被覆盖,所以误删除数据后,应马上卸载文件所在的分区
每个文件由 inode 和 block 组成, inode 是文件系统组成的最基本单元,它保存着文件的基本属性(大小、权限、属主组等)和存放的位置信息。而block用来存储数据。类似 key-value , inode 就是 key , block 对应 value ,通过 key 查找 key 对应的 value
查询根目录/的inode值:
ls -id /
ls -id /test

【安装extundelete软件】
方法一:
yum -y install e2fsprogs e2fsprogs-libs e2fsprogs-devel
cd /server/tools
yum -y install wget
wget http://zy-res.oss-cn-hangzhou.aliyuncs.com/server/extundelete-0.2.4.tar.bz2
也可以登录官网下载软件:
https://extundelete.sourceforge.net/
安装解压工具:
yum list bzip2
yum -y install bzip2
tar -xvjf extundelete-0.2.4.tar.bz2
chown root:root -R extundelete-0.2.4
(bzip2 -dk extundelete-0.2.4.tar.bz2 解压后不删除原文件)
安装gcc和c++环境:
yum install gcc
yum install gcc-c++
进行软件配置和预编译、编译:
cd extundelete-0.2.4
./configure
make
make install

方法二:
查看yum源:
yum list | grep extundelete
yum install -y extundelete
【删除恢复测试】
在数据被误删除后,第一时间要做的是卸载被删除数据所在的磁盘或磁盘分区,如果是系统根分区的数据遭到误删除,就需要将系统进入单用户,并且将根分区以只读模式挂载。
这样做的原因很简单,因为将文件删除后,仅仅是将文件的 inode 结点中的扇区指针清零, 实际文件还存储在磁盘上,如果磁盘以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据块被新的数据覆盖后,这些数据就真的丢失了,恢复工具也无力回天。
所以,以只读模式挂载磁盘可以尽量降低数据块中数据被覆盖的风险, 以提高恢复数据成功的比率
1、删除测试文件

2、恢复被误删除的文件
首先要先卸载挂载分区防止数据写入后将原先的数据覆盖掉
umount /test
或者将分区挂载为只读:
mount -o remount,ro /dev/sdb
使用 fuser 命令查看哪些用户的那些进程在使用该目录:
fuser -mv /test

查找分区中的数据:
extundelete /dev/sdb
查询恢复数据信息:
extundelete /dev/sdb --inode 2

extundelete 除了支持恢复单个文件,也支持恢复单个目录,在需要恢复目录时,通过“–restore-directory”选项即可恢复指定目录的所有数据
extundelete /dev/sdb --restore-directory /test
恢复全部数据:
extundelete /dev/sdb --restore-all
NOTICE: Extended attributes are not restored.
Loading filesystem metadata … 64 groups loaded.
Loading journal descriptors … 38 descriptors loaded.
Searching for recoverable inodes in directory / …
1 recoverable inodes found.
Looking through the directory structure for deleted files …
0 recoverable inodes still lost.
ll RECOVERED_FILES/
-rw-r–r–. 1 root root 6 Feb 23 12:55 delete
extundelete 恢复单个文件的参数是“–restore-file”,这里需要注意的是,“–restore-file”后面指定的是 恢复文件路径,这个路径是文件的相对路径。相对路径是相对于原来文件的存储路径而言的,比如,原来文件的存储路径是/data/passwd,那么在参数 后面直接指定passwd 文件即可,如果原来文件的存储路径是/data/test/mytest.txt,那么在参数后面通过“test/mytest.txt”指定即可
extundelete /dev/sdb --restore-file passwdxxx
删除被恢复的数据放在目录:
RECOVERED_FILES
重新挂载分区为 可读写:
mount -o remount,rw /dev/sdb
【补充说明】
Usage: extundelete [options] [--] device-file
--superblock 打印指定分区的超级块信息。如不加任何的参数,此选项是默认的.
例:extundelete --superblock /dev/sdb1
--journal 显示块的日志信息,同--superblock。
--after dtime 只恢复指定时间【dtime】(时间戳)之后,被删除的数据
例:假如删除的时间大概是2011-7-26 14:30
[root@nfs ~]# date -d "Jul 26 14:30" +%s
1469514600 #得出秒数 1234567890
extundelete /dev/sdb1 --after 1234567890 --restore-all 恢复此时间后删除的所有文件
--before dtime 只恢复指定时间【dtime】(时间戳)之前,被删除的数据
Actions:
--inode ino 显示某分区inode为x的信息,一般是查看该分区下所有的文件.
--block blk 显示某分区block为x的信息.
--restore-inode ino[,ino,...] 恢复一个或多个指定inode号的文件,该恢复的文件,保存在当前目录下的RECOVERED_FILES里,文件名为【file.$inode】
例:extundelete /dev/sda1 --restore-inode 13,14
--restore-file 'filename' 恢复指定的文件(被删除的),文件位于当前目录下的RECOVERED_FILES/$filename,文件名还是原来的
例:extundelete /dev/sda1 --restore-file initramfs-2.6.32-358.el6.x86_64.img
--restore-files 'read_filename' 恢复指定的文件(真实存在的)中的内容,文件位于当前目录下的RECOVERED_FILES/$filename,文件名还是原来的
例:vi test_restore.txt(结尾不可有多余的空格)
System.map-2.6.32-358.el6.x86_64
config-2.6.32-358.el6.x86_64
命令:extundelete /dev/sda1 --restore-files test_restore.txt
--restore-directory 'dir-name' 恢复指定的目录,文件位于当前目录下的RECOVERED_FILES/$dir-name,文件名还是原来的
--restore-all 恢复某分区里所有被删除的数据,文件名还是原来
写在最后:
神话是人生的隐喻,每个人身上,都隐藏着自己独特的英雄力量(神话学大师 坎贝尔)
你每天学习一点点,每天只进步1%,一年以后你的水平值是多少呢?
37.78(1.01×365=37.78)
相信概率,不要相信运气,在过程中提升概率
《礼记·中庸》:凡事豫则立,不豫则废。言前定则不跲,事前定则不困,行前定则不疚,道前定则不穷