Toggle navigation
古場の Knowledge
作成
作成
下書き一覧
ストック
一覧
複合検索
サインイン
更新履歴
古場 正行
2023/08/05 10:48
現在との差分
過去のナレッジの内容
コンテンツ
# ZFS on Root の HDD 交換 - 以下、3TB の HDD 5台 (ada0〜4) で [raidz2](https://docs.oracle.com/cd/E19253-01/819-6260/gcviu/) の [ZFS](https://ja.wikipedia.org/wiki/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 ``` ## ④ 新しいディスクに 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` で表示された情報をそのまま使う。 ## ⑤ 新しい HDD のリプレース処理 - `zpool status` を確認する。状態 (state:) が DEGRADED になっていることがわかる。 - ちなみに、現在の ZFS on Root は HDD 5台の raidz2 構成なので、ストレージが同時に2台死んでもファイルシステムは DEGRADED 状態のまま普通に利用できる。 ### デバイスが OFFLINE 表示の時 ``` # 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 online zroot ada0p3 を実行する。 ``` # zpool online zroot ada0p3 warning: device 'ada0p3' onlined, but remains in faulted state use 'zpool replace' to replace devices that are no longer present # 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: scrub in progress since Sat Aug 5 10:38:47 2023 28.9G scanned at 688M/s, 11.3M issued at 270K/s, 10.8T total 0B repaired, 0.00% done, no estimated completion time 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 replace` の最後に「ブートコードを書き込め」とある場合は、それを実行する。 ``` # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 partcode written to ada0p1 bootcode written to ada0 ``` ## ⑦ リプレースの進行状況の確認 - `zpool status` を実行する。 ``` # 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 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 - ```
現在のナレッジの内容
コンテンツ
# ZFS on Root の HDD 交換 - 以下、3TB の HDD 5台 (ada0〜4) で [raidz2](https://docs.oracle.com/cd/E19253-01/819-6260/gcviu/) の [ZFS](https://ja.wikipedia.org/wiki/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 ``` ## ④ 新しいディスクに 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 - ```
戻る