当前位置:首页>Linux>Linux 软 RAID 从入门到运维完全指南

Linux 软 RAID 从入门到运维完全指南

  • 2026-09-16 12:27:03
Linux 软 RAID 从入门到运维完全指南

字数 6278,阅读大约需 32 分钟

一、 RAID基础入门

1.1 什么是RAID

RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种将多个物理磁盘组合成单一逻辑存储单元的技术。Linux内核通过md(Multiple Devices)驱动实现软件RAID,不需要额外的硬件RAID卡。

软RAID的优势:

  • • 成本低,无需专用RAID卡
  • • 灵活性高,配置可随时调整
  • • 可在系统运行时动态管理
  • • 兼容性好,跨平台可迁移

1.2 各类RAID级别详解

RAID 0(条带化)

┌─────────┬─────────┐
│  数据A  │  数据C  │  ← 磁盘1
├─────────┼─────────┤
│  数据B  │  数据D  │  ← 磁盘2
└─────────┴─────────┘
     写入时交叉分布

工作原理: 将数据分割成块(chunk),并行写入所有磁盘。就像图书馆把一本书的章节分散放到多个书柜,读取时从多个书柜同时取,速度翻倍。

特点:

  • • 最小磁盘数:2
  • • 冗余度:无(无容错能力)
  • • 可用容量:所有磁盘容量之和
  • • 读写性能:读取和写入都显著提升(接近N倍)
  • • 故障影响:任意一块磁盘损坏,整个阵列数据丢失

适用场景: 对性能要求高、对数据安全性要求低的场景,如视频编辑缓存、临时数据处理、非关键数据的快速读写。

典型应用命令:

mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1

RAID 1(镜像)

┌─────────┐         ┌─────────┐
│  数据A  │ ←─────→ │  数据A  │   ← 磁盘1 与 磁盘2 互为镜像
│  数据B  │ ←─────→ │  数据B  │
└─────────┘         └─────────┘

工作原理: 将相同的数据同时写入两块磁盘,形成"镜像"关系。读取时可从任意一块磁盘取数据,写入时需要同时写两份。

特点:

  • • 最小磁盘数:2
  • • 冗余度:高(可容忍N-1块磁盘故障)
  • • 可用容量:总容量的50%
  • • 读写性能:读取性能提升(可并行读),写入性能略下降(需要写两份)
  • • 故障影响:一块磁盘故障不影响数据完整性

适用场景: 对数据安全性要求高的场景,如系统盘、重要数据库、归档数据。

典型应用命令:

# 创建RAID1,可用容量为较小磁盘的容量
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

# 创建 degraded RAID1(只有一块盘,后续再添加)

mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 missing

RAID 4(专用校验盘)

┌─────────┬─────────┬─────────┬─────────┐
│  数据A  │  数据B  │  数据C  │ 校验P   │
└─────────┴─────────┴─────────┴─────────┘
                  ↑                    ↑
             数据盘1-3              专用校验盘

工作原理: 将数据分散写入前N-1块盘,用第N块盘专门存储奇偶校验信息。任意一块数据盘故障时,可通过校验盘和其他数据盘重建数据。

特点:

  • • 最小磁盘数:3(2块数据盘 + 1块校验盘)
  • • 冗余度:中(可容忍1块磁盘故障)
  • • 可用容量:(N-1) × 最小磁盘容量
  • • 读写性能:读取性能好,写入时需要计算并写入校验盘,形成瓶颈
  • • 故障影响:校验盘故障不影响数据读取,但失去容错能力

历史地位: RAID4现已较少直接使用,其设计缺陷(校验盘成为瓶颈)被RAID5改进。现在RAID4主要作为RAID5演变过程中的过渡技术了解即可。


RAID 5(分布式校验)

磁盘1: [数据A] [数据D] [校验P] [数据G]
磁盘2: [数据B] [校验P] [数据E] [数据H]
磁盘3: [数据C] [数据F] [数据I] [校验P]
        ↑         ↑         ↑
      分布式校验块(每块磁盘都存数据且都存校验)

