サーバーの環境: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")

核心的なのは環境変数を設定するsetenvprepend_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を追加する.これはPATHLD_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を使い分けたい時にはあると便利.最後にwhatismodule whatisで表示させる情報を設定しておく.