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 result
が PASSED
なら問題ありません。
さらに詳しい情報を知りたい場合は、下の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
後書き
しばらく待っていると、ディスク交換が完了しました。
参考になった資料は