工作原理: 数据和校验信息交叉分布在所有磁盘上。校验块P = A ⊕ B ⊕ C,如果任意一块盘故障,可用其余盘重建。

特点:

  • • 最小磁盘数:3
  • • 冗余度:中(可容忍1块磁盘故障)
  • • 可用容量:(N-1) × 最小磁盘容量
  • • 读写性能:读取性能好,写入性能中等(需要计算校验)
  • • 故障影响:一块磁盘故障仍可正常工作,但再故障一块则数据全丢

适用场景: 平衡性能、安全性和成本的场景,如中小型企业的文件存储、Web服务器数据盘。

创建示例:

# 创建3盘RAID5,-n3表示3块活动盘
mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

# 查看阵列信息

mdadm --detail /dev/md5

RAID 6(双重分布式校验)

磁盘1: [数据A] [数据E] [校验P] [校验Q] [数据I]
磁盘2: [数据B] [校验P] [数据F] [数据J] [校验Q]
磁盘3: [数据C] [数据G] [校验Q] [校验P] [数据K]
磁盘4: [数据D] [数据H] [数据L] [数据M] [数据N]
           ↑           ↑
        校验P        校验Q(双重校验)

工作原理: RAID6使用两种独立的校验算法(P和Q),相当于双重保险。可同时容忍两块磁盘故障。

特点:

  • • 最小磁盘数:4
  • • 冗余度:高(可容忍2块磁盘故障)
  • • 可用容量:(N-2) × 最小磁盘容量
  • • 读写性能:读取性能好,写入性能比RAID5略差(需要计算两种校验)
  • • 故障影响:可同时容忍2块磁盘故障,安全性更高

适用场景: 对数据安全性要求极高的场景,如大型数据库、企业级存储、备份服务器。

创建示例:

# 创建4盘RAID6
mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

RAID 10(镜像+条带)

RAID10不是独立的RAID级别,而是"RAID1+RAID0"的组合,也称为"RAID 1+0"。

┌─────────┬─────────┐
│  数据A  │  数据A  │  ← 镜像组1
├─────────┼─────────┤
│  数据B  │  数据B  │  ← 镜像组2
├─────────┼─────────┤
│  数据C  │  数据C  │  ← 镜像组3(跨线缆备份)
└─────────┴─────────┘
        ↑           ↑
     磁盘1       磁盘2(跨控制器)

工作原理: 先将磁盘分成多组镜像对(RAID1),再对这些镜像对进行条带化(RAID0)。

特点:

  • • 最小磁盘数:4(必须为偶数)
  • • 冗余度:高(每个镜像组可容忍一块磁盘故障)
  • • 可用容量:总容量的50%
  • • 读写性能:读写性能都很好(兼具条带化的并行读取和镜像的冗余)
  • • 故障影响:同一镜像组内的两块盘不能同时故障

布局选项(--layout):

  • • n(near):同一数据块的多个副本在相近位置的不同磁盘上
  • • o(offset):条带化后整体偏移
  • • f(far):同一数据块的副本在不同磁盘的不同位置(读取性能最佳)
# 创建RAID10,使用默认的near布局
mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 指定far布局以获得最佳读取性能

mdadm --create /dev/md10 --layout=f2 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

适用场景: 数据库等既需要高性能又需要高可靠性的应用。


LINEAR(线性合并)

┌────────────────────┐
│      磁盘1         │  先填满磁盘1
├────────────────────┤
│      磁盘2         │  再填磁盘2
├────────────────────┤
│      磁盘3         │  最后填磁盘3
└────────────────────┘

工作原理: 按顺序将磁盘首尾相连,创建一个容量为所有磁盘之和的虚拟磁盘。没有条带化,没有校验,完全是简单合并。

特点:

  • • 最小磁盘数:2
  • • 冗余度:无
  • • 可用容量:所有磁盘容量之和
  • • 读写性能:无性能提升(顺序访问)
  • • 故障影响:任意一块磁盘故障,整个阵列数据丢失

