第4章 OpenSM安装与配置:源码编译安装、包管理器安装、配置文件详解
好,咱们进入正题。OpenSM 是 InfiniBand 子网管理器的核心实现,说白了它就是整个 IB 网络的大脑。你装好硬件、插上线缆,如果没有 OpenSM 跑起来,那交换机就是一堆废铁,端口之间谁也找不到谁。
这一章我带你搞定 OpenSM 的安装和配置。我会讲三种安装方式,以及最重要的配置文件 /etc/opensm/opensm.conf。嗯,这里要注意,很多新手栽就栽在配置文件上。
4.1 包管理器安装:最省心的方式
我个人习惯,如果是生产环境,优先用包管理器安装。省时省力,依赖自动解决。
RHEL/CentOS 系:
yum install -y opensm
# 或者
dnf install -y opensm
Ubuntu/Debian 系:
apt-get update
apt-get install -y opensm
装完之后,你运行 opensm --version 就能看到版本号。我记得有一次在 CentOS 7 上装,默认版本是 3.3.19,这个版本其实挺稳定的。
/etc/opensm/ 目录和 opensm.conf 文件。省了你手动创建配置的麻烦。
4.2 源码编译安装:定制化需求
什么时候需要源码编译?我遇到过两种情况:一是需要打补丁修复某个 bug,二是想用最新的特性。比如 Mellanox 官方有时会发布 hotfix 版本,包管理器里没有。
源码编译的步骤,我整理成清单了:
- 下载源码:从 https://github.com/linux-rdma/opensm 拉取最新代码
- 安装依赖:需要 libibumad、libibmad、libibverbs 等开发包
- 编译安装:标准的 autotools 流程
# 安装依赖(以 CentOS 为例)
yum install -y libibumad-devel libibmad-devel libibverbs-devel
yum install -y automake autoconf libtool
# 编译安装
git clone https://github.com/linux-rdma/opensm.git
cd opensm
./autogen.sh
./configure --prefix=/usr
make -j$(nproc)
make install
这里有个坑,我踩过。如果你用 --prefix=/usr/local,那么配置文件路径会变成 /usr/local/etc/opensm/。但系统服务脚本默认找的是 /etc/opensm/。结果就是服务启动失败,日志里啥也没有。你想想看,排查了半天才发现是路径问题。
--prefix=/usr,保持和包管理器安装一致的路径。否则你就要手动修改 systemd 服务文件。
4.3 配置文件详解:opensm.conf
这是重头戏。配置文件位于 /etc/opensm/opensm.conf。我见过太多人直接复制网上的配置,结果网络拓扑一变就出问题。
配置文件的结构其实很简单,就是 key = value 的形式。注释用 #。我挑几个最关键的参数讲:
| 参数名 | 默认值 | 说明 |
|---|---|---|
subnet_prefix |
0xfe80000000000000 | 子网前缀,同一子网内必须一致 |
lid |
0x0001 | SM 自身的 LID,一般不用改 |
sm_priority |
15 | SM 优先级,值越大越优先 |
routing_engine |
updn | 路由引擎类型,可选 ftree、dor、updn 等 |
log_file |
/var/log/opensm.log | 日志文件路径 |
log_level |
0x31 | 日志级别,调试时设为 0xFF |
重点说说 routing_engine:
这个参数决定了 OpenSM 如何计算路由表。我个人的经验是:
- ftree:胖树拓扑专用,性能最好。如果你的网络是标准的 Fat-Tree,用这个。
- updn:通用拓扑,默认值。适合不规则拓扑。
- dor:维度顺序路由,适合 Mesh/Torus 拓扑。
我曾经在一个项目中,客户用的是 3 层 Fat-Tree,但默认用了 updn。结果带宽利用率只有 60%。改成 ftree 后,直接飙到 95%。所以路由引擎选对了,性能差很多。
# 基本配置
subnet_prefix = 0xfe80000000000000
sm_priority = 15
# 路由引擎
routing_engine = ftree
# 日志
log_file = /var/log/opensm.log
log_level = 0xFF
# 重试策略
retry_count = 3
retry_interval = 5
# 心跳
heartbeat_timeout = 2000
4.4 启动与验证
配置写好了,怎么启动?我建议用 systemd 管理:
systemctl start opensm
systemctl enable opensm
systemctl status opensm
查看日志确认是否正常运行:
tail -f /var/log/opensm.log
如果看到类似 SUBNET UP 或者 Master SM started 的字样,恭喜你,SM 跑起来了。
嗯,这里有个小技巧。我习惯在启动前先做一次语法检查:
opensm --check-config /etc/opensm/opensm.conf
这个命令会检查配置文件的语法错误,不会实际启动 SM。省得你启动后发现写错了,又要停掉重来。
opensm --graceful 参数优雅重启。
4.5 多 SM 冗余配置
生产环境绝对不能只跑一个 SM。万一挂了,整个网络就瘫痪了。我建议至少部署 2 个 SM,一主一备。
配置很简单:
- 主 SM:
sm_priority = 15 - 备 SM:
sm_priority = 5
两个 SM 的 subnet_prefix 必须一致。启动后,备 SM 会自动进入 Standby 状态。一旦主 SM 宕机,备 SM 会在几秒内接管。
你想想看,如果只有一个 SM,半夜三点它挂了,你还要爬起来重启。多一个备 SM,至少能撑到你上班。
好了,这一章的内容就这些。从安装到配置,再到启动验证,你应该能独立搞定 OpenSM 了。下一章我们讲子网管理器的日常运维和监控,到时候会涉及更多实战技巧。