软 RAID 工具 mdadm

# 一、RAID 和 RAID 级别

RAID 的全称是 “Redundant Arrays of Inexpensive Disks”,磁盘阵列。

RAID 就是把几个物理磁盘组合在一起成为一个大的虚拟物理磁盘,主要目的和用途主要有:

+ 把若干小容量物理磁盘组成一个大容量虚拟存储设备
+ 提高物理存储效率,或提供冗余以提高数据存储的安全性。



## 1.1 硬件RAID和软件RAID

RAID 分为硬件 RAID 和软件 RAID,硬件 RAID 通过 RAID 卡来实现,而软件 RAID 通过软件来实现。

在企业级应用领域,大部份都是硬件 RAID。而软件 RAID 由于性价比高,大多被中小型企业所采用。

硬件 RAID 的成员是整个硬盘,软件 RAID 的成员是整个硬盘或分区。



## 1.2 RAID的级别

RAID 有 RAID0 (分条)、RAID1 (镜像)、RAID4、RAID5、RAID6、RAID10、LINEAR、MULTIPATH 和 FAULTY 等几种级别。

其中最常用的是 RAID0、RAID1、RAID5、RAID10。



# 二、软 RAID 的创建和管理

在 Linux 中,通常使用 mdadm 来创建和管理软 RAID。

mdadm 是一个专用创建和管理 RAID 的软件,能创建任何级别的软 RAID。

本节将介绍软 RAID 的创建、启动、停止、状态查看以及使用等。RAID 的使用就是在 RAID 设备上创建文件系统,然后提供具体数据存储。



## 2.1 RAID的创建方法

创建 RAID 有两个方法 ,

+ 使用 ```--create``` 或 ```-C``` 参数
- 把 RAID 信息写到每个 RAID 成员的超级块中,在每个 RAID 成员的超级块中,都会记录 RAID 的级别、成员、RAID 的UUID 等。
- 对于重装系统或系统发生灾难来来说,有利于现有 RAID 的恢复,所以是最常用的。

+ 使用 ```--build``` 或 ```-B``` 参数
- 不把 RAID 的信息写入 RAID 成员的超级块中,所以无法通过查看 RAID 成员信息来获得RAID的级别,以及 RAID 的成员等。
- 不利于 RAID 数据丢失后的恢复。


语法:
```bash
mdadm --create --verbose RAID设备 --level=Y --RAID-devices=Z 成员设备
```

```bash
mdadm -Cv RAID设备 -lY -nZ 成员设备
```
> -C:--create 的缩写,创建
> -v:--verbose 的缩写,显示详细信息
> -l:--level 的缩写,创建的 RAID 级别
>-n:--RAID-devices 的缩写,RAID 成员数



## 2.2 RAID 管理工具

RAID 的管理包括创建、启动、状态查看等一系列工具,这里介绍常用的使用方法。


### 2.2.1 RAID的启动方法

RAID 的启动有两种方法,一种是指定 RAID 设备和 RAID 成员的办法来启动 RAID,另一种办法是通过加载 RAID 默认的配置文件来启动。

+ 不通过读取 `mdadm.conf` 来启动 RAID,适用于没有配置 `/etc/mdadm/mdadm.conf` 文件的情况

语法:

```bash
mdadm -A RAID设备 成员设备
```
> -A:--assemble的缩写,激活一个已经存在的RAID
>
> RAID设备即 `/dev/md0`,`/dev/md/1` 等,RAID 成员就是你要启动的 RAID 的成员设备,中间以空格分开。

+ 利用配置好的 `mdadm.conf` 来启动RAID,前提是要配置 `/etc/mdadm/mdadm.conf` 文件

```bash
mdadm -A RAID设备
```



```bash
mdadm -As
```



### 2.2.2 RAID 管理工具常用操作

```bash
mdadm 参数 [RAID设备] [RAID成员]
```

> --assemble(-A) 激活一个RAID
> --stop(-S) 停止正在运行的设备
> --scan(-s) 扫描RAID设备
> --detail(-D) 查看RAID的详细信息
> --examine(-E) 查看RAID成员的详细信息



### 2.3 RAID 的配置文件

RAID 配置文件不是必需的,但有配置文件会方便管理,比如 RAID 最精简的方法执行、状态查看,如果没有配置文件,还要指定 RAID 成员。

RAID 的配置文件是 `/etc/mdadm/mdadm.conf`,如果没有这个文件,可以自己创建一个。

配置此文件时,可以参照示例文件 `/usr/share/doc/madam/examples/mdadm.conf-example`,将所有 RAID 的配置信息都写进去。

1. 编辑之前,先备份原文件

```bash
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.bak
```

2. 搜索RAID,前提条件是RAID已激活

```bash
mdadm -Ds
```

3. 查询RAID的详细信息,主要是查看RAID的成员有哪些

```bash
mdadm -D RAID设备
```

4. 编辑配置文件mdadm.conf

格式:

```bash
ARRAY RAID设备 level=RAID级别 num-devices=成员数量 UUID=RAID设备UUID号 devices=成员设备1,成员设备2,...
```



# 三、案例

