赞
踩
目录
在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 | 测试节点 |
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 [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> | 交换模块 |
下面以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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。