Утилита 'module' (Environment Modules)


Многие пакеты программного обеспечения требуют для своей работы корректной настройки переменных окружения, например:

  • PATH - директории, содержащие исполняемые файлы;
  • LIBRARY_PATH - директории, содержащие динамические библиотеки, необходимые компилятору для создания исполняемого файла из исходных текстов;
  • LD_LIBRARY_PATH - директории, содержащие динамические библиотеки, необходимые для работы программы;
  • MANPATH - директории, содержащие документацию в формате 'man';


Для удобства управления переменными окружения используется утилита 'module'. Каждому приложению соответствует конфигурационный файл (модуль), описывающий, как необходимо изменить переменные окружения для работы данного приложения. Модуль может быть как загружен (необходимые значения добавляются к текущим переменным окружения), так и выгружен (настройки, соответствующие данному приложению, удаляются из переменных окружения). Возможно независимо управлять несколькими модулями, например, загрузить настройки для одновременной работы Tecplot и Mathematica. Некоторые комбинации, однако, бессмысленны - например, загрузка модулей для нескольких версий одного и того же приложения. Следует подчеркнуть, что полученные переменные окружения действуют только в рамках активной сессии и нигде не сохраняются. Т.е. в один момент времени в одной сессии может быть загружен один набор модулей, а в другой сессии, даже на этом же сервере - другой набор модулей.

Команда для управления модулями - 'module'. Данная команда не будет работать из под Midnight Commander - сперва закройте его, выполните необходимые операции с модулями, затем при необходимости заново запустите 'mc'.

Показать список

Список доступных модулей отображается следующей командой:

module avail

В результате будет выведено примерно следующее:

--------------------------------------------------------------------- /usr/share/modules ---------------------------------------------------------------------
3.1.6                      modulefiles/module-cvs     modulefiles/modules        modulefiles/mpich-ch-p4mpd modulefiles/use.own
modulefiles/dot            modulefiles/module-info    modulefiles/mpich-ch-p4    modulefiles/null

--------------------------------------------------------------- /usr/share/modules/modulefiles ---------------------------------------------------------------
dot            module-cvs     module-info    modules        mpich-ch-p4    mpich-ch-p4mpd null           use.own

-------------------------------------------------------------------- /opt/shared/modules ---------------------------------------------------------------------
ansys/12.1.1                 cpmd/qmmm-2013               intel/icsxe/2013             msc/nastran/2010.1.3         pgi/14.04
ansys/13.0                   gams/23.5.2                  intel/inspector_xe/2011      msc/nastran/r3.1             rsoft/8.3
ansys/14.0                   gams/23.6.3                  jre/1.6.0                    nvidia/cuda-toolkit          rsoft/optsim5.1
ansys/hfss/12                gcc/sles                     jre/1.8.0                    nvidia/cuda-toolkit-5.5      rsoft/optsim5.3
ansys/hfss/13.0              gmsh/2.5.0                   mathematica/8.0              nvidia/cuda-toolkit-6.0      tecplot/2013r1
comsol/4.1                   intel/compiler/11.1          matlab/r2012a                pgi/11.10                    tecplot/latest
comsol/4.2a                  intel/compiler/mpi-compilers matlab/r2012b                pgi/13.09
comsol/4.3a                  intel/icsxe/2012             matlab/r2013a                pgi/14.01

Модули, находящиеся в разделах '/usr/share/modules' и '/usr/share/modules/modulefiles', установлены в составе ПО, поставляемого с операционной системой. Модули из раздела '/opt/shared/modules' добавлены администрацией ИВЦ и соответствуют дополнительно установленному прикладному ПО.


Возможно выборочное отображение модулей. Например, чтобы показать только ПО Intel:

module avail intel

Результат:

-------------------------------------------------------------------- /opt/shared/modules ---------------------------------------------------------------------
intel/compiler/11.1          intel/icsxe/2012             intel/inspector_xe/2011
intel/compiler/mpi-compilers intel/icsxe/2013

Загрузить модуль

Загружаем модуль JRE версии 1.8.0:

module load jre/1.8.0

Проверяем, какой файл 'java' будет использоваться:

cn120:~> which java
/opt/shared/java/jre1.8.0_45/bin/java

Отобразить загруженные

cn120:~> module list
Currently Loaded Modulefiles:
  1) jre/1.8.0

Выгрузить модуль

Удаляем из переменных окружения информацию загруженного ранее модуля JRE:

module unload jre/1.8.0

Проверяем:

cn120:~> module list
No Modulefiles Currently Loaded.
cn120:~> java
-bash: java: command not found

Чтобы утилита 'module' работала из скрипта для qsub, необходимо в скрипте предварительно выполнить команду 'source' следующим образом:

#!/bin/sh
#PBS -l walltime=...
#PBS -l select=...

cd $PBS_O_WORKDIR

source /etc/profile.d/modules.sh
module load matlab/r2013a

...

Если необходимо использовать несколько фиксированных конфигураций переменных окружения (например, попеременно использовать несколько компиляторов), то задавать их значения через файл '~/.bashrc' неудобно. Вместо этого можно создать собственные модули и подключить их к утилите 'module'.

Пример:

  • Создайте директорию '~/modules'.
  • Создайте файл '~/modules/my-cuda' следующего содержания (формат описан на официальном сайте):
    #%Module -*- tcl -*-
    
    module-whatis   "Add my CUDA Toolkit to environment variables"
    
    prepend-path    PATH                    ~/cuda/bin
    prepend-path    CPATH                   ~/cuda/include
    prepend-path    LD_LIBRARY_PATH         ~/cuda/lib64:/lib
  • Чтобы утилита 'module' использовала файлы из директории '~/modules', выполните (эту команду как раз стоит добавить в '~/.bashrc'):
    export MODULEPATH=$MODULEPATH:~/modules