2011年12月07日

[備忘録]SCSIハードディスクのホットスワップ

うちのメインLinux サーバーは、SCSIハードディスクでソフトウェアRAIDを組んであります。
SCSIといってもいまどきのSAS (Seriral Attached SCSI) ではなく、昔ながらのパラレルSCSIです。
このうちsdbが、今までも時々リードリトライを起こしていたのですが、先日ついにunrecoverable read errorを起こして、自動的にRAIDドライブからはずされてしまいました。
当然、予備のハードディスクと交換するわけですが、普通はサーバーの電源を落として交換しますよね。
実はうちのサーバーのハードディスクはホットスワップ対応のFCコネクタで、それ用のケージに入っています。
そういうわけでホットスワップに挑戦してみたところ、ハード的な交換はうまく行ったのですが、コマンドを打ち間違えて一時はちょっと大変な状況に陥ってしまいました。f(^_^;)
まあ何とか復旧したのでその顛末と、正しい(と思われる)手順を今後の参考のために以下に記録しておきますので、興味のある方は「続きを読む」をクリックして、お読みください。

興味のない方(ほとんどだと思いますが)は、ここでさようなら〜。


うちのソフトウェアRAIDには、md0とmd1という2つの仮想ドライブがあります。
このうちmd1からはすでにsdbが切り離されているのですが、failed状態でまだremoveされていないので、これをremoveします。

# mdadm /dev/md1 --remove /dev/sdb2

md0にはまだsdbが残っているので、まずこれをfailed状態にマークしてからremoveします。

# mdadm /dev/md0 --fail /dev/sdb1 --remove /dev/sdb1

これで、RAIDサブシステムからはsdbが切り離された状態となりました。

ここで、正しい手順は (以下で説明するように) ソフトウェア的に完全にsdbを切り離してからハードウェアを交換することなのですが、私はここでハードディスクを交換してしまいました。

ところが、新しいハードディスクを挿入しても、それが自動的に認識されるわけではないんですよね。
RAIDサブシステムからは切り離されているものの、まだsdbもドライバレベルで存在しているように見えるので、あると思ってここにアクセスしたソフトウェア (smartmontoolsとか)が文句を言い始めます。

今思えば、ちょっとここで私はプチパニックを起こしてしまっていたのかもしれません。
本来ハードウェア交換前に行うべきだったのですが、Linuxから完全にsdbを切り離そうと思い、以下のコマンドを発行しました。

# echo 1 > /sys/class/scsi_device/2:0:0:0/device/delete

ところが、実はsdbは2:0:1:0だったんですね〜。2:0:0:0は (まだ生きている) sdaだったので、ここでRAIDアレイを構成するドライブの数が足りなくなってしまい、RAIDサブシステムは動作しなくなってしまいました!
haltすら、「I/O error」とか言われてしまって実行できません。泣く泣く、強制電源断と相成りました。

本来は、以下のように正しいコマンドを発行してsdbを切り離し、

# echo 1 > /sys/class/scsi_device/2:0:1:0/device/delete

次のコマンドでSCSIバスを再スキャンすれば ("- - -" は、「すべてのチャネル、すべてのID、すべてのLUNでスキャンする」という意味のワイルドカードだそうです)

# echo "- - -" >/sys/class/scsi_host/host2/scan

新しく挿入したハードディスクが認識され (ただしsdbではなく、未使用で最小のマイナーデバイス番号で)、そこにパーティションを切ってmdadm --addすればよかったはずです (リブートするとマイナーデバイス番号が変わるが、RAIDスーパーブロックはpersistentなので問題ない)。

さて、頭を冷やしてから電源を再投入すると、ブートシーケンスの途中で止まってしまいました。
どうやら、先ほどのゴタゴタでsda2がfailedとマークされてしまったようです。
一瞬、目の前が真っ暗になりました。
# mdadm -f /dev/md1 --add /dev/sda2
としても、「resource busy」とか言われて受け付けられません。
どうやら、md1が中途半端な状態になってしまっているようです。
/dev/md1が存在しないので、
# mdadm --stop /dev/md1
としても、「no such file or directory」と言われてしまいます。

いろいろやってみて、
# mdadm --stop md1
でmd1を消すことに成功。その後
# mdadm -f /dev/md1 --add /dev/sda2
として、リブートすると、fsckでエラーが出たものの、無事復旧し、立ち上がりました!

ただし、RAIDアレイはdegrade状態になっているので、/dev/sdbにパーティションを切って、
# mdadm /dev/md0 --add /dev/sdb1
# mdadm /dev/md1 --add /dev/sdb2
とすると、めでたくRAIDアレイが再構成され、本来の状態に戻りました。

ふぅ〜。
ホットスワップは可能なようですが、コマンドを打ち間違えると大変なことになるということがわかりました…。
やっぱりハードディスクの交換は、いったん電源を落としてから行うのが、確実なようです!
ラベル:Linux
posted by ぽそこし at 21:34| Comment(0) | TrackBack(0) | 備忘録 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック