Ubuntu20.04に SLURMデータベースを構成する

Ubuntu 20.04にSLURMのデータベースを構成する手順を忘備録としてまとめました。

仮想環境にてSLURM検証環境を構築する、といことについても以前まとめていますのでご参考ください。
参考）https://qiita.com/believeriver/items/2204394cead531f6881c

# mariadbインストール
データベースサーバとしてはmariadbが使用されますので、まずmariadbをインストールします。
```
sudo apt update
sudo apt install -y mariadb-server
```
インストールが完了したら mariadb をenable化して起動しておきます。
```
sudo systemctl enable mariadb.service
sudo systemctl start mariadb.service
sudo systemctl status mariadb.service| grep Active| awk '{print $2 $3}'
```

mariadbのセットアップをします（パスワードなど）
基本的には、Enterと「Y」で進めていくだけです。データベースのrootパスワードは忘れないようにメモしておいてくださいね。今後使います。
```
root@ubuntu:~# sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):  ＊＊初回なのでパスワードなしです。Enterで進めます。*＊
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: ＊＊任意のパスワードを設定します。忘れないように！*＊
Re-enter new password: ＊＊　パスワードの確認　＊＊
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
root@ubuntu:~/work/setting-slurm/slurmdbd# 
```

これで、mariadbのインストールと設定は終了です。

# slurmdbdのセットアップ
slurmデータベースを扱うために、slurmdbdの設定を行います。

注）ここから先は、munge, slurmがインストールされていて、SLURMが使用できる状態であることを前提として進めます。もし、SLURMインストールをトライされたい場合は、
https://qiita.com/believeriver/items/2204394cead531f6881c
も参考にしていただければと思います。

### slurmdbd.conf作成
それでは、まずslurmdbd.confを作成します。

slurmdbd.confの雛型は、下記URL（GitHub）にあるものを参考にして、各位の環境に合わせて修正しました。
参考）https://github.com/SchedMD/slurm/blob/master/etc/slurmdbd.conf.example

私の場合は、以下の項目を見直します。
前提として、ヘッドノードとデータベースサーバを同じホストで運用します。
さらに、私の場合はslurmをrootユーザで運用します。

