跳转到内容

软件 RAID 维护:换盘、扩容与重建 ​

读完这一篇,你能在阵列降级时认出坏盘、换上新盘并完成重建,给阵列加盘扩容,并给阵列做定期的一致性检查。创建阵列见软件 RAID。

阵列降级后的每一步都在「没有冗余」的状态下进行

影响范围:整个阵列上的数据。拔错盘、重建期间又坏一块盘、中途断电,都可能让阵列无法使用。

前置条件:

  • 数据已经有独立备份。 RAID 不是备份,见备份策略。没有备份,先备份能读到的数据,再动手。
  • 读完本文再开始,不要边读边做。
  • 按序号确认坏的是哪一块盘,拔盘之前再核对一次。
  • 重建和重塑期间不能断电,有条件的话接 UPS。

怎么回退:重建开始后不能回退。如果阵列已经无法组装,不要重新创建阵列或让它「修复」,先读用救援系统抢救数据并向社区求助。重新创建会覆盖元数据,让能救回来的数据变成救不回来。

一、先判断状况 ​

  1. 打开 存储器 → RAID 管理(Storage → Multiple Device)。状态带 degraded,就是降级。邮件通知也会提醒,见软件 RAID 里的告警设置。
  2. 选中阵列,点显示详情,等同于 mdadm --detail。关注这几项:State(总体状态)、Active Devices、Working Devices、Failed Devices、Spare Devices,以及下面成员表里每块盘的状态:正常是 active sync,坏的是 faulty,已经被拿掉的是 removed,重建中的是 spare rebuilding。
  3. 在 OMV 的 shell(SSH 或本机控制台,以 root 身份)里看,都是只读:
sh
cat /proc/mdstat
mdadm --detail /dev/md0

/proc/mdstat 里 [UU_] 的下划线对应缺失的那块盘。

  1. 确认是盘坏了,还是线松了。 看 dmesg -T | tail -50 有没有该盘的 I/O 错误,看这块盘的 SMART 状态。线松、掉线的盘,检查线材再看它是否回来,不要一上来就当成坏盘更换。

认出是哪一块物理盘 ​

阵列详情里的成员写成 /dev/sdX,设备名重启后可能变。在 OMV 的 shell 里用序号对应:

sh
ls -l /dev/disk/by-id/ | grep -v part
smartctl -i /dev/<磁盘> | grep -i serial

把序号和硬盘标签上的 S/N 对上,再拔盘。同一块盘的型号、序号、容量也记在 存储器 → 磁盘(Storage → Disks)页,见磁盘管理。USB 盒里的序号不可靠,但阵列里本来就不该有 USB 盘。

二、换掉一块坏盘 ​

适用于盘已经被标记为故障或缺失的情况。

  1. 在 RAID 管理 页选中阵列,点移除(Remove,数据库减号图标)。
  2. 设备里选要移除的盘,点保存。界面说明:这会先把它标记为故障,再从阵列移出,让阵列进入冗余度降低的降级状态,被移除的盘上的 RAID 元数据不会被擦除。镜像、RAID 4/5、RAID 10 一次最多移一块,RAID 6 最多两块。盘已经被系统自动移出的,跳过这一步。
  3. 关机,换新盘,开机。支持热插拔的机器可以不关机。新盘容量不能比旧盘小。
  4. 在 存储器 → 磁盘 里把新盘做一次快速擦除,避免它带着旧的 RAID 标记。
  5. 回到 RAID 管理,选中阵列,点恢复(Recover,数据库同步图标),在设备里选新盘,保存。界面写明:给降级的阵列加盘会启动重建,内核自动把数据同步到新盘,这一过程可能很长,不要断电或重启。
  6. 状态会显示 recovering 和进度。等它回到 clean 或 active。

重建完成后:

  • 给新盘开 SMART 监控,并做一次短自检。
  • 确认邮件告警正常。
  • 把阵列的成员序号写进你的文档,下次换盘更快。

预防性更换:盘还没坏,只是 SMART 报警 ​

界面里的流程是「先移除、再恢复」,换的过程中阵列是降级的。想在更换期间仍保留冗余,可以用 mdadm 的 --replace,做法是先把新盘作为热备盘加进来,再让它替换旧盘。

先在界面里对健康的阵列点恢复,加上新盘,它会成为热备盘;再在 OMV 的 shell 里执行 mdadm /dev/md0 --replace /dev/<旧盘> --with /dev/<新盘>。根据 mdadm 手册,--replace 会让旧盘在重建期间继续工作,重建完成后才把它标记为故障。界面没有这个功能,命令的完整说明见 mdadm(8),先在测试环境演练。

三、热备盘 ​

在健康的阵列上点恢复加盘,这块盘会作为热备盘待命:阵列里有盘故障时,内核自动用它重建,不需要你立刻赶到。热备盘不增加容量。

四、加盘扩容 ​

添加(Add,数据库加号图标)给阵列加盘并触发重塑,它只对镜像、条带、RAID 4/5/6 可用,并且要求阵列状态是 clean 或 active。

  1. 先备份,确认阵列健康,新盘已擦除。
  2. 选中阵列,点添加,选新盘,保存。OMV 依次执行:mdadm --manage --add 加入新盘,mdadm --grow --size=max 取各盘能容纳的最大值,mdadm --grow --raid-devices=N 把活动盘数改成加盘之后的数目。
  3. 状态显示 reshaping 和进度。重塑可能要几个小时到几天,期间不能断电或重启。
  4. 重塑完成后,阵列容量变大,但上面的文件系统不会自动变大。到 存储器 → 文件系统(Storage → File Systems),选中它,点扩充(Grow),确认。