重要限制: 线性阵列一旦创建,无法再添加新磁盘(这是与RAID0的重要区别)。删除磁盘更是不可能的。

适用场景: 当只有不同容量的磁盘需要合并成一个逻辑卷时使用,或作为临时的简单存储方案。

# 创建LINEAR阵列
mdadm --create /dev/mdlinear --level=linear --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

CONTAINER(容器模式)

┌─────────────────────────────────────────────────────────┐
│                     CONTAINER                           │
│  ┌─────────┬─────────┬─────────┬─────────┬─────────┐  │
│  │  RAID1  │  RAID1  │  RAID5  │  RAID5  │  SPARE  │  │
│  │ (整盘)   │ (整盘)   │ (半盘)   │ (半盘)   │ (半盘)  │  │
│  └─────────┴─────────┴─────────┴─────────┴─────────┘  │
│        ↑            ↑           ↑           ↑         │
│     元数据区域(描述整个容器的配置)                      │
└─────────────────────────────────────────────────────────┘

工作原理: CONTAINER是一种特殊的RAID模式,类似于硬件RAID卡上的"磁盘组"。整个容器有统一的元数据区,其中定义了多个子阵列,每个子阵列可以使用容器中磁盘的不同部分。

特点:

  • • 统一管理:多个人阵列共享一组物理磁盘
  • • 灵活性高:可以在容器内创建不同级别、不同大小的阵列
  • • 元数据集中:所有子阵列的配置信息存储在容器的统一元数据区
  • • 支持DDF和IMSM格式

适用场景: 企业级存储,需要在同一组物理磁盘上创建多种RAID级别的阵列。

# 创建IMSM容器
mdadm --create /dev/md/container --level=container --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd

# 在容器内创建RAID5

mdadm --create /dev/md/container --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc

# 启动容器内的所有阵列

mdadm --incremental /dev/md/container

1.3 RAID级别对比一览

级别
最小盘数
冗余度
可用容量
写入性能
读取性能
容错能力
典型应用
RAID0
2
无
100%
很高
很高
无
临时数据、缓存
RAID1
2
高
50%
中(需写双份)
高(并行读)
N-1盘
系统盘、重要数据
RAID4
3
中
(N-1)/N
中(校验瓶颈)
高
1盘
已较少使用
RAID5
3
中
(N-1)/N
中
高
1盘
文件服务器
RAID6
4
高
(N-2)/N
中低
高
2盘
企业存储、数据库
RAID10
4
高
50%
高
很高
每组1盘
数据库、高性能应用
LINEAR
2
无
100%
低
低
无
简单容量合并

二、 mdadm工具入门

2.1 mdadm简介

mdadm是Linux下管理软件RAID的核心工具,全称"Multiple Devices Administration"。它的主要功能包括:

  • • 创建带超级块(superblock)的RAID阵列
  • • 组装已存在的阵列
  • • 监控阵列状态变化
  • • 动态调整阵列(扩展、收缩、重塑)
  • • 管理和维护阵列成员

基本语法:

mdadm [模式] <RAID设备> [选项] <组件设备>

2.2 mdadm的工作模式

mdadm有多种工作模式,通过不同的选项切换:

模式
选项
说明
Assemble
-A, --assemble
组装已存在的阵列
Build
-B, --build
构建无superblock的legacy阵列
Create
-C, --create
创建带superblock的新阵列
Monitor
-F, --follow, --monitor
监控阵列状态
Grow
-G, --grow
动态调整阵列大小或级别
Incremental
-I, --incremental
增量组装/移除设备
Manage
无选项时默认
管理阵列成员(add/remove/fail)
Misc
其他选项
查询、详情、停止等杂项操作

2.3 常用选项汇总

模式选择:

-A, --assemble      # 组装阵列
-B, --build         # 构建阵列(无superblock)
-C, --create        # 创建阵列
-F, --follow        # 监控模式
-G, --grow          # 动态调整
-I, --incremental   # 增量模式

常用参数:

