kariaの日記 @ Alice::Diary

ノリツッコミの鳩子がはてなブログ書いちゃうよ

ReadyNASでうっかりHDDを2個抜いてしまったときにデータを読み出す方法

今年の春頃にReadyNAS Ultra6というものを買いまして、HDDが最大6個まで刺さり領域の拡張は自動、1個壊れても冗長性が保たれていて電源を入れたままで交換可能というNASなので、適当なHDDをかき集めて運用しておりました。メーカー公式にSSHプラグインを提供してたりしてなかなか遊べるヤツです。

まあReadyNAS自体の紹介ははげあたまさんに任せるとして、今日はそいつのデータ復旧をしたお話。

経緯

こいつが採用しているX-RAIDって、HDDを挿入したときにパーティション確保、RAIDへの組み込み、領域拡張までほぼ自動でやってしまうので、HDDを抜いて再挿入すると当該ディスクに何が入っていようとまっさらにして再構築をしようとします。まあ1台抜いただけではデータには全く支障がないし、抜き差しだけでHDD交換が済むので楽といえば楽です。

それはよいのですが、表題のようにうっかり2個同時に抜くとか、1個抜いてる最中にもう1個故障みたいな事態が起こると、ボリューム故障となり一部のファイルが読み出せなくなります。なにしろRAID5ですからね。

でも、手元には抜いたばかりのディスクがあるのでデータとしては生きているはずだし、何とかしたい。さてどうするか。

やりかた

※以下ReadyNAS Ultra6での例です。他の機種では違うかもしれません。私の場合はなんとかこれで全データ戻ってきましたが、必ず戻ってくる保証はないのでマネする場合は自己責任でお願いします。

1.速やかにReadyNASの電源を落とす

2.SATA直接でもUSB-SATA変換ケーブルでも何でもいいので、適当なlinuxマシンにReadyNASに元々繋がっていたHDDを全台つないで認識させる

3.mdadmをインストールする

まずはLinuxソフトウェアraidを操作するためmdadmをインストールします。

apt-get install mdadm

※mdadmについては下記を参考にしました。
http://www.ioss.jp/sohodiy/mdadm8-1_5.html

4.パーティション情報からraid構成情報を読み取る

mdadm --examine --brief --scan --config=partitions

5.mdstatでraidの状態を確認する

cat /proc/mdstat

うまくraidの各領域(mdX)が認識されたらここで何か出るはず。もしかしたらmdadmインストール時点で/proc/mdstatに出るようになるかもですが、何も出ない場合はmdadm --assembleを実行すれば認識されるかと思います(詳細はおググり下さいませ)。

んで、表示されているうちactiveになっている領域は無事認識されたので、以降はinactiveな領域をなんとかします。

6.とりあえず起こしてみる

mdadm -R /dev/mdX

Xにはmdstatで確認した数字を入れる。これで起きてくれば問題なし。「入力/出力エラーです」「デバイスがビジーです」「ドライブが足りません」などと言われたら、次へ進む。

7.当該領域を一旦停止(非アクティブ化)する

mdadm --stop /dev/mdX

mdadmでinactiveなのに「デバイスがビジーです」と言われる場合、1〜2回runとstopを繰り返すとうまくいくことがありました。どうもrunしようとして失敗した場合、activeとinactiveの狭間に落ちてしまうようで。

8.無理矢理認識させてactiveにする

mdadm -A -R -f /dev/mdX /dev/sd*Y

こんな風に表示されたらOK。

mdadm: clearing FAULTY flag for device 2 in /dev/md5 for /dev/sdf8
mdadm: /dev/md5 has been started with 4 drives (out of 5).

必要なハードディスクは全て接続し認識もしているのに、6番のところで「ドライブが5個必要なのに4個しかないから起動できません」的なことを言われることがあったのですが、なんでだろうと思ったらFAULTYフラグが立ってるから普通にやっても領域に組み込まれなかったってことのようで。まあとにかく頑張って全領域をactiveにしましょう。

9.LVMの状態を確認する

raidの領域が正しく認識されたら、つぎはLVMでマウントします。

pvscan
lvscan

まずpvscanでPhysical Volume(物理ボリューム)の状態を確認。/proc/mdstatで見た状態に問題がなければ、全PVが認識されているはずです。pvscanで見た感じはこんな感じ(足りない領域があると何らかのエラーが発生するはず)。

% sudo pvscan
  PV /dev/md2    VG c       lvm2 [350.00 GiB / 0    free]
  PV /dev/md3    VG c       lvm2 [1.09 TiB / 0    free]
  PV /dev/md4    VG c       lvm2 [670.62 GiB / 5.00 GiB free]
  PV /dev/md5    VG c       lvm2 [4.09 TiB / 0    free]
  PV /dev/md6    VG c       lvm2 [931.50 GiB / 0    free]

VGがcに所属するPVが全て問題なければ、lvscanするとlogical volumeが見え、activeになっているはず。

% sudo lvscan
  ACTIVE            '/dev/c/c' [7.09 TiB] inherit

inactiveの場合は認識してない領域がないかどうかを再確認。どうしてもactiveにならない場合(HDD故障などで本当にディスク数が足りない場合など)は以下の方法で無理矢理activeにしてみましょう。

http://d.hatena.ne.jp/karia/20120626/1340645104

10.マウントする

mount /dev/c/c /mnt/hoge

無事マウントできたら成功です。おめでとうございます、と言いたい所ですが中身を確認して早急に他のマシンなり何なりに退避しましょう。

おまけ

要するに、ただのRAID5+LVMなので認識さえされれば勝ちということでした。最初はReadyNAS単体でなんとかしたいなと思ってネットギアのサポートに問い合わせてみたのですが、現構成でボリュームスキャンするかあきらめてFactory Resetというご回答が。でもデータ消えてないんだし何とかなるだろと慣れないraid構成と格闘した結果、無事に読み出せる状態まで持って行けたので良かった良かった。

ちなみになんでHDDが2個同時に抜けたのかというと、HDDを格納するケースにネジ止めをしていなかったせいかSATA端子の刺さりが甘かったようで、HDD交換をしようとしたら隣のスロットのHDDまで抜けた扱いにされてしまったためです……。気づかずに管理画面を見たので、かなり途方に暮れました。今思うと自業自得感が強いですね。