ブロックが不要になったとき、Linuxファイルシステムはブロックデバイスにそれを知らせますか?

ブロックが不要になったとき、Linuxファイルシステムはブロックデバイスにそれを知らせますか?

従来、ストレージデバイス(ハードドライブ)には、上書きするだけでなく、データを「削除」するメカニズムがないと考えられていました。ブロックデバイスにデフォルトのストレージが不要になったという通知を送信すると便利ないくつかの理論的シナリオが表示されますが、これを行うメカニズムはありません。

例:

  • ほぼすべての最新SSDはウェアレベリング寿命を延ばすため。これは、報告されたサイズよりも多くの内部メモリブロックを持ち、それらを繰り返すことによって達成できます。ただし、SSDはブロックが不要になったというメッセージを受信したときに循環できるより大きなプールを提供します。
  • RAMに生成されたファイルシステム(tmpfsを除く)ファイルを削除したときにファイルシステムが不要なスペースを報告できない場合、デフォルトのRAMディスクは割り当てられたスペースを使用可能なRAMに返すことはできません。
  • スワップソリューション(例:使用)ズラムスワップ領域でページが使用されなくなった場合は、ブロックデバイスに通知する必要があります。そうしないと、RAMに多くの「ジャンク」が残ります。

これは似たような概念だと思います。FALLOC_FL_PUNCH_HOLE。しかし、私がそこから読んだところによると、これは純粋にファイルシステム上のファイルからスペースの割り当てを解除することです。つまり、ユーザー空間アプリケーションは、スペースが不要であることをファイルシステムに通知できます。しかし、これはファイルシステムがブロックデバイスにスペースを必要としないことを知らせるのとは異なります。それともそうでしょうか?

もしそうなら、すべての場合に解決策はありますか?それとも、ブロックが不要になったときにファイルシステムとスワップがブロックデバイスに通知できるメカニズムはありますか?

答え1

Linux では、ファイルシステムは以下を使用して、1 つ以上のブロックが不要になったことをブロック階層に通知できます.blkdev_issue_discard。実際には、その動作が要求されたときにファイルシステムからブロックを削除するために使用されます。通常、「discard」オプションを使用してファイルシステムをマウントします。この要求は、中間層から削除を伝播するためにも使用されます。例えばMDレイヤーで

これはデフォルトでは行われません。ext4マンページ「十分なテストが完了するまで基本的にオフになっています」あまりにも車多くのSSDが継続的な低下をうまく処理できないため、推奨されるアプローチは次のことを実行することです。fstrim代わりに。ほとんどのファイルシステムのデフォルトの動作は、そのコンテンツが削除されたときに基本レイヤにこのことを知らせず、内部的にブロックを未使用としてマークすることです。これにより、ファイルシステム固有の「削除解除」ユーティリティを使用するか、次のブロックデバイスナビゲーションツールを使用しても、誤って削除した後にファイルの内容を回復できます。写真記録。さらに処理せずに未使用のブロックを表示すると、ファイルをすばやく削除することもできます。

ブロックが不要になったときに明示的に削除しないと、ファイルシステムが多くの処理を実行しないという事実は、シンプロビジョニングに予想以上の作業が必要であることを意味します。したがって、XenにはExt3ファイルシステムシンプロビジョニングの特定のサポートが含まれています。言い換えれば、ブロック層は、自分が保存したファイルシステムを「知って」、それを使用して、ファイルシステムが明示的に何も知らせずに不要なブロックを識別します。 VMwareでシンプロビジョニング、つまりシンプロビジョニングされたブロックデバイスのストレージ要件を減らすために未使用のブロックを識別するには、未使用のブロックを空にして分析ツールを実行する必要があります。 SANベースのシンプロビジョニングシステムも同様のサポートを提供します。 (ドロップサポートによりシンプロビジョニングが容易になりました。シンプロビジョニングされたボリュームはクリーンアップサポートを通知し、ファイルシステムは残りのタスクを実行します。)

FALLOC_FL_PUNCH_HOLE説明したように、ファイルシステムレベルの操作ですが、デフォルトのファイルシステムがそれをサポートし、適切な削除オプションでマウントすると、ブロックは削除されます。

関連情報