镜像加盘是变成多路镜像,不增加容量。RAID 5 从 4 盘加到 5 盘,容量增加一块盘。

mdadm 手册说,Linux 内核能在线安全地增减 RAID 5/6 的盘数,但每个块都要读出再写到新位置,重塑关键阶段会暂停写入。OMV 不传备份文件参数,所以重塑中途断电后能否自动恢复,取决于 mdadm 和元数据版本,这正是要先备份并接 UPS 的原因。

把所有盘换成更大的盘 ​

没有空闲盘位、想换大盘扩容时,一块块更换:每换一块都按「第二节」走完移除、擦除、恢复、等重建结束,再换下一块。最后一块重建完成后,阵列容量并不会自动变大,要让它使用全部空间。界面没有这个入口,命令是 mdadm --grow /dev/md0 --size=max(OMV 在「添加」里也用同样的参数),确认所有成员盘都已经换成新盘之后再执行,随后在 文件系统 页点扩充。这个流程待实机核实,先在测试环境验证。

五、重建要多久,风险在哪 ​

  • 重建要读遍所有存活的盘,写满新盘。大容量机械盘,几个小时到一两天都不奇怪。
  • 重建期间阵列是降级的,再坏一块盘(RAID 5、镜像)或两块盘(RAID 6)就会丢数据。盘越大、越老,越要小心。SMR 盘在重建时可能慢得出奇。
  • 内核默认限制重建速度,默认每块盘最低 1000 KiB/s、最高 200000 KiB/s(md(4) 手册)。当系统上有别的读写时,重建会让位给业务,所以很慢。想加快,可以调高最低速度,这会让同时进行的其他读写变慢:
sh
cat /proc/sys/dev/raid/speed_limit_min
echo <KiB每秒> > /proc/sys/dev/raid/speed_limit_min

这个值重启后恢复默认。官方文档里也是这个方法。不要把它设得太高,让 NAS 完全不可用。

  • 想知道进度:看界面里的状态,或在 shell 里 cat /proc/mdstat,每隔一会儿看一次。
  • 重建期间不要重启、不要升级内核、不要同时做 SMART 长自检。

六、一致性检查 ​

检查(Check)会读遍阵列里所有块并核对冗余:RAID 5/6 核对奇偶校验,镜像和 RAID 10 比较各副本。它能提前发现盘上悄悄出现的坏扇区,趁盘还没彻底坏就知道。

OMV 8 的 md 插件会屏蔽 Debian 自带的 mdcheck_start.timer 和 mdcheck_continue.timer(插件安装脚本里 disable、stop 并 mask 了它们),所以默认不会定期自动检查,要靠你手动或自己安排。

手动运行 ​

在 RAID 管理 页选中阵列,点维护(Maintenance,扳手图标),子菜单里有:

项作用
检查(Check)读并核对,统计不一致的数量。仅冗余级别可用,阵列空闲时才能启动
修复(Repair)核对并修复不一致。确认框提醒:无法确定哪份数据正确时,修复可能覆盖数据
停止(Stop)中断正在运行的检查或修复

检查期间不要断电或重启。OMV 的这些按钮是向内核的 md/sync_action 写入 check、repair 或 idle。

读结果 ​

检查结束后,在 OMV 的 shell 里用下面的命令读不一致扇区的数量,把 md0 换成你的阵列:

sh
cat /sys/block/md0/md/mismatch_cnt
  • RAID 5/6: 应当是 0。非零要认真对待,先看 SMART 和 dmesg,不要一看到非零就点修复。
  • 镜像和 RAID 10: 非零不一定说明数据坏了。md(4) 手册说,最常见的原因是 swap 分区或 swap 文件,这块空间在 swap 系统眼里是「空的」,所以两份副本内容不同也不要紧,这个计数在这种级别上不能可靠解读。

安排定期检查(可选) ​

想每月跑一次,可以在 系统 → 计划任务(System → Scheduled Tasks)里建一个任务,用 root 执行下面的命令,选在夜里没有备份、没有 SMART 长自检的时段。任务的建法见计划任务:

sh
for f in /sys/block/md*/md/sync_action; do echo check > "$f"; done

这等同于对每个冗余阵列点一次检查。内核文档说明,只有在阵列处于空闲状态时 check 才会启动,所以和重建撞车时它不会干扰重建。这种做法待实机核实,第一次手动执行并观察一遍。

检查结果 ​

  • RAID 管理 里阵列状态是 clean 或 active,没有 degraded、recovering。
  • /proc/mdstat 里每个阵列的末尾都是全 U,例如 [4/4] [UUUU]。
  • 检查完成后 mismatch_cnt 是预期值。
  • 每块成员盘的 SMART 状态都是「好」。
  • 告警邮件能发出:mdadm --monitor --scan --oneshot --test,见软件 RAID。

常见问题 ​

移除时提示「最多一个设备可被移除」。 镜像、RAID 4/5、RAID 10 的限制,RAID 6 是两个。

新盘加不进去。 新盘比阵列里最小的成员还小,或者盘上还有文件系统、旧 RAID 标记。先擦除,换同容量或更大的盘。

重建到一半,另一块盘也掉线了。 立刻停止对阵列的写入,不要再点任何会写盘的按钮。先把还能读的数据复制出来,再考虑后续,参考RAID 降级和用救援系统抢救数据。

阵列状态是 inactive。 缺的成员太多,阵列没有运行。不要 mdadm --create。先检查线材和电源,让掉线的盘回来,仍不行就去救援篇。

添加后容量没有变。 重塑还没有结束,或者你忘了在 文件系统 页点扩充。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。