用Modules管理环境变量
官网链接:http://modules.sourceforge.net/
官方文档:https://modules.readthedocs.io/en/latest/
一、什么是Modules
通常,用户在登录时通过为他们将在会话期间引用的每个应用程序设置环境信息来初始化他们的环境。Environment Modules 包是一个简化 shell 初始化的工具,让用户在使用模块文件的会话期间轻松修改他们的环境。
每个模块文件都包含为应用程序配置 shell 所需的信息。一旦 Modules 包被初始化,就可以使用解释模块文件的 module 命令在每个模块的基础上修改环境。通常,模块文件指示模块命令更改或设置 shell 环境变量,例如 PATH、MANPATH 等。模块文件可能由系统上的许多用户共享,并且用户可能有自己的集合来补充或替换共享的模块文件。
模块可以以干净的方式动态和原子地加载和卸载。支持所有流行的 shell,包括 bash、ksh、zsh、sh、 csh、tcsh、fish,以及一些脚本语言,如perl、ruby、tcl、python、 cmake和R。
模块可用于管理不同版本的应用程序。模块也可以捆绑到元模块中,这些元模块将加载一整套不同的应用程序。
大部分Linux用户管理环境变量的方式都是,export PATH=/path/to/some/bin:/$PATH >> ~/.bashrc
,长期以往,当你echo $PATH
时就会发现出现了大量的软件路径,在我眼里,降低系统对工具的搜索速度是其次的,主要是不太好看。而Module则是由管理员将不同软件的环境配置写好,然后用户在登陆之后,只需要用module load xxx
在环境增加自己所需的工具即可。
二、安装配置
1、先安装tlc
sudo apt-get install tcl-dev tk-dev mesa-common-dev libjpeg-dev libtogl-dev
2、安装
-
下载源码文件编译
curl -LJO https://github.com/cea-hpc/modules/releases/download/v4.7.1/modules-4.7.1.tar.gz tar xfz modules-4.7.1.tar.gz
cd modules-4.7.1 ./configure make make install
-
在线安装
# 默认安装版本为3.2.10 yum install environment-modules
3、初始化配置
为了保证用户在登录服务器的时候,能够调用module,你得现将module的初始化脚本复制到/etc/profiled.d
目录下
PREFIX一般情况下是/usr/local/Modules
ln -s PREFIX/init/profile.sh /etc/profile.d/modules.sh
ln -s PREFIX/init/profile.csh /etc/profile.d/modules.csh
或手动执行
source PREFIX/init/profile.sh
三、基本使用
module avail # 显示可以使用的模块
module list # 显示已经加载的模块
module load/add <module_name> # 加载模块
module unload/rm <module_name> # 卸载模块
module switch <module1_name> <module2_name> # 从module1切换到module2
Module工具依托于MODULEPATH
这个环境变量来查找配置信息目录,也就是说你在设置好目录结构,配置好环境变量后,只需要设置这一个module的环境变量,那么module工具就会自动去查找这个路径下的所有配置信息。
up@up-vpc:~$ export | grep MODULEPATH
declare -x MODULEPATH="/usr/local/Modules/modulefiles"
declare -x MODULEPATH_modshare="/usr/local/Modules/modulefiles:1"
up@up-vpc:~$ ls /usr/local/Modules/modulefiles/
dot module-git module-info modules null use.own
# 在modulefiles目录下存在几个默认的modulefile
四、Modulefile
1、介绍
这里MODULEPATH
使用默认路径,即/usr/local/Modules/modulefiles
。通常我们会将同一类的软件、库等内容放在同一个目录,假设目录名为modulefiles
,在modulefiles目录下包含gcc、python、java等常用工具,而gcc又包含4.9.3、5.5.0两个版本,python包含2.7、3.7两个版本、java包含1.5、1.8两个版本,那么它的目录结构如下:
最后面的一版本号命令的文件为modulefile,我们只需要安装这种目录格式创建目录和文件即可。
2、示例
#1、在文件开头一定要写上
#%Module1.0
这个是识别这个文件为modulefile的,没有他这个文件不会被识别
#2、prepend-path要修改的环境变量 路径
prepend-path PATH /soft/gcc/4.8.4/bin
#这个命令会把工具路径添加到环境变量的前面
#3、setenv 环境变量名 值
setenv GCC_HOME /soft/gcc/4.8.4/
#这个命令会把你需要的环境变量配置到系统中
#%Module1.0
setenv GCC_HOME /software/gcc/4.8.4/
prepend-path PATH /software/gcc/4.8.4/bin
3、modulefile语法
文档:https://modules.readthedocs.io/en/latest/modulefile.html#description
-
chdir
修改工作目录chdir directory
-
prepend-path
将值附加或预先添加到环境变量prepend-path [-d C|--delim C|--delim=C] [--duplicates] variable value... # 例如: prepend-path PATH /usr/local/soft/bin
--delim c
可以重置分隔符,默认使用:
作为分隔符,例如PATH=directory:directory:directory
--duplicates
设置可重复定义,默认情况是已定义则不可重复定义
-
setenv
设置环境变量setenv variable value # 例如: setenv CUS_VARIABLE 123
-
module-whatis
定义在调用命令时显示的字符串该字符串参数必须用双引号
module-whatis string # 例如:module-whatis "sysC version 2.3.1"
-
system
通过 shell运行字符串命令在 Unix 上,命令被传递给
/bin/sh
shell,而在 Windows 上,它被传递给cmd.exe
。modulecmd.tcl
将 stdout 重定向到 stderr,因为 stdout 将被评估 shell 解析。返回执行命令的退出状态。system string
五、MODULEPATH
如三中所说,MODULEPATH
用于查找配置信息目录,它也可以设置为多个路径
- 注意:在所有MODULEPATH的路径下绝对不能出现软件名和版本一样的modulefile
export MODULEPATH=/usr/share/Modules/modulefiles:/etc/modulefiles:/soft:/soft1:/soft2
六、设置默认版本
在 module avail 中,我们可以设置默认版本,例如我想将 gcc 4.9.3 设置为默认版本,当我 module load gcc
的时候,无需在后面写/4.9.3
,就直接载入 4.9.3 版本,我们可以使用.version
文件来控制这个默认信息。在 modulefile 同级目录下创建.version
文件
#%Module1.0
set ModulesVersion "4.9.3"
ls /soft/gcc
# 4.8.4 4.9.3 4.9.7
-
使用
module avail
查看,发现在4.9.3版本之后多了default