当前位置: 首页 > news >正文

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 020 盘100 %缓存/临时盘“极速无备份,一挂全丢。”
RAID 121 盘50 %系统盘/财务库“镜像双写,换盘秒恢复。”
RAID 531 盘N-1通用在线业务“奇偶校验,读写平衡。”
RAID 642 盘N-2归档/大容量“双校验,坏两块不慌。”
RAID 104每组各 1 盘50 %数据库/虚拟化“先镜像再条带,贵但稳快。”
JBOD10 盘100 %简单扩容“只是捆绑,无冗余。”

N = 总盘数,容量按最小盘计算。


三、三大底层技术

  1. 条带化 (Striping)
    数据切块后并行写到多盘,提高吞吐,无冗余 → RAID 0 的核心。

  2. 镜像 (Mirroring)
    同一份数据写两份或多份,实时热备 → RAID 1 / RAID 10 的基石。

  3. 分布式奇偶校验 (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 种工作模式

  1. Create 创建阵列
  2. Assemble 重新装配阵列
  3. Manage 日常增删改(热插拔、故障标记等)
  4. Monitor 持续监控与事件通知
  5. 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 -lRAID 级别 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查看成员盘 superblockmdadm -E /dev/sdb1
--brief -b-D/-E 配合输出精简格式-D -b
--scan -s扫描配置文件或 /proc/mdstatmdadm -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 条“组合拳”

  1. 创建 RAID5(3 数据盘 + 1 热备)
mdadm -C /dev/md5 -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}
  1. 查看阵列健康
watch -n1 cat /proc/mdstat
mdadm -D /dev/md5         # 或 --detail
  1. 在线替换坏盘
mdadm /dev/md5 -f /dev/sdc      # 标记故障
mdadm /dev/md5 -r /dev/sdc      # 移除
mdadm /dev/md5 -a /dev/sde      # 插入新盘
  1. 保存配置(重启自动装配)
mdadm -Ds >> /etc/mdadm/mdadm.conf
update-initramfs -u          # Debian/Ubuntu
dracut -f                    # CentOS/RHEL
  1. 停止并彻底删除阵列
mdadm -S /dev/md5
mdadm --zero-superblock /dev/sd{b,c,d,e}
实际案例

下面以 RAID5(3 块数据盘 + 1 块热备盘) 为例,
磁盘假设为:/dev/sdc /dev/sdd /dev/sde(数据盘),/dev/sdf(热备)。

  1. 安装工具

    sudo apt install -y mdadm           # Debian/Ubuntu 安装 mdadm
    yum install -y mdadm                # CentOS/RHEL
    
  2. 准备磁盘(分区或直接整盘均可)

    sudo fdisk /dev/sdc                 # 进入交互分区工具
    # 依次:n → p → 1 → 回车 → 回车 → t → fd → w
    # 每块盘都同样操作,把分区类型设为 0xfd(Linux raid)
    sudo partprobe                      # 通知内核重读分区表
    
交互动作含义说明
nn = new创建一个新的分区。
pp = primary选择“主分区”(最多只能建 4 个主分区)。
若需要更多分区,可先选 e 建扩展分区,再在其中建逻辑分区。
1分区编号把新分区命名为 /dev/sdb1。如果磁盘上已有分区,系统会自动给出下一个可用编号。
回车起始扇区直接回车表示“从磁盘可用空间的最开头”开始分区,通常即 2048 扇区,对齐性能最佳。
回车结束扇区再次回车表示“把剩余所有空间都分给该分区”。
也可输入 +100G+50% 等指定大小。
tt = type修改分区类型(即“文件系统标识符”)。
fd分区类型代码fd 对应 Linux RAID autodetect,告诉内核“这块分区将来要被 mdadm 用来做软 RAID”。
常见代码:83 Linux、82 Linux swap、8e Linux LVM。
ww = write把刚才所有操作真正写入磁盘分区表并退出 fdisk
执行后分区表立即生效,磁盘被锁定更新;如果磁盘正在使用,系统会提示重启或执行 partprobe/partx -a /dev/sdb 使内核重读。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


  1. 创建阵列
    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                      # 热备分区
    

在这里插入图片描述

  1. 查看同步进度
    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>

没有未使用的硬盘,所有磁盘都已加入阵列或热备。

在这里插入图片描述

  1. 保存配置(确保重启自动装配)
    sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
    sudo update-initramfs -u           # Debian/Ubuntu
    dracut -f                          # CentOS/RHEL
    

