はじめに

MD・DFTやプリポスト処理用のサーバーやHPCクラスタとソフトウェアの各種設定について,覚書としてまとめていくページです。このページに記載の設定は筆者の好みが反映された構成に過ぎませんので,あくまで一つの例として参照ください。

個人的に蓄積してきたノウハウやメモのほかに,色々な方々とやりとりして得た情報も含めて,支障ない範囲で記録として書いていく予定です。過去gihub pagesに類似のページは作ってましたが,wordpressの方が画像ごとコピペしやすいため,可能な限りこちらに集約していく見込みです(書きやすい方がたぶん小まめな更新がしやすいので・・)。内容がまとまってきたらQiitaに引っ越すかもしれません。


OS基本設定項目

初回設置時に一部を業者にやってもらうケースもあるため,一から全てのデータとなっているかと言われればそうではないかも。なおRHEL系でセットアップしてまとめますので,基本的にはRHEL/CentOS/AlmaLinux/RockyLinuxユーザーを前提とする。そのためUbuntuなどのDebian系の方はその点ご留意すること。

dnf/yum

手持ちのサーバーはAlmalinux 8.9のためdnfをベースとして記載するが,用法はyumとほぼ同じはず。

[ishii@mdx01 ~]$ cat /etc/redhat-release
AlmaLinux release 8.9 (Midnight Oncilla)

dnfを特段設定を変えるわけではなく,epelとpowertoolsはインストールしておくけど,基本的には無効化設定とする。

[ishii@mdx01 ~]$ grep enabled /etc/yum.repos.d/epel.repo
enabled=0
enabled=0
enabled=0

[ishii@mdx01 ~]$ grep enabled /etc/yum.repos.d/almalinux-powertools.repo
enabled=0
enabled=0
enabled=0

epelやpowertoolsを使いたいときは,$ sudo dnf install --enablerepo=epel <new packages> などとするほうが,意図しないパッケージの更新は起きづらいと判断。なおpowertoolsはCentOS/AlmaLinux/RockyLinuxのためのリポジトリで,RHELだとcodeready-builder-for-rhel-8などという名称になるので注意する。

HPCクラスタを構築する際は,dnfによるパッケージ・ライブラリは共通項のもののみとする。管理者権限でパッケージを入れすぎると,タイミングによっては同様の環境を再構築することが難しくなるのと,パッケージの導入を計算ノードでも処理するのが面倒になる。

gromacsなどのソフトウェアだけでなくfftwなどのライブラリもソースコードからビルドして,NFSで計算ノードへ公開するストレージ領域で共有設定しておく。あとgnuplotもソースコードからビルドする(dnfでいれるgnuplotは,tabによる予測変換などの誤作動が多い気がしてあまり・・)

ssh

opensshは学内などのセキュアな環境が保証されている場合はあまり変更しなくて良いか。学外開放する場合はportの変更が推奨だが,全学的なfirewallの設定とHPCサービスとしての運用次第。研究室サーバーとしては以下の項目を調整。

[ishii@mdx01 ~]$ sudo vi /etc/ssh/sshd_config
...
PermitRootLogin yes          # 管理目的のため,設置後しばらくはrootによるログイン可に
...
PasswordAuthentication yes   # 同上の理由からパスワード認証を可のまま
...

その後,/etc/hostsに管理対象のストレージー・計算サーバーのIPアドレスを記載した後,sshアクセスの詳細は各ユーザの.ssh/configへ記載。

[ishii@mdx01 ~]$ sudo vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

XX.XX.XX.XX     mdx01.external

192.168.1.1     mdx01.local     mdx01
192.168.1.2     mdx02.local     mdx02
192.168.1.3     mdx03.local     mdx03
192.168.1.4     mdx04.local     mdx04
192.168.1.5     mdx05.local     mdx05
[ishii@mdx01 ~]$ cat .ssh/config
ServerAliveInterval 30
ServerAliveCountMax 2880

Host localhost mdx0*
    GSSAPIAuthentication no
    StrictHostKeyChecking no
    IdentityFile ~/.ssh/mdx_id_rsa
    UserKnownHostsFile ~/.ssh/known_hosts

