vak: (Default)
[personal profile] vak
При работе с программными пакетами внешних поставщиков, особенно в корпоративное среде, часто возникает необходимость оперативно настраивать переменные окружения под определённую версию пакетов. Массу головной боли вызывают такие переменные как PATH, LD_LIBRARY_PATH, PYTHONPATH и другие. Скажем, у нас на фирме для сборки продукта (ядра MIPS) надо выставить пути для дюжины конкретных версий внешних пакетов. Для сборки другого ядра MIPS - другие версии и слегка другой набор пакетов. Чтобы упростить процесс настройки окружения, используется утилита module.

Установка на Ubuntu:
$ sudo apt install environment-modules
После установки пакета надо перелогиниться. В вашем шелле появится алиас или функция module. Для bash это выглядит так:
$ declare -f module
module () 
{ 
    _moduleraw "$*" 2>&1
}
Изначально при входе в систему список загруженных модулей пустой:
$ module list
No Modulefiles Currently Loaded.
Если он непустой, можно его очистить командой:
$ module purge
Краткий список доступных для загрузки модулей можно просмотреть командой:
$ module avail
-------------------- /etc/environment-modules/modules --------------------
ise/14.7       modelsim/17.0  quartus/16.1  systemc/2.2.0  vivado/2016.2  
modelsim/16.0  modelsim/18.0  quartus/17.0  systemc/2.3.0  vivado/2017.2  
modelsim/16.1  quartus/16.0   quartus/18.0  systemc/2.3.1  vivado/2018.2  

--------------------- /usr/share/modules/modulefiles ---------------------
dot  module-git  module-info  modules  null  use.own
Первая половина списка - модули, которые я создавал сам. Ниже покажу подробнее. Вторая половина - стандартные модули для специальных целей. Чуть более подробную информацию про модули можно получить командой:
$ module whatis
-------------------- /etc/environment-modules/modules --------------------
            ise/14.7: Xilinx ISE, Version 14.7
       modelsim/16.0: Altera Modelsim, Version 16.0
       modelsim/16.1: Altera Modelsim, Version 16.1
       modelsim/17.0: Altera Modelsim, Version 17.0
       modelsim/18.0: Altera Modelsim, Version 18.0
        quartus/16.0: Altera Quartus, Version 16.0
        quartus/16.1: Altera Quartus, Version 16.1
        quartus/17.0: Altera Quartus, Version 17.0
        quartus/18.0: Altera Quartus, Version 18.0
       systemc/2.2.0: SystemC, Version 2.2.0
       systemc/2.3.0: SystemC, Version 2.3.0
       systemc/2.3.1: SystemC, Version 2.3.1
       vivado/2016.2: Xilinx Vivado, Version 2016.2
       vivado/2017.2: Xilinx Vivado, Version 2017.2
       vivado/2018.2: Xilinx Vivado, Version 2018.2

--------------------- /usr/share/modules/modulefiles ---------------------
                 dot: adds `.' to your PATH environment variable
          module-git: get last version of the module sources from GitHub
         module-info: returns all various module-info values
             modules: loads the modules environment
                null: does absolutely nothing
             use.own: adds your own modulefiles directory to MODULEPATH
Для примера загрузим несколько модулей:
$ module load modelsim/18.0
$ module load vivado/2018.2
$ module load systemc/2.3.1
Проверим результат:
$ echo $PATH
/opt/Xilinx/Vivado/2018.2/bin:/opt/Altera/18.0/modelsim_ase/linuxaloem:/usr/local/bin:/usr/bin:/bin
$ echo $LD_LIBRARY_PATH
/opt/SystemC/systemc-2.3.1/lib-linux64
$ env | grep SYSTEMC
SYSTEMC=/opt/SystemC/systemc-2.3.1
SYSTEMC_INCLUDE=/opt/SystemC/systemc-2.3.1/include
SYSTEMC_LIBDIR=/opt/SystemC/systemc-2.3.1/lib-linux64
SYSTEMC_HOME=/opt/SystemC/systemc-2.3.1
Как мы видим, Vivado и Modelsim находятся в пути PATH, и установлены переменные для SystemC. Ненужные модули нетрудно выгрузить, и загрузить другие:
$ module unload vivado
$ module load ise/14.7
$ echo $PATH
/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64:/opt/Altera/18.0/modelsim_ase/linuxaloem:/usr/local/bin:/usr/bin:/bin
Чтобы создать свой модуль, надо добавить файл описания модуля в каталог /etc/environment-modules/modules. Фактически это скрипт на языке Tcl. К примеру, вот скрипт для модуля systemc/2.3.1:
$ cat /etc/environment-modules/modules/systemc/2.3.1
#%Module1.0
set version [file tail [module-info name]]
set prefix  "/opt/SystemC/systemc-$version"
set whatis  "SystemC, Version $version"

proc ModulesHelp { } {
    global version prefix whatis

    puts stderr "$whatis"
    puts stderr "\n\tThis adds environment variables SYSTEMC"
    puts stderr "\tand SYSTEMC_HOME as $prefix."
}

module-whatis "$whatis"

setenv SYSTEMC         "$prefix"
setenv SYSTEMC_HOME    "$prefix"
setenv SYSTEMC_INCLUDE "$prefix/include"
setenv SYSTEMC_LIBDIR  "$prefix/lib-linux64"

prepend-path LD_LIBRARY_PATH "$prefix/lib-linux64"

conflict "systemc"
Описание скрипта модуля можно просмотреть командой "man modulefile".

Есть статья про утилиту module на английском: "Environment Modules – A Great Tool for Clusters".

Date: 2019-01-06 04:02 (UTC)
lxe: (Igor Ravel)
From: [personal profile] lxe
Все равно это какое-то кроликов в спальне. Я даже в PATH стараюсь не держать ничего, кроме стандартных системных утилит. Есть аргументы командной строки, скрипты, env A=B и так далее, все это локально. А глобально у меня чистая система для чтения ленты документации в chromium-browser.

Date: 2019-01-06 16:45 (UTC)
ext_792584: (Default)
From: [identity profile] http://poxod.com/lev/
Модули - замечательная штука. Мы, правда, на всх наших кластерах перешли с классических модулей на Lmod (https://www.tacc.utexas.edu/research-development/tacc-projects/lmod).

Lmod поддерживает все функции Tmod, и добавляет много дополнительных вкусностей (http://www.admin-magazine.com/HPC/Articles/Lmod-Alternative-Environment-Modules). Для нас важным была поддержка многоуровневых иерархий (компилятор -> MPI -> дополнительные библиотеки) и директива "family". До того были частые случаи, когда пользователи загружали пару-тройку разных компиляторов и MPI библиотек одновременно, и получались дикие непредсказуемо работающие бинарники :)