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
中包含的是 PID
为 1234
的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。 lsof
程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以 lsof
可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过 lsof
从 /proc
目录下恢复该文件的内容。
网友评论