-n, --raid-devices=   # 活动设备数量
-x, --spare-devices=  # 热备盘数量
-l, --level=          # RAID级别(0,1,4,5,6,10,linear,container)
-c, --chunk=          # chunk大小(默认512KB)
-z, --size=           # 每个磁盘使用的容量
--name=               # 阵列名称
--uuid=               # 指定阵列UUID
-e, --metadata=       # superblock格式(0.90, 1.0, 1.1, 1.2, ddf, imsm)

行为控制:

-v, --verbose        # 详细输出
-q, --quiet          # 静默模式
-f, --force          # 强制执行
--run                # 强制启动阵列

三、 阵列的创建与组装

3.1 创建前的准备工作

步骤1:检查磁盘状态

在创建阵列之前,务必确认磁盘是干净的,没有重要的现有数据:

# 查看磁盘分区情况
fdisk -l /dev/sdb

# 检查是否有superblock(是否已属于某个阵列)

mdadm --examine /dev/sdb1

# 查看当前已存在的阵列

cat
 /proc/mdstat

步骤2:规划磁盘用途

建议使用独立的磁盘或分区来构建RAID,避免与现有系统冲突。常见的做法:

  • • 使用整块磁盘:/dev/sdb
  • • 使用磁盘分区:/dev/sdb1, /dev/sdc1

步骤3:了解磁盘容量差异

如果磁盘容量不同,阵列容量以最小磁盘为准。创建前可以检查:

# 查看各磁盘大小
fdisk -l | grep "Disk /dev/sd"

# 预期输出示例:

# Disk /dev/sdb: 500 GiB, 536870912000 bytes

# Disk /dev/sdc: 480 GiB, 514961920000 bytes

# 容量差异超过1%会收到警告

3.2 创建RAID 0

# 创建RAID0,条带大小默认为512KB
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1

# 指定自定义条带大小

mdadm --create /dev/md0 --level=0 --chunk=64 --raid-devices=2 /dev/sdb1 /dev/sdc1

# 创建后查看状态

mdadm --detail /dev/md0

创建后需要格式化:

# 格式化为ext4
mkfs.ext4 /dev/md0

# 挂载使用

mkdir
 /mnt/raid0
mount /dev/md0 /mnt/raid0

3.3 创建RAID 1

# 创建标准RAID1
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

# 如果只有一块盘,想先创建后添加第二块,可以这样:

mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 missing

# 创建时指定名称

mdadm --create /dev/md1 --level=1 --name=data --raid-devices=2 /dev/sdb1 /dev/sdc1

# 查看详细信息

mdadm --detail /dev/md1

3.4 创建RAID 5

# 创建3盘RAID5
mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

# 创建带一块热备盘的RAID5

mdadm --create /dev/md5 --level=5 --raid-devices=3 --spare-devices=1 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 创建时指定chunk大小和校验布局

mdadm --create /dev/md5 --level=5 --chunk=128 --layout=left-symmetric --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

RAID5的校验布局(--layout):

  • • left-symmetric(默认):校验块依次向左分布
  • • right-symmetric:校验块依次向右分布
  • • left-asymmetric:数据块分布后再放校验块
  • • right-asymmetric:类似上面

3.5 创建RAID 6

# 创建4盘RAID6
mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 创建RAID6,指定双重校验布局

mdadm --create /dev/md6 --level=6 --layout=la -raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

3.6 创建RAID 10

# 创建4盘RAID10,使用near2布局(默认)
mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 指定far布局(最佳读取性能)

mdadm --create /dev/md10 --level=10 --layout=f2 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 创建2盘RAID10(最小配置)

mdadm --create /dev/md10 --level=10 --raid-devices=2 /dev/sdb1 /dev/sdc1

RAID10布局格式:[n|f|o][N]

  • • 字母:副本排列方式(near/offset/far)
  • • 数字:每个数据块的副本数量

3.7 组装阵列

从配置文件组装:

# 自动组装所有已知阵列
mdadm --assemble --scan

