Linux文件删除过程浅析

为什么Linux删除文件那么快

Posted by Leon Ling on October 9, 2019

Linux 系统下做文件删除操作的时候经常发现文件的删除, 移动速度很快. 下面就简单从文件管理的角度分析其中的原因.

linux 是通过link的数量控制文件删除的,只有当文件不存在任何链接时,该文件才会被删除,一般每个文件有两个link计数器: i_count 和 i_nlink,从VFS inode结构体中可以找到:

1
2
3
4
5
6
7
8
9
struct inode {
	struct hlist_node i_hash;   /* hash链表的指针 */
	struct list_head i_list;    /* backing dev IO list */
	struct list_head i_sb_list; /* 超级块的inode链表 */
	struct list_head i_dentry;  /* 引用inode的目录项对象链表头 */
	unsigned long i_ino;        /* 索引节点号 */
	atomic_t i_count;           /* 引用计数器 */
	unsigned int i_nlink;       /* 硬链接数目 */
}

i_count: 引用计数器,文件被一进程引用,i_count数增加 ,可以认为是当前文件使用者的数量; i_nlink: 硬链接数目(可以理解为磁盘的引用计数器),创建硬链接对应的 i_nlink 就会增加

对于 rm 命令来说,实际就是减少磁盘的引用计数 i_nlink 。当 i_nlink 和 i_count 均为 0 时,文件才会被删除(这里的删除是指将文件名到 inode 的链接删除了,但文件在磁盘上的block数据块并未被删除)。

拓展:linux下如何删除文件夹而不删除文件夹里的内容?

  1. 先打开文件夹中的所有文件,然后可以 rm -rf 删除文件夹,文件还可继续访问。
  2. 先硬连接所有文件到其它目录,然后也可以 rm -rf 删除文件夹,文件还可继续访问。

以上两个方法,在删除文件夹时,内容都是保留的,只不过前一个方法在程序退出时仍然会删除,如果当前运行的那个程序是唯一能继续访问该文件的程序的话。

实际上一个已经打开的文件本身也可以视为一个临时的硬连接。一个文件可以存在多个硬连接,只有当多个硬连接全部被删除时其内容才会被删除。

或者从某种意义上讲,即便不能继续访问,一个文件的内容也并不会被删除,除非你是使用的擦除,当然这就涉及到磁盘数据恢复相关知识了。