
最近处理了两起存储上的麻烦事恰好是同一类问题的两种表现一台机器硬盘报警阵列降级运行另一台机器重启之后软件 RAID 阵列直接“消失”。两台机器都是 Linux一台是服务器自带的硬件 RAID 卡一台是纯用 mdadm 搭的软件 RAID。排查加恢复折腾了整整一个下午我才意识到 RAID 这套东西很多人平时只停留在概念层面真正出问题时连从哪里下手都搞不清楚。所以这篇就专门聊聊 Linux 下的 RAID 存储技术。不搞那种“第一章 RAID 概述”的教科书套路我直接按实际干活的经验来先讲选型逻辑再讲软件 RAID 和硬件 RAID 的操作流程最后放一批掉盘、断电、扩容、恢复的真实场景处理办法。适合刚接手服务器的新手、准备运维面试的人以及在虚拟机里折腾过 Linux 但没处理过真实故障的实验党。1. RAID 选型的核心逻辑先弄明白要解决什么问题1.1 RAID 不是备份先纠正一个观念我见过不少刚入行的同事一听说要保证数据安全第一反应就是“给服务器做个 RAID”。这个想法本身没有错但把 RAID 和备份混为一谈就很危险。RAID 的本质是冗余阵列解决的是磁盘硬件层面的可用性问题。单块磁盘故障会导致数据不可读RAID 通过多块盘一起存储让系统在一块甚至多块盘损坏时仍然能够正常工作。但它解决不了误删文件、中勒索病毒、文件系统逻辑损坏、机房火灾这种灾难——这些只能靠真正的备份解决。换句话说RAID 保证的是“磁盘坏了不影响业务”备份保证的是“逻辑错误了数据还能找回”。两者是互补关系不能互相替代。我在面试题里也看到过类似的追问问的就是“服务器做了 RAID 还需要备份吗”正确答案就是需要而且必须分开说清。1.2 常用级别对比0、1、5、10怎么选被问最多的就是 RAID 0、1、5、10 之间的区别先放一张对照表然后用大白话拆开讲。RAID级别最少盘数可用容量容错能力随机写性能典型适用场景RAID 02全部容量之和无任意一块坏全部丢最好缓存、临时数据、游戏盘RAID 12单块盘容量坏 1 块需要写两份略降系统盘、小数据量热备RAID 53(N-1) 块坏 1 块写惩罚明显常规业务数据盘RAID 104N/2每组坏 1 块最多坏 N/2 块比 RAID 5 好数据库、核心业务RAID 0就是单纯把多块盘拼接起来读写性能翻倍容量全部可用但没有任何保护。坏一块盘等于全部数据完蛋。所以它只适合那些丢了也不心疼的数据比如视频剪辑的临时工程缓存、游戏库、计算节点的中间结果。RAID 1就是镜像两块盘内容完全一样。可用容量只有一半写性能因为要同时写两块盘会略有下降读性能反而可以双盘同时读。选 RAID 1 的典型场景是小机器上的系统盘容量需求不大但系统稳定性要求高。RAID 5是最容易让人误解的。它通过分布式校验位用 N 块盘提供 N-1 块的容量允许坏一块盘。但很多人没注意一个关键点RAID 5 的写惩罚很重。每次写一条数据除写入数据本身外还要读旧数据、读旧校验、写新校验一次写操作背后要发生 4 次 IO。对小随机写入的场景比如虚拟机镜像文件、数据库事务日志RAID 5 的性能会非常难看。RAID 10是把数据先做镜像再做条带。容错逻辑是每组镜像对里各坏一块还能跑最多允许坏 N/2 块盘但要分布在不同组。它的随机写性能远好于 RAID 5代价就是可用容量打折一半需要更多盘才能组成相同的容量。在“性能优先”和“容量优先”之间我自己的经验法则是数据库和核心业务用 RAID 10不差那点盘位海量文件存储和备份池用 RAID 5/6利用容量系统盘要么 RAID 1 要么让硬件卡做 RAID 1很少在系统盘上做 RAID 5。1.3 容量与性能的简单估算方法很多人在规划阵列时只看盘的数量弄不清可用容量怎么算这里给三个公式照着套就行。RAID 0可用容量 盘数 × 单盘容量RAID 1可用容量 单盘容量RAID 5可用容量 (盘数 - 1) × 单盘容量RAID 6可用容量 (盘数 - 2) × 单盘容量RAID 10可用容量 (盘数 / 2) × 单盘容量是不是很直观。但要注意一个细节RAID 5 的容量公式成立的前提是所有盘容量一致。如果混插了不同容量的盘阵列的可用容量会按最小盘的容量来算。4 块盘里 3 块是 4TB、1 块是 2TBRAID 5 的可用容量不是 3×4TB而是按 2TB 计算容量直接缩一半。这个规律不仅适用 RAID 5RAID 1、RAID 10 也一样镜像基数是按最小盘容量算的。所以采购硬盘时尽量一次买齐同容量别贪便宜混着买后期维护很难受。性能估算方面顺序读性能大概等于参与条带读的盘数量的总和RAID 10 理论读并发更高但实际瓶颈通常在网卡、总线、文件系统层。随机 IO 能力是群里最关心的核心结论是RAID 10 的随机写比 RAID 5 稳定得多。原因就是 RAID 5 有读改写惩罚RAID 10 只需要写两个副本。2. 软件 RAID 实验环境与 mdadm 实操2.1 先用虚拟机搭一个练手环境软件 RAID 在 Linux 里最常用的工具是 mdadm。它不需要专门的硬件 RAID 卡直接把普通 SATA/SAS/NVMe 盘组成阵列灵活性非常高也便于在虚拟化环境里做实验。我特别推荐先在虚拟机里模拟整套 RAID 流程因为真机上做实验风险太大。用 VMware Workstation 或者 VirtualBox 建一台 Linux 虚拟机再额外添加 4 块虚拟硬盘就能像真机一样操作。唯一要注意的是模拟出来的虚拟盘和真机磁盘的 IO 特性不同能练的是命令逻辑和恢复流程不是性能指标。创建虚拟机时给系统分一个最小化安装的 LinuxCentOS、Rocky、Ubuntu Server 都行。然后加入 4 块 5GB 的虚拟磁盘也不需要很大够练习就行。等我做环境实操时再加两个 5GB 虚拟盘做热备盘。虚拟机里练 RAID 还有个额外好处随手快照。配置错了、想重新来一遍直接恢复快照几秒钟搞定。真机上可没有这种后悔药。2.2 用 mdadm 创建阵列的完整流程进入系统后先用lsblk或fdisk -l确认磁盘名。虚拟机新加的盘一般叫/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde。如果要创建 RAID 1命令非常简单mdadm --create /dev/md0 --level1 --raid-devices2 /dev/sdb /dev/sdc如果要创建 RAID 5三块盘起步mdadm --create /dev/md5 --level5 --raid-devices3 /dev/sdb /dev/sdc /dev/sdd或者创建加一块热备盘的 RAID 5mdadm --create /dev/md5 --level5 --raid-devices3 --spare-devices1 /dev/sdb /dev/sdc /dev/sdd /dev/sde创建完成后查看阵列状态cat /proc/mdstat会看到类似下面这样的输出Personalities : [raid1] [raid6] [raid5] [raid4] md5 : active raid5 sde[4](S) sdd[3] sdc[1] sdb[0] 10485760 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]在这段输出中[UUU]的含义非常重要。三个 U 表示 3 块盘都正常工作某个盘变成_就意味着对应槽位已经缺失或掉线阵列进入降级状态。(S)表示热备盘。创建完阵列后建议用mdadm --detail /dev/md5再确认一遍完整信息包括阵列 UUID、成员盘列表、重建进度、可用容量等。创建只是个开始接下来按顺序做这几步写文件系统、挂载、更新配置。mkfs.ext4 /dev/md5 mkdir -p /data mount /dev/md5 /data为了重启后自动挂载还要写入/etc/fstab。但这里有个大坑不要在 fstab 里写 /dev/md5 这种设备名因为重启后内核分配设备号的顺序不一定稳定。正确做法是在/etc/fstab里使用 UUID。blkid /dev/md5拿到输出里的 UUID然后写入 fstabUUID你的UUID值 /data ext4 defaults 0 0同时把 RAID 阵列信息写进 mdadm 的配置文件让系统开机时能自动组装阵列mdadm --detail --scan /etc/mdadm/mdadm.confRHEL/CentOS/Rocky 系还要执行dracut -fUbuntu/Debian 系执行update-initramfs -u更新 initramfs 的目的是把新的 mdadm 配置打包进启动镜像否则内核启动早期阶段可能无法识别阵列导致启动时提示找不到设备。2.3 巡检、监控与重建操作习惯阵列搭好不代表一劳永逸。日常巡检第一件是看状态cat /proc/mdstat mdadm --detail /dev/md5每次看到[UUU]变成[UU_]阵列就已经在降级模式了。这时候数据还能读但已经没有冗余能力第二块盘再坏就是数据灾难必须马上处理。如果只是普通的坏盘替换操作顺序是三步把坏盘从阵列中移除、物理换盘或把新盘插上、把新盘加入阵列触发重建。mdadm /dev/md5 --fail /dev/sdb mdadm /dev/md5 --remove /dev/sdb mdadm /dev/md5 --add /dev/sdf执行完最后一条命令后系统会自动开始 rebuild。查看进度watch -n 1 cat /proc/mdstat重建期间阵列 IO 性能会明显下降因为需要重新计算并写入校验数据。如果是生产环境尽量把重建时间安排在业务低峰同时在重建完成前不要着急做其他重 IO 操作。监控方面可以用 mdadm 自带的 monitor 模式。mdadm --monitor --daemonize --mailadminexample.com --program/etc/mdadm/mdadm-monitor /dev/md5设置后当阵列出现降级、rebuild 失败、设备移除等事件时会自动发送邮件告警。当然更现代的做法是把/proc/mdstat纳入 PrometheusAlertmanager 或者 Zabbix 监控但不管用什么核心就是盯住[UUU]状态和 raid 事件。3. 硬件 RAID 卡从配置界面到 storcli 命令行3.1 开机配置界面里必须知道的几个英文生产服务器上硬件 RAID 比软件 RAID 更常见。原因是服务器自带 RAID 卡之后整阵列的操作对操作系统完全透明系统看到的是一块已经做好的逻辑盘驱动负担小掉电保护、写缓存策略这些也要比纯软件 RAID 复杂有效。几乎所有硬件 RAID 卡包括常见的 LSI/Avago 系以及各家 OEM 服务器那批在开机自检画面都会提示按某个快捷键进入配置界面常见的是CtrlH、CtrlR、CtrlC具体看开机提示。进入配置界面后有几个英文术语一定要认识Virtual Drive逻辑盘也就是系统能看到的磁盘设备。Physical Drive物理硬盘是组成阵列的原始磁盘。Foreign Config外部配置RAID 卡读到不属于自己的 RAID 配置信息。JBOD直接把物理盘透传给系统不做 RAID。Rebuild阵列重建用新盘/热备盘恢复冗余。第一次进 RAID 卡配置界面的人最容易犯的错误就是乱点Clear Configuration或者Delete Virtual Drive。这两个操作会直接清掉阵列配置后果是数据全部丢失而且很多时候不需要清任何东西。在界面上看到不认识的功能先查清楚再动这个原则比任何命令技巧都重要。3.2 storcli 命令行管理虚拟磁盘图形界面的 RAID 卡管理适合偶尔配置一次。但真到生产环境里管理多台机器一个个重启进 BIOS 界面点来点去效率太低所以掌握命令行工具非常关键。对于 LSI/Avago/Broadcom 系的巨型 RAID 卡storcli是事实标准。装好 storcli 后第一步永远是查看控制器信息storcli /c0 show/c0表示控制器 0多控机器会有/c1等。输出里能看到控制器型号、固件版本、BBU 状态、写缓存策略。查看所有物理盘状态storcli /c0 /eall /sall show输出会按插槽位置显示每一块物理盘的状态包括UGood正常、Onln在线、Offln离线、Failed故障等状态。创建虚拟磁盘比如 RAID 10可以这样storcli /c0 add vd typeraid10 drives252:0,1,2,3 sizeall nameVD0这里的252是 Enclosure 编号0,1,2,3是插槽号具体编号由上一句命令的输出决定。查看虚拟磁盘信息storcli /c0 /vall show删除不要的虚拟磁盘storcli /c0 /vall delete删除前务必确认没选错对象这个命令就是实打实的破坏性操作。还有两个常用设置。设置 JBOD 透传模式storcli /c0 set jbodon导入外部配置换卡、搬迁后常见storcli /c0 import foreignconfig如果你没把阵列信息丢掉只是换了张 RAID 卡检测到外部配置后不要选择清除先用这个命令导入。之前见过有人图省事直接清掉 foreign config结果数据没了当场崩溃得不偿失。3.3 更换物理盘与 Rebuild 的正确姿势硬件 RAID 卡换盘表面上很简单把坏盘拔出来新盘插进去RAID 卡会自动识别新盘并开始重建前提是阵列还处于降级状态且没有禁用自动重建。实际运维中有三个细节最容易踩坑。第一不要盲目相信“自动重建”。有些环境会在后台策略里关闭了自动重建或者新盘容量不够、型号不匹配RAID 卡会直接忽略新盘。正确做法是换盘之后用 storcli 查看新盘状态storcli /c0 /eall /sall show如果新盘状态是UGood通常说明已被识别如果还是Offln需要手动把它设为 onlinestorcli /c0 /ex /sx set online重建进度查询storcli /c0 /vx show rebuild重建期间不要对阵列做重负载操作。很多 RAID 卡在重建时写缓存会被暂停性能会很感人。第二热备盘并不是万能的。热备盘在平时确实可以自动顶替故障盘但热备盘本身也会坏。如果热备盘长期在线但一直没被用上它的固件和磁盘健康状态同样需要监控。有的热备盘已经报警了但因为没参与阵列RAID 卡监控不一定报出来要定期主动看。第三注意写缓存策略和 BBU 状态。硬件 RAID 卡的性能核心是写缓存。一旦 BBU后备电池状态异常写缓存策略会被硬件自动降级为 Write Through性能会直线下降。排查性能问题时先用storcli /c0 show看看 BBU 状态如果显示Failed或者Not Ready先去解决电池或电容问题否则性能怎么调都白搭。4. 掉盘、断电、扩容真实场景的故障处理4.1 掉盘后的标准处理流程先镜像再动手不管是软件 RAID 还是硬件 RAID掉盘之后最容易犯的错误就是“着急把新盘加进去让它重建”。原理很简单如果掉下来的盘其实是接口松动或者线缆接触不良在不明原因下贸然重建可能会把原本状况不一致的盘数据写进阵列造成不可逆的数据损坏。我的处理流程一直是这样的如果解决了你的问题可以参考先确认掉盘原因。软件 RAID 看/proc/mdstat硬件 RAID 看 storcli 里的状态。是磁盘自身报错还是 SAS/SATA 线缆松动还是背板供电问题。千万不要直接做--add。先把嫌疑盘做成镜像。如果还有一块好盘能读用dd或者更推荐用ddrescue把坏盘/有问题的盘完整克隆出来。原料盘不碰镜像盘随便试。再把镜像盘加进阵列尝试恢复这样即使恢复过程中搞坏了原始盘还在可以重来。这个流程看起来多花时间但对核心数据来说完全值得。在没有把握的前提下一上来就走重建流程遇到不可逆损坏再后悔就晚了。4.2 RAID 信息丢失时的恢复思路最吓人的故障不是掉盘而是重启之后整个阵列“消失”。这种情况在纯软件 RAID 环境比较常见系统引导失败找不到/dev/mdX或者/proc/mdstat里什么也没有。先说第一原则别慌也别乱重建。阵列消失不等于数据没了很多时候只是超级块没有被正确识别或者排序问题。先用 mdadm 扫描所有物理盘上的 RAID 超级块mdadm --examine /dev/sdb /dev/sdc /dev/sdd /dev/sde每块盘会输出超级块信息包括阵列 UUID、角色、更新时间等。如果能从盘中读取到的 UUID 一致说明这些盘还是同一个阵列的成员盘只是没有被自动组装。这时试着按扫描结果组装mdadm --assemble --scan如果扫描不完全可以手动指定成员盘mdadm --assemble /dev/md5 /dev/sdb /dev/sdc /dev/sdd /dev/sde组装后立即查看状态cat /proc/mdstat mdadm --detail /dev/md5我遇到过一次比较极端的情况控制节点因为初始化脚本问题启动了一半阵列没有自动组装然后又执行了mkfs导致文件系统超级块被覆盖那种情况恢复难度就大了。所以每次排查时先确认状态再动手写任何东西这个习惯能救命。如果是硬件 RAID 卡的配置丢失比如更换了 RAID 卡、主板电池没电导致配置丢失storcli 的import foreignconfig就是把外部配置导回来。如果其他盘还能看到就不要选择clear或initialize否则这张阵列就是真的宣布终结。4.3 扩容与断电场景的实战经验扩容场景分几种。如果是软件 RAID 把现有阵列扩大容量思路是先把新盘加入阵列、扩展阵列可用空间、再扩文件系统。第一步新加一块盘进入阵列RAID 5 为例mdadm /dev/md5 --add /dev/sdf这一步只是加盘阵列容量不会立刻变化。要让 RAID 5 扩容到新盘需要做一次 growmdadm --grow /dev/md5 --raid-devices4注意这个命令会先触发一次 array reshape这个过程耗时较长期间阵列 IO 能力下降建议在低峰执行。完成后再扩展文件系统lvextend -l 100%FREE /dev/vg_data/lv_data resize2fs /dev/vg_data/lv_data硬件 RAID 卡的扩容方式差异很大。典型的是通过storcli进行虚拟磁盘的扩展storcli /c0 /v0 expand size对比但并不是所有 RAID 卡都支持在线扩展。还有一种是物理盘全换大盘重建。在 RAID 5 上要特别注意如果一次只换一块盘重建再换下一块最后整个阵列容量就会变大。RAID 5 扩容到新盘后还需要再做一次 controller 层面的 expand 才能用上全部容量。断电场景大家都关心“服务器断电之后 RAID 还能继续用吗”这么说吧只要阵列是正常的、RAID 卡配置没丢断电重启后阵列会自动恢复在线。真正的问题在于断电瞬间写缓存里没落盘的数据。硬件 RAID 卡有 BBU 保护断电时写缓存能保住重新上电后回写这个没问题。但如果没有 BBU、或者电池已经失效RAID 卡通常会自动把写策略从 Write Back 降级为 Write Through重启后文件系统可能处于不一致状态需要 fsck。软件 RAID 没有 BBU 概念断电风险就是在内核 IO 栈里的数据会丢失。文件系统日志能解决一部分问题但不能完全避免。重启后如果文件系统检查报错用fsck修的时候要看清楚提示不该按的自动修复选项别乱按否则可能造成更严重的逻辑破坏。顺便说一个虚机场景很多人用虚拟机模拟 RAID断电测试之后重启发现阵列起不来。原因多半是虚拟盘快照回滚了导致每块盘的超级块版本不一致。处理方法是把快照统一到断电前的状态再用mdadm --assemble --scan重新组。5. 运维避坑速查表与我的个人心得5.1 日常巡检清单10分钟例行检查RAID 故障往往不是突然发生的它有前兆。磁盘有坏道、控制器日志开始报 SMART 错误、Rebuild 历史频繁这些都是信号。我自己整理了一份例行巡检清单照着做基本不会漏。查看/proc/mdstat确认所有软件阵列都是[UUU]状态。查看mdadm --detail /dev/md*确认没有盘处于Sparring或Removed。硬件 RAID 卡执行storcli /c0 /eall /sall show看是否有Failed或Offln盘。检查 BBU 状态storcli /c0 show看 Battery 是否正常状态不正常就要安排更换。关注磁盘 SMART 信息smartctl -a /dev/sdX看 Reallocated Sector Count 是否持续增长。定期检查/var/log/messages或journalctl里与 md/raid 相关的报错。发容量告警的机器、Rebuild 频繁的机器重点排查盘体健康不要等问题爆发才动手。5.2 常见问题速查表现象可能原因处理方式重启后阵列消失mdadm 配置未写入 /etc/mdadm/mdadm.conf 或 initramfs 未更新执行mdadm --examine然后--assemble --scan再更新配置阵列降级[UU_]某块盘掉线确认掉线盘状态先镜像再 remove add 重建重建一直在 0%磁盘可能存在物理坏道或 IO 被占用用 storcli 确认新盘健康状态降低负载再观察系统盘性能突然下降RAID 卡 BBU 状态异常导致写缓存降级查看 BBU 状态安排更换电容/电池无法识别外部配置更换了 RAID 卡或背板顺序变化不要 clear使用import foreignconfig导入磁盘容量不识别部分 RAID 卡不支持超过 2TB 的逻辑盘检查 GPT 分区表必要时使用支持大容量的控制器固件扩容后文件系统没变大只扩了阵列未扩文件系统用lvextendresize2fs或mkfs.grow完成最后一步Windows 无法读取 Linux 软件 RAID 盘mdadm 元数据是 Linux 私有格式不要跨平台直接读用 Linux LiveCD 恢复数据后导出还有一条额外的经验和“Windows 打开 Linux RAID”相关的热词我也遇到过你不是第一个搜这个的人。软件 RAID 用的 md 超级块格式在 Windows 的磁盘管理里是不识别的直接用 Windows 插上这些盘大概率会提示未初始化。别去点“初始化磁盘”那会清掉盘上元数据。正确做法是用 Linux LiveCD比如系统安装盘里的救援模式组好阵列把数据拷贝到其他盘再传输到 Windows 环境。5.3 一些只有踩坑才换来的个人心得最后聊几条我这么多年积累下来的操作体会供你参考。第一在任何 RAID 操作前先备份重要数据。这话说了无数遍但我还是要再说一次。RAID 阵列提供的是硬件冗余不是灾备。执行 delete、clear、create 这些命令之前核对清楚别把有数据的盘当成空盘初始化。第二每台机器都要留下一份 RAID 配置档案。包括阵列级别、成员盘型号、容量、RAID卡固件版本、storcli 生成的完整配置导出。归档文件放在该机器之外的地方。等哪天真的需要恢复阵列你就能少花一个小时去回忆当初是怎么配的。第三不要过度依赖热备盘。热备盘顶替上去之后不再有冗余如果你又发现一块盘报错那就很危险了。出现这种情况的首要任务是把数据迁移掉而不是继续赌运气。第四在真机上动手前一定先在虚拟机里演练一遍。模拟掉盘、模拟断电、模拟配置文件丢失把恢复流程跑熟练了再上生产。我自己带的运维兄弟每个人都要求先在虚拟环境完整走一遍完整流程通过考核之后才允许碰真机。RAID 这个东西配置起来很简单难的是故障处理和恢复决策。希望这篇从选型到实操、从软件阵列到硬件卡的经验整理能帮你少走一些弯路。如果你在实验环境或者生产环境里遇到别的 RAID 问题欢迎把具体场景抛出来我们可以继续一起推演。