lmodのmodulefileの書き方入門
サーバーの環境:Fedora 36
サーバーのLinux環境は以下の通り.
$ cat /etc/os-release
NAME="Fedora Linux"
VERSION="36 (Server Edition)"
ID=fedora
VERSION_ID=36
VERSION_CODENAME=""
PLATFORM_ID="platform:f36"
PRETTY_NAME="Fedora Linux 36 (Server Edition)"
ANSI_COLOR="0;38;2;60;110;180"
LOGO=fedora-logo-icon
CPE_NAME="cpe:/o:fedoraproject:fedora:36"
HOME_URL="https://fedoraproject.org/"
DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f36/system-administrators-guide/"
SUPPORT_URL="https://ask.fedoraproject.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=36
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=36
PRIVACY_POLICY_URL="https://fedoraproject.org/wiki/Legal:PrivacyPolicy"
VARIANT="Server Edition"
VARIANT_ID=server
lmodでモジュールファイルを作成する.
下準備
モジュールファイルを配置するディレクトリには環境変数$ MODULEPATH
で設定が必要.デフォルトだと/etc/modulefiles
などがこの環境変数に含まれているため,設定を考えるのが面倒臭い場合はそれらのpathを使うのも手.
modulefileのディレクトリ構成
アプリケーションごとにディレクトリを掘って,バージョン名のついたmodulefileを作成するのが良い.例えばQuantum Espressoを例にとると,QEディレクトリを作成し,そこにバージョンごとの設定を書き込む.
- QE
| - 6.7.0.lua
| - 6.8.0.lua
| - 7.0.0.lua
modulefileの書き方
modulefileの書き方にはluaを使う方法とTCLを使う方法の2通りある.例えばintelのoneapiに付属のmodulefileはTCLで書かれている.ここでは公式で解説されているluaを使った方法をみていくが,当然両者は書き換え可能.
https://lmod.readthedocs.io/en/latest/015_writing_modules.html https://lmod.readthedocs.io/en/latest/100_modulefile_examples.html
Quantum Espresso v.6.8用のmodulefileを書いてみた.
--[[
Quantum Espresso v.6.8 module for use with 'environment-modules' package:
(lua-type modulefile)
]]
help([[
This module automatically load mkl,mpi, and compiler
]])
conflict ("apps/wannier90/3.1.0")
always_load("mkl")
always_load("mpi")
always_load("compiler")
setenv( "ESPRESSO_ROOT", "/home/src/qe-6.8")
prepend_path("PATH" , "/home/src/qe-6.8/bin")
prepend_path("PATH" , "/home/src/qe-6.8/wannier90-3.1.0")
prepend_path("PATH" , "/home/src/qe-6.8/wannier90-3.1.0/utility/w90pov")
prepend_path("PATH" , "/home/src/qe-6.8/wannier90-3.1.0/utility/w90vdw")
local pkgName = myModuleName()
local fullVersion = myModuleVersion()
whatis("Name: ".. pkgName)
whatis("Version: " .. fullVersion)
whatis("Category: tools")
whatis("URL: https://www.quantum-espresso.org/")
whatis("Description: Quantum Espresso v.6.8.0 with intel compiler")
核心的なのは環境変数を設定するsetenv
とprepend_path
,依存関係にあるモジュールをloadするalways_load
で,他はユーザビリティを考慮して設定してある.ちなみに最初の--[[ ]]
で囲まれた部分は単なるコメント行である.
setenv( "ESPRESSO_ROOT", "/home/src/qe-6.8")
これは新しく環境変数を設定するコマンドで,
export ESPRESSO_ROOT=/home/src/qe-6.8
と同義.ただしmodule unload
した時に自動でこの環境変数も消してくれる.同様に
prepend_path("PATH" , "/home/src/qe-6.8/bin")
はすでにある環境変数に新しいpathを追加する.これはPATH
やLD_LIBRARY_PATH
などで使うことになるだろう.
依存関係にあるモジュールをloadするにはalways_load
を使う.intelやgccなどのモジュールを使ってコンパイルしたコードには基本的に必要になる.ロードするのには他にload
もあるが,これはmodule unloadした時に依存関係のモジュールもunloadしてしまう欠点があるので,これを避けたければalways_load
を使うようにする.
conflict ("apps/wannier90/3.1.0")
を設定しておくと,apps/wannier90/3.1.0をロードしている時にQE6.8をロードするのを禁止できる.この例だとあまりありがたみがないが,例えばintelとgccを使い分けたい時にはあると便利.最後にwhatis
にmodule whatis
で表示させる情報を設定しておく.