# 一、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
```
作者:刘煦阳