Miklix

在 Ubuntu 上更换 mdadm 阵列中的故障驱动器

已出版: 2025年2月15日 UTC 22:02:38
最后更新 2026年1月12日 UTC 08:50:05

如果您不幸遇到 mdadm RAID 阵列中的硬盘发生故障的情况,本文将解释如何在 Ubuntu 系统上正确更换硬盘。


为了使尽可能多的人能够访问本页面,本页面由英文机译而成。遗憾的是,机器翻译技术尚不完善,因此可能会出现错误。如果您愿意,可以在此处查看原始英文版本:

Replacing a Failed Drive in an mdadm Array on Ubuntu

本文信息基于 Ubuntu 18.04 及其软件仓库中包含的 mdadm 版本;撰写本文时,该版本为 v4.1-rc1。对于其他版本,这些信息可能有效,也可能无效。

最近我的家用文件服务器突然出现硬盘故障,这台服务器由九块硬盘组成,采用的是 mdadm RAID-6 阵列。这种情况总是很吓人,但幸运的是,我很快就找到了替换硬盘,第二天就送到了,所以我可以开始重建系统了。

说实话,当初搭建文件服务器的时候我确实有点抠门;只有两块硬盘是真正的NAS专用硬盘(希捷IronWolf),其余的都是桌面硬盘(希捷Barracuda)。不出所料,其中一块桌面硬盘坏了(虽然用了快三年了)。它彻底死机了;我把它装到桌面USB硬盘盒里,结果只听到令人不安的咔哒声,Ubuntu 20.04和Windows 10都检测不到它。

好吧,接下来是更换硬盘的部分(没错,我买的新硬盘是IronWolf,吸取教训了)——在运行中的阵列中丢失硬盘固然可怕,但如果你不知道正确的更换步骤,那就更可怕了。这并非我第一次在mdadm阵列中更换故障硬盘,但幸运的是这种情况非常罕见,所以我通常只需要查阅正确的命令即可。这次我决定自己写个小指南,以备将来参考。

首先,当你收到来自 mdadm 的故障事件邮件时,你需要确定是哪个驱动器出了问题。邮件里会显示设备名称(我的例子中是 /dev/sdf),但你可能很难看出它实际对应的是哪个物理驱动器,因为这些名称在机器启动时可能会改变。

如果您甚至不确定哪个设备名称出现故障,可以使用以下命令来查找(将 /dev/md0 替换为您的 RAID 设备):

mdadm -–query -–detail /dev/md0

如前所述,我的情况是 /dev/sdf,所以我们继续从这里入手。

然后,您可以尝试通过执行以下命令查找故障硬盘的序列号:

smartctl -–all /dev/sdf | grep -i 'Serial'

(如果找不到 smartctl,则需要在 Ubuntu 上安装 smartmontools 软件包)

然后可以将序列号与硬盘物理标签上的序列号进行比较,以确定哪个硬盘出现故障。

不过这次我就没那么幸运了。硬盘彻底坏了,连SMART信息和其他数据都无法提供,包括序列号。

由于我可以实际接触到服务器(如果你要自己更换硬盘,这确实是必不可少的 ;-)),而且硬盘故障时服务器正在运行(由于 RAID 6 冗余,服务器仍然运行良好),所以我采用了一种非常原始但实际上非常有效且显而易见的方法:向服务器复制一个大文件,然后观察哪个硬盘的指示灯没有闪烁。几秒钟之内,我就找到了罪魁祸首。

在拔出物理硬盘之前,最好先正式通知 mdadm 此意图,方法是发出以下命令(请根据实际情况将设备名称替换为您自己的名称):

mdadm -–manage /dev/md0 -–remove /dev/sdf1

成功后,mdadm 会回复一条消息,称它“热移除”了驱动器,显然是因为虚拟 RAID 设备当时正在运行。

如果出现类似“设备或资源忙”的错误信息,则可能是 mdadm 实际上尚未将驱动器标记为完全故障。要使其标记为完全故障,请执行以下命令(同样,请记住将设备名称替换为您自己的设备名称):

mdadm --manage /dev/md0 --fail /dev/sdf

之后,您应该能够使用之前的命令从阵列中移除该设备。

