ZFS on Root の HDD 交換
- 以下、3TB の HDD 5台 (ada0〜4) で raidz2 の ZFS on Root (ZROOT) を構成している FreeBSD の ada0 を交換する例を示す。
- ZFS on Root は FreeBSD のインストーラが標準で作成するパーティション構成とする。
① 交換対象の HDD の GPT を確認する
- もしも HDD がまだ物理的に繋がっているのであれば、交換対象の HDD の GPT (GUID パーティションテーブル) を確認しておく。
# gpart show ada0 => 40 5860533088 ada0 GPT (2.7T) 40 1024 1 freebsd-boot (512K) 1064 984 - free - (492K) 2048 4194304 2 freebsd-swap (2.0G) 4196352 5856335872 3 freebsd-zfs (2.7T) 5860532224 904 - free - (452K)
② 故障した HDD をオフラインにする
zpool status
で REMOVED になっている HDD をオフラインにする。# zpool offline zroot ada0p3
- 既に kernel によって切り離されて OFFLINE になっていたら不要。
③ 故障した HDD を新しい HDD に換装する
- 新しい HDD を別の OS で使用したことがある場合はパーティション 情報が書き込まれてしまっていたりするので、ZFS でうまく扱えない可能性がある。新品ではない HDD と交換する場合は、全セクタの消去を実行しておくことを推奨する。
- 交換する HDD を間違えると面倒なことになるので、全ての HDD にはシリアル番号をテプラで印刷したものを貼っておくこと。
- FreeBSD の環境では、シリアル番号は以下のコマンドで知ることができる。
% grep ada /var/run/dmesg.boot | grep "Serial Number" ada0: Serial Number WD-WCC4N1DY2VVU ada1: Serial Number WD-WCC4N0LUJRVC ada2: Serial Number WD-WMC4N0F3FM2X ada3: Serial Number WD-WCC4N0FZ31JY ada4: Serial Number WD-WCC4N3JLA6UX % sudo camcontrol identify ada0 | grep "serial number" (故障した HDD が、まだ kernel から認識されている場合) serial number WD-WCC4N1DY2VVU
- FreeBSD の環境では、シリアル番号は以下のコマンドで知ることができる。
④ 新しいディスクに GPT を作成する
- ZFS on Root を構成している他の HDD と全く同じ GPT を作るので、もしも故障した HDD の GPT を確認できてないのであれば、生きている HDD の GPT を確認しておく。
# gpart show ada1 => 40 5860533088 ada1 GPT (2.7T) 40 1024 1 freebsd-boot (512K) 1064 984 - free - (492K) 2048 4194304 2 freebsd-swap (2.0G) 4196352 5856335872 3 freebsd-zfs (2.7T) 5860532224 904 - free - (452K)
- ada0 (新しい HDD) の GPT を確認する。GPT を作成していないので、まだ何もないはず。
# gpart show ada0 gpart: No such geom: ada0.
- 新しい HDD に GPT パーティションを作成する。
# gpart create -s gpt ada0 ada0 created # gpart add -i 1 -t freebsd-boot -b 40 -s 1024 ada0 ada0p1 added # gpart add -i 2 -t freebsd-swap -b 2048 -s 4194304 ada0 ada0p2 added # gpart add -i 3 -t freebsd-zfs -b 4196352 -s 5856335872 ada0 ada0p3 added # gpart show ada0 => 40 5860533088 ada0 GPT (2.7T) 40 1024 1 freebsd-boot (512K) 1064 984 - free - (492K) 2048 4194304 2 freebsd-swap (2.0G) 4196352 5856335872 3 freebsd-zfs (2.7T) 5860532224 904 - free - (452K)
-b
オプションに指定する値はパーティションの開始セクタ、-s
オプションに指定する値は確保したいセクタ数になる。これらの値はgpart show ada0
やgpart show ada1
で表示された情報をそのまま使う。
⑤ ブートコードの書き込み
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
partcode written to ada0p1
bootcode written to ada0
⑥ 新しい HDD のリプレース処理
zpool status
を確認する。状態 (state:) が DEGRADED になっていることがわかる。- ちなみに、現在の ZFS on Root は HDD 5台の raidz2 構成なので、ストレージが同時に2台死んでもファイルシステムは DEGRADED 状態のまま普通に利用できる。
デバイスが OFFLINE もしくは UNAVAIL 表示の時
# zpool status
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scan: scrub repaired 0B in 05:10:16 with 0 errors on Sat Nov 2 05:09:14 2019
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
ada0p3 OFFLINE 0 0 0
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
ada3p3 ONLINE 0 0 0
ada4p3 ONLINE 0 0 0
errors: No known data errors
もしくは
# zpool status
pool: zroot
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J
scan: resilvered 540G in 2 days 11:32:49 with 0 errors on Mon Aug 14 12:20:59 2023
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
ada0p3 UNAVAIL 0 0 0 invalid label
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
ada3p3 ONLINE 0 0 0
ada4p3 ONLINE 0 0 0
errors: No known data errors
zpool replace zroot ada0p3
を実行する。
# zpool replace zroot ada0p3
# zpool status
pool: zroot
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Sat Aug 5 10:40:38 2023
899G scanned at 31.0G/s, 9.66G issued at 341M/s, 10.8T total
1.10G resilvered, 0.09% done, 09:14:19 to go
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
replacing-0 DEGRADED 0 0 0
ada0p3/old UNAVAIL 0 0 0 invalid label
ada0p3 ONLINE 0 0 0 (resilvering)
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
ada3p3 ONLINE 0 0 0
ada4p3 ONLINE 0 0 0
errors: No known data errors
デバイスが REMOVED 表示の時
# zpool status
pool: zroot
state: DEGRADED
status: One or more devices has been removed by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scan: resilvered 60.3M in 0 days 00:07:09 with 0 errors on Thu Oct 24 16:34:54 2019
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
12666808191319145442 REMOVED 0 0 0 was /dev/ada0p3
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
ada3p3 ONLINE 0 0 0
ada4p3 ONLINE 0 0 0
errors: No known data errors
- was /dev/ada0p3 と書かれている 12666808191319145442 がリプレース元となるので、それを指定して
zpool replace
を実行する。
# zpool replace zroot 12666808191319145442 ada0p3
Make sure to wait until resilver is done before rebooting.
If you boot from pool 'zroot', you may need to update
boot code on newly attached disk 'ada0p3'.
Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
⑦ リプレースの進行状況の確認
zpool status
(もしくはzpool status -x
) を実行する。
# zpool status
pool: zroot
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Sun Oct 27 18:38:17 2019
819G scanned at 2.23G/s, 1.84G issued at 23.6M/s, 5.99T total
0 resilvered, 0.03% done, 3 days 01:56:53 to go
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
replacing-0 REMOVED 0 0 0
12666808191319145442 REMOVED 0 0 0 was /dev/ada0p3/old
ada0p3 ONLINE 0 0 0
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
ada3p3 ONLINE 0 0 0
ada4p3 ONLINE 0 0 0
errors: No known data errors
- 現在 0.03% done で、完了までに 3 days 01:56:53 to go と表示されているが、実は5時間半弱でリプレースは完了した。
- ちなみに、リプレース中もファイルシステムは普通に利用できる。
⑧ リプレース完了の確認
zpool status
(もしくはzpool status -x
) を実行する。
# zpool status
pool: zroot
state: ONLINE
scan: resilvered 1.18T in 0 days 05:22:19 with 0 errors on Mon Oct 28 00:00:36 2019
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
ada3p3 ONLINE 0 0 0
ada4p3 ONLINE 0 0 0
errors: No known data errors
- なお、全体の容量は以下の通り。
# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zroot 13.6T 10.2T 3.39T - - 17% 75% 1.00x ONLINE -