稀疏文件的表观大小

稀疏文件的表观大小

我使用以下方法创建了一个 8 GB 的稀疏文件

dd if=/dev/zero of=/sparse-file bs=1 count=0 seek=8G

然后我就这么做了

echo "test" >> /sparse-file

我看到du -sh sparse-file给出了 16K 并du -sh --apparent-size sparse-file显示 8.1G。

我曾以为,如果我将数据写入文件,它将覆盖稀疏文件中的零,但实际上它会增长。为什么会这样?如果我开始填充 8GB 的​​实际数据,那么表观大小将变成 16GB?

这里的“计数”到底起什么作用?

答案1

“稀疏”文件是指具有空隙的文件,假定这些空隙会用零填充,但这种假设足以继续下去。也就是说,如果您读取该文件,您将得到零,但由于我们知道它是零,因此我们实际上不必写出 8GB 的​​零。这足以说,“我们只是同意这里有一个大文件,而实际上并没有为它分配空间”。

当你覆盖文件的空白内容时,磁盘上会分配块来容纳你存储的内容(因为你不能再假设它只是零)。但如果你附加到文件,你不会覆盖任何东西。你只是在末尾添加了更多内容。因此,通过附加,你会在磁盘上分配块,但这些块不会取代您现有的“虚拟”块;相反,您创建的块将添加到末尾,在虚拟块之后。

您甚至可以添加更多的使用与创建文件时类似的操作来创建虚拟块dd -skip。“虚拟”块不必全部在一起。事实上,当您覆盖文件中的现有块时,仅分配您覆盖的块,无论它们出现在文件中的什么位置。也就是说,在位置 101 处写入块不会自动分配并用零填充 1 到 99 的块。

答案2

首先,使用时,count=0您只从中复制了零个块/dev/zero。所以,什么都没有。seek=8G跳过了 8GB 的​​块。我宁愿使用 来做到这一点count=1,但我想您可以完全省略它。

其余的,请阅读曼杜。该apparent-size选项打印的是表观大小而不是实际磁盘使用情况。因此,虽然第一个命令报告您的文件需要 16K 的磁盘空间,但表观大小却是 8.1GB。

内容少于 16K 的文件仍可能需要 16K 的磁盘空间,具体取决于所使用的底层文件系统。请参阅GNU Coreutils 描述

例如,包含单词“zoo”且没有换行符的文件当然会具有 3 的表观大小。如此小的文件可能需要 0 到 16 KiB 或更多的磁盘空间,具体取决于文件所在的文件系统的类型和配置。但是,使用此命令创建的稀疏文件:

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

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

相关内容