予想以上にがっつりやられてる。
きのう「写真は元のフォルダー内に元のファイル名で復旧したので助かった」と書いたが、きのうより前の写真を確認したところ、結構ボロボロ。
昔のフロッピーディスクの FAT みたいな壊れ方をしやがって💢
……ああそうか、この microSD カードのファイルシステムは exFAT だから、FAT の兄弟か。
ただ、1.44 メガバイトと 1 テラバイトでは、影響規模に差がありすぎるんだよなぁ。
¶ 被害
- 写真は、きのうの分は問題なく復旧できてたが、それより前の写真は行方不明のままだったり、中身が破損してたりするのが直近 1 年分ほど
- 毎週 3 個ずつダウンロードしてた音声ファイルは、少なくとも直近 1 年半の分が行方不明
- 動画ファイルは、直近 1 年間の更新日時になってる約 115 ファイルのうち、少なくとも 38 ファイルはサムネイルが表示されないレベルの破損で、行方不明の有無は不明
(サムネイルが表示されても全編正常に再生できるとは限らない)
- 歴代のスマホで取得したスクリーンショットや画像ファイル (SNS から保存したやつとか) を格納してた Pictures フォルダー内は空っぽ (すべて行方不明)
¶ 影響
- 自分で撮影した写真や動画は、Google フォトに保存容量節約画質で自動バックアップされたものが残ってる。元の画質じゃないのは残念だが、特に困ることはないと思う
- 有償でダウンロードしたファイルは基本的に PC か NAS にも保存してある (たぶん)
- 無償でダウンロードしたファイルは大半が期間限定のものなので、再ダウンロードできない可能性が高い
- Pictures フォルダーは、歴代のソシャゲの貴重な瞬間のスクリーンショットや機種変用の引継ぎコード、SNS から保存した画像などが失われており、再取得不可能
¶ 修復の真似事
本来はファイルシステムの破損に気づいたタイミングですぐに書込みを一切禁止し、dd 的なツールで丸ごとコピーした媒体もしくは丸ごと読み出したディスクイメージに対して修復作業を試みるべきだが、直接エラー チェック (CHKDSK) を掛けてしまった時点でもう手遅れ。
その際に出現した「FOUND.000」フォルダーを手元にコピーしておいた
*1
ので、そこに対して修復の真似事をやってみる。
Windows 上の Linux 環境であるところの
Pengwin
を超久々に使うため、とりあえず
pengwin-setup update
& sudo apt update
& sudo apt upgrade
を何回か実行して最新化してから。
$ sudo apt install file
$ file --mime-type FILE*.CHK | grep image/ | while IFS=':/' read from _ ext; do test $ext = jpeg && ext=jpg; mv -v $from ${from/.*}.$ext; done
$ file --mime-type FILE*.CHK | egrep 'audio/.*aac.* ' | while IFS=: read from _; do mv -v $from ${from/.*}.aac ; done
$ file --mime-type FILE*.CHK | egrep 'audio/.*mp?4a.*' | while IFS=: read from _; do mv -v $from ${from/.*}.m4a ; done
$ file --mime-type FILE*.CHK | grep video/mp | while IFS=: read from _; do mv -v $from ${from/.*}.mp4 ; done
$ file --mime-type FILE*.CHK | grep sqlite3 | while IFS=: read from _; do mv -v $from ${from/.*}.sqlite3; done
ここでいったんリネームされたファイルを確認してみたところ、jpg ファイルの 3 割程度は破損、png ファイルは過半数が破損 (基本的に画像の上のほうは見える)、m4a / mp4 ファイルの 3 割程度はファイルサイズが明らかに小さくて再生不可。
再生できるファイルの中には逆にファイルサイズが不自然に大きなものもあり、他のファイルの中身が誤ってくっついているものと思われる。
残りの CHK ファイルを file コマンドに通してみると octet-stream もしくは知らない形式が表示されたので、残りはファイルの断片だろうと判断。
確率的に直前のファイルの末尾に結合するのが正しそうと考え、適当に結合しまくることにした。
$ for f in FILE*; do echo $f; if [[ $f = *.CHK ]]; then cat $f >> $b && mv $f $f.bak; else b=$f; fi; done
その結果、数ギガバイトの jpg ファイルとかが爆誕してしまった w 不自然なサイズではないファイルも、先頭のほう以外が破損してたファイルは結局破損したまま。
直前のファイルと結合する案はダメかー。
これ以上がんばるつもりはないので、作業用の FOUND.000 フォルダーをサクッと削除して終了。
¶ クラウドに課金する前に
microSD カード内のデータは、ざっくり分類すると以下の通り。
- 自分で撮影した写真や動画 (歴代のスマホやフィーチャーフォン、デジカメの分を含む)
- ミュージックアプリでの再生用の音楽
- 単に保管しておく各種コンテンツのコレクション (少なくとも 1 回は観たり聴いたりしたもの)
1 点目は Google フォトに保存容量節約画質で自動バックアップされたものがあり、元の画質のものを常にスマホに入れておく必要はない。
2 点目は YouTube Music のサブスクで音楽を聴くようになってからは出番なし。
3 点目はコレクションなので、常にスマホに入れておく必要はない。
というワケで、microSD カード内のデータはスマホからいつでもアクセスできる必要はなさそうで、クラウドではなくただどこかに保管しておきさえすればいいという解釈ができる。
まずはスマホから microSD カードを取り出し、内部ストレージのみで運用してみるのがよさそうだ。
*1: メモ: FILE0000.CHK〜FILE3575.CHK のコピー中に気づいた範囲で、FILE3340.CHK、FILE3376.CHK と、FILE3526.CHK 以降は読込みが異様に遅かった。
ハードウェア的に壊れかけてる? それともコピー終盤で過熱により減速しただけ?🤔