当前位置: 首页 > news >正文

简单Modules 的配置与管理,灵活应对多版本软件环境的需求。

 参考文档

  • 官方手册:https://modules.readthedocs.io

  • Modulefile 语法:modulefile — Modules documentation

Environment Modules 工具

Environment Modules 是一个环境管理工具,用于动态加载、卸载和管理不同版本的软件环境变量(如 PATHLD_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. 常见问题

  1. module avail不显示模块

    • 检查 Modulefile 是否放在MODULEPATH路径下;
    • 检查文件名 / 目录权限(确保可读,chmod 644 <modulefile>);
    • 检查#%Module1.0是否放在首行(语法要求)。
  2. 加载模块后命令无效

    • 检查 Modulefile 中PATHLD_LIBRARY_PATH是否指向正确路径(可通过module show <module>确认);
    • 确认软件实际安装路径与 Modulefile 中一致(路径不存在会导致失效)。
  3. 依赖模块加载失败

    • 检查依赖模块是否存在(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>恢复(如保存常用环境)。
http://www.dtcms.com/a/326264.html

相关文章:

  • 基于SpringBoot+Uniapp的血压监控小程序(Echarts图形化分析)
  • C++进阶:C++11(2)
  • 应用层模拟面试题
  • 【Jmeter】两个函数拼接
  • IPCP(IP Control Protocol,IP控制协议)
  • 李宏毅2025《机器学习》-第十讲:AI“思想钢印”:深入解析大模型的知识编辑技术
  • docter的使用、vscode(cursor)和docker的连接,详细分析说明
  • (一)vscode搭建espidf环境
  • react路由跳转与路由懒加载等(对照vue来说一说不同之处)
  • 前端开发:React(3)—— 组件运作和事件处理
  • 【论文阅读】BEVFormer论文解析及Temporal Self-Attention、Spatial Cross-Attention注意力机制详解及代码示例
  • 如何平衡短期与长期需求
  • PCIE 设备百科
  • 【运维进阶】LAMPLNMP 最佳实践
  • MPXxx6115A Series的概述以及 MPXxx6115A series 用OSS-ECAL的提供情况
  • Pytest 全流程解析:执行机制与报告生成实战指南
  • html转成markdown(1.0.0)
  • Eino中的两种应用模式:“单独使用”和“在编排中使用”
  • ZKmall开源商城多商户架构:平衡管理与运营的技术方案
  • 【lucene】livedocs描述
  • 如何开始创业?
  • OpenBMC中phosphor-ipmi-host深度解析:架构、原理与应用实践
  • 机器学习TF-IDF算法详解
  • scikit-learn/sklearn学习|岭回归解读
  • AI 视频卫士:AI 无人机巡检,适配多元河道场景的治理利器
  • 网络基础与套接字的学习
  • canvas实现图片标注之Fabric.js从入门学习到实现labelImg矩形多边形标注工具【下】
  • 河北邢台数控滑台与机器人行走轨道的内在联系
  • 煤矿工地运煤卡车的4G远程视频监控解决方案
  • QT通过qputenv设置环境变量与使用(AI生成)