※このエントリーは旧ブログで600はてなブックマークを記録した壊れたかもしれないハードディスクからのデータサルベージの内容を再構成したものです
ハードディスクの不調が疑われる場合は、いったん全データをディスクイメージとしてコピーして、修復を行った方が良い。 問題のあるディスクを直接操作することで、さらにデータが破損することを防ぐためだ。 Linuxを使えばこのディスクイメージの作成とバックアップを簡単に行うことができる。 このエントリではddを使用した基本的なデータのサルベージ方法を解説する。
Step.1 ディスク情報の把握
不調が疑われるディスクのデバイスファイルは/dev/hdbとする。 まずfdiskでディスクの情報とパーティションを調査する。 -lはパーティションテーブルを表示するオプション、-uは表示をセクタ単位とするオプションだ。
fdisk -lu /dev/hdb
Disk /dev/hdb: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/hdb1 * 63 131973974 65986956 7 HPFS/NTFS
/dev/hdb2 131973975 149966774 8996400 83 Linux
/dev/hdb3 149966775 151958834 996030 82 Linux swap / Solaris
/dev/hdb4 151958835 488392064 168216615 7 HPFS/NTFS
fdiskの出力から、ディスクのサイズ(総セクタ数)と、パーティションの配置が読み取れる。 以降のステップでこの情報を元にディスクイメージ作成とマウントを行うので、出力はメモしておこう。
なおfdiskでパーティションが表示できるのはMBRの場合だけである。 GPTの場合は、partedを使ってパーティションを調べてやる必要がある。
そもそもパーティションテーブルが読めないほどデータが破損している場合は、残念ながらあきらめた方が良いだろう。 一縷の望みでパーティションテーブルが壊れていてもデータを修復できる専用のツールを使うしかないだろう。
Step.2 ディスクイメージの作成
不調が疑われるディスクのディスクイメージを作成する。 以下の例のようにddを使うことで、ディスク全体を1つのファイルにコピーできる。 データの破損があれば、随時標準エラー出力にエラーが表示される。
dd if=/dev/hdb of=/root/hdd.img ibs=512 obs=1024k count=488397168 conv=sync,noerror
オプションの意味は以下のとおり。
-
if– データの入力元。この例では不調な/dev/hdbを指定している。 -
of– データの出力先。この例では/root/hdd.imgとしてディスクイメージを作成する。 -
ibs– データの入力単位。セクタサイズ(512バイト)とする。 -
obs– データの出力単位。高速化のため大きめなサイズ(1024kバイト)とする。 -
count– データ長。入力単位で何個分のデータをコピーするか指定する。この例ではibsをセクタサイズとしているので、Step.1で調べた総セクタ数に合わせる。 -
conv–sync,noerrorはデータが読み込めなくてもnullパディングすること、エラーを無視することを意味する。
ポイントはibsとobsを指定して、入力のサイズを小さく、出力のサイズを大きくして、読み込み不可能でnullパディングされる量を最小にしつつ、データのコピーを高速化することだ。
Step.3 データのサルベージ
ディスクイメージからパーティションをマウントして、データをサルベージする。 以下はstep 1.で調べた1つ目のNTFSパーティションをマウントする例である。
mount /root/hdd.img /mnt/ntfs -t ntfs -o ro,loop,offset=32256,nls=utf8
オプションの意味は以下のとおり。
-
/root/hdd.img– ディスクイメージファイルの場所を指定する。適宜読み替える。 -
/mnt/ntfs– マウント先を指定する。この例では/mnt/ntfsにマウントする。 -
-t– パーティションのファイルシステム。ntfsはNTFSであることを示す。通常は自動でファイルシステムが判定されるが、データが壊れていることも想定して念の為している。 -
-o– オプションである。それぞれ以下の意味がある。-
ro– 読み取り専用でマウントする。-
loop– ループバックデバイスを使用して、ファイルをブロックデバイスにする指定。 -
offset=– Step.1で調べたパーティションの開始位置をバイト単位で指定する。この例では63セクタ x 512バイトで32256バイトである。 -
nls=utf8– NTFSパーティションで、ファイル名を正確に表示できるようにするため指定する。
-
-
マウントが成功すれば、あとはデータをコピーしてバックアップを取れば良い。 マウントが失敗するようなら、残念ながらデータが壊れている。 壊れたデータの修復はこのエントリの範囲を超えるが、NTFSであればWindowsのチェックディスク、EXT3であればLinuxのfsckで修復できる見込みがある。
