古めのAndroid端末のmicroSDが論理的に損傷したのでデータ救出した

 auから発売されていたAQUOS PHONE SERIE SHL22をmineo契約のSIMで使用しています。
 発売時からAndroid 4.2.2でOS Updateは提供されずに終息したモデルのため、今でもJelly Beanのままとなっています(なのでポケモンGoが導入できない程度に古い)。
 別途SIMロックフリー端末も併用しているため、SHL22は専らおサイフケータイとして使用しており、それ以外では他端末のバッテリ残量が厳しいときなどに使用するサブ的な端末として利用しています。このため、スペックの低さはあまりストレスにはならないのですが、掲題の通り挿入していたmicroSDXCカードに論理障害が発生してしまいました。その状態からのデータ救出方法などを以下に記載しておきます。
 

発生事象

 (SHL22とは無関係に)ノートPCで作業中、隣に置いていたSHL22の画面が突然点灯したことに気付きました。何だろうと思っていたら電源投入時の起動画面が表示されたため、どうやら何らかの障害で再起動が掛かったようです。意図せず再起動されることはこれまでにも稀に発生していたため、特に気にせず放置していました。

 しばらくしてからSHL22の画面をONにすると、microSDカードのようなアイコンが通知領域に表示されていることに気付きました。
通知領域に表示されたアイコン

 通知を開いてみると以下のメッセージが表示されています。
通知内容

空のmicroSD
microsdが空か、サポート対象外のファイルシステムを使用しています

 先の意図しない再起動が発生するまでは問題無かったのですが、何故かmicroSDが認識されていないようです。
 この通知をタップするとmicroSDをフォーマットするかの確認に移るため、(既に記録されているデータがあるため)フォーマットはせずに、とりあえず手動で再起動してみました。

 が、再起動後も同じ通知が表示されmicroSDは認識されません。

 実は過去にdocomoREGZA PHONE T-02Dでも同様の症状を経験したことがあります。特に出し入れしたわけでもなく挿入しっ放しのmicroSDが同様のメッセージが表示されて突如認識されなくなりました。
 T-02Dで発生した際はノーブランドの安物のmicroSDカードを使用していたため、そのせいもあるのかと思っていましたが、SHL22で使用していたのはSAMSUNGのEVOシリーズのMB-MP64Dというまともなカードです。
 怪しげな販売店で購入したわけでもなくAmazon*1で購入したため、カード自体の品質が(たまたま動作不良を起こした可能性を完全に否定することはできませんが)怪しいものではないはずです。
 

データ救出

 スマートフォンではどうにもできないので、PCでデータ救出を試みます。

 まずはスマートフォンをシャットダウンして電源を落とした後、microSDカードを取り出します。
 そしてPCに挿入しますが、Windowsでも認識できずフォーマットを求められてしまいましたので、このダイアログでは[キャンセル]を選択します。
Windowsによるフォーマットダイアログ

 このmicroSDにはSHL22で撮影した画像が少し入っていただけのはずなので、デジタルカメラのSDカードが論理障害を起こした際と同様に、ZARでデータ救出を試みることにします。
 

ZAR

 ZARを起動しmicroSDを分析すると、データの断片が見当たります(前述の通り私はSHL22でほとんど撮影していないので、データの痕跡も極端に少ないのは正常です)。
ZAR volume analysis

 6枚の画像が救出できそうなことが判ります(ZARではファイル名は復元できないので、i+5桁連番.拡張子というファイル名になります)。末尾のi00006.jpgだけ60GB近くもあり、おかしなことになっています。恐らくEOFが識別できていないのでしょう。とりあえず、全部選択しておきます。
ZAR recovery target file selection

 救出するファイルの格納先のパスを指定して、処理を開始します。
ZAR file copy setting

 しばらく待った後、指定したパスにファイルが生成されますので、基本的にはこれだけで救出完了です。

