Ubuntu下使用mdadm更换软RAID1故障硬盘实战

参考文章:

https://www.howtoforge.com/replacing_hard_disks_in_a_raid1_array

背景

最近公司服务器的硬盘坏了一块,当时装系统时做的软RAID1阵列,一共是两块硬盘(sda、sdb),每块硬盘分了4个区,其中三个区用来做RAID,还有一个swap分区。

具体来说,每个硬盘的四个分区分别如下(以sda为例):

1
2
3
4
5
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1 * 2048 156250111 78124032 fd Linux raid autodetect
/dev/sda2 156250112 1328125951 585937920 fd Linux raid autodetect
/dev/sda3 1328125952 1359376383 15625216 82 Linux swap / Solaris
/dev/sda4 1359376384 1953523711 297073664 fd Linux raid autodetect

RAID设备md0、md1和md3分别对应sda1、sda2和sda4。

现在sdb出了故障,查看结果是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[2](F)
585806656 blocks super 1.2 [2/1] [U_]

md0 : active raid1 sda1[0]
78058368 blocks super 1.2 [2/1] [U_]

md3 : active raid1 sda4[0]
296942400 blocks super 1.2 [2/1] [U_]

unused devices: <none>

可以看到,sdb1和sdb4都找不到了,sdb2处于故障状态。考虑到之前的两个硬盘都用了好几年了,于是决定全都换掉,买了两个新的硬盘(相同容量)。

之前也没有更换的经验,只能Google一下现学现用了。

更换过程

删除旧sdb

首先将故障的硬盘从md设备中移除:

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

注:如果想要移除一个正常的设备(没有标记为F),则需要先设为Fail,如下:

1
sudo mdadm --manage /dev/md? --fail /dev/?

更换硬件

关机,并打开机箱,把坏的硬盘拆下,并装入新买的两个硬盘。

开机,进入系统后发现新的硬盘被识别为sdb和sdc。

加入并同步新sdb

首先需要为sdb创建与sda相同的分区表结构,使用以下命令可快速完成:

1
sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdb

使用 sudo fdisk -l确认分区正确。

然后使用mdadm添加新的设备:

1
2
3
sudo mdadm --manage /dev/md0 --add /dev/sdb1
sudo mdadm --manage /dev/md1 --add /dev/sdb2
sudo mdadm --manage /dev/md3 --add /dev/sdb4

然后观察状态可以看到已经开始同步了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[2] sda2[0]
585806656 blocks super 1.2 [2/1] [U_]
resync=DELAYED

md0 : active raid1 sdb1[2] sda1[0]
78058368 blocks super 1.2 [2/1] [U_]
[=>...................] recovery = 3.9% (2423168/78058368) finish=15.4min speed=127535K/sec

md3 : active raid1 sdb4[2] sda4[0]
296942400 blocks super 1.2 [2/1] [U_]
resync=DELAYED

unused devices: <none>

几个小时后就都同步完成了:

1
2
3
4
5
6
7
8
9
10
11
12
cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[3] sda2[2]
585806656 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sdb1[3] sda1[2]
78058368 blocks super 1.2 [2/2] [UU]

md3 : active raid1 sdb4[3] sda4[2]
296942400 blocks super 1.2 [2/2] [UU]

unused devices: <none>

用sdc替换sda

下一步是将还没有挂掉的sda替换成新的硬盘。
首先初始化sdc分区表:

1
sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdc

接下来的替换过程与之前类似,但是因为sda还处于正常状态,所以在删除之前需要先置为Fail。以下是md0设备的替换过程:

1
2
3
sudo mdadm --manage /dev/md0 --fail /dev/sda1
sudo mdadm --manage /dev/md0 --remove /dev/sda1
sudo mdadm --manage /dev/md0 --add /dev/sdc1

对于md1、md3,用同样的方式操作。若干小时后,两个新硬盘就都正常工作了:

1
2
3
4
5
6
7
8
9
10
11
12
cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdc2[3] sdb2[2]
585806656 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sdc1[3] sdb1[2]
78058368 blocks super 1.2 [2/2] [UU]

md3 : active raid1 sdc4[3] sdb4[2]
296942400 blocks super 1.2 [2/2] [UU]

unused devices: <none>

启用swap

此时我发现新硬盘的swap分区还没有启用(sdb3和sdc3)。由于分区表是通过sfdisk创建的,swap分区还没有初始化,所以需要使用以下命令:

1
2
3
4
sudo mkswap /dev/sdb3
sudo mkswap /dev/sdc3
sudo swapon /dev/sdb3
sudo swapon /dev/sdc3

然后使用 sudo blkid 获得两个swap分区的UUID,然后替换 /etc/fstab 中原硬盘的swap分区。

更新grub

为了能使系统正常从新硬盘启动,还需要在两个新硬盘上设置grub:

1
2
sudo grub-install /dev/sdb
sudo grub-install /dev/sdc

至此,所有设置均已完成。