2023年前後のNetBSDでのZFS(zpool)運用のツボ

NetBSD8でお試しで使ってたまにクラッシュしつつ、 NetBSD9から本格的に使い出して、もう2年ほどはノートラブルで来ている。 個人的感覚としては、NetBSDでも十分に安定している。そのおかげで バックアップも NVMMでの仮想ホストに対するディスク供給もしやすくてサーバ運用のしやすさが 格段に上がった。

FreeBSDでははるか前から使っているので、ストレージの差し替えだとか 何回も経験しているのだが、NetBSDはやっと「そろそろ交換か」、 といった時期に差し掛かっている。そこで本稿の結論、

NetBSDではzpoolのデバイスにRAIDframeを噛まして使え

である。

理由: NetBSDのzpoolは物理デバイス名でしか探しに行かないから。

HDD(SSD)が不調になって、新たに追加したり、 ケーブルを差し直して、違う番号がついてしまったときにzpoolが 構成ディスクを探さずにプールがインポートされない。 えてしてマザーボードのSATAコネクタの順番は組み立てるときには見るかもしれないが 組んでしまってあとからストレージを追加するときには 適当に空いているところに挿すので、wd0だったものがwd1にずれてしまうことが たまにある。するとzpoolがインポートできずハマる。 /etc/zfs/zpool.cacheをバイナリ書き換えしてデバイス名をずれたものに すればインポートできるが焦った状態ではやりたくない作業である。

対してNetBSD RAIDframe のほうはRAID構成要素のIDを見て wd* が別の番号になってしまってもちゃんと検出してAUTOCONFIGしてくれる。 よって、「デバイス名の固定化」をRAIDframeに任せて、その上でzpoolを 構築するとよい。

手順

こんなディスク構成だと仮定する。

wd0起動ディスク1
wd1起動ディスク2
wd2zpoolその1にしたい
wd3zpoolその2にしたい

ストーリーとしては、wd0とwd1をRAID-1で幸せに使っているところに 「ZFSで入れるかあ」とwd2とwd3を足した。これもミラーにして安心生活。 と、行きたいところだがそうは行かない。wd1が壊れて認識しなくなると wd2がwd1に、wd3がwd2にずれてしまってzpoolが認識されなくなる。 罠ざんしょ? はい、ずれないように事前に手を打っておこう。

  1. 単体ディスクのRAIDframeを作る

    wd2とwd3それぞれ単体のRAIDにする。ここでは

    wd2raid2
    wd3raid3

    で作ってみる。流れとしては

    1. GPTパーティションを作り TYPE=raid で全確保する
    2. raid構築し AUTOCONFIG = yes に設定する

    となる。

    : GPTパーティション作成
    gpt create wd2; gpt create wd3
    gpt add -a8k -t raid -l zp0 wd2
    gpt add -a8k -t raid -l zp1 wd3
    : RAIDframe設定ファイル作成
    cat>raid2.conf <<EOF
    START array
    # numRow numCol numSpare
    1 1 0
    START disks
    NAME=zp0
    
    START layout
    # sectPerSU SUsPerParityUnit SUsPerReconUnit RAID_level_1
    128 1 1 0
    
    START queue
    fifo 100
    EOF
    : これを s/zp0/zp1/ して raid3.conf にする。
    sed 's/zp0/zp1/' raid2.conf > raid3.conf
    : raidデバイスを作る
    raidctl -C raid2.conf raid2
    raidctl -C raid3.conf raid3
    raidctl -I 2023010600 raid2
    raidctl -I 2023010601 raid3
    raidctl -A yes raid2
    raidctl -A yes raid3
    : 確認
    raidctl -s raid2
    raidctl -s raid3
    : それぞれ Autoconfig: yes になっているかよく見る
    
  2. AUTOCONFIGの確認

    ここまで作ったら念の為、システムリブートして raid2 と raid3 ができるか確認したほうがよい。 うまくできないときは、

    1. raidctl -I のシリアルナンバー打ちを忘れている
    2. GPTパーティションを作るときに -t raid していない

    いずれかで、後者の場合は gpt type -T frame でつけ直せる。

  3. zpoolを作る

    あとはいつもどおり。

    zpool create mirror raid2 raid3
    
  4. zpoolの確認

    すぐにシステムリブートしてzpoolができるか確認する。

    気になる場合は、SATAケーブルを差し替えて、wd[0-3]の 順番がぐちゃぐちゃになるようにして試してみるとよい。 うまく行くはず。RAIDframeばんざい。

ちなみに、zfsでなければNetBSDはGPTラベル名で操作できるので たとえばGPTラベルを datadisk0 とかにしておいて、

newfs NAME=datadisk0

とかしたり、fstabにNAME=datadisk0とか書いたりできるので ストレージの順番が変わっても大丈夫。zfsでもたとえばこんなふうに できるといいのになあ。

: ↓実際はできない(2023-01-06現在)
zpool create pool0 mirror NAME=m0 NAME=m1

RAIDframeばんざい。