因为我显然在这里遗漏了一些东西:
$ 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 个副本占用更多空间。