本章将介绍创建一个 RAID5 阵列,然后模拟磁盘故障,并添加替换磁盘的完整过程,供参考。

> **注:以下操作都是以 root 身份进行的。**



## 3.1 RAID 的创建

1. 配置 RAID5 至少需要三块硬盘(或三个分区),此处为 `/dev/sdb`、`/dev/sdc`、`/dev/sdd`

```bash
root@kylin:~# fdisk -l | grep "Disk /dev/sd"
Disk /dev/sda: 21.5 GB, 21474836480 bytes
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
Disk /dev/sdc: 10.7 GB, 10737418240 bytes
Disk /dev/sdd: 10.7 GB, 10737418240 bytes
```

2. 创建 RAID5

```bash
root@kylin:~# mdadm -Cv /dev/md0 -l5 -n3 /dev/sd[b-d]
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 10477056K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
```
3. 执行完创建命令后,可以查看 RAID 状态信息,包括成员同步的进度

```bash
root@kylin:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd[3] sdc[1] sdb[0]
20954112 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
[=======>.............] recovery = 35.0% (3670708/10477056) finish=1.5min
speed=72541K/sec

unused devices:
```
4. 也可以直接查看 `/dev/md0` 的详细信息:

```bash
root@kylin:~# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Dec 10 14:30:32 2020
Raid Level : raid5
Array Size : 20954112 (19.98 GiB 21.46 GB)
Used Dev Size : 10477056 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Thu Dec 10 14:31:19 2020
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Rebuild Status : 35% complete

Name : kylin:0 (local to host kylin)
UUID : f220b9f5:b05f9e6c:1a9a6855:1d4b6a68
Events : 6

Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
3 8 48 2 spare rebuilding /dev/sdd
```
```mdadm -D``` 可以查看超级块元数据版本、创建时间、RAID 级别、容量(包括阵列大小和校验大小)、设备数量、超级块、更新时间、成员设备状态以及块大小等信息。上面的信息提示 RAID 正处于重建中,进度为 35%,`/dev/sdb` 和 `/dev/sdc` 已经同步完成,`/dev/sdd` 正在重建。

5. 一段时间后,成员数据同步完成:

```bash
root@kylin:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd[3] sdc[1] sdb[0]
20954112 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices:
root@kylin:~# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Dec 10 14:30:32 2020
Raid Level : raid5
Array Size : 20954112 (19.98 GiB 21.46 GB)
Used Dev Size : 10477056 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Thu Dec 10 14:33:02 2020
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : kylin:0 (local to host kylin)
UUID : f220b9f5:b05f9e6c:1a9a6855:1d4b6a68
Events : 18

Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
3 8 48 2 active sync /dev/sdd
```

6. 更新配置文件和 initramfs

一般来说,创建好 RAID 后,最好将RAID的信息写进 `/etc/mdadm/mdadm.conf` 配置文件,并更新 initramfs,以便下次系统启动的时候RAID能自动正确地激活。

> 对于 3.0 以上内核的系统,如果不做这一步,很可能开机时RAID名称会变成 `/dev/md127`,`/dev/md126`等等

```bash
root@kylin:~# mdadm -Ds
ARRAY /dev/md/0 metadata=1.2 name=kylin:0 UUID=f220b9f5:b05f9e6c:1a9a6855:1d4b6a68
root@kylin:~# mdadm -Ds > /etc/mdadm/mdadm.conf
root@kylin:~# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-3.13.0-44-generic
```

7. 接下来就可以对RAID进行分区或者直接格式化了。分区或格式化的方法与普通磁盘相同。



## 3.2 RAID 的扩容

RAID 的扩容针对已经做好的 RAID,在存储过程中发现 RAID 容量不足的情况。

如果是一个新做的 RAID,发现计划错了,只需要重新做一次就行了,没必要用扩容的办法。

应用范围是 RAID1、RAID4、RAID5、RAID6。

RAID 扩容流程:向已存在的 RAID 中添加成员—>执行扩容指令

1. 准备用于扩容的硬盘,容量最好与已有成员一致,此处为 `/dev/sde`

```bash
root@kylin:~# fdisk -l | grep "Disk /dev/sd"
Disk /dev/sda: 21.5 GB, 21474836480 bytes
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
Disk /dev/sdc: 10.7 GB, 10737418240 bytes
Disk /dev/sdd: 10.7 GB, 10737418240 bytes
Disk /dev/sde: 10.7 GB, 10737418240 bytes
```

2. 将 `/dev/sde` 添加为 RAID 成员:

```bash
root@kylin:~# mdadm /dev/md0 -a /dev/sde
mdadm: added /dev/sde
```

3. 查看 RAID 状态

```bash
root@kylin:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sde[4](S) sdc[1] sdb[0] sdd[3]
20954112 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices:
root@kylin:~# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Dec 10 14:30:32 2020
Raid Level : raid5
Array Size : 20954112 (19.98 GiB 21.46 GB)
Used Dev Size : 10477056 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Thu Dec 10 15:27:20 2020
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Name : kylin:0 (local to host kylin)
UUID : f220b9f5:b05f9e6c:1a9a6855:1d4b6a68
Events : 19

Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
3 8 48 2 active sync /dev/sdd

4 8 64 - spare /dev/sde
```

