HPC环境软件管理指南 – EnvironmentModule

什么是 Environment Module

在多用户使用的集群中,为了满足不同用户的个性化需求,常常会部署很多公共软件供大家使用,这些软件分别具备不同的功能以及同一个软件的多个不同版本处理依赖问题。所以有效管理软件环境是至关重要的。用户在登录时通过为他们将在会话期间引用的每个应用程序设置环境信息来初始化他们的环境。Environment Modules 包是一个简化 shell 初始化的工具,让用户在会话期间轻松修改他们的环境信息。每个module模块文件都包含一个或多个应用程序配置 shell 所需的信息,例如 PATH、MANPATH 等,可以以干净的方式动态和原子地加载和卸载软件环境。

因此通过熟练掌握该软件的使用方法,您可以轻松地加载软件到当前会话环境以及快速切换某个软件包的不同版本,解决运行时所需的一些依赖关系,优化工作流程提升工作效率。

为什么要使用 Environment Module在 EnvironmentModule问世以前,用户对于自行编译的软件在系统环境变量之外的路径若想不加以绝对路径直接调用,需要自行修改用户根目录环境下的 .bashrc 文件添加对应的PATH以及LIBRARY等信息,但是这又同时出现以下几个问题:

  1. 用户误操作问题:不同用户对 Linux 的掌握程度不同,很多用户并不理解里面每一行代码的含义,导致参照网上方法进行修改时内容出错且无法察觉,如注册PATH时忘记将原有变量内容重新赋值回来(:$PATH) 导致系统环境变量丢失,整个用户shell环境无法使用需系统管理员手工修复该账户文件后恢复,或意外使用错误的重定向符本应使用 “>>” 却意外输入了 “>” 导致整个.bashrc 文件被清空,最简单避免它损坏的方法就是减少用户操作它的可能。
  2. 多软件版本切换繁琐的问题:很多时候完成一套完整的工作流程往往依赖较多的软件甚至要求某个软件的某个版本。如果是我们纯手工调用有的时候我们就会通过简单的给可执行文件改名的方式用以区分,如常见的python2和python3。但是部分被其他软件依赖的场景下这个方法便失去了作用,因为一些软件就是十分简单的判断那个指定的命令是否存在而不会去考虑用户自行添加的加以区分版本的后缀,导致软件依赖项出错。为了满足某一软件的运行频繁去修改用户下的环境变量信息不仅十分麻烦,而且在该软件运行期间无法调用其他可能与之依赖有冲突的软件,极大的限制了人们的工作效率。
  3. 多软件的环境变量信息管理混乱:我们也时常听到诸如这种声音:为什么我的软件明明已经安装好了环境变量也添加了它还是运行那个老的版本?为什么这个依赖库我明明已经安装了但是软件还是提示不存在……诸如此类,很多时候用户注册了环境变量但他并不知道这个路径里面有什么,影响范围以及相同软件的不同版本被同时注册进了环境变量等等引发的一系列问题。
  4. 系统性能下降:当注册过多的路径到环境变量时,每次执行命令系统会访问过多的路径,当存储性能出现下降时系统对于软件的检索性能也会明显下降。
    图片

面对复杂的变量信息,维护起来十分困难而且在集群环境中和个人电脑软件部署与运行方式不一样。在集群环境中,软件会被哪个用户所运行以及在哪个节点运行皆不固定,所以我们需要让软件可以被任意用户在任意节点调用,所以需要统一安装在一个公共路径中,实现一次部署全部可用的状态,也便于后期的软件更新维护,避免集群中各个节点之间软件信息出现差异。

如何使用 EnvironmentModule

下面针对常用操作进行简要介绍

  • 列出可用module
module avail             # 列出全部软件环境,也可以简写为 module avmodule avail -l          # 以列表形态展示qmodule avail <名称前缀>   # 列出指定前缀的软件名称及不同版本信息

  • 加载软件环境信息
module load <software/version>  # 加载软件环境信息到当前环境module add <software/version>   # 加载软件环境信息到当前环境module reload <software/version> # 重新加载软件环境信息到当前环境
# 允许不指定版本信息,非特殊要求情况下默认加载该软件的最新版本module load <software>
  • 卸载软件环境信息
module rm <software/version>      # 卸载指定软件环境信息module unload <software/version>  # 卸载指定软件环境信息module purge                      # 卸载全部已加载环境信息
  • 列出已加载软件环境信息
module list  # 也允许简写为 module limodule avail # 非官方用法,但同样可查看已加载软件状态
  • 快速切换软件
# 等同于先 unload 原有软件版本再 load 新版本module switch <software1/version> <software2/version>module swap <software1/version> <software2/version>
  • 查看帮助信息
module --help

如何利用 EnvironmentModule 构建私有软件仓库

前文中有关该软件的操作都是基于集群内部署的公共软件进行的,有关配置文件路径也位于公共路径中。为了规范化软件部署方式,也避免软件被恶意修改造成意想不到的后果,通常情况下普通用户无法修改公共路径下的文件内容。

但是公共软件库的内容通常只会部署使用范围较广,热度较高的软件,难以覆盖各个课题组所研究的各个尖端领域,那么这个时候我们也通常会自己编译一些专业软件来使用。我们也希望借助现有工具将我们自己编译的软件也管理起来,构建一个仅面向自己或自己所处课题组用户的私有软件库。本次我们通过实际操作进行演示,目标为:构建一个仅组内可用自行维护的公共软件仓库,并部署 samtools 1.20 版本软件。

  1. 初始化路径信息

