![変更中に fallocate --dig-holes を使用するのは安全ですか?](https://rvso.com/image/697400/%E5%A4%89%E6%9B%B4%E4%B8%AD%E3%81%AB%20fallocate%20--dig-holes%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E5%AE%89%E5%85%A8%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
それは...ですか安全fallocate --dig-holes
変更中/書き込み中のファイルに使用するには? たとえば、KVM ゲストによって開かれた QCOW2 イメージではどうでしょうか?
答え1
一般的には、いいえと答えます。ファイルが VM にマウントされたイメージである場合は、代わりに TRIM (例: fstrim -a) を試すことができます。厳密に言えば、これは同等ではありません (TRIM は、ゼロ化されていない削除されたファイルの領域を解放することもできます) が、これが必要な場合があります。
特定のケースでは安全かもしれませんが、それに頼ることはお勧めしません。たとえば、いくつかのデータがファイルに順番にストリーミングされる場合事前割り当てなしで、それは潜在的に安全であるように思えます。しかし、これはドキュメントで暗示されておらず、実装のみに依存するため、強くお勧めしません。
何が問題になるのでしょうか? アプリ/VM がゼロ化されたブロックを上書きし、同時に fallocate -d を実行するとします。競合は次のようになります。
- Fallocate はゼロのブロックを見つけたので、そこに穴を掘ることに決めました。
- 別のアプリケーション/VM がゼロ化されたブロックにデータを書き込みます。
- ファロケートはブロックに穴を掘ります。
1 と 3 の間には短い時間枠があるように聞こえるかもしれません。それは本当かもしれませんが、fallocate は後続の複数のブロックを一度に解放する必要があるかもしれません。(実装を確認していないのでわかりませんが、たとえその逆が真実だとしても、将来的にそれに頼ることはできません。) これにより、1 と 3 の間の遅延が長くなり、競合状態が発生する可能性が高くなります。