现在是时候更换硬盘了。如果您非常非常确定您的机器和控制器支持热插拔,那么您可以在不关机的情况下进行更换。对于运行在真正可靠的服务器硬件上的关键生产系统,并且您确信这些硬件能够承受热插拔,那么热插拔是最佳选择。不过,我的家用文件服务器使用的是消费级桌面主板,PCIe 插槽里插着几个不知名的 SATA 控制器,用来提供更多的 SATA 接口。

虽然 SATA 通常支持热插拔,但在这个配置下我不想冒任何风险,所以我选择在更换硬盘时关闭机器。

在此之前,最好先注释掉 `/etc/fstab` 文件中的 RAID 设备,这样 Ubuntu 就不会在下次启动时自动尝试挂载它,否则可能会因为 RAID 阵列降级而导致系统卡死并强制进入恢复模式。如果是桌面系统,这可能不是什么大问题,但我的服务器是无头运行的,没有连接显示器或键盘,所以这样做会比较麻烦。

安装好新硬盘后启动电脑,使用 lsblk 或其他方法识别硬盘名称。如果您没有更改其他任何设置,新硬盘的名称很可能(但不一定)与您更换的旧硬盘相同。我的情况就是这样,所以新硬盘也叫 /dev/sdf。

由于我的阵列是基于分区而非物理设备的,所以我需要将分区表从一台正常工作的硬盘复制到新硬盘,以确保它们完全相同。如果你的阵列运行在物理设备上,则可以跳过此步骤。

我使用 sgdisk 工具将分区表从 /dev/sdc 复制到 /dev/sdf。请务必根据实际情况替换设备名称。

注意这里的顺序:要先列出“目标”驱动器!这对我来说有点违反直觉,但一定要确保顺序正确,以免阵列中出现其他驱动器故障 ;-)

sgdisk -R /dev/sdf /dev/sdc

然后,为了避免 UUID 冲突,为新驱动器生成新的 UUID:

sgdisk -G /dev/sdf

现在终于到了把新硬盘添加到阵列,开始重建的时候了!(好吧,其实这算不上什么派对,而是一个相当缓慢且令人不安的过程,因为你真的非常非常不想在这个时候再有一块硬盘出问题。不过,啤酒或许能帮上忙。)

总之,要将新驱动器添加到阵列中,请执行以下命令(同样,请务必根据实际情况将设备名称替换为您自己的名称):

mdadm -–manage /dev/md0 -–add /dev/sdf1

如果一切顺利,这块硬盘将顺利添加到阵列中。我相信它默认是以“热备盘”的形式添加的,但由于该阵列缺少一块硬盘(故障的那块),它会立即投入使用,并启动重建过程。

你可以这样关注它:

watch cat /proc/mdstat

这可能需要一些时间;在我那台配置较低的服务器上(请注意,它主要基于消费级硬件和桌面级硬盘),速度勉强达到 100 MB/s。请记住,这是 RAID 6,因此重建过程中涉及大量的奇偶校验计算;RAID 10 的速度会快得多。这台机器配备了 AMD A10 9700E 四核 CPU(“E”表示它是低频节能型,即速度不是很快),这样您就能对速度有个大致了解。我的配置中有九块 8TB 硬盘,整个重建过程耗时超过 24 小时。

重建过程中,您可以根据需要将文件系统挂载到阵列上并像往常一样使用它,但我建议在重建完成后再进行操作。请记住,如果一个硬盘发生故障,另一个硬盘可能很快也会发生故障,因此您需要尽快完成重建,以免在重建过程中出现其他硬盘故障。所以,请不要进行任何不必要的 I/O 操作。

完成后,将其添加回 /etc/fstab 文件,重启系统,即可享用您的文件 :-)

分享至 Bluesky在 Facebook 上分享在 LinkedIn 上分享在 Tumblr 上分享分享至 X在 LinkedIn 上分享在Pinterest上固定

Mikkel Christensen

关于作者

Mikkel Christensen
迈克尔 是 miklix.com 的创建者和所有者。他拥有 20 多年的专业计算机程序员/软件开发人员经验,目前全职受雇于一家大型欧洲 IT 公司。不写博客时,他把业余时间花在各种兴趣、爱好和活动上,这在一定程度上反映在本网站涵盖的各种主题上。