日曜日, 9月 26, 2010

ディスクリカバリー再び

外付けハードディスクがマウントできなくなった。読みに行くと、時計の秒針のような嫌な音が続く状態…。あ、これは物理的にやられたな、と思う訳だけど、昔の仕事やプライベートのムービーやら写真やら入っていて簡単には諦められない。ので、なんとかデータだけでも救い出したいと思う。

160GBのディスクを、80GBづつ、2つのパーティションに分けて使っているが、1つめのパーティションは以前ディスクエラーがあったパーティションで、今は使っていない。(考えてみたら、その時に、ディスクごと交換しておけば良かったのだ…。)

ディスクユーティリティ等で見ると、パーティションは見えているので、テーブルは読み出せている。問題のパーティションは/dev/sdb10と見えている。ext3フォーマットだ。が、パーティションの冒頭がやられているらしく、スーパーブロックが読めなくてマウントできず。

 e2fsck -b 32768 /dev/sdb10

などと代替スーパーブロックを指定してもダメ。

ヘタってるディスクをいつまでもいじっていたくないので、ディスクの空いている別のマシンにつなぎ直し、ddコマンドで必要なパーティションだけローカルのファイルにコピーする事にした。しかし、


 ch01% dd if=/dev/disk2s10 of=disk2s10 bs=4k
 dd: /dev/disk2: Input/output error
 0+0 records in
 0+0 records out
 0 bytes transferred in 28.886230 secs (0 bytes/sec)


というエラーで止まってしまう。skipでずっと先のブロックを指定すると読み込めるので、全部が読めないわけではないらしい。読めるとこまで読んで、エラーで止まったらその次のブロックから読む、というのを手作業でやっても良いが、以下のコマンドを走らせる事にした。


 dd if=/dev/disk2s10 of=disk2s10 bs=8k conv=noerror,sync >& disk2s10.error


conv=noerror を付けると、読み書きにエラーがあっても処理を中断せずに続けてくれる。今回の場合はディスクの読み込みエラーが頻発するので、その度にskipを手作業で指定して続けるのは大変なのでこうした。conv=syncを指定しておくと、エラーがあったブロックもnullを書き出してくれる。これをしないと後でサイズが合わなくなるので必須。

さて、読み出しを始めたが…、遅い。すごく遅い。エラーにぶつかる度に待ちが入るので、平均1.5kbyte/sec。エラーブロックの割合によるが、このままでは読み込みに数ヶ月かかる計算。これはまずい。
どうせゼロしか埋まってないんだから、ある程度手探りで、読めそうなところを読むか…。

というわけで、作業続く…。

0 件のコメント: