ZFS RAIDZ ディスクの交換(FreeBSD)

Abstract: 新年あけましておめでとうございます 新年なのにさとしは研究室の作業をやっていました😭。 そしてテストする時に気づいたのは、なぜかPostgreSQLの反応がおかしいほど遅かったです。最初は設計上にバグがあると思って、Misskeyでツッコみたいところ、Misskeyも開けなくなるのを気づきました。さらに確認したら、どうやらうちのNASにディスクが一枚壊れかけているようです。 それで、今日はディスクを交換しようと思います。

ZFS RAIDZ ディスクの交換

故障発生

新年あけましておめでとうございます。

新年なのにさとしは研究室の作業をやっていました😭。 そしてテストする時に気づいたのは、なぜかPostgreSQLの反応がおかしいほど遅かったです。 最初は設計上にバグがあると思って、Misskeyでツッコみたいところ、Misskeyも開けなくなるのを気づきました。 さらに確認したら、どうやらうちのNASにディスクが一枚壊れかけているようです。

それで、今日はディスクを交換しようと思います。

現状確認

まずは現状を確認したいです。

ZFSを利用しているので、zpool status [プール名] で確認できます。現状確認したところ、まだプールで感知できる故障には至っていないようです。

物理ディスクの状況はS.M.A.R.T.っていう機能によって記録されています。この記録はsmartctlコマンドで確認できます。

smartctl命令が吐くレポートのなかにどこを見るべきかを紹介する資料が少ないかも。 smartctl -a /dev/ada0/dev/ada0の状況を確認できます。 この命令は以下のようなレポートを出力してくれます。

smartctl 7.4 2023-08-01 r5530 [FreeBSD 13.1-RELEASE-p6 amd64] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Seagate BarraCuda 3.5 (SMR)
Device Model:     ST4000DM004-2CV104
Serial Number:    ********
LU WWN Device Id: * ****** *********
Firmware Version: 0001
User Capacity:    4,000,787,030,016 bytes [4.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5425 rpm
Form Factor:      3.5 inches
Device is:        In smartctl database 7.3/5528
ATA Version is:   ACS-3 T13/2161-D revision 5
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Thu Jan 11 17:05:55 2024 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00) Offline data collection activity
                                        was never started.
                                        Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever 
                                        been run.
Total time to complete Offline 
data collection:                (    0) seconds.
Offline data collection
capabilities:                    (0x73) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        No Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine 
recommended polling time:        (   1) minutes.
Extended self-test routine
recommended polling time:        ( 482) minutes.
Conveyance self-test routine
recommended polling time:        (   2) minutes.
SCT capabilities:              (0x30a5) SCT Status supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   082   064   006    Pre-fail  Always       -       161547944
  3 Spin_Up_Time            0x0003   096   096   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       16
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   090   060   045    Pre-fail  Always       -       1101094080
  9 Power_On_Hours          0x0032   064   064   000    Old_age   Always       -       32214h+01m+06.483s
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       16
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   099   000    Old_age   Always       -       2 3 3
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   060   050   040    Old_age   Always       -       40 (Min/Max 33/42)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       297
193 Load_Cycle_Count        0x0032   096   096   000    Old_age   Always       -       8974
194 Temperature_Celsius     0x0022   040   050   000    Old_age   Always       -       40 (0 19 0 0 0)
195 Hardware_ECC_Recovered  0x001a   082   064   000    Old_age   Always       -       161547944
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       11817h+23m+41.792s
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       11110953102
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       8028047554

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

The above only provides legacy SMART information - try 'smartctl -x' for more

SMART overall-health self-assessment test resultPASSED なら問題ありません。

さらに詳しい情報を知りたい場合は、下のVendor Specific SMART Attributes with Thresholdsのレポートを見ると良いです。 VOLUME列は現在の値、WORK列はこれまでの最悪値、THRESH列はしきい値です。 これらの値は正規化されているため、THRESH列よりも小さい値は故障の可能性を示しています。

SMARTの属性にはさまざまなものがありますが、ここでは不良セクタに関するもののみ取り上げます。

ID 属性名 説明
5 Reallocated_Sector_Ct 代替処理済みのセクタ数
196 Reallocated_Event_Count セクタ代替処理発生回数
197 Current_Pending_Sector 代替処理保留中のセクタ数
198 Offline_Uncorrectable 回復不可能セクタ数

ディスク交換

まずzpool offline [プール名] [故障ディスク名]で故障ディスクをプールから外します。 実行した後にはzpool statusで確認すると、OFFLINEになっていることが確認できます。

 pool: zstorage
 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 13:19:20 with 0 errors on Thu Jan 11 10:54:21 2024
config:

        NAME        STATE     READ WRITE CKSUM
        zstorage    DEGRADED     0     0     0
          raidz2-0  DEGRADED     0     0     0
            ada0p1  OFFLINE      0     0     0
            ada1p1  ONLINE       0     0     0
            ada2p1  ONLINE       0     0     0
            ada3p1  ONLINE       0     0     0

errors: No known data errors

この状態でディスクを交換します。

ディスク交換した後、パーティションを作成します。 gpart create -s GPT ada0でGPTパーティションを作成します。 さらに、gpart add -t freebsd-zfs ada0でパーティションを作成します。 これでディスクの準備は完了です。

次に、zpool replace [プール名] [故障ディスク名] [新ディスク名]でディスクを交換します。 ここでは、zpool replace zstorage ada0p1 ada0p1でディスクを交換します。

命令を実行した後にはzpool statusで確認すると、replacing-0になっていることが確認できます。

  pool: zstorage
 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 Thu Jan 11 12:08:11 2024
        358G scanned at 14.9G/s, 17.0M issued at 724K/s, 4.78T total
        0B resilvered, 0.00% done, no estimated completion time
config:

        NAME              STATE     READ WRITE CKSUM
        zstorage          DEGRADED     0     0     0
          raidz2-0        DEGRADED     0     0     0
            replacing-0   DEGRADED     0     0     0
              ada0p1/old  OFFLINE      0     0     0
              ada0p1      ONLINE       0     0     0
            ada1p1        ONLINE       0     0     0
            ada2p1        ONLINE       0     0     0
            ada3p1        ONLINE       0     0     0

errors: No known data errors

しばらく待ってから、もう一度zpool statusで確認すると、resilveringになっていることが確認できます。 残り時間はscanのところで確認できます。

  pool: zstorage
 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 Thu Jan 11 12:08:11 2024
        923G scanned at 4.81G/s, 16.0G issued at 85.3M/s, 4.78T total
        3.76G resilvered, 0.33% done, 16:16:12 to go
config:

        NAME              STATE     READ WRITE CKSUM
        zstorage          DEGRADED     0     0     0
          raidz2-0        DEGRADED     0     0     0
            replacing-0   DEGRADED     0     0     0
              ada0p1/old  OFFLINE      0     0     0
              ada0p1      ONLINE       0     0     0  (resilvering)
            ada1p1        ONLINE       0     0     0
            ada2p1        ONLINE       0     0     0
            ada3p1        ONLINE       0     0     0

errors: No known data errors

後書き

しばらく待っていると、ディスク交換が完了しました。

参考になった資料は

https://docs.freebsd.org/en/books/handbook/zfs/