# 组装特定阵列

mdadm --assemble /dev/md0

# 组装时使用配置文件

mdadm --assemble --config=/etc/mdadm/mdadm.conf /dev/md0

手动指定组件组装:

# 指定UUID组装
mdadm --assemble /dev/md0 --uuid=12345678:abcdef00:12345678:abcdef00 /dev/sdb1 /dev/sdc1

# 指定名称组装

mdadm --assemble /dev/md0 --name=data /dev/sdb1 /dev/sdc1

强制组装(当阵列不完整时):

# 强制组装,即使有设备丢失
mdadm --assemble /dev/md1 --force /dev/sdb1

# 以降级模式启动RAID5

mdadm --assemble /dev/md5 --run /dev/sdb1 /dev/sdc1 missing

3.8 保存阵列配置

创建阵列后,建议将配置写入配置文件,以便重启后能自动组装:

# 扫描当前阵列信息
mdadm --detail --scan

# 将配置追加到配置文件

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

# 编辑配置文件(可选),设置邮件通知等

vi /etc/mdadm/mdadm.conf

配置文件示例:

DEVICE /dev/sd*[0-9]
ARRAY /dev/md0 metadata=1.2 name=server:raid0 UUID=12345678:abcdef00:12345678:abcdef00
ARRAY /dev/md1 metadata=1.2 name=server:raid1 UUID=87654321:fedcba00:87654321:fedcba00
MAILADDR admin@example.com

四、 阵列的日常维护

4.1 查看阵列状态

查看所有阵列的概要信息:

cat /proc/mdstat

输出示例:

Personalities : [raid1] [raid5] [raid6] [raid10] 
md0 : active raid1 sdb1[1] sdc1[0]
      488386464 blocks super 1.2 [2/2] [UU]
      [=========>...........]  resync = 42.5% (208368128/488386464) finish=45.2min speed=103520K/sec

md1 : active raid5 sdd1[3] sdc1[2] sdb1[0]
      976568192 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

查看详细阵列信息:

# 查看单个阵列详情
mdadm --detail /dev/md0

# 查看所有阵列的概要信息

mdadm --brief --scan

# 查看某个组件设备的信息

mdadm --examine /dev/sdb1

4.2 管理阵列成员

添加热备盘:

# 添加一块热备盘
mdadm /dev/md0 --add /dev/sdd1

# 查看添加后的状态

mdadm --detail /dev/md0

移除故障盘:

# 先标记为故障(如果还没自动标记)
mdadm /dev/md0 --fail /dev/sdc1

# 再移除

mdadm /dev/md0 --remove /dev/sdc1

替换故障盘:

# 将新盘标记为备用并开始重建
mdadm /dev/md0 --replace /dev/sdc1

# 如果有多个候选备用盘,可以指定优先使用哪个

mdadm /dev/md0 --replace /dev/sdc1 --with /dev/sdd1

重新添加已移除的盘:

# 尝试重新加入阵列
mdadm /dev/md0 --re-add /dev/sdc1

# 如果是因为元数据问题,可能需要更新设备大小

mdadm /dev/md0 --re-add /dev/sdc1 --update=devicesize

在RAID1/5/6中添加新盘:

# 将RAID5从3盘扩展到4盘
mdadm --grow /dev/md5 --raid-devices=4 --add /dev/sde1

# 将RAID1从2盘扩展到3盘

mdadm --grow /dev/md1 --raid-devices=3 --add /dev/sdd1

4.3 停止和启动阵列

停止阵列:

# 停止之前先卸载
umount /dev/md0

# 停止阵列

mdadm --stop /dev/md0

# 停止所有可停止的阵列

mdadm --stop --scan

启动阵列:

# 组装并启动
mdadm --assemble /dev/md0

# 或者

mdadm --run /dev/md0

# 扫描并启动所有阵列

mdadm --assemble --scan

4.4 擦除超级块

如果想将磁盘从阵列中完全移除并另作他用:

# 普通擦除(只在确认有有效superblock时)
mdadm --zero-superblock /dev/sdc1

