ext 文件系统中的文件何时被释放?

ext 文件系统中的文件何时被释放?

介绍

直到最近,我认为在 ext 文件系统上,inode 具有引用计数器,用于计算目录条目或文件描述符引用文件的次数。

然后,我了解到引用计数器只计算引用它的目录条目的数量。为了伪造这一点,我使用 读取视频文件的引用计数ls -l。正如我所料,它是 1,因为我没有创建任何附加的硬链接。然后我用视频播放器打开视频文件并再次执行相同的命令。令我惊讶的是,引用计数仍然是1。因此,我伪造失败了。

但是,在删除唯一的目录条目后,我绝对可以继续观看视频。打开大视频文件并删除其目录条目时,文件系统上的可用存储空间量不会改变。仅当播放器到达视频末尾并关闭文件描述符或播放器自行终止(取决于所使用的视频播放器)时,它才会发生变化(根据视频文件的大小)。

问题

在 ext 文件系统上释放文件的确切条件是什么?我对 ext2、ext3 和 ext4 中如何处理它感兴趣。根据所使用的内核或操作系统的其他部分是否存在差异?

答案1

您混淆了两个不同的计数器:文件系统链接计数器和文件描述符引用计数器。

  1. 文件系统链接计数器计算文件系统本身中有多少个指向 inode 的链接。索引节点是包含文件元数据的结构。在 ext* 文件系统中,该计数器存储在文件系统本身中。

    您可以使用 来验证有多少个链接有一个 inode ls -l。此外,您还可以使用ls -i来获取文件的索引节点号。例如,尝试使用倍增文件的链接ln并验证所有链接是否具有相同的索引节点号。

    andcoz@tseenfoo:~/refcount> ls -li
    total 40
    2248813 -rw-r--r-- 1 andcoz users 40960  7 feb 21.34 test
    andcoz@tseenfoo:~/refcount> ln test test2
    andcoz@tseenfoo:~/refcount> ln test test3
    andcoz@tseenfoo:~/refcount> ls -li
    total 120
    2248813 -rw-r--r-- 3 andcoz users 40960  7 feb 21.34 test
    2248813 -rw-r--r-- 3 andcoz users 40960  7 feb 21.34 test2
    2248813 -rw-r--r-- 3 andcoz users 40960  7 feb 21.34 test3
    
  2. 文件描述符引用计数器计算进程打开文件的次数,或者更正式地说,计算有多少文件描述符引用该索引节点。该信息存储在内核内存中。

    您可以使用命令获得该值的近似值fuser。此命令列出所有打开文件的进程。请注意,单个进程可以多次打开同一个文件,因此融合器列表大小小于或通常等于引用计数器。

    andcoz@tseenfoo:~/refcount> tail -f test &
    [3] 4226
    andcoz@tseenfoo:~/refcount> fuser test
    /home/andcoz/refcount/test:  4226
    andcoz@tseenfoo:~/refcount> tail -f test2 &
    [4] 4354
    andcoz@tseenfoo:~/refcount> fuser test
    /home/andcoz/refcount/test:  4226  4354
    

当以下情况时,文件将从文件系统中删除:两个都计数器为零。

答案2

当链接计数变为零时,文件被释放,即最后一个目录条目被删除,并且文件描述符打开的最后一个进程通过退出显式或隐式地关闭它。这是标准 Unix 语义,适用于所有 Linux 文件系统,包括 Ext、Ext 2、Ext 3 和 Ext 4。

相关内容