做了这么多年服务器运维,RAID 磁盘阵列和 LVM 逻辑卷管理这两样东西几乎每天都在打交道。不管你是给戴尔 R740 做阵列,还是被 LVM 分区报 IO 错误折磨到怀疑人生,底层都离不开“存储怎么分层”这件事。这篇文章我不打算讲教科书式的概念,只讲我在真实服务器上踩过的坑、验证过的命令、以及现在遇到类似问题会怎么处理,希望能给正在折腾 RAID 和 LVM 的你一点参考。
1. RAID 卡和磁盘阵列:先搞清楚你手上是什么硬件
1.1 硬 RAID 与软 RAID 的差别:为什么“阵列卡”不是万能的
很多刚接触服务器的人会以为“做 RAID”就是进 BIOS 按几个键,其实这里面差别很大。先分清硬 RAID 和软 RAID。
硬 RAID 靠一块独立阵列卡,卡上有专用处理器和缓存,系统看到的是一个逻辑磁盘,所有校验计算都由卡完成。优点是性能稳定、不占 CPU、支持掉电保护(前提是卡带电池或电容)。缺点是卡一旦坏掉,如果没有同型号卡,数据恢复会非常痛苦。
软 RAID 则是由操作系统在驱动层面实现,比如 Linux 里的 mdadm。它不依赖特定硬件,普通 PC 也能组 RAID,但会消耗 CPU 资源,而且性能不如硬 RAID 稳定。还有一种常见的“主板 RAID”,也就是 BIOS 里那个 RAID On 选项,它多数是软硬结合的“fakeraid”,靠主板芯片组提供驱动,Windows 下看起来像硬 RAID,实际上处理逻辑还是软件层在做。
这里要说清楚一个关键点:如果你只是为了“让系统能安装”而打开 RAID On,却没有真正创建任何阵列,那它就是一块普通的“兼容模式”控制器。这也是为什么很多人戴尔电脑把 SATA Operation 从 RAID On 改成 AHCI 后进不了 Windows 的原因——不是阵列坏了,而是系统启动时加载的驱动不匹配,后面第 2 章我会讲怎么处理。
1.2 常见阵列卡型号与接口规范:从 PERC H700 到 5350-8i
做服务器运维,你会遇到很多阵列卡型号。戴尔那边最常见的是 PERC 系列,比如 H700、H730、H740P,浪潮那边则有 5350-8i、2230-10i、3260-LP-18i-8GB 这些。名字看着复杂,其实核心信息就三个:接口类型、通道数、是否支持 RAID 级别。
以浪潮 5350-8i 为例,“8i”表示内部 8 端口,可以接 8 块 SAS/SATA 盘;“18i”则意味着更多内部通道。这些卡都走 PCIe 接口,有 x8 或 x4 的。新一代卡基本是 PCIe 4.0 x8,比如 PERC H750 这类,如果你把这类卡插到老服务器的 PCIe 3.0 插槽上,通常也能用,但带宽会降,实际效果相当于跑在 3.0 x8 上,对于大多数机械盘阵列来说性能瓶颈不在卡上,问题不大。
还有一点容易忽略:RAID 卡的金手指要插到底,尤其是那种带辅助供电的卡,必须把 4 针或 6 针电源线接好,否则开机后卡会报错,甚至无法识别。我遇到过一台浪潮 NF5280M5,折腾半天阵列不识别,最后发现是卡上的供电线松了,重新插拔后一切正常。
1.3 服务器磁盘阵列怎么做:开机进 RAID 卡 BIOS 的标准流程
先说通用流程,不同厂商的卡入口不一样,但逻辑几乎一样。常见的是开机自检时按 Ctrl+R 进入 MegaRAID BIOS,或者按 Ctrl+C 进入 LSI 配置界面,戴尔服务器也可以在 F2 进 System Setup 后进入 PERC 配置。浪潮 NF5280M5 的 2021 版固件配置 RAID 也是类似路径:开机提示按 Ctrl+R,或者通过 iBMC 远程控制台进入。
进入阵列卡管理界面后,创建阵列的步骤通常是:
- 找到
Virtual Drive Management或Configuration Wizard,选择New Configuration。 - 选择要加入阵列的物理磁盘,注意看清盘位对应关系,别把系统盘和数据盘搞混。
- 选择 RAID 级别:RAID 0 是条带,RAID 1 是镜像,RAID 5 是单盘校验,RAID 6 是双盘校验,RAID 10 是镜像加条带。
- 设置条带大小(Stripe Size),默认 64KB 或 256KB,大多数场景用默认就行;如果跑数据库,建议选 64KB 或 128KB。
- 初始化阵列,可以选
Fast Init或Full Init。生产环境建议做全初始化,虽然慢,但能提前发现坏块。
很多人在这一步会犯一个错误:系统盘和数据盘放在同一个 VD(Virtual Disk)里,后面系统崩溃想重装,数据也跟着遭殃。我的习惯是系统盘单独用两块盘做 RAID 1,数据盘单独用四块盘做 RAID 10 或 RAID 5,再在数据卷上做 LVM。这样相互隔离,扩容、重装都方便。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 阵列卡驱动才是第一个坑:官方 ISO 装系统找不到磁盘
2.1 为什么 ESXi/Windows 安装时看不到 RAID 卷
你新拿一台联想 ThinkSystem 服务器,打算装 ESXi 7.0,官方 ISO 也下了,引导也成功了,结果到了选择存储那一步,空空如也。这时候你多半会怀疑阵列做错了,实际绝大多数情况是驱动问题。
VMware 官方 ISO 只包含常见的 MegaRAID、LSI 驱动,一些较新的阵列卡驱动并没有内置进去。比如某些 OEM 型号、或者较新固件的阵列卡,ESXi 安装程序不认,所以看不到由 RAID 卡虚拟出来的磁盘。
Windows 安装同理,如果你的 RAID 卡比较新,原版 Windows ISO 里没有对应的 drivers,安装界面就会显示“找不到任何驱动器”。这种情况下,你需要手动加载厂商提供的驱动文件,或者在安装前把驱动注入到 ISO 里。
2.2 给官方 ISO 补驱动的保姆级步骤
以 ESXi 7.0 为例,最省事的方案是用厂商定制的 ISO,戴尔、浪潮、联想都有针对自家服务器的定制镜像,里面包含了阵列卡驱动。如果你只能用官方 ISO,那就需要自己把驱动 VIB 包打进去。
我常用的方法是:在 Windows 机器上装好 VMware PowerCLI,然后用 New-EsxImageProfile 和 Export-EsxImageProfile 命令重新打包。大致流程是:
- 下载官方 ESXi 7.0 ISO 和阵列卡厂商提供的 offline bundle(通常是
.zip文件)。 - 打开 PowerShell,导入 PowerCLI 模块。
- 用
Add-EsxSoftwareDepot分别添加 ISO 和 offline bundle 的 depot。 - 复制想要的 Image Profile,把驱动通过
Add-EsxSoftwarePackage添加进去。 - 导出成新的 ISO。
命令序列大概长这样:
powershell复制Add-EsxSoftwareDepot .\ESXi700-202107001.zip
Add-EsxSoftwareDepot .\raid-driver-offline-bundle.zip
$profile = Get-EsxImageProfile -Name "ESXi-7.0U1-standard"
$newProfile = New-EsxImageProfile -CloneName "ESXi-7.0U1-with-raid" -CloneFrom $profile
Add-EsxSoftwarePackage -ImageProfile $newProfile -SoftwarePackage "厂商VIB包名"
Export-EsxImageProfile -ImageProfile $newProfile -ExportToIso -FilePath .\ESXi-7.0U1-with-raid.iso
如果你没有 PowerCLI 环境,也可以试试 ESXi-Customizer 这类第三方工具,但要注意老工具不一定兼容 7.0 之后的版本。另外,把驱动打包进 ISO 后再去服务器安装,不仅安装界面能看到阵列磁盘,装完的系统也会自动带上驱动,省去事后手动加载的麻烦。
Windows 下的做法类似,你可以用 dism 命令把驱动注入到 boot.wim 和 install.wim 里,也可以在安装过程中引导到“加载驱动程序”界面,选择 U 盘里的驱动文件。我自己的经验是:临时装机用安装界面加载驱动最快,长期维护还是做一个带驱动的定制 ISO 更省事。
2.3 从“RAID On”改成 AHCI 无法进入系统的问题
这个现象在戴尔电脑和服务器上尤其常见:BIOS 里 SATA Operation 一直选的 RAID On,Windows 也能正常启动。但有人为了用 NVMe 或者改系统配置,把模式切成 AHCI,重启直接蓝屏或卡在启动界面。
原因很简单:Windows 在 RAID On 模式下安装时,磁盘控制器走的是 RAID 驱动(比如 iaStorV、storahci),切换到 AHCI 后,系统没有启用对应的 AHCI 驱动,启动阶段直接找不到启动盘。
解决办法也不复杂,在切换模式之前,先在 Windows 里把 AHCI 驱动启用。
以管理员身份打开 CMD,执行:
cmd复制reg add "HKLM\SYSTEM\CurrentControlSet\Services\storahci" /v Start /t REG_DWORD /d 0 /f
如果你用的是 Intel 平台,可能还需要处理 iaStorV 服务,同样把它的 Start 值改为 0。然后关机,BIOS 里从 RAID On 切成 AHCI,再开机就能正常进入系统。
如果你已经切了 AHCI 并且进不了系统,那就把 BIOS 调回 RAID On,先进系统改注册表,再切回 AHCI。整个过程不需要重装系统。需要提醒的是,如果你在 RAID On 模式下确实创建了阵列卷,那不要随便切 AHCI,否则阵列元数据可能因为模式切换而被忽略,虽然数据还在,但系统会认为是一堆“未识别”的盘。
3. LVM 逻辑卷管理:把磁盘空间变成可以随意调度的资源池
3.1 PV/VG/LV 三层结构:一个生活化的类比
LVM(Logical Volume Manager)对我来说,就像是把几块硬盘合并成一个“空间池”,再从池子里切出若干个“房间”给系统用。这里三层结构缺一不可:
- PV(Physical Volume):物理卷,就是把一块物理磁盘或分区初始化为 LVM 可识别的单元,相当于把毛坯房纳入物业管理。
- VG(Volume Group):卷组,把多块 PV 汇集成一个大的空间池,相当于整栋楼的可用面积。
- LV(Logical Volume):逻辑卷,从 VG 里划分出来的一个块设备,相当于一套具体户型,系统在它上面格式化文件系统后就能挂载使用。
这个设计的最大好处是:当某个分区不够用时,不用重新分区,只要 VG 里还有空闲空间,直接给 LV 扩容就行。配合 RAID 使用,相当于底层阵列负责数据安全,LVM 负责空间弹性。
3.2 创建 LVM 的完整命令流程
假设你刚做好 RAID 阵列,系统里能看到一块 /dev/sdb(可能是 RAID 卡虚拟出来的一个 4TB 逻辑盘),你想把它作为数据盘,用 LVM 管理。
第一步,创建 PV:
bash复制pvcreate /dev/sdb
第二步,创建 VG:
bash复制vgcreate vg_data /dev/sdb
如果有多块盘,也可以一次性加进去:
bash复制vgcreate vg_data /dev/sdb /dev/sdc
第三步,创建 LV。比如从 vg_data 里分配 1TB 给某个业务:
bash复制lvcreate -L 1T -n lv_web vg_data
第四步,格式化并挂载:
bash复制mkfs.xfs /dev/vg_data/lv_web
mkdir /data
mount /dev/vg_data/lv_web /data
注意,XFS 格式化成之后,如果想缩容,XFS 是不支持的;ext4 虽然支持缩容,但风险较高,我几乎不敢在生产环境操作。所以创建 LV 的时候,我习惯一开始只分配预期大小的 70%,后面按需扩展,这样反而更灵活。
3.3 LVM 扩容:从 VG 有空间到在线扩容文件系统
扩容是 LVM 最常用的功能,也是很多人最容易搞混顺序的地方。先说最简单的情况:VG 里还有空闲空间。
查看 vg_data 里还有多少可用:
bash复制vgs
比如 Available 显示还有 500G,那么给 lv_web 增加 100G:
bash复制lvextend -L +100G /dev/vg_data/lv_web
注意,lvextend 只改 LVM 逻辑卷大小,文件系统还停留在原来的容量。所以接下来必须同步扩展文件系统:
- XFS 用
xfs_growfs:
bash复制xfs_growfs /data
- ext4 用
resize2fs:
bash复制resize2fs /dev/vg_data/lv_web
我见过不止一次有人只执行了 lvextend,忘记了文件系统扩容,然后来问“为什么 df -h 没变化”。这一步非常关键,扩容后要养成习惯跑一下 df -h 确认。
如果 VG 里没有空间了,那就得先加新盘:
bash复制pvcreate /dev/sdd
vgextend vg_data /dev/sdd
lvextend -L +100G /dev/vg_data/lv_web
xfs_growfs /data
这里要提醒一句:如果 /dev/sdd 实际上是从 RAID 卡里扩展出来的新虚拟磁盘,那么你得先在阵列卡层面把容量加进去(比如把 RAID 5 的 VD 扩充),等操作系统识别到新块设备后再 pvcreate。顺序反了的话,系统根本看不到新空间。
4. LVM 报 IO 错误:八成不是 LVM 的问题
4.1 一个“LVM 分区老是报 IO 错误”的排查过程
有段时间我经常接到同事求助,说服务器里 lvs 或 vgs 命令一执行就卡住,系统日志里疯狂刷 buffer I/O error on device dm-0、blk_update_request: I/O error 这类信息。第一反应都是“LVM 出问题了”,但说实话,LVM 作为一层映射,它自己不会平白无故报 IO 错误,八成是底层磁盘或 RAID 阵列出了问题。
我印象最深的一次,是有台服务器跑着 PostgreSQL,数据盘是 LVM 逻辑卷,某天 vgs 直接 hang 住,等半天才返回,而且一直报 IO error。当时我先看了 dmesg,发现里面有很多异常扇区读写失败的信息,再一查 RAID 卡状态,发现有一块盘已经是 Offline 状态。好在阵列是 RAID 10,数据没丢,但系统已经因为坏盘导致读写性能骤降。
排查思路其实很简单:先用系统日志定位是哪块磁盘在报错,再看 RAID 卡的健康状态,最后用 SMART 工具确认磁盘寿命。千万别一上来就想着把 LVM 删掉重建。
4.2 底层磁盘/RAID 状态检查:smartctl、dmesg、RAID 卡日志
第一步,看内核日志:
bash复制dmesg -T | grep -i "I/O error"
或者用 journalctl:
bash复制journalctl -k --since "1 hour ago" | grep -i "error"
如果能看到具体是 /dev/sdb、还是 /dev/dm-0 报错,就能缩小范围。/dev/dm-0 是 device mapper 设备,也就是 LVM/RAID 映射出来的虚拟设备,真正物理介质还是底层磁盘。
第二步,用 RAID 卡管理工具查看物理盘状态。MegaRAID 系的卡普遍支持 storcli,比如:
bash复制storcli /c0 show
如果卡比较旧,可以用 MegaCli64 或厂商的 perccli:
bash复制perccli /c0 /eall /sall show
关注的是每个盘位的 State:Online、Rebuild、Offline、Failed。只要出现 Offline 或 Failed,基本就能确定问题盘了。
第三步,用 SMART 看磁盘健康:
bash复制smartctl -a /dev/sdb
重点看 Reallocated_Sector_Ct、Pending_Sector、UDMA_CRC_Error_Count 这几项。如果重映射扇区数持续增长,说明盘已经在物理老化,尽早更换。
4.3 如何避免把普通磁盘故障误判成 LVM 配置问题
我也见过一些新手,看到 vgreduce 或 pvremove 能解决“IO 错误”,就跑去把出错的 PV 从 VG 里踢掉,结果数据直接没了。这里必须强调:LVM 元数据里记录了 PV 与 LV 的映射关系,在底层磁盘还没稳定之前,千万不要做任何 vgreduce --removemissing 或 pvremove 操作。
正确做法是:
- 让故障盘所在的 RAID 阵列先重建,把坏盘换掉,等 RAID 状态恢复到 Online。
- 确认 LVM 能正常看到全部 PV,再用
vgs、pvs检查状态。 - 如果需要移除某块盘,先确保数据已经迁移或备份,再做
pvmove。
另外,如果只是个别扇区损坏,但 RAID 卡还能撑住,可以先用 dd 或者 ddrescue 做整盘镜像备份,再决定怎么修。我自己吃过一次亏:坏盘出现 IO 错误后,我直接用 pvremove 想清掉重做,结果 PV 上还有部分未迁移的 LV 数据,直接导致业务数据丢失。后来再遇到 IO 错误,我严格按照“先备份、再换盘、后重建”的顺序来操作,再没出过问题。
5. RAID + LVM 结合使用:存储规划与避坑经验
5.1 到底要不要用 RAID 卡?ZFS 不用 RAID 卡真的更好吗?
这是很多人在社区里争论的话题,尤其是跑 ZFS 的用户,经常说“ZFS 不用 RAID 卡更好”。这个说法的核心在于:ZFS 本身有完整的校验、冗余和修复机制,它希望直接管理每一块物理磁盘,而不是被 RAID 卡抽象成一个“黑盒”。
如果你把 ZFS 跑在 RAID 卡创建的 RAID 5/RAID 6 上,会出现两层冗余叠加的情况:底层 RAID 卡做一次校验,上层 ZFS 又做一次校验,不仅浪费空间,而且一旦底层 RAID 卡出现一致性错误,ZFS 反而无法感知真实盘的健康状况,恢复能力大打折扣。
所以我的建议是:如果你确定要用 ZFS,尽量让 RAID 卡工作在 HBA/IT 模式,也就是直通模式,或者干脆换一张不带 RAID 功能的 HBA 卡,让 ZFS 直接看到每块物理盘。如果设备上只有普通 RAID 卡,又不是特别新的型号,可以看看有没有 JBOD 模式,把每块盘单独做成一个 RAID 0 VD,也能达到类似直通的效果,但要注意别让 RAID 卡的缓存策略干扰 ZFS 的写入。
反过来,如果你不用 ZFS,而是用 ext4/XFS + LVM 这种传统方案,那底层用硬 RAID 卡是很合适的。不要试图在 LVM 里做“软 RAID”再去叠加物理阵列,冗余层次太多只会让故障排查变得异常复杂。
5.2 多块盘怎么组 RAID 再切 LVM:容量规划建议
我最近给一台戴尔 R740 做规划时,手里有 8 块 1.2TB SAS 盘,最终方案是:
- 2 块盘做 RAID 1,装系统,跑 /boot 和 /。
- 6 块盘做 RAID 10,得到一个约 3.6TB 的虚拟磁盘。
- 在这块 RAID 10 虚拟盘上创建 LVM,切成
/data和/backup两个 LV。
为什么要选择 RAID 10 而不是 RAID 5?因为这台机器跑的是 MySQL 数据库,随机写比较多,RAID 5 的写惩罚(write penalty)在随机写入场景下非常明显,RAID 10 虽然可用容量减半,但性能和恢复速度都更有保障。
容量规划时还要注意 RAID 卡条带大小和文件系统块大小的匹配。如果你在 RAID 卡里把条带设成 256KB,而文件系统用默认 4KB 块,可能会出现小块写放大。通常数据库场景,RAID 卡条带选 64KB 或 128KB 比较稳妥;普通文件共享、虚拟化存储,用 128KB 或 256KB 也能接受。LVM 的 PE 默认 4MB 一般不用改,它和文件系统块大小没有直接冲突。
5.3 几个我踩过的坑:缓存、扩容顺序、元数据损坏
最后分享几个在我实际运维中真正踩过的坑,这些很难在文档里看到,但对生产环境影响很大。
第一个坑是 RAID 卡的缓存策略。如果没有 BBU(电池备份单元)或电容,开 Write Back 模式很危险,一旦意外断电,RAID 卡缓存里还没落盘的写数据可能全部丢失。所以我给只有普通缓存、没有电池保护的卡做配置时,一律用 Write Through。有 BBU 的卡才敢开 Write Back,并且要定期检查 BBU 的状态,别等到断电后才发现电池早就失效了。
第二个坑是扩容顺序。我见过有人直接在操作系统里用 fdisk 把 RAID 虚拟盘删了重新分区,然后 lvextend,结果系统崩溃。正确的顺序必须是:先通过 RAID 卡管理界面扩展 VD(或者加入新盘重配阵列)→ 让操作系统识别到新空间 → 如果是整块盘扩容,用 pvresize 更新 PV 大小 → 再 lvextend → 最后扩容文件系统。任何一步顺序颠倒,都可能造成 LVM 元数据和分区表不一致。
第三个坑是阵列初始化期间就急着创建 LVM。RAID 卡在做后台初始化或一致性检查时,磁盘性能会明显下降,但 LVM 操作通常能成功,只是很慢。可如果你在这个阶段强行执行大量写入,碰到扇区异常,LVM 的元数据就可能写入失败,导致 PV 标记为不完整。稳妥的做法是等阵列初始化完成(通常可以看 RAID 卡管理界面的百分比进度)再创建 PV/VG。
还有一个容易被忽略的细节:很多服务器安装系统时会自动创建 LVM,比如 CentOS/RHEL 默认的 /dev/mapper/cl-root。这种系统自带的 LVM 卷组,在扩盘时同样要遵循先加 PV、再扩 VG、再扩 LV 的顺序,而且一定要搞清楚默认 VG 名称,别不小心操作了业务数据卷组。
在我多年的使用经验里,RAID 负责“扛盘”,LVM 负责“调空间”,两者配合好了,绝大多数存储扩容、坏盘替换都能在不宕机的情况下完成。唯一要牢记的是:任何底层存储操作之前,先备份重要数据,RAID 不是备份,LVM 的灵活性也不是乱操作的理由。如果你正在折腾服务器阵列或者被 LVM 问题困扰,希望这篇文章能帮你少走几次弯路。
