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

UTF*_*F-8 1 linux filesystems ext4 open-files files

介绍

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

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

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

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

and*_*coz 5

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

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

    您可以使用ls -l. 此外,您可以使用ls -i来获取文件的 inode 编号。例如,尝试使用ln并验证所有链接具有相同的 inode 编号来增加指向文件的链接。

    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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 文件描述符引用计数器计算进程打开文件的次数,或者更正式地说,有多少文件描述符引用了该 inode。此信息存储在内核内存中。

    您可以使用fuser命令获得该值的近似值。此命令列出所有打开文件的进程。请注意,单个进程可以多次打开同一个文件,因此 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
    
    Run Code Online (Sandbox Code Playgroud)

两个计数器都为零时,文件将从文件系统中删除。

  • 我想这取决于文件系统的实现。`ext2` 将需要 fsck 才能恢复。我不知道其他文件系统将如何恢复。 (2认同)