水無瀬さんごのブログ Season2

ゼロ年代口調を抑えきれない ※技術力要素はありません ※文章力要素もありません

HDDを救済するぞ(Windows+Cygwin+ddrescue編)

救済するぞ救済するぞ救済するぞ。

さて、録画ファイルをためていたドライブが物故割れました。
久々にエンコードでもするかと思ったら失敗続き、最初はエンコするGPUがおかしいのかと疑ったものの、
今度はファイルがなぜか読み出せたり読み出せなくなったりしたので「アレ?」と思いました。

SMARTを確認してみると、案の定やられてました。

これはいけませんねぇ。

というわけでもう大概ヤバいので救済します。
といってもWidnowsで救済する方法はもはやありません。
HDDをLinuxの入ったマシンにつないでサルベージ、をやってもいいのですが、
Linuxの入っているマシンが小さいものしかないので外付けHDDケースみたいなのを買ってこないといけません。
Windows上で直で救済できると良いですね。

というわけでCygwin
まずとりあえず適当にCygwinを入れます。
適当で大丈夫です。多分。

次にddrescueを入れます。
その前にapt-cygを入れます。

(参考:
qiita.com

Cygwinを管理者権限で起動して、

wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
chmod 755 apt-cyg
mv apt-cyg /usr/local/bin/

apt-cyg -m ftp://ftp.iij.ad.jp/pub/cygwin/ update
apt-cyg install ddrescue

こんな感じですね。

次に

cat /proc/partitions

パーティションを把握します。

こうですね。

$ cat /proc/partitions
major minor  #blocks  name   win-mounts
(中略)
    8     2 7813894144 sda2   D:\
(中略)
    8    50 7813894144 sdd2   G:\

今回はDドライブからGドライブに移動させます。
/dev/sda2から/dev/sdd2への移動というわけですね。

この順番は絶対に要チェックです。
なぜなら逆にしてしまうと「まっさらなディスクの内容をサルベージ元の方に書き込んでしまう」という結果になってしまうからです。
全滅しますね。

さて次はddrescueを動かします。
手順としては

  1. 不良セクタを読み飛ばしてコピー
  2. 読み飛ばした不良セクタを頑張って読み込んでみる

の順番に進行させます。
まず

$ ddrescue -f -n -v /dev/sda2 /dev/sdd2 logfile.log

を実行して不良セクタを読み飛ばしつつコピーします。
不良セクタの箇所がlogfile.logに書き込まれます。便利ですね。

結果はこう。

$ ddrescue -f -n -v /dev/sda2 /dev/sdd2 logfile.log
GNU ddrescue 1.22
About to copy 8001 GBytes from '/dev/sda2' to '/dev/sdd2'
    Starting positions: infile = 0 B,  outfile = 0 B
    Copy block size: 128 sectors       Initial skip size: 156288 sectors
Sector size: 512 Bytes

     ipos:    8001 GB, non-trimmed:        0 B,  current rate:       0 B/s
     opos:    8001 GB, non-scraped:    4761 GB,  average rate:    102 MB/s
non-tried:        0 B,  bad-sector:     1024 B,    error rate:    177 MB/s
  rescued:    3240 GB,   bad areas:        2,        run time:  8h 44m 30s
pct rescued:   40.49%, read errors: 72648480,  remaining time:         n/a
                              time since last successful read:     58m  7s
Finished

次に読み飛ばした部分がlogfile.logに入っているので、そこを頑張って読み込んでもらいます。
コマンドは

$ ddrescue -f -d -r1 -v /dev/sda2 /dev/sdd2 logfile.log

です。では結果がこちら

$ ddrescue -f -d -r1 -v /dev/sda2 /dev/sdd2 logfile.log
GNU ddrescue 1.22
About to copy 8001 GBytes from '/dev/sda2' to '/dev/sdd2'
    Starting positions: infile = 0 B,  outfile = 0 B
    Copy block size: 128 sectors       Initial skip size: 156288 sectors
Sector size: 512 Bytes

Press Ctrl-C to interrupt
Initial status (read from mapfile)
rescued: 3240 GB, tried: 4761 GB, bad-sector: 1024 B, bad areas: 2

     ipos:    3950 GB, non-trimmed:        0 B,  current rate:       0 B/s
     opos:    3950 GB, non-scraped:    4051 GB,  average rate:       0 B/s
non-tried:        0 B,  bad-sector:  709923 MB,    error rate:   2377 kB/s
  rescued:    3240 GB,   bad areas:        2,        run time: 17h  8m 13s
pct rescued:   40.49%, read errors:1386570140,  remaining time:         n/a
                              time since last successful read:         n/a
Scraping failed blocks... (forwards)
  Interrupted by user

って救済できてへんやないかーい!

不良箇所以外は救済できましたが、あまりに不良箇所がタチ悪いので、不良箇所からは全然読み出せませんでした。
ざんねん。

というわけで、救済計画は失敗しました。

なぜなんだ、ちくしょう!(不謹慎ゼロ年代オチ)(90年代では?)