如何计算目录的总大小,以及为什么目录副本之间的“du”输出不同?

如何计算目录的总大小,以及为什么目录副本之间的“du”输出不同?

因为我显然在这里遗漏了一些东西:

 $ cp -a CENTOS-chroot 1
 $ cp -a CENTOS-chroot 2
 $ cp -a CENTOS-chroot 3
 $ cp -a CENTOS-chroot 4
 $ du --block-size=1 -s 1 2 3 4
6320304128  1
6320304128  2
6320234496  3
6320238592  4

我有两台 Linux 机器(Manjaro 和 Centos7),在带有 ext4 的 HDD 和 NVME SSD 上都会发生这种情况。

答案1

不要忘记,du报告磁盘使用情况是在原始的底层文件系统级别,而不是在明显的“文件大小“级别……看看--apparent-size。”

--apparent-size

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

另请参阅-b,这可能是给予的更好选择--block-size=1 --apparent-size一起:

-b--bytes

相当于--apparent-size --block-size=1

...那么,会du -bs ${dir}产生更好的结果吗?


鉴于大多数/所有文件系统都是基于固定大小的块,因此很常见到明显的“文件大小“(即您能够从文件中读取的字节数)与磁盘上实际使用的空间(即:存储此文件及其元数据所消耗的字节数)不同。

例如:

  • 小文件通常会占用比它们更多的空间应该“... 在具有 4KiB 块的文件系统中,文件不可能使用少于 4KiB 的磁盘空间,即使它只存储一个字节。
  • 大型文件通常由许多“范围“... 范围将描述文件某部分数据的位置。范围也会占用磁盘空间。
    • 在没有任何碎片的文件系统中(即:未使用的空间很大),可能会出现“大的“只有一个范围的文件。
    • 在具有大量碎片的文件系统中(即:到处都有大量数据,数据之间留有小间隙),同样的“大的“文件实际上可能有多个范围,用于指示数据的存储位置。

这完全取决于文件在磁盘上的放置顺序,以及用于寻找连续可用空间块的算法。

您可以拥有一个非常节省空间的文件系统,该系统会不断仔细地重新排列所有文件,使它们像一块玩得很好的俄罗斯方块棋盘一样完美地镶嵌在一起。文件系统最终会花费大量时间来搜索合适的空间,性能会受到严重影响。

同样,您可能有一个非常注重碎片化的文件系统,它只使用第一个未使用的块,并跳过已使用的块。基于第一个间隙写入数据也会降低您的性能。

相反,我们更喜欢平衡事情,花钱一些时间 (但不要太多)寻找一个连续的未使用空间块,该块将包含我们尝试写入的全部数据。

文件的碎片级别并不直接与复制命令的发出顺序相关 - 部分原因是“尝试,但不要太用力“方法如上所述。


综上所述,这两个目录中存储的数据应该是相同的,但磁盘使用率(即使是相同的数据) 不太可能完全匹配。

有多种选项可以验证存储的数据是否相同 - 尝试diff(没有输出是好的,它会报告更改):

diff -qr "${src}" "${dst}"

更复杂的是,稀疏文件可能会使用显著地低于预期:

$ truncate -s 100M x
$ ls -l x
-rw-r--r-- 1 attie attie 104857600 Jul 14 17:15 x
$ du --block-size 1 x
0       x
$ du -bs x
104857600       x

答案2

ext4 文件系统的块和范围布局取决于文件系统的填充率和碎片。

这意味着,与空文件系统相比,包含更多文件的文件系统占用的空间可能会略有不同。就您而言,第 4 个副本将比第 1 个副本占用更多空间。

相关内容