如何安全地更换 Linux RAID5 阵列中尚未发生故障的磁盘?

Tot*_*tor 31 linux software-raid mdadm raid5

我在 4 个磁盘上有一个软件 RAID5 阵列(Linux md)。

我想用一个新磁盘替换其中一个磁盘,而不是将阵列置于降级状态,如果可能,联机。这怎么可能?

这很重要,因为我不想:

  • 冒险对其他磁盘施加压力,因此在重建期间可能会崩溃,
  • 冒着处于“非平等状态”的风险,所以我有一段时间没有安全网。

我想在网上这样做要求太多了,我应该dd将旧磁盘的数据原始复制 ( ) 到新磁盘,然后离线替换它,但我认为理论上是可能的......

一些背景:这些磁盘几乎都在连续旋转超过 5.5 年。目前,它们仍然可以完美运行,并且都通过了(长时间的)SMART 自检。但是,我有理由认为这 4 个磁盘中的一个不会持续太久(假设是预测性故障)。

Tot*_*tor 45

使用 mdadm 3.3+

mdadm3.3(2013 年 9 月 3 日发布)开始,如果您有3.2+ 内核,则可以按以下步骤操作:

# mdadm /dev/md0 --add /dev/sdc1
# mdadm /dev/md0 --replace /dev/sdd1 --with /dev/sdc1
Run Code Online (Sandbox Code Playgroud)

sdd1是您要更换的设备,sdc1是首选设备,并且必须在阵列上声明为备用设备。

--with选项是可选的,如果未指定,将使用任何可用的备件。

较旧的 mdadm 版本

注意:您仍然需要3.2+ 内核

首先,添加一个新的驱动器作为备用(替换md0,并sdc1分别与RAID和磁盘设备):

# mdadm /dev/md0 --add /dev/sdc1
Run Code Online (Sandbox Code Playgroud)

然后,像这样启动一个复制替换操作(sdd1作为故障设备):

# echo want_replacement > /sys/block/md0/md/dev-sdd1/state 
Run Code Online (Sandbox Code Playgroud)

结果

系统会将所有可读块从 复制sdd1sdc1。如果遇到不可读的块,它将从奇偶校验重建它。操作完成后,之前的备用sdc1驱动器(此处:)将变为活动状态,故障驱动器将标记为故障 (F),以便您可以将其移除。

注意:归功于froschutzAnsgar Esztermann,他们找到了原始解决方案(参见重复问题)。

较旧的内核

其他答案建议:

  • Johnny方法:将阵列转换为 RAID6,“替换”磁盘,然后返回到 RAID5,
  • Hauke Laging方法:从 RAID5 阵列中简单地移除磁盘,使用新磁盘使其成为 RAID1(镜像)的一部分,然后将该镜像驱动器添加回 RAID5 阵列(理论上)...

  • 在 `--replace` 起作用之前,仍然需要 `mdadm --add`。(`mdadm` 3.3,Ubuntu 15.10)。如果你在 `--replace` 之后执行 `--add`,一旦添加了备件,复制就会开始。(设备保持标记为“想要更换”)。 (2认同)