修改时使用fallocate –dig-holes是否安全?

修改/写入文件时,是否可以安全地使用文件fallocate --dig-holes ? 例如,在由KVM客人打开的QCOW2图像上?

我通常会说不。 如果该文件是挂载到虚拟机的映像,则可以尝试使用TRIM(例如fstrim -a)。 严格地说,这不是等价的(TRIM也可以释放一些被删除的文件的未被清零的空间),但这可能是你想要的。

在某些特定情况下可能是安全的,但我不会依赖它。 例如,当一些数据没有任何预分配的情况下被顺序地stream式传输到文件时,这听起来是安全的。 但是,由于这不是由文档暗示,它只依赖于实现,我强烈不推荐它。

什么可以出错? 想象一下,应用程序/虚拟机将会覆盖一些归零块,并且同时运行fallocate -d。 比赛可能看起来像:

  1. Fallocate看到一块零,所以它决定在那里挖一个洞。
  2. 另一个应用程序/虚拟机向零区块写入一些数据。
  3. Fallocate在街区挖掘一个洞。

这可能听起来像1到3之间有一个小的时间框架。也许这是真的,但是fallocate可能想要一次释放多个后续块。 (不确定,我没有检查过实现,但是即使相反是真的,将来也不能依赖它。)这可以增加1到3之间的延迟,使得竞争条件更有可能。