raidframe RAID1 @ root partition

2001年9月21日のメモで RAIDframeによるRAID1の設定のメモを書いた、その続き(?)。

実際のところRAIDframeでミラーリングしていて、「片方のHDDが壊れたけれど ももう一方が生きてて助かったー」なんてな経験がちっともなかったので 今日までほったらかしだった。だってさあ、最近HDDの品質が安定して 1年以内に壊れるのがほとんどなくなったし、あまりに安くなったモンだから soft error とかちょっとでも出るとすぐ次のを買って来ちゃうしねえ。

今回もちょりっと調子の悪くなったHDDを入れ換えちまえってなことで、 これまでFreeBSD+NetBSDでデュアルブートにしてたくせにFreeBSD領域を ちっとも使ってなかったマシン(firestorm)をNetBSDだけのraidframe(RAID1)構 成にしちゃおうということで作戦決行。まずは別の機械に新しいHDDを2つ取り付 けて、と。で最初はデータ領域だけRAID化しようと思ったのだが、しろやまさん による 「RAID frame でRAID1を」という文書に触発されてどうせならrootパーティ ションもやってみれ、と思ったのであった。

「RAIDframeのブートパーティションのRAID化は難しい」と言われてたけど、 別にそうでもなかった。ブート(root)パーティションのRAID化の難しさってのは ほんとにちゃんとできてるか確認するために何度かリブートせんといかんてこと が重いわけで、それに比べたらraidctlコマンドを叩く回数が gmirror コマンド を叩く回数より2〜3回多いなんてなことはちーとも気にならん。ちみもやれ。はい、 毎度の「長い前口上」終わり。

さて、やるべ。新しいHDDを2つ、遊んでるPCに付けてRAIDframe上のNetBSDを 構築する手順で解説する。が、おそらく

  1. 今、1台のHDD(wd0)のみで運用している
  2. 新しい大容量HDDを2個買って来てそのうち1個をくっつけて、wd1に
  3. wd1のほうだけにRAID構築
  4. wd0を新しいHDDに入れ換えてRAID化

という手順でも全く同じと思われる。

大まかな手順は以下の通り。

  1. 片方のHDDにNetBSDをインストール(ここではwd0ってことにする)
  2. もう片方のHDD(wd1)に片割れRAID1を構築してwd0の環境を 全て移行
  3. root=yes + autoconfigured モードにセットした上でリブートしてみる
  4. wd1の「片割れRAID1」だけで起動できたらwd0をRAID1に参加させる
  5. めでたく 2-way RAID1になったらまたリブートしておしまい

さて、実際の手順。wd1のほうのaパーティションをRAID用にでかく取っておく。

 a: 167772160        63       RAID            # (Cyl.      0*-  10443*)
 b:   1049328 167772223       swap            # (Cyl.  10443*-  10508*)
 c: 320159322        63     unused   0  0     # (Cyl.      0*-  19928)
 d: 320173056         0     unused   0  0     # (Cyl.      0 -  19929*)
 e: 151351505 168821551     4.4LFS   0  0  0  # (Cyl.  10508*-  19929*)

/dev/wd1 をRAID1の片割れとしてraid0を構築。そのためのconf。

#
# RAIDframe raid0 configuration
#
START array
1 2 0

START disks
absent
/dev/wd1a

START layout
128 1 1 1

START queue
fifo 100

ポイントは「absent」。これで、 「存在しないけどRAID1の片割れってことにしてね」にできる。 このconfファイルを使ってraid0デバイスを作る。

raidctl -C raid.conf raid0
raidctl -I 12345 raid0
raidctl -iv raid0

ディスクが1個欠けていると raidctl -iv がすぐおわる。 ラッキー。完成したら disklabel -Ie raid0で適当な大きさの raid0a を作って newfs する。そこにwd0aの / をこぴー。

mount -o softdep /dev/raid0a /mnt
tar -cf - --one-file-system .|tar xpfC - /mnt

vi /mnt/etc/fstab して wd0a を raid0a に書き換えておく。

つぎに、raid0をrootパーティションとしてブート時に自動構築するよう 登録。

raidctl -A root raid0

うちの環境ではこのままだと wd1 のスライス0がActiveパーティションになっていなかったようだ。

0: NetBSD (sysid 169)
    start 63, size 320159322 (156328 MB, Cyls 0-19929)
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>

fdisk -a wd1 で Active partition を 0 に。ついでに ブートコードも書いておく。

installboot -o timeout=3 /dev/rwd1a /usr/mdec/bootxx_ffsv1

timeout=3 にしておいたのは、「今どっちのHDDからブートしているのか」を 分かりやすくするため。NetBSD起動のカウントダウンが5秒(デフォルト)から 始まればwd0、3秒で始まればwd1からブートしている、と分かる。さて、 リブート。自動的にwd1のraid0コンポーネントを検出してそこを rootパーティションに変更して上がるはず。うまくいったら、/usr も raid0e に移動。 tarとかでしこしこ移そう。移しおわったら fstab の /usr を raid0から取るようにしてリブート。

