ZFS 作为企业级存储文件系统,具备强大的自愈与冗余能力。当底层硬盘出现故障时,ZFS 可以在不中断服务的情况下安全地替换损坏磁盘并自动进行数据重建(Resilver)。
本文记录一次在 TrueNAS Core/Scale 环境中更换故障硬盘的完整过程,包括错误诊断、替换步骤、重建进度观察与后续验证,适合 ZFS 实战维护参考。
一、问题出现:Pool 状态降级
在 TrueNAS Web 界面或命令行中发现警告提示:
Pool cdt state is DEGRADED:
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.
The following devices are not healthy:
Disk ST6000NM0034 Z4D2X397 is UNAVAIL
含义说明:
• DEGRADED:ZFS 池降级,部分磁盘失效;
• invalid label / missing label:磁盘 ZFS 元数据(Label)损坏或无法识别;
• UNAVAIL:ZFS 无法访问该磁盘设备;
• Sufficient replicas exist:由于为 RAIDZ2,仍有足够副本保证数据安全。
二、查看详细状态
执行命令:
zpool status -v
输出结果如下:
pool: cdt
state: DEGRADED
status: One or more devices could not be used because the label is missing or invalid.
action: Replace the device using 'zpool replace'.
scan: resilvered 3.61M in 00:00:03 with 0 errors on Mon Sep 29 13:18:10 2025
config:
NAME STATE READ WRITE CKSUM
cdt DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
312e0889-2835-429c-ac87-db96589ad215 ONLINE 0 0 0
4bc958f7-f0d6-452f-8234-690c6fe6b65e ONLINE 0 0 0
12f4a7b5-770b-4b22-9476-ce9745e0a9c9 ONLINE 0 0 0
77c65f04-9792-49a7-91f6-e280d24f2f52 ONLINE 0 0 0
sdd1 UNAVAIL 0 0 0 invalid label
e568987e-eade-493c-9332-214e7d947076 ONLINE 0 0 0
cache
1ba496e9-5249-4428-8e02-f04e90c4098c ONLINE 0 0 0
可以看到:
• sdd1 对应的物理磁盘 UNAVAIL(不可用)
• 错误提示为 invalid label,说明盘上的 ZFS 元数据损坏;
• 由于是 RAIDZ2,池仍然可读写但处于降级状态。
三、确认新盘并准备替换
更换物理硬盘后,系统检测到新磁盘 /dev/sdd。
可通过以下命令确认识别情况:
lsblk
或:
zpool status
确认新盘未被分区、未被 ZFS 使用(如果有旧分区,需要先清理):
wipefs -a /dev/sdd
四、执行磁盘替换操作
使用 zpool replace 命令替换故障盘:
zpool replace -f cdt sdd1 /dev/sdd
参数说明:
| 参数 | 说明 |
|---|---|
| -f | 强制替换,即使旧盘标签无效 |
| cdt | 目标存储池名称 |
| sdd1 | 原故障盘标识 |
| /dev/sdd | 新磁盘设备路径 |
执行后 ZFS 会自动触发 Resilver(重建) 过程,将丢失的副本数据同步到新盘中。
五、查看重建进度
执行命令:
zpool status
输出:
pool: cdt
state: DEGRADED
status: One or more devices is currently being resilvered.
action: Wait for the resilver to complete.
scan: resilver in progress since Fri Oct 31 18:25:15 2025
301G / 300G scanned, 6.85G / 292G issued at 638M/s
1.13G resilvered, 2.35% done, 00:07:37 to go
config:
NAME STATE READ WRITE CKSUM
cdt DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
replacing-4 DEGRADED 0 0 0
sdd1 UNAVAIL 0 0 0 invalid label
sdd ONLINE 0 0 0 (resilvering)
ZFS 自动创建一个临时节点 replacing-4,表示旧盘与新盘的替换关系。
可使用以下命令实时查看重建进度:
watch -n 10 zpool status cdt
或:
while true; do clear; date; zpool status cdt; sleep 10; done
六、等待重建完成
当重建完成后,输出将类似:
pool: cdt
state: ONLINE
scan: resilvered 292G in 00:14:25 with 0 errors on Fri Oct 31 18:39:40 2025
config:
NAME STATE READ WRITE CKSUM
cdt ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
312e0889-2835-429c-ac87-db96589ad215 ONLINE 0 0 0
4bc958f7-f0d6-452f-8234-690c6fe6b65e ONLINE 0 0 0
12f4a7b5-770b-4b22-9476-ce9745e0a9c9 ONLINE 0 0 0
77c65f04-9792-49a7-91f6-e280d24f2f52 ONLINE 0 0 0
sdd ONLINE 0 0 0
e568987e-eade-493c-9332-214e7d947076 ONLINE 0 0 0
此时,池恢复为 ONLINE 状态。
七、后续维护操作
- 清除旧盘标签(若需要重新使用)
zpool labelclear -f /dev/sdd1
或彻底清除:
wipefs -a /dev/sdd1
- 执行一次 Scrub 校验
zpool scrub cdt
zpool status cdt
确保结果中出现:
errors: No known data errors
表示数据一致性校验通过。
- 启用自动扩展与定期校验
zpool set autoexpand=on cdt
并在计划任务中添加:
zpool scrub cdt
建议每月自动运行一次。
八、自动检测与报警(推荐)
为了在出现硬盘异常时自动获知状态,可编写一个简单的检测脚本,每小时执行一次,若检测到池状态非 ONLINE,则推送到 Telegram / 邮件告警。
示例脚本(zfs_alert.sh):
#!/bin/bash
pool="cdt"
state=$(zpool list -H -o health $pool)
if [ "$state" != "ONLINE" ]; then
msg="⚠️ ZFS Pool $pool 状态异常:$state"
echo "$msg" | mail -s "ZFS Pool Alert" admin@example.com
# 或 Telegram API 推送
# curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
# -d chat_id=$CHAT_ID -d text="$msg"
fi
九、经验总结
1. ZFS 具备极强的自愈能力:只要副本冗余充足(如 RAIDZ2),单盘损坏不会导致数据丢失。
2. 替换操作无需卸载或重启:在业务不中断的情况下即可完成。
3. 务必关注 SMART 告警:提前识别磁盘健康状况可避免更大风险。
4. Resilver 期间性能略有下降:建议避开高负载时间段进行更换。
305



被折叠的 条评论
为什么被折叠?



