UTF*_*F-8 1 linux filesystems ext4 open-files files
直到最近,我认为在 ext 文件系统上,inode 具有引用计数器,用于计算目录条目或文件描述符引用文件的次数。
然后,我了解到引用计数器只计算引用它的目录条目的数量。为了伪造这一点,我使用ls -l. 正如我所料,它是 1,因为我没有创建任何额外的硬链接。然后我用视频播放器打开视频文件并再次执行相同的命令。令我惊讶的是,引用计数仍然是 1。因此,我无法伪造。
但是,在删除其唯一的目录条目后,我绝对可以继续观看视频。打开大视频文件并删除其目录条目时,文件系统上的可用存储空间量不会改变。它仅在播放器到达视频末尾并关闭文件描述符或播放器自行终止(取决于所使用的视频播放器)时才会更改(根据视频文件的大小)。
在 ext 文件系统上释放文件的确切条件是什么?我对它在 ext2、ext3 和 ext4 中的处理方式很感兴趣。根据使用的内核或操作系统的其他部分,是否存在差异?
您混淆了两个不同的计数器:文件系统链接计数器和文件描述符引用计数器。
文件系统链接计数器计算文件系统本身中有多少指向 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)文件描述符引用计数器计算进程打开文件的次数,或者更正式地说,有多少文件描述符引用了该 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)当两个计数器都为零时,文件将从文件系统中删除。