#19 ZFS on Root (ZROOT) なファイルシステムを持つ FreeBSD の HDD 交換手順

 [公開]
icon 古場 正行 が 2021/05/17 14:23 に投稿 ( icon 古場 正行 が 2023/08/16 9:53 に編集 <更新履歴> )

ZFS on Root の HDD 交換

  • 以下、3TB の HDD 5台 (ada0〜4) で raidz2ZFS 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 ada0gpart 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  -

 添付ファイル     - [0]


 コメント追加