configファイルにて StrictHostKeyChecking no を入力しておかないと,ノード間並列計算を実行する時にうまく実行されない場合があるため要注意。つまり,ジョブスケジューラを通じて並列計算が実行される際,計算ノード間でのデータのやり取りの間で,Are you sure you want to continue connecting (yes/no/[fingerprint])? の状態で止まってしまう。一度計算ノードへとsshでアクセスしてknown_hostsに記録させるか,上記のようにconfigに書くか,/etc/ssh/sshd_configでknows_hostsを記録しないようにする対応などが必要となる。

NFS

計算クラスタを構築する以上,同じディレクトリツリーが管理ノードと計算ノード上で参照可能でないと(おそらく)いけないため,NFSを利用する。Lustreなどの分散ファイルシステムのほうが高速だが,高価なため研究室レベルではやはり難しい。なおRHELの場合,ファイルシステムに応じて利用可能なストレージ容量の最大値が変わるので要注意(https://access.redhat.com/ja/articles/1271503)。

NFS関係のパッケージを以下の通り導入したら,/etc/exportsファイルへイントラネットへ公開するディレクトリの情報を記載する。この/etc/exportsを作成する際は,IPアドレス→サブネットマスクのあとにNFS共有オプションを記載することができるが,サブネットマスクと共有オプションの間にスペースを入れないように要注意。またサブネットマスクは省略可能。

[ishii@mdx01 ~]$ sudo dnf -y install nfs-utils

[ishii@mdx01 ~]$ sudo vi /etc/exports
/home	192.168.1.0/24(rw,async,no_root_squash)

/etc/exportsにイントラネットへ公開するディレクトリを書いただけでは,当該ディレクトリの公開が反映されないため,nfsサービスを開始した後,exportfs -aコマンドで設定を反映して,イントラネットへと公開する。

[ishii@mdx01 ~]$ sudo systemctl start nfs-server

[ishii@mdx01 ~]$ sudo systemctl enable nfs-server

[ishii@mdx01 ~]$ sudo exports -a # 公開開始

[ishii@mdx01 ~]$ sudo exports -v # 公開設定を確認
/home         	192.168.1.0/24(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

[ishii@mdx01 ~]$ sudo systemctl status nfs-server
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
  Drop-In: /run/systemd/generator/nfs-server.service.d
           └─order-with-mounts.conf
   Active: active (exited) since Mon 2024-09-09 17:49:02 JST; 9min ago
  Process: 896846 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 896841 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 896839 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 896894 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 896879 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
  Process: 896877 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 896894 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 819416)
   Memory: 0B
   CGroup: /system.slice/nfs-server.service

RAID

複数のHDDを元にして,一つのストレージ領域を作成し,データ管理の容易さと冗長性をもたせたいため,RAIDを活用する。安価なサーバー上ではmdadmパッケージによるソフトウェアRAIDを使うが,業者から購入するお高いサーバーではハードウェアRAIDがやはり好ましい。

以下ではまず,mdadmを導入してから,HDDのパーティションを作成する。

[ishii@mdx00 ~]# dnf install mdadm

# 必ずsmartctlコマンドで,RAID対象となるデバイスの名称を確認すること。
# 今回の場合は,/dev/sd[bcdef] の5台でRAID領域を構築。

[root@mdx00 ishii]# smartctl -a /dev/sdb | grep "Device Model"
Device Model:     WDC WD120EFBX-68B0EN0
[root@mdx00 ishii]# smartctl -a /dev/sdc | grep "Device Model"
Device Model:     WDC WD120EFBX-68B0EN0
[root@mdx00 ishii]# smartctl -a /dev/sdd | grep "Device Model"
Device Model:     WDC WD120EFBX-68B0EN0
[root@mdx00 ishii]# smartctl -a /dev/sde | grep "Device Model"
Device Model:     WDC WD120EFBX-68B0EN0
[root@mdx00 ishii]# smartctl -a /dev/sdf | grep "Device Model"
Device Model:     WDC WD120EFBX-68B0EN0
[root@mdx00 ishii]#

# 以下の作業を/dev/sdb, /dev/sdc, /dev/sdd, /dev/sde, /dev/sdfの5台分に対して実行

[root@mdx00 ishii]# parted --script /dev/sdb "mklabel gpt"
[root@mdx00 ishii]# parted --script /dev/sdb "mkpart primary 0% 100%"
[root@mdx00 ishii]# parted --script /dev/sdb "set 1 raid on"

[root@mdx00 ishii]# parted /dev/sdb print  # これはRAID構築済みの状態でprintしたが,未構築だったらファイルシステムの情報が未記載のはず
モデル: ATA WDC WD120EFBX-68 (scsi)
ディスク /dev/sdb: 12.0TB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前  フラグ
 1    1049kB  12.0TB  12.0TB                    xfs   raid

HDDの用意ができたら,mdadmの設定を構築する。

[root@mdx00 ishii]# mdadm --create /dev/md0 --level=raid5 --raid-devices=5 /dev/sd[bcdef]1

# 以下はフォーマットが終わった状態だが,5台分が参照できていることがわかる。
# 定期的に確認し,[UUUUU]と台数分だけUが表示されて問題ないことを確認すること。
# (異常時は[UUUU_]などとなる)

[root@mdx00 ishii]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdc1[1] sde1[3] sdb1[0] sdd1[2] sdf1[5]
      46875004928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [5/5] [UUUUU]
      bitmap: 0/88 pages [0KB], 65536KB chunk

unused devices: <none>

# xds形式でraid領域をフォーマットしてマウント。

[root@mdx00 ishii]# mkfs.xfs -i size=1024 -s size=4096 /dev/md0

[root@mdx00 ishii]# mount /dev/md0 /misc

# 定期的なチェック対象に,今回構築したファイルシステムを適用。

[root@mdx00 ishii]# vi /etc/sysconfig/raid-check
...
CHECK_DEVS="md0"
....

# mdadmで構築されたraidパーティションの情報を参照。

[root@mdx00 ishii]# mdadm --detail -scan
ARRAY /dev/md/0 metadata=1.2 name=mdx00:0 UUID=00e6d676:9820ce8d:f26b32f8:b94f687b

# mdadmの設定ファイルへ監視対象のraidパーティションを追加

[root@mdx00 ishii]# mdadm --detail -scan >> /etc/mdadm.conf

[root@mdx00 ishii]# cat /etc/mdadm.conf
MAILADDR root
AUTO +imsm +1.x -all
ARRAY /dev/md/0 metadata=1.2 name=mdx00:0 UUID=00e6d676:9820ce8d:f26b32f8:b94f687b

# /dev/md0の状態を最後に確認。名称に関する警告?が出ているけど,無視してOKの模様。
# (ここの「mdx00:0」の名称から:0を外すと,正常起動できなくなるため注意する)

[root@mdx00 ishii]# mdadm --detail /dev/md0
mdadm: Value "mdx00:0" cannot be set as name. Reason: Not POSIX compatible. Value ignored.
/dev/md0:
           Version : 1.2
     Creation Time : Tue Dec 13 22:55:09 2022
        Raid Level : raid5
        Array Size : 46875004928 (43.66 TiB 48.00 TB)
     Used Dev Size : 11718751232 (10.91 TiB 12.00 TB)
      Raid Devices : 5
     Total Devices : 5
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Mon Sep  9 19:41:56 2024
             State : clean
    Active Devices : 5
   Working Devices : 5
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : bitmap

              Name : mdx00:0
              UUID : 00e6d676:9820ce8d:f26b32f8:b94f687b
            Events : 61193

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1
       3       8       65        3      active sync   /dev/sde1
       5       8       81        4      active sync   /dev/sdf1

NIS

CUDA

Infiniband

OpenPBS

Environment module

VNC server


ソフトウェアのビルドと設定

一部は閲覧制限かけるかもしれないけど,とりあえず記載可能項目を。

gnu

python

julia

intel oneapi

openmpi

hpcx

fftw

Gromacs

Lammps

ERmod

AmberTools

CPMD

CP2K

VASP

PLUMED

Ovito