在这里插入图片描述

  1. 格式化 & 挂载
    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
    

在这里插入图片描述

  1. 日常维护常用命令
    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 块盘的净空间,且业务不停机。

  1. 前提条件
    /dev/md5 当前状态必须是 clean(无盘掉线)。
    • 已把第 4 块盘加入阵列(通常是先 mdadm --add /dev/md5 /dev/sdX,使其处于 spare 状态)。

  2. 命令做了什么
    --grow / -G 进入“增长/重塑”模式。
    -n4 / --raid-devices=4活跃成员盘数量从 3 改写到 4
    • mdadm 会重新计算校验条带分布,把原有数据+校验均匀扩散到 4 盘上(后台 reshape)。
    热备盘被“转正”,阵列容量从 (N-1) 变为 (N-1) 即 3→4 盘时,可用空间增加 1 盘净容量。

  3. 在线影响
    • 阵列保持可用,但 I/O 性能会因 reshape 而下降。
    • 可用 watch -n1 cat /proc/mdstat 查看进度条。

  4. 后续必须步骤
    reshape 完成后,还需 扩展文件系统 才能真正使用新增空间:

    sudo resize2fs /dev/md5        # ext4
    # 或
    sudo xfs_growfs /mount/point   # xfs
    
  5. 注意事项
    • RAID5 只能 增加 成员盘,不支持在线减少。
    • 若未提前加入新盘,可加 --backup-file=/path/file 做临时校验中转,但通常直接用热备盘更简单。

其他级别RAID构建命令

下面把 软 RAID 0 / 1 / 5 / 6 / 10 的构建命令 整理成一张清晰对照表,可直接复制使用。

