やりたいこと
コンパイラのスイッチング用途でよく使われているEnvironment modules1ですが、新しくパッケージをインストールした際にはEnvironment modulesが認識できるようにモジュールファイルが格納されているディレクトリのパス(以下モジュールパス)を設定する必要があります。一般によく紹介されている方法としてはmodule use --append /path/to/modulefiles/dir
でモジュールパスを指定するというのがあります2が、ユーザーごとに設定する手間を考えると、できれば採用したくはないところです。
本記事では、デフォルトで読み込むモジュールパスを設定する方法を紹介します。
モジュールパスの追加方法
Environment modulesは、環境変数$MODULEPATH
で指定されているディレクトリに存在するモジュールファイルを認識してくれます3。ただし初期状態の場合には何も設定されていません。
user@pc:~$ echo $MODULEPATH
この時にmodule avail
等のコマンドで認識できるのは、 /usr/share/modules/modulefiles
配下に置かれたモジュールファイルだけです。
user@pc:~$ module avail
-------------------------------------------- /usr/share/modules/modulefiles --------------------------------------------
dot module-git module-info modules null use.own
したがって新規にモジュールファイルをデフォルトで認識させるためには、モジュールパスを環境変数$MODULEPATH
に追加しなければなりません。環境変数$MODULEPATHのデフォルト値を設定する方法としては、/etc/environment-modules
ディレクトリ配下のmodulespath
ファイルにモジュールパスを書き込むのが最もシンプルかなと思います。
ここでは例として、NVIDIA HPC SDKのモジュールパスを設定しています(NVIDIA HPC SDKの場合にはモジュールファイルが同梱されているので、今回はそのモジュールパスをそのまま設定しています)。
user@pc:/etc/environment-modules$ sudo vi modulepath
# Modulepath initial setup
# ========================
#
# This file defines the initial setup for the module files search path.
# Comments may be added anywhere, which begin on # and continue until the
# end of the line
# Each line containing a single path will be added to the MODULEPATH
# environment variable. You may add as many as you want - just
# limited by the maximum variable size of your shell.
#
#/usr/share/modules/versions # location of version files
#/usr/share/modules/$MODULE_VERSION/modulefiles # Module pkg modulefiles (if versioning)
#/usr/share/modules/modulefiles # General module files
/opt/nvidia/hpc_sdk/modulefiles
書き込み後に再度ログインし、環境変数$MODULEPATH
が正しく設定されているか確認します。
下記のように書き込んだモジュールパスが表示されればOKです。
user@pc:~$ echo $MODULEPATH
/opt/nvidia/hpc_sdk/modulefiles
またmodule avail
コマンドでモジュール一覧を表示すると、/opt/nvidia/hpc_sdk/modulefiles
ディレクトリ直下のモジュールファイル群を正常に認識されていることが分かります。
user@pc:~$ module avail
------------------------------------------- /opt/nvidia/hpc_sdk/modulefiles --------------------------------------------
nvhpc-byo-compiler/23.1 nvhpc-hpcx/23.1 nvhpc-nompi/23.1 nvhpc/23.1
-------------------------------------------- /usr/share/modules/modulefiles --------------------------------------------
dot module-git module-info modules null use.own
まとめ
環境変数$MODULEPATH
にモジュールパス追記することで、Environment modulesで当該ディレクトリを認識できるようになりました。
なお、デフォルトで参照されているディレクトリ /usr/share/modules/modulefiles
にモジュールファイルを直置きする方法もありますが、この場合だと参照先のパッケージがアンインストールされた後もモジュールファイルが残ってしまうため、あまり宜しくありません。環境変数$MODULEPATH
にモジュールパスを登録しておくのが無難かなと思います。