木曜日, 9月 30, 2010

ディスクリカバリー再び(その3)

ハードディスクが不調な時は、生のままでいいからとにかくデータを安全な場所に移したい。というわけで、dd コマンドを使ってローカルに持ってきている。買ったばかりのマックがあって良かった。なにせディスクが空に近いから。

まずは1GBずつ、エラったら128MBずつ小分けにして、その中でエラった箇所を4MB、128KB と小分けにしながら dd コマンドで吸い上げてゆく。9番目のGBブロックの5番目の128MBブロックならこんな感じ。

dd if=/dev/disk2s10 of=disk2s10_08.4 bs=4k count=32k skip=8x32k

大きなブロックで読めないときは、その中のどこかにエラー箇所があるだろうと思うけど、実際にやってみると、小分けにするとエラーにならずに読める場合がある。というか、意外とそういうことが多かった。(解せないので操作ミスも疑ったが、そうではなくて本当に読めているみたい。騙し騙しやるには小刻みの方が良い、ということか?)
とにかく、小さく分けて読んでいったら、結局のところ、一番細かい128KBブロックが1個読めないだけで、あとは全部読み出す事ができた。最後に、読めなかった128KBのブロックだけを、

dd if=/dev/disk2s10 of=disk2s10_06.3.00.00 bs=4k count=32 skip=1671168 conv=noerror,sync

でエラーを無視して読み込んだら、最終的に回収できなかったのは48KB分のみ、となった。まずは満足。
回収したデータをcatで繋いでひとつのファイルにまとめ、amazonで買ったNASに放り込む。さすがに80GB分だと時間がかかるので、続きの作業は明日にする。

ともかくこれで、ハードウェアのトラブルを気にせずに、純粋に論理的な修復作業に移れる。

この先の作業には、二つのやり方がある。
望ましいのは、まとめたファイルをディスクイメージとしてマウントできるようになること。ext3のマウントについてはここに情報があったので、MacFUSE と fuse-ext2 をインストールして試してみる。正常なディスクイメージではないので、もうひと手間かかるかも知れない。それが難しそうなら(面倒そうなら)、PhotoRecを使ってファイルだけでもサルベージする。写真や映像がほとんどなので、意外とこの方法でも十分かもしれない。

月曜日, 9月 27, 2010

ディスクリカバリー再び(その2)

エラーになる度に手作業でやるのはシンドイので、1GBずつ小分けに読み込んでファイル化し、読めなかった部分は更に128MBずつに小分けにしてファイルにし…、という戦法でいくことにした。128MBの読み込みは、1GBの時のエラー出力を元に自動化するようにスクリプトをつくる。

で、1GBごとに次々読ませてゆくと…、途中で

dd: /dev/disk2s10: Device not configured

というエラーが出て、その後は全部

dd: /dev/disk2s10: No such file or directory

になる。
これはパーティション全体を読み終えたのかな?と思ったがそうではなく、途中でディスクの認識が切れてしまったみたい。うーむ、ハードのトラブルだとこういうことも起こるか。
USBを抜き差ししてドライブを再認識させ、その続きを実行する、と。

さて、まだ時間がかかりそうだし、ひとまず寝るとするか。また途中で認識が切れるんだろうなー。週末で片付けるつもりだったけど、多少気長にやるしか無いかな。

そして、amazon に NAS を注文した。BUFFALO の LinkStation LS-XH1.0TL。あさってには届くであろう。

日曜日, 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。エラーブロックの割合によるが、このままでは読み込みに数ヶ月かかる計算。これはまずい。
どうせゼロしか埋まってないんだから、ある程度手探りで、読めそうなところを読むか…。

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