[ Module ] 環境變數管理工具 Module 安裝和使用

YEUNGCHIE 發表於 2022-05-14

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. 工具安裝

下面演示將 Module 工具的檔案放到 /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 目錄下編寫兩個檔案就叫 617618

  1. modulefile 必須以 #%Module 開頭,這樣才能被工具識別為 modulefile。
  2. 檔案格式為 Tcl,需要遵循 Tcl 的語法來編寫。
  3. 常用的函式
    1. setenv 設定環境變數
    2. prepend-path 追加到環境變數前
    3. 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/618

Key:
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:

  1. 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. 參考資料