« | Home | »

2012.03.04

GPTでミラー化したHDDの初期化と再組み込み

以前に「FreeBSD 9.0のGPTでのミラー構築」を書いたが、HDDの故障に際しての交換作業を行なうことを試みた。現在、ミラーはドライブada0とada1で構成されているが、ada1が故障したとの前提で行うこととした。現実的には、ada1を外して新しいHDDを取り付けることとなるが、新しいHDDの代わりにada1として使っていたHDDを初期化して、再度使うこととし、GPTでミラー化されたHDDを初期化することも合わせて試みることとした。

以下説明のためミラー構成でada0となっていたドライブをdv#0 、ada1となっていたドライブをdv#1と呼ぶこととする。

1. HDDの初期化

dv#1を初期化するため、dv#0のケーブルを抜き、dv#1のみ実装した状態で、FreeBSD 9.0のインストールCDで立ち上げ、Live CDを選択してrootでログインする。
プロンプトが現れたら、HDDの状態を調べる。

# gpart show
=>         34      312581741 ada0   GPT    (149G)
              34                  128     1   freebsd-boot  (64k)
            162      136314880     2   freebsd-ufs     (65G)
136315042        19986412     3   freebsd-swap   (9.5G)
156301454      156280321          - free -   (74G)

このことから、

  • bootレコードは、34セクター目から161セクターまで
  • データー領域は、162 – 136315041
  • スワップ領域は、136315042 – 156301453

となっていることが分かる。最後の156301454以降312581775までが空きである。最後のセクターが表示の1行目の312581741と僅かに異なるが、理由は分からない。
そして、ミラーのメタデーターはそれぞれの領域の最終セクターに書かれているので、境界を跨ぐようにddで消去する。以下のように行った。

# dd if=/dev/zero of=/dev/ada0 bs=512 count=2000
# dd if=/dev/zero of=/dev/ada0 seek=136314000 bs=512 count=2000
# dd if=/dev/zero of=/dev/ada0 seek=156301000 bs=512 count=2000
# dd if=/dev/zero of=/dev/ada0 seek=312581000 bs=512 count=2000

最後の行の空き領域の最後にzeroを書き込む必要はないと思われるが、以前にもHDD全体でgmirrorで使用した痕跡が残っているかも知れず、念のため消去を行った。
なお、bs=100mとして全領域消去したら約42分かかった。150GBの小容量のHDDでも42分だから、大容量HDDだと丸1日かかるかも知れない。

2. ミラーの再構築の事前確認

Shutdownして、dv#0, dv#1とも接続して普通に立ち上げる。
gpartで確認すると、dv#0の情報のみ表示される。

# gpart show
=>         34      156301421 ada0   GPT    (74G)
              34                  128     1   freebsd-boot   (64k)
            162      136314880     2   freebsd-ufs      (65G)
136315042        19986412     3   freebsd-swap   (9.5G)
156301454                      1          - free -   (512B)

gmirrorのステータスを見ると、

# gmirror status
mirror/p1 DEGRADED ada0p1  (ACTIVE)
mirror/p2 DEGRADED ada0p2  (ACTIVE)
mirror/p3 DEGRADED ada0p3  (ACTIVE)

となっていて、すべてDegradeした状態で動いている。

3. ミラーの再構築

ここで、ada1をada0と同じ分割となるように作る。

# gpart backup ada0 > ada0.gpt
# gpart restore -F ada01 < ada0.gpt

再度、gpart showで情報を見ると、ada0とada1が同じ構成で現れる。ただしdv#1の方が容量が大きいので、最後に付いている空き領域が74Gにもなっている。

# gpart show
=>         34      156301421   ada0   GPT    (74G)
              34                  128     1   freebsd-boot  (64k)
            162      136314880     2   freebsd-ufs     (65G)
136315042        19986412     3   freebsd-swap   (9.5G)
156301454                      1          - free -   (512B)

=>         34      312581741 ada1   GPT    (149G)
              34                  128     1   freebsd-boot  (64k)
            162      136314880     2   freebsd-ufs     (65G)
136315042        19986412     3   freebsd-swap   (9.5G)
156301454      156280321          - free -   (74G)

ここで、ada1にbootレコードを書き込む。
boot領域をミラー化してもbootコードだけは、gmirrorの対象外であるため、マニュアルで書いておく必要がある。最初これが分からず、起動しなくて散々悩むこととなった。

# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada1

gmirrorの構成情報をリセットして状態を確認する。

# gmirror forget p1
# gmirror forget p2
# gmirror forget p3
# gmirror status
mirror/p1 COMPLETE ada0p1  (ACTIVE)
mirror/p2 COMPLETE ada0p2  (ACTIVE)
mirror/p3 COMPLETE ada0p3  (ACTIVE)

構成情報がリセットされたので、それぞれの領域のミラーを構築する。

# gmirror insert p1 /dev/ada1p1
# gmirror insert p2 /dev/ada1p2
# gmirror insert p3 /dev/ada1p3
# gmirror status
Name         status     Components
mirror/p1    COMPLETE   ada0p1 (ACTIVE)
                        ada1p1 (ACTIVE)
mirror/p2    DEGRADED   ada0p2 (ACTIVE)
                        ada1p2 (SYNCRONIZING 1%)
mirror/p3    COMPLETE   ada0p3
                        ada1p3 (SYNCRONIZING 20%)

p1はboot領域で64kBしかないので、同期化は一瞬で終わる。
次にswap領域が、比較的小容量なので短時間で完了する。swap領域の同期化が完了すれば、サーバーは使用可能になる。コマンドの入力に対して通常と思える応答を示す。
本当に、HDDが壊れて新しいHDDを接続したときは、3.項のミラーの再構築のみなので、作業は簡単である。

コメント

コメントはありません

コメントフィードを購読する

コメント投稿





コメント本文に次の(X)HTMLタグを使えます:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)