Environment Modules: provides dynamic modification of a user's environment 一個可以動態修改用戶環境的工具 ...
https://www.cnblogs.com/yeungchie/
Environment Modules: provides dynamic modification of a user's environment
1. 工具下載
- 手動下載
modules-5.1.0 點擊下載
- wget 下載
wget https://jaist.dl.sourceforge.net/project/modules/Modules/modules-5.1.0/modules-5.1.0.tar.gz
下載不了的話可以使用我上傳到了博客園的 鏈接
wget https://files.cnblogs.com/files/yeungchie/modules-5.1.0.tar.gz
也可以通過 yum -y install environment-modules
安裝,但是一般這樣安裝的是很老的版本。
目前已知 3.x 版本中存在一些 Bug,例如同時載入的 modulefile 較多的時候,module purge
會出現錯誤。
建議使用新版本,目前最新版是 Modules Release 5.1.0
依賴 Tcl 版本 >= 8.5 ,查看 Tcl 版本:
echo puts \$tcl_version | tclsh
# 8.6
2. 工具安裝
下麵演示將 Modules 工具的文件放到 /opt/tools/modules
這個路徑,下麵再建立三個子目錄:
- src
這裡放安裝包 / 源文件 - installed
這裡是工具安裝路徑 - modulefiles
這裡放 modulefiles -- 各個軟體的版本文件
路徑可以根據需求自行改動
2.1. 下載解壓
cd /opt/tools/modules/src
wget https://files.cnblogs.com/files/yeungchie/modules-5.1.0.tar.gz
tar -zxvf modules-5.1.0.tar.gz
cd modules-5.1.0
2.2. 編譯前配置
./configure --prefix=/opt/tools/modules/installed --modulefilesdir=/opt/tools/modules/modulefiles
這一步可能會報錯,提示找不到 tclConfig.sh,需要用 --with-tcl
來指定 tclConfig.sh 所在的路徑。
首先使用 whereis
找到 tclConfig.sh 的位置:
whereis tclConfig.sh
# tclConfig:
如果沒找到說明 tcl-devel 沒安裝, yum 安裝即可:
yum -y install tcl-devel
再次查找就可以找到了:
whereis tclConfig.sh
# tclConfig: /usr/lib64/tclConfig.sh
接著重新執行 configure ,加上 --with-tcl
./configure --with-tcl=/usr/lib64/ --prefix=/opt/tools/modules/installed --modulefilesdir=/opt/tools/modules/modulefiles
其實現在不加
--with-tcl
也沒有問題了,/usr/lib64/ 是一個比較規範的路徑,能夠自動識別到的。
2.3. 編譯安裝
make && make install
工具比較小,很快就安裝好了。
2.4. 載入環境
最後在 ~/.bashrc
中增加下麵這句,就可以自動載入 modules 工具了。
source /opt/tools/modules/installed/init/profile.sh
也可以寫到
/etc/profile
讓所有用戶都預設載入。
具體載入哪個文件,看自己用的是那種 shell 環境。
這些算是使用 Linux 的常識,就不多贅述了。
2.5. 驗證安裝完成
查看一下版本,安裝完成。
module -V
# Modules Release 5.1.0 (2022-04-30)
3. 配置 module
目錄結構
安裝完成後 modulefiles 目錄下會生成一些模版,可以參考一下。
modulefiles 一般是三級 目錄 / 文件 的結構:
- 第一級是 modulefiles 根目錄
- 第二級是軟體名
- 第三級是版本號(這一級的文本文件就是 modulefile)
- 第二級是軟體名
/opt/tools/modules/modulefiles/
├── advm
│ └── 20.10
├── assura
│ └── 416
├── calibre
│ ├── 2019
│ └── 2020
├── ic
│ ├── 617ISR22
│ └── 618.130
├── sos
│ └── 7.05
├── spectre
│ └── 181
...
編寫 modulefile
用 virtuoso 來舉例吧,下麵製作 617 和 618 的兩個版本的 modulefile。
在 /opt/tools/modules/modulefiles/ 下需要創建一個目錄 ic
,再在 ic
目錄下編寫兩個文件就叫 617
和 618
。
- modulefile 必須以
#%Module
開頭,這樣才能被工具識別為 modulefile。 - 文件格式為 Tcl,需要遵循 Tcl 的語法來編寫。
- 常用的函數
- setenv 設置環境變數
- prepend-path 追加到環境變數前
- append-path 追加到環境變數後
- ic/617
#%Module
set version 617ISR22
set HOME $::env(HOME)
set CAD /opt/eda/cadence
set CDS $CAD/IC617ISR22
setenv CDSHOME $CDS
setenv CDS_HOME $CDS
setenv LANG C
setenv CDS_Netlisting_Mode Analog
setenv CDS_ENABLE_VMS 1
setenv CDS_LOAD_ENV CWD
setenv CDS_LOG_PATH $HOME/LOG
setenv CDS_LIC_FILE $CAD/license/license.dat
setenv CDS_LIC_ONLY 1
setenv CDS_AUTO_64BIT ALL
setenv OA_UNSUPPORTED_PLAT linux_rhel50_gcc44x
setenv W3264_NO_HOST_CHECK 1
prepend-path OA_HOME $CDS/oa
prepend-path OA_PLUGIN_PATH $CDS/oa/data/plugins
prepend-path PATH $CDS/tools/bin
prepend-path PATH $CDS/tools/dfII/bin
prepend-path PATH $CDS/tools/plot/bin
prepend-path LD_LIBRARY_PATH $CDS/tools/plot/bin
- ic/618.130
#%Module
set version 618
set HOME $::env(HOME)
set CAD /opt/eda/cadence
set CDS $CAD/IC618.130
setenv CDSHOME $CDS
setenv CDS_HOME $CDS
setenv LANG C
setenv CDS_Netlisting_Mode Analog
setenv CDS_ENABLE_VMS 1
setenv CDS_LOAD_ENV CWD
setenv CDS_LOG_PATH $HOME/LOG
setenv CDS_LIC_FILE $CAD/license/license.dat
setenv CDS_LIC_ONLY 1
setenv CDS_AUTO_64BIT ALL
setenv OA_UNSUPPORTED_PLAT linux_rhel50_gcc44x
setenv W3264_NO_HOST_CHECK 1
prepend-path OA_HOME $CDS/oa
prepend-path OA_PLUGIN_PATH $CDS/oa/data/plugins
prepend-path PATH $CDS/tools/bin
prepend-path PATH $CDS/tools/dfII/bin
prepend-path PATH $CDS/tools/plot/bin
prepend-path LD_LIBRARY_PATH $CDS/tools/plot/bin
指定預設版本
在第二級目錄下新增一個 .version
文件用來指定預設的版本。
#%Module
set ModulesVersion 618
當然這裡的就算不指定,預設的版本也會是 618
5. 常用命令
modulefiles 寫好後就可以使用 module
命令來載入零活地載入環境和切換軟體版本了。
module avail
查看當前所有可用的 module
module avail # 查看所有的
module avail ic # 只看 ic 的
------------------------ /opt/tools/modules/modulefiles ------------------------
ic/617 ic/618Key:
modulepath default-version
module add
載入某個 module
module add ic
virtuoso -V
@(#)$CDS: virtuoso version 6.1.8-64b 08/04/2020 19:31 (cpgsrv11) \$
module list
查看當前已經載入的 module
module list
Currently Loaded Modulefiles:
- ic/618
Key:
default-version
module switch
切換某個 module
module switch ic ic/617
virtuoso -V
@(#)$CDS: virtuoso version 6.1.7-64b 08/21/2018 19:47 (sjfhw316) \$
module rm
移除某個 module
module rm ic
module list ; virtuoso -V
No Modulefiles Currently Loaded.
bash: virtuoso: command not found
如果載入了同個軟體的多個版本,則一次 rm
只會移除一個版本。
當然同一個軟體載入多個版本是不規範的操作。
module purge
清空所有已經載入的 module
module purge
註意這個命令可能在老版本中有人會習慣使用
module clear
,這個實際上是無效的。
它只會清空module list
的內容,並不會移除環境變數中已經載入的內容。
因此後續再進行module rm
操作都是無效的。
我自己的理解是,module clear
的效果只是將已經配置好的環境 "擺脫" Module 工具的控制。
module --help
更多的命令使用方法可以查看 module --help
4. 參考資料
- Environment Modules
- Environment Modules — Modules 5.1.0+22-g144a036c documentation
- cea-hpc/modules: Environment Modules: provides dynamic modification of a user's environment
- tcl - Where can I find tclConfig? - Ask Ubuntu