2017/05/15  18:57         2,710,528 i00000.jpg
2017/05/15  18:57         2,775,040 i00001.jpg
2017/05/15  18:57         3,276,800 i00002.jpg
2017/05/15  18:57         1,972,224 i00003.jpg
2017/05/15  18:57         2,950,144 i00004.jpg
2017/05/15  18:57         2,388,480 i00005.jpg
2017/05/15  19:50    63,959,859,200 i00006.jpg

 確認したところ、i00000~i00005は普通にJPGファイルとして正常に表示可能な状態になっていました。

 ですが、前述の通り今回はi00006.jpgだけ異常に巨大で明らかに様子がおかしいです。このmicroSDXCカードは64GBのメディアなので、i00000~i00005を除いた全領域のデータがi00006として記録されているような感じではないかと想像されます。
 それでもi00006を無理に表示してみるとJPG画像としては上の方の領域だけ無事で、残りの領域は壊れた状態で表示されました。
 何とかならないものかと、引き続きもう少し調べてみることにします。
 

損傷したファイルの分析

 i00006.jpgをexiftoolに食わせてみると、普通にメタデータにアクセスできました。

C:\data\recover_shl22\ROOT>exiftool i00006.jpg
ExifTool Version Number         : 9.62
File Name                       : i00006.jpg
Directory                       : .
File Size                       : 60997 MB
File Type                       : JPEG
MIME Type                       : image/jpeg
Exif Byte Order                 : Big-endian (Motorola, MM)
Image Description               : DSC_0013
Make                            : SHARP
Camera Model Name               : SHL22
Exposure Time                   : 1/1286
F Number                        : 1.9
ISO                             : 40
Exif Version                    : 0230
Date/Time Original              : 2017:05:04 13:48:32
…略…

 EXIFがダメージを受けていないことから察するにファイルの前方の領域は正常なようです。

 JPEGファイルとしての体は為しているようなのでImageMagickで画像を読み出して、別ファイルに記録してみます。

C:\data\recover_shl22\ROOT>convert i00006.jpg i00006_.jpg
convert: Corrupt JPEG data: premature end of data segment `i00006.jpg' @ warning/jpeg.c/JPEGWarningHandler/365.
convert: Unsupported marker type 0x4a `i00006.jpg' @ warning/jpeg.c/JPEGErrorHandler/328.

 データセグメントの終わりが早すぎるからJPEGデータが壊れてるよ!0x4Aとかいうマーカータイプは知らないよ!というエラーが発生しました。それでも出力ファイルは一応生成されているので開いて見ると、先に無理やり開いてみた時と同様に画像上部のみが生きており、その他の領域は情報が失われています。
損傷したJPEGファイル

 次に、i00006.jpgをバイナリエディタで開いてみたところ、0x000000~0x0DFFFFまでの領域にはデータが記録されていますが、そこから先の0x0E0000以降の領域は0xFFで埋め尽くされており、有意なデータが何も記録されていないことが判明しました。
損傷したJPEGファイルのバイナリ

 これなら画像上部以外が何も表示されないというのも納得です。試しに0x0E0000番地以降を削除したファイルを作ってみたところ、ImageMagickが出力したファイルと同様の画像が得られました。
 存在しない情報は復元しようがないので、i00006.jpgは諦めるしかありません。

 この状態から察するに、FATが壊れただけではなく記録済データ領域の末尾も何らかの理由により損傷していたようです。
 この画像をSHL22で撮影したのは障害発生日より何日も前なので、SDカードの記録不良ではないのでしょう(撮影時にエラーは発生していないため)。SHL22が意図せず再起動した際に発生していたOS/ミドル/アプリの何れかの障害により、データを損壊させたと考えるのが合理的だと思います。
 

microSDカードの初期化

 前述の理由から、microSDカードの不良である可能性は低そうですので、再利用して問題ないはずです。とは言え、一度障害が起きたカードなので普通にフォーマットしただけで再度利用するのは不安でもあります。

 そこで、SD Formatterを利用して上書きフォーマット・論理サイズ調整ONで初期化することで、全データ領域への書き込みを確認しつつ確実にフォーマットします。
SD Formatter

 全領域に書き込むため長時間を要しますが、正常に完了すれば以下のようなダイアログが表示されます。
f:id:kachine:20170516035753p:plain

 あとは使用する機器で普通にフォーマットすれば、特に不安を感じることなく再利用可能なはずです。
 



以上。

*1:マーケットプレイスではなくAmazon自身が販売する商品。