マイクロドライブのデータを復活させる

現在位置のナビ

トップコンピュータの国雑記帳 → マイクロドライブのデータを復活させる

説明

マイクロドライブというのは、 コンパクトフラッシュの1種でディジタルカメラの記録装置に使われています。 形はメモリカードですが、中に小型のハードディスクが入っています。 このマイクロドライブを撮影に使用していて、書き込みのトラブルにあいました。 トラブルの現象から原因を予想して対策するまでを、ここに書きます。

現象

先月とあるイベントのスタッフとして、 私は記録写真を撮影していました。 その途中マイクロドライブの書き込みトラブルに遭遇しました。 使用していたマイクロドライブは、容量4GBのモデルです。 フォーマットは FAT32 です。 一枚当たり3MB程度のJPEGを50枚ほど撮影したところで、 撮影枚数のカウンターが1にもどってしまいました。 その後、撮影を続行して200枚ほどシャッターを切ったのですが、 カウンターは元にもどりませんでした。

撮影が終了したマイクロドライブを、 アダプター経由でPCに接続してみたのですが、 最初の50枚分の写真が失われていました。 その後失われた50枚分のデータを復活するまでの作業を以下に記します。

トラブル原因の予想

トラブルの出たマイクロドライブを、 Windows パソコンからアクセスしてみると、 最初に撮影していた写真が入っているフォルダが消えてしまっています。 また特定クラスタにアクセスすると、 Windows 自体がハングアップしてしまいます。 以上より、マイクロドライブの中に読みだし不可能なセクタ (bad sector)が存在するものと判断しました。

bad sector が存在するものとして、 トラブルの現象を仮説で説明してみます。 Windows の FAT ファイルシステムの知識がないと、 この章はチンプンカンプンでしょう。 そういう人は、この章の残りを読み飛ばしてしまってかまいません。

最初 bad sector は、ときどき read error になる程度でした。 そして、運悪くこの bad sector に、ディレクトリ情報が割り当てられたのです。 写真を1枚撮影するたびに、ディレクトリ情報は更新されます。 古いディレクトリ情報を読み込み、新規ファイル分のエントリを追加し、 その情報をマイクロドライブに書き戻します。 50枚撮影した所までは正常でした。 51枚目を撮影したときにディレクトリ情報の読み出しに失敗してしまったのです。 そこでカメラは新規ディレクトリ情報を作成し、 51枚目を1枚目の写真として登録しました。 その瞬間、過去の50枚分の写真へ到達するエントリが失われてしまったのです。 ディレクトリのエントリは失われましたが、 FAT上には連続したクラスタ群としてファイルの情報が残っています。 ファイルサイズの情報も失われたので、 FATからファイルを復活すると、ファイルの末尾にゴミが追加されてしまいます。 しかし、失われたのはJPEGファイルです。 JPEGファイルならヘッダにビットマップのサイズ情報があるので、 余計なデータが末尾に増えても無視することができます。 後は、 どこからも指されていないけれどFAT上に残っているクラスタ情報を探しだし、 ファイルとして復活させれば良いのです。

ファイル復活の手順

先の章で対策はわかったので、後は必要な作業をするだけです。 復活には Linux を用いてフリーソフトだけで行いました。 以下の作業を行うには、 How a Corrupted USB Drive Was Saved by GNU/Linux | Linux Journal の情報を参考にしました。 なお、以降の作業には root 権限が必要なものが含まれています。

マイクロドライブイメージの取得

最初にしたことは、 これ以上マイクロドライブのダメージが大きくなる前に、 ドライブのイメージをHDD上に保存することでした。 マイクロドライブをUSBアダプタ経由で Linux マシンに接続したところ、 /dev/sda として認識されました。

# cp /dev/sda1 DriveImage

マイクロドライブイメージをループデバイスとしてアクセスする

保存したイメージを、ループデバイスとしてアクセスします。 保存したデータをこわさないように、ファイルをコピーして作業します。

# cp DriveImage /tmp/image
# losetup /dev/loop2 /tmp/image
# fsck.msdos -f -r /dev/loop2
# mkdir /mnt/MicroDrive
# mount -t vfat /dev/loop2 /mnt/MicroDrive

復元したファイルを保存する

ファイルの復元は終わりました。 HDDにコピーしましょう。

# cd /mnt/MicroDrive
# cp fsck* ~

後始末

作業の後始末をします。

# cd ~
# umount /mnt/MicroDrive
# rmdir /mnt/MicroDrive
# losetup -d /dev/loop2

2006年1月15日 初出


back button 雑記帳へ