简单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.pswp.cn/web/92821.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java内部类-匿名内部类

匿名内部类必须有一个已经存在的类或者接口

上篇:《排序算法的奇妙世界:如何让数据井然有序?》

个人主页&#xff1a;strive-debug 排序算法精讲&#xff1a;从理论到实践 一、排序概念及应用 1.1 基本概念 **排序**&#xff1a;将一组记录按照特定关键字&#xff08;如数值大小&#xff09;进行递增或递减排列的操作。 1.2 常见排序算法分类 - **简单低效型**&#xff…

2025.8.6 图论(1)Solution

2025.8.6 图论&#xff08;1&#xff09;Solution 割点 学习资料&#xff0c;在 csdn 或洛谷上看都行。是模板题题解&#xff08;之一&#xff09;。 T1&#xff1a;Atserckcn与逃离恐怖老师。 题意简述&#xff1a;从一个图中选定一个点&#xff0c;使得删除这个点后图不连…

OpenBayes 教程上新丨一键部署 gpt-oss-20b,实测开源推理模型新 SOTA,性能直逼 o3‑mini

时隔 6 年&#xff0c;自 GPT-2 以来&#xff0c;OpenAI 终于再度发布开源大模型——gpt-oss-120b 和 gpt-oss-20b&#xff0c;前者以千亿级参数专为复杂推理与知识密集型场景设计&#xff0c;后者则更适合低延迟、本地或专业垂直领域使用&#xff0c;可在消费级硬件&#xff0…

nlp-句法分析

目录 一、句法概述 1、成分语法理论概述 &#xff08;1&#xff09;分析过程 &#xff08;2&#xff09;缺点 2、依存语法理论概述 &#xff08;1&#xff09;依存关系、配价模式 &#xff08;2&#xff09;分类 &#xff08;3&#xff09;优势&#xf…

linux磁盘加密

在Linux中&#xff0c;磁盘加密是一种保护数据不被未授权访问的方法。有多种工具和策略可以实现磁盘加密&#xff0c;包括使用Linux内核的内置功能&#xff0c;如dm-crypt&#xff0c;以及使用更高级的解决方案&#xff0c;如LUKS&#xff08;Linux Unified Key Setup&#xff…

大数据架构演变之路

目录 一、各阶段的架构简介 二、各个架构的详细解释 1. 传统离线架构 2.1. Lambda架构-离线数仓分析实时链路分析 2.2. Lambda架构-离线数仓实时数仓 3. Kappa/流批一体架构 4. 湖仓一体架构 三、总结 一、各阶段的架构简介 技术架构 核心驱动(核心需求) ‌关键技术 …

STM32 HAL库驱动0.96寸OLED屏幕

STM32 HAL库驱动0.96寸OLED屏幕 项目概述 本项目使用STM32 HAL库为0.96寸OLED屏幕编写驱动程序。OLED屏幕通过I2C接口与STM32单片机通信&#xff0c;实现文本、数字和图形的显示功能。 项目仓库地址&#xff1a;STM32_Sensor_Drives 硬件连接 OLED屏幕通过I2C接口与STM32连…

横向越权:修改参数访问不属于自己的数据

一、什么是横向越权定义 横向越权&#xff08;Horizontal Privilege Escalation&#xff09;是指 同一权限级别的用户&#xff0c;通过篡改请求参数或资源标识&#xff0c;访问本不属于自己的数据或功能。例子 假设一个在线商城&#xff0c;用户 A 访问订单详情的 URL&#xff…

攻击实验(ARP欺骗、MAC洪范、TCP SYN Flood攻击、DNS欺骗、DHCP饿死)

实验一 ARP欺骗一、拓扑二、实验准备、1.设置终端漏洞靶机集合选择需要的数量和镜像打开设备上的驱动精灵安装网卡安装成功后查看IP地址、网关信息等。三、实验步骤1.实验原理中间人&#xff08;攻击者&#xff09;在终端与网关之间持续发送伪造的 ARP 应答包&#xff0c;双向欺…

