软 RAID 与硬 RAID:别迷信阵列卡

组多盘存储绕不开一个问题:阵列由谁来管。主板上的阵列卡说「我来,我专业,我有缓存」,Linux 的 mdadm 说「我来,我透明,我不收钱」。ZFS 和 Btrfs 说「阵列这种东西本来就该文件系统管」。这一章把三条路讲明白,重点说说为什么家用场景下硬 RAID 阵列卡往往是陷阱。

硬 RAID 阵列卡到底在干什么

阵列卡是插在 PCIe 上的一块硬件,把几块物理盘虚拟成一个逻辑盘交给操作系统。它有独立处理器做校验计算,有板载内存做读写缓存,企业级卡还有电池保护缓存(BBU),断电时缓存里的数据不丢。

听起来很美。对企业用户来说这是必需品:操作系统看到的是一块「干净的盘」,阵列配置和操作系统解耦,换服务器只要把卡和盘一起搬走。但对家庭用户,它的优势基本归零,劣势开始放大。企业环境里「服务器换了一台、卡和盘一起搬走」是合理的运维逻辑;家里换机器时,你只想要硬盘里的数据,而不是连卡一起搬。软 RAID 换机器是「插盘、开机、识别」三步,硬 RAID 换机器是「找同款卡、刷固件、祈祷」。仅此一条,家用就没什么可纠结的。

最大的问题是「黑盒」。阵列怎么配的、缓存策略是什么、哪块盘报错了,全在卡的私有固件里,Linux 只能通过各种翻译层拿到有限信息。卡坏了?阵列的元数据只有同型号同固件的卡才认,二手市场找一块过气阵列卡的故事每个玩家都经历过——有人的数据因此在柜子里躺了两年,因为那款卡已经绝版。

还有一个隐形问题:阵列卡固件升级是另一个独立的维护项,企业级卡每几个月一个版本,家用玩家很快就会忘记这件事。固件不再更新的阵列卡插在新主板上可能点不亮,这种兼容性事故不需要你做错任何事就会发生。更别提家用平台上遇见带缓存的阵列卡,它的缓存反而可能和 ZFS 的写缓存打架,造成数据损坏。ZFS 官方文档里明确写着:用 ZFS 就别用带缓存的硬件阵列卡,两者对写入语义的假设互相冲突。

软 RAID:Linux 内核的免费方案

mdadm 是 Linux 软 RAID 的标准工具,所有 NAS 系统底下都可能是它(OMV 的软 RAID 插件就是图形化封装的 mdadm)。它的优点全是硬 RAID 的反面:配置在系统里一目了然;坏盘、同步进度、阵列状态通过 /proc/mdstat 透明可读;任何 Linux 机器都能认盘重组,不挑硬件;能耗低、无额外成本。

软 RAID 的常见批评是「占用 CPU 做校验」。这在今天基本是伪问题:现代 CPU 的异或计算能力强到家用阵列根本感受不到,除非你跑满万兆带宽的企业级负载,普通家用离那个门槛还有数量级的距离。家用场景的真正瓶颈是硬盘本身,软 RAID 的那点开销可以忽略。

管理 mdadm 的日常就四条命令:cat /proc/mdstat 看状态,mdadm --detail 看细节,mdadm --add 加盘或者替盘,mdadm --grow 扩容。建议每个阵列开启 write-intent bitmap,开启后意外断电的重建只需要检查有变化的数据块,几分钟而不是几小时。这是免费的一行配置,收益却是家用场景最常见的断电场景,性价比极高。

另一个配置习惯值得养成:新盘加入阵列之前先做一次完整的 SMART 检测,个别新盘出厂就有坏块,带着坏块进阵列等于把隐患埋进地基。运行中的阵列定期跑 scrub,把整盘数据读一遍做校验,在错误还是单个块的时候就发现并修掉它。

对比项 硬 RAID 卡 mdadm 软 RAID ZFS/Btrfs
成本 几百到上千 免费 免费
透明度 黑盒 完全透明 完全透明
换硬件 同型号卡 任意 Linux 任意支持系统
校验修复 有 有 加端到端校验
缓存加速 有(可能冲突) 依赖系统 内置 ARC

第三条路:卷管理交给文件系统

ZFS 和 Btrfs 把 RAID 做进了文件系统层,带来两个传统方案没有的特性。

一是校验不仅能发现,还能修。传统 RAID 的重建是「按位复制」,源盘上坏的数据会被忠实复制过去;ZFS 的重建会逐块校验,发现与校验和不一致的块主动修复。对长期静默损坏,这是一个质的区别。这也是为什么 TrueNAS 和飞牛都把 ZFS 当核心——价值不在存储池,在于这个都不用你操心的修复闭环。

