• 隐藏侧边栏
  • 展开分类目录
  • 关注微信公众号
  • 我的GitHub
  • QQ:1753970025
Chen Jiehua

Linux rm 文件恢复 

目录

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被系统重新分配时,那些被删除的数据才会被覆盖,最终无法恢复。

因为当我们误删数据时,应立刻卸载所在的文件系统,然后进行恢复。

$ umount /dev/partition 
$ mount -o remount,ro /dev/partition

grep

通过grep命令我们可以简单地进行文件恢复:

grep -a -B 50 -A 60 'some string in the file' /dev/sda1 > results.txt

说明:

-a:把二进制文件当作文本文件
-A,-B:字符串的后几行和前几行

不过grep命令比较麻烦的是,必须记得文件中的部分内容,而且如果有相同的其它文件也会被输出到result.txt,结果比较混乱;同时,由于是整个分区扫描,时间会比较漫长。

debugfs & extundelete

首先,我们先创建一个文件,然后将其删除:

$ cat /proc/cpuinfo > /tmp/testrm.txt
$ rm /tmp/testrm.txt

使用系统自带的 debugfs 命令:

$ sudo debugfs
debugfs: open /dev/sda2
debugfs: ls -d /tmp

可以看到被删除的文件testrm.txt,其中的<657573>就是文件的inode编号:

……
<657573> (92) testrm.txt
……

使用extundelete进行恢复:

$ extundelete /dev/sda2 --restore-inode 657573

然后我们就可以在当前目录下的RECOVERED_FILES 目录看到恢复的文件了

$ ls -al RECOVERED_FILES
-rw-r--r-- 1 root root 4.0K 7月   3 15:01 file.657573
码字很辛苦,转载请注明来自ChenJiehua《Linux rm 文件恢复》

评论