参考文档
-
Modulefile 语法:modulefile --- Modules documentation
Environment Modules 工具
Environment Modules 是一个环境管理工具,用于动态加载、卸载和管理不同版本的软件环境变量(如 PATH
、LD_LIBRARY_PATH
等),适用于多版本软件共存场景(如 CUDA、GCC、Python 等)。
1. 安装 Modules
(1) 通过包管理器安装
Ubuntu/Debian
sudo apt-get update
sudo apt-get install environment-modules
CentOS/RHEL
sudo yum install environment-modules
验证安装
which module # 应返回 /usr/bin/module
(2) 源码编译安装(推荐自定义路径)
# 安装依赖(Tcl 环境)
sudo apt-get install tcl-dev tk-dev # Ubuntu
sudo yum install tcl-devel tk-devel # CentOS
# 下载源码
wget https://github.com/cea-hpc/modules/releases/download/v5.3.0/modules-5.3.0.tar.gz
tar -xf modules-5.3.0.tar.gz
cd modules-5.3.0
# 编译安装(自定义路径)
./configure --prefix=/opt/software/modules
make
sudo make install
# 配置环境变量
echo 'export MODULEPATH=/opt/software/modules/modulefiles' >> ~/.bashrc
echo 'source /opt/software/modules/init/bash' >> ~/.bashrc
source ~/.bashrc
2. 初始化 Modules
(1) 临时生效(仅当前终端)
source /usr/share/modules/init/bash # 包管理器安装
source /opt/software/modules/init/bash # 源码安装
(2) 永久生效(所有用户)
# 添加到全局 profile
sudo sh -c 'echo "source /usr/share/modules/init/bash" >> /etc/profile'
# 或仅当前用户
echo 'source /usr/share/modules/init/bash' >> ~/.bashrc
source ~/.bashrc
3. Module 基本命令
命令 | 作用 |
---|---|
module avail |
查看可用模块 |
module load <module> |
加载模块 |
module unload <module> |
卸载模块 |
module list |
查看已加载模块 |
module purge |
卸载所有模块 |
module show <module> |
显示模块的环境变量 |
module swap <old> <new> |
替换模块(如切换 CUDA 版本) |
4. Modulefile 编写
(1) 默认模块路径
/usr/share/modules/modulefiles # 包管理器安装
/opt/software/modules/modulefiles # 源码安装
(2) 基本结构
#%Module1.0
proc ModulesHelp { } {
puts stderr "This module loads the <Software> environment"
}
module-whatis "Description of the module"
# 设置变量
set version 1.0
set prefix /path/to/software
# 环境变量
prepend-path PATH $prefix/bin
prepend-path LD_LIBRARY_PATH $prefix/lib
setenv SOFTWARE_HOME $prefix
Modulefile 是定义软件环境的配置文件,采用 Tcl 语法,需放在MODULEPATH
指定的路径下。
1. 基础语法
命令 / 语法 | 作用 | 示例 |
---|---|---|
#%Module1.0 |
声明文件为 Modulefile(必须放在首行) | #%Module1.0 |
setenv VAR VALUE |
设置环境变量 | setenv CUDA_HOME /usr/local/cuda-12.0 |
prepend-path PATH /dir |
将路径添加到环境变量开头(优先生效) | prepend-path PATH /usr/local/cuda-12.0/bin |
append-path PATH /dir |
将路径添加到环境变量末尾 | append-path LD_LIBRARY_PATH /opt/lib |
module-whatis "desc" |
模块描述(module avail 时显示) |
module-whatis "CUDA 12.0 toolkit" |
proc ModulesHelp {} { ... } |
模块帮助信息(module help <module> 时显示) |
见下文示例 |
module load <dep> |
加载依赖模块 | module load gcc/11.2.0 |
is-loaded <module> |
检查模块是否已加载 | if { ![is-loaded gcc/11.2.0] } { ... } |
实战案例:多版本 GCC 管理
1. 安装 GCC 9.3.0 和 11.2.0
假设安装路径分别为/opt/gcc/9.3.0和/opt/gcc/11.2.0。
2. 编写 Modulefile
# 创建gcc模块目录
sudo mkdir -p /usr/share/modules/modulefiles/gcc
cd /usr/share/modules/modulefiles/gcc
# 编写9.3.0版本
sudo vim 9.3.0
#%Module1.0
module-whatis "GCC 9.3.0 compiler"
setenv GCC_HOME /opt/gcc/9.3.0
prepend-path PATH $GCC_HOME/bin
prepend-path LD_LIBRARY_PATH $GCC_HOME/lib64
# 编写11.2.0版本
sudo vim 11.2.0
#%Module1.0
module-whatis "GCC 11.2.0 compiler"
setenv GCC_HOME /opt/gcc/11.2.0
prepend-path PATH $GCC_HOME/bin
prepend-path LD_LIBRARY_PATH $GCC_HOME/lib64
3. 使用与切换
module avail gcc # 查看可用版本
module load gcc/9.3.0 # 加载9.3.0
gcc --version # 验证版本
module swap gcc/9.3.0 gcc/11.2.0 # 切换到11.2.0
gcc --version # 验证切换成功
module purge # 卸载所有模块
5. 高级用法
条件加载
# 仅在加载时执行
if { [module-info mode load] } {
puts stderr "Loading module..."
}
# 仅在卸载时执行
if { [module-info mode remove] } {
puts stderr "Unloading module..."
}
6. 常见问题
-
module avail
不显示模块:- 检查 Modulefile 是否放在
MODULEPATH
路径下; - 检查文件名 / 目录权限(确保可读,
chmod 644 <modulefile>
); - 检查
#%Module1.0
是否放在首行(语法要求)。
- 检查 Modulefile 是否放在
-
加载模块后命令无效:
- 检查 Modulefile 中
PATH
或LD_LIBRARY_PATH
是否指向正确路径(可通过module show <module>
确认); - 确认软件实际安装路径与 Modulefile 中一致(路径不存在会导致失效)。
- 检查 Modulefile 中
-
依赖模块加载失败:
- 检查依赖模块是否存在(
module avail <dep>
); - 依赖逻辑语法错误(如
is-loaded
写成is - loaded
,Tcl 语法不允许空格)。
- 检查依赖模块是否存在(
=======拓展技巧===================================================
-
模块继承 :通过
include
命令复用其他 Modulefile(如include /path/to/base.module
); -
条件适配 :根据系统架构(如
x86_64
/arm64
)设置不同路径:if { $::tcl_platform(machine) eq "x86_64" } { prepend-path PATH /opt/app/x86/bin } else { prepend-path PATH /opt/app/arm/bin }
-
批量管理 :通过
module save <name>
保存当前模块集合,module restore <name>
恢复(如保存常用环境)。