おうちのマシンを修理した履歴です。 GPTベースのRaidframe操作方法に関する注意の備忘録になります
本記事は、 その(2)「ソフトウエア編(RAID1を修復する)」です。 その(1)「ハードウエア編」はこちら。
手順ハイライト
- HDDを交換
- gptを再設定、raid0.confを編集後、いちおう再起動
- 正しいdk順になったところまで確認したうえで
- raid0をリビルド
Raidframe - NetBSD software raid -
大昔からあるNetBSDのソフトウエアRAIDシステム。 RAID1モードでしか使っていませんが、 四半世紀ほど、たくさんのサーバで使い続けてきた超実績ありです (注:個人の実績値です)。
今回のサーバは、次の構成です。
- SSD x1 … NetBSDがインストールされているOS領域(ブート用,非冗長)
- HDD x2 … 2.5inch HDD (5400rpm, SMR)を2台たばねた低速の保存領域(RAID1)
パーティッションはGPTです。 このサーバ以前は伝統のMBRでしたが、 このサーバからはGPTベースでHDDを区画整理するようにしました。 ここが大きな変更点で、MBR時代との操作方法の相違には注意が必要です。
Raidframe の設定
- 3台(SSDx1, HDDx2)ともGPTでパーティッションを切りました
- 重要な場所にはGPT LABELを振ります
- カーネルのdk(4)がGTPを認識し、連番で番号を振ってくれます
- RAID1もdk(4)です
この結果、全dk一覧は次のようになっています
| dkN | device | ptype | gpt label |
|---|---|---|---|
| dk0 | /dev/ld0 | efi | |
| dk1 | /dev/ld0 | ffs | |
| dk2 | /dev/ld0 | swap | |
| dk3 | /dev/wd0 | efi | |
| dk4 | /dev/wd0 | raid | WD20SPZX-2019-01 |
| dk5 | /dev/wd0 | swap | |
| dk6 | /dev/wd1 | efi | |
| dk7 | /dev/wd1 | raid | WD20SPZX-2019-02 |
| dk8 | /dev/wd1 | swap | |
| dk9 | /dev/raid0 | ffs | HOME-RAID1 |
カーネル(raidframe)が、 dk4とdk7のタイプraidを認識してRaidframeの対象と理解するため、 dk4とdk7のタイプはraidです。 raid0に束ねたあとにnewfsするので、こちらはffsです
なお、この表の書き方は分かりやすさ優先(不正確)です。 gptで設定する際は、上のタイプを指定します。 一方dkctlの表示(dk デバイス listwedges)はefiではなくmsdosとなることに注意してください (注:EFIはmsdos形式なので間違ってはいませんがgptのオプション名ではない)。 カーネルとしては、 ディスク上の詳細は見ていなくて、 あくまでもフォーマットが、どのタイプなのか?を見ているだけなので、 この表示で正しいです
現状の確認
壊れたwd0が半端に反応していて、 dk全10個は見え、 gptは読めず、 raid0は片方がfailed
[dk一覧]
# dkctl /dev/rld0 listwedges
/dev/rld0: 3 wedges:
dk0: 102f9bca-cb83-470a-abe4-5bdad11e54ae, 262144 blocks at 2048, type: msdos
dk1: d9c02460-529b-4520-b1a1-4bcd5a02f2ba, 1886152704 blocks at 264192, type: ffs
dk2: e2bf557d-e7ed-4356-a8c5-724bfc0474d0, 67108239 blocks at 1886416896, type: swap
# dkctl /dev/rwd0 listwedges
/dev/rwd0: 3 wedges:
dk3: 2f232590-7541-4d9b-bf27-04991f45ad52, 262144 blocks at 2048, type: msdos
dk4: WD20SPZX-2026-01, 3900000000 blocks at 264192, type: raidframe
dk5: 8d6cc67a-8cb0-43f2-9a79-404c1fd4204d, 6764943 blocks at 3900264192, type: swap
# dkctl /dev/rwd1 listwedges
/dev/rwd1: 3 wedges:
dk6: 28fc5dc4-caa6-401a-8b17-63b83039616b, 262144 blocks at 2048, type: msdos
dk7: WD20SPZX-2019-02, 3900000000 blocks at 264192, type: raidframe
dk8: 8fff93c3-c5d3-404d-a6a0-b26895bee0ef, 6764943 blocks at 3900264192, type: swap
# dkctl /dev/rraid0 listwedges
/dev/rraid0: 1 wedge:
dk9: HOME-RAID1, 3899999616 blocks at 128, type: ffs
[gpt一覧]
# gpt show /dev/rld0d
start size index contents
0 1 PMBR
1 1 Pri GPT header
2 32 Pri GPT table
34 2014 Unused
2048 262144 1 GPT part - EFI System
264192 1886152704 2 GPT part - NetBSD FFSv1/FFSv2
1886416896 67108239 3 GPT part - NetBSD swap
1953525135 32 Sec GPT table
1953525167 1 Sec GPT header
# gpt show /dev/rwd0d
GPT not found, displaying data from MBR.
start size index contents
0 3907029168 Unused
# gpt show /dev/rwd1d
start size index contents
0 1 PMBR
1 1 Pri GPT header
2 32 Pri GPT table
34 2014 Unused
2048 262144 1 GPT part - EFI System
264192 3900000000 2 GPT part - NetBSD RAIDFrame component
3900264192 6764943 3 GPT part - NetBSD swap
3907029135 32 Sec GPT table
3907029167 1 Sec GPT header
[raid0のステータス]
# raidctl -s raid0
Components:
/dev/dk4: failed
/dev/dk7: optimal
No spares.
/dev/dk4 status is: failed. Skipping label.
Component label for /dev/dk7:
Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 20210124, Mod Counter: 8657
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 3899999872
RAID Level: 1
Autoconfig: No
Root partition: No
Last configured as: raid0
Parity status: clean
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
[/etc/raid0.conf] (参考)
START array
1 2 0
START disks
NAME=WD20SPZX-2019-01
NAME=WD20SPZX-2019-02
START layout
128 1 1 1
START queue
fifo 100
- RaidframeがGPTラベルを見て、 /dev/dk4と/dev/dk7を探してくるので、 wd0が完全に壊れてdkがずれても正しいデバイスを探せています
壊れたディスク(wd0)を交換
「ハードウエア編」はこちらを参照してください。
交換して電源を入れます。 あれ、wd1が認識しませんかね? さらに再起動したらwd0とwd1両方とも見えました。
再起動(1):HDD交換後の最初の起動
チェックポイントは次の2つ
- wd0を認識したか
- dkずれるけど7つ認識したか
もちろんdmesgにデバイスwd0は登場しますが、 gptは未設定で、dkの番号が次のようにズレています(前詰めになっています)。
listwedges:
/dev/rld0: 3 wedges:
dk0: 102f9bca-cb83-470a-abe4-5bdad11e54ae, 262144 blocks at 2048, type: msdos
dk1: d9c02460-529b-4520-b1a1-4bcd5a02f2ba, 1886152704 blocks at 264192, type: ffs
dk2: e2bf557d-e7ed-4356-a8c5-724bfc0474d0, 67108239 blocks at 1886416896, type: swap
/dev/rwd0: no wedges configured
/dev/rwd1: 3 wedges:
dk3: 28fc5dc4-caa6-401a-8b17-63b83039616b, 262144 blocks at 2048, type: msdos
dk4: WD20SPZX-2019-02, 3900000000 blocks at 264192, type: raidframe
dk5: 8fff93c3-c5d3-404d-a6a0-b26895bee0ef, 6764943 blocks at 3900264192, type: swap
/dev/rraid0: 1 wedge:
dk6: HOME-RAID1, 3899999616 blocks at 128, type: ffs
wd0にGPTを設定する
ではwd0にGPTパーティッションを作成し、再起動してdkを認識するか試しましょう
コマンド一覧
- gptコマンドオプションにある数字は
gpt show /dev/rwd1dで確認した値です
# gpt destroy /dev/rwd0d
# gpt create /dev/rwd0d
# gpt show /dev/rwd0d
# gpt add -b 2048 -s 262144 -t efi /dev/rwd0d
# gpt add -b 264192 -s 3900000000 -t raid -l WD20SPZX-2026-01 /dev/rwd0d
# gpt add -b 3900264192 -s 6764943 -t swap /dev/rwd0d
ログ(読みやすいように空行を追加しています)
# gpt destroy /dev/rwd0d
gpt: /dev/rwd0d: Device doesn't contain a GPT
# gpt create /dev/rwd0d
# gpt show /dev/rwd0d
start size index contents
0 1 PMBR
1 1 Pri GPT header
2 32 Pri GPT table
34 3907029101 Unused
3907029135 32 Sec GPT table
3907029167 1 Sec GPT header
# gpt add -b 2048 -s 262144 -t efi /dev/rwd0d
/dev/rwd0d: Partition 1 added: c12a7328-f81f-11d2-ba4b-00a0c93ec93b 2048 262144
# gpt add -b 264192 -s 3900000000 -t raid -l WD20SPZX-2026-01 /dev/rwd0d
/dev/rwd0d: Partition 2 added: 49f48daa-b10e-11dc-b99b-0019d1879648 264192 3900000000
# gpt add -b 3900264192 -s 6764943 -t swap /dev/rwd0d
/dev/rwd0d: Partition 3 added: 49f48d32-b10e-11dc-b99b-0019d1879648 3900264192 6764943
# gpt show /dev/rwd0d
start size index contents
0 1 PMBR
1 1 Pri GPT header
2 32 Pri GPT table
34 2014 Unused
2048 262144 1 GPT part - EFI System
264192 3900000000 2 GPT part - NetBSD RAIDFrame component
3900264192 6764943 3 GPT part - NetBSD swap
3907029135 32 Sec GPT table
3907029167 1 Sec GPT header
/etc/raid0.confのGPTラベルを編集
編集しない案もありますが、GPTラベルを変更する手順を推奨したいと考えています
- GPTラベルを何に使いますか?
- ハードウエアを使い始めた「年号」を付けておくとメインテナンス上わかりやすい
- 本来のGPTラベルはWD20SPZX-2019-01」ですが、 (前節では)GPTラベルを「WD20SPZX-2026-01」にしたことを御確認ください
- /etc/raid0.confを変更しても問題ないのか?
- 問題ないです。 デバイス検索時のキーワードなので、変更しても問題ないです
- 起動時に、 カーネルがraid0.confのGPTラベルからデバイス(e.g. dk4)を検索します
- 【重要】GPTの設定とraid0.conf編集をセットで作業することが大事です
再起動(2)
- 再起動してdkの順が期待どおり(正常運用時と同じ)になっているか?を確認します
- dk数は10個
- HDD交換前とdk4のラベルだけ異なることに注意
- raid0でもdk4 failed, dk7 optimalであることを確認します
- 確認できたら、RAID1のリビルドに進みます
# dkctl /dev/rld0 listwedges
/dev/rld0: 3 wedges:
dk0: 102f9bca-cb83-470a-abe4-5bdad11e54ae, 262144 blocks at 2048, type: msdos
dk1: d9c02460-529b-4520-b1a1-4bcd5a02f2ba, 1886152704 blocks at 264192, type: ffs
dk2: e2bf557d-e7ed-4356-a8c5-724bfc0474d0, 67108239 blocks at 1886416896, type: swap
# dkctl /dev/rwd0 listwedges
/dev/rwd0: 3 wedges:
dk3: 2f232590-7541-4d9b-bf27-04991f45ad52, 262144 blocks at 2048, type: msdos
dk4: WD20SPZX-2026-01, 3900000000 blocks at 264192, type: raidframe
dk5: 8d6cc67a-8cb0-43f2-9a79-404c1fd4204d, 6764943 blocks at 3900264192, type: swap
# dkctl /dev/rwd1 listwedges
/dev/rwd1: 3 wedges:
dk6: 28fc5dc4-caa6-401a-8b17-63b83039616b, 262144 blocks at 2048, type: msdos
dk7: WD20SPZX-2019-02, 3900000000 blocks at 264192, type: raidframe
dk8: 8fff93c3-c5d3-404d-a6a0-b26895bee0ef, 6764943 blocks at 3900264192, type: swap
# dkctl /dev/rraid0 listwedges
/dev/rraid0: 1 wedge:
dk9: HOME-RAID1, 3899999616 blocks at 128, type: ffs
# raidctl -s raid0
Components:
/dev/dk4: failed
/dev/dk7: optimal
No spares.
/dev/dk4 status is: failed. Skipping label.
Component label for /dev/dk7:
Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 20210124, Mod Counter: 8657
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 3899999872
RAID Level: 1
Autoconfig: No
Root partition: No
Last configured as: raid0
Parity status: clean
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
RAID1をリビルド
第1引数(書式の「ターゲット」部分)は、 「壊れた」ディスク(正確には"Unixの"パーティッション)になります。 データを書き戻したい対象と言い換えてもよいです
[書式]
# raidctl -R ターゲット raid0
今回の修復対象は/dev/dk4です (raidctl -sで/dev/dk4: failed)
# raidctl -R /dev/dk4 raid0
2TBの再構築に14時間ほどかかりました!!! たいてい2TBの2.5inchはSMRなので、 ディスクの転送速度は約35MB/sでしたが、 これくらいが普通ですね。 ふだんは気づきませんが、こういうときにSMRか!となります orz
再起動(3)して確認
# raidctl -s raid0
Components:
/dev/dk4: optimal
/dev/dk7: optimal
No spares.
Component label for /dev/dk4:
Row: 0, Column: 0, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 20210124, Mod Counter: 8695
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 3899999872
RAID Level: 1
Autoconfig: No
Root partition: No
Last configured as: raid0
Component label for /dev/dk7:
Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 20210124, Mod Counter: 8695
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 3899999872
RAID Level: 1
Autoconfig: No
Root partition: No
Last configured as: raid0
Parity status: clean
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.