Управление переменными окружения
Переменные окружения - именованные переменные в работающей сессии командной оболочки (например, bash), содержащие текстовые значения. Каждая сессия имет свой набор установленных переменных и их зачений. При завершении сессии значения переменных не сохраняются. С помощью указанных ниже переменных, например, настраиваются:
- PATH - список директорий, в которых ищутся исполняемые файлы;
- LIBRARY_PATH - список директорий, содержащих динамические библиотеки, необходимые компилятору для создания исполняемого файла из исходных текстов;
- LD_LIBRARY_PATH - список директорий, содержащих динамические библиотеки, необходимые для работы программы;
- MANPATH - список директорий, содержащих документацию в формате 'man';
Просмотреть значения всех установленных переменных можно утилитой 'env'. Значение определённой переменной можно узнать, напечатав его (например, выполнив 'echo $PATH').
Изменяя значения переменных окружения, можно работать с разными версиями определённого программного обеспечения. Например, в операционной системе SLES12 SP4 по умолчанию используется компилятор GCC 4.8.5, но после соответствующего изменения переменных окружения могут быть доступны более новые версии GCC - 6,7,8,9.
Для удобства управления переменными окружения используется утилита 'module'. Каждому приложению соответствует конфигурационный файл (модуль), описывающий, как необходимо изменить переменные окружения для работы данного приложения. Модуль может быть как загружен (необходимые значения добавляются к текущим переменным окружения), так и выгружен (настройки, соответствующие данному приложению, удаляются из переменных окружения). Возможно независимо управлять несколькими модулями, например, загрузить настройки для одновременной работы Tecplot и Mathematica. Некоторые комбинации, однако, бессмысленны - например, загрузка модулей для нескольких версий одного и того же приложения.
Если быть точным, существует несколько программ, предоставляющих утилиту 'module'. Более ранняя - Environment Modules, развивающаяся примерно с 1990 года. В связи с определёнными её недостатками позже другим коллективом была разработана программа Lmod, поддерживающая конфигурационные файлы Environment Modules и совместимая на уровне параметров командной строки. Ниже приведены полезные ссылки для обеих программ:
- Lmod:
- Environment Modules:
В нашем центре долгое время использовалась программа 'Environment Modules', но затем была произведена миграция на Lmod, поскольку эта программа используется для управления переменными окружения в SLES High-Performance Computing Module for SLES 12.
При использовании Midnight Commander учитывайте, что эта программа сохраняет текущие переменные окружения при запуске других программ (в частности, при выполнении module) и восстанавливает их после завершения. Поэтому для изменения переменных окружения необходимо предварительно выйти из mc.
Основные возможности 'module'
Показать список
Список доступных модулей отображается следующей командой:
module avail
В результате будет выведено примерно следующее:
-------- /usr/share/lmod/modulefiles -------- gnu/4.8 gnu/6 gnu/7 gnu/8 gnu/9 (D) -------- /opt/shared/modules -------- anaconda/anaconda2 ansys/hfss/12 gams/23.6.3 (D) matlab/r2012a nvidia/cuda-toolkit-5.5 rsoft/optsim5.3 anaconda/anaconda3 (D) ansys/hfss/13.0 gcc/4.3.4 matlab/r2012b nvidia/cuda-toolkit-6.0 rsoft/8.3 (D) ansys/12.1.1 ansys/hfss/14.0 gcc/4.4.7 matlab/r2013a nvidia/cuda-toolkit-7.5 tecplot/latest ansys/13.0 ansys/hfss/15.0 (D) gcc/4.8.2 (D) matlab/r2013b (D) nvidia/cuda-toolkit-8.0 (D) tecplot/2013r1 (D) ansys/14.0 comsol/4.1 gmsh/2.5.0 microsoft-r/3.3 pgi/11.10 ansys/18.0 comsol/4.2a jdk/1.8.0 msc/marc/2015 pgi/13.09 ansys/18.2 comsol/4.3a (D) jre/1.6.0 msc/nastran/r3.1 pgi/14.01 ansys/19.1 cpmd/qmmm-2013 jre/1.8.0 (D) msc/nastran/2010.1.3 (D) pgi/14.04 ansys/2019r3 gams/23.5.2 mathematica/8.0 nvidia/cuda-toolkit pgi/14.10 (D) Where: D: Default Module Use "module spider" to find all possible modules. Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys".
Модули, находящиеся в разделе '/usr/share/lmod/modulefiles', установлены в составе ПО, поставляемого с операционной системой. Модули из раздела '/opt/shared/modules' добавлены администрацией ИВЦ и соответствуют дополнительно установленному прикладному ПО.
Возможно выборочное отображение модулей. Например, чтобы показать только ПО matlab:
module avail matlab
Результат:
-------- /opt/shared/modules -------- matlab/r2012a matlab/r2012b matlab/r2013a matlab/r2013b (D) Where: D: Default Module
Загрузить модуль
Загрузить модуль 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 modules loaded
cn120:~> which java which: no java in (/sbin:/usr/sbin:usr/local/sbin: .... )
Собственные модули
Если необходимо использовать несколько фиксированных конфигураций переменных окружения (например, попеременно использовать несколько компиляторов), то задавать их значения через файл '~/.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