Solaris 11.3 で OpenSM 3.3.20 を動かす


Solaris 同士で直結 IP over IB やりたかっただけなんです。

InfiniBand switch を用意してしまえば必要のない話だけど、直結する場合には必要。
Solaris 同士の直結だと、OpenSM が動くかどうかから確認しないとなので、さらに必要。。

## OpenSM について

ひとまず、OpenSM 部分の参考に:

* [Mellanox OFED for Linux User Manual Rev 4.0](http://www.mellanox.com/related-docs/prod_software/Mellanox_OFED_Linux_User_Manual_v4.0.pdf)
* [Subnet Management (SM) and Subnet Administration (SA) in OpenFabric](https://www.openfabrics.org/images/eventpresos/workshops2013/IBUG/2013_UserDay_Fri_1200_SM-SA_Functionality.pdf)

## Solaris で動く OpenSM あるの？

あります。

2011/3 には、Oracle Solaris にバンドルされる FOSS 周りを集めた solaris-userland repository で opensm-3.3.9 のパッチが公開されていたが、結局、OpenSM 自体は含まれなかった。
2016/4 に OFED 3.18 へアップデートされ、opensm-3.3.19 のパッチとしてアップデートされている。

[PSARC/2016/109 Solaris OFED (OFUV) Version 3.18 and other updates](https://github.com/oracle/solaris-userland/commit/db787c83fb32b42c0124b57c4b4c0056aa8f0886)

solaris-userland repository の opensm 関連は、下記:

* [solaris-userland/components/open-fabrics/opensm/](https://github.com/oracle/solaris-userland/tree/master/components/open-fabrics/opensm)

その中に含まれる Solaris で build するために必要なパッチ:

* [001-opensm-solaris_port.patch](https://raw.githubusercontent.com/oracle/solaris-userland/master/components/open-fabrics/opensm/patches/001-opensm-solaris_port.patch)

ということで、上記のパッチを適用し、opensm をビルドする必要がある。

## 作業の流れ

### 必要なもの

opensm-3.3.19 のパッチと、opensm-3.3.20 のアーカイブを入手。(opensm-3.3.20 に適用可能)

* [opensm-3.3.19 へのパッチ](https://raw.githubusercontent.com/oracle/solaris-userland/master/components/open-fabrics/opensm/patches/001-opensm-solaris_port.patch)
* [OpenSM 3.3.20 のアーカイブ](https://www.openfabrics.org/downloads/management/opensm-3.3.20.tar.gz)

### ビルド手順

本稿では、`/opt/sfw/opensm` ディレクトリにインストールする:

```bash
$ wget https://raw.githubusercontent.com/oracle/solaris-userland/master/components/open-fabrics/opensm/patches/001-opensm-solaris_port.patch
$ wget https://www.openfabrics.org/downloads/management/opensm-3.3.20.tar.gz
$ gtar xvzf opensm-3.3.20.tar.gz
$ cd opensm-3.3.20
$ gpatch -p1 < ../001-opensm-solaris_port.patch
$ ./configure --prefix=/opt/sfw/opensm CFLAGS="-std=gnu99" LIBS="-libverbs -lsocket -lnsl -libumad -libmad"
$ gmake
$ sudo gmake install
```

下記のバイナリが手に入る:

* `/opt/sfw/opensm/sbin/opensm`
* `/opt/sfw/opensm/sbin/osmtest` (※ 必要であれば)

## OpenSM を起動させるために

opensm を動作させるために、最低限の構成ファイルを準備する。

* `opensm.conf` の作成
* `partitions.conf` の作成

> **参考:** [9.4. サブネットマネジャーの設定](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec-Configuring_the_Subnet_Manager.html)

## partitions.conf の作成

partitions (PKeys) を設定する場合は、`partitions.conf` を事前に作成しておく必要がある。

`partitions.conf` 周りのお話は下記を参考に:

* アーカイブに付属する opensm-3.3.20/doc/partition-config.txt
* [Mellanox OFED for Linux User Manual Rev 4.0](http://www.mellanox.com/related-docs/prod_software/Mellanox_OFED_Linux_User_Manual_v4.0.pdf)
* [In Between Ethernet VLANs and InfiniBand PKEYs | Mellanox Interconnect Community](https://community.mellanox.com/docs/DOC-1463)


ここでは、0xffff を default として、0x8001 と 0x8002 も必要であれば作成できるよう追加された `partition.conf` を `/opt/sfw/opensm-3.3.20/etc/` に作成する。
この情報が設定されていないと、`dladm create-part` で PKEY を設定したパーティションが作成できないので注意。

作成された /opt/sfw/opensm/etc/partitions.conf:

```c
Default=0xffff,ipoib: ALL=full;    # index 0
Web=0x8001,ipoib: ALL=full;        # index 1
Storage=0x8002,ipoib: ALL=full;    # index 2
```

## opensm.conf の作成

opensm.conf の雛形は、opensm コマンドを下記のように実行すると作成可能:

```bash
# /opt/sfw/opensm/sbin/opensm --create-config /opt/sfw/opensm/etc/opensm.conf
-------------------------------------------------
OpenSM 3.3.20
Command Line Arguments:
 Creating config file template '/opt/sfw/opensm/etc/opensm.conf'.
 Log File: /var/log/opensm.log
-------------------------------------------------
```

> **参考:** [Create the opensm.conf File -   Sun Datacenter InfiniBand Switch 72](http://docs.oracle.com/cd/E19654-01/820-7751-12/z400000c1834190.html)


### partitions.conf を指定する
partition を利用するために、`opensm.conf` の `partition_config_file` を下記のように設定する:

```
partition_config_file /opt/sfw/opensm/etc/partitions.conf
```

## OpenSM の起動

利用したいポートを指定し手動で実行する:

```bash
# /opt/sfw/opensm/sbin/opensm -B -F /opt/sfw/opensm/etc/opensm.conf -g 0x00212800013f2dd8
-------------------------------------------------
OpenSM 3.3.20
Config file is `/opt/sfw/opensm/etc/opensm.conf`:
 Reading Cached Option File: /opt/sfw/opensm/etc/opensm.conf
 Loading Cached Option:partition_config_file = /opt/sfw/opensm-3.3.20/etc/partitions.conf
Command Line Arguments:
 Daemon mode
 Guid <0x212800013f2dd8>
 Log File: /var/log/opensm.log
-------------------------------------------------
```

実行時のログには、default 構成から変更された内容が表示される。

> **注:** 同一 subnet の同じマシン上に複数の port/HCA が搭載された状態で OpenSM を動かす場合は、その port/HCA 毎に OpenSM インスタンスを起動する必要がある。複数ポートで異なる Subnet を作成する場合も同じ
>
> * [[ewg] Opensm for dual GUID](http://lists.openfabrics.org/pipermail/ewg/2015-February/018341.html)
> * [Re: opensm with multiple IB subnets](https://www.mail-archive.com/linux-rdma@vger.kernel.org/msg03557.html)

## OpenSM の自動起動

SMF 化したいが、manifest を書けていないので省略

## OpenSM の log 管理について

ログファイルも結構大きくなるので、opensm.conf の下記設定で調整は必要:

```
# Log file to be used
log_file /var/log/opensm.log

# Limit the size of the log file in MB. If overrun, log is restarted
log_max_size 0
```

* [OpenSM Log Management](https://www.openfabrics.org/images/eventpresos/workshops2015/UGWorkshop/Thursday/thursday_06.pdf)

## その他

### ネットワークスキャン (sweep) の無効化

デバイスを変更しないネットワークでは、ネットワークスキャン(sweep)を無効にできるので、opensm.conf に下記のような設定をするといいよとある。。。(default: 10)

```
sweep_interval 0
```

### guid.txt について

InfiniBand ファブリックで Fat Tree ルーティングアルゴリズムを使用する場合は、Subnet Manager のルートノード GUID ファイルを用意する必要があるとのことだけど、いまの環境に必要ないようなきがするのでメモだけ。

> * [Understanding Up/Down InfiniBand Routing Algorithm | Mellanox Interconnect Community](https://community.mellanox.com/docs/DOC-2402)
> * [Fetching Title on 16:12](https://community.mellanox.com/docs/DOC-2484)
> * [Create the guid.txt File -   Sun Datacenter InfiniBand Switch 72](http://docs.oracle.com/cd/E19654-01/820-7751-12/z400000c1522080.html#scrolltoc)

opensm.conf に下記を追加する:

```
root_guid_file /opt/sfw/opensm/etc/guid.txt
```