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の削除コマンドがエラーを吐いた時は時はさすがに焦りましたが、再起動して直ったのでとりあえずヨシといった感じです。
おわり