LinuxLinux学习之路

Linux下如何恢复被删除的文件

2020-07-22  本文已影响0人  QuietHeart

Linux删除文件最终调用的是 ulink 函数,该函数会将对应的文件删除,如果仍然有进程使用文件,那么只将对应目录项删除,数据仍旧可以在进程中访问,等进程退出后,数据就完全被删除了(没有可以访问的途径了)。

利用 ulink 的特性,我们也可以恢复一些被删除的文件(前提是文件还有其他进程在使用)。下面的例子中,我们结合lsof(可以查看一个进程打开的文件)恢复一个被删除的文件 test_recover ,如下:

1、查看当前文件

$ ls 
test_recover test_recover2 

$less test_recover 
goodfile 
it is very good!! 
it is used to test how to recover a deleted file with lsof.

这时候,文件还处于没有删除的状态,在这个状态下,我们使用 less 打开了文件,并把 less 置于后台。

2、删除文件 =test_recover =

$rm test_recover 

$ ls 
test_recover2

这样,我们已经将文件删除,但是由于 less 还在运行,所以这个文件虽然我们看不见了,但是 less 不知道它删除了, less 还是可以对文件进行读写的,也就是说这个文件的数据实际还存在于磁盘上。

3、查看删除的文件的信息

$lsof |grep test_recover 
less 22197 quietheart 4r REG  8,8  87  1837925 /home/quietheart/test/lsof_test/test_recover (deleted)

这里,通过 lsof 我们可以看到被删除的文件的信息。

4、根据删除文件的信息恢复删除的文件

$cd /proc/22197/fd 
$ ls 
0  1  2  3  4 

$cat 4 
goodfile 
it is very good!! 
it is used to test how to recover a deleted file with lsof. 

$ cat 4 >/home/quietheart/test/lsof_test/test_recover 
$ cd /home/quietheart/test/lsof_test/ 
$ ls 
test_recover  test_recover2 
$ cat test_recover 
goodfile 
it is very good!! 
it is used to test how to recover a deleted file with lsof.

根据前面 lsof 的信息,我们知道,被删除的文件实际就是 less 程序的文件描述符号4,根据此我们确定了要恢复的文件。使用 cat 对文件进行恢复。

总结

对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。

如前面所述,再总结一下,这样可以恢复文件,其原理是:当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。当文件删除时,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。 在 /proc 目录下,其中包含了反映内核和进程树的各种文件。 /proc 目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。 lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以 lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过 lsof/proc 目录下恢复该文件的内容。

上一篇下一篇

猜你喜欢

热点阅读