Isabell Cowan Asked: 2017-01-23 00:58:52 +0800 CST2017-01-23 00:58:52 +0800 CST 2017-01-23 00:58:52 +0800 CST 修改时使用 fallocate --dig-holes 是否安全 772 在修改/写入文件时使用它是否安全?fallocate --dig-holes例如,在 KVM 来宾打开的 QCOW2 映像上? filesystems qcow2 1 个回答 Voted Best Answer v6ak 2017-06-11T01:11:15+08:002017-06-11T01:11:15+08:00 我一般会说不。如果文件是挂载到 VM 的映像,您可以尝试 TRIM(例如 fstrim -a)。严格来说,这不是等效的(TRIM 还可以释放一些未归零的已删除文件的空间),但这可能是您想要的。 在某些特定情况下它可能是安全的,但我不会依赖它。例如,当某些数据在没有任何预分配的情况下按顺序流式传输到文件时,听起来可能是安全的。但由于文档并未暗示这一点,并且它仅依赖于实现,因此我强烈不推荐它。 会出什么问题?想象一下,应用程序/VM 将覆盖某个归零块,而您同时运行 fallocate -d。比赛可能如下所示: Fallocate 看到一个零块,所以它决定在那里挖一个洞。 另一个应用程序/VM 将一些数据写入归零块。 Fallocate 在街区挖了一个洞。 听起来可能在 1 和 3 之间有一个很小的时间范围。也许这是真的,但 fallocate 可能希望一次释放多个后续块。(不确定,我没有检查过实现,但即使相反,你以后也不能依赖它。)这会增加 1 和 3 之间的延迟,使竞态条件更有可能发生。
我一般会说不。如果文件是挂载到 VM 的映像,您可以尝试 TRIM(例如 fstrim -a)。严格来说,这不是等效的(TRIM 还可以释放一些未归零的已删除文件的空间),但这可能是您想要的。
在某些特定情况下它可能是安全的,但我不会依赖它。例如,当某些数据在没有任何预分配的情况下按顺序流式传输到文件时,听起来可能是安全的。但由于文档并未暗示这一点,并且它仅依赖于实现,因此我强烈不推荐它。
会出什么问题?想象一下,应用程序/VM 将覆盖某个归零块,而您同时运行 fallocate -d。比赛可能如下所示:
听起来可能在 1 和 3 之间有一个很小的时间范围。也许这是真的,但 fallocate 可能希望一次释放多个后续块。(不确定,我没有检查过实现,但即使相反,你以后也不能依赖它。)这会增加 1 和 3 之间的延迟,使竞态条件更有可能发生。