我在 4 个磁盘上有一个软件 RAID5 阵列 (Linux md)。
我想用新磁盘替换其中一个磁盘,而不使阵列处于降级状态,如果可能的话,在线。这怎么可能呢?
这很重要,因为我不想:
- 冒着对其他磁盘施加压力的风险,这样一个磁盘可能会在重建过程中崩溃,
- 冒着处于“无平价状态”的风险,所以我在一段时间内没有安全网。
我想在线这样做要求太多了,我应该将dd
旧磁盘的数据原始复制()到新磁盘离线然后替换它,但我认为理论上是可能的......
一些背景:这些磁盘几乎连续旋转了 5.5 年以上。目前它们仍然可以完美工作,并且都通过了(长)SMART 自检。然而,我有理由认为这 4 个磁盘中的一个不会持续太久(假设是预测性故障)。
答案1
使用 mdadm 3.3+
自从mdadm
3.3(2013 年 9 月 3 日发布),如果您有3.2+ 内核,您可以按如下方式进行:
# mdadm /dev/md0 --add /dev/sdc1
# mdadm /dev/md0 --replace /dev/sdd1 --with /dev/sdc1
sdd1
是您要更换的设备,sdc1
是执行此操作的首选设备,并且必须将其声明为阵列上的备用设备。
该--with
选项是可选的,如果未指定,将使用任何可用的备用。
较旧的 mdadm 版本
注意:你还需要一个3.2+ 内核。
首先,添加一个新驱动器作为备用驱动器(分别用您的 RAID 和磁盘设备替换md0
和sdc1
):
# mdadm /dev/md0 --add /dev/sdc1
然后,启动像这样的复制替换操作(sdd1
作为故障设备):
# echo want_replacement > /sys/block/md0/md/dev-sdd1/state
结果
系统会将所有可读块从 复制sdd1
到sdc1
。如果遇到不可读的块,它将根据奇偶校验来重建它。操作完成后,前一个备用驱动器(此处:sdc1
)将变为活动驱动器,并且故障驱动器将被标记为故障 (F),以便您可以将其删除。
笔记:信用归于弗罗斯特舒茨和安斯加尔·埃斯特曼谁找到了原始解决方案(参见重复的问题)。
较旧的内核
其他答案建议:
答案2
这也许可以满足要求
- 在线的
- 除了要更换的磁盘之外,不要对任何磁盘施加压力
但即使以下内容可能有效,您也可能不会在“书中”找到任何此类建议......
主意:
- 将旧磁盘从阵列中取出(暂时):
mdadm --manage /dev/raid5 --fail /dev/OLD
- 从旧磁盘和新磁盘创建新的 md 设备 (RAID-1):
mdadm --build /dev/md42 --level=mirror --raid-devices=2 /dev/OLD /dev/NEW
- 将 RAID-1 放回阵列中(而不是 /dev/OLD):
mdadm --manage /dev/raid5 --re-add /dev/md42
什么应该:-) 发生:
- RAID-5 使 /dev/md42 同步。这应该不会花很长时间。
- RAID-5 再次正常运行(但速度较慢)。
- /dev/NEW 与 /dev/OLD 同步。
观察同步进度(cat /proc/mdstat
或mdadm --monitor
)。如果同步完成,请将 RAID-1 从 RAID-5 中取出,停止 RAID-1,将 /dev/NEW 重新添加到 RAID-5。如果一切正常,请覆盖 /dev/OLD 上的 mdraid 超级块以避免出现问题:mdadm --zero-superblock
警告:仅当您使用位图时,快速 RAID-5 同步才可能起作用。如果您没有,那么最好先使用虚拟 RAID-5(不带位图)进行测试。或者添加一个。至少应该可以添加一个外部的。否则,在更改设备之前可能需要停止 RAID-5。不过,如果从 RAID-5 启动,这会变得有点复杂。
答案3
如果您不介意运行 RAID-6(2 个奇偶校验磁盘而不是 1 个),并且运行 mdadmin 3.1.x 或更高版本,则可以将 RAID-5 阵列转换为 RAID-6添加额外的奇偶校验磁盘。然而,这将使阵列在重建过程中承受压力。由于写入期间需要更新更多奇偶校验磁盘,因此它会产生一些性能影响。
但如果它成功完成,那么您可以将发生故障的磁盘保留在原位,并且当它最终发生故障时,您仍然可以获得阵列的奇偶校验保护。我认为如果您不等待将其保留为 RAID6,则可以将阵列从 RAID6 转换回 RAID5。
我不知道有什么在线方法可以将阵列保持为 RAID-5 并更换磁盘而不将阵列置于降级模式,因为我认为您必须将其标记为更换失败。您的 dd 复制想法可能就是这样做的方法。