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日志记录被新的数据轮替后,就凉了...)