关于 ext3 中的文件大小和磁盘使用情况

关于 ext3 中的文件大小和磁盘使用情况

我有一个文件的多个副本。根据ls -lk和,每个文件占用 2390170KiB du --apparent-size -k

问题是du -k报告的每个副本的大小不同:2389824、2392512、2392512 和 2390336。

我预计磁盘使用量应为 2390172KiB(文件适合的最小块数(597543)的大小)。

那么,为什么每个文件有不同的磁盘使用情况?

我还看到其中一个副本使用了 2389824KiB,但文件大小却大了 346KiB:2390170。这有什么意义呢?

PD:所有文件都位于同一个 ext3 文件系统中。文件系统块大小为 4096。所有文件都具有相同的哈希值。

更新:来自评论:

although the apparent size is usually smaller, it may be larger due to holes in ('sparse') files, internal fragmentation, indirect blocks, and the like

稀疏文件可能是导致磁盘使用率较低的原因。但我看不出内部碎片或间接块如何减少原始文件的磁盘使用率。由于文件相同,内部碎片和间接块的磁盘使用率应该是恒定的。

我观察到cp --sparse=always可以从非稀疏文件生成稀疏文件。 cp --sparse=always使用 2390336KiB 的文件的结果 cp --sparse=never使用 2392512KiB 的文件的结果

所以我猜测其中一个副本中的 2389824KiB 使用量是由于稀疏算法的不同实现造成的......

原始文件是通过 sftp 或 samba 从 Windows 机器复制的,我认为 2389824KiB 文件是它的副本,但我不记得我是怎么做到的(我猜是用 cp,但我不确定)。

答案1

man du

--apparent-size
打印外观尺寸,而不是磁盘使用情况; 虽然表观大小通常较小,但由于(“稀疏”)文件中的漏洞、内部碎片、间接块等原因,它可能会更大

info du

'--apparent-size'
打印表观大小,而不是磁盘使用情况。文件的表观大小是wc -c常规文件上报告的字节数,或者更一般地说,ls -l --block-size=1stat --format=%s。例如,包含单词“zoo”且没有换行符的文件当然会具有 3 的表观大小。如此小的文件可能需要 0 到 16 KiB 或更多的磁盘空间,具体取决于文件所在的文件系统的类型和配置。但是,使用此命令创建的稀疏文件:

      dd bs=1 seek=2GiB if=/dev/null of=big

其表观大小为 2 GiB,但在大多数现代系统上,它实际上几乎不占用任何磁盘空间。

[重点是我的]

答案2

这里有两个原因:文件比预期大,这是因为文件系统存储的元数据被计入文件大小。文件比预期小,这是因为 UNIX 的“稀疏文件”特性。

更大的文件

对于 ext2/ext3,文件的磁盘使用量包括文件系统结构所用的空间,这些结构会跟踪数据块在磁盘上的位置。请查看Ext2 inode 结构-- inode 是一种数据结构,用于跟踪文件的权限、大小等,以及其数据块在磁盘上的位置。inode 本身不计入使用量(它在文件系统创建时预先分配),但间接块计入使用量。

计算

因此,正如您所说,大小为 2390172kB 的文件占用 597543 个数据块。其中 12 个块的位置存储在 inode 本身中,因此它们是空闲的。存储在 inode 中的第 13 个位置用于间接块 - 一个新分配的块,用于存储 1024 个数据块的位置。因此,这会将 1 个块添加到您的文件大小中,剩下 596507 个块。

inode 中的第 14 个位置指针用于双重间接块 - 分配的块包含 1024 个间接块位置的空间。596507/1024 ~= 582.52,因此我们需要 583 个间接块来包含其余的数据块,再加上一个双重间接块。

所以:

    1 (indirect from inode)
+   1 (doubly-indirect from inode)
+ 583 (indirect from doubly-indirect)
-----
= 585
= 598128 - 597543

这相当于大小 2392512 (=598128*4)。

更小的文件

我怀疑较小的文件 (2389824kB) 是稀疏文件,这意味着某些块从未被写入,因此未分配——未分配的块被定义为用零填充。请参阅 Dennis Williamson 的回答以获取参考。如果写入程序移动文件指针并写入文件的不同位置,而不是从头到尾写入文件,则可能会出现稀疏文件。对于稀疏文件的极端示例,请尝试以下操作:

du if=/dev/zero of=my_sparse_file bs=1000 count=1 seek=1000000

如果您ls生成文件,则表观大小将为 1000001000。但是,由于只写入了 1000 个字节,因此只使用了一个数据块,因此只分配了一个数据块。 du将报告已使用 12kB——一个 4k 块用于数据,一个用于双间接块,一个用于双间接块用其第 976 个指针指向的单间接块。文件的其余块均未分配,无论是数据还是元数据。

一旦双重间接块用完,文件系统就会开始使用三重间接块。您的文件将达到 ext3 文件系统的最大可能大小,然后才会填满该大小。

相关内容