?參考文檔
-
官方手冊:https://modules.readthedocs.io
-
Modulefile 語法:modulefile — Modules documentation
Environment Modules 工具
Environment Modules 是一個環境管理工具,用于動態加載、卸載和管理不同版本的軟件環境變量(如?PATH
、LD_LIBRARY_PATH
?等),適用于多版本軟件共存場景(如 CUDA、GCC、Python 等)。
1. 安裝 Modules
(1) 通過包管理器安裝
Ubuntu/Debian
sudo apt-get update sudo apt-get install environment-modules
CentOS/RHEL
sudo yum install environment-modules
驗證安裝
which module # 應返回 /usr/bin/module
(2) 源碼編譯安裝(推薦自定義路徑)
# 安裝依賴(Tcl 環境) sudo apt-get install tcl-dev tk-dev # Ubuntu sudo yum install tcl-devel tk-devel # CentOS# 下載源碼 wget https://github.com/cea-hpc/modules/releases/download/v5.3.0/modules-5.3.0.tar.gz tar -xf modules-5.3.0.tar.gz cd modules-5.3.0# 編譯安裝(自定義路徑) ./configure --prefix=/opt/software/modules make sudo make install# 配置環境變量 echo 'export MODULEPATH=/opt/software/modules/modulefiles' >> ~/.bashrc echo 'source /opt/software/modules/init/bash' >> ~/.bashrc source ~/.bashrc
2. 初始化 Modules
(1) 臨時生效(僅當前終端)
source /usr/share/modules/init/bash # 包管理器安裝source /opt/software/modules/init/bash # 源碼安裝
(2) 永久生效(所有用戶)
# 添加到全局 profile sudo sh -c 'echo "source /usr/share/modules/init/bash" >> /etc/profile'# 或僅當前用戶 echo 'source /usr/share/modules/init/bash' >> ~/.bashrc source ~/.bashrc
3. Module 基本命令
命令 | 作用 |
---|---|
module avail | 查看可用模塊 |
module load <module> | 加載模塊 |
module unload <module> | 卸載模塊 |
module list | 查看已加載模塊 |
module purge | 卸載所有模塊 |
module show <module> | 顯示模塊的環境變量 |
module swap <old> <new> | 替換模塊(如切換 CUDA 版本) |
4. Modulefile 編寫
(1) 默認模塊路徑
/usr/share/modules/modulefiles # 包管理器安裝 /opt/software/modules/modulefiles # 源碼安裝
(2) 基本結構
#%Module1.0 proc ModulesHelp { } {puts stderr "This module loads the <Software> environment" } module-whatis "Description of the module"# 設置變量 set version 1.0 set prefix /path/to/software# 環境變量 prepend-path PATH $prefix/bin prepend-path LD_LIBRARY_PATH $prefix/lib setenv SOFTWARE_HOME $prefix
Modulefile 是定義軟件環境的配置文件,采用 Tcl 語法,需放在MODULEPATH
指定的路徑下。
1. 基礎語法
命令 / 語法 | 作用 | 示例 |
---|---|---|
#%Module1.0 | 聲明文件為 Modulefile(必須放在首行) | #%Module1.0 |
setenv VAR VALUE | 設置環境變量 | setenv CUDA_HOME /usr/local/cuda-12.0 |
prepend-path PATH /dir | 將路徑添加到環境變量開頭(優先生效) | prepend-path PATH /usr/local/cuda-12.0/bin |
append-path PATH /dir | 將路徑添加到環境變量末尾 | append-path LD_LIBRARY_PATH /opt/lib |
module-whatis "desc" | 模塊描述(module avail 時顯示) | module-whatis "CUDA 12.0 toolkit" |
proc ModulesHelp {} { ... } | 模塊幫助信息(module help <module> 時顯示) | 見下文示例 |
module load <dep> | 加載依賴模塊 | module load gcc/11.2.0 |
is-loaded <module> | 檢查模塊是否已加載 | if { ![is-loaded gcc/11.2.0] } { ... } |
實戰案例:多版本 GCC 管理
1. 安裝 GCC 9.3.0 和 11.2.0
假設安裝路徑分別為/opt/gcc/9.3.0和/opt/gcc/11.2.0。
2. 編寫 Modulefile
# 創建gcc模塊目錄
sudo mkdir -p /usr/share/modules/modulefiles/gcc
cd /usr/share/modules/modulefiles/gcc# 編寫9.3.0版本
sudo vim 9.3.0#%Module1.0
module-whatis "GCC 9.3.0 compiler"
setenv GCC_HOME /opt/gcc/9.3.0
prepend-path PATH $GCC_HOME/bin
prepend-path LD_LIBRARY_PATH $GCC_HOME/lib64# 編寫11.2.0版本
sudo vim 11.2.0#%Module1.0
module-whatis "GCC 11.2.0 compiler"
setenv GCC_HOME /opt/gcc/11.2.0
prepend-path PATH $GCC_HOME/bin
prepend-path LD_LIBRARY_PATH $GCC_HOME/lib643. 使用與切換
module avail gcc # 查看可用版本
module load gcc/9.3.0 # 加載9.3.0
gcc --version # 驗證版本
module swap gcc/9.3.0 gcc/11.2.0 # 切換到11.2.0
gcc --version # 驗證切換成功
module purge # 卸載所有模塊
5. 高級用法
?條件加載
# 僅在加載時執行 if { [module-info mode load] } {puts stderr "Loading module..." }# 僅在卸載時執行 if { [module-info mode remove] } {puts stderr "Unloading module..." }
6. 常見問題
-
module avail
不顯示模塊:- 檢查 Modulefile 是否放在
MODULEPATH
路徑下; - 檢查文件名 / 目錄權限(確保可讀,
chmod 644 <modulefile>
); - 檢查
#%Module1.0
是否放在首行(語法要求)。
- 檢查 Modulefile 是否放在
-
加載模塊后命令無效:
- 檢查 Modulefile 中
PATH
或LD_LIBRARY_PATH
是否指向正確路徑(可通過module show <module>
確認); - 確認軟件實際安裝路徑與 Modulefile 中一致(路徑不存在會導致失效)。
- 檢查 Modulefile 中
-
依賴模塊加載失敗:
- 檢查依賴模塊是否存在(
module avail <dep>
); - 依賴邏輯語法錯誤(如
is-loaded
寫成is - loaded
,Tcl 語法不允許空格)。
- 檢查依賴模塊是否存在(
=======拓展技巧===================================================
- 模塊繼承:通過
include
命令復用其他 Modulefile(如include /path/to/base.module
); - 條件適配:根據系統架構(如
x86_64
/arm64
)設置不同路徑:if { $::tcl_platform(machine) eq "x86_64" } {prepend-path PATH /opt/app/x86/bin } else {prepend-path PATH /opt/app/arm/bin }
- 批量管理:通過
module save <name>
保存當前模塊集合,module restore <name>
恢復(如保存常用環境)。