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を 構築する手順で解説する。が、おそらく
という手順でも全く同じと思われる。
大まかな手順は以下の通り。
さて、実際の手順。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