電源瞬断による破損
ファイルシステムの変更操作はおおむね下記のとおりです。
- ファイル/ディレクトリの作成
- ファイル/ディレクトリの削除
- ファイル追加書き込み
- ファイル上書き
- FAT更新
それぞれの場合について、電源瞬断による破損の内容を見てみましょう。
ファイル/ディレクトリの作成
作成処理は、親ディレクトリのクラスタに新たなディレクトリエントリを追加することです。
以下の場合が考えられます。
- 親ディレクトリのクラスタにまだ未使用または再利用可能なディレクトリエントリがある場合は、そのディレクトリにファイル名などのデータを書き込むだけで処理が完了します。
この場合、クラスタのみを更新すればよいのです。 - 親ディレクトリのクラスタに使用できるディレクトリエントリがない場合は、新たにクラスタを設けなければならないので、クラスタの新規書き込みおよびFATの更新が必要になります。
- 新設するディレクトリエントリがロングエントリ (ファイル名称が長く 32バイトのディレクトリエントリに収まらない場合、連続したディレクトリエントリを使ってファイル名称を格納するためのもの) で、親ディレクトリのクラスタをまたがってしまう場合は、クラスタ更新 (または新設) が2回必要です。
さらに、クラスタ新設が必要な場合は、FATも更新しなければなりません。
このように、ファイルやディレクトリを作成するとき、NAND型フラッシュへの書き込みが複数回にわたって実行されることがわかります。
フラッシュのドライバが、一回の書き込みに対して、耐電源障害性を保証するだけでは、複数回の書き込みの間に電源瞬断が発生すると、論理構造が崩れる可能性があります。
ファイル/ディレクトリの削除
ファイルやディレクトリ削除の場合は、ディレクトリエントリに削除マークを入れることのみで済みます。
したがって、通常の場合、所属するクラスタの1回のみの更新で処理が完了します。
ただし、たとえば一度にたくさんファイルを作成し、親ディレクトリのクラスタ数が二つ以上になったとき、ファイルを削除処理においてディレクトリエントリに削除マークを入れるだけでは、すべてのディレクトリエントリが削除されたクラスタがむだな領域となってしまう恐れがあります。
このようなクラスタを回収する処理は、FAT更新処理を含むため、後述するように、書き込み単位でのデータの安全性を保障するドライバでは耐電源障害性を保つことが難しいのです。
データ追加書き込み
この処理は、ファイルにデータを書き込むことです。
以下の場合が考えられます。
- 書き込みデータサイズが十分小さく、新たにクラスタを用意しなくてもよい場合は、データクラスタの更新とディレクトリエントリ内に書かれているサイズ情報を更新しなければなりません。
書き込みが複数回に渡るので、電源の瞬断でファイルシステムがダメージを受ける可能性があります。 - 新たなクラスタを用意しなければならない場合は、クラスタ更新、ディレクトリエントリ更新にFATの更新も必要になります。
ここもやはり、書き込みが複数回にわたるため、電源の瞬断への配慮が必要です。
データ上書き
この処理は、ファイルの既存データに新たなデータを上書きすることです。
上書きであるため、FAT更新も、ディレクトリエントリ更新も必要ないのですが、電源瞬断への配慮が必要です。
なぜなら、上書き範囲がクラスタをまたがる場合は、更新が複数回に渡ることになり、すべてのクラスタ更新が完了しないうちに電源瞬断が発生すると、それまで更新されたクラスタは新しいデータを、更新されていないクラスタは古いデータを持つことになり、いわゆる新旧データの混合状態になってしまいます。
FAT更新
FATを更新するときに、更新するエントリの数が2以上で、フラッシュへの書き込み回数が複数回にわたると、更新が完了するまでの電源の瞬断でFATチェーンが切れてしまう可能性があります。
上述のように、FATファイルシステムにおいて、処理内容によって、フラッシュへの書き込みが複数回にわたることになり、途中での電源の瞬断でファイルシステムの論理構造が崩れてしまいます。
つぎに、これらの場合への電源瞬断対策について述べます。

