1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
|
The Modules Package
Version 3.2
4 July 1999
(updated Mar 8 2002)
(updated Dec 15 2005)
INSTALL guide
R.K. Owen, Ph.D.
KooZ Software
rk@owen.sj.ca.us
1. Introduction
_______________
Environment modules provides a great way to easily customize your shell
environment, especially on the fly. However, initial set-up of your
system with environment modules can be somewhat difficult. This guide
will hopefully help you through some of these problems since I've done
this for a number of systems. I've created several scripts and module
files to help things along. Be sure to read the README, because it
gives very detailed information regarding the configure options.
Look at INSTALL.RH7x for an updated example on setting up modules on
a RedHat 7x system. It also contains a minimal way to set up modules
for all the users by modifying only the system rc files (as listed below
in section 2.3).
1.1 Theory of Modules
_____________________
The Modules environment is a program that can read & list modulefiles
returning commands, suitable for the shell to interpret, and most
importantly to ``eval''. In Unix a child process can not modify its
parent environment. How does Modules do this then? Modules parses the given
module file and produces the appropriate shell commands to
set/unset/append/un-append onto an environment variable. These commands
are eval'd by the shell. Every shell provides some mechanism where
commands can be executed and the resulting output can, in turn, be
executed as shell commands. In the C-shell & Bourne shell and
derivatives this is ``eval''. This is the only way for a child process
to modify the parent's (login shell) environment. Hence the module
command itself is a shell alias or function that performs these
operations. To the user, it looks just like any other command.
2. First Time Installation
__________________________
It's somewhat difficult to set-up the modules environment for the first
time on a platform. After having done this a few times it can be
reduced to a few essential steps. However, it's advised that only
an adequately prepared system administer should attempt this.
(See INSTALL.RH7x for a simpler approach.)
2.1 What's Needed Initially
___________________________
The first thing to do is just run './configure' without any arguments
and see how far it gets. The main stumbling block is usually the TCL
installation. Watch carefully which version of TCL is autoconfigured,
as well as the other default paths. If they are what you expected,
congratulations!
Chances are, you'll want to rerun './configure' again with the proper
path to the destination installation as well as the path to the
modulefiles themselves, but first just see if the other ingredients
are ok. If rerunning "./configure" doesn't fix a problem, try deleting
the "config.cache" first.
2.1.1 TCL (Tool Command Language)
You need Tcl8.x installed on your system. Sources and precompiled
binary distributions can be downloaded from http://www.scriptics.com.
Build Tcl using a directory structure anticipating a modules environment,
for example, in the TCL src directory,
./configure --prefix=/usr/local/pkg/tcltk/8.x.y"
If the executable 'tclsh' is on your path, all information regarding how it
was installed should be automatically configured for you using the
modules configure script.
If the configure script doesn't do the right thing, you will
need to set --with-tcl pointing it at the directory with the tclConfig.sh
script, which contains several environment variables detailing where
the header and library files can be found.
However, if there is no tclConfig.sh, or it does not define TCL_VERSION,
TCL_LIB_SPEC, or TCL_INCLUDE_SPEC, then use --with-tcl-version,
--with-tcl-lib, or --with-tcl-inc respectively to give the
Tcl version (X.Y format), the libtcl directory, or the C header
include directory where tclDecls.h, etc. can be found.
2.1.2 A location for the "modulefile" Files
Decide where you will place your local module files and the root
for the module package. It should be a file system separate from
your system root, else it may get wiped out with every OS upgrade.
The default is /usr/local/Modules/modulefiles/. You will use the
--with-module-path=<path> option to the configure script to set this
directory. The default is $prefix/Modules/modulefiles, where
$prefix is set by the the --prefix configure option. (The default
is /usr/local.)
After the initial hardwork of getting the module command
working, all of your future effort will be in maintaining the modulefiles
themselves.
Put the module version files in /usr/local/Modules/versions/. This
directory is only visible if the "modules" modulefile is loaded,
and is only intended for switching between differing module command
versions.
2.1.3 A location for the "module" executables and init scripts.
The root for a particular version of modules should have an
indicative name, such as /usr/local/Modules/3.1.6/.
Once the installation is done, put a symbolic link in the
/usr/local/Modules directory named default pointing to the version
(e.g. "cd /usr/local/Modules; ln -s 3.1.6 default"). The default path to
the installation directory is /usr/local. It is NOT recommended to keep
this default!
2.2 Building and Installing Modules
___________________________________
First - I recommend placing the sources into /usr/local/Modules/src/
either from the tar file or CVS.
If you plan on installing everything in the standard places, and you
have TCL and X installed in the standard places, then just run
./configure
make
make install
and you are done if it all runs successfully.
If you want to specify where the module files are located, AND/OR
you want to install the binaries/man pages elsewhere (you probably
do, since that is what modules is good for!), then the two relevant
options you must specify for configure are --with-module-path and
--prefix, for example
./configure --with-module-path=/your/path/to/module/files \
--prefix=/alternate/usr/local/or/equivalent/1.0/eg
The default for --prefix is /usr/local ($prefix).
The default for --with-module-path is "$prefix/Modules/modulefiles".
If you have trouble with the configuration, then consider
Run "./configure --help" to view some of the other options.
After the sources are configured then:
make
As a sanity check, try running the 'modulecmd' binary with just a
shell name as the only option:
./modulecmd sh
You should get the usage instructions. If you get an error message of
the form:
init.c(425):ERROR:159: Cannot initialize TCL
Then your TCL installation is probably corrupted. This usually means
the internally compiled path to the "init.tcl" script does not match
with reality. You can try getting around this by setting the
TCLLIBPATH environment variable to point to the right directory
(/usr/local/tcl* or /usr/share/tcl* in some cases), but you are
probably better off reinstalling TCL correctly.
If you are successful with the sanity check, then go ahead and install
the binaries.
make install
However, if you want further assurances then run the full test suite
(see 2.2.1 below)
Each successive step depends on successfully completing the previous steps.
However, don't expect everything to work once it's installed,
because the system rc files and the user rc `dot' files need to be
modified to use modules.
Make sure you have a "default" symbolic link in /usr/local/Modules
to point to some version, since the system rc files will refer to
it.
2.2.1 Running the test suite
If you are a developer or overly paranoid, you can run the test suite,
of over 500 tests, to make sure that a minimal set of functionality is
working. You must have 'dejagnu' installed before you run configure. To
run the tests, do
make check
If you find some errors and you wish to get more information, run the
test again as follows
make check RUNTESTFLAGS=--verbose
Using TCL version 8.3, all the tests should pass. TCL Version 8.0
causes a 7 failures, however these are not serious and are due to the
interaction of the test harness with the module command, and will not
be a problem (the problem is the way that stdout/stderr are handled).
2.3 Setting Up the Shell RC Files
_________________________________
Here's a quick tutorial on Shell rc (run-command) files.
When a user logs in and if they have /bin/csh(/bin/sh) as their shell,
the first rc fire to be parsed by the shell is /etc/csh.login &
/etc/csh.cshrc (/etc/profile) (the order is implementation dependent),
and then the user's $HOME/.cshrc ($HOME/.kshenv) and finally
$HOME/.login ($HOME/.profile). All the other login shells are based on
/bin/csh and /bin/sh with additional features and rc files.
Certain environment variables and aliases (functions) need to be set for
Modules to work correctly. This is handled by the Module init files
in /usr/local/Modules/default/init, which contains separate init files
for each of the various supported shells, where default is a symbolic
link to a module command version.
2.3.1 Global Shell RC Files
___________________________
Since Modules sets & appends to several environment variables it's a good
idea to set them up with the default system values, else the compilers,
loaders, man pages, etc. may not find the default system paths if not
listed in the appropriate environment variables.
Look in ./etc/global for example rc files (csh.login, profile) that
defines most of the variables you'll likely need.
(These files are not yet tailored to each different platform. The
current ones are targeted at GNU/Linux systems.)
None of the environment variables are needed directly for a correct
Modules environment.
The Modules specific commands are located in ./etc/global and are named
``csh.modules'' and ``profile.modules''. These files should be copied
to /etc [or where ever you specified with the --with-etc-path=<path>
option to the configure script].
These files will be source'd from the users' .login and .profile . Edit
these files if you want certain modules to be automatically loaded by
every user. Currently, it loads only ``null'' which does absolutely
nothing.
2.3.2 Skeleton Shell RC (``Dot'') Files
_______________________________________
You have these, I presume? If you don't now is the time to set them up.
The skeleton files provide a ``default'' environment when new users are
added to your system. The files are usually placed in /etc/skel [or
where ever you specified with the --with-skel-path=<path> option to the
configure script], and contains a minimal set of ``dot'' files and
directories that every new user should start with. The skeleton files
are copied to the new user's $HOME directory with the ``-m'' option to
the ``useradd'' command. A set of example ``dot'' files are located in
./etc/skel . Copy everything but the .*.in and CVS files and
directories to the skeleton directory. Edit and tailor for your own
system.
If you have a pre-existing set of skeleton files, then make sure
the following minimum set exists: .cshrc, .login, .kshenv, .profile .
They can be automatically updated with:
env HOME=/etc/skel /usr/local/Modules/default/bin/add.modules
and hit return. Inspect the new ``dot'' files and if OK, then
remove all the .*.old (original) files.
An alternative way of setting-up the users' dot files can be found
in ./ext. This model can be used with the --with-dot-ext configure
option.
2.3.3 User Shell RC (``Dot'') Files
___________________________________
The final step for a functioning Modules environment is to modify the
user ``dot'' files to source the right files.
One way to do this is to put a message in the /etc/motd telling each
user to run the command:
/usr/local/Modules/default/bin/add.modules
which is a sophisticated script that parses their existing ``dot''
files pre-pending the appropriate commands to initialize the Modules
environment. The user can re-run this script and it will find
and remember what modules they have initially loaded, strip out
the previous module initialization and restore it with an upgraded
one. If the user lacks a necessary ``dot'' file, the script will
copy one over from the skeleton directory. The user will have
to logout and login for it to come into effect.
Another way is for the system administrator to "su - username" to
each user and run it interactively. The process can be semi-automated
with a single line command that obviates the need for direct interaction:
su - username -c "yes | /usr/local/Modules/default/bin/add.modules"
Power users can create a script to directly parse the /etc/passwd file
to perform this command. For the rest of us, just copy the passwd file
and edit it appropriately to execute this command for each valid user.
2.4 Module Files
________________
Once the above steps have been performed, then it's important to
have module files in each of the modulefile directories. The
install will place the following module files (for example):
------------------- /usr/local/Modules/3.0.9-rko/modulefiles -------------------
dot module-info modules null use.own
If you don't have your own module files in /usr/local/Modules/modulefiles
then copy ``null'' to that directory. On some systems an empty
modulefile directory will cause a core dump, on other systems no problem.
Use /usr/local/Modules/default/modulefiles/modules as a template for
creating your own module files. For more information do
module load modules
and then you have ready access to the module(1) modulefile(4) man
pages, as well as the versions directory. Study the man pages carefully.
The version directory may look something like this:
------------------------- /usr/local/Modules/versions --------------------------3.0.5-rko 3.0.6-rko 3.0.7-rko 3.0.8-rko 3.0.9-rko
The model you should use for modulefiles is ``name/version''. For
example my /usr/local/Modules/modulefiles directory has a directory
named ``netscape'' which contains the following module files: 301, 405c,
451c, etc. When it's displayed with ``module avail'' it looks something
like this:
netscape/301
netscape/405c
netscape/451c(default)
netscape/45c
netscape/46
The default is established with .version file in the netscape directory
and it looks something like this:
#%Module1.0###########################################################
##
## version file for Netscape
##
set ModulesVersion "451c"
If the user does ``module load netscape'', then the default
netscape/451c will be used. The default can be instantly changed by
editing the .version file to point to a different module file in that
directory. If no .version file exists then Modules will just assume the
last module in the alphabetical ordered directory listing as the
default.
3. Package Location Suggestions
_______________________________
To make Modules a useful tool in your environment, it's a good idea to
use some discipline and may require some work in placing binaries and man
pages in suitable locations. It's a way to stop using /usr/local/bin as
a catch-all dump for every miscellaneous binary, especially the ones
that don't get used too often. There are some scripts to help this along.
For this discussion I will use the mythical ``foobar'' package. I've
down-loaded the sources in a form of a gzip'd tar file -
foobar-1.2.3.tar.gz .
Most sources can be placed anywhere, and in most cases will configure
and build without any problems. For this example I will do everything
from /tmp. I unload the sources with ``tar -xzf foobar-1.2.3.tar.gz''
which creates a directory in the current working directory (/tmp) named
./foobar-1.2.3 . Cd to this directory and run the configure script
./configure --prefix=/usr/local/pkg/foobar/1.2.3
and it should configure the sources to place all necessary files to
that location. Continue the build, typically with:
make
make check
make install
The binaries, libraries, man pages, and info pages are now placed
in /usr/local/pkg/foobar/1.2.3 . If you need to create the ``root''
yourself, then load the ``modules'' module with ``module load modules''.
Use the ``mkroot -m'' script to create a collection of ./bin, ./etc,
./lib, ./man/ directories. Install the items as needed, then use
``mkroot -c'' to clean out the empty directories.
Finally, after installing the binaries, etc. then create a module file
using another module file as a template and place it somewhere in the
modulefile hierarchy. Also be sure to keep your original sources
somewhere. If you had no problems just copy the original gzip'd tar file
to, say, /usr/src.
If your module file is new and somewhat involved, then it's a good idea
to do "module load use.own" to create your own private modules directory
off your $HOME directory. It's a good place to test module files, or to
keep your own private collection of module files.
The following is an example of the module configuration for
rk@owen.sj.ca.us "module avail"
------------------------- /usr/local/Modules/versions --------------------------
3.0.5-rko 3.0.6-rko 3.0.7-rko 3.0.8-rko 3.0.9-rko
------------------- /usr/local/Modules/3.0.8-rko/modulefiles -------------------
dot module-info modules null use.own
------------------------ /usr/local/Modules/modulefiles ------------------------
F/970328 gif2png/2.0.1(default) perl5/005static
RKO gnuplot/3.7 pgp/pgp-5.0
X/bohr http postgres/6.5.1
X/console java/1.1.6v5(default) postgres/7.0(default)
X/dark java/1.2.2RC4 python/1.5.2c
X/dirac jpeg/6b samba/1.9.18p2
X/light l2h sfw
X/owen lesstif slatec/4.1
X/xfig libpng/1.0.5 sniff
acrobat/3.0.2 linklint/2.1 staroffice/5.1
acrobat/4.0 netcdf tcltk/8.0.5(default)
apache/1.3.12(default) netscape/6.0.0pr1 tcltk/8.2.3
apache/1.3.9 new tex/te
applix/4.4.2(default) nntp texinfo/3.12
applix/shelf/2.0 ntp/3-5.92 vastf90/3.4N5
aux ntp/3-5.93e vmware/2.0
cxref/1.4b openssl/0.9.5 workman
cxref/1.5b oracle/8i xgks
dejagnu/1.3 pbm/1mar94p1 xpdf/0.90
gcc/2.95.2 perl5/004
gettext/0.10.35 perl5/005(default)
-------------------------- /u/owen/rk/privatemodules ---------------------------
dump htm4.old m4html yyy/xxx/test/2.0
htm4 librko umask
htm4.new librko.xxx yyy/xxx/test/1.0
The module list I use for compiling modules (plus some additional things)
from "module list"
Currently Loaded Modulefiles:
1) applix/4.4.2 3) gcc/2.95.2 5) tcltk/8.2.3
2) null 4) dejagnu/1.3 6) use.own
4. Upgrading Module Commands
____________________________
The theory is that Modules should use a similar package/version locality
as the package environments it helps define. Switching between versions
of the module command should be as easy as switching between different
packages via the module command.
Suppose there is a change from 3.0.5-rko to version 3.0.6-rko. The goal
is to semi-automate the changes to the user ``dot'' files, such that
the the user can be oblivious to the change.
The first step is to install the new module command & files to
/usr/local/Modules/3.0.6-rko/.
Test it out by loading with "module load modules 3.0.6-rko".
You may get an error like:
3.0.6-rko(25):ERROR:152: Module 'modules' is currently not loaded
This is OK and will likely go away with future versions.
Make sure you have the new version with "module --version".
If it seems stable enough for yourself, then advertise it to
your adventureous users.
Once you are satisfied that it appears to work adequately well, then
go into /usr/local/Modules remove the old "default" symbolic link
to the new versions. For example:
cd /usr/local/Modules
rm default; ln -s 3.0.6-rko default
This new version is now the default, and will be referenced by
all the users that log in and those that haven't loaded a specific
module command version.
|