在 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 设备):
如上所述,在我的情况下它是 /dev/sdf,所以让我们继续。
然后,您可以尝试通过发出以下命令来查找故障驱动器的序列号:
(如果找不到smartctl,则需要在Ubuntu上安装smartmontools包)
然后可以将序列号与驱动器物理标签上的序列号进行比较,以确定哪个驱动器发生了故障。
但这次,我没那么幸运。驱动器完全死机,甚至拒绝提供 SMART 或其他数据,包括序列号。
由于我可以物理访问服务器(我想,如果您要自己更换物理驱动器,您确实需要这样做 ;-)),并且磁盘发生故障时服务器实际上正在运行(并且由于 RAID-6 冗余而继续正常运行),所以我采用了一种非常原始但实际上非常有效和明显的方法,即简单地将一个大文件复制到服务器并观察哪个硬盘灯没有闪烁。几秒钟内,我就找到了罪魁祸首。
现在,在拔出物理驱动器之前,最好通过发出此命令(根据需要将设备名称替换为您自己的设备名称)正式通知 mdadm 此意图:
如果成功,mdadm 将回复一条消息,表明它“热删除”了驱动器,显然是因为虚拟 raid 设备当时实际上正在运行。
如果失败并显示类似于“设备或资源繁忙”的错误消息,则可能是 mdadm 实际上没有将驱动器注册为完全故障。要做到这一点,请发出以下命令(再次记住根据需要用您自己的设备名称替换设备名称):
之后,您应该能够使用上一个命令从阵列中删除该设备。
现在是时候更换驱动器了。如果你真的非常确定你的机器和控制器支持热插拔,那么你可以在不关闭机器的情况下进行热插拔。这将是运行在真实、合适的服务器硬件上的关键生产系统的方法,你知道这些硬件确实可以处理它。不过,我的家庭文件服务器基于消费级台式机主板,在 PCIe 插槽中有几个半名不见经传的 SATA 控制器,以提供更多 SATA 端口。
虽然 SATA 通常应该支持热插拔,但我不想在这种设置中冒任何风险,因此我选择在更换驱动器时关闭机器。
在执行此操作之前,最好先注释掉 /etc/fstab 文件中的 raid 设备,这样 Ubuntu 就不会在下次启动时尝试自动挂载它,因为它可能会因 RAID 阵列降级而挂起并强制您进入恢复模式。如果是台式机系统,这可能不是什么大问题,但我在没有连接显示器或键盘的情况下运行这台无头服务器,所以这会有点麻烦。
启动安装了新驱动器的机器后,使用 lsblk 或其他方法来识别它。如果你没有更改任何其他内容,它可能会(但不一定)获得与你更换的驱动器相同的名称。在我的情况下确实如此,所以新的驱动器也称为 /dev/sdf。
由于我的阵列基于分区而不是物理设备,因此我需要将分区表从工作驱动器复制到新驱动器,以确保它们完全相同。如果您在物理设备上运行阵列,则可以跳过此步骤。
为此,我使用了 sgdisk,将分区表从 /dev/sdc 复制到 /dev/sdf。确保替换设备名称以匹配您自己的名称。
注意这里的顺序:首先列出“目标”驱动器!这对我来说有点违反直觉,但只要确保你做对了,就不会在阵列中再出现驱动器故障 ;-)
然后,为了避免 UUID 冲突,为新驱动器生成新的 UUID:
现在终于到了将新驱动器添加到阵列并开始重建派对的时候了!(好吧,这实际上不是一个派对,它实际上是一个相当缓慢和令人不安的过程,因为你真的、真的不想此时再出现另一个驱动器故障。不过,啤酒可能会有帮助)
无论如何,要将新驱动器添加到阵列,请发出此命令(再次确保根据需要用您自己的名称替换设备名称):
如果一切顺利,驱动器将顺利添加到阵列中。我相信它实际上是默认添加为“热备用”,但由于此阵列缺少磁盘(发生故障的磁盘),因此它立即投入使用并开始重建过程。
你可以像这样关注它:
这可能需要一段时间;在我的低端服务器上(请注意,主要基于消费级硬件和台式机硬盘),它能够达到略低于 100 MB/秒的速度。请记住,这是 RAID-6,因此重建涉及大量奇偶校验计算;RAID-10 会快得多。这台特定的机器有一个 AMD A10 9700E 四核 CPU(“E”表示它是一种低频节能型号,即不是超级快),只是为了让您了解会发生什么。在我的设置中,有九个 8 TB 硬盘,完全重建仅用了 24 小时多一点。
在重建期间,您可以根据需要将文件系统挂载到阵列上并像平常一样使用它,但我更愿意将其留到重建完成为止。请记住,如果一个驱动器发生故障,另一个驱动器可能很快就会发生故障,因此您希望尽快完成重建,因为您真的不希望在此期间另一个驱动器发生故障。因此,不要用其他不必要的 IO 来增加重建的负担。
完成后,将其添加回您的 /etc/fstab 文件,重新启动并享受您的文件 :-)