本指南介绍如何从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
!