背景
在生信分析中,我们常有不同的任务需要处理,使用到的软件也多到数不胜数,多数小伙伴,使用到conda创建虚拟环境,用起来也算方便,但使用久了,目录文件繁多不说,有时候也会出现意想不到的bug,网络错误或是依赖冲突等。
今天给大家带来的是一款更加优秀的软件管理工具,简单来说就是加载了就添加软件的路径到你的环境变量中去,移除了就删除该环境变量。无其余任何负担。
大概描述下具体使用场景如下:比如你已经有了conda环境1包含了软件1,2,3;conda环境2包含了软件2,3,4。此时,我们想同时使用软件1,2,3,4,要么我们在conda1中安装4或是conda2中安装1,总是要改变一个conda环境,或是新增conda环境(又要多一个conda环境目录了,不考虑)。从“一些都是文件”的概念出发:多数conda环境总是有一些重复的文件的,时间长起来,服务器上会占用很多不必要的空间。
而换到Module上,每个软件都仅出现一次,就是软件自己的目录,要用就加载。可以理解为把上述情况conda1环境拆分了conda1.1,conda1.2,conda1.3;conda2环境变为conda2.2,conda2.3,conda2.4.再合并,最后仅有conda.1,conda.2,conda.3,conda.4软件,同时使用就一起调用,因为每个软件都是手工编译好的软件目录,这样的理念更进一步。
部署步骤
1 准备
1.1 文件准备
不使用yum install,版本较老且有bug。
选择最新版本
1 | #查看最新版本 |
下载5.4.0到本地
1.2 服务器准备
1.2.1 用户新增
新增sysop用户,id为2000(注意id占用,新的服务器可以1000),专用于module管理。
1.2.2 目录新增
使用root
1 | mkdir -p /opt/tools/modules/src /opt/tools/modules/installed /opt/tools/modules/modulefiles |
/opt/tools/modules/src
这里放安装包/源文件
/opt/tools/modules/installed
这里是工具安装路径
/opt/tools/modules/modulefiles
这里放 modulefiles – 各个软件的版本文件
1.2.3 依赖检查
需要tcl>=8.5
1 | echo puts \$tcl_version | tclsh |
tcl-devel需要安装
首先使用 whereis 找到 tclConfig.sh 的位置:
1 | whereis tclConfig.sh |
如果没找到说明 tcl-devel 没安装, yum 安装即可:
1 | yum -y install tcl-devel |
再次查找就可以找到了:
1 | whereis tclConfig.sh |
2 安装
2.1 下载解压
本地上传到/opt/tools/modules/src
1 | cd /opt/tools/modules/src |
2.2 编译安装
1 | ./configure --prefix=/opt/tools/modules/installed --modulefilesdir=/opt/tools/modules/modulefiles |
2.3 全局加载
因为是root环境,我们直接写入/etc/profile最后一句
1 | source /opt/tools/modules/installed/init/profile.sh |
当普通用户登入ssh,自动载入/etc/profile就可以使用module了。
3 配置软件
3.1 移交权限给sysop
前面我们提到了使用sysop用户配置,避免root使用出错
那么我们有了module目录,再建立一个软件安装目录
1 | mkdir /share/apps/repos |
repos:软件目录
/opt/tools/modules/modulefiles:module连接软件的配置目录
两个目录,我们都使用root将所有权交给sysop,后就可以退出root了
1 | chown -R sysop:sysop /share/apps/repos |
3.2 sysop示例安装
以samtools安装为例
3.2.1 下载编译
1 | cd /share/apps/repos |
3.2.2 添加进module
1 | cd /opt/tools/modules/modulefiles |
版本文件内容如下,即让module识别到软件未知并添加进path变量的。
1 | #%Module |
3.2.3 普通用户使用
我们使用 zhangsan 用户登录ssh;
1 | #检查环境变量 |
后记
后续我们写脚本命令前就可以使用ml load软件了
这个时候等同了写R脚本前的library,写python时的import了。
非常方便。