去年冬天最冷的那几天,我被叫到机房看一台业务机。面板上那颗琥珀色指示灯在闪,命令行的输出里有一块盘已经进了 Failed 状态。卡是 LSI 的 MegaRAID 系列,机器上只装了命令行工具,重建进度得靠一行行命令反复刷新,看着一串拗口的状态码猜它到底走到哪一步。那会儿我就在想,当初要是把 LSI MSM 装上,至少不用这么费劲。MSM 全称 MegaRAID Storage Manager,是这类阵列卡的图形化管理套件,能看拓扑、建阵列、换盘、盯重建进度、导日志,Windows 客户端还能远程连到 Linux 上的服务端。这篇就讲清楚两件事:Linux 下 LSI MSM 软件怎么装、装完怎么真用起来。手上管着几台带 MegaRAID 卡的服务器、又不想每次都靠背命令过日子的运维,或者刚接手机房、只敢看不敢动的朋友,都可以照着走一遍。
1. 动手装之前,先判断这套图形工具该不该上
1.1 MSM 不是“一个软件”,而是一套前后端
很多人以为 MSM 就是一个安装包,双击完事。实际上它是分层的:底层是vivaldiframeworkd这个常驻服务,负责跟内核里的阵列卡驱动打交道;中间是一套 Java 库和 RPC 通道;最上面才是那个用 Java 写的图形界面。你在 Linux 上装完,实际上同时得到了三样东西——一个后台框架服务、一个本地 GUI 客户端,还有随包的一些诊断组件。命令行工具 storcli 和 MegaCli 跟 MSM 是两套独立的东西,但读写的都是同一张卡、同一份配置:用 MSM 建完阵列,storcli 立刻能看见;反过来用 storcli 改了写策略,MSM 刷新一下也跟着变。这是因为它们最终都是往内核的megaraid_sas驱动发 ioctl,只是外壳不同。
理解这层关系很关键。MSM 服务挂掉、界面连不上,不代表卡出了问题;卡上的阵列配置存在控制器自己的 NVRAM 里,跟你装不装软件半点关系都没有。所以千万别把 MSM 当成“阵列管理的必需品”,它只是“阵列管理的一扇可视窗口”。窗户关上了,屋子还在。我见过有同事因为 MSM 登录失败,慌到准备重启业务机,其实只要换成 storcli 一条命令就能确认阵列健康。
1.2 三条管理通道,各自适合什么人
| 通道 | 依赖 | 适合的场景 | 短板 |
|---|---|---|---|
| MSM 图形界面 | Java 运行环境、框架服务、图形显示 | 建阵列、换盘、看拓扑、带新人教学 | 需要桌面或转发,Java 版本敏感 |
| storcli / storcli64 | 无额外依赖,单文件 | 脚本化巡检、批量操作、远程纯命令行 | 参数多,输出靠脑补 |
| MegaCli64 | 老版本工具,仍在很多老机器上 | 老卡、老系统、存量脚本 | 已停止演进,新卡支持差 |
| 控制器 BIOS(Ctrl+H) | 需重启进配置界面 | 系统还没装、彻底重建 | 必须停机,风险高 |
这张表我建议你贴在工位上。实际工作里最常见的组合是:日常巡检和自动化用 storcli,一次性的大动作(比如规划一组新阵列、给新人讲 RAID 怎么排布)打开 MSM 看图形。两者不是替代关系,是互补关系。真正需要 MSM 的场合,往往是“你需要向别人解释现在的状态”,或者“你要在十几个物理盘里挑出该拔的那一块”。
1.3 有些情况我建议你干脆别装
第一种:一台机器、一次建阵列、此后三五年不动。这种纯 storcli 完全够用,装 MSM 反而多了一个 Java 服务要维护,还多开一个端口。
第二种:安全基线明确禁止在服务器上跑 Java 图形组件,或者不允许开放额外监听端口。这种情况下硬装,后面审计会很难受。
第三种:卡太老。早期的 9260、9650 那一代控制器,新版 MSM 根本不认,必须配 8.x、13.x 那种老版本,而老版本又依赖 32 位库,在新系统上装起来非常折腾。这类机器老老实实用 MegaCli 更省心。
第四种:你的卡其实是纯 HBA 直通卡而不是 RAID 卡。MSM 只认 MegaRAID 系列,直通卡要用另一套工具,装错了只会看到“找不到控制器”的白屏。
2. 装之前的底账:把卡、系统和版本先对清楚
2.1 摸清控制器型号、固件和驱动加载情况
装任何管理软件之前,先把现状留档。这几条命令花不了三分钟,但能省掉后面无数扯皮:
# 看系统认到了什么卡 lspci -nn | grep -i -E 'raid|megaraid' # 看驱动有没有加载、有没有报错 dmesg | grep -i megaraid_sas | tail -30 # 如果有 storcli,直接问控制器 /opt/MegaRAID/storcli/storcli64 show /opt/MegaRAID/storcli/storcli64 /c0 show # 装软件之前,把当前完整配置存一份 /opt/MegaRAID/storcli/storcli64 /c0 show all > /root/c0_before_msm_$(date +%F).txtstorcli64 show的输出里,重点看三样:控制器数量(Number of Controllers)、每张卡的型号(Product Name)、以及Status是不是Optimal。如果这一步就已经报Status = Degraded,那说明盘已经出问题了,先处理硬件,别急着重装软件——否则你会以为是 MSM 装坏了。
dmesg那一段主要看两个东西:驱动版本号,以及有没有megaraid_sas: Failed to ...之类的告警。驱动版本太老的时候,MSM 有时能连上但读不到某些属性,表现是界面里某些字段显示成N/A或者干脆空白。
2.2 依赖清点:Java、字体、SELinux、防火墙
MSM 的图形界面是 Java 写的,这是最大的依赖项,也是坑最多的地方。我的经验是:
| 依赖项 | 具体要求 | 检查方式 |
|---|---|---|
| JRE | 优先用 64 位 JRE 8;随包 JRE 常在新系统上跑不起来 | java -version |
| glibc | 一般要求 2.17 以上 | ldd --version |
| X11 运行库 | libX11、libXext、libXtst等 | rpm -qa | grep libX |
| 字体 | 缺字体时界面全是方块,装 dejavu 或 xorg 字体包 | fc-list | head |
| X11 转发组件 | 走 SSH 图形转发时需要 xauth | which xauth |
| SELinux | 强制模式可能拦住框架服务 | getenforce |
| 防火墙 | 框架服务监听端口需要放行 | firewall-cmd --list-ports |
关于 SELinux,我吃过一次亏:安装过程一切正常,服务也起来了,但客户端就是连不上,日志里全是权限拒绝。临时排查用setenforce 0验证一下,确认是它拦的,再决定是加策略还是保持宽容模式。生产环境不建议长期关,但至少要知道是谁在拦。
防火墙这块,MSM 框架服务典型监听在 3071 端口,远程客户端连接还会用到 5571。不同版本略有差异,装完用ss -lntp | grep -E '3071|5571'看实际监听情况最准。要开就开:
firewall-cmd --permanent --add-port=3071/tcp firewall-cmd --permanent --add-port=5571/tcp firewall-cmd --reload2.3 版本对齐:软件版本别拍脑袋选
MSM 的版本跟控制器代际、固件、操作系统都有对应关系。大致规律是:92xx、93xx、94xx、95xx、96xx 这些较新的控制器,16.x、17.x 版本都能认;再老的卡就得往下找。这个对应关系以厂商发布说明为准,我上面说的只是经验性的区间,不是标准答案。
选版本的实用原则是:优先选和现有 storcli 版本同一批发布的 MSM,这样两边读同一份配置时不会出现字段解释不一致。另外,如果机器上已经能正常跑 storcli,说明驱动和固件这条链路是通的,那么装 MSM 遇到问题,八成集中在 Java 环境和端口,而不是阵列本身。把这个判断记住,排错的时候能少走一半弯路。
3. 安装全过程拆解:从解包到能登录界面
3.1 包结构解剖:先看清里面是什么再动手
拿到的一般是MSM_linux_x64_installer-<版本>.tar.gz。别急着解压完就./install.sh,先看看结构:
tar -tzf MSM_linux_x64_installer-*.tar.gz | head -30 tar -xzf MSM_linux_x64_installer-*.tar.gz ls -R ./MSM_linux_x64_installer | head -40典型的目录里会有:安装脚本install.sh、若干 rpm 包、随包的 JRE 目录、以及一些许可和说明文件。rpm 包通常分成几块——框架服务、公共库、图形客户端。理解这个分层对你后面排错很有用:如果服务起不来,问题在框架包;如果服务好了但界面打不开,问题在客户端和 Java。
一个必须提醒的点:这套东西官方主要提供 rpm 格式。Debian 系(比如 Ubuntu)上,有人用格式转换工具硬转,能装上,但依赖关系和路径经常对不上,装完界面能起、功能却缺一半。我的建议是,如果在 Debian 系上非要用图形管理,就在一台 rpm 系的机器上装服务端,用 Windows 客户端远程连过去,比硬转包靠谱得多。
3.2 install.sh 的交互项,每一项在问什么
用 root 执行./install.sh,会进入一个文字菜单。你得看懂它在问什么,不然随便回车下去,装完可能连自己在哪都不知道。
- 安装还是卸载:菜单里通常有“安装”和“卸载”两个选项,卸载也走这个脚本,所以别把安装包删了。
- 安装目录:默认是
/usr/local/MegaRAID Storage Manager。我建议就用默认值,别改成带空格或者带中文的路径——Java 程序对这两个东西都很敏感,改了以后一堆脚本内部的相对路径会失效。 - JRE 路径:这一步是全场最容易出问题的地方。安装程序会问你 JRE 装在哪。如果系统里已经装了 64 位 JRE 8,直接给它的绝对路径,比如
/usr/lib/jvm/java-8-openjdk-<架构>/jre。如果系统里没有,它会提议用随包 JRE,那么装完之后很可能遇到界面起不来的问题,后面第 4 节细讲。 - 是否安装到所有用户:单机自用选是;多人共用一台管理机也选是。
安装过程大概一两分钟,中间会刷一堆 rpm 安装信息。装完先别急着开界面,先确认服务。
3.3 框架服务的启动与开机自启
# 老一点的版本用这个脚本名,新版本是 vivaldiframeworkd ls /etc/init.d/ | grep -i -E 'vivaldi|msm' /etc/init.d/vivaldiframeworkd start /etc/init.d/vivaldiframeworkd status # 确认监听 ss -lntp | grep -E '3071|5571'如果ss的输出里,监听地址是127.0.0.1:3071而不是0.0.0.0:3071,那本机用没问题,远程客户端连不上。这时候要么改配置让它绑到管理网卡,要么就用本机界面加 SSH 转发的方式。
开机自启,很多版本装完不会自动配好。与其依赖/etc/rc.local这种老办法,不如自己写个 unit:
# /etc/systemd/system/msm-framework.service [Unit] Description=MegaRAID Storage Manager Framework After=network-online.target Wants=network-online.target [Service] Type=forking ExecStart=/etc/init.d/vivaldiframeworkd start ExecStop=/etc/init.d/vivaldiframeworkd stop RemainAfterExit=yes TimeoutStartSec=90 [Install] WantedBy=multi-user.targetsystemctl daemon-reload systemctl enable --now msm-framework systemctl status msm-frameworkType=forking是因为那个 init 脚本自己会后台化。RemainAfterExit=yes保证服务退出后 systemd 仍认为它是 active 状态,不然你会看到它一直是inactive (dead)但其实进程在跑。
3.4 没有桌面环境,界面怎么开出来
服务器基本都不装桌面,这是常态。三条路,按推荐程度排:
第一条,Windows 客户端远程连。在管理员的 Windows 机器上装同版本的 MSM 客户端,登录时填服务器 IP,走 3071/5571 端口连框架服务。这条路最省事,图形性能也最好,不受服务器端是否装了桌面影响。前提是网络能通、端口放行。
第二条,SSH X11 转发。客户端机器上装好 X Server(Windows 下常用的是独立的 X 服务程序),登录时用ssh -X,然后在服务器上执行:
cd "/usr/local/MegaRAID Storage Manager" ./startupui.sh这条路的坑在于字体。Java 界面在 X11 转发下如果缺字体,你会看到满屏方块,什么都认不出来。提前装好字体包,能省掉一次抓狂。另外 X11 转发下界面响应很慢,点一下等三秒是常态,能忍就用。
第三条,临时起个 VNC 会话。
vncserver :1 -geometry 1280x800 -depth 24 export DISPLAY=:1 cd "/usr/local/MegaRAID Storage Manager" ./startupui.sh用完记得vncserver -kill :1。这条路的优点是图形体验接近本地,缺点是又多了一个要管的服务,别长期开着。
4. 踩坑实录:这几种失败我全都遇到过
4.1 界面秒退或者报 JRE 找不到
现象:./startupui.sh执行后一闪而过,终端里留下几行 Java 异常;或者干脆提示找不到 JRE。
根因基本都在那个启动脚本上。它内部有一行指向 JRE 的路径,安装时如果选了随包 JRE,这行就指向安装目录下的jre子目录。新系统上这个随包 JRE 往往因为 glibc 版本、字体配置或者架构问题跑不起来。
处理办法是打开startupui.sh,找到设置 Java 路径的那一行,改成系统 JRE 的绝对路径,然后手动验证:
/path/to/your/jre/bin/java -version能正常输出版本号,再回去跑startupui.sh。改完记得把改动记下来,因为下次升级 MSM 会覆盖这个脚本,问题会原地复发。我现在习惯在安装目录里放一个README.local,把自己改过的地方写清楚,谁接手都能看懂。
还有一个小细节:如果系统的JAVA_HOME指向的是 JRE 11 或更高版本,某些 MSM 版本的界面会起得来但功能页签加载不全。这种情况下装一个 64 位 JRE 8 专门给它用,比折腾兼容性省时间。
4.2 界面能登录,但看不到控制器
这个现象比界面打不开更让人迷惑,因为服务是好的、连接是通的,就是列表空空。
我按可能性从高到低排了个排查顺序:
- 权限不够。用普通账号登录,MSM 可能连得上但读不到设备节点。换成 root 再试一次,如果 root 能看到,说明就是权限问题,去配 sudo 白名单,别图省事直接发 root。
- 卡不是 MegaRAID。直通卡、纯 HBA 卡在 MSM 里就是不显示。用
lspci确认型号,再决定换工具。 - 卡被直通给虚拟机了。宿主机上自然看不到,去虚拟机里面装。
- 驱动异常。
dmesg里有报错,那先修驱动,软件层怎么折腾都没用。 - 服务连的是本机但卡在另一台机器上。多路径、多控制器环境下容易搞混,看
storcli show里的控制器编号对不对。
这个顺序的价值在于:它把“软件问题”和“硬件/权限问题”分开,你从第 1 步往下走,最多五分钟就能定位到层。
4.3 远程连不上:端口、绑定地址、安全组
远程客户端连不上的时候,别一上来就怀疑软件。按这个顺序查:
# 服务在不在 systemctl status msm-framework # 监听在哪个地址 ss -lntp | grep -E '3071|5571' # 本机防火墙 firewall-cmd --list-all # 从客户端侧测连通 telnet <服务器IP> 3071如果ss显示只绑了127.0.0.1,那就是绑定地址的问题,跟防火墙无关。如果是云主机,还多一层网络访问控制策略要放行。这三个层面(进程、防火墙、网络策略)任何一层挡住,表现都是“连不上”,但修法完全不同。
4.4 反复装卸留下的残留
装错了想重来,很多人直接删目录,结果再装就各种奇怪报错。正确姿势是用安装包自带的卸载选项,或者安装目录里的卸载脚本,先把服务和包清干净:
# 先停服务 /etc/init.d/vivaldiframeworkd stop # 用安装脚本的卸载项,或者 /usr/local/MegaRAID\ Storage\ Manager/uninstaller.sh 2>/dev/null || true # 确认没有残留进程 ps -ef | grep -i -E 'vivaldi|msm' | grep -v grep卸载完重启一次再装。我遇到过一次装完服务起不来的情况,折腾半小时,最后发现是上一次卸载没清干净,端口被一个残留进程占着。
5. 界面打开之后:几个高频动作怎么干
5.1 先把首页那几张图读懂
MSM 主界面一般分几块:控制器摘要、逻辑盘(Virtual Drive)列表、物理盘(Physical Drive)列表、电池/电容状态、事件日志。颜色是有语义的:绿色正常,黄色告警,红色故障。新人最容易犯的错是只看逻辑盘——逻辑盘是绿的,但底下某块物理盘已经黄了,这时候还没触发降级,但已经在预警。
我习惯的查看顺序是:先看物理盘列表里有没有非 Online 状态,再看逻辑盘状态,最后看电池。为什么电池要单独看?因为写缓存策略依赖它。电池(或超级电容)失效时,控制器通常会自动把写策略从 Write Back 降级成 Write Through,性能可能掉一大截,但界面上逻辑盘依然是绿色的。只盯颜色不看策略,就会出现“机器没报警但业务变慢”的诡异现象。
物理盘状态里几个常见值值得记住:
| 状态 | 含义 | 该做什么 |
|---|---|---|
| Online | 正常,属于某个阵列 | 无需动作 |
| Ready | 空闲,未分配 | 可作热备或新建阵列 |
| Rebuild | 正在重建 | 别断电,盯着进度 |
| Copyback | 数据回拷 | 同上,别打断 |
| Failed | 故障 | 准备换盘 |
| Missing | 曾经存在现在找不到 | 检查是否被误拔 |
5.2 建阵列时那几个参数,决定后面几年的表现
图形化建阵列很顺手,点几下就好,但顺手正是风险所在——参数默认值不一定适合你。下面这几个我每次都会停下来想一下:
RAID 级别。这不是 MSM 决定的,是你的业务决定的。数据库这类小随机 IO 密集的场景,RAID 10 往往比 RAID 5 更合适;大文件顺序读写、容量优先的归档盘,RAID 5 或 RAID 6 更划算。RAID 6 的双校验在大容量盘上重建时间很长,但换来的是重建期间再坏一块盘也不丢数据,这个取舍要提前想清楚。
条带大小。常见 64K、128K、256K、1M。小随机 IO 多的场景,条带别开太大;大文件顺序读写可以放大。拿不准就选 128K 或 256K,这两个是覆盖面最广的折中值。
写策略。Write Back 性能好,但依赖电池或电容;Write Through 慢一些但更保守。这里有个坑:你在界面上设了 Write Back,看起来保存成功,但如果电池已经失效,控制器实际执行的是 Write Through。所以设完要回去看当前生效的策略,而不是看你设的值。
读策略。纯随机读为主的场景,No Read Ahead 有时反而更好,因为预读会浪费缓存。顺序读为主就用 Read Ahead。不确定就用 Adaptive,让控制器自己判断。
初始化方式。这一步最危险。快速初始化只写盘的首尾区域,速度极快,但如果这块盘上原来有数据,逻辑上会被“接管”,某些情况下还会残留旧数据;完整初始化会全盘写零,时间长,但干净彻底。新建阵列我一般用快速初始化,复用旧盘我一定用完整初始化——多等几个小时,比事后发现数据串了强得多。
5.3 换盘:从 Failed 到重建完成的全流程
发现一块盘 Failed 之后,标准动作是这样的:
第一步,确认它真的坏了,而不是接触不良。看事件日志里的错误类型,再看这块盘是不是反复在 Online 和 Failed 之间跳。反复跳的盘,九成是背板或者线缆的问题,换盘之前先看物理连接。
第二步,如果配了热备盘,控制器会自动拿热备盘顶上并开始重建,你只需要在重建完成后把坏盘拔掉、插上新盘,新盘会自动变成新的热备。没配热备的话,就得手动来:把故障盘标记为 Offline,再标记为 Missing,然后物理拔出,插入新盘,新盘会显示为 Ready 或者 Unconfigured Good,接着做 Replace 或者直接让它自动重建。
第三步,盯重建进度。界面上有百分比,命令行也能看:
/opt/MegaRAID/storcli/storcli64 /c0/e252/s3 show rebuild这一步有个非常实用的技巧:重建期间 IO 压力大,业务会明显变慢。把重建速率调低一点,能让业务感知小很多:
/opt/MegaRAID/storcli/storcli64 /c0 set rebuildrate=3030 表示占用 30% 的可用资源。代价是重建时间变长,但换来的业务平稳是值得的。重建期间千万别重启、别断电,一旦中断,有的配置能续上,有的就得从头来。
5.4 事件日志比界面颜色更有信息量
图形界面最被低估的功能是事件日志。颜色只告诉你“现在有事”,日志才告诉你“什么时候开始、怎么演变的”。带新人时我常让他们做一件事:把事件日志按时间顺序读一遍,看一块盘从出现零星读错误到彻底 Failed 用了多久。读完这一遍,对“预警”这两个字会有完全不同的理解。
命令行侧对应的命令是storcli64 /c0 show events,可以配合terminate参数只取最近的若干条。做巡检脚本的时候,把事件日志里 Error 级别的条目捞出来做告警,比只判断阵列状态灵敏得多——阵列还没降级的时候,盘已经在报错了。
6. 长期维护:让这套东西在机器上待得住
6.1 升级顺序和窗口安排
固件和软件都有版本,顺序搞反了容易出问题。我的习惯是:先升级管理软件(MSM 和 storcli),再评估固件。原因是管理软件升级风险低、可回退,而且新版软件往往能读出更多旧固件的信息,帮你判断固件到底该不该动。固件升级必须在停机窗口做,而且要先把完整配置导出存档,升级完立刻核对阵列状态和逻辑盘数量。
升级 MSM 之前,先记下自己改过的配置——尤其是前面提到的 JRE 路径。升级会覆盖安装目录,改过的脚本会回到默认状态,升级完第一时间重新验证一遍界面能不能起。
6.2 权限别图省事
MSM 要求的管理权限比较高,很多人干脆日常就用 root 登录。这不是好习惯。更稳妥的做法是建一个专门的运维账号,通过 sudo 白名单授予必要命令权限,MSM 用这个账号登录。有些版本对 sudo 配置的检查比较严格,配不好会出现“能登录但按钮全灰”的情况,这时候看日志就能知道是权限判定没过。
6.3 配置留档:变更前后各存一份
这条听起来最无聊,但在真出事的时候最值钱:
mkdir -p /root/raid_snapshots /opt/MegaRAID/storcli/storcli64 /c0 show all > /root/raid_snapshots/c0_$(date +%F_%H%M).txt /opt/MegaRAID/storcli/storcli64 /c0 show events > /root/raid_snapshots/events_$(date +%F_%H%M).txt任何变更(建阵列、换盘、改策略、升级固件)前后各存一份。出问题时把两份 diff 一下,改动痕迹清清楚楚,比回忆半小时前点了哪个按钮可靠一万倍。这个习惯我坚持了几年,帮我在一次“谁把写策略改了”的追查里省下了整整一个下午。
6.4 别把管理端口放到业务网段
MSM 的框架服务权限很高,能直接操作阵列。如果服务器有多张网卡,把它绑到管理网段,业务网段不要监听。这一步在配置里可能要多花十分钟,但值得。
最后分享一点我自己的体会。这套工具真正的作用不是“让建阵列变简单”,而是“让状态变得可解释”。命令行给你的是事实,图形界面给你的是关系——哪块盘属于哪个阵列、哪个阵列还剩多少余量、电池还能撑多久。我现在给自己定的规矩是:所有变更走命令行,因为可复现、可脚本化;所有判断和沟通走图形界面,因为看得见才好解释。两边对照着用,比死守任何一边都踏实。