为什么文件大小和磁盘上的大小差异大于 4 KiB?

为什么文件大小和磁盘上的大小差异大于 4 KiB?

ext4 文件系统通常使用 4 KiB 块。这样,当您写入一个小文件时,如果其大小小于 4 KiB,您会在任何文件管理器中看到差异。通常有两个值:文件大小和磁盘大小。第一个值是正确的,另一个是 4 KiB 的乘积。

对于较大文件,我一直认为大小差异不能超过 4 KiB(最后一个未完全写入的块)。但对于我磁盘上的某些文件,我可以看到差异超过 4 KiB,例如 9425 字节。所以问题很简单,为什么大小相差超过 4 KiB。是因为碎片化还是其他原因?文件中间的一些块没有完全写入,这不是很奇怪吗?

答案1

组成文件的块列表必须存储在某个地方。通常情况下,inode 中的空间很小,但如果 inode 中的块太多,文件系统会分配间接块除了包含文件数据的块之外,还存储块的地址。至少对于 Linux 上的 ext2/ext3/ext4 来说,而且我认为对于大多数类 Unix 操作系统上的大多数类 Unix 文件系统,文件的磁盘使用情况都会考虑间接块。

Ext4的使用范围树存储阻止列表。如果文件按顺序使用连续块的列表,则这会占用树中的单个条目。因此,碎片很少的文件不需要任何间接块,只需要树中指定第一个块和块数的一个条目。最大碎片文件需要大量间接块来存储每个块一个树条目。如果文件没有碎片或碎片很少,则不需要间接块,并且文件的磁盘使用量是文件大小四舍五入到文件系统块的整数。碎片文件需要间接块。

Ext2 和 ext3 有一个更简单的方案,其中阻止列表未压缩因此,条目数量与文件大小的关系略大于线性关系,如果文件使用超过 12 个块(即可以直接在 inode 中记录的块数),则需要间接块。

您可以使用以下命令探索 ext2/ext3/ext4 文件系统debugfs。在debugfs中,blocks /path/to/file列出文件使用的块;这显示了文件的碎片程度。该命令filefrag /path/to/file给出了片段的数量;对于 ext4,这与间接块的数量相关,因此与文件大小和文件磁盘使用之间的差异相关。

答案2

我认为这可能会发生在这个情况下

如果在 mode 中指定了 FALLOC_FL_KEEP_SIZE 标志,则调用的行为类似,但即使 offset+len 大于文件大小,文件大小也不会更改。以这种方式预分配超出文件末尾的归零块对于优化追加工作负载非常有用。

相关内容