Module

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Scripting ‹ Module


Review.png Review: Dieser Artikel ist für das Review freigegeben.


Getestet.png Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.




Der Kommand module ist ein sehr praktische Werkzeug um viele Programme und Bibliotheken sauber getrennt von einander nutzen zu können. Es erlaubt auch die Nutzung von verschiedenen Versionen eines Programmes. Gerade im Bereich der Hochleistungsrechner ist dieses Programm weit verbreitet und erfreut sich großer Beliebtheit.

Installation und Einrichtung

Als erstes installieren wir das Paket Debianpackage.png environment-modules. Leider ist dies nur der erste Schritt auf dem langen Weg zu einer funktionierenden module Installation.

Der module Kommand

Für eine Login-Shell ist jetzt alle Arbeit getan, aber da /etc/profile nicht immer eingelesen wird, müssen wir da nacharbeiten. Entweder überredet man seinen präferierten Terminal-Emulator dazu, eine Login-Shell zu starten. Oder wir legen Hand an eine bashrc. Entweder die globale unter /etc/bash.bashrc oder die lokale ~/.bashrc, je nach dem, ob für alle oder nur bestimmte Nutzer module zur Verfügung stehen soll.

Fügt einfach folgende Zeile in der gewünschten bashrc ein:

. /etc/profile.d/modules.sh

Eigene Module erstellen

Zunächst brauchen wir einen Ordner, wo die modulefiles abgelegt werden können. Ich werde hierfür /opt/modulefiles verwenden.

Nun müssen wir noch module sagen, wo es die modulefiles finden kann. Dazu muss die Variable MODULEPATH gesetzt werden. Für die Bash einfach folgende Zeile der Bashrc hinzufügen:

export MODULEPATH=/opt/modulefiles/

Das erstes modulefile

Wir wollen nun ein Modul für den gcc in Version 4.8.2 erstellen, der unter /opt/gcc/4.8.2 installiert ist. Um ein Modul zu erstellen, legen wir nun unter /opt/modulefiles einen Ordner mit dem Namen des Modules an, also /opt/modulefiles/gcc.

user@debian:~$ mkdir -p /opt/modulefiles/gcc

Und nun erstellen wir eine Datei mit der Version 4.8.2 als Namen und fügen als Inhalt folgendes ein:

#%Module1.0######################################################################
      
# open mpi
setenv          OMPI_CC         gcc
setenv          OMPI_CFLAGS     ""
setenv          OMPI_CXX        g++
setenv          OMPI_CXXFLAGS   ""
               
setenv CC       gcc
setenv CXX      g++ 
    
prepend-path PATH            /opt/gcc/4.8.2/bin
prepend-path MANPATH         /opt/gcc/4.8.2/share/man/
prepend-path LD_LIBRARY_PATH /opt/gcc/4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2:/opt/gcc/4.8.2/lib64
prepend-path LIBRARY_PATH    /opt/gcc/4.8.2/lib64:/opt/gcc/4.8.2/libexec/gcc/x86_64-unknown-linux-gnu/4.8.2

Dabei gibt es nun zwei Befehle, aus denen im wesentliche alle eure weiteren modulefiles bestehen. setenv und prepend-path. setenv setzt in eurer Shell die angegebene Variable mit dem Inhalt. prepend-path fügt, getrennt durch einen Doppelpunkt, an den Anfang der Variable den Inhalt ein.

Modulefiles sind in Tcl geschrieben, aber das ist kein Problem, da nur wenige Befehle nötig sind.

Abhängigkeiten zwischen Modulen

Es kommt immer mal wieder vor, dass Module Abhängigkeiten untereinander haben. Diese kann man mit conflicts, depends und load implementieren. conflicts sollte klar sein. Der Unterschied zwischen load und depends ist, dass bei einem depends nur geprüft wird, ob die Abhängigkeit geladen ist, während load diese auch tatsächlich lädt.

Benutzung

Ist für ein bestimmtes Programm bereits ein modulefile vorhanden, ist die Benutzung recht einfach. Als Beispiel soll hier gcc herhalten. In Stable ist derzeit 4.7.2 die neuste Version die man bekommen kann. Als Beispiel haben wir sowohl ein modulefile für die Version 4.8.1 sowie eins für 4.8.2 installiert.

Modul laden

Um ein Programm bzw. Bibliothek nutzen zu können, müssen wir das zugehörige modulefile laden. Wir wollen nun den gcc laden. Dazu kann man ganz einfach folgenden Befehl ausführen:

user@debian:~$ module load gcc

Dabei wird nun von module eine Version des Moduls geladen. Genauer gesagt werden alle verfügbaren Versionen eines Moduls alpha-numerisch sortiert und das "größte" ausgewählt. Dies funktioniert bei normalen Versionsnummer recht zuverlässig, aber manchmal steckt der Teufel im Detail. Gut geeignet sind Versionen, z.B. v1.2, 5.0.7, 3.14, Revisionsnummern, z.B. r123, r3536. Weniger gut geeignet sind Namen. Etwa wheeze, jessy (obwohl jessy neuer ist, wird wheezy gewählt, da w nach j kommt). Ebenso Git Commits, da diese Hashes sind und sich nach jedem Commit radikal unterscheiden.

Möchte man kann natürlich auch eine spezielle Version laden. Wollen wir etwa die ältere gcc Version 4.8.1 laden nehmen wir folgenden Befehl:

user@debian:~$ module load gcc/4.8.1

Alle verfügbaren Module anzeigen

Um sich einen Überblick über alle verfügbaren Module und deren Versionen zu machen, wird folgender Befehl ausgeführt:

user@debian:~$ module avail

Alle geladenen Module anzeigen

Wenn man den Überblick verloren hat, welche Module galaden sind, hilft:

user@debian:~$ module list

Ein Modul entladen

Natürlich kann man auch Module entladen. Dabei kann man entweder nur das Modul als Parameter angeben:

user@debian:~$ module unload gcc

Dies entlädt alle geladene Versionen eines Modules, oder man gibt die zu entladende Version mit an:

user@debian:~$ module unload gcc/4.8.1


Weitere Informationen

man-pages

user@debian:~$  man module
user@debian:~$  man modulefiles