おうちのマシンを修理した履歴です。 GPTベースのRaidframe操作方法に関する注意の備忘録になります

本記事は、 その(2)「ソフトウエア編(RAID1を修復する)」です。 その(1)「ハードウエア編」はこちら

手順ハイライト

  1. HDDを交換
  2. gptを再設定、raid0.confを編集後、いちおう再起動
  3. 正しいdk順になったところまで確認したうえで
  4. 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.

References