# 强制擦除(即使superblock看起来无效)

mdadm --zero-superblock --force /dev/sdc1

注意: 擦除前务必确认磁盘已从阵列中移除,否则可能导致阵列降级或数据丢失。

4.5 动态调整阵列

调整RAID5的chunk大小:

# 需要backup文件
mdadm --grow /dev/md5 --chunk=256 --backup-file=/root/raid5_backup

# 查看变更后的chunk大小

mdadm --detail /dev/md5 | grep chunk

改变RAID级别:

# 将RAID5转换为RAID6(需要至少4块盘)
mdadm --grow /dev/md5 --level=6 --backup-file=/root/raid5_backup

# 将RAID5转换为RAID0(收缩操作要小心!)

mdadm --grow /dev/md5 --level=0

调整一致性策略:

# 启用写意图位图
mdadm --grow /dev/md5 --bitmap=internal

# 禁用位图

mdadm --grow /dev/md5 --bitmap=none

# 改变一致性策略

mdadm --grow /dev/md5 --consistency-policy=resync

4.6 检查和修复阵列

手动触发一致性检查:

# 设置检查动作
mdadm --action=check /dev/md5

# 或者在/proc/mdstat中查看进度

cat
 /proc/mdstat

手动触发修复:

# 设置修复动作
mdadm --action=repair /dev/md5

检查并自动修复:

# 对所有阵列执行检查
mdadm --wait /dev/md5

# 或者设置每日cron任务自动检查

echo
 "MAILADDR root" >> /etc/mdadm/mdadm.conf

五、 阵列监控

5.1 mdadm监控模式简介

mdadm的监控模式(Monitor mode)可以实时监控阵列状态,并在发生故障时:

  • • 发送邮件通知
  • • 执行指定脚本
  • • 记录到系统日志

监控事件类型:

  • • DeviceDisappeared - 阵列消失
  • • Fail - 设备故障
  • • FailSpare - 热备盘重建失败
  • • SpareActive - 热备盘激活成功
  • • NewArray - 检测到新阵列
  • • DegradedArray - 阵列降级
  • • RebuildStarted - 重建开始
  • • RebuildNN - 重建进度(NN%)
  • • RebuildFinished - 重建完成

5.2 启动监控

基本监控命令:

# 监控所有阵列,每60秒检查一次
mdadm --monitor --scan

# 指定邮件地址

mdadm --monitor --scan --mail=admin@example.com

# 指定报警程序

mdadm --monitor --scan --program=/usr/local/bin/raid-alert

# 后台运行并写入PID文件

mdadm --monitor --scan --daemonise --pid-file=/var/run/mdadm.pid

完整监控示例:

# 后台运行,发送邮件和syslog
mdadm --monitor \
  --scan \
  --mail=admin@example.com \
  --program=/usr/local/bin/raid-alert.sh \
  --syslog \
  --daemonise \
  --pid-file=/var/run/mdadm/mdadm.pid

5.3 单次检查(oneshot模式)

适合用cron定期执行:

# 每小时检查一次
0 * * * * /usr/bin/mdadm --monitor --scan --oneshot

# 每天检查一次

0 3 * * * /usr/bin/mdadm --monitor --scan --oneshot --test

5.4 监控脚本示例

#!/bin/bash
# /usr/local/bin/raid-alert.sh


EVENT=$1
DEVICE=$2
DETAIL=$3

LOGFILE="/var/log/raid-alert.log"

log
() {
    echo
 "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOGFILE
}

case
 $EVENT in
    Fail)
        log
 "CRITICAL: Device $DETAIL failed in $DEVICE"
        # 这里可以添加更多告警逻辑,如发送短信

        ;;
    FailSpare)
        log
 "CRITICAL: Spare $DETAIL failed during rebuild on $DEVICE"
        ;;
    DegradedArray)
        log
 "WARNING: Array $DEVICE is degraded"
        ;;
    RebuildStarted)
        log
 "INFO: Rebuild started on $DEVICE"
        ;;
    RebuildFinished)
        log
 "INFO: Rebuild finished on $DEVICE"
        ;;
    SpareActive)
        log
 "INFO: Spare $DETAIL activated on $DEVICE"
        ;;
    *)
        log
 "INFO: Event $EVENT on $DEVICE (detail: $DETAIL)"
        ;;