首先我们要选择一个用于存放安装软件的路径以及一个用于存放配置文件的路径。如果仅自己账户使用,可以创建在当前用户目录下的任意位置他人无法访问。如果面向自己课题组/用户组使用,请先联系管理员创建组内共享路径,在该路径下,所属组内的用户均具备读写权限。本次实例为实现多用户共享,后续有关操作均在该路径下进行。共享路径创建格式: /public/home/<group>/share_group_folder_<group>

本次我们创建对应路径为:

软件安装路径:/public/home/zhangqunjie_lab/share_group_folder_zhangqunjie_lab/application配置文件路径:/public/home/zhangqunjie_lab/share_group_folder_zhangqunjie_lab/application/modulefiles

如允许组内成员自由添加软件到仓库,请修改路径默认权限允许组内成员修改该路径下内容。若软件仓库由固定成员管理,则无需修改,保持默认即可。

# 如需组内成员自由添加软件,请赋值以下权限chmod 775 <软件安装路径>chmod 775 <配置文件路径>

2. 添加自定义配置文件路径信息到变量

用户可以通过设置 MODULEPATH 或者通过 module 命令来增加减少搜索路径。本次通过在~/.bashrc 文件中重新赋值 MODULEPATH 变量来实现自动初始化,在组内每个用户的 ~/.bashrc 文件中添加以下内容:

# 注册配置文件,请使用绝对路径export MODULEPATH=$MODULEPATH:<配置文件绝对路径># 本次演示所使用路径# export MODULEPATH=$MODULEPATH:/public/home/zhangqunjie_lab/share_group_folder_zhangqunjie_lab/application/modulefiles

3. 软件部署前的准备

为了规范软件的部署方式,推荐使用以下路径结构,这也是目前集群中公共软件部署的存储结构。软件安装路径结构与配置文件路径结构相同。提前创建好对应的路径。

<软件安装路径>/<软件名称>/<版本号>

本次演示所使用路径信息:

# samtools 1.20 版本安装路径mkdir -p /public/home/zhangqunjie_lab/share_group_folder_zhangqunjie_lab/application/samtools/1.20/# 配置文件存放路径,到软件名称即可没有版本号mkdir -p /public/home/zhangqunjie_lab/share_group_folder_zhangqunjie_lab/application/modulefiles/samtools

4.软件编译安装

# 下载samtools 1.20 版本源代码wget https://github.com/samtools/samtools/releases/download/1.20/samtools-1.20.tar.bz2# 解压缩软件tar -jxvf samtools-1.20.tar.bz2# 进入目标路径cd samtools-1.20# 执行预编译操作,指定软件安装路径./configure --prefix=/public/home/zhangqunjie_lab/share_group_folder_zhangqunjie_lab/application/samtools/1.20# 执行编译并安装make -j;make install

至此,软件编译安装结束,在软件安装路径可以看到出现了两个文件夹 bin 和 share,其中我们所编译好的 samtools 1.20 版本位于bin目录内,share/man 为帮助文档路径。

# 进入第三步创建好的文件夹cd /public/home/zhangqunjie_lab/share_group_folder_zhangqunjie_lab/application/modulefiles/samtools# 创建同版本号文件,本次是samtools 1.20版本,创建名称为1.20的文件touch 1.20

写入以下内容:

#%Module1.0set     version     1.20
proc ModulesHelp {} { puts stderr "samtools-1.20"}
module-whatis "samtools/1.20"prepend-path PATH "/public/home/zhangqunjie_lab/share_group_folder_zhangqunjie_lab/application/samtools/1.20/bin"prepend-path MANPATH "/public/home/zhangqunjie_lab/share_group_folder_zhangqunjie_lab/application/samtools/1.20/share/man"

EnvironmentModule工具是通过文件首行#%Module来判断是否为modulefile文件,因此首行内容必须以此为开头编写。modulefiles修改后可以直接通过module命令使用,即刻生效。

至此,我们再次执行 module avail 可以看到软件列表下方又多了一行,标题行为配置文件路径,位于我们的共享路径内。软件部署完成。更多软件的部署方法以此为仿照即可。

更多的配置请参阅modulefile官方文档:https://modules.readthedocs.io/en/latest/modulefile.html#description

也可直接参阅集群内现有的modulefile文件进行拷贝修改,路径为:/public/software/Modules/modulefiles

# 以下拷贝自集群文件:/public/software/Modules/modulefiles/jemalloc/5.2.1
#%Module## Last Update: Thu Jun 27 12:42:43 2024 ## Author: wangzt(interestingcn01@gmail.com) - Bioinformatics Laboratory of South China Agricultural Universityset     version     5.2.1proc ModulesHelp {} { puts stderr "jemalloc-5.2.1"}conflict jemalloc/5.3.0set root "/public/software/jemalloc/5.2.1"module-whatis "jemalloc/5.2.1"prepend-path PATH "${root}/bin"prepend-path LD_LIBRARY_PATH "${root}/lib"prepend-path PKG_CONFIG_PATH "${root}/lib/pkgconfig"prepend-path MANPATH "${root}/share/man"

参考文档

https://modules.readthedocs.io/en/latest


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注