由上可知,`/dev/sde` 被加入到了 RAID 中,并且身份是备用成员

4. 使用备用成员扩充 RAID 容量。这里将用到 RAID 的扩充(Grow)模式。

扩充模式非常简单,有 ```--size``` 参数,```-n``` 参数,```--size``` 是指定 RAID 大小,具体由 RAID 级别而定,可以省略。```-n``` 为 RAID 真实成员的个数。

```bash
root@kylin:~# mdadm -G /dev/md0 -n4
mdadm: Need to backup 3072K of critical section..
```

5. 查看 RAID 状态,显示 RAID 正在重建,数据容量仍为 20GiB

```bash
root@kylin:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sde[4] sdc[1] sdb[0] sdd[3]
20954112 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
[====>................] reshape = 20.0% (2100736/10477056) finish=14.2min speed=9807K/sec

unused devices:
root@kylin:~# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Dec 10 14:30:32 2020
Raid Level : raid5
Array Size : 20954112 (19.98 GiB 21.46 GB)
Used Dev Size : 10477056 (9.99 GiB 10.73 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Thu Dec 10 15:50:36 2020
State : clean, reshaping
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Reshape Status : 20% complete
Delta Devices : 1, (3->4)

Name : kylin:0 (local to host kylin)
UUID : f220b9f5:b05f9e6c:1a9a6855:1d4b6a68
Events : 58

Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
3 8 48 2 active sync /dev/sdd
4 8 64 3 active sync /dev/sde
```

6. 等待一段时间后,重塑完成,再次查看 RAID 状态,数据容量变为 30GiB 了

```bash
root@kylin:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sde[4] sdc[1] sdb[0] sdd[3]
31431168 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

unused devices:
root@kylin:~# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Dec 10 14:30:32 2020
Raid Level : raid5
Array Size : 31431168 (29.98 GiB 32.19 GB)
Used Dev Size : 10477056 (9.99 GiB 10.73 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Thu Dec 10 16:51:35 2020
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : kylin:0 (local to host kylin)
UUID : f220b9f5:b05f9e6c:1a9a6855:1d4b6a68
Events : 124

Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
3 8 48 2 active sync /dev/sdd
4 8 64 3 active sync /dev/sde
```

7. 查看 `/var/log/syslog`,可以看到 RAID 设备 `/dev/md0` 重建完成,数据容量由 20GiB 增加到了 30GiB

```bash
root@kylin:~# tail /var/log/syslog
Dec 10 16:51:35 kylin kernel: [ 9007.211151] md: md0: reshape done.
Dec 10 16:51:35 kylin kernel: [ 9007.243193] RAID conf printout:
Dec 10 16:51:35 kylin kernel: [ 9007.243196] --- level:5 rd:4 wd:4
Dec 10 16:51:35 kylin kernel: [ 9007.243198] disk 0, o:1, dev:sdb
Dec 10 16:51:35 kylin kernel: [ 9007.243199] disk 1, o:1, dev:sdc
Dec 10 16:51:35 kylin kernel: [ 9007.243200] disk 2, o:1, dev:sdd
Dec 10 16:51:35 kylin kernel: [ 9007.243200] disk 3, o:1, dev:sde
Dec 10 16:51:35 kylin kernel: [ 9007.243311] md0: detected capacity change from 21457010688 to 32185516032
Dec 10 16:51:35 kylin mdadm[1512]: RebuildFinished event detected on md device /dev/md/0
```



## 3.3 RAID 的删除

1. 首先将所有 RAID 成员设置成错误,并将其移除出 RAID

```bash
root@kylin:~# mdadm /dev/md0 -f /dev/sdb -r /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
mdadm: hot removed /dev/sdb from /dev/md0
root@kylin:~# mdadm /dev/md0 -f /dev/sdc -r /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md0
mdadm: hot removed /dev/sdc from /dev/md0
root@kylin:~# mdadm /dev/md0 -f /dev/sdd -r /dev/sdd
mdadm: set /dev/sdd faulty in /dev/md0
mdadm: hot removed /dev/sdd from /dev/md0
root@kylin:~# mdadm /dev/md0 -f /dev/sde -r /dev/sde
mdadm: set /dev/sde faulty in /dev/md0
mdadm: hot removed /dev/sde from /dev/md0
```

2. 然后停止 RAID

```bash
root@kylin:~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
root@kylin:~# mdadm -r /dev/md0
```

3. 再清除成员设备超级块中的信息

```bash
root@kylin:~# mdadm --misc --zero-superblock /dev/sdb
root@kylin:~# mdadm --misc --zero-superblock /dev/sdc
root@kylin:~# mdadm --misc --zero-superblock /dev/sdd
root@kylin:~# mdadm --misc --zero-superblock /dev/sde
```

4. 最后清空配置文件

```bash
root@kylin:~# echo > /etc/mdadm/mdadm.conf
```

 

作者:刘煦阳

你可能感兴趣的:(系统运维,raid)