一、被删除的文件正在被进程使用:
当某个文件正在被某个程序使用时,linux针对该文件有回两个计数器:
i_count计数器:该文件可能被多个进程使用,每一个进程使用该文件,i_count数值都会加1。反之,进程释放该文件的引用,则该计数器减1。
一般是有活动的进程存在持续标准输入或输出,到时文件被删除后,进程PID依旧存在。这也是有些服务器删除一些文件但是磁盘不释放的原因。
另外一种情况就是当以上两个计数器都为0的时候,该文件实际上就是属于没有进程使用它的状态,就直接被删除掉了。如果有进程使用它,那么该文件的i_count数值不为0,就可以在/proc/<进程id>/fd目录种找回来。
1、实验准备:
①终端1创建一个文件lyg.txt:
②终端2另外一个终端一直tail -f(注意这个地方使用tailf不可行)这个文件,达到文件一直被tail进程占用的目的:
③终端1上删除此lyg.txt文件:
2、恢复测试:
①使用lsof命令查看已经被删除的文件:
在上面lsof返回结果中可以识别出到lyg.txt (deleted)被删除了,这时还存在一个进程tail占用它,tail进程的进程编号是4372,我们按照返回的结果拼接已删除的文件残留的路径为/proc/4372/fd下。
②恢复,即使用cp命令,将我们识别到的3拷贝到原目录:
二、被删除的文件没有进程使用,使用extundelete、testdisk等三方工具恢复数据:
此时没有进程使用被删除的文件,被删除的文件的两个计数器i_count和i_link此时都为0。其实文件删除可以分为以下情况:
操作系统文件删除:操作系统层面的删除文件,只是删除文件的inode信息。删除inode信息之后,该文件对于操作系统及操作系统的用户不可见了。
磁盘文件物理删除:我们知道物理磁盘是由一个个数据块组成的,所以如果想恢复文件,我们需要找到存放文件的数据块block单元,真正在磁盘上存储文件的block暂时并未被删除(暂时并未被覆盖掉)。
1、所以当文件被误删除了,请立即采集以下基础操作:
①为了防止inode被覆盖掉,一定要停止对当前分区做任何操作,例如可以卸载分区umount /dev/sda3,卸载不掉请看这个umount报错设备繁忙(device is busy)怎么处理?_承缘丶的博客-CSDN博客_umount 设备忙。
②看情况停止所在分区的服务,甚至卸载其目录所在的运行设备等。
③看情况为了保险可以通过dd命令对其分区进行备份,防止数据丢失,再加一层保护:
dd if=/pldpath/filename of=/dev/sda4
2、三方工具推荐:
①适用于FAT16、 FAT32、 exFAT (FAT64)、 NTFS、ext2/3/4、xfs等的工具“testdisk”。