XigmaNASで運用しているZFSのディスクを交換したお話

はじめに

弊社*1ではXigmaNASとZFSを使用してファイルサーバを運用しているのですが、初期導入時に金をケチっていわゆるデスクトップ用HDD*2を使用していました。

今まで特にトラブルなく運用できていましたが、急に逝かれても困るので重い腰を上げてNAS用のHDDに交換したというお話です。

別に弊社はWDの回し者ではありませんが、今回はWD Red™ Plusの4TBモデルに交換しました。

S.M.A.R.Tテスト

運用段階に入ってから壊れられても困るのでExtendedテストを1回流してから組み込みました。

$ smartctl -t long /dev/ada3 
...
$ smartctl -t long /dev/ada4
...

全データセットのバックアップ

作業中に事故って全データ喪失はさすがにつらいので、現時点のフルバックアップを取っておきます。

外付けHDDをマウントします。

$ mkdir /mnt/usb
$ mount /dev/da0p1 /mnt/usb

プール以下のすべてのデータセットに対して再帰的にスナップショットを取得して、外付けHDDに転送します。

$ zfs snapshot -r tank@wd
$ zfs send -R tank@wd > /mnt/usb/tank-20220130.img

バックアップが完了したら作成したスナップショットを破棄したり外付けHDDを外したりします。

$ zfs destroy -r tank@wd
$ camcontrol devlist
...
<BUFFALO HD-PNFU3 0000>            at scbus7 target 0 lun 0 (pass6,da0)
...
$ camcontrol eject da0

新HDDの参加

新しいHDDのパーテーションを切ったりして参加させます。

$ gpart create -s gpt ada3
ada3 created
$ gpart add -t freebsd-zfs -l r1-▓▓▓▓▓▓▓▓▓▓▓▓ -a 4k -s 3700g ada3
ada3p1 added
$ gpart show -l ada3
=>        40  7814037088  ada3  GPT  (3.6T)
          40  7759462400     1  r1-▓▓▓▓▓▓▓▓▓▓▓▓  (3.6T)
  7759462440    54574688        - free -  (26G)

$ gpart create -s gpt ada4
ada4 created
$ gpart add -t freebsd-zfs -l r2-▓▓▓▓▓▓▓▓▓▓▓▓ -a 4k -s 3700g ada4
ada4p1 added
$ gpart show -l ada4
=>        40  7814037088  ada4  GPT  (3.6T)
          40  7759462400     1  r2-▓▓▓▓▓▓▓▓▓▓▓▓  (3.6T)
  7759462440    54574688        - free -  (26G)

パーテーションを切ったらいよいよプールに投入します。

$ zpool add tank mirror gpt/r1-▓▓▓▓▓▓▓▓▓▓▓▓ gpt/r2-▓▓▓▓▓▓▓▓▓▓▓▓
$ zpool status
  pool: tank
 state: ONLINE
  scan: scrub repaired 0 in 0 days 00:31:34 with 0 errors on Fri Jan 28 00:35:34 2022
config:

        NAME                     STATE     READ WRITE CKSUM
        tank                     ONLINE       0     0     0
          mirror-0               ONLINE       0     0     0
            gpt/f01-W▓▓▓▓▓▓▓     ONLINE       0     0     0
            gpt/f02-W▓▓▓▓▓▓▓     ONLINE       0     0     0
          mirror-1               ONLINE       0     0     0
            gpt/r1-▓▓▓▓▓▓▓▓▓▓▓▓  ONLINE       0     0     0
            gpt/r2-▓▓▓▓▓▓▓▓▓▓▓▓  ONLINE       0     0     0

errors: No known data errors

無事にプールに投入出来たら、今までのディスクを切り離します。

$ zpool remove tank mirror-0
$ zpool status
  pool: tank
 state: ONLINE
  scan: scrub repaired 0 in 0 days 00:31:34 with 0 errors on Fri Jan 28 00:35:34 2022
remove: Evacuation of mirror in progress since Sun Jan 30 13:51:02 2022
    2.03G copied out of 262G at 173M/s, 0.77% done, 0h25m to go
config:

        NAME                     STATE     READ WRITE CKSUM
        tank                     ONLINE       0     0     0
          mirror-0               ONLINE       0     0     0
            gpt/f01-W▓▓▓▓▓▓▓     ONLINE       0     0     0
            gpt/f02-W▓▓▓▓▓▓▓     ONLINE       0     0     0
          mirror-1               ONLINE       0     0     0
            gpt/r1-▓▓▓▓▓▓▓▓▓▓▓▓  ONLINE       0     0     0
            gpt/r2-▓▓▓▓▓▓▓▓▓▓▓▓  ONLINE       0     0     0

errors: No known data errors

ここでzpool remove tank mirror-0を入力した際、『セクターサイズが同じじゃないからからvdevの削除は無理ぽよ』的なメッセージが出てきて本気で焦りましたが、再起動したら無事に切り離しコマンドが通りました。

切り離しが完了したのを確認したら、一度サーバを停止させてディスクを取り出せば交換作業はおしまいです。

zpool status
  pool: tank
 state: ONLINE
  scan: scrub repaired 0 in 0 days 00:31:34 with 0 errors on Fri Jan 28 00:35:34 2022
remove: Removal of vdev 0 copied 262G in 0h31m, completed on Sun Jan 30 14:22:10 2022
    7.16M memory used for removed device mappings
config:

        NAME                     STATE     READ WRITE CKSUM
        tank                     ONLINE       0     0     0
          mirror-1               ONLINE       0     0     0
            gpt/r1-▓▓▓▓▓▓▓▓▓▓▓▓  ONLINE       0     0     0
            gpt/r2-▓▓▓▓▓▓▓▓▓▓▓▓  ONLINE       0     0     0

errors: No known data errors

おわりに

vdevの削除コマンドがエラーを吐いた時は時はさすがに焦りましたが、再起動して直ったのでとりあえずヨシといった感じです。

おわり

*1:一人称が弊社なだけで、会社で運用しているわけではありませんからね。

*2:1日8時間稼働する想定のアレ