1.フラッシュベースのストレージ
ディスクの種類(従来のハードドライブとソリッドステートディスク)または私が知らない他の変数に依存しますか?Linuxでのみ発生しますか(発生した場合)、他のOSでも発生しますか?
選択肢がある場合は、クリーンなシャットダウンを行わずにフラッシュベースのストレージが電力を失うことを許可しないでください。
SDカードのような低コストのストレージでは、消去ブロック全体(4KBよりも数倍大きい)が失われ、異なるファイルまたはファイルシステムの重要な構造に属する可能性のあるデータが失われることが予想されます。
一部の高価なSSDは、電源障害が発生した場合により良い保証を提供すると主張する場合があります。ただし、サードパーティのテストでは、多くの高価なSSDがこれに失敗することが示唆されています。「ウェアレベリング」のためにブロックを再マップするレイヤーは複雑で独自のものです。考えられる障害には、ドライブ上のすべてのデータの損失が含まれます。
テストフレームワークを適用して、合計3000回を超える障害注入サイクルを使用して、6つの異なるベンダーの17種類のコモディティSSDをテストします。私たちの実験結果は、テストした17台のSSDデバイスのうち14台が、ビット破損、切り込み書き込み、非シリアル化書き込み、メタデータ破損、デバイス全体の障害など、電源障害時に驚くべき障害動作を示すことを示しています。
2017:https : //dl.acm.org/citation.cfm?id=2992782&preflayout=flat
2013:https : //www.usenix.org/system/files/conference/fast13/fast13-final80.pdf?wptouch_preview_theme=enabled
2.回転するハードディスクドライブ
回転するHDDにはさまざまな特性があります。安全性とシンプルさのために、フラッシュベースのストレージと同じ実際的な不確実性があると仮定することをお勧めします。
特定の証拠がない限り、明らかにそうではありません。私は、HDDを回転させるための比較数値を持っていません。
HDDでは、不完全に書き込まれた1つのセクターに悪いチェックサムが残る可能性があります。これにより、後で読み取りエラーが発生します。大まかに言って、HDDのこの障害モードは完全に予期されています。ネイティブLinuxファイルシステムは、それを念頭に置いて設計されています。彼らはfsync()
、このタイプの電力損失障害に直面して契約を維持することを目指しています。(SSDでこれが保証されることを本当に望んでいます)。
しかし、Linuxファイルシステムがすべての場合にこれを達成するかどうか、またはそれが可能かどうかはわかりません。
このタイプの障害の後の次の起動では、ファイルシステムの修復が必要になる場合があります。これはLinuxであるため、ファイルシステムの修復で不明な質問が表示される可能性があります。Yを押すだけで解決できることを期待できます。
2.1 fsync()コントラクトがわからない場合
fsync()コントラクトは、良いニュースと悪いニュースの両方のソースです。最初に良いたよりを理解しなければなりません。
良いニュース:fsync()
ファイルデータを書き込む正しい方法として文書化されています(たとえば、「保存」を押したとき)。そして、例えば、テキストエディタは、を使用してアトミックに既存のファイルを置き換えなければならないことが広く理解されていますrename()
。これは、常に古いファイルを保持するか、新しいファイル(fsync()
名前を変更する前に編集された)を取得することを確認するためのものです。新しいファイルの半分書かれたバージョンを残したくありません。
悪いニュース:長年の間、最も人気のあるLinuxファイルシステムでfsync()を呼び出すと、システム全体が事実上数十秒間ハングする可能性がありました。アプリケーションはこれについて何もできないので、fsync()なしでrename()を楽観的に使用することは非常に一般的でした。これは、このファイルシステムで比較的信頼できるようです。
したがって、fsync()を正しく使用しないアプリケーションが存在します。
このファイルシステムの次のバージョンでは、fsync()のハングを回避しました-同時に、fsync()の正しい使用に依存するようになりました。
これはすべてかなり悪いです。この歴史を理解することは、多くの相反するカーネル開発者によって使用された退屈な口調と悪意によって助けられないでしょう。
現在の解像度は、現在最も人気のあるLinuxファイルシステムです デフォルトでは、fsync()を必要とせずにrename()パターンをサポートします以前のバージョンとの「バグとバグの互換性」を実装します。これはマウントオプションで無効にできますnoauto_da_alloc
。
これは完全な保護ではありません。基本的には、rename()時に保留中のIOをフラッシュしますが、名前の変更前にIOの完了を待機しません。これは、たとえば60秒の危険ウィンドウよりもはるかに優れています!既存のファイルをrename()で置き換えるときにクラッシュ安全のためにどのファイルシステムがfsync()を必要とするのかという答えも参照してください。
人気のないファイルシステムの中には、保護を提供しないものがあります。XFS はそうすることを拒否します。そしてUBIFSもそれを実装していません。明らかに受け入れられましたが、それを可能にするには多くの作業が必要です。同じページでは、UBIFSには、電力損失など、データの整合性に関する他の「TODO」問題がいくつかあることが指摘されています。UBIFSは、フラッシュストレージで直接使用されるファイルシステムです。UBIFSが言及しているフラッシュストレージの問題のいくつかは、SSDのバグに関連していると思われます。