用Modules優雅地管理服務器的環境變量

在我管理的基因組學羣裏,今天有人提出了這樣一個問題,如果有多個版本的BLAST,並且都是用conda安裝,應該如何調用不同版本的BLAST

對於這個問題,其實存在多種解決方案:

  • 用絕對路徑進行調用
  • 使用conda創建多個環境,用 source activate xxx啓動該環境
  • 使用 export/path/to/ncbi-blast-x.x:PATH, 將對應版本的BLAST提前

在我還是一個普通用戶的時候,我用的就是上面的方法進行解決,直到有一天我成爲服務器管理員,我決定用過一個更加裝13的工具對環境變量進行管理,這個工具你或許也能在一些腳本看到,通常會用#進行註釋,例如 #moduleload gcc/6.3.1.這種。

何爲Environment Modules

大部分Linux用戶管理環境變量的方式都是, exportPATH=/path/to/some/bin:/$PATH >> ~/.bashrc,長期以往,當你 echo $PATH時就會發現出現了大量的軟件路徑,在我眼裏,降低系統對工具的搜索速度是其次的,主要是不太好看。

而Module則是由管理員將不同軟件的環境配置寫好,然後用戶在登陸之後,只需要用 moduleload xxx在環境增加自己所需的工具即可。

一個優秀的管理員,不會讓他的用戶去操心軟件安裝的問題,用啥conda,想用啥軟件用啥版本,一個module搞定。

別在評論區說docker,有些服務器的系統太老,說不定都裝不了docker,而且普通用戶未必有這個權限。

工具安裝和配置

由於Modules本來就是給管理員用於配置服務器環境,因此下面的安裝操作都是以Root權限進行。

在安裝Modules之前,先確保自己的系統上安裝 tcl-devel>=8.4。隨後是編譯的常規步驟,

git clone https://github.com/cea-hpc/modules.git
cd modules
./configure && make && make install

相對於安裝,配置則是比較麻煩一些,爲了保證用戶在登錄服務器的時候,能夠調用module,你得現將module的初始化腳本複製到 /etc/profiled.d目錄下

ln -s /usr/local/Modules/init/profile.sh /etc/profile.d/modules.sh
# ln -s /usr/local/Modules/init/profile.csh /etc/profile.d/modules.csh

這樣子每個用戶在登錄服務器的時候,shell會先執行 /etc/profile,而 /etc/profile的任務之一就是執行 /etc/profile.d/下的所有shell腳本,也就將module的運行環境加入了用戶登錄的shell環境中。

之後是配置用戶能夠調用的模塊。你需要先在 /usr/local/Modules/modulefiles增加不同軟件的配置信息,才能用 moduleload進行加載。例如我希望用多個版本的blast,我的BLAST的軟件分別安裝在 /opt/biosoft/ncbi-blast-2.2.31+, /opt/biosoft/ncbi-blast-2.7.1+/bin。,我的操作如下。

先創建存放不同blast配置文件的文件夾

mkdir -p blast

然後在該目錄下,我編輯了兩個modulefile文件

"blast/2.2.31"爲

#%Module1.0#####################################################################
## modules modulefile
module-whatis    "NCBI BLAST 2.2.31"
prepend-path    PATH           /opt/biosoft/ncbi-blast-2.2.31+/bin

"blast/2.7.1"爲

#%Module1.0#####################################################################
## modules modulefile
module-whatis    "NCBI BLAST 2.7.1"
prepend-path    PATH           /opt/biosoft/ncbi-blast-2.7.1+/bin

當一個普通用戶登錄到服務器之後,他直接用 modulelist是沒有加載任何模塊的,也不能用blast

moduleload blast/2.2.31 加載環境後,用戶就能在環境中找到blast

如果想要換個環境,就可以用 switch進行切換。 moduleswitchblast blast/2.7.1

如果你不需要BLAST了,那麼就用 moduleunload blast/2.7.1就能在環境變量中刪除這個工具。

小技巧: 對於一些依賴工具比較多的生信工具而言,用conda安裝會更加方便,那麼如何將 moduleconda進行整合呢?分爲兩步,

第一步,每一個分析流程都要新建一個環境,安裝到指定的目錄,以pb-assembly爲例

conda create -p /opt/biosoft/pb-assembly pb-assembly

第二步,爲將conda安裝的軟件新建一個modulefile,命名爲"pb-assembly"

#%Module1.0#####################################################################
## modules modulefile
module-whatis    "FALCON"
prepend-path    PATH           /opt/biosoft/pb-assembly/bin

那麼就能用 moduleload pb-assembly進行環境加載了。

推薦閱讀

上面僅僅是module的簡單用法,你還需要閱讀https://modules.readthedocs.io/en/latest/modulefile.html`瞭解更多和"modulefile"有關的知識。

以及閱讀https://modules.readthedocs.io/en/latest/INSTALL.html#configuration 定義一些默認加載的模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章