我们在工作中遇到了一个非常奇怪的问题。我们的 Ubuntu 服务器有 6 个驱动器,设置了 RAID1,如下所示:
/dev/md0, consisting of:
/dev/sda1
/dev/sdb1
/dev/md1, consisting of:
/dev/sda2
/dev/sdb2
/dev/md2, consisting of:
/dev/sda3
/dev/sdb3
/dev/md3, consisting of:
/dev/sdc1
/dev/sdd1
/dev/md4, consisting of:
/dev/sde1
/dev/sdf1
如您所见,md0、md1 和 md2 都使用相同的 2 个驱动器(分为 3 个分区)。我还必须注意,这是通过 Ubuntu 软件 raid 而不是硬件 raid 完成的。
今天,/md0
RAID1 阵列显示为已降级 - 缺少/dev/sdb1
驱动器。但由于/dev/sdb1
只是一个分区(并且/dev/sdb2
和/dev/sdb3
工作正常),显然不是驱动器消失了,似乎是分区本身丢失了。
这怎么可能呢?我们该如何解决这个问题呢?
我的 cat 输出/proc/mdstat
:
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[1]
24006528 blocks super 1.2 [2/2] [UU]
md2 : active raid1 sda3[0] sdb3[1]
1441268544 blocks super 1.2 [2/2] [UU]
md0 : active raid1 sda1[0]
1464710976 blocks super 1.2 [2/1] [U_]
md3 : active raid1 sdd1[1] sdc1[0]
2930133824 blocks super 1.2 [2/2] [UU]
md4 : active raid1 sdf2[1] sde2[0]
2929939264 blocks super 1.2 [2/2] [UU]
unused devices: <none>
仅供参考:我尝试了以下操作:
mdadm /dev/md0 --add /dev/sdb1
但出现此错误:
mdadm: add new device failed for /dev/sdb1 as 2: Invalid argument
答案1
首先查看/var/log/messages
(即 dmesg)以了解 /dev/sdb1 为何被踢出 RAID。很有可能,读取或写入 /dev/sdb1 时出现错误。
如果您运行smartctl -a /dev/sdb
,我怀疑您会发现磁盘的reallocated sectors
或值不为零current pending sectors
。如果它有一个重新分配的扇区,则磁盘开始降级,如果这是生产服务器,则应立即更换。虽然您可以执行 ,然后mdadm /dev/md0 -r /dev/sdb1
删除mdadm /dev/md0 -a /dev/sdb1
并重新添加分区,但最好备份数据并立即替换 /dev/sdb。
要更换磁盘,请执行以下操作:
- 备份数据并关闭机器。
- 记录每个驱动器的序列号(这样您就知道哪一个需要更换)。
- 安装新硬盘,启动机器,并验证设备名称是否未更改。如果设备名称已更改,请拿一张纸并记下哪个新设备名称与每个旧名称和序列号相对应。您可能已经知道这一点,但您可以使用它
cat /proc/mdstat
来查看 RAID 正在使用哪些设备名称,fdisk -l
或smartctl -a <device>
检查序列号。 - 对新磁盘进行适当分区(使用与其他磁盘相同的分区大小)。
- 对于每个 RAID,从新驱动器添加相应的分区
mdadm <md device> -a <new disk partition>
(哦,如果你想问...是的,软件 RAID是太棒了。您可以向 Linux 软件 RAID1 添加任意数量的镜像。) - 使用 定期检查重建状态
cat /proc/mdstat
。 - 重建完成后,
mdadm -f <md device> -f <bad disk's partition>
对使用坏磁盘的每个 RAID1 运行“mdadm -f -f”。这会将坏磁盘的分区标记为故障,然后将其从 RAID 中删除。 - 关闭机器电源并移除坏磁盘。
- 如果您希望以后有多个镜像,请对一个或多个其他磁盘重复步骤 3-6。否则,您必须使用 mdadm 将 RAID 的大小重新调整为 2 个设备(否则每次重新启动时,md 都会警告您阵列已降级)。
注意:如果 SMART 诊断未报告 /dev/sdb 的任何严重错误,则可能只是因为 /dev/sdb1 超出了超时阈值而被踢出 /dev/md0。在这种情况下,/dev/sdb 可能没有问题,但无论如何备份数据并添加一个或多个额外的镜像也无妨。
答案2
首先,备份该分区!
然后,首先从阵列中删除该驱动器,然后重新添加它 - 但是,首先检查 dmesg 以了解其被删除的实际原因......