ハードディスクの中身を誤って消した場合のファイル復旧方法

先日、私は自宅のデジタルビデオとデジタル写真をバックアップするためのディスク容量を十分に確保しようと思い、新しいハードディスクを買って自宅のLinuxサーバーに増設した。保存しようとするすべてのファイルを1つのハードディスクに移動し、新しいバージョンのLinuxにアップグレードするために古いハードディスクのパーティションを切り直した。オペレーティングシステムの再インストールを終えた後、バックアップハードディスクをマウントしたわけだが、そこで中身が空だということが判明した。どういうわけか、全データをバックアップしたハードディスクと、消去するハードディスクとを取り違えてしまったのだ。こうして外部メディアへのバックアップを失敗したおかげで、写真とビデオのバックアップをすべて失ってしまった。

私はしばらく呆然としていたが、なんとか立ち直り、ファイル復元の方法を探すことにした。失ったファイルやパーティションを取り戻せそうなものはないかとさまざまな商用製品の体験版を試してみたが、使えそうなものはなかった。最終的に見つかったのがTestDiskPhotoRecで、後者を使って失ったファイルを復元することができた。

TestDiskでは、事実上あらゆるファイルシステムのパーティションを復元することができる。PhotoRecでは、たいていの種類のファイルを復元することができ、ほとんどの画像形式やビデオ形式を復元できる。PhotoRecは既存のパーティションで使用できるほか、削除されたパーティションに対して、そのパーティションを復元せずにファイルだけを復元する目的で使うことも可能である。PhotoRecとTestDiskはどちらもDOS、Windows(9x、NT、2000、XP、2003)、Linux、FreeBSD、NetBSD、OpenBSD、Sun Solaris、Mac OS X上で実行することができ、それぞれの開発元によれば、ほとんどのUnixシステム上でコンパイルして実行できる。

復旧

私はまずKnoppix CDからTestDiskを実行して復旧に取りかかった。残念ながら既にパーティションテーブルを上書きしていたので、失ったパーティションについてハードディスクの網羅的検索を行うと、あまりに多くの結果が返されてきた。そこで、代わりにPhotoRecを使用してファイルを復元することにした。

PhotoRecは、削除済みとしてマークされたファイル(削除済みファイル)を検索し、そのファイルをディスクにコピーすることで復元を行う。これはつまり、ディスクイメージファイルから復元する場合を除いては、削除済みファイルが置かれているのと同じパーティションを復元先として選択してはならないということだ。もしこれを行うと、削除済みデータが完全に上書きされてしまう可能性がある。

もう1つ重要なことは、PhotoRecはかなり多くのファイルを復元する可能性があるということだ。そのため、ファイルの復元先のパーティションには、少なくとも復元対象のファイルを検索するパーティションと同じ程度の空き領域を確保しておくことをお勧めする。

実行できる復元方法には次のようなものがある。

  1. 別のハードディスクにファイルを復元する
  2. ネットワーク接続されたストレージドライブにファイルを復元する
  3. 同じハードディスク上の別のパーティションにファイルを復元する。
  4. ddrescueなどのツールを使用してハードディスクのイメージを作成し、パーティションを1つだけ使用してファイルを復元する

私の場合はパーティションを完全に消してしまっていたので、3番目の方法は使用できなかった。2番目の方法には、ネットワーク速度と待ち時間の問題が関係してくる。4番目の方法は、インシデント対応でハードディスクのイメージを証拠として使用する場合に検討すべき手法である。

私は1番目のオプションを選び、1つのコンピュータに2つのハードディスクを取り付けた。さらに、ファイルの復元に使用するハードディスクを2つの大きなパーティションに分けた。1つはオペレーティングシステム(CentOS 4)を格納するためのパーティションで、もう1つは復元したファイルを格納するためのパーティションである。このようなパーティション構成にするのは、PhotoRecが使用可能な記憶領域以上のファイルを書き込んでシステムを停止させるのを防ぐための予防措置である。この他に、TestDiskとPhotoRecを含んだKnoppixなどのライブCDからオペレーティングシステムを実行するという手もある。

PhotoRecとTestDiskは1つのアーカイブファイルとしてダウンロードできる。ファイル「photorec_static」と「testdisk_static」は実行可能ファイルであり、どちらもコマンドラインから実行できる。

