跳转至

module

Module 介绍

传统上,我们在服务器上安装软件分为两步:

  • 下载软件并将其安装在服务器上;
  • ~/.bashrc中写入相应的环境变量,例如$PATH, $LD_LIBRAPRY_PATH等。

软件数量较少时可能并不会出现什么问题,但当使用的软件很多,很多软件又依赖大量的库,并且依赖库的版本不同时,如果还是用传统的方法在~/.bashrc 中写入这些变量,可能不同的库之间会产生严重的干扰导致软件不能使用,这时可能需要我们把~/.bashrc中的内容一项项注释掉,直到我们需要的软件能正常运行(平台用户碰到过这种情况较多)。

这里推荐一个很好用的集群应用软件环境管理工具Module,它可以动态地更改$PATH, $LD_LIBRARY等环境变量,每次只引入我们需要的库文件、应用软件的相关环境变量。

module基本使用

使用之前我们需要知道Module中一个比较重要的文件modulefile文件,每个软件都需要有对应的modulefile文件,里面定义了该软件所需要的所有环境变量、软件说明、依赖的其他软件和库文件等,需要使用该软件时,我们用相关命令载入该modulefile文件,即可载入该软件的所有环境变量、依赖软件和库文件等。下面是module常用的一些命令:

module available
: 列出所有可使用的软件。可以用module av简写来代替,同时module av支持模糊搜索,例如module av m会列出所有以m开头的软件

module load modulefile
: 加载某个软件

module unload modulefile
: 卸载某个软件

module purge
: 清除所有已经加载的软件

module list
: 列出目前已经加载的软件

module show modulefile
: 列出某个软件modulefile里的内容

module swith|swap [modulefile_old][modulefile_new]
: 在不同的软件版本之间切换

在实验室集群中使用module

我在software帐号下预装了一些常用的软件,大家可以在自己的~/.bashrc内写入基本的配置,即可使用module来引用预装好的各种软件。

  • 将下面高亮为黄色部分的代码写在所有其它用户自己写入的变量之前,注意要在那3行系统自带if 语句之后,否则会有异常;
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi


export LD_LIBRARY_PATH=""
export LIBRARY_PATH=""
export MANPATH=""
export INCLUDE=""
export FPATH=""
export CPATH=""
export MKLROOT=""
export MIC_LD_LIBRARY_PATH=""
export NLSPATH=""
export PATH="/public/home/software/opt/moudles/Modules/3.2.10/bin/:/opt/ibm/lsf/10.1/linux3.10-glibc2.17-x86_64/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin"
source /public/home/software/opt/moudles/Modules/3.2.10/init/bash 
  • 当需要使用SOAPdenovo2时,我们可以先用module list查看一下目前的环境中是否加载了SOAPdenovo2,如果没有,则首先通过 module av S 来搜索SOAPdenovo2的modulefile文件;
$ module av

