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] [U_]
      
md3 : active raid1 sda4[296942400 blocks super 1] [U_]
      
unused devices: <none>

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

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

更换过程

删除旧sdb

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

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

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

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

更换硬件

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

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

加入并同步新sdb

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

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[1] [U_]
        resync=DELAYED
      
md0 : active raid1 sdb1[2] sda1[1] [U_]
      [=>...................]  recovery =  3.9% (2423168/78058368) finish=15.4min speed=127535K/sec
      
md3 : active raid1 sdb4[2] sda4[1] [U_]
        resync=DELAYED
      
unused devices: <none>

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

3] sda2[2]
      2] [UU]
      
md0 : active raid1 sdb1[3] sda1[2] [UU]
      
md3 : active raid1 sdb4[3] sda4[2] [UU]
      
unused devices: <none>

用sdc替换sda

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

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

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

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,用同样的方式操作。若干小时后,两个新硬盘就都正常工作了:

cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid1 sdc2[3] sdb2[2] [UU]
      
md0 : active raid1 sdc1[3] sdb1[2] [UU]
      
md3 : active raid1 sdc4[3] sdb4[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

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

相关文章

文章浏览阅读2.3k次,点赞4次,收藏22次。最近安装了CARLA预...
文章浏览阅读6.3k次,点赞5次,收藏15次。在清华镜像中下载U...
文章浏览阅读5k次。linux环境, python3.7.问题描述: 安装...
文章浏览阅读4.2k次,点赞4次,收藏17次。要安装这个 standa...
文章浏览阅读894次,点赞51次,收藏31次。在安卓使用vscode主...