xCATでスパコンを作ろう

**2020/7/30 記述ミスがいろいろあるようなので、引き続き修正中です**

# xCAT導入シリーズ
1. [xCATでスパコンを作ろう](https://qiita.com/misshie/items/c96158161ba4745bfe05)
1. [GangliaでxCATクラスターを監視する](https://qiita.com/misshie/items/b6592deebf9c9caa7f9b)
1. xCATクラスターにGridEngineを導入する（準備中） 

# xCATでBeowulf
世はクラウドである。が、用途によっては手元でガンガン計算機を動かしたいことはある。というか自分の目の前でコンピューターにうなりを上げさせてこそのスーパーコンピューティングなのである。こういう用途に使うのが高性能計算クラスター（High Performance Computing [HPC] Cluster)である。HPCクラスターを実現する方式の一つが（最近あまり聞かない用語であるが）[Beowulf](https://ja.wikipedia.org/wiki/Beowulf) である。Beowulfは「フリーUnixベースで、計算専用に用意したノード群を高速ネットワークで接続して実現したHPCクラスター」といったような意味で、この定義であれば、筆者のなじみの深いバイオインフォマティクス界隈の「スパコン」のほとんどがBeowulfであろう。

ここで、バイオインフォマティクス業界でなぜオンプレミスのHPC環境が（いまだ）必要かをもうちょっと詳しく。

第一に、次世代シークエンサーデータ関連の仕事を念頭においた話なのですが、いわゆるembarrassingly parallel[^1]な計算が多いということがある。何も考えず入力を10等分するだけで計算時間が1/10になることが期待できるわけです。このためBeowulf式のHPCクラスタの恩恵を受けやすいこと。第二に、計算速度には寛容でCPUパワーが少なくても待てばいい仕事が多いのに入力データサイズが巨大なためストレージもネットワーク転送量も大きくなりがちなこと。これは、安いCPU代金と高いストレージ・ネットワーク転送量で成り立つクラウド環境とはまったく相性が悪いのである。そして、最悪生データから計算しなおせばいいという特性から、ストレージに絶対の信頼性やら高速アクセス性能など要求しないこと。安くてでかいストレージが必要なのである。第三に、ヒト関連の研究でのプライバシー関連の問題。状況は変わりつつありますが、組織外部や国外にデータを保持することはまだ敷居が高かったりする。このようなわけで、バイオインフォマティクス業界で、オンプレミスのHPCクラスタを持つ（場合によっては自作する）という選択は、2020年でもそれほど間違ったものではないだろう。

[^1]: 自明的並列、驚異的並列、[バカ並列](https://kaityo256.github.io/sevendayshpc/) ……などといった訳があるようである。[英語版Wikipedia](https://en.wikipedia.org/wiki/Embarrassingly_parallel)によると[an embarrassment of riches](https://en.wikipedia.org/wiki/Embarrassment_of_riches)という「ありあまる財産」「富による『うんざり』」といった皮肉っぽいフレーズに由来するとのこと。もちろん、embarrassingly parallelと言いつつ、実際はありがたく楽々と並列化させてもらうのである。

さて、オンプレミスのBeowulf型自作HPCクラスターの構築を実現するためにいくつかのソフトウェアパッケージがあるのだが、比較的最新のLinuxディストロをベースにした自由度の高いオープンソースプロダクツで、現在も活発に開発されているものというと、IBMがスポンサーになっているプロジェクトであるeXtreme Cloud Administration Kit (xCAT) https://xcat.org/ が一番有名かなと思われる。

著者は、数年前にxCATでHPCを自作したことがあるが、最近、古いScyld（Penguin Computing社のプロプライエタリなHPCシステム）を新しいxCATで復活させることが必要になったので、あらためてメモ代わりに本稿を書くことにした次第である。xCATのドキュメントは、以前よりは改善したものの、まだ難しい。全部読んで理解してからインストール開始しないとハマりがちな構成になっているような気がする。必要な情報が分散してたり、暗黙に設定を行う高レベルのコマンドと、低レベルのコマンドが衝突したりがあるので一筋縄ではいかない。本稿は、ドキュメントと格闘した試行錯誤の結果なので、ウソや勘違いも多分にありそうだ。とはいえ、こういったメモも参考程度になら意味があるだろう。

xCATは、RedHat/CentOSでも、PowerPCベースのLinuxでも（サポートしていれば）自由に選ぶことができる。筆者のバイオインフォマティクス関連の仕事の場合、「サーバー」といっても時に比較的新しい環境をと要求するオープンソースソフトウェアをソースからビルドする必要があるため、比較的あたらしいUbuntuを使う事にした。プロプライエタリなツールがメインの場合はCentOSベースのほうがより適切かもしれない。

# xCATをインストールする
## 参照URI
- http://xcat.org/ xCATプロジェクト公式ページ
- https://xcat-docs.readthedocs.io/en/stable/ 公式ドキュメント
 - [Workflow Guide](https://xcat-docs.readthedocs.io/en/stable/guides/get-started/workflow_guide.html)
 - [Quick Start Guide](https://xcat-docs.readthedocs.io/en/stable/guides/get-started/quick_start.html)
 - [Installation Guide for Ubuntu Server LTS](https://xcat-docs.readthedocs.io/en/stable/) 

## 今回想定するハードウェアとネットワーク環境
- Management Node
 - 内部ネットワーク用 NIC `10.54.0.0/16` スイッチングハブに接続
 - WAN用 NIC `192.168.0.0/16` WAN/インターネット側に接続
- Compute Node（10台） 
 - 内部ネットワーク用 NIC `10.54.0.0/16` スイッチングハブに接続
 - BMC/IPMI用ポート こちらもスイッチングハブに接続
- 1000Gbスイッチングハブ

## Management Nodeを設定する
xCATがサポートしている最新版Ubuntuということで、Ubuntu 18.04-4 LTSを通法に従いインストールした。だたし実際には最軽量UIを目的に派生版であるLubuntu 18.04-4をインストールした。後述するが、compute node群には、Ubuntu Server 18.04-**2**を使う必要があった。

今回対象としたマシンの場合、Lubuntuインスートーラー上でマウスカーソルだけ表示されないという症状が出るも、カーネルオプションに`nomodeset`を指定することで回避できた。Intelグラフィックス機能の無効化らしい。インストール後は、

1. ホスト名設定(後述）
2. WAN側の固定IPアドレスの割り当て
3. ChronyないしNTPの設定
4. `apt upgrade`
5. 最小限のユーザー／グループ設定

などを済ませる。

クラスター内部ネットワークと、WAN側のネットワークとの間フォワーディングの設定も忘れずにやっておく。[Ubuntu の ufw で NAT サーバを作る](https://qiita.com/hoto17296/items/3aa5863ba9ef13400283#fn1)の記事が参考になる。

###Managemtn Nodeのホスト名設定
ここで設定するホスト名はインターネット側**ではなく**クラスター内部ネットワーク向けのものである。

1. `sudo su -`してから作業開始。
2. `# hostname scyld.cluster` を実行。お好きな名前で良いが、ここで指定するFQDNは内部ネットワーク向けなので`*.jp`や`*.com`である必要はない。
3. `/etc/hostname`の内容も`xcamn.cluster`のようにしておく

```console
# hostname
scyld.cluster
# hostname -d
cluster
```

###xCAT安定版のインストール

執筆時点での安定版最新版xCAT 2.16 (2020年6月16日リリース)を使う。 

```console
# mkdir /root/xCATsetup #特にことわらなければ、すべてここで作業することにする
# cd /root/xCATsetup
# wget \
  https://raw.githubusercontent.com/xcat2/xcat-core/master/xCAT-server/share/xcat/tools/go-xcat \
  -O - >　/tmp/go-xcat
# chmod +x /tmp/go-xcat
# /tmp/go-xcat install            # 今回はxcat安定バージョンをインストール
```

xCATシステムのデフォルトのインストール先は`/opt/xcat`。

###インストールの検証

```console
# source /etc/profile.d/xcat.sh # PATH設定
# lsxcatd -a # xCATバージョン表示
Version 2.16 (git commit 7fc773bd8e82ff9270bd7832558422dd17e23e66, built Tue Jun 16 16:07:58 EDT 2020)
This is a Management Node
dbengine=SQLite

# tabdump site　# xCAT内部データベースのsiteテーブルを表示する
#key,value,comments,disable
"blademaxp","64",,
"fsptimeout","0",,
"installdir","/install",,
（以下略）
```

xCATの設定は、xCAT objectと、xCAT databaseの[2つの概念で管理されている](https://xcat-docs.readthedocs.io/en/stable/guides/admin-guides/basic_concepts/index.html)。前者は、mkdef, lsdef, chdef, rmdefなどのコマンドで操作する。後者は、tabdump, tabedit, chtabなどのコマンドで操作する。xCAT databaseは実際にはRDB（デフォルトではSQLite）で管理されるテーブルで、オブジェクト群とテーブル群は多対多の関連付けになっているようである。設定の場面に応じて、都合の良いまとめ方で、前者か後者を操作するみたいである。

### site objectの設定
[Set attributes in the site table](https://xcat-docs.readthedocs.io/en/stable/guides/admin-guides/manage_clusters/ppc64le/configure/site.html)に準じて設定を進める。

```console
# chdef -t site domain="cluster"          # ノード群のドメイン名 scyld.clusterなどの場合
# chdef -t site master="10.54.0.1"        # Compute Node群から見たManagement NodeのIPアドレス
# chdef -t site nameservers="10.54.0.1"　 # Compute Node群から見たDNS群IPアドレス（カンマ区切り）
# chdef -t site forwarders="10.54.0.1"    # Compute Node外のDNS群IPアドレス（カンマ区切り）
# chdef -t site dhcpinterfaces="bond0"    # DHCPは内部ネットワークのみを対象にする
```

### `/etc/hosts`とDNSの設定

ここでmanagement nodeで動くDNSの設定をしたいのだが、named (BIND9) はAppArmor (SELinuxとは異なる仕組みのセキュアOS)で保護されているので、そこを修正する必要がある。[AppArmor に蹴躓く](https://www.downtown.jp/~soukaku/archives/2017/1207_003604.html)を参考にさせていただいた。

`/etc/apparmor.d/local/usr.sbin.named`（OSインストール直後なら空ファイル）に以下の様に追記して、

```config:/etc/arpparmor.d/local/usr.sbin.named
/var/named/** lrwk,
/var/named/ rw,
```

AppArmorに設定を反映させる。

```console
# apparmor_parser -r /etc/arpparmor.d/usr.sbin.named
```

DNSの設定は、xcatの`hosts`テーブルとnode登録にもとずいて自動生成された
`/etc/hosts`を使うって設定される。事前に手動で`/etc/host`に登録していたようなサーバーがあればここでノードとして登録しておく必要がある。

`makehosts`コマンドによる`/etc/hosts`の上書きにそなえてバックアップをとっておく。

```console
# cp /etc/hosts /etc/hosts.orig
```

`tabedit hosts`を実行して、ホスト名とIPアドレスを登録する。例を示す。

```console
# tabdump hosts
#node,ip,hostnames,otherinterfaces,comments,disable
"scyld","10.54.0.1",,,,
"myfileserver","10.54.0.123",,,,
```

nodeの登録と`/etc/hosts`への反映、DNS起動を行う。

```console
# nodeadd myfileserver groups=server
# makehosts -n               # /etc/hostsの自動設定、これに従ってDNSが設定される
# makedns -n                # Management NodeでDNSの設定とイニシャライズ
# nslookup scyld.cluster    # DNS動作確認
```

### networks table の設定
[Set attributes in the networks table](https://xcat-docs.readthedocs.io/en/stable/guides/admin-guides/manage_clusters/ppc64le/configure/networks.html)に従ってネットワークに関する設定を進める。まずは自動設定を確認。

```console
# tabdump networks
#netname,net,mask,mgtifname,gateway,dhcpserver,tftpserver,nameservers,ntpservers,logservers,dynamicrange,staticrange,staticrangeincrement,nodehostname,ddnsdomain,vlanid,domain,mtu,comments,disable
"10_0_0_0-255_255_0_0","10.0.0.0","255.255.0.0","bond0","<xcatmaster>",,"<xcatmaster>",,,,,,,,,,,"1500",,
"192_168_0_0-255_255_0_0","192.168.0.0","255.255.0.0","enp1s0f1","192.168.0.1",,"<xcatmaster>",,,,,,,,,,,"1500",,
```

今回はDHCPでboot直後のcomputer Node群を、内部ネットワークの`10.54.3.1`から`10.54.3.254`の範囲にDHCPを使って割り当てたい。また内部ネットワークは、事前に設定しておいたbond0（ethernet bonding/aggregationを使用）に接続されている。そこで以下のように設定＋DHCPサービス開始をする。

まず、networks tableのnetname（オブジェクト名）が長すぎるので、`tabedit network`起動されるエディタ上で以下のように修正する。

```console
# tabdump networks
#netname,net,mask,mgtifname,gateway,dhcpserver,tftpserver,nameservers,ntpservers,logservers,dynamicrange,staticrange,staticrangeincrement,nodehostname,ddnsdomain,vlanid,domain,mtu,comments,disable
"clusternet","10.54.0.0","255.255.0.0","bond0","<xcatmaster>",,"<xcatmaster>",,,,,,,,,,,"1500",,
"wan","192.168.0.0","255.255.0.0","enp1s0f1","192.168.0.1",,"<xcatmaster>",,,,,,,,,,,"1500",,

# makehosts -n
```

これでオブジェクト名を`clusternet`と`wan`で参照できる。そして、オブジェクトタイプnetwork、オブジェクト名clusternetを修正する。DHCPが10.54.3.1から10.54.3.254を配布するように設定。

```console
# chdef -t network -o clusternet dynamicrange="10.54.3.1-10.54.3.254"
# makedhcp -n
```

### passwd table の設定
rootアカウントのパスワードを設定

```console
# tabdump passwd
# chtab key=system passwd.username=root passwd.password=root
```

## Compute Node群の認識と設定

[Docs » Admin Guide » Manage Clusters » IBM POWER LE / OpenPOWER](https://xcat-docs.readthedocs.io/en/stable/guides/admin-guides/manage_clusters/ppc64le/index.html)以下の記述に従って作業を進める。xCATプロジェクトはIBMの支援を受けている都合、ドキュメントではPowerPCベースIBMマシンを使った説明が記述されているが、ほとんどのユーザーの環境であるLinux on x86_64環境でも作業はほぼ同じである。

まず、[Hardware Discovery & Define Node](https://xcat-docs.readthedocs.io/en/stable/guides/admin-guides/manage_clusters/ppc64le/discovery/index.html)を参照。方法の選択肢は手動設定と、自動設定としてMTMS（Machine Type and MAchene Serial）による認識、スイッチングハブへの接続ポート番号による認識、順序依存の認識がある。

### Machine Type/Model and Serial
今回はcompute node数が10なので、ドキュメントのお勧めに従い、[MTMSによる認識](https://xcat-docs.readthedocs.io/en/stable/guides/admin-guides/manage_clusters/ppc64le/discovery/mtms/index.html)を選んでみる。推奨は「BMC/IPMI IPアドレスは、まずDCHP割り当てを受けて、後に別サブネットの静的IPアドレスを設定する」という方法。普通は、BMC/IPMIがDHCPから動的にIPアドレスを得ることが多いかもしれない。ただ筆者の環境では、あらかじめBMC/IPMIの静的IPアドレスを10.54.0.1-10に設定であったので、ドキュメントと少々違うがこれをそのまま使う事にする。

※BMC/IPMI: Intellinget Platform Management Interface (IPMI)のためのマイコンチップがBaseboard Management Controller (BMC)だが、xCATでは用語が混在している。

```console
# bmcdiscover --range 10.54.150.1-254 -u ADMIN -p ADMIN -z -w
# bmcdiscover --range 10.54.150.1-254 -u adimn -p admin -z -w
Writing node-0025901d9c29 (10.54.150.10,Winbond,,admin,admin,mp,bmc,0025901d9c29,,) to database...
node-0025901d9c29:
        objtype=node
        groups=all
        bmc=10.54.150.10
        cons=ipmi
        mgt=ipmi
        mtm=Winbond
        bmcusername=admin
        bmcpassword=admin
（中略）
# lsdef /node-.*
Object name: node-0025901d8c1e
    bmc=10.54.150.3
    bmcpassword=admin
    bmcusername=admin
（中略）
```

`bmcdiscover`はデフォルトではログインに`passwd`テーブルの`key=ipmi`を参照するのだが、筆者環境ではマシン群では、User/Passwordの組み合わせが異なるマシンが混在していたので（2020年以降製造のマシンでは個体ごとに違ったりするようである）、異なる組み合わせでbmcdiscoverを2回発行した。ともかくすべてのマシンのBMC/IPMIを認識してxCAT内部データベースに書き込めたようだ。こうやって作った情報をもとに各マシンの静的な設定ファイルを作る。

```console
# cd /root/xCATsetup
# bmcdiscover --range 10.54.0.1-254 -u ADMIN -p ADMIN -z > predefined.stanza
# bmcdiscover --range 10.54.0.1-254 -u adimn -p admin -z >> predefined.stanza
```

エディタでpredefined.stanzaを編集する。

```config:/root/xCATsetup/predefined.stanza
node-0025901d9e23:
        objtype=node
        groups=all
        bmc=10.54.150.1
        cons=ipmi
        mgt=ipmi
        mtm=Winbond
        bmcusername=admin
        bmcpassword=admin
```

を

```config:/root/xCATsetup/predefined.stanza
cn02:
        ip=10.54.2.2
        netboot=xnba
        mac=XX:YY:ZZ:XX:YY:ZZ
        objtype=node
        groups=compute2,all,ipmi
        chain="runcmd=bmcsetup"
        bmc=10.54.150.1
        cons=ipmi
        mgt=ipmi
        mtm=Winbond
        bmcusername=admin
        bmcpassword=admin
```

のように、各compute-nodeについて変更する。`ip=10.54.2.2`はこのcomputeノードの静的IPアドレスである。これらをまとめて内部データベース似書き込む。ただ筆者の場合、うまく製造番号（serial）情報がとりこめなかった。このため手動で（IPMIではなく)NICのMACアドレスも書き込んだ。`groups=compute2,all`および`chain="runcmd=bmcsetup"`も追加した。これで、compute node全体を`compute2`で参照することができる（筆者は別のxCATを運用中なので区別するため「compute2」という名前をつけた）。

```console
# cat predefined.stanzas | mkdef -f -z　
```

compute nodeの情報を`hosts`テーブルに追加する。Perl形式の正規表現の使い方は[ドキュメントのこちら](https://xcat-docs.readthedocs.io/en/stable/guides/admin-guides/basic_concepts/xcat_db/regexp_db.html?highlight=otherinterfaces#easy-regular-expressions)を参照してほしい。以下の例では`cn01`, `cn02`...が`10.54.2.1`, `10.54.2.2`に割り当てられ、同時に`cn01-ipmi`, `cn02-ipmi`...が`10.54.2.101`, `10.54.2.102`に割り当てられる。

```console
# tabedit hosts #以下のようにエディタで編集
# tabdump hosts
#node,ip,hostnames,otherinterfaces,comments,disable
"compute2","|\D+(\d+)|10.54.2.($1+0)|",,"|\D+(\d+)|cn($1)-ipmi:10.54.150.($1+100)|",,
# makehosts -n
# cat /etc/hosts #確認
```

`rpower compute2 status`でcompute nodeすべての電源状態が表示できればここまで設定完了。

###Compute Node群でのOSブート方法の選択

Compute Node群にOSを送り込むには、

1. [Diskful Installation](https://xcat-docs.readthedocs.io/en/stable/guides/admin-guides/manage_clusters/ppc64le/diskless/index.html)
2. [Diskless Installation (Stateless Installation)](https://xcat-docs.readthedocs.io/en/stable/guides/admin-guides/manage_clusters/ppc64le/diskless/index.html)
の２つの方法がある。

前者は、各Compute NodeローカルのストレージにOSをインストールしてそこから起動する方法。後者は起動の度にOSイメージ（"netboot" osimage）をCompute Node群に送り込み、その後に起動する。後者であっても各Compute Nodeに接続されたローカルストレージに（たとえばテンポラリディレクトリや頻回アクセスファイルなどを置いて）アクセスすることはできる。この意味ではStatelessといったほうがより正しいかもしれない。

ネットワーク構成が十分な帯域があって、各Compute Nodeに十分なメモリがあるのならば、すべてをManagement Nodeから一括で扱えるiskless Installationが第一選択だろう。

### OSイメージの作成

現バージョンのxCATがサポートするOSは、`ls -L /opt/xcat/share/xcat/netboot/*/*.pkglist`で出てくるパッケージリストに含まれる必要がある。Ubuntuについて`ls -L /opt/xcat/share/xcat/netboot/ubuntu/*.pkglist`でみてみると、18.04と18.04-2がサポートされている。また、Lubuntuのisoファイルも上手く認識してくれないようなので、ここはおとなしくunbuntu-18.04.2-server.amd64.isoダウンロードしてしてから、osimageを作成する。

```console
# mkdir -p /install/iso
# cd /install/iso
# wget http://releases.ubuntu.com/18.04.2/ubuntu-18.04.2-server-amd64.iso
# copycds ubuntu-18.04.2-server-amd64.iso
# lsdef -t osimage
ubuntu18.04.2-x86_64-install-compute  (osimage)
ubuntu18.04.2-x86_64-install-service  (osimage)
ubuntu18.04.2-x86_64-netboot-compute  (osimage)
```

`ubuntu18.04.2-x86_64-netboot-compute`がDiskless installationのためのOSイメージ名である。このOSイメージをこれから生成するが、目的に応じたのパッケージ追加などのアレンジ加えることもできる。ただ、将来のUbuntuアップデート後の再現性を担保するために必要な変更はOSブート後のシェルスクリプト（postscript）で行うことが推奨されているので、ここはそのまま先に進む。

```console
# genimage ubuntu18.04.2-x86_64-netboot-compute　# しばらく時間がかかる
（中略）
cd /tmp/xcatinitrd.18922;find .|cpio -H newc -o|gzip -9 -c - > /install/netboot/ubuntu18.04.2/x86_64/compute/initrd-stateless.gz 
691853 blocks

# packimage ubuntu18.04.2-x86_64-netboot-compute
# mknb x86_64
```

しっかりと再現できないトラブルなのだが、`Error: Can not create bootstraps for rootimage. Make sure you specified full http mirror path..`のエラーでgenimageが途中終了してしまう場合（aptサーバーが高負荷？）は、

```console
# rm -rf /install/ubuntu18.04.2
# rm -rf /install/netboot/ubuntu18.04.2
```

してから、`copycds`からやりなおすとうまくいくことがある。

また、`genimage`が大量の`ldd: ./linux-vdso.so.1: No such file or directory`の警告を出すことがある（[issue #5887](https://github.com/xcat2/xcat-core/issues/5887), [issue #6694](https://github.com/xcat2/xcat-core/pull/6694)）。これは無視してもいいとのこと。

最後の`mknb`コマンドだが、ドキュメント上では手動での起動は不要のようにも読める。しかし、これを実行しないとcompute nodeが起動後に最初に読みに行くnetwork bootimage `/tftpboot/xcat/xnba/nets/10.54.0.0_16`（および*.elilo, *.uefi)がうまく生成されないようである。

### syncfilesの設定

management nodeのファイルをcompute node群に`synclist`に従って同期させることができる。同期のタイミングは、postscriptのひとつ`/install/postscripts/syncfiles`が実行される時か、`updatenode -F`を手動で実行したときである。ここでは、management nodeアカウントファイル（`/etc/passed`, `/etc/group`, `/etc/shadow`）の同期をさせる。このとき（AppArmorなどによるセキュリティの関係上？）management node側の全く同じpathになるファイルを同期させることはできないので、別ファイルにコピーしておく必要がある。

```console
# cp /etc/passwd /etc/passwd.xcat
# cp /etc/group /etc/group.xcat
# cp /etc/shadow /etc/shadow.xcat
```

`mkdir -p /install/custom/netboot/ubuntu/`としてから`compute.ubuntu18.04.2.synclist`を作成する。

```config:/install/custom/netboot/ubuntu/compute.ubuntu18.04.2.synclist
/etc/passwd.xcat -> /etc/passwd
/etc/group.xcat -> /etc/group
/etc/shadow.xcat -> /etc/shadow
```

最後に

```console
# chdef -t osimage -o ubuntu18.04.2-x86_64-netboot-compute synclists=/install/custom/netboot/ubuntu/compute.ubuntu18.04.2.synclist
```

で`synclists`を指定する。

### compute node群にOSイメージを設定

```console
# chdef compute2 -p chain="runcmd=bmcsetup,osimage=ubuntu18.04.2-x86_64-netboot-compute"
# nodeset compute2 osimage=ubuntu18.04.2-x86_64-netboot-compute # /tftpd/xcat/xnba/nodes以下を生成
# rsetboot compute2 net
# makehosts -n
# makedns -n ; makedhcp -n ; makedhcp -a
# rpower compute2 boot
```

`makedns -s ; makedhcp -n ; makedhcp -a`はcompute node起動前に実行し直した方が無難。さて、これで`ssh cn01`でログインできるようならば何の問題もないのだけれど、筆者の環境ではどうもうまくいかなかった。以下のトラブルシューティングを試みてみた。

### netbootのトラブルシューティング

デバッグ目的に、compute node群のリモートコンソールも使えるようにしておく。`makegocons`で設定し、`rcons <node>`で起動する。rconsの終了は、`ctrl-e`の後に`c.`である。

```console
# makegocons 
Starting goconserver service ...
cn10: Created
cn01: Created
（中略）
cn06: Created
 
# rcons cn01
[Enter `^Ec?' for help]
goconserver(2020-06-19T09:47:14+09:00): Hello 192.168.0.21:41898, welcome to the session of cn01
```

compute nodeが、getdestinyがらみでとまってしまう場合、たとえばsyslogで

```text
Jun 18 17:10:50 10.54.3.2 [localhost] xcat.genesis.doxcat: Getting initial certificate --> 10.54.0.1:3001
Jun 18 17:11:00 10.54.3.2 [localhost] xcat.genesis.doxcat: Running getdestiny --> 10.54.0.1:3001
Jun 18 17:11:10 10.54.3.2 [localhost] xcat.genesis.doxcat: Received destiny=
Jun 18 17:11:10 10.54.3.2 [localhost] xcat.genesis.doxcat: The destiny=, destiny parameters=
Jun 18 17:11:10 10.54.3.2 [localhost] xcat.genesis.doxcat: Unrecognized directive (dest=)
Jun 18 17:11:19 10.54.3.2 [localhost] xcat.genesis.doxcat: ... Will retry xCAT in 70 seconds
```

などで先に進まない場合、dhcpやdnsの設定ミスがないか再確認すると解決するかもしれない。`tabedit site`などで入力ミスがないか確認して、`makedns -s ; makedhcp -n ; makedhcp -a ; rpower compute2 boot`。

また、Compute Nodeが、`cat predefined.stanza | mkdef -z`で設定した（BMC/IPMIではなく）メインNICに指定したIPアドレスを使わずに、DHCPでアサインされたIPを使用してしまい、

```text
Jun 19 10:20:10 10.54.3.21 [localhost] xcat.genesis.dodiscovery: Beginning echo information to discovery packet file...
Jun 19 10:20:11 10.54.3.21 [localhost] xcat.genesis.dodiscovery: Discovery packet file is ready.
Jun 19 10:20:11 10.54.3.21 [localhost] xcat.genesis.dodiscovery: Sending the discovery packet to xCAT (10.54.0.1:3001)...
Jun 19 10:20:11 10.54.3.21 [localhost] xcat.genesis.dodiscovery: Sleeping 5 seconds...
Jun 19 10:20:11 10.54.3.21 [localhost] xcat.genesis.minixcatd: The request is processing by xCAT master...
Jun 19 10:20:12 scyld xcat[17879]: xcatd: Processing discovery request from 10.54.3.21
Jun 19 10:20:12 scyld xcat[17879]: xcat.discovery.aaadiscovery: (00:25:90:1d:6e:ae) Got a discovery request, attempting to d
Jun 19 10:20:12 scyld xcat[17879]: xcat.discovery.blade: (00:25:90:1d:6e:ae) Warning: Could not find any nodes using blade-b
Jun 19 10:20:12 scyld xcat[17879]: xcat.discovery.switch: (00:25:90:1d:6e:ae) Warning: Could not find any nodes using switch
Jun 19 10:20:12 scyld xcat[17879]: xcat.discovery.mtms: (00:25:90:1d:6e:ae) Warning: Could not find any node for Super Micro
Jun 19 10:20:12 scyld xcat[17879]: xcat.discovery.zzzdiscovery: (00:25:90:1d:6e:ae) Failed for node discovery.
Jun 19 10:20:12 scyld xcat[17879]: xcat.discovery.zzzdiscovery: Notify 10.54.3.21 that its findme request has been processed
Jun 19 10:20:11 10.54.3.21 [localhost] xcat.genesis.minixcatd: The request is already processed by xCAT master, but not matc
```

Compute NodeがManagement Serverに自分を発見するようにリクエストしても、そのIPアドレスが既知のcompute nodeのそれではないということで拒否される状況では、

```console
# chdef -t node -o cn01 mac="00:11:22:DD:EE:FF"
# makedns -n ; makedhcp -n ; makedhcp -a
# rinstall compute2 runcmd=bmcsetup,osimage=ubuntu18.04.2-x86_64-netboot-compute
# rpower cn01 boot
```

とあらためてMACアドレスを指定しなおして、DHCPがcn01とそのMACアドレスを見つけて、正しいIPアドレスを割り当てるようにする。その上で`rpower compute2 boot`をかけると上手くいった。

# 細かいトラブルシューティング
## syslogの肥大

syslogに以下のメッセージが頻繁に記録されてしまうことがあれば、

```/var/log/syslog
Jul 31 16:36:34 xcat rsyslogd: action 'action 7' resumed (module 'builtin:omfile') [v8.32.0 try http://www.rsyslog.com/e/2359 ]
Jul 31 16:36:34 xcat rsyslogd: action 'action 7' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.32.0 try http://www.rsyslog
```

以下のようにpermissionを修正することで抑制できるようです。

```console
# chown syslog.adm /var/log/xcat
# chmod g+xr /var/log/xcat
# chown syslog.adm /var/log/xcat/*.log
# chmod g+r /var/log/xcat/*.log
```

#つづく
これで、一応HPCクラスターが立ち上がるところまで設定できた。xCATが面倒をみてくれるのは、BMC/IPMIによるcompute node群のコントロール、OSのデプロイ、ネットワーク管理、ユーザーアカウント管理をふくめてcompute nodeの管理などまでである。このあと、クラスターの稼働状況を表示するGangliaやジョブスケジューラーSGEなど、準備設定すべきものがいろいろあるので、それはまた別記事として書くことにする。また、本稿に間違いや不明点あれば、ぜひご指摘戴ければありがたい。