linuxで FATテーブルの壊れたメモリカードをマウントし、findコマンドでカー
ド内のファイル一覧を取得しようとすると以下のようなエラーをsyslogに吐き
続けてfind が終了しない状況が起きています。
> ...
> FAT: Filesystem panic (dev sdb1)
> fat_get_cluster: invalid cluster chain (i_pos 0)
> attempt to access beyond end of device
> sdb: rw=0, want=3926688, limit=3915072
> ...
/dev/sdb1はCentOS5.3で以下のように自動マウントされています。
/dev/sdb1 on /media/NO NAME type vfat (rw,noexec,nosuid,nodev,shortname=winnt,uid=500)
質問したいのは「FATが壊れているメモリカード内のファイル一覧を取得する
方法」についてです。FAT修復後の完全なリストは得られなくても構わないの
で、永遠に返ってこない状態が回避できれば良いと考えています。
自分で試した方法としては以下のようなものです。これ以外のアイディアを募
集します。 mountや findのオプションで何とか対処できるのが良いと考えて
います。
* FATテーブルを修復してから使う
* 一定時間経過後に強制中断する
原理的には
dd if=/dev/sdb1 of=~/fd.img
と dd を使ってイメージファイルを抜き出して、抜き出したイメージファイルをバイナリエディタで開いて、FAT の構造を考えながら見つけ出す。
....とすれば可能だと思うのですが、さすがにイメージファイルをそのままバイナリエディタで、というのがあまりにも原始的なので、何か良いツールがあると良いのですが、今のところちょっと見つけられません。
linux上での修復に固執していては、なかなか直るものも直らないと思います。(たしかに頑丈に作られていて、少々ならばコケないんですが)
メッセージはファイルシステムとしてクラスターのチェーンが壊れているという内容ですから、通常のファイルリストを取るルーチンをもっているものはコケると思います。
Windowsはやはり、豊富にユーティリティがあり、CHKDSKというOSコマンドでクラスタ破壊を修復するものや、
SCANDISK(http://www.shareedge.com/modules/shareware/view.php?lid=20090327...)といったものを試用することで、なんとかなることもあります。
さらにMSサイトからダウンロードできる、DiskProbeを使えばFATを直接読むことで、ファイルリストだけを取ることも可能です。
http://itaya.corso-b.net/TIPS/DiskProbe/DiskProbe.html
Linuxでの修復はむつかしいか、と思います。こういうのは代替がないので、一回やりそこなうと永遠にデータが消えたりしますものね。
コメント(1件)
ただ、ちょっと自分の文章力のなさを反省しております。皆様「linuxもしくは上で修復する」ことに対してアドバイスを下さったのですが、自分の要望としては「linux上で完全な形なくても良いからファイルリストを得る方法」だったのです。修復してから読み込ませるのはもっとも正しい方法だとは理解しているのですが、その前に「壊れてるメモリカードを入れると処理がストールする」という問題を解決したかったのです。
FATの修復方法はWindows標準のコマンドしか知らなかったので、紹介頂いたようなツールを知ることができて大変参考になりました。色々試してみたいと思います。
当初の問題であったリストの一覧取得については、どうもmountやfindのオプション指定でどうにかなる問題ではなさそうだという感じで、エラーチェックを細かく入れたfindっぽいコマンドを自作するしかないかなと考えています。
どうもありがとうございました。