二是结构即数据集。ZFS 的 RAIDZ、Btrfs 的多设备卷在创建时就和文件系统的快照、压缩统一规划,不再有「先组 RAID 再分区」的两层操作。缺点是失去了一些灵活性:结构一旦定下,改动成本高(RAIDZ 换结构基本等于重建)。

三条RAID路线

家用方案的实际建议

给一个明确的结论。如果你用 TrueNAS 或者飞牛,直接 ZFS mirror 或 RAIDZ,别想着加阵列卡。如果你用 OMV,mdadm 加 ext4/Btrfs,有些主板自带 RAID 功能(所谓主板 RAID)——一律不用,那是「软 RAID 穿了件硬马甲」,跨系统兼容反而更差。如果你用 unRAID,传统阵列或者 ZFS 池任选,系统怎么做就怎么做。

什么时候才真需要阵列卡?先问自己一个问题:你是在组家用存储,还是在重建机房。只有一种家庭边缘场景:主板 SATA 口不够,又想用最便宜的方式扩展出大量盘位。这时买一张不带缓存的 HBA 卡( flashed 成 IT 模式直通固件),把盘直通给系统用,是正确姿势——它不是阵列卡,只是「SATA 扩展卡」,所有阵列逻辑仍然在系统里。

还有一类常见疑问:「主板自带 RAID 算硬 RAID 吗?」严格说算,但它是「假的硬 RAID」:校验计算其实在驱动里做,元数据和私有软 RAID 差不多,却继承了硬 RAID 的全部缺点——跨系统不认、换主板大概率掉阵列、Linux 里还要靠 dmraid 翻译。结论还是那条:用系统的软 RAID,别用主板 BIOS 里的 RAID 选项。

换盘与重建的完整流程

无论哪种方案,换盘都是迟早的操作,标准流程在这里。

第一步,坏盘定位:看 SMART 状态、看阵列降级提示、看面板的硬盘灯。第二步,热插拔换上新盘(关机换也行,但热插拔不影响其他盘供电,更稳)。换盘时注意新盘容量不能小于旧盘,否则重建会失败或者空间缩水。第三步,把新盘加入阵列,开始重建。重建期间系统可以正常使用,但速度下降是必然,建议别同时跑大文件写入。第四步,重建完成后跑一次完整校验(scrub 或者一致性检查),确认整个阵列健康。

硬盘故障处理流程

重建最忌讳一件事:中途断电或者又坏第二块盘。重建期间阵列是「裸奔」的(冗余已经被消耗),所以家里有 UPS 在这个时刻价值最大。另外重建大容量盘动辄十几个小时,安排在睡前开始是常见做法。如果白天要用 NAS,重建速度可以适当限速,给前台留出性能;深夜再把限速放开。这是 mdadm 和 ZFS 都有的调速参数,值得花两分钟配好。

给新手的最后忠告

别在 RAID 上叠 RAID。有些新手觉得「RAID1 套 RAID0 就有了 RAID10 的速度」,在家用工具里手动这么搭,元数据层层套娃,排障时候哭都找不着调。同理,也别在家用场景追求 RAID50、RAID60 这种企业级结构,家用盘位根本撑不起它的意义。需要 RAID10 就直接建 RAID10(软 RAID 支持),或者用 ZFS 的多组 mirror。

别用不同批次同型号的盘组阵列但期望它们「一起坏一起换」,关联故障是阵列的头号杀手。能做到的话,记录每块盘的购买日期,建立一张简单的「硬盘台账」,换代和排障时都用得上——坚持记三个月,你会感谢自己;坚持不了,SMART 里的通电时间也会替你记着。同批次盘确实有集体故障的关联风险,更好的做法是混用不同品牌或购买日期相近但不同批的盘,降低同因故障概率。这是数据中心都在用的常识,另一个借鉴是「热备盘」:阵列里始终留一块已加入但待命的盘,故障发生时系统自动开始重建,把你的响应时间从「周末才有空」压缩到几分钟。重要数据阵列值得配一块。

阵列配好之后,远程管理是日常,SSH 基础见 ssh;想给 Linux 加图形面板的可以看 bt2017。

一句话总结

家用存储没有「贵的就是好的」,只有「透明的才是稳的」。把阵列逻辑留在系统里、留在你能看见的地方,这是软 RAID 和文件系统 RAID 送给家庭玩家的最大礼物。选硬件还是选透明,这道题的答案在二十年前和今天一样:透明的赢。

延伸阅读

  • 下一章《SMB 与 NFS 共享的配置》:阵列就绪后,开始配共享
  • ssh:看阵列状态、换盘重建都在远程终端完成
  • bt2017:图形化服务器面板,适合不熟悉命令行的读者