linux系统文件删除原理

linux系统下文件名是存在父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再指向存放这个文件的block数据块。 
我们删除一个文件,实际上并不是清除了inode节点和block数据块。只是在这个文件的父目录里面的block中,删除了这个文件的名字,从而使这个文件名消失,并且无法指向这个文件的inode节点。 
当没有文件名指向这个inode节点的时候,会同时释放inode节点和存放这个文件的block数据块,并更新inode MAP和block MAP今后让这些位置可以用于放置其他文件数据。


文件删除控制的变量: 
i_link 文件的硬链接数量 
i_count 引用计数


当创建文件的硬链接的时候,对应的i_link数会增加。当一个文件被某一个进程引用时,对应i_count数就会增加。 
对于删除命令rm而言,实际就是减少i_link。那么如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,这会出现什么情况? 
用户执行rm操作文件后,再执行ls或其他文件管理命令,无法再找到这个文件了,但是调用这个被删除的文件的进程却在继续执行,依然能从文件中正确的读取及写入内容,这又是为什么呢? 
这是因为rm操作只是将i_link减少了,如果没有其他的链接i_link就为0了,但由于该文件依然被进程引用,因此文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_link及i_count都为0的时候,这个文件才会真正被删除。也就是说还需接解除该进程对这个文件的调用才行。 
那么当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删除的文件呢? 
rm操作只是将文件的i_link减少了,实际就是将文件名到inode的链接删除了。即使i_link减少到0了,此时并没有删除文件的实体(block数据块)。此时,如果即使停止机器工作,数据是可以找回的,如果此时继续写入数据,那么新数据就可能会被分配到被删除的block数据块,此时,文件就会被真正的回收了。

猜你喜欢

转载自blog.csdn.net/vic_qxz/article/details/80224347