Linux 服务:RAID 级别解析与 mdadm 工具实操指南
RAID 0:
- 至少需要2块磁盘
- 数据被分割成多个部分,同时写入不同磁盘
- 优势:读写速度提升明显(理论上是单盘的N倍,N为磁盘数量)
- 劣势:无数据冗余,任何一块磁盘损坏都会导致全部数据丢失
- 适用场景:对性能要求高但对数据安全性要求低的场景,如视频编辑、临时文件存储
RAID 1:
- 至少需要2块磁盘
- 同一份数据同时写入所有磁盘,形成镜像
- 优势:数据安全性高,一块磁盘损坏时可从其他磁盘恢复数据,读取性能略有提升
- 劣势:存储利用率低(只有50%),写入性能无提升
- 适用场景:对数据安全性要求极高的场景,如数据库日志、系统盘
RAID 5:
- 至少需要3块磁盘
- 数据分散存储在所有磁盘,同时计算校验信息并分散存储
- 优势:允许单块磁盘损坏,存储利用率高((n-1)/n,n为磁盘数量)
- 劣势:读写性能受校验计算影响,重建时性能下降明显
- 适用场景:对性能和安全性有一定要求的通用场景,如文件服务器、Web服务器
RAID 10(RAID 1+0):
- 至少需要4块磁盘,成对组成RAID 1,再将这些RAID 1组成RAID 0
- 优势:兼具RAID 0的速度和RAID 1的安全性,允许每组镜像中各损坏一块磁盘
- 劣势:存储利用率低(50%),成本较高
- 适用场景:对性能和安全性都有高要求的场景,如数据库服务器
RAID 50(RAID 5+0):
- 至少需要6块磁盘,先组成多个RAID 5,再将这些RAID 5组成RAID 0
- 优势:结合了RAID 5的高存储利用率和RAID 0的高性能,允许每个RAID 5组损坏一块磁盘
- 劣势:配置复杂,重建过程复杂
- 适用场景:需要大容量、中高性能和一定安全性的场景,如大型文件存储系统
mdadm讲解
mdadm
(Multiple Device Administrator)是 Linux 系统中用于管理软件 RAID(Redundant Array of Independent Disks) 的核心工具,通过软件方式实现磁盘阵列的创建、配置、监控和维护,无需依赖硬件 RAID 控制器。
核心功能
mdadm
主要用于管理 Linux 的md
(multiple device)设备,实现以下功能:
- 创建各种级别的 RAID 阵列(如 RAID 0/1/5/6/10 等)
- 组装(激活)已存在的 RAID 阵列(如系统重启后)
- 监控 RAID 状态,处理磁盘故障(标记故障盘、替换磁盘等)
- 调整 RAID 配置(扩容、添加热备盘等)
基本概念
- md设备:RAID 阵列在系统中表现为一个虚拟块设备,通常命名为
/dev/md0
、/dev/md1
等,可像普通磁盘一样格式化和挂载。 - 成员设备:组成 RAID 阵列的物理磁盘或分区(如
/dev/sda1
、/dev/sdb1
)。 - 元数据(Metadata):存储在成员设备上的 RAID 配置信息(如级别、成员列表、状态等),用于系统重启后识别和组装阵列。
二、mdadm
工具核心用法梳理
mdadm
是 Linux 软件 RAID 管理的核心工具,以下是关键操作的总结与补充:
1. 基础准备
- 安装:通过包管理器安装(
yum install mdadm
或apt install mdadm
)。
adm常用选项
以下是 mdadm
常用选项的详细说明,包含作用和使用方法:
选项 | 长选项 | 作用说明 | 使用方法示例 |
---|---|---|---|
-l |
--level |
指定 RAID 级别(如 0、1、5、6、10 等),仅用于创建阵列时 | mdadm --create /dev/md0 -l 5 /dev/sd{b,c,d}1 (创建 RAID 5) |
-n |
--raid-devices |
指定阵列中活动数据盘的数量,创建阵列时必需 | mdadm --create /dev/md0 -l 1 -n 2 /dev/sda1 /dev/sdb1 (2 块盘做 RAID 1) |
-r |
--remove |
从阵列中移除指定设备(需先标记为故障) | mdadm /dev/md0 -r /dev/sdc1 (从 md0 中移除 sdc1) |
-a |
--add |
向阵列添加新设备(可作为数据盘或热备盘) | mdadm /dev/md0 -a /dev/sde1 (向 md0 添加 sde1 作为热备) |
-s |
--scan |
自动扫描系统中的 RAID 设备,用于组装或查询所有阵列 | mdadm --assemble -s (自动组装所有识别到的 RAID) |
-D |
--detail |
显示指定 RAID 阵列的详细信息(状态、成员、容量等) | mdadm -D /dev/md0 (查看 md0 的详细信息) |
-f |
--fail |
标记指定设备为故障状态(设备异常时使用) | mdadm /dev/md0 -f /dev/sdc1 (标记 sdc1 为故障) |
-S |
--stop |
停止指定的 RAID 阵列(卸载阵列,使其处于非活动状态) | mdadm -S /dev/md0 (停止 md0 阵列) |
-C |
--create |
创建新的 RAID 阵列,需配合级别、设备数量等参数 | mdadm -C /dev/md0 -l 0 -n 2 /dev/sda1 /dev/sdb1 (创建 RAID 0) |
2. 核心操作命令
(1)创建 RAID
通用格式:mdadm -Cv /dev/mdX -l [级别] -n [数据盘数量] [磁盘列表] --spare-devices=[热备盘数量] [热备盘列表]
- 示例(带热备盘的 RAID 5):
mdadm -Cv /dev/md5 -l 5 -n 3 /dev/sdb6 /dev/sdb7 /dev/sdb8 --spare-devices=1 /dev/sdb9
(2)查看 RAID 状态
- 查看指定 RAID 详情(含成员状态、重建进度等):
mdadm -D /dev/mdX
- 查看系统所有 RAID:
mdadm -Ds
(扫描并显示所有阵列) lsblk
(list block devices)是 Linux 系统中用于列出所有块设备(如硬盘、分区、RAID 阵列、Loop 设备等)的命令工具,能直观展示设备的布局、大小、挂载点等信息,是磁盘管理的常用命令。
(3)RAID 使用与挂载
- 格式化 RAID 设备(以 xfs 为例):
mkfs.xfs /dev/mdX
- 永久挂载:需将 UUID 写入
/etc/fstab
(通过blkid /dev/mdX
获取 UUID),格式如下:
UUID=xxx /挂载点 xfs defaults 0 0
(4)故障处理
- 标记故障盘:
mdadm /dev/mdX -f /dev/sdX
(热备盘会自动替换并重建) - 移除故障盘:
mdadm /dev/mdX -r /dev/sdX
- 添加新盘(修复后复用或换新盘):
mdadm /dev/mdX -a /dev/sdX
(5)删除 RAID
- 卸载挂载点:
umount /挂载点
- 停止阵列:
mdadm -S /dev/mdX
- 清除磁盘元数据(避免系统误识别):
mdadm --zero-superblock /dev/sdX1 /dev/sdX2 ...
- 删除
/etc/fstab
中对应的挂载条目
3. 嵌套 RAID(RAID 10/50)创建要点
- RAID 10:先创建 2 组 RAID 1(每组 2 块盘),再将这 2 组 RAID 1 组成 RAID 0,兼顾速度与冗余。
- RAID 50:先创建 2 组 RAID 5(每组 3 块盘),再将这 2 组 RAID 5 组成 RAID 0,平衡容量与性能。
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 50G 0 part /
└─sda3 8:3 0 4G 0 part [SWAP]
dmadm实操演示
创建raid 0
利用磁盘分区新建多个磁盘分区,每个大小为1GB。用这2个1GB的分区来模拟1个1GB的硬盘。
fdisk /dev/sdb
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+1G
分区 1 已设置为 Linux 类型,大小设为 1 GiB
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
分区号 (2-4,默认 2):
起始 扇区 (2099200-41943039,默认为 2099200):
将使用默认值 2099200
Last 扇区, +扇区 or +size{K,M,G} (2099200-41943039,默认为 41943039):+1G
分区 2 已设置为 Linux 类型,大小设为 1 GiB
将sdb1和sdb2建立RAID等级为RAID 0的md0(设备名)
mdadm -vC /dev/md0 -l 0 -n 2 /dev/sdb{1..2}
用lsblk查看
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
.......
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part
│ └─md0 9:0 0 2G 0 raid0
├─sdb2 8:18 0 1G 0 part
│ └─md0 9:0 0 2G 0 raid0
sr0 11:0 1 4.3G 0 rom /mnt
用mdadm -D /dev/md0 查看
/dev/md0:
Version : 1.2 #RAID 元数据版本(用于存储阵列配置信息的格式版本)。
Creation Time : Mon Aug 18 18:22:15 2025 #阵列创建时间
Raid Level : raid0 #阵列级别为 RAID 0
Array Size : 2093056 (2044.00 MiB 2143.29 MB) #RAID 阵列总容量
Raid Devices : 2 #阵列中活动数据设备的数量为 2 块。
Total Devices : 2 #参与阵列的总设备数量为 2 块(无热备盘)
Persistence : Superblock is persistent #元数据(超级块)是持久化的(重启后不会丢失,可自动识别)
Update Time : Mon Aug 18 18:22:15 2025 #阵列状态最后更新时间
State : clean #阵列状态正常
Active Devices : 2 #当前活跃的设备数量为 2 块
Working Devices : 2 #可用设备数量为 2 块
Failed Devices : 0 #故障设备数量为 0
Spare Devices : 0 #热备盘数量为 0
Chunk Size : 512K #条带大小为 512KB(RAID 0 中数据被分割的块大小,影响读写性能)。
Consistency Policy : none #无一致性校验策略
Name : hrz3.example.com:0 (local to host hrz3.example.com)
UUID : 189ebf5a:ce04791d:1dab7d05:ec8dbf0c
Events : 0
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 18 1 active sync /dev/sdb2
使用raid
格式化并挂载
mkfs.xfs /dev/md0
mkdir /md0
blkid /dev/md0
/dev/md0: UUID="c442f946-5436-4026-8dd0-906bfe34d7ff" TYPE="xfs"
vim /etc/fstab
-------------------------------------------------------------------
UUID=c442f946-5436-4026-8dd0-906bfe34d7ff /md0 xfs defaults 0 0
-------------------------------------------------------------------
删除raid0
umount /md0 #卸载挂载在/md0目录下的 RAID 阵列
mdadm -S /dev/md0 #停止/dev/md0这个 RAID 阵列。
rm -rf /raid0/ #删除 RAID 阵列的挂载点目录/raid0/
mdadm --zero-superblock /dev/sdb1 #清除/dev/sdb磁盘上的 RAID 元数据
mdadm --zero-superblock /dev/sdb2
vim /etc/fstab #删除md0的挂载信息
创建raid 1
mdadm -Cv /dev/md1 -l 1 -n2 /dev/sdb3 /dev/sdb5
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 50G 0 part /
└─sda3 8:3 0 4G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part
│ └─md0 9:0 0 2G 0 raid0 /md0
├─sdb2 8:18 0 1G 0 part
│ └─md0 9:0 0 2G 0 raid0 /md0
├─sdb3 8:19 0 1G 0 part
│ └─md1 9:1 0 1022M 0 raid1
├─sdb4 8:20 0 1K 0 part
├─sdb5 8:21 0 1G 0 part
│ └─md1 9:1 0 1022M 0 raid1
├─sdb6 8:22 0 1G 0 part
├─sdb7 8:23 0 1G 0 part
├─sdb8 8:24 0 1G 0 part
├─sdb9 8:25 0 1G 0 part
└─sdb10 8:26 0 1G 0 part
sr0 11:0 1 4.3G 0 rom /mnt
mdadm -D /dev/md1
/dev/md1:
Version : 1.2
Creation Time : Mon Aug 18 19:20:34 2025
Raid Level : raid1
Array Size : 1046528 (1022.00 MiB 1071.64 MB)
Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Mon Aug 18 19:20:36 2025
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync #同步:确保 RAID 阵列中所有成员设备的数据(或校验信息)保持一致
Name : hrz3.example.com:1 (local to host hrz3.example.com)
UUID : 50f86a15:8ba6e081:0df65b54:fb3e4774
Events : 17
Number Major Minor RaidDevice State
0 8 19 0 active sync /dev/sdb3
1 8 21 1 active sync /dev/sdb5
创建raid 5
mdadm -Cv /dev/md5 -l 5 -n 3 /dev/sdb{6..8} --spare-devices=1 /dev/sdb9
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 50G 0 part /
└─sda3 8:3 0 4G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part
│ └─md0 9:0 0 2G 0 raid0 /md0
├─sdb2 8:18 0 1G 0 part
│ └─md0 9:0 0 2G 0 raid0 /md0
├─sdb3 8:19 0 1G 0 part
│ └─md1 9:1 0 1022M 0 raid1
├─sdb4 8:20 0 1K 0 part
├─sdb5 8:21 0 1G 0 part
│ └─md1 9:1 0 1022M 0 raid1
├─sdb6 8:22 0 1G 0 part
│ └─md5 9:5 0 2G 0 raid5
├─sdb7 8:23 0 1G 0 part
│ └─md5 9:5 0 2G 0 raid5
├─sdb8 8:24 0 1G 0 part
│ └─md5 9:5 0 2G 0 raid5
├─sdb9 8:25 0 1G 0 part
│ └─md5 9:5 0 2G 0 raid5
└─sdb10 8:26 0 1G 0 part
sr0 11:0 1 4.3G 0 rom /mnt
mdadm -D /dev/md5
/dev/md5:
Version : 1.2
Creation Time : Mon Aug 18 19:33:06 2025
Raid Level : raid5
Array Size : 2093056 (2044.00 MiB 2143.29 MB)
Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Mon Aug 18 19:33:08 2025
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : hrz3.example.com:5 (local to host hrz3.example.com)
UUID : dca0b9ed:acbda803:7819edf7:907c438d
Events : 18
Number Major Minor RaidDevice State
0 8 22 0 active sync /dev/sdb6
1 8 23 1 active sync /dev/sdb7
4 8 24 2 active sync /dev/sdb8
3 8 25 - spare /dev/sdb9
模拟硬盘故障
[root@hrz3 ~]# mdadm -f /dev/md5 /dev/sdb6
mdadm: set /dev/sdb6 faulty in /dev/md5
mdadm -D /dev/md5
/dev/md5:
Version : 1.2
Creation Time : Mon Aug 18 19:33:06 2025
Raid Level : raid5
Array Size : 2093056 (2044.00 MiB 2143.29 MB)
Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Mon Aug 18 19:38:22 2025
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Rebuild Status : 45% complete
Name : hrz3.example.com:5 (local to host hrz3.example.com)
UUID : dca0b9ed:acbda803:7819edf7:907c438d
Events : 27
Number Major Minor RaidDevice State
3 8 25 0 spare rebuilding /dev/sdb9 #
1 8 23 1 active sync /dev/sdb7
4 8 24 2 active sync /dev/sdb8
0 8 22 - faulty /dev/sdb6
发现原来的热备盘/dev/sd9正在参与RAID 5的重建,而原来的/dev/sdb6变成了坏盘。
热移除故障盘
mdadm -r /dev/md5 /dev/sdb6
假设故障硬盘已经修好想加回来
mdadm -a /dev/md5 /dev/sdb6
[root@hrz3 ~]# mdadm -D /dev/md5
Number Major Minor RaidDevice State
3 8 25 0 active sync /dev/sdb9
1 8 23 1 active sync /dev/sdb7
4 8 24 2 active sync /dev/sdb8
5 8 22 - spare /dev/sdb6
sdb6进入热备盘
创建raid 10
首先创建两个raid 1
mdadm -C /dev/md101 -l 1 -n 2 /dev/sdb{10..11}
mdadm -C /dev/md102 -l 1 -n 2 /dev/sdb{12..13}
然后用md101和md102创建一个raid 0
mdadm -C /dev/md10 -l 0 -n 2 /dev/md101 /dev/md102
lsblk
.......
├─sdb10 8:26 0 1G 0 part
│ └─md101 9:101 0 1022M 0 raid1
│ └─md10 9:10 0 2G 0 raid0
├─sdb11 8:27 0 1G 0 part
│ └─md101 9:101 0 1022M 0 raid1
│ └─md10 9:10 0 2G 0 raid0
├─sdb12 8:28 0 1G 0 part
│ └─md102 9:102 0 1022M 0 raid1
│ └─md10 9:10 0 2G 0 raid0
├─sdb13 8:29 0 1G 0 part
│ └─md102 9:102 0 1022M 0 raid1
│ └─md10 9:10 0 2G 0 raid0
用mdadm -D看md10的话只能看到md101和md102
/dev/md10:
Version : 1.2
Creation Time : Mon Aug 18 19:56:08 2025
Raid Level : raid0
Array Size : 2088960 (2040.00 MiB 2139.10 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Mon Aug 18 19:56:08 2025
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Chunk Size : 512K
Consistency Policy : none
Name : hrz3.example.com:10 (local to host hrz3.example.com)
UUID : dd36c2d8:9fe65720:1f102f38:c88d5093
Events : 0
Number Major Minor RaidDevice State
0 9 101 0 active sync /dev/md101
1 9 102 1 active sync /dev/md102
创建raid 50
mdadm -C /dev/md501 -l 5 -n 3 /dev/sdb{14..16}
mdadm -C /dev/md502 -l 5 -n 3 /dev/sdb{17..19}
mdadm -C /dev/md50 -l 0 -n 2 /dev/md501 /dev/md502
lsblk
......
├─sdb14 8:30 0 1G 0 part
│ └─md501 9:501 0 2G 0 raid5
│ └─md50 9:50 0 4G 0 raid0
├─sdb15 8:31 0 1G 0 part
│ └─md501 9:501 0 2G 0 raid5
│ └─md50 9:50 0 4G 0 raid0
├─sdb16 259:0 0 1G 0 part
│ └─md501 9:501 0 2G 0 raid5
│ └─md50 9:50 0 4G 0 raid0
├─sdb17 259:1 0 1G 0 part
│ └─md502 9:502 0 2G 0 raid5
│ └─md50 9:50 0 4G 0 raid0
├─sdb18 259:2 0 1G 0 part
│ └─md502 9:502 0 2G 0 raid5
│ └─md50 9:50 0 4G 0 raid0
├─sdb19 259:3 0 1G 0 part
│ └─md502 9:502 0 2G 0 raid5
│ └─md50 9:50 0 4G 0 raid0