跳转到内容

ZFS 池降级 ​

适用范围 ​

zpool status 显示某个池是 DEGRADED(或更严重的 FAULTED/UNAVAIL),通常伴随 PVE 的邮件通知,或者 Web UI 存储视图上出现感叹号。

开始排查前 ​

先弄清楚两件事,决定了接下来操作的紧迫程度:

  • 还剩多少冗余余量:mirror 坏了一块(还剩一块能用)和 raidz2 坏了两块(只剩最后一块容错空间)是完全不同的紧急程度,后者再坏一块就是全损。
  • 现在的备份状态:最近一次成功备份是什么时候,覆盖了这个池上的哪些客户机。

冗余用尽期间,不要用这个池做额外的高风险操作

池处于 DEGRADED 状态,意味着容错余量已经用掉了一部分。这段时间应该:暂停非必要的大规模写入或迁移任务,优先确保现有备份可用,而不是想着"反正还能跑,先用它做点别的"。

排查步骤 ​

1. 拿到完整的状态输出并保存下来 ​

sh
zpool status -v <pool名>

先把这段输出完整保存一份,后面无论是自己排查还是求助都会用到。重点看三处:

  • 哪个 vdev、哪块具体的盘(设备名或 GUID)处于异常状态。
  • 状态是 FAULTED、UNAVAIL、OFFLINE 还是 REMOVED——含义不完全一样。
  • errors: 那一行是不是 No known data errors——如果不是,说明已经出现了数据层面的错误,不只是设备层面的问题。

2. 区分「盘真的坏了」还是「暂时性问题」 ​

线材松动、供电不稳、背板问题都可能让 ZFS 把一块好盘误判成故障,尤其是伴随 SATA/SAS 链路重置的情况。先做只读检查,不要急着动手换盘:

sh
dmesg | grep -i -E "ata|scsi|nvme" | tail -30
smartctl -a /dev/sdX

SMART 显示明显异常(重分配扇区数持续增长、Pending Sector 不为零、自检失败):基本可以确认盘确实有问题,进入步骤 4 准备换盘。

SMART 正常,但 ZFS 依然判定它故障:先检查物理连接——重新插拔 SATA/电源线(如果是热插拔背板则更方便)、换一个背板槽位或数据线。确认物理连接没问题后进入步骤 3。

3. 暂时性问题的验证方式 ​

物理连接确认无误后,可以清除错误计数并观察是否复现:

sh
zpool clear <pool名>
zpool scrub <pool名>

zpool clear 只是清空错误计数,不会改变盘本身的好坏。跑一次 scrub,如果同样的错误再次出现,说明这块盘确实有问题,应该当作硬件故障处理,而不是反复 clear 敷衍过去。

4. 确认物理盘对应关系,准备更换 ​

换盘前必须精确核对物理盘,插错或拔错会让降级变成全损

在 mirror 只剩最后一块健康盘、或者 raidz 容错余量已经用尽的窗口期,拔错一块正常的盘,会直接导致数据彻底丢失,而不是可以恢复的降级状态。

动手之前:

  1. 用 lsblk、smartctl -a /dev/sdX 里的序列号,和物理盘标签逐一核对,不要只凭设备名(/dev/sdX 会因为重启或热插拔漂移)。
  2. 如果机箱有硬盘指示灯或定位功能,先确认点亮的是要换的那一块。
  3. 不确定的话,先在一台测试机或者用备用盘演练一遍完整的换盘流程,熟悉步骤后再对生产池动手。

完整的物理换盘、zpool replace、等待 resilver 完成的详细步骤,参考磁盘健康:SMART、ZFS scrub 与换盘流程,这里不重复。

5. 跟踪 resilver 进度 ​

替换开始后:

sh
zpool status <pool名>

会显示 resilver in progress,附带已完成的百分比和预计剩余时间。resilver 期间同样处于冗余不足或刚恢复的脆弱状态,继续避免不必要的高负载操作。

6. 没有多余盘位的情况 ​

如果是只有两个盘位的 mirror,没有地方先插入新盘再移除旧盘,需要先 offline 故障盘、物理取出、装上新盘,再执行替换,顺序和有额外盘位时不同,同样在磁盘健康里有具体说明。

确认恢复 ​

  1. zpool status <pool名> 显示所有 vdev 都是 ONLINE。
  2. errors: 一行是 No known data errors。
  3. resilver/scrub 已经完成,且完成后没有新增错误。
  4. 受影响的虚拟机/容器能正常开机,内部做一次基本的完整性检查(比如文件系统检查或者应用自身的校验)。
  5. 观察几天,确认没有新的异常状态邮件通知。

仍未解决 ​

如果 resilver 反复失败、卡住不动,或者同一个 vdev 反复出问题,带上以下信息求助:

sh
zpool status -v <pool名>
zpool history <pool名> | tail -50
smartctl -a /dev/sdX

参考如何有效求助。反复出现同类故障也可能提示背板、供电或控制器层面的系统性问题,而不是单块盘的偶发故障,值得一并排查硬件环境。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。