RAID 级别最少磁盘容错可用容量构建命令示例(整盘)
RAID 02 块0 盘100 %sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
RAID 12 块1 盘50 %sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
RAID 53 块1 盘N-1sudo mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
RAID 64 块2 盘N-2sudo mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
RAID 104 块每组各 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 为例:

  1. 开机自检时按提示进入 RAID 配置界面

    • 大多数主板:Ctrl + R
    • HP Smart Array:F8
    • Dell PERC:Ctrl + RF2
  2. 创建阵列(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. 确认创建 → 保存 → 退出
  3. 结果

    • 系统启动后只看到一块 /dev/sda(逻辑盘)。
    • 所有磁盘故障/热备/重建都由 RAID 卡固件处理,OS 不感知单盘。
    • 管理工具:
      • MegaCli / storcli(命令行)
      • OMSAiDRACiLO(Web)
  4. 安装系统

    • 如果系统盘也做硬 RAID,在安装 Linux/Windows 前必须先完成阵列创建,否则安装程序找不到磁盘。
    • 需要加载厂商提供的驱动(ISO 或 U 盘)。
  5. 迁移/兼容注意

    • 硬 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 里建好阵列,再安装系统,否则系统看不到盘
是否开源完全开源,可审计闭源固件,黑盒运行

实战建议

  1. 家用、开发测试、云主机——直接用 mdadm 软 RAID,方便、灵活、零成本。
  2. 关键生产数据库、高并发虚拟化——用带缓存、电池的硬件 RAID 卡(如 PERC、SmartArray),并在 BIOS/UEFI 里配置。
  3. 主板自带“Intel Rapid Storage”、“AMD RAIDXpert” 这类属于 FakeRAID,性能和软 RAID 差不多,但可移植性差,不推荐在 Linux 生产环境使用。

总结

  • 软 RAID:灵活、零成本、可迁移,适合开发测试、云主机。
  • 硬 RAID:带电池/缓存、性能高、黑盒管理,适合生产数据库及高并发场景。

面试常见问题

Linux 运维面试常问的 RAID 题基本逃不出 “概念 → 场景 → 实现 → 故障 → 监控” 五环。


  1. 请简述 RAID 0/1/5/10 的工作原理与适用场景
    答:
    • RAID 0:条带化,无冗余,读写最快,盘坏全丢;适用临时缓存、日志盘。
    • RAID 1:镜像,50 % 容量,允许坏 1 盘;适用系统盘、小型数据库。
    • RAID 5:条带+奇偶校验,(N-1)/N 容量,允许坏 1 盘;读快写慢,适用通用在线业务。
    • RAID 10:先镜像后条带,50 % 容量,每组可坏 1 盘;高并发数据库首选。

  1. RAID 5 与 RAID 6 有什么区别?
    答:
    RAID 6 在 RAID 5 基础上再加一组校验,允许同时坏 2 盘,最少 4 盘,容量 (N-2)/N,写惩罚更高,多用于大容量归档。

  1. 生产环境如何选择 RAID 级别?
    答:
    系统盘 RAID1;数据库 RAID10;大容量文件/NFS RAID5/6;只读缓存 RAID0;从库可 RAID0+主从复制代替冗余。

  1. 软 RAID 与硬 RAID 区别?
    答:
    软 RAID:内核 md 模块实现,零成本、可迁移、跨平台;硬 RAID:阵列卡固件,带电池/缓存,性能好、黑盒、同卡才能识别。

  1. 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 热备盘。


  1. 如何查看 RAID 同步进度?
    答:
    watch -n1 cat /proc/mdstatmdadm --detail /dev/md5 查看 “[UUU_U]” 百分比。

  1. RAID 盘掉线如何在线替换?
    答:
  1. mdadm /dev/md5 -f /dev/sdc1 标记故障
  2. mdadm /dev/md5 -r /dev/sdc1 移除
  3. 插新盘 mdadm /dev/md5 -a /dev/sde1 自动重建
    重建完 cat /proc/mdstat 显示 [UUUU]

  1. RAID 阵列扩容怎么做?
    答:
    先把新盘加入阵列:
    mdadm --grow /dev/md5 --raid-devices=4 --add /dev/sdf1
    再在线调整文件系统:
    resize2fs /dev/md5xfs_growfs /mount/point

  1. 系统重启后如何确保 RAID 自动组装?
    答:
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u          # Debian/Ubuntu
dracut -f                    # CentOS/RHEL

配置写死 UUID,防止盘符漂移。


  1. RAID ≠ 备份,你如何说服领导?
    答:
    RAID 只能防磁盘硬件故障;误删、勒索病毒、多盘同组坏时仍丢数据。需配合:
    • 定期离线/异地备份(rsync + 快照 + 对象存储)
    • 高可用主从架构
    • 定期演练恢复脚本。
http://www.dtcms.com/a/282398.html

相关文章:

  • QML 五大对话框组件
  • 端口被占用时的解决问题
  • Egg.js × NestJS 2025 Nodejs后端框架选型指南
  • 代码随想录算法训练营十七天|二叉树part07
  • 【android bluetooth 协议分析 03】【蓝牙扫描详解 2】【app触发蓝牙扫描后,协议栈都做了那些事情】
  • 跨平台 App 如何无痛迁移到鸿蒙系统?全流程实战+Demo 教程
  • 八股文——包装类
  • Android 升级targetSdk无法启动服务
  • 动态规划题解——分割等和子集【LeetCode】
  • 面向向量检索的教育QA建模:九段日本文化研究所日本语学院的Prompt策略分析(6 / 500)
  • 知识点3:python-sdk 核心概念(prompt、image、context)
  • 有哪些好用的原型设计软件?墨刀、Axure等测评对比
  • MAC 苹果版Adobe Photoshop 2019下载及保姆级安装教程!!
  • Prompt Engineering 快速入门+实战案例
  • C#.NET BackgroundService 详解
  • 增程式汽车底盘设计cad【9张】三维图+设计说明书
  • 机器学习sklearn入门:归一化和标准化
  • 深入解析 AWS RDS Proxy
  • VirtualBox 中 CentOS 7 双网卡配置静态 IP
  • 用 Ray 跨节点调用 GPU 部署 DeepSeek 大模型,实现分布式高效推理
  • 「计算机网络」笔记(一)
  • qt 中英文翻译 如何配置和使用
  • 面试150 二叉树的锯齿层次遍历
  • YOLO13正式发布!考虑将yolov13的创新点融合到半监督中,构建YOLOv13_ssod
  • Qt 将触摸事件转换为鼠标事件(Qt4和Qt5及以上版本)
  • Qt 的信号槽机制中,使用 `connect` 函数时,第五个参数是 **连接类型(Connection Type)**,
  • Ubuntu中man手册不全解决以及man手册中英文切换方法
  • 若依框架下前后端分离项目交互流程详解
  • 20、鸿蒙Harmony Next开发:组件导航(Navigation)和页面路由(@ohos.router)
  • 现代人工智能综合分类:大模型时代的架构、模态与生态系统