Mona の FAT32 実装のバグを直した

Mona 上でファイルを作り、データを書きこむ。その後 QEMU を停止し fat32_user.img を Linux から mount する。mount 後 cp コマンドで Mona のファイルを Linux にバックアップするのだが、ときどき Linuxファイルシステムが Input error を吐いてファイルが読めなくなる。たまにしか見ないので放置していたが今日 2 回も見かけたので調べた。
Linuxファイルシステムはエラーの詳細を教えてくれるわけではない。ただ「読めない」と言うだけ。しょうがないのでイメージファイルをバイナリエディタで開く。おもむろに心眼で以下の情報を読み取る。


さらにルートディレクトリのディレクトリエントリからサブディレクトリのクラスタを辿る。目的の壊れたファイルのディレクトリエントリに到達。まずチェックすべきは Long file name エントリが正常であること。次に通常のディレクトリエントリをチェック。サイズも大丈夫だ問題ない。ふーむでは開始クラスタを見てみよう。あれファイルの内容はきちんと残ってる。FAT を見てもきちんと終端されてる。
どう見ても正しく読めそう。チェックサムを疑ったがあってた。正常に読めているファイルと全ての属性を比較してみよう。directory_entry->rsvd という予約済みの属性が正常だと全て 0 だが壊れたファイルで 0 ではない。ひょっとしてこれかな。バイナリエディタで 0 埋めして mount したら読めた。なるほど。Linux の VFAT 実装は rsvd が 0 かどうか見ているのだね。というわけで直った。


一時的に心眼を開いて FAT32 イメージをバイナリエディタで読んでみて、こういうトラブルシュートはプログラムでやるのは難しそうだと思った。どこが壊れているか分からないから。SDカードとかの FAT32 が壊れて写真ファイルが読めなくなった。みたいなトラブルを心眼でどうにかする商売とかどうかな。