--------------------------------------------- /public/home/software/opt/bio/modules/all/ ----------------------------------------------
ABySS/1.9.0-foss-2016b                                   Java/1.8.0_92
ALLPATHS-LG/52488                                        JUnit/4.12-Java-1.8.0_92
Anaconda2/4.0.0                                          libevent/2.0.22-foss-2016b
ant/1.9.7-Java-1.8.0_92                                  libffi/3.2.1-foss-2016b
argtable/2.13-foss-2016b                                 libjpeg-turbo/1.5.0-foss-2016b
augustus/2.7                                             libpng/1.6.23-foss-2016b
augustus/3.2.7                                           libreadline/6.3
Autoconf/2.69-foss-2016b                                 libreadline/6.3-foss-2016b
Automake/1.15-foss-2016b                                 LibTIFF/4.0.6-foss-2016b
Autotools/20150215-foss-2016b                            libtool/2.4.6-foss-2016b
BamTools/2.4.0-foss-2016b                                libunwind/1.1-foss-2016b
BamUtil/1.0.13-foss-2016b                                libxml2/2.9.4-foss-2016b
BCFtools/1.3-foss-2016b                                  log4cplus/1.1.2
BEDTools/2.26.0-foss-2016b                               log4cplus/1.1.2-foss-2016b
BFAST/0.7.0                                              Lua/5.1.4-8
binutils/2.26                                            M4/1.4.17
binutils/2.26-GCCcore-5.4.0                              M4/1.4.17-foss-2016b
binutils/2.27                                            M4/1.4.17-GCCcore-5.4.0
binutils/2.27-GCCcore-6.2.0                              M4/1.4.17-GCCcore-6.2.0
BioPerl/1.6.924-foss-2016b-Perl-5.22.1                   maker/2.31.9
Bison/3.0.4                                              MaSuRCA/3.2.1
Bison/3.0.4-foss-2016b                                   MATLAB/2015a
Bison/3.0.4-GCCcore-5.4.0                                METIS/5.1.0-foss-2016b
  • 通过第二步,我们得知SOAPdenovo2的modulefile文件为 SOAPdenovo2/r240-foss-2016b ,此时我们可以使用 module load SOAPdenovo2/r240-foss-2016b 命令来加载SOAPdenovo2的所有环境变量;
  • 如果不再需要使用SOAPdenovo2,我们可以使用 module unload SOAPdenovo2/r240-foss-2016b 命令来卸载所有SOAPdenovo2相关的环境变量。如果我们一次加载了很多软件,我们可以使用module purge来卸载所有软件的环境变量。

自定义modulefile文件

有时我们需要用的软件在系统上没有预装,此时,我们可以将此软件安装在用户自己的目录下,然后自定义modulefile文件来通过module来加载自己安装的软件。以sratoolkit为例,具体步骤如下:

  • 建立一个目录用于放置所有自定义的modulefile文件;
mkdir ~/.modulefiles
  • 运行 module use ~/.modulefiles 命令,使得 module av, module load 可以搜索、加载~/.modulefiles目录下的modulefile文件(其实该命令的作用是将~/.modulefiles加入到$MODULEPATH变量中)。为了保证长期可用,建议将改命令写入到~/.bashrc文件中;
module use ~/.modulefiles
  • ~/.modulefiles创建目录sratoolkit:mkdir sratoolkit ,编辑一个以该软件版本为名字的文件:vim 2.5.7 ,文件内容如下(内容比较简单,更复杂的例子可以查看官网);
#%Module
set root /public/home/software/opt/bio/software/sratoolkit/2.5.7
conflict sratoolkit
prepend-path    PATH            $root/bin
  • 保存退出后,运行module av 即可以看到sratoolkit的modulefile文件sratoolkit/2.5.7,需要使用时运行命令:module load sratoolkit/2.5.7 ,就可以使用该软件了。
module load sratoolkit/2.5.7

有些软件安装完后,通过 source xxx.sh 的方式导入环境变量,可以这么写 modulefile ,如 intel parallel studio

#%Module

set scriptpath  "/public/software/intel/2018.1/compilers_and_libraries_2018.1.163/linux/bin"
switch -- [module-info shelltype] {
    sh {
        source-sh bash $scriptpath/compilervars.sh intel64
    }
    csh {
        source-sh tcsh $scriptpath/compilervars.csh intel64
    }
}

append-path         INTEL_LICENSE_FILE     "/public/software/intel_parallel_studio/licenses"

注意事项

有的用户自己的~/.bashrc等文件内有自己写入的环境变量,使用module载入系统装好的软件时,载入的环境变量可能会与自己已有的环境变量产生冲突,导致载入的软件不可用,此时需要注释掉自己的环境变量。典型例子,载入需要perl支持的软件时如RepeatMasker,如果自己的用户环境内已经有了perl相关的环境变量,可能会因为两个不同版本的perl之间的冲突导致软件不可用,此时需要注释自己的perl的相关环境变量。

本文阅读量  次
本站总访问量  次