このとき、復元先のパーティションだけをマウントすることが重要だ(私の場合は/var/recoveryにマウントした)。削除済みファイルが含まれているハードディスクをマウントしてはならない。パーティションをマウントしていなければ、その中のデータが上書きされる心配はない。

復元の手順

PhotoRecは、実行元のディレクトリにファイルを復元する。私の場合は、/var/recoveryディレクトリに移動してからphotorec_staticを実行した。これ以外の方法でPhotoRecを実行する場合は、実行可能ファイルを/usr/binディレクトリにコピーするか、プログラムの格納場所を完全パスで指定する必要がある。

PhotoRecのインタフェースはわかりやすい。最初の画面では、復元したいハードディスクを選択する。今回の例では、/dev/hdbを選択した。

Select a media (use Arrow keys, then press Enter):
Disk /dev/hda - 200 GB / 186 GiB (RO)
Disk /dev/hdb - 160 GB / 149 GiB (RO)
Disk /dev/hdc - 120 GB / 111 GiB (RO)
Disk /dev/hdd - 296 MB / 282 MiB (RO)

[Proceed ]  [  Quit  ]

次に、パーティションの種類を選択する。今回の例では、「Intel/PC partition」を選択した。

Disk /dev/hdb - 160 GB / 149 GiB (RO)

Please select the partition table type, press Enter when done.
[Intel  ]  Intel/PC partition
[Mac    ]  Apple partition map
[None   ]  Non partitioned media
[Sun    ]  Sun Solaris partition
[XBox   ]  XBox partition
[Return ]  Return to disk selection

Note: Do NOT select 'None' for media with only a single partition. It's very
rare for a drive to be 'Non-partitioned'.

次の画面には、選択したハードディスク上のパーティションの一覧が表示される。今回の例では、全ハードディスクを対象としてパーティションの復元を行いたいので、1番目のオプションを選択した。ただし、このオプションを選択する前に、[File Opt]メニューを選んで復元するファイルの種類を選択しておく必要がある。

Disk /dev/hdb - 160 GB / 149 GiB (RO)

     Partition                  Start        End    Size in sectors
   D empty                    0   0  1 19456 254 63  312576705 [Whole disk]
 1 * Linux LVM                0   0  2 19457  80 63  312581807

[ Search ]  [Options ]  [File Opt]  [  Quit  ]
                              Start file recovery

PhotoRecではさまざまな種類のファイルを復元できるが、私が復元したいのはWordドキュメント、AVIビデオファイル、JPG画像ファイル、MPEGビデオファイルだけなので、これらのオプションを選択した。

PhotoRec will try to locate the following files

[ ] dbf  DBase 3, prone to false positive
[X]      FAT subdirectory
[X] doc  Microsoft Office Document (doc/xls/ppt/vis/...)
[X] dsc  Nikon dsc
[X] eps  Encapsulated PostScript
[ ] exe  MS executable
[X]      EXT2/EXT3 Superblock
[X] gif  Graphic Interchange Format
[X] gz   gzip compressed data
[X] jpg  JPG picture
[X] mdb  Access Data Base
[X] mov  MOV video
[X] mp3  MP3 audio (MPEG ADTS, layer III, v1)
[X] mpg  Moving Picture Experts Group video
[X] mrw  Minolta Raw picture

[  Quit  ]
                              Return to main menu

ファイルの種類を選択したら、前の画面に戻ってハードディスクのスキャンを開始する。スキャンプロセスは自動化されている。私のマシンでは完了までに数時間かかった。PhotoRecの処理が完了すると、復元されたファイルが「recup_dir.x」という名前の複数のディレクトリに格納される(xにはディレクトリ番号が入る)。復元されたファイルには、元のファイルの名前は含まれていない。その代わりに、復元された順番を示す番号と、ファイルの種類を示す拡張子が割り当てられている。たとえば「f89.avi」は、89番目に復元されたファイルで、種類はAVIファイルである。

復元処理の後始末

これでファイルをすべて復元できたが、ハードディスク上にたくさんのファイルができてしまった。1つ1つのファイルを手動で確認していくのでは時間もかかるし面倒である。そこで、私はまず/var/recoveryディレクトリ内にVID/、DOC/、JPG/という3つのフォルダを作成し、次のコマンドを使用してファイルをそれぞれのフォルダに振り分けた。