VSCode 禁用更新检查的方法

通过设置菜单禁用 这是最直接和推荐的方法&#xff0c;可以永久禁用自动更新&#xff1a; 打开 VSCode。点击左下角的齿轮图标&#xff0c;然后选择“设置”。或者通过菜单栏“文件” > “首选项” > “设置”进入。在顶部的搜索框中输入“update”。找到“Update: Mode”…

Flutter - 应用启动/路由管理

一、应用入口1. 初始化 Flutter 底层绑定 &#xff0c;运行 App。import package:flutter/material.dart; import package:flutter_base/Application.dart;void main() {// 确保绑定初始化WidgetsFlutterBinding.ensureInitialized();// App初始化Application.init(); }2. 注册…

MySQL 数据操作全流程:创建、读取、更新与删除实战

MySQL系列 文章目录MySQL系列前言一、Create(创建)并插入数据1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入冲突时同步更新1.4 冲突时替换二、Retireve读取数据2.1 全列查询2.2 查询指定列2.3 查询字段为表达式2.4 结果去重 DISTINCT2.5 where条件筛选2.6 order by语…

SQL约束:数据完整性的守护者

在SQL中&#xff0c;约束&#xff08;Constraints&#xff09; 是作用于数据库表字段上的规则&#xff0c;用于强制保证数据的完整性、准确性和一致性。当插入、更新或删除数据时&#xff0c;约束会自动验证操作是否符合规则&#xff0c;若违反则拒绝执行。 以下是SQL中常见的约…

Springboot-vue 地图展现

在很多社区管理系统中&#xff0c;地图展示功能是一个重要的模块&#xff0c;它能直观地呈现小区的地理位置分布。本文将详细梳理从前端触发请求到地图上展示小区数据的完整流程&#xff0c;帮助大家理解前后端协同工作的具体细节。一、前端触发&#xff1a;页面加载与地图初始…

Vue 3 登录组件

Login.vue 组件详细分析整体架构 Vue 3 登录组件&#xff0c;采用 Composition API Element Plus UI 库&#xff0c;实现了完整的用户认证界面。 模板结构分析 1. 容器布局 <div class"login-container"><el-card class"login-card"><!-- …

小结: getSpringFactoriesInstances从 `spring.factories` 文件中加载和实例化指定类型的类

getSpringFactoriesInstances 方法工作原理 getSpringFactoriesInstances 是 Spring Boot 框架中的一个核心方法&#xff0c;用于从 spring.factories 文件中加载和实例化指定类型的类。这是 Spring Boot 实现自动配置和插件化扩展的关键机制。 1. 基本功能 该方法的主要作用是…

selenium SessionNotCreatedException问题解决办法

在上周有一台服务器重启之后&#xff0c;Chrome浏览器也自动升了级&#xff0c;原本能够正常使用的自动化办公程序突然没法用了&#xff0c;出现了下面的报错提示。codes/addCancelBdld.py:980: DeprecationWarning: use options instead of chrome_optionsdriver webdriver.C…

SOAP HTTP Binding

SOAP HTTP Binding 引言 SOAP(Simple Object Access Protocol)是一种轻量级、简单的协议,用于在网络上交换结构化信息。它广泛应用于Web服务中,用于实现不同系统和应用程序之间的通信。SOAP HTTP Binding是SOAP协议的一种实现方式,它允许使用HTTP协议来传输SOAP消息。本…

GPT-5免费使用教程(国内可访问)

GPT-5来了&#xff0c;压力给到各大AI模型厂商&#xff1f; 北京时间2025年8月7日&#xff0c;OpenAI 推出两款开源模型 gpt-oss-120b / 20b&#xff0c;性能逼近 o4-mini/o3-mini&#xff0c;一时间火爆AI圈&#xff1b;但这好像只是一道开胃小菜&#xff0c;在北京时间2025年…