跳转到内容

磁盘健康:SMART、ZFS scrub 与换盘流程 ​

硬盘不会毫无征兆地突然死掉——大多数时候 SMART 和 ZFS 会提前给出信号。这篇讲怎么看懂这些信号,以及信号变差之后怎么按安全流程换盘。

换盘、zpool replace 属于数据丢失风险操作,操作错了会波及正常的盘

本文后半部分的换盘流程,如果认错目标盘(比如把还在正常工作的盘当成坏盘拔掉),会把一个原本健康的阵列直接搞出双盘故障,数据可能无法恢复。开始换盘前:

  1. 必须用序列号核对物理盘和逻辑设备的对应关系(见下文「先确认物理盘」),不要只凭 /dev/sdb 这种名字或插槽的印象。
  2. 确认冗余还在(mirror/raidz 只坏一块的情况下,池状态是 DEGRADED 而不是 FAULTED),才适合按本文流程热更换。
  3. 如果不确定,先在测试机或几块闲置小容量盘上完整走一遍流程,再操作生产机器。
  4. 唯一的回退手段是备份——冗余能扛住硬件故障,扛不住操作失误。执行前确认这台机器的虚拟机/容器有近期可用的备份,见恢复演练。

开始之前 ​

  • 知道自己的存储在用什么:单盘无冗余(坏了直接丢数据,只能恢复备份)、ZFS mirror/raidz(有冗余,可以热更换)、硬件 RAID(按控制器厂商工具处理,不在本文范围)。
  • 冗余不等于备份:本文教的是发现硬件问题并更换硬件,不能替代备份与恢复。ZFS mirror 两块盘同时坏,数据一样没了。

SMART:硬盘自己的体检报告 ​

PVE 自带 smartmontools,负责监控本地硬盘的 S.M.A.R.T.(自我监测、分析与报告技术)状态。

看单块盘的详细状态 ​

sh
# 宿主机 shell 执行,把 /dev/sdX 换成目标盘
smartctl -a /dev/sdX

重点看两处:

  • SMART overall-health self-assessment test result:应为 PASSED。
  • 具体属性表:机械盘关注 Reallocated_Sector_Ct(重映射扇区数)、Current_Pending_Sector(待映射扇区);SSD/NVMe 关注寿命相关的百分比字段。这些值非零或持续增长都值得警惕,不是看到非零就要立刻换盘,但要开始盯。

如果输出显示 SMART support is: Disabled,先打开:

sh
smartctl -s on /dev/sdX

Web UI 的磁盘健康视图 ​

节点 → Disks,列表里能看到每块盘的健康状态和磨损度列(不同 PVE 版本的具体列名和位置以你的界面为准)。SSD/NVMe 的磨损度是厂商给出的寿命消耗估算,不是精确的剩余寿命,数值到 100% 左右应计划更换,但不代表立刻会坏。双击某一行通常能看到完整的 SMART 属性表。

自动监控:smartd ​

smartd 默认已启用,每 30 分钟扫描一次本机磁盘,发现异常会给 root 发邮件(需要先配好邮件通知,见通知系统)。它按固定的设备命名模式(/dev/sd*、/dev/nvme* 等)扫描,正常情况不需要手动配置,想调整检查频率或告警条件才需要碰 /etc/smartd.conf。

硬件 RAID 卡后面的盘,smartd 看不到真实状态

盘在硬件 RAID 控制器后面时,smartctl 经常拿不到真实数据(或者需要专门的 -d 参数指定 RAID 类型)。这种情况下依赖控制器厂商自己的监控工具。

ZFS 的健康信号:scrub 与 status ​

用 ZFS 的话,除了 SMART,还要看 ZFS 自己的状态。

sh
zpool status -v

关注这几行:

  • state:ONLINE 正常;DEGRADED 表示有盘掉线或异常但池还能跑,这时候相当于冗余已经用掉了,要当紧急情况处理;FAULTED 表示池不可用。
  • scan:显示上次 scrub(清理校验)的时间和结果。PVE 通常自带每月一次的定时 scrub。
  • 每块盘设备的 READ/WRITE/CKSUM 错误计数:非零说明这块盘出过读写错误或校验不一致。

