修改/写入文件时,是否可以安全地使用文件fallocate --dig-holes ? 例如,在由KVM客人打开的QCOW2图像上?
我通常会说不。 如果该文件是挂载到虚拟机的映像,则可以尝试使用TRIM(例如fstrim -a)。 严格地说,这不是等价的(TRIM也可以释放一些被删除的文件的未被清零的空间),但这可能是你想要的。
在某些特定情况下可能是安全的,但我不会依赖它。 例如,当一些数据没有任何预分配的情况下被顺序地stream式传输到文件时,这听起来是安全的。 但是,由于这不是由文档暗示,它只依赖于实现,我强烈不推荐它。
什么可以出错? 想象一下,应用程序/虚拟机将会覆盖一些归零块,并且同时运行fallocate -d。 比赛可能看起来像:
这可能听起来像1到3之间有一个小的时间框架。也许这是真的,但是fallocate可能想要一次释放多个后续块。 (不确定,我没有检查过实现,但是即使相反是真的,将来也不能依赖它。)这可以增加1到3之间的延迟,使得竞争条件更有可能。