2014年10月29日水曜日

故障したRAID5構成のTeraStationからデータ救出(無料)

職場で使っている Buffalo の TeraStation(HD-QSSU2/R5) が壊れた。
月曜日に出社したら赤ランプが4つとも点灯していた。
赤ランプ全点灯てことは、2本以上同時に壊れたのか?

RAID5を過信すると怖いっすね。。。
非常に困るのでなんとかデータ救出したいと思い色々調べていると下記の情報を発見。

RAID5 が壊れた・・・ - マニログ

非常に心強い。ディスク2本壊れても何とかなるもんなんすね。

4本のハードディスク(のうち3本)の中身さえ抽出できればつなぎ合わせることで救出できそうなことがわかった。
そこで何はともあれ、分解して中身をバックアップすることにした。

使われていないデスクトップPCがあったので、4本のディスクのうち2本(SATAポート数の都合)をつないで、UbuntuをUSB起動してddコマンドでイメージ化することにした。

ddイメージの出力先は、容量の都合でネットワーク上のドライブ(NAS)にした。ので、時間がかかった。。。

時間がかかりすぎるので調べたところ、GNU ddrescueコマンドがよさ気なのでそちらを使うことにした。
下記のような感じで2本×2回に分けて実施。(USB起動のUbuntuを使っていたため、リブート後にもGNU ddrescue等入れなおす必要があった。。)

ディスク情報を取得

sudo su
fdisk -l

→どちらが/dev/sdaでどちらが/dev/sdbか確認。セクタ数も確認しておく。

ネットワークドライブをマウント

mkdir /mnt/smb
mount //xxx.xx.xx.xxx/xxx /mnt/smb -o username=xxxxxxxx
mkdir ~/workspace
cd ~/workspace/
ln -s /mnt/smb/xxxxxx_work
cd xxxxxx_work

GNU ddrescueを(プロキシ経由で)インストール

export http_proxy="http://***:***@**proxy****:NNNN/"
export https_proxy=$http_proxy
add-apt-repository universe
apt-get update
apt-get install gddrescue

一台目のディスクをイメージに出力

ddrescue -f -n /dev/sdb disk3ddrescue.img disk3ddrescue.log

もう一つコンソールを立ち上げて、もう一台も同時実行

ddrescue -f -n /dev/sda disk4ddrescue.img disk4ddrescue.log

一晩放置した結果、エラー無く2本とも抽出できていたので、前述のとおりUbuntuをシャットダウンし、
残りの二本につなぎ替えて上記を(disk3, disk4のところはdisk1, disk2に置き換えて)もう一度実行。

4本分のHDDイメージはいずれもエラー無く抽出完了したため、パリティから復元するのではなく、4つのイメージ(のうち3つ)から512バイトごと毎にデータを取得して、ひとつのイメージとして合成することにした。
rubyで簡単なスクリプトを作成し実行。

apt-get install ruby
vi raid5merge.rb

raid5merg.rb

disks = []
sectors = 488_397_167 #各ディスクのセクタ数。4台共同一だった。

(1..4).each{|i|
  disks.push << File.open("./disk#{i}ddrescue.img","rb")
}
out = File.open("./merged_disk_ddrescue.img","wb")

buff = ""

sectors.times{|i|
  4.times{|j|
    #disk4→3→2→1→4→3→2→1の順でスキップ。
    if 3 == (j+i)%4
      disks[j].read(512)
      next
    end
    buff << disks[j].read(512)
  }

  if buff.length < 50*1024*1024 #高速化のため、50MB分読み込むまで書き出ししないようにしてみた。
    out.print buff
    buff = ""
  end
}
out.print buff if buff.length > 0
ruby raid5merge.rb

ddのイメージファイルをWindowsでマウントしたいなぁと思い、調査したところ「ImDisk Virtual Disk Driver」てやつがフリーで良さげだった。
インストールし、イメージをマウントして中身が読み書きできることを確認。
ddイメージをNAS上に書き出していたので、メインで使用しているWindows機からもすぐアクセスできて便利だった。(が遅い)

元の4本のHDDは故障しているわけではなさそうだったので、もう一度TeraStationに組み戻して、TeraStationをRAID5で初期化した後、イメージから書き戻すことにした。

現在はFastCopyでコピー中だが、非常に時間がかかる。。。。