esac

5.5 系统日志监控

mdadm的监控事件也会记录到syslog,配置文件示例:

# /etc/rsyslog.d/raid.conf
kern.warn;kern.info;kern.debug;mail.*;syslog.*;local6.* /var/log/raid-messages

重启日志服务:

systemctl restart rsyslog

5.6 设置开机自启动监控

使用systemd:

# 创建服务文件
cat
 > /etc/systemd/system/mdadm-monitor.service << 'EOF'
[Unit]
Description=MDADM RAID Monitor
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/mdadm --monitor --scan --daemonise --pid-file=/var/run/mdadm.pid
PIDFile=/var/run/mdadm.pid
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# 启用服务

systemctl enable mdadm-monitor
systemctl start mdadm-monitor

六、 故障排除

6.1 常见故障与处理

阵列无法启动:

# 查看详细错误信息
mdadm --assemble /dev/md0 --verbose

# 强制组装

mdadm --assemble /dev/md0 --force

# 检查组件设备

mdadm --examine /dev/sdb1 /dev/sdc1

磁盘标记为"removed":

# 查看当前状态
cat
 /proc/mdstat

# 尝试重新添加

mdadm --manage /dev/md0 --re-add /dev/sdc1

# 如果不行,先移除再添加

mdadm --manage /dev/md0 --remove /dev/sdc1
mdadm --manage /dev/md0 --add /dev/sdc1

重建卡住:

# 查看重建状态
cat
 /proc/mdstat

# 如果需要,取消并重新触发

mdadm --manage /dev/md0 --action=idle
mdadm --manage /dev/md0 --action=resync

6.2 从故障中恢复

单盘故障的RAID5恢复:

# 1. 确认故障
cat
 /proc/mdstat

# 2. 标记故障盘并移除

mdadm /dev/md5 --fail /dev/sdc1
mdadm /dev/md5 --remove /dev/sdc1

# 3. 插入新盘

mdadm /dev/md5 --add /dev/sdd1

# 4. 观察重建过程

watch cat /proc/mdstat

整个阵列数据恢复(最后手段):

# 如果有backup文件,可以恢复
mdadm --assemble /dev/md5 --backup-file=/root/backup.dat /dev/sdb1 /dev/sdc1 /dev/sdd1

6.3 常见错误信息

错误信息
含义
解决方案
"no such device"
设备不存在
检查设备名称是否正确
"device busy"
设备正在使用中
先卸载阵列或停止相关进程
"mdadm: cannot open ...: No such file or directory"
配置文件路径错误
检查--config指定的路径
"Reshape paused"
变形操作暂停
使用--continue恢复
"bitmap file is invalid"
位图文件损坏
移除并重新创建位图

6.4 数据备份建议

无论使用何种RAID级别,都应记住:

RAID不是备份!

  • • RAID只能防止磁盘硬件故障
  • • RAID不能防止人为误删除
  • • RAID不能防止文件系统损坏
  • • RAID不能防止自然灾害

建议的备份策略:

# 使用rsync定期备份到另一存储
rsync -av /mnt/raid5/ /backup/raid5/

# 或者使用快照

lvcreate -L 10G -s -n raid5-snap /dev/vg0/raid5

# 云备份(定期上传关键数据)

rclone sync /mnt/raid5/ remote:backup-raid5/

七、 性能调优

7.1 chunk大小选择

chunk大小影响IO合并效率:

  • • 大chunk(256KB-512KB):适合大文件顺序读写,如视频流、大型数据库
  • • 小chunk(4KB-64KB):适合小文件随机读写,如文件服务器、Web应用
# 创建时指定
mdadm --create /dev/md0 --level=5 --chunk=256 --raid-devices=4 /dev/sd[b-e]1

