Linux-RAID
Linux-RAID
- RAID基础知识
- 一、一句话速记
- 二、主流 RAID 级别对照表
- 三、三大底层技术
- 四、热备盘(Hot Spare)
- 五、写惩罚(Write Penalty)
- 六、常见误区提醒
- 七、选级口诀
- 软RAID、硬RAID构建
- 一、软 RAID(mdadm 命令行,逐条注释)
- mdadm工具
- 实际案例
- 其他级别RAID构建命令
- 二、硬 RAID(BIOS/RAID 卡配置流程)
- 软硬RAID对比
- 面试常见问题
RAID基础知识
RAID(Redundant Array of Independent Disks)
即“独立冗余磁盘阵列”,是把多块物理硬盘按不同策略组合成一个或多个逻辑卷,从而同时获得更高性能、更大容量或更高可靠性的存储技术。
一、一句话速记
“条带提速、镜像保命、校验折中;级数越高越安全,但容量和写入惩罚也越大。”
二、主流 RAID 级别对照表
级别 | 最少盘 | 容错 | 可用容量 | 典型场景 | 一句话记忆 |
---|---|---|---|---|---|
RAID 0 | 2 | 0 盘 | 100 % | 缓存/临时盘 | “极速无备份,一挂全丢。” |
RAID 1 | 2 | 1 盘 | 50 % | 系统盘/财务库 | “镜像双写,换盘秒恢复。” |
RAID 5 | 3 | 1 盘 | N-1 | 通用在线业务 | “奇偶校验,读写平衡。” |
RAID 6 | 4 | 2 盘 | N-2 | 归档/大容量 | “双校验,坏两块不慌。” |
RAID 10 | 4 | 每组各 1 盘 | 50 % | 数据库/虚拟化 | “先镜像再条带,贵但稳快。” |
JBOD | 1 | 0 盘 | 100 % | 简单扩容 | “只是捆绑,无冗余。” |
N = 总盘数,容量按最小盘计算。
三、三大底层技术
-
条带化 (Striping)
数据切块后并行写到多盘,提高吞吐,无冗余 → RAID 0 的核心。 -
镜像 (Mirroring)
同一份数据写两份或多份,实时热备 → RAID 1 / RAID 10 的基石。 -
分布式奇偶校验 (Parity)
用 XOR 等算法生成校验块并分散存放,实现“少一盘也能算回原数据” → RAID 5、6 的核心。
四、热备盘(Hot Spare)
阵列里预留一块空盘,当检测到成员盘故障时,自动顶替并开始重建,缩短“降级状态”时间。
五、写惩罚(Write Penalty)
- RAID 5:一次写 → 读旧数据 + 读校验 + 写新数据 + 写新校验 = 4 次 I/O
- RAID 6:因双校验,惩罚更高 → 6 次 I/O
这也是 RAID 6/5 在小随机写密集型场景下不如 RAID 10 的原因。
六、常见误区提醒
- RAID ≠ 备份:阵列坏两组盘、误删文件、勒索病毒时,仍需离线备份。
- RAID 0+1 与 RAID 10 不同:前者先条带再镜像,容错更差,重建时间长,已逐渐淘汰。
- 软/硬 RAID 区别:软 RAID 靠 CPU 与内核(mdadm),硬 RAID 靠阵列卡/主板固件;后者带电池/缓存,跨卡不兼容。
七、选级口诀
- 只跑日志/缓存:RAID 0
- 系统/小数据:RAID 1
- 通用在线:RAID 5
- 大盘归档:RAID 6
- 高并发数据库:RAID 10
软RAID、硬RAID构建
一、软 RAID(mdadm 命令行,逐条注释)
mdadm工具
一、语法总览
mdadm [mode] [options] <raid-device> <component-devices...>
常用 5 种工作模式
- Create 创建阵列
- Assemble 重新装配阵列
- Manage 日常增删改(热插拔、故障标记等)
- Monitor 持续监控与事件通知
- Grow 在线扩容 / 级别迁移
二、参数大全表
类别 | 参数 | 作用 | 典型示例 |
---|---|---|---|
通用 | --create -C | 创建新阵列 | mdadm -C /dev/md0 … |
--assemble -A | 重新装配已有阵列 | mdadm -A /dev/md0 /dev/sd* | |
--manage | 进入管理模式(可省) | mdadm --manage /dev/md0 --add … | |
--monitor -F | 后台监控 | mdadm -F --scan --mail=root@localhost | |
--grow | 在线扩容/改级别 | mdadm --grow /dev/md0 --raid-devices=4 | |
级别/数量 | --level -l | RAID 级别 0/1/4/5/6/10 | -l 5 |
--raid-devices -n | 活动盘个数 | -n 3 | |
--spare-devices -x | 热备盘个数 | -x 1 | |
磁盘操作 | --add -a | 把磁盘加入阵列 | mdadm /dev/md0 -a /dev/sde |
--remove -r | 从阵列移除磁盘 | mdadm /dev/md0 -r /dev/sdc | |
--fail -f | 手动标记磁盘为故障 | mdadm /dev/md0 -f /dev/sdc | |
信息查看 | --detail -D | 查看阵列详细状态 | mdadm -D /dev/md0 |
--examine -E | 查看成员盘 superblock | mdadm -E /dev/sdb1 | |
--brief -b | 与 -D/-E 配合输出精简格式 | -D -b | |
--scan -s | 扫描配置文件或 /proc/mdstat | mdadm -Ds | |
配置/持久化 | --config -c | 指定配置文件 | -c /etc/mdadm/mdadm.conf |
--auto | 自动创建设备节点 | --auto=yes | |
调优 | --chunk -c | 条带大小(KB) | -c 512 |
--size -z | 限制成员盘使用空间 | -z 100G | |
--bitmap | 启用/禁用 write-intent bitmap | --bitmap=internal | |
--assume-clean | 跳过初始化同步(危险,谨慎) | --assume-clean | |
监控专用 | --delay -d | 监控轮询间隔(秒) | --delay=300 |
--mail | 事件通知邮箱 | --mail=admin@xxx.com | |
--program | 事件触发脚本 | --program=/usr/local/bin/raid_event.sh | |
--syslog | 把事件写入 syslog | --syslog | |
--pid-file -i | 后台模式时写 PID 文件 | --pid-file=/var/run/mdadm.pid | |
其他 | --stop -S | 停止阵列 | mdadm -S /dev/md0 |
--zero-superblock | 清除 RAID 元数据 | mdadm --zero-superblock /dev/sdb1 | |
--verbose -v | 详细输出 | -vv 可叠加 | |
--quiet -q | 静默模式 | -q | |
--force --force-fail | 强制操作(慎用) | --force |
三、最常用的 5 条“组合拳”
- 创建 RAID5(3 数据盘 + 1 热备)
mdadm -C /dev/md5 -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}
- 查看阵列健康
watch -n1 cat /proc/mdstat
mdadm -D /dev/md5 # 或 --detail
- 在线替换坏盘
mdadm /dev/md5 -f /dev/sdc # 标记故障
mdadm /dev/md5 -r /dev/sdc # 移除
mdadm /dev/md5 -a /dev/sde # 插入新盘
- 保存配置(重启自动装配)
mdadm -Ds >> /etc/mdadm/mdadm.conf
update-initramfs -u # Debian/Ubuntu
dracut -f # CentOS/RHEL
- 停止并彻底删除阵列
mdadm -S /dev/md5
mdadm --zero-superblock /dev/sd{b,c,d,e}
实际案例
下面以 RAID5(3 块数据盘 + 1 块热备盘) 为例,
磁盘假设为:/dev/sdc /dev/sdd /dev/sde(数据盘),/dev/sdf(热备)。
-
安装工具
sudo apt install -y mdadm # Debian/Ubuntu 安装 mdadm yum install -y mdadm # CentOS/RHEL
-
准备磁盘(分区或直接整盘均可)
sudo fdisk /dev/sdc # 进入交互分区工具 # 依次:n → p → 1 → 回车 → 回车 → t → fd → w # 每块盘都同样操作,把分区类型设为 0xfd(Linux raid) sudo partprobe # 通知内核重读分区表
交互动作 | 含义 | 说明 |
---|---|---|
n | n = new | 创建一个新的分区。 |
p | p = primary | 选择“主分区”(最多只能建 4 个主分区)。 若需要更多分区,可先选 e 建扩展分区,再在其中建逻辑分区。 |
1 | 分区编号 | 把新分区命名为 /dev/sdb1 。如果磁盘上已有分区,系统会自动给出下一个可用编号。 |
回车 | 起始扇区 | 直接回车表示“从磁盘可用空间的最开头”开始分区,通常即 2048 扇区,对齐性能最佳。 |
回车 | 结束扇区 | 再次回车表示“把剩余所有空间都分给该分区”。 也可输入 +100G 、+50% 等指定大小。 |
t | t = type | 修改分区类型(即“文件系统标识符”)。 |
fd | 分区类型代码 | fd 对应 Linux RAID autodetect,告诉内核“这块分区将来要被 mdadm 用来做软 RAID”。常见代码: 83 Linux、82 Linux swap、8e Linux LVM。 |
w | w = write | 把刚才所有操作真正写入磁盘分区表并退出 fdisk 。执行后分区表立即生效,磁盘被锁定更新;如果磁盘正在使用,系统会提示重启或执行 partprobe /partx -a /dev/sdb 使内核重读。 |
- 创建阵列
sudo mdadm --create /dev/md5 \--level=5 \ # RAID 级别 5--raid-devices=3 \ # 3 块数据盘--spare-devices=1 \ # 1 块热备盘--chunk=256 \ # 条带大小 256 KB/dev/sd{c,d,e}1 \ # 3 块数据分区/dev/sdf1 # 热备分区
- 查看同步进度
watch -n1 cat /proc/mdstat # 实时查看 [UUU_] 同步百分比 sudo mdadm --detail /dev/md5 # 详细信息
逐行翻译:
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
内核当前已加载的 RAID 类型模块(软 RAID 支持的所有算法)。
md5 : active raid5 sde1[4] sdf1[3](S) sdd1[1] sdc1[0]
- md5 → 阵列名
/dev/md5
- active raid5 → 当前运行 RAID 5
- 成员盘
sde1[4]
→ 第 4 号槽位,正常盘sdf1[3](S)
→ 第 3 号槽位,带 (S) 代表热备盘sdd1[1]
、sdc1[0]
→ 正常盘,槽位 1、0
2093056 blocks super 1.2 level 5, 256k chunk, algorithm 2 [3/3] [UUU]
- 2093056 blocks → 阵列总容量 ≈ 2 GB(block 大小默认 1 KB)
- level 5 → RAID 级别 5
- 256k chunk → 条带大小 256 KB
- algorithm 2 → 使用的校验算法(2 表示 left-symmetric)
- [3/3] → 阵列需要 3 盘,当前 3 盘全部在线
- [UUU] → U = Up/正常,无盘掉线;若出现
_
或F
表示降级/故障
unused devices: <none>
没有未使用的硬盘,所有磁盘都已加入阵列或热备。
- 保存配置(确保重启自动装配)
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf sudo update-initramfs -u # Debian/Ubuntu dracut -f # CentOS/RHEL
- 格式化 & 挂载
sudo mkfs.ext4 /dev/md5 # 也可 mkfs.xfs sudo mkdir /mnt/raid5 sudo mount /dev/md5 /mnt/raid5 echo '/dev/md5 /mnt/raid5 ext4 defaults,nofail 0 0' | \sudo tee -a /etc/fstab
- 日常维护常用命令
sudo mdadm /dev/md5 -f /dev/sdd1 # 手动标记磁盘为故障 模拟磁盘损坏 sudo mdadm /dev/md5 -r /dev/sdd1 # 移除坏盘 sudo mdadm /dev/md5 -a /dev/sdg1 # 插入新盘并自动重建 sudo mdadm --grow /dev/md5 -n4 # 在线把 3 盘 RAID5 扩容到 4 盘
sudo mdadm --grow /dev/md5 -n4
的作用:
把现有的 3 盘 RAID5 在线“重塑(reshape)”成 4 盘 RAID5,阵列容量立即增加约 1 块盘的净空间,且业务不停机。
-
前提条件
•/dev/md5
当前状态必须是 clean(无盘掉线)。
• 已把第 4 块盘加入阵列(通常是先mdadm --add /dev/md5 /dev/sdX
,使其处于 spare 状态)。 -
命令做了什么
•--grow
/-G
进入“增长/重塑”模式。
•-n4
/--raid-devices=4
把 活跃成员盘数量从 3 改写到 4。
• mdadm 会重新计算校验条带分布,把原有数据+校验均匀扩散到 4 盘上(后台 reshape)。
• 热备盘被“转正”,阵列容量从 (N-1) 变为 (N-1) 即 3→4 盘时,可用空间增加 1 盘净容量。 -
在线影响
• 阵列保持可用,但 I/O 性能会因 reshape 而下降。
• 可用watch -n1 cat /proc/mdstat
查看进度条。 -
后续必须步骤
reshape 完成后,还需 扩展文件系统 才能真正使用新增空间:sudo resize2fs /dev/md5 # ext4 # 或 sudo xfs_growfs /mount/point # xfs
-
注意事项
• RAID5 只能 增加 成员盘,不支持在线减少。
• 若未提前加入新盘,可加--backup-file=/path/file
做临时校验中转,但通常直接用热备盘更简单。
其他级别RAID构建命令
下面把 软 RAID 0 / 1 / 5 / 6 / 10 的构建命令 整理成一张清晰对照表,可直接复制使用。
RAID 级别 | 最少磁盘 | 容错 | 可用容量 | 构建命令示例(整盘) |
---|---|---|---|---|
RAID 0 | 2 块 | 0 盘 | 100 % | sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc |
RAID 1 | 2 块 | 1 盘 | 50 % | sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb /dev/sdc |
RAID 5 | 3 块 | 1 盘 | N-1 | sudo mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd |
RAID 6 | 4 块 | 2 盘 | N-2 | sudo mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde |
RAID 10 | 4 块 | 每组各 1 盘 | 50 % | sudo mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde |
说明:
- 如需 热备盘,在命令末尾加
--spare-devices=1 /dev/sdf
- 若使用 分区 而非整盘,把
/dev/sdX
换成/dev/sdX1
即可。
通用后续步骤(任何级别都需执行)
# 1. 格式化
sudo mkfs.ext4 /dev/md0 # 把 md0 换成对应 /dev/mdX# 2. 挂载
sudo mkdir /mnt/raidX
sudo mount /dev/mdX /mnt/raidX# 3. 开机自动挂载
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u # Debian/Ubuntu
# CentOS/RHEL 用:
sudo dracut -f# 4. 写入 fstab
UUID=$(blkid -s UUID -o value /dev/mdX)
echo "UUID=$UUID /mnt/raidX ext4 defaults,nofail 0 0" | sudo tee -a /etc/fstab
小贴士:
• 如硬盘曾做过 RAID,先清零超级块:
sudo mdadm --zero-superblock /dev/sd{b,c,d,e,f}
二、硬 RAID(BIOS/RAID 卡配置流程)
硬 RAID 由板载 RAID 控制器或独立 RAID 卡完成,操作系统层面仅能看到“逻辑盘”。以服务器常见的 LSI/Avago MegaRAID 为例:
-
开机自检时按提示进入 RAID 配置界面
- 大多数主板:
Ctrl + R
- HP Smart Array:
F8
- Dell PERC:
Ctrl + R
或F2
- 大多数主板:
-
创建阵列(UI 操作,无命令)
a. 选择 “Create Virtual Drive”
b. RAID Level:RAID 5(或 0/1/6/10/50/60 等)
c. 选中要加入阵列的物理磁盘
d. 设置条带大小(Stripe Size):常见 64 K / 256 K / 512 K
e. 初始化方式:- Full Init(慢,但安全)
- Fast Init(只做元数据,立即可用)
f. 确认创建 → 保存 → 退出
-
结果
- 系统启动后只看到一块
/dev/sda
(逻辑盘)。 - 所有磁盘故障/热备/重建都由 RAID 卡固件处理,OS 不感知单盘。
- 管理工具:
MegaCli
/storcli
(命令行)OMSA
、iDRAC
、iLO
(Web)
- 系统启动后只看到一块
-
安装系统
- 如果系统盘也做硬 RAID,在安装 Linux/Windows 前必须先完成阵列创建,否则安装程序找不到磁盘。
- 需要加载厂商提供的驱动(ISO 或 U 盘)。
-
迁移/兼容注意
- 硬 RAID 的阵列信息保存在 RAID 卡 NVRAM + 磁盘元数据,跨卡迁移必须同型号/同固件,否则阵列不可识别。
- 软 RAID 则可随时把盘插到任何 Linux 主机上
mdadm --assemble
即可恢复。
软硬RAID对比
一句话总结:
“命令建的是软 RAID,BIOS 建的是硬 RAID(或 FakeRAID);
前者靠 Linux 内核,后者靠主板/RAID 卡固件,
两者在性能、可移植性、管理粒度、故障处理上差异巨大。”
对比维度 | 命令行 mdadm(软 RAID) | BIOS/UEFI 设置(硬/FakeRAID) |
---|---|---|
实现位置 | 纯软件,Linux 内核 md 模块 | 主板 Option ROM 或 RAID 卡固件 |
依赖硬件 | 任意 SATA/SAS 口即可,无特殊要求 | 需要支持 RAID 的主板芯片组或独立 RAID 卡 |
可见磁盘 | 系统里仍能看到 /dev/sdb /dev/sdc … | 只能看到逻辑盘 /dev/sda (RAID 卡把物理盘隐藏了) |
性能 | 占用主机 CPU、内存;现代 CPU 足够快,通常差距不大 | 有专用 CPU、缓存、电池,阵列卡级别高时 I/O 延迟更低 |
可移植性 | 把盘拿到任何一台 Linux 都能 mdadm --assemble 恢复 | 盘离开原主板/阵列卡基本无法识别;需要同型号控制器 |
管理工具 | mdadm 、/proc/mdstat 、/etc/mdadm.conf 实时在线 | 重启进 BIOS/UEFI 或厂商提供的 Windows/Linux 工具 |
热备/扩容 | 在线 mdadm /dev/md0 -a /dev/sde 即可完成 | 视阵列卡功能,部分低端芯片需要重启进 BIOS 才能加盘 |
RAID 级别支持 | 0,1,4,5,6,10… 内核支持即可 | 受限于芯片/卡固件,低端 FakeRAID 往往只支持 0,1,10 |
系统安装顺序 | 先装好 Linux,再 mdadm --create | 必须先 BIOS 里建好阵列,再安装系统,否则系统看不到盘 |
是否开源 | 完全开源,可审计 | 闭源固件,黑盒运行 |
实战建议
- 家用、开发测试、云主机——直接用
mdadm
软 RAID,方便、灵活、零成本。 - 关键生产数据库、高并发虚拟化——用带缓存、电池的硬件 RAID 卡(如 PERC、SmartArray),并在 BIOS/UEFI 里配置。
- 主板自带“Intel Rapid Storage”、“AMD RAIDXpert” 这类属于 FakeRAID,性能和软 RAID 差不多,但可移植性差,不推荐在 Linux 生产环境使用。
总结
- 软 RAID:灵活、零成本、可迁移,适合开发测试、云主机。
- 硬 RAID:带电池/缓存、性能高、黑盒管理,适合生产数据库及高并发场景。
面试常见问题
Linux 运维面试常问的 RAID 题基本逃不出 “概念 → 场景 → 实现 → 故障 → 监控” 五环。
- 请简述 RAID 0/1/5/10 的工作原理与适用场景
答:
• RAID 0:条带化,无冗余,读写最快,盘坏全丢;适用临时缓存、日志盘。
• RAID 1:镜像,50 % 容量,允许坏 1 盘;适用系统盘、小型数据库。
• RAID 5:条带+奇偶校验,(N-1)/N 容量,允许坏 1 盘;读快写慢,适用通用在线业务。
• RAID 10:先镜像后条带,50 % 容量,每组可坏 1 盘;高并发数据库首选。
- RAID 5 与 RAID 6 有什么区别?
答:
RAID 6 在 RAID 5 基础上再加一组校验,允许同时坏 2 盘,最少 4 盘,容量 (N-2)/N,写惩罚更高,多用于大容量归档。
- 生产环境如何选择 RAID 级别?
答:
系统盘 RAID1;数据库 RAID10;大容量文件/NFS RAID5/6;只读缓存 RAID0;从库可 RAID0+主从复制代替冗余。
- 软 RAID 与硬 RAID 区别?
答:
软 RAID:内核 md 模块实现,零成本、可迁移、跨平台;硬 RAID:阵列卡固件,带电池/缓存,性能好、黑盒、同卡才能识别。
- Linux 下如何创建 RAID5(含热备)?
答:
mdadm --create /dev/md5 --level=5 --raid-devices=3 --spare-devices=1 /dev/sd{b,c,d,e}1
--level=5
指定级别,--raid-devices=3
数据盘,--spare-devices=1
热备盘。
- 如何查看 RAID 同步进度?
答:
watch -n1 cat /proc/mdstat
或mdadm --detail /dev/md5
查看 “[UUU_U]” 百分比。
- RAID 盘掉线如何在线替换?
答:
mdadm /dev/md5 -f /dev/sdc1
标记故障mdadm /dev/md5 -r /dev/sdc1
移除- 插新盘
mdadm /dev/md5 -a /dev/sde1
自动重建
重建完cat /proc/mdstat
显示[UUUU]
。
- RAID 阵列扩容怎么做?
答:
先把新盘加入阵列:
mdadm --grow /dev/md5 --raid-devices=4 --add /dev/sdf1
再在线调整文件系统:
resize2fs /dev/md5
或xfs_growfs /mount/point
。
- 系统重启后如何确保 RAID 自动组装?
答:
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u # Debian/Ubuntu
dracut -f # CentOS/RHEL
配置写死 UUID,防止盘符漂移。
- RAID ≠ 备份,你如何说服领导?
答:
RAID 只能防磁盘硬件故障;误删、勒索病毒、多盘同组坏时仍丢数据。需配合:
• 定期离线/异地备份(rsync + 快照 + 对象存储)
• 高可用主从架构
• 定期演练恢复脚本。