FATファイルシステムを壊さないようにするには(FATファイルシステム解説③)

つぶつぶコラム

「FATファイルシステムについて」の最終第3回コラムになります。
前半をまだご覧にになっていない方は是非他の記事も合わせてお読みください。

第1回FATファイルシステムについて

第2回FATファイルシステムについて

FATファイスシステムの壊れ方

ここでは、これまでに遭遇してきたファイルシステムの壊れ方について書いておこうと思います。

壊れる原因

FATファイルシステムでは、1つのファイルを構成する要素が3つあります。FAT、ディレクトリエントリ、データです。この3つは常に正しい関連性を保たなければなりませんが、メディア上の書き込まれる領域は別々になっています。

FATはクラスタのチェイン情報を記録し、ディレクトリエントリにはファイル名、属性、タイムスタンプ、先頭クラスタ番号、ファイルサイズが記録されています。データはファイルのデータそのものです。

この3つの情報に矛盾などが生じるとエラーとなります。(正確にはFATとディレクトリエントリです。データそのもののエラーは検出できません。)さらにFATは一般的に2つあることが多く両方を更新する必要があります。(FATの数はフォーマット時に決まり、最大8個まで定義できます。8個ある場合は8個のすべてを更新する必要があります)FATが複数あるのはバックアップのためで、障害発生時にバックアップから復元するためとされています。複数あるFATに差異がある場合はエラーと認識する必要があります。

メディアの情報が壊れる主な原因は、動作中にメディアが取り外される、キャッシュの書き戻しを行う前に電源が遮断される、などが上げられます。

サイズ不足

ファイルのサイズはディレクトリエントリにバイト単位のサイズ情報が保存されています。

この値と、FATチェインの長さ(もちろんクラスタサイズ単位です)に矛盾が発見されるとエラーとなります。

ファイルサイズに対してFATチェインが長い場合は、ディレクトリエントリのサイズ情報、もしくはFATチェイン情報が異常な状態になっていると判断できます。

主にFATチェイン情報は書き込めているが、ディレクトリエントリ情報の書き込みが出来ていない場合に起こりやすいです。

FAT長不足

上記「サイズ不足」と同様の現象ですが、ファイルサイズに対してFATチェインが短い場合に、このエラーになります。

FATチェインが短い場合、ファイスサイズまでアクセスしようとしても、アクセスするクラスタ番号が不明になる為エラーになります。

主にディレクトリエントリ情報は書き込めているがFATチェイン情報の書き込みが出来ていない場合に起こりやすいです。

クロスリンク

FATチェイン情報は片方向のチェイン構造なので、1つのFATには次に繋がっているクラスタ番号が記録されています。FATはチェイン情報なので1つのクラスタを指すFATは1つのみになります。

クロスリンクは1つのクラスタを指すFATが2つ以上存在する状態を指します。

この状態になると、ファイルAとファイルBのデータ領域が同じクラスタを指し示すことになります。

もちろんこの状態は異常なのでエラーとして検出しなければなりません。

浮きクラスタ

これが名称として当てはまるのかは分かりませんが、どのディレクトリエントリ、FATチェインからも繋がっていないにもかかわらず使用中のクラスタを指します。

容量が減るだけで、特に悪さをするわけでもないエラーです。

どことも繋がっていないので削除(クラスタの開放)もできません。

ファイルシステムの動作としてもエラーになるわけでもなく、ファイルシステムのエラーチェック(Windowsのchkdskなどの)ツールで検出できるぐらいの現象です。

FATファイルシステムを壊さないようにする方法

FATファイルシステムは様々な要因で情報の不整合が起こり、エラーが発生します。

FATファイルシステムを壊さないようにするための方法について記載しようと思います。

方法としては大きく2つあり、なるべく壊れないようなアクセスを心がける、ことと、壊れた後に修正する、が考えられます。

なるべく壊れないようなアクセスする

FATファイルシステムが壊れる一番の要因は、動作中に電源が切れたり、不用意なメディアの切断により、メモリ上のデータとメディアの状態に不一致が生じることです。この不一致はホスト側のファイルシステムにキャッシュバッファを持つ場合に起こりやすくなります。

これを避けるには毎回メモリ上のデータがメディアに反映されてからメディアとの接続を切断することです。

例えば、作業者にメディアの取り出し表示を行って、適切な状態でメディアとの切断を行うなどになります。

ですが、電源はいつ切れるかもわかりません。これに関しては、なるべく壊れないようなアクセスを行うしかありません。一連の書き込み処理を行った後、メモリ(キャッシュバッファ)に残っている未書き込みの情報をメディアに書き出すことで壊れる確率を下げることができます。多くのファイルシステムにはSYNC(同期)を行うAPIがあると思います。SYNCを行うことでメディアに未書き込みのデータを書きだすことができると思います。

壊れた後に修正する

これは、Windowsなどのchkdskコマンドに該当する処理になります。

メディアをチェックしてエラーがあればこれを修復します。この修復も基本的にはエラーの起きているファイルを削除したり、ファイルを切り詰めたりすることで修復を行います。

NTFSなどのジャーナリングファイルシステムでは、ジャーナルと呼ばれる情報を持ち、ジャーナルの情報に従って修復するものもあります。

残念ながらGR-FILEには修復する機能は無い為、万一壊れた場合はWindowsなどで修復していただくようにお願いしています。

3回にわたりFATファイルシステムについて解説しましたが如何でしたでしょうか。
少しでも役立てられたら幸いです。

GR-File関連製品のページはこちら