使用过Linux的同学,一定都有过错误使用rm -rf命令的经过。一旦使用错误就会将宝贵的资源删除掉。如果后续的处理不当将会造成不可恢复的后果。本文将浅析Linux文件删除的原理,并提供一个简单的方法恢复被删除的文件。

文件删除的原理

所有的文件都是以二进制存储在磁盘上的一个磁盘块(称为磁盘节点)。我们每创建一个文件在磁盘上创建一个磁盘节点,并创建一个指针指向磁盘块。然后删除文件的时候,并不是删除磁盘节点,而是将指向磁盘节点的指针减一,当一个磁盘节点的指针减少到0之后,表示这个磁盘节点对应的文件已经没有引用了,那么这个磁盘节点就可以被其他的进程重写。当其他的进程将该磁盘块写完之后。文件内容才会彻底没有。所以理论上当其他进程没有完全写完一个磁盘节点的时候,被误删除的文件总是能够全部或者部分恢复。根据上面的文件删除过程我们可以按照文件恢复的难度划分为如下三个恢复点:

  • 1 文件的引用标识没有被删除到0的时候。此时被删除的文件可以完全恢复。
  • 2 文件的引用标识被删除到0了,但是其他进程没有重写此磁盘。理论上被删除的文件可以完全恢复。
  • 3 文件的引用标识被删除到0了,此磁盘块被其他进行重写了一部分。理论上被删除的文件可以部分恢复。

本文将介绍第一个阶段的文件如果恢复。注意要想被删除的文件状态停留在第一个阶段。必须有一个前提:占用被删除文件的进程没有被关闭!!!(所以删除文件之后一定要冷静,一定不要关机或者重启)如果占用被删除文件的进程以及被关闭。那么会直接进入,第二或者第三个阶段。恢复文件的难度要大大增加。目前我还在尝试处于第二或者第三阶段的文件恢复方法。如果成功。会在后面的文章之中继续更新。

下面是为啥不能关闭占用被删除文件的进程的原因:
Linux系统所有项目都是用文件来表示的包括系统的文件,端口,进程,Linux系统没启动一个进程都会在/proc目录下面建立一个文件夹,然后改进程的所有项目,都会在该文件夹下面用一个文件来表示。当执行rm -rf删除一个文件之后此时的文件对应的磁盘块的指针并没有减少到0。因为在/prco目录下面还会有对文件的指针。下面将以一个例子来介绍。如果利用这个文件的指针恢复被删除的文件。

误删除文件恢复详细教程

假设我们有一个Java进程(进程号:23245)在写一个日志文件catalina.out。我们就删除这个文件。然后讲述怎么恢复这个文件。
1 删除文件执行:

1
sudo rm -rf catalina.out


现在文件以及被删除了。此时占用次文件的进程并没有被关闭。所以此时磁盘节点的指针为1,不是0。
2 查看进程被删除的文件。但是文件指针大于0的文件。

可以看到:1标准输出,2标准错误输出都指向了这个文件。
3 执行恢复操作恢复文件。

4 查看test.out的内容发现test.out就是我们要恢复的catalina.out的文件的内容。
如果想要批量自动恢复文件读者可以自己写一个脚本。应该很简单了吧。