find /var/recovery/ -name "*.avi" | xargs -i mv {} /var/recovery/VID/

find /var/recovery/ -name "*.mpg" | xargs -i mv {} /var/recovery/VID/

find /var/recovery/ -name "*.jpg" | xargs -i mv {} /var/recovery/JPG/

これで各ファイルが種類別のフォルダに振り分けられたが、これで一件落着したわけではない。今回の事件が発生する前の私のハードディスクには10,000個以上の画像が格納されていて、サイズにして2MBほどあった。PhotoRecは、復元プロセスの際に見つかった画像をすべて復元するので、その中には、たとえばWebブラウザキャッシュ内の画像ファイルなども含まれている。つまり、不要なファイルも山ほど復元されているわけだ。こうした雑多なソースからの画像ファイルを取り除くために、私は1MB未満のファイルをSMALLというフォルダに移動させた(このフォルダは、念のためその中に必要なファイルがないと確信が持てるまで残しておいた)。これらのファイルをSMALLフォルダに移動させるには、次のコマンドを使用した。

find /var/recovery/JPG/ -name "*.jpg" -size -1024k | xargs -i mv {} /var/recovery/SMALL/

PhotoRecはファイルの名前を復元しないが、ラッキーなことに、私の復元した写真ファイルには撮影日時や撮影情報などのEXIFメタデータが含まれていた。そこで、Jheadコマンドラインユーティリティを使用してこのメタデータを抽出した。具体的には、JPGフォルダで次のコマンドを実行した。

jhead -n%Y%m%d-%H%M%S *.jpg


このコマンドでは、jpgという拡張子を持つすべてのファイルの名前を、タイムスタンプを含んだ「YYYYMMDD-HHMMSS.jpg」という形式に変更している。タイムスタンプが同一のファイルには、「YYYYMMDD-HHMMSSx.jpg」という名前が付けられる(xの部分には、a、b、c…という英字が入る)。これらの写真がすべて同じデジカメで撮影したものならば、同じタイムスタンプを持つファイルはまったく同じ写真のはずである。そこで、次のコマンドを使用して重複ファイルをDUPSフォルダに移動した。

find /var/recovery/JPG/ -name "*a.jpg" | xargs -i mv {} /var/recovery/JPG/DUPS/

各ファイルにタイムスタンプでラベルを付けることができれば、これらのファイルを撮影した年や月に応じてフォルダに分類できる。

もし私が写真ファイルにキーワードやコメントを追加していたら、libextractorを使ってJPEGファイルからキーワードを抽出し、キーワードに基づいてファイルをフォルダに振り分けることも可能だったはずだ。しかし残念ながらそうはしていなかったので、復元した写真を何時間もかけて手動でフォルダに振り分けなければならなかった。しかしAVIファイルについては、libextractorを使ってそれぞれのビデオのコーデック、フレームレート、解像度の情報を判別することができた。

復元を防ぐ方法

私としてはファイルをこれほど「簡単に」復元できて助かったのだが、これは逆に言えば、自分の古いコンピュータやハードディスクを廃棄した場合に、重要なデータがたやすく復元されてしまうということでもある。しかし、特別なやり方をすれば、ハードディスクのデータを復元不可能な方法で消去することができる。Whitedust Securityは、安全なデータ消去の方法として次の例を挙げている。

  1. 既存のデータを価値のないデータで上書きする
  2. ハードディスクを酸液槽に漬ける
  3. ハードディスクを消磁装置で消磁する
  4. ディスクを火で熱する

ハードディスクを使用不能にしたくない場合は、既存のデータを上書きするか、ハードディスクを消磁するのがよい。消磁装置を利用できないときは、Wipeのようなプログラムを使用して、データを復元不可能にするパターンで上書きする。心配な場合は、気が済むまでデータを何回か繰り返し消去するとよいだろう。22回繰り返すよう勧める人もいれば、絶対安全にするなら99回繰り返す必要があると言う人もいる。PhotoRecのようなツールだけを使った復元への対策ならば、3回か4回繰り返せば十分だと思われる。

NewsForge.com 原文