第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,这个版本其实挺稳定的。

小提示: 包管理器安装的 OpenSM 会自动创建 /etc/opensm/ 目录和 opensm.conf 文件。省了你手动创建配置的麻烦。

4.2 源码编译安装:定制化需求

什么时候需要源码编译?我遇到过两种情况:一是需要打补丁修复某个 bug,二是想用最新的特性。比如 Mellanox 官方有时会发布 hotfix 版本,包管理器里没有。

源码编译的步骤,我整理成清单了:

  1. 下载源码:从 https://github.com/linux-rdma/opensm 拉取最新代码
  2. 安装依赖:需要 libibumad、libibmad、libibverbs 等开发包
  3. 编译安装:标准的 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,结果导致全网断流 30 秒。后来学乖了,先停掉主 SM,等备用 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 了。下一章我们讲子网管理器的日常运维和监控,到时候会涉及更多实战技巧。