- DbdAddr=localhost
- DbdHost=localhost
- SlurmUser=root
- StorageHost=localhost
- StoragePass=*******( mariadbのrootユーザで設定したもの　）
- StorageUser=root

ヘッドノードとデータベースサーバが別のホストの場合は、localhostではなく適切なホスト名とIPアドレスに修正が必要です。

また、一般的には、「slurm」ユーザを手動で作成して設定を構築していくのですが、あえて　root ユーザで運用をしています。
これは、「slurm」ユーザに対して適切なファイルへのPermission設定や、データベースもslurm用のデータベースを構築する必要があるなど、環境設定が複雑になるためです。

注）最初は、slurmユーザを丁寧に作って構築したのですが、データベースも含めてSLURM環境構築は結構大変でした。。パーミッション設定などで動かないなど、ハマってしまうリスクもあるので、root権限で環境を構築するようにしています。


それでは、私が今回作成した　slurmdbd.conf の全体は以下の通りです。
```
#
# Example slurmdbd.conf file.
#
# See the slurmdbd.conf man page for more information.
#
# Archive info
#ArchiveJobs=yes
#ArchiveDir="/tmp"
#ArchiveSteps=yes
#ArchiveScript=
#JobPurge=12
#StepPurge=1
#
# Authentication info
AuthType=auth/munge
#AuthInfo=/var/run/munge/munge.socket.2
#
# slurmDBD info
DbdAddr=localhost
DbdHost=localhost
#DbdPort=7031
#SlurmUser=slurm
SlurmUser=root
#MessageTimeout=300
DebugLevel=verbose
#DefaultQOS=normal,standby
#LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurmdbd.pid
#PluginDir=/usr/lib/slurm
#PrivateData=accounts,users,usage,jobs
#TrackWCKey=yes
#
# Database info
StorageType=accounting_storage/mysql
StorageHost=localhost
#StoragePort=1234
StoragePass=**********
#StorageUser=slurm
StorageUser=root
#StorageLoc=slurm_acct_db
```

作成した　slurmdbd.conf を /usr/local/etc/　に保存します。(slurm.confと同じディレクトリに配置します）
```
root@ubuntu:~# cp slurmdbd.conf /usr/local/etc/
root@ubuntu:~# ls -l /usr/local/etc/
total 16
-rw-r--r-- 1 root root 1762 Nov 28 04:44 slurm.conf
-rw-r--r-- 1 root root  799 Dec  5 13:27 slurmdbd.conf
```

slurmdbd.conf のパーミッションを　600 に修正します。
```
chmod 600 /usr/local/etc/slurmdbd.conf
```

### slurm.confの修正
slurmdbdを使うために、slurm.conf も修正する必要があります。
次の設定で、slurmdbdを指定するように修正してください。

slurm.conf　の修正箇所のみ記載します。
```
# LOGGING AND ACCOUNTING
#デフォルトをコメントアウトして、StorageTypeをslurmdbdに修正
#AccountingStorageType=accounting_storage/none
AccountingStorageType=accounting_storage/slurmdbd
#
#以下２つを追加
AccountingStorageHost=ubuntu
AccountingStoragePass=/var/run/munge/munge.socket.2
```

#slurmdbdの起動
まず、slurmdbdをデーモン化します。slurmdbd.serviceはSLURMのインストール時に展開したパッケージの中にありますので、それをコピーします。
```
HOME=/home (ここは、インストール先に合わせて変えてください）
sudo cp ${HOME}/slurm-20.11.9/etc/slurmdbd.service /etc/systemd/system/
```
slurmに関するサービスが登録されていることを確認します。
```
# ls -l /etc/systemd/system/ | grep slurm
-rw-r--r-- 1 root root  356 Nov 21 22:33 slurmctld.service
-rw-r--r-- 1 root root  360 Dec  5 14:19 slurmdbd.service
-rw-r--r-- 1 root root  432 Nov 21 22:33 slurmd.service
```

slurmdbdを起動します。
```
sudo systemctl enable slurmdbd
sudo systemctl start slurmdbd
sudo systemctl status slurmdbd | grep Active| awk '{print $2 $3}'
```

これで問題なく起動できればOKです。次の章に進んで、sacctコマンドの実行確認をしてください。

一方で、slurmdbd の起動に失敗してしまう場合、もしかしたらslurmのインストールでデータベース周りのプラグインのコンパイルに失敗している可能性があります。(私もかなりハマってしまいました。原因調査した内容を自分の忘備録としてAppendixにまとめておきます。特に読む必要はありませんが、ご参考までに、、）
私の場合のトラブルシュートの手順をまとめておきます。
まず、原因を探ります。
```
root@ubuntu:/usr/local/etc# slurmdbd -D -vvvv
slurmdbd: debug:  Log file re-opened
slurmdbd: pidfile not locked, assuming no running daemon
slurmdbd: debug3: Trying to load plugin /usr/local/lib/slurm/auth_munge.so
slurmdbd: debug:  auth/munge: init: Munge authentication plugin loaded
slurmdbd: debug3: Success.
slurmdbd: debug3: Trying to load plugin /usr/local/lib/slurm/accounting_storage_mysql.so
slurmdbd: error: Couldn't find the specified plugin name for accounting_storage/mysql looking at all files
slurmdbd: error: cannot find accounting_storage plugin for accounting_storage/mysql
slurmdbd: error: cannot create accounting_storage context for accounting_storage/mysql
slurmdbd: fatal: Unable to initialize accounting_storage/mysql accounting storage plugin
```
ポイントは、「/usr/local/lib/slurm/accounting_storage_mysql.so」がないと怒られているのです。
そこで、チェックしてみると本当にないようでした。
```
# ls /slurm-wlm-arm64/usr/lib/aarch64-linux-gnu/slurm-wlm | grep storage
accounting_storage_filetxt.so
accounting_storage_mysql.so
accounting_storage_none.so
accounting_storage_slurmdbd.so
```

これは、いろいろ調べた結果、SLURMをインストールするためにダウンロードしたパッケージにて、makeコンパイルが完全にできていなかったようです。
そこで、以下の手順にて、pluginの「make」と「make install」を行なってください。
pluginの場所は、展開済みのSLURMパッケージ/src/plugins です。
```
#まず　Makefile を更新します
#slurmパッケージの展開場所に移動してください（私の場合は、slurm-20.11.9)
root@ubuntu:cd /install/slurm-20.11.9
#mungeの実行パスをオプションにつけて、./configure にてコンパイルします。
root@ubuntu:/home/setting-slurm/install/slurm-20.11.9# munge_dir=$(which munge) && echo ${munge_dir%/munge}
/usr/bin
root@ubuntu:/install/slurm-20.11.9# ./configure --with-munge="${munge_dir%/munge}"
#
#MakeFileを更新できたら、slurm-20.11.9/src/plugins に移動します
cd slurm-20.11.9/src/plugins
#ここにもMakeFileがあり、先ほどコンパイルでMakeFileが更新されています。
#ここでmakeを実施します。
root@ubuntu:/home/setting-slurm/install/slurm-20.11.9/src/plugins# make
Making all in accounting_storage
make[1]: Entering directory '/home/setting-slurm/install/slurm-20.11.9/src/plugins/accounting_storage'
Making all in common
make[2]: Entering directory
・・・
・・・（しばらく続きます）
```
make が完了したら、accounting_storage/mysql/ を確認して、以下のようにファイルが作成されていれば、おそらくOKです。
```
# ls /install/slurm-20.11.9/src/plugins/accounting_storage/mysql/
accounting_storage_mysql.c                                as_mysql_acct.c
accounting_storage_mysql.h                                as_mysql_acct.h
accounting_storage_mysql.la                               as_mysql_archive.c
accounting_storage_mysql_la-accounting_storage_mysql.lo   as_mysql_archive.h
accounting_storage_mysql_la-accounting_storage_mysql.o    as_mysql_assoc.c
accounting_storage_mysql_la-as_mysql_acct.lo              as_mysql_assoc.h
accounting_storage_mysql_la-as_mysql_acct.o               as_mysql_cluster.c
accounting_storage_mysql_la-as_mysql_archive.lo           as_mysql_cluster.h
accounting_storage_mysql_la-as_mysql_archive.o            as_mysql_convert.c
accounting_storage_mysql_la-as_mysql_assoc.lo             as_mysql_convert.h
accounting_storage_mysql_la-as_mysql_assoc.o              as_mysql_federation.c
accounting_storage_mysql_la-as_mysql_cluster.lo           as_mysql_federation.h
accounting_storage_mysql_la-as_mysql_cluster.o            as_mysql_fix_runaway_jobs.c
accounting_storage_mysql_la-as_mysql_convert.lo           as_mysql_fix_runaway_jobs.h
accounting_storage_mysql_la-as_mysql_convert.o            as_mysql_jobacct_process.c
accounting_storage_mysql_la-as_mysql_federation.lo        as_mysql_jobacct_process.h
accounting_storage_mysql_la-as_mysql_federation.o         as_mysql_job.c
accounting_storage_mysql_la-as_mysql_fix_runaway_jobs.lo  as_mysql_job.h
accounting_storage_mysql_la-as_mysql_fix_runaway_jobs.o   as_mysql_problems.c
accounting_storage_mysql_la-as_mysql_jobacct_process.lo   as_mysql_problems.h
accounting_storage_mysql_la-as_mysql_jobacct_process.o    as_mysql_qos.c
accounting_storage_mysql_la-as_mysql_job.lo               as_mysql_qos.h
accounting_storage_mysql_la-as_mysql_job.o                as_mysql_resource.c
accounting_storage_mysql_la-as_mysql_problems.lo          as_mysql_resource.h
accounting_storage_mysql_la-as_mysql_problems.o           as_mysql_resv.c
accounting_storage_mysql_la-as_mysql_qos.lo               as_mysql_resv.h
accounting_storage_mysql_la-as_mysql_qos.o                as_mysql_rollup.c
accounting_storage_mysql_la-as_mysql_resource.lo          as_mysql_rollup.h
accounting_storage_mysql_la-as_mysql_resource.o           as_mysql_tres.c
accounting_storage_mysql_la-as_mysql_resv.lo              as_mysql_tres.h
accounting_storage_mysql_la-as_mysql_resv.o               as_mysql_txn.c
accounting_storage_mysql_la-as_mysql_rollup.lo            as_mysql_txn.h
accounting_storage_mysql_la-as_mysql_rollup.o             as_mysql_usage.c
accounting_storage_mysql_la-as_mysql_tres.lo              as_mysql_usage.h
accounting_storage_mysql_la-as_mysql_tres.o               as_mysql_user.c
accounting_storage_mysql_la-as_mysql_txn.lo               as_mysql_user.h
accounting_storage_mysql_la-as_mysql_txn.o                as_mysql_wckey.c
accounting_storage_mysql_la-as_mysql_usage.lo             as_mysql_wckey.h
accounting_storage_mysql_la-as_mysql_usage.o              config.log
accounting_storage_mysql_la-as_mysql_user.lo              Makefile
accounting_storage_mysql_la-as_mysql_user.o               Makefile.am
accounting_storage_mysql_la-as_mysql_wckey.lo             Makefile.in
accounting_storage_mysql_la-as_mysql_wckey.o
```
では、slurm-20.11.9/src/plugins にてmake install でインストールします。
```
root@ubuntu:/install/temp/slurm-20.11.9.test1/src/plugins# make install
Making install in accounting_storage
make[1]: Entering directory '/home/setting-slurm/install/temp/slurm-20.11.9.test1/src/plugins/accounting_storage'
Making install in common
make[2]: Entering directory '/home/setting-slurm/install/temp/slurm-20.11.9.test1/src/plugins/accounting_storage/common'
・・・
・・・（しばらく続きます）
# インストールが完了したら、/usr/local/bin/slurm にてacctounting_storage_mysql 関連のファイルがあるかを確認します。
root@ubuntu:/home/setting-slurm/install/temp/slurm-20.11.9.test1/src/plugins# ls /usr/local/lib/slurm/ | grep account
accounting_storage_mysql.a
accounting_storage_mysql.la
accounting_storage_mysql.so
accounting_storage_none.a
accounting_storage_none.la
accounting_storage_none.so
accounting_storage_slurmdbd.a
accounting_storage_slurmdbd.la
accounting_storage_slurmdbd.so
mcs_account.a
mcs_account.la
mcs_account.so
＃うまくいきました！
```
これで、slurmdbdを再起動してうまくいけば完了です。（私の場合は、これでうまくいきました。）
```
root@ubuntu:/home/setting-slurm/install/temp/slurm-20.11.9.test1/src/plugins# systemctl restart slurmdbd
root@ubuntu:/home/setting-slurm/install/temp/slurm-20.11.9.test1/src/plugins# systemctl status slurmdbd
● slurmdbd.service - Slurm DBD accounting daemon
     Loaded: loaded (/etc/systemd/system/slurmdbd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-12-06 03:53:47 JST; 5s ago
   Main PID: 101277 (slurmdbd)
      Tasks: 5
     Memory: 8.2M
     CGroup: /system.slice/slurmdbd.service
             └─101277 /usr/local/sbin/slurmdbd -D

Dec 06 03:53:47 ubuntu systemd[1]: Started Slurm DBD accounting daemon.
```
# slurmdbdの動作チェック（sacct,sacctmgrの応答）
### sacctmgr の確認
sacctmgrでユーザ名やクラスタ名の応答があればOKです。
```
root@ubuntu:~# sacctmgr list user
      User   Def Acct     Admin 
---------- ---------- --------- 
      root       root Administ+ 
root@ubuntu:~# sacctmgr show clusters format="cluster%16,ControlHost"
         Cluster     ControlHost 
---------------- --------------- 
         cluster     10.211.55.4 
```

### sacct の応答確認

sacctにて、ジョブのステータスが表示できるかをチェックするため、まず適当なユーザ（user1)でジョブを実行します。
```
user1@ubuntu:~$ sbatch -p debug debug.sh
Submitted batch job 17
user1@ubuntu:~$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                16     debug    debug    user1  R       0:31      1 ubuntu
                17     debug    debug    user1  R       0:02      1 ubuntu
```
sacctでこのログが取れているかを確認できればOKです。
```
root@ubuntu:/home# sacct -S2022-10-01 -E2022-12-31 --format JobID%5,end%16,User%8,JobName%8,Partition%8,NCPU%5,elapsed,state -X
JobID              End     User  JobName Partitio NCPUS    Elapsed      State 
----- ---------------- -------- -------- -------- ----- ---------- ---------- 
   15 2022-12-06T04:41    user1    debug    debug     1   00:01:00  COMPLETED 
   16 2022-12-06T07:11    user1    debug    debug     1   00:01:00  COMPLETED 
   17 2022-12-06T07:11    user1    debug    debug     1   00:01:00  COMPLETED 
```

お疲れ様でした。これで一通り、slurmdbdのインストールおよび設定作業が完了です。


# Appendix
slurmdbdを構成するにあたり、最初は　mariadb-server のみをインストールしてトライしました。
そうすると、slurmdbdを起動できませんでした。
```
root@ubuntu:/usr/local/etc# systemctl status slurmdbd
● slurmdbd.service - Slurm DBD accounting daemon
     Loaded: loaded (/etc/systemd/system/slurmdbd.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Mon 2022-12-05 14:24:25 JST; 4s ago
    Process: 7885 ExecStart=/usr/local/sbin/slurmdbd -D $SLURMDBD_OPTIONS (code=exited, status=1/FAILURE)
   Main PID: 7885 (code=exited, status=1/FAILURE)

Dec 05 14:24:25 ubuntu systemd[1]: Started Slurm DBD accounting daemon.
Dec 05 14:24:25 ubuntu systemd[1]: slurmdbd.service: Main process exited, code=exited, status=1/FAILURE
Dec 05 14:24:25 ubuntu systemd[1]: slurmdbd.service: Failed with result 'exit-code'.
root@ubuntu:/usr/local/etc# 
root@ubuntu:/usr/local/etc# slurmdbd -D
slurmdbd: pidfile not locked, assuming no running daemon
slurmdbd: error: Couldn't find the specified plugin name for accounting_storage/mysql looking at all files
slurmdbd: error: cannot find accounting_storage plugin for accounting_storage/mysql
slurmdbd: error: cannot create accounting_storage context for accounting_storage/mysql
slurmdbd: fatal: Unable to initialize accounting_storage/mysql accounting storage plugin
```

### mariadbのクライアントやプラグインのインストール
mariadbへアクセスするためのプラグインがないよと怒られてしまったので、mariadbd-clientもインストールしてみましたが解決しませんでした。

調べたところ、クライアントからmariadb を扱うには、「libmysqlclient-dev」が必要なようです。（結果的に、これらの方法では解決には至りませんでした）

```
root@ubuntu:~# sudo apt install -y libmysqlclient-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libssl-dev
Suggested packages:
  libssl-doc
The following NEW packages will be installed:
  libmysqlclient-dev libssl-dev
0 upgraded, 2 newly installed, 0 to remove and 12 not upgraded.
Need to get 3,088 kB of archives.
After this operation, 17.8 MB of additional disk space will be used.
Get:1 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libssl-dev arm64 1.1.1f-1ubuntu2.16 [1,462 kB]
Get:2 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libmysqlclient-dev arm64 8.0.31-0ubuntu0.20.04.2 [1,626 kB]
Fetched 3,088 kB in 3s (953 kB/s)               
Selecting previously unselected package libssl-dev:arm64.
(Reading database ... 196790 files and directories currently installed.)
Preparing to unpack .../libssl-dev_1.1.1f-1ubuntu2.16_arm64.deb ...
Unpacking libssl-dev:arm64 (1.1.1f-1ubuntu2.16) ...
Selecting previously unselected package libmysqlclient-dev.
Preparing to unpack .../libmysqlclient-dev_8.0.31-0ubuntu0.20.04.2_arm64.deb ...
Unpacking libmysqlclient-dev (8.0.31-0ubuntu0.20.04.2) ...
Setting up libssl-dev:arm64 (1.1.1f-1ubuntu2.16) ...
Setting up libmysqlclient-dev (8.0.31-0ubuntu0.20.04.2) ...
Processing triggers for man-db (2.9.1-1) ...
```

さらに、「libmariadb-dev」もインストールしました。
```
root@ubuntu:/usr/local/etc# sudo apt install -y libmariadb-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  libssl-dev
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
  libgmp-dev libgmpxx4ldbl libgnutls-dane0 libgnutls-openssl27 libgnutls28-dev libgnutlsxx28 libidn2-dev
  libmariadb3 libp11-kit-dev libtasn1-6-dev libtasn1-doc libunbound8 nettle-dev
Suggested packages:
  gmp-doc libgmp10-doc libmpfr-dev gnutls-bin gnutls-doc
The following packages will be REMOVED:
  libmysqlclient-dev
The following NEW packages will be installed:
  libgmp-dev libgmpxx4ldbl libgnutls-dane0 libgnutls-openssl27 libgnutls28-dev libgnutlsxx28 libidn2-dev
  libmariadb-dev libmariadb3 libp11-kit-dev libtasn1-6-dev libtasn1-doc libunbound8 nettle-dev
0 upgraded, 14 newly installed, 1 to remove and 12 not upgraded.
Need to get 4,252 kB of archives.
After this operation, 8,819 kB of additional disk space will be used.
Get:1 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libgmpxx4ldbl arm64 2:6.2.0+dfsg-4ubuntu0.1 [8,836 B]
Get:2 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libgmp-dev arm64 2:6.2.0+dfsg-4ubuntu0.1 [301 kB]
Get:3 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libgnutls-openssl27 arm64 3.6.13-2ubuntu1.7 [28.0 kB]
Get:4 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libunbound8 arm64 1.9.4-2ubuntu1.4 [317 kB]
Get:5 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libgnutls-dane0 arm64 3.6.13-2ubuntu1.7 [27.5 kB]
Get:6 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libgnutlsxx28 arm64 3.6.13-2ubuntu1.7 [13.0 kB]
Get:7 http://us.ports.ubuntu.com/ubuntu-ports focal/main arm64 libidn2-dev arm64 2.2.0-2 [64.3 kB]
Get:8 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libp11-kit-dev arm64 0.23.20-1ubuntu0.1 [65.1 kB]
Get:9 http://us.ports.ubuntu.com/ubuntu-ports focal/main arm64 libtasn1-6-dev arm64 4.16.0-2 [85.0 kB]
Get:10 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 nettle-dev arm64 3.5.1+really3.5.1-2ubuntu0.2 [997 kB]
Get:11 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libgnutls28-dev arm64 3.6.13-2ubuntu1.7 [896 kB]
Get:12 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/universe arm64 libmariadb3 arm64 1:10.3.37-0ubuntu0.20.04.1 [146 kB]
Get:13 http://us.ports.ubuntu.com/ubuntu-ports focal-updates/universe arm64 libmariadb-dev arm64 1:10.3.37-0ubuntu0.20.04.1 [1,000 kB]
Get:14 http://us.ports.ubuntu.com/ubuntu-ports focal/main arm64 libtasn1-doc all 4.16.0-2 [303 kB]                  
Fetched 4,252 kB in 7s (651 kB/s)                                                                                   
(Reading database ... 196937 files and directories currently installed.)
Removing libmysqlclient-dev (8.0.31-0ubuntu0.20.04.2) ...
Selecting previously unselected package libgmpxx4ldbl:arm64.
(Reading database ... 196907 files and directories currently installed.)
Preparing to unpack .../00-libgmpxx4ldbl_2%3a6.2.0+dfsg-4ubuntu0.1_arm64.deb ...
Unpacking libgmpxx4ldbl:arm64 (2:6.2.0+dfsg-4ubuntu0.1) ...
Selecting previously unselected package libgmp-dev:arm64.
Preparing to unpack .../01-libgmp-dev_2%3a6.2.0+dfsg-4ubuntu0.1_arm64.deb ...
Unpacking libgmp-dev:arm64 (2:6.2.0+dfsg-4ubuntu0.1) ...
Selecting previously unselected package libgnutls-openssl27:arm64.
Preparing to unpack .../02-libgnutls-openssl27_3.6.13-2ubuntu1.7_arm64.deb ...
Unpacking libgnutls-openssl27:arm64 (3.6.13-2ubuntu1.7) ...
Selecting previously unselected package libunbound8:arm64.
Preparing to unpack .../03-libunbound8_1.9.4-2ubuntu1.4_arm64.deb ...
Unpacking libunbound8:arm64 (1.9.4-2ubuntu1.4) ...
Selecting previously unselected package libgnutls-dane0:arm64.
Preparing to unpack .../04-libgnutls-dane0_3.6.13-2ubuntu1.7_arm64.deb ...
Unpacking libgnutls-dane0:arm64 (3.6.13-2ubuntu1.7) ...
Selecting previously unselected package libgnutlsxx28:arm64.
Preparing to unpack .../05-libgnutlsxx28_3.6.13-2ubuntu1.7_arm64.deb ...
Unpacking libgnutlsxx28:arm64 (3.6.13-2ubuntu1.7) ...
Selecting previously unselected package libidn2-dev:arm64.
Preparing to unpack .../06-libidn2-dev_2.2.0-2_arm64.deb ...
Unpacking libidn2-dev:arm64 (2.2.0-2) ...
Selecting previously unselected package libp11-kit-dev:arm64.
Preparing to unpack .../07-libp11-kit-dev_0.23.20-1ubuntu0.1_arm64.deb ...
Unpacking libp11-kit-dev:arm64 (0.23.20-1ubuntu0.1) ...
Selecting previously unselected package libtasn1-6-dev:arm64.
Preparing to unpack .../08-libtasn1-6-dev_4.16.0-2_arm64.deb ...
Unpacking libtasn1-6-dev:arm64 (4.16.0-2) ...
Selecting previously unselected package nettle-dev:arm64.
Preparing to unpack .../09-nettle-dev_3.5.1+really3.5.1-2ubuntu0.2_arm64.deb ...
Unpacking nettle-dev:arm64 (3.5.1+really3.5.1-2ubuntu0.2) ...
Selecting previously unselected package libgnutls28-dev:arm64.
Preparing to unpack .../10-libgnutls28-dev_3.6.13-2ubuntu1.7_arm64.deb ...
Unpacking libgnutls28-dev:arm64 (3.6.13-2ubuntu1.7) ...
Selecting previously unselected package libmariadb3:arm64.
Preparing to unpack .../11-libmariadb3_1%3a10.3.37-0ubuntu0.20.04.1_arm64.deb ...
Unpacking libmariadb3:arm64 (1:10.3.37-0ubuntu0.20.04.1) ...
Selecting previously unselected package libmariadb-dev.
Preparing to unpack .../12-libmariadb-dev_1%3a10.3.37-0ubuntu0.20.04.1_arm64.deb ...
Unpacking libmariadb-dev (1:10.3.37-0ubuntu0.20.04.1) ...
Selecting previously unselected package libtasn1-doc.
Preparing to unpack .../13-libtasn1-doc_4.16.0-2_all.deb ...
Unpacking libtasn1-doc (4.16.0-2) ...
Setting up libgnutls-openssl27:arm64 (3.6.13-2ubuntu1.7) ...
Setting up libtasn1-doc (4.16.0-2) ...
Setting up libunbound8:arm64 (1.9.4-2ubuntu1.4) ...
Setting up libgmpxx4ldbl:arm64 (2:6.2.0+dfsg-4ubuntu0.1) ...
Setting up libmariadb3:arm64 (1:10.3.37-0ubuntu0.20.04.1) ...
Setting up libgnutlsxx28:arm64 (3.6.13-2ubuntu1.7) ...
Setting up libidn2-dev:arm64 (2.2.0-2) ...
Setting up libtasn1-6-dev:arm64 (4.16.0-2) ...
Setting up libp11-kit-dev:arm64 (0.23.20-1ubuntu0.1) ...
Setting up libgnutls-dane0:arm64 (3.6.13-2ubuntu1.7) ...
Setting up libgmp-dev:arm64 (2:6.2.0+dfsg-4ubuntu0.1) ...
Setting up nettle-dev:arm64 (3.5.1+really3.5.1-2ubuntu0.2) ...
Setting up libgnutls28-dev:arm64 (3.6.13-2ubuntu1.7) ...
Setting up libmariadb-dev (1:10.3.37-0ubuntu0.20.04.1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for install-info (6.7.0.dfsg.2-5) ...
root@ubuntu:/usr/local/etc# 

```

それでもダメでした。

### 原因を調べるためのログを確認
下記サイトを参考に調べたところ、
参考）https://bugs.schedmd.com/show_bug.cgi?id=3278

エラーログを見てみました。(デバックモードみたいです）
```
root@ubuntu:/usr/local/etc# slurmdbd -D -vvvv
slurmdbd: debug:  Log file re-opened
slurmdbd: pidfile not locked, assuming no running daemon
slurmdbd: debug3: Trying to load plugin /usr/local/lib/slurm/auth_munge.so
slurmdbd: debug:  auth/munge: init: Munge authentication plugin loaded
slurmdbd: debug3: Success.
slurmdbd: debug3: Trying to load plugin /usr/local/lib/slurm/accounting_storage_mysql.so
slurmdbd: error: Couldn't find the specified plugin name for accounting_storage/mysql looking at all files
slurmdbd: error: cannot find accounting_storage plugin for accounting_storage/mysql
slurmdbd: error: cannot create accounting_storage context for accounting_storage/mysql
slurmdbd: fatal: Unable to initialize accounting_storage/mysql accounting storage plugin
```

どうも「slurmdbd: debug3: Trying to load plugin /usr/local/lib/slurm/accounting_storage_mysql.so」
で失敗しているようです。

調べてみたら、確かにありませんでした。
```
root@ubuntu:/usr/local/etc# ls /usr/local/lib/slurm/ | grep accounting
accounting_storage_none.a
accounting_storage_none.la
accounting_storage_none.so
accounting_storage_slurmdbd.a
accounting_storage_slurmdbd.la
accounting_storage_slurmdbd.so
```

## accounting_storage_mysql.soを手にいれることが鍵
### 外部から入手できないか調査１
「accounting_storage_mysql.so」ファイルを手に入れる方法を調べました。

まず以下のサイトで、mysql.soファイルをシンボリックリンクとするという手法が乗っていたので、試してみました。
https://bugs.schedmd.com/show_bug.cgi?id=3278
まず、mysql.soの保管場所を調べます。

```
root@ubuntu:/# find . -name accounting_mysql.so
find: ‘./run/user/1000/gvfs’: Permission denied
find: ‘./run/user/126/gvfs’: Permission denied
```
見つかりませんでした。。

### 外部から入手できないか調査２：無理やり別バージョンのインストール
次に、https://ubuntu.pkgs.org/20.04/ubuntu-universe-arm64/slurm-wlm-basic-plugins_19.05.5-1_arm64.deb.html
をヒントにして、バージョンは低いですが、ライブラリを手に入れるべくファイルをダウンロードします。
```
# wget http://ports.ubuntu.com/pool/universe/s/slurm-llnl/slurm-wlm-basic-plugins_19.05.5-1_arm64.deb
#ダウンロードしたファイルを展開します。
#dpkg-deb -x slurm-wlm-basic-plugins_19.05.5-1_arm64.deb slurm-wlm-arm64 

```
展開したファイルから、「accounting_storage_mysql.so 」を見つけました。
```
# ls /slurm-wlm-arm64/usr/lib/aarch64-linux-gnu/slurm-wlm | grep storage
accounting_storage_filetxt.so
accounting_storage_mysql.so
accounting_storage_none.so
accounting_storage_slurmdbd.so
```
これを「/usr/local/lib/slurm/accounting_storage_mysql.so」にコピーしてみます。
```
#まず、最初の状態は当該ファイルはありません。
## ls -l /usr/local/lib/slurm/accounting_storage_mysql.so
ls: cannot access '/usr/local/lib/slurm/accounting_storage_mysql.so': No such file or directory
#
#ではコピーして配置してみます。
#
#/slurm-wlm-arm64/usr/lib/aarch64-linux-gnu/slurm-wlm# cp accounting_storage_mysql.so /usr/local/lib/slurm/accounting_storage_mysql.so
#
#補完されたことを確認します。
# ls -l /usr/local/lib/slurm/ | grep accounting_storage_mysql
-rw-r--r-- 1 root root   439480 Dec  5 18:24 accounting_storage_mysql.so
```
slurmdbdをリスタートして、動作を確認しましたがダメでした。。。やはりバージョン違いが影響しているのではないかと推測されます。。
```
# systemctl restart slurmdbd
# systemclt status slurmdbd
# Active: failed
#
# ログを見てみます。
# slurmdbd -D -vvvv
slurmdbd: debug:  Log file re-opened
slurmdbd: pidfile not locked, assuming no running daemon
slurmdbd: debug3: Trying to load plugin /usr/local/lib/slurm/auth_munge.so
slurmdbd: debug:  auth/munge: init: Munge authentication plugin loaded
slurmdbd: debug3: Success.
slurmdbd: debug3: Trying to load plugin /usr/local/lib/slurm/accounting_storage_mysql.so
slurmdbd: error: plugin_load_from_file: dlopen(/usr/local/lib/slurm/accounting_storage_mysql.so): /usr/local/lib/slurm/accounting_storage_mysql.so: undefined symbol: slurm_destroy_char
slurmdbd: error: Couldn't load specified plugin name for accounting_storage/mysql: Dlopen of plugin file failed
slurmdbd: error: cannot create accounting_storage context for accounting_storage/mysql
slurmdbd: fatal: Unable to initialize accounting_storage/mysql accounting storage plugin
```



### SLURMインストールパッケージの再コンパイル
slurmのパッケージインストーラの中に、acccount_strage_mysqlを見つけました。コンパイルされていないようだったので、makeもしてみたのですが、
.soファイルは生成されず、解決には至りませんでした。
```
root@ubuntu:# pwd
/slurm-20.11.9/src/plugins/accounting_storage/mysql
# ls
accounting_storage_mysql.c  as_mysql_cluster.h           as_mysql_job.c       as_mysql_resv.h    as_mysql_user.c
accounting_storage_mysql.h  as_mysql_convert.c           as_mysql_job.h       as_mysql_rollup.c  as_mysql_user.h
as_mysql_acct.c             as_mysql_convert.h           as_mysql_problems.c  as_mysql_rollup.h  as_mysql_wckey.c
as_mysql_acct.h             as_mysql_federation.c        as_mysql_problems.h  as_mysql_tres.c    as_mysql_wckey.h
as_mysql_archive.c          as_mysql_federation.h        as_mysql_qos.c       as_mysql_tres.h    Makefile
as_mysql_archive.h          as_mysql_fix_runaway_jobs.c  as_mysql_qos.h       as_mysql_txn.c     Makefile.am
as_mysql_assoc.c            as_mysql_fix_runaway_jobs.h  as_mysql_resource.c  as_mysql_txn.h     Makefile.in
as_mysql_assoc.h            as_mysql_jobacct_process.c   as_mysql_resource.h  as_mysql_usage.c   src
as_mysql_cluster.c          as_mysql_jobacct_process.h   as_mysql_resv.c      as_mysql_usage.h

root@ubuntu:/slurm-20.11.9/src/plugins/accounting_storage/mysql# 
root@ubuntu:/slurm-20.11.9/src/plugins/accounting_storage/mysql# make
root@ubuntu:/slurm-20.11.9/src/plugins/accounting_storage/mysql# ls
accounting_storage_mysql.c                                as_mysql_acct.c
accounting_storage_mysql.h                                as_mysql_acct.h
accounting_storage_mysql.la                               as_mysql_archive.c
accounting_storage_mysql_la-accounting_storage_mysql.lo   as_mysql_archive.h
accounting_storage_mysql_la-accounting_storage_mysql.o    as_mysql_assoc.c
accounting_storage_mysql_la-as_mysql_acct.lo              as_mysql_assoc.h
accounting_storage_mysql_la-as_mysql_acct.o               as_mysql_cluster.c
accounting_storage_mysql_la-as_mysql_archive.lo           as_mysql_cluster.h
accounting_storage_mysql_la-as_mysql_archive.o            as_mysql_convert.c
accounting_storage_mysql_la-as_mysql_assoc.lo             as_mysql_convert.h
accounting_storage_mysql_la-as_mysql_assoc.o              as_mysql_federation.c
accounting_storage_mysql_la-as_mysql_cluster.lo           as_mysql_federation.h
accounting_storage_mysql_la-as_mysql_cluster.o            as_mysql_fix_runaway_jobs.c
accounting_storage_mysql_la-as_mysql_convert.lo           as_mysql_fix_runaway_jobs.h
accounting_storage_mysql_la-as_mysql_convert.o            as_mysql_jobacct_process.c
accounting_storage_mysql_la-as_mysql_federation.lo        as_mysql_jobacct_process.h
accounting_storage_mysql_la-as_mysql_federation.o         as_mysql_job.c
accounting_storage_mysql_la-as_mysql_fix_runaway_jobs.lo  as_mysql_job.h
accounting_storage_mysql_la-as_mysql_fix_runaway_jobs.o   as_mysql_problems.c
accounting_storage_mysql_la-as_mysql_jobacct_process.lo   as_mysql_problems.h
accounting_storage_mysql_la-as_mysql_jobacct_process.o    as_mysql_qos.c
accounting_storage_mysql_la-as_mysql_job.lo               as_mysql_qos.h
accounting_storage_mysql_la-as_mysql_job.o                as_mysql_resource.c
accounting_storage_mysql_la-as_mysql_problems.lo          as_mysql_resource.h
accounting_storage_mysql_la-as_mysql_problems.o           as_mysql_resv.c
accounting_storage_mysql_la-as_mysql_qos.lo               as_mysql_resv.h
accounting_storage_mysql_la-as_mysql_qos.o                as_mysql_rollup.c
accounting_storage_mysql_la-as_mysql_resource.lo          as_mysql_rollup.h
accounting_storage_mysql_la-as_mysql_resource.o           as_mysql_tres.c
accounting_storage_mysql_la-as_mysql_resv.lo              as_mysql_tres.h
accounting_storage_mysql_la-as_mysql_resv.o               as_mysql_txn.c
accounting_storage_mysql_la-as_mysql_rollup.lo            as_mysql_txn.h
accounting_storage_mysql_la-as_mysql_rollup.o             as_mysql_usage.c
accounting_storage_mysql_la-as_mysql_tres.lo              as_mysql_usage.h
accounting_storage_mysql_la-as_mysql_tres.o               as_mysql_user.c
accounting_storage_mysql_la-as_mysql_txn.lo               as_mysql_user.h
accounting_storage_mysql_la-as_mysql_txn.o                as_mysql_wckey.c
accounting_storage_mysql_la-as_mysql_usage.lo             as_mysql_wckey.h
accounting_storage_mysql_la-as_mysql_usage.o              Makefile
accounting_storage_mysql_la-as_mysql_user.lo              Makefile.am
accounting_storage_mysql_la-as_mysql_user.o               Makefile.in
accounting_storage_mysql_la-as_mysql_wckey.lo             src
accounting_storage_mysql_la-as_mysql_wckey.o
root@ubuntu:/home/setting-slurm/install/slurm-20.11.9/src/plugins/accounting_storage/mysql# 

```

実は、pluginディレクトリでも、もう一回makeして、make installしたところ、なんとslurmdbdのインストールが完了しました。
```
root@ubuntu:/home/setting-slurm/install/temp/slurm-20.11.9.test1/src/plugins# ls /usr/local/lib/slurm/ | grep account
accounting_storage_mysql.a
accounting_storage_mysql.la
accounting_storage_mysql.so
accounting_storage_none.a
accounting_storage_none.la
accounting_storage_none.so
accounting_storage_slurmdbd.a
accounting_storage_slurmdbd.la
accounting_storage_slurmdbd.so
mcs_account.a
mcs_account.la
mcs_account.so
root@ubuntu:/home/setting-slurm/install/temp/slurm-20.11.9.test1/src/plugins# systemctl restart slurmdbd
root@ubuntu:/home/setting-slurm/install/temp/slurm-20.11.9.test1/src/plugins# systemctl status slurmdbd
● slurmdbd.service - Slurm DBD accounting daemon
     Loaded: loaded (/etc/systemd/system/slurmdbd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-12-06 03:53:47 JST; 5s ago
   Main PID: 101277 (slurmdbd)
      Tasks: 5
     Memory: 8.2M
     CGroup: /system.slice/slurmdbd.service
             └─101277 /usr/local/sbin/slurmdbd -D
```
しかし、なぜかこの手順の再現性がなくて、どうして　make がここでできたのかがわかりません。少なくとも、slurmdbdなどに関するpluginのコンパイルがうまくいっていなかった、というのが原因だろうということは推測できました。
ゆえに、きちんとコンパイルする手順を確認できれば、根本的な解決に至るものと思います。
とりあえず、現状はslurmdbdが起動しました。

しかし、sacctの入力応答結果として、ジョブのステータスが帰っていない気がします。本当に成功しているのか、ちょっとわからなくなってきました。
```
user1@ubuntu:~$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                14     debug    debug    user1  R       0:01      1 ubuntu
user1@ubuntu:~$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
user1@ubuntu:~$ 
user1@ubuntu:~$ 
user1@ubuntu:~$ exit
logout
root@ubuntu:~# ls
snap  work
root@ubuntu:~# sacct -S2022-10-01 -E2022-12-31 --format JobID%5,end%16,User%8,JobName%8,Partition%8,NCPU%5,elapsed,state -X
JobID              End     User  JobName Partitio NCPUS    Elapsed      State 
----- ---------------- -------- -------- -------- ----- ---------- ---------- 
root@ubuntu:~# sacct
       JobID    JobName  Partition    Account  AllocCPUS      State ExitCode 
------------ ---------- ---------- ---------- ---------- ---------- -------- 
root@ubuntu:~# 
```
(追記）
ホストを再起動したところ、sacctにてデータが取れていることがわかりました。よかった。。
あとは手順としては、accounting_storage_mysql.soをコンパイルする方法をまとめれば良いようです。
```
root@ubuntu:~# sacctmgr list user
      User   Def Acct     Admin 
---------- ---------- --------- 
      root       root Administ+ 
root@ubuntu:~# sacctmgr show clusters format="cluster%16,ControlHost"
         Cluster     ControlHost 
---------------- --------------- 
         cluster     10.xxx.yy.z 
root@ubuntu:~# sacct
       JobID    JobName  Partition    Account  AllocCPUS      State ExitCode 
------------ ---------- ---------- ---------- ---------- ---------- -------- 
15                debug      debug                     1  COMPLETED      0:0 
```




その他参考）GitHubより
https://github.com/nateGeorge/slurm_gpu_ubuntu#prepare-db-for-slurm