Linux下删除命令 rm 大家肯定是熟悉得不能再熟悉了,然后有时候却阴沟里翻船不小心删除了某些重要的文件,想死的心都有了。。。。现在我们就来看看被误删除的文件要如何恢复?
Linux文件系统
Linux的文件系统(如ext3、ext4)由三部分组成:inode,data block,super block。Super block:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式和相关信息;
inode:记录 文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
block:实际记录文件的内容,如果文件比较大,会占用多个block;
每个inode和block都有编号,而每个文件都占用一个inode,inode内则有文件数据对应的block号码。因此,如果找到了文件的inode,自然就可以读取到文件的数据内容了。
当我们将一个文件删除时,Linux并非真实地删除磁盘里的数据,而是将文件的inode节点对于对应的扇区指针清除,同时释放这些数据对应的block,只有但这些block被系统重新分配时,那些被删除的数据才会被覆盖,最终无法恢复。
因为当我们误删数据时,应立刻卸载所在的文件系统,然后进行恢复。
Default
$ umount /dev/partition
$ mount -o remount,ro /dev/partition
1
2$umount/dev/partition
$mount-oremount,ro/dev/partition
grep
通过grep命令我们可以简单地进行文件恢复:
Default
grep -a -B 50 -A 60 'some string in the file' /dev/sda1 > results.txt
1grep-a-B50-A60'some string in the file'/dev/sda1>results.txt
说明:
Default
-a:把二进制文件当作文本文件
-A,-B:字符串的后几行和前几行
1
2-a:把二进制文件当作文本文件
-A,-B:字符串的后几行和前几行
不过grep命令比较麻烦的是,必须记得文件中的部分内容,而且如果有相同的其它文件也会被输出到result.txt,结果比较混乱;同时,由于是整个分区扫描,时间会比较漫长。
debugfs & extundelete
首先,我们先创建一个文件,然后将其删除:
Default
$ cat /proc/cpuinfo > /tmp/testrm.txt
$ rm /tmp/testrm.txt
1
2$cat/proc/cpuinfo>/tmp/testrm.txt
$rm/tmp/testrm.txt
使用系统自带的 debugfs 命令:
Default
$ sudo debugfs
debugfs: open /dev/sda2
debugfs: ls -d /tmp
1
2
3$sudodebugfs
debugfs:open/dev/sda2
debugfs:ls-d/tmp
可以看到被删除的文件testrm.txt,其中的<657573>就是文件的inode编号:
Default
……
<657573> (92) testrm.txt
……
1
2
3……
<657573>(92)testrm.txt
……
使用extundelete进行恢复:
Default
$ extundelete /dev/sda2 --restore-inode 657573
1$extundelete/dev/sda2--restore-inode657573
然后我们就可以在当前目录下的RECOVERED_FILES 目录看到恢复的文件了
Default
$ ls -al RECOVERED_FILES
-rw-r--r-- 1 root root 4.0K 7月 3 15:01 file.657573
1
2$ls-alRECOVERED_FILES
-rw-r--r--1rootroot4.0K7月315:01file.657573