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

ディスクの故障、ある日突然やってきます。残念ですが、ハードディスクは消耗品であり、ある日突然データが読めなくなっても不思議ではありません。現在普及している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」といったキーワードで検索すればたくさん出てきます。たとえばこれとか。)を使用することになります。

インストール

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

デバイス名の確認

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

Mac

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

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

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

diskunavailable

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

diskdevname1

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

diskdevname2

Ubuntu

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

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

データの取り出し

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

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

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

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

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

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

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

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

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

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

TestDisk

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

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

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

インストール

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

修復の実行

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

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

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

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を選ぶと、以下のように出てきました。

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

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

これで、ディスクに含まれていたファイルが表示されました。ファイルを選択して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カードの画像を間違って消してしまった場合なども、上から新しい画像を保存してしまう前であれば、高確率でデータを取り戻すことができます。

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

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

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

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

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

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

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

recovereddata

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


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

コメントを残す