拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

storcli实战:从JBOD到RAID的硬盘模式转换完整指南

storcli实战:从JBOD到RAID的硬盘模式转换完整指南 前阵子处理一台老服务器阵列卡是 LSI 的 MegaRAID所有硬盘都处于 JBOD 模式系统能直接看到每一个盘。后来想把这批盘重新组一个 RAID 阵列就得用 storcli 把硬盘从 JBOD 模式切换到 RAID 模式。这个操作听起来简单其实中途有不少坑比如盘状态识别错误、Foreign 配置干扰、初始化策略不对都会让整件事卡住。这篇东西就把我实际操作的完整过程记录下来包括环境确认、storcli 安装、命令细节和排错记录适合 Linux 运维、服务器存储维护以及那些喜欢折腾二手服务器、想自己组阵列的朋友参考。1. 为什么要把 JBOD 盘转成 RAID 模式1.1 JBOD 和 RAID 模式到底差在哪JBODJust a Bunch Of Disks在 LSI RAID 卡上是一个特殊的直通模式。阵列卡开启 JBOD 功能后物理硬盘对操作系统是“透明”的系统能直接看到 /dev/sda、/dev/sdb 这样的独立设备就像硬盘直接插在主板上一样。RAID 卡在这个过程中基本不参与数据组织只是把 SATA/SAS 信号转发给系统。RAID 模式则完全不同。硬盘一旦被纳入 RAID 阵列阵列卡会在每块盘上写入 RAID 元数据DDF 格式然后通过逻辑卷Virtual Drive的方式呈现给系统。操作系统只能看到一个统一设备比如 /dev/sda而它背后是由多块物理盘组成的 RAID5 或 RAID10。这个逻辑卷和物理盘之间的映射关系全部由阵列卡上的固件管理。你可以把 JBOD 想象成一条畅通的公路硬盘的数据直接从这里进去RAID 模式则像一个收费站所有车辆必须经过阵列卡统一调度才能进入逻辑卷。对于普通的单盘使用场景JBOD 简单直接但当你需要冗余、热备、跨盘扩容时JBOD 模式就完全帮不上忙了。1.2 什么场景需要做这个转换最常见的情况是服务器刚开箱或者拿到二手设备时Raid 卡默认开启了 JBOD 功能。装机的人图省事直接在这个状态下把系统装到单块盘上数据盘也是直通的。等用了一段时间发现单盘没有冗余或者想利用阵列卡做 RAID5 扩容就必须把盘从 JBOD 模式转换回 RAID 模式。还有一种情况是盘被误设置为 JBOD。有些 LSI 卡的 BIOS 配置界面里开启 “Enable JBOD” 之后新插入的物理盘会自动变成 JBOD 状态而不是常见的未配置好Unconfigured Good状态。如果直接创建虚拟磁盘命令可能报错因为盘的状态根本不对。这时候就要先处理盘的状态再创建阵列。适合看这篇内容的人群很明确Linux 服务器的运维人员、自己组 NAS 或二手服务器的发烧友以及任何用了 LSI/Broadcom MegaRAID 阵列卡、发现硬盘被直通但想改成阵列模式的人。整个过程不依赖操作系统里的图形界面纯命令行操作批量处理、远程操作都非常方便。2. 动手前的环境确认控制器、盘位和 storcli 安装2.1 确认阵列卡型号与固件网上很多教程上来就让你执行 storcli 命令但实际环境中第一步应该是确认阵列卡型号和固件版本因为旧卡和部分刷过直通固件的卡对 storcli 的支持情况完全不一样。先看控制器信息storcli show如果是 LSI/Broadcom 的 MegaRAID 控制器输出里能看到Product Name、SAS Address、FW Version、Driver Version这些关键信息。例如常见的 LSI MegaRAID 9361-8i 会显示产品名和固件版本号这个版本号决定了你后续能否使用某些特性比如 RAID6、CacheCade、JBOD 开关。如果执行 storcli 显示 “No controllers found”说明系统里装的不是 MegaRAID 卡或者驱动没加载。常见的 SAS 直通卡比如 LSI HBA 9211-8i 刷了 IT 固件的版本虽然芯片一样但固件被刷成了直通模式根本不是一个 RAID 控制器。之前我遇到过一台机器H310 被刷成了 IT 固件系统里怎么执行 storcli 都看不到控制器后来查资料才确认这种卡只能直通没法建阵列。遇到这种情况要么刷回 IR/RAID 固件要么换一张真正的阵列卡。确认完控制器再看设备是否有电池或电容备份单元storcli /c0 /bbu show这里有个值得注意的细节如果 BBU 正在充电或者处于学习周期有些固件版本会拒绝创建新的虚拟磁盘。我就是因为这个原因卡过一次明明命令语法没问题却一直报错后来查日志才发现是电池在充电。把这个信息提前确认好可以少走弯路。2.2 用 storcli 查盘状态阵列卡确认没问题接着就要看每块盘的当前状态。这一步是整个转换操作中最重要的前置检查。storcli /c0 /eall /sall show输出里每个盘会有一个 EID:Slt 的组合编号比如252:0表示 enclosure 编号 252、槽位 0。重点关注 Role 和 State 两列。JBOD 模式下盘的 Role 列显示JBODState 列通常也是JBOD。如果盘之前被单独配置过可能是UGoodUnconfigured Good状态表示一块未加入任何阵列的裸盘状态良好可以直接创建 RAID。这里要特别提醒不要只看盘符。有些人直接在 Linux 里用fdisk -l看发现盘上有分区就以为数据一定在里面。实际上JBOD 模式下系统看到的盘是原生的分区确实存在但如果你创建 RAID阵列卡会在盘头写入元数据原来的分区表和文件系统会被当成无效数据丢弃。这一点我会在后面的备份部分详细说。查看盘状态的完整命令还可以加all参数得到更细的信息storcli /c0 /eall /sall show all可以看到盘的温度、序列号、转速、SAS 地址等。对于确认哪块盘对应哪个槽位很有帮助。比如服务器上有 8 块盘你在机器面板上看到第三槽位是空的但系统里看到252:2有盘通过序列号就能确认是不是真的插错了位置——别问我为什么会知道这个场景很常见机房插错盘位的事情太多了。2.3 storcli 的下载与安装不同环境下安装方式不同而且 storcli 有不同的平台版本服务器上装哪个要根据系统来。对于 Debian/Ubuntu 系统下载 .deb 包后安装dpkg -i storcli_1.18.xx_all.deb对于 RHEL/CentOS/Rocky 系统用 rpm 包rpm -ivh storcli-1.18.xx-1.noarch.rpm安装完成后可执行文件通常在/opt/MegaRAID/storcli/storcli或/usr/local/bin/storcli有些发行版还会自动建一个storcli64软链接。Windows 服务器也有对应版本需要在命令行里执行storcli64.exe命令格式基本相同。顺便提一句Broadcom 官方还出了 LSI Storage Authority简称 LSA这种图形化管理工具可以在浏览器里管理阵列卡。但我的建议是日常运维还是用 storcli因为它的输出格式稳定、便于脚本化一条命令就能批量处理十几个盘图形界面反而在远程操作时比较麻烦。下载 storcli 有个注意点Broadcom 官网下载需要注册登录国内网络环境访问也不算快。如果嫌麻烦可以找一些可信的软件仓库镜像或者直接用 MegaRAID 驱动包里自带的版本。无论从哪下载安装完先跑一下storcli -v确认版本版本太老的固件可能不支持某些新命令参数到时候排错会非常痛苦。3. 核心实操从 JBOD 到 RAID 的完整过程3.1 备份这次操作会破坏数据这句话我要放在最前面而且会重复强调把 JBOD 盘转成 RAID 模式本质上是让阵列卡接管这块盘的管理权阵列卡会在盘上写入 RAID 元数据原有分区表会失效文件系统里的数据在没有完全备份的情况下恢复难度极大。具体原因是这样的JBOD 模式下盘面上的数据区块是直接按普通磁盘布局排列的系统可以直接解析。创建 RAID 后RAID 卡把盘改了 DDF 元数据结构盘上载荷数据被当成“数据区块”去映射但原来的分区信息已经被破坏。对于 RAID1 这种镜像可能还有救但对于 RAID5、RAID0 这种跨盘条带化数据分布方式彻底改变普通文件系统工具根本无法直接读取。所以备好份再动手。备份方式有很多最简单的就是把这块盘单独挂载到一台正常的 Linux 机器上用 dd 做成块级镜像或者直接 cp 文件到另一块盘。如果数据量太大至少保证关键数据已单独拷贝。在实际工作中我见过太多人跳过这一步最后数据丢了才来后悔。这块敲黑板千万别侥幸。3.2 关闭 JBOD 直通开关让阵列卡接管硬盘确认数据备份完成后开始动真格的。首先关闭阵列卡的 JBOD 功能。在 storcli 里直接执行storcli /c0 set jbodoff这个命令的意思是把控制器级的 JBOD 开关关掉。执行后阵列卡会停止把未配置盘直接透传给操作系统系统里原来通过直通看到的 sda、sdb 设备会消失这是正常现象不用担心。再执行一次磁盘查看命令storcli /c0 /eall /sall show这时候原来的 JBOD 盘状态会变成 Ready 或者 UGood表示它已经回到阵列卡的管理范围内可以参加阵列组建。还有一点要注意有些老 LSI 卡固件不支持set jbodoff这个参数会报 “Command not supported”。这时候需要进入阵列卡 BIOS 配置界面开机时按 CtrlH 进入 WebBIOS或者 CtrlR 进入传统配置界面找到 “Enable JBOD” 选项手动关闭。具体快捷键根据固件类型不同一般在启动阶段屏幕会提示。很多二手服务器默认开 JBOD改完保存后重启即可。如果系统里还有其他用 JBOD 直通装的系统盘关了 JBOD 后系统会起不来因为引导设备已经不可见了。所以操作前一定要确认登录方式比如通过 IPMI/iDRAC 远程控制台或者用 U 盘引导系统再操作否则可能把自己锁在外面。3.3 用 storcli 创建 RAID 阵列现在盘的状态是 Ready/UGood可以创建虚拟磁盘了。常用命令格式如下storcli /c0 add vd typeraid1 nameOS drives252:0,252:1 storcli /c0 add vd typeraid5 nameDATA drives252:2,252:3,252:4type 参数指定 RAID 级别常见的 raid0、raid1、raid5、raid6、raid10具体支持哪些取决于阵列卡硬件和固件。drives 参数指定物理盘格式是 EID:Slot比如 252:0 代表 enclosure 252 的 0 号槽位。name 参数给虚拟磁盘起个名字方便后续管理识别。还需要注意写策略参数的设置。常用参数包括wt # Write Through写穿 wb # Write Back写回 ra # Read Ahead预读 nora # 关闭预读 direct # Direct IO直通 IO一般生产环境用wb写回模式性能更好但如果 BBU 状态不好固件可能会自动禁止wb。创建时可以直接指定storcli /c0 add vd typeraid5 nameDATA drives252:2,252:3,252:4 wb direct还有一个可选项是热备盘。比如给 RAID5 阵列配一块全局热备盘storcli /c0 add vd typeraid5 nameDATA drives252:2,252:3,252:4 spares252:5这样创建出来的阵列如果某块盘故障热备盘会自动顶上重建省去人工干预的时间。对于数据重要但没时间随时盯着机器的场景建议加上。创建阵列成功后会返回一个结果包含 Virtual Drive 编号通常从 0 开始。执行storcli /c0 /v0 show可以看到虚拟磁盘的 RAID 级别、容量、状态和盘成员。如果显示的容量不符合预期先检查盘是不是有残留元数据或者固件能不能完整支持这个 RAID 级别比如某些入门阵列卡创建 RAID6 时会报容量错误。3.4 初始化和验证创建虚拟磁盘后阵列卡会自动开始后台初始化Background Initialization或者手动触发初始化。初始化的目的是让 RAID 卡把整个逻辑卷的校验数据针对 RAID5/6或者镜像关系针对 RAID1建立起来。这个过程中盘表面的数据会被顺序填充你可以理解为像是给一本新书排页码虽然内容还是空白的但结构已经搭好了。查看初始化进度storcli /c0 /v0 show init输出会显示Init% complete之类的内容实际看到的是像[5:10:20]这样的时间戳加上进度百分比。如果是 RAID5 或 RAID6初始化时间会比较长一块 4TB 盘可能要跑几个小时甚至一晚上这很正常。如果创建完成后没有自动初始化可以使用storcli /c0 /v0 start init初始化完成后再确认一次状态storcli /c0 /eall /sall show storcli /c0 /v0 show这时盘的状态应该变成OnlnOnline在线虚拟磁盘状态是OptlOptimal正常。如果状态显示DegDegraded降级说明有盘掉线或者初始化还没完成需要进一步排查。初始化期间系统可以正常读写虚拟磁盘但性能会受影响。如果初始化由阵列卡在后台执行CPU 开销不大但盘 IO 压力比较明显。我一般会建议在业务低峰期做这个操作以免影响线上服务。4. 常见问题与排查技巧实录4.1 Foreign 配置干扰创建阵列这是切换模式过程中最让人头大的一个问题。如果插进服务器里的盘之前属于另一个 RAID 阵列重新创建虚拟磁盘时阵列卡可能会识别到 Foreign Configuration外来配置导致创建命令报错。排查命令storcli /c0 /fall show如果显示有 Foreign 配置你可以选择导入或者删除。如果这些盘上的数据已经确认不要了直接删除storcli /c0 /fall delete如果还想保留原来阵列里的数据需要导入storcli /c0 /fall import需要特别提醒的是导入外来配置时盘会重新变成原来的阵列成员整个虚拟磁盘会完整出现。但如果你只是想用这些盘建新阵列导入前确认一下数据价值别一键导入后发现是旧系统的数据导致盘被占用了。4.2 盘状态卡在 JBOD 无法创建有时候执行创建命令会报错提示盘不是 Ready/UGood 状态。查询后发现盘还是JBOD这是因为你在创建时没有关掉 jbod 开关或者盘的状态没刷新。先执行一次storcli /c0 set jbodoff然后重新查看状态。如果还是显示为 JBOD可以用以下命令把盘设置为 goodstorcli /c0 /e252 /s0 set good这里 e252 是 enclosure 编号s0 是槽位号换成你实际盘的位置。这个命令的作用是把盘从 JBOD 标记为 UGood。注意执行这个命令不会清空盘上数据但执行前依然建议确认数据已经备份因为后续创建阵列时会在盘上写元数据。另外一个可能的原因是阵列卡固件版本太低。某些老固件对 JBOD 状态切换支持不完善更新固件后再操作会顺利很多。4.3 BBU/电容状态导致创建失败创建虚拟磁盘失败时先看日志storcli /c0 show events如果能看到类似 “Battery charging” 或 “BBU bad” 的信息说明是电池备份单元状态异常导致的。阵列卡为了保证掉电后写缓存数据不丢失在 BBU 充电或故障时拒绝使用 Write Back 模式甚至拒绝创建新阵列。解决办法是先查看 BBU 状态storcli /c0 /bbu show如果是充电状态等充满再试。如果是故障状态可以尝试重新学习storcli /c0 /bbu start learn或者直接把创建策略改成 Write Through绕开缓存写回的限制storcli /c0 add vd typeraid5 nameDATA drives252:2,252:3,252:4 wt如果你不追求写性能用wt是可行的应急手段。但生产环境我还是建议把 BBU 修好否则一掉电写缓存里的数据就全没了那个风险比性能损失大得多。4.4 初始化慢、卡住和容量不对的问题初始化慢是正常现象但如果是创建 RAID5 后一直停在 0%就需要检查了。首先确认阵列卡没有把后台初始化背景优先级设置成最低storcli /c0 show bg你可以调整后台任务的优先级storcli /c0 set bg rate30数字越大表示优先级越高占用系统资源也越多。业务低峰期可以调高一点让初始化快一些。容量不对的问题通常是盘本身容量差异过大或者盘上残留了之前 RAID 的元数据。可以用storcli /c0 /eall /sall show all查看每个盘的原始容量再对比 RAID 创建时的可用空间。对于 RAID5可用容量是N-1块盘的容量N 是总盘数。如果创建时固件报容量不足先检查盘容量是否差异太大部分固件对混用不同容量盘特别敏感。另外如果盘之前参与过别的阵列残余元数据会影响容量识别清理方法就是把盘恢复到出厂状态。storcli 里可以用storcli /c0 /e252 /s0 set good或者用disk initialize类命令清盘命令在不同固件版本中略有差异先看帮助。确认没有剩余数据残留后重新创建阵列。4.5 常见问题速查表现象可能原因排查与解决storcli 找不到控制器HBA/IT 模式固件驱动未加载确认卡型号刷回 IR/RAID 固件盘显示 JBOD创建失败未关闭 JBOD 开关状态未刷新storcli /c0 set jbodoff再set goodForeign 配置阻止创建盘之前属于其他阵列storcli /c0 /fall show后导入或删除创建阵列报 BBU 错误电池充电、故障或学习周期storcli /c0 /bbu show等充满或用wt模式初始化进度为 0后台任务优先级低调整storcli /c0 set bg rate30虚拟磁盘状态 Degraded盘掉线、初始化未完成查看storcli /c0 /v0 show检查盘状态并核对物理连接初始化后系统盘消失关闭 JBOD 导致直通盘不可见从其他介质引导或先装好系统再关闭 JBOD5. 绕不开的避坑清单转 JBOD 到 RAID 模式这件事看起来就一条命令但真正做下来发现细节特别多。这里把我在实际运维和折腾过程中总结的经验整理成清单方便你操作时逐项对照第一动手前先确认阵列卡是真正的 RAID 控制器不是直通卡。H310、H710、9211-8i 这类卡都有 IT/IR 两种固件模式IT 模式下 storcli 根本管不了。刷固件有风险务必查清楚官方资料再动手。第二JBOD 开关的关闭时机很重要。如果你这台机器的系统就装在直通盘上关掉 JBOD 后系统直接找不到启动盘。所以操作前一定保证有 IPMI、iDRAC 这类带外管理手段或者准备一个可启动的 U 盘否则一旦系统起不来你就只能去机房插键盘了。第三盘状态的刷新不要靠猜测。每次执行完 set 命令立刻用storcli /c0 /eall /sall show重新查一遍状态。实际经验是有时候固件对状态变化的反应有延迟多刷新几次能看到盘从 JBOD 变成 UGood 的完整过程。第四创建虚拟磁盘时不要贪心一次塞太多盘。如果你有 8 块盘建议先建一个包含两三块盘的测试卷确认命令正确再建生产卷。因为有的固件对 drives 参数的盘序特别敏感如果排除顺序不对可能会导致后续扩容困难。万一建错了删除虚拟磁盘的命令是storcli /c0 /v0 delete但删除阵列会丢掉数据所以这条命令同样要谨慎。第五初始化尽量安排在业务低峰期。写回模式下初始化期间 IO 压力很大我见过因为初始化导致线上应用延迟飙升的情况。如果调度不了可以临时把后台初始化优先级调低让业务优先代价是初始化时间变长。第六如果以后想扩展阵列容量别再想着怎么把 JBOD 盘转回来。新加的盘直接插进服务器只要 JBOD 开关是关闭的盘会自动变成未配置好状态然后你用storcli /c0 /vex add之类的命令扩展虚拟磁盘就行。你的阵列卡固件版本决定了是否支持在线扩容量建议操作前查一下官方发布的扩容说明。最后再分享一个我常用的检查顺序每次我都会按这个流程走一遍先确认卡型号和固件storcli show再查 BBU 状态storcli /c0 /bbu show然后查盘状态storcli /c0 /eall /sall show关闭 JBOD 后重新查状态创建虚拟磁盘后再确认一次虚拟磁盘和物理盘状态。这套流程看起来繁琐但能避免绝大多数低级失误。等你操作过两三次就会发现整个转换过程其实很快真正的耗时在数据备份和初始化等待上。
返回列表