如何更换Linux软件RAID中出现故障的硬盘

本指南介绍如何从Linux RAID1阵列(软件RAID)中删除故障硬盘驱动器,以及如何在RAID1阵列中添加新硬盘,而无需...

本指南介绍如何从Linux RAID1阵列(软件RAID)中删除故障硬盘,以及如何在不丢失数据的情况下将新硬盘添加到RAID1阵列。 我将使用gdisk来复制分区方案,因此它也可以使用带有GPT(GUID分区表)的大型硬盘。

1初步说明

在这个例子中,我有两个硬盘驱动器/ dev / sda/ dev / sdb ,分区为/ dev / sda1/ dev / sda2以及/ dev / sdb1/ dev / sdb2

/ dev / sda1/ dev / sdb1组成RAID1阵列/ dev / md0

/ dev / sda2/ dev / sdb2组成RAID1阵列/ dev / md1

/dev/sda1 + /dev/sdb1 = /dev/md0

/dev/sda2 + /dev/sdb2 = /dev/md1

/ dev / sdb失败,我们要替换它。

2如果硬盘出现故障,该怎么办?

如果磁盘发生故障,您可能会在日志文件中找到许多错误消息,例如/ var / log / messages/ var / log / syslog

你也可以跑

cat /proc/mdstat

而不是字符串[UU],您将看到[U_],如果您有一个降级的RAID1数组。

3删除失败的磁盘

要删除/ dev / sdb ,我们将/ dev / sdb1/ dev / sdb2标记为失败,并将它们从各自的RAID阵列( / dev / md0/ dev / md1 )中删除。

首先我们将/ dev / sdb1标记为失败:

mdadm --manage /dev/md0 --fail /dev/sdb1

的输出

cat /proc/mdstat

应该是这样的:

server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0] sdb1[2](F)
      24418688 blocks [2/1] [U_]

md1 : active raid1 sda2[0] sdb2[1]
      24418688 blocks [2/2] [UU]

unused devices: <none>

然后我们从/ dev / md0中删除/ dev / sdb1

mdadm --manage /dev/md0 --remove /dev/sdb1

输出应该是这样的:

server1:~# mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm: hot removed /dev/sdb1

cat /proc/mdstat

应该显示:

server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0]
      24418688 blocks [2/1] [U_]

md1 : active raid1 sda2[0] sdb2[1]
      24418688 blocks [2/2] [UU]

unused devices: <none>

现在我们对/ dev / sdb2 (它是/ dev / md1的一部分)再次执行相同的步骤:

mdadm --manage /dev/md1 --fail /dev/sdb2

cat /proc/mdstat

server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0]
      24418688 blocks [2/1] [U_]

md1 : active raid1 sda2[0] sdb2[2](F)
      24418688 blocks [2/1] [U_]

unused devices: <none>

mdadm --manage /dev/md1 --remove /dev/sdb2

server1:~# mdadm --manage /dev/md1 --remove /dev/sdb2
mdadm: hot removed /dev/sdb2

cat /proc/mdstat

server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0]
      24418688 blocks [2/1] [U_]

md1 : active raid1 sda2[0]
      24418688 blocks [2/1] [U_]

unused devices: <none>

然后关闭系统电源:

shutdown -h now

并用旧的/ dev / sdb硬盘替换旧的( 它必须至少与旧的一样大小 - 如果它比旧的只有几个MB,那么重建数组将会失败 )。

4添加新的硬盘

更改硬盘/ dev / sdb后 ,引导系统。

我们现在必须做的第一件事是创建与/ dev / sda完全相同的分区。 我们可以使用gdisk软件包中的sgdisk命令。 如果没有安装gdisk,请运行此命令将其安装在Debian和Ubuntu上:

apt-get install gdisk

对于基于RedHat的Linux发行版,如CentOS,使用:

yum install gdisk

并且对于OpenSuSE使用:

yast install gdisk

下一步是可选的,但建议。 要确保您具有分区方案的备份,可以使用sgdisk将两个磁盘的分区方案写入文件。 我会将备份存储在/ root文件夹中。

sgdisk --backup=/root/sda.partitiontable /dev/sda
sgdisk --backup=/root/sdb.partitiontable /dev/sdb

如果发生故障,可以使用sgdisk命令的--load-backup选项还原分区表。

现在将分区方案从/ dev / sda复制到/ dev / sdb run:

sgdisk -R /dev/sdb /dev/sda

之后,您必须将新的硬盘上的GUID随机化,以确保它们是唯一的

sgdisk -G /dev/sdb

你可以跑

sgdisk -p /dev/sda
sgdisk -p /dev/sdb

以检查两个硬盘驱动器现在是否具有相同的分区。

接下来我们将/ dev / sdb1添加到/ dev / md0/ dev / sdb2/ dev / md1

mdadm --manage /dev/md0 --add /dev/sdb1

server1:~# mdadm --manage /dev/md0 --add /dev/sdb1
mdadm: re-added /dev/sdb1

mdadm --manage /dev/md1 --add /dev/sdb2

server1:~# mdadm --manage /dev/md1 --add /dev/sdb2
mdadm: re-added /dev/sdb2

现在两个arays( / dev / md0/ dev / md1 )将被同步。 跑

cat /proc/mdstat

看看它什么时候完成。

在同步期间,输出将如下所示:

server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0] sdb1[1]
      24418688 blocks [2/1] [U_]
      [=>...................]  recovery =  9.9% (2423168/24418688) finish=2.8min speed=127535K/sec

md1 : active raid1 sda2[0] sdb2[1]
      24418688 blocks [2/1] [U_]
      [=>...................]  recovery =  6.4% (1572096/24418688) finish=1.9min speed=196512K/sec

unused devices: <none>

同步完成后,输出将如下所示:

server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10]
md0 : active raid1 sda1[0] sdb1[1]
      24418688 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      24418688 blocks [2/2] [UU]

unused devices: <none>

就这样,你已经成功地替换了/ dev / sdb