7.2 校验布局选择

对于RAID5/6:

  • • left-symmetric(默认):通用性好
  • • right-symmetric:某些工作负载性能更好
  • • lazy:校验块更新延迟高但写入快

7.3 位图优化

对于经常断电的环境:

# 启用内部位图
mdadm --grow /dev/md5 --bitmap=internal

# 设置位图chunk大小

mdadm --grow /dev/md5 --bitmap-chunk=64M

7.4 读取策略

对于RAID1/10:

# 查看当前策略
cat
 /sys/block/md0/md/rmech_percent

# RAID1可以设置读盘策略,但mdadm不直接支持

# 需要在sysfs中调整

八、 实战案例

案例1:构建家用NAS存储

需求:

  • • 4块4TB硬盘
  • • 需要容错能力(可容忍1-2盘故障)
  • • 主要用于存储电影和照片

方案选择:

  • • RAID6:可容忍2盘故障,可用容量12TB(4-2=2块盘的容量)
  • • 或者RAID5 + 1热备:可用容量9TB

实施:

# 创建RAID6
mdadm --create /dev/md0 --level=6 --name=nas --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# 格式化为XFS(支持大文件)

mkfs.xfs -f /dev/md0

# 添加到fstab

echo
 "/dev/md0 /mnt/nas xfs defaults,noatime 0 2" >> /etc/fstab

# 挂载

mount -a

# 配置监控

mdadm --monitor --scan --mail=your@email.com --daemonise --pid-file=/var/run/mdadm-nas.pid

案例2:数据库服务器高可用存储

需求:

  • • 极致读写性能
  • • 高可靠性
  • • 数据盘(容量需求较小但速度快)

方案选择: RAID10

实施:

# 创建4盘RAID10,far布局
mdadm --create /dev/md1 --level=10 --layout=f2 --name=db --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# 使用XFS并优化参数

mkfs.xfs -f -d su=64k,sw=4 /dev/md1

# 挂载

mount -o noatime,nodiratime,logbufs=8 /dev/md1 /var/lib/mysql

# 添加到fstab

echo
 "/dev/md1 /var/lib/mysql xfs defaults,noatime,nodiratime 0 2" >> /etc/fstab

案例3:临时工作站高速存储

需求:

  • • 视频编辑用
  • • 追求最高速度
  • • 数据不重要,可以接受丢失

方案选择: RAID0

实施:

# 创建RAID0
mdadm --create /dev/md0 --level=0 --name=work --chunk=256 --raid-devices=2 /dev/sdb /dev/sdc

# 格式化为ext4

mkfs.ext4 -E stride=64 -E stripe-width=128 /dev/md0

# 挂载

mount /dev/md0 /mnt/work

常用命令速查表

创建命令

# RAID0
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1

# RAID1

mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

# RAID5

mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

# RAID6

mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# RAID10

mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

查询命令

mdadm --detail /dev/md0           # 详细状态
mdadm --examine /dev/sdb1          # 组件设备信息
mdadm --brief --scan               # 概要扫描
cat
 /proc/mdstat                   # 系统状态

管理命令

mdadm --stop /dev/md0              # 停止阵列
mdadm --assemble /dev/md0          # 组装阵列
mdadm --add /dev/md0 /dev/sdd1    # 添加设备
mdadm --remove /dev/md0 /dev/sdc1 # 移除设备
mdadm --fail /dev/md0 /dev/sdc1   # 标记故障
mdadm --re-add /dev/md0 /dev/sdc1 # 重新加入

监控命令

mdadm --monitor --scan             # 开始监控
mdadm --monitor --scan --mail=x   # 监控并邮件通知
mdadm --monitor --scan --oneshot  # 单次检查

参考资源:

  • • mdadm手册页:man mdadm
  • • Linux RAID维基:https://raid.wiki.kernel.org/
  • • 官方源码:https://www.kernel.org/pub/linux/utils/raid/mdadm/

最新文章

随机文章