Linux 中 `fallocate --dig-holes` 和 `fallocate --punch-hole` 有什么区别?

Linux 中 `fallocate --dig-holes` 和 `fallocate --punch-hole` 有什么区别?

我完全理解--dig-holes就地创建一个稀疏文件。也就是说,如果文件有漏洞,--dig-holes选项会删除这些漏洞:

让我们以一种非常简单的方式来看待它,假设我们有一个名为非稀疏的巨大文件:

非稀疏:

aaaaaaaaaaaaaaaaaaaaaaaaaaaa
\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00
bbbbbbbbbbbbbbbbbbbbbbbbbbbb
\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00
cccccccccccccccccccccccccccc

非稀疏其中有很多零,假设交错的零以千兆字节为单位。fallocate --dig-holes取消分配可用于零(空)的空间,其中实际文件大小保持不变(保留)。

那么,--punch-hole它到底有什么作用呢?我读了手册页,仍然不明白:

-p, --punch-hole
              Deallocates space (i.e., creates a hole) in the byte  range
              starting at offset and continuing for length bytes.  Within
              the specified range, partial filesystem blocks are  zeroed,
              and  whole  filesystem  blocks  are  removed from the file.
              After a successful call, subsequent reads from  this  range
              will  return  zeroes.

创造洞,这看起来与选项相反--dig-hole,为什么挖洞和创造洞不一样?!帮助!我们需要一个逻辑学家:)。

这两个选项的命名在语言上是同义词,这可能会造成混乱。

--dig-holes和操作上有什么区别--punch-holes(请不是逻辑或语言上的区别!)?

答案1

--dig-holes不会更改文件的内容,如读取文件时确定的那样:它只是识别可以用空洞替换的连续零。

--punch-hole使用--offset--length参数在文件中打孔,无论文件在该偏移处包含什么:即使文件包含非零,它也可以工作,但文件的内容改变因此。考虑到您的示例文件,运行将从第二个字符之后开始用零fallocate --punch-hole --offset 2 --length 10替换十个字符。a

答案2

简而言之:

  • --dig-holes使文件稀疏而不修改其内容(如读取该文件的程序所见)。
  • --punch-hole在文件中创建一个漏洞,可能会修改现有数据。

不同之处在于,--dig-holes分析文件中可以稀疏的区域(使用--offset--length,如果提供的话,指示文件中要分析的范围),而--punch-holes使用--offset--length实际上清零文件的一部分,用于创建孔。

另请注意复数“挖孔”与单数“打孔”。

手册, 关于--dig-holes

您可以将此选项视为执行操作cp --sparse,然后将目标文件重命名为原始文件,而不需要额外的磁盘空间。

相关内容