Ubuntu 24.02 安装配置 Environment Modules 工具

Environment Modules 是一种简化的 Shell 初始化工具,可用于修改终端环境。

安装

依赖 Tcl 版本 >= 8.5,查看 Tcl 版本:

1
echo puts \$tcl_version | tclsh

依赖 Tcl 配置脚本 tclConfig.sh

1
whereis tclConfig.sh

安装 tcl 工具,并通过 --with-tcl 指定 tclConfig.sh 文件所在路径

1
apt -y install tcl-dev

下载安装包(此处需关闭代理)

1
2
curl -LJO https://github.com/cea-hpc/modules/releases/download/v5.4.0/modules-5.4.0.tar.gz
tar xfz modules-5.4.0.tar.gz

默认安装路径为 --prefix=/usr/local/Modules,此处安装至 /opt/tools/Modules/build 路径下,modulefile文件默认路径为 --modulefilesdir=/usr/local/Modules/modulefiles ,此处设置为 /opt/tools/Modules/modulefiles

1
./configure --prefix=/opt/tools/Modules/build --modulefilesdir=/opt/tools/Modules/modulefiles --with-tcl=/usr/lib

编译并安装

1
make && make install

配置

初始化

  1. 全局初始化,将 profile 文件添加至 /etc/profile.d
1
2
ln -s /opt/tools/Modules/build/init/profile.sh /etc/profile.d/modules.sh
ln -s /opt/tools/Modules/build/init/profile.csh /etc/profile.d/modules.csh
  1. 单用户初始化,添加至 ~/.bashrc
1
source /opt/tools/Modules/build/init/bash
  1. 验证初始化完成 module -V

添加模块路径及模块

  1. 通过 ./config --etcdir 选项指定路径下的 initrc 文件定义 module paths modulefiles 等,文件默认路径为 PREFIX/etc

  2. 定义 module paths to enable by defaultinitrc 文件中已添加 ./config --modulefilesdir 定义的路径 module use --append {PREFIX/modulefiles},此处在initrc 文件中添加自定义路径 /opt/tools/Modules/Compiler

1
2
# compiler modulepath
module use --append {/opt/tools/Modules/Compiler}

执行 echo $MODULEPATH,显示模块路径

1
/opt/tools/Modules/modulefiles:/opt/tools/Modules/Compiler

模块路径也可通过 modulespath 文件定义,且优先级高于 initrc 文件;添加时直接写入文件路径即可 /path/to/other/modulefiles

  1. 在自定义路径 /opt/tools/Modules/Compiler 下添加文件 gcc/11.3.2gcc/13.2.0,文件内首行输入 #%Module,工具会自动将文件识别为 modulefile,执行 module avail 可显示已识别的模块路径及模块
1
2
------------ /opt/tools/Modules/Compiler ------------
gcc/11.3.2 gcc/13.2.0

定义默认模块

  1. initrc 文件中定义默认导入模块
1
2
3
4
5
if {[is-saved default]} {
module restore
} else {
module load {gcc/13.2.0}
}

在打开新终端时会自动导入该模块 Loading gcc/13.2.0

  1. .modulerc 文件中定义默认版本,首先在 gcc/11.3.2 中定义版本变量
1
2
#%Module
set ModulesVersion 11.3.2

对应需要定义默认版本程序的文件夹下添加文件 gcc/.modulerc,定义默认版本

1
2
#%Module
module-version ./11.3.2 default

执行 ml load gcc && ml list 会导入默认版本模块

1
2
Currently Loaded Modulefiles:
1) gcc/11.3.2

默认版本也可以通过 .version 文件定义

编写 Modulefile

脚本转换

Modulefile 通过 Tcl 语言编写,可通过命令 sh-to-mod 将 shell 脚本转换为 modulefile 格式

1
sh-to-mod shell shellscript [arg...]

例如,bash 脚本 gcc_13.2.0.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
version="13.2.0"
prefix="/opt/compiler/gcc/13.2.0"
alias gcc="gcc-13"
export GCC_HOME="$prefix"
export GCC_INCLUDE="$prefix/include"
export GCC_LIB="$prefix/lib"
export PATH="$prefix/bin:$PATH"
EOF

