Linux 中的“fallocate --dig-holes”和“fallocate --punch-hole”有什么区别?

dir*_*obs 7 linux filesystems sparse-files files fallocate-command

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

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

非稀疏:

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
Run Code Online (Sandbox Code Playgroud)

非稀疏中有许多零,假设交错零以千兆字节为单位。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.
Run Code Online (Sandbox Code Playgroud)

挖洞,--dig-hole好像是那个选项的反面,怎么挖洞跟挖洞不一样?!帮助!我们需要一个逻辑学家:)。

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

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

Kus*_*nda 11

简而言之:

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

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

还要注意复数“挖洞”与单数“打孔”。

手册中,关于--dig-holes

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


Ste*_*itt 11

--dig-holes 不会更改文件的内容,这在读取文件时确定:它只是标识可以用孔替换的零的运行。

--punch-hole使用--offset--length参数在文件中打一个洞,不管文件在该偏移处包含什么:即使文件在那里包含非零,它也能工作,但文件的内容因此而改变。考虑到您的示例文件,运行fallocate --punch-hole --offset 2 --length 10a用零替换十个字符,从第二个字符开始。