ディスクの故障とデータのサルベージ

2014-10-03 08:26 JST by kcrt

 

ディスクの故障、ある日突然やってきます。残念ですが、ハードディスクは消耗品であり、ある日突然データが読めなくなっても不思議ではありません。現在普及しているUSBメモリ・SDカード・SSDも物理的には安定とはいえ、何らかのトラブルが起これば読み込みができなくなることも多々あります。

自分がトラブルに陥った時に、たいへん助かったツールをご紹介いたします。

まずはじめに・・・

あなたがこのサイトを、Googleで探し当てたということは、おそらくデータのバックアップを取っていなかったということを意味するのだと思います。

今回を契機に、適切なバックアップ環境の構築をおすすめします。データの復旧は、バックアップの何倍もコストが掛かり、時間を浪費し、また確実にデータが戻ってくるとは限りません。

データ復旧専門の会社

復旧には手間も時間もかかります。もし自信がなければ、お金がかかりますがデータ復旧専門の会社、たとえば日本データテクノロジーさんなどの専門会社さんへ依頼するのがお勧めです。

注意: 以後のソフトウェアはプロフェッショナル向けです。使い方を間違えると、復旧できるはずだったデータが戻らなくなるだけではなく、現在確保できているデータさえ失う可能性があります。

GNU ddrescue

辛うじてデータが読み込みできているディスクに頻繁にアクセスを行うと、それだけでディスクに負担をかけてしまうことになります。まずはディスクをイメージとして確保しましょう。

古典的にはddコマンドが使用されてきましたが、より便利なコマンドであるGNU ddrescueをおすすめします。

ddコマンドは、データを前から読み込みをします。データの不良領域がなければそれでも構わないですが、不良領域があればその読み取りに時間をかけてしまい、その領域以降のデータの読み込みが遅々として進みません。それにより、ディスクに負担をかけてしまい、不良領域以外の読み取れるはずだったデータに影響が出る可能性もあります。

GNU ddrescueは、その点少し賢いコマンドです。読み込めるところだけ読み込んでしまい、その後不良領域の読み込みをtryする、試行回数は3回まで…なんて使い方ができます。

もちろん、基本はddコマンドなので、救出しようとしている領域より大きいデータ保存領域が必要です。イメージから抜き出したデータを保存するためにも、救出するデータの2倍の領域を確保しておくのをおすすめします。たとえば、20GBのパーティションのデータを保存するなら40GBが、200GBなら400GBの領域を用意しておきましょう。

また、このコマンドを使用するには最低限システムからディスクが認識できる状態にする必要があります。起動できなくなったノートパソコンのハードディスクからデータを取り出す場合などは、SystemRescueCdなどから起動してディスクが見える状態にするか、SATAのHDDをUSBで接続できるケーブル(amazonで「SATA USB HDD」といったキーワードで検索すればたくさん出てきます。たとえば[amazon text=これ&asin=B00507TETG]とか。)を使用することになります。

インストール

Ubuntu: sudo aptitude install gddrescue
Mac(Homebrew): brew install ddrescue

Windowsの方は、Cygwinベースのものを使用することができます。もしくは、SystemRescueCdを作っておくのが、簡単で便利です。

デバイス名の確認

ddrescueを使うために、デバイス名の確認をしましょう。

Mac

Macにもfdiskはありますが、残念ながらデバイス名の確認には使えません。マウントできている場合はdf -hで確認できますが、トラブルが起こっているディスクがマウントできるとは限りません。

付属のディスクユーティリティを使うことでデバイス名を調べることができます。

FATなどの管理領域が壊れてしまっているディスクの場合、接続すると読み取りができないというメッセージが出ます。「無視」をクリックして下さい。

diskunavailable

ディスクユーティリティを起動すると左のリストにディスクが表示されますので、対象のディスク(またはパーティション)を選択して、「情報」を押して下さい。

diskdevname1

「情報」を押すと、ディスク識別子が表示されます。下図では「disk3」となっており、デバイス名としては「/dev/disk3」を使用していくことになります。

diskdevname2

Ubuntu

Ubuntuの場合、sudo fdisk -lでデバイス名の確認ができます。

% sudo fdisk -l

Disk /dev/sda: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders, total 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002e77e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   203720703   101859328   83  Linux
/dev/sda2       203722750   209713151     2995201    5  Extended
/dev/sda5       203722752   209713151     2995200   82  Linux swap / Solaris