ちゃんとあがったらいよいよwd0 を潰す。 wd1 と同一のパーティション構成にした disklabel を wd0 に書く。って これね、

 a: 167772160        63       RAID            # (Cyl.      0*-  10443*)
 b:   1049328 167772223       swap            # (Cyl.  10443*-  10508*)
 c: 320159322        63     unused   0  0     # (Cyl.      0*-  19928)
 d: 320173056         0     unused   0  0     # (Cyl.      0 -  19929*)
 e: 151351505 168821551     4.4LFS   0  0  0  # (Cyl.  10508*-  19929*)

ここからwd0のRAID1への組み込み開始。まず最初の段階。

raidctl -s raid0
Components:
          component0: failed
           /dev/wd1a: optimal

はい、absent指定したcomponent0が壊れている、とのたまっている。 スペアディスクとして /dev/wd0a を足す。

raidctl -a /dev/wd0a raid0

すると raidctl -s raid0 でこうなる。

Components:
          component0: failed
           /dev/wd1a: optimal
Spares:
           /dev/wd0a: spare

ここで component0 をfailさせる。

raidctl -f component0 raid0

実際に強制FAILさせ、wd0aに中味をコピーさせる。このときに component0 と でてるのを /dev/wd0a に置き換えるため、component0 を 強制 Fail させる。

raidctl -F component0 raid0

再構築が始まる。raidctl -s raid0 がこう。

Components:
          component0: reconstructing
           /dev/wd1a: optimal
Spares:
           /dev/wd0a: used_spare
component0 status is: reconstructing.  Skipping label.
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20060807, Mod Counter: 72
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 167772032
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Component label for /dev/wd0a:
   Row: 16, Column: 24, Num Rows: 1368, Num Columns: 0
   Version: 0, Serial Number: 0, Mod Counter: 8
   Clean: Yes, Status: 1154918880
   sectPerSU: 524412, SUsPerPU: 516243, SUsPerRU: 6
   Queue size: 2048, blocksize: 8, numBlocks: 5
   RAID Level: 
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid-2147483392
Parity status: DIRTY
Reconstruction is 4% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.

途中でリブートするとどうなるかな? やってみた。あらーん、 復旧情報が消えて最初から -F やりなおし。だから、おとなしく待とうね。

やりなおして1時間半待った。raidctl -s raid0した。

Components:
          component0: spared
           /dev/wd1a: optimal
Spares:
           /dev/wd0a: used_spare
component0 status is: spared.  Skipping label.
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20060807, Mod Counter: 81
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 167772032
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Component label for /dev/wd0a:
   Row: 0, Column: 0, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20060807, Mod Counter: 81
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 167772032
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Parity status: clean
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.

リブートしてだいジョブかな? えいや。おおおっ、できたー。

Components:
           /dev/wd0a: optimal
           /dev/wd1a: optimal
No spares.
Component label for /dev/wd0a:
   Row: 0, Column: 0, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20060807, Mod Counter: 85
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 167772032
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20060807, Mod Counter: 85
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 167772032
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Parity status: clean
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.

ばんざーい。あとは wd0 と wd1 を片方ずつを外して boot -s してみる。 BIOSで「第1起動ドライブ=wd0、第2起動ドライブ=wd1」になっていれば どちらを外していても問題なくブートするはず。ただし、片方ディスクのまま 普通にマルチユーザブートさせて /var/log/messages なんかを書 かせてしまうとそこでデータの同期が取れなくなってしまうのでうまくない。 練習のときはシングルユーザモードのままにしておくのが吉。わしはマルチユー ザモードにして Parity re-write させたもんだから Parity re-write に また1時間半もかかったしくしく。

主要パーティションのRAID1化がおわったら元のマシンからデータをコピーし ておしまい。ちなみにraid0はこんな風にした。

disklabel raid0|tail -7
7 partitions:
#        size    offset fstype [fsize bsize cpg/sgs]
 a:   2097152         0 4.2BSD   2048 16384 21848
 d: 167772032         0 unused      0     0
 e:  16777216   2097152 4.4LFS      0     0     0
 f:  20971520  18874368 4.4LFS      0     0     0
 g: 127926144  39845888 4.4LFS      0     0     0
grep raid /etc/fstab
/dev/raid0a     /               ffs     rw              1       1
/dev/raid0e     /usr            lfs     rw              1       0
/dev/raid0f     /usr/local      lfs     rw              1       0
/dev/raid0g     /opt            lfs     rw              1       0

fsckなしのlfsを多用している。茶レンジャーじゃろ。ぐはは。


叱咤激励感想ツッコミはゲストブック

Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]