对于linux下误删的文件,我们是否真的无法通过软件进行恢复呢?
这种一般是有活动的进程存在持续标准输入或输出,到时文件被删除后,进程PID依旧存在。这也是有些服务器删除一些文件但是磁盘不释放的原因
> vim rumenz.txt
123
//保存退出
> cat rumenz.txt
123
tail -f
打开rumenz.txt
文件目的是让
rumenz.txt
被删除后,进程依然存在
> tail -f rumenz.txt
rumenz.txt
> rm -f rumenz.txt
rumenz.txt
的进程> lsof | grep delete | grep rumenz
tail 10222 root 3r REG 253,1 4 70911074 /root/test/rumenz.txt (deleted)
进程ID是10222,从上面可以看出,当前文件状态为已删除(deleted)
> cd /proc/10222/fd
> ls -al
dr-x------ 2 root root 0 May 11 21:41 .
dr-xr-xr-x 9 root root 0 May 11 21:41 ..
lrwx------ 1 root root 64 May 11 21:41 0 -> /dev/pts/1
lrwx------ 1 root root 64 May 11 21:41 1 -> /dev/pts/1
lrwx------ 1 root root 64 May 11 21:41 2 -> /dev/pts/1
lr-x------ 1 root root 64 May 11 21:41 3 -> /root/test/rumenz.txt (deleted)
lr-x------ 1 root root 64 May 11 21:41 4 -> anon_inode:inotify
开始恢复文件
> cp 3 /root/test/rumenz.txt
> cat /root/test/rumenz.txt
123
当程序运行时,操作系统会专门开辟一块内存区域,提供给当前进程使用,对于依赖的文件,操作系统会发放一个文件描述符,以便读写文件,当我们执行
rm -f
删除文件时,其实只是删除了文件的目录索引节点,对于文件系统不可见,但是对于打开它的进程依然可见,即仍然可以使用先前发放的文件描述符读写文件,正是利用这样的原理,所以我们可以使用I/O重定向的方式来恢复文件。