PhotoRecによる削除済みファイルの復元

写真1 HDDを別のLinuxマシンに接続して復元

誤って削除してしまったファイルをPhotoRecを使って復元した際の記録です.

経緯

玄箱に格納していた*.wavファイル10個をフォルダごと削除してしまいました. 玄箱はsamba経由で使っているので,ゴミ箱には移動せず,いきなりファイルが消えてしまいました. この誤って削除してしまった10個の*.wavファイルを ファイル復元ツールPhotoRecを使って復元しようというのが今回のプロジェクトです. [本来CDから再作成しろっていう話なんでしょうけど,テストケースとして面白そうだったので…. しかも このCD,実家の押入れのどこかにしまってある膨大なCDの中のひとつで,CD引っ張り出してくるのも,それはそれで たいへんそうでしたし.]

復元対象のファイルが含まれるハードディスクは次のとおりです.

製品 Seagate Barracuda 7200.10
サイズ 500GB
ファイルシステム Linux ext3
備考 玄箱HGに接続して使っていたディスクな点が ちょっと心配. CPUがPowerPC系だし,Intelマシンからマウントしてうまく操作できるのかな….

今回はハードディスクを玄箱HGからはずして,別のIntelベースのLinuxマシンに接続・マウントしてからPhotoRecをかける方法にしています. うまくやれば玄箱HGだけで復元もできそうなのですけど,後述の復元にかかる時間の問題から,玄箱HGの非力なCPUでは実用的な解決策にならないと思います. [まぁ,実は私がHDDを別のマシンにつなぎなおしてPhotoRecをかけようと思った動機は玄箱HGで動作するPhotoRecを探してきたり・リコンパイルしたり, 復元先のHDDを玄箱HGに追加したりするのが面倒そうだなぁと思ったからで,復元にかかる時間とか熟慮した結果というわけではないのですけど, 結果オーライで正解でした.]

PhotoRecによる復元手順

まずは何はともあれPhotoRecをインストールします. インストール方法はご利用中のディストリビューションごとに いろいろですけど,ubuntuなら以下のコマンドでインストールできます(*1). GUIでやりたい人はSynapticで“photorec”を検索するとtestdiskが見つかりますので,それをインストールすればOKです.

$ sudo apt-get install testdisk

(*1) ubuntuでは“testdisk”というパッケージ名で収録されています. testdiskパッケージには,削除ファイル復元の“PhotoRec”のほかに“TestDisk”が収録されています. TestDiskは,誤ってハードディスクのパーティションを削除してしまったときなどにファイルシステム全体を復元するために使うツールです.
dpkg -L testdisk”とすると,パッケージtestdiskにPhotoRecが収録されていることが確認できます (RPM系の場合は“rpm -ql パッケージ名”か“rpm -qlp ファイル名”で同じことができます).

PhotoRecはCUIアプリケーションなので,ターミナルを開いて以下のコマンドを打って起動する必要があります. CUIアプリケーションではあるのですけど,マウスこそ使えないものの 基本的に画面に表示されるメッセージに沿ってカーソルキーとかで選択していくだけで使えますので,特に難しいことはありません.

$ sudo photorec

特に説明しなくてもわかるとは思いますが,とりあえずスクリーンショットを載せておきますので,参考にしてください. 画像をクリックすると等倍の大きい画像が見れます.

