Miklix

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

已出版: 2025年2月15日 UTC 22:02:38

如果您遇到了可怕的情况,即 mdadm RAID 阵列中的驱动器出现故障,本文将介绍如何在 Ubuntu 系统上正确更换它。


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

Replacing a Failed Drive in an mdadm Array on Ubuntu

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

最近,我的家庭文件服务器突然出现驱动器故障,该服务器由 mdadm RAID-6 阵列中的九个驱动器组成。这总是令人恐惧,但幸运的是,我能够快速找到第二天就已交付的替换驱动器,因此我可以开始重建。

我承认,最初设置文件服务器时我有点太小气了;只有两个硬盘是真正的 NAS 硬盘(Seagate IronWolf),其余的是台式机硬盘(Seagate 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/秒的速度。请记住,这是 RAID-6,因此重建涉及大量奇偶校验计算;RAID-10 会快得多。这台特定的机器有一个 AMD A10 9700E 四核 CPU(“E”表示它是一种低频节能型号,即不是超级快),只是为了让您了解会发生什么。在我的设置中,有九个 8 TB 硬盘,完全重建仅用了 24 小时多一点。

在重建期间,您可以根据需要将文件系统挂载到阵列上并像平常一样使用它,但我更愿意将其留到重建完成为止。请记住,如果一个驱动器发生故障,另一个驱动器可能很快就会发生故障,因此您希望尽快完成重建,因为您真的不希望在此期间另一个驱动器发生故障。因此,不要用其他不必要的 IO 来增加重建的负担。

完成后,将其添加回您的 /etc/fstab 文件,重新启动并享受您的文件 :-)

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

米克尔·邦·克里斯滕森

关于作者

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