目录
Environment Modules工具简介
在Linux环境下,当同一个软件存在多个版本且多个版本都需要在不同的场景下或给不同人员使用时,配置环境变量是一个非常繁琐的过程。Environment Modules是一个专门管理环境变量和软件版本的工具,可以通过NFS共享的方式把多个软件的多个版本安装在NFS共享目录下,通过module load等命令可以非常方便地使用不同版本的软件。Environment Modules工具在EDA领域使用非常广泛。本文介绍Environment Modules的安装和基本使用方法。按习惯叫法,后文也称其为module工具。
module工具官网地址:
module工具官方文档:
Environment Modules — Modules documentation
测试环境
主机名 | 操作系统 | IP地址 | 用途 |
nfs | CentOS 7.9 | 192.168.200.110 | 提供NFS共享目录 |
node01 | CentOS 7.9 | 192.168.200.111 | 测试节点 |
module工具安装
1. 在nfs节点上执行以下操作,设置共享目录:
nfs_ip="192.168.200.110"
yum -y install nfs-utils.x86_64
mkdir -m 777 /software
echo "/software *(rw,sync,no_root_squash)" >> /etc/exports
systemctl enable nfs
systemctl start nfs
# 检查共享
showmount -e $nfs_ip
2. node01挂载共享目录
nfs_ip="192.168.200.110"
yum -y install nfs-utils.x86_64
mkdir -m 777 /software
mount $nfs_ip:/software /software
# 检查挂载
df -h
3. 安装module工具
module工具基于tcl(8.4以上版本)开发。module工具可以使用源码编译方式安装,也可以使用yum快速安装。module工具依赖于tcl工具,因此首先要安装tcl工具。
方法1:yum安装module工具
# yum方式安装需要在每个节点都安装tcl工具和module工具
yum -y install tcl*
yum -y install environment-modules
方法2:源码编译安装module工具(本文后续以此为基础介绍)
# 源码编译安装,把tcl工具和module工具安装在共享目录下,通过nfs挂载的方式就可以使用
# 源码编译安装tcl工具
mkdir /software/tcl
cd /software/tcl
wget --no-check-certificate https://cfhcable.dl.sourceforge.net/project/tcl/Tcl/8.5.9/tcl8.5.9-src.tar.gz
tar -zxvf tcl8.5.9-src.tar.gz
cd tcl8.5.9/unix
yum -y install gcc dejagnu
./configure --prefix=/software/tcl/
make && make install
# 源码编译安装module工具
mkdir /software/module
cd /software/module/
curl -LJO https://github.com/cea-hpc/modules/releases/download/v5.0.1/modules-5.0.1.tar.gz
tar xfz modules-5.0.1.tar.gz
cd modules-5.0.1
./configure --prefix=/software/module --with-tcl-lib=/software/tcl/lib --with-tcl-inc=/software/tcl/include --with-tcl=/software/tcl/lib/tclConfig.sh
make && make install
安装完成之后,在/software/module目录下就有module工具了。不过在默认的$PATH路径下,是没有设置module命令路径的。需要把module工具自带的profile.sh添加到系统/etc/profile文件里,或者用软链接的方式放到/etc/profile.d/目录下,这样登录后就可以直接使用module命令了。
echo "source /software/module/init/profile.sh" >> /etc/profile
# 或者
ln -s /software/module/init/profile.sh /etc/profile.d/modules.sh
ln -s /software/module/init/profile.csh /etc/profile.d/modules.csh
module工具源码编译安装时默认会将tclsh设置为/usr/bin/tclsh,需要替换为/software/tcl下的路径:
cd /software/module/init
sed -i 's#/usr/bin/tclsh#/software/tcl/tcl8.5.9/unix/tclsh#g' $(ls) &>/dev/null
4. 编写modulefiles文件,modulefiles文件中常用关键字如下表所示:
关键字 | 作用 |
set <局部变量key> <局部变量value> | 设置modulefiles文件中的局部变量 |
setenv <环境变量key> <环境变量value> | 设置系统环境变量 |
prepend-path PATH <PATH路径> | 将<PATH路径>添加到环境变量$PATH的最前面 |
set-alias <命令别名> <命令> | 给当前模块设置别名 |
module-whatis | 模块说明 |
如果对modulesfiles语法不太熟悉,可以先写好shell脚本,再通过module工具提供的sh-to-mod子命令转换成modulefiles格式:
module sh-to-mod <shell> <script>
例如,先写好一个bash脚本:
cat >python3.5.sh<< EOF
#!/bin/bash
prefix="/software/python/3.5"
export PYTHON_HOME="$prefix"
export MANPATH="$prefix/share/man"
export PATH="$prefix/bin:$PATH"
alias python="python3.5"
EOF
再通过module sh-to-mod命令转换成modulefiles格式:
$ module sh-to-mod bash ./python3.5.sh
#%Module
prepend-path PATH /software/python/3.5/bin
set-alias python python3.5
setenv MANPATH /software/python/3.5/share/man
setenv PYTHON_HOME /software/python/3.5
module工具常用命令
module [options] [command]
命令 | 用途 |
module avail 或 module ava | 显示可以使用的模块 |
module list | 显示已经加载的模块 |
module load <software/version> 或 module add <software/version> | 加载模块 |
module unload <software/version> 或 module rm <software/version> | 卸载模块 |
module purge | 取消所有加载的工具 |
module show <software/version> | 查看模块配置信息 |
module use <modulefiles路径> | 使用<modulefiles路径>下的模块定义文件 |
module switch <software/version> 或 module swap <software/version> | 交换模块 |
测试module工具的使用
下面以Python的不同版本为例,测试module工具的基本使用。
1. 安装python的3.5和3.6两个不同版本
# 安装在共享目录下,可以通过挂载的方式使用不同版本的python
mkdir -p /software/python/{3.5,3.6}
cd /software/python
wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
tar xzf Python-3.5.1.tgz
tar xzf Python-3.6.1.tgz
cd Python-3.5.1/
./configure --prefix=/software/python/3.5
make && make install
cd /software/python/Python-3.6.1/
./configure --prefix=/software/python/3.6
make && make install
2. 编写python 3.5和3.6的modulefiles文件
modulefiles_dir="/software/module/modulefiles"
mkdir $modulefiles_dir/python
cd $modulefiles_dir/python
# 编辑python/3.6的modulefiles
cat >3.6<< EOF
#%Module
module-whatis "loads the modules environment of python-3.6"
# for Tcl script use only
set prefix /software/python/3.6
setenv MODULESHOME \$prefix
prepend-path PATH \$prefix/bin
prepend-path MANPATH \$prefix/share/man
set-alias python python3.6
EOF
# 编辑python/3.5的modulefiles
cat >3.5<< EOF
#%Module
module-whatis "loads the modules environment of python-3.5"
# for Tcl script use only
set prefix /software/python/3.5
setenv MODULESHOME \$prefix
prepend-path PATH \$prefix/bin
prepend-path MANPATH \$prefix/share/man
set-alias python python3.5
EOF
# 编辑python/.version设置default版本,在不指定版本情况下加载default版本
cat >.version<<EOF
#%Module
set ModulesVersion "3.5"
EOF
说明:module工具是通过#%Module识别modulefiles文件的,因此modulefiles文件第一行必须以#%Module开头,编写或修改完modulefiles文件后可以直接通过module命令使用,无需重新加载。
3. module工具常用命令演示
[user@node01]$ module ava
-------------------------- /software/module/modulefiles --------------------------
dot module-info null python/3.6
module-git modules python/3.5(default) use.own
[user@node01]$ module list
No Modulefiles Currently Loaded.
[user@node01]$ python -V
Python 2.7.5
[user@node01]$ echo $PATH
/software/module/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/user/bin
[user@node01]$ module load python
[user@node01]$ module list
Currently Loaded Modulefiles:
1) python/3.5(default)
[user@node01]$ echo $PATH
/software/python/3.5/bin:/software/module/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/user/bin
[user@node01]$ python -V
Python 3.5.1
[user@node01]$ module rm python/3.5
[user@node01]$ module load python/3.6
[user@node01]$ echo $PATH
/software/python/3.6/bin:/software/module/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/user/bin
[user@node01]$ python -V
Python 3.6.1
关于module命令的更多用法,可以参考module官方文档:
module — Modules documentation
欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。