正確にbtrfs scrubは何をしますか?完全に不明確なマニュアルページによると、それはいくつかのエラーチェックを行います。どんなエラーチェック?信頼性はどのくらいですか?いくつかのエラーを回復できますか?それはどのように機能しますか?すべてのbtrfsディスクで動作しますか?
他に何かあるかどうかはわかりませんが、少なくとも_btrfs scrub
_はフルディスクデータスクラブを実行することはわかっています。基本的に、ディスク上のすべてのデータ*を読み取り、そのチェックサムを再計算し、再計算されたチェックサムを格納されているチェックサムと比較します。保存および再計算されたチェックサムが一致しない場合、システムは破損があることを認識します。
破損が検出されると、動作はディスクの設定によって異なります。たとえば、RAID 1(ミラーリング)の場合、_btrfs scrub
_は、破損していないバージョンを別のディスクからコピーすることにより、破損したデータを修正できます。一部のデータのすべてのコピーが破損している場合(たとえば、最初にマルチディスクの損傷や冗長コピーがない場合)、警告する以外にできることは_btrfs scrub
_があまりありません。
これが重要な理由は、ハードドライブのビットの読み取りと書き込みにおける信頼性が約99.999999999999%に過ぎないためです。したがって、数テラバイトのデータI/Oごとに、エラーが発生する可能性があります。通常のディスクアクセス中にエラーが検出され、検出されます(冗長コピーがまだ有効であると仮定して修正されます)が、同じデータのすべてのコピーが破損するほど蓄積する前に、ルーチンのフルディスクスクラブによりエラーを検出して修正できます。
*メタデータも含めるために、「ファイル」ではなく「データ」を使用しています。 Btrfsは、ファイルと対応するメタデータ(チェックサムを含む)をデータブロックに格納します。これらはすべて、_btrfs scrub
_によってチェックサムされ、チェックされます。
以下も参照してください:
Mark Haferkampの優れた答えを拡張すると、すべてのファイルの代わりに_btrfs scrub
_すべてを読み取るdataは重要なプロパティであり、実際に非常に便利です。覚えておいてください、btrfsには組み込みのRAIDサポートがあります。 RAID1を使用するように構成した2つのドライブにまたがるbtrfsファイルシステムがあるとします。この場合、ファイルに書き込むと、その書き込みは両方のディスクに複製されます。 (より複雑な例ではより複雑になりますが、この単純なケースでは、これが常に発生します。)ただし、そのファイルから読み取る場合、読み取りは1つのディスクのみにヒットします(ファイルを2回読み取るのは無駄なので)最初のコピーが何らかの理由で使用できない場合を除きます)。
ここで、2番目のbtrfsドライブが劣化し、ファイルシステムのデータが破損し始めているとしましょう。このディスクからブロックを読み取ると、btrfsはチェックサムが一致しないことを認識し、既知の正常なコピー(最初のドライブ上のコピー)からインバンドでブロックを復元します。何も起こらなかったかのように、read()
(または何でも)を呼び出すアプリケーションにデータを返します。
しかし、btrfsが2番目のディスクから読み取ることを決定しない場合はどうなりますか? 2つのコピーがあるので、最初のまたは 2番目のディスクから読み取ることができることに注意してください。最初のディスクから読み取った場合、問題はありません。何か問題があることに気付くのは、最初のディスクが劣化したときだけです。これで、データを回復するには遅すぎるため、本当にうんざりしています。2番目のディスクのコピーがしばらく破損していて、1番目のコピー(2番目のディスクの復元に使用したもの)も破損しています。
これが_btrfs scrub
_の出番です。すべてのファイルではなく、すべてのdataを読み取ります。これにはメタデータだけでなく、通常は読み取りパスに含まれないファイルのセカンダリコピーも含まれます。これらのセカンダリコピーを読み取ると、btrfsのインバンドエラー修正が実行され、冗長コピーからデータが復元されます。