Linux文件删除和恢复原理

Linux文件系统基础

Linux系统通过inode来寻找文件,在Linux中,inode是文件的身份证号,每个文件都只对应一个inode。inode记录了文件的权限属性等元数据,而文件的实际数据存放在data block中,文件所指向存储其实际数据的data blocks的指针也存放在inode中,因此Linux系统可以通过文件的inode来收集文件的实际数据。

而在Linux中目录也是文件,目录的inode节点指向的data block的内容是该目录下所有文件的文件名与inode对应关系。

因此系统一般通过用户输入的文件名找到文件的inode节点,再通过文件的inode节点找到文件的data blocks。

Linux文件系统的实现 https://www.cnblogs.com/wanao/p/12937675.html

Linux文件删除原理

rm命令对inode的操作

  • 系统将文件的i_link - 1,后若文件的链接数小于1,则释放该文件的inode节点;
  • 释放存储该文件内容的data blocks(将这些数据块标记为可用);
  • 删除记录这个文件名和inode节点号的目录记录。

系统没有真正删除这一文件中的数据,只有这些已释放的数据块被重用其中数据被覆盖时,原文件数据才算删除掉。

删除原理

Linux通过link的数量来控制文件的删除,只有当一个文件的link数为0时,该文件才算被删除掉。

每个文件有两个link计数器:i_link & i_count:

  • i_link:硬链接的数量(磁盘)
  • i_count:文件被调用的数量(内存)

当一个文件在被进程调用时,使用rm命令将该文件删除(i_link=0),此时调用该文件的进程一滩能够正常进行,因为此时文件的i_count不为0,故系统没有真正删除文件。

可见只有当i_link和i_count都为0的时候,文件的inode被系统回收,才算是真正删除。

eg:

[root@localhost Desktop]# touch test
[root@localhost Desktop]# dd if=/dev/zero of=test bs=1M &  
[1] 10900
[root@localhost Desktop]# jobs
[1]+  Running                 dd if=/dev/zero of=test bs=1M &
[root@localhost Desktop]# rm -rf test 
[root@localhost Desktop]# jobs
[1]+  Running                 dd if=/dev/zero of=test bs=1M &

Linux文件恢复原理

rm命令操作只是将i_link的数量-1(解除文件名与inode之间的联系),但并没有删除data blocks,因此如果及时停止工作,避免原文件的数据块被其它文件占用,仍可以找回数据。

在 ext3 和 ext4文件系统中,文件通过inode指向数据块存放的位置,当文件被删除后,inode数据指针被清零回收,数据块内容还在但是无法通过inode进行组合。此时可以通过ext3和ext4文件系统中的元数据在日志文件中的备份来进行恢复(注意日志的切割和轮替,当操作过多,删除文件的inode日志记录被新的数据轮替后,就凉了...)

猜你喜欢

转载自www.cnblogs.com/wanao/p/12980669.html