Environment Modules

image

from pixiv

Environment Modules可通过允许动态制作或删除相关环境变量组来帮助用户管理其UNIX或Linux Shell环境。

安装Environment Modules

源码安装编译

手动下载源码:

cd ~/build
wget https://files.cnblogs.com/files/yeungchie/modules-5.1.0.tar.gz
tar -zxvf modules-5.1.0.tar.gz
cd modules-5.1.0

./configure --prefix=xxx --modulefilesdir=xxx
make && make install

--prefix 表示将Modules工具安装到指定目录下,--modulefilesdir表示
Modules工具默认的modulefiles存放目录

我的prefix选择了/usr/share/Modules, modulefilesdir选择了/usr/share/Modules/modulefiles

初始化加载环境

cd /usr/share/Modules/init能看到初始化的文件:
image
根据你的Shell类型,将初始化脚本添加到配置文件中:

source /usr/share/Modules/init/bash
  • profile.sh,通用环境变量配置:定义 MODULEPATH、MODULESHOME 等全局变量。适用于所有 Shell(如 Bash、Zsh、Csh)的登录环境(如通过 SSH 登录时自动加载)。
  • bash, Bash 专属功能:定义 module 函数及 Bash 特有的命令补全、语法逻辑。仅在 Bash Shell 中使用。

当执行 source /usr/share/modules/init/bash 时,实际是为当前 Bash Shell 启用 Environment Modules 功能。具体操作包括:

  • 定义 module 命令:module 本身是一个 Shell 函数(而非独立可执行文件),该脚本会定义这个函数,使其支持 module load、module list 等操作。
  • 设置环境变量: 初始化 MODULEPATH(模块搜索路径)、MODULESHOME(Modules 安装根目录)等关键变量。
  • 加载基础配置:确保模块系统的默认行为(如模块缓存、日志等)生效。
  • 兼容性处理 :针对不同 Shell 版本(如旧版 Bash)的语法差异进行适配。

相关系统环境变量

MODULEPATH

MODULEPATH 包含一组目录路径(用冒号分隔),Environment Modules 会从这些路径中查找模块文件(.modulefile 或 .mod)。

export MODULEPATH=$HOME/envs:$MODULEPATH

那么若我在$HOME/envs下有相关modulefiles文件,直接搜索到:

source /usr/share/Modules/init/bash
export MODULEPATH=$HOME/envs:$MODULEPATH
mkdir -p ~/envs/redis
cat <<EOF > ~/envs/redis/6.2.9
xxx
xxx
xxx
EOF

然后可直接通过module load redis/6.2.9加载

Modules命令

1. 查看可用模块

module avail       # 列出所有可用模块

2. 加载/卸载模块

module load python/3.9.5    # 加载指定模块
module unload python/3.9.5  # 卸载指定模块

3. 查看已加载模块

module list

4. 清除所有模块

module purge       # 卸载所有已加载模块

5. 查看模块详细信息

module show python/3.9.5  # 显示模块定义的环境变量和依赖

6. 搜索模块

module spider python      # 搜索所有版本的Python模块

modulefiles

  • 模块文件使用 Tcl 语法的子集,核心是通过预定义命令配置环境变量。
  • 模块文件通常存放在 MODULEPATH 定义的目录中
  • 按软件名称和版本分层存放,例如:
$MODULEPATH/python/3.9.5    # 对应模块名 python/3.9.5
$MODULEPATH/gcc/12.2.0

#%Module1.0
proc ModulesHelp { } {
    puts stderr "This module loads Python 3.9.5 into your environment"
}
module-whatis "Loads Python 3.9.5"

# 假设 Python 安装在 /opt/python/3.9.5
set python_root /opt/python/3.9.5

# 设置环境变量
setenv PYTHON_HOME $python_root
# 添加可执行路径到最前
prepend-path PATH $python_root/bin
# 添加库路径
prepend-path LD_LIBRARY_PATH $python_root/lib
# 添加 Man 手册路径
prepend-path MANPATH $python_root/share/man
# 依赖 GCC 12 编译器
module load compiler/gcc-12
# 与旧版本 Python 冲突
conflict python/2.7
  • set python_root /opt/python/3.9.5设置的变量python_root只在本modulefiles文件中其作用

  • setenv PYTHON_HOME $python_root作用相当于export PYTHON_HOME=$python_root

  • proc ModulesHelp { } {xxx}:ModulesHelp为 Environment Modules 的保留名称,用于定义模块帮助信息。
    puts stderr向标准错误流(stderr)输出内容.
    module help <模块名> 时,会触发此过程,输出帮助信息。

  • module-whatis提供模块的简短描述,通过 module whatis <模块名> 查看

  • prepend-path PATH /some/bin将路径添加到 PATH 开头(优先级高)
    append-path PATH /some/bin将路径添加到 PATH 末尾(优先级低)

posted @ 2025-04-26 22:56  次林梦叶  阅读(89)  评论(0)    收藏  举报