(1)復元もとディスクの選択 (2)パーティション種別の選択
★問題のHDDは玄箱HGがフォーマットしたもので,玄箱HGはCPUがPowerPCだから何を選べばよいのか困ったのだけど, どうやらIntelを選んでおいて問題ないみたいです(実証済みですけど根拠はありません).
(3)復元もとパーティションの選択
★ディスク全体も選べます.
(4)重要:“→”キー2回押して“File Opt”を選択
(5)復元対象ファイル種別の選択
★必要なファイル種別だけ残して全部オフにします…したほうがよいと思います. ものすごく時間がかかるので.
(6)ファイルシステム種別の選択
★今回は玄箱HGですので,Linux EXT3を選択しています.
(7)復元先のディレクトリの選択
★要領に余裕のある場所を選びましょう. あと,復元もとと違うパーティションを選ばないと台無しです
(8)復元中の画面
★サンプルは予想残り時間が4時間16分09秒と表示されていますが,実はまったくアテになりません. 実際には16時間以上かかりました. また,1パス目が終わって喜んでも すぐに2パス目が走り始めて結局それからさらに倍の時間がかかったりします.
PhotoRecが復元したファイル(拡大

PhotoRecによる復元のあとの手作業(これがつらい…)

PhotoRecが復元したファイルは指定したディレクトリの下にrecup_dir.*”というディレクトリをつくって500ファイルずつ格納されます. 今回は4836ファイル復元されました. 復元されたファイルは*.wav*.aviの2種類です. おそらくヒューリスティックの利き目が大きいファイルほど正確に復元されるのだと思います (正確に復元されるというのは,復元してほしいファイルは確実に復元され,かつゴミをひろわないという意味です).

オーディオCDから作成したファイルの場合,J-POPなどの普通の曲は30〜50MB程度になると考えられる(*1)ことから, この範囲を大きくはずれるファイルはバッサリ削除してしまってよいでしょう(*2). でも,この範囲に入っているファイルは やっぱり ひとつずつ聞いて調べるしかありません. 今回の例では,PhotoRecが拾ってきた約5000のファイルのうち,ファイルサイズで絞り込んだあとに残ったファイルは まだ800以上ありました.

(*1) WAV形式だと,サンプリングレート 44.1kHz(44.1k[1/s]),量子化ビット数 16ビット,ステレオ(2チャンネル)なので, 1秒あたり44.1k[1/s]×16[bit]×2=1411.2kbps≒172KBのファイルができることになります. なので,3〜5分の曲なら,30〜50KBのファイルになることがわかります. [備考 44.1kHzのkは1000,ファイルサイズ172KBのKは1024であることに注意. サンプリングレート44.1kHz×量子化ビット数16ビット×2チャンネルとして求めた1秒あたりに作成される情報量1411.2kbpsのことを“ビットレート”と呼んでいます. ビットレートは音質をあらわすひとつの基準と考えられていることから,音質の高低を表現するために128kbpsのWMAファイルとか320kbpsのMP3ファイルなどと呼ぶ慣習があります. ビットレートと大まかな時間がわかればファイルサイズが推定できます.]
(*2) 30〜50MBのファイルを探すにはfindコマンドを使って,
$ find recup_dir.* -name '*.wav' \( -size 30M -o -size 40M -o -size 50M \) -exec ls -l {} \;
とし…ませんよね. 普通nautilusとかdolphin(Windows風にいうとExplorer)でファイルサイズ順に並べなおして選択・削除するのが簡単&便利ですね.

今回は たまたま同じディスク上にプレゼンテーション ソフト用の素材集がCD-ROM 20枚分も入っていて, その中に大量の*.wav*.aviが入っていたため, PhotoRecが復元したファイルが約5000と多くて手作業工程でヒドイ目にあいました. 今回は復元したいファイルの目星がついていたので,*.aviは全部削除してよかったし, *.wavもプレゼンテーションの効果音用のものは ほとんど全部がKB単位の小さいものだから,簡単に見分けがつきましたけど, これが たとえばMP3音楽ライブラリから1曲削除したものを探すとかだと たぶんギブアップしてたのではないかと思います. CDから変換したファイルは再度CDから変換しなおせばよいから,努力しようという気がおきませんし. ICレコーダーで自分で録音した講演会やインタビューの録音は,血眼になってでも探す必要があるのですけど, こちらは録音時間が長いからファイルサイズが大きいそうとか,頭を使えば総あたりではなく ある程度絞込みができそうです.

復元結果

手作業も終わった時点での総合的な復元結果は以下のとおりでした.

PhotoRecによる復元が成功したファイル 10個
正しく復元できたファイル 7個
復元は成功したが中身が壊れていたファイル 3個

今回のPhotoRecの復元率は10/10で100%でした. というわけで,PhotoRecの優秀さは一目瞭然です. なお,復元したファイルのうち3つが壊れていたのは,OSが別のファイルを上書きしてしまったなどが原因と考えられ, PhotoRecの復元が失敗したわけではありません.

今回は誤操作によるファイルの削除に気がついたあと玄箱HGを停止するまでの間に,明示的なファイルの書き込みなどはしていないのですが, 誤操作のあと一瞬自分でも何をしたのかわからなくなって,samba経由でいろいろ操作をしてしまったし(この間sambaがログを膨らませたりしたかも), そうでなくてもOSがシャットダウンする際にさまざまな情報をHDDに保存したりするので, 削除直後でも削除済みファイルの中身がこわれてしまったのだと思われます. データだけを保存しているディスク(パーティション)だとLinuxでも生きている可能性が高いと思いますが, OSが作業用に使うようなディレクトリと共用している領域だと削除したファイルが生きているかどうかは運次第です. しかし,このあたりを加味しても,PhotoRecによるファイルの復元は非常に有用なものだと考えられます.

次にPhotoRecを使ったファイル復元の問題点をあげておきます.

PhotoRecを使ってファイルを復元する際の問題点

とにかく時間がかかる

今回の500GBのハードディスクから*.wavを復元する例で,16時間くらいかかりました. この時間はPhotoRecが*.wavファイルを“総ざらい”してくるのにかかる時間であって, その後ちまちまと手動で正解ファイルを選び出す作業時間は含んでいません. ファイルシステムがLinux ext3だとファイル名は完全に失われている(*3)ため, PhotoRecが16時間つかって拾ってきた膨大なファイルの中から,ホントに復元したい正解ファイルを探すのに さらに数時間かかります. 場合によってはPhotoRec後の手作業部分が数十時間や数日かかることも想定しないといけないのかもしれません. たとえば,写真とかだ先述したようなファイルサイズによるヒューリスティックが使えないから, 数千枚の写真を目視確認しながら目的のファイルを探すとなると途中でガッツが足りなくなるかもしれません.

ほかの方が書いておられる記事を読むと, おなじ500MBのハードディスクで4時間とか,もっとずっと短い時間になっているようなのですけど, これはもしかしたらファイルシステムの違いや探すファイルの種類の違いが影響しているのかもしれません. ファイルの先頭数バイトに特定のマジックナンバーがあるような形式のファイルだと, このマジックナンバーの有無だけで復元対象のファイルかどうかをわかるため検索が速くなるのかもしれません. そういう意味では*.wavファイルもかなりヒューリスティックの効果がありそうなファイルなのですけども….

(*3) UNIXではファイル名はファイル自身ではなくディレクトリファイルが記録しているため, そもそもファイルを復元してもファイル名(またはファイル名の一部)が もとにもどるはずはないです. この意味ではWindowsのNTFSなど,現在のパソコンで主流になっているUNIXライクな仕組みのファイルシステムは すべて同様です. FATみたいにファイル名の先頭がピリオドにかわるだけとかなら,ファイル名から目的のファイルが探し出せるので,あとの処理が楽なのですけど.

削除してない普通のファイルも復元される

今回PhotoRecが復元したファイル数が約5000と膨大になっているのは, PhotoRecが削除されていないファイルも復元してきてしまうからのようです. これはおそらく最大限ファイルを救い出すために,ディスクを先頭から全スキャンして可能性のあるものは手当たりしだい復元する仕様になっているからでしょう. ファイルシステムを適切に解析すればディレクトリからの参照が切れてないファイル(つまり削除されていないファイル)を 復元対象にしない設計にもできるように思うのですけど,そうはなっていないようです. PhotoRecの“Photo”という名前から想像するに,もともとはデジカメで使ってるSDカードとかから復元するのを想定していて, 復元されるファイル数は高々知れているので,全復元のほうがうれしいだろうという基本設計になっているのかもしれません. 最近だとハードディスクはTBクラスもざらにあるので,この仕様だとPhotoRecの後工程が恐ろしいことになってしまいそうです.

参考資料

[1] PhotoRec
[2] Wikipedia > PhotoRec
[2] 玄箱/HG ハードディスクの取り付け
玄箱/HGへのハードディスクの取り付け方法が写真つきでわかりやすく説明されています. どこにしまいこんだかわからなくなったマニュアルを引っ張り出してくるのが面倒な際に便利です.

はたいたかし
2008-12-06
Home > Linux > PhotoRec