この記事では LSF のインストールを実践します。特にインストールまでの障害を解決することに重きを置いているので、この記事の手順では単一のホストのみの構成となります。
IBM Spectrum LSF はジョブスケジューラです。バッチ処理を計算用ノードで今すぐ、もしくは指定の時刻に実行させることができます。この記事では計算用ノードを1つしか用意しませんが、複数の計算用ノードを用意した場合は空いているノードに適切にジョブを振り分けます。
この記事では、この IBM Spectrum LSF を AlmaLinux9 にインストールしてみます。
参考
-
LSF 1-node 構成で LSF クラスタを構築
- 基本はこの資料のとおりに操作しますが、一部設定が異なるため追加で作業を実施しています
環境
- IBM Spectrum LSF Community Edition 10.2
- AlmaLinux 9
- Oracle VM VurtialBox 上に構築
- 「最小インストール」でインストール済
計画
ホスト構成
冒頭の注意書きの通り、計算用ノードは1つだけです。このノードがLSF管理用ホストとLSF利用ホストを兼ねます。
ホスト名 | IPアドレス | LSF管理 | LSF利用1 | 計算ノード |
---|---|---|---|---|
lsf01 | 192.168.56.33 | ○ | ○ | ○ |
ユーザ
事前に各ホストに下記のユーザを作成しておきます。
ユーザ名 | UID | 主グループ | ホームディレクトリ | SSHログイン | パスワードログイン | sudoer | LSF管理 | LSF利用 |
---|---|---|---|---|---|---|---|---|
なんでも | なんでも | なんでも | なんでも | なんでも | なんでも | sudo可 | × | × |
lsf | 10600 | users | /home/lsf |
必要2 | 不要 | 不要 | ○ | ○ |
インストール作業は基本的にユーザ lsf で実施します。root 権限が必要な作業をする場合は sudoer であるユーザで sudo -s
等を使用することで root ユーザになります。
LSF のインストールだけでなくLSFの管理もユーザ lsf で実施します。root ではないので、インストール中にいくつかの作業が必要になります。手順が増えてしまいますが、root でLSFを管理する場合は root でSSHログインできる必要が生じてしまうため、非rootユーザで LSF を管理するようにします。
非rootユーザでインストール・管理しますが、root 権限無しでインストールできるわけではありません。非rootユーザでLSFを管理できるようにするための作業の中に root 権限を必要とするものがあります。
インストールディレクトリ構成
基本的には設定ファイルに例示されているパスをそのまま使用します。
-
インストール先:
/usr/share/lsf
3 -
LSFディストリビューションの保管場所:
/usr/share/lsf_distrib
ジョブのキュー
デフォルトのまま。セットアップ完了時のキューは次のとおり。
$ bqueues
QUEUE_NAME PRIO STATUS MAX JL/U JL/P JL/H NJOBS PEND RUN SUSP
admin 50 Open:Active - - - - 0 0 0 0
owners 43 Open:Active - - - - 0 0 0 0
priority 43 Open:Active - - - - 0 0 0 0
night 40 Open:Active - - - - 0 0 0 0
short 35 Open:Active - - - - 0 0 0 0
normal 30 Open:Active - - - - 0 0 0 0
interactive 30 Open:Active - - - - 0 0 0 0
idle 20 Open:Active - - - - 0 0 0 0
その他
- LSFクラスタ名は特にこだわらないので、例示のまま
cluster1
にします - ホストの起動時に LSF デーモンが自動で起動するようにします
- ホスト間の連携にはデフォルトの RSH ではなく SSH を使うよう設定します
1. 必要なライブラリのインストール
# dnf install tar ed libnsl
(略)
アップグレード済み:
glibc-2.34-168.el9_6.23.x86_64 glibc-common-2.34-168.el9_6.23.x86_64
glibc-gconv-extra-2.34-168.el9_6.23.x86_64 glibc-langpack-ja-2.34-168.el9_6.23.x86_64
インストール済み:
ed-1.14.2-12.el9.x86_64 info-6.7-15.el9.x86_64 libnsl-2.34-168.el9_6.23.x86_64 tar-2:1.34-7.el9.x86_64
完了しました!
それぞれ、下記の理由で必要です。
-
tar
: LSF のアーカイブを展開する -
ed
: LSFインストール時に必要 -
libnsl
: LSF起動時に必要
2. SSH 用の鍵作成・登録
LSF ではノード同士の連携のために通信します。とくにLSFデーモンの起動・停止の指示にはデフォルトでは RSH を使用しますが今回は SSH を使用する設定にする予定なので、LSF管理ユーザ (lsf) がSSH 接続できるようにしておきます。パスワード入力が不要となるようにするために、秘密鍵にパスフレーズを設定せず公開鍵認証を設定します。
今回は単一ノード構成ですが、LSF起動時など自分自身とそれ以外を区別せず一律で SSH 接続を実施するタイミングがあります。そのため、lsf@lsf01 から lsf@lsf01 自身へ SSH 接続できるようにします。
鍵作成
どのような方法でもよいので、ユーザ lsf で秘密鍵を作成します。パスフレーズは設定しないでください。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lsf/.ssh/id_rsa):
Created directory '/home/lsf/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/lsf/.ssh/id_rsa
Your public key has been saved in /home/lsf/.ssh/id_rsa.pub
(略)
公開鍵登録
続いて、ユーザ lsf の authorized_keys
に先ほど作成した秘密鍵の対となる公開鍵を登録します。
$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
また、接続先サーバのフィンガープリントも登録しておきます。事前に登録しておくことで、SSH 接続時にフィンガープリントが未登録であるための警告が出なくなります。
$ ssh-keyscan localhost lsf01 >> ~/.ssh/known_hosts
テスト
SSH接続できるようになったはずなので、試してみましょう。ユーザ lsf で下記のコマンドを実行します。パスワードなどを入力せずにログインできれば成功です。
$ ssh lsf01
3. インストールファイルの準備
# mkdir /usr/share/lsf /usr/share/lsf_distrib
# chown lsf:users /usr/share/lsf /usr/share/lsf_distrib
# su - lsf
$ cd /usr/share/lsf_distrib
$ cp /tmp/lsf10.1_lnx310-lib217-x86_64.tar.Z /usr/share/lsf_distrib/
$ tar xf /tmp/lsf10.1_lsfinstall_linux_x86_64.tar.Z
次のような状態になればOKです。
$ ls -l /usr/share/lsf_distrib
合計 887404
-rw-r--r--. 1 lsf users 908694947 5月 14 23:00 lsf10.1_lnx310-lib217-x86_64.tar.Z
drwxr-xr-x. 8 lsf users 4096 8月 10 12:14 lsf10.1_lsfinstall
$ ls -ld /usr/share/lsf
drwxr-xr-x. 8 lsf users 158 8月 10 12:14 /usr/share/lsf
インストーラである lsfinstall は展開しましたが、ディストリビューションである lsf10.1_lnx310-lib217-x86_64.tar.Z
は展開せずに置きます。
4. インストール設定ファイルの編集
インストールコマンド実行時に使用する設定ファイルのひな型が /usr/share/lsf_distrib/lsf10.1_lsfinstall/install.config
に用意されているので、編集して計画通りにインストールされるようにします。
- # LSF_TOP="/usr/share/lsf"
+ LSF_TOP="/usr/share/lsf"
- # LSF_ADMINS="lsfadmin user1 user2"
+ LSF_ADMINS="lsf"
- # LSF_CLUSTER_NAME="cluster1"
+ LSF_CLUSTER_NAME="cluster1"
- # LSF_MASTER_LIST="hostm hosta hostc"
+ LSF_MASTER_LIST="lsf01"
- # LSF_TARDIR="/usr/share/lsf_distrib/"
+ LSF_TARDIR="/usr/share/lsf_distrib/"
5. /etc/lsf.sudoers
の作成
今回は root でないユーザ lsf でLSFのインストールや管理を実行できるようにします。そのためには、各ホストの /etc/lsf.sudoers
が適切に設定されている必要があります。
今回は単一ホスト構成なので、そのホストでのみ実施すればOKです。
/etc/lsf.sudoers
作成
まずファイルを作成します。所有者が root:root でパーミッションが 600 である必要があります(そうでない場合、このファイルは無視されます)。
# touch /etc/lsf.sudoers
# chmod 600 /etc/lsf.sudoers
# ls -l /etc/lsf.sudoers
-rw-------. 1 root root 0 8月 10 12:37 /etc/lsf.sudoers
/etc/lsf.sudoers
の編集
内容を次のようにします。
LSF_STARTUP_PATH=/usr/share/lsf/10.1/linux3.10-glibc2.17-x86_64/etc
LSF_STARTUP_USERS=lsf
LSF_STARTUP_PATH
はLSF デーモン・バイナリー・ファイル (lim、 res、 sbatchd、および mbatchd) があるディレクトリのパスです。
LSF_STARTUP_USERS
に LSF の制御コマンド実行を許可するユーザを記載します。ダブルクォートで囲んでスペース区切りにすることで複数のユーザを指定することもできます。
6. インストール
インストールスクリプト lsfinstall
を使用して、LSFをインストールします。ユーザ lsf で下記のようにコマンドを実行します。
$ cd /usr/share/lsf_distrib/lsf10.1_lsfinstall
$ ./lsfinstall -f install.config
Logging installation sequence in /usr/share/lsf_distrib/lsf10.1_lsfinstall/Install.log
(略)
ご使用条件の続きを読む場合は、Enter キーを押してください。
「同意する」場合は「1」を押し、「同意しない」場合は「2」、印刷す
る場合は「3」、他社の使用条件を読む場合は「4」、英文でご覧になる
場合は「5」を押してください。「99」を押すと前の画面に戻ります。
1
(略)
Searching LSF 10.1 distribution tar files in /usr/share/lsf_distrib Please wait ...
1) linux3.10-glibc2.17-x86_64
Press 1 or Enter to install this host type:1
(略)
You are not root. You have three choices:
1) Install LSF multi-user cluster:
You must manually change the ownership and setuid bit for
lsadmin and badmin to root. Any user can submit jobs to the
cluster.
2) Install LSF single-user cluster:
lsf will be able to start LSF daemons, but only
lsf can submit jobs to the cluster
q) Quit
Please enter your choice [1]:1
(略)
lsfinstall is done.
(略)
インストール中に下記の質問に答えています。
- 利用条件へ同意するか
- 「1」(同意する)と回答
- 使用するディストリビューションはどれか
- 「1」と回答。
/usr/share/lsf_distrib
に1つしかディストリビューションを用意していないため、それを選択した
- 「1」と回答。
- 非rootでのインストールにおける、モード選択
- 「1」(multi-user モード) と回答
- 詳細は IBMのドキュメント を参照
7. SSH を使うように設定する
LSF の起動・停止の指示はデフォルトでは RSH で伝達しますが、今回は SSH を使うようにします。使用するコマンドを /usr/share/lsf/conf/lsf.conf
で指定できるので、次のように指定します。
+ LSF_RSH="ssh -o 'PasswordAuthentication no' -o 'StrictHostKeyChecking no'"
8. セットアップ
インストールの後は各ホストでのセットアップ作業が必要です。今回は単一ホスト構成なのでセットアップもインストールを実施したホストでのみ実施します。
setuid を伴うので、root 権限が必要です。
# /usr/share/lsf/10.1/install/hostsetup --top="/usr/share/lsf" --boot="y" --setuid
Logging installation sequence in /usr/share/lsf/log/Install.log
------------------------------------------------------------
L S F H O S T S E T U P U T I L I T Y
------------------------------------------------------------
This script sets up local host (LSF server, client or dynamic host) environment.
Setting up LSF server host "lsf01" ...
Checking LSF installation for host "lsf01" ... Done
Cannot determine the default directory for the sysvinit startup scripts. Skipping the directory cleanup...
Created symlink /etc/systemd/system/multi-user.target.wants/lsfd.service → /usr/lib/systemd/system/lsfd.service.
Installing LSF service scripts on host "lsf01" ... Done
LSF service ports are defined in /usr/share/lsf/conf/lsf.conf.
Checking LSF service ports definition on host "lsf01" ... Done
You are installing IBM Spectrum LSF - Community Edition.
... Setting up LSF server host "lsf01" is done
... added setuid bit to /usr/share/lsf/10.1/linux3.10-glibc2.17-x86_64/bin/bctrld on "lsf01"
... added setuid bit to /usr/share/lsf/10.1/linux3.10-glibc2.17-x86_64/bin/egosh on "lsf01"
... added setuid bit to /usr/share/lsf/10.1/linux3.10-glibc2.17-x86_64/etc/utmpreg on "lsf01"
... Setting uid bits on "lsf01" is done
... LSF host setup is done.
引数で、下記のオプションを指定しています。
-
--boot="y"
: ホストの起動時にLSFデーモンが自動起動するようにします。サービスlsfd.service
が作成されます -
--setuid
: LSF管理コマンドを非rootユーザで実行できるようにします。これを実施していない場合、LSFデーモン開始時に下記のようなエラーが出ます。詳細は IBMのドキュメント を参照Cannot start because bctrld does not have the setuid bit. To enable the setuid bit, run 'chmod u+s' on the bctrld binary file, or run the 'hostsetup --setuid' command.
9. 起動と状態確認
セットアップが完了したので起動してみます。ユーザ lsf で下記のようにコマンドを実行してみます。
$ . /usr/share/lsf/conf/profile.lsf
$ lsfstartup
Starting up all LIMs ...
Do you really want to start up LIM on all hosts ? [y/n]y
Start up LIM on <lsf01> ...... done
Waiting for Master LIM to start up ... Master LIM is ok
Starting up all RESes ...
Do you really want to start up RES on all hosts ? [y/n]y
Start up RES on <lsf01> ...... done
Starting all server daemons on LSBATCH hosts ...
Do you really want to start up server batch daemon on all hosts ? [y/n] y
Start up server batch daemon on <lsf01> ...... done
Done starting up LSF daemons on the local LSF cluster ...
LIM, RES, LSBATCH のそれぞれについて全ホスト (今回は lsf01 だけですが) を起動するかを聞かれるので、それぞれ y と回答します。
これで起動したので、いくつかのコマンドでLSFの状態を確認してみます。
$ lsid
IBM Spectrum LSF Community Edition 10.1.0.15, May 13 2025
Copyright IBM Corp. 1992, 2016. All rights reserved.
US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
My cluster name is cluster1
My master name is lsf01
$ lshosts
HOST_NAME type model cpuf ncpus maxmem maxswp server RESOURCES
lsf01 X86_64 Intel_Pl 15.0 1 1.7G 1.9G Yes (mg)
$ bhosts
HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV
lsf01 ok - 1 0 0 0 0 0
. /usr/share/lsf/conf/profile.lsf
を実行しているため、LSFの各種コマンドへのパスが通った状態になり lsid
, lshosts
, bhosts
を使用できています。profile.lsf を実行していないセッションではパスが通っていないためコマンドを実行できません。
セットアップで --boot="y"
を指定したので、ホストを再起動しても自動でLSFが起動するはずです。試せる場合は試してみましょう。
10. ジョブを実行してみる
実際に bsub
コマンドでジョブを実行してみます。
$ bsub touch /tmp/bsub_text.txt
Job <1> is submitted to default queue <normal>.
touch /tmp/bsub_text.txt
を実行するように指示しました。キューを指定していないのでデフォルトのキュー normal
にプッシュされました。キューにプッシュされたジョブは、適宜実行されます。今回は実行時刻を指定しておらず計算ホストも使用中でないので即時実行されたはずです。bjobs
コマンドで確認してみましょう。
$ bjobs -a
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
1 lsf DONE normal lsf01 lsf01 *_text.txt Aug 10 15:50
すでに完了したジョブも表示するために -a
オプションを付けています。先ほど送信したジョブは DONE (完了) 状態であることが確認できます。
より詳細にみるためには、下記のように bjobs -l <JOB_ID>
を実行します。
$ bjobs -l 1
Job <1>, User <lsf>, Project <default>, Status <DONE>, Queue <normal>, Command
<touch /tmp/bsub_text.txt>, Share group charged </lsf>
Sun Aug 10 15:50:55: Submitted from host <lsf01>, CWD <$HOME>;
Sun Aug 10 15:50:56: Started 1 Task(s) on Host(s) <lsf01>, Allocated 1 Slot(s)
on Host(s) <lsf01>, Execution Home </home/lsf>, Execution
CWD </home/lsf>;
Sun Aug 10 15:50:57: Done successfully. The CPU time used is 0.0 seconds.
(略)
bjobs
は実行前、実行中、最近完了したジョブのみを確認できます。古いジョブを見たい場合は bhist
コマンドを使用します。
コマンドが実行された結果、ファイルが作成されたことも確認しておきます。
$ ls -l /tmp/bsub_text.txt
-rw-r--r--. 1 lsf users 0 8月 10 15:50 /tmp/bsub_text.txt
実用に向けての展望
この記事では単一ホスト構成で LSF を構築しましたが、やはり複数ホストで構成してみたいですね。lsfinstall
での躓きはひととおり解消できていると思うので、複数ホスト構成では
- ディレクトリの NFS での共有
- 計算ノードと利用ノード(クライアントノード)の区別
- 管理ホストから非管理ホストの制御
あたりが課題になりそうです。
また、今回は管理ユーザ lsf のみが LSF の実行ユーザでしたが、LSF を他のユーザからも利用したり、ユーザごとに優先度を変えたりもしてみたいです。