電源瞬断対策
電源瞬断への対策として、以下の方法を考えます。
- フラッシュドライバに、クラスタ単位ではなく、一連の書き込みに対してもデータの健全性を保障する機能を盛り込む方法
- クラスタ単位書き込みのみでデータ健全性を保障し、ファイルシステムがダメージを受けても、破壊されないように更新手順を配慮する方法
- ファイル/ディレクトリの作成の場合
- ファイル/ディレクトリの削除の場合
- データ追加書き込みの場合
- データ上書きの場合
- FAT更新の場合
一連の書き込み保障方法
この方法では、フラッシュドライバが通常の書き込み処理機能以外に、それまでの書き込みを確定するAPIを提供します。
この確定APIが呼ばれる前に電源瞬断が発生しても、それまでの書き込みは単なるゴミ扱いとされ、ファイルシステムが影響を受けません。
フラッシュドライバが、このAPIの実行中に電源瞬断が発生しても新旧の状態が識別できるように実装されれば、ファイルシステムの耐電源障害性が保障されます。
クラスタ単位書き込み保障方法
この方法では、ドライバがクラスタ書き込み単位でのみデータの健全性を保障します。
この場合、既述のようにファイルシステム変更操作は、記憶メディアに対して複数回にわたって書き込みを行うため、処理中に電源瞬断が発生すると、論理構造が崩れてしまいます。
以降、論理構造が崩れても、ファイルシステムへのダメージを最小限にする方法を紹介します。
ファイル/ディレクトリの作成の場合
新たなクラスタを追加する必要がない場合は、一つのクラスタ更新で済むため、特別な配慮が不要です。
新たなクラスタを追加する必要がある場合は、書き込み順番は以下のようにします。
- 空きクラスタにディレクトリエントリを作成
- このタイミングで電源瞬断が発生しても、空きクラスタがゴミになるだけで、ファイルシステムへの影響はありません。
- FATチェーンを更新する。ただしチェーンの逆順に更新する
- たとえば既存のFATチェーンは、#10 → END で、新たにクラスタ #11 をつなごうとした場合、まず、FATエントリ #11 に ENDマーク書き込んだのち、エントリ #10 に 11 の数字を書き込みます。
- 仮に途中で電源瞬断が発生しても、チェーンの後半がゴミになるだけで、ファイルシステムには影響がおよびません。
ファイル/ディレクトリの削除の場合
使用済みディレクトリエントリのみが入っているクラスタが存在しない場合は、 FAT更新が生じず、ディレクトリエントリの更新が一回で済むので、電源瞬断への特別な配慮が不要です。
使用済みクラスタが出てきた場合は、以下の手順でそのクラスタを回収します。
既存のFATチェーンが、#10 → #11 → END の例を考えます。
今、クラスタ #11 にあるディレクトリエントリがすべて削除され、これを回収したい場合、
- FATエントリ #10 に ENDマークを格納。
- ここで電源瞬断が発生しても、更新前の状態であるか、FATエントリ #11 が宙ぶらりんになる状態です。
- どれにしても、ファイルシステムへの影響はありません。
データ追加書き込みの場合
新たにクラスタを追加しなくてもよい場合は、末尾のクラスタ更新と、ディレクトリエントリの更新 (ファイルサイズが変わっているので、それを更新しなければならない) が必要です。
更新順番は以下のようにします。
- 末尾のデータ更新。
- ここで、電源瞬断が発生しても、ファイルサイズがまだ古いままのため、後の書き込みなどで、書かれた部分を無効化することができます。
- ディレクトリエントリの更新。
- ここで、電源瞬断が発生しても、1の状態か更新完了の状態であるため、ファイルシステムがダメージを受けたとしても、1で述べたように修復可能です。
新たなクラスタを用意しなければならない場合は、クラスタ更新、ディレクトリエントリ更新にFATの更新も必要になります。
更新順番は以下のようにします。
- クラスタにデータを書き込みます。
- ここで電源障害が発生してもクラスタがゴミになるだけで、ファイルシステムへの影響はありません。
- FATチェーンの逆順に従って、FATエントリを更新。
- 既存FATチェーンにリンクする前に電源瞬断が発生した場合は、ファイルシステムへの影響はまったくありません。
- また、リンク完了した後に落ちた場合、ディレクトリエントリにファイルサイズ情報がまだ残っているため、後で修復できます。
- ディレクトリエントリを更新 (ファイルサイズ)。
- 更新完了する前に落ちても古いサイズが残っているので、修復可能です。
データ上書きの場合
クラスタをまたがない上書きは、該当クラスタを更新するだけで処理が済むため、電源瞬断への配慮が不要です。
クラスタをまたぐ場合は、古いクラスタをそのまま更新するのではなく、
- 新たなクラスタとFATチェーンを作成し、それができた時点で、旧FATチェーンにつなぎ換えます。
- つなぎ換え処理が完了する前に電源瞬断が発生しても旧FATチェーンおよび旧クラスタが何も変更されていないので、ファイルシステムには影響がありません。
- つなぎ換え処理が完了したら、自動的に新しいクラスタも有効になるので、旧/新データは混じってしまうことはありません。
FAT更新の場合
FATチェーンを伸ばすときはチェーンの逆方向に、縮むときは順方向に行えばファイルシステムに影響が及ぶことはありません。
このように、クラスタ書き込み単位でしかデータの安全性を保障しないシステムにおいても、ファイルシステムのがんばりで何とか耐電源障害性を実現することができます。