通过 module sh-to-mod bash gcc_13.2.0.sh 转换脚本

1
2
3
4
5
6
#%Module
prepend-path PATH /opt/compiler/gcc/13.2.0/bin
set-alias gcc gcc-13
setenv GCC_HOME /opt/compiler/gcc/13.2.0
setenv GCC_INCLUDE /opt/compiler/gcc/13.2.0/include
setenv GCC_LIB /opt/compiler/gcc/13.2.0/lib

关键字

常见关键字如下

关键字 作用
set 设置局部变量
set-alias name string 设置指令的别名
setenv variable value 设置环境变量值
prepend-path variable value 添加或预置 value 至 variable
module-whatis string 用于 module whatis 显示信息
conflict modulefile 列出与当前模块冲突的模块文件列表
prereq-all [options] modulefile 声明当前加载模块的依赖模块文件列表
module-alias name modulefile 设置模块文件的别名

对于 bash 脚本 gcc_13.2.0.sh,编写对应 modulefile 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#%Module

proc ModulesHelp {} {
puts stderr "gcc $::version"
puts stderr {Copyright (C) 2023 Free Software Foundation, Inc.}
puts stderr {}
}

set version 13.2.0
set prefix /opt/compiler/gcc/13.2.0
set-alias gcc gcc-13

module-whatis "load gcc-$version"

conflict openmpi
prereq x86-gnu

setenv GCC_HOME $prefix
setenv GCC_INCLUDE $prefix/include
prepend-path LD_LIBRARY_PATH $prefix/lib
prepend-path PATH $prefix/bin
  1. 开头 #%Module 称为 Modules magic cookie,工具会自动将文件识别为 modulefile
  2. Tcl procedure ModulesHelp 用于添加模块帮助信息,可通过 ml help gcc/13.2.0 输出
1
2
3
4
5
6
7
-------------------------------------------------------------------
Module Specific Help for /opt/tools/Modules/Compiler/gcc/13.2.0:

gcc 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.

-------------------------------------------------------------------
  1. module-whatis 添加模块信息,执行 ml whatis gcc/13.2.0
1
gcc/13.2.0: load gcc-13.2.0
  1. 执行 ml show gcc/13.2.0 显示模块完整信息
1
2
3
4
5
6
7
8
9
10
11
12
-------------------------------------------------------------------
/opt/tools/Modules/Compiler/gcc/13.2.0:

set-alias gcc gcc-13
module-whatis {load gcc-13.2.0}
conflict openmpi
prereq x86-gnu
setenv GCC_HOME /opt/compiler/gcc/13.2.0
setenv GCC_INCLUDE /opt/compiler/gcc/13.2.0/include
prepend-path LD_LIBRARY_PATH /opt/compiler/gcc/13.2.0/lib
prepend-path PATH /opt/compiler/gcc/13.2.0/bin
-------------------------------------------------------------------

高级功能

  1. 通过 Tcl 编程简化定义,参考案例 Environment Modules Cookbook
  2. 案例文件相应文件参考 Github-Modules Example
  3. 更多 module 选项参考 Sub Commands,环境变量参考 Environment
  4. 更多 modulefile 命令参考 Specific Tcl Commands,变量参考 Variables

常用指令

Command Description
ml avail 查看可用模块
ml load/add modulefile 加载模块
ml list 查看已加载模块
ml unload/rm modulefile 卸载模块
ml switch/swap mod1 mod2 卸载mod1并加载mod2
ml purge 清空模块
ml whatis modulefile 显示模块信息
ml show modulefile 显示模块详细信息
ml help modulefile 显示模块帮助信息
module lint modulefile 检查模块语法
module use modulepath 添加模块路径
module source modulefile 执行脚本文件
module sh-to-mod shellfile 脚本文件转换
module help 帮助

参考

Environment Modules 文档
Ubuntu Source Package: modules
环境变量管理工具 Modules 安装和使用 - YEUNGCHIE
用Modules管理环境变量
使用 module 配置环境

0%