$ timeout 1 cat /dev/zero > file1
$ wc -c file1
270422016 file1
$ du file1
264084 file1
问题 :
(1)270422016个空字符怎么出来是264084字节(即258M)。
$ truncate -s 270422016 file2
$ wc -c file2
270422016 file2
$ du file2
0 file2
问题 :
(2)file2
已经创建了与 has 相同数量的空字符file1
,但大小file2
为零,为什么?
(3)什么没有/dev/zero
做,truncate
反之亦然?
du
不以字节为单位显示大小,而是(在这种情况下)1024 字节块。所以数字实际上是相同的 (264084 * 1024 = 270422016
)truncate
如果文件系统支持这些东西,则创建一个稀疏文件/dev/zero
实际上会产生无限\0
字节,然后将其写入文件,写入零会像写入任何其他内容一样消耗空间。另一种在不实际写入零的情况下生成占用空间的文件的方法是使用fallocate
.您可以使用
filefrag
来获取有关此类文件的更多信息。文件 1 (
cat /dev/zero
) 已完全写入,在这种情况下也被证明是碎片化的:碎片取决于有多少可用空间,以及文件系统决定从哪里开始写入文件,但不知道它最终会变成多大。
文件 2 (
truncate
) 只是一个空壳,根本没有为它保留空间,它的大小仅由元数据指示,而不是由物理范围指示。文件 3 (
fallocate
) 已分配,但标记为未写入。因此为它保留了物理空间,它甚至是完整的(因为文件系统事先被告知大小)。读取此文件将导致结果为零,即使物理上可能在此地址存储了不同的数据。这是因为即时文件分配仅保留空间但不会覆盖磁盘上的数据。