GenOpt
======
Zusammenfassung:
GenOpt ist ein Werkzeug, um auf einem Unix-System viele Anwendungs-
pakete uebersichtlich und mit geringem Aufwand zu installieren. Das
De-Installieren wird ebenfalls erheblich erleichtert. Die zu einer
Anwendung gehoerenden Dateien (Binaries, Handbuecher, Bibliotheken
usw.) werden in einem eigenen Verzeichnis-Teilbaum zusammen abge-
speichert. Es gibt zentrale Verzeichnisse fuer Binaries, Handbuecher
etc., die die Benutzer in ihrem Suchpfad haben muessen, um die mit
GenOpt verwalteten Anwendungen aufrufen zu koennen. Die entscheidende
Idee von GenOpt besteht darin, dass von diesen zentralen Verzeichnissen
aus symbolische Links zu den Anwendungsdateien fuehren. GenOpt verwaltet
diese Links.
Definition durch den Autor Ralf S. Engelschall:
`` _Gen_eration of a compact central access layer
for a large pool of locally installed
_opt_ional Unix software,
distributed with complete sources ''
__
Dieses Dokument entstand aus einem Vortrag von Ralf S. Engelschall
bei sd&m am 10.03.1995 und wurde von Steffen Beyer umfassend ueber-
arbeitet.
____________________________________________________________________________
INHALTSVERZEICHNIS
1. Software-Installation?
2. GenOpt
2.1 Wie sieht das aus, was GenOpt erzeugt?
2.2 Wie installiert man Software mit GenOpt?
2.2.1 Einspielen der Software
2.2.2 Auspacken der Software
2.2.3 GenOpt-kompatible Anpassung der zu installierenden Software
2.2.4 Einhaengen des Pakets mit GenOpt
2.2.5 Verschieben eines Pakets
2.2.6 De-Installieren des Pakets
2.3 Hinweise
3. Resuemee des Autors Ralf S. Engelschall
4. Tips & Tricks
____________________________________________________________________________
1. Software-Installation?
Es gibt verschiedene Methoden, mit dem Problem der Software-Installation
umzugehen. Sie alle haben unterschiedliche Vor- und Nachteile. Ein paar
besonders gaengige Vorgehensweisen seien zur Einfuehrung in dieses Thema
kurz vorgestellt:
- 'copy & stay forever'
Das ist die uebliche Methode auf PCs unter DOS/Windows. Neue Pakete
werden auf die Maschine kopiert und dort so verteilt, dass man kaum
noch weiss, welche Dateien (oder Zeilen in .ini-Dateien von Windows!)
zu welcher Anwendung gehoeren. Die Folge ist: Niemand kennt sich mehr
aus, selten wird ein Paket einmal tatsaechlich komplett de-installiert.
Inzwischen gibt es Werkzeuge, die beim Umgang mit diesem Dilemma
helfen sollen (Un-Installer). Jedoch koennen auch damit beim De-
installieren Probleme auftreten, insbesondere bei von vielen Programmen
gemeinsam benutzten Programmbibliotheken (shared libraries oder DLLs).
Mit dieser Methode ist auf Unix-Maschinen (aufgrund der meist noch
hoeheren Anzahl und Komplexitaet der Anwendungen!) die Verwaltung der
installierten Softwarepakete nicht mehr beherrschbar, vor allem nicht
auf Servern (wo zum Teil eine erhebliche Fluktuation der installierten
Software besteht, z.B. um neue Software auszuprobieren oder um sich
aendernden Anforderungen der Benutzer gerecht zu werden).
==> installation : simple
de-installation : impossible!!
- 'package installation' (z.B. Solaris etc.)
Auf manchen Systemen gibt es eigens vorgesehene Mechanismen zum
Installieren und De-Installieren von Programmpaketen (z.B. Unix
System V - Derivate). Diese erfordern allerdings fuer jedes Programm-
paket jeweils eine Reihe von Hilfsdateien, die zudem meistens (ausser
z.B. beim Betriebssystem-Hersteller) nicht mitgeliefert werden. Sie
selbst zu erstellen scheitert oft am Zeitmangel (die Erstellung kann
durchaus eine Woche kosten) oder an ungenuegender Dokumentation der
Package-Installations-Systeme.
==> installation : sometimes very simple
de-installation : sometimes very simple
- '/usr/local/dist'-Loesung (z.B. TU Muenchen)
Bei dieser Methode wird jede Anwendung in einem separaten Verzeichnis
abgelegt. Im Verzeichnis /usr/local/dist befindet sich dabei eine grosse
Anzahl von Symbolic Links, die jeweils auf eins dieser Verzeichnisse
zeigen. Dabei werden diese Links aber manuell erstellt, da kein Tool
vorhanden ist, um dies zu automatisieren. Das fuehrt in der Praxis dann
dazu, dass manche Applikationen korrekt (also vollstaendig ueber Links
erreichbar) installiert sind, andere dagegen gar nicht erst in die
/usr/local/dist-Hierarchie eingehaengt wurden. Die Installation ist
bei dieser Methode also schwer, da manuell, und das De-Installieren
ebenfalls, da man genau wissen muss, welche Links entfernt werden
muessen.
==> installation : hard
de-installation : hard
- 'GenOpt'
Dies ist eine Moeglichkeit, eine Installation nach der obigen Methode
(/usr/local/dist) durchzufuehren, jedoch mit der Unterstuetzung durch
ein entsprechendes Werkzeug (also aehnlich wie bei der oben genannten
"package installation", jedoch werden im Unterschied zu dieser keine
speziellen Installations- und Deinstallations-Skripte benoetigt!), und
zwar sowohl fuer die vorbereitenden Schritte (Anlegen einer Verzeichnis-
struktur zur Aufnahme der zu installierenden Software) als auch das
nachfolgende Anlegen und ggfs. Loeschen von entsprechenden Links.
Voraussetzung hierfuer ist, dass die zu installierende Anwendung
konfigurierbar ist, d.h. keine fest verdrahteten Pfade enthaelt.
Im guenstigsten Fall liegt sie gar im Quellcode vor, der entsprechend
angepasst werden kann.
==> installation : easy
de-installation : easy
2. GenOpt
Hinter diesem Namen verbirgt sich ein BourneShell-Skript von rund 40 KB
Laenge. Ausser den internen BourneShell-Konstrukten werden nur Standard-
Unix-Werkzeuge (wie cat, ls, sed, awk etc.) verwendet, denn GenOpt soll
auch schon bei der Neuinstallation einer Unix-Maschine einsetzbar sein
(Bootstrapping!).
2.1 Wie sieht das aus, was GenOpt erzeugt?
GenOpt erzeugt an einer frei waehlbaren Stelle im Dateisystem des Rechners
eine Zugangs-Schnittstelle zu den installierten Anwendungen. Diese Stelle
heisst auf vielen Systemen ueblicherweise /opt, muss aber nicht. GenOpt
kann dementsprechend konfiguriert (Konstante DEFAULT_LOGICAL_ROOT am
Anfang des Shell-Skripts) oder beim Aufruf mit Parametern entsprechend
gesteuert werden.
(Der Sinn dieser Zugriffsschicht liegt unter anderem darin, dass es bei
einer Vielzahl von separat installierten Anwendungen unmoeglich ist, alle
diese Verzeichnisse im Suchpfad (d.h. der Umgebungsvariablen "$PATH")
unterzubringen.)
In diesem Verzeichnis werden einige Unterverzeichnisse angelegt:
Zugriff durch... ueber GenOpt Schicht... auf...
---------------- ------------------------ -----------------------------
/opt/pkg/foo-591 foo-591 ist ein Directory-
Link auf alle Daten der
Beispielanwendung foo-591
$PATH /opt/bin/foo Anwendungs-Binaries
.../bar
$MANPATH /opt/man/man1/foo.1 Dokumentations-Quellen von Unix
.../man8/bar.8 (nroff-Format)
$INFOPATH /opt/info/foo.info Dokumentations-Quellen von GNU
.../foo-1.info (texinfo-Format)
/opt/lib/foo-591 Directory-Link auf das Library-
Verzeichnis der Anwendung. Dort
stehen programminterne Dateien
mit Namen wie foo.cfg, foo.hlp,
Binaries etc. Die Anwendung ist
beim Installieren so konfiguriert
worden, dass sie diese Daten hier
sucht.
cc -I /opt/include/foo.h C-Header-Dateien
cc -L, ldconfig /opt/shlib/libfoo.a Static und Runtime-Shared-Libraries
.../libfoo.so.2
$XAPPLRESDIR /opt/xad/Foo X11 Application Defaults
.../Bar
Auf die Daten in /opt/shlib greift z.B. der Kernel zur Laufzeit zu,
auf die Daten in /opt/xad die X11-Applikationen ueber die libX11.
Diese Struktur darf nicht ohne weiteres von Hand veraendert werden, wenn
man nicht riskieren will, GenOpt zu verwirren. Das ist ganz analog zu den
in einem internen Format abgespeicherten Datensaetzen eines Datenbanksystems!
(Bestimmte Operationen, wie z.B. das Verschieben von Applikationen innerhalb
des Dateibaums, sind allerdings unter gewissen Bedingungen moeglich.)
GenOpt erzeugt ausserdem innerhalb des zentralen Verzeichnisses (in der
Regel: /opt) einige Hilfsdateien mit Informationen ueber die von ihm
verwalteten Anwendungen. Diese Dateien heissen .genopt.L.* und duerfen
genausowenig von Hand angefasst werden wie die Indexdateien einer Datenbank!
2.2 Wie installiert man Software mit GenOpt?
Softwarepakete installiert man am besten so, dass man sie jeweils in
eigenen, vollstaendig voneinander getrennten Verzeichnis-Teilbaeumen
ablegt, welche in einem speziell hierfuer eingerichteten Dateibaum
mit Kategorien und Unterkategorien (= Verzeichnissen und Unterver-
zeichnissen) einsortiert sind (z.B. sortiert je nach Funktionszu-
sammenhang). Dieser Dateibaum muss als ein Unterverzeichnis von /opt
angelegt werden, wobei der Name jedoch frei konfigurierbar ist, solange
er nur nicht zu Konflikten mit den von GenOpt reservierten Namen fuehrt.
Fuer diesen Dateibaum hat sich in der Praxis das Verzeichnis /opt/packages
bewaehrt (dieser Default-Wert ist bereits in GenOpt so konfiguriert und
kann ueber die Konstante DEFAULT_PHYSICAL_ROOT am Anfang des Skripts
oder ueber Aufrufparameter entsprechend veraendert werden).
Fuer alle nachfolgenden Beispiele sei eine neue Anwendung foo-591 im
Verzeichnis /opt/packages/diverse/foo-591 untergebracht.
2.2.1 Einspielen der Software
Zunaechst einmal muss die Verzeichnisstruktur fuer das neue Software-
paket aufgebaut werden.
Das Anlegen der dafuer notwendigen Verzeichnisse kann wahlweise von Hand
geschehen oder durch GenOpt selbst:
% genopt -c /opt/packages/diverse/foo-591
(Der Parameter "-c" steht dabei fuer "create", "erzeuge".)
Dieser Aufruf erzeugt die folgenden Verzeichnisse:
/opt (Nur falls noch nicht vorhanden)
/opt/packages (Nur falls noch nicht vorhanden)
/opt/packages/diverse (Nur falls noch nicht vorhanden)
/opt/packages/diverse/foo-591
/opt/packages/diverse/foo-591/arc
/opt/packages/diverse/foo-591/bin
/opt/packages/diverse/foo-591/etc
/opt/packages/diverse/foo-591/include
/opt/packages/diverse/foo-591/info
/opt/packages/diverse/foo-591/lib
/opt/packages/diverse/foo-591/man
/opt/packages/diverse/foo-591/shlib
/opt/packages/diverse/foo-591/texmf
/opt/packages/diverse/foo-591/xad
(Man beachte, dass sich die Liste der angelegten Unterverzeichnisse
mit Hilfe des Parameters "-d" auch einschraenken laesst. Mehr dazu
siehe spaeter.)
Ausserdem werden bei diesem Aufruf bereits die ersten wichtigen symbolischen
Links erzeugt, unter anderem
/opt/pkg/foo-591 -> /opt/packages/diverse/foo-591
(Mehr zu diesem Link siehe weiter unten.)
Zu den einzelnen Verzeichnissen:
Anlegen des Verzeichnisses /opt/packages/diverse/foo-591
Dieses Verzeichnis dient der Aufnahme der zu installierenden Applikation.
Durch die Speicherung in einem separaten Verzeichnis ist gewaehrleistet,
dass die Applikation spaeter rueckstandsfrei (durch Loeschen dieses Ver-
zeichnisses) entfernt werden kann.
Anlegen eines Unterverzeichnisses /opt/packages/diverse/foo-591/arc
Dies ist unverzichtbar, da GenOpt den wichtigsten Link, naemlich von
/opt/pkg/foo-591 nach /opt/packages/diverse/foo-591, nur dann anlegt,
wenn es so ein Unterverzeichnis gibt. In diesem Verzeichnis sollten
die Quellen archiviert (Name!) werden, z.B. kann man hier eine Datei
foo-591.tar.gz ablegen, so wie sie beispielsweise aus dem Internet kommt.
Ausserdem hat es sich bewaehrt, hier nach der Installation die angepassten
Konfigurations-Dateien fuer eine moegliche Wiederverwendung fuer spaeter
aufzuheben.
Anlegen eines Unterverzeichnisses /opt/packages/diverse/foo-591/bin
Dieses Verzeichnis dient spaeter zur Aufnahme aller zur Applikation
gehoerenden ausfuehrbaren Programme.
Zusammen mit dem "arc"-Unterverzeichnis stellt es die Minimalkonfiguration
fuer eine Software-Installation mit GenOpt dar.
Je nach Bedarf werden ausserdem aus der oben genannten Liste weitere Unter-
verzeichnisse angelegt.
2.2.2 Auspacken der Software
Anlegen eines Verzeichnisses /opt/packages/diverse/foo-591/dist
Dieses Verzeichnis dient dem Auspacken des Softwarepakets
("dist" = "Distribution"). Beim Auspacken einer tar-Datei
ist dies das Zielverzeichnis.
Die Erstellung eines solchen Unterverzeichnisses ist eine Vorsichts-
massnahme, da nicht alle Softwarepakete beim Auspacken wohlgesittet
ein eigenes Unterverzeichnis anlegen (mit dem Namen und der Versions-
nummer des Softwarepakets), sondern sich der Inhalt der Distribution
beim Auspacken oft einfach nur in das gerade aktuelle Verzeichnis
"ergiesst".
In diesem Verzeichnis wird man dann Konfigurationsdateien,
Makefiles u.ae. finden, die man im naechsten Schritt anpassen muss.
2.2.3 GenOpt-kompatible Anpassung der zu installierenden Software
Dieser Schritt ist Handarbeit, aber wesentlich einfacher als beispiels-
weise das Erstellen von Hilfsdateien fuer "package install"-Mechanismen.
Hierbei ist die Existenz des Links
/opt/pkg/foo-591 -> /opt/packages/diverse/foo-591
von ganz wesentlicher Bedeutung, da damit der physikalische Pfad der
Installation vor der Anwendung selbst verborgen wird, die immer und stets
ueber "/opt/pkg/foo-591" zugreift und den wirklichen physikalischen Pfad
nicht zu kennen braucht.
Man muss auf jeden Fall vermeiden, irgendwo in der Applikation den
physikalischen Pfad "/opt/packages/diverse/foo-591" fest zu verdrahten,
da man sonst spaeter das Programmpaket nicht mehr innerhalb der
Installationshierarchie verschieben kann, was zum Beispiel wuenschens-
wert ist, um Gruppen von Applikationen zu neuen Unterkategorien zusammen-
fassen zu koennen (was bei einigen -zig oder Hunderten von installierten
Applikationen zur Wahrung der Uebersicht oftmals noetig werden kann!).
Eine Applikation, in der der physikalische Pfad fest einkonfiguriert wurde,
wuerde in solch einem Fall nicht mehr funktionieren.
Mit Hilfe des symbolischen Links bekommt sie jedoch von dieser Aenderung
nichts mit und funktioniert weiter wie zuvor.
Bevor man nun zur Compilation der Applikation schreitet, muss man die
Anwendung zuerst entsprechend konfigurieren.
Viele Anwendungen bieten dazu Konfigurations-Werkzeuge an, die in der
Regel die Einstellung der zu verwendenden Installations- und Aufruf-
pfade erlauben.
Falls nicht, muss man die Quelldateien so abaendern, dass alle darin
vorkommenden fest verdrahteten Pfade den Weg ueber symbolische Links
nehmen, und zwar:
/opt/pkg/foo-591 als allgemeine Basis
/opt/pkg/foo-591/bin fuer alle ausfuehrbaren Programme
/opt/pkg/foo-591/lib oder eleganter
/opt/lib/foo-591 fuer alle vom Programm genutzten Bibliotheken
/opt/pkg/foo-591/man/man1 fuer alle man- ("Manual", d.h. Handbuch) Pages
/opt/pkg/foo-591/man/man3
/opt/pkg/foo-591/man/....
/opt/pkg/foo-591/etc fuer rc- ("run-configure") Dateien
/opt/pkg/foo-591/include fuer Header-Dateien (*.h)
/opt/pkg/foo-591/info fuer GNU info-Dateien (Dokumentation)
/opt/pkg/foo-591/shlib fuer alle shared libraries
/opt/pkg/foo-591/texmf fuer alle TeX-Ressourcen
/opt/pkg/foo-591/xad fuer alle X-Ressourcen
Man achte dabei darauf, dass nur diejenigen ausfuehrbaren Programme,
die spaeter vom Benutzer direkt aufrufbar sein sollen, in das "bin"-
Unterverzeichnis gelegt werden, waehrend alle nur von der Applikation
selbst verwendeten Programme in das "lib"-Unterverzeichnis gehoeren!
Fuer die in all diesen Unterverzeichnissen enthaltenen Dateien wird
GenOpt spaeter die entsprechenden Links erzeugen.
Anschliessend wird die Applikation gebaut, d.h. compiliert.
2.2.4 Einhaengen des Pakets mit GenOpt
Nach der Compilation der Applikation (meist mit Hilfe von "make")
muss nun die Applikation installiert und "verdrahtet" werden.
Die Installation in die vorher konfigurierten Unterverzeichnisse
(/opt/pkg/foo-591/bin etc.) geschieht in der Regel durch den Aufruf
von "make install".
Bei einigen (vor allem kleineren) Applikationen kann es jedoch auch vor-
kommen, dass man die erzeugten Binaries, Man-Pages usw. von Hand in die
entsprechenden Unterverzeichnisse kopieren (oder verschieben) muss.
Mit den folgenden einfachen Befehlen wird dann die Applikation "freige-
schaltet":
% cd /opt/packages/diverse/foo-591
% genopt .
oder alternativ
% genopt /opt/packages/diverse/foo-591
GenOpt durchsucht nun, ausgehend vom angegebenen Start-Verzeichnis, alle
die ihm bekannten Unterverzeichnisse auf vorhandene Dateien, und erzeugt
fuer jede gefundene Datei einen entsprechenden symbolischen Link im
entsprechenden Verzeichnis der zentralen Zugriffsschicht, also z.B.
/opt/bin/bar -> ../packages/diverse/foo-591/bin/bar
Dies gilt entsprechend auch fuer die uebrigen Unterverzeichnisse, mit
Ausnahme von "lib" und "texmf", die lediglich - von mir so genannte -
"Bruecken"-Links zu den jeweiligen Unterverzeichnissen der Applikation
herstellen:
/opt/lib/foo-591 -> ../packages/diverse/foo-591/lib
/opt/texmf/foo-591 -> ../packages/diverse/foo-591/texmf
("Bruecken" deshalb, weil ueber sie viele moegliche Verbindungen laufen,
und nicht nur eine eins-zu-eins-Verbindung zustande kommt. Man sagt auch
einfach "Directory-Links" dazu, da sie nicht auf eine Datei, sondern auf
ein Verzeichnis zeigen.)
Zur Erinnerung, der symbolische Link in /opt/pkg ist uebrigens ebenfalls
ein solcher "Bruecken"-Link:
/opt/pkg/foo-591 -> ../packages/diverse/foo-591
Man beachte, dass GenOpt (wie hier angedeutet) stets _RELATIVE_ Links
verwendet, und nicht (wie weiter oben zwecks besseren Verstaendnisses
angegeben), _ABSOLUTE_, also stets "../packages/diverse/foo-591/..."
und nicht "/opt/packages/diverse/foo-591/...".
Dies macht ein spaeteres Verschieben der gesamten GenOpt-Hierarchie
innerhalb des Dateisystems moeglich.
Dazu muss lediglich nach dem Verschieben, zum Beispiel von /opt nach
/usr/local/opt, von Hand ein (einziger!) symbolischer Link wie folgt
(Beispiel!) eingerichtet werden:
/opt -> /usr/local/opt
2.2.5 Verschieben eines Pakets
Das Verschieben eines Software-Pakets (zum Beispiel zur Einsortierung
in eine andere oder neue Unterkategorie) erfolgt in drei Schritten:
Im ersten Schritt werden zuerst alle bestehenden Links zur fraglichen
Applikation "gekappt":
% cd /opt/packages/diverse/foo-591
% genopt -r .
(Der Parameter "-r" steht dabei fuer "remove", "entferne" oder "loesche".)
Im zweiten Schritt wird die Applikation wie gewuenscht verschoben, zum
Beispiel
% cd /opt/packages
% mkdir tools
% mkdir tools/filter
% cd diverse
% mv foo-591 /opt/packages/tools/filter/
Im dritten und letzten Schritt werden die Links wieder "gezogen", im
gegebenen Beispiel mit:
% cd /opt/packages/tools/filter/foo-591
% genopt .
Fertig!
Man beachte, dass diese drei Schritte z.B. auch dann durchzufuehren
sind, falls man das Verzeichnis eines Softwarepakets nur umbenennt.
Das tritt z.B. dann auf, wenn man eine neuere Version desselben
Pakets installieren und die aeltere Installation noch nicht loeschen,
sondern einfach nur umbenennen moechte (z.B. durch Anhaengen der
Versionsnummer).
2.2.6 De-Installieren des Pakets
Die De-Installation eines Software-Pakets mit GenOpt ist verblueffend
einfach:
% cd /opt/packages/tools/filter/foo-591
% genopt -r .
% cd ..
% rm -rf foo-591
Das ist alles!
Alternativ kann man auch wie folgt vorgehen:
% cd /opt/packages/tools/filter/foo-591
% rm -rf *
% genopt .
% cd ..
% rmdir foo-591
Das erfordert jedoch einen Schritt mehr.
In diesem Fall braucht man die Option "-r" nicht anzugeben, da GenOpt
bei jedem Aufruf automatisch alle ueberfluessig gewordenen Links loescht
(diese Option hier mit anzugeben schadet aber auch nicht).
2.3 Hinweise
- Wenn man GenOpt ohne Parameter oder mit dem Parameter "-h" (fuer "Hilfe")
aufruft, gibt GenOpt eine kleine Anleitung (die Liste der moeglichen Auf-
rufparameter mit einer kurzen Erlaeuterung ueber ihren jeweiligen Zweck)
aus.
- Falls man von Hand etwas an den von GenOpt verwalteten symbolischen
Links oder Index-Dateien veraendert hat, oder aus Versehen etwas der-
artiges durch irgendein Werkzeug verursacht wurde, so genuegt in der
Regel ein nochmaliges Aufrufen von GenOpt im Verzeichnis der be-
troffenen Applikation, um etwaige Inkonsistenzen zu bereinigen.
- Falls dies nicht genuegt, kann man auch unbeschadet alle Verzeichnisse
von GenOpt, die ausschliesslich Links enthalten (also /opt/pkg, /opt/bin,
/opt/lib usw., jedoch natuerlich _NICHT_ /opt/packages!) sowie seine
saemtlichen Index-Dateien (/opt/.genopt.L.*) loeschen oder in ein Ver-
zeichnis ausserhalb der GenOpt-Hierarchie verschieben und dann saemtliche
symbolischen Links neu erzeugen.
(Fuer diesen rekursiven Abstieg durch alle Verzeichnisse mit dem Aufruf
von GenOpt fuer jedes einzelne davon gibt es ein kleines Tool namens
"mgenopt" im Unterverzeichnis "misc" dieser Distribution.)
- Manchmal passiert es, dass zwei unterschiedliche Applikationen Dateien
mit dem gleichen Namen haben, vor allem bei der parallelen Installation
von unterschiedlichen Versionen derselben Applikation.
Dadurch kann es zu Konflikten in den Verzeichnissen mit den symbolischen
Links kommen.
Standardmaessig meldet GenOpt in solch einem Fall einen Fehler und
laesst es hiermit bewenden, d.h. der fremde Link wird nicht veraendert
(und ein neuer Link mit demselben Namen also nicht angelegt).
Will man jedoch einer von den beiden Applikationen (z.B. der neueren
davon) den Vorrang geben, muss der alte Link entfernt und durch den
neuen ersetzt werden.
GenOpt bietet hierfuer die Option "-f" an (fuer "force", "erzwinge"),
mit der im selben Lauf von GenOpt zuerst der alte (fremde) Link entfernt
und gleich anschliessend der neue Link erstellt wird.
Bei allen Konflikten wird zudem immer (zur besseren Kontrolle) am
Bildschirm angezeigt, wohin der fremde Link zeigt.
- Man beachte, dass das Entdecken von Konflikten und die automatische
Behebung von Inkonsistenzen zwischen den tatsaechlich vorhandenen
symbolischen Links und den von GenOpt verwalteten Index-Dateien nur
noch teilweise funktioniert, wenn im GenOpt-Skript der "Fast"-Modus
aktiviert ist (Konstante "fast_mode" am Anfang des Skripts)!
Um ganz sicher zu gehen, sollte man bei aktiviertem "Fast"-Modus immer
zuerst alle Links (mit Hilfe der Option "-r") loeschen und anschliessend
wieder neu anlegen - damit ginge allerdings der mit diesem Modus ver-
bundene Geschwindigkeitsgewinn wieder verloren.
Der "Fast"-Modus beschleunigt im uebrigen nur das Ueberpruefen von
Links, das eigentliche Loeschen und Erzeugen von neuen Links bleibt
davon unberuehrt (im "Fast"-Modus wird den Index-Dateien "blind"
vertraut, um festzustellen, ob ein Link bereits existiert oder nicht.
Ohne den "Fast"-Modus wird das Datei-System ueberprueft, ob der be-
treffende Link tatsaechlich existiert.)
- Mit Hilfe des Parameters "-d" (dabei steht das "d" fuer "directory",
"Verzeichnis") laesst sich eine Liste von (durch Komma, jedoch ohne
Leerraum voneinander getrennten) Unterverzeichnissen angeben, auf die
sich die Aktionen von GenOpt dann beziehen, also z.B. die Liste der zu
erzeugenden Unterverzeichnisse bei der Verwendung der Option "-c", um
nicht unnoetig spaeter leerbleibende Unterverzeichnisse zu erzeugen.
Oder um gezielt nur die Links zu einem bestimmten Unterverzeichnis
erstellen oder ueberpruefen zu lassen, oder um bei der Verwendung
der Option "-f" zur Sicherheit die Wirkung auf bestimmte Unterver-
zeichnisse zu begrenzen, oder um nur die Links zu ganz bestimmten
Unterverzeichnissen zu entfernen.
Man beachte, dass die Option "-c" in dieser Hinsicht mehrere Sonder-
faelle beinhaltet:
Zum einen werden die Unterverzeichnisse "arc" und "bin" (als Minimal-
konfiguration) _IMMER_ erzeugt, unabhaengig davon, ob sie mit "-d"
angegeben wurden oder nicht.
Ausserdem werden bei der Erstellung der Unterverzeichnisse die
sogenannten "Bruecken"-Links fuer alle in der Liste angegebenen
"Bruecken"-Verzeichnisse gleich mit erzeugt, mindestens jedoch
fuer das "pkg"-Unterverzeichnis (wegen seiner herausragenden
Rolle fuer jede Applikation), unabhaengig davon, ob es in der
angegebenen Liste erscheint oder nicht.
(Wie sich das verhindern laesst, siehe weiter unten unter "Tips
& Tricks"!)
Man beachte ausserdem, dass die Option "-d" mehrfach auf der
Kommandozeile vorkommen darf; alle angegebenen Unterverzeichnisse
werden intern in einer einzigen Liste zusammengefasst, die dann
als Liste der zu bearbeitenden Unterverzeichnisse dient.
Es ist daher gleichwertig, ob man
% genopt -d bin -d man .
angibt oder
% genopt -d bin,man .
- Bei Optionen, denen ein Argument folgen muss ("-p", "-s" und "-d"),
kann dieses Argument wahlweise entweder direkt auf den Options-Buchstaben
folgen, oder durch Leerraum von diesem getrennt sein.
- Das Zusammenfassen von mehreren Optionen zu einem einzigen "Wort" (wie
z.B. in "-cdbin") ist nicht moeglich.
- Die Verdrahtung von /opt/lib/foo-591 anstelle von /opt/pkg/foo-591/lib
ist Geschmackssache und manchmal (z.B. bei GNU configure) nur schwer
einstellbar. Der Pfad /opt/lib/foo-591 ist der "elegantere", aber beide
funktionieren gleichermassen. Fazit: Wenn es geht, dann /opt/lib/foo-591
verwenden, wenn es nicht einfach geht, dann /opt/pkg/foo-591/lib (z.B.
durch ./configure --prefix=/opt/pkg/foo-591).
- Es soll nicht verschwiegen werden, dass obwohl GenOpt eine sehr elegante
und maechtige Loesung zur Installation von Unix-Software darstellt, nicht
alle moeglichen Anwendungsfaelle von GenOpt abgedeckt werden. Damit sind
vor allem Strukturen von imhomogenen Workstation-Clustern gemeint, die
per NFS ihre Software-Installationen verteilt benutzen wollen. GenOpt
bietet keine Unterstuetzung von Multi-Plattform- oder Multi-Architektur-
Installationen innerhalb einer GenOpt-Hierarchie.
- Es ist ausserdem nicht moeglich, bestimmte /opt/... Eintraege fuer
einzelne Maschinen getrennt generieren zu lassen, wie es z.B. in
folgender Situation auftritt: Auf der Maschine sunfi1 liegt der /opt-
Dateibaum. Hier gibt es z.B. das Software-Paket /opt/pkg/sendmail,
das Mail-Programm. Dieses benutzt Konfigurationsdateien, die es ueber
/opt/lib/sendmail anspricht. Die Maschine sunfi2 benutzt /opt ebenfalls,
und zwar ueber NFS, darf aber keine Mails erlauben, da sie zwar das
Programm /opt/bin/sendmail ausfuehren kann, dieses aber fuer eine andere
Maschine konfiguriert ist (Hostnamen, etc.), was zu Problemen fuehrt.
GenOpt muesste in so einem Falle aus einem gemeinsamen /opt/packages,
das ein /opt/pkg/sendmail/lib.sunfi1 _UND_ ein /opt/pkg/sendmail/lib.sunfi2
besitzt, _ZWEI_ (!) /opt-Hierarchien genieren: Eine fuer die sunfi1 (welche
/opt/pkg/sendmail/lib.sunfi1 als /opt/lib/sendmail bekommt) und eine fuer
die sunfi2 (welche /opt/pkg/sendmail/lib.sunfi2 als /opt/lib/sendmail be-
kommt). Dies ist aber mit GenOpt nicht moeglich.
- Es ist im GenOpt-Skript einkonfiguriert, welche Unterverzeichnisse
es kennt.
Neue, zusaetzliche Verzeichnisse lassen sich dort ganz leicht
einstellen.
Man muss nur darauf achten, ob es sich um ein Verzeichnis fuer die
sogenannten "Bruecken"-Links oder ein solches fuer eins-zu-eins-
Verbindungen handelt, und das Verzeichnis entsprechend in der
Variablen "BRIDGE_SUBDIRS" eintragen oder nicht.
- Unterverzeichnisse von /opt/man (z.B. /opt/man/man1) werden automatisch
von GenOpt erzeugt, wenn sie gebraucht werden.
- Dieses Dokument beschreibt GenOpt Version 2.1.0, die sich zum Teil
erheblich von den vorhergehenden Versionen von GenOpt unterscheidet,
da sie eine vollstaendige Neuentwicklung durch Steffen Beyer darstellt.
3. Resuemee des Autors Ralf S. Engelschall
GenOpt ist nun rund sechs Jahre alt und seit den ersten Stunden bei sd&m
(software design & management GmbH&Co.KG, mit Stammsitz in Muenchen) im
staendigen Einsatz. Mit GenOpt wurden und werden die dortigen Unix-Server
verwaltet. Auch an der TU Muenchen wurde GenOpt bereits eingesetzt, und
mittlerweile verrichtet GenOpt auch bei der Firma Zeppelin seinen Dienst.
Der Einsatz von GenOpt als Installations-Instrument fuer optionale Unix-
Software hat sich in der Praxis sehr bewaehrt, da es dadurch moeglich ist:
- als Administrator eine Uebersicht ueber alle Applikationen zu haben
und die Verwaltung ueber den ganzen Pool einem Werkzeug zu ueberlassen
- die De-Installation einer Applikation trivial ist:
% cd /opt/packages/diverse/foo-591
% genopt -r .
% cd ..
% rm -rf foo-591
- die Installation Spass macht, weil man sich nur Gedanken ueber die
Einordnung der Applikation in eine geeignete Kategorie (= ein geeignetes
Unterverzeichnis) machen muss und das Einhaengen der Applikation selbst
GenOpt ueberlassen kann.
Zusammenfassend muss man sagen, dass rund sechs Jahre Installationen mit
GenOpt ausgezeichnete Ergebnisse erzielt haben. Mit GenOpt war es ueber-
haupt erst moeglich, eine grosse Anzahl von Applikationen (im Bereich von
fast tausend Binaries!) zu verwalten.
4. Tips & Tricks
Wenn man die Option "-c" fuer "create" (erzeugen) gleichzeitig zusammen
mit der Option "-r" fuer "remove" (entfernen, d.h. loeschen) verwendet,
werden lediglich die angegebenen Unterverzeichnisse erzeugt, jedoch
keinerlei Links angelegt.
Zurück zu Programmieren mit Perl-Modulen
© 1998, O'Reilly Verlag