详细的池结构和维护命令见 ZFS 入门;更深入的调优在ZFS 深入。

换盘流程 ​

盘确认要换之后,无论是 SMART 报警还是 ZFS 已经 DEGRADED,流程都一样:先认盘,再拔盘,再让存储层接管新盘。

第一步:用序列号确认物理盘 ​

不要相信 /dev/sdb 这种名字——重启、热插拔都可能让盘符漂移,插错盘的后果是拔掉一块好盘。

sh
# 宿主机 shell 执行
lsblk -o NAME,SIZE,MODEL,SERIAL,MOUNTPOINT
smartctl -i /dev/sdX | grep -i serial

把这里查到的序列号和硬盘托架/盘体上的标签对照,确认无误后再动手。ZFS 场景下,推荐记录设备的 /dev/disk/by-id/ 路径(同样能看到序列号),后续 zpool replace 用这个路径而不是 /dev/sdX:

sh
ls -l /dev/disk/by-id/ | grep sdX

第二步:如果盘还能响应,先安全下线 ​

sh
# 仅当旧盘还在响应、只是频繁报错时执行;已经离线/物理故障的盘跳过这一步
zpool offline <poolname> /dev/disk/by-id/<旧盘的 by-id 路径>

确认这块盘已经不再被使用后,物理拔出,换上新盘。

第三步:让 ZFS 接管新盘 ​

数据池(非系统盘):

sh
zpool replace -f <poolname> /dev/disk/by-id/<旧盘的 by-id 路径> /dev/disk/by-id/<新盘的 by-id 路径>

系统盘所在的 ZFS 池(rpool):新盘需要先有和旧盘一样的分区表和引导分区,步骤更多,且和你的引导方式(GRUB / systemd-boot)相关,官方文档的 ZFS on Linux — Changing a failed device 一节给了完整命令序列(sgdisk 复制分区表、proxmox-boot-tool 重建引导)。这一步不要凭记忆操作,照官方文档逐条核对当前系统的引导方式(proxmox-boot-tool status 能看出来)。

PVE 目前没有一键换盘的图形界面

换 ZFS 盘目前只能走宿主机 shell,Web UI 的 Disks 页面能帮你看健康状态、必要时初始化新盘的分区表(Wipe Disk),但接管进池仍要用上面的命令。如果你看到网上教程说有「Replace Disk」按钮,那不是当前版本的功能。

第四步:等待并确认重建完成 ​

sh
zpool status -v

scan 行会显示 resilver in progress 及百分比,完成后变为 resilvered 且 state 回到 ONLINE,同时 errors: No known data errors。

容量更大的新盘怎么办

新盘容量比旧盘大时,ZFS 默认不会自动利用多出来的空间。想利用它,要在替换前对目标 vdev 设置 autoexpand=on,或者替换完成后手动执行 zpool online -e <poolname> <新盘设备> 触发扩容。

检查结果 ​

  1. zpool status -v:state: ONLINE,无 DEGRADED/FAULTED。
  2. smartctl -a 新盘:PASSED,各项计数正常。
  3. 跑一次 zpool scrub <poolname>,确认没有发现数据错误。
  4. 受影响的虚拟机/容器能正常读写,性能恢复正常(resilver 期间性能会明显下降,是预期现象)。

常见问题 ​

SMART 显示 PASSED,但 ZFS 报这块盘校验错误增多。 以 ZFS 的判断为准——SMART 的自检结果是硬盘自己给出的宏观结论,发现不了每次读写的细粒度校验失败。CKSUM 计数持续增长就该准备换盘,不用等 SMART 变红。

换完盘之后 resilver 一直很慢。 正常,resilver 速度受盘的性能、池的使用率和正在运行的业务 IO 影响,机械盘的大容量 raidz 池可能要几小时到一两天。可以用 zpool status 看预计剩余时间,业务不紧急的话不建议中途取消。

没有 ZFS,普通 LVM 或硬件 RAID 下的盘坏了怎么办。 硬件 RAID 按控制器厂商的工具走(重建阵列);普通 LVM 单盘没有冗余,坏了只能从备份恢复,这也是本站反复强调「单盘无冗余」代价的地方,见加一块新盘。

参考资料 ​

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