Environment modulesの概要
数値計算を行うサーバーで、複数のビルド環境をそろえて、それらを簡便に切り替えたい場合や、それらのビルド環境でビルドしたアプリをそろえて切り替えたい場合に便利。
例えば、最新のgccを入れたい場合、一般にはシステムデフォルトのgccと環境が食い合う。
デフォルト以外のコンパイラを入れれば、出来れば使うライブラリもそれに合わせてビルドした方がよい。そうすると、コンパイラの切り替えに伴って、そのコンパイラでビルドしたディレクトリにLD_LIBRARY_PATH
を通したい という要望が出てくる。他にもintelのコンパイラを使っているときはMKLをリンクしたい という事にもなる。
さらにコンパイラ毎にMPIをビルドする場合、もう少し話がややこしくなる。MPIを使ってビルドしたものはビルドに使ったものと同じ環境のMPIのmpirun
で実行するのが望ましい。つまり、ビルド時だけではなくて、アプリ実行時にも環境をそろえた方が良い ということになる。
と、様々なコンパイラ、ライブラリでのビルド環境をそろえようとすると、何か一括して環境を切り替えたい という需要が出てくる。その実現方法として、environment modulesが便利。
インストール
インストールはCentOSであれば、yum
で簡単。
参考ウェブページ:Environment modules のインストールと modulefile の登録 - Qiita
設定
中心となる環境変数はMODULESPATH
とMODULEHOME
。
この環境変数は$(MODULESHOME)/init/.modulespath
に記載されているので、自分の好みのディレクトリを作りたければ、ここに追加。反映させるには再ログインが必要。
/opt/modulefiles
使い方
#ロードされているmoduleのリストを表示
module list
#ロードされているmoduleを全てアンロードする
module purge
#用意されているmoduleのリストを表示
module avail
#モジュールAを読み込む
module load A
#モジュールAのヘルプを見る
module help A
シェルスクリプト内で呼ぶとき
module
コマンドはやや特殊で、PATHを通す類のものとは異なる。スクリプトの上部に以下のコマンドを書いておくとmodule
コマンドが使える
source /etc/profile.d/modules.sh #sh/bash
source /etc/profile.d/modules.csh #csh/tsch
参考にしたページ: module コマンド
書き方
#ヘルプに表示される内容
proc ModulesHelp { } {
puts stderr "module what is\n"
}
module-whatis "module what is"
#基本となる変数の設定
set variable variable_to_be_substituted
#競合するモジュールの指定
conflict a_module_to_be_avoided_with_this_module
#当該モジュールに伴って呼ばれるべきモジュールを読む
module load module_to_be_loaded
#PATHをA_PATH_to_be_prependedに前置
prepend-path A_PATH PATH_to_be_prepended
#AN_ENVIRONMENT_VARIABLE_to_be_declaredを環境変数AN_ENVIRONMENT_VARIABLEとして宣言
setenv AN_ENVIRONMENT_VARIABLE AN_ENVIRONMENT_VARIABLE_to_be_declared
たとえば、
proc ModulesHelp { } {
puts stderr "\tAdds some_application to your environment variables.\n"
}
module-whatis "adds some_application to your environment variable.s"
set root /opt/some_application_1.2.3
conflict different_environment_module
module load dependent_module_on_some_application_1.2.3
prepend-path PATH $root/bin
prepend-path PATH $root/sbin
prepend-path MANPATH $root/share/man
prepend-path LD_LAIBRARY_PATH $root/lib
setenv some_application_ROOT $root
参考にしたURL: Modulesを使った環境設定、環境スイッチ - おびなたん☆