ディスクのサイズなどを参考に、どのデバイス名が割り当てられているかを確認して作業を進めていきます。

データの取り出し

デバイス名も確認できたことですし、データをイメージとして確保しましょう。それではまずは初回の読み込みを行います。

% sudo ddrescue --no-split /dev/disk3 disk3.img disk3.log
(ddrescue --no-split デバイス名 書き出し先 ログファイル)

GNU ddrescue 1.18.1
Press Ctrl-C to interrupt
rescued:    51707 kB,  errsize:       0 B,  current rate:    6422 kB/s
   ipos:    51707 kB,   errors:       0,    average rate:    5745 kB/s
   opos:    51707 kB, run time:       9 s,  successful read:       0 s ago
Copying non-tried blocks... Pass 1 (forwards)

デバイス名には、先ほど調べたものを指定します。これが間違っていると、時間をかけてデータを取り出しても全く意味が無いことになります。注意して指定しましょう。

書き出し先の名前は何でも良いですが、必ず充分な空き容量があるデバイスを指定するようにして下さい。Macの場合、拡張子を.imgにすれば修復後にディスクユーティリティからマウントでき、大変便利です。

ログファイルの指定は大切です。この中にはディスクのどのブロックを読み込めたか、どのブロックは読み込みに失敗したかなどの情報が入っています。

初回の読み込みには、--no-split (または-n)を指定することをおすすめします。このオプションを指定することで、読み込みに時間がかかる場所をスキップすることができます。

うまく読み込めた場合は、とりあえずここで終了です。エラーがあり全てのブロックが読み込めていない場合は読み込み直しを行いましょう。

% ddrescue --direct -r3 /dev/disk3 disk3.img disk3.log

ログファイルにどのブロックが読み込めているかの情報が入っているので、もう一度実行すると先ほど読み込めなかった部分をトライできます。

--direct(または-d)オプションを指定すると、カーネルのキャッシュを使用せずにアクセスできます。

-rオプション(--retry-passesまたは--max-retries)で、何度試行を行うかを指定できます。

ディスクイメージ(またはパーティション)が取得できたら次の段階に進みましょう。

TestDisk

イメージが取得できたら修復を行います。可能ならこの時点での取得したイメージをバックアップしておくことをおすすめします。

もっとも簡単なのは、取得したイメージを別のハードディスクに書き込むもしくはループデバイスとしてマウントしてから、fsckを走らせるという方法です。これで改善されればいいですが、fsckで修復できる範囲はそれほど広くありませんし、そもそもパーティションが認識されていなければ太刀打ちできません。

今回はオープンソースソフトウェアのTestDiskを紹介します。

インストール

Ubuntu: sudo aptitude install testdisk
Mac(Homebrew): brew install testdisk

Windowsの方は、公式サイトからバイナリを取得することができます。

修復の実行

% testdisk disk3.img

先ほど取得したイメージを引数にして起動します。すると次のような画面が開かれます。

TestDisk 6.14, Data Recovery Utility, July 2013
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

  TestDisk is free software, and
comes with ABSOLUTELY NO WARRANTY.

Select a media (use Arrow keys, then press Enter):
>Disk disk3.img - 2004 MB / 1912 MiB



>[Proceed ]  [  Quit  ]

Note: Some disks won't appear unless you are root user.
Disk capacity must be correctly detected for a successful recovery.
If a disk listed above has incorrect size, check HD jumper settings, BIOS
detection, and install the latest OS patches and disk drivers.

ファイルに間違いがないことを確認してProceedを選択しましょう。この画面で(RO)と表示されているまたは、「書き込みができない」という内容のエラーが出た場合は、取得したイメージファイルのユーザーまたは書き込み権限をチェックして下さい。(おそらく、sudoで作業してrootの所有のままになっているのです。)

次の画面では、パーティションテーブルの種類を選ぶように指示されます。

TestDisk 6.14, Data Recovery Utility, July 2013
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org


Disk disk3.img - 2004 MB / 1912 MiB

Please select the partition table type, press Enter when done.
 [Intel  ] Intel/PC partition
>[EFI GPT] EFI GPT partition map (Mac i386, some x86_64...)
 [Humax  ] Humax partition table
 [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'.

Intel/PC partition(MBR)を使用しているか、EFI GPT(GUIDパーティションテーブル)を使用しているかは場合によりますが、比較的新しいHDD / SSDならEFI GPTであると思います。古いHDDやFAT32でフォーマットされていたUSBメモリの場合Intel/PC(MBR)かも知れません。

うまく検出された場合は、画面の下部に「Hint: EFI GPT partition table type has been detected.」などと表示されますのでその場合は指示にしたがいましょう。

次の画面では、Analyse(分析)を選びましょう。

>[ Analyse  ] Analyse current partition structure and search for lost partitions
 [ Advanced ] Filesystem Utils
 [ Geometry ] Change disk geometry
 [ Options  ] Modify options
 [ Quit     ] Return to disk selection

Analyseを選ぶと、以下のように出てきました。

Disk disk3.img - 2004 MB / 1912 MiB - CHS 244 255 63
Current partition structure:
     Partition                  Start        End    Size in sectors

Bad GPT partition, invalid signature.
Trying alternate GPT
Warning: number of sectors per track mismatches 32 (FAT) != 63 (HD)
 1 P MS Data                     2048    3913727    3911680 [USBMEMORY] [USBMEMORY]

Bad GPT partition, invalid signature. Trying alternate GPTとのことで、どうやらGPT部分が壊れていたが、予備の情報が使用できるようです。今回はラッキーなケースでした。Quick Searchを押して、パーティションを表示します。予備情報もダメになっている場合や、Quick Searchでは全てのパーティションが表示されなければDeep Searchを行って下さい。

Disk disk3.img - 2004 MB / 1912 MiB - CHS 244 255 63
     Partition               Start        End    Size in sectors
>P MS Data                     2048    3913727    3911680 [USBMEMORY]

Structure: Ok.  Use Up/Down Arrow keys to select partition.
Use Left/Right Arrow keys to CHANGE partition characteristics:
                P=Primary  D=Deleted
Keys A: add partition, L: load backup, T: change type, P: list files,
     Enter: to continue
FAT32, blocksize=4096, 2002 MB / 1910 MiB

無事パーティションが見つかれば、この画面でPを押しましょう。

   P MS Data                     2048    3913727    3911680 [USBMEMORY]
Directory /

>-rwxr-xr-x     0     0      4096  3-Oct-2014 15:45 ._.Trashes
 -rwxr-xr-x     0     0   3839007  3-Oct-2014 15:46 P1050262.JPG
 drwxr-xr-x     0     0         0  3-Oct-2014 15:45 .Trashes
 drwxr-xr-x     0     0         0  3-Oct-2014 15:45 .fseventsd
 drwxr-xr-x     0     0         0  3-Oct-2014 15:45 .Spotlight-V100
 drwxr-xr-x     0     0         0  3-Oct-2014 15:45 .TemporaryItems
 -rwxr-xr-x     0     0      4096  3-Oct-2014 15:45 ._.TemporaryItems
 -rwxr-xr-x     0     0       295  3-Oct-2014 15:45 .apdisk
 -rwxr-xr-x     0     0      4096  3-Oct-2014 15:45 ._.apdisk
 -rwxr-xr-x     0     0      4096  3-Oct-2014 15:46 ._P1050262.jpg
 -rwxr-xr-x     0     0    943074  3-Oct-2014 15:46 IMAG0146.JPG
 -rwxr-xr-x     0     0      4096  3-Oct-2014 15:46 ._IMAG0146.jpg
 -rwxr-xr-x     0     0   4716464  3-Oct-2014 15:46 P1050362.JPG
 -rwxr-xr-x     0     0      4096  3-Oct-2014 15:46 ._P1050362.jpg
                                                   Next
Use Right to change directory, h to hide deleted files
    q to quit, : to select the current file, a to select all files
    C to copy the selected files, c to copy the current file

これで、ディスクに含まれていたファイルが表示されました。ファイルを選択してCを押せば、データを取り出すことができます。

元の画面に戻って、[Write]を押して正しいパーティション情報を書き込めばループデバイスとしてマウントしたり、Macではディスクユーティリティでマウントできます。これで一件落着です。

パーティション情報が見つからないなど、この方法で修復ができない場合は次のPhotoRecを試すことになります。

PhotoRec

不幸にしてtestdiskでは修復ができなかった場合は、同時にインストールされるPhotoRecを試してみましましょう。TestDiskはFATなどの管理領域を修復することでディスクのデータをアクセス可能な状態にするものでした。

PhotoRecは少し違います。ディスク全体を捜査してデータが含まれている領域を探し出します。例えば、JPEGファイルは「0xff, 0xd8, 0xff, 0xe0」・「0xff, 0xd8, 0xff, 0xe1」・「0xff, 0xd8, 0xff, 0xfe」といったデータから始まります。ブロックがそのようなデータから始まっている場合はJPEGファイルとして読み込みをtryして復元を試みます。PhotoRecでは、JPEGだけでなくZip, MS Officeファイル, PDFなど270種類のファイルタイプを認識し、出来る限りデータを復元しようとします。

ファイルシステムに依存しないので、うまく行けば削除してしまったファイルすら修復することができます。たとえば、デジカメのSDカードの画像を間違って消してしまった場合なども、上から新しい画像を保存してしまう前であれば、高確率でデータを取り戻すことができます。

ただし、データがディスク上に直線上に並んでいない時(断片化している時)はうまく修復できません。

% photorec disk3.img

で起動すると、TestDiskと同じような画面が出てきます。

PhotoRec 6.14, Data Recovery Utility, July 2013
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

  PhotoRec is free software, and
comes with ABSOLUTELY NO WARRANTY.

Select a media (use Arrow keys, then press Enter):
>Disk disk3.img - 2004 MB / 1912 MiB


>[Proceed ]  [  Quit  ]

Note: Some disks won't appear unless you're root user.
Disk capacity must be correctly detected for a successful recovery.
If a disk listed above has incorrect size, check HD jumper settings, BIOS
detection, and install the latest OS patches and disk drivers.

Proceedを押して進むとパーティションの一覧が出てきます。・・・が、今回のディスクは壊れてしまっているので残念ながらパーティション情報は出てきません。Unknownを選択してディスク全体を捜査することにします。(パーティションが認識されていれば、対象のパーティションを選ぶか、Wholeを選択します。)

PhotoRec 6.14, Data Recovery Utility, July 2013
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

Disk disk3.img - 2004 MB / 1912 MiB (RO)

     Partition                  Start        End    Size in sectors
>   P Unknown                  0   0  1   243 190 11    3915776


>[ Search ]  [Options ]  [File Opt]  [  Quit  ]

File Optを押せば、どの種類のファイルを検索するか指定できますが、今回は気にせず標準の設定でSearchを選択します。次の画面ではext2/ext3/ext4か、それ以外のファイルシステム(FAT/NTFS/HFS+など)を選択しましょう。

保存先のディレクトリを指定して「C」を押すと、ディスクデータの検索が始まります。

PhotoRec 6.14, Data Recovery Utility, July 2013
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

Disk disk3.img - 2004 MB / 1912 MiB (RO)
     Partition                  Start        End    Size in sectors
   P Unknown                  0   0  1   243 190 11    3915776

Pass 1 - Reading sector    1865568/3915776, 33 files found
Elapsed time 0h00m52s - Estimated time to completion 0h00m57
apple: 16 recovered
jpg: 12 recovered
gz: 4 recovered
zip: 1 recovered

ディスクを網羅的に検索するのでかなり時間がかかります。気長に待つことにしましょう。

PhotoRec 6.14, Data Recovery Utility, July 2013
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org

Disk disk3.img - 2004 MB / 1912 MiB (RO)
     Partition                  Start        End    Size in sectors
   P Unknown                  0   0  1   243 190 11    3915776

384 files saved in /Users/kcrt/tmp/datarecovery/recup_dir directory.
Recovery completed.

You are welcome to donate to support further development and encouragement
http://www.cgsecurity.org/wiki/Donation


[ Quit ]

全部で384個のデータが救出されたようです。

recovereddata

残念ながら、ファイル名とディレクトリ構造は修復されませんし、すべてのファイルが正常に戻るわけではありません。ですが、全く読み込めなかったものがここまで戻ってくるなら上出来だと思います。


さて、あなたは運良くデータを取り戻すことができたでしょうか。ディスク障害の原因は多岐にわたり、ここであげた方法で全てのデータが戻ってくるわけではありません。くれぐれもこまめなバックアップをおすすめします。