diff --git a/de_DE.ISO8859-1/articles/version-guide/article.sgml b/de_DE.ISO8859-1/articles/version-guide/article.sgml index dd901b98e7..8875d1a39a 100644 --- a/de_DE.ISO8859-1/articles/version-guide/article.sgml +++ b/de_DE.ISO8859-1/articles/version-guide/article.sgml @@ -1,478 +1,473 @@ %articles.ent; ]>
Die für Sie passende FreeBSD-Version bestimmen The FreeBSD Documentation Project $FreeBSD$ &tm-attrib.freebsd; 2005 The FreeBSD Documentation Project Sie haben sich dafür entschieden, FreeBSD zu installieren. Dieses Dokument soll Ihnen dabei helfen, sich für eine Version zu entscheiden. Übersetzt von Johann Kois. Hintergrundinformationen Damit Sie sich für die für Sie am Besten geeignete &os;-Version entscheiden können, müssen Sie einige Konzepte unseres Entwicklungs- und Release Engineering (RE)-Prozesses verstehen. &os; wird von einer großen Gruppe von fast ausschließlich freiwilligen Mitarbeitern entwickelt. Der Quellcode des Kernels und der Systembibliotheken wird durch ein Versionskontrollsystem verwaltet und kann jederzeit heruntergeladen werden. Zusätzlich werden in regelmäßigen Abständen binäre Installationspakete erstellt. Einige dieser Binärversionen durchlaufen einen intensiveren Testprozess und werden danach als Release veröffentlicht. Releases Releases werden durch eine Hauptversionsnummer sowie eine Unterversionsnummer gekennzeichnet. Das Ziel eines Haupt-Releases ist es, neue Funktionen einzuführen. Dafür kann es auch nötig sein, die Kompatibilität mit Vorgängerversionen zugunsten der Weiterentwicklung von &os; aufzugeben. Andererseits werden manchmal Funktionen aus dem System entfernt, die nicht länger benötigt werden. Eine Unterversion wird veröffentlicht, um Probleme zu beheben sowie die Leistung und Stabilität des Systems zu verbessern. Dabei hat aber die Erhaltung der Kompatibilität zwischen den einzelnen Unterversionen Priorität. Ist die Einhaltung dieser Vorgaben gewährleistet, werden gelegentlich auch in Unterversionen neue Funktionen eingeführt. Beachten Sie aber, dass eine Release-Version lediglich den Stand des Quellcodes zu einem bestimmten Zeitpunkt darstellt, dem ein Name (ein sogenanntes Tag) zugewiesen wurde. So hat das Release Engineering Team dem Release 5.4 das Tag RELENG_5_4_0_RELEASE zugewiesen. Der aktuelle Entwicklungsstand wird hingegen durch das Tag HEAD gekennzeichnet. Entwicklungszweige Zeitgleich mit der Veröffentlichung einer Release-Version wird ein Zweig (branch) erzeugt (in unserem Beispiel RELENG_5_4). Der Quellcode von RELENG_5_4_0_RELEASE bleibt danach unverändert, während sich Dateien des Zweiges RELENG_5_4 sehr wohl verändern können, wenn Änderungen wie Behebungen von Sicherheitslücken oder anderen Problemen von HEAD übernommen werden. Während der Lebenszeit einer Hauptversion wird ein weiteres Tag vergeben, beispielsweise RELENG_5. In diesen Zweig können zusätzlich zu den eben genannten Aktualisierungen auch weitere Neuerungen von HEAD übernommen werden, um so den Übergang zur nächsten Unterversion vorzubereiten. <firstterm>STABLE</firstterm> versus <firstterm>CURRENT</firstterm> Während der Lebenszeit einer Hauptversion kann auch ein STABLE-Zweig erzeugt werden. Dadurch wird signalisiert, dass das &os;-Projekt der Ansicht ist, dass dieser Zweig nun so stabil ist, dass er für die meisten Anwender geeignet ist. Ein Zweig, der vor seiner Eignung für den allgemeinen Einsatz noch weiter getestet werden muss, wird hingegen als CURRENT bezeichnet. Das &os;-Projekt übernimmt keine Garantie dafür, dass die vertriebene Software für alle Einsatzzwecke stabil genug ist. Diese Entscheidung kann nur der jeweilige Anwender selbst treffen. Bedenken Sie auch, dass das FreeBSD-Projekt sich fast ausschließlich aus Freiwilligen zusammensetzt. Daher kann auch nicht garantiert werden, dass die Software für Ihre Anforderungen geeignet ist. <firstterm>Ports</firstterm> versus <firstterm>Packages</firstterm> Neben dem Betriebssystem selbst unterstützt &os; auch Tausende Anwendungen, die unabhängig vom Projekt selbst von Dritten entwickelt werden. Dazu gehören Window-Systeme, Internetbrowser, E-Mail-Programme, Office-Programme und viele andere mehr. Das FreeBSD-Projekt stellt dazu in der Regel nur das als Ports-Sammlung bezeichnete Gerüst bereit, damit diese Programme unter &os; installiert werden können. Ein Programm, dessen Lizenz die Installation aus dem Quellcode erlaubt, wird als Port bezeichnet, ein Programm, das aus einer vorkompilierten Binärdatei installiert wird, hingegen als Paket (package). Bisherige Release-Zeitpläne Während der Entwicklung von &os; 5.X traten Probleme auf, deren Tragweite erst im Nachhinein vollkommen klar wurde. Die Entwicklungsziele für die 5.X-Reihe waren äußerst ambitioniert und sahen unter anderem vor: Die Unterstützung von Mehrprozessor-Systemen (Symmetric MultiProcessing (SMP)). Die Erhöhung der Leistungsfähigkeit durch die Entwicklung einer neuen Strategie für das Ressourcenmanagement innerhalb des Kernels. Die zusätzliche Unterstützung von verschiedenen Prozessor-Architekturen. Die Einführung eines neuen Modells für die Handhabung von Threads. Die Entwicklung eines neuen Schedulers. Die Unterstützung neuer Technologien wie Power Management (insbesondere auf Notebooks). All dem übergeordnet war die Festlegung, die 5.X-Serie erst dann für STABLE zu erklären, wenn all diese Aufgaben erledigt waren. Dies führte dazu, dass zwischen dem Entstehen des STABLE-Zweiges von 4.X beziehungsweise 5.X mehrere Jahre vergingen. Dieser Umstand hatte mehrere unerwünschte Auswirkungen: Die große Anzahl der gleichzeitig zu implementierenden Neuerungen machte es sehr schwierig, einen Teil davon zu isolieren und in den STABLE-Zweig einzubringen. Anwender, die bestimmte Neuerungen unbedingt benötigten (etwa die Unterstützung neuester Hardware), entschieden sich vielfach dafür, beispielsweise &os; 5.2.1 zu installieren, obwohl es sich dabei um ein CURRENT-Release handelte, das nur für Entwickler und nicht für den allgemeinen Einsatz vorgesehen war. Um Änderungen aus diesen Versionen wieder in den aktuellen Entwicklungszweig einzubringen, waren die Entwickler gezwungen, diese Eigenschaften auf &os;-Versionen zu unterstützen, die sie nicht als primäre Entwicklungsplattform nutzten. Die zeitliche Verzögerung bis zum Erscheinen von &os; 5.3, dem ersten STABLE-Release, führte zu umfangreichen Änderungen, was die Aktualisierung auf die neue Version äußerst kompliziert machte. Um es auf den Punkt zu bringen: Niemand war mit dieser Entwicklung zufrieden. Aus dieser Problematik wurden daher folgende Rückschlüsse gezogen: Neue Hauptversionen werden künftig nicht mehr so umfangreiche Änderungen aufweisen. Dafür werden solche Versionen häfiger veröffentlicht werden. Soweit möglich, sollen Funktionserweiterungen künftig voneinander isoliert entwickelt werden. Dies setzt voraus, dass Teile der Entwicklungsarbeit außerhalb des Hauptquellcodebaumes erfolgen. Änderungen werden erst dann in den Hauptentwicklungszweig eingebracht werden, wenn sichergestellt ist, dass diese die Stabilität anderer Entwicklungsprojekte nicht beeinträchtigen. Hauptversionen werden sich künftig an einem Zeitplan orientieren und nicht mehr an den zu implementierenden Änderungen. Wenn bestimmte Eigenschaften zum geplanten Veröffentlichungszeitpunkt nicht fertig werden, werden sie vorerst deaktiviert und erst in der nächsten Hauptversion aktiviert. Durch die häufigere Veröffentlichung von weniger umfangreichen Änderungen erhofft man sich außerdem, dass die Einbringung von neuen Eigenschaften aus HEAD in die neue STABLE-Version erleichtert wird. Dadurch können solche Eigenschaften in mehreren Hauptversionen unterstützt werden. Da es sich dabei in der Regel um isolierte Änderungen handeln wird, verringert sich auch die Wahrscheinlichkeit, dass mit diesen Änderungen neue Probleme eingeführt werden. Durch die Fokussierung auf einen Zeitplan statt auf geplante Änderungen wird es für Anwender, Entwickler von externen Programmen sowie &os;-Entwickler einfacher werden, eigene Planungen zu erstellen. - - Diese Überlegungen, und nicht die Anpassung an die - Hauptversionsnummern anderer Betriebssysteme, sind die - Hauptmotivation für die Änderung des - Entwicklungszyklusses. Zukünftige Release-Zeitpläne So sehen die derzeitigen Planungen des &os;-Projekts für zukünftige Versionen aus: Alle 18 Monate soll eine neue Hauptversion veröffentlicht werden. Eine Unterversion soll hingegen alle 4 Monate veröffentlicht werden. Für das jeweils aktuellste Unterversion-Release jeder Hauptversion sollen vorkompilierte Pakete angeboten werden. Sicherheitslücken und andere kritische Probleme sollen für die aktuellsten Unterversionen jeder Hauptversion angeboten werden (in sogenannten security branches). Aufgrund der vielen verschiedenen installierbaren Versionen, ist es allerdings nicht möglich, jede Version zeitlich unbegrenzt zu unterstützen. Dies liegt zum Teil an nur begrenzt verfügbaren Rechnerkapazitäten, vor allem aber an der ebenfalls nur begrenzt verfügbaren Leistung der freiwilligen Mitarbeiter des &os;-Projekts. Interessierte Leser sollten sich auch folgende Seiten ansehen: The Release Engineering Schedule The Security Branch Schedule Beide Dokumente gehen näher auf die verschiedenen Entwicklungszweige sowie den Zeitrahmen ein, für den die einzelnen Zweige unterstützt werden. Wie sollten diese Faktoren meine Entscheidung beeinflussen? Die wichtigsten Fragen, die Sie sich vor der Entscheidung für die zu installierende Version stellen sollten, sind: Wie stabil muss Ihre Installation sein? Wie viel Arbeit wollen Sie in den Aktualisierungsprozess investieren? Wie lange wollen Sie mit einer bestimmten Version arbeiten, bevor Sie auf eine neuere Version wechseln? Wie sicherheitskritisch ist Ihre Installation? Wollen Sie Ihr System aus dem Quellcode installieren oder bevorzugen Sie eine Binärinstallation? Sind Sie bereit, sich am &os;-Entwicklungsprozess zu beteiligen? Es folgen nun einige grobe Richtlinien, die Ihnen bei Ihrer Entscheidung helfen sollen: Wenn Sie an der derzeit stabilsten Version interessiert sind und möglichst wenig Ressourcen in die Aktualisierung Ihres Systems investieren wollen, sollten Sie das aktuellste STABLE-Unterversions-Release installieren und bei dieser Version verbleiben. Dabei bleibt es Ihnen überlassen, ob Sie Änderungen dieses Zweiges übernehmen wollen oder nicht. Wenn es Ihnen auf auf eine sofortige Verfügbarkeit ankommt, Sie die neuesten Fähigkeiten oder den bestmöglichen Sicherheitslevel benötigen und dazu bereit sind, Zeit in die Aktualisierung Ihres Systems zu investieren, können Sie dem aktuellen STABLE-Zweig folgen. Wenn Sie Ihr System nicht sofort benötigen und bereit sind, sich durch einige Probleme zu arbeiten, können Sie uns dabei helfen, eine neue bevorstehende Hauptversion zu testen, um für diesen Zweig mittel- bis langfristig die bestmögliche Stabilität zu erreichen. Nur wenn Sie bereit sind, das System aus dem Quellcode zu installieren, Zeit haben, Probleme im Basissystem zu suchen und zu beheben sowie entsprechende Problemberichte zu erstellen und zusätzlich die entsprechende Mailingliste verfolgen können, sollten sich dafür entscheiden, HEAD zu folgen. Fazit Wir hoffen, dass dieser Artikel Ihr Verständnis des &os;-Entwicklungsmodells verbessern und Ihnen Ihnen dabei helfen konnte, sich für die &os;-Version zu entscheiden, die Ihren Anforderungen am Besten entspricht.
diff --git a/de_DE.ISO8859-1/books/developers-handbook/l10n/chapter.sgml b/de_DE.ISO8859-1/books/developers-handbook/l10n/chapter.sgml index fc24547ef9..1112f515b8 100644 --- a/de_DE.ISO8859-1/books/developers-handbook/l10n/chapter.sgml +++ b/de_DE.ISO8859-1/books/developers-handbook/l10n/chapter.sgml @@ -1,104 +1,389 @@ Jochen Neumeister Übersetzt von Lokalisierung und Internationalisierung - L10N und I18N I18N-konforme Anwendungen programmieren Qt GTK Um Ihre Anwendung verwendbarer für andere Sprachen zu machen, hoffen wir, dass Sie I18N-konform programmieren. Der GNU gcc-Compiler und Bibliotheken für grafische Benutzeroberflächen wie QT und GTK unterstützen I18N durch eine spezielle Verarbeitung von Zeichenketten. Das Erstellen eines I18N-konformen Programms ist sehr einfach und erlaubt anderen Mitwirkenden, Ihre Programme leichter in andere Sprachen zu übersetzen. Lesen Sie die Bibliothek-spezifischen I18N-Dokumentationen für weitere Details. Im Gegensatz zur allgemeinen Meinung ist I18N-konformer Code einfach zu programmieren. Üblicherweise umfasst dies nur das Einbetten Ihrer Zeichenketten in Bibliothek-spezifische Funktionen. Stellen Sie außerdem bitte sicher, dass Sie Unterstützung für Unicode- und Multibyte-Zeichen vorsehen. Ein Aufruf, die I18N-Bemühungen zu vereinheitlichen Wir sind darauf aufmerksam geworden, dass die einzelnen I18N-/L10N-Bemühungen für jedes Land wiederholt wurden. Viele von uns haben somit unproduktiverweise das Rad immer wieder neu erfunden. Wir hoffen, dass die verschiedenen großen Gruppen für I18N Ihre Bemühungen in einer Gruppe vereinen können, ähnlich der Zuständigkeit des Core-Teams. Derzeit hoffen wir, dass wenn Sie I18N-konforme Programme schreiben oder portieren, diese an die betreffenden FreeBSD-Mailinglisten jedes Landes schicken, um sie testen zu lassen. Wir hoffen in Zukunft, Anwendungen zu entwickeln, die in allen Sprachen direkt und ohne unsaubere Änderungen funktionieren. Die &a.i18n;-Mailingliste ist eingerichtet worden. Wenn Sie I18N-/L10N-Entwickler sind, schicken Sie bitte Ihre Kommentare, Ideen, Fragen und alles, das Sie mit dem Thema in Verbindung bringen, dorthin. Perl und Python Perl Python Perl und Python bieten Bibliotheken für I18N und zur Behandlung von Unicode-Zeichen. Bitte nutzen Sie diese für I18N-Konformität. - Auf älteren FreeBSD-Versionen erzeugt Perl - möglicherweise Warnmeldungen wegen nicht installierter - Unterstützung für Unicode-Zeichen auf Ihrem System. - Sie können hierfür die Umgebungsvariable - LD_PRELOAD in ihrer Shell auf - /usr/lib/libxpg4.so setzen. + + + + + + + + Gábor + Kövesdán + Beigetragen von + + + + + Lokalisierte Nachrichten mit POSIX.1 Native Language + Support (NLS) + + Über die Basisfunktionen von I18N hinaus, wie das Bereitstellen + von verschiedenen Eingabecodierungen oder die diversen nationalen + Konventionen, zum Beispiel die verschiedenen Dezimalpunkte, ist es + auf einem höheren Level von I18N möglich, die Ausgabe + von Programmen zu lokalisieren. Ein Weg dies zu tun besteht in der + Nutzung der POSIX.1 NLS-Funktionen von &os;. + + + Organisation von lokalisierten Mitteilungen in Katalog + Dateien + + POSIX.1 NLS basiert auf Katalogdateien, welche die lokalisierten + Mitteilungen in der entsprechenden Codierung enthalten. Die + Mitteilungen sind in Sets organisiert und jede Mitteilung ist + durch eine eindeutige Zahl in dem jeweilgen Set identifiziert. + Die Katalogdateien werden nach der Lokale, von den jeweiligen + lokalisierten Mitteilungen, die sie enthalten, gefolgt von der + .msg Endung benannt. Zum Beispiel werden die + ungarischen Mitteilungen für das ISO8859-2 Encoding in + einer Datei mit dem Dateinamen hu_HU.ISO8859-2 + gespeichert. + + Diese Katalogdateien sind normale Textdateien, welche die + nummerierten Mitteilungen enthalten. Es ist möglich + Kommentare in die Dateien zu schreiben, indem Sie ein + $-Zeichen an den Anfang der Zeile setzen. + Das Setzen von Grenzen wird ebenfalls durch spezielle Kommentare + möglich wobei das Schlüsselwort set + direkt nach dem $-Zeichen folgen muss. Dem + Schlüsselwort set folgt dann die Set-Nummer. + Ein Beispiel: + + $set 1 + + Der aktuelle Mitteilungseintrag startet mit der + Mitteilungsnummer gefolgt von der lokalisierten Nachricht. Die + bekannten Modifikatoren von &man.printf.3; werden akzeptiert: + + 15 "File not found: %s\n" + + Die Katalogdateien müssen in binärer Form vorliegen, + bevor sie von einem Programm benutzt werden können. Dies wird + mit dem &man.gencat.1; Tool durchgeführt. Das erste Argument + ist der Dateiname des kompilierten Katalogs und die weiteren + Argumente sind die Eingabekataloge. Die lokalisierten + Mitteilungen können auf mehrere Katalogdateien aufgeteilt + sein. Danach werden dann alle auf einmal mit dem &man.gencat.1; + Tool kompiliert. + + + + + Nutzung der Katalogdateien im Quellcode + + Das Benutzen der Katalogdateien ist einfach. Um die + relevante Funktion zu nutzen, muss nl_types.h in die Quelldatei + eingefügt werden. Bevor ein Katalog benutzt werden + kann, muss er mit &man.catopen.3; geöffnet werden. + Die Funktion hat 2 Argumente. Der erste Parameter ist der + Name des installierten und kompilierten Katalogs. Normalerweise + wird der Name des Programmes, zum Beispiel + grep, genutzt. Dieser Name wird + zum Suchen der kompilierten Katalogdatei benutzt. Der Aufruf + von &man.catopen.3; sucht nach dieser Datei in /usr/share/nls/locale/catname + und in /usr/local/share/nls/locale/catname, + wobei locale die gesetzte Lokale und + catname der Katalogname ist. Der zweite + Parameter ist eine Konstante, die zwei Werte haben kann: + + + + + NL_CAT_LOCALE, hat die Bedeutung, + dass die benutzte Katalogdatei auf + LC_MESSAGES basiert. + + + + + + 0, hat die Bedeutung, dass + LANG benutzt wird, um die Katalogdatei + zu öffnen. + + + + + + Der &man.catopen.3; Aufruf gibt einen Katalogidentifizierer + vom Type nl_catd zurück. Sehen Sie in der + Manualpage nach, um eine Liste mit möglichen Fehlercodes + zu erhalten. + + Nach dem Öffnen eines Katalogs, kann &man.catgets.3; + benutzt werden, um Mitteilungen zu erhalten. Der erste + Parameter ist der Katalogidentifizierer, der von + &man.catopen.3; zurück gegeben wurde, das zweite ist die + Nummer des Sets, das dritte die Nummer der Mitteilung und das + vierte ist eine Fallbackmitteilung, die angezeigt wird, + falls die gewünschte Mitteilung in der Katalogdatei + nicht verfügbar ist. + + Nach der Nutzung der Katalogdatei, muss sie mit dem + Kommando &man.catclose.3;, geschlossen werden. Es besitzt + ein Argument, die Katalog ID. + + + + + Ein Beispiel aus der Praxis + + Das folgende Beispiel zeigt einen einfachen Weg wie man + NLS-Kataloge flexibel nutzen kann. + + Die nachfolgenden Zeilen müssen in eine allgemeine + Headerdatei, die in allen Quelldateien vorhanden ist, die + lokalisierte Mitteilungen benutzen, eingefügt werden: + + +#ifdef WITHOUT_NLS +#define getstr(n) nlsstr[n] +#else +#include <nl_types.h> + +extern nl_catd catalog; +#define getstr(n) catgets(catalog, 1, n, nlsstr[n]) +#endif + +extern char *nlsstr[]; + + + Als nächstes fügen Sie die folgenden Zeilen + in den globalen Deklarationsteil der Hauptquelldatei ein: + + +#ifndef WITHOUT_NLS +#include <nl_types.h> +nl_catd catalog; +#endif - In sh-basierten Shells: +/* +* Default messages to use when NLS is disabled or no catalog +* is found. +*/ +char *nlsstr[] = { + "", +/* 1*/ "some random message", +/* 2*/ "some other message" +}; + + + Als nächstes kommt der Code der den Katalog + öffnet, liest und schließt: + + +#ifndef WITHOUT_NLS + catalog = catopen("myapp", NL_CAT_LOCALE); +#endif - LD_PRELOAD=/usr/lib/libxpg4.so +... - In C-basierten Shells: +printf(getstr(1)); - setenv LD_PRELOAD /usr/lib/libxpg4.so - - +... + +#ifndef WITHOUT_NLS + catclose(catalog); +#endif + + + + Reduzierung von zu lokalisierenden Zeichenketten + + Es gibt einen guten Weg, Zeichenketten die lokalisert + werden müssen, durch den Einsatz von + libc-Fehlermeldungen zu reduzieren. + Dadurch vermeidet man Duplikate und erstellt gleiche Meldungen + für häufige Fehlermeldungen, die bei vielen + Programmen auftreten können. + + Als erstes ist hier ein Beispiel, dass keine + libc-Fehlermeldungen benutzt: + + +#include <err.h> +... +if (!S_ISDIR(st.st_mode)) + err(1, "argument is not a directory"); + + + Dies kann so abgeändert werden, dass eine + Fehlermeldung durch Auslesen der Variabel errno + ausgegeben wird. Die Fehlermeldung wird entspechend dem Beispiel + ausgegeben: + + +#include <err.h> +#include <errno.h> +... +if (!S_ISDIR(st.st_mode)) { + errno = ENOTDIR; + err(1, NULL); +} + + + In diesem Beispiel wurde die benutzerdefinierte + Zeichenkette entfernt. Übersetzer haben weniger Arbeit, + wenn sie ein Programm lokalisieren und die Benutzer sehen die + übliche "Not a directory" + Fehlermeldung, wenn dieser Fehler auftritt. Diese Meldung wird + ihnen wahrscheinlich vertraut erscheinen. Bitte beachten Sie, + dass es notwendig ist, + errno.h + hinzuzufügen um einen direkten Zugriff auf + errno zu haben. + + Es lohnt sich darauf hinzuweisen, dass es Fälle gibt, + in denen errno automatisch aufgerufen wird, + so dass es nicht notwendig ist, es explizit zu tun: + + +#include <err.h> +... +if ((p = malloc(size)) == NULL) + err(1, NULL); + + + + + + Benutzung von <filename>bsd.nls.mk</filename> + + Das Benutzen von Katalogdateien setzt einige sich + wiederholende Schritte, wie das kompilieren und installieren + der Kataloge, voraus. Um diese Schritte zu vereinfachen, + stellt bsd.nls.mk einige Makros zur + Verfügung. Es ist nicht notwendig + bsd.nls.mk explizit hinein zu kopieren, + es wird automatisch aus den allgemeinen Makefiles wie + bsd.prog.mk oder + bsd.lib.mk gezogen. + + Normalerweise reicht es, NLSNAME zu + definieren, die den Namen des Kataloges als erstes + Argument von &man.catopen.3; enthalten sollte und die + Katalogdateien in NLS ohne ihre Endung + .msg auflistet. Hier ist ein Beispiel, das + es ermöglicht, NLS mit dem obigen Code zu deaktivieren. + Die WITHOUT_NLS Variable von &man.make.1; + muss so definiert werden, dass das Programm ohne + NLS-Unterstützung gebaut wird. + + +.if !defined(WITHOUT_NLS) +NLS= es_ES.ISO8859-1 +NLS+= hu_HU.ISO8859-2 +NLS+= pt_BR.ISO8859-1 +.else +CFLAGS+= -DWITHOUT_NLS +.endif + + + Normalerweise werden die Katalogdateien in dem + nls-Unterverzeichnis + abgelegt. Dies ist der Standard von + bsd.nls.mk. Es ist möglich, mit der + NLSSRCDIR-Variablen von &man.make.1; diese zu + überschreiben. Der Standardname der vorkompilierten + Katalogdateien folgt den Namenskonventionen, wie oben beschrieben. + Er kann durch die NLSNAME-Variablen + überschrieben werden. Es gibt noch weitere Optionen, um + eine Feinabstimmung zur Verarbeitung der Katalogdateien + zu erreichen. Da sie nicht notwendig sind, werden sie hier + nicht weiter beschrieben. Weitere Informationen über + bsd.nls.mk finden Sie in der Datei selbst. + Der Text ist kurz und leicht zu verstehen. + + + + + diff --git a/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.sgml b/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.sgml index 27aa36e960..929e597054 100644 --- a/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.sgml +++ b/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.sgml @@ -1,6099 +1,6099 @@ x86-Assembler-Programmierung Dieses Kapitel wurde geschrieben von &a.stanislav;. Hagen Kühl Übersetzt von Synopsis Assembler-Programmierung unter &unix; ist höchst undokumentiert. Es wird allgemein angenommen, dass niemand sie jemals benutzen will, da &unix;-Systeme auf verschiedenen Mikroprozessoren laufen, und man deshalb aus Gründen der Portabilität alles in C schreiben sollte. In Wirklichkeit ist die Portabilität von C größtenteils ein Mythos. Auch C-Programme müssen angepasst werden, wenn man sie von einem &unix; auf ein anderes portiert, egal auf welchem Prozessor jedes davon läuft. Typischerweise ist ein solches Programm voller Bedingungen, die unterscheiden für welches System es kompiliert wird. Sogar wenn wir glauben, dass jede &unix;-Software in C, oder einer anderen High-Level-Sprache geschrieben werden sollte, brauchen wir dennoch Assembler-Programmierer: Wer sonst sollte den Abschnitt der C-Bibliothek schreiben, die auf den Kernel zugreift? In diesem Kapitel möchte ich versuchen zu zeigen, wie man Assembler-Sprache verwenden kann, um &unix;-Programme, besonders unter FreeBSD, zu schreiben. Dieses Kapitel erklärt nicht die Grundlagen der Assembler-Sprache. Zu diesem Thema gibt es bereits genug Quellen (einen vollständigen Online-Kurs finden Sie in Randall Hydes Art of Assembly Language; oder falls Sie ein gedrucktes Buch bevorzugen, können Sie einen Blick auf Jeff Duntemanns Assembly Language Step-by-Step werfen). Jedenfalls sollte jeder Assembler-Programmierer nach diesem Kapitel schnell und effizient Programme für FreeBSD schreiben können. Copyright © 2000-2001 G. Adam Stanislav. All rights reserved. Hagen Kühl Übersetzt von Die Werkzeuge Der Assembler Das wichtigste Werkzeug der Assembler-Programmierung ist der Assembler, diese Software übersetzt Assembler-Sprache in Maschinencode. Für FreeBSD stehen zwei verschiedene Assembler zur Verfügung. Der erste ist as1, der die traditionelle &unix;-Assembler-Sprache verwendet. Dieser ist Teil des Systems. Der andere ist /usr/ports/devel/nasm. Dieser benutzt die Intel-Syntax und sein Vorteil ist, dass es Code fü viele Vetriebssysteme übersetzen kann. Er muss gesondert installiert werden, aber ist völlig frei. In diesem Kapitel wird die nasm-Syntax verwendet. Einerseits weil es die meisten Assembler-Programmierer, die von anderen Systemen zu FreeBSD kommen, leichter verstehen werden. Und offen gesagt, weil es das ist, was ich gewohnt bin. Der Linker Die Ausgabe des Assemblers muss, genau wie der Code jedes Compilers, gebunden werden, um eine ausführbare Datei zu bilden. Der Linker ld1 ist der Standard und Teil von FreeBSD. Er funktioniert mit dem Code beider Assembler. Hagen Kühl Übersetzt von Systemaufrufe Standard-Aufrufkonvention Standardmäßig benutzt der FreeBSD-Kernel die C-Aufrufkonvention. Weiterhin wird, obwohl auf den Kernel durch int 80h zugegriffen wird, angenommen, dass das Programm eine Funktion aufruft, die int 80h verwendet, anstatt int 80h direkt aufzurufen. Diese Konvention ist sehr praktisch und der µsoft;-Konvention von &ms-dos; überlegen. Warum? Weil es die &unix;-Konvention jedem Programm, egal in welcher Sprache es geschrieben ist, erlaubt auf den Kernel zuzugreifen. Ein Assembler-Programm kann das ebenfalls. Beispielsweise könnten wir eine Datei öffnen: kernel: int 80h ; Call kernel ret open: push dword mode push dword flags push dword path mov eax, 5 call kernel add esp, byte 12 ret Das ist ein sehr sauberer und portabler Programmierstil. Wenn Sie das Programm auf ein anderes &unix; portieren, das einen anderen Interrupt oder eie andere Art der Parameterübergabe verwendet, müssen sie nur die Prozedur kernel ändern. Aber Assembler-Programmierer lieben es Taktzyklen zu schinden. Das obige Beispiel benötigt eine call/ret-Kombination. Das können wir entfernen, indem wir einen weiteren Parameter mit push übergeben: open: push dword mode push dword flags push dword path mov eax, 5 push eax ; Or any other dword int 80h add esp, byte 16 Die Konstante 5, die wir in EAX ablegen, identifiziert die Kernel-Funktion, die wir aufrufen. In diesem Fall ist das open. Alternative Aufruf-Konvention FreeBSD ist ein extrem flexibles System. Es bietet noch andere Wege, um den Kernel aufzurufen. Damit diese funktionieren muss allerdings die Linux-Emulation installiert sein. Linux ist ein &unix;-artiges System. Allerdings verwendet dessen Kernel die gleiche Systemaufruf-Konvention, bei der Parameter in Registern abgelegt werden, wie &ms-dos;. Genau wie bei der &unix;-Konvetion wird die Nummer der Funktion inEAX abgelegt. Allerdings werden die Parameter nicht auf den Stack gelegt, sondern in die Register EBX, ECX, EDX, ESI, EDI, EBP: open: mov eax, 5 mov ebx, path mov ecx, flags mov edx, mode int 80h Diese Konvention hat einen großen Nachteil gegenüber der von &unix;, was die Assembler-Programmierung angeht: Jedesmal, wenn Sie einen Kernel-Aufruf machen, müssen Sie die Register pushen und sie später popen. Das macht Ihren Code unförmiger und langsamer. Dennoch lässt FreeBSD ihnen die Wahl. Wenn Sie sich für die Linux-Konvention entscheiden, müssen Sie es das System wissen lassen. Nachdem ihr Programm übersetzt und gebunden wurde, müssen Sie die ausführbare Datei kennzeichnen: &prompt.user; - brandelf -f Linux + brandelf -t Linux filename Welche Konvention Sie verwenden sollten Wenn Sie speziell für FreeBSD programmieren, sollten Sie die &unix;-Konvention verwenden: Diese ist schneller, Sie können globale Variablen in Registern ablegen, Sie müssen die ausführbare Datei nicht kennzeichnen und Sie erzwingen nicht die Installation der Linux-Emulation auf dem Zielsystem. Wenn Sie portablen Programmcode erzeugen wollen, der auch unter Linux funktioniert, wollen Sie den FreeBSD-Nutzern vielleicht dennoch den effizientesten Programmcode bieten, der möglich ist. Ich werde Ihnen zeigen, wie Sie das erreichen können, nachdem ich die Grundlagen erklärt habe. Aufruf-Nummern Um dem Kernel mitzuteilen welchen Dienst Sie aufrufen, legen Sie dessen Nummer in EAX ab. Natürlich müssen Sie dazu wissen welche Nummer die Richtige ist. Die Datei <filename>syscalls</filename> Die Nummer der Funktionen sind in der Datei syscalls aufgeführt. Mittels locate syscalls finden Sie diese in verschiedenen Formaten, die alle auf die gleiche Weise aus syscalls.master erzeugt werden. Die Master-Datei für die &unix;-Standard-Aufrufkonvention finden sie unter /usr/src/sys/kern/syscalls.master. Falls Sie die andere Konvention, die im Linux-Emulations-Modus implementiert ist, verwenden möchten, lesen Sie bitte /usr/src/sys/i386/linux/syscalls.master. FreeBSD und Linux unterscheiden sich nicht nur in den Aufrufkonventionen, sie haben teilweise auch verschiedene Nummern für die gleiche Funktion. syscalls.master beschreibt, wie der Aufruf gemacht werden muss: 0 STD NOHIDE { int nosys(void); } syscall nosys_args int 1 STD NOHIDE { void exit(int rval); } exit rexit_args void 2 STD POSIX { int fork(void); } 3 STD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); } 4 STD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); } 5 STD POSIX { int open(char *path, int flags, int mode); } 6 STD POSIX { int close(int fd); } etc... In der erstm Spalte steht die Nummer, die in EAX abgelegt werden muss. Die Spalte ganz rechts sagt uns welche Parameter wir pushen müssen. Die Reihenfolge ist dabei von rechts nach links. Um beispielsweise eine Datei mittels open zu öffnen, müssen wir zuerst den mode auf den Stack pushen, danach die flags, dann die Adresse an der der path gespeichert ist. Hagen Kühl Übersetzt von Rückgabewerte Ein Systemaufruf wäre meistens nicht sehr nützlich, wenn er nicht irgendeinen Wert zurückgibt: Beispielsweise den Dateideskriptor einer geöffneten Datei, die Anzahl an Bytes die in ienen Puffer gelesen wurde, die Systemzeit, etc. Außerdem muss Sie das System informieren, falls ein Fehler auftritt: Wenn eine Datei nicht existiert, die Systemressourcen erschöpft sind, wir ein ungültiges Argument übergeben haben, etc. Manualpages Der herkömmliche Ort, um nach Informationen über verschiedene Systemaufrufe unter &unix;-Systemen zu suchen, sind die Manualpages. FreeBSD beschreibt seine Systemaufrufe in Abschnitt 2, manchmal auch Abschnitt 3. In open2 steht beispielsweise:
Falls erfolgreich, gibt open() einen nicht negativen Integerwert, als Dateideskriptor bezeichnet, zurück. Es gibt -1 im Fehlerfall zurück und setzt errno um den Fehler anzuzeigen.
Ein Assembler-Programmierer, der neu bei &unix; und FreeBSD ist, wird sich sofort fragen: Wo finde ich errno und wie erreiche ich es? Die Information der Manualpage bezieht sich auf C-Programme. Der Assembler-Programmierer benötigt zusätzliche Informationen.
Wo sind die Rückgabewerdet? Leider gilt: Es kommt darauf an... Für die meisten Systemaufrufe liegt er in EAX, aber nicht für alle. Eine gute Daumenregel, wenn man zum ersten Mal mit einem Systemaufruf arbeitet, ist in EAX nach dem Rückgabewert zu suchen. Wenn er nicht dort ist, sind weitere Untersuchungen nötig. Mir ist ein Systemaufruf bekannt, der den Rückgabewert in EDX ablegt: SYS_fork Alle anderen mit denen ich bisher gearbeitet habe verwenden EAX. Alelrdings habe ich noch nicht mit allen gearbeitet. Wenn Sie die Antwort weder hier, noch irgendwo anders finden, studieren Sie den Qualltext von libc und sehen sich an, wie es mit dem Kernel zusammenarbeitet. Wo ist <varname>errno</varname>? Tatsächlich, nirgendwo... errno ist ein Teil der Sprache C, nicht des &unix;-Kernels. Wenn man direkt auf Kernel-Dienste zugreift, wird der Fehlercode in EAX zurückgegeben, das selbe Register in dem der Rückgabewert, bei einem erfolgreichen Aufruf landet. Das macht auch Sinn. Wenn kein Fehler auftritt, gibt es keinen Fehlercode. Wenn ein Fehler auftritt, gibt es keinen Rückgabewert. Ein einziges Register kann also beides enthalten. Feststellen, dass ein Fehler aufgetreten ist Wenn Sie die Standard FreeBSD-Aufrufkonvention verwenden wird das carry flag gelöscht wenn der Aufruf erfolgreich ist und gesetzt wenn ein Fehler auftritt. Wenn Sie den Linux-Emulationsmodus verwenden ist der vorzeichenbehaftete Wert in EAX nicht negativ, bei einem erfolgreichen Aufruf. Wenn ein Fehler auftritt ist der Wert negativ, also -errno.
Hagen Kühl Übersetzt von Portablen Code erzeugen Portabilität ist im Allgemeinen keine Stärke der Assembler-Programmierung. Dennoch ist es, besonders mit nasm, möglich Assembler-Programme für verschiedene Plattformen zu schreiben. Ich selbst habe bereits Assembler-Bibliotheken geschriebenm die auf so unterschiedlichen Systemen wie &windows; und FreeBSD übersetzt werden können. Das ist um so besser möglich, wenn Ihr Code auf zwei Plattformen laufen soll , die, obwohl sie verschieden sind, auf ähnlichen Architekturen basieren. Beispielsweise ist FreeBSD ein &unix;, während Linux &unix;-artig ist. Ich habe bisher nur drei Unterschiede zwischen beiden (aus Sicht eines Assembler-Programmierers) erwähnt: Die Aufruf-Konvention, die Funktionsnummern und die Art der Übergabe von Rückgabewerten. Mit Funktionsnummern umgehen In vielen Fällen sind die Funktionsnummern die selben. Allerdings kann man auch wenn sie es nicht sind leicht mit diesem Problem umgehen: Anstatt die Nummern in Ihrem Code zu verwenden, benutzen Sie Konstanten, die Sie abhängig von der Zielarchitektur unterschiedlich definieren: %ifdef LINUX %define SYS_execve 11 %else %define SYS_execve 59 %endif Umgang mit Konventionen Sowohl die Aufrufkonventiion, als auch die Rückgabewerte (das errno Problem) kann man mit Hilfe von Makros lösen: %ifdef LINUX %macro system 0 call kernel %endmacro align 4 kernel: push ebx push ecx push edx push esi push edi push ebp mov ebx, [esp+32] mov ecx, [esp+36] mov edx, [esp+40] mov esi, [esp+44] mov ebp, [esp+48] int 80h pop ebp pop edi pop esi pop edx pop ecx pop ebx or eax, eax js .errno clc ret .errno: neg eax stc ret %else %macro system 0 int 80h %endmacro %endif Umgang mit anderen Portabilitätsangelegeneheiten Die oben genannte Lösung funktioniert in den meisten Fällen, wenn man Code schreibt, der zwischen FreeBSD und Linux portierbar sein soll. Allerdings sind die Unterschiede bei einigen Kernel-Diensten tiefgreifender. In diesem Fällen müssen Sie zwei verschiedene Handler für diese Systemaufrufe schreiben und bedingte Assemblierung benutzen, um diese zu übersetzen. Glücklicherweise wird der größte Teil Ihres Codes nicht den Kernel aufrufen und Sie werden deshalb nur wenige solcher bedingten Abschnitte benötigen. Eine Bibliothek benutzen Sie können Portabilitätsprobleme im Hauptteil ihres Codes komplett vermeiden, indem Sie eine Bibliothek für Systemaufrufe schreiben. Erstellen Sie eine Bibliothek für FreeBSD, eine für Linux und weitere für andere Betriebssysteme. Schreiben Sie in ihrer Bibliothek eine gesonderte Funktion (oder Prozedur, falls Sie die traditionelle Assembler-Terminologie bevorzugen) für jeden Systemaufruf. Verwenden Sie dabei die C-Aufrufkonvention um Parameter zu übergeben, aber verwenden Sie weiterhin EAX, für die Aufrufnummer. In diesem Fall kann ihre FreeBSD-Bibliothek sehr einfach sein, da viele scheinbar unterschiedliche Funktionen als Label für den selben Code implementiert sein können: sys.open: sys.close: [etc...] int 80h ret Ihre Linux-Bibliothek wird mehr verschiedene Funktionen benötigen, aber auch hier können Sie Systemaufrufe, welche die Anzahl an Parametern akzeptieren zusammenfassen: sys.exit: sys.close: [etc... one-parameter functions] push ebx mov ebx, [esp+12] int 80h pop ebx jmp sys.return ... sys.return: or eax, eax js sys.err clc ret sys.err: neg eax stc ret Der Bibliotheks-Ansatz mag auf den ersten Blick unbequem aussehen, weil Sie eine weitere Datei erzeugen müssen von der Ihr Code abhängt. Aber er hat viele Vorteile: Zum einen müssen Sie die Bibliothek nur einmal schreiben und können sie dann in allen Ihren Programmen verwenden. Sie können sie sogar von anderen Assembler-Programmierern verwenden lassen, oder eine die von jemand anderem geschrieben wurde verwenden. Aber der vielleicht größte Vorteil ist, dass Ihr Code sogar von anderen Programmierer auf andere Systeme portiert werden kann, einfach indem man eine neue Bibliothek schreibt, völlig ohne Änderungen an Ihrem Code. Falls Ihnen der Gedanke eine Bibliothek zu nutzen nicht gefällt, können Sie zumindest all ihre Systemaufrufe in einer gesonderten Assembler-Datei ablegen und diese mit Ihrem Hauptprogramm zusammen binden. Auch hier müssen alle, die ihr Programm portieren, nur eine neue Objekt-Datei erzeugen und an Ihr Hauptprogramm binden. Eine Include-Datei verwenden Wenn Sie ihre Software als (oder mit dem) Quelltext ausliefern, können Sie Makros definieren und in einer getrennten Datei ablegen, die Sie ihrem Code beilegen. Porter Ihrer Software schreiben dann einfach eine neue Include-Datei. Es ist keine Bibliothek oder eine externe Objekt-Datei nötig und Ihr Code ist portabel, ohne dass man ihn editieren muss. Das ist der Ansatz den wir in diesem Kapitel verwenden werden. Wir werden unsere Include-Datei system.inc nennen und jedesmal, wenn wir einen neuen Systemaufruf verwenden, den entsprechenden Code dort einfügen. Wir können unsere system.inc beginnen indem wir die Standard-Dateideskriptoren deklarieren: %define stdin 0 %define stdout 1 %define stderr 2 Als Nächstes erzeugen wir einen symbolischen Namen für jeden Systemaufruf: %define SYS_nosys 0 %define SYS_exit 1 %define SYS_fork 2 %define SYS_read 3 %define SYS_write 4 ; [etc...] Wir fügen eine kleine, nicht globale Prozedur mit langem Namen ein, damit wir den Namen nicht aus Versehen in unserem Code wiederverwenden: section .text align 4 access.the.bsd.kernel: int 80h ret Wir erzeugen ein Makro, das ein Argument erwartet, die Systemaufruf-Nummer: %macro system 1 mov eax, %1 call access.the.bsd.kernel %endmacro Letztlich erzeugen wir Makros für jeden Systemaufruf. Diese Argumente erwarten keine Argumente. %macro sys.exit 0 system SYS_exit %endmacro %macro sys.fork 0 system SYS_fork %endmacro %macro sys.read 0 system SYS_read %endmacro %macro sys.write 0 system SYS_write %endmacro ; [etc...] Fahren Sie fort, geben das in Ihren Editor ein und speichern es als system.inc. Wenn wir Systemaufrufe besprechen, werden wir noch Ergänzungen in dieser Datei vornehmen. Hagen Kühl Übersetzt von Unser erstes Programm Jetzt sind wir bereit für unser erstes Programm, das übliche Hello, World! 1: %include 'system.inc' 2: 3: section .data 4: hello db 'Hello, World!', 0Ah 5: hbytes equ $-hello 6: 7: section .text 8: global _start 9: _start: 10: push dword hbytes 11: push dword hello 12: push dword stdout 13: sys.write 14: 15: push dword 0 16: sys.exit Hier folgt die Erklärung des Programms: Zeile 1 fügt die Definitionen ein, die Makros und den Code aus system.inc. Die Zeilen 3 bis 5 enthalten die Daten: Zeile 3 beginnt den Datenabschnitt/das Datensegment. Zeile 4 enthält die Zeichenkette "Hello, World!", gefolgt von einem Zeilenumbruch (0Ah). Zeile 5 erstellt eine Konstante, die die Länge der Zeichenkette aus Zeile 4 in Bytes enthält. Die Zeilen 7 bis 16 enthälten den Code. Beachten Sie bitte, dass FreeBSD das Dateiformat elf für diese ausführbare Datei verwendet, bei dem jedes Programm mit dem Label _start beginnt (oder, um genau zu sein, wird dies vom Linker erwartet). Diese Label muss global sein. Die Zeilen 10 bis 13 weisen das System an hbytes Bytes der Zeichenkette hello nach stdout zu schreiben. Die Zeilen 15 und 16 weisen das System an das Programm mit dem Rückgabewert 0 zu beenden. Der Systemaufruf SYS_exit kehrt niemals zurück, somit endet das Programm hier. Wenn Sie von &ms-dos;-Assembler zu &unix; gekommen sind, sind Sie es vielleicht gewohnt direktauf die Video-Hardware zu schreiben. Unter FreeBSD müssen Sie sich darum keine Gedanken machen, ebenso bei jeder anderen Art von &unix;. Soweit es Sie betrifft schreiben Sie in eine Datei namens stdout. Das kann der Bildschirm, oder ein telnet-Terminal, eine wirkliche Datei, oder die Eingabe eines anderen Programms sein. Es liegt beim System herauszufinden, welches davon es tatsächlich ist. Den Code assemblieren Geben Sie den Code (außer den Zeilennummern) in einen Editor ein und speichern Sie ihn in einer Datei namens hello.asm. Um es zu assemblieren benötigen Sie nasm. <application>nasm</application> installieren Wemm Sie nasm nocht nicht installiert haben geben Sie folgendes ein: &prompt.user; su Password:your root password &prompt.root; cd /usr/ports/devel/nasm &prompt.root; make install &prompt.root; exit &prompt.user; Sie können auch make install clean anstatt make install eingeben, wenn Sie den Quelltext von nasm nicht behalten möchten. Auf jeden Fall wird FreeBSD nasm automatisch aus dem Internet herunterladen, es kompilieren und auf Ihrem System installieren. Wenn es sich bei Ihrem System nicht um FreeBSD handelt, müssen Sie nasm von dessen Homepage herunterladen. Sie können es aber dannoch verwenden um FreeBSD code zu assemblieren. Nun können Sie den Code assemblieren, binden und ausführen: &prompt.user; nasm -f elf hello.asm &prompt.user; ld -s -o hello hello.o &prompt.user; ./hello Hello, World! &prompt.user; Hagen Kühl Übersetzt von &unix;-Filter schreiben Ein häufiger Typ von &unix;-Anwendungen ist ein Filter — ein Programm, das Eingaben von stdin liest, sie verarbeitet und das Ergebnis nach stdout schreibt. In diesem Kapitel möchten wir einen einfachen Filter entwickeln und lernen, wie wir von stdin lesen und nach stdout schreiben. Dieser Filter soll jedes Byte seiner Eingabe in eine hexadezimale Zahl gefolgt von einem Leerzeichen umwandeln. %include 'system.inc' section .data hex db '0123456789ABCDEF' buffer db 0, 0, ' ' section .text global _start _start: ; read a byte from stdin push dword 1 push dword buffer push dword stdin sys.read add esp, byte 12 or eax, eax je .done ; convert it to hex movzx eax, byte [buffer] mov edx, eax shr dl, 4 mov dl, [hex+edx] mov [buffer], dl and al, 0Fh mov al, [hex+eax] mov [buffer+1], al ; print it push dword 3 push dword buffer push dword stdout sys.write add esp, byte 12 jmp short _start .done: push dword 0 sys.exit Im Datenabschnitt erzeugen wir ein Array mit Namen hex. Es enthält die 16 hexadezimalen Ziffern in aufsteigender Reihenfolge. Diesem Array folgt ein Puffer, den wir sowohl für die Ein- als auch für die Ausgabe verwenden. Die ersten beiden Bytes dieses Puffers werden am Anfang auf 0 gesetzt. Dorthin schreiben wir die beiden hexadezimalen Ziffern (das erste Byte ist auch die Stelle an die wir die Eingabe lesen). Das dritte Byte ist ein Leerzeichen. Der Code-Abschnitt besteht aus vier Teilen: Das Byte lesen, es in eine hexadezimale Zahl umwandeln, das Ergebnis schreiben und letztendlich das Programm verlassen. Um das Byte zu lesen, bitten wir das System ein Byte von stdin zu lesen und speichern es im ersten Byte von buffer. Das System gibt die Anzahl an Bytes, die gelesen wurden, in EAX zurück. Diese wird 1 sein, wenn eine Eingabe empfangen wird und 0, wenn keine Eingabedaten mehr verfügbar sind. Deshalb überprüfen wir den Wert von EAX. Wenn dieser 0 ist, springen wir zu .done, ansonsten fahren wir fort. Zu Gunsten der Einfachheit ignorieren wir hier die Möglichkeit eines Fehlers. Die Umwandlungsroutine in eine Hexadezimalzahl liest das Byte aus buffer in EAX, oder genaugenommen nur in AL, wobei die übrigen Bits von EAX auf null gesetzt werden. Außerdem kopieren wir das Byte nach EDX, da wir die oberen vier Bits (Nibble) getrennt von den unteren vier Bits umwandeln müssen. Das Ergebnis speichern wir in den ersten beiden Bytes des Puffers. Als Nächstes bitten wir das System die drei Bytes in den Puffer zu schreiben, also die zwei hexadezimalen Ziffern und das Leerzeichen nach stdout. Danach springen wir wieder an den Anfang des Programms und verarbeiten das nächste Byte. Wenn die gesamte Eingabe verarbeitet ist, bitten wie das System unser Programm zu beenden und null zurückzuliefern, welches traditionell die Bedeutung hat, dass unser Programm erfolgreich war. Fahren Sie fort und speichern Sie den Code in eine Datei namens hex.asm. Geben Sie danach folgendes ein (^D bedeutet, dass Sie die Steuerungstaste drücken und dann D eingeben, während Sie Steuerung gedrückt halten): &prompt.user; nasm -f elf hex.asm &prompt.user; ld -s -o hex hex.o &prompt.user; ./hex Hello, World! 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come! 48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D &prompt.user; Wenn Sie von &ms-dos; zu &unix; wechseln, wundern Sie sich vielleicht, warum jede Zeile mit 0A an Stelle von 0D 0A endet. Das liegt daran, dass &unix; nicht die CR/LF-Konvention, sondern die "new line"-Konvention verwendet, welches hexadezimal als 0A dargestellt wird. Können wir das Programm verbessern? Nun, einerseits ist es etwas verwirrend, dass die Eingabe, nachdem wir eine Zeile verarbeitet haben, nicht wieder am Anfang der Zeile beginnt. Deshalb können wir unser Programm anpassen um einen Zeilenumbruch an Stelle eines Leerzeichens nach jedem 0A auszugeben: %include 'system.inc' section .data hex db '0123456789ABCDEF' buffer db 0, 0, ' ' section .text global _start _start: mov cl, ' ' .loop: ; read a byte from stdin push dword 1 push dword buffer push dword stdin sys.read add esp, byte 12 or eax, eax je .done ; convert it to hex movzx eax, byte [buffer] mov [buffer+2], cl cmp al, 0Ah jne .hex mov [buffer+2], al .hex: mov edx, eax shr dl, 4 mov dl, [hex+edx] mov [buffer], dl and al, 0Fh mov al, [hex+eax] mov [buffer+1], al ; print it push dword 3 push dword buffer push dword stdout sys.write add esp, byte 12 jmp short .loop .done: push dword 0 sys.exit Wir haben das Leerzeichen im Register CL abgelegt. Das können wir bedenkenlos tun, da &unix;-Systemaufrufe im Gegensatz zu denen von µsoft.windows; keine Werte von Registern ändern in denen sie keine Werte zurückliefern. Das bedeutet, dass wir CL nur einmal setzen müssen. Dafür haben wir ein neues Label .loop eingügt, zu dem wir an Stelle von _start springen, um das nächste Byte einzulesen. Außerdem haben wir das Label .hex eingefügt, somit können wir wahlweise ein Leerzeichen oder einen Zeilenumbruch im dritten Byte von buffer ablegen. Nachdem Sie hex.asm entsprechend der Neuerungen geändert haben, geben Sie Folgendes ein: &prompt.user; nasm -f elf hex.asm &prompt.user; ld -s -o hex hex.o &prompt.user; ./hex Hello, World! 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come! 48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D &prompt.user; Das sieht doch schon besser aus. Aber der Code ist ziemlich ineffizient! Wir führen für jeden einzelne Byte zweimal einen Systemaufruf aus (einen zum Lesen und einen um es in die Ausgabe zu schreiben). Hagen Kühl Übersetzt von Gepufferte Eingabe und Ausgabe Wir können die Effizienz unseres Codes erhöhen, indem wir die Ein- und Ausgabe puffern. Wir erzeugen einen Eingabepuffer und lesen dann eine Folge von Bytes auf einmal. Danach holen wir sie Byte für Byte aus dem Puffer. Wir erzeugen ebenfalls einen Ausgabepuffer. Darin speichern wir unsere Ausgabe bis er voll ist. Dann bitten wir den Kernel den Inhalt des Puffers nach stdout zu schreiben. Diese Programm endet, wenn es keine weitere Eingaben gibt. Aber wir müssen den Kernel immernoch bitten den Inhalt des Ausgabepuffers ein letztes Mal nach stdout zu schreiben, denn sonst würde ein Teil der Ausgabe zwar im Ausgabepuffer landen, aber niemals ausgegeben werden. Bitte vergessen Sie das nicht, sonst fragen Sie sich später warum ein Teil Ihrer Ausgabe verschwunden ist. %include 'system.inc' %define BUFSIZE 2048 section .data hex db '0123456789ABCDEF' section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE section .text global _start _start: sub eax, eax sub ebx, ebx sub ecx, ecx mov edi, obuffer .loop: ; read a byte from stdin call getchar ; convert it to hex mov dl, al shr al, 4 mov al, [hex+eax] call putchar mov al, dl and al, 0Fh mov al, [hex+eax] call putchar mov al, ' ' cmp dl, 0Ah jne .put mov al, dl .put: call putchar jmp short .loop align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx ret read: push dword BUFSIZE mov esi, ibuffer push esi push dword stdin sys.read add esp, byte 12 mov ebx, eax or eax, eax je .done sub eax, eax ret align 4 .done: call write ; flush output buffer push dword 0 sys.exit align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: sub edi, ecx ; start of buffer push ecx push edi push dword stdout sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now ret Als dritten Abschnitt im Quelltext haben wir .bss. Dieser Abschnitt wird nicht in unsere ausführbare Datei eingebunden und kann daher nicht initialisiert werden. Wir verwenden resb anstelle von db. Dieses reserviert einfach die angeforderte Menge an uninitialisiertem Speicher zu unserer Verwendung. Wir nutzen, die Tatsache, dass das System die Register nicht verändert: Wir benutzen Register, wo wir anderenfalls globale Variablen im Abschnitt .data verwenden müssten. Das ist auch der Grund, warum die &unix;-Konvention, Parameter auf dem Stack zu übergeben, der von Microsoft, hierfür Register zu verwenden, überlegen ist: Wir können Register für unsere eigenen Zwecke verwenden. Wir verwenden EDI und ESI als Zeiger auf das nächste zu lesende oder schreibende Byte. Wir verwenden EBX und ECX, um die Anzahl der Bytes in den beiden Puffern zu zählen, damit wir wissen, wann wir die Ausgabe an das System übergeben, oder neue Eingabe vom System entgegen nehmen müssen. Lassen Sie uns sehen, wie es funktioniert: &prompt.user; nasm -f elf hex.asm &prompt.user; ld -s -o hex hex.o &prompt.user; ./hex Hello, World! Here I come! 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A 48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D &prompt.user; Nicht was Sie erwartet haben? Das Programm hat die Ausgabe nicht auf dem Bildschirm ausgegeben bis sie ^D gedrückt haben. Das kann man leicht zu beheben indem man drei Zeilen Code einfügt, welche die Ausgabe jedesmal schreiben, wenn wir einen Zeilenumbruch in 0A umgewandelt haben. Ich habe die betreffenden Zeilen mit > markiert (kopieren Sie die > bitte nicht mit in Ihre hex.asm). %include 'system.inc' %define BUFSIZE 2048 section .data hex db '0123456789ABCDEF' section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE section .text global _start _start: sub eax, eax sub ebx, ebx sub ecx, ecx mov edi, obuffer .loop: ; read a byte from stdin call getchar ; convert it to hex mov dl, al shr al, 4 mov al, [hex+eax] call putchar mov al, dl and al, 0Fh mov al, [hex+eax] call putchar mov al, ' ' cmp dl, 0Ah jne .put mov al, dl .put: call putchar > cmp al, 0Ah > jne .loop > call write jmp short .loop align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx ret read: push dword BUFSIZE mov esi, ibuffer push esi push dword stdin sys.read add esp, byte 12 mov ebx, eax or eax, eax je .done sub eax, eax ret align 4 .done: call write ; flush output buffer push dword 0 sys.exit align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: sub edi, ecx ; start of buffer push ecx push edi push dword stdout sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now ret Lassen Sie uns jetzt einen Blick darauf werfen, wie es funktioniert. &prompt.user; nasm -f elf hex.asm &prompt.user; ld -s -o hex hex.o &prompt.user; ./hex Hello, World! 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come! 48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D &prompt.user; Nicht schlecht für eine 644 Byte große Binärdatei, oder? Dieser Ansatz für gepufferte Ein- und Ausgabe enthält eine Gefahr, auf die ich im Abschnitt Die dunkle Seite des Buffering eingehen werde. Ein Zeichen ungelesen machen Das ist vielleicht ein etwas fortgeschrittenes Thema, das vor allem für Programmierer interessant ist, die mit der Theorie von Compilern vertraut sind. Wenn Sie wollen, können Sie zum nächsten Abschnitt springen und das hier vielleicht später lesen. Unser Beispielprogramm benötigt es zwar nicht, aber etwas anspruchsvollere Filter müssen häufig vorrausschauen. Mit anderen Worten, sie müssen wissen was das nächste Zeichen ist (oder sogar mehrere Zeichen). Wenn das nächste Zeichen einen bestimmten Wert hat, ist es Teil des aktuellen Tokens, ansonsten nicht. Zum Beispiel könnten Sie den Eingabestrom für eine Text-Zeichenfolge parsen (z.B. wenn Sie einen Compiler einer Sprache implementieren): Wenn einem Buchstaben ein anderer Buchstabe oder vielleicht eine Ziffer folgt, ist er ein Teil des Tokens, das Sie verarbeiten. Wenn ihm ein Leerzeichen folgt, oder ein anderer Wert, ist er nicht Teil des aktuellen Tokens. Das führt usn zu einem interessanten Problem: Wie kann man ein Zeichen zurück in den Eingabestrom geben, damit es später noch einmal geleseni werden kann? Eine mögliche Lösung ist, das Zeichen in einer Variable zu speichern und ein Flag zu setzen. Wir können getchar so anpassen, dass es das Flag überprüft und, wenn es gesetzt ist, das Byte aus der Variable anstatt dem Eingabepuffer liest und das Flag zurück setzt. Aber natürlich macht uns das langsamer. Die Sprache C hat eine Funktion ungetc() für genau diesen Zweck. Gibt es einen schnellen Weg, diese in unserem Code zu implementieren? Ich möchte Sie bitten nach oben zu scrollen und sich die Prozedur getchar anzusehen und zu versuchen eine schöne und schnelle Lösung zu finden, bevor Sie den nächsten Absatz lesen. Kommen Sie danach hierher zurück und schauen sich meine Lösung an. Der Schlüssel dazu ein Zeichen an den Eingabestrom zurückzugeben, liegt darin, wie wir das Zeichen bekommen: Als erstes überprüfen wir, ob der Puffer leer ist, indem wir den Wert von EBX testen. Wenn er null ist, rufen wir die Prozedur read auf. Wenn ein Zeichen bereit ist verwenden wir lodsb, dann verringern wir den Wert von EBX. Die Anweisung lodsb ist letztendlich identisch mit: mov al, [esi] inc esi Das Byte, welches wir abgerufen haben, verbleibt im Puffer bis read zum nächsten Mal aufgerufen wird. Wir wissen nicht wann das passiert, aber wir wissen, dass es nicht vor dem nächsten Aufruf von getchar passiert. Daher ist alles was wir tun müssen um das Byte in den Strom "zurückzugeben" ist den Wert von ESI zu verringern und den von EBX zu erhöhen: ungetc: dec esi inc ebx ret Aber seien Sie vorsichtig! Wir sind auf der sicheren Seite, solange wir immer nur ein Zeichen im Voraus lesen. Wenn wir mehrere kommende Zeichen betrachten und ungetc mehrmals hintereinander aufrufen, wird es meistens funktionieren, aber nicht immer (und es wird ein schwieriger Debug). Warum? Solange getchar read nicht aufrufen muss, befinden sich alle im Voraus gelesenen Bytes noch im Puffer und ungetc arbeitet fehlerfrei. Aber sobald getchar read aufruft verändert sich der Inhalt des Puffers. Wir können uns immer darauf verlassen, dass ungetc auf dem zuletzt mit getchar gelesenen Zeichen korrekt arbeitet, aber nicht auf irgendetwas, das davor gelesen wurde. Wenn Ihr Programm mehr als ein Byte im Voraus lesen soll, haben Sie mindestens zwei Möglichkeiten: Die einfachste Lösung ist, Ihr Programm so zu ändern, dass es immer nur ein Byte im Voraus liest, wenn das möglich ist. Wenn Sie diese Möglichkeit nicht haben, bestimmen Sie zuerst die maximale Anzahl an Zeichen, die Ihr Programm auf einmal an den Eingabestrom zurückgeben muss. Erhöhen Sie diesen Wert leicht, nur um sicherzugehen, vorzugsweise auf ein Vielfaches von 16—damit er sich schön ausrichtet. Dann passen Sie den .bss Abschnitt Ihres Codes an und erzeugen einen kleinen Reserver-Puffer, direkt vor ihrem Eingabepuffer, in etwa so: section .bss resb 16 ; or whatever the value you came up with ibuffer resb BUFSIZE obuffer resb BUFSIZE Außerdem müssen Sie ungetc anpassen, sodass es den Wert des Bytes, das zurückgegeben werden soll, in AL übergibt: ungetc: dec esi inc ebx mov [esi], al ret Mit dieser Änderung können Sie sicher ungetc bis zu 17 Mal hintereinander gqapaufrufen (der erste Aufruf erfolgt noch im Puffer, die anderen 16 entweder im Puffer oder in der Reserve). Fabian Ruch Übersetzt von Kommandozeilenparameter Unser hex-Programm wird nützlicher, wenn es die Dateinamen der Ein- und Ausgabedatei über die Kommandozeile einlesen kann, d.h., wenn es Kommandozeilenparameter verarbeiten kann. Aber... Wo sind die? Bevor ein &unix;-System ein Programm ausführt, legt es einige Daten auf dem Stack ab (push) und springt dann an das _start-Label des Programms. Ja, ich sagte springen, nicht aufrufen. Das bedeutet, dass auf die Daten zugegriffen werden kann, indem [esp+offset] ausgelesen wird oder die Daten einfach vom Stack genommen werden (pop). Der Wert ganz oben auf dem Stack enthält die Zahl der Kommandozeilenparameter. Er wird traditionell argc wie "argument count" genannt. Die Kommandozeilenparameter folgen einander, alle argc. Von diesen wird üblicherweise als argv wie "argument value(s)" gesprochen. So erhalten wir argv[0], argv[1], ... und argv[argc-1]. Dies sind nicht die eigentlichen Parameter, sondern Zeiger (Pointer) auf diese, d.h., Speicheradressen der tatsächlichen Parameter. Die Parameter selbst sind durch NULL beendete Zeichenketten. Der argv-Liste folgt ein NULL-Zeiger, was einfach eine 0 ist. Es gibt noch mehr, aber dies ist erst einmal genug für unsere Zwecke. Falls Sie von der &ms-dos;-Programmierumgebung kommen, ist der größte Unterschied die Tatsache, dass jeder Parameter eine separate Zeichenkette ist. Der zweite Unterschied ist, dass es praktisch keine Grenze gibt, wie viele Parameter vorhanden sein können. Ausgerüstet mit diesen Kenntnissen, sind wir beinahe bereit für eine weitere Version von hex.asm. Zuerst müssen wir jedoch noch ein paar Zeilen zu system.inc hinzufügen: Erstens benötigen wir zwei neue Einträge in unserer Liste mit den Systemaufrufnummern: %define SYS_open 5 %define SYS_close 6 Zweitens fügen wir zwei neue Makros am Ende der Datei ein: %macro sys.open 0 system SYS_open %endmacro %macro sys.close 0 system SYS_close %endmacro Und hier ist schließlich unser veränderter Quelltext: %include 'system.inc' %define BUFSIZE 2048 section .data fd.in dd stdin fd.out dd stdout hex db '0123456789ABCDEF' section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE section .text align 4 err: push dword 1 ; return failure sys.exit align 4 global _start _start: add esp, byte 8 ; discard argc and argv[0] pop ecx jecxz .init ; no more arguments ; ECX contains the path to input file push dword 0 ; O_RDONLY push ecx sys.open jc err ; open failed add esp, byte 8 mov [fd.in], eax pop ecx jecxz .init ; no more arguments ; ECX contains the path to output file push dword 420 ; file mode (644 octal) push dword 0200h | 0400h | 01h ; O_CREAT | O_TRUNC | O_WRONLY push ecx sys.open jc err add esp, byte 12 mov [fd.out], eax .init: sub eax, eax sub ebx, ebx sub ecx, ecx mov edi, obuffer .loop: ; read a byte from input file or stdin call getchar ; convert it to hex mov dl, al shr al, 4 mov al, [hex+eax] call putchar mov al, dl and al, 0Fh mov al, [hex+eax] call putchar mov al, ' ' cmp dl, 0Ah jne .put mov al, dl .put: call putchar cmp al, dl jne .loop call write jmp short .loop align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx ret read: push dword BUFSIZE mov esi, ibuffer push esi push dword [fd.in] sys.read add esp, byte 12 mov ebx, eax or eax, eax je .done sub eax, eax ret align 4 .done: call write ; flush output buffer ; close files push dword [fd.in] sys.close push dword [fd.out] sys.close ; return success push dword 0 sys.exit align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: sub edi, ecx ; start of buffer push ecx push edi push dword [fd.out] sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now ret In unserem .data-Abschnitt befinden sich nun die zwei neuen Variablen fd.in und fd.out. Hier legen wir die Dateideskriptoren der Ein- und Ausgabedatei ab. Im .text-Abschnitt haben wir die Verweise auf stdin und stdout durch [fd.in] und [fd.out] ersetzt. Der .text-Abschnitt beginnt nun mit einer einfachen Fehlerbehandlung, welche nur das Programm mit einem Rückgabewert von 1 beendet. Die Fehlerbehandlung befindet sich vor _start, sodass wir in geringer Entfernung von der Stelle sind, an der der Fehler auftritt. Selbstverständlich beginnt die Programmausführung immer noch bei _start. Zuerst entfernen wir argc und argv[0] vom Stack: Sie sind für uns nicht von Interesse (sprich, in diesem Programm). Wir nehmen argv[1] vom Stack und legen es in ECX ab. Dieses Register ist besonders für Zeiger geeignet, da wir mit jecxz NULL-Zeiger verarbeiten können. Falls argv[1] nicht NULL ist, versuchen wir, die Datei zu öffnen, die der erste Parameter festlegt. Andernfalls fahren wir mit dem Programm fort wie vorher: Lesen von stdin und Schreiben nach stdout. Falls wir die Eingabedatei nicht öffnen können (z.B. sie ist nicht vorhanden), springen wir zur Fehlerbehandlung und beenden das Programm. Falls es keine Probleme gibt, sehen wir nun nach dem zweiten Parameter. Falls er vorhanden ist, öffnen wir die Ausgabedatei. Andernfalls schreiben wir die Ausgabe nach stdout. Falls wir die Ausgabedatei nicht öffnen können (z.B. sie ist zwar vorhanden, aber wir haben keine Schreibberechtigung), springen wir auch wieder in die Fehlerbehandlung. Der Rest des Codes ist derselbe wie vorher, außer dem Schließen der Ein- und Ausgabedatei vor dem Verlassen des Programms und, wie bereits erwähnt, die Benutzung von [fd.in] und [fd.out]. Unsere Binärdatei ist nun kolossale 768 Bytes groß. Können wir das Programm immer noch verbessern? Natürlich! Jedes Programm kann verbessert werden. Hier finden sich einige Ideen, was wir tun könnten: Die Fehlerbehandlung eine Warnung auf stderr ausgeben lassen. Den Lese- und Schreibfunkionen eine Fehlerbehandlung hinzufügen. Schließen von stdin, sobald wir eine Eingabedatei öffnen, von stdout, sobald wir eine Ausgabedatei öffnen. Hinzufügen von Kommandozeilenschaltern wie zum Beispiel -i und -o, sodass wir die Ein- und Ausgabedatei in irgendeiner Reihenfolge angeben oder vielleicht von stdin lesen und in eine Datei schreiben können. Ausgeben einer Gebrauchsanweisung, falls die Kommandozeilenparameter fehlerhaft sind. Ich beabsichtige, diese Verbesserungen dem Leser als Übung zu hinterlassen: Sie wissen bereits alles, das Sie wissen müssen, um die Verbesserungen durchzuführen. Fabian Ruch Übersetzt von Die &unix;-Umgebung Ein entscheidendes Konzept hinter &unix; ist die Umgebung, die durch Umgebungsvariablen festgelegt wird. Manche werden vom System gesetzt, andere von Ihnen und wieder andere von der shell oder irgendeinem Programm, das ein anderes lädt. Umgebungsvariablen herausfinden Ich sagte vorher, dass wenn ein Programm mit der Ausführung beginnt, der Stack argc gefolgt vom durch NULL beendeten argv-Array und etwas Anderem enthält. Das "etwas Andere" ist die Umgebung oder, um genauer zu sein, ein durch NULL beendetes Array von Zeigern auf Umgebungsvariablen. Davon wird oft als env gesprochen. Der Aufbau von env entspricht dem von argv, eine Liste von Speicheradressen gefolgt von NULL (0). In diesem Fall gibt es kein "envc"—wir finden das Ende heraus, indem wir nach dem letzten NULL suchen. Die Variablen liegen normalerweise in der Form name=value vor, aber manchmal kann der =value-Teil fehlen. Wir müssen diese Möglichkeit in Betracht ziehen. webvars Ich könnte Ihnen einfach etwas Code zeigen, der die Umgebung in der Art vom &unix;-Befehl env ausgibt. Aber ich dachte, dass es interessanter sei, ein einfaches CGI-Werkzeug in Assembler zu schreiben. CGI: Ein kurzer Überblick Ich habe eine detaillierte CGI-Anleitung auf meiner Webseite, aber hier ist ein sehr kurzer Überblick über CGI: Der Webserver kommuniziert mit dem CGI-Programm, indem er Umgebungsvariablen setzt. Das CGI-Programm schreibt seine Ausgabe auf stdout. Der Webserver liest von da. Die Ausgabe muss mit einem HTTP-Kopfteil gefolgt von zwei Leerzeilen beginnen. Das Programm gibt dann den HTML-Code oder was für einen Datentyp es auch immer verarbeitet aus. Während bestimmte Umgebungsvariablen Standardnamen benutzen, unterscheiden sich andere, abhägngig vom Webserver. Dies macht webvars zu einem recht nützlichen Werkzeug. Der Code Unser webvars-Programm muss also den HTTP-Kopfteil gefolgt von etwas HTML-Auszeichnung versenden. Dann muss es die Umgebungsvariablen eine nach der anderen auslesen und sie als Teil der HTML-Seite versenden. Nun der Code. Ich habe Kommentare und Erklärungen direkt in den Code eingefügt: ;;;;;;; webvars.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Copyright (c) 2000 G. Adam Stanislav ; All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions ; are met: ; 1. Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; 2. Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in the ; documentation and/or other materials provided with the distribution. ; ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ; SUCH DAMAGE. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Version 1.0 ; ; Started: 8-Dec-2000 ; Updated: 8-Dec-2000 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %include 'system.inc' section .data http db 'Content-type: text/html', 0Ah, 0Ah db '<?xml version="1.0" encoding="UTF-8"?>', 0Ah db '<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML Strict//EN" ' db '"DTD/xhtml1-strict.dtd">', 0Ah db '<html xmlns="http://www.w3.org/1999/xhtml" ' db 'xml.lang="en" lang="en">', 0Ah db '<head>', 0Ah db '<title>Web Environment</title>', 0Ah db '<meta name="author" content="G. Adam Stanislav" />', 0Ah db '</head>', 0Ah, 0Ah db '<body bgcolor="#ffffff" text="#000000" link="#0000ff" ' db 'vlink="#840084" alink="#0000ff">', 0Ah db '<div class="webvars">', 0Ah db '<h1>Web Environment</h1>', 0Ah db '<p>The following <b>environment variables</b> are defined ' db 'on this web server:</p>', 0Ah, 0Ah db '<table align="center" width="80" border="0" cellpadding="10" ' db 'cellspacing="0" class="webvars">', 0Ah httplen equ $-http left db '<tr>', 0Ah db '<td class="name"><tt>' leftlen equ $-left middle db '</tt></td>', 0Ah db '<td class="value"><tt><b>' midlen equ $-middle undef db '<i>(undefined)</i>' undeflen equ $-undef right db '</b></tt></td>', 0Ah db '</tr>', 0Ah rightlen equ $-right wrap db '</table>', 0Ah db '</div>', 0Ah db '</body>', 0Ah db '</html>', 0Ah, 0Ah wraplen equ $-wrap section .text global _start _start: ; First, send out all the http and xhtml stuff that is ; needed before we start showing the environment push dword httplen push dword http push dword stdout sys.write ; Now find how far on the stack the environment pointers ; are. We have 12 bytes we have pushed before "argc" mov eax, [esp+12] ; We need to remove the following from the stack: ; ; The 12 bytes we pushed for sys.write ; The 4 bytes of argc ; The EAX*4 bytes of argv ; The 4 bytes of the NULL after argv ; ; Total: ; 20 + eax * 4 ; ; Because stack grows down, we need to ADD that many bytes ; to ESP. lea esp, [esp+20+eax*4] cld ; This should already be the case, but let's be sure. ; Loop through the environment, printing it out .loop: pop edi or edi, edi ; Done yet? je near .wrap ; Print the left part of HTML push dword leftlen push dword left push dword stdout sys.write ; It may be tempting to search for the '=' in the env string next. ; But it is possible there is no '=', so we search for the ; terminating NUL first. mov esi, edi ; Save start of string sub ecx, ecx not ecx ; ECX = FFFFFFFF sub eax, eax repne scasb not ecx ; ECX = string length + 1 mov ebx, ecx ; Save it in EBX ; Now is the time to find '=' mov edi, esi ; Start of string mov al, '=' repne scasb not ecx add ecx, ebx ; Length of name push ecx push esi push dword stdout sys.write ; Print the middle part of HTML table code push dword midlen push dword middle push dword stdout sys.write ; Find the length of the value not ecx lea ebx, [ebx+ecx-1] ; Print "undefined" if 0 or ebx, ebx jne .value mov ebx, undeflen mov edi, undef .value: push ebx push edi push dword stdout sys.write ; Print the right part of the table row push dword rightlen push dword right push dword stdout sys.write ; Get rid of the 60 bytes we have pushed add esp, byte 60 ; Get the next variable jmp .loop .wrap: ; Print the rest of HTML push dword wraplen push dword wrap push dword stdout sys.write ; Return success push dword 0 sys.exit Dieser Code erzeugt eine 1.396-Byte große Binärdatei. Das meiste davon sind Daten, d.h., die HTML-Auszeichnung, die wir versenden müssen. Assemblieren Sie es wie immer: &prompt.user; nasm -f elf webvars.asm &prompt.user; ld -s -o webvars webvars.o Um es zu benutzen, müssen Sie webvars auf Ihren Webserver hochladen. Abhängig von Ihrer Webserver-Konfiguration, müssen Sie es vielleicht in einem speziellen cgi-bin-Verzeichnis ablegen oder es mit einer .cgi-Dateierweiterung versehen. Schließlich benötigen Sie Ihren Webbrowser, um sich die Ausgabe anzusehen. Um die Ausgabe auf meinem Webserver zu sehen, gehen Sie bitte auf http://www.int80h.org/webvars/. Falls Sie neugierig sind, welche zusätzlichen Variablen in einem passwortgeschützten Webverzeichnis vorhanden sind, gehen Sie auf http://www.int80h.org/private/ unter Benutzung des Benutzernamens asm und des Passworts programmer. Paul Keller Übersetzt von Fabian Borschel Arbeiten mit Dateien Wir haben bereits einfache Arbeiten mit Dateien gemacht: Wir wissen wie wir sie öffnen und schliessen, oder wie man sie mit Hilfe von Buffern liest und schreibt. Aber &unix; bietet viel mehr Funktionalität wenn es um Dateien geht. Wir werden einige von ihnen in dieser Sektion untersuchen und dann mit einem netten Datei Konvertierungs Werkzeug abschliessen. In der Tat, Lasst uns am Ende beginnen, also mit dem Datei Konvertierungs Werkzeug. Es macht Programmieren immer einfacher, wenn wir bereits am Anfang wissen was das End Produkt bezwecken soll. Eines der ersten Programme die ich für &unix; schrieb war tuc, ein Text-Zu-&unix; Datei Konvertierer. Es konvertiert eine Text Datei von einem anderen Betriebssystem zu einer &unix; Text Datei. Mit anderen Worten, es ändert die verschiedenen Arten von Zeilen Begrenzungen zu der Zeilen Begrenzungs Konvention von &unix;. Es speichert die Ausgabe in einer anderen Datei. Optional konvertiert es eine &unix; Text Datei zu einer DOS Text Datei. Ich habe tuc sehr oft benutzt, aber nur von irgendeinem anderen OS nach &unix; zu konvertieren, niemals anders herum. Ich habe mir immer gewünscht das die Datei einfach überschrieben wird anstatt das ich die Ausgabe in eine andere Datei senden muss. Meistens, habe ich diesen Befehl verwendet: &prompt.user; tuc myfile tempfile &prompt.user; mv tempfile myfile Es wäre schö ein ftuc zu haben, also, fast tuc, und es so zu benutzen: &prompt.user; ftuc myfile In diesem Kapitel werden wir dann, ftuc in Assembler schreiben (das Original tuc ist in C), und verschiedene Datei-Orientierte Kernel Dienste in dem Prozess studieren. Auf erste Sicht, ist so eine Datei Konvertierung sehr simpel: Alles was du zu tun hast, ist die Wagen Rückläfe zu entfernen, richtig? Wenn du mit ja geantwortet hast, denk nochmal darüber nach: Dieses Herrangehen wird die meiste Zeit funktionieren (zumindest mit MSDOS Text Dateien), aber gelegentlich fehlschlagen. Das Problem ist das nicht alle &unix; Text Dateien ihre Zeilen mit einer Wagen Rücklauf / Zeilenvorschub Sequenz beenden. Manche benutzen Wagenrücklauf ohne Zeilenvorschub. Andere kombinieren mehrere leere Zeilen in einen einzigen Wagenrücklauf gefolgt von mehreren Zeilenvorschüben. Und so weiter. Ein Text Datei Konvertierer muss dann also in der Lage sein mit allen möglichen Zeilenenden umzugehen: Wagenrücklauf / Zeilenvorschub Wagenrücklauf Zeilenvorschub / Wagenrücklauf Zeilenvorschub Es sollte außerdem in der Lage sein mit Dateien umzugehen die irgendeine Art von Kombination der oben stehenden Möglichkeiten verwendet. (z.B., Wagenrücklauf gefolgt von mehreren Zeilenvorschüben). Endlicher Zustandsautomat Das Problem wird einfach gelöst in dem man eine Technik benutzt die sich Endlicher Zustandsautomat nennt, ursprünglich wurde sie von den Designern digitaler elektronischer Schaltkreise entwickelt. Eine Endlicher Zustandsautomat ist ein digitaler Schaltkreis dessen Ausgabe nicht nur von der Eingabe abhängig ist sondern auch von der vorherigen Eingabe, d.h., von seinem Status. Der Mikroprozessor ist ein Beispiel für einen Endlichen Zustandsautomaten : Unser Assembler Sprach Code wird zu Maschinensprache übersetzt in der manche Assembler Sprach Codes ein einzelnes Byte produzieren, während andere mehrere Bytes produzieren. Da der Microprozessor die Bytes einzeln aus dem Speicher liest, ändern manche nur seinen Status anstatt eine Ausgabe zu produzieren. Wenn alle Bytes eines OP Codes gelesen wurden, produziert der Mikroprozessor eine Ausgabe, oder ändert den Wert eines Registers, etc. Aus diesem Grund, ist jede Software eigentlich nur eine Sequenz von Status Anweisungen für den Mikroprozessor. Dennoch, ist das Konzept eines Endlichen Zustandsautomaten auch im Software Design sehr hilfreich. Unser Text Datei Konvertierer kann als Endlicher Zustandsautomat mit 3 möglichen Stati desgined werden. Wir könnten diese von 0-2 benennen, aber es wird uns das Leben leichter machen wenn wir ihnen symbolische Namen geben: ordinary cr lf Unser Programm wird in dem ordinary Status starten. Während dieses Status, hängt die Aktion des Programms von seiner Eingabe wie folgt ab: Wenn die Eingabe etwas anderes als ein Wagenrücklauf oder einem Zeilenvorschub ist, wird die Eingabe einfach nur an die Ausgabe geschickt. Der Status bleibt unverändert. Wenn die Eingabe ein Wagenrücklauf ist, wird der Status auf cr gesetzt. Die Eingabe wird dann verworfen, d.h., es entsteht keine Ausgabe. Wenn die Eingabe ein Zeilenvorschub ist, wird der Status auf lf gesetzt. Die Eingabe wird dann verworfen. Wann immer wir in dem cr Status sind, ist das weil die letzte Eingabe ein Wagenrücklauf war, welcher nicht verarbeitet wurde. Was unsere Software in diesem Status macht hängt von der aktuellen Eingabe ab: Wenn die Eingabe irgendetwas anderes als ein Wagenrücklauf oder ein Zeilenvorschub ist, dann gib einen Zeilenvorschub aus, dann gib die Eingabe aus und dann ändere den Status zu ordinary. Wenn die Eingabe ein Wagenrücklauf ist, haben wir zwei (oder mehr) Wagenrückläufe in einer Reihe. Wir verwerfen die Eingabe, wir geben einen Zeilenvorschub aus und lassen den Status unverändert. Wenn die Eingabe ein Zeilenvorschub ist, geben wir den Zeilenvorschub aus und ändern den Status zu ordinary. Achte darauf das, dass nicht das gleiche wie in dem Fall oben drüber ist – würden wir versuchen beide zu kombinieren, würden wir zwei Zeilenvorschübe anstatt einen ausgeben. Letztendlich, sind wir in dem lf Status nachdem wir einen Zeilenvorschub empfangen haben der nicht nach einem Wagenrücklauf kam. Das wird passieren wenn unsere Datei bereits im &unix; Format ist, oder jedesmal wenn mehrere Zeilen in einer Reihe durch einen einzigen Wagenrücklauf gefolgt von mehreren Zeilenvorschüben ausgedrückt wird, oder wenn die Zeile mit einer Zeilenvorschub / Wagenrücklauf Sequenz endet. Wir sollten mit unserer Eingabe in diesem Status folgendermasen umgehen: Wenn die Eingabe irgendetwas anderes als ein Wagenrücklauf oder ein Zeilenvorschub ist, geben wir einen Zeilenvorschub aus, geben dann die Eingabe aus und ändern dann den Status zu ordinary. Das ist exakt die gleiche Aktion wie in dem cr Status nach dem Empfangen der selben Eingabe. Wenn die Eingabe ein Wagenrücklauf ist, verwerfen wir die Eingabe, geben einen Zeilenvorschub aus und ändern dann den Status zu ordinary. Wenn die Eingabe ein Zeilenvorschub ist, geben wir den Zeilenvorschub aus und lassen den Status unverändert. Der Endgültige Status Der obige Endliche Zustandsautomat funktioniert für die gesamte Datei, aber lässt die Möglichkeit das die letzte Zeile ignoriert wird. Das wird jedesmal passieren wenn die Datei mit einem einzigen Wagenrücklauf oder einem einzigen Zeilenvorschub endet. Daran habe ich nicht gedacht als ich tuc schrieb, nur um festzustellen das,dass letzte Zeilenende gelegentlich weggelassen wird. Das Problem wird einfach dadurch gelöst, indem man den Status überprüft nachdem die gesamte Datei verarbeitet wurde. Wenn der Status nicht ordinary ist, müssen wir nur den letzten Zeilenvorschub ausgeben. Nachdem wir unseren Algorithmus nun als einen Endlichen Zustandsautomaten formuliert haben, könnten wir einfach einen festgeschalteten digitalen elektronischen Schaltkreis (einen "Chip") designen, der die Umwandlung für uns übernimmt. Natürlich wäre das sehr viel teurer, als ein Assembler Programm zu schreiben. Der Ausgabe Zähler Weil unser Datei Konvertierungs Programm möglicherweise zwei Zeichen zu einem kombiniert, müssen wir einen Ausgabe Zähler verwenden. Wir initialisieren den Zähler zu 0 und erhöhen ihn jedes mal wenn wir ein Zeichen an die Ausgabe schicken. Am Ende des Programms, wird der Zähler uns sagen auf welche Grösse wir die Datei setzen müssen. Implementieren von EZ als Software Der schwerste Teil beim arbeiten mit einer Endlichen Zustandsmaschine ist das analysieren des Problems und dem ausdrücken als eine Endliche Zustandsmaschine. That geschafft, schreibt sich die Software fast wie von selbst. In eine höheren Sprache, wie etwa C, gibt es mehrere Hauptansätze. Einer wäre ein switch Angabe zu verwenden die auswählt welche Funktion genutzt werden soll. Zum Beispiel, switch (state) { default: case REGULAR: regular(inputchar); break; case CR: cr(inputchar); break; case LF: lf(inputchar); break; } Ein anderer Ansatz ist es ein Array von Funktions Zeigern zu benutzen, etwa wie folgt: (output[state])(inputchar); Noch ein anderer ist es aus state einen Funktions Zeiger zu machen und ihn zu der entsprechenden Funktion zeigen zu lassen: (*state)(inputchar); Das ist der Ansatz den wir in unserem Programm verwenden werden, weil es in Assembler sehr einfach und schnell geht. Wir werden einfach die Adresse der Prozedur in EBX speichern und dann einfach das ausgeben: call ebx Das ist wahrscheinlich schneller als die Adresse im Code zu hardcoden weil der Mikroprozessor die Adresse nicht aus dem Speicher lesen muss—es ist bereits in einer der Register gespeichert. Ich sagte wahrscheinlich weil durch das Cachen neuerer Mikroprozessoren beide Varianten in etwa gleich schnell sind. Speicher abgebildete Dateien Weil unser Programm nur mit einzelnen Dateien funktioniert, können wir nicht den Ansatz verwedenden der zuvor funktioniert hat, d.h., von einer Eingabe Datei zu lesen und in eine Ausgabe Datei zu schreiben. &unix; erlaubt es uns eine Datei, oder einen Bereich einer Datei, in den Speicher abzubilden. Um das zu tun, müssen wir zuerst eine Datei mit den entsprechenden Lese/Schreib Flags öffnen. Dann benutzen wir den mmap system call um sie in den Speicher abzubilden. Ein Vorteil von mmap ist, das es automatisch mit virtuellem Speicher arbeitet: Wir können mehr von der Datei im Speicher abbilden als wir überhaupt physikalischen Speicher zur Verfügung haben, noch immer haben wir aber durch normale OP Codes wie mov, lods, und stos Zugriff darauf. Egal welche Änderungen wir an dem Speicherabbild der Datei vornehmen, sie werden vom System in die Datei geschrieben. Wir müssen die Datei nicht offen lassen: So lange sie abgebildet bleibt, können wir von ihr lesen und in sie schreiben. Ein 32-bit Intel Mikroprozessor kann auf bis zu vier Gigabyte Speicher zugreifen – physisch oder virtuell. Das FreeBSD System erlaubt es uns bis zu der Hälfte für die Datei Abbildung zu verwenden. Zur Vereinfachung, werden wir in diesem Tutorial nur Dateien konvertieren die in ihrere Gesamtheit im Speicher abgebildet werden können. Es gibt wahrscheinlich nicht all zu viele Text Dateien die eine Grösse von zwei Gigabyte überschreiben. Falls unser Programm doch auf eine trifft, wird es einfach eine Meldung anzeigen mit dem Vorschlag das originale tuc statt dessen zu verwenden. Wenn du deine Kopie von syscalls.master überprüfst, wirst du zwei verschiedene Systemaufrufe finden die sich mmap nennen. Das kommt von der Entwicklung von &unix;: Es gab das traditionelle BSD mmap, Systemaufruf 71. Dieses wurde durch das &posix; mmap ersetzt, Systemaufruf 197. Das FreeBSD System unterstützt beide, weil ältere Programme mit der originalen BSD Version geschrieben wurden. Da neue Software die &posix; Version nutzt, werden wir diese auch verwenden. Die syscalls.master Datei zeigt die &posix; Version wie folgt: 197 STD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \ int flags, int fd, long pad, off_t pos); } Das weicht etwas von dem ab was mmap 2 sagt. Das ist weil mmap 2 die C Version beschreibt. Der Unterschiede liegt in dem long pad Argument, welches in der C Version nicht vorhanden ist. Wie auch immer, der FreeBSD Systemaufruf fügt einen 32-bit Block ein nachdem es ein 64-Bit Argument auf den Stack gepusht hat. In diesem Fall, ist off_t ein 64-Bit Wert. Wenn wir fertig sind mit dem Arbeiten einer im Speicher abgebildeten Datei, entfernen wir das Speicherabbild mit dem munmap Systemaufruf: Für eine detailiert Behandlung von mmap, sieh in W. Richard Stevens' Unix Network Programming, Volume 2, Chapter 12 nach. Feststellen der Datei Grösse Weil wir mmap sagen müssen wie viele Bytes von Datei wir im Speicher abbilden wollen und wir außerdem die gesamte Datei abbilden wollen, müssen wir die Grösse der Datei feststellen. Wir können den fstat Systemaufruf verwenden um alle Informationen über eine geöffnete Datei zu erhalten die uns das System geben kann. Das beinhaltet die Datei Grösse. Und wieder, zeigt uns syscalls.master zwei Versionen von fstat, eine traditionelle (Systemaufruf 62), und eine &posix; (Systemaufruf 189) Variante. Natürlich, verwenden wir die &posix; Version: 189 STD POSIX { int fstat(int fd, struct stat *sb); } Das ist ein sehr unkomplizierter Aufruf: Wir übergeben ihm die Adresse einer stat Structure und den Deskriptor einer geöffneten Datei. Es wird den Inhalt der stat Struktur ausfüllen. Ich muss allerdings sagen, das ich versucht habe die stat Struktur in dem .bss Bereich zu deklarieren, und fstat mochte es nicht: Es setzte das Carry Flag welches einen Fehler anzeigt. Nachdem ich den Code veränderte so dass er die Struktur auf dem Stack anlegt, hat alles gut funktioniert. Ändern der Dateigrösse Dadurch das unser Programm Wagenrücklauf/Zeilenvorschub-Sequenzen in einfache Zeilenvorschübe zusammenfassen könnte, könnte unsere Ausgabe kleiner sein als unsere Eingabe. Und da wir die Ausgabe in dieselbe Datei um, aus der wir unsere Eingabe erhalten, müssen wir eventuell die Dateigrösse anpassen. Der Systemaufruf ftruncate erlaubt uns, dies zu tun. Abgesehen von dem etwas unglücklich gewählten Namen ftruncate können wir mit dieser Funktion eine Datei vergrössern, oder verkleinern. Und ja, wir werden zwei Versionen von ftruncate in syscalls.master finden, eine ältere (130) und eine neuere (201). Wir werden die neuere Version verwenden: 201 STD BSD { int ftruncate(int fd, int pad, off_t length); } Beachten Sie bitte, dass hier wieder int pad verwendet wird. ftuc Wir wissen jetzt alles nötige, um ftuc zu schreiben. Wir beginnen, indem wir ein paar neue Zeilen der Datei system.inc hinzufügen. Als erstes definieren wir irgendwo am Anfang der Datei einige Konstanten und Strukturen: ;;;;;;; open flags %define O_RDONLY 0 %define O_WRONLY 1 %define O_RDWR 2 ;;;;;;; mmap flags %define PROT_NONE 0 %define PROT_READ 1 %define PROT_WRITE 2 %define PROT_EXEC 4 ;; %define MAP_SHARED 0001h %define MAP_PRIVATE 0002h ;;;;;;; stat structure struc stat st_dev resd 1 ; = 0 st_ino resd 1 ; = 4 st_mode resw 1 ; = 8, size is 16 bits st_nlink resw 1 ; = 10, ditto st_uid resd 1 ; = 12 st_gid resd 1 ; = 16 st_rdev resd 1 ; = 20 st_atime resd 1 ; = 24 st_atimensec resd 1 ; = 28 st_mtime resd 1 ; = 32 st_mtimensec resd 1 ; = 36 st_ctime resd 1 ; = 40 st_ctimensec resd 1 ; = 44 st_size resd 2 ; = 48, size is 64 bits st_blocks resd 2 ; = 56, ditto st_blksize resd 1 ; = 64 st_flags resd 1 ; = 68 st_gen resd 1 ; = 72 st_lspare resd 1 ; = 76 st_qspare resd 4 ; = 80 endstruc Wir definieren die neuen Systemaufrufe: %define SYS_mmap 197 %define SYS_munmap 73 %define SYS_fstat 189 %define SYS_ftruncate 201 Wir fügen die Makros hinzu: %macro sys.mmap 0 system SYS_mmap %endmacro %macro sys.munmap 0 system SYS_munmap %endmacro %macro sys.ftruncate 0 system SYS_ftruncate %endmacro %macro sys.fstat 0 system SYS_fstat %endmacro Und hier ist unser Code: ;;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Started: 21-Dec-2000 ;; Updated: 22-Dec-2000 ;; ;; Copyright 2000 G. Adam Stanislav. ;; All rights reserved. ;; ;;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %include 'system.inc' section .data db 'Copyright 2000 G. Adam Stanislav.', 0Ah db 'All rights reserved.', 0Ah usg db 'Usage: ftuc filename', 0Ah usglen equ $-usg co db "ftuc: Can't open file.", 0Ah colen equ $-co fae db 'ftuc: File access error.', 0Ah faelen equ $-fae ftl db 'ftuc: File too long, use regular tuc instead.', 0Ah ftllen equ $-ftl mae db 'ftuc: Memory allocation error.', 0Ah maelen equ $-mae section .text align 4 memerr: push dword maelen push dword mae jmp short error align 4 toolong: push dword ftllen push dword ftl jmp short error align 4 facerr: push dword faelen push dword fae jmp short error align 4 cantopen: push dword colen push dword co jmp short error align 4 usage: push dword usglen push dword usg error: push dword stderr sys.write push dword 1 sys.exit align 4 global _start _start: pop eax ; argc pop eax ; program name pop ecx ; file to convert jecxz usage pop eax or eax, eax ; Too many arguments? jne usage ; Open the file push dword O_RDWR push ecx sys.open jc cantopen mov ebp, eax ; Save fd sub esp, byte stat_size mov ebx, esp ; Find file size push ebx push ebp ; fd sys.fstat jc facerr mov edx, [ebx + st_size + 4] ; File is too long if EDX != 0 ... or edx, edx jne near toolong mov ecx, [ebx + st_size] ; ... or if it is above 2 GB or ecx, ecx js near toolong ; Do nothing if the file is 0 bytes in size jecxz .quit ; Map the entire file in memory push edx push edx ; starting at offset 0 push edx ; pad push ebp ; fd push dword MAP_SHARED push dword PROT_READ | PROT_WRITE push ecx ; entire file size push edx ; let system decide on the address sys.mmap jc near memerr mov edi, eax mov esi, eax push ecx ; for SYS_munmap push edi ; Use EBX for state machine mov ebx, ordinary mov ah, 0Ah cld .loop: lodsb call ebx loop .loop cmp ebx, ordinary je .filesize ; Output final lf mov al, ah stosb inc edx .filesize: ; truncate file to new size push dword 0 ; high dword push edx ; low dword push eax ; pad push ebp sys.ftruncate ; close it (ebp still pushed) sys.close add esp, byte 16 sys.munmap .quit: push dword 0 sys.exit align 4 ordinary: cmp al, 0Dh je .cr cmp al, ah je .lf stosb inc edx ret align 4 .cr: mov ebx, cr ret align 4 .lf: mov ebx, lf ret align 4 cr: cmp al, 0Dh je .cr cmp al, ah je .lf xchg al, ah stosb inc edx xchg al, ah ; fall through .lf: stosb inc edx mov ebx, ordinary ret align 4 .cr: mov al, ah stosb inc edx ret align 4 lf: cmp al, ah je .lf cmp al, 0Dh je .cr xchg al, ah stosb inc edx xchg al, ah stosb inc edx mov ebx, ordinary ret align 4 .cr: mov ebx, ordinary mov al, ah ; fall through .lf: stosb inc edx ret Verwenden Sie dieses Programm nicht mit Dateien, die sich auf Datenträgern befinden, welche mit &ms-dos; oder &windows; formatiert wurden. Anscheinend gibt es im Code von FreeBSD einen subtilen Bug, wenn mmap auf solchen Datenträgern verwendet wird: Wenn die Datei eine bestimmte Grösse überschreitet, füllt mmap den Speicher mit lauter Nullen, und überschreibt damit anschliessend den Dateiinhalt. Daniel Seuffert Übersetzt von One-Pointed Mind Als ein Zen-Schüler liebe ich die Idee eines fokussierten Bewußtseins: Tu nur ein Ding zur gleichen Zeit, aber mache es richtig. Das ist ziemlich genau die gleiche Idee, welche &unix; richtig funktionieren lässt. Während eine typische &windows;-Applikation versucht alles Vorstellbare zu tun (und daher mit Fehler durchsetzt ist), versucht eine &unix;-Applikation nur eine Funktion zu erfüllen und das gut. Der typische &unix;-Nutzer stellt sich sein eigenes System durch Shell-Skripte zusammen, die er selbst schreibt, und welche die Vorteile bestehender Applikationen dadurch kombinieren, indem sie die Ausgabe eines Programmes als Eingabe in ein anderes Programm durch eine Pipe übergeben. Wenn Sie ihre eigene &unix;-Software schreiben, ist es generell eine gute Idee zu betrachten, welcher Teil der Problemlösung durch bestehende Programme bewerkstelligt werden kann. Man schreibt nur die Programme selbst, für die keine vorhandene Lösung existiert. CSV Ich will dieses Prinzip an einem besonderen Beispiel aus der realen Welt demonstrieren, mit dem ich kürzlich konfrontiert wurde: Ich mußte jeweils das elfte Feld von jedem Datensatz aus einer Datenbank extrahieren, die ich von einer Webseite heruntergeladen hatte. Die Datenbank war eine CSV-Datei, d.h. eine Liste von Komma-getrennten Werten. Dies ist ein ziemlich gewöhnliches Format für den Code-Austausch zwischen Menschen, die eine unterschiedliche Datenbank-Software nutzen. Die erste zeile der Datei enthält eine Liste der Felder durch Kommata getrennt. Der Rest der Datei enthält die einzelnen Datensätze mit durch Kommata getrennten Werten in jeder Zeile. Ich versuchte awk unter Nutzung des Kommas als Trenner. Da aber einige Zeilen durch in Bindestriche gesetzte Kommata getrennt waren, extrahierte awk das falsche Feld aus diesen Zeilen. Daher mußte ich meine eigene Software schreiben, um das elfte Feld aus der CSV-Datei auszulesen. Aber durch Anwendung der &unix;-Philosophie mußte ich nur einen einfachen Filter schreiben, das Folgende tat: Entferne die erste Zeile aus der Datei. Ändere alle Kommata ohne Anführungszeichen in einen anderen Buchstaben. Entferne alle Anführungszeichen. Streng genommen könnte ich sed benutzen, um die erste Zeile der Datei zu entfernen, aber das zu Bewerkstelligen war in meinem Programm sehr einfach, also entschloss ich mich dazu und reduzierte dadurch die Größe der Pipeline. Unter Berücksichtigung aller Faktoren kostete mich das Schreiben dieses Progammes ca. 20 Minuten. Das Schreiben eines Programmes, welches jeweils das elfte Feld aus einer CSV-Datei extrahiert hätte wesentlich länger gedauert und ich hätte es nicht wiederverwenden können, um ein anderes Feld zu extrahieren aus irgendeiner anderen Datenbank. Diesmal entschied ich mich dazu, etwas mehr Arbeit zu investieren, als man normalerweise für ein typisches Tutorial verwenden würde: Es parst die Kommandozeilen nach Optionen. Es zeigt die richtige Nutzung an, falls es ein falsches Argument findet. Es gibt vernünftige Fehlermeldungen aus. Hier ist ein Beispiel für seine Nutzung: Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>] Alle Parameter sind optional und können in beliebiger Reihenfolge auftauchen. Der -t-Parameter legt fest, was zu die Kommata zu ersetzen sind. Der tab ist die Vorgabe hierfür. Zum Beispiel wird -t; alle unquotierten Kommata mit Semikolon ersetzen. Ich brauche die -c-Option nicht, aber sie könnte zukünftig nützlich sein. Sie ermöglicht mir festzulegen, daß ich einen anderen Buchstaben als das Kommata mit etwas anderem ersetzen möchte. Zum Beispiel wird der Parameter -c@ alle @-Zeichen ersetzen (nützlich, falls man eine Liste von EmAil-Adressen in Nutzername und Domain aufsplitten will). Die -p-Option erhält die erste Zeile, d.h. die erste Zeile der Datei wird nicht gelöscht. Als Vorgabe löschen wir die erste Zeile, weil die CSV-Datei in der ersten Zeile keine Daten, sondern Feldbeschreibungen enthält. Die Parameter -i- und -o-Optionen erlauben es mir, die Ausgabe- und Eingabedateien festzulegen. Vorgabe sind stdin und stdout, also ist es ein regulärer &unix;-Filter. Ich habe sichergestellt, daß sowohl -i filename und -ifilename akzeptiert werden. Genauso habe ich dafür Sorge getragen, daß sowohl Eingabe- als auch Ausgabedateien festgelegt werden können. Um das elfte Feld jeden Datensatzes zu erhalten kann ich nun folgendes eingeben: &prompt.user; csv '-t;' data.csv | awk '-F;' '{print $11}' Der Code speichert die Optionen (bis auf die Dateideskriptoren) in EDX: Das Kommata in DH, den neuen Feldtrenner in DL und das Flag für die -p-Option in dem höchsten Bit von EDX. Ein kurzer Abgleich des Zeichens wird uns also eine schnelle Entscheidung darüber erlauben, was zu tun ist. Hier ist der Code: ;;;;;;; csv.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Convert a comma-separated file to a something-else separated file. ; ; Started: 31-May-2001 ; Updated: 1-Jun-2001 ; ; Copyright (c) 2001 G. Adam Stanislav ; All rights reserved. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %include 'system.inc' %define BUFSIZE 2048 section .data fd.in dd stdin fd.out dd stdout usg db 'Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]', 0Ah usglen equ $-usg iemsg db "csv: Can't open input file", 0Ah iemlen equ $-iemsg oemsg db "csv: Can't create output file", 0Ah oemlen equ $-oemsg section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE section .text align 4 ierr: push dword iemlen push dword iemsg push dword stderr sys.write push dword 1 ; return failure sys.exit align 4 oerr: push dword oemlen push dword oemsg push dword stderr sys.write push dword 2 sys.exit align 4 usage: push dword usglen push dword usg push dword stderr sys.write push dword 3 sys.exit align 4 global _start _start: add esp, byte 8 ; discard argc and argv[0] mov edx, (',' << 8) | 9 .arg: pop ecx or ecx, ecx je near .init ; no more arguments ; ECX contains the pointer to an argument cmp byte [ecx], '-' jne usage inc ecx mov ax, [ecx] .o: cmp al, 'o' jne .i ; Make sure we are not asked for the output file twice cmp dword [fd.out], stdout jne usage ; Find the path to output file - it is either at [ECX+1], ; i.e., -ofile -- ; or in the next argument, ; i.e., -o file inc ecx or ah, ah jne .openoutput pop ecx jecxz usage .openoutput: push dword 420 ; file mode (644 octal) push dword 0200h | 0400h | 01h ; O_CREAT | O_TRUNC | O_WRONLY push ecx sys.open jc near oerr add esp, byte 12 mov [fd.out], eax jmp short .arg .i: cmp al, 'i' jne .p ; Make sure we are not asked twice cmp dword [fd.in], stdin jne near usage ; Find the path to the input file inc ecx or ah, ah jne .openinput pop ecx or ecx, ecx je near usage .openinput: push dword 0 ; O_RDONLY push ecx sys.open jc near ierr ; open failed add esp, byte 8 mov [fd.in], eax jmp .arg .p: cmp al, 'p' jne .t or ah, ah jne near usage or edx, 1 << 31 jmp .arg .t: cmp al, 't' ; redefine output delimiter jne .c or ah, ah je near usage mov dl, ah jmp .arg .c: cmp al, 'c' jne near usage or ah, ah je near usage mov dh, ah jmp .arg align 4 .init: sub eax, eax sub ebx, ebx sub ecx, ecx mov edi, obuffer ; See if we are to preserve the first line or edx, edx js .loop .firstline: ; get rid of the first line call getchar cmp al, 0Ah jne .firstline .loop: ; read a byte from stdin call getchar ; is it a comma (or whatever the user asked for)? cmp al, dh jne .quote ; Replace the comma with a tab (or whatever the user wants) mov al, dl .put: call putchar jmp short .loop .quote: cmp al, '"' jne .put ; Print everything until you get another quote or EOL. If it ; is a quote, skip it. If it is EOL, print it. .qloop: call getchar cmp al, '"' je .loop cmp al, 0Ah je .put call putchar jmp short .qloop align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx ret read: jecxz .read call write .read: push dword BUFSIZE mov esi, ibuffer push esi push dword [fd.in] sys.read add esp, byte 12 mov ebx, eax or eax, eax je .done sub eax, eax ret align 4 .done: call write ; flush output buffer ; close files push dword [fd.in] sys.close push dword [fd.out] sys.close ; return success push dword 0 sys.exit align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: jecxz .ret ; nothing to write sub edi, ecx ; start of buffer push ecx push edi push dword [fd.out] sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now .ret: ret Vieles daraus ist aus hex.asm entnommen worden. Aber es gibt einen wichtigen Unterschied: Ich rufe nicht länger write auf, wann immer ich eine Zeilenvorschub ausgebe. Nun kann der Code sogar interaktiv genutzt werden. Ich habe eine bessere Lösung gefunden für das Interaktivitätsproblem seit ich mit dem Schreiben dieses Kapitels begonnen habe. Ich wollte sichergehen, daß jede Zeile einzeln ausgegeben werden kann, falls erforderlich. Aber schlussendlich gibt es keinen Bedarf jede Zeile einzeln auszugeben, falls nicht-interaktiv genutzt. Die neue Lösung besteht darin, die Funktion write jedesmal aufzurufen, wenn ich den Eingabepuffer leer vorfinde. Auf diesem Wege liest das Programm im interaktiven Modus eine Zeile aus der Tastatur des Nutzers, verarbeitet sie und stellt fest, ob deren Eingabepuffer leer ist, dann leert es seine Ausgabe und liest die nächste Zeile. Die dunkle Seite des Buffering Diese Änderung verhindert einen mysteriösen Aufhänger in einem speziellen Fall. Ich bezeichne dies als die dunkle Seite des Buffering, hauptsächlich, weil es eine nicht offensichtliche Gefahr darstellt. Es ist unwahrscheinlich, daß dies mit dem csv-Programm oben geschieht aber lassen Sie uns einen weiteren Filter betrachten: Nehmen wir an ihre Eingabe sind rohe Daten, die Farbwerte darstellen, wie z.B. die Intensität eines Pixel mit den Farben rot, grün und blau. Unsere Ausgabe wird der negative Wert unserer Eingabe sein. Solch ein Filter würde sehr einfach zu schreiben sein. Der größte Teil davon würde so aussehen wie all die anderen Filter, die wir bsiher geschrieben haben, daher beziehe ich mich nur auf den Kern der Prozedur: .loop: call getchar not al ; Create a negative call putchar jmp short .loop Da dieser Filter mit rohen Daten arbeitet ist es unwahrscheinlich, daß er interaktiv genutzt werden wird. Aber das Programm könnte als Bildbearbeitssoftware tituliert werden. Wenn es nicht write vor jedem Aufruf von read durchführt, ist die Möglichkeit gegeben, das es sich aufhängt. Dies könnte passieren: Der Bildeditor wird unseren Filter laden mittels der C-Funktion popen(). Er wird die erste Zeile von Pixeln laden aus einer Bitmap oder Pixmap. Er wird die erste Zeile von Pixeln geschrieben in die Pipe, welche zur Variable fd.in unseres Filters führt. Unser Filter wird jeden Pixel auslesen von der Eingabe, in in seinen negativen Wert umkehren und ihn in den Ausgabepuffer schreiben. Unser Filter wird die Funktion getchar aufrufen, um das nächste Pixel abzurufen. Die Funktion getchar wird einen leeren Eingabepuffer vorfinden und daher die Funktion read aufrufen. read wird den Systemaufruf SYS_read starten. Der Kernel wird unseren Filter unterbrechen, bis der Bildeditor mehr Daten zur Pipe sendet. Der Bildedior wird aus der anderen Pipe lesen, welche verbunden ist mit fd.out unseres Filters, damit er die erste Zeile des auszugebenden Bildes setzen kann bevor er uns die zweite Zeile der Eingabe einliest. Der Kernel unterbricht den Bildeditor, bis er eine Ausgabe unseres Filters erhält, um ihn an den Bildeditor weiterzureichen. An diesem Punkt wartet unser Filter auf den Bildeditor, daß er ihm mehr Daten zur Verarbeitung schicken möge. Gleichzeitig wartet der Bildeditor darauf, daß unser Filter das Resultat der Berechnung ersten Zeile sendet. Aber das Ergebnis sitzt in unserem Ausgabepuffer. Der Filter und der Bildeditor werden fortfahren bis in die Ewigkeit aufeinander zu warten (oder zumindest bis sie per kill entsorgt werden). Unsere Software hat den eine Race Condition erreicht. Das Problem tritt nicht auf, wenn unser Filter seinen Ausgabepuffer leert bevor er vom Kernel mehr Eingabedaten anfordert. Fabian Borschel Übersetzt von Die <acronym>FPU</acronym> verwenden Seltsamerweise erwähnt die meiste Literatur zu Assemblersprachen nicht einmal die Existenz der FPU, oder floating point unit (Fließkomma-Recheneinheit), geschweige denn, daß auf die Programmierung mit dieser eingeganen wird. Dabei kann die Assemblerprogrammierung gerade bei hoch optimiertem FPU-Code, der nur mit einer Assemblersprache realisiert werden kann, ihre große Stärke ausspielen. Organisation der <acronym>FPU</acronym> Die FPU besteht aus 8 80–bit Fließkomma-Registern. Diese sind in Form eines Stacks organisiert—Sie können einen Wert durch den Befehl push auf dem TOS (top of stack) ablegen, oder durch pop von diesem holen. Da also die Befehle push und pop schon verwendet werden, kann es keine op-Codes in Assemblersprache mit diesen Namen geben. Sie können mit einen Wert auf dem TOS ablegen, indem Sie fld, fild, und fbld verwenden. Mit weiteren op-Codes lassen sich Konstanten—wie z.B. Pi—auf dem TOS ablegen. Analog dazu können Sie einen Wert holen, indem Sie fst, fstp, fist, fistp, und fbstp verwenden. Eigentlich holen (pop) nur die op-Codes, die auf p enden, einen Wert, während die anderen den Wert irgendwo speichern (store) ohne ihn vom TOS zu entfernen. Daten können zwischen dem TOS und dem Hauptspeicher als 32–bit, 64–bit oder 80–bit real, oder als 16–bit, 32–bit oder 64–bit Integer, oder als 80–bit packed decimal übertragen werden. Das 80–bit packed decimal-Format ist ein Spezialfall des binary coded decimal-Formates, welches üblicherweise bei der Konvertierung zwischen der ASCII- und FPU-Darstellung von Daten verwendet wird. Dieses erlaubt die Verwendung von 18 signifikanten Stellen. Unabhängig davon, wie Daten im Speicher dargestellt werden, speichert die FPU ihre Daten immer im 80–bit real-Format in den Registern. Ihre interne Genauigkeit beträgt mindestens 19 Dezimalstellen. Selbst wenn wir also Ergebnisse im ASCII-Format mit voller 18–stelliger Genauigkeit darstellen lassen, werden immer noch korrekte Werte angezeigt. Des weiteren können mathematische Operationen auf dem TOS ausgeführt werden: Wir können dessen Sinus berechnen, wir können ihn skalieren (z.B. können wir ihn mit dem Faktor 2 Multiplizieren oder Dividieren), wir können dessen Logarithmus zur Basis 2 nehmen, und viele weitere Dinge. Wir können auch FPU-Register multiplizieren, dividieren, addieren und subtrahieren, sogar einzelne Register mit sich selbst. Der offizielle Intel op-Code für den TOS ist st und für die Register st(0)st(7). st und st(0) beziehen sich dabei auf das gleiche Register. Aus welchen Gründen auch immer hat sich der Originalautor von nasm dafür entschieden, andere op-Codes zu verwenden, nämlich st0st7. Mit anderen Worten, es gibt keine Klammern, und der TOS ist immer st0, niemals einfach nur st. Das Packed Decimal-Format Das packed decimal-Format verwendet 10 Bytes (80 Bits) zur Darstellung von 18 Ziffern. Die so dargestellte Zahl ist immer ein Integer. Sie können durch Multiplikation des TOS mit Potenzen von 10 die einzelnen Dezimalstellen verschieben. Das höchste Bit des höchsten Bytes (Byte 9) ist das Vorzeichenbit: Wenn es gesetzt ist, ist die Zahl negativ, ansonsten positiv. Die restlichen Bits dieses Bytes werden nicht verwendet bzw. ignoriert. Die restlichen 9 Bytes enthalten die 18 Ziffern der gepeicherten Zahl: 2 Ziffern pro Byte. Die signifikantere Ziffer wird in der oberen Hälftes (4 Bits) eines Bytes gespeichert, die andere in der unteren Hälfte. Vielleicht würden Sie jetzt annehmen, das -1234567 auf die folgende Art im Speicher abgelegt wird (in hexadezimaler Notation): 80 00 00 00 00 00 01 23 45 67 Dem ist aber nicht so! Bei Intel werden alle Daten im little–endian-Format gespeichert, auch das packed decimal-Format. Dies bedeutet, daß -1234567 wie folgt gespeichert wird: 67 45 23 01 00 00 00 00 00 80 Erinnern Sie sich an diesen Umstand, bevor Sie sich aus lauter Verzweiflung die Haare ausreißen. Das lesenswerte Buch—falls Sie es finden können—ist Richard Startz' 8087/80287/80387 for the IBM PC & Compatibles. Obwohl es anscheinend die Speicherung der packed decimal im little–endian-Format für gegeben annimmt. Ich mache keine Witze über meine Verzweifelung, als ich den Fehler im unten stehenden Filter gesucht habe, bevor mir einfiel, daß ich einfach mal versuchen sollte, das little–endian-Format, selbst für diesen Typ von Daten, anzuwenden. Ausflug in die Lochblendenphotographie Um sinvolle Programme zu schreiben, müssen wir nicht nur unsere Programmierwerkzeuge beherrschen, sondern auch das Umfeld, für das die Programme gedacht sind. Unser nächster Filter wird uns dabei helfen, wann immer wir wollen, eine Lochkammera zu bauen. Wir brauchen also etwas Hintergrundwissen über die Lochblendenphotographie, bevor wir weiter machen können. Die Kamera Die einfachste Form, eine Kamera zu beschreiben, ist die eines abgeschlossenen, lichtundurchlässigen Raumes, in dessen Abdeckung sich ein kleines Loch befindet. Die Abdeckung ist normalerweise fest (z.B. eine Schachtel), manchmal jedoch auch flexibel (z.B. ein Balgen). Innerhalb der Kamera ist es sehr dunkel. Nur durch ein kleines Loch kann Licht von einem einzigen Punkt aus in den Raum eindringen (in manchen Fällen sind es mehrere Löcher). Diese Lichtstrahlen kommen von einem Bild, einer Darstellung von dem was sich außerhalb der Kamera, vor dem kleinen Loch, befindet. Wenn ein lichtempfindliches Material (wie z.B. ein Film) in der Kamera angebracht wird, so kann dieses das Bild einfangen. Das Loch enthält häufig eine Linse, oder etwas linsenartiges, häufig auch einfach Objektiv genannt. Die Lochblende Streng genommen ist die Linse nicht notwendig: Die ursprünglichen Kameras verwendeten keine Linse, sondern eine Lochblende. Selbst heutzutage werden noch Lochblenden verwendet, zum einen, um die Funktionsweise einer Kamera zu erlernen, und zum anderen, um eine spezielle Art von Bildern zu erzeugen. Das Bild, das von einer Lochblende erzeugt wird, ist überall scharf. Oder unscharf. Es gibt eine ideale Größe für eine Lochblende: Wenn sie größer oder kleiner ist, verliert das Bild seine Schärfe. Brennweite Dieser ideale Lochblendendurchmesser ist eine Funktion der Quadratwurzel der Brennweite, welche dem Abstand der Lochblende von dem Film entspricht. D = PC * sqrt(FL) Hier ist D der ideale Durchmesser der Lochblende, FL die Brennweite und PC eine Konstante der Brennweite. Nach Jay Bender hat die Konstante den Wert 0.04, nach Kenneth Connors 0.037. Andere Leute haben andere Werte vorgeschlagen. Des weiteren gelten diese Werte nur für Tageslicht: Andere Arten von Licht benötigen andere konstante Werte, welche nur durch Experimente bestimmt werden können. Der f–Wert Der f–Wert ist eine sehr nützliche Größe, die angibt, wieviel Licht den Film erreicht. Ein Belichtungsmesser kann dies messen, um z.B. für einen Film mit einer Empfindlichkeit von f5.6 eine Belichtungsdauer von 1/1000 Sekunden auszurechnen. Es spielt keine Rolle, ob es eine 35–mm- oder eine 6x9cm-Kamera ist, usw. Solange wir den f–Wert kennen, können wir die benötigte Belichtungszeit berechnen. Der f–Wert läßt sich einfach wie folgt berechnen: F = FL / D Mit anderen Worten, der f–Wert ergibt sich aus der Brennweite (FL), dividiert durch den Durchmesser (D) der Lochblende. Ein großer f–Wert impliziert also entweder eine kleine Lochblende, oder eine große Brennweite, oder beides. Je größer also der f–Wert ist, um so länger muß die Belichtungszeit sein. Des weiteren sind der Lochblendendurchmesser und die Brennweite eindimensionale Meßgrößen, während der Film und die Lochblende an sich zweidimensionale Objekte darstellen. Das bedeutet, wenn man für einen f–Wert A eine Belichtungsdauer t bestimmt hat, dann ergibt sich daraus für einen f–Wert B eine Belichtungszeit von: t * (B / A)² Normalisierte f–Werte Während heutige moderne Kameras den Durchmesser der Lochblende, und damit deren f–Wert, weich und schrittweise verändern können, war dies früher nicht der Fall. Um unterschiedliche f–Werte einstellen zu können, besaßen Kameras typischerweise eine Metallplatte mit Löchern unterschiedlichen Durchmessers als Lochblende. Die Durchmesser wurden entsprechend obiger Formel gewählt, daß der resultierende f–Wert ein fester Standardwert war, der für alle Kameras verwendet wurde. Z.B. hat eine sehr alte Kodak Duaflex IV Kamera in meinem Besitz drei solche Löcher für die f–Werte 8, 11 und 16. Eine neuere Kamera könnte f–Werte wie 2.8, 4, 5.6, 8, 11, 16, 22, und 32 (und weitere) besitzen. Diese Werte wurden nicht zufällig ausgewählt: Sie sind alle vielfache der Quadratwurzel aus 2, wobei manche Werte gerundet wurden. Der f–Stopp Eine typische Kamera ist so konzipiert, daß die Nummernscheibe bei den normalisierten f–Werten einrastet. Die Nummernscheibe stoppt an diesen Positionen. Daher werden diese Positionen auch f–Stopps genannt. Da die f–Werte bei jedem Stopp vielfache der Quadratwurzel aus 2 sind, verdoppelt die Drehung der Nummernscheibe um einen Stopp die für die gleiche Belichtung benötigte Lichtmenge. Eine Drehung um 2 Stopps vervierfacht die benötigte Belichtungszeit. Eine Drehung um 3 Stopps verachtfacht sie, etc. Entwurf der Lochblenden-Software Wir können jetzt festlegen, was genau unsere Lochblenden-Software tun soll. Verarbeitung der Programmeingaben Da der Hauptzweck des Programms darin besteht, uns beim Entwurf einer funktionierenden Lochkamera zu helfen, wird die Brennweite die Programmeingabe sein. Dies ist etwas, das wir ohne zusätzliche Programme feststellen können: Die geeignete Brennweite ergibt sich aus der Größe des Films und der Art des Fotos, ob dieses ein "normales" Bild, ein Weitwinkelbild oder ein Telebild sein soll. Die meisten bisher geschriebenen Programme arbeiteten mit einzelnen Zeichen, oder Bytes, als Eingabe: Das hex-Programm konvertierte einzelne Bytes in hexadezimale Werte, das csv-Programm ließ entweder einzelne Zeichen unverändert, löschte oder veränderte sie, etc. Das Programm ftuc verwendete einen Zustandsautomateni, um höchstens zwei gleichzeitig eingegebene Bytes zu verarbeiten. Das pinhole-Programm dagegen kann nicht nur mit einzelnen Zeichen arbeiten, sondern muß mit größeren syntaktischen Einheiten zurrecht kommen. Wenn wir z.B. möchten, daß unser Programm den Lochblendendurchmesser (und weitere Werte, die wir später noch diskutieren werden) für die Brennweiten 100 mm, 150 mm und 210 mm berechnet, wollen wir etwa folgendes eingeben: 100, 150, 210 Unser Programm muß mit der gleichzeitigen Eingabe von mehr als nur einem einzelnen Byte zurecht kommen. Wenn es eine 1 erkennt, muß es wissen, daß dies die erste Stelle einer dezimalen Zahl ist. Wenn es eine 0, gefolgt von einer weiteren 0 sieht, muß es wissen, daß dies zwei unterschiedliche Stellen mit der gleichen Zahl sind. Wenn es auf das erste Komma trifft, muß es wissen, daß die folgenden Stellen nicht mehr zur ersten Zahl gehören. Es muß die Stellen der ersten Zahl in den Wert 100 konvertieren können. Und die Stellen der zweiten Zahl müssen in den Wert 150 konvertiert werden. Und die Stellen der dritten Zahl müssen in den Wert 210 konvertiert werden. Wir müssen festlegen, welche Trennsymbole zulässig sind: Sollen die Eingabewerte durch Kommas voneinander getrennt werden? Wenn ja, wie sollen zwei Zahlen behandelt werden, die durch ein anderes Zeichen getrennt sind? Ich persönlich mag es einfach. Entweder etwas ist eine Zahl, dann wird es verarbeitet, oder es ist keine Zahl, dann wird es verworfen. Ich mag es nicht, wenn sich der Computer bei der offensichtlichen Eingabe eines zusätzlichen Zeichens beschwert. Duh! Zusätzlich erlaubt es mir, die Monotonie des Tippens zu durchbrechen, und eine Anfrage anstelle einer simplen Zahl zu stellen: Was ist der beste Lochblendendurchmesser bei einer Brennweite von 150? Es gibt keinen Grund dafür, die Ausgabe mehrerer Fehlermeldungen aufzuteilen: Syntax error: Was Syntax error: ist Syntax error: der Syntax error: beste Et cetera, et cetera, et cetera. Zweitens mag ich das #-Zeichen, um Kommentare zu markieren, die ab dem Zeichen bis zum Ende der jeweiligen Zeile gehen. Dies verlangt nicht viel Programmieraufwand, und ermöglicht es mir, Eingabedateien für meine Programme als ausführbare Skripte zu handhaben. In unserem Fall müssen wir auch entscheiden, in welchen Einheiten die Dateneingabe erfolgen soll: Wir wählen Millimeter, da die meisten Photographen die Brennweite in dieser Einheit messen. Letztendlich müssen wir noch entscheiden, ob wir die Verwendung des dezimalen Punktes erlauben (in diesem Fall müssen wir berücksichtigen, daß in vielen Ländern der Welt das dezimale Komma verwendet wird). In unserem Fall würde das Zulassen eines dezimalen Punktes/Kommas zu einer fälschlicherweise angenommenen, höheren Genauigkeit führen: Der Unterschied zwischen den Brennweiten 50 und 51 ist fast nicht wahrnehmbar. Die Zulassung von Eingaben wie 50.5 ist also keine gute Idee. Beachten Sie bitte, das dies meine Meinung ist. In diesem Fall bin ich der Autor des Programmes. Bei Ihren eigenen Programmen müssen Sie selbst solche Entscheidungen treffen. Optionen anbieten Das wichtigste, was wir zum Bau einer Lochkamera wissen müssen, ist der Durchmesser der Lochblende. Da wir scharfe Bilder schießen wollen, werden wir obige Formel für die Berechnung des korrekten Durchmessers zu gegebener Brennweite verwenden. Da Experten mehrere Werte für die PC-Konstante anbieten, müssen wir uns hier für einen Wert entscheiden. In der Programmierung unter &unix; ist es üblich, zwei Hauptvarianten anzubieten, um Parameter an Programme zu übergeben, und des weiteren eine Standardeinstellung für den Fall zu haben, das der Benutzer gar keine Parameter angibt. Warum zwei Varianten, Parameter anzugeben? Ein Grund ist, eine (relativ) feste Einstellung anzubieten, die automatisch bei jedem Programmaufruf verwendet wird, ohne das wir diese Einstellung immer und immer wieder mit angeben müssen. Die feste Einstellung kann in einer Konfigurationsdatei gespeichert sein, typischerweise im Heimatverzeichnis des Benutzers. Die Datei hat üblicherweise denselben Namen wie das zugehörige Programm, beginnt jedoch mit einem Punkt. Häufig wird "rc" dem Dateinamen hinzugefügt. Unsere Konfigurationsdatei könnte also ~/.pinhole oder ~/.pinholerc heißen. (Die Zeichenfolge ~/ steht für das Heimatverzeichnis des aktuellen Benutzers.) Konfigurationsdateien werden häfig von Programmen verwendet, die viele konfigurierbare Parameter besitzen. Programme, die nur eine (oder wenige) Parameter anbieten, verwenden häufig eine andere Methode: Sie erwarten die Parameter in einer Umgebungsvariablen. In unserem Fall könnten wir eine Umgebungsvariable mit dem Namen PINHOLE benutzen. Normalerweise verwendet ein Programm entweder die eine, oder die andere der beiden obigen Methoden. Ansonsten könnte ein Programm verwirrt werden, wenn eine Konfigurationsdatei das eine sagt, die Umgebungsvariable jedoch etwas anderes. Da wir nur einen Parameter unterstützen müssen, verwenden wir die zweite Methode, und benutzen eine Umgebungsvariable mit dem Namen PINHOLE. Der andere Weg erlaubt uns, ad hoc Entscheidungen zu treffen: "Obwohl ich normalerweise einen Wert von 0.039 verwende, will ich dieses eine Mal einen Wert von 0.03872 anwenden." Mit anderen Worten, dies erlaubt uns, die Standardeinstellung außer Kraft zu setzen. Diese Art der Auswahl wird häufig über Kommandozeilenparameter gemacht. Schließlich braucht ein Programm immer eine Standardeinstellung. Der Benutzer könnte keine Parameter angeben. Vielleicht weiß er auch gar nicht, was er einstellen sollte. Vielleicht will er es "einfach nur ausprobieren". Vorzugsweise wird die Standardeinstellung eine sein, die die meisten Benutzer sowieso wählen würden. Somit müssen diese keine zusätzlichen Parameter angeben, bzw. können die Standardeinstellung ohne zusätzlichen Aufwand benutzen. Bei diesem System könnte das Programm widersprüchliche Optionen vorfinden, und auf die folgende Weise reagieren: Wenn es eine ad hoc-Einstellung vorfindet (z.B. ein Kommandozeilenparameter), dann sollte es diese Einstellung annehmen. Es muß alle vorher festgelegten sowie die standardmäßige Einstellung ignorieren. Andererseits, wenn es eine festgelegte Option (z.B. eine Umgebungsvariable) vorfindet, dann sollte es diese akzeptieren und die Standardeinstellung ignorieren. Ansonsten sollte es die Standardeinstellung verwenden. Wir müssen auch entscheiden, welches Format unsere PC-Option haben soll. Auf den ersten Blick scheint es einleuchtend, das Format PINHOLE=0.04 für die Umgebungsvariable, und -p0.04 für die Kommandozeile zu verwenden. Dies zuzulassen wäre eigentlich eine Sicherheitslücke. Die PC-Konstante ist eine sehr kleine Zahl. Daher würden wir unsere Anwendung mit verschiedenen, kleinen Werten für PC testen. Aber was würde passieren, wenn jemand das Programm mit einem sehr großen Wert aufrufen würde? Es könnte abstürzen, weil wir das Programm nicht für den Umgang mit großen Werten entworfen haben. Oder wir investieren noch weiter Zeit in das Programm, so daß dieses dann auch mit großen Zahlen umgehen kann. Wir könnten dies machen, wenn wir kommerzielle Software für computertechnisch unerfahrene Benutzer schreiben würden. Oder wir könnten auch sagen "Pech gehabt! Der Benutzer sollte es besser wissen." Oder wir könnten es für den Benutzer unmöglich machen, große Zahlen einzugeben. Dies ist die Variante, die wir verwenden werden: Wir nehmen einen impliziten 0.-Präfix an. Mit anderen Worten, wenn der Benutzer den Wert 0.04 angeben will, so muß er entweder -p04 als Parameter angeben, oder PINHOLE=04 als Variable in seiner Umgebung definieren. Falls der Benutzer -p9999999 angibt, so wird dies als 0.9999999 interpretiert—zwar immer noch sinnlos, aber zumindest sicher. Zweitens werden viele Benutzer einfach die Konstanten von Bender oder Connors benutzen wollen. Um es diesen Benutzern einfacher zu machen, werden wir -b als -p04, und -c als -p037 interpretieren. Die Ausgabe Wir müssen festlegen, was und in welchem Format unsere Anwendung Daten ausgeben soll. Da wir als Eingabe beliebig viele Brennweiten erlauben, macht es Sinn, die Ergebnisse in Form einer traditionellen Datenbank–Ausgabe darzustellen, bei der zeilenweise zu jeder Brennweite der zugehörige berechnete Wert, getrennt durch ein tab-Zeichen, ausgegeben wird. Optional sollten wir dem Benutzer die Möglichkeit geben, die Ausgabe in dem schon beschriebenen CSV-Format festzulegen. In diesem Fall werden wir zu Beginn der Ausgabe eine Zeile einfügen, in der die Beschreibungen der einzelnen Felder, durch Kommas getrennt, aufgelistet werden, gefolgt von der Ausgabe der Daten wie schon beschrieben, wobei das tab-Zeichen durch ein Komma ersetzt wird. Wir brauchen eine Kommandozeilenoption für das CSV-Format. Wir können nicht -c verwenden, da diese Option bereits für verwende Connors Konstante steht. Aus irgendeinem seltsamen Grund bezeichnen viele Webseiten CSV-Dateien als "Excel Kalkulationstabelle" (obwohl das CSV-Format älter ist als Excel). Wir werden daher -e als Schalter für die Ausgabe im CSV-Format verwenden. Jede Zeile der Ausgabe wird mit einer Brennweite beginnen. Dies mag auf den ersten Blick überflüssig erscheinen, besonders im interaktiven Modus: Der Benutzer gibt einen Wert für die Brennweite ein, und das Programm wiederholt diesen. Der Benutzer kann jedoch auch mehrere Brennweiten in einer Zeile angeben. Die Eingabe kann auch aus einer Datei, oder aus der Ausgabe eines anderen Programmes, kommen. In diesen Fällen sieht der Benutzer die Eingabewerte überhaupt nicht. Ebenso kann die Ausgabe in eine Datei umgelenkt werden, was wir später noch untersuchen werden, oder sie könnte an einen Drucker geschickt werden, oder auch als Eingabe für ein weiteres Programm dienen. Es macht also wohl Sinn, jede Zeile mit einer durch den Benutzer eingegebenen Brennweite beginnen zu lassen. Halt! Nicht, wie der Benutzer die Daten eingegeben hat. Was passiert, wenn der Benutzer etwas wie folgt eingibt: 00000000150 Offensichtlich müssen wir die führenden Nullen vorher abschneiden. Wir müssen also die Eingabe des Benutzers sorgfältig prüfen, diese dann in der FPU in die binäre Form konvertieren, und dann von dort aus ausgeben. Aber... Was ist, wenn der Benutzer etwas wie folgt eingibt: 17459765723452353453534535353530530534563507309676764423 Ha! Das packed decimal-Format der FPU erlaubt uns die Eingabe einer 18–stelligen Zahl. Aber der Benutzer hat mehr als 18 Stellen eingegeben. Wie gehen wir damit um? Wir könnten unser Programm so modifizieren, daß es die ersten 18 Stellen liest, der FPU übergibt, dann weitere 18 Stellen liest, den Inhalt des TOS mit einem Vielfachen von 10, entsprechend der Anzahl der zusätzlichen Stellen multipliziert, und dann beide Werte mittels add zusammen addiert. Ja, wir könnten das machen. Aber in diesem Programm wäre es unnötig (in einem anderen wäre es vielleicht der richtige Weg): Selbst der Erdumfang in Millimetern ergibt nur eine Zahl mit 11 Stellen. Offensichtlich können wir keine Kamera dieser Größe bauen (jedenfalls jetzt noch nicht). Wenn der Benutzer also eine so große Zahl eingibt, ist er entweder gelangweilt, oder er testet uns, oder er versucht, in das System einzudringen, oder er spielt— indem er irgendetwas anderes macht als eine Lochkamera zu entwerfen. Was werden wir tun? Wir werden ihn ohrfeigen, gewissermaßen: 17459765723452353453534535353530530534563507309676764423 ??? ??? ??? ??? ??? Um dies zu erreichen, werden wir einfach alle führenden Nullen ignorieren. Sobald wir eine Ziffer gefunden haben, die nicht Null ist, initialisieren wir einen Zähler mit 0 und beginnen mit drei Schritten: Sende die Ziffer an die Ausgabe. Füge die Ziffer einem Puffer hinzu, welchen wir später benutzen werden, um den packed decimal-Wert zu erzeugen, den wir an die FPU schicken können. Erhöhe den Zähler um eins. Während wir diese drei Schritte wiederholen, müssen wir auf zwei Bedingungen achten: Wenn der Zähler den Wert 18 übersteigt, hören wir auf, Ziffern dem Puffer hinzuzufügen. Wir lesen weiterhin Ziffern und senden sie an die Ausgabe. Wenn, bzw. falls, das nächste Eingabezeichen keine Zahl ist, sind wir mit der Bearbeitung der Eingabe erst einmal fertig. Übrigends können wir einfach Zeichen, die keine Ziffern sind, verwerfen, solange sie kein #-Zeichen sind, welches wir an den Eingabestrom zurückgeben müssen. Dieses Zeichen markiert den Beginn eines Kommentars. An dieser Stelle muß die Erzeugung der Ausgabe fertig sein, und wir müssen mit der Suche nach weiteren Eingabedaten fortfahren. Es bleibt immer noch eine Möglichkeit unberücksichtigt: Wenn der Benutzer eine Null (oder mehrere) eingibt, werden wir niemals eine von Null verschiedene Zahl vorfinden. Wir können solch einen Fall immer anhand des Zählerstandes feststellen, welcher dann immer bei 0 bleibt. In diesem Fall müssen wir einfach eine 0 an die Ausgabe senden, und anschließend dem Benutzer erneut eine "Ohrfeige" verpassen: 0 ??? ??? ??? ??? ??? Sobald wir die Brennweite ausgegeben, und die Gültigkeit dieser Eingabe verifiziert haben, (größer als 0 und kleiner als 18 Zahlen) können wir den Durchmesser der Lochblende berechnen. Es ist kein Zufall, daß Lochblende das Wort Loch enthält. In der Tat ist eine Lochblende buchstäblich eine Loch Blende, also eine Blende, in die mit einer Nadel vorsichtig ein kleines Loch gestochen wird. Daher ist eine typische Lochblende sehr klein. Unsere Formel liefert uns das Ergebnis in Millimetern. Wir werden dieses mit 1000 multiplizieren, so daß die Ausgabe in Mikrometern erfolgt. An dieser Stelle müssen wir auf eine weitere Falle achten: Zu hohe Genauigkeit. Ja, die FPU wurde für mathematische Berechnungen mit hoher Genauigkeit entworfen. Unsere Berechnungen hier erfordern jedoch keine solche mathematische Genauigkeit. Wir haben es hier mit Physik zu tun (Optik, um genau zu sein). Angenommen, wir wollten aus eine Lastkraftwagen eine Lochkamera bauen (wir wären dabei nicht die ersten, die das versuchen würden!). Angenommen, die Länge des Laderaumes beträgt 12 Meter lang, so daß wir eine Brennweite von 12000 hätten. Verwenden wir Benders Konstante, so erhalten wir durch Multiplizieren von 0.04 mit der Quadratwurzel aus 12000 einen Wert von 4.381780460 Millimetern, oder 4381.780460 Micrometern. So oder so ist das Rechenergebnis absurd präzise. Unser Lastkraftwagen ist nicht genau 12000 Millimeter lang. Wir haben diese Länge nicht mit einer so hohen Genauigkeit gemessen, weswegen es falsch wäre zu behaupten, unser Lochblendendurchmesser müsse exakt 4.381780460 Millimeter sein. Es reicht vollkommen aus, wenn der Durchmesser 4.4 Millimeter beträgt. Ich habe in obigem Beispiel das Rechenergebnis "nur" auf 10 Stellen genau angegeben. Stellen Sie sich vor, wie absurd es wäre, die vollen uns zur Verfügung stehenden, 18 Stellen anzugeben! Wir müssen also die Anzahl der signifikanten Stellen beschränken. Eine Möglichkeit wäre, die Mikrometer durch eine ganze Zahl darzustellen. Unser Lastkraftwaren würde dann eine Lochblende mit einem Durchmesser von 4382 Mikrometern benötigen. Betrachten wir diesen Wert, dann stellen wir fest, das 4400 Mikrometer, oder 4.4 Millimeter, immer noch genau genug ist. Zusätzlich können wir noch, unabhägig von der Größe eines Rechenergebnisses, festlegen, daß wir nur vier signifikante Stellen anzeigen wollen (oder weniger). Leider bietet uns die FPU nicht die Möglichkeit, das Ergebnis automatisch bis auf eine bestimmte Stelle zu runden (sie sieht die Daten ja nicht als Zahlen, sondern als binäre Daten an). Wir müssen also selber einen Algorithmus entwerfen, um die Anzahl der signifikanten Stellen zu reduzieren. Hier ist meiner (ich denke er ist peinlich—wenn Ihnen ein besserer Algorithmus einfällt, verraten sie ihn mir bitte): Initialisiere einen Zähler mit 0. Solange die Zahl größer oder gleich 10000 ist, dividiere die Zahl durch 10, und erhöhe den Zähler um eins. Gebe das Ergebnis aus. Solange der Zähler größer als 0 ist, gebe eine 0 aus, und reduziere den Zähler um eins. Der Wert 10000 ist nur für den Fall, daß Sie vier signifikante Stellen haben wollen. Für eine andere Anzahl signifikanter Stellen müssen Sie den Wert 10000 mit 10, hoch der Anzahl der gewünschten signifikanten Stellen, ersetzen. Wir können so den Lochblendendurchmesser, auf vier signifikante Stellen gerundet, ausgeben. An dieser Stellen kennen wir nun die Brennweite und den Lochblendendurchmesser. Wir haben also jetzt genug Informationen, um den f–Wert zu bestimmen. Wir werden den f–Wert, auf vier signifikante Stellen gerundet, ausgeben. Es könnte passieren, daß diese vier Stellen recht wenig aussagen. Um die Aussagekraft des f–Wertes zu erhöhen, könnten wir den nächstliegenden, normalisierten f–Wert bestimmen, also z.B. das nächstliegende Vielfache der Quadratwurzel aus 2. Wir erreichen dies, indem wir den aktuellen f–Wert mit sich selbst multiplizieren, so daß wir dessen Quadrat (square) erhalten. Anschließend berechnen wir den Logarithmus zur Basis 2 von dieser Zahl. Dies ist sehr viel einfacher, als direkt den Logarithmus zur Basis der Quadratwurzel aus 2 zu berechnen! Wir runden dann das Ergebnis auf die nächstliegende ganze Zahl. Genau genommen können wir mit Hilfe der FPU diese Berechnung beschleunigen: Wir können den op-Code fscale verwenden, um eine Zahl um 1 zu "skalieren", was dasselbe ist, wie eine Zahl mittels shift um eine Stelle nach links zu verschieben. Am Ende berechnen wir noch die Quadratwurzel aus allem, und erhalten dann den nächstliegenden, normalisierten f–Wert. Wenn das alles jetzt viel zu kompliziert wirkt—oder viel zu aufwendig—wird es vielleicht klarer, wenn man den Code selber betrachtet. Wir benötigen insgesamt 9 op-Codes: fmul st0, st0 fld1 fld st1 fyl2x frndint fld1 fscale fsqrt fstp st1 Die erste Zeile, fmul st0, st0, quadriert den Inhalt des TOS (Top Of Stack, was dasselbe ist wie st, von nasm auch st0 genannt). Die Funktion fld1 fügt eine 1 dem TOS hinzu. Die nächste Zeile, fld st1, legt das Quadrat auf dem TOS ab. An diesem Punkt befindet sich das Quadrat sowohl in st als auch in st(2) (es wird sich gleich zeigen, warum wir eine zweite Kopie auf dem Stack lassen.) st(1) enthält die 1. Im nächsten Schritt, fyl2x, wird der Logarithmus von st zur Basis 2 berechnet, und anschließend mit st(1) multipliziert. Deshalb haben wir vorher die 1 in st(1) abgelegt. An dieser Stelle enthält st den gerade berechneten Logarithmus, und st(1) das Quadrat des aktuellen f–Wertes, den wir für später gespeichert haben. frndint rundet den TOS zur nächstliegenden ganzen Zahl. fld1 legt eine 1 auf dem Stack ab. fscale shiftet die 1 auf dem TOS um st(1) Stellen, wodurch im Endeffekt eine 2 in st(1) steht. Schließlich berechnet fsqrt die Quadratwurzel des Rechenergebnisses, also des nächstliegenden, normalisierten f–Wertes. Wir haben nun den nächstliegenden, normalisierten f–Wert auf dem TOS liegen, den auf den Logarithmus zur Basis 2 gerundeten, nächstliegenden ganzzahligen Wert in st(1), und das Quadrat des aktuellen f–Wertes in st(2). Wir speichern den Wert für eine spätere Verwendung in st(2). Aber wir brauchen den Inhalt von st(1) gar nicht mehr. Die letzte Zeile, fstp st1, plaziert den Inhalt von st in st(1), und erniedrigt den Stackpointer um eins. Dadurch ist der Inhalt von st(1) jetzt st, der Inhalt von st(2) jetzt st(1) usw. Der neue st speichert jetzt den normalisierten f–Wert. Der neue st(1) speichert das Quadrat des aktuellen f–Wertes für die Nachwelt. Jetzt können wir den normalisierten f–Wert ausgeben. Da er normalisiert ist, werden wir ihn nicht auf vier signifikante Stellen runden, sondern stattdessen mit voller Genauigkeit ausgeben. Der normalisierte f–Wert ist nützlich, solange er so klein ist, daß wir ihn auf einem Photometer wiederfinden können. Ansonsten brauchen wir eine andere Methode, um die benötigten Belichtungsdaten zu bestimmen. Wir haben weiter oben eine Formel aufgestellt, über die wir einen f–Wert mit Hilfe eines anderen f–Wertes und den zugehörigen Belichtungsdaten bestimmen können. Jedes Photometer, das ich jemals gesehen habe, konnte die benötigte Belichtungszeit für f5.6 berechnen. Wir werden daher einen "f5.6 Multiplizierer" berechnen, der uns den Faktor angibt, mit dem wir die bei f5.6 gemessene Belichtungszeit für unsere Lochkamera multiplizieren müssen. Durch die Formel wissen wir, daß dieser Faktor durch Dividieren unseres f–Wertes (der aktuelle Wert, nicht der normalisierte) durch 5.6 und anschließendes Quadrieren, berechnen können. Mathematisch äquivalent dazu wäre, wenn wir das Quadrat unseres f–Wertes durch das Quadrat von 5.6 dividieren würden. Numerisch betrachtet wollen wir nicht zwei Zahlen quadrieren, wenn es möglich ist, nur eine Zahl zu quadrieren. Daher wirkt die erste Variante auf den ersten Blick besser. Aber... 5.6 ist eine Konstante. Wir müssen nicht wertvolle Rechenzeit der FPU verschwenden. Es reicht aus, daß wir die Quadrate der einzelnen f–Werte durch den konstanten Wert 5.6² dividieren. Oder wir können den jeweiligen f–Wert durch 5.6 dividieren, und dann das Ergebnis quadrieren. Zwei Möglichkeiten, die gleich erscheinen. Aber das sind sie nicht! Erinnern wir uns an die Grundlagen der Photographie weiter oben, dann wissen wir, daß sich die Konstante 5.6 aus dem 5-fachen der Quadratwurzel aus 2 ergibt. Eine irrationale Zahl. Das Quadrat dieser Zahl ist exakt 32. 32 ist nicht nur eine ganze Zahl, sondern auch ein Vielfaches von 2. Wir brauchen also gar nicht das Quadrat eines f–Wertes durch 32 zu teilen. Wir müssen lediglich mittels fscale den f–Wert um fünf Stellen nach rechts shiften. Aus Sicht der FPU müssen wir also fscale mit st(1), welcher gleich -5 ist, auf den f–Wert anwenden. Dies ist sehr viel schneller als die Division. Jetzt wird es auch klar, warum wir das Quadrat des f–Wertes ganz oben auf dem Stack der FPU gespeichert haben. Die Berechnung des f5.6 Multiplizierers ist die einfachste Berechnung des gesamten Programmes! Wir werden das Ergebnis auf vier signifikante Stellen gerundet ausgeben. Es gibt noch eine weitere nützliche Zahl, die wir berechnen können: Die Anzahl der Stopps, die unser f–Wert von f5.6 entfernt ist. Dies könnte hilfreich sein, wenn unser f–Wert außerhalb des Meßbereiches unseres Photometers liegt, wir aber eine Blende haben, bei der wir unterschiedliche Geschwindigkeiten einstellen können, und diese Blende Stopps benutzt. Angenommen, unser f–Wert ist 5 Stopps von f5.6 entfernt, und unser Photometer sagt uns, daß wir eine Belichtungszeit von 1/1000 Sek. einstellen sollen. Dann können wir unsere Blende auf die Geschwindigkeit 1/1000 einstellen, und unsere Skala um 5 Stopps verschieben. Diese Rechnung ist ebenfalls sehr einfach. Alles, was wir tun müssen, ist, den Logarithmus des f5.6 Multiplizierers, den wir schon berechnet haben (wobei wir dessen Wert vor der Rundung nehmen müssen) zur Basis 2 zu nehmen. Wir runden dann das Ergebnis zur nächsten ganzen Zahl hin, und geben dies aus. Wir müssen uns nicht darum kümmern, ob wir mehr als vier signifikante Stellen haben: Das Ergebnis besteht höchstwahrscheinlich nur aus einer oder zwei Stellen. FPU Optimierungen In Assemblersprache können wir den Code für die FPU besser optimieren, als in einer der Hochsprachen, inklusive C. Sobald eine C-Funktion die Berechnung einer Fließkommazahl durchführen will, lädt sie erst einmal alle benötigten Variablen und Konstanten in die Register der FPU. Dann werden die Berechnungen durchgeführt, um das korrekte Ergebnis zu erhalten. Gute C-Compiler können diesen Teil des Codes sehr gut optimieren. Das Ergebnis wird "zurückgegeben", indem dieses auf dem TOS abgelegt wird. Vorher wird aufgeräumt. Sämtliche Variablen und Konstanten, die während der Berechnung verwendet wurden, werden dabei aus der FPU entfernt. Was wir im vorherigen Abschnitt selber getan haben, kann so nicht durchgeführt werden: Wir haben das Quadrat des f–Wertes berechnet, und das Ergebnis für eine weitere Berechnung mit einer anderen Funktion auf dem Stack behalten. Wir wußten, daß wir diesen Wert später noch einmal brauchen würden. Wir wußten auch, daß auf dem Stack genügend Platz war (welcher nur Platz für 8 Zahlen bietet), um den Wert dort zu speichern. Ein C-Compiler kann nicht wissen, ob ein Wert auf dem Stack in naher Zukunft noch einmal gebraucht wird. Natürlich könnte der C-Programmierer dies wissen. Aber die einzige Möglichkeit, die er hat, ist, den Wert im verfügbaren Speicher zu halten. Das bedeutet zum einen, daß der Wert mit der FPU-internen, 80-stelligen Genauigkeit in einer normalen C-Variable vom Typ double (64 Bit) oder vom Typ single (32 Bit) gespeichert wird. Dies bedeutet außerdem, daß der Wert aus dem TOS in den Speicher verschoben werden muß, und später wieder zurück. Von allen Operationen mit der FPU ist der Zugriff auf den Speicher die langsamste. Wann immer also mit der FPU in einer Assemblersprache programmiert wird, sollte nach Möglichkeiten gesucht werden, Zwischenergebnisse auf dem Stack der FPU zu lassen. Wir können mit dieser Idee noch einen Schritt weiter gehen! In unserem Programm verwenden wir eine Konstante (die wir PC genannt haben). Es ist unwichtig, wieviele Lochblendendurchmesser wir berechnen: 1, 10, 20, 1000, wir verwenden immer dieselbe Konstante. Daher können wir unser Programm so optimieren, daß diese Konstante immer auf dem Stack belassen wird. Am Anfang unseres Programmes berechnen wir die oben erwähnte Konstante. Wir müssen die Eingabe für jede Dezimalstelle der Konstanten durch 10 dividieren. Multiplizieren geht sehr viel schneller als Dividieren. Wir teilen also zu Beginn unseres Programmes 1 durch 10, um 0.1 zu erhalten, was wir auf dem Stack speichern: Anstatt daß wir nun für jede einzelne Dezimalstelle die Eingabe wieder durch 10 teilen, multiplizieren wir sie stattdessen mit 0.1. Auf diese Weise geben wir 0.1 nicht direkt ein, obwohl wir dies könnten. Dies hat einen Grund: Während 0.1 durch nur eine einzige Dezimalstelle dargestellt werden kann, wissen wir nicht, wieviele binäre Stellen benötigt werden. Wir überlassen die Berechnung des binären Wertes daher der FPU, mit dessen eigener, hoher Genauigkeit. Wir verwenden noch weitere Konstanten: Wir multiplizieren den Lochblendendurchmesser mit 1000, um den Wert von Millimeter in Micrometer zu konvertieren. Wir vergleichen Werte mit 10000, wenn wir diese auf vier signifikante Stellen runden wollen. Wir behalten also beide Konstanten, 1000 und 10000, auf dem Stack. Und selbstverständlich verwenden wir erneut die gespeicherte 0.1, um Werte auf vier signifikante Stellen zu runden. Zu guter letzt behalten wir -5 noch auf dem Stack. Wir brauchen diesen Wert, um das Quadrat des f–Wertes zu skalieren, anstatt diesen durch 32 zu teilen. Es ist kein Zufall, daß wir diese Konstante als letztes laden. Dadurch wird diese Zahl die oberste Konstante auf dem Stack. Wenn später das Quadrat des f–Wertes skaliert werden muß, befindet sich die -5 in st(1), also genau da, wo die Funktion fscale diesen Wert erwartet. Es ist üblich, einige Konstanten per Hand zu erzeugen, anstatt sie aus dem Speicher zu laden. Genau das machen wir mit der -5: fld1 ; TOS = 1 fadd st0, st0 ; TOS = 2 fadd st0, st0 ; TOS = 4 fld1 ; TOS = 1 faddp st1, st0 ; TOS = 5 fchs ; TOS = -5 Wir können all diese Optimierungen in einer Regel zusammenfassen: Behalte wiederverwendbare Werte auf dem Stack! &postscript; ist eine Stack-orientierte Programmiersprache. Es gibt weit mehr Bücher über &postscript;, als über die Assemblersprache der FPU: Werden Sie in &postscript; besser, dann werden Sie auch automatisch in der Programmierung der FPU besser. <application>pinhole</application>—Der Code ;;;;;;; pinhole.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Find various parameters of a pinhole camera construction and use ; ; Started: 9-Jun-2001 ; Updated: 10-Jun-2001 ; ; Copyright (c) 2001 G. Adam Stanislav ; All rights reserved. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %include 'system.inc' %define BUFSIZE 2048 section .data align 4 ten dd 10 thousand dd 1000 tthou dd 10000 fd.in dd stdin fd.out dd stdout envar db 'PINHOLE=' ; Exactly 8 bytes, or 2 dwords long pinhole db '04,', ; Bender's constant (0.04) connors db '037', 0Ah ; Connors' constant usg db 'Usage: pinhole [-b] [-c] [-e] [-p <value>] [-o <outfile>] [-i <infile>]', 0Ah usglen equ $-usg iemsg db "pinhole: Can't open input file", 0Ah iemlen equ $-iemsg oemsg db "pinhole: Can't create output file", 0Ah oemlen equ $-oemsg pinmsg db "pinhole: The PINHOLE constant must not be 0", 0Ah pinlen equ $-pinmsg toobig db "pinhole: The PINHOLE constant may not exceed 18 decimal places", 0Ah biglen equ $-toobig huhmsg db 9, '???' separ db 9, '???' sep2 db 9, '???' sep3 db 9, '???' sep4 db 9, '???', 0Ah huhlen equ $-huhmsg header db 'focal length in millimeters,pinhole diameter in microns,' db 'F-number,normalized F-number,F-5.6 multiplier,stops ' db 'from F-5.6', 0Ah headlen equ $-header section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE dbuffer resb 20 ; decimal input buffer bbuffer resb 10 ; BCD buffer section .text align 4 huh: call write push dword huhlen push dword huhmsg push dword [fd.out] sys.write add esp, byte 12 ret align 4 perr: push dword pinlen push dword pinmsg push dword stderr sys.write push dword 4 ; return failure sys.exit align 4 consttoobig: push dword biglen push dword toobig push dword stderr sys.write push dword 5 ; return failure sys.exit align 4 ierr: push dword iemlen push dword iemsg push dword stderr sys.write push dword 1 ; return failure sys.exit align 4 oerr: push dword oemlen push dword oemsg push dword stderr sys.write push dword 2 sys.exit align 4 usage: push dword usglen push dword usg push dword stderr sys.write push dword 3 sys.exit align 4 global _start _start: add esp, byte 8 ; discard argc and argv[0] sub esi, esi .arg: pop ecx or ecx, ecx je near .getenv ; no more arguments ; ECX contains the pointer to an argument cmp byte [ecx], '-' jne usage inc ecx mov ax, [ecx] inc ecx .o: cmp al, 'o' jne .i ; Make sure we are not asked for the output file twice cmp dword [fd.out], stdout jne usage ; Find the path to output file - it is either at [ECX+1], ; i.e., -ofile -- ; or in the next argument, ; i.e., -o file or ah, ah jne .openoutput pop ecx jecxz usage .openoutput: push dword 420 ; file mode (644 octal) push dword 0200h | 0400h | 01h ; O_CREAT | O_TRUNC | O_WRONLY push ecx sys.open jc near oerr add esp, byte 12 mov [fd.out], eax jmp short .arg .i: cmp al, 'i' jne .p ; Make sure we are not asked twice cmp dword [fd.in], stdin jne near usage ; Find the path to the input file or ah, ah jne .openinput pop ecx or ecx, ecx je near usage .openinput: push dword 0 ; O_RDONLY push ecx sys.open jc near ierr ; open failed add esp, byte 8 mov [fd.in], eax jmp .arg .p: cmp al, 'p' jne .c or ah, ah jne .pcheck pop ecx or ecx, ecx je near usage mov ah, [ecx] .pcheck: cmp ah, '0' jl near usage cmp ah, '9' ja near usage mov esi, ecx jmp .arg .c: cmp al, 'c' jne .b or ah, ah jne near usage mov esi, connors jmp .arg .b: cmp al, 'b' jne .e or ah, ah jne near usage mov esi, pinhole jmp .arg .e: cmp al, 'e' jne near usage or ah, ah jne near usage mov al, ',' mov [huhmsg], al mov [separ], al mov [sep2], al mov [sep3], al mov [sep4], al jmp .arg align 4 .getenv: ; If ESI = 0, we did not have a -p argument, ; and need to check the environment for "PINHOLE=" or esi, esi jne .init sub ecx, ecx .nextenv: pop esi or esi, esi je .default ; no PINHOLE envar found ; check if this envar starts with 'PINHOLE=' mov edi, envar mov cl, 2 ; 'PINHOLE=' is 2 dwords long rep cmpsd jne .nextenv ; Check if it is followed by a digit mov al, [esi] cmp al, '0' jl .default cmp al, '9' jbe .init ; fall through align 4 .default: ; We got here because we had no -p argument, ; and did not find the PINHOLE envar. mov esi, pinhole ; fall through align 4 .init: sub eax, eax sub ebx, ebx sub ecx, ecx sub edx, edx mov edi, dbuffer+1 mov byte [dbuffer], '0' ; Convert the pinhole constant to real .constloop: lodsb cmp al, '9' ja .setconst cmp al, '0' je .processconst jb .setconst inc dl .processconst: inc cl cmp cl, 18 ja near consttoobig stosb jmp short .constloop align 4 .setconst: or dl, dl je near perr finit fild dword [tthou] fld1 fild dword [ten] fdivp st1, st0 fild dword [thousand] mov edi, obuffer mov ebp, ecx call bcdload .constdiv: fmul st0, st2 loop .constdiv fld1 fadd st0, st0 fadd st0, st0 fld1 faddp st1, st0 fchs ; If we are creating a CSV file, ; print header cmp byte [separ], ',' jne .bigloop push dword headlen push dword header push dword [fd.out] sys.write .bigloop: call getchar jc near done ; Skip to the end of the line if you got '#' cmp al, '#' jne .num call skiptoeol jmp short .bigloop .num: ; See if you got a number cmp al, '0' jl .bigloop cmp al, '9' ja .bigloop ; Yes, we have a number sub ebp, ebp sub edx, edx .number: cmp al, '0' je .number0 mov dl, 1 .number0: or dl, dl ; Skip leading 0's je .nextnumber push eax call putchar pop eax inc ebp cmp ebp, 19 jae .nextnumber mov [dbuffer+ebp], al .nextnumber: call getchar jc .work cmp al, '#' je .ungetc cmp al, '0' jl .work cmp al, '9' ja .work jmp short .number .ungetc: dec esi inc ebx .work: ; Now, do all the work or dl, dl je near .work0 cmp ebp, 19 jae near .toobig call bcdload ; Calculate pinhole diameter fld st0 ; save it fsqrt fmul st0, st3 fld st0 fmul st5 sub ebp, ebp ; Round off to 4 significant digits .diameter: fcom st0, st7 fstsw ax sahf jb .printdiameter fmul st0, st6 inc ebp jmp short .diameter .printdiameter: call printnumber ; pinhole diameter ; Calculate F-number fdivp st1, st0 fld st0 sub ebp, ebp .fnumber: fcom st0, st6 fstsw ax sahf jb .printfnumber fmul st0, st5 inc ebp jmp short .fnumber .printfnumber: call printnumber ; F number ; Calculate normalized F-number fmul st0, st0 fld1 fld st1 fyl2x frndint fld1 fscale fsqrt fstp st1 sub ebp, ebp call printnumber ; Calculate time multiplier from F-5.6 fscale fld st0 ; Round off to 4 significant digits .fmul: fcom st0, st6 fstsw ax sahf jb .printfmul inc ebp fmul st0, st5 jmp short .fmul .printfmul: call printnumber ; F multiplier ; Calculate F-stops from 5.6 fld1 fxch st1 fyl2x sub ebp, ebp call printnumber mov al, 0Ah call putchar jmp .bigloop .work0: mov al, '0' call putchar align 4 .toobig: call huh jmp .bigloop align 4 done: call write ; flush output buffer ; close files push dword [fd.in] sys.close push dword [fd.out] sys.close finit ; return success push dword 0 sys.exit align 4 skiptoeol: ; Keep reading until you come to cr, lf, or eof call getchar jc done cmp al, 0Ah jne .cr ret .cr: cmp al, 0Dh jne skiptoeol ret align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx clc ret read: jecxz .read call write .read: push dword BUFSIZE mov esi, ibuffer push esi push dword [fd.in] sys.read add esp, byte 12 mov ebx, eax or eax, eax je .empty sub eax, eax ret align 4 .empty: add esp, byte 4 stc ret align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: jecxz .ret ; nothing to write sub edi, ecx ; start of buffer push ecx push edi push dword [fd.out] sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now .ret: ret align 4 bcdload: ; EBP contains the number of chars in dbuffer push ecx push esi push edi lea ecx, [ebp+1] lea esi, [dbuffer+ebp-1] shr ecx, 1 std mov edi, bbuffer sub eax, eax mov [edi], eax mov [edi+4], eax mov [edi+2], ax .loop: lodsw sub ax, 3030h shl al, 4 or al, ah mov [edi], al inc edi loop .loop fbld [bbuffer] cld pop edi pop esi pop ecx sub eax, eax ret align 4 printnumber: push ebp mov al, [separ] call putchar ; Print the integer at the TOS mov ebp, bbuffer+9 fbstp [bbuffer] ; Check the sign mov al, [ebp] dec ebp or al, al jns .leading ; We got a negative number (should never happen) mov al, '-' call putchar .leading: ; Skip leading zeros mov al, [ebp] dec ebp or al, al jne .first cmp ebp, bbuffer jae .leading ; We are here because the result was 0. ; Print '0' and return mov al, '0' jmp putchar .first: ; We have found the first non-zero. ; But it is still packed test al, 0F0h jz .second push eax shr al, 4 add al, '0' call putchar pop eax and al, 0Fh .second: add al, '0' call putchar .next: cmp ebp, bbuffer jb .done mov al, [ebp] push eax shr al, 4 add al, '0' call putchar pop eax and al, 0Fh add al, '0' call putchar dec ebp jmp short .next .done: pop ebp or ebp, ebp je .ret .zeros: mov al, '0' call putchar dec ebp jne .zeros .ret: ret Der Code folgt demselben Aufbau wie alle anderen Filter, die wir bisher gesehen haben, bis auf eine Kleinigkeit:
Wir nehmen nun nicht mehr an, daß das Ende der Eingabe auch das Ende der nötigen Arbeit bedeutet, etwas, das wir für zeichenbasierte Filter automatisch angenommen haben. Dieser Filter verarbeitet keine Zeichen. Er verarbeitet eine Sprache (obgleich eine sehr einfache, die nur aus Zahlen besteht). Wenn keine weiteren Eingaben vorliegen, kann das zwei Ursachen haben: Wir sind fertig und können aufhören. Dies ist dasselbe wie vorher. Das Zeichen, das wir eingelesen haben, war eine Zahl. Wir haben diese am Ende unseres ASCII –zu–float Kovertierungspuffers gespeichert. Wir müssen nun den gesamten Pufferinhalt in eine Zahl konvertieren, und die letzte Zeile unserer Ausgabe ausgeben. Aus diesem Grund haben wir unsere getchar - und read-Routinen so angepaßt, daß sie das carry flag clear immer dann zurückgeben, wenn wir ein weiteres Zeichen aus der Eingabe lesen, und das carry flag set immer dann zurückgeben, wenn es keine weiteren Eingabedaten gibt. Selbstverständlich verwenden wir auch hier die Magie der Assemblersprache! Schauen Sie sich getchar näher an. Dieses gibt immer das carry flag clear zurück. Dennoch basiert der Hauptteil unseres Programmes auf dem carry flag, um diesem eine Beendigung mitzuteilen—und es funktioniert. Die Magie passiert in read. Wann immer weitere Eingaben durch das System zur Verfügung stehen, ruft diese Funktion getchar auf, welche ein weiteres Zeichen aus dem Eingabepuffer einliest, und anschließend das carry flag cleart. Wenn aber read keine weiteren Eingaben von dem System bekommt, ruft dieses nicht getchar auf. Stattdessen addiert der op-Code add esp, byte 4 4 zu ESP hinzu, setzt das carry flag, und springt zurück. Wo springt diese Funktion hin? Wann immer ein Programm den op-Code call verwendet, pusht der Mikroprozessor die Rücksprungandresse, d.h. er speichert diese ganz oben auf dem Stack (nicht auf dem Stack der FPU, sondern auf dem Systemstack, der sich im Hauptspeicher befindet). Wenn ein Programm den op-Code ret verwendet, popt der Mikroprozessor den Rückgabewert von dem Stack, und springt zu der Adresse, die dort gespeichert wurde. Da wir aber 4 zu ESP hinzuaddiert haben (welches das Register der Stackzeiger ist), haben wir effektiv dem Mikroprzessor eine kleine Amnesie verpaßt: Dieser erinnert sich nun nicht mehr daran, daß getchar durch read aufgerufen wurde. Und da getchar nichts vor dem Aufruf von read auf dem Stack abgelegt hat, enthält der Anfang des Stacks nun die Rücksprungadresse von der Funktion, die getchar aufgerufen hat. Soweit es den Aufrufer betrifft, hat dieser getchar gecallt, welche mit einem gesetzten carry flag returned.
Des weiteren wird die Routine bcdload bei einem klitzekleinen Problem zwischen der Big–Endian- und Little–Endian-Codierung aufgerufen. Diese konvertiert die Textrepräsentation einer Zahl in eine andere Textrepräsentation: Der Text wird in der Big–Endian-Codierung gespeichert, die packed decimal-Darstellung jedoch in der Little–Endian-Codierung. Um dieses Problem zu lösen haben wir vorher den op-Code std verwendet. Wir machen diesen Aufruf später mittels cld wieder rückgängig: Es ist sehr wichtig, daß wir keine Funktion mittels call aufrufen, die von einer Standardeinstellung des Richtungsflags abhängig ist, während std ausgeführt wird. Alles weitere in dem Programm sollte leicht zu verstehen sein, vorausgesetzt, daß Sie das gesamte vorherige Kapitel gelesen haben. Es ist ein klassisches Beispiel für das Sprichwort, daß das Programmieren eine Menge Denkarbeit, und nur ein wenig Programmcode benötigt. Sobald wir uns über jedes Detail im klaren sind, steht der Code fast schon da.
Das Programm <application>pinhole</application> verwenden Da wir uns bei dem Programm dafür entschieden haben, alle Eingaben, die keine Zahlen sind, zu ignorieren (selbst die in Kommentaren), können wir jegliche textbasierten Eingaben verarbeiten. Wir müssen dies nicht tun, wir könnten aber. Meiner bescheidenen Meinung nach wird ein Programm durch die Möglichkeit, anstatt einer strikten Eingabesyntax textbasierte Anfragen stellen zu können, sehr viel benutzerfreundlicher. Angenommen, wir wollten eine Lochkamera für einen 4x5 Zoll Film bauen. Die standardmäßige Brennweite für diesen Film ist ungefähr 150mm. Wir wollen diesen Wert optimieren, so daß der Lochblendendurchmesser eine möglichst runde Zahl ergibt. Lassen Sie uns weiter annehmen, daß wir zwar sehr gut mit Kameras umgehen können, dafür aber nicht so gut mit Computern. Anstatt das wir nun eine Reihe von Zahlen eingeben, wollen wir lieber ein paar Fragen stellen. Unsere Sitzung könnte wie folgt aussehen: &prompt.user; pinhole Computer, Wie groß müßte meine Lochblende bei einer Brennweite von 150 sein? 150 490 306 362 2930 12 Hmmm... Und bei 160? 160 506 316 362 3125 12 Laß uns bitte 155 nehmen. 155 498 311 362 3027 12 Ah, laß uns 157 probieren... 157 501 313 362 3066 12 156? 156 500 312 362 3047 12 Das ist es! Perfekt! Vielen Dank! ^D Wir haben herausgefunden, daß der Lochblendendurchmesser bei einer Brennweite von 150 mm 490 Mikrometer, oder 0.49 mm ergeben würde. Bei einer fast identischen Brennweite von 156 mm würden wir einen Durchmesser von genau einem halben Millimeter bekommen. Skripte schreiben Da wir uns dafür entschieden haben, das Zeichen # als den Anfang eines Kommentares zu interpretieren, können wir unser pinhole-Programm auch als Skriptsprache verwenden. Sie haben vielleicht schon einmal shell-Skripte gesehen, die mit folgenden Zeichen begonnen haben: #! /bin/sh ...oder... #!/bin/sh ... da das Leerzeichen hinter dem #! optional ist. Wann immer &unix; eine Datei ausführen soll, die mit einem #! beginnt, wird angenommen, das die Datei ein Skript ist. Es fügt den Befehl an das Ende der ersten Zeile an, und versucht dann, dieses auszuführen. Angenommen, wir haben unser Programm pinhole unter /usr/local/bin/ installiert, dann können wir nun Skripte schreiben, um unterschiedliche Lochblendendurchmesser für mehrere Brennweiten zu berechnen, die normalerweise mit 120er Filmen verwendet werden. Das Skript könnte wie folgt aussehen: #! /usr/local/bin/pinhole -b -i # Find the best pinhole diameter # for the 120 film ### Standard 80 ### Wide angle 30, 40, 50, 60, 70 ### Telephoto 100, 120, 140 Da ein 120er Film ein Film mittlerer Größe ist, könnten wir die Datei medium nennen. Wir können die Datei ausführbar machen und dann aufrufen, als wäre es ein Programm: &prompt.user; chmod 755 medium &prompt.user; ./medium &unix; wird den letzten Befehl wie folgt interpretieren: &prompt.user; /usr/local/bin/pinhole -b -i ./medium Es wird den Befehl ausführen und folgendes ausgeben: 80 358 224 256 1562 11 30 219 137 128 586 9 40 253 158 181 781 10 50 283 177 181 977 10 60 310 194 181 1172 10 70 335 209 181 1367 10 100 400 250 256 1953 11 120 438 274 256 2344 11 140 473 296 256 2734 11 Lassen Sie uns nun das folgende eingeben: &prompt.user; ./medium -c &unix; wird dieses wie folgt behandeln: &prompt.user; /usr/local/bin/pinhole -b -i ./medium -c Dadurch erhält das Programm zwei widersprüchliche Optionen: -b und -c (Verwende Benders Konstante und verwende Connors Konstante). Wir haben unser Programm so geschrieben, daß später eingelesene Optionen die vorheringen überschreiben—unser Programm wird also Connors Konstante für die Berechnungen verwenden: 80 331 242 256 1826 11 30 203 148 128 685 9 40 234 171 181 913 10 50 262 191 181 1141 10 60 287 209 181 1370 10 70 310 226 256 1598 11 100 370 270 256 2283 11 120 405 296 256 2739 11 140 438 320 362 3196 12 Wir entscheiden uns am Ende doch für Benders Konstante. Wir wollen die Ergebnisse im CSV-Format in einer Datei speichern: &prompt.user; ./medium -b -e > bender &prompt.user; cat bender focal length in millimeters,pinhole diameter in microns,F-number,normalized F-number,F-5.6 multiplier,stops from F-5.6 80,358,224,256,1562,11 30,219,137,128,586,9 40,253,158,181,781,10 50,283,177,181,977,10 60,310,194,181,1172,10 70,335,209,181,1367,10 100,400,250,256,1953,11 120,438,274,256,2344,11 140,473,296,256,2734,11 &prompt.user;
Daniel Seuffert Übersetzt von Vorsichtsmassnahmen Assembler-Programmierer, die aufwuchsen mit &ms-dos; und windows &windows; neigen oft dazu Shotcuts zu verwenden. Das Lesen der Tastaur-Scancodes und das direkte Schreiben in den Grafikspeicher sind zwei klassische Beispiele von Gewohnheiten, die unter &ms-dos; nicht verpönt sind, aber nicht als richtig angesehen werden. Warum dies? Sowohl das PC-BIOS als auch &ms-dos; sind notorisch langsam bei der Ausführung dieser Operationen. Sie mögen versucht sein ähnliche Angewohnheiten in der &unix;-Umgebung fortzuführen. Zum Beispiel habe ich eine Webseite gesehen, welche erklärt, wie man auf einem beliebten &unix;-Ableger die Tastatur-Scancodes verwendet. Das ist generell eine sehr schlechte Idee in einer &unix;-Umgebung! Lassen Sie mich erklären warum. &unix; ist geschützt Zum Einen mag es schlicht nicht möglich sein. &unix; läuft im Protected Mode. Nur der Kernel und Gerätetreiber dürfen direkt auf die Hardware zugreifen. Unter Umständen erlaubt es Ihnen ein bestimmter &unix;-Ableger Tastatur-Scancodes auszulesen, aber ein wirkliches &unix;-Betriebssystem wird dies zu verhindern wissen. Und falls eine Version es Ihnen erlaubt wird es eine andere nicht tun, daher kann eine sorgfältig erstellte Software über Nacht zu einem überkommenen Dinosaurier werden. &unix; ist eine Abstraktion Aber es gibt einen viel wichtigeren Grund, weshalb Sie nicht versuchen sollten, die Hardware direkt anzusprechen (natürlich nicht, wenn Sie einen Gerätetreiber schreiben), selbst auf den &unix;-ähnlichen Systemen, die es Ihnen erlauben: &unix; ist eine Abstraktion! Es gibt einen wichtigen Unterschied in der Design-Philosophie zwischen &ms-dos; und &unix;. &ms-dos; wurde entworfen als Einzelnutzer-System. Es läuft auf einem Rechner mit einer direkt angeschlossenen Tastatur und einem direkt angeschlossenem Bildschirm. Die Eingaben des Nutzers kommen nahezu immer von dieser Tastatur. Die Ausgabe Ihres Programmes erscheint fast immer auf diesem Bildschirm. Dies ist NIEMALS garantiert unter &unix;. Es ist sehr verbreitet für ein &unix;, daß der Nutzer seine Aus- und Eingaben kanalisiert und umleitet: &prompt.user; program1 | program2 | program3 > file1 Falls Sie eine Anwendung program2 geschrieben haben, kommt ihre Eingabe nicht von der Tastatur, sondern von der Ausgabe von program1. Gleichermassen geht Ihre Ausgabe nicht auf den Bildschirm, sondern wird zur Eingabe für program3, dessen Ausgabe wiederum in file1 endet. Aber es gibt noch mehr! Selbst wenn Sie sichergestellt haben, daß Ihre Eingabe und Ausgabe zum Terminal kommt bzw. gelangt, dann ist immer noch nicht garantiert, daß ihr Terminal ein PC ist: Es mag seinen Grafikspeicher nicht dort haben, wo Sie ihn erwarten, oder die Tastatur könnte keine PC-ähnlichen Scancodes erzeugen können. Es mag ein &macintosh; oder irgendein anderer Rechner sein. Sie mögen nun den Kopf schütteln: Mein Programm ist in PC-Assembler geschrieben, wie kann es auf einem &macintosh; laufen? Aber ich habe nicht gesagt, daß Ihr Programm auf &macintosh; läuft, nur sein Terminal mag ein &macintosh; sein. Unter &unix; muß der Terminal nicht direkt am Rechner angeschlossen sein, auf dem die Software läuft, er kann sgar auf einem anderen Kontinent sein oder sogar auf einem anderen Planeten. Es ist nicht ungewöhnlich, daß ein &macintosh;-Nutzer in Australien sich auf ein &unix;-System in Nordamerika (oder sonstwo) mittels telnet verbindet. Die Software läuft auf einem Rechner während das Terminal sich auf einem anderen Rechner befindet: Falls Sie versuchen sollten die Scancodes auszulesen werden Sie die falschen Eingaben erhalten! Das Gleiche gilt für jede andere Hardware: Eine Datei, welche Sie einlesen, mag auf einem Laufwerk sein, auf das Sie keinen direkten Zugriff haben. Eine Kamera, deren Bilder Sie auslesen, befindet sich möglicherweise in einem Space Shuttle, durch Satelliten mit Ihnen verbunden. Das sind die Gründe, weshalb Sie niemals unter &unix; Annahmen treffen dürfen, woher Ihre Daten kommen oder gehen. Lassen Sie immer das System den physischen Zugriff auf die Hardware regeln. Das sind Vorsichtsmassnahmen, keine absoluten Regeln. Ausnahmen sind möglich. Wenn zum Beispiel ein Texteditor bestimmt hat, daß er auf einer lokalen Maschine läuft, dann mag er die Tastatur-Scancodes direkt auslesen, um eine bessere Kontrolle zu gewährleisten. Ich erwähne diese Vorsichtsmassnahmen nicht, um Ihnen zu sagen, was sie tun oder lassen sollen, ich will Ihnen nur bewusst machen, daß es bestimmte Fallstrcike gibt, die Sie erwarten, wenn Sie soeben ihn &unix; von &ms-dos; angelangt sind. Kreative Menschen brechen oft Regeln und das ist in Ordnung, solange sie wissen welche Regeln und warum. Daniel Seuffert Übersetzt von Danksagungen Dieses Handbuch wäre niemals möglich gewesen ohne die Hilfe vieler erfahrener FreeBSD-Programmierer aus &a.hackers;. Viele dieser Personen haben geduldig meine Fragen beantwortet und mich in die richtige Richtung gewiesen bei meinem Versuch, die tieferen liegenden Mechanismen der &unix;-Systemprogrammierung zu erforschen im Allgemeinen und bei FreeBSD im Besonderen. Thomas M. Sommers öffnete die Türen für mich. Seine Wie schreibe ich "Hallo Welt" in FreeBSD-Assembler? Webseite war mein erster Kontakt mit Assembler-Programmierung unter FreeBSD. Jake Burkholder hat die Tür offen gehalten durch das bereitwillige Beantworten all meiner Fragen und das Zurverfügungstellen von Assembler-Codebeispielen. Copyright © 2000-2001 G. Adam Stanislav. Alle Rechte vorbehalten.
diff --git a/de_DE.ISO8859-1/books/handbook/disks/chapter.sgml b/de_DE.ISO8859-1/books/handbook/disks/chapter.sgml index dfc9938112..5d7b8f7dcd 100644 --- a/de_DE.ISO8859-1/books/handbook/disks/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/disks/chapter.sgml @@ -1,4634 +1,4674 @@ Bernd Warken Übersetzt von Martin Heinen Speichermedien Übersicht Dieses Kapitel behandelt die Benutzung von Laufwerken unter FreeBSD. Laufwerke können speichergestützte Laufwerke, Netzwerklaufwerke oder normale SCSI/IDE-Geräte sein. Nachdem Sie dieses Kapitel gelesen haben, werden Sie Folgendes wissen: Die Begriffe, die FreeBSD verwendet, um die Organisation der Daten auf einem physikalischen Laufwerk zu beschreiben (Partitionen und Slices). Wie Sie ein weiteres Laufwerk zu Ihrem System hinzufügen. Wie virtuelle Dateisysteme, zum Beispiel RAM-Disks, eingerichtet werden. Wie Sie mit Quotas die Benutzung von Laufwerken einschränken können. Wie Sie Partitionen verschlüsseln, um Ihre Daten zu schützen. Wie unter FreeBSD CDs und DVDs gebrannt werden. Sie werden die Speichermedien, die Sie für Backups einsetzen können, kennen. Wie Sie die unter FreeBSD erhältlichen Backup Programme benutzen. Wie Sie ein Backup mit Disketten erstellen. Was Dateisystem-Schnappschüsse sind und wie sie eingesetzt werden. Bevor Sie dieses Kapitel lesen, sollten Sie einen einen &os;-Kernel installieren können (). Gerätenamen Die folgende Tabelle zeigt die von FreeBSD unterstützten Speichergeräte und deren Gerätenamen. Namenskonventionen von physikalischen Laufwerken Laufwerkstyp Gerätename IDE-Festplatten ad IDE-CD-ROM Laufwerke acd SCSI-Festplatten und USB-Speichermedien da SCSI-CD-ROM Laufwerke cd Verschiedene proprietäre CD-ROM-Laufwerke mcd Mitsumi CD-ROM und scd Sony CD-ROM Diskettenlaufwerke fd SCSI-Bandlaufwerke sa IDE-Bandlaufwerke ast Flash-Laufwerke fla für &diskonchip; Flash-Device RAID-Laufwerke aacd für &adaptec; AdvancedRAID, mlxd und mlyd für &mylex;, amrd für AMI &megaraid;, idad für Compaq Smart RAID, twed für &tm.3ware; RAID.
David O'Brian Im Original von Hinzufügen von Laufwerken Laufwerke hinzufügen Der folgende Abschnitt beschreibt, wie Sie ein neues SCSI-Laufwerk zu einer Maschine hinzufügen, die momentan nur ein Laufwerk hat. Dazu schalten Sie zuerst den Rechner aus und installieren das Laufwerk entsprechend der Anleitungen Ihres Rechners, Ihres Controllers und des Laufwerkherstellers. Den genauen Ablauf können wir wegen der großen Abweichungen leider nicht beschreiben. Nachdem Sie das Laufwerk installiert haben, melden Sie sich als Benutzer root an und kontrollieren Sie /var/run/dmesg.boot, um sicherzustellen, dass das neue Laufwerk gefunden wurde. Das neue Laufwerk wird, um das Beispiel fortzuführen, da1 heißen und soll unter /1 eingehängt werden. Fügen Sie eine IDE-Platte hinzu, wird diese den Namen ad1 erhalten. Partitionen Slices fdisk Da FreeBSD auf IBM-PC kompatiblen Rechnern läuft, muss es die PC BIOS-Partitionen, die verschieden von den traditionellen BSD-Partitionen sind, berücksichtigen. Eine PC Platte kann bis zu vier BIOS-Partitionen enthalten. Wenn die Platte ausschließlich für FreeBSD verwendet wird, können Sie den dedicated Modus benutzen, ansonsten muss FreeBSD in eine der BIOS-Partitionen installiert werden. In FreeBSD heißen die PC BIOS-Partitionen Slices, um sie nicht mit den traditionellen BSD-Partitionen zu verwechseln. Sie können auch Slices auf einer Platte verwenden, die ausschließlich von FreeBSD benutzt wird, sich aber in einem Rechner befindet, der noch ein anderes Betriebssystem installiert hat. Dadurch stellen Sie sicher, dass Sie fdisk des anderen Betriebssystems noch benutzen können. Im Fall von Slices wird die Platte als /dev/da1s1e hinzugefügt. Das heißt: SCSI-Platte, Einheit 1 (die zweite SCSI-Platte), Slice 1 (PC BIOS-Partition 1) und die e BSD-Partition. Wird die Platte ausschließlich für FreeBSD verwendet (dangerously dedicated), wird sie einfach als /dev/da1e hinzugefügt. Da &man.bsdlabel.8; zum Speichern von Sektoren 32-Bit Integer verwendet, ist das Werkzeug in den meisten Fällen auf 2^32-1 Sektoren pro Laufwerk oder 2 TB beschränkt. In &man.fdisk.8; darf der Startsektor nicht größer als 2^32-1 sein und Partitionen sind auf eine Länge von 2^32-1 beschränkt. In den meisten Fällen beschränkt dies die Größe einer Partition auf 2 TB und die maximale Größe eines Laufwerks auf 4 TB. Das &man.sunlabel.8;-Format ist mit 2^32-1 Sektoren pro Partition und 8 Partitionen auf 16 TB beschränkt. Mit größeren Laufwerken können &man.gpt.8;-Partitionen benutzt werden. Verwenden von &man.sysinstall.8; sysinstall hinzufügen von Laufwerken su Das <application>sysinstall</application> Menü Um ein Laufwerk zu partitionieren und zu labeln, kann das menügestützte sysinstall benutzt werden. Dazu melden Sie sich als root an oder benutzen su, um root zu werden. Starten Sie sysinstall und wählen das Configure Menü, wählen Sie dort den Punkt Fdisk aus. Partitionieren mit <application>fdisk</application> Innerhalb von fdisk geben Sie A ein, um die ganze Platte für FreeBSD zu benutzen. Beantworten Sie die Frage remain cooperative with any future possible operating systems mit YES. W schreibt die Änderung auf die Platte, danach können Sie fdisk mit Q verlassen. Da Sie eine Platte zu einem schon laufenden System hinzugefügt haben, beantworten Sie die Frage nach dem Master Boot Record mit None. Disk-Label-Editor BSD Partitionen Als nächstes müssen Sie sysinstall verlassen und es erneut starten. Folgen Sie dazu bitte den Anweisungen von oben, aber wählen Sie dieses Mal die Option Label, um in den Disk Label Editor zu gelangen. Hier werden die traditionellen BSD-Partitionen erstellt. Ein Laufwerk kann acht Partitionen, die mit den Buchstaben a-h gekennzeichnet werden, besitzen. Einige Partitionen sind für spezielle Zwecke reserviert. Die a Partition ist für die Root-Partition (/) reserviert. Deshalb sollte nur das Laufwerk, von dem gebootet wird, eine a Partition besitzen. Die b Partition wird für Swap-Partitionen benutzt, wobei Sie diese auf mehreren Platten benutzen dürfen. Im dangerously dedicated Modus spricht die c Partition die gesamte Platte an, werden Slices verwendet, wird damit die ganze Slice angesprochen. Die anderen Partitionen sind für allgemeine Zwecke verwendbar. Der Label Editor von sysinstall bevorzugt die e Partition für Partitionen, die weder Root-Partitionen noch Swap-Partitionen sind. Im Label Editor können Sie ein einzelnes Dateisystem mit C erstellen. Wählen Sie FS, wenn Sie gefragt werden, ob Sie ein FS (Dateisystem) oder Swap erstellen wollen, und geben Sie einen Mountpoint z.B. /mnt an. Wenn Sie nach einer FreeBSD-Installation ein Dateisystem mit sysinstall erzeugen, so werden die Einträge in /etc/fstab nicht erzeugt, so dass die Angabe des Mountpoints nicht wichtig ist. Sie können nun das Label auf das Laufwerk schreiben und das Dateisystem erstellen, indem Sie W drücken. Ignorieren Sie die Meldung von sysinstall, dass die neue Partition nicht angehangen werden konnte, und verlassen Sie den Label Editor sowie sysinstall. Ende Im letzten Schritt fügen Sie noch in /etc/fstab den Eintrag für das neue Laufwerk ein. Die Kommandozeile Anlegen von Slices Mit der folgenden Vorgehensweise wird eine Platte mit anderen Betriebssystemen, die vielleicht auf Ihrem Rechner installiert sind, zusammenarbeiten und nicht das fdisk Programm anderer Betriebssysteme stören. Bitte benutzen Sie den dedicated Modus nur dann, wenn Sie dazu einen guten Grund haben! &prompt.root; dd if=/dev/zero of=/dev/da1 bs=1k count=1 &prompt.root; fdisk -BI da1 # Initialisieren der neuen Platte &prompt.root; bsdlabel -B -w da1s1 auto #Labeln. &prompt.root; bsdlabel -e da1s1 # Editieren des Disklabels und Hinzufügen von Partitionen &prompt.root; mkdir -p /1 &prompt.root; newfs /dev/da1s1e # Wiederholen Sie diesen Schritt für jede Partition &prompt.root; mount /dev/da1s1e /1 # Anhängen der Partitionen &prompt.root; vi /etc/fstab # Ändern Sie /etc/fstab entsprechend Wenn Sie ein IDE-Laufwerk besitzen, ändern Sie da in ad. Dedicated OS/2 Wenn das neue Laufwerk nicht von anderen Betriebssystemen benutzt werden soll, können Sie es im dedicated Modus betreiben. Beachten Sie bitte, dass Microsoft-Betriebssysteme mit diesem Modus eventuell nicht zurechtkommen, aber es entsteht kein Schaden am Laufwerk. Im Gegensatz dazu wird IBMs &os2; versuchen, jede ihm nicht bekannte Partition zu reparieren. &prompt.root; dd if=/dev/zero of=/dev/da1 bs=1k count=1 &prompt.root; bsdlabel -Bw da1 auto &prompt.root; bsdlabel -e da1 # Erstellen der `e' Partition &prompt.root; newfs /dev/da1e &prompt.root; mkdir -p /1 &prompt.root; vi /etc/fstab # /dev/da1e hinzufügen &prompt.root; mount /1 Eine alternative Methode: &prompt.root; dd if=/dev/zero of=/dev/da1 count=2 &prompt.root; bsdlabel /dev/da1 | bsdlabel -BR da1 /dev/stdin &prompt.root; newfs /dev/da1e &prompt.root; mkdir -p /1 &prompt.root; vi /etc/fstab # /dev/da1e hinzufügen &prompt.root; mount /1 RAID Software-RAID Christopher Shumway Original von Jim Brown Überarbeitet von Concatenated-Disk (CCD) konfigurieren RAID Software RAID CCD Die wichtigsten Faktoren bei der Auswahl von Massenspeichern sind Geschwindigkeit, Zuverlässigkeit und Preis. Selten findet sich eine ausgewogene Mischung aller drei Faktoren. Schnelle und zuverlässige Massenspeicher sind für gewöhnlich teuer. Um die Kosten zu senken, muss entweder an der Geschwindigkeit oder an der Zuverlässigkeit gespart werden. Das unten beschriebene System sollte vor allem preiswert sein. Der nächst wichtige Faktor war die Geschwindigkeit gefolgt von der Zuverlässigkeit. Die Geschwindigkeit war nicht so wichtig, da über das Netzwerk auf das System zugegriffen wird. Da alle Daten schon auf CD-Rs gesichert sind, war die Zuverlässigkeit, obwohl wichtig, ebenfalls nicht von entscheidender Bedeutung. Die Bewertung der einzelnen Faktoren ist der erste Schritt bei der Auswahl von Massenspeichern. Wenn Sie vor allem ein schnelles und zuverlässiges Medium benötigen und der Preis nicht wichtig ist, werden Sie ein anderes System als das hier beschriebene zusammenstellen. Installation der Hardware Neben der IDE-Systemplatte besteht das System aus drei Western Digital IDE-Festplatten mit 5400 RPM und einer Kapazität von je 30 GB. Insgesamt stehen also 90 GB Speicherplatz zur Verfügung. Im Idealfall sollte jede Festplatte an einen eigenen Controller angeschlossen werden. Um Kosten zu sparen, wurde bei diesem System darauf verzichtet und an jeden IDE-Controller eine Master- und eine Slave-Platte angeschlossen. Beim Reboot wurde das BIOS so konfiguriert, dass es die angeschlossenen Platten automatisch erkennt und FreeBSD erkannte die Platten ebenfalls: ad0: 19574MB <WDC WD205BA> [39770/16/63] at ata0-master UDMA33 ad1: 29333MB <WDC WD307AA> [59598/16/63] at ata0-slave UDMA33 ad2: 29333MB <WDC WD307AA> [59598/16/63] at ata1-master UDMA33 ad3: 29333MB <WDC WD307AA> [59598/16/63] at ata1-slave UDMA33 Wenn FreeBSD die Platten nicht erkennt, überprüfen Sie, ob die Jumper korrekt konfiguriert sind. Die meisten IDE-Festplatten verfügen über einen Cable Select-Jumper. Die Master- und Slave-Platten werden mit einem anderen Jumper konfiguriert. Bestimmen Sie den richtigen Jumper mithilfe der Dokumentation Ihrer Festplatte. Als nächstes sollten Sie überlegen, auf welche Art der Speicher zur Verfügung gestellt werden soll. Schauen Sie sich dazu &man.vinum.8; () und &man.ccd.4; an. Im hier beschriebenen System wird &man.ccd.4; eingesetzt. Konfiguration von CCD Mit &man.ccd.4; können mehrere gleiche Platten zu einem logischen Dateisystem zusammengefasst werden. Um &man.ccd.4; zu benutzen, muss der Kernel mit der entsprechenden Unterstützung übersetzt werden. Ergänzen Sie die Kernelkonfiguration um die nachstehende Zeile. Anschließend müssen Sie den Kernel neu übersetzen und installieren. pseudo-device ccd Alternativ kann &man.ccd.4; auch als Kernelmodul geladen werden. Um &man.ccd.4; zu benutzen, müssen die Laufwerke zuerst mit einem Label versehen werden. Die Label werden mit &man.bsdlabel.8; erstellt: bsdlabel -w ad1 auto bsdlabel -w ad2 auto bsdlabel -w ad3 auto Damit wurden die Label ad1c, ad2c und ad3c erstellt, die jeweils das gesamte Laufwerk umfassen. Im nächsten Schritt muss der Typ des Labels geändert werden. Die Labels können Sie mit &man.bsdlabel.8; editieren: bsdlabel -e ad1 bsdlabel -e ad2 bsdlabel -e ad3 Für jedes Label startet dies den durch EDITOR gegebenen Editor, typischerweise &man.vi.1;. Ein unverändertes Label sieht zum Beispiel wie folgt aus: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597) Erstellen Sie eine e-Partition für &man.ccd.4;. Dazu können Sie normalerweise die Zeile der c-Partition kopieren, allerdings muss auf 4.2BSD gesetzt werden. Das Ergebnis sollte wie folgt aussehen: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597) e: 60074784 0 4.2BSD 0 0 0 # (Cyl. 0 - 59597) Erstellen des Dateisystems Nachdem alle Platten ein Label haben, kann das &man.ccd.4;-RAID aufgebaut werden. Dies geschieht mit &man.ccdconfig.8;: ccdconfig ccd0 32 0 /dev/ad1e /dev/ad2e /dev/ad3e Die folgende Aufstellung erklärt die verwendeten Kommandozeilenargumente: Das erste Argument gibt das zu konfigurierende Gerät, hier /dev/ccd0c, an. Die Angabe von /dev/ ist dabei optional. Der Interleave für das Dateisystem. Der Interleave definiert die Größe eines Streifens in Blöcken, die normal 512 Bytes groß sind. Ein Interleave von 32 ist demnach 16384 Bytes groß. Weitere Argumente für &man.ccdconfig.8;. Wenn Sie spiegeln wollen, können Sie das hier angeben. Die gezeigte Konfiguration verwendet keine Spiegel, sodass der Wert 0 angegeben ist. Das letzte Argument gibt die Geräte des Plattenverbundes an. Benutzen Sie für jedes Gerät den kompletten Pfadnamen. Nach Abschluß von &man.ccdconfig.8; ist der Plattenverbund konfiguriert und es können Dateisysteme auf dem Plattenverbund angelegt werden. Das Anlegen von Dateisystemen wird in der Hilfeseite &man.newfs.8; beschrieben. Für das Beispiel genügt der folgende Befehl: newfs /dev/ccd0c Automatisierung Damit &man.ccd.4; beim Start automatisch aktiviert wird, ist die Datei /etc/ccd.conf mit dem folgenden Kommando zu erstellen: ccdconfig -g > /etc/ccd.conf Wenn /etc/ccd.conf existiert, wird beim Reboot ccdconfig -C von /etc/rc aufgerufen. Damit wird &man.ccd.4; eingerichtet und die darauf befindlichen Dateisysteme können angehängt werden. Wenn Sie in den Single-User Modus booten, müssen Sie den Verbund erst konfigurieren, bevor Sie darauf befindliche Dateisysteme anhängen können: ccdconfig -C In /etc/fstab ist noch ein Eintrag für das auf dem Verbund befindliche Dateisystem zu erstellen, damit dieses beim Start des Systems immer angehängt wird: /dev/ccd0c /media ufs rw 2 2 Der Vinum-Volume-Manager RAID Software RAID Vinum Der Vinum Volume Manager ist ein Block-Gerätetreiber, der virtuelle Platten zur Verfügung stellt. Er trennt die Verbindung zwischen der Festplatte und dem zugehörigen Block-Gerät auf. Im Gegensatz zur konventionellen Aufteilung einer Platte in Slices lassen sich dadurch Daten flexibler, leistungsfähiger und zuverlässiger verwalten. &man.vinum.8; stellt RAID-0, RAID-1 und RAID-5 sowohl einzeln wie auch in Kombination zur Verfügung. Mehr Informationen über &man.vinum.8; erhalten Sie in . Hardware-RAID RAID Hardware FreeBSD unterstützt eine Reihe von RAID-Controllern. Diese Geräte verwalten einen Plattenverbund; zusätzliche Software wird nicht benötigt. Der Controller steuert mithilfe eines BIOS auf der Karte die Plattenoperationen. Wie ein RAID System eingerichtet wird, sei kurz am Beispiel des Promise IDE RAID-Controllers gezeigt. Nachdem die Karte eingebaut ist und der Rechner neu gestartet wurde, erscheint eine Eingabeaufforderung. Wenn Sie den Anweisungen auf dem Bildschirm folgen, gelangen Sie in eine Maske, in der Sie mit den vorhandenen Festplatten ein RAID-System aufbauen können. FreeBSD behandelt das RAID-System wie eine einzelne Festplatte. Wiederherstellen eines ATA-RAID-1 Verbunds Mit FreeBSD können Sie eine ausgefallene Platte in einem RAID-Verbund während des Betriebs auswechseln, vorausgesetzt Sie bemerken den Ausfall vor einem Neustart. Einen Ausfall erkennen Sie, wenn in der Datei /var/log/messages oder in der Ausgabe von &man.dmesg.8; Meldungen wie die folgenden auftauchen: ad6 on monster1 suffered a hard error. ad6: READ command timeout tag=0 serv=0 - resetting ad6: trying fallback to PIO mode ata3: resetting devices .. done ad6: hard error reading fsbn 1116119 of 0-7 (ad6 bn 1116119; cn 1107 tn 4 sn 11)\\ status=59 error=40 ar0: WARNING - mirror lost Überprüfen Sie den RAID-Verbund mit &man.atacontrol.8;: &prompt.root; atacontrol list ATA channel 0: Master: no device present Slave: acd0 <HL-DT-ST CD-ROM GCR-8520B/1.00> ATA/ATAPI rev 0 ATA channel 1: Master: no device present Slave: no device present ATA channel 2: Master: ad4 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present ATA channel 3: Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present &prompt.root; atacontrol status ar0 ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED Damit Sie die Platte ausbauen können, muss zuerst der ATA-Channel der ausgefallenen Platte aus dem Verbund entfernt werden: &prompt.root; atacontrol detach ata3 Ersetzen Sie dann die Platte. Nun aktivieren Sie den ATA-Channel wieder: &prompt.root; atacontrol attach ata3 Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present Nehmen Sie die neue Platte in den Verbund auf: &prompt.root; atacontrol addspare ar0 ad6 Stellen Sie die Organisation des Verbunds wieder her: &prompt.root; atacontrol rebuild ar0 Sie können den Fortschritt des Prozesses durch folgende Befehle kontrollieren: &prompt.root; dmesg | tail -10 [output removed] ad6: removed from configuration ad6: deleted from ar0 disk1 ad6: inserted into ar0 disk1 as spare &prompt.root; atacontrol status ar0 ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed Warten Sie bis die Wiederherstellung beendet ist. Marc Fonvieille Beigetragen von USB Speichermedien USB Speichermedien Der Universal Serial Bus (USB) wird heutzutage von vielen externen Speichern benutzt: Festplatten, USB-Thumbdrives oder CD-Brennern, die alle von &os; unterstützt werden. USB-Konfiguration USB-Massenspeicher werden vom Treiber &man.umass.4; betrieben. Wenn Sie den GENERIC-Kernel benutzen, brauchen Sie keine Anpassungen vorzunehmen. Benutzen Sie einen angepassten Kernel, müssen die nachstehenden Zeilen in der Kernelkonfigurationsdatei enthalten sein: device scbus device da device pass device uhci device ohci device ehci device usb device umass Der Treiber &man.umass.4; greift über das SCSI-Subsystem auf die USB-Geräte zu. Ihre USB-Geräte werden daher vom System als SCSI-Geräte erkannt. Abhängig vom Chipsatz Ihrer Systemplatine benötigen Sie in der Kernelkonfiguration entweder die Option device uhci oder die Option device ohci für die Unterstützung von USB 1.1. Die Kernelkonfiguration kann allerdings auch beide Optionen enthalten. Unterstützung für USB 2.0 Controller wird durch den &man.ehci.4;-Treiber geleistet (die device ehci Zeile). Vergessen Sie bitte nicht, einen neuen Kernel zu bauen und zu installieren, wenn Sie die Kernelkonfiguration verändert haben. Wenn es sich bei Ihrem USB-Gerät um einen CD-R- oder DVD-Brenner handelt, müssen Sie den Treiber &man.cd.4; für SCSI-CD-ROMs in die Kernelkonfiguration aufnehmen: device cd Da der Brenner als SCSI-Laufwerk erkannt wird, sollten Sie den Treiber &man.atapicam.4; nicht benutzen. Die USB-Konfiguration testen Sie können das USB-Gerät nun testen. Schließen Sie das Gerät an und untersuchen Sie die Systemmeldungen (&man.dmesg.8;), Sie sehen Ausgaben wie die folgende: umass0: USB Solid state disk, rev 1.10/1.00, addr 2 GEOM: create disk da0 dp=0xc2d74850 da0 at umass-sim0 bus 0 target 0 lun 0 da0: <Generic Traveling Disk 1.11> Removable Direct Access SCSI-2 device da0: 1.000MB/s transfers da0: 126MB (258048 512 byte sectors: 64H 32S/T 126C) Die Ausgaben, wie das erkannte Gerät oder der Gerätename (da0) hängen natürlich von Ihrer Konfiguration ab. Da ein USB-Gerät als SCSI-Gerät erkannt wird, können Sie USB-Massenspeicher mit dem Befehl camcontrol anzeigen: &prompt.root; camcontrol devlist <Generic Traveling Disk 1.11> at scbus0 target 0 lun 0 (da0,pass0) Wenn auf dem Laufwerk ein Dateisystem eingerichtet ist, sollten Sie das Dateisystem einhängen können. beschreibt, wie Sie USB-Laufwerke formatieren und Partitionen einrichten. Damit auch normale Anwender (ohne root-Rechte) USB-Laufwerke einhängen können, müssen Sie Ihr System erst entsprechend konfigurieren. Als erstes müssen Sie sicherstellen, dass diese Anwender auf die beim Einhängen eines USB-Laufwerks dynamisch erzeugten Gerätedateien zugreifen dürfen. Dazu können Sie beispielsweise mit &man.pw.8; alle potentiellen Benutzer dieser Gerätedateien in die Gruppe operator aufnehmen. Außerdem muss sichergestellt werden, dass Mitglieder der Gruppe operator Schreib- und Lesezugriff auf diese Gerätedateien haben. Dazu fügen Sie die folgenden Zeilen in die Konfigurationsdatei /etc/devfs.rules ein: [localrules=5] add path 'da*' mode 0660 group operator Verfügt Ihr System auch über SCSI-Laufwerke, gibt es eine Besonderheit. Haben Sie beispielsweise die SCSI-Laufwerke da0 bis da2 installiert, so sieht die zweite Zeile wie folgt aus: add path 'da[3-9]*' mode 0660 group operator Dadurch werden die bereits vorhandenen SCSI-Laufwerke nicht in die Gruppe operator aufgenommen. Vergessen Sie nicht, die &man.devfs.rules.5;-Regeln in der Datei /etc/rc.conf zu aktivieren: devfs_system_ruleset="localrules" Als nächstes müssen Sie Ihre Kernelkonfiguration anpassen, damit auch normale Benutzer Dateisysteme mounten dürfen. Dazu fügen Sie am besten folgende Zeile in die Konfigurationsdatei /etc/sysctl.conf ein: vfs.usermount=1 Damit diese Einstellung wirksam wird, müssen Sie Ihr System neu starten. Alternativ können Sie diese Variable auch mit &man.sysctl.8; setzen. Zuletzt müssen Sie noch ein Verzeichnis anlegen, in das das USB-Laufwerk eingehängt werden soll. Dieses Verzeichnis muss dem Benutzer gehören, der das USB-Laufwerk in den Verzeichnisbaum einhängen will. Dazu legen Sie als root ein Unterverzeichnis /mnt/username an (wobei Sie username durch den Login des jeweiligen Benutzers sowie usergroup durch die primäre Gruppe des Benutzers ersetzen): &prompt.root; mkdir /mnt/username &prompt.root; chown username:usergroup /mnt/username Wenn Sie nun beispielsweise einen USB-Stick anschließen, wird automatisch die Gerätedatei /dev/da0s1 erzeugt. Da derartige Geräte in der Regel mit dem FAT-Dateisystem formatiert sind, können Sie sie beispielsweise mit dem folgenden Befehl in den Verzeichnisbaum einhängen: &prompt.user; mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/username Wenn Sie das Gerät entfernen (das Dateisystem müssen Sie vorher abhängen), sehen Sie in den Systemmeldungen Einträge wie die folgenden: umass0: at uhub0 port 1 (addr 2) disconnected (da0:umass-sim0:0:0:0): lost device (da0:umass-sim0:0:0:0): removing device entry GEOM: destroy disk da0 dp=0xc2d74850 umass0: detached Weiteres zu USB Neben den Abschnitten Hinzufügen von Laufwerken und Anhängen und Abhängen von Dateisystemen lesen Sie bitte die Hilfeseiten &man.umass.4;, &man.camcontrol.8; für &os; 8.X oder &man.usbdevs.8; bei vorherigen Versionen. Mike Meyer Beigesteuert von CDs benutzen CD-ROM brennen Einführung CDs besitzen einige Eigenschaften, die sie von konventionellen Laufwerken unterscheiden. Zuerst konnten sie nicht beschrieben werden. Sie wurden so entworfen, dass sie ununterbrochen, ohne Verzögerungen durch Kopfbewegungen zwischen den Spuren, gelesen werden können. Sie konnten früher auch leichter als vergleichbar große Medien zwischen Systemen bewegt werden. CDs besitzen Spuren, aber damit ist der Teil Daten gemeint, der ununterbrochen gelesen wird, und nicht eine physikalische Eigenschaft der CD. Um eine CD mit FreeBSD zu erstellen, werden die Daten jeder Spur der CD in Dateien vorbereitet und dann die Spuren auf die CD geschrieben. ISO 9660 Dateisysteme ISO 9660 Das ISO 9660-Dateisystem wurde entworfen, um mit diesen Unterschieden umzugehen. Leider hat es auch damals übliche Grenzen für Dateisysteme implementiert. Glücklicherweise existiert ein Erweiterungsmechanismus, der es korrekt geschriebenen CDs erlaubt, diese Grenzen zu überschreiten und dennoch auf Systemen zu funktionieren, die diese Erweiterungen nicht unterstützen. sysutils/cdrtools Der Port sysutils/cdrtools enthält das Programm &man.mkisofs.8;, das eine Datei erstellt, die ein ISO 9660-Dateisystem enthält. Das Programm hat Optionen, um verschiedene Erweiterungen zu unterstützen, und wird unten beschrieben. CD-Brenner ATAPI Welches Tool Sie zum Brennen von CDs benutzen, hängt davon ab, ob Ihr CD-Brenner ein ATAPI-Gerät ist oder nicht. Mit ATAPI-CD-Brennern wird burncd benutzt, das Teil des Basissystems ist. SCSI- und USB-CD-Brenner werden mit cdrecord aus sysutils/cdrtools benutzt. Zusätzlich ist es möglich, über das Modul ATAPI/CAM SCSI-Werkzeuge wie cdrecord auch für ATAPI-Geräte einzusetzen. Wenn Sie eine Brennsoftware mit grafischer Benutzeroberfläche benötigen, sollten Sie sich X-CD-Roast oder K3b näher ansehen. Diese Werkzeuge können als Paket oder aus den Ports (sysutils/xcdroast und sysutils/k3b) installiert werden. Mit ATAPI-Hardware benötigt K3b das ATAPI/CAM-Modul. mkisofs Das Programm &man.mkisofs.8; aus dem Port sysutils/cdrtools erstellt ein ISO 9660-Dateisystem, das ein Abbild eines Verzeichnisbaumes ist. Die einfachste Anwendung ist wie folgt: &prompt.root; mkisofs -o Imagedatei /path/to/tree Dateisysteme ISO 9660 Dieses Kommando erstellt eine Imagedatei, die ein ISO 9660-Dateisystem enthält, das eine Kopie des Baumes unter /path/to/tree ist. Dabei werden die Dateinamen auf Namen abgebildet, die den Restriktionen des ISO 9660-Dateisystems entsprechen. Dateien mit Namen, die im ISO 9660-Dateisystem nicht gültig sind, bleiben unberücksichtigt. Dateisysteme HFS Dateisysteme Joliet Es einige Optionen, um diese Beschränkungen zu überwinden. Die unter &unix; Systemen üblichen Rock-Ridge-Erweiterungen werden durch aktiviert, aktiviert die von Microsoft Systemen benutzten Joliet-Erweiterungen und dient dazu, um das von &macos; benutzte HFS zu erstellen. Für CDs, die nur auf FreeBSD-Systemen verwendet werden sollen, kann genutzt werden, um alle Beschränkungen für Dateinamen aufzuheben. Zusammen mit wird ein Abbild des Dateisystems, ausgehend von dem Startpunkt im FreeBSD-Dateibaum, erstellt, obwohl dies den ISO 9660 Standard verletzen kann. CD-ROM bootbare erstellen Die letzte übliche Option ist . Sie wird benutzt, um den Ort eines Bootimages einer El Torito bootbaren CD anzugeben. Das Argument zu dieser Option ist der Pfad zu einem Bootimage ausgehend von der Wurzel des Baumes, der auf die CD geschrieben werden soll. In der Voreinstellung erzeugt &man.mkisofs.8; ein ISO-Image im Diskettenemulations-Modus. Dabei muss das Image genau 1200, 1440 oder 2880 KB groß sein. Einige Bootloader, darunter der auf den FreeBSD-Disks verwendete, kennen keinen Emulationsmodus. Daher sollten Sie in diesen Fällen die Option verwenden. Wenn /tmp/myboot ein bootbares FreeBSD-System enthält, dessen Bootimage sich in /tmp/myboot/boot/cdboot befindet, können Sie ein Abbild eines ISO 9660-Dateisystems in /tmp/bootable.iso wie folgt erstellen: &prompt.root; mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot Wenn Sie md in Ihrem Kernel konfiguriert haben, können Sie danach das Dateisystem einhängen: &prompt.root; mdconfig -a -t vnode -f /tmp/bootable.iso -u 0 &prompt.root; mount -t cd9660 /dev/md0 /mnt Jetzt können Sie überprüfen, dass /mnt und /tmp/myboot identisch sind. Sie können das Verhalten von &man.mkisofs.8; mit einer Vielzahl von Optionen beeinflussen. Insbesondere können Sie das ISO 9660-Dateisystem modifizieren und Joliet- oder HFS-Dateisysteme brennen. Details dazu entnehmen Sie bitte der Hilfeseite &man.mkisofs.8;. burncd CD-ROM brennen Wenn Sie einen ATAPI-CD-Brenner besitzen, können Sie burncd benutzen, um ein ISO-Image auf CD zu brennen. burncd ist Teil des Basissystems und unter /usr/sbin/burncd installiert. Da es nicht viele Optionen hat, ist es leicht zu benutzen: &prompt.root; burncd -f cddevice data imagefile.iso fixate Dieses Kommando brennt eine Kopie von imagefile.iso auf das Gerät cddevice. In der Grundeinstellung wird das Gerät /dev/acd0 benutzt. &man.burncd.8; beschreibt, wie die Schreibgeschwindigkeit gesetzt wird, die CD ausgeworfen wird und Audiodaten geschrieben werden. cdrecord Wenn Sie keinen ATAPI-CD-Brenner besitzen, benutzen Sie cdrecord, um CDs zu brennen. cdrecord ist nicht Bestandteil des Basissystems. Sie müssen es entweder aus den Ports in sysutils/cdrtools oder dem passenden Paket installieren. Änderungen im Basissystem können Fehler im binären Programm verursachen und führen möglicherweise dazu, dass Sie einen Untersetzer brennen. Sie sollten daher den Port aktualisieren, wenn Sie Ihr System aktualisieren bzw. wenn Sie STABLE verfolgen, den Port aktualisieren, wenn es eine neue Version gibt. Obwohl cdrecord viele Optionen besitzt, ist die grundlegende Anwendung einfacher als burncd. Ein ISO 9660-Image erstellen Sie mit: &prompt.root; cdrecord dev=device imagefile.iso Der Knackpunkt in der Benutzung von cdrecord besteht darin, das richtige Argument zu zu finden. Benutzen Sie dazu den Schalter von cdrecord, der eine ähnliche Ausgabe wie die folgende produziert: CD-ROM brennen &prompt.root; cdrecord -scanbus Cdrecord 1.9 (i386-unknown-freebsd7.0) Copyright (C) 1995-2004 Jörg Schilling Using libscg version 'schily-0.1' scsibus0: 0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk 0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk 0,2,0 2) * 0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk 0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM 0,5,0 5) * 0,6,0 6) * 0,7,0 7) * scsibus1: 1,0,0 100) * 1,1,0 101) * 1,2,0 102) * 1,3,0 103) * 1,4,0 104) * 1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM 1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner 1,7,0 107) * Für die aufgeführten Geräte in der Liste wird das passende Argument zu gegeben. Benutzen Sie die drei durch Kommas separierten Zahlen, die zu Ihrem CD-Brenner angegeben sind, als Argument für . Im Beispiel ist das CDRW-Gerät 1,5,0, so dass die passende Eingabe dev=1,5,0 wäre. Einfachere Wege das Argument anzugeben, sind in &man.cdrecord.1; beschrieben. Dort sollten Sie auch nach Informationen über Audiospuren, das Einstellen der Geschwindigkeit und ähnlichem suchen. Kopieren von Audio-CDs Um eine Kopie einer Audio-CD zu erstellen, kopieren Sie die Stücke der CD in einzelne Dateien und brennen diese Dateien dann auf eine leere CD. Das genaue Verfahren hängt davon ab, ob Sie ATAPI- oder SCSI-Laufwerke verwenden. SCSI-Laufwerke Kopieren Sie die Audiodaten mit cdda2wav: &prompt.user; cdda2wav -v255 -D2,0 -B -Owav Die erzeugten .wav Dateien schreiben Sie mit cdrecord auf eine leere CD: &prompt.user; cdrecord -v dev=2,0 -dao -useinfo *.wav Das Argument von gibt das verwendete Gerät an, das Sie, wie in beschrieben, ermitteln können. ATAPI-Laufwerke Der ATAPI-CD-Treiber stellt die einzelnen Stücke der CD über die Dateien /dev/acddtnn, zur Verfügung. d bezeichnet die Laufwerksnummer und nn ist die Nummer des Stücks. Die Nummer ist immer zweistellig, das heißt es wird, wenn nötig, eine führende Null ausgegeben. Die Datei /dev/acd0t01 ist also das erste Stück des ersten CD-Laufwerks. /dev/acd0t02 ist das zweite Stück und /dev/acd0t03 das dritte. Überprüfen Sie stets, ob die entsprechenden Dateien im Verzeichnis /dev auch angelegt werden. Sind die Einträge nicht vorhanden, weisen Sie Ihr System an, das Medium erneut zu testen: &prompt.root; dd if=/dev/acd0 of=/dev/null count=1 Unter &os; 4.X werden diese Einträge nicht mit dem Wert Null vordefiniert. Falls die entsprechenden Einträge unter /dev nicht vorhanden sind, müssen Sie diese hier von MAKEDEV anlegen lassen: &prompt.root; cd /dev &prompt.root; sh MAKEDEV acd0t99 Die einzelnen Stücke kopieren Sie mit &man.dd.1;. Sie müssen dazu eine spezielle Blockgröße angeben: &prompt.root; dd if=/dev/acd0t01 of=track1.cdr bs=2352 &prompt.root; dd if=/dev/acd0t02 of=track2.cdr bs=2352 ... Die kopierten Dateien können Sie dann mit burncd brennen. Auf der Kommandozeile müssen Sie angeben, dass Sie Audio-Daten brennen wollen und dass das Medium fixiert werden soll: &prompt.root; burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixate Kopieren von Daten-CDs Sie können eine Daten-CD in eine Datei kopieren, die einem Image entspricht, das mit &man.mkisofs.8; erstellt wurde. Mit Hilfe dieses Images können Sie jede Daten-CD kopieren. Das folgende Beispiel verwendet acd0 für das CD-ROM-Gerät. Wenn Sie ein anderes Laufwerk benutzen, setzen Sie bitte den richtigen Namen ein. &prompt.root; dd if=/dev/acd0 of=file.iso bs=2048 Danach haben Sie ein Image, das Sie wie oben beschrieben, auf eine CD brennen können. Einhängen von Daten-CDs Nachdem Sie eine Daten-CD gebrannt haben, wollen Sie wahrscheinlich auch die Daten auf der CD lesen. Dazu müssen Sie die CD in den Dateibaum einhängen. Die Voreinstellung für den Typ des Dateisystems von &man.mount.8; ist UFS. Das System wird die Fehlermeldung Incorrect super block ausgeben, wenn Sie versuchen, die CD mit dem folgenden Kommando einzuhängen: &prompt.root; mount /dev/cd0 /mnt Auf der CD befindet sich ja kein UFS Dateisystem, so dass der Versuch, die CD einzuhängen fehlschlägt. Sie müssen &man.mount.8; sagen, dass es ein Dateisystem vom Typ ISO9660 verwenden soll. Dies erreichen Sie durch die Angabe von auf der Kommandozeile. Wenn Sie also die CD-ROM /dev/cd0 in /mnt einhängen wollen, führen Sie folgenden Befehl aus: &prompt.root; mount -t cd9660 /dev/cd0c /mnt Abhängig vom verwendeten CD-ROM kann der Gerätename von dem im Beispiel (/dev/cd0) abweichen. Die Angabe von führt &man.mount.cd9660.8; aus, so dass das Beispiel verkürzt werden kann: &prompt.root; mount_cd9660 /dev/cd0 /mnt Auf diese Weise können Sie Daten-CDs von jedem Hersteller verwenden. Es kann allerdings zu Problemen mit CDs kommen, die verschiedene ISO9660-Erweiterungen benutzen. So speichern Joliet-CDs alle Dateinamen unter Verwendung von zwei Byte langen Unicode-Zeichen. Zwar unterstützt der &os;-Kernel derzeit noch kein Unicode, der CD9660-Treiber erlaubt es aber, zur Laufzeit eine Konvertierungstabelle zu laden. Tauchen bei Ihnen also statt bestimmter Zeichen nur Fragezeichen auf, so müssen Sie über die Option den benötigten Zeichensatz angeben. Weitere Informationen zu diesem Problem finden Sie in der Manualpage &man.mount.cd9660.8;. Damit der Kernel diese Zeichenkonvertierung (festgelegt durch die Option ) erkennt, müssen Sie das Kernelmodul cd9660_iconv.ko laden. Dazu fügen Sie entweder folgende Zeile in die Datei loader.conf ein: cd9660_iconv_load="YES" Danach müssen Sie allerdings Ihr System neu starten. Alternativ können Sie das Kernelmodul auch direkt über &man.kldload.8; laden. Manchmal werden Sie die Meldung Device not configured erhalten, wenn Sie versuchen, eine CD-ROM einzuhängen. Für gewöhnlich liegt das daran, dass das Laufwerk meint es sei keine CD eingelegt, oder dass das Laufwerk auf dem Bus nicht erkannt wird. Es kann einige Sekunden dauern, bevor das Laufwerk merkt, dass eine CD eingelegt wurde. Seien Sie also geduldig. Manchmal wird ein SCSI-CD-ROM nicht erkannt, weil es keine Zeit hatte, auf das Zurücksetzen des Busses zu antworten. Wenn Sie ein SCSI-CD-ROM besitzen, sollten Sie die folgende Zeile in Ihre Kernelkonfiguration aufnehmen und einen neuen Kernel bauen: options SCSI_DELAY=15000 Die Zeile bewirkt, dass nach dem Zurücksetzen des SCSI-Busses beim Booten 15 Sekunden gewartet wird, um dem CD-ROM-Laufwerk genügend Zeit zu geben, darauf zu antworten. Brennen von rohen CDs Sie können eine Datei auch direkt auf eine CD brennen, ohne vorher auf ihr ein ISO 9660-Dateisystem einzurichten. Einige Leute nutzen dies, um Datensicherungen durchzuführen. Diese Vorgehensweise hat den Vorteil, dass Sie schneller als das Brennen einer normalen CD ist. &prompt.root; burncd -f /dev/acd1 -s 12 data archive.tar.gz fixate Wenn Sie die Daten von einer solchen CD wieder zurückbekommen wollen, müssen Sie sie direkt von dem rohen Gerät lesen: &prompt.root; tar xzvf /dev/acd1 Eine auf diese Weise gefertigte CD können Sie nicht in das Dateisystem einhängen. Sie können Sie auch nicht auf einem anderen Betriebssystem lesen. Wenn Sie die erstellten CDs in das Dateisystem einhängen oder mit anderen Betriebssystemen austauschen wollen, müssen Sie &man.mkisofs.8; wie oben beschrieben benutzen. Marc Fonvieille Beigetragen von CD-Brenner ATAPI/CAM Treiber Der ATAPI/CAM Treiber Mit diesem Treiber kann auf ATAPI-Geräte (wie CD-ROM-, CD-RW- oder DVD-Laufwerke) mithilfe des SCSI-Subsystems zugegriffen werden. Damit können Sie SCSI-Werkzeuge, wie sysutils/cdrdao oder &man.cdrecord.1;, zusammen mit einem ATAPI-Gerät benutzen. Wenn Sie den Treiber benutzen wollen, fügen Sie die folgende Zeile in /boot/loader.conf ein: atapicam_load="YES" Danach müssen Sie Ihr System neu starten, um den Treiber zu aktivieren. Alternativ können Sie die Unterstützung für &man.atapicam.4; auch in Ihren Kernel kompilieren. Dazu fügen Sie die folgende Zeile in Ihre Kernelkonfigurationsdatei ein: device atapicam Die folgenden Zeilen werden ebenfalls benötigt, sollten aber schon Teil der Kernelkonfiguration sein: device ata device scbus device cd device pass Übersetzen und installieren Sie den neuen Kernel. Der CD-Brenner sollte nun beim Neustart des Systems erkannt werden: acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4 cd0 at ata1 bus 0 target 0 lun 0 cd0: <MATSHITA CDRW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device cd0: 16.000MB/s transfers cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed Über den Gerätenamen /dev/cd0 können Sie nun auf das Laufwerk zugreifen. Wenn Sie beispielsweise eine CD-ROM in /mnt einhängen wollen, benutzen Sie das nachstehende Kommando: &prompt.root; mount -t cd9660 /dev/cd0 /mnt Die SCSI-Adresse des Brenners können Sie als root wie folgt ermitteln: &prompt.root; camcontrol devlist <MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (pass0,cd0) Die SCSI-Adresse 1,0,0 können Sie mit den SCSI-Werkzeugen, zum Beispiel &man.cdrecord.1;, verwenden. Weitere Informationen über das ATAPI/CAM- und das SCSI-System erhalten Sie in den Hilfeseiten &man.atapicam.4; und &man.cam.4;. Marc Fonvieille Beigetragen von Andy Polyakov Mit Beiträgen von DVDs benutzen DVD brennen Einführung Nach der CD ist die DVD die nächste Generation optischer Speichermedien. Auf einer DVD können mehr Daten als auf einer CD gespeichert werden. DVDs werden heutzutage als Standardmedium für Videos verwendet. Für beschreibbare DVDs existieren fünf Medienformate: DVD-R: Dies war das erste verfügbare Format. Das Format wurde vom DVD-Forum festgelegt. Die Medien sind nur einmal beschreibbar. DVD-RW: Dies ist die wiederbeschreibbare Version des DVD-R Standards. Eine DVD-RW kann ungefähr 1000 Mal beschrieben werden. DVD-RAM: Dies ist ebenfalls ein wiederbeschreibbares Format, das vom DVD-Forum unterstützt wird. Eine DVD-RAM verhält sich wie eine Wechselplatte. Allerdings sind die Medien nicht kompatibel zu den meisten DVD-ROM-Laufwerken und DVD-Video-Spielern. DVD-RAM wird nur von wenigen Brennern unterstützt. Wollen Sie DVD-RAM einsetzen, sollten Sie lesen. DVD+RW: Ist ein wiederbeschreibbares Format, das von der DVD+RW Alliance festgelegt wurde. Eine DVD+RW kann ungefähr 1000 Mal beschrieben werden. DVD+R: Dieses Format ist die nur einmal beschreibbare Variante des DVD+RW Formats. Auf einer einfach beschichteten DVD können 4.700.000.000 Bytes gespeichert werden. Das sind 4,38 GB oder 4485 MB (1 Kilobyte sind 1024 Bytes). Die physischen Medien sind unabhängig von der Anwendung. Ein DVD-Video ist eine spezielle Anordnung von Dateien, die auf irgendein Medium (zum Beispiel DVD-R, DVD+R oder DVD-RW) geschrieben werden kann. Bevor Sie ein Medium auswählen, müssen Sie sicherstellen, dass der Brenner und der DVD-Spieler (ein Einzelgerät oder ein DVD-ROM-Laufwerk eines Rechners) mit dem Medium umgehen können. Konfiguration Das Programm &man.growisofs.1; beschreibt DVDs. Das Kommando ist Teil der Anwendung dvd+rw-tools (sysutils/dvd+rw-tools). dvd+rw-tools kann mit allen DVD-Medien umgehen. Um die Geräte anzusprechen, brauchen die Werkzeuge das SCSI-Subsystem. Daher muss der Kernel den ATAPI/CAM-Treiber zur Verfügung stellen. Der Treiber ist mit USB-Brennern nutzlos; die Konfiguration von USB-Geräten behandelt . Für ATAPI-Geräte müssen Sie ebenfalls DMA-Zugriffe aktivieren. Fügen Sie dazu die nachstehende Zeile in die Datei /boot/loader.conf ein: hw.ata.atapi_dma="1" Bevor Sie dvd+rw-tools mit Ihrem DVD-Brenner benutzen, lesen Sie bitte die Hardware-Informationen auf der Seite dvd+rw-tools' hardware compatibility notes. Wenn Sie eine grafische Oberfläche bevorzugen, schauen Sie sich bitte den Port sysutils/k3b an. Der Port bietet eine leicht zu bedienende Schnittstelle zu &man.growisofs.1; und vielen anderen Werkzeugen. Daten-DVDs brennen &man.growisofs.1; erstellt mit dem Programm mkisofs das Dateisystem und brennt anschließend die DVD. Vor dem Brennen brauchen Sie daher kein Abbild der Daten zu erstellen. Wenn Sie von den Daten im Verzeichnis /path/to/data eine DVD+R oder eine DVD-R brennen wollen, benutzen Sie das nachstehende Kommando: &prompt.root; growisofs -dvd-compat -Z /dev/cd0 -J -R /path/to/data Die Optionen werden an &man.mkisofs.8; durchgereicht und dienen zum Erstellen des Dateisystems (hier: ein ISO-9660-Dateisystem mit Joliet- und Rock-Ridge-Erweiterungen). Weiteres entnehmen Sie bitte der Hilfeseite &man.mkisofs.8;. Die Option wird für die erste Aufnahme einer Session benötigt, egal ob Sie eine Multi-Session-DVD brennen oder nicht. Für /dev/cd0 müssen Sie den Gerätenamen Ihres Brenners einsetzen. Die Option schließt das Medium, weitere Daten können danach nicht mehr angehängt werden. Durch die Angabe dieser Option kann das Medium von mehr DVD-ROM-Laufwerken gelesen werden. Sie können auch ein vorher erstelltes Abbild der Daten brennen. Die nachstehende Kommandozeile brennt das Abbild in der Datei imagefile.iso: &prompt.root; growisofs -dvd-compat -Z /dev/cd0=imagefile.iso Die Schreibgeschwindigkeit hängt von den verwendeten Medium sowie dem verwendeten Gerät ab und sollte automatisch gesetzt werden. Falls Sie die Schreibgeschwindigkeit vorgeben möchten, verwenden Sie den Parameter . Weiteres erfahren Sie in der Hilfeseite &man.growisofs.1;. + + + Um grössere Dateien als 4.38GB in ihre Sammlung + aufzunehmen, ist es notwendig ein UDF/ISO-9660 Hybrid-Dateisystem + zu erstellen. Dieses Dateisystem muss mit zusätzlichen + Parametern bei &man.mkisofs.8; + und allen relevanten Programmen (z.B. &man.growisofs.1;) erzeugt + werden. Dies ist nur notwendig wenn Sie ein ISO-Image erstellen + oder direkt auf eine DVD schreiben wollen. DVDs, die in dieser + Weise hergestellt worden sind, müssen als UDF-Dateisystem + mit &man.mount.udf.8; eingehangen werden. Sie sind nur auf + Betriebssystemen, die UDF unterstützen brauchbar, ansonsten + sieht es so aus, als ob sie kaputte Dateien enthalten würden. + + + Um so eine ISO Datei zu bauen, geben Sie den folgenden + Befehl ein: + +&prompt.user; mkisofs -R -J -udf -iso-level 3 -o imagefile.iso /path/to/data + + Um Daten direkt auf eine DVD zu brennen, geben Sie den + folgenden Befehl ein: + +&prompt.root; growisofs -dvd-compat -udf -iso-level 3 -Z /dev/cd0 -J -R /path/to/data + + Wenn Sie ein ISO-Image haben das bereits grosse Dateien + enthält, sind keine weiteren zusätzlichen Optionen für + &man.growisofs.1; notwendig, um das Image auf die DVD zu + brennen. + + Beachten Sie noch, dass Sie die aktuelle Version von + sysutils/cdrtools haben (welche + &man.mkisofs.8; enthält), da die älteren Versionen nicht + den Support für grosse Dateien enthalten. Wenn Sie Probleme + haben sollten, können Sie auch das Entwicklerpaket + von sysutils/cdrtools-devel + einsetzen und lesen Sie die &man.mkisofs.8; Manualpage. + + + DVD DVD-Video DVD-Videos brennen Ein DVD-Video ist eine spezielle Anordnung von Dateien, die auf den ISO-9660 und den micro-UDF (M-UDF) Spezifikationen beruht. Ein DVD-Video ist auf eine bestimmte Datei-Hierarchie angewiesen. Daher müssen Sie DVDs mit speziellen Programmen wie multimedia/dvdauthor erstellen. Wenn Sie schon ein Abbild des Dateisystems eines DVD-Videos haben, brennen Sie das Abbild wie jedes andere auch. Eine passende Kommandozeile finden Sie im vorigen Abschnitt. Wenn Sie die DVD im Verzeichnis /path/to/video zusammengestellt haben, erstellen Sie das DVD-Video mit dem nachstehenden Kommando: &prompt.root; growisofs -Z /dev/cd0 -dvd-video /path/to/video Die Option wird an &man.mkisofs.8; weitergereicht. Dadurch erstellt &man.mkisofs.8; die Datei-Hierarchie für ein DVD-Video. Weiterhin bewirkt die Angabe von , dass &man.growisofs.1; mit der Option aufgerufen wird. DVD DVD+RW DVD+RW-Medien benutzen Im Gegensatz zu CD-RW-Medien müssen Sie DVD+RW-Medien erst formatieren, bevor Sie die Medien benutzen. Sie sollten &man.growisofs.1; einzetzen, da das Programm Medien automatisch formatiert, wenn es erforderlich ist. Sie können eine DVD+RW aber auch mit dem Kommando dvd+rw-format formatieren: &prompt.root; dvd+rw-format /dev/cd0 Sie müssen das Kommando nur einmal mit neuen Medien laufen lassen. Anschließend können Sie DVD+RWs, wie in den vorigen Abschnitten beschrieben, brennen. Wenn Sie auf einer DVD+RW ein neues Dateisystem erstellen wollen, brauchen Sie die DVD+RW vorher nicht zu löschen. Überschreiben Sie einfach das vorige Dateisystem indem Sie eine neue Session anlegen: &prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/newdata Mit dem DVD+RW-Format ist es leicht, Daten an eine vorherige Aufnahme anzuhängen. Dazu wird eine neue Session mit der schon bestehenden zusammengeführt. Es wird keine Multi-Session geschrieben, sondern &man.growisofs.1; vergrößert das ISO-9660-Dateisystem auf dem Medium. Das folgende Kommando fügt weitere Daten zu einer vorher erstellten DVD+RW hinzu: &prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdata Wenn Sie eine DVD+RW erweitern, verwenden Sie dieselben &man.mkisofs.8;-Optionen wie beim Erstellen der DVD+RW. Um die Kompatibilität mit DVD-ROM-Laufwerken zu gewährleisten, wollen Sie vielleicht die Option einsetzen. Zu einem DVD+RW-Medium können Sie mit dieser Option auch weiterhin Daten hinzufügen. Wenn Sie das Medium aus irgendwelchen Gründen doch löschen müssen, verwenden Sie den nachstehenden Befehl: &prompt.root; growisofs -Z /dev/cd0=/dev/zero DVD DVD-RW DVD-RW-Medien benutzen Eine DVD-RW kann mit zwei Methoden beschrieben werden: Sequential-Recording oder Restricted-Overwrite. Voreingestellt ist Sequential-Recording. Eine neue DVD-RW kann direkt beschrieben werden; sie muss nicht vorher formatiert werden. Allerdings muss eine DVD-RW, die mit Sequential-Recording aufgenommen wurde, zuerst gelöscht werden, bevor eine neue Session aufgenommen werden kann. Der folgende Befehl löscht eine DVD-RW im Sequential-Recording-Modus: &prompt.root; dvd+rw-format -blank=full /dev/cd0 Das vollständige Löschen () dauert mit einem 1x Medium ungefähr eine Stunde. Wenn die DVD-RW im Disk-At-Once-Modus (DAO) aufgenommen wurde, kann Sie mit der Option schneller gelöscht werden. Um eine DVD-RW im DAO-Modus zu brennen, benutzen Sie das folgende Kommando: &prompt.root; growisofs -use-the-force-luke=dao -Z /dev/cd0=imagefile.iso Die Option sollte nicht erforderlich sein, da &man.growisofs.1; den DAO-Modus erkennt. Der Restricted-Overwrite-Modus sollte mit jeder DVD-RW verwendet werden, da er flexibler als der voreingestellte Sequential-Recording-Modus ist. Um Daten auf eine DVD-RW im Sequential-Recording-Modus zu schreiben, benutzen Sie dasselbe Kommando wie für die anderen DVD-Formate: &prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/data Wenn Sie weitere Daten zu einer Aufnahme hinzufügen wollen, benutzen Sie die Option von &man.growisofs.1;. Werden die Daten im Sequential-Recording-Modus hinzugefügt, wird eine neue Session erstellt. Das Ergebnis ist ein Multi-Session-Medium. Eine DVD-RW im Restricted-Overwrite-Modus muss nicht gelöscht werden, um eine neue Session aufzunehmen. Sie können das Medium einfach mit der Option überschreiben, ähnlich wie bei DVD+RW. Mit der Option können Sie das ISO-9660-Dateisystem, wie mit einer DVD+RW, vergrößern. Die DVD enthält danach eine Session. Benutzen sie das nachstehende Kommando, um den Restricted-Overwrite-Modus einzustellen: &prompt.root; dvd+rw-format /dev/cd0 Das folgende Kommando stellt den Modus wieder auf Sequential-Recording zurück: &prompt.root; dvd+rw-format -blank=full /dev/cd0 Multi-Session Nur wenige DVD-ROM-Laufwerke können Multi-Session-DVDs lesen. Meist lesen die Spieler nur die erste Session. Mehrere Sessions werden von DVD+R, DVD-R und DVD-RW im Sequential-Recording-Modus unterstützt. Im Modus Restricted-Overwrite gibt es nur eine Session. Wenn das Medium noch nicht geschlossen ist, erstellt das nachstehende Kommando eine neue Session auf einer DVD+R, DVD-R oder DVD-RW im Sequential-Recording-Modus: &prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdata Wird diese Kommandozeile mit DVD+RW- oder DVD-RW-Medien im Restricted-Overwrite-Modus benutzt, werden die neuen Daten mit den Daten der bestehenden Session zusammengeführt. Das Medium enthält danach eine Session. Auf diesem Weg werden neue Daten zu einer bestehenden Session hinzugefügt. Für den Anfang und das Ende einer Session wird auf dem Medium zusätzlicher Platz verbraucht. Um den Speicherplatz auf dem Medium optimal auszunutzen, sollten Sie daher Sessions mit vielen Daten hinzufügen. Auf ein DVD+R-Medium passen maximal 154 Sessions, 2000 Sessions auf ein DVD-R-Medium und 127 Sessions auf eine DVD+R Double Layer. Weiterführendes Das Kommando dvd+rw-mediainfo /dev/cd0 zeigt Informationen über eine im Laufwerk liegende DVD an. Weiteres zu den dvd+rw-tools lesen Sie bitte in der Hilfeseite &man.growisofs.1;, auf der dvd+rw-tools Web-Seite oder in den Archiven der cdwrite-Mailingliste. DVD-RAM DVD DVD-RAM Konfiguration DVD-RAM-fähige Brenner werden sowohl mit SCSI- als auch mit ATAPI-Schnittstelle angeboten. Verwenden Sie ein ATAPI-Gerät, müssen Sie den DMA-Modus aktivieren. Dazu fügen Sie die folgende Zeile in /boot/loader.conf ein: hw.ata.atapi_dma="1" Das Medium vorbereiten Wie weiter oben in diesem Kapitel bereits erwähnt, kann man eine DVD-RAM mit einer Wechselplatte vergleichen. Wie diese muss auch eine DVD-RAM vor dem ersten Einsatz vorbereitet werden. In unserem Beispiel wird das gesamte Medium mit dem Standard-UFS2-Dateisystem formatiert. Dazu geben Sie als root bei eingelegter DVD-RAM die folgenden Befehle ein: &prompt.root; dd if=/dev/zero of=/dev/acd0 bs=2k count=1 &prompt.root; bsdlabel -Bw acd0 &prompt.root; newfs /dev/acd0 Denken Sie dabei daran, dass Sie gegebenenfalls die Gerätedatei (hier acd0) an Ihre Konfiguration anpassen müssen. Das Medium einsetzen Nachdem Sie das Medium vorbereitet haben, können Sie das DVD-RAM-Medium in Ihren Verzeichnisbaum einhängen: &prompt.root; mount /dev/acd0 /mnt Danach können Sie schreibend und lesend auf das Medium zugreifen. Julio Merino Original von Martin Karlsson Umgeschrieben von Disketten benutzen Disketten sind nützlich, wenn kein anderes bewegliches Speichermedium vorhanden ist oder wenn nur kleine Datenmengen transferiert werden sollen. Dieser Abschnitt beschreibt die Handhabung von Disketten unter FreeBSD. Hauptsächlich geht es um die Formatierung und Benutzung von 3,5 Zoll Disketten, doch lassen sich die Konzepte leicht auf Disketten anderer Formate übertragen. Disketten formatieren Die Gerätedateien Wie auf jedes andere Gerät auch, greifen Sie auf Disketten über Einträge im Verzeichnis /dev zu. Verwenden Sie dazu die Einträge /dev/fdN. Formatierung Bevor eine Diskette benutzt werden kann, muss Sie (low-level) formatiert werden, was normalerweise der Hersteller schon gemacht hat. Sie können die Diskette allerdings noch einmal formatieren, um das Medium zu überprüfen. Es ist möglich, die Kapazität der Diskette zu verändern, allerdings sind die meisten Disketten auf 1440 kB ausgelegt. Mit &man.fdformat.1; formatieren Sie eine Diskette. Das Kommando erwartet die Angabe eines Gerätenamens. Achten Sie bei der Formatierung auf Fehlermeldungen, die schlechte Speichermedien anzeigen. Disketten formatieren Die Disketten werden mithilfe der Gerätedatei /dev/fdN formatiert. Legen Sie eine 3,5 Zoll Diskette in Ihr Laufwerk ein und führen das folgende Kommando aus: &prompt.root; /usr/sbin/fdformat -f 1440 /dev/fd0 Das Disklabel Nach dem Formatieren muss auf der Diskette ein Disklabel erstellt werden. Das Disklabel wird später zerstört, ist aber notwendig, um die Größe und Geometrie der Diskette zu erkennen. Das Disklabel gilt für die ganze Diskette und enthält alle Informationen über die Geometrie der Diskette. Eine Liste der möglichen Geometrien finden Sie in /etc/disktab. Erstellen Sie nun das Label mit &man.bsdlabel.8;: &prompt.root; /sbin/bsdlabel -B -w /dev/fd0 fd1440 Das Dateisystem Auf der Diskette muss nun ein Dateisystem erstellt werden (high-level Formatierung), damit FreeBSD von der Diskette lesen und auf sie schreiben kann. Das Disklabel wird durch das Anlegen eines Dateisystems zerstört. Falls Sie die Diskette später erneut formatieren wollen, müssen Sie dann auch ein neues Disklabel anlegen. Sie können entweder UFS oder FAT als Dateisystem verwenden. Für Floppies ist FAT das beste Dateisystem. Das folgende Kommando legt ein Dateisystem auf der Diskette an: &prompt.root; /sbin/newfs_msdos /dev/fd0 Die Diskette kann nun benutzt werden. Verwenden der Diskette Zum Einhägen der Diskette in das Dateisystem verwenden Sie den Befehl &man.mount.msdosfs.8;. Sie können auch den Port emulators/mtools verwenden, um mit der Diskette zu arbeiten. Bandmedien benutzen Bandmedien Die wichtigsten Bandmedien sind 4mm, 8mm, QIC, Mini-Cartridge und DLT. 4mm (DDS: Digital Data Storage) Bandmedien DDS (4mm) Bänder Bandmedien QIC Bänder Die 4mm-Bänder ersetzen mehr und mehr das QIC-Format als Backupmedium der Wahl für Workstations. Dieser Trend nahm stark zu, als Conner die Firma Archive, einen führenden Hersteller von QIC-Laufwerken, aufkaufte und die Produktion von QIC-Laufwerken stoppte. 4mm-Laufwerke sind klein und ruhig, haben aber nicht den gleichen Ruf der Zuverlässigkeit, den die 8mm-Laufwerke genießen. Die 4mm-Kassetten sind preiswerter und mit den Maßen 76,2 x 50,8 x 12,7 mm (3 x 2 x 0,5 Inch) kleiner als die 8mm-Kassetten. Sowohl die 4mm- als auch die 8mm-Magnetköpfe haben eine relativ kurze Lebensdauer, weil beide die gleiche Helical-Scan-Technik benutzen. Der Datendurchsatz dieser Laufwerke beginnt bei etwa 150 kByte/s, Spitzenwerte liegen bei etwa 500 kByte/s. Die Datenkapazität liegt zwischen 1,3 GB und 2 GB. Die meisten Geräte haben eine Hardwarekompression eingebaut, die die Kapazität ungefähr verdoppelt. Es gibt Multi-Drive-Einheiten für Bandbibliotheken mit bis zu 6 Laufwerken in einem Gehäuse und automatischem Bandwechsel. Die Kapazität einer solchen Bibliothek liegt bei 240 GB. Der Standard DDS-3 unterstützt nun Bandkapazitäten bis zu 12 GB (oder komprimiert 24 GB). 4mm-Laufwerke, ebenso wie 8mm-Laufwerke, verwenden Helical-Scan. Alle Vor- und Nachteile von Helical-Scan gelten sowohl für 4mm- als auch für 8mm-Laufwerke. Bänder sollten nach 2.000 Banddurchläufen oder 100 vollen Backups ersetzt werden. 8mm (Exabyte) Bandmedien Exabyte (8mm) Bänder 8mm-Bänder sind die verbreitetsten SCSI-Bandlaufwerke; sie sind das geeignetste Bandformat zum Austausch von Bändern. Fast an jedem Standort gibt es ein 8mm-Bandlaufwerk mit 2 GB. 8mm-Bänder sind zuverlässig, gut zu handhaben und arbeiten leise. Bandkassetten sind preiswert und klein mit 122 x 84 x 15 mm (4,8 x 3,3 x 0,6 Inch). Ein Nachteil der 8mm-Technik ist die relativ kurze Lebensdauer des Schreib-/Lesekopfs und der Bänder auf Grund der hohen Relativgeschwindigkeit des Bandes über die Köpfe hinweg. Der Datendurchsatz liegt ungefähr zwischen 250 kByte/s und 500 kByte/s. Die Datenkapazität beginnt bei 300 MB und erreicht bis zu 7 GB bei den Spitzengeräten. Die meisten Geräte haben eine Hardwarekompression eingebaut, die die Kapazität ungefähr verdoppelt. Diese Laufwerke sind erhältlich in Form von Einzelgeräten oder als Multi-Drive-Bandbibliotheken mit 6 Laufwerken und 120 Bändern in einem Gehäuse. Die Bänder werden von der Geräteeinheit automatisch gewechselt. Die Kapazität einer solchen Bibliothek liegt bei 840 GB und mehr. Das Exabyte-Modell Mammoth unterstützt 12 GB auf einem Band (24 GB mit Kompression) und kostet etwa doppelt so viel wie ein konventionelles Bandlaufwerk. Die Daten werden mittels Helical-Scan auf das Band aufgezeichnet, die Köpfe sind leicht schräg zum Medium angebracht (mit einem Winkel von etwa 6 Grad). Das Band wickelt sich 270 Grad um die Spule, die die Köpfe trägt. Die Spule dreht sich, während das Band darüberläuft. Das Resultat ist eine hohe Datendichte und eng gepackte Spuren, die von einem Rand des Bands zum gegenüberliegenden quer über das Band abgewinkelt verlaufen. QIC Bandmedien QIC-150 QIC-150-Bänder und -Laufwerke sind wohl der am weitesten verbreitete Bandtyp überhaupt. QIC-Bandlaufwerke sind die preiswertesten seriösen Backupgeräte, die angeboten werden. Der Nachteil dabei ist der hohe Preis der Bänder. QIC-Bänder sind im Vergleich zu 8mm- oder 4mm-Bändern bis zu fünf Mal teurer, wenn man den Preis auf 1 GB Datenkapazität umrechnet. Aber wenn Ihr Bedarf mit einem halben Dutzend Bänder abgedeckt werden kann, mag QIC die richtige Wahl sein. QIC ist der gängigste Bandlaufwerkstyp. Jeder Standort hat ein QIC-Laufwerk der einen oder anderen Dichte. Aber gerade das ist der Haken an der Sache, QIC bietet eine große Anzahl verschiedener Datendichten auf physikalisch ähnlichen (manchmal gleichen) Bändern. QIC-Laufwerke sind nicht leise. Diese Laufwerke suchen lautstark die richtige Bandstelle, bevor sie mit der Datenaufzeichnung beginnen. Sie sind während des Lesens, Schreibens und Suchens deutlich hörbar. Die Abmessungen der QIC-Kassetten betragen 152 x 102 x 17 mm (6 x 4 x 0,7 Inch). Der Datendurchsatz liegt ungefähr zwischen 150 kByte/s und 500 kByte/s. Die Datenkapazität reicht von 40 MB bis zu 15 GB. Hardwarekompression ist in vielen der neueren QIC-Laufwerke eingebaut. QIC-Laufwerke werden heute seltener eingesetzt; sie werden von den DAT-Laufwerken abgelöst. Die Daten werden auf dem Band in Spuren aufgezeichnet. Die Spuren verlaufen entlang der Längsachse des Bandmediums von einem Ende zum anderen. Die Anzahl der Spuren, und damit auch die Breite einer Spur, variiert mit der Kapazität des Laufwerks. Die meisten, wenn nicht alle neueren Laufwerke sind rückwärtskompatibel, zumindest zum Lesen (aber oft auch zum Schreiben). QIC hat einen guten Ruf bezüglich der Datensicherheit (die Mechanik ist einfacher und robuster als diejenige der Helical-Scan-Laufwerke). Bänder sollten nach 5,000 Backups ersetzt werden. DLT Bandmedien DLT DLT hat die schnellste Datentransferrate von allen hier aufgelisteten Gerätetypen. Das 1/2-Inch-Band (12,7 mm) befindet sich in einer Spulkassette mit den Abmessungen 101,6 x 101,6 x 25,4 mm (4 x 4 x 1 Inch). Die eine Seite der Kassette hat eine bewegliche Abdeckung. Der Laufwerksmechanismus öffnet diese Abdeckung und zieht die Bandführung heraus. Die Bandführung trägt ein ovales Loch, die das Laufwerk zum Einhängen des Bandes benutzt. Die Aufwickelspule befindet sich im Innern des Bandlaufwerks. Bei allen anderen hier besprochenen Bandkassetten (9-Spur-Bänder sind die einzige Ausnahme) befinden sich sowohl die Auf- als auch die Abwickelspule im Inneren der Bandkassette. Der Datendurchsatz liegt bei etwa 1,5 MBytes/s, der dreifache Durchsatz der 4mm-, 8mm- oder QIC-Bandlaufwerke. Die Datenkapazität reicht von 10 GB bis 20 GB für Einfachlaufwerke. Auch Mehrfachbandgeräte sind erhältlich, sowohl als Bandwechsler wie auch als Multi-Drive-Bandbibliotheken, die Platz für 5 bis 900 Bänder verteilt auf 1 bis 20 Laufwerke enthalten, mit einer Speicherkapazität von 50 GB bis 9 TB. Mit Kompression unterstützt das Format DLT Type IV bis zu 70 GB Kapazität. Die Daten werden auf dem Band in Spuren aufgezeichnet, die parallel zur Bewegungsrichtung verlaufen (gerade so wie bei den QIC-Bändern). Zwei Spuren werden dabei gleichzeitig beschrieben. Die Lebenszeit der Lese- und Schreibköpfe sind relativ lang; denn sobald das Band anhält, gibt es keine Relativbewegung mehr zwischen den Köpfen und dem Band. AIT Bandmedien AIT AIT ist ein neues Format von Sony, das (mit Kompression) bis zu 50 GB pro Band speichern kann. Die Bänder haben einen Speicherchip, der einen Index mit dem Inhalt des Bandes anlegt. Dieser Index kann vom Bandlaufwerk zur schnellen Bestimmung der Lage von Dateien auf dem Band benutzt werden, während andere Bänder einige Minuten zur Lokalisierung benötigen. Entsprechende Software wie etwa SAMS:Alexandria können 40 oder mehr AIT-Bandbibliotheken verarbeiten, indem sie direkt mit dem Speicherchip des Bandes kommunizieren, wenn der Bandinhalt am Bildschirm dargestellt werden soll oder bestimmt werden soll, welche Dateien auf welchem Band gespeichert sind, oder um das richtige Band zu lokalisieren, zu laden und Daten vom Band zurückzuspielen. Bibliotheken dieser Art liegen in der Preiskategorie von $20,000, womit sie etwas aus dem Hobbymarkt herausfallen. Die erste Benutzung eines neuen Bands Der Versuch ein neues, vollkommen leeres Band ohne weiteres zu lesen oder zu beschreiben wird schief gehen. Auf der Konsole werden dann Meldungen ähnlich wie folgt ausgegeben: sa0(ncr1:4:0): NOT READY asc:4,1 0(ncr1:4:0): Logical unit is in process of becoming ready Das Band enthält nämlich keinen Identifier-Block (Blocknummer 0). Alle QIC-Bandlaufwerke seit der Einführung des QIC-525-Standards schreiben einen Identifier-Block auf das Band. Es gibt zwei Lösungen: mt fsf 1 veranlasst das Bandlaufwerk einen Identifier-Block auf das Band zu schreiben. Das Band durch Drücken des Bandauswurfknopfs an der Vorderseite des Bandgeräts auswerfen. Danach das Band wieder einlegen und mit dump Daten auf das Band übertragen. Das Kommando dump gibt die Meldung DUMP: End of tape detected zurück und die Konsole zeigt: HARDWARE FAILURE info:280 asc:80,96. Das Band zurückspulen mit dem Kommando: mt rewind. Nachfolgende Bandoperationen werden dann erfolgreich ausgeführt. Was ist mit Backups auf Disketten? Kann ich Disketten zum Backup meiner Daten verwenden? Backup Disketten Disketten Disketten sind kein wirklich geeignetes Medium für Backups aus folgenden Gründen: Disketten sind unzuverlässig, besonders langfristig. Speichern und Wiederherstellen ist sehr langsam. Sie haben eine sehr eingeschränkte Kapazität (Die Zeiten sind längst vorbei, wo eine ganze Festplatte auf ein Dutzend Floppies oder so gespeichert werden konnte). Wenn jedoch keine andere Möglichkeit zum Datenbackup vorhanden ist, dann sind Disketten immer noch besser als gar kein Backup. Wenn man gezwungen ist Disketten zu verwenden, dann sollte man auf eine gute Qualität achten. Floppies, die schon einige Jahre im Büro herumgelegen haben, sind eine schlechte Wahl. Ideal sind neue Disketten von einem renommierten Hersteller. Wie mache ich ein Backup auf Disketten? Die beste Art eines Diskettenbackups ist der Befehl &man.tar.1; mit der Mehrfachband-Option , die es ermöglicht ein Backup über mehrere Floppies zu verteilen. Ein Backup aller Dateien im aktuellen Verzeichnis einschließlich aller Unterverzeichnisse wird durch den folgenden Befehl veranlasst (als root): &prompt.root; tar Mcvf /dev/fd0 * Wenn die erste Floppy voll ist, meldet sich &man.tar.1; und verlangt einen Diskettenwechsel (weil &man.tar.1; unabhängig vom Medium arbeitet, wird das nächste Band (Volume) verlangt, was in diesem Zusammenhang eine Diskette bedeutet), in etwa wie folgt: Prepare volume #2 for /dev/fd0 and hit return: Dies wird mit steigender Volumenzahl wiederholt, bis alle angegebenen Dateien archiviert sind. Können Diskettenbackups komprimiert werden? tar gzip Kompression Leider erlaubt es &man.tar.1; nicht, die Option für Multi-Volume-Archive zu verwenden. Man kann natürlich alle Dateien mit &man.gzip.1; komprimieren, sie mit &man.tar.1; auf die Floppies aufspielen, und dann die Dateien wieder &man.gunzip.1; entkomprimieren! Wie werden Diskettenbackups wieder hergestellt? Zur Wiederherstellung des gesamten Archivs verwendet man: &prompt.root; tar Mxvf /dev/fd0 Eine Methode um nur bestimmte Dateien wieder her zu stellen ist mit der ersten Diskette den folgenden Befehl auszuführen: &prompt.root; tar Mxvf /dev/fd0 filename &man.tar.1; wird dann die folgenden Disketten anfordern, bis die benötigte Datei gefunden ist. Wenn man die Diskette kennt, auf der sich die Datei befindet, kann man alternativ diese Diskette auch direkt einlegen und den gleichen Befehl wie oben verwenden. Man beachte, dass, falls die erste Datei eine Fortsetzung einer Datei von einer der vorigen Disketten ist, &man.tar.1; die Warnung ausgibt, dass diese Datei nicht wiederhergestellt werden kann, selbst dann, wenn dies gar nicht verlangt wurde! Lowell Gilbert Beigetragen von Backup-Strategien Wenn Sie eine eigene Backup-Strategie planen, müssen Sie darauf achten, dass jedes der folgenden Probleme von Ihrer Strategie abgedeckt wird: Plattendefekte. Versehentliches Löschen von Dateien. Eine nicht vorhersehbare Korrumpierung von Dateien. Die vollständige Zerstörung Ihres Systems, etwa durch ein Feuer. Dazu gehört auch die Zerstörung von Backups, die am gleichen Ort aufbewahrt werden. Es ist nicht nur möglich, dass ein System für jedes dieser Probleme eine eigene (oft völlig unterschiedliche) Strategie benötigt. Es ist vielmehr unwahrscheinlich (sieht man von Systemen ab, die keine wichtigen Daten enthalten), dass eine Technik alle Problembereiche abdecken kann. Häufig verwendeten Techniken sind unter anderen: Die Archivierung des kompletten Systems auf externen Datenträgern, die an einem gesonderten Ort aufbewahrt werden. Dieser Ansatz schützt zwar vor allen oben angeführten Problemen, ist aber zeitaufwändig. Auch eine Wiederherstellung des Systems ist nicht ohne weiteres möglich. Zwar können Sie Kopien Ihrer Backups auch vor Ort und/oder auf online zugängigen Systemen aufbewahren, was aber nichts daran ändert, dass eine Wiederherstellung, insbesondere für nicht privilegierte Benutzer, nach wie vor nicht ohne weiteres möglich ist. Dateisystem-Snapshots. Diese Technik hilft zwar nur gegen das versehentliche Löschen von Dateien, in einem solchen Fall ist sie aber äußerst hilfreich. Vorteile dieser Technik sind außerdem die leichte und schnelle Implementierung und Handhabung. Das Erstellen von Kopien ganzer Dateisysteme und/oder Platten (etwa durch einen periodischen &man.rsync.1;-Transfer des kompletten Systems). Diese Technik ist insbesondere in Netzwerken mit besonderen Anforderungen nützlich. Der Schutz vor Plattendefekten ist allerdings schlechter als beim Einsatz von RAID. Die Fähigkeiten zur Wiederherstellung gelöschter Dateien sind mit denen von UFS-Snapshots vergleichbar. Ob diese Technik für Sie geeignet ist, hängt also letztlich von Ihren Anforderungen ab. RAID. Minimiert oder vermeidet Ausfallzeiten, die durch einen Plattendefekt verursacht werden könnten. Zwar können Plattendefekte (aufgrund der höheren Anzahl verwendeter Platten) häufiger auftreten, sie stellen aber dann kein so akutes Problem dar. Das Überprüfen von Datei-Fingerprints durch &man.mtree.8;. Dabei handelt es sich zwar um keine Backup-Technik im eigentlichen Sinne, Sie werden durch den Einsatz dieser Werkzeugs aber informiert, dass Sie auf Ihre Backups zurückgreifen müssen. Dies ist insbesondere beim Einsatz von Offline-Backups von großer Bedeutung. Daher sollte diese Technik regelmäßig eingesetzt werden. Es gibt noch zahlreiche weitere Techniken, von denen aber viele nur Variationen der eben beschriebenen Techniken sind. Spezielle Anforderungen erfordern dabei in der Regel auch spezielle Backup-Techniken (so erfordert das Backup einer aktiven Datenbank in der Regel ein auf die eingesetzte Datenbank-Software abgestimmtes Verfahren). Entscheidend ist daher immer, gegen welche Gefahren Sie sich schützen und wie Sie diesen Schutz realisieren wollen. Datensicherung Die drei wichtigsten Programme zur Sicherung von Daten sind &man.dump.8;, &man.tar.1; und &man.cpio.1;. Sichern und Wiederherstellen Datensicherung Backup Backup-Software dump Backup-Software restore dump restore dump und restore sind die traditionellen Backupprogramme in &unix; Systemen. Sie betrachten das Laufwerk als eine Ansammlung von Blöcken, operieren also unterhalb des Abstraktionslevels von Dateien, Links und Verzeichnissen, die die Grundlage des Dateisystemkonzepts bilden. Im Gegensatz zu anderen Backupprogrammen sichert dump ein ganzes Dateisystem auf einem Gerät. Es ist nicht möglich nur einen Teil des Dateisystems, oder einen Verzeichnisbaum, der mehr als ein Dateisystem umfasst, zu sichern. Das dump-Kommando schreibt keine Dateien oder Verzeichnise auf das Band, sondern die Blöcke, aus denen Dateien und Verzeichnisse bestehen. Wenn restore für das Extrahieren von Daten verwendet wird, werden temporäre Dateien standardmässig in /tmp/ abgelegt - wenn Sie von einer Platte mit einem kleinen /tmp-Verzeichnis zurücksichern, müssen Sie möglicherweise die Umgebungsvariable TMPDIR auf ein Verzeichnis mit mehr freiem Speicherplatz setzen, damit die Wiederherstellung gelingt. Wenn Sie mit dump das Root-Verzeichnis sichern, werden /home, /usr und viele andere Verzeichnisse nicht gesichert, da dies normalerweise Mountpunkte für andere Dateisysteme oder symbolische Links zu diesen Dateisystemen sind. dump hat einige Eigenarten, die noch aus den frühen Tagen der Version 6 von AT&T UNIX (ca. 1975) stammen. Die Parameter sind für 9-Spur-Bänder (6250 bpi) voreingestellt, nicht auf die heute üblichen Medien hoher Dichte (bis zu 62.182 ftpi). Bei der Verwendung der Kapazitäten moderner Bandlaufwerke muss diese Voreinstellung auf der Kommandozeile überschrieben werden. .rhosts rdump und rrestore können Daten über Netzwerk auf ein Band, das sich in einem Laufwerk eines anderen Computers befindet, überspielen. Beide Programme benutzen die Funktionen &man.rcmd.3; und &man.ruserok.3; zum Zugriff auf das entfernte Bandlaufwerk. Daher muss der Anwender, der das Backup durchführt, auf dem entfernten Rechner in .rhosts eingetragen sein. Die Argumente zu rdump und rrestore müssen zur Verwendung auf dem entfernten Computer geeignet sein. Wenn Sie zum Beispiel mit rdump von einem FreeBSD-Rechner aus auf ein Exabyte-Bandlaufwerk einer Sun mit Namen komodo zugreifen möchten, setzen Sie das folgende Kommando ab: &prompt.root; /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1 Zum Ausführen dieses Kommandos müssen Sie auf dem entfernten Rechner in .rhosts eingetragen sein. Die r-Kommandos sind ein großes Sicherheitsrisiko, daher sollten Sie deren Verwendung sorgfältig abwägen. Es ist auch möglich, dump und restore über eine gesicherte Verbindung mit ssh einzusetzen: <command>dump</command> mit <application>ssh</application> benutzen &prompt.root; /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \ targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz Sie können ebenfalls mit der internen Methode von dump auf entfernte Rechner zugreifen, indem Sie die Umgebungsvariable RSH setzen: <command>dump</command> über <application>ssh</application> mit gesetzter <envar>RSH</envar> benutzen &prompt.root; RSH=/usr/bin/ssh /sbin/dump -0uan -f tatargetuser@targetmachine.example.com:/dev/sa0 /usr <command>tar</command> Backup-Software tar &man.tar.1; stammt ebenfalls aus Version 6 von AT&T UNIX (ca. 1975). tar arbeitet mit dem Dateisystem, denn es schreibt Dateien und Verzeichnisse auf das Band. tar unterstützt zwar nicht alle Optionen, die bei &man.cpio.1; zur Verfügung stehen, aber dafür erfordert es auch nicht die ungewöhnliche Kommando-Pipeline, die von cpio verwendet wird. tar Seit FreeBSD 5.3 sind sowohl GNU tar als auch bsdtar verfügbar. Die GNU-Version starten Sie über gtar. Sie unterstützt auch entfernte Geräte, wobei die von rdump benutzte Syntax übernommen wurde. Um Daten mit tar auf ein an einer Sun-Workstation (namens komodo) angeschlossenes Exabyte-Bandlaufwerk zu archivieren, geben Sie Folgendes ein: &prompt.root; /usr/bin/gtar cf komodo:/dev/nsa8 . 2>&1 Alternativ können Sie für diese Sicherung auch bsdtar verwenden, indem Sie die Daten über eine Pipeline und rsh an das entfernte Laufwerk senden: &prompt.root; tar cf - . | rsh hostname dd of=tape-device obs=20b Wenn Sie Bedenken bezüglich der Sicherheit beim Backup über das Netz haben, sollten Sie ssh anstatt rsh benutzen. Cpio Backup-Software cpio cpio &man.cpio.1; ist das ursprüngliche Programm von &unix; Systemen zum Dateitransfer mit magnetischen Medien. cpio hat (neben vielen anderen Leistungsmerkmalen) Optionen zum Byte-Swapping, zum Schreiben einer Anzahl verschiedener Archivformate und zum Weiterleiten von Daten an andere Programme über eine Pipeline. Dieses letzte Leistungsmerkmal macht cpio zu einer ausgezeichneten Wahl für Installationsmedien. Leider kann cpio keine Dateibäume durchlaufen, so dass eine Liste der zu bearbeitenden Dateien über stdin angegeben werden muss. cpio unterstützt keine Backups über das Netzwerk. Man kann aber eine Pipeline und rsh verwenden, um Daten an ein entferntes Bandlaufwerk zu senden. &prompt.root; for f in directory_list; do find $f >> backup.list done &prompt.root; cpio -v -o --format=newc < backup.list | ssh user@host "cat > backup_device" Dabei steht directory_list für eine Aufzählung der Verzeichnisse, die Sie sichern wollen. user@host gibt den Benutzer auf dem Zielrechner an, der die Sicherung laufen lässt. Der Ort der Sicherung wird durch backup_device angegeben (z.B. /dev/nsa0). <command>pax</command> Backup-Software pax pax POSIX IEEE &man.pax.1; ist die Antwort von IEEE/&posix; auf tar und cpio. Über die Jahre hinweg sind die verschiedenen Versionen von tar und cpio leicht inkompatibel geworden. Daher hat &posix;, statt eine Standardisierung zwischen diesen auszufechten, ein neues Archivprogramm geschaffen. pax versucht viele der unterschiedlichen cpio- und tar-Formate zu lesen und zu schreiben, außerdem einige neue, eigene Formate. Die Kommandostruktur ähnelt eher cpio als tar. <application>Amanda</application> Backup-Software Amanda Amanda Amanda (Advanced Maryland Network Disk Archiver) ist ein Client/Server-Backupsystem, nicht nur ein einzelnes Programm. Ein Amanda-Server kann auf einem einzigen Bandlaufwerk Datensicherungen von jeder beliebigen Anzahl von Computern speichern, sofern auf diesen jeweils ein Amanda-Client läuft und sie über Netzwerk mit dem Amanda-Server verbunden sind. Ein häufiges Problem bei Standorten mit einer Anzahl großer Festplatten ist, dass das Kopieren der Daten auf Band langsamer vor sich geht als solche Daten anfallen. Amanda löst dieses Problem durch Verwendung einer Holding Disk, einer Festplatte zum gleichzeitigen Zwischenspeichern mehrerer Dateisysteme. Für Datensicherungen über einen längeren Zeitraum erzeugt Amanda Archivsets von allen Dateisystemen, die in Amandas Konfigurationsdatei genannt werden. Ein Archivset ist eine Gruppe von Bändern mit vollen Backups und Reihen von inkrementellen (oder differentiellen) Backups, die jeweils nur die Unterschiede zum vorigen Backup enthalten. Zur Wiederherstellung von beschädigten Dateisystemen benötigt man Das Letzte volle Backup und alle darauf folgenden inkrementellen Backups. Die Konfigurationsdatei ermöglicht die Feineinstellung der Backups und des Netzwerkverkehrs von Amanda. Amanda kann zum Schreiben der Daten auf das Band jedes der oben beschriebenen Backuprogramme verwenden. Amanda ist nicht Teil des Basissystems, Sie müssen Amanda über die Ports-Sammlung oder als Paket installieren. Tue nichts Tue nichts ist kein Computerprogramm, sondern die am häufigsten angewendete Backupstrategie. Diese kostet nichts, man muss keinen Backupplan befolgen, einfach nur nein sagen. Wenn etwas passiert, einfach grinsen und ertragen! Wenn Ihre Zeit und Ihre Daten nicht so wichtig sind, dann ist die Strategie Tue nichts das geeignetste Backupprogramm für Ihren Computer. Aber &unix; ist ein nützliches Werkzeug, Sie müssen damit rechnen, dass Sie innerhalb von sechs Monaten eine Sammlung von Dateien haben, die für Sie wertvoll geworden sind. Tue nichts ist die richtige Backupmethode für /usr/obj und andere Verzeichnisbäume, die vom Computer exakt wiedererzeugt werden können. Ein Beispiel sind die Dateien, die diese Handbuchseiten darstellen – sie wurden aus Quelldateien im Format SGML erzeugt. Es ist nicht nötig, Sicherheitskopien der Dateien in den sekundären Formaten wie etwa HTML zu erstellen. Die Quelldateien in SGML sollten jedoch in die regelmäßigen Backups mit einbezogen werden. Welches Backup-Programm ist am Besten? LISA dump, Punkt und Schluss. Elizabeth D. Zwicky hat alle hier genannten Backup-Programme bis zur Erschöpfung ausgetestet. Ihre eindeutige Wahl zur Sicherung aller Daten mit Berücksichtigung aller Besonderheiten von &unix; Dateisystemen ist dump. Elizabeth erzeugte Dateisysteme mit einer großen Vielfalt ungewöhnlicher Bedingungen (und einiger gar nicht so ungewöhnlicher) und testete jedes Programm durch ein Backup und eine Wiederherstellung dieser Dateisysteme. Unter den Besonderheiten waren Dateien mit Löchern, Dateien mit Löchern und einem Block mit Null-Zeichen, Dateien mit ausgefallenen Buchstaben im Dateinamen, unlesbare und nichtschreibbare Dateien, Gerätedateien, Dateien, deren Länge sich während des Backups ändert, Dateien, die während des Backups erzeugt und gelöscht werden, u.v.m. Sie berichtete über ihre Ergebnisse in LISA V im Oktober 1991, s. Torture-testing Backup and Archive Programs. Die Wiederherstellung in einem Notfall Vor dem Unglück Es sind nur vier Vorkehrungen zu treffen, um auf jedes erdenkliche Unglück vorbereitet zu sein. bsdlabel Als erstes drucken Sie das bsdlabel jeder Ihrer Festplatten (z.B. mittels bsdlabel da0 | lpr), die Partitions- und Dateisystemtabelle jeder Festplatte (mit /etc/fstab) sowie alle Bootmeldungen, jeweils in zweifacher Ausfertigung. fix-it floppies Zweitens, überzeugen Sie sich, dass sowohl die Bootdiskette als auch die Reparaturdiskette (boot.flp bzw. fixit.flp) all Ihre Geräte ansprechen können. Die einfachste Methode dies nachzuprüfen ist, Ihren Rechner mit der Boot-Diskette im Floppylaufwerk neu zu starten und die Bootmeldungen zu durchzusehen. Wenn all Ihre Geräte aufgelistet sind und funktionieren, können Sie weiter zu Schritt drei gehen. Ist das nicht der Fall, müssen Sie sich eine eigene Version der beiden zum Booten benötigten Disketten erstellen. Diese müssen einen Kernel enthalten, der all Ihre Platten mounten kann und Zugriff auf Ihr Bandlaufwerk gestattet. Diese Disketten müssen ferner folgende Programme enthalten: fdisk, bsdlabel, newfs, mount sowie jedes Backup-Programm, das Sie verwenden. Diese Programme müssen statisch gelinkt sein. Falls Sie dump verwenden, muss die Diskette auch restore enthalten. Drittens, machen Sie oft Backups auf Band. Jede Änderung seit Ihrem letzten Backup kann unwiederbringlich verloren gehen. Versehen Sie die Backup-Bänder mit Schreibschutz. Viertens, testen Sie aus, wie die Disketten (entweder boot.flp und fixit.flp oder Ihre beiden eigenen Disketten aus Schritt zwei) und die Bänder mit den Backups zu behandeln sind. Machen Sie sich Notizen zu diesem Test. Bewahren Sie diese Notizen zusammen mit den Bootdisketten, den Ausdrucken und den Bändern mit den Backups auf. Wenn der Ernstfall eintritt, werden Sie vielleicht so genervt sein, dass Sie ohne Ihre Notizen vielleicht das Backup auf Ihren Bändern zerstören. (Wie das geht? Man braucht nur unglücklicherweise den Befehl tar cvf /dev/sa0 einzugeben um ein Band zu überschreiben). Als zusätzliche Sicherheitsvorkehrung, kann man jeweils die Disketten und Bänder zweifach erstellen. Eine der Kopien sollte an einem entfernten Standort aufbewahrt werden. Ein entfernter Standort ist NICHT der Keller im gleichen Bürogebäude. Eine Anzahl von Firmen im World Trade Center musste diese Lektion auf die harte Tour lernen. Ein entfernter Standort sollte von Ihrem Computer und Ihren Festplatten physikalisch durch eine erhebliche Entfernung getrennt sein. Ein Beispielskript zum Erstellen eigener Bootdisketten /mnt/sbin/init gzip -c -best /sbin/fsck > /mnt/sbin/fsck gzip -c -best /sbin/mount > /mnt/sbin/mount gzip -c -best /sbin/halt > /mnt/sbin/halt gzip -c -best /sbin/restore > /mnt/sbin/restore gzip -c -best /bin/sh > /mnt/bin/sh gzip -c -best /bin/sync > /mnt/bin/sync cp /root/.profile /mnt/root chmod 500 /mnt/sbin/init chmod 555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt chmod 555 /mnt/bin/sh /mnt/bin/sync chmod 6555 /mnt/sbin/restore # # Minimale Dateisystemtabelle erstellen # cat > /mnt/etc/fstab < /mnt/etc/passwd < /mnt/etc/master.passwd < Nach dem Unglück Die Schlüsselfrage ist, ob Ihre Hardware überlebt hat. Denn da Sie ja regelmäßig Backups angefertigt haben, brauchen Sie sich um die Software keine Sorgen zu machen. Falls die Hardware beschädigt wurde, ersetzen Sie zuerst die defekten Teile bevor Sie den Computer benutzen. Falls die Hardware funktioniert, überprüfen Sie die Disketten. Wenn Sie eigene Bootdisketten verwenden, booten Sie im Single-User-Modus (geben dazu Sie -s am Boot-Prompt boot: ein). Überspringen Sie den folgenden Paragrafen. Wenn Sie die Standarddisketten boot.flp und fixit.flp verwenden, lesen Sie hier weiter. Legen Sie die Bootdiskette boot.flp in das erste Floppylaufwerk ein und starten Sie den Computer. Wie üblich wird dann das originale Installationsmenü von FreeBSD gestartet. Wählen Sie die Option Fixit--Repair mode with CD-ROM or floppy. Legen Sie die Diskette fixit.flp ein, wenn danach gefragt wird. restore und die anderen Programme, die Sie benötigen, befinden sich dann in /mnt2/rescue (/mnt2/stand vor &os; 5.2). Stellen Sie die Dateisysteme nacheinander, getrennt von einander, wieder her. mount Root-Partition bsdlabel newfs Versuchen Sie die Root-Partition Ihrer ersten Festplatte einzuhängen (z.B. mit mount /dev/sd0a /mnt). Wenn das Bsdlabel beschädigt wurde, benutzen Sie bsdlabel um die Platte neu zu partitionieren und zu benennen und zwar so, dass die Festplatte mit dem Label übereinstimmt, das Sie ausgedruckt und aufbewahrt haben. Verwenden Sie newfs um neue Dateisysteme auf den Partitionen anzulegen. Hängen Sie nun die Root-Partition der Festplatte mit Schreibzugriff ein (mit mount -u -o rw /mnt). Benutzen Sie Ihr Backup-Programm um die Daten für das jeweilige Dateisystem aus den Backup-Bändern wieder her zu stellen (z.B. durch restore vrf /dev/sta). Hängen Sie das Dateisystem wieder aus (z.B. durch umount /mnt). Wiederholen Sie diesen Ablauf für jedes betroffene Dateisystem. Sobald Ihr System wieder läuft, machen Sie gleich wieder ein vollständiges Backup auf neue Bänder. Denn die Ursache für den Absturz oder den Datenverlust kann wieder zuschlagen. Eine weitere Stunde, die Sie jetzt noch dranhängen, kann Ihnen später ein weiteres Missgeschick ersparen. * Ich habe mich nicht auf Missgeschicke vorbereitet - was nun? ]]> Marc Fonvieille Verbessert und neu strukturiert von Netzwerk-, speicher- und dateibasierte Dateisysteme Laufwerke virtuelle Neben Laufwerken, die sich physikalisch im Rechner befinden wie Floppylaufwerke, CDs, Festplatten usw., kann FreeBSD auch mit anderen Laufwerken, den virtuellen Laufwerken, umgehen. NFS Coda Laufwerke speicherbasierte Laufwerke RAM-Disks Dazu zählen Netzwerkdateisysteme wie Network Filesystem und Coda, speicher- und dateibasierte Dateisysteme. Abhängig von der verwendeten FreeBSD Version werden speicher- und dateibasierte Dateisysteme mit unterschiedlichen Werkzeugen angelegt. Gerätedateien werden unter &os; automatisch von &man.devfs.5; angelegt. Dateibasierte Laufwerke unter FreeBSD Laufwerke dateibasierte Unter FreeBSD werden virtuelle Laufwerke (&man.md.4;) mit &man.mdconfig.8; erzeugt. Dazu muss das Modul &man.md.4; geladen sein oder das entsprechende Gerät in der Kernelkonfiguration aktiviert sein: device md Mit &man.mdconfig.8; können drei verschiedene virtuelle Laufwerke angelegt werden: speicherbasierte Laufwerke, deren Speicher von &man.malloc.9; zur Verfügung gestellt wird, oder dateibasierte Laufwerke, deren Speicher von einer Datei oder dem Swap-Bereich zur Verfügung gestellt wird. Eine mögliche Anwendung ist das Einhängen von Dateien, die Abbilder von CD-ROMs oder Floppies enthalten. Das Abbild eines Dateisystems wird wie folgt eingehangen: Einhängen eines existierenden Abbildes unter FreeBSD &prompt.root; mdconfig -a -t vnode -f diskimage -u 0 &prompt.root; mount /dev/md0 /mnt Ein neues Dateisystem-Abbild erstellen Sie mit &man.mdconfig.8; wie folgt: Erstellen eines dateibasierten Laufwerks mit <command>mdconfig</command> &prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k 5120+0 records in 5120+0 records out &prompt.root; mdconfig -a -t vnode -f newimage -u 0 &prompt.root; bsdlabel -w md0 auto &prompt.root; newfs md0a /dev/md0a: 5.0MB (10224 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes. super-block backups (for fsck -b #) at: 160, 2720, 5280, 7840 &prompt.root; mount /dev/md0a /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md0a 4710 4 4330 0% /mnt Wenn Sie keine Gerätenummer mit dem Schalter angeben, wird von &man.md.4; automatisch eine ungenutzte Gerätenummer zugewiesen. Das zugewiesene Gerät wird auf der Standardausgabe ausgegeben (zum Beispiel md4). Weitere Informationen entnehmen Sie bitte der Hilfeseite &man.mdconfig.8;. Das Werkzeug &man.mdconfig.8; ist sehr nützlich, doch muss man viele Kommandos absetzen, um ein dateibasiertes Dateisystem zu erstellen. FreeBSD enthält das Werkzeug &man.mdmfs.8;, das die notwendigen Schritte in einem Befehl zusammenfasst. Es konfiguriert mit &man.mdconfig.8; ein &man.md.4;-Laufwerk, erstellt darauf mit &man.newfs.8; ein Dateisystem und hängt es anschließend mit &man.mount.8; ein. Das virtuelle Laufwerk aus dem obigen Beispiel kann somit einfach mit den nachstehenden Befehlen erstellt werden: Mit <command>mdmfs</command> ein dateibasiertes Dateisystem erstellen &prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k 5120+0 records in 5120+0 records out &prompt.root; mdmfs -F newimage -s 5m md0 /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md0 4718 4 4338 0% /mnt Wenn sie die Option ohne Gerätenummer verwenden, wählt &man.md.4; automatisch ein ungenutztes Gerät aus. Weitere Einzelheiten entnehmen Sie bitte der Hilfeseite &man.mdmfs.8;. Speicherbasierte Laufwerke unter FreeBSD Laufwerke speicherbasierte Verwenden Sie ein speicherbasiertes Dateisystem, sollten Sie die Option swap backing aktivieren. Setzen Sie diese Option, heißt dies allerdings nicht, dass das speicherbasierte Laufwerk automatisch auf ihre Festplatte ausgelagert wird, vielmehr wird der Speicherplatz danach aus einem Speicherpool angefordert, der bei Bedarf auf die Platte ausgelagert werden kann. Zusätzlich ist es möglich, &man.malloc.9;-gestützte speicherbasierte Laufwerke zu erstellen. Das Anlegen solcher Laufwerke kann allerdings zu einer System-Panic führen, wenn der Kernel danach über zu wenig Speicher verfügt. Erstellen eines speicherbasierten Laufwerks mit <command>mdconfig</command> &prompt.root; mdconfig -a -t swap -s 5m -u 1 &prompt.root; newfs -U md1 /dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.27MB, 81 blks, 192 inodes. with soft updates super-block backups (for fsck -b #) at: 160, 2752, 5344, 7936 &prompt.root; mount /dev/md1 /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md1 4718 4 4338 0% /mnt Erstellen eines speicherbasierten Laufwerks mit <command>mdmfs</command> &prompt.root; mdmfs -s 5m md2 /mnt &prompt.root; df /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md2 4846 2 4458 0% /mnt Virtuelle Laufwerke freigeben Laufwerke Freigabe von virtuellen Laufwerken Wenn ein virtuelles Laufwerk nicht mehr gebraucht wird, sollten Sie dem System die belegten Ressourcen zurückgeben. Hängen Sie dazu zuerst das Dateisystem ab und geben Sie dann die benutzten Ressourcen mit &man.mdconfig.8; frei. Alle von /dev/md4 belegten Ressourcen werden mit dem nachstehenden Kommando freigegeben: &prompt.root; mdconfig -d -u 4 Eingerichtete &man.md.4;-Geräte werden mit dem Befehl mdconfig -l angezeigt. Tom Rhodes Beigetragen von Schnappschüsse von Dateisystemen Schnappschüsse von Dateisystemen Zusammen mit Soft Updates bietet FreeBSD eine neue Funktion: Schnappschüsse von Dateisystemen. Schnappschüsse sind Dateien, die ein Abbild eines Dateisystems enthalten und müssen auf dem jeweiligen Dateisystem erstellt werden. Pro Dateisystem darf es maximal 20 Schnappschüsse, die im Superblock vermerkt werden, geben. Schnappschüsse bleiben erhalten, wenn das Dateisystem abgehangen, neu eingehangen oder das System neu gestartet wird. Wenn Sie einen Schnappschuss nicht mehr benötigen, können Sie ihn mit &man.rm.1; löschen. Es ist egal, in welcher Reihenfolge Schnappschüsse gelöscht werden. Es kann allerdings vorkommen, dass nicht der gesamte Speicherplatz wieder freigegeben wird, da ein anderer Schnappschuss einen Teil der entfernten Blöcke für sich beanspruchen kann. Das unveränderliche -Dateiflag wird nach der Erstellung des Snaphshots von &man.mksnap.ffs.8; gesetzt. Durch die Verwendung von &man.unlink.1; ist es allerdings möglich, einen Schnappschuss zu löschen. Schnappschüsse werden mit &man.mount.8; erstellt. Das folgende Kommando legt einen Schnappschuss von /var in /var/snapshot/snap ab: &prompt.root; mount -u -o snapshot /var/snapshot/snap /var Den Schnappschuss können Sie auch mit &man.mksnap.ffs.8; erstellen: &prompt.root; mksnap_ffs /var /var/snapshot/snap Um einen Schnappschuss auf Ihrem System zu finden, verwenden Sie &man.find.1;: &prompt.root; find /var -flags snapshot Nachdem ein Schnappschuss erstellt wurde, können Sie ihn für verschiedene Zwecke benutzen: Sie können den Schnappschuss für die Datensicherung benutzen und ihn auf eine CD oder ein Band schreiben. Sie können den Schnappschuss mit &man.fsck.8; manuell prüfen. Wenn das Dateisystem zum Zeitpunkt der Erstellung des Schnappschusses in Ordnung war, sollte &man.fsck.8; immer erfolgreich durchlaufen. Der Hintergrund-Prozess &man.fsck.8; hat im Übrigen genau diese Aufgabe. Sie können den Schnappschuss mit &man.dump.8; sichern. Sie erhalten dann eine konsistente Sicherung des Dateisystems zu dem Zeitpunkt, der durch den Zeitstempel des Schnappschusses gegeben ist. Der Schalter von &man.dump.8; erstellt für die Sicherung einen Schnappschuss und entfernt diesen am Ende der Sicherung wieder. Sie können einen Schnappschuss in den Verzeichnisbaum einhängen und sich dann den Zustand des Dateisystems zu dem Zeitpunkt ansehen, an dem der Schnappschuss erstellt wurde. Der folgende Befehl hängt den Schnappschuss /var/snapshot/snap ein: &prompt.root; mdconfig -a -t vnode -f /var/snapshot/snap -u 4 &prompt.root; mount -r /dev/md4 /mnt Sie können sich nun den eingefrorenen Stand des /var Dateisystems unterhalb von /mnt ansehen. Mit Ausnahme der früheren Schnappschüsse, die als leere Dateien auftauchen, wird zu Beginn alles so aussehen, wie zum Zeitpunkt der Erstellung des Schnappschusses. Wenn Sie den Schnappschuss nicht mehr benötigen, können Sie ihn, wie nachfolgend gezeigt, abhängen: &prompt.root; umount /mnt &prompt.root; mdconfig -d -u 4 Weitere Informationen über Soft Updates und Schnappschüsse von Dateisystemen sowie technische Artikel finden Sie auf der Webseite von Marshall Kirk McKusick. Dateisystem-Quotas Accounting Plattenplatz Disk Quotas Quotas sind eine optionale Funktion des Betriebssystems, die es Ihnen erlauben, den Plattenplatz und/oder die Anzahl der Dateien eines Benutzers oder der Mitglieder einer Gruppe, auf Dateisystemebene zu beschränken. Oft wird dies auf Timesharing-Systemen (Mehrbenutzersystemen) genutzt, da es dort erwünscht ist, die Ressourcen, die ein Benutzer oder eine Gruppe von Benutzern belegen können, zu limitieren. Das verhindert, dass ein Benutzer oder eine Gruppe von Benutzern den ganzen verfügbaren Plattenplatz belegt. Konfiguration des Systems, um Quotas zu aktivieren Bevor Quotas benutzt werden können, müssen sie im Kernel konfiguriert werden, wozu die folgende Zeile der Kernelkonfiguration hinzugefügt wird: options QUOTA Im gewöhnlichen GENERIC Kernel sind Quotas nicht aktiviert, so dass Sie einen angepassten Kernel konfigurieren und bauen müssen, um Quotas zu benutzen. Weitere Informationen finden Sie in . Durch Hinzufügen der folgenden Zeile in /etc/rc.conf wird das Quota-System aktiviert: enable_quotas="YES" Disk Quotas überprüfen Um den Start des Quota-Systems zu beeinflussen, steht eine weitere Variable zur Verfügung. Normalerweise wird beim Booten die Integrität der Quotas auf allen Dateisystemen mit &man.quotacheck.8; überprüft. &man.quotacheck.8; stellt sicher, dass die Quota-Datenbank mit den Daten auf einem Dateisystem übereinstimmt. Dies ist allerdings ein sehr zeitraubender Prozess, der die Zeit, die das System zum Booten braucht, signifikant beeinflusst. Eine Variable in /etc/rc.config erlaubt es Ihnen, diesen Schritt zu überspringen: check_quotas="NO" Schließlich müssen Sie noch in /etc/fstab die Plattenquotas auf Dateisystemebene aktivieren. Dort können Sie für alle Dateisysteme Quotas für Benutzer, Gruppen oder für beide aktivieren. Um Quotas pro Benutzer für ein Dateisystem zu aktivieren, geben Sie für dieses Dateisystem die Option im Feld Optionen von /etc/fstab an. Beispiel: /dev/da1s2g /home ufs rw,userquota 1 2 Um Quotas für Gruppen einzurichten, verwenden Sie anstelle von . Um Quotas für Benutzer und Gruppen einzurichten, ändern Sie den Eintrag wie folgt ab: /dev/da1s2g /home ufs rw,userquota,groupquota 1 2 Die Quotas werden jeweils im Rootverzeichnis des Dateisystems unter dem Namen quota.user für Benutzer-Quotas und quota.group für Gruppen-Quotas abgelegt. Obwohl &man.fstab.5; beschreibt, dass diese Dateien an anderer Stelle gespeichert werden können, wird das nicht empfohlen, da es den Anschein hat, dass die verschiedenen Quota-Utilities das nicht richtig unterstützen. Jetzt sollten Sie Ihr System mit dem neuen Kernel booten. /etc/rc wird dann automatisch die richtigen Kommandos aufrufen, die die Quota-Dateien für alle Quotas, die Sie in /etc/fstab definiert haben, anlegen. Deshalb müssen vorher auch keine leeren Quota-Dateien angelegt werden. Normalerweise brauchen Sie die Kommandos &man.quotacheck.8;, &man.quotaon.8; oder &man.quotaoff.8; nicht händisch aufzurufen, obwohl Sie vielleicht die entsprechenden Seiten im Manual lesen sollten, um sich mit ihnen vertraut zu machen. Setzen von Quota-Limits Disk Quotas Limits Nachdem Sie Quotas in Ihrem System aktiviert haben, sollten Sie überprüfen, dass Sie auch tatsächlich aktiviert sind. Führen Sie dazu einfach den folgenden Befehl aus: &prompt.root; quota -v Für jedes Dateisystem, auf dem Quotas aktiviert sind, sollten Sie eine Zeile mit der Plattenauslastung und den aktuellen Quota-Limits sehen. Mit &man.edquota.8; können Sie nun Quota-Limits setzen. Sie haben mehrere Möglichkeiten, die Limits für den Plattenplatz, den ein Benutzer oder eine Gruppe verbrauchen kann, oder die Anzahl der Dateien, die angelegt werden dürfen, festzulegen. Die Limits können auf dem Plattenplatz (Block-Quotas) oder der Anzahl der Dateien (Inode-Quotas) oder einer Kombination von beiden basieren. Jedes dieser Limits wird weiterhin in zwei Kategorien geteilt: Hardlimits und Softlimits. Hardlimit Ein Hardlimit kann nicht überschritten werden. Hat der Benutzer einmal ein Hardlimit erreicht, so kann er auf dem betreffenden Dateisystem keinen weiteren Platz mehr beanspruchen. Hat ein Benutzer beispielsweise ein Hardlimit von 500 Kilobytes auf einem Dateisystem und benutzt davon 490 Kilobyte, so kann er nur noch 10 weitere Kilobytes beanspruchen. Der Versuch, weitere 11 Kilobytes zu beanspruchen, wird fehlschlagen. Softlimit Im Gegensatz dazu können Softlimits für eine befristete Zeit überschritten werden. Diese Frist beträgt in der Grundeinstellung eine Woche. Hat der Benutzer das Softlimit über die Frist hinaus überschritten, so wird das Softlimit in ein Hardlimit umgewandelt und der Benutzer kann keinen weiteren Platz mehr beanspruchen. Wenn er einmal das Softlimit unterschreitet, wird die Frist wieder zurückgesetzt. Das folgende Beispiel zeigt die Benutzung von &man.edquota.8;. Wenn &man.edquota.8; aufgerufen wird, wird der Editor gestartet, der durch EDITOR gegeben ist oder vi falls EDITOR nicht gesetzt ist. In dem Editor können Sie die Limits eingeben. &prompt.root; edquota -u test Quotas for user test: /usr: kbytes in use: 65, limits (soft = 50, hard = 75) inodes in use: 7, limits (soft = 50, hard = 60) /usr/var: kbytes in use: 0, limits (soft = 50, hard = 75) inodes in use: 0, limits (soft = 50, hard = 60) Für jedes Dateisystem, auf dem Quotas aktiv sind, sehen Sie zwei Zeilen, eine für die Block-Quotas und die andere für die Inode-Quotas. Um ein Limit zu modifizieren, ändern Sie einfach den angezeigten Wert. Um beispielsweise das Blocklimit dieses Benutzers von einem Softlimit von 50 und einem Hardlimit von 75 auf ein Softlimit von 500 und ein Hardlimit von 600 zu erhöhen, ändern Sie die Zeile /usr: kbytes in use: 65, limits (soft = 50, hard = 75) zu: /usr: kbytes in use: 65, limits (soft = 500, hard = 600) Die neuen Limits sind wirksam, wenn Sie den Editor verlassen. Manchmal ist es erwünscht, die Limits für einen Bereich von UIDs zu setzen. Dies kann mit der Option von &man.edquota.8; bewerkstelligt werden. Weisen Sie dazu die Limits einem Benutzer zu und rufen danach edquota -p protouser startuid-enduid auf. Besitzt beispielsweise der Benutzer test die gewünschten Limits, können diese mit dem folgenden Kommando für die UIDs 10.000 bis 19.999 dupliziert werden: &prompt.root; edquota -p test 10000-19999 Weitere Informationen erhalten Sie in &man.edquota.8;. Überprüfen von Quota-Limits und Plattennutzung Disk Quotas überprüfen Sie können &man.quota.1; oder &man.repquota.8; benutzen, um Quota-Limits und Plattennutzung zu überprüfen. Um die Limits oder die Plattennutzung individueller Benutzer und Gruppen zu überprüfen, kann &man.quota.1; benutzt werden. Ein Benutzer kann nur die eigenen Quotas und die Quotas der Gruppe, der er angehört untersuchen. Nur der Superuser darf sich alle Limits ansehen. Mit &man.repquota.8; erhalten Sie eine Zusammenfassung von allen Limits und der Plattenausnutzung für alle Dateisysteme, auf denen Quotas aktiv sind. Das folgende Beispiel zeigt die Ausgabe von quota -v für einen Benutzer, der Quota-Limits auf zwei Dateisystemen besitzt: Disk quotas for user test (uid 1002): Filesystem usage quota limit grace files quota limit grace /usr 65* 50 75 5days 7 50 60 /usr/var 0 50 75 0 50 60 Disk Quotas Frist Im Dateisystem /usr liegt der Benutzer momentan 15 Kilobytes über dem Softlimit von 50 Kilobytes und hat noch 5 Tage seiner Frist übrig. Der Stern * zeigt an, dass der Benutzer sein Limit überschritten hat. In der Ausgabe von &man.quota.1; werden Dateisysteme, auf denen ein Benutzer keinen Platz verbraucht, nicht angezeigt, auch wenn diesem Quotas zugewiesen wurden. Mit werden diese Dateisysteme, wie /usr/var im obigen Beispiel, angezeigt. Quotas über NFS NFS Quotas werden von dem Quota-Subsystem auf dem NFS Server erzwungen. Der &man.rpc.rquotad.8; Dæmon stellt &man.quota.1; die Quota Informationen auf dem NFS Client zur Verfügung, so dass Benutzer auf diesen Systemen ihre Quotas abfragen können. Aktivieren Sie rpc.rquotad in /etc/inetd.conf wie folgt: rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad Anschließend starten Sie inetd neu: &prompt.root; /etc/rc.d/inetd restart Lucky Green Beigetragen von
shamrock@cypherpunks.to
Partitionen verschlüsseln Partitionen verschlüsseln FreeBSD bietet ausgezeichnete Möglichkeiten, Daten vor unberechtigten Zugriffen zu schützen. Wenn das Betriebssystem läuft, schützen Zugriffsrechte und vorgeschriebene Zugriffskontrollen (MAC) (siehe ) die Daten. Die Zugriffskontrollen des Betriebssystems schützen allerdings nicht vor einem Angreifer, der Zugriff auf den Rechner hat. Der Angreifer kann eine Festplatte einfach in ein anderes System einbauen und dort die Daten analysieren. Die für &os; verfügbaren kryptografischen Subsysteme GEOM Based Disk Encryption (gbde) und geli sind in der Lage, Daten auf Dateisystemen auch vor hoch motivierten Angreifern zu schützen, die über erhebliche Mittel verfügen. Dieser Schutz ist unabhängig von der Art und Weise, durch die ein Angreifer Zugang zu einer Festplatte oder zu einem Rechner erlangt hat. Im Gegensatz zu schwerfälligen Systemen, die einzelne Dateien verschlüsseln, verschlüsseln gbde und geli transparent ganze Dateisysteme. Auf der Festplatte werden dabei keine Daten im Klartext gespeichert. Plattenverschlüsselung mit <application>gbde</application> Wechseln sie zu <username>root</username> Sie benötigen Superuser-Rechte, um gbde einzurichten. &prompt.user; su - Password: Aktivieren Sie &man.gbde.4; in der Kernelkonfigurationsdatei Fügen Sie folgende Zeile in Ihre Kernelkonfigurationsdatei ein: options GEOM_BDE Übersetzen und installieren Sie den FreeBSD-Kernel wie in beschrieben. Starten sie das System neu, um den neuen Kernel zu benutzen. Alternativ zur Neukompilierung des Kernels können Sie auch kldload verwenden, um das Kernelmodul &man.gbde.4; zu laden: &prompt.root; kldload geom_bde Einrichten eines verschlüsselten Dateisystems Das folgende Beispiel beschreibt, wie ein Dateisystem auf einer neuen Festplatte verschlüsselt wird. Das Dateisystem wird in /private eingehangen. Mit gbde könnten auch /home und /var/mail verschlüsselt werden. Die dazu nötigen Schritte können allerdings in dieser Einführung nicht behandelt werden. Installieren der Festplatte Installieren Sie die Festplatte wie in beschrieben. Im Beispiel verwenden wir die Partition /dev/ad4s1c. Die Gerätedateien /dev/ad0s1* sind Standard-Partitionen des FreeBSD-Systems. &prompt.root; ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4 Verzeichnis für gbde-Lock-Dateien anlegen &prompt.root; mkdir /etc/gbde Die Lock-Dateien sind für den Zugriff von gbde auf verschlüsselte Partitionen notwendig. Ohne die Lock-Dateien können die Daten nur mit erheblichem manuellen Aufwand wieder entschlüsselt werden (dies wird auch von der Software nicht unterstützt). Jede verschlüsselte Partition benötigt eine gesonderte Lock-Datei. Vorbereiten der gbde-Partition Eine von gbde benutzte Partition muss einmalig vorbereitet werden: &prompt.root; gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock &man.gbde.8; öffnet eine Vorlage in Ihrem Editor, in der Sie verschiedene Optionen einstellen können. Setzen Sie sector_size auf 2048, wenn Sie UFS1 oder UFS2 benutzen. $FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $ # # Sector size is the smallest unit of data which can be read or written. # Making it too small decreases performance and decreases available space. # Making it too large may prevent filesystems from working. 512 is the # minimum and always safe. For UFS, use the fragment size # sector_size = 2048 [...] &man.gbde.8; fragt dann zweimal eine Passphrase zum Schutz der Daten ab. Die Passphrase muss beides Mal gleich eingegeben werden. Die Sicherheit der Daten hängt alleine von der Qualität der gewählten Passphrase ab. Die Auswahl einer sicheren und leicht zu merkenden Passphrase wird auf der Webseite Diceware Passphrase beschrieben. Mit gbde init wurde im Beispiel auch die Lock-Datei /etc/gbde/ad4s1c.lock angelegt. gbde-Lockdateien müssen die Dateiendung .lock aufweisen, damit sie von /etc/rc.d/gbde, dem Startskript von gbde, erkannt werden. Sichern Sie die Lock-Dateien von gbde immer zusammen mit den verschlüsselten Dateisystemen. Ein entschlossener Angreifer kann die Daten vielleicht auch ohne die Lock-Datei entschlüsseln. Ohne die Lock-Datei können Sie allerdings nicht auf die verschlüsselten Daten zugreifen. Dies ist nur noch mit erheblichem manuellen Aufwand möglich, der weder von &man.gbde.8; noch seinem Entwickler unterstützt wird. Einbinden der verschlüsselten Partition in den Kernel &prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock Das Kommando fragt die Passphrase ab, die Sie beim Vorbereiten der Partition eingegeben haben. Das neue Gerät erscheint danach als /dev/device_name.bde im Verzeichnis /dev: &prompt.root; ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde Dateisystem auf dem verschlüsselten Gerät anlegen Wenn der Kernel die verschlüsselte Partition kennt, können Sie ein Dateisystem auf ihr anlegen. Benutzen Sie dazu den Befehl &man.newfs.8;. Da ein Dateisystem vom Typ UFS2 sehr viel schneller als eins vom Typ UFS1 angelegt wird, empfehlen wir Ihnen, die Option zu benutzen. &prompt.root; newfs -U -O2 /dev/ad4s1c.bde &man.newfs.8; muss auf einer dem Kernel bekannten gbde-Partition (einem Gerät mit dem Namen *.bde laufen. Einhängen der verschlüsselten Partition Legen Sie einen Mountpunkt für das verschlüsselte Dateisystem an: &prompt.root; mkdir /private Hängen Sie das verschlüsselte Dateisystem ein: &prompt.root; mount /dev/ad4s1c.bde /private Überprüfen des verschlüsselten Dateisystem Das verschlüsselte Dateisystem sollte jetzt von &man.df.1; erkannt werden und benutzt werden können. &prompt.user; df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 1037M 72M 883M 8% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 8.1G 55K 7.5G 0% /home /dev/ad0s1e 1037M 1.1M 953M 0% /tmp /dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr /dev/ad4s1c.bde 150G 4.1K 138G 0% /private Einhängen eines existierenden verschlüsselten Dateisystems Nach jedem Neustart müssen verschlüsselte Dateisysteme dem Kernel wieder bekannt gemacht werden, auf Fehler überprüft werden und eingehangen werden. Die dazu nötigen Befehle müssen als root durchgeführt werden. gbde-Partition im Kernel bekannt geben &prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock Das Kommando fragt nach der Passphrase, die Sie beim Vorbereiten der verschlüsselten gbde-Partition festgelegt haben. Prüfen des Dateisystems Das verschlüsselte Dateisystem kann noch nicht automatisch über /etc/fstab eingehangen werden. Daher muss es vor dem Einhängen mit &man.fsck.8; geprüft werden: &prompt.root; fsck -p -t ffs /dev/ad4s1c.bde Einhängen des verschlüsselten Dateisystems &prompt.root; mount /dev/ad4s1c.bde /private Das verschlüsselte Dateisystem steht danach zur Verfügung. Verschlüsselte Dateisysteme automatisch einhängen Mit einem Skript können verschlüsselte Dateisysteme automatisch bekannt gegeben, geprüft und eingehangen werden. Wir raten Ihnen allerdings aus Sicherheitsgründen davon ab. Starten Sie das Skript manuell an der Konsole oder in einer &man.ssh.1;-Sitzung. Zu diesem Zweck existiert ein rc.d-Skript, an das über Einträge in der Datei &man.rc.conf.5; Argumente übergeben werden können. Dazu ein Beispiel: gbde_autoattach_all="YES" gbde_devices="ad4s1c" gbde_lockdir="/etc/gbde" Durch diese Argumente muss beim Systemstart die gbde-Passphrase eingegeben werden. Erst nach Eingabe der korrekten Passphrase wird die gbde-verschlüsselte Partition automatisch in den Verzeichnisbaum eingehängt. Dieses Vorgehen ist insbesondere dann nützlich, wenn Sie gbde auf einem Notebook einsetzen wollen. Kryptografische Methoden von gbde &man.gbde.8; benutzt den 128-Bit AES im CBC-Modus, um die Daten eines Sektors zu verschlüsseln. Jeder Sektor einer Festplatte wird mit einem unterschiedlichen AES-Schlüssel verschlüsselt. Mehr Informationen, unter anderem wie die Schlüssel für einen Sektor aus der gegebenen Passphrase ermittelt werden, erhalten Sie in &man.gbde.4;. Kompatibilität &man.sysinstall.8; kann nicht mit verschlüsselten gbde-Geräten umgehen. Vor dem Start von &man.sysinstall.8; sind alle *.bde-Geräte zu deaktivieren, da &man.sysinstall.8; sonst bei der Gerätesuche abstürzt. Das im Beispiel verwendete Gerät wird mit dem folgenden Befehl deaktiviert: &prompt.root; gbde detach /dev/ad4s1c Sie können gbde nicht zusammen mit vinum benutzen, da &man.vinum.4; das &man.geom.4;-Subsystem nicht benutzt. Daniel Gerzo Beigetragen von Plattenverschlüsselung mit <command>geli</command> Mit &os; 6.0 wurde eine neue kryptografische GEOM-Klasse eingeführt - geli. Diese wird derzeit von &a.pjd; weiterentwickelt. geli unterscheidet sich von gbde durch unterschiedliche Fähigkeiten und einen unterschiedlichen Ansatz für die Verschlüsselung von Festplatten. Die wichtigsten Merkmale von &man.geli.8; sind: Der Einsatz des &man.crypto.9;-Frameworks – verfügt das System über kryptografische Hardware, wird diese von geli automatisch verwendet. Die Unterstützung verschiedener kryptografischer Algorithmen (derzeit AES, Blowfish, sowie 3DES). Die Möglichkeit, die root-Partition zu verschlüsseln. Um auf die verschlüsselte root-Partition zugreifen zu können, muss beim Systemstart die Passphrase eingegeben werden. geli erlaubt den Einsatz von zwei voneinander unabhängigen Schlüsseln (etwa einem privaten Schlüssel und einem Unternehmens-Schlüssel). geli ist durch einfache Sektor-zu-Sektor-Verschlüsselung sehr schnell. Die Möglichkeit, Master-Keys zu sichern und wiederherzustellen. Wenn ein Benutzer seinen Schlüssel zerstört, kann er über seinen zuvor gesicherten Schlüssel wieder auf seine Daten zugreifen. geli erlaubt es, Platten mit einem zufälligen Einmal-Schlüssel einzusetzen, was insbesondere für Swap-Partitionen und temporäre Dateisysteme interessant ist. Weitere Informationen zu den Fähigkeiten von geli finden Sie in &man.geli.8;. Die folgenden Schritte beschreiben, wie Sie geli im &os;-Kernel aktivieren und einen geli-Verschlüsselungs-Provider anlegen können. Voraussetzung für die Nutzung von geli ist der Einsatz von &os; 6.0-RELEASE oder neuer. Da Sie Ihren Kernel anpassen müssen, benötigen Sie außerdem root-Privilegien. Aufnahme der <command>geli</command>-Unterstützung in Ihre Kernelkonfigurationsdatei Fügen Sie die folgenden Zeilen in Ihre Kernelkonfigurationsdatei ein: options GEOM_ELI device crypto Bauen und installieren Sie Ihren neuen Kernel wie in beschrieben. Alternativ können Sie aber auch das geli-Kernelmodul beim Systemstart laden. Dazu fügen Sie die folgende Zeile in /boot/loader.conf ein: geom_eli_load="YES" Ab sofort wird &man.geli.8; vom Kernel unterstützt. Erzeugen des Master-Keys Das folgende Beispiel beschreibt, wie Sie eine Schlüsseldatei erzeugen, die als Teil des Master-Keys für den Verschlüsselungs-Provider verwendet wird, der unter /private in den Verzeichnisbaum eingehängt (gemountet) wird. Diese Schlüsseldatei liefert zufällige Daten, die für die Verschlüsselung des Master-Keys benötigt werden. Zusätzlich wird der Master-Key durch eine Passphrase geschützt. Die Sektorgröße des Providers beträgt 4 KB. Außerdem wird beschrieben, wie Sie einen geli-Provider aktivieren, ein vom ihm verwaltetes Dateisystem erzeugen, es mounten, mit ihm arbeiten und wie Sie es schließlich wieder unmounten und den Provider deaktivieren. Um eine bessere Leistung zu erzielen, sollten Sie eine größere Sektorgröße (beispielsweise 4 KB) verwenden. Der Master-Key wird durch eine Passphrase sowie die Daten der Schlüsseldatei (die von /dev/random stammen) geschützt. Die Sektorgröße von /dev/da2.eli (das als Provider bezeichnet wird) beträgt 4 KB. &prompt.root; dd if=/dev/random of=/root/da2.key bs=64 count=1 &prompt.root; geli init -s 4096 -K /root/da2.key /dev/da2 Enter new passphrase: Reenter new passphrase: Es ist nicht zwingend nötig, sowohl eine Passphrase als auch eine Schlüsseldatei zu verwenden. Die einzelnen Methoden können auch unabhängig voneinander eingesetzt werden. Wird für die Schlüsseldatei der Wert - angegeben, wird dafür die Standardeingabe verwendet. Das folgende Beispiel zeigt, dass Sie auch mehr als eine Schlüsseldatei verwenden können. &prompt.root; cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2 Aktivieren des Providers mit dem erzeugten Schlüssel &prompt.root; geli attach -k /root/da2.key /dev/da2 Enter passphrase: Dadurch wird die (Normaltext-)Gerätedatei /dev/da2.eli angelegt. &prompt.root; ls /dev/da2* /dev/da2 /dev/da2.eli Das neue Dateisystem erzeugen &prompt.root; dd if=/dev/random of=/dev/da2.eli bs=1m &prompt.root; newfs /dev/da2.eli &prompt.root; mount /dev/da2.eli /private Das verschlüsselte Dateisystem wird nun von &man.df.1; angezeigt und kann ab sofort eingesetzt werden. &prompt.root; df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 248M 89M 139M 38% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr /dev/ad0s1d 989M 1.5M 909M 0% /tmp /dev/ad0s1e 3.9G 1.3G 2.3G 35% /var /dev/da2.eli 150G 4.1K 138G 0% /private Das Dateisystem unmounten und den Provider deaktivieren Wenn Sie nicht mehr mit dem verschlüsselten Dateisystem arbeiten und die unter /private eingehängte Partition daher nicht mehr benötigen, sollten Sie diese unmounten und den geli-Verschlüsselungs-Provider wieder deaktivieren. &prompt.root; umount /private &prompt.root; geli detach da2.eli Weitere Informationen zum Einsatz von geli finden Sie in &man.geli.8;. Der Einsatz des <filename>geli</filename>- <filename>rc.d</filename>-Skripts geli verfügt über ein rc.d-Skript, das den Einsatz von geli deutlich vereinfacht. Es folgt nun ein Beispiel, in dem geli über die Datei &man.rc.conf.5; konfiguriert wird: geli_devices="da2" geli_da2_flags="-p -k /root/da2.key" Durch diese Einträge wird /dev/da2 als geli-Provider festgelegt. Der Master-Key befindet sich in /root/da2.key. Beim Aktivieren des geli-Providers wird keine Passphrase abgefragt (beachten Sie, dass dies nur dann möglich ist, wenn Sie geli mit dem Parameter initialisieren). Wird das System heruntergefahren, wird der geli-Provider zuvor deaktiviert. Weitere Informationen zur Konfiguration der rc.d-Skripten finden Sie im Abschnitt rc.d des Handbuchs.
Christian Brüffer Geschrieben von Den Auslagerungsspeicher verschlüsseln Auslagerungsspeicher verschlüsseln Die Verschlüsselung des Auslagerungsspeichers ist unter &os; einfach einzurichten und seit &os; 5.3-RELEASE verfügbar. Je nach dem, welche &os;-Version Sie einsetzen, können Konfiguration und mögliche Optionen allerdings unterschiedlich sein. Seit &os; 6.0-RELEASE können Sie entweder das &man.gbde.8;- oder das &man.geli.8;-Verschlüsselungs-Subsystem einsetzen. Verwenden Sie eine ältere &os;-Version, sind Sie hingegen auf &man.gbde.8; beschränkt. Beide Subsysteme werden über das rc.d-Skript encswap gestartet. Der letzte Abschnitt, Partitionen verschlüsseln, enthält eine kurze Beschreibung der verschiedenen Verschlüsselungs-Subsysteme. Warum sollte der Auslagerungsspeicher verschlüsselt werden? Wie die Verschlüsselung von Plattenpartitionen dient auch die Verschlüsselung des Auslagerungsspeichers dem Schutz sensitiver Informationen. Stellen Sie sich etwa eine Anwendung vor, die ein Passwort erfordert. Solange dieses Passwort im Hauptspeicher verbleibt, ist alles in Ordnung. Beginnt Ihr Betriebssystem allerdings, Daten auf die Festplatte auszulagern, um im Hauptspeicher Platz für andere Anwendungen zu schaffen, kann es passieren, dass Ihr Passwort im Klartext in den Auslagerungsspeicher geschrieben wird, was es einem potentiellen Angreifer leicht macht, Ihr Passwort herauszufinden. Die Verschlüsselung Ihres Auslagerungsspeichers kann dieses Problem lösen. Vorbereitungen Für die weiteren Ausführungen dieses Abschnitts stellt ad0s1b die Swap-Partition dar. Noch ist Ihr Auslagerungsspeicher nicht verschlüsselt. Es könnte allerdings sein, dass bereits Passwörter oder andere sensitive Daten als Klartext im Auslagerungsspeicher vorhanden sind. Daher sollten Sie den Auslagerungsspeicher komplett mit zufällig generierten Zeichen überschreiben, bevor Sie ihn verschlüsseln: &prompt.root; dd if=/dev/random of=/dev/ad0s1b bs=1m Den Auslagerungsspeicher mit &man.gbde.8; verschlüsseln Verwenden Sie &os; 6.0-RELEASE oder neuer, sollten Sie in /etc/fstab das Suffix .bde an den Gerätenamen der Swap-Partition anhängen: # Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.bde none swap sw 0 0 Für &os;-Versionen vor 6.0-RELEASE benötigen Sie zusätzlich folgende Zeile in /etc/rc.conf: gbde_swap_enable="YES" Den Auslagerungsspeicher mit &man.geli.8; verschlüsseln Alternativ können Sie Ihren Auslagerungsspeicher auch mit &man.geli.8; verschlüsseln. Die Vorgehensweise ist dabei ähnlich. Allerdings hängen Sie bei der Verwendung von &man.geli.8; in /etc/fstab das Suffix .eli an den Gerätenamen der Swap-Partition an: # Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.eli none swap sw 0 0 In der Voreinstellung verschlüsselt &man.geli.8; den Auslagerungsspeicher mit dem AES-Algorithmus und einer Schlüssellänge von 256 Bit. Es ist möglich, diese Optionen durch das Setzen der geli_swap_flags-Option in /etc/rc.conf anzupassen. Die folgende Zeile weist das rc.d-Skript encswap an, &man.geli.8;-Swap-Partitionen mit dem Blowfish-Algorithmus und einer Schlüssellänge von 128 Bit zu verschlüsseln. Zusätzlich wird die Sektorgröße auf 4 Kilobyte gesetzt und die Option detach on last close aktiviert: geli_swap_flags="-e blowfish -l 128 -s 4096 -d" Auf Systemen vor &os; 6.2-RELEASE verwenden Sie hingegen die folgende Zeile: geli_swap_flags="-a blowfish -l 128 -s 4096 -d" Eine Auflistung möglicher Optionen für den Befehl onetime finden Sie in der Manualpage zu &man.geli.8;. Die korrekte Funktion testen Nachdem Sie Ihr System neu gestartet haben, können Sie die korrekte Funktion Ihres verschlüsselten Auslagerungsspeichers prüfen, indem Sie sich die Ausgabe von swapinfo ansehen. Wenn Sie &man.gbde.8; einsetzen, erhalten Sie eine Meldung ähnlich der folgenden: &prompt.user; swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b.bde 542720 0 542720 0% Wenn Sie &man.geli.8; einsetzen, erhalten Sie hingegen ein Ausgabe ähnlich der folgenden: &prompt.user; swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b.eli 542720 0 542720 0%
diff --git a/de_DE.ISO8859-1/books/handbook/eresources/chapter.sgml b/de_DE.ISO8859-1/books/handbook/eresources/chapter.sgml index b21021ba30..d4bc2de6e7 100644 --- a/de_DE.ISO8859-1/books/handbook/eresources/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/eresources/chapter.sgml @@ -1,2144 +1,2151 @@ Ressourcen im Internet Gedruckte Medien können mit der schnellen Entwicklung von FreeBSD nicht Schritt halten. Elektronische Medien sind häufig die einzige Möglichkeit, über aktuelle Entwicklungen informiert zu sein. Da FreeBSD ein Projekt von Freiwilligen ist, gibt die Benutzergemeinde selbst auch technische Unterstützung. Die Benutzergemeinde erreichen Sie am besten über E-Mail, Internetforen oder Usenet-News. Die wichtigsten Wege, auf denen Sie die FreeBSD-Benutzergemeinde erreichen können, sind unten dargestellt. Wenn Sie weitere Ressourcen kennen, die hier fehlen, schicken Sie diese bitte an die Mailingliste des &a.doc;, damit sie hier aufgenommen werden können. Mailinglisten Die Mailinglisten sind der direkteste Weg, um Fragen an das gesamte &os; Publikum zu stellen oder eine technische Diskussion zu beginnen. Es existiert eine grosse Vielfalt von Listen mit einer Reihe von verschiedenen FreeBSD Themen. Wenn Sie ihre Fragen an die richtige Mailingliste richten können Sie viel eher mit einer passenden Antwort darauf rechnen. Die Chartas der verschiedenen Listen sind unten wiedergegeben. Bevor Sie sich einer Mailingliste anschließen oder E-Mails an eine Liste senden, lesen Sie bitte die Charta der Liste. Die meisten Mitglieder unserer Mailinglisten erhalten Hunderte E-Mails zum Thema FreeBSD pro Tag. Die Chartas und Regeln, die den Gebrauch der Listen beschreiben, garantieren die hohe Qualität der Listen. Die Listen würden ihren hohen Wert für das Projekt verlieren, wenn wir weniger Regeln aufstellen würden. Um zu testen, ob Sie eine Nachricht an eine &os;-Liste senden können, verwenden Sie bitte Die Liste &a.test.name;. Schicken Sie derartige Nachrichten bitte nicht an eine der anderen Listen. Wenn Sie Sich nicht sicher sind, auf welcher Liste Sie Ihre Frage stellen sollen, sollten Sie den Artikel How to get best results from the FreeBSD-questions mailing list lesen. Bevor Sie eine Nachricht an eine Mailingliste senden, sollten Sie die korrekte Nutzung der Mailinglisten erlernen. Dazu gehört auch das Vermeiden von sich häufig wiederholenden Diskussionen (lesen Sie deshalb zuerst die Mailing List Frequently Asked Questions). Alle Mailinglisten werden archiviert und können auf dem FreeBSD World Wide Web Server durchsucht werden. Das nach Schlüsselwörtern durchsuchbare Archiv bietet die hervorragende Möglichkeit, Antworten auf häufig gestellte Fragen zu finden. Nutzen Sie bitte diese Möglichkeit, bevor Sie Fragen auf einer Liste stellen. Beachten Sie auch, dass das zur Folge hat, dass die Nachrichten an die &os; Mailinglisten für die Ewigkeit erhalten bleiben. Wenn Sie am Schutz ihrer Privatsphähre interessiert sind, ziehen Sie die Verwendung einer Wegwerf-E-Mail-Adresse in Betracht und schreiben Sie nur solche Nachrichten, die für die Öffentlichkeit bestimmt sind. Beschreibung der Mailinglisten Allgemeine Listen: Jeder kann die folgenden allgemeinen Listen abonnieren (und ist dazu aufgefordert): Mailingliste Zweck &a.advocacy.name; Verbreitung von FreeBSD &a.announce.name; Wichtige Ereignisse und Meilensteine des Projekts &a.arch.name; Architektur und Design von FreeBSD &a.bugbusters.name; Diskussionen über die Pflege der FreeBSD Fehlerberichte-Datenbank und die dazu benutzten Werkzeuge &a.bugs.name; Fehlerberichte &a.chat.name; Nicht technische Themen, die die FreeBSD-Gemeinschaft betreffen &a.current.name; Gebrauch von &os.current; &a.isp.name; Für Internet-Service-Provider, die FreeBSD benutzen &a.jobs.name; Anstellung und Beratung im FreeBSD-Umfeld &a.policy.name; Grundsatzentscheidungen des FreeBSD-Core-Teams. Wenig Verkehr und nur zum Lesen &a.questions.name; Benutzerfragen und technische Unterstützung &a.security-notifications.name; Ankündigungen zum Thema Sicherheit &a.stable.name; Gebrauch von &os.stable; &a.test.name; Schicken Sie Testnachrichten an diese Liste anstelle der wirklichen Listen Technische Listen: Auf den folgenden Listen werden technische Diskussionen geführt. Bevor Sie eine der Listen abonnieren oder Nachrichten an sie schicken, lesen Sie sich bitte die Charta der Liste durch, da der Inhalt und Zweck dieser Listen genau festgelegt ist. Mailingliste Zweck &a.acpi.name; Entwicklung von ACPI &a.afs.name; Portierung von AFS nach FreeBSD &a.aic7xxx.name; Entwicklung von &adaptec; AIC 7xxx Treibern &a.alpha.name; Portierung von FreeBSD auf Alpha-Maschinen &a.amd64.name; Portierung von FreeBSD auf AMD64-Systeme &a.apache.name; Diskussion über Ports, die mit Apache zusammenhängen. &a.arm.name; Portierung von FreeBSD auf &arm;-Prozessoren &a.atm.name; Benutzung von ATM-Netzen mit FreeBSD &a.audit.name; Audit der FreeBSD-Quellen &a.binup.name; Design und Entwicklung eines Systems, das es erlaubt, ein FreeBSD-System mit binären Paketen zu aktualisieren &a.bluetooth.name; &bluetooth; unter FreeBSD verwenden &a.cluster.name; Benutzung von FreeBSD in einem Cluster &a.cvsweb.name; Pflege von CVSweb &a.database.name; Diskussion über Datenbanken und Datenbankprogrammierung unter FreeBSD &a.doc.name; Erstellen der FreeBSD-Dokumentation &a.drivers.name; Gerätetreiber für &os; schreiben &a.eclipse.name; Für FreeBSD-Anwender, die die Eclipse IDE, deren Werkzeuge, Anwendungen und Ports einsetzen &a.embedded.name; FreeBSD in eingebetteten Anwendungen einsetzen &a.emulation.name; Emulation anderer Systeme wie Linux, &ms-dos; oder &windows; &a.eol.name; Support für FreeBSD-bezogene Software, die vom FreeBSD Project offiziell nicht mehr unterstützt wird. &a.firewire.name; Technische Diskussion über &firewire; (iLink, IEEE 1394) &a.fs.name; Dateisysteme &a.gecko.name; Angelegenheiten zur Gecko Rendering Engine &a.geom.name; Diskussion über GEOM &a.gnome.name; Portierung von GNOME und GNOME-Anwendungen &a.hackers.name; Allgemeine technische Diskussionen &a.hardware.name; Allgemeine Diskussion über Hardware, auf der FreeBSD läuft &a.i18n.name; Internationalisierung von FreeBSD &a.ia32.name; FreeBSD für die IA-32 (&intel; x86) Plattform &a.ia64.name; Portierung von FreeBSD auf &intel;s neue IA64-Systeme &a.ipfw.name; Technische Diskussion über die Neubearbeitung der IP-Firewall Quellen &a.isdn.name; Für Entwickler des ISDN-Systems &a.java.name; Für &java; Entwickler und Leute, die &jdk;s nach FreeBSD portieren &a.kde.name; Portierung von KDE und KDE-Anwendungen &a.lfs.name; Portierung von LFS nach FreeBSD &a.libh.name; Das nächste Installations- und Paketsystem &a.mips.name; Portierung von FreeBSD zu &mips; &a.mobile.name; Diskussionen über mobiles Rechnen &a.mono.name; Mono und C# Anwendungen auf FreeBSD &a.mozilla.name; Portierung von Mozilla nach FreeBSD &a.multimedia.name; Multimedia Anwendungen &a.newbus.name; Technische Diskussionen über die Architektur von Bussen &a.net.name; Diskussion über Netzwerke und den TCP/IP Quellcode &a.openoffice.name; Portierung von OpenOffice.org und &staroffice; nach FreeBSD &a.performance.name; Fragen zur Optimierung der Leistung stark ausgelasteter Systeme &a.perl.name; Pflege der portierten Perl-Anwendungen. &a.pf.name; Diskussionen und Fragen zu packet filter als Firewallsystem. &a.platforms.name; Portierungen von FreeBSD auf nicht-&intel; Architekturen &a.ports.name; Diskussion über die Ports-Sammlung &a.ports-bugs.name; Diskussion über Fehler und PRs der Ports &a.ppc.name; Portierung von FreeBSD auf den &powerpc; &a.proliant.name; Technische Diskussionen zum Einsatz von FreeBSD auf der ProLiant-Serverplattform von HP. &a.python.name; FreeBSD-spezifische Diskussionen zu Python &a.qa.name; Diskussion über Qualitätssicherung, normalerweise kurz vor einem Release &a.rc.name; Diskussion über das rc.d-System sowie dessen Weiterentwicklung &a.realtime.name; Entwicklung von Echtzeiterweiterungen für FreeBSD &a.ruby.name; FreeBSD-spezifische Diskussionen zu Ruby &a.scsi.name; Diskussion über das SCSI-Subsystem &a.security.name; Sicherheitsthemen &a.small.name; Gebrauch von FreeBSD in eingebetteten Systemen (obsolet; verwenden Sie stattdessen &a.embedded.name;) &a.smp.name; Diskussionen über das Design von asymmetrischen und symmetrischen Mehrprozessor-Programmen &a.sparc.name; Portierung von FreeBSD auf &sparc; Systeme &a.standards.name; Konformität von FreeBSD mit den C99- und POSIX-Standards &a.sun4v.name; Portierung von FreeBSD auf &ultrasparc;-T1-basierte Systeme &a.threads.name; Leichgewichtige Prozesse (Threads) in FreeBSD &a.testing.name; Leistungs- und Stabilitätstests von FreeBSD &a.tokenring.name; Token-Ring Unterstützung in FreeBSD &a.usb.name; USB-Unterstützung in FreeBSD &a.virtualization.name; Diskussion über verschiedene Virtualisierungsverfahren, die von &os; unterstützt werden &a.vuxml.name; Diskussion über die Infratruktur von VuXML &a.x11.name; Wartung und Unterstützung von X11 auf FreeBSD &a.xen.name; Diskussionen über die &os; Portierung auf &xen; - Implementierung und Verwendung Eingeschränkte Listen: Die folgenden Listen wenden sich an Zielgruppen mit speziellen Anforderungen und sind nicht für die Öffentlichkeit gedacht. Bevor Sie eine dieser Listen abonnieren, sollten Sie einige der technischen Listen abonniert haben, um mit den Umgangsformen vertraut zu sein. Mailingliste Zweck &a.hubs.name; Betrieb von FreeBSD-Spiegeln &a.usergroups.name; Koordination von Benutzergruppen &a.vendors.name; Koordination von Händlern vor einem Release &a.wip-status.name; Status von in Arbeit befindlichen &os;-Tätigkeiten &a.www.name; Betreuer von www.FreeBSD.org Zusammenfassungen: Alle eben aufgezählten Listen sind auch in zusammengefasster Form (digest) erhältlich. In den Einstellungen Ihres Accounts legen Sie fest, in welcher Form Sie die Listen empfangen. CVS & SVN Listen: Die folgenden Listen versenden die Log-Einträge zu Änderungen an verschiedenen Teilen des Quellbaums. Diese Listen sollen nur gelesen werden, schicken Sie bitte keine Nachrichten an eine der Listen. Mailingliste Teil des Quellbaums Beschreibung &a.cvsall.name; /usr/(CVSROOT|doc|ports) Alle Änderungen im Quellbaum (Obermenge der anderen Commit-Listen) &a.cvs-doc.name; /usr/(doc|www) Änderungen in den doc- und www Bäumen &a.cvs-ports.name; /usr/ports Änderungen im ports-Baum &a.cvs-projects.name; /usr/projects Änderungen im projects-Baum &a.cvs-src.name; /usr/src Änderungen im src-Baum (generiert aus den svn-zu-cvs Import-Commits &a.svn-src-all.name; /usr/src Änderungen im Subversion Repository (ausser für user und projects) &a.svn-src-head.name; /usr/src Änderungen im head Zweig des Subversion Repository (der &os;-CURRENT Zweig) &a.svn-src-projects.name; /usr/projects Änderungen im projects Bereich des src Subversion Repository &a.svn-src-release.name; /usr/src Änderungen im releases Bereich des src Subversion Repository &a.svn-src-releng.name; /usr/src Änderungen im releng Zweig des src Subversion Repository (der security / release engineering Zweige) &a.svn-src-stable.name; /usr/src Änderungen an allen stable Zweigen des src Subversion Repository &a.svn-src-stable-6.name; /usr/src Änderungen im stable/6 Zweig des src Subversion Repository &a.svn-src-stable-7.name; /usr/src Änderungen im stable/7 Zweig des src Subversion Repository + + &a.svn-src-stable-8.name; + /usr/src + Änderungen im stable/8 + Zweig des src Subversion Repository + + &a.svn-src-stable-other.name; /usr/src Änderungen an älteren stable Zweigen des src Subversion Repository &a.svn-src-svnadmin.name; /usr/src Änderungen an den administrativen Skripten, hooks, and anderen Daten zur Konfiguration des src Subversion Repository &a.svn-src-user.name; /usr/src Änderungen am experimentellen user Bereich des src Subversion Repository &a.svn-src-vendor.name; /usr/src Änderungen am Herstellerbereich des src Subversion Repository Mailinglisten abonnieren Um eine Liste zu abonnieren, folgen Sie dem oben angegebenen Hyperlink der Liste oder Sie besuchen die Webseite &a.mailman.lists.link; und klicken dort auf die Liste, die Sie abonnieren wollen. Sie gelangen dann auf die Webseite der Liste, die weitere Anweisungen enthält. Um eine Nachricht an eine Mailingliste zu schicken, schreiben Sie einfach eine E-Mail an Liste@FreeBSD.org. Die E-Mail wird dann an alle Mitglieder der Mailingliste verteilt. Wenn Sie das Abonnement aufheben wollen, folgen Sie der URL, die am Ende jeder Mail der Liste angegeben ist. Sie können das Abonnement auch mit einer E-Mail an Liste-unsubscribe@FreeBSD.org aufheben. Verwenden Sie bitte die technischen Listen ausschließlich für technische Diskussionen. Wenn Sie nur an wichtigen Ankündigungen interessiert sind, abonnieren Sie die Mailingliste &a.announce;, auf der nur wenige Nachrichten versendet werden. Chartas der Mailinglisten Alle FreeBSD-Mailinglisten besitzen Grundregeln, die von jedem beachtet werden müssen. Für die ersten beiden Male, in denen ein Absender gegen diese Regeln verstößt, erhält er jeweils eine Warnung vom FreeBSD-Postmaster postmaster@FreeBSD.org. Ein dritter Verstoß gegen die Regeln führt dazu, dass der Absender in allen FreeBSD-Mailinglisten gesperrt wird und weitere Nachrichten von ihm nicht mehr angenommen werden. Wir bedauern sehr, dass wir solche Maßnahmen ergreifen müssen, aber heutzutage ist das Internet eine recht rauhe Umgebung, in der immer weniger Leute Rücksicht aufeinander nehmen. Die Regeln: Das Thema einer Nachricht soll der Charta der Liste, an die sie gesendet wird, entsprechen. Wenn Sie eine Nachricht an eine technische Liste schicken, sollte die Nachricht auch technische Inhalte haben. Fortwährendes Geschwätz oder Streit mindern den Wert der Liste für alle Mitglieder und wird nicht toleriert. Benutzen Sie &a.chat; für allgemeine Diskussionen über FreeBSD. Eine Nachricht sollte an nicht mehr als zwei Mailinglisten gesendet werden. Schicken Sie eine Nachricht nur dann an zwei Listen, wenn das wirklich notwendig ist. Viele Leute haben mehrere Mailinglisten abonniert und Nachrichten sollten nur zu ungewöhnlichen Kombinationen der Listen, wie -stable und -scsi, gesendet werden. Wenn Sie eine Nachricht erhalten, die im Cc-Feld mehrere Listen enthält, sollten Sie das Feld kürzen, bevor Sie eine Antwort darauf verschicken. Unabhängig von dem ursprünglichen Verteiler sind Sie für Ihre eigenen Mehrfach-Sendungen selbst verantwortlich. Persönliche Angriffe und Beschimpfungen sind in einer Diskussion nicht erlaubt. Dies gilt gleichermaßen für Benutzer wie Entwickler. Grobe Verletzungen der Netiquette, wie das Verschicken oder Zitieren von privater E-Mail ohne eine entsprechende Genehmigung, werden nicht gebilligt. Die Nachrichten werden aber nicht besonders auf Verletzungen der Netiquette untersucht. Es kann sein, dass eine Verletzung der Netiquette durchaus zu der Charta einer Liste passt, aber der Absender aufgrund der Verletzung eine Warnung erhält oder gesperrt wird. Werbung für Produkte oder Dienstleistungen, die nichts mit FreeBSD zu tun haben, sind verboten. Ist die Werbung als Spam verschickt worden, wird der Absender sofort gesperrt. Chartas einzelner Listen: &a.acpi.name; Die Entwicklung von ACPI und Energieverwaltungsfunktionen. &a.afs.name; Andrew File System Auf dieser Liste wird die Portierung des AFS von CMU/Transarc diskutiert. &a.announce.name; Wichtige Ereignisse und Meilensteine Diese Liste ist für Personen, die nur an den wenigen Ankündigungen wichtiger Ereignisse interessiert sind. Die Ankündigungen betreffen Schnappschüsse und Releases, neue Merkmale von FreeBSD und die Suche nach freiwilligen Mitarbeitern. Auf der Liste herrscht wenig Verkehr und sie wird streng moderiert. &a.arch.name; Architektur und Design von FreeBSD Auf dieser technischen Liste wird die FreeBSD-Architektur diskutiert. Beispiele für angemessene Themen sind: Wie das Bausystem zu verändern ist, damit verschiedene Läufe gleichzeitig möglich sind. Was am VFS geändert werden muss, damit Heidemann Schichten eingesetzt werden können. Wie die Schnittstelle der Gerätetreiber angepasst werden muss, damit derselbe Treiber auf verschiedenen Bussen und Architekturen eingesetzt werden kann. Wie ein Netzwerktreiber geschrieben wird. &a.audit.name; Source Code Audit Project Dies ist die Liste des FreeBSD-Source Code Audit Projects. Ursprünglich war vorgesehen, hier nur sicherheitsrelevante Änderungen zu diskutieren, doch ist die Charta auf alle Änderungen ausgedehnt worden. Zu dieser Liste werden viele Korrekturen gesandt, so dass sie für den normalen FreeBSD-Benutzer von wenig Wert ist. Diskussionen über Sicherheit, die sich nicht auf die Änderung von Quellcode beziehen, finden auf der Mailingliste &a.security; statt. Auf der anderen Seite sind aber alle Entwickler aufgefordert, ihre Korrekturen zur Überprüfung an diese Liste zu senden. Dies trifft besonders auf Änderungen zu, in denen ein Fehler die Integrität des Gesamtsystems gefährdet. &a.binup.name; FreeBSD Binary Update Project Auf dieser Liste wird das Design und die Implementierung von binup diskutiert. Weitere Themen sind Fehlerbehebungen, Fehlerberichte und Anfragen nach Neuerungen. Die CVS-Logmeldungen des Projekts werden ebenfalls auf diese Liste gesendet. &a.bluetooth.name; &bluetooth; unter FreeBSD Diese Liste diskutiert Probleme der Verwendung von &bluetooth; unter FreeBSD. Designprobleme, Implementierungsdetails, Patches, Fehler- und Statusberichte, Verbesserungsvorschläge sowie alle anderen mit &bluetooth; zusammenhängenden Themen werden hier behandelt. &a.bugbusters.name; Bearbeitung der Fehlerberichte Auf dieser Liste wird die Bearbeitung der Fehlerberichte (PR, engl. problem report) koordiniert. Sie dient dem Bugmeister und allen Leuten, die ein Interesse an der Datenbank der Fehlerberichte haben, als Diskussionsforum. Auf dieser Liste werden keine spezifischen Fehler, Fehlerbehebungen oder PRs diskutiert. &a.bugs.name; Fehlerberichte Auf dieser Liste werden Fehlerberichte gesammelt. Fehlerberichte sollten immer mit &man.send-pr.1; oder dem Web Formular erstellt werden. &a.chat.name; Nicht technische Themen, die die FreeBSD Gemeinschaft betreffen Auf dieser Liste werden nicht-technische soziale Themen diskutiert, die nicht auf die anderen Listen passen. Hier kann diskutiert werden, ob Jordan wie ein Frettchen aus einem Zeichentrickfilm aussieht oder nicht, ob grundsätzlich in Großbuchstaben geschrieben werden soll, wer zuviel Kaffee trinkt, wo das beste Bier gebraut wird und wer Bier in seinem Keller braut. Gelegentlich können auf den technischen Listen wichtige Ereignisse wie Feste, Hochzeiten oder Geburten angekündigt werden, aber nachfolgende Nachrichten sollten auf die Liste &a.chat; gesendet werden. &a.core.name; FreeBSD Core Team Dies ist eine interne Mailingliste des FreeBSD Core Teams. Wenn in einer wichtigen Angelegenheit, die FreeBSD betrifft, entschieden werden muss oder die Angelegenheit einer genauen Prüfung unterzogen werden muss, können Nachrichten an diese Liste gesendet werden. &a.current.name; Gebrauch von &os.current; Diese Mailingliste ist für die Benutzer von &os.current; eingerichtet. Auf ihr finden sich Ankündigungen über Besonderheiten von -CURRENT, von denen Benutzer betroffen sind. Sie enthält weiterhin Anweisungen, wie man ein System auf -CURRENT hält. Jeder, der ein -CURRENT System besitzt, muss diese Liste lesen. Die Liste ist nur für technische Inhalte bestimmt. &a.cvsweb.name; FreeBSD CVSweb Project Technische Diskussion über den Gebrauch, die Entwicklung und die Pflege von FreeBSD-CVSweb. &a.doc.name; Documentation Project Auf dieser Mailingliste werden Themen und Projekte diskutiert, die im Zusammenhang mit der Erstellung der FreeBSD Dokumentation stehen. The FreeBSD Documentation Project besteht aus den Mitgliedern dieser Liste. Diese Liste steht jedem offen, Sie sind herzlich eingeladen teilzunehmen und mitzuhelfen. &a.drivers.name; Gerätetreiber für &os; schreiben Ein Forum für technische Diskussionen über das Schreiben von Gerätetreibern für &os;. Daher werden hier vor allem Fragen behandelt, die sich um das Schreiben von Treibern, die die APIs des Kernels nutzen, drehen. &a.eclipse.name; Für FreeBSD-Anwender, die die Eclipse IDE deren Werkzeuge, Anwendungen und Ports einsetzen Das Ziel dieser Liste ist es, Unterstützung für all jene zu bieten, die mit der Installation, Verwendung, Entwicklung und Wartung der Eclipse-IDE sowie deren Werkzeugen und Anwendungen unter &os; zu tun haben. Außerdem wird Hilfe bei der Portierung der IDE und deren Plugins auf &os; geboten. Zusätzlich soll diese Liste einen Informationsaustausch zwischen der Eclipse- und der &os;-Gemeinde ermöglichen, von dem beide Seiten profitieren können. Obwohl sich diese Liste auf die Anforderungen von Anwendern konzentriert, möchte sie auch Entwickler unterstützen, die an der Entwicklung von &os;-spezifischen Anwendungen unter Nutzung des Eclipse-Frameworks arbeiten. &a.embedded.name; FreeBSD in eingebetteten Anwendungen einsetzen Diese Liste diskutiert Themen im Zusammenhang mit dem Einsatz von ungewöhnlich kleinen und eingebettenen FreeBSD-Installationen. Auf dieser Liste werden ausschließlich technische Diskussionen geführt. Unter eingebetteten Systemen versteht diese Liste Systeme, bei denen es sich nicht um Desktopsysteme handelt, und die in der Regel nur einem einzigen Zweck dienen (im Gegensatz zu Desktopsystemen, die für die Bewältigung verschiedenster Aufgaben geeignet sind). In die Gruppe der eingebetteten Systeme gehören beispielsweise Telephone, Netzwerkgeräte wie Router, Switche oder PBX-Systeme, PDAs, Verkaufsautomaten und andere mehr. &a.emulation.name; Emulation anderer Systeme wie Linux, &ms-dos; oder &windows; Hier werden technische Diskussionen zum Einsatz von Programmen, die für andere Betriebssysteme geschrieben wurden, geführt. &a.eol.name; Support für FreeBSD-bezogene Software, die vom FreeBSD Project offiziell nicht mehr unterstützt wird. Diese Liste ist für all jene interessant, die Unterstützung für vom FreeBSD Project offiziell nicht mehr (in Form von Security Advisories oder Patches) unterstützte Programme benötigen oder anbieten wollen. &a.firewire.name; &firewire; (iLink, IEEE 1394) Auf dieser Liste wird das Design und die Implementierung eines &firewire;-Subsystems (auch IEEE 1394 oder iLink) für FreeBSD diskutiert. Relevante Themen sind die Standards, Busse und ihre Protokolle, sowie Adapter, Karten und Chipsätze. Des Weiteren die Architektur und der Quellcode, die nötig sind, diese Geräte zu unterstützen. &a.fs.name; Dateisysteme Diskussionen über FreeBSD-Dateisysteme. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden. &a.gecko.name; Angelegenheiten zur Gecko Rendering Engine Dies ist ein Forum über Gecko-Anwendungen, die &os; verwenden. Die Diskussion dreht sich um die Portierung von Gecko-Anwendungen, deren Installation, die Entwicklung sowie deren Unterstützung innerhalb von &os;. &a.geom.name; GEOM Diskussion über GEOM und verwandte Implementierungen. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden. &a.gnome.name; GNOME Diskussionen über die grafische Benutzeroberfläche GNOME. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden. &a.ipfw.name; IP Firewall Diskussionen über eine Neubearbeitung des IP-Firewall Quelltexts in FreeBSD. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden. &a.ia64.name; Portierung von FreeBSD auf die IA64-Plattform Dies ist eine technische Liste für diejenigen, die FreeBSD auf die IA-64 Plattform von &intel; portieren. Themen sind die Probleme bei der Portierung und deren Lösung. Interessierte, die der Diskussion folgen wollen, sind ebenfalls willkommen. &a.isdn.name; ISDN Subsystem Mailingliste für die Entwickler des ISDN Subsystems von FreeBSD. &a.java.name; &java; Entwicklung Mailingliste, auf der die Entwicklung von &java; Anwendungen für FreeBSD sowie die Portierung und Pflege von &jdk;s diskutiert wird. &a.jobs.name; Stellenangebote und Stellengesuche In diesem Forum können Sie Stellenangebote und Stellengesuche, die mit &os; zu tun haben, aufgeben. Wenn Sie beispielsweise eine Beschäftigung im &os;-Umfeld suchen oder eine freie Stelle haben, die mit &os; zu tun hat, ist dies der richtige Ort. Diese Mailingliste ist nicht der Ort, um über allgemeine Beschäftigungsprobleme zu diskutieren; dazu gibt es anderswo geeignete Foren. Beachten Sie bitte, dass diese Liste, wie die anderen FreeBSD.org-Listen, weltweit gelesen wird. Geben Sie daher bitte den Arbeitsort genau an. Geben Sie bitte auch an, ob Telearbeit möglich ist und ob Hilfen für einen Umzug angeboten werden. Benutzen Sie in der E-Mail bitte nur offene Formate – vorzugsweise nur das Textformat. Andere Formate, wie PDF oder HTML, werden von den Lesern akzeptiert. Nicht offene Formate wie µsoft; Word (.doc) werden vom Server der Liste abgelehnt. &a.hackers.name; Technische Diskussionen Dies ist ein Forum für technische Diskussionen über FreeBSD. Leute, die aktiv an FreeBSD arbeiten, können hier Probleme und deren Lösungen diskutieren. Interessierte, die den Diskussionen folgen wollen, steht die Liste ebenfalls offen. Auf dieser Liste finden nur technische Diskussionen statt. &a.hardware.name; Allgemeine Diskussionen über Hardware Allgemeine Diskussionen über die Hardware, auf der FreeBSD läuft: Probleme und Ratschläge welche Hardware man kaufen sollte und welche nicht. &a.hubs.name; FreeBSD-Spiegel Ankündigungen und Diskussionsforum für Leute, die FreeBSD-Spiegel betreiben. &a.isp.name; Themen für Internet Service Provider Diese Liste ist für Internet Service Provider (ISP), die FreeBSD benutzen. Auf dieser Liste finden nur technische Diskussionen statt. &a.mono.name; Mono und C# Anwendungen auf FreeBSD Diese Liste beinhaltet Diskussionen über das Mono Entwicklungsframework auf &os;. Dies ist eine technische Mailingliste. Es ist für Personen gedacht, die aktiv an der Portierung von Mono oder C# Anwendungen auf &os; sind, um Probleme oder alternative Lösungen zu beratschlagen. Personen die der technischen Diskussion folgen möchten sind ebenso willkommen. &a.kde.name; KDE Diskussionen über KDE auf FreeBSD-Systemen. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden. &a.openoffice.name; OpenOffice.org Portierung und Pflege von OpenOffice.org und &staroffice;. &a.performance.name; Diskussionsforum mit dem Ziel, die Leistung von FreeBSD zu verbessern. Auf dieser Liste diskutieren Hacker, Systemadministratoren und andere Interessierte die Leistung von FreeBSD. Zulässige Themen sind beispielsweise Systeme unter hoher Last, Systeme mit Leistungsproblemen oder Systeme, die Leistungsgrenzen von FreeBSD überwinden. Jeder, der mithelfen will, die Leistung von FreeBSD zu verbessern, sollte diese Liste abonnieren. Die Liste ist technisch anspruchsvoll und geeignet für erfahrene FreeBSD-Benutzer, Hacker oder Administratoren, die FreeBSD schnell, robust und skalierbar halten wollen. Auf der Liste werden Beiträge gesammelt oder Fragen nach ungelösten Problemen beantwortet. Sie ist kein Ersatz für das gründliche Studium der Dokumentation. &a.pf.name; Diskussionen und Fragen zu packet filter als Firewallsystem. FreeBSD-spezische Diskussionen zur Benutzung von packet filter (pf) als Firewallsystem. Sowohl technische Diskussionen als auch Anwenderfragen sind auf dieser Liste willkommen. Fragen zum ALTQ QoS Framework können ebenfalls gestellt werden. &a.platforms.name; Portierung auf nicht-&intel; Plattformen Plattformübergreifende Themen und Vorschläge für die Portierung auf nicht-&intel; Plattformen. Auf dieser Liste finden nur technische Diskussionen statt. &a.policy.name; Grundsatzentscheidungen des Core Teams Diese Mailingliste ist für Grundsatzentscheidungen des FreeBSD-Core-Teams. Sie trägt wenige Nachrichten und ist nur zum Lesen gedacht. &a.ports.name; Diskussion über die Ports-Sammlung Diskussionen über die FreeBSD-Ports-Sammlung und die Infrastruktur der Sammlung. Die Liste dient auch der allgemeinen Koordination der Dinge, die die Ports-Sammlung betreffen. Auf dieser Liste finden nur technische Diskussionen statt. &a.ports-bugs.name; Diskussion über Fehler in den Ports Diskussion über Fehler in der Ports-Sammlung (/usr/ports), neue Ports oder Änderungen an bestehenden Ports. Auf dieser Liste finden nur technische Diskussionen statt. &a.proliant.name; Technische Diskussionen zum Einsatz von FreeBSD auf der ProLiant-Serverplattform von HP Diese Mailingliste bietet technische Diskussionen zum Einsatz von FreeBSD auf der ProLiant-Serverplattform von HP, darunter Fragen zu ProLiant-spezifischen Treibern, Konfigurationswerkzeugen sowie BIOS-Aktualisierungen. Daher ist sie die erste Anlaufstelle, um die Module hpasmd, hpasmcli, sowie hpacucli zu diskutieren. &a.python.name; Python unter FreeBSD Diese technische Liste dient der Verbesserung der Python-Unterstützung unter FreeBSD. Sie wird von Personen gelesen, die an der Portierung von Python, von Python-Modulen Dritter und von Zope nach FreeBSD arbeiten. Personen, die diese technischen Diskussion verfolgen wollen, sind ebenfalls willkommen. &a.questions.name; Benutzerfragen Auf dieser Mailingliste können Fragen zu FreeBSD gestellt werden. Fragen Sie bitte nicht nach Anleitungen, wenn Sie nicht sicher sind, dass Ihre Frage wirklich technischer Natur ist. &a.ruby.name; Ruby unter FreeBSD Diese technische Liste dient der Verbesserung der Ruby-Unterstützung unter FreeBSD. Sie wird von Personen gelesen, die an der Portierung von Ruby, von Bibliotheken Dritter und Frameworks arbeiten. Personen, die diese technischen Diskussionen verfolgen wollen, sind ebenfalls willkommen. &a.scsi.name; SCSI Subsystem Diese Mailingliste ist für die Entwickler des SCSI Subsystems von FreeBSD. Auf dieser Liste finden nur technische Diskussionen statt. &a.security.name; Sicherheitsthemen Sicherheitsthemen, die FreeBSD betreffen, wie DES, Kerberos, bekannte Sicherheitslöcher und Fehlerbehebungen. Stellen Sie bitte auf dieser Liste keine allgemeinen Fragen zum Thema Sicherheit. Willkommen sind allerdings Beiträge zur FAQ, das heißt eine Frage mit der passenden Antwort. Auf dieser Liste finden nur technische Diskussionen statt. &a.security-notifications.name; Ankündigungen zum Thema Sicherheit Ankündigungen über Sicherheitsprobleme von FreeBSD und deren Behebungen. Diese Liste ist kein Diskussionsforum, benutzen Sie &a.security;, um Sicherheitsthemen zu diskutieren. &a.small.name; Gebrauch von FreeBSD in eingebetteten Systemen. Diese Liste für ungewöhnlich kleine FreeBSD Installation oder den Einsatz von FreeBSD in eingebetteten Systemen gedacht. Auf dieser Liste finden nur technische Diskussionen statt. Diese Liste wurde durch &a.embedded.name; ersetzt. &a.stable.name; Gebrauch von &os.stable;. Diese Mailingliste ist für die Benutzer von &os.stable; eingerichtet. Auf ihr finden sich Ankündigungen über Besonderheiten von -STABLE, von denen Benutzer betroffen sind. Sie enthält weiterhin Anweisungen, wie man ein System auf -STABLE hält. Jeder, der ein -STABLE System besitzt, muss diese Liste lesen. Die Liste ist nur für technische Inhalte bestimmt. &a.standards.name; Konformität von FreeBSD mit den C99- und &posix; Standards Dieses Forum ist für technische Diskussionen über die Konformität von FreeBSD mit den C99- und POSIX-Standards. &a.usb.name; USB-Unterstützung in &os;. Auf dieser Liste finden nur technische Diskussionen statt. &a.usergroups.name; Koordination von Benutzergruppen Diese Liste ist für Koordinatoren lokaler Benutzergruppen und einem ausgesuchten Mitglied des Core Teams eingerichtet worden. Der Inhalt sollte Inhalte von Treffen und die Koordination von Projekten mehrerer Benutzergruppen beschränkt sein. &a.vendors.name; Koordination von Händlern Koordination zwischen dem FreeBSD Project und Händlern, die Soft- und Hardware für FreeBSD verkaufen. &a.virtualization.name; Diskussion über verschiedene Virtualisierungsverfahren, die von &os; unterstützt werden Eine Liste, auf der die verschiedenen Virtualisierungsverfahren, die von &os; unterstützt werden, diskutiert werden. Auf der einen Seite liegt der Fokus auf der Implementierung der zugrundeliegenden Funktionalitäten, ebenso wie das Hinzufügen neuer Eigenschaften. Auf der anderen Seite haben die Benutzer ein Forum, um Fragen bei Problemen zu stellen oder um ihre Anwendungsfälle zu besprechen. &a.wip-status.name; Status von in Arbeit befindlichen &os;-Tätigkeiten Diese Mailingliste kann dazu verwendet werden, eigene Kreationen und deren Fortschritt von &os;-verwandten Tätigkeiten anzukündigen. Die Nachrichten werden moderiert. Es wird vorgeschlagen, die Nachricht "An:" eine mehr themenverwandte &os;-Liste zu senden und diese Liste nur in Blindkopie zu setzen. Auf diese Weise kann ihre in Arbeit befindliche Tätigkeit auch auf der themenverwandten Liste diskutiert werden, da auf dieser Liste keine Diskussionen erlaubt sind. Sehen Sie sich das Archiv der Liste für passende Nachrichten an. Redaktionelle Auszüge der Nachrichten an diese Liste werden eventuell alle paar Monate auf die &os; Webseite als Teil der Statusberichte gestellt. Weitere Beispiele und zurückliegende Berichte können Sie auch dort finden. &a.xen.name; Diskussionen über die &os; Portierung auf &xen; - Implementierung und Verwendung Eine Liste, die die &os; Portierung auf &xen; behandelt. Das erwartete Nachrichtenaufkommen ist klein genug, so dass es als Forum für sowohl technische Diskussionen über die Implementierung und Entwurfsdetails, als auch administrative Verteilaspekte ausgelegt ist. Filter der Mailinglisten Um die Verbreitung von Spam, Viren und anderen nicht erwünschten E-Mails zu verhindern, werden auf den &os;-Mailinglisten Filter eingesetzt. Dieser Abschnitt beschreibt nur einen Teil der zum Schutz der Listen eingesetzten Filter. Auf den Mailinglisten sind nur die unten aufgeführten Anhänge erlaubt. Anhänge mit einem anderen MIME-Typ werden entfernt, bevor eine E-Mail an eine Liste verteilt wird. application/octet-stream application/pdf application/pgp-signature application/x-pkcs7-signature message/rfc822 multipart/alternative multipart/related multipart/signed text/html text/plain text/x-diff text/x-patch Einige Mailinglisten erlauben vielleicht Anhänge mit anderem MIME-Typ. Für die meisten Mailinglisten sollte die obige Aufzählung aber richtig sein. Wenn eine E-Mail sowohl aus einer HTML-Version wie auch aus einer Text-Version besteht, wird die HTML-Version entfernt. Wenn eine E-Mail nur im HTML-Format versendet wurde, wird sie in reinen Text umgewandelt. Usenet-News Neben den Gruppen, die sich ausschließlich mit BSD beschäftigen, gibt es viele weitere in denen über FreeBSD diskutiert wird, oder die für FreeBSD-Benutzer wichtig sind. Warren Toomey wkt@cs.adfa.edu.au stellte großzügig suchbare Archive einiger dieser Gruppen bereit. BSD spezifische Gruppen comp.unix.bsd.freebsd.announce comp.unix.bsd.freebsd.misc de.comp.os.unix.bsd (deutsch) fr.comp.os.bsd (französisch) it.comp.os.bsd (italienisch) tw.bbs.comp.386bsd (Traditionelles Chinesisch) Weitere UNIX Gruppen comp.unix comp.unix.questions comp.unix.admin comp.unix.programmer comp.unix.shell comp.unix.user-friendly comp.security.unix comp.sources.unix comp.unix.advocacy comp.unix.misc comp.bugs.4bsd comp.bugs.4bsd.ucb-fixes comp.unix.bsd X Window System comp.windows.x.i386unix comp.windows.x comp.windows.x.apps comp.windows.x.announce comp.windows.x.intrinsics comp.windows.x.motif comp.windows.x.pex comp.emulators.ms-windows.wine World Wide Web Server Foren, Blogs und soziale Netzwerke Die &os; Foren dienen als webbasiertes Diskussionsforum für Fragen und technische Diskussionen zu &os;. Planet FreeBSD bietet einen gesammelten Feed aus dutzenden von Blogs, die von den &os; Entwicklern geschrieben werden. Viele Entwickler nutzen dies, um schnell Aufzeichnungen darüber zu veröffentlichen, woran sie gerade arbeiten, welche neuen Erweiterungen es gibt und andere Arbeiten, die gerade im Gange sind. Der BSDConferences YouTube-Kanal beinhaltet eine Sammlung von qualitativ hochwertigen Videos von BSD Konferenzen aus der ganzen Welt. Dies ist eine ausgezeichnete Art und Weise, den Entwicklern beim Präsentieren von neuen Arbeiten an FreeBSD zuzuschauen. Official Mirrors &chap.eresources.www.inc; E-Mail Adressen Die folgenden Benutzergruppen stellen ihren Mitgliedern für die Arbeit an FreeBSD E-Mail-Adressen zur Verfügung. Der aufgeführte Administrator behält sich das Recht vor, die Adresse zu sperren, wenn sie missbraucht wird. Domain Angebot Benutzergruppe Administrator ukug.uk.FreeBSD.org nur zum Weiterleiten ukfreebsd@uk.FreeBSD.org Lee Johnston lee@uk.FreeBSD.org diff --git a/de_DE.ISO8859-1/books/handbook/firewalls/chapter.sgml b/de_DE.ISO8859-1/books/handbook/firewalls/chapter.sgml index 8c9ae6aee4..4e98394ebd 100644 --- a/de_DE.ISO8859-1/books/handbook/firewalls/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/firewalls/chapter.sgml @@ -1,563 +1,576 @@ Joseph J. Barbish Beigetragen von Brad Davis Nach SGML konvertiert und aktualisiert von Michael Bunzel Teilweise übersetzt von Firewalls firewall security firewalls Einführung Firewalls ermöglichen es, den ein- und ausgehenden Netzwerkverkehr Ihres Systems zu filtern. Dazu verwendet eine Firewall eine oder mehrere Gruppen von Regeln, um ankommende Netzwerkpakete zu untersuchen und entweder durchzulassen oder zu blockieren. Die Regeln einer Firewall untersuchen charakteristische Eigenschaften von Datenpaketen, darunter den Protokolltyp, die Quell- und Zieladresse sowie den Quell- und Zielport. Firewalls können die Sicherheit eines Rechners oder eines Netzwerks erhöhen, indem sie folgende Aufgaben übernehmen: Den Schutz der Anwendungen, Dienste und Rechner Ihres internen Netzwerks vor unerwünschtem Datenverkehr aus dem Internet. Die Beschränkung des Zugriffs von Rechnern des internen Netzwerk auf Rechner oder Dienste des externen Internets. Den Einsatz von Network Address Translation (NAT), die es Ihnen durch die Verwendung von privaten IP-Adressen ermöglicht, eine einzige gemeinsame Internetverbindung für mehrere Rechner zu nutzen (entweder über eine einzige Adresse oder über eine Gruppe von jeweils automatisch zugewiesenen öffentlichen IP-Adressen). Nachdem Sie dieses Kapitel gelesen haben, werden Sie: Wissen, wie man korrekte Paketfilterregeln erstellt. Die Unterschiede zwischen den in &os; eingebauten Firewalls kennen. Wissen, wie man die PF-Firewall von OpenBSD konfiguriert und einsetzt. IPFILTER konfigurieren und einsetzen können. Wissen, wie man IPFW konfiguriert und einsetzt. Bevor Sie dieses Kapitel lesen, sollten Sie: Die grundlegenden Konzepte von &os; und dem Internet verstehen. Firewallkonzepte firewall rulesets Es gibt zwei grundlegende Arten, Regelgruppen für Firewalls zu erstellen: einschließend (inclusive firewall) sowie auschließend (exclusive Firewall). Eine auschließende Firewall lässt jeden Datenverkehr durch, der nicht durch eine Regel ausgeschlossen wurde. Eine einschließende Firewall macht das genaue Gegenteil. Sie lässt Datenverkehr nur dann durch, wenn er einer der definierten Regeln entspricht. - Einschließende Firewalls sind tendentiell sicherer als - ausschließende Firewalls, da sie das Risiko, dass - unerwünschter Datenverkehr die Firewall passiert, signifikant + Eine inclusive Firewall bietet eine wesentlich bessere Kontrolle + des ausgehenden Verkehrs, macht sie zur besseren Wahl für Systeme, + die Services für das Internet anbieten. Sie kontrolliert + auch den Verkehr vom Internet zu ihrem privaten Netzwerk. Jeder Verkehr, + der keiner Regel entspricht wird geblockt und geloggt. Inclusive + Firewalls sind generell sicherer als exclusive Firewalls, da sie das + Risiko, dass unerwünschter Verkehr hindurch geht, drastisch reduzieren. + + + Wenn nicht anders vermerkt, verwenden alle Konfigurationen + und Beispielregelsets dieses Kapitels inclusive Firewalls. + Die Sicherheit einer Firewall kann durch den Einsatz einer zustandsabhängigen Firewall (stateful firewall) weiter - erhöht werden. Eine zustandsabhängige Firewall + erhöht werden. Dieser Typ einer Firewall überwacht alle durch die Firewall gehenden offenen Verbindungen und erlaubt nur schon bestehenden Verkehr oder Datenverkehr, der eine neue Verbindung öffnet. Der Nachteil einer zustandsabhängigen Firewall ist allerdings, dass sie anfällig für Denial of Service (DoS) -Attacken ist, wenn sehr schnell sehr viele neue Verbindungen erstellt werden. Bei den meisten Firewalls können Sie eine Kombination aus zustandsabhängigem und nicht zustandsabhängigem Verhalten verwenden, um eine für Ihre - Bedürfnisse optimale Fireall einzurichten. + Bedürfnisse optimale Firewall einzurichten. Firewallpakete Das Basissystem von &os; enthält bereits drei Firewallpakete: IPFILTER (auch als IPF bekannt), IPFIREWALL (auch als IPFW bezeichnet) sowie das von OpenBSD übernommene PacketFilter (das auch als PF bezeichnet wird). Zusätzlich verfügt &os; über zwei eingebaute Pakete für das sogenannte traffic shaping (dabei handelt es sich die Steuerung des Bandbreitenverbrauchs): &man.altq.4; sowie &man.dummynet.4;. Dummynet steht traditionell in enger Verbindung mit IPFW, während ALTQ gemeinsam mit PF eingesetzt wird. - Traffic Shaping für IPFILTER ist derzeit - mit IPFILTER für NAT sowie Filterung und + Traffic Shaping für IPFILTER ist derzeit + mit IPFILTER für NAT sowie Filterung und mit IPFW und &man.dummynet.4; oder durch die Kombination von PF mit ALTQ möglich. Gemeinsam ist allen Firewallpaketen (IPF, IPFW sowie PF), dass sie Regeln einsetzen, um den Transfer von Datenpaketen auf und von Ihrem System zu regeln. Unterschiedlich sind aber die Art und Weise, wie dies realisiert wird. Auch die für diese Regeln verwendete Syntax ist unterschiedlich. &os; überlässt es dem Anwender, das Firewallsystem zu wählen, dass seinen Anforderungen und Vorlieben am Besten entspricht. Keines der im Basissystem enthaltenen Firewallpakete wird dabei als das beste angesehen. IPFILTER hat etwa den Vorteil, dass dessen zustandsabhängige Regeln relativ einfach in einer NAT-Umgebung implementiert werden können. Außerdem verfügt es über einen eigenen FTP-Proxy, der die Erstellung von sicheren Regeln für ausgehende FTP-Verbindungen vereinfacht. Da alle Firewalls auf der Untersuchung der Werte ausgewählter Kontrollfelder von Datenpaketen basieren, ist es für die Erstellung von Firewallregeln notwendig, die - Funktionsweise von TCP/IP zu verstehen. + Funktionsweise von TCP/IP zu verstehen. Außerdem muss man dazu wissen, was die Werte der einzelnen Kontrollfelder bedeuten und wie diese während einer Verbindung eingesetzt werden. Eine gute Erklärung dieser Thematik finden Sie unter . John Ferrell Revised and updated by Paket Filter (PF) von OpenBSD und <acronym>ALTQ</acronym> firewall PF Im Juli 2003 wurde PF, die Standard-Firewall von OpenBSD, nach &os; portiert und in die &os;-Ports-Sammlung aufgenommen. 2004 war PF in &os; 5.3 Teil des Basissystems. Bei PF handelt es sich um eine komplette, vollausgestattete Firewall, die optional auch ALTQ (Alternatives Queuing) unterstützt. ALTQ bietet Ihnen Quality of Service (QoS)-Bandbreitenformung. Das OpenBSD-Projekt leistet bereits hervorragende Dokumentationsarbeit mit der PF FAQ. Aus diesem Grund konzentriert sich dieser Handbuchabschnitt nur auf diejenigen Besonderheiten von PF, die &os; betreffen, sowie ein paar allgemeine Informationen hinsichtlich der Verwendung. Genauere Informationen zum Einsatz erhalten Sie in der PF FAQ. Weitere Informationen zu PF für &os; finden Sie unter . - Verwendung des PF-Kernelmoduls - - Seit der Veröffentlichung von &os; 5.3 ist PF als ein - separates, zur Laufzeit ladbares Modul enthalten. Das System lädt - das PF-Kernelmodul automatisch, wenn die &man.rc.conf.5;-Anweisung - pf_enable="YES" verwendet wird. Allerdings wird - das PF-Modul nicht geladen, wenn das System keine - Konfigurationsdatei mit einem Regelwerk finden kann. Der Standardpfad - ist /etc/pf.conf. Wenn ihr - PF-Regelwerk irgendwo anders abgelegt ist, tragen - Sie pf_rules="/path/pf.rules" - in ihre /etc/rc.conf ein, um den Pfad zu der - Konfigurationsdatei anzugeben. + Verwendung der PF-Kernelmodule + + Um die PF Kernel Module zu laden, fügen Sie folgende + Zeile in ihre /etc/rc.conf ein: + + pf_enable="YES" + + Danach starten Sie das Startup Script um die Module + zu laden: + + &prompt.root; /etc/rc.d/pf start + + Das PF Modul wird nicht geladen, falls es die Ruleset + Konfigurationsdatei nicht findet. Standardmässig befindet + sich diese Datei in /etc/pf.conf. Falls das + PF Ruleset sich an einem anderen Platz befindet, können Sie das + durch Hinzufügen einer Zeile ähnlich der folgenden, in + ihrer /etc/rc.conf ändern: + + pf_rules="/path/to/pf.conf" Seit &os; 7.0 ist die Beispiel-pf.conf - aus dem Verzeichnis /etc nach - /usr/share/examples/pf/ + aus dem Verzeichnis /etc nach + /usr/share/examples/pf/ gewandert. Bei &os; Versionen vor 7.0 existiert standardmässig eine Datei /etc/pf.conf. Das PF-Modul kann auch manuell über die Kommandozeile geladen werden: &prompt.root; kldload pf.ko + + Protokollierungsfunktionen für PF werden durch das Modul + pflog.ko zur Verfügung gestellt und + können durch folgenden Eintrag in der + /etc/rc.conf aktiviert werden: + + pflog_enable="YES" + + Danach starten Sie das Startup Script, um das Modul + zu laden: + + &prompt.root; /etc/rc.d/pflog start + + Falls Sie noch weitere Features für + PF benötigen, müssen Sie diese in den + Kernel einbauen. - Das Kernelmodul wurde mit aktiviertem &man.pflog.4; erstellt, - welches Unterstützung für Protokollierung liefert. Falls Sie - andere Eigenschaften von PF benötigen, - müssen Sie PF-Unterstützung mit in den - Kernel kompilieren. PF Kernel-Optionen kernel options device pf kernel options device pflog kernel options device pfsync Es ist nicht zwingend nötig, dass Sie PF-Unterstützung in den &os; Kernel kompilieren. Sie werden dies tun müssen, um eine von PFs fortgeschritteneren Eigenschaften nutzen zu können, die nicht als Kernelmodul verfügbar ist. Genauer handelt es sich dabei um &man.pfsync.4;, ein Pseudo-Gerät, welches bestimmte Änderungen der PF-Zustandstabelle offenlegt. Es kann mit &man.carp.4; kombiniert werden, um ausfallsichere Firewalls mit PF zu realisieren. Weitere - Informationen zu CARP erhalten Sie in Kapitel 29 des Handbuchs. + Informationen zu CARP erhalten Sie in + des Handbuchs. Die Kernelkonfigurationsoptionen von PF befinden sich in /usr/src/sys/conf/NOTES und sind im Folgenden wiedergegeben: device pf device pflog device pfsync Die Option device pf aktiviert die Unterstützung für die Packet Filter-Firewall (&man.pf.4;). Die Option device pflog aktiviert das optionale &man.pflog.4;-Pseudonetzwerkgerät, das zum Protokollieren des Datenverkehrs über einen &man.bpf.4;-Deskriptor dient. &man.pflogd.8; ist in der Lage, diese Protokolldateien auf Ihre Platte zu speichern. Die Option device pfsync aktiviert das optionale &man.pfsync.4;-Pseudonetzwerkgerät für die Überwachung von Statusänderungen. Verfügbare rc.conf-Optionen Die folgenden &man.rc.conf.5;-Einträge konfigurieren PF und &man.pflog.4; beim Systemstart: pf_enable="YES" # PF aktivieren (Modul, wenn nötig, aktivieren) pf_rules="/etc/pf.conf" # Datei mit Regeldefinitionen für pf pf_flags="" # zusätzliche Parameter für den Start von pfctl pflog_enable="YES" # starte pflogd(8) pflog_logfile="/var/log/pflog" # wo soll pflogd die Protokolldatei speichern pflog_flags="" # zusätzliche Parameter für den Start von pflogd Wenn Sie ein lokales Netzwerk hinter dieser Firewall betreiben und Pakete für dessen Rechner weiterleiten oder NAT verwenden wollen, benötigen Sie zusätzlich die folgende Option: gateway_enable="YES" # LAN Gateway aktivieren Filterregeln erstellen PF liest seine konfigurierten Regeln aus &man.pf.conf.5; (standardmässig /etc/pf.conf) und modifiziert, verwirft oder lässt Pakete passieren anhand der Regeln oder Definitionen, die in dieser Datei gespeichert sind. &os; enthält dazu nach der Installation mehrere Beispieldateien, die in /usr/share/examples/pf/ abgelegt sind. Für eine ausführliche Behandlung des PF-Regelwerks lesen Sie bitte die PF FAQ. - - Beim Lesen der PF FAQ wollten Sie - darauf achten, dass verschiedene Versionen von &os; auch - unterschiedliche Versionen von PF enthalten: - - - - &os; 5.X - - PF-Version von OpenBSD 3.5 - - - - &os; 6.X - - PF-Version von OpenBSD 3.7 - - - - &os; 7.X - - PF-Version von OpenBSD 4.1 - - - + + Beim Lesen der PF FAQ wollten Sie + darauf achten, dass verschiedene Versionen von &os; auch + unterschiedliche Versionen von PF enthalten. Das aktuelle + &os; 7.X und neuere Versionen + benutzen die selbe Version von PF wie + OpenBSD 4.1. + - Die &a.pf; ist eine erste Anlaufstelle für - Fragen zur Konfiguration und dem Einsatz der PF - Firewall. Vergessen Sie nicht, vorher die Mailinglistenarchive zu - durchsuchen, bevor Sie dort eine Frage stellen! + Die &a.pf; ist eine erste Anlaufstelle für + Fragen zur Konfiguration und dem Einsatz der PF + Firewall. Vergessen Sie nicht, vorher die Mailinglistenarchive zu + durchsuchen, bevor Sie dort eine Frage stellen! Arbeiten mit PF Benutzen Sie &man.pfctl.8;, um PF zu steuern. - Unten finden sie ein paar nützliche Befehle (lesen Sie auch die + Unten finden Sie ein paar nützliche Befehle (lesen Sie auch die Manualpage zu &man.pfctl.8;, um alle verfügbaren Optionen nachzuschlagen): Befehl Zweck pfctl PF aktivieren pfctl PF deaktivieren pfctl all /etc/pf.conf Alle Filterregeln zurücksetzen (NAT, Filter, Zustand, Tabelle, etc.) und erneut aus der Datei /etc/pf.conf auslesen pfctl [ Regeln | NAT | Zustand ] Bericht über die Filterregeln, NAT-Regeln, oder Zustandstabellen pfctl /etc/pf.conf überprüft /etc/pf.conf auf Fehler, lädt aber das Regelwerk nicht neu <acronym>ALTQ</acronym> aktivieren ALTQ muss vor der Verwendung in den &os;-Kernel kompiliert werden. Beachten Sie, dass ALTQ nicht von allen verfügbaren Netzwerkkartentreibern unterstützt wird. Sehen Sie daher zuerst in &man.altq.4; nach, ob Ihre Netzwerkkarte diese Funktion unter Ihrer &os;-Version unterstützt. Die folgenden Kerneloptionen aktivieren ALTQ sowie alle Zusatzfunktionen: options ALTQ options ALTQ_CBQ # Class Bases Queuing (CBQ) options ALTQ_RED # Random Early Detection (RED) options ALTQ_RIO # RED In/Out options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC) options ALTQ_PRIQ # Priority Queuing (PRIQ) options ALTQ_NOPCC # Wird von SMP benötigt options ALTQ aktiviert das ALTQ-Framework. options ALTQ_CBQ aktiviert das - Class Based Queuing + Class Based Queuing (CBQ). CBQ erlaubt es, die Bandbreite einer Verbindung in verschiedene Klassen oder Warteschlangen zu unterteilen, um die Priorität von Datenpaketen basierend auf Filterregeln zu ändern. - options ALTQ_RED aktiviert - Random Early Detection - (RED). RED wird - zur Vermeidung einer Netzwerkverstopfung verwendet. Dazu - ermittelt RED die Größe der - Warteschlange und vergleicht diesen Wert mit den minimalen - und maximalen Grenzwerten der Warteschlange. Ist die - Warteschlange größer als das erlaubte Maximum, - werden alle neuen Pakete verworfen. Getreu seinem Namen - verwirft RED Pakete unterschiedlicher + options ALTQ_RED aktiviert + Random Early Detection + (RED). RED wird + zur Vermeidung einer Netzwerkverstopfung verwendet. Dazu + ermittelt RED die Größe der + Warteschlange und vergleicht diesen Wert mit den minimalen + und maximalen Grenzwerten der Warteschlange. Ist die + Warteschlange größer als das erlaubte Maximum, + werden alle neuen Pakete verworfen. Getreu seinem Namen + verwirft RED Pakete unterschiedlicher Verbindungen nach dem Zufallsprinzip. options ALTQ_RIO aktiviert - Random Early Detection In and - Out. + Random Early Detection In and + Out. options ALTQ_HFSC aktiviert den - Hierarchical Fair Service Curve + Hierarchical Fair Service Curve -Paketplaner. Weitere Informationen zu HFSC finden Sie unter . options ALTQ_PRIQ aktiviert - Priority Queuing + Priority Queuing (PRIQ). PRIQ lässt Verkehr einer Warteschlange mit höherer Priorität zuerst durch. options ALTQ_NOPCC aktiviert die SMP Unterstützung von ALTQ. Diese Option ist nur auf SMP-System erforderlich. Die IPFILTER-Firewall (IPF) Dieses Kapitel ist noch nicht übersetzt. Lesen Sie bitte das Original in englischer Sprache. Wenn Sie helfen wollen, dieses Kapitel zu übersetzen, senden Sie bitte eine E-Mail an die Mailingliste &a.de.translators;. IPFW Dieses Kapitel ist noch nicht übersetzt. Lesen Sie bitte das Original in englischer Sprache. Wenn Sie helfen wollen, dieses Kapitel zu übersetzen, senden Sie bitte eine E-Mail an die Mailingliste &a.de.translators;. diff --git a/de_DE.ISO8859-1/books/handbook/l10n/chapter.sgml b/de_DE.ISO8859-1/books/handbook/l10n/chapter.sgml index 3c347f5d61..f1a1d6478f 100644 --- a/de_DE.ISO8859-1/books/handbook/l10n/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/l10n/chapter.sgml @@ -1,1043 +1,1043 @@ Andrey Chernov Beigesteuert von Michael C. Wu Überarbeitet von Alexander Langer Übersetzt von Martin Heinen Lokalisierung – I18N/L10N einrichten und benutzen Übersicht FreeBSD ist ein über die ganze Welt verteiltes Projekt. Dieses Kapitel behandelt die Internationalisierung und Lokalisierung von FreeBSD, mit denen nicht englisch sprechende Benutzer FreeBSD an ihre Bedürfnisse anpassen können. Die Internationalisierung betrifft sowohl die System- als auch die Anwendungsebene, daher wird im Laufe des Texts auf genauere Anwendungsdokumentationen verwiesen. Nachdem Sie dieses Kapitel durchgearbeitet haben, werden Sie wissen wie verschiedene Sprachen und Lokalisierungen in modernen Betriebssystemen codiert werden, wie Sie die Locale Ihrer Login-Shell setzen, wie Sie die Konsole für nicht-englische Sprachen konfigurieren, wie Sie das X Window System mit verschiedenen Sprachen benutzen, wo Sie mehr Informationen über das Erstellen von I18N-konformen Anwendungen erhalten. Bevor Sie dieses Kapitel lesen, sollten Sie wissen, wie Sie zusätzliche Anwendungen installieren (). Grundlagen Was ist I18N/L10N? Internationalisierung Lokalisierung Lokalisierung Entwickler kürzen das Wort internationalization (englisch für Internationalisierung) mit I18N ab, weil sich zwischen dem ersten und letzten Buchstaben des Worts 18 Buchstaben befinden. L10N benutzt die gleiche Namensgebung und ist eine Abkürzung des Worts localization (englisch für Lokalisierung). Mit I18N/L10N-Methoden, -Protokollen und -Anwendungen können Benutzer eine Sprache ihrer Wahl verwenden. I18N-Anwendungen werden mit Hilfe von I18N-Bibliotheken programmiert. Diese erlauben es Entwicklern, eine einfache Sprachdatei zu schreiben und Menüs und Texte an jede Sprache anzupassen. Wir möchten Programmierern empfehlen, für ihre eigenen Anwendungen auf diese Techniken zurückzugreifen. Wieso soll ich I18N/L10N benutzen? I18N/L10N wird immer dann benutzt, wenn Sie Daten in anderen Sprachen als Englisch anzeigen, eingeben oder verarbeiten möchten. Welche Sprachen werden von I18N unterstützt? I18N und L10N sind nichts FreeBSD spezifisches. Momentan können Sie unter den meisten der verbreitetsten Sprachen der Welt wählen, unter anderen Chinesisch, Japanisch, Koreanisch, Französisch, Russisch und Deutsch. Lokale Anpassungen benutzen In seiner ganzen Schönheit ist L10N nichts, was auf FreeBSD alleine beschränkt ist, im Gegenteil, es ist eine Konvention, an die sich viele Programme für verschiedene Betriebssysteme halten. Wir möchten Sie anregen, FreeBSD bei der Unterstützung dieser Konvention zu helfen. Locale Lokale Anpassungen werden durch die Angabe von drei Werten erreicht: dem Sprachcode, dem Ländercode und der Codierung. Die Zusammenfassung dieser Werte wird Locale genannt und sieht wie folgt aus: Sprachcode_Ländercode.Codierung Sprach- und Ländercodes Sprachcodes Ländercodes Um FreeBSD (oder ein anderes &unix; System, das I18N unterstützt) an lokale Gegebenheiten und Sprachen anzupassen, muss der Benutzer herausfinden, welche Codes für sein Land und seine Sprache benutzt werden. Ländercodes geben den Anwendungen dabei vor, welche Variation einer bestimmten Sprache zu benutzen ist. Eine Variation von Deutsch wäre zum Beispiel de_CH, das eine lokale Anpassung an das in der Schweiz gesprochene Deutsch meint. Außerdem benutzen Webbrowser, SMTP/POP Server, Webserver usw. diese, um Entscheidungen über die Sprache zu fällen. Im Folgenden sind einige Beispiele für Sprach- und Ländercodes aufgelistet: Sprachcode/Ländercode Beschreibung en_US Englisch - USA ru_RU Russisch für Russland zh_TW Traditionelles Chinesisch für Taiwan Codierungen Codierungen ASCII Einige Sprachen benutzen Codierungen, die nicht dem 7-Bit breitem ASCII-Standard entsprechen, wie 8-Bit Codierungen, Wide- oder Multibyte Zeichen (&man.multibyte.3; geht darauf näher ein). Ältere Anwendungen erkennen diese Zeichen nicht und halten sie fälschlicherweise für Steuerzeichen. Neuere Anwendungen erkennen für gewöhnlich 8-Bit Zeichen. Es hängt allerdings von der Implementierung ab, ob man eine Anwendung neu kompilieren muss, um in den Genuss von lokalen Zeichensätzen zu kommen, oder ob man es sie nur nachträglich konfigurieren muss. Um es möglich zu machen, Wide- oder Multibyte-Zeichen einzugeben und zu verarbeiten, unterstützt die FreeBSD-Ports-Sammlung verschiedene Sprachen für diverse Programme. Bitte konsultieren Sie die I18N-Dokumentation des entsprechenden FreeBSD-Ports. In den meisten Fällen muss der Benutzer in die Dokumentation des Programms schauen, um herauszufinden, wie man es entsprechend für die eigene Sprache und den eigenen Zeichensatz konfiguriert, oder welche Optionen beim Übersetzen anzugeben sind. Einige Dinge, die man im Hinterkopf behalten sollte, sind: Sprachbezogene C-char Zeichensätze Mit C-char Zeichensätzen werden Zeichensätze bezeichnet, die zur Codierung den C-Datentyp char verwenden. (siehe &man.multibyte.3;), zum Beispiel ISO8859-1, ISO8859-15, KOI8-R, CP437. Wide- oder Multibyte-Codierungen, zum Beispiel EUC, Big5. Eine aktuelle Liste der Zeichensätze ist in der IANA Registry. verfügbar. Ab &os; 4.5 werden X11-kompatible Codierungen verwendet. I18N-Anwendungen Im FreeBSD-Ports- und Paket-System werden I18N-Anwendungen mit einem I18N im Namen gekennzeichnet, damit man sie leicht identifizieren kann. Trotzdem kann es vorkommen, dass die benötigte Sprache nicht immer unterstützt wird. Einstellen der Locale Zum Aktivieren der Lokalisierung reicht es, die Umgebungsvariable LANG in Ihrer Login-Shell auf den Wert der Locale zu setzen und die Variable zu exportieren. Dies geschieht normalerweise in Ihrer ~/.login_conf oder der Startdatei Ihrer Shell (~/.profile, ~/.bashrc, ~/.cshrc). Wenn LANG gesetzt ist, brauchen die speziellen Variablen wie LC_CTYPE oder LC_CTIME in der Regel nicht gesetzt zu werden. Sie sollten sprachbezogene FreeBSD-Dokumentation zu Rate ziehen, wenn Sie mehr Informationen wünschen. Setzen Sie die zwei folgenden Umgebungsvariablen in Ihren Konfigurationsdateien: POSIX LANG für Funktionen der &posix; &man.setlocale.3; Familie MIME MM_CHARSET gibt den den MIME Zeichensatz von Anwendungen an Damit ist die Locale für die Shell, jede Anwendung und X11 eingestellt. Verfahren zum Einstellen der Locale Locale Login-Klasse Es gibt zwei Wege, die Locale zu setzen, die im Folgenden beschrieben werden. Die erste und empfohlene Methode ist, die Umgebungsvariablen in der Login-Klasse zu setzen, die zweite ist, sie in den Startdateien der Shell zu setzen. Lokalisierung in der Login-Klasse Wenn Sie diese Methode verwenden, werden die Umgebungsvariablen für die Locale und den MIME Zeichensatz einmal für alle Shells, anstatt einzeln für jede Shell, gesetzt. Die Lokalisierung kann von einem Benutzer selbst oder von einem Administrator mit Superuser-Rechten für alle eingestellt werden. Einrichten als Benutzer .login_conf im Heimatverzeichnis eines Benutzers sollte mindestens die folgenden Einträge enthalten, damit beide Variablen für den Gebrauch der Latin-1 Codierung gesetzt werden: me:\ :charset=ISO-8859-1:\ :lang=de_DE.ISO8859-1: traditionelles Chinesisch BIG-5 Codierung Damit traditionelles Chinesisch (BIG-5 Codierung) verwendet werden kann, sind in .login_conf die nachstehenden Ergänzungen vorzunehmen. Einige Programme behandeln die Lokalisierung für Chinesisch, Japanisch und Koreanisch falsch, daher müssen mehr Variablen als üblich gesetzt werden: #Users who do not wish to use monetary units or time formats #of Taiwan can manually change each variable me:\ :lang=zh_TW.Big5:\ :setenv=LC_ALL=zh_TW.Big:\ :setenv=LC_COLLATE=zh_TW.Big5:\ :setenv=LC_CTYPE=zh_TW.Big5:\ :setenv=LC_MESSAGES=zh_TW.Big5:\ :setenv=LC_MONETARY=zh_TW.Big5:\ :setenv=LC_NUMERIC=zh_TW.Big5:\ :setenv=LC_TIME=zh_TW.Big5:\ :charset=big5:\ :xmodifiers="@im=gcin": #Set gcin as the XIM Input Server Weitere Informationen entnehmen Sie bitte &man.login.conf.5;. Einrichten als Administrator Stellen Sie sicher, dass in der Login-Klasse der Benutzer in /etc/login.conf die richtige Sprache eingestellt ist. Die folgenden Einstellungen müssen in /etc/login.conf vorgenommen werden: - Sprache:Beschreibung:\ + Sprache|Account-Typ-Beschreibung:\ :charset=MIME_Zeichensatz:\ :lang=Locale:\ :tc=default: Die für Latin-1 erforderlichen Einträge sehen wie folgt aus: - german:German Users Accounts:\ + german|German Users Accounts:\ :charset=ISO-8859-1:\ :lang=de_DE.ISO8859-1:\ :tc=default: Bevor Sie die Login-Klasse eines Benutzers ändern, müssen Sie den folgenden Befehl ausführen: &prompt.root; cap_mkdb /etc/login.conf Erst danach werden Ihre Änderungen in /etc/login.conf im System sichtbar. Ändern der Login-Klasse mit &man.vipw.8; vipw Wenn Sie neue Accounts mit vipw anlegen, erstellen Sie Einträge in folgender Art: user:password:1111:11:Sprache:0:0:Benutzername:/home/user:/bin/sh Ändern der Login-Klasse mit &man.adduser.8; adduser Login-Klasse Wenn Sie neue Accounts mit adduser anlegen, stehen Ihnen die folgenden Möglichkeiten zur Verfügung: Geben Sie in /etc/adduser.conf mit defaultclass = Sprache eine Sprache vor. In diesem Fall müssen Sie für Benutzer anderer Sprachen eine andere Login-Klasse angeben. Geben Sie die Sprache jedes Mal ein, wenn Sie dazu von &man.adduser.8; aufgefordert werden: Enter login class: default []: Sie können die Login-Klasse auch auf der Kommandozeile von &man.adduser.8; übergeben: &prompt.root; adduser -class Sprache Ändern der Login-Klasse mit &man.pw.8; pw Wenn Sie neue Accounts mit &man.pw.8; anlegen, benutzen Sie die folgende Kommandozeile: &prompt.root; pw useradd Account -L Sprache Lokalisierung in den Startdateien der Shells Da Sie jede Shell unterschiedlich einrichten müssen, sollten Sie diese Methode nicht verwenden. Benutzen Sie stattdessen bitte Login-Klassen. MIME Locale Um die Locale und den MIME Zeichensatz anzugeben, setzen Sie die unten aufgeführten Variablen in den Startdateien der Shells (/etc/profile und /etc/csh.login). In den folgenden Beispielen verwenden wir die deutsche Sprache. Einstellungen in /etc/profile: LANG=de_DE.ISO8859-1; export LANG MM_CHARSET=ISO-8859-1; export MM_CHARSET Einstellungen in /etc/csh.login: setenv LANG de_DE.ISO8859-1 setenv MM_CHARSET ISO-8859-1 Alternativ können Sie die Einstellungen in den Vorgabedateien der Shells vornehmen. Die oben gezeigten Einstellungen aus /etc/profile tragen Sie dann in /usr/share/skel/dot.profile und die Einstellungen aus /etc/csh.login in /usr/share/skel/dot.login ein. Die Einstellungen für X11 in $HOME/.xinitrc sind von der verwendeten Login-Shell abhängig. Mit Bourne Shells verwenden Sie den folgenden Eintrag: LANG=de_DE.ISO8859-1; export LANG Mit C-Shells verwenden Sie den nachstehenden Eintrag: setenv LANG de_DE.ISO8859-1 Einrichten der Konsole Wenn Sie C-char Zeichensätze verwenden, müssen Sie die richtigen Zeichensätze für die gewählte Sprache in /etc/rc.conf angeben: font8x16=Zeichensatz font8x14=Zeichensatz font8x8=Zeichensatz Dabei ist Zeichensatz der Name der passenden Datei aus /usr/share/syscons/fonts ohne die Endung .fnt. sysinstall keymap screenmap Setzen Sie bei Bedarf die richtige Tasten- und Bildschirmzuordnung (keymap und screenmap). Dies können Sie in sysinstall einstellen, indem Sie Configure und dann Console wählen. Sie können die Zuordnungen aber auch direkt in /etc/rc.conf angeben: scrnmap=screenmap_name keymap=keymap_name keychange="fkey_number sequence" screenmap_name ist der Name einer Datei aus /usr/share/syscons/scrnmaps ohne die Endung .scm. Eine Bildschirmzuordnung und der zugehörige Zeichensatz verbreitert die Zeichenmatrix von VGA Karten im Pseudographik Modus von 8 Bit auf 9 Bit. Sie wird benötigt, wenn der Zeichensatz des Bildschirms 8 Bit verwendet. Lesen Sie den nächsten Absatz, wenn Sie in /etc/rc.conf den moused Dæmon mit der nachstehenden Anweisung aktiviert haben: moused_enable="YES" moused Der Mauszeiger des &man.syscons.4; Treibers belegt in der Voreinstellung den Bereich von 0xd0 bis 0xd3 des Zeichensatzes. Wenn dieser Bereich ebenfalls von der eingestellten Sprache benötigt wird, müssen Sie den Mauszeiger verschieben. Dazu fügen Sie die folgende Zeile in Ihre Kernelkonfigurationsdatei ein: mousechar_start=3 keymap_name ist der Name einer Datei aus /usr/share/syscons/keymaps ohne die Endung .kbd. Welche Tastenzuordnung Sie benutzen müssen, können Sie ohne einen Neustart mit &man.kbdmap.1; ausprobieren. Mit keychange können die Funktionstasten so programmiert werden, dass Sie zu dem ausgesuchten Terminal passen. Die Sequenzen der Funktionstasten können nicht in Tastenzuordnungen definiert werden. Stellen Sie sicher, dass der richtige Terminaltyp für die ttyv* Konsolen in /etc/ttys angegeben ist. Momentan sind die folgenden Terminaltypen definiert: Zeichensatz Terminaltyp ISO8859-1 oder ISO8859-15 cons25l1 ISO8859-2 cons25l2 ISO8859-7 cons25l7 KOI8-R cons25r KOI8-U cons25u CP437 (VGA default) cons25 US-ASCII cons25w Mit Wide- oder Multibyte-Zeichensätzen müssen Sie den richtigen Port aus dem Verzeichnis /usr/ports/Sprache verwenden. Einige Ports erscheinen als Konsolen werden aber vom System als serielle vtty's betrachtet. Achten Sie daher darauf, dass Sie genügend vtty's für X11 und die Pseudo-seriellen Konsolen definiert haben. Nachstehend finden Sie eine unvollständige Liste der Ports, die eine andere Sprache als Englisch auf der Konsole verwenden: Sprache Port traditionelles Chinesisch (BIG-5) chinese/big5con Japanisch japanese/kon2-16dot oder japanese/mule-freewnn Koreanisch korean/han Einrichten von X11 Obwohl X11 nicht Teil des FreeBSD Projects ist, stellen wir hier einige Hinweise für FreeBSD-Benutzer zusammen. Weitere Details entnehmen Sie bitte der &xorg; Website oder der Dokumentation Ihres X11 Servers. Anwendungsspezifische I18N-Einstellungen (Zeichensätze, Menüs, usw.) können Sie in ~/.Xresources vornehmen. Zeichensätze X11 True Type Font-Server Installieren Sie den &xorg;-Server (x11-servers/xorg-server) oder den &xfree86;-Server (x11-servers/XFree86-4-Server) und die &truetype; Zeichensätze Ihrer Sprache. Wenn Sie die Locale gesetzt haben, sollten die Menüs in Ihrer Sprache erscheinen. Eingabe von nicht-englischen Zeichen X11 Input Method (XIM) Das X11 Input Method (XIM) Protokoll ist ein neuer Standard für alle X11-Clients. Jede X11-Anwendung sollte als XIM-Client, der Eingaben von einem XIM-Server entgegen nimmt, implementiert sein. XIM-Server sind für verschiedene Sprachen erhältlich. Einrichten eines Druckers Drucker verfügen normalerweise schon über einige C-char Zeichensätze. Wide- oder Multibyte-Zeichensätze müssen gesondert eingerichtet werden. Wir empfehlen Ihnen, dazu apsfilter zu benutzen. Weiterhin können Sie mit sprachspezifischen Konvertern Ihre Dokumente auch in &postscript; oder PDF umwandeln. Kernel und Dateisysteme Das FreeBSD-Dateisystem (FFS) unterstützt 8-Bit, so dass es mit C-char Zeichensätzen (siehe &man.multibyte.3;) verwendet werden kann. Der Zeichensatz wird allerdings nicht im Dateisystem gespeichert, das heißt es werden nur die 8-Bit Werte gespeichert und die Codierung wird nicht berücksichtigt. Offiziell werden Wide- oder Multibyte-Zeichensätze noch nicht unterstützt, für einige Zeichensätze existieren Patche, die eine solche Unterstützung aktivieren. Sie sind allerdings nicht im Quelltext enthalten, da sie nur schwer pflegbare Übergangslösungen sind. Die Patche und weitere Informationen erhalten Sie auf den Webseiten der betreffenden Sprache. DOS Unicode Das &ms-dos; Dateisystem von FreeBSD kann von &ms-dos;- und Unicode-Zeichensätzen nach frei wählbaren FreeBSD Zeichensätzen konvertieren. Weitere Details entnehmen Sie bitte &man.mount.msdosfs.8;. I18N-Programme übersetzen Viele FreeBSD-Ports besitzen I18N-Unterstützung, einige davon enthalten -I18N im Namen. Für diese und viele andere Programme ist keine spezielle Konfiguration notwendig. MySQL Einige Anwendungen wie MySQL müssen allerdings speziell für einen Zeichensatz in ihrem Makefile konfiguriert werden. Normalerweise wird dazu das Makefile angepasst oder configure mit einem speziellen Parameter aufgerufen. Lokalisierung für einzelne Sprachen Andrey Chernov Beigetragen von Russisch (KOI8-R Codierung) Lokalisierung russisch Weitere Informationen über die KOI8-R Codierung erhalten Sie auf der Webseite KOI8-R References (Russian Net Character Set). Einrichten der Locale Fügen Sie die folgenden Zeilen in ~/.login_conf ein: me:My Account:\ :charset=KOI8-R:\ :lang=ru_RU.KOI8-R: Weitere Erklärungen finden Sie in Einstellen der Locale. Einrichten der Konsole Fügen Sie folgende Zeile in /etc/rc.conf ein: mousechar_start=3 Nehmen Sie zusätzlich die folgenden Einstellungen in /etc/rc.conf auf: keymap="ru.koi8-r" scrnmap="koi8-r2cp866" font8x16="cp866b-8x16" font8x14="cp866-8x14" font8x8="cp866-8x8" Benutzen Sie cons25r als Terminaltyp für jeden ttyv* Eintrag in /etc/ttys. Weitere Beispiele finden Sie in Einrichten der Konsole. Einrichten eines Druckers Drucker Die meisten Drucker mit russischen Zeichen besitzen die Codetabelle CP866, so dass ein spezielles Programm zur Übersetzung von KOI8-R nach CP866 benötigt wird. Zu diesem Zweck ist /usr/libexec/lpr/ru/koi2alt im Basissystem enthalten. Der Eintrag für einen Drucker mit russischer Sprachunterstützung in /etc/printcap sieht wie folgt aus: lp|Russian local line printer:\ :sh:of=/usr/libexec/lpr/ru/koi2alt:\ :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs: Näheres erfahren Sie in &man.printcap.5;. &ms-dos; Dateisystem und russische Dateinamen Russische Dateinamen auf &ms-dos; Dateisystemen werden mit dem folgenden Eintrag in /etc/fstab erkannt: /dev/ad0s2 /dos/c msdos rw,-Wkoi2dos,-Lru_RU.KOI8-R 0 0 Die Option legt die Locale fest. Die Option legt die Zeichenumwandlung fest. Stellen Sie sicher, dass /usr eingehangen ist, bevor Sie die &ms-dos;-Partition einhängen, da die Tabellen zur Zeichenumwandlung in /usr/libdata/msdosfs liegen. Weitere Informationen erhalten Sie in der Hilfeseite &man.mount.msdosfs.8;. Einrichten von X11 Richten Sie zunächst die normale Lokalisierung ein. Wenn Sie &xorg; verwenden, installieren Sie den Port x11-fonts/xorg-fonts-cyrillic. Im Abschnitt "Files" von /etc/X11/xorg.conf fügen Sie den folgende Eintrag vor allen anderen FontPath Einträgen ein: FontPath "/usr/local/lib/X11/fonts/cyrillic" Zusätzliche kyrillische Schriftarten finden Sie in der Ports-Sammlung. Die Unterstützung für eine russische Tastatur aktivieren Sie im "Keyboard" Abschnitt von xorg.conf: Option "XkbLayout" "us,ru" Option "XkbOptions" "grp:toggle" Stellen Sie zudem sicher, dass XkbDisable deaktiviert (auskommentiert) ist. Beim Einsatz von grp:toggle können Sie mit Right Alt (Alt Gr) zwischen dem RUS- und LAT-Modus wechseln, verwenden Sie hingegen grp:ctrl_shift_toggle, so erfolgt der Wechsel mit Ctrl Shift . Für grp:caps_toggle ist zum Wechseln des RUS/LAT-Modus CapsLock zuständig. Die alte Funktion von CapsLock steht nur im LAT-Modus mit der Tastenkombination Shift CapsLock zur Verfügung. grp:caps_toggle funktioniert aus unbekannten Gründen unter &xorg; nicht. Wenn Ihre Tastatur &windows;-Tasten besitzt und nicht-alphanumerische Tasten im RUS-Modus nicht funktionieren, fügen Sie die folgende Zeile in xorg.conf ein: Option "XkbVariant" ",winkeys" Die russische XKB-Tastatur funktioniert vielleicht nicht mit nicht-lokalisierten Anwendungen. Lokalisierte Anwendungen sollten mindestens die Funktion XtSetLanguageProc (NULL, NULL, NULL); frühzeitig aufrufen. Weitere Informationen über die Lokalisierung von X11-Anwendungen erhalten Sie auf der Webseite KOI8-R for X Window. Traditionell chinesische Lokalisierung für Taiwan Lokalisierung traditionell chinesisch Das taiwanesische FreeBSD Project stellt ein Tutorium unter zur Verfügung, das viele chinesische Anwendungen benutzt. Der Editor des FreeBSD Chinese HOWTOs ist Shen Chuan-Hsing statue@freebsd.sinica.edu.tw. Chuan-Hsing Shen statue@freebsd.sinica.edu.tw hat mithilfe des Tutoriums die Chinese FreeBSD Collection (CFC) geschaffen. Die Pakete und Skripten stehen unter . Deutsche Lokalisierung (für alle ISO 8859-1 Sprachen) Lokalisierung deutsch Von Slaven Rezic eserte@cs.tu-berlin.de stammt ein Tutorium, das die Benutzung von Umlauten mit FreeBSD beschreibt. Das Tutorium ist in Deutsch verfasst und unter verfügbar. Griechische Lokalisierung Lokalisierung griechisch Nikos Kokkalis nickkokkalis@gmail.com hat einen ganzen Artikel über die Griechisch-Unterstützung in &os; geschrieben. Er ist als Teil der offiziellen &os; Dokumentation auf Griechisch erhältlich unter http://www.freebsd.org/doc/el_GR.ISO8859-7/articles/greek-language-support/index.html. Bitte beachten Sie, dass dies nur für Griechisch gilt. Japanische und koreanische Lokalisierung Lokalisierung japanisch Lokalisierung koreanisch Informationen über die japanische Lokalisierung entnehmen Sie bitte , Informationen über die koreanische Lokalisierung erhalten Sie unter . Nicht-englische FreeBSD-Dokumentation Teile vor FreeBSD Dokumentation wurden in andere Sprachen übersetzt. Folgen Sie bitte den Links auf der FreeBSD-Webseite oder schauen Sie in /usr/share/doc nach. diff --git a/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.sgml b/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.sgml index 441f66b24f..174a9a4a9d 100644 --- a/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.sgml @@ -1,3753 +1,3753 @@ Jim Mock Restrukturiert und teilweise aktualisiert von Brian N. Handy Beigetragen von Rich Murphey Johann Kois Übersetzt von Linux-Binärkompatibilität Übersicht Linux-Binärkompatibilität Binärkompatibilität Linux FreeBSD bietet Binärkompatibilität zu verschiedenen anderen &unix; Betriebssystemen, darunter auch Linux. Nun könnten Sie sich fragen, warum FreeBSD in der Lage sein muss, Linux-Binärprogramme auszuführen? Die Antwort auf diese Frage ist sehr einfach. Viele Unternehmen und Entwickler programmieren bzw. entwickeln nur für Linux, da es das Neueste und Beste in der Computerwelt ist. Für uns FreeBSD-Anwender heißt dies, genau diese Unternehmen und Entwickler zu bitten, FreeBSD-Versionen ihrer Programme herauszubringen. Das Problem dabei ist nur, dass die meisten dieser Firmen trotzdem nicht erkennen, wie viele zusätzliche Anwender ihre Produkte benutzen würden, wenn es auch FreeBSD-Versionen gäbe, und daher weiterhin ausschließlich für Linux entwickeln. Was also kann ein FreeBSD-Anwender tun? Genau an diesem Punkt kommt die Linux- Binärkompatibilität ins Spiel. Um es auf den Punkt zu bringen, genau diese Kompatibilität erlaubt es FreeBSD-Anwendern, etwa 90 % aller Linux-Anwendungen ohne Code-Änderungen zu verwenden. Dies schließt solche Anwendungen wie &staroffice;, Open Office, die Linux-Versionen von &netscape;, &adobe; &acrobat;, &realplayer;, VMWare , &oracle;, &wordperfect;, Doom, Quake und viele andere ein. Es wird sogar berichtet, dass diese Linux-Anwendungen in manchen Fällen unter FreeBSD eine bessere Leistung als unter Linux aufweisen. Allerdings gibt es nach wie vor einige Linux-spezifische Betriebssystem-Eigenschaften, die unter FreeBSD nicht unterstützt werden. Linux-Anwendungen, die &i386;-spezifische Aufrufe (wie die Aktivierung des virtuellen 8086-Modus) verwenden, funktionieren unter FreeBSD leider nicht. Nach dem Lesen dieses Kapitels werden Sie wissen, wie Sie die Linux-Binärkompatibilität installieren bzw. aktivieren. Wissen, wie man zusätzliche Linux-Systembibliotheken unter FreeBSD installiert. Linux-Anwendungen unter FreeBSD installieren können. Wissen, wie die Linux-Binärkompatibilität unter FreeBSD verwirklicht wurde. Bevor Sie dieses Kapitel lesen, sollten Sie wissen, wie man Software Dritter installiert (). Installation KLD (kernel loadable object) Die Linux-Binärkompatibilität ist per Voreinstellung nicht aktiviert. Der einfachste Weg, dies zu tun, ist das Linux KLD (Kernel LoaDable object) zu laden. Dies erreichen Sie durch die Eingabe des folgenden Befehls: &prompt.root; kldload linux Wollen Sie die Linux-Binärkompatibilität dauerhaft aktivieren, sollten Sie die folgende Zeile in /etc/rc.conf einfügen: linux_enable="YES" Der &man.kldstat.8;-Befehl kann benutzt werden, um festzustellen, ob KLD geladen wurde: &prompt.user; kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko Kerneloptionen COMPAT_LINUX Wenn Sie das KLD nicht laden können oder wollen, besteht auch die Möglichkeit, die Linux-Binärkompatibiltät statisch in den Kernel einzubinden. Dazu fügen Sie Ihrer Kernelkonfigurationsdatei den Eintrag options COMPAT_LINUX hinzu. Anschließend installieren Sie Ihren neuen Kernel wie in beschrieben. Linux-Laufzeitbibliotheken installieren Linux Linux-Laufzeitbibliotheken installieren Dies kann auf zwei Arten geschehen, entweder über den linux_base-Port oder durch manuelle Installation der Bibliotheken. Installation unter Verwendung des linux_base-Ports Ports-Sammlung Dies ist die einfachste Methode, um die Laufzeitbibliotheken zu installieren. Sie funktioniert genauso wie die Installation eines beliebigen anderen Ports aus der Ports-Sammlung. Dazu machen Sie einfach folgendes: &prompt.root; cd /usr/ports/emulators/linux_base-f10 &prompt.root; make install distclean Bei &os;-Systemen vor &os; 8.0 müssen Sie den Port emulators/linux_base-fc4 anstatt emulators/linux_base-f10 installieren. Sie sollten nun über eine funktionierende Linux-Binärkompatibilität verfügen. Einige Programme könnten sich zwar über falsche Unterversionsnummern der Systembibliotheken beschweren, dies ist im Allgemeinen aber kein Problem. Unter Umständen gibt es mehrere Versionen des Ports emulators/linux_base. Die Ports entsprechen unterschiedlichen Versionen verschiedener Linux-Distributionen Sie sollten den Port installieren, der am besten die Anforderungen der Linux-Anwendung erfüllt. Manuelle Installation der Bibliotheken Wenn Sie die Ports-Sammlung nicht installiert haben, können Sie die Bibliotheken auch manuell installieren. Dazu brauchen Sie die jeweiligen Linux-Systembibliotheken, die das zu installierende Programm verwendet sowie den Laufzeit-Linker. Zusätzlich müssen Sie auf Ihrem FreeBSD-System einen virtuellen Verzeichnisbaum für die Linux-Bibliotheken einrichten. Alle unter FreeBSD gestarteten Linux-Programme suchen zuerst in diesem Verzeichnisbaum nach Systembibliotheken. Wenn also ein Linuxprogramm beispielsweise /lib/libc.so lädt, versucht FreeBSD zuerst, /compat/linux/lib/libc.so laden. Ist diese Datei nicht vorhanden, wird /lib/libc.so geladen. Systembibliotheken sollten daher besser in den virtuellen Verzeichnisbaum /compat/linux/lib als in den vom Linux-ld.so vorgeschlagenen installiert werden. Im Allgemeinen müssen Sie nur zu Beginn nach den Systembibliotheken suchen, die von Linuxprogrammen benötigt werden. Nach den ersten Installationen von Linuxprogrammen auf Ihrem FreeBSD-System verfügen Sie über eine Sammlung von Linux-Systembibliotheken, die es Ihnen ermöglichen wird, neue Linuxprogramme ohne Zusatzarbeit zu installieren. Installation zusätzlicher Systembibliotheken Shared-Libraries Was passiert, wenn Sie den linux_base-Port installieren, und Ihr Programm beschwert sich trotzdem über fehlende Systembibliotheken? Woher wissen Sie, welche Systembibliotheken von Linux-Binärprogrammen benötigt werden, und wo Sie diese finden? Grundsätzlich gibt es dafür zwei Möglichkeiten (um dieser Anleitung zu folgen, müssen Sie unter FreeBSD als Benutzer root angemeldet sein): Wenn Sie Zugriff auf ein Linux-System haben, können Sie dort nachsehen, welche Systembibliotheken eine Anwendung benötigt, und diese auf Ihr FreeBSD-System kopieren. Dazu folgendes Beispiel: Nehmen wir an, Sie haben FTP verwendet, um die Linux-Binärversion von Doom zu bekommen und haben sie auf Ihrem Linux-System installiert. Nun können Sie überprüfen, welche Systembibliotheken das Programm benötigt, indem Sie ldd linuxdoom eingeben. Das Resultat sieht dann so aus: &prompt.user; ldd linuxdoom libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0 libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0 libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29 symbolische Links Sie müssten nun alle Dateien aus der letzten Spalte kopieren und sie unter /compat/linux speichern, wobei die Namen der ersten Spalte als symbolische Links auf diese Dateien zeigen. Damit haben Sie schließlich folgende Dateien auf Ihrem FreeBSD-System: /compat/linux/usr/X11/lib/libXt.so.3.1.0 /compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0 /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Beachten Sie, dass wenn Sie bereits eine Linux-Systembibliothek einer zur ersten Spalte passenden Hauptversionsnummer (laut ldd-Ausgabe) besitzen, Sie die Datei aus der zweiten Spalte nicht mehr kopieren müssen, da die bereits vorhandene Version funktionieren sollte. Hat die Systembibliothek jedoch eine neuere Versionsnummer, sollten Sie sie dennoch kopieren. Sie können die alte Version löschen, solange Sie einen symbolischen Link auf die neue Version anlegen. Wenn Sie also folgende Bibliotheken auf Ihrem System installiert haben: /compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27 und Sie haben eine neue Binärdatei, die laut ldd eine neuere Bibliothek benötigt: libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 Wenn diese sich nur um ein oder zwei Stellen in der Unterversionsnummer unterscheiden, müssen Sie /lib/libc.so.4.6.29 nicht auf Ihr System kopieren, da das Programm auch mit der etwas älteren Version ohne Probleme funktionieren sollte. Wenn Sie wollen, können Sie libc.so aber dennoch ersetzen (das heißt aktualisieren), was dann zu folgender Ausgabe führt: /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Der Mechanismus der symbolischen Links wird nur für Linux-Binärdateien benötigt. Der FreeBSD-Laufzeitlinker sucht sich die passenden Hauptversionsnummern selbst, das heißt Sie müssen sich nicht darum kümmern.
Linux ELF-Binärdateien installieren Linux ELF-Binärdatei ELF-Binärdateien benötigen manchmal eine zusätzliche Kennzeichnung. Wenn Sie versuchen, eine nicht gekennzeichnete ELF-Binärdatei auszuführen, werden Sie eine Fehlermeldung ähnlich der folgenden erhalten: &prompt.user; ./my-linux-elf-binary ELF binary type not known Abort Damit der FreeBSD-Kernel eine Linux-ELF-Datei von einer FreeBSD-ELF-Datei unterscheiden kann, gibt es das Werkzeug - &man.brandelf.1;: + &man.brandelf.1;. &prompt.user; brandelf -t Linux my-linux-elf-binary GNU Werkzeuge Die GNU Werkzeuge schreiben nun automatisch die passende Kennzeichnungsinformation in die ELF-Binärdateien, so dass Sie diesen Schritt in Zukunft nur noch selten benötigen werden. Installieren einer beliebigen RPM-basierten Linuxanwendung &os; besitzt seine eigene Paketdatenbank und diese wird dazu verwendet, um alle Ports (auch &linux;-Ports) zu verfolgen. Deshalb wird die &linux; RPM-Datenbank nicht benutzt (fehlende Unterstützung). Falls Sie jedoch eine beliebige RPM-basierte &linux;-Anwendung installieren wollen, erreichen Sie das mittels: &prompt.root; cd /compat/linux &prompt.root; rpm2cpio -q < /path/to/linux.archive.rpm | cpio -id Benutzen Sie dann brandelf auf die installierten ELF-Binärdateien (nicht die Bibliotheken!). Sie werden keine saubere Deinstallation hinbekommen, aber evtl. helfen ein paar Tests weiter. Namensauflösung konfigurieren Wenn DNS nicht funktioniert, oder Sie folgende Fehlermeldung erhalten: resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword müssen sie /compat/linux/etc/host.conf wie folgt anlegen: order hosts, bind multi on Diese Reihenfolge legt fest, dass zuerst /etc/hosts und anschließend DNS durchsucht werden. Wenn /compat/linux/etc/host.conf nicht vorhanden ist, finden Linux-Anwendungen FreeBSD's /etc/host.conf und beschweren sich über die inkompatible FreeBSD-Syntax. Wenn Sie keinen Nameserver (in /etc/resolv.conf) konfiguriert haben, sollten Sie den Eintrag bind entfernen.
Boris Hollas Für Mathematica 5.x aktualisiert von &mathematica; installieren Linux-Anwendungen Mathematica Dieses Dokument beschreibt die Installation der Linux-Version von &mathematica; 5.x auf einem FreeBSD-System. Die Linux-Version von &mathematica; oder &mathematica; für Studenten kann direkt von Wolfram unter bestellt werden. Den &mathematica;-Installer starten Zuerst müssen Sie &os; mitteilen, dass die Linux-Binärversion von &mathematica; die Linux-ABI verwendet. Dies erreichen Sie am einfachsten, indem Sie die Standard-ELF-Kennzeichnung für alle ungekennzeichneten Binärdateien auf Linux festlegen: &prompt.root; sysctl kern.fallback_elf_brand=3 Danach wird FreeBSD annehmen, dass alle ungekennzeichneten ELF-Binärdateien die Linux-ABI verwenden und es wäre nun möglich, das Installationsprogramm direkt von der CD-ROM zu starten. Unter &os; müssen allerdings die Datei MathInstaller in ein lokales Verzeichnis Ihrer Festplatte kopieren: &prompt.root; mount /cdrom &prompt.root; cp /cdrom/Unix/Installers/Linux/MathInstaller /LokalesVerzeichnis/ In dieser Datei ersetzen Sie in der ersten Zeile den Wert /bin/sh durch /compat/linux/bin/sh. Dadurch wird sichergestellt, dass der Installer von der Linux-Version von &man.sh.1; aufgerufen wird. Danach ersetzen Sie durch das im nächsten Abschnitt zu findende Skript oder über einen Texteditor alle Vorkommen von Linux) durch FreeBSD). Dadurch ist es dem &mathematica;-Installer möglich, durch den Einsatz von uname -s das Betriebssystem zu bestimmen. &os; wird dabei als Linux-artiges Betriebssystem behandelt. Durch den Aufruf von MathInstaller kann &mathematica; anschließend installiert werden. Die &mathematica;-Programmdateien anpassen Das von &mathematica; während der Installation erzeugte Shell-Skript muss angepasst werden, bevor Sie es einsetzen können. Wenn Sie die &mathematica;-Programmdateien unter /usr/local/bin installieren, finden Sie in diesem Verzeichnis die symbolische Links math, mathematica, Mathematica, sowie MathKernel. In jeder dieser Dateien müssen Sie jedes Vorkommen von Linux) durch FreeBSD) ersetzen (entweder über einen Texteditor oder durch das folgende Shellskript): #!/bin/sh cd /usr/local/bin for i in math mathematica Mathematica MathKernel do sed 's/Linux)/FreeBSD)/g' $i > $i.tmp sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp > $i rm $i.tmp chmod a+x $i done Ihr &mathematica;-Passwort anfordern Ethernet MAC-Adresse Wenn Sie &mathematica; das erste Mal starten, werden Sie nach einem Passwort gefragt. Haben Sie noch kein Passwort von Wolfram erhalten, müssen Sie zuerst im Installationsverzeichnis mathinfo aufrufen, um Ihre Rechner-ID zu bestimmen. Diese Rechner-ID basiert ausschließlich auf der MAC-Adresse Ihrer ersten Netzwerkkarte. Daher ist es nicht möglich, Ihre &mathematica;-Kopie auf verschiedenen Rechnern zu installieren. Wenn Sie sich bei Wolfram registrieren (durch E-Mail, Telefon oder Fax), teilen Sie Ihre Rechner-ID mit und erhalten dafür ein aus Zahlengruppen bestehendes Passwort. Das &mathematica;-Frontend über ein Netzwerk ausführen &mathematica; verwendet einige spezielle Schriftarten, um Zeichen anzuzeigen, die in den Standardzeichensätzen nicht vorhanden sind (z.B. Integrale, Summen, griechische Buchstaben). Das X-Protokoll verlangt allerdings, dass diese Schriftarten lokal installiert sind. Das bedeutet, dass Sie diese Schriftarten von der CD-ROM oder von einem Rechner, auf dem &mathematica; installiert ist, auf Ihren Rechner kopieren müssen. Diese Schriftarten befinden sich normalerweise in /cdrom/Unix/Files/SystemFiles/Fonts (&mathematica;-CD) oder in /usr/local/mathematica/SystemFiles/Fonts (Festplatte). Die aktuellen Schriftarten befinden sich dabei in den Unterverzeichnissen Type1 und X. Um diese Schriftarten zu verwenden, gibt es mehrere Möglichkeiten, die nun beschrieben werden: Die erste Möglichkeit besteht darin, die Schriftarten in eins der bereits existierenden Schriftartenverzeichnisse unter /usr/X11R6/lib/X11/fonts zu kopieren. Dies bedeutet, dass Sie fonts.dir editieren müssen, indem Sie die Schriftnamen hinzufügen und die Anzahl der Schriftarten in der ersten Zeile ändern. Alternativ ist es auch möglich, im Verzeichnis, in das Sie die Schriftarten kopiert haben, das Kommando &man.mkfontdir.1; auszuführen. Die zweite Möglichkeit, besteht darin, die Verzeichnisse nach /usr/X11R6/lib/X11/fonts zu kopieren: &prompt.root; cd /usr/X11R6/lib/X11/fonts &prompt.root; mkdir X &prompt.root; mkdir MathType1 &prompt.root; cd /cdrom/Unix/Files/SystemFiles/Fonts &prompt.root; cp X/* /usr/X11R6/lib/X11/fonts/X &prompt.root; cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; cd /usr/X11R6/lib/X11/fonts/X &prompt.root; mkfontdir &prompt.root; cd ../MathType1 &prompt.root; mkfontdir Nun fügen Sie die neuen Schriftartenverzeichnisse in Ihren Pfad ein: &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/X &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; xset fp rehash Wenn Sie den &xorg;-Server verwenden, können Sie die Schriftarten-Verzeichnisse automatisch laden lassen, wenn Sie sie in Ihrer xorg.conf angeben. Für den &xfree86;-Server verwenden Sie die Datei XF86Config. Schriftarten Wenn Sie noch kein /usr/X11R6/lib/X11/fonts/Type1-Verzeichnis haben, können Sie das MathType1-Verzeichnis im vorherigen Beispiel in Type1 umbenennen. Aaron Kaplan Beigetragen von Robert Getschmann Mit Unterstützung durch &maple; installieren Linux-Anwendungen Maple &maple; ist ein mit &mathematica; vergleichbares kommerzielles Mathematikprogramm. Sie können dieses Programm unter kaufen und sich anschließend registrieren, um eine Lizenz zu erhalten. Um dieses Programm unter FreeBSD zu installieren, gehen Sie wie folgt vor: Führen Sie das INSTALL-Shell-Skript der Softwaredistribution aus. Wählen Sie die RedHat-Option aus, wenn Sie das Installationsprogramm danach fragt. Ein typisches Installationsverzeichnis wäre z.B. /usr/local/maple. Wenn Sie dies noch nicht gemacht haben, besorgen Sie sich nun eine &maple;-Lizenz von Maple Waterloo Software () und kopieren Sie diese nach /usr/local/maple/license/license.dat. Installieren Sie den FLEXlm-Lizenz-Manager, indem Sie das INSTALL_LIC-Installations-Shellskript ausführen, das mit &maple; ausgeliefert wird. Geben Sie Ihren primären Rechnernamen für den Lizenz-Server an. Verändern Sie /usr/local/maple/bin/maple.system.type wie folgt: ----- snip ------------------ *** maple.system.type.orig Sun Jul 8 16:35:33 2001 --- maple.system.type Sun Jul 8 16:35:51 2001 *************** *** 72,77 **** --- 72,78 ---- # the IBM RS/6000 AIX case MAPLE_BIN="bin.IBM_RISC_UNIX" ;; + "FreeBSD"|\ "Linux") # the Linux/x86 case # We have two Linux implementations, one for Red Hat and ----- snip end of patch ----- Bitte beachten Sie, dass nach "FreeBSD"|\ kein anderes Zeichen eingefügt werden darf. Dieser Patch weist &maple; an, FreeBSD als eine Art von Linux-System zu erkennen. Das Shell-Skript bin/maple ruft das Shell-Skript bin/maple.system.type auf, welches wiederum uname -a verwendet, um den Namen des Betriebssystems herauszufinden. Abhängig vom Betriebssystem weiß das System nun, welche Binärdateien verwendet werden sollen. Starten Sie den Lizenz-Server. Das folgende, als /usr/local/etc/rc.d/lmgrd.sh installierte Shell-Skript ist ein komfortabler Weg, um lmgrd zu starten: ----- snip ------------ #! /bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX export PATH LICENSE_FILE=/usr/local/maple/license/license.dat LOG=/var/log/lmgrd.log case "$1" in start) lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2 echo -n " lmgrd" ;; stop) lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2 ;; *) echo "Usage: `basename $0` {start|stop}" 1>&2 exit 64 ;; esac exit 0 ----- snip ------------ Versuchen Sie, &maple; zu starten: &prompt.user; cd /usr/local/maple/bin &prompt.user; ./xmaple Nun sollte das Programm laufen und alles funktionieren. Falls ja, vergessen Sie nicht, an Maplesoft zu schreiben und sie wissen zu lassen, dass Sie gerne eine native FreeBSD-Version hätten. Häufige Fehlerquellen Der FLEXlm-Lizenzmanager kann schwierig zu bedienen sein. Zusätzliche Dokumentation zu diesem Thema finden Sie unter . Es ist bekannt, dass lmgrd sehr pingelig ist, wenn es um die Lizenzdatei geht. Gibt es Probleme, führt dies zu einem Speicherauszug (core dump). Ein korrekte Lizenzdatei sollte ähnlich der folgenden aussehen: # ======================================================= # License File for UNIX Installations ("Pointer File") # ======================================================= SERVER chillig ANY #USE_SERVER VENDOR maplelmg FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \ PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \ ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \ SN=XXXXXXXXX Seriennummer und Schlüssel wurden durch mehrere X unkenntlich gemacht. chillig ist ein Rechnername. Veränderungen an der Lizenzdatei sind möglich, solange Sie die FEATURE-Zeile nicht verändern (diese ist durch den Lizenzschlüssel geschützt). Dan Pelleg Beigesteuert von &matlab; installieren Linux-Anwendungen MATLAB Im Folgenden wird die Installation der Linux-Anwendung &matlab; Version 6.5 auf &os; beschrieben. Mit Ausnahme der &java.virtual.machine; (siehe ) läuft die Anwendung auch ganz gut. Die Linux-Version von &matlab; können Sie direkt bei The MathWorks bestellen. Vergewissern Sie sich, dass Sie die Lizenz-Datei oder eine Anleitung zum Erstellen der Lizenz-Datei erhalten haben. Wenn Sie mit MathWorks in Kontakt stehen, weisen Sie bitte auf die fehlende &os;-Version der Software hin. Das &matlab;-Installationsskript Um &matlab; zu installieren, gehen Sie wie folgt vor: Hängen Sie die Installations-CD ein und wechseln Sie zu root, wie im Installations-Skript gefordert. Starten Sie die Installation mit dem folgenden Kommando: &prompt.root; /compat/linux/bin/sh /cdrom/install Die Installation erfordert eine graphische Benutzeroberfläche. Wenn Sie die Fehlermeldung erhalten, dass das Display nicht geöffnet werden konnte, führen Sie das folgende Kommando aus: &prompt.root; setenv HOME ~USER Für USER setzen Sie den Benutzer ein, von dem aus Sie root geworden sind. Beantworten Sie die Frage nach dem &matlab;-Root-Verzeichnis mit: /compat/linux/usr/local/matlab. Den langen Pfad werden Sie noch öfter brauchen. Die Tipparbeit können Sie sich mit dem folgenden Befehl erleichtern: &prompt.root; set MATLAB=/compat/linux/usr/local/matlab Editieren Sie die Lizenz-Datei entsprechend der Anweisung, die Sie beim Erwerb der Lizenz erhalten haben. Sie können die Datei schon vorher mit Ihrem Lieblingseditor bearbeiten. Kopieren Sie die Lizenz-Datei nach $MATLAB/license.dat bevor das Installationsprogramm Sie auffordert, die Datei zu editieren. Schließen Sie die Installation ab. Die &matlab;-Installation ist jetzt abgeschlossen. Die folgenden Schritte passen &matlab; an &os; an. Den Lizenzmanager starten Erstellen Sie symbolische Links zu den Startskripten des Lizenzmanagers: &prompt.root; ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW &prompt.root; ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW Erstellen Sie das Startskript /usr/local/etc/rc.d/flexlm.sh. Das folgende Beispiel ist eine geänderte Version des mitgelieferten Skripts $MATLAB/etc/rc.lm.glnx86. Angepasst wurden die Pfade zu den Dateien und der Start des Lizenzmanagers unter der Linux-Emulation. #!/bin/sh case "$1" in start) if [ -f /usr/local/etc/lmboot_TMW ]; then /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u username && echo 'MATLAB_lmgrd' fi ;; stop) if [ -f /usr/local/etc/lmdown_TMW ]; then /compat/linux/bin/sh /usr/local/etc/lmdown_TMW > /dev/null 2>&1 fi ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0 Machen Sie Datei ausführbar: &prompt.root; chmod +x /usr/local/etc/rc.d/flexlm.sh Ersetzen Sie im Skript username durch einen existierenden Benutzer Ihres Systems (bitte keinesfalls root). Starten Sie den Lizenzmanager: &prompt.root; /usr/local/etc/rc.d/flexlm.sh start Einrichten der &java;-Laufzeitumgebung Erstellen Sie einen symbolischen Link auf eine unter &os; laufende &java;-Laufzeitumgebung (JRE): &prompt.root; cd $MATLAB/sys/java/jre/glnx86/ &prompt.root; unlink jre; ln -s ./jre1.1.8 ./jre Ein &matlab;-Startskript erstellen Kopieren Sie das folgende Skript nach /usr/local/bin/matlab: #!/bin/sh /compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@" Machen Sie das Skript ausführbar: &prompt.root; chmod +x /usr/local/bin/matlab Abhängig von der Version des Ports emulators/linux_base kann das Skript auf Fehler laufen. Die Fehler können Sie vermeiden, indem Sie die Datei /compat/linux/usr/local/matlab/bin/matlab editieren. Ändern Sie die nachstehende Zeile if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then (mit Version 13.0.1 in der Zeile 410) in die folgende um: if test -L $newbase; then Stopp-Skript für &matlab; erstellen Das nachstehende Skript beendet &matlab; ordnungsgemäß. Erstellen Sie die Datei $MATLAB/toolbox/local/finish.m mit dem nachstehenden Inhalt: ! $MATLAB/bin/finish.sh Übernehmen Sie die Zeichenkette $MATLAB unverändert. Im selben Verzeichnis befinden sich die Dateien finishsav.m und finishdlg.m. Die Dateien sichern die Einstellungen der Arbeitsfläche bevor &matlab; beendet wird. Wenn Sie eine der beiden Dateien benutzen, fügen Sie die obige Zeile unmittelbar nach dem save-Kommando ein. Erstellen Sie die Datei $MATLAB/bin/finish.sh mit nachstehendem Inhalt: #!/usr/compat/linux/bin/sh (sleep 5; killall -1 matlab_helper) & exit 0 Machen Sie die Datei ausführbar: &prompt.root; chmod +x $MATLAB/bin/finish.sh &matlab; benutzen Jetzt können Sie &matlab; mit dem matlab starten. Marcel Moolenaar Beigetragen von &oracle; installieren Linux-Anwendungen Oracle Übersicht Dieses Dokument beschreibt die Installation von &oracle; 8.0.5 und &oracle; 8.0.5.1 Enterprise Edition für Linux auf einem FreeBSD-Rechner. Installation der Linux-Umgebung Stellen Sie sicher, dass Sie sowohl emulators/linux_base und devel/linux_devtools aus der Ports-Sammlung installiert haben. Wenn Sie mit diesen Ports Schwierigkeiten haben, müssen Sie vielleicht ältere Versionen der Linux-Umgebung aus der Ports-Sammlung installieren. Wenn Sie den Intelligent-Agent verwenden wollen, müssen Sie zusätzlich das RedHat Tcl-Paket installieren: tcl-8.0.3-20.i386.rpm. Zur Installation von RPM-Paketen wir der Port archivers/rpm benötigt. Ist der Port installiert, lassen sich RPM-Pakete anschließend mit dem nachstehenden Befehl installieren: &prompt.root; rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package Die Installation der RPM-Pakete sollte ohne Fehlermeldung ablaufen. Die &oracle;-Umgebung erzeugen Bevor Sie &oracle; installieren können, müssen Sie eine entsprechende Umgebung erzeugen. Dieses Dokument beschreibt nur, was Sie im Speziellen tun müssen, um die Linux-Version von &oracle; unter FreeBSD zu installieren, nicht aber, was bereits in der Installationsanleitung von &oracle; beschrieben wird. Kernel-Tuning Kernel Tuning Wie in der Installationsanleitung von &oracle; beschrieben, müssen Sie die maximale Shared-Memory Größe festlegen. Verwenden Sie SHMMAX nicht unter FreeBSD. SHMMAX wird lediglich aus SHMMAXPGS und PGSIZE berechnet. Definieren Sie stattdessen SHMMAXPGS. Alle anderen Optionen können wie in der Anleitung beschrieben verwendet werden. Zum Beispiel: options SHMMAXPGS=10000 options SHMMNI=100 options SHMSEG=10 options SEMMNS=200 options SEMMNI=70 options SEMMSL=61 Passen Sie diese Optionen entsprechend dem von Ihnen gewünschten Einsatzzweck von &oracle; an. Stellen Sie außerdem sicher, dass Sie folgende Optionen in Ihren Kernel kompilieren: options SYSVSHM #SysV shared memory options SYSVSEM #SysV semaphores options SYSVMSG #SysV interprocess communication &oracle;-Benutzer anlegen Legen Sie den Account oracle an. Der Account unterschiedet sich von normalen Accounts dadurch, dass er eine Linux-Shell zugeordnet bekommen muss. Fügen Sie /compat/linux/bin/bash in die Datei /etc/shells ein und setzen Sie die Shell für den oracle-Account auf /compat/linux/bin/bash. Umgebung Neben den normalen &oracle;-Variablen, wie z.B. ORACLE_HOME und ORACLE_SID müssen Sie die folgenden Variablen setzen: Variable Wert LD_LIBRARY_PATH $ORACLE_HOME/lib CLASSPATH $ORACLE_HOME/jdbc/lib/classes111.zip PATH /compat/linux/bin /compat/linux/sbin /compat/linux/usr/bin /compat/linux/usr/sbin /bin /sbin /usr/bin /usr/sbin /usr/local/bin $ORACLE_HOME/bin Es ist empfehlenswert, alle Variablen in der Datei .profile zu setzen. Ein komplettes Beispiel sieht folgendermaßen aus: ORACLE_BASE=/oracle; export ORACLE_BASE ORACLE_HOME=/oracle; export ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib export LD_LIBRARY_PATH ORACLE_SID=ORCL; export ORACLE_SID ORACLE_TERM=386x; export ORACLE_TERM CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip export CLASSPATH PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin export PATH &oracle; installieren Auf Grund einer kleinen Unregelmäßigkeit im Linux-Emulator müssen Sie das Verzeichnis .oracle unter /var/tmp erzeugen, bevor Sie das Installationsprogramm starten. Das Verzeichnis muss dem Account oracle gehören. Sie sollten &oracle; nun ohne Probleme installieren können. Treten dennoch Probleme auf, überprüfen Sie zuerst Ihre &oracle;-Distribution und Ihre Konfiguration. Nachdem Sie &oracle; erfolgreich installiert haben, installieren Sie die Patches wie in den zwei folgenden Abschnitten beschrieben: Ein häufiges Problem ist, dass der TCP Protokoll-Adapter nicht korrekt installiert wird. Daraus folgt, dass Sie keine TCP-Listener starten können. Dieses Problem kann durch folgende Schritte behoben werden: &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk ntcontab.o &prompt.root; cd $ORACLE_HOME/lib &prompt.root; ar r libnetwork.a ntcontab.o &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk install Vergessen Sie nicht, root.sh nochmals auszuführen! root.sh patchen Während der &oracle;-Installation werden einige Aktionen, die als root ausgeführt werden müssen, in ein Shell-Skript mit dem Namen root.sh gespeichert. Dieses Skript befindet sich im Verzeichnis orainst. Verwenden Sie folgenden Patch für root.sh, damit es das richtige chown Kommando verwendet, oder lassen Sie das Skript alternativ unter einer Linux-Shell ablaufen: *** orainst/root.sh.orig Tue Oct 6 21:57:33 1998 --- orainst/root.sh Mon Dec 28 15:58:53 1998 *************** *** 31,37 **** # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/bin/chown # # Define variables to be used in this script --- 31,37 ---- # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/usr/sbin/chown # # Define variables to be used in this script Wenn Sie &oracle; nicht von CD-ROM installieren, können Sie Quelldatei für root.sh verändern. Sie heißt rthd.sh und befindet sich im orainst-Verzeichnis des Quellcodebaums. genclntsh patchen Das Skript genclntsh wird verwendet, um eine Shared-Library für Clients zu erzeugen. Diese wird bei der Erzeugung der Demos verwendet. Verwenden Sie folgenden Patch, um die Definition von PATH auszukommentieren: *** bin/genclntsh.orig Wed Sep 30 07:37:19 1998 --- bin/genclntsh Tue Dec 22 15:36:49 1998 *************** *** 32,38 **** # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst --- 32,38 ---- # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst &oracle; starten Wenn Sie den Anweisungen gefolgt sind, sollten Sie nun in der Lage sein, &oracle; zu starten, genau so, wie Sie dies auch unter Linux tun würden. Holger Kipp Beigetragen von Valentino Vaschetto Originalversion nach SGML konvertiert durch: &sap.r3; installieren Linux-Anwendungen SAP R/3 Installationen von &sap; unter FreeBSD werden vom &sap; Support-Team nicht unterstützt – und &sap; bietet Support nur für zertifizierte Plattformen an! Übersicht Dieses Dokument beschreibt einen möglichen Weg, um ein &sap.r3;-System mit &oracle; Datenbank für Linux auf einem FreeBSD-Rechner zu installieren, einschließlich der Installation von FreeBSD und &oracle;. Zwei verschiedene Konfigurationen werden beschrieben: &sap.r3; 4.6B (IDES) mit &oracle; 8.0.5 unter FreeBSD 4.3-STABLE &sap.r3; 4.6C mit &oracle; 8.1.7 unter FreeBSD 4.5-STABLE Obwohl dieses Dokument versucht, alle wichtigen Schritte ausführlich zu beschreiben, besteht nicht die Absicht, die originalen Installationsanleitungen von &oracle; und &sap.r3; zu ersetzen. Benutzen Sie die mit &sap.r3; Linux Edition gelieferte Dokumentation für &sap;- und &oracle;-spezifische Fragen, sowie die Ressourcen von &oracle; und &sap;-OSS. Software/Programme Folgende CD-ROMs wurden für die Installation von &sap; verwendet: &sap.r3; 4.6B, &oracle; 8.0.5 Bezeichnung Nummer Beschreibung KERNEL 51009113 &sap; Kernel &oracle; / Installation / AIX, Linux, &solaris; RDBMS 51007558 &oracle; / RDBMS 8.0.5.X / Linux EXPORT1 51010208 IDES / DB-Export / Disc 1 of 6 EXPORT2 51010209 IDES / DB-Export / Disc 2 of 6 EXPORT3 51010210 IDES / DB-Export / Disc 3 of 6 EXPORT4 51010211 IDES / DB-Export / Disc 4 of 6 EXPORT5 51010212 IDES / DB-Export / Disc 5 of 6 EXPORT6 51010213 IDES / DB-Export / Disc 6 of 6 Zusätzlich wurde die &oracle; 8 Server CD-ROM (Pre-production Version 8.0.5 für Linux, Kernel Version 2.0.33) verwendet, die allerdings nicht unbedingt nötig ist und FreeBSD 4.3-STABLE (die Installation wurde kurz nach dem Erscheinen von 4.3-RELEASE durchgeführt). &sap.r3; 4.6C SR2, &oracle; 8.1.7 Bezeichnung Nummer Beschreibung KERNEL 51014004 &sap; Kernel &oracle; / &sap; Kernel Version 4.6D / DEC, Linux RDBMS 51012930 &oracle; 8.1.7/ RDBMS / Linux EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 1 of 4 EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 2 of 4 EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 3 of 4 EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 4 of 4 LANG1 51013954 Release 4.6C SR2 / Language / DE, EN, FR / Disc 1 of 3 Abhängig von den zu installierenden Sprachen kann es sein, dass zusätzliche Sprach-CDs nötig sind. Da hier nur Deutsch und Englisch verwendet wurden, ist die erste Sprachen-CD ausreichend. Nebenbei bemerkt sind die Nummern aller vier Export-CDs identisch. Das heißt alle drei Sprachen-CDs haben diesselbe Nummer (das unterscheidet sie von der Nummerierung der 4.6B IDES-Version). Zum Zeitpunkt der Erstellung dieses Dokuments lief das System unter FreeBSD 4.5-STABLE (20.03.2002). &sap;-Notes Die folgenden Anmerkungen sollten vor der Installation von &sap.r3; gelesen werden, da sie sich während der Installation als nützlich erwiesen haben. &sap.r3; 4.6B, &oracle; 8.0.5 Nummer Bezeichnung 0171356 &sap; Software on Linux: Essential Comments 0201147 INST: 4.6C R/3 Inst. on UNIX - &oracle; 0373203 Update / Migration &oracle; 8.0.5 --> 8.0.6/8.1.6 LINUX 0072984 Release of Digital UNIX 4.0B for &oracle; 0130581 R3SETUP step DIPGNTAB terminates 0144978 Your system has not been installed correctly 0162266 Questions and tips for R3SETUP on Windows NT/W2K &sap.r3; 4.6C, &oracle; 8.1.7 Nummer Bezeichnung 0015023 Initializing table TCPDB (RSXP0004) (EBCDIC) 0045619 R/3 with several languages or typefaces 0171356 &sap; Software on Linux: Essential Comments 0195603 RedHat 6.1 Enterprise version: Known problems 0212876 The new archiving tool SAPCAR 0300900 Linux: Released DELL Hardware 0377187 RedHat 6.2: important remarks 0387074 INST: R/3 4.6C SR2 Installation on UNIX 0387077 INST: R/3 4.6C SR2 Inst. on UNIX - &oracle; 0387078 &sap; Software on UNIX: OS Dependencies 4.6C SR2 Hardware-Anforderungen Die folgende Ausstattung reicht für die Installation eines &sap.r3; Systems aus. Für Produktionszwecke benötigt man natürlich eine exakte Bestimmung dieser Größen: Komponente 4.6B 4.6C Prozessor 2 x 800MHz &pentium; III 2 x 800MHz &pentium; III Hauptspeicher 1GB ECC 2GB ECC Festplattenplatz 50-60GB (IDES) 50-60GB (IDES) Für Produktionszwecke sind &xeon; Prozessoren mit großem Cache, Hochgeschwindigkeitsspeicher (SCSI, RAID Hardware Controller), USV (unterbrechungsfreie Stromversorgung) und ECC-RAM empfehlenswert. Der große Bedarf an Festplattenplatz ergibt sich durch das vorkonfigurierte IDES System, welches während der Installation 27 GB Datenbankdateien erzeugt. Dieser Speicher ist auch für neue Produktionssysteme und Anwendungsdaten ausreichend. &sap.r3; 4.6B, &oracle; 8.0.5 Folgende Standard-Hardware wurde verwendet: Ein Doppelprozessorboard mit zwei 800 MHz &pentium; III Prozessoren, Adaptec 29160 Ultra160 SCSI Adaptern (zum Anschluß eines 40/80 GB DLT Bandlaufwerks und eines CD-ROM-Laufwerks), &mylex; &acceleraid; (2 Kanäle, Firmware 6.00-1-00 mit 32 MB RAM). An den &mylex; RAID-Controller wurden 2 (gespiegelte) 17 GB Festplatten sowie vier 36 GB Festplatten (RAID level 5) angeschlossen. &sap.r3; 4.6C, &oracle; 8.1.7 Für diese Installation wurde ein DELL PowerEdge 2500 verwendet: Ein Doppelprozessorboard mit zwei 1000 MHz &pentium; III Prozessoren (256 kB Cache), 2 GB PC133 ECC SDRAM, PERC/3 DC PCI RAID-Controller mit 128 MB, und einem EIDE DVD-ROM Laufwerk. An den RAID-Controller sind zwei (gespiegelte) 18 GB Festplatten sowie vier 36 GB Festplatten (RAID level 5) angeschlossen. Installation von FreeBSD Als erstes müssen Sie FreeBSD installieren. Dazu gibt es mehrere Möglichkeiten, die in des Handbuchs beschrieben werden. Aufteilung der Festplatte Um das Ganze zu vereinfachen, wurde sowohl für die &sap.r3; 46B- als auch die &sap.r3; 46C SR2-Installation die gleiche Platteneinteilung verwendet. Nur die Gerätenamen änderten sich, da die Installationen auf verschiedenen Hardwareplattformen durchgeführt wurden (Insbesondere /dev/da sowie /dev/amr; wenn also jemand z.B. ein AMI &megaraid; verwendet, so wird er /dev/amr0s1a anstelle von /dev/da0s1a vorfinden.): Dateisystem Größe (1k-blocks) HDD-Größe (GB) Gemountet nach /dev/da0s1a 1.016.303 1 / /dev/da0s1b 6 Swap /dev/da0s1e 2.032.623 2 /var /dev/da0s1f 8.205.339 8 /usr /dev/da1s1e 45.734.361 45 /compat/linux/oracle /dev/da1s1f 2.032.623 2 /compat/linux/sapmnt /dev/da1s1g 2.032.623 2 /compat/linux/usr/sap Konfigurieren und initialisieren Sie die zwei logischen Platten mit der &mylex;- oder PERC/3 RAID Software, bevor Sie beginnen. Diese kann während der BIOS-Bootphase gestartet werden. Beachten Sie bitte, dass sich diese Platteneinteilung etwas von den &sap;-Empfehlungen unterscheidet, da &sap; vorschlägt, die &oracle;-Unterverzeichnisse (und einige andere) separat einzuhängen – es ist jedoch einfacher, diese als reale Unterverzeichnisse zu erzeugen. <command>make world</command> und ein neuer Kernel Laden Sie die neuesten STABLE-Quellen herunter. Aktualisieren Sie das System und erzeugen Sie einen neuen Kernel, nachdem Sie die Kernelkonfigurationsdatei angepasst haben. Zusätzlich sollten Sie die Kernel Parameter einfügen, die sowohl von &sap.r3; als auch von &oracle; benötigt werden. Installation der Linux-Umgebung Das Linux-Basissystem installieren Zuerst muss der Port linux_base als root installiert werden: &prompt.root; cd /usr/ports/emulators/linux_base-fc4 &prompt.root; make install distclean Die Linux-Entwicklungsumgebung installieren Die Linux-Entwicklungsumgebung wird benötigt, wenn Sie &oracle; auf Ihrem FreeBSD-System installieren wollen (siehe ): &prompt.root; cd /usr/ports/devel/linux_devtools &prompt.root; make install distclean Die Linux-Entwicklungsumgebung wurde hier jedoch nur für die &sap.r3; 46B IDES-Installation verwendet. Sie wird nicht benötigt, wenn die &oracle;-Datenbank auf dem FreeBSD System nicht neu gebunden wird. Dies ist dann der Fall, wenn Sie den &oracle; Tarball eines Linux-Systems verwenden. Notwendige RPMs installieren RPMs Um das R3SETUP-Programm zu starten, wird PAM-Unterstützung benötigt. Während der ersten Installation von &sap; unter FreeBSD 4.3-STABLE wurde versucht, zuerst alle von PAM benötigten Pakete zu installieren. Anschließend wurde die Installation von PAM erzwungen, was auch ohne Probleme funktionierte. Für die folgende Installation von &sap.r3; 4.6C SR2 wurde die Installation von PAM ohne die abhängigen Pakete direkt erzwungen und es funktionierte ebenfalls. Es sieht so aus, als würden die abhängigen Pakete nicht benötigt. &prompt.root; rpm -i --ignoreos --nodeps --root /compat/linux --dbpath /var/lib/rpm \ pam-0.68-7.i386.rpm Um den Intelligent-Agent von &oracle; 8.0.5 auszuführen, musste das RedHat Tcl-Paket tcl-8.0.5-30.i386.rpm installiert werden, da sonst das Binden (link) während der &oracle;-Installation nicht funktionierte. Es gibt noch weitere Punkte beim Binden von &oracle;, die aber die Kombination &oracle;-Linux betreffen und nicht FreeBSD spezifisch sind. Zusätzliche Hinweise Eine gute Idee ist es, linprocfs in /etc/fstab einzufügen; weitere Informationen dazu erhalten Sie in der Hilfeseite &man.linprocfs.5;. Weiterhin sollten Sie in der Datei /etc/sysctl.conf die Zeile kern.fallback_elf_brand=3 einfügen. Die &sap.r3;-Umgebung erzeugen Die nötigen Dateisysteme erzeugen Für eine einfache Installation reicht es aus, folgende Dateisysteme zu erzeugen: Dateisysteme Größe in GB /compat/linux/oracle 45 GB /compat/linux/sapmnt 2 GB /compat/linux/usr/sap 2 GB Außerdem müssen einige Links angelegt werden. Ansonsten beschwert sich der &sap;-Installer, wenn er die erzeugten Links überprüft: &prompt.root; ln -s /compat/linux/oracle /oracle &prompt.root; ln -s /compat/linux/sapmnt /sapmnt &prompt.root; ln -s /compat/linux/usr/sap /usr/sap Eine Fehlermeldung während der Installation (hier unter dem PRD-System und &sap.r3; 4.6C SR2 könnte beispielsweise so aussehen: INFO 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:200 Checking existence of symbolic link /usr/sap/PRD/SYS/exe/dbg to /sapmnt/PRD/exe. Creating if it does not exist... WARNING 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:400 Link /usr/sap/PRD/SYS/exe/dbg exists but it points to file /compat/linux/sapmnt/PRD/exe instead of /sapmnt/PRD/exe. The program cannot go on as long as this link exists at this location. Move the link to another location. ERROR 2002-03-19 16:45:36 R3LINKS_IND_IND Ins_SetupLinks:0 can not setup link '/usr/sap/PRD/SYS/exe/dbg' with content '/sapmnt/PRD/exe' Benutzer und Verzeichnisse anlegen &sap.r3; benötigt zwei Benutzer und drei Benutzergruppen. Die Benutzernamen hängen von der (aus drei Buchstaben bestehenden) SAP-System-ID (SID) ab. Einige dieser SIDs sind von &sap; reserviert (z.B. SAP und NIX. Für eine komplette Übersicht schlagen Sie bitte in der &sap;-Dokumentation nach. Für die IDES-Installation wurde IDS verwendet, für die 4.6C-SR2-Installation PRD, da das System für Produktionszwecke eingesetzt werden sollte. Daraus ergaben sich folgende Gruppen (die Gruppen-IDs können variieren, es handelt sich nur um Werte, die für diese spezielle Installation verwendet wurden): Gruppen-ID Gruppen-Name Beschreibung 100 dba Datenbank-Administrator 101 sapsys SAP System 102 oper Datenbank-Operator Bei einer Standard-&oracle;-Installation wird nur die Gruppe dba verwendet. Für die Gruppe oper wird ebenfalls die Gruppe dba verwendet (weitere Informationen finden sich in der &oracle;- und &sap;-Dokumentation). Zusätzlich werden auch folgende Benutzer benötigt: Benutzer-ID Benutzername Generischer Name Gruppe Zusätzliche Gruppen Beschreibung 1000 idsadm/prdadm sidadm sapsys oper SAP Administrator 1002 oraids/oraprd orasid dba oper &oracle; Administrator Für das Anlegen des &sap;-Administrators mittels &man.adduser.8; werden folgende Einträge (beachten Sie bitte die Shell und das Heimatverzeichnis) benötigt: Name: sidadm Password: ****** Fullname: SAP Administrator SID Uid: 1000 Gid: 101 (sapsys) Class: Groups: sapsys dba HOME: /home/sidadm Shell: bash (/compat/linux/bin/bash) und für den Datenbank-Administrator: Name: orasid Password: ****** Fullname: Oracle Administrator SID Uid: 1002 Gid: 100 (dba) Class: Groups: dba HOME: /oracle/sid Shell: bash (/compat/linux/bin/bash) Wenn Sie beide Gruppen (dba und oper) verwenden, sollte auch die Gruppe oper hinzugefügt werden. Verzeichnisse erzeugen Diese Verzeichnisse werden gewöhnlich als eigene Dateisysteme erzeugt und gemountet. Letztlich liegt dies aber an Ihren Anforderungen an das System. Hier wurden sie als einfache Verzeichnisse angelegt, die sich alle im gleichen RAID5 befinden: Zuerst werden die Eigentümer und Rechte für einige Verzeichnisse (als Benutzer root) gesetzt: &prompt.root; chmod 775 /oracle &prompt.root; chmod 777 /sapmnt &prompt.root; chown root:dba /oracle &prompt.root; chown sidadm:sapsys /compat/linux/usr/sap &prompt.root; chmod 775 /compat/linux/usr/sap Danach werden (als Benutzer orasid) einige Verzeichnisse erzeugt, die alle Unterverzeichnisse von /oracle/SID sind: &prompt.root; su - orasid &prompt.root; cd /oracle/SID &prompt.root; mkdir mirrlogA mirrlogB origlogA origlogB &prompt.root; mkdir sapdata1 sapdata2 sapdata3 sapdata4 sapdata5 sapdata6 &prompt.root; mkdir saparch sapreorg &prompt.root; exit Für die &oracle; 8.1.7-Installation werden ebenfalls zusätzliche Verzeichnisse benötigt: &prompt.root; su - orasid &prompt.root; cd /oracle &prompt.root; mkdir 805_32 &prompt.root; mkdir client stage &prompt.root; mkdir client/80x_32 &prompt.root; mkdir stage/817_32 &prompt.root; cd /oracle/SID &prompt.root; mkdir 817_32 Das Verzeichnis client/80x_32 muss genau so genannt werden. Versuchen Sie nicht, das x durch eine Zahl oder einen Buchstaben zu ersetzen. Im dritten Schritt werden wiederum Verzeichnisse (als Benutzer sidadm) erzeugt: &prompt.root; su - sidadm &prompt.root; cd /usr/sap &prompt.root; mkdir SID &prompt.root; mkdir trans &prompt.root; exit Einträge in <filename>/etc/services</filename> &sap.r3; benötigt einige Einträge in /etc/services, die während der Installation unter FreeBSD nicht richtig gesetzt werden. Sie benötigen mindestens die zur Instanzennummer, in diesem Fall 00, passenden Einträge. Es ist auch möglich, direkt alle Einträge für dp, gw, sp und ms von 00 bis 99 einzufügen. Wenn Sie einen SAP-Router verwenden, oder den Zugang zu &sap;-OSS benötigen, müssen Sie auch 99 einfügen, da der Port 3299 normalerweise für den SAP-Router-Prozess auf dem Zielsystem benötigt wird: sapdp00 3200/tcp # SAP Dispatcher. 3200 + Instance-Number sapgw00 3300/tcp # SAP Gateway. 3300 + Instance-Number sapsp00 3400/tcp # 3400 + Instance-Number sapms00 3500/tcp # 3500 + Instance-Number sapmsSID 3600/tcp # SAP Message Server. 3600 + Instance-Number sapgw00s 4800/tcp # SAP Secure Gateway 4800 + Instance-Number Notwendige Lokalisierungen Locale &sap; benötigt mindestens zwei Lokalisierungen, die nicht Teil der RedHat-Standardinstallation sind. &sap; bietet diese als RPMs auf ihrem FTP-Server als Downloads an (diese sind aber nur dann zugänglich, wenn Sie ein Kunde mit OSS-Zugang sind). Für eine Übersicht der notwendigen RPMs lesen Sie bitte den &sap;-Hinweis 0171356. Es ist auch möglich, nur die passenden Links (z.B. von de_DE und en_US) zu erzeugen, diese Vorgehensweise wird aber nicht nicht empfohlen (obwohl es bisher beim IDES-System ohne Probleme funktioniert hat). Folgende Lokalisationen werden benötigt: de_DE.ISO-8859-1 en_US.ISO-8859-1 Erzeugen Sie die Links wie folgt: &prompt.root; cd /compat/linux/usr/share/locale &prompt.root; ln -s de_DE de_DE.ISO-8859-1 &prompt.root; ln -s en_US en_US.ISO-8859-1 Sind diese nicht vorhanden, wird es während der Installation zu einigen Problemen kommen. Wenn diese konsequent ignoriert werden (indem der fehlgeschlagene Schritt in CENTRDB.R3S auf OK gesetzt wird), ist es ohne größeren Aufwand nicht mehr möglich, sich am &sap;-System anzumelden. Kernel-Tuning Kernel Tuning &sap.r3;-Systeme verbrauchen sehr viele Ressourcen. Deshalb wurden folgende Parameter in die Kernelkonfigurationsdatei eingefügt: # Set these for memory pigs (SAP and Oracle): options MAXDSIZ="(1024*1024*1024)" options DFLDSIZ="(1024*1024*1024)" # System V options needed. options SYSVSHM #SYSV-style shared memory options SHMMAXPGS=262144 #max amount of shared mem. pages #options SHMMAXPGS=393216 #use this for the 46C inst.parameters options SHMMNI=256 #max number of shared memory ident if. options SHMSEG=100 #max shared mem.segs per process options SYSVMSG #SYSV-style message queues options MSGSEG=32767 #max num. of mes.segments in system options MSGSSZ=32 #size of msg-seg. MUST be power of 2 options MSGMNB=65535 #max char. per message queue options MSGTQL=2046 #max amount of msgs in system options SYSVSEM #SYSV-style semaphores options SEMMNU=256 #number of semaphore UNDO structures options SEMMNS=1024 #number of semaphores in system options SEMMNI=520 #number of semaphore indentifiers options SEMUME=100 #number of UNDO keys Die minimalen Werte sind in der von &sap; kommenden Dokumentation festgelegt. Da es keine Beschreibung für Linux (und daher auch nicht für FreeBSD) gibt, entnehmen Sie weitere Informationen dem HP-UX-Abschnitt (32-Bit). Da das System für die 4.6C SR2-Installation über mehr Hauptspeicher verfügte, können die Shared-Segments für &sap; und &oracle; größer sein. Wählen Sie daher eine größere Anzahl von Shared-Memory-Pages. Bei einer &os;-Standardinstallation auf &i386;-Systemen belassen Sie MAXDSIZ und DFLDSIZ auf dem Maximum von 1 GB. Ansonsten könnten seltsame Fehlermeldungen, wie ORA-27102: out of memory oder Linux Error: 12: Cannot allocate memory auftreten. &sap.r3; installieren Die &sap; CD-ROMs vorbereiten Für eine Installation werden viele CD-ROMs benötigt, die gemountet und ungemountet werden müssen. Wenn Sie genügend CD-ROM-Laufwerke haben, können Sie alle gleichzeitig gemountet werden. Ansonsten kopiert man die CD-ROM-Inhalte einfach in die entsprechenden Verzeichnisse, /oracle/SID/sapreorg/cd-name wobei cd-name KERNEL, RDBMS, EXPORT1, EXPORT2, EXPORT3, EXPORT4, EXPORT5 und EXPORT6 bei einer 4.6B/IDES-Installation und KERNEL, RDBMS, DISK1, DISK2, DISK3, DISK4 und LANG bei einer 4.6C SR2-Installation entspricht. Die Dateinamen auf den gemounteten CDs sollten aus Großbuchstaben bestehen. Ist dies nicht der Fall, verwenden Sie zum Mounten die Option . Für das Kopieren der CD-Inhalte verwenden Sie folgenden Befehle: &prompt.root; mount_cd9660 -g /dev/cd0a /mnt &prompt.root; cp -R /mnt/* /oracle/SID/sapreorg/cd-name &prompt.root; umount /mnt Das Installations-Skript ausführen Als erstes müssen Sie ein Installationsverzeichnis anlegen: &prompt.root; cd /oracle/SID/sapreorg &prompt.root; mkdir install &prompt.root; cd install Anschließend wird das Installations-Skript gestartet, das nahezu alle relevanten Daten in das Installationsverzeichnis kopiert: &prompt.root; /oracle/SID/sapreorg/KERNEL/UNIX/INSTTOOL.SH Die IDES-Installation (4.6B) wird mit einem vollständig angepassten &sap.r3; Demo-System geliefert, das heißt es gibt sechs statt drei Export-CDs. Da CENTRDB.R3S für eine Standard-Zentralinstanz (&r3; plus Datenbank) ausgelegt ist, aber nicht für eine IDES-Zentralinstanz, muss die passende CENTRDB.R3S-Datei manuell aus dem Verzeichnis EXPORT1 in das Installationsverzeichnis kopiert werden, da R3SETUP ansonsten nur nach drei EXPORT-CDs verlangt. Die aktuellere Version &sap; 4.6C SR2 wird mit vier EXPORT-CDs geliefert. Die die Installation überwachende Parameter-Datei heißt hier CENTRAL.R3S. Im Gegensatz zu früheren Versionen gibt es nun keine separaten Vorlagen für die Installation von Zentralinstanzen mit und ohne Datenbank mehr. &sap; verwendet eine eigene Vorlage für die Datenbankinstallation. Um die Installation später erneut starten, ist es jedoch ausreichend, die Installation mit der ursprünglichen Datei zu starten. Während und nach der Installation benötigt &sap; hostname, um den Rechnernamen, aber nicht den vollständigen Domain-Namen zu erhalten. Setzen Sie also entweder den Rechnernamen entsprechend, oder setzen Sie einen Alias mit alias hostname='hostname -s' für die Benutzer orasid und sidadm (Und zusätzlich für root. Dies zumindest für die Installationsschritte, die als root ausgeführt werden müssen.). Außerdem ist es möglich, nur die während der &sap;-Installation erstellten Dateien .profile und .login beider Benutzer anzupassen. <command>R3SETUP</command> 4.6B starten Stellen Sie sicher, dass LD_LIBRARY_PATH korrekt gesetzt wurde: &prompt.root; export LD_LIBRARY_PATH=/oracle/IDS/lib:/sapmnt/IDS/exe:/oracle/805_32/lib Gehen Sie in das Installationsverzeichnis und starten Sie R3SETUP als root: &prompt.root; cd /oracle/IDS/sapreorg/install &prompt.root; ./R3SETUP -f CENTRDB.R3S Das Skript stellt anschließend einige Fragen (Vorgaben stehen dabei in Klammern, gefolgt von den aktuellen Eingaben): Frage Vorgabe Eingabe Enter SAP System ID [C11] IDSEnter Enter SAP Instance Number [00] Enter Enter SAPMOUNT Directory [/sapmnt] Enter Enter name of SAP central host [troubadix.domain.de] Enter Enter name of SAP db host [troubadix] Enter Select character set [1] (WE8DEC) Enter Enter Oracle server version (1) Oracle 8.0.5, (2) Oracle 8.0.6, (3) Oracle 8.1.5, (4) Oracle 8.1.6 1Enter Extract Oracle Client archive [1] (Yes, extract) Enter Enter path to KERNEL CD [/sapcd] /oracle/IDS/sapreorg/KERNEL Enter path to RDBMS CD [/sapcd] /oracle/IDS/sapreorg/RDBMS Enter path to EXPORT1 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT1 Directory to copy EXPORT1 CD [/oracle/IDS/sapreorg/CD4_DIR] Enter Enter path to EXPORT2 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT2 Directory to copy EXPORT2 CD [/oracle/IDS/sapreorg/CD5_DIR] Enter Enter path to EXPORT3 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT3 Directory to copy EXPORT3 CD [/oracle/IDS/sapreorg/CD6_DIR] Enter Enter path to EXPORT4 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT4 Directory to copy EXPORT4 CD [/oracle/IDS/sapreorg/CD7_DIR] Enter Enter path to EXPORT5 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT5 Directory to copy EXPORT5 CD [/oracle/IDS/sapreorg/CD8_DIR] Enter Enter path to EXPORT6 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT6 Directory to copy EXPORT6 CD [/oracle/IDS/sapreorg/CD9_DIR] Enter Enter amount of RAM for SAP + DB 850Enter (in Megabytes) Service Entry Message Server [3600] Enter Enter Group-ID of sapsys [101] Enter Enter Group-ID of oper [102] Enter Enter Group-ID of dba [100] Enter Enter User-ID of sidadm [1000] Enter Enter User-ID of orasid [1002] Enter Number of parallel procs [2] Enter Wenn Sie die CD-Inhalte nicht in verschiedene Verzeichnisse kopiert haben, findet das &sap;-Installationsprogramm die benötigten CDs nicht (diese sind durch die Datei LABEL.ASC gekennzeichnet) und würde von Ihnen verlangen, entweder die CD einzulegen und zu mounten oder den entsprechenden mount-Pfad einzugeben. CENTRDB.R3S ist möglicherweise nicht fehlerfrei. Im vorliegenden Fall wurde die CD EXPORT4 zwar erneut verlangt, dennoch wurde der richtige Schlüssel (6_LOCATION, danach 7_LOCATION) vorgeschlagen. Daher ist es problemlos möglich, durch Eingabe der korrekten Werte fortzufahren. Abgesehen von einigen kleineren (unten angeführten) Problemen, sollte nun bis zur Installation der &oracle;-Datenbank alles ohne Probleme ablaufen. <command>R3SETUP</command> 4.6C SR2 starten Stellen Sie sicher, dass LD_LIBRARY_PATH korrekt gesetzt ist. Dieser Wert unterscheidet sich von dem der 4.6B-&oracle; 8.0.5-Installation: &prompt.root; export LD_LIBRARY_PATH=/sapmnt/PRD/exe:/oracle/PRD/817_32/lib Gehen Sie in das Installationsverzeichnis und führen Sie R3SETUP als root aus: &prompt.root; cd /oracle/PRD/sapreorg/install &prompt.root; ./R3SETUP -f CENTRAL.R3S Das Skript stellt anschließend einige Fragen (Vorgaben in Klammern, gefolgt von den aktuellen Eingaben): Frage Vorgabe Eingabe Enter SAP System ID [C11] PRDEnter Enter SAP Instance Number [00] Enter Enter SAPMOUNT Directory [/sapmnt] Enter Enter name of SAP central host [majestix] Enter Enter Database System ID [PRD] PRDEnter Enter name of SAP db host [majestix] Enter Select character set [1] (WE8DEC) Enter Enter Oracle server version (2) Oracle 8.1.7 2Enter Extract Oracle Client archive [1] (Yes, extract) Enter Enter path to KERNEL CD [/sapcd] /oracle/PRD/sapreorg/KERNEL Enter amount of RAM for SAP + DB 2044 1800Enter (in Megabytes) Service Entry Message Server [3600] Enter Enter Group-ID of sapsys [100] Enter Enter Group-ID of oper [101] Enter Enter Group-ID of dba [102] Enter Enter User-ID of oraprd [1002] Enter Enter User-ID of prdadm [1000] Enter LDAP support 3Enter (no support) Installation step completed [1] (continue) Enter Choose installation service [1] (DB inst,file) Enter Bisher verursacht das Anlegen von Benutzern eine Fehlermeldung während der Installation, und zwar in den Stadien OSUSERDBSID_IND_ORA (beim Anlegen des Benutzers orasid), sowie in OSUSERSIDADM_IND_ORA (beim Anlegen des Benutzers sidadm). Abgesehen von einigen kleineren (unten angeführten) Problemen, sollte nun bis zur Installation der &oracle;-Datenbank alles ohne Probleme ablaufen. &oracle; 8.0.5 installieren Lesen Sie bitte die entsprechenden &sap;-Hinweise und &oracle;-Readmes für Probleme, die Linux und die &oracle;-Datenbank betreffen. Die meisten (wenn nicht alle) Probleme werden durch inkompatible Bibliotheken verursacht. Weiteres zur &oracle;-Installation finden Sie im Kapitel Installation von &oracle;. &oracle; 8.0.5 mit <command>orainst</command> installieren Wenn &oracle; 8.0.5 verwendet wird, werden einige zusätzliche Bibliotheken benötigt, da &oracle; 8.0.5 mit einer alten Version von glibc verlinkt wurde, RedHat 6.1 aber bereits eine aktuellere Version verwendet. Daher müssen Sie folgende zusätzliche Pakte installieren, um sicherzustellen, dass die Verlinkung ordnungsgemäß erfolgt: compat-libs-5.2-2.i386.rpm compat-glibc-5.2-2.0.7.2.i386.rpm compat-egcs-5.2-1.0.3a.1.i386.rpm compat-egcs-c++-5.2-1.0.3a.1.i386.rpm compat-binutils-5.2-2.9.1.0.23.1.i386.rpm Lesen Sie bitte die entsprechenden &sap;-Hinweise und die &oracle;-Readmes. Ist dies nicht möglich (z.B. aus Zeitmangel, oder bei Nichtvorhandensein dieser Unterlagen), besteht auch die Möglichkeit, die originalen Binärdateien oder die verlinkten Binärdateien eines RedHat-Systems zu verwenden. Um den Intelligent-Agent zu kompilieren, muss das RedHat Tcl-Paket installiert sein. Wenn Sie tcl-8.0.3-20.i386.rpm nicht bekommen können, sollte es auch problemlos möglich sein, eine neuere Version, z.B. tcl-8.0.5-30.i386.rpm für RedHat 6.1, zu verwenden. Vom Binden abgesehen, läuft die Installation wie folgt ab: &prompt.root; su - oraids &prompt.root; export TERM=xterm &prompt.root; export ORACLE_TERM=xterm &prompt.root; export ORACLE_HOME=/oracle/IDS &prompt.root; cd $ORACLE_HOME/orainst_sap &prompt.root; ./orainst Bestätigen Sie alle Meldungen mit Enter, bis die Software installiert ist. Einzige Ausnahme ist die Frage nach der Installation des &oracle; On-Line Text Viewers. Dieser ist unter Linux (noch) nicht verfügbar. Daher muss diese Option deaktiviert werden. Anschließend will sich &oracle; unter Verwendung von i386-glibc20-linux-gcc anstelle der verfügbaren gcc, egcs oder i386-redhat-linux-gcc verlinken. Auf Grund zeitlicher Einschränkungen wurden für die Installation die Binärdateien der &oracle; 8.0.5 PreProduction-Version verwendet, nachdem sich der erste Versuch, die Version von der RDBMS-CD zum Laufen zu bringen, sowie die richtigen RPMs zu finden und zu installieren, zum Alptraum entwickelt hatte. &oracle; 8.0.5 Pre-Production für Linux (Kernel 2.0.33) installieren Diese Installation ist relativ einfach. Mounten Sie die CD und starten Sie den Installer. Danach wählen Sie das &oracle;-Heimatverzeichnis und kopieren Sie die Binärdateien dorthin. Die Überreste der vorherigen RDBMS-Installationsversuche werden dabei nicht entfernt. Danach konnte die &oracle;-Datenbank ohne Probleme gestartet werden. Das &oracle; 8.1.7-Linux-Archiv entpacken Nehmen Sie das aus dem Installationsverzeichnis eines Linux-Systems erstellte Archiv oracle81732.tgz und entpacken Sie es nach /oracle/SID/817_32/. Mit der &sap.r3;-Installation fortfahren Überprüfen Sie als Erstes die Umgebungseinstellungen der Benutzer idsamd(sidadm) und oraids (orasid). Beide sollten nun die Dateien .profile, .login und .cshrc enthalten, die alle hostname benutzen. Falls der Rechnername Ihres Systems der vollständige Rechnername ist, müssen Sie in allen drei Dateien hostname in hostname -s ändern. Datenbanken laden Danach kann R3SETUP entweder erneut gestartet oder fortgesetzt werden (je nachdem, ob Sie das Programm zuvor beendet hatten oder nicht). R3SETUP erzeugt nun die Tablespaces und lädt die Daten (für 46B IDES von EXPORT1 bis EXPORT6, für 46C von DISK1 bis DISK4) mittels R3load in die Datenbank. Wenn das Laden der Datenbank abgeschlossen ist (dieser Vorgang kann einige Stunden dauern!), werden einige Passwörter angefordert. Für Testinstallationen können auch Standard-Passwörter verwendet werden. Liegt Ihnen allerdings etwas an der Sicherheit Ihres Systems, so verwenden Sie andere Passwörter. Frage Eingabe Enter Password for sapr3 sapEnter Confirum Password for sapr3 sapEnter Enter Password for sys change_on_installEnter Confirm Password for sys change_on_installEnter Enter Password for system managerEnter Confirm Password for system managerEnter An diesem Punkt gab es während der 4.6B-Installation einige Probleme mit dipgntab. Listener Starten Sie den &oracle;-Listener als Benutzer orasid wie folgt: &prompt.user; umask 0; lsnrctl start Ansonsten könnten Sie die Meldung ORA-12546 erhalten, da die Sockets nicht über die korrekten Berechtigungen verfügen werden. Lesen Sie dazu auch den &sap;-Hinweis 072984. MNLS-Tabellen aktualisieren Wenn Sie Nicht-Latin-1-Sprachen in das &sap;-System einbauen wollen, müssen Sie die MNLS (Multi National Language Support)-Tabellen aktualisieren. Dies wird in den SAP-OSS-Hinweisen 15023 und 45619 beschrieben. Ansonsten können Sie diese Frage während der &sap;-Installation überspringen. Wenn Sie MNLS nicht benötigen, ist es trotzdem nötig, die Tabelle TCPDB zu überprüfen und zu initialisieren, falls dies nicht bereits geschehen ist. Lesen Sie die &sap;-Hinweise 0015023 und 0045619, falls Sie weitere Informationen benötigen. Abschließende Aufgaben &sap.r3;-Lizenzschlüssel anfordern Sie müssen Ihren &sap.r3;-Lizenzschlüssel anfordern, da die zur Installation verwendete Lizenz nur für vier Wochen gültig ist. Dazu ermitteln Sie zuerst Ihren Hardwareschlüssel. Melden Sie sich als idsadm an und rufen Sie saplicense auf: &prompt.root; /sapmnt/IDS/exe/saplicense -get Wird saplicense ohne Optionen aufgerufen, so erhalten Sie eine Übersicht der möglichen Optionen. Nach Erhalt des Lizenzschlüssels kann dieser installiert werden: &prompt.root; /sapmnt/IDS/exe/saplicense -install Nun müssen Sie folgende Daten eingeben: SAP SYSTEM ID = SID, 3 Zeichen CUSTOMER KEY = Hardware-Schlüssel, 11 Zeichen INSTALLATION NO = Installation, 10 Ziffern EXPIRATION DATE = JJJJMMTT, normalerweise "99991231" LICENSE KEY = Lizenzschlüssel, 24 Zeichen Benutzer anlegen Erzeugen Sie einen Benutzer innerhalb von client 000 (für einige Aufgaben muss dies innerhalb von client 000 erfolgen, aber nicht als Benutzer sap* und ddic). Als Benutzername empfiehlt sich beispielsweise wartung (oder auf Englisch service). Benötigte Profile sind sap_new und sap_all. Aus Sicherheitsgründen sollten die Passwörter der Standardbenutzer in allen Clients geändert werden (dies gilt auch für die Benutzer sap* und ddic). Transportsystem, Profile, Betriebsarten usw. konfigurieren Innerhalb von client 000 führen andere Benutzer als ddic und sap* normalerweise folgende Aufgaben durch: Aufgabe Transaktion Konfiguration des Transportsystems, beispielsweise als Stand-Alone Transport Domain Entity STMS Erstellen und Editieren von Profilen RZ10 Pflege von Betriebsarten und Instanzen RZ04 Diese sowie alle anderen Post-Installationsschritte sind ausführlich in den &sap;-Installationsanleitungen beschrieben. <filename>init<replaceable>sid</replaceable>.sap</filename> (<filename>initIDS.sap</filename>) anpassen Die Datei /oracle/IDS/dbs/initIDS.sap enthält das &sap;-Sicherungsprofil. Hier sind die Größe des verwendeten Band(laufwerks), die Kompressionsart und so weiter festgelegt. Um dieses Profil mit sapdba oder brbackup auszuführen, wurden folgende Werte geändert: compress = hardware archive_function = copy_delete_save cpio_flags = "-ov --format=newc --block-size=128 --quiet" cpio_in_flags = "-iuv --block-size=128 --quiet" tape_size = 38000M tape_address = /dev/nsa0 tape_address_rew = /dev/sa0 Erklärungen: compress: Das verwendete Bandlaufwerk war ein HP DLT1. Dieses unterstützt Hardware-Kompression. archive_function: Hier wird das Standardverhalten beim Sichern von &oracle;-Archivprotokollen festgelegt. Neue Protokolldateien werden auf Band gespeichert, bereits gespeicherte erneut gespeichert und anschließend gelöscht. Dies verhindert eine Vielzahl von Problemen, falls Sie Ihre Datenbank wiederherstellen müssen und dabei feststellen, dass eins Ihrer Archivbänder defekt ist. cpio_flags: Standardmäßig wird verwendet. Dies setzt die Blockgröße auf 5120 Bytes. Für DLT-Bänder werden von HP mindestens 32 K Blockgröße empfohlen, daher wurde hier verwendet, um 64 KB-blöcke zu erzeugen. wurde benötigt, da das Installationssystem über mehr als 65535 Inodes verfügt. Die letzte Option ist notwendig, weil brbackup sich sonst beschwert, wenn die cpio die Anzahl der gespeicherten Blöcke ausgibt. cpio_in_flags: Flags, die zum Laden der Daten vom Band benötigt werden. Das Format wird dabei automatisch erkannt. tape_size: Damit wird die maximale Speicherkapazität des Bandes angegeben. Aus Sicherheitsgründen (das Bandlaufwerk unterstützt Hardware-Kompression) ist dieser Wert geringfügig kleiner als der aktuelle Wert. tape_address: Nicht zurückspulendes Gerät für cpio. tape_address_rew: Zurückspulendes Gerät für cpio. Konfiguration nach Installationsende Die folgenden &sap;-Parameter sollten nach der Installation optimiert werden (die Beispiele gelten für IDES 46B, 1 GB Hauptspeicher): Name Wert ztta/roll_extension 250000000 abap/heap_area_dia 300000000 abap/heap_area_nondia 400000000 em/initial_size_MB 256 em/blocksize_kB 1024 ipc/shm_psize_40 70000000 &sap;-Hinweis 0013026: Name Wert ztta/dynpro_area 2500000 &sap;-Hinweis 0157246: Name Wert rdisp/ROLL_MAXFS 16000 rdisp/PG_MAXFS 30000 Mit obigen Parametern und einem System mit 1 Gigabyte Hauptspeicher, könnte der Speicherverbrauch in etwa so aussehen: Mem: 547M Active, 305M Inactive, 109M Wired, 40M Cache, 112M Buf, 3492K Free Während der Installation auftretende Probleme Neustarten von <command>R3SETUP</command> nach Behebung eines Problems R3SETUP bricht ab, wenn ein Fehler auftritt. Wenn Sie (nach Durchsicht der jeweiligen Protokolldateien) den Fehler behoben haben, müssen Sie R3SETUP erneut aufrufen, indem Sie für den fehlerhaften Schritt als Option REPEAT eingeben. Um R3SETUP erneut zu starten, rufen Sie die Datei einfach mit der entsprechenden R3S-Datei auf: &prompt.root; ./R3SETUP -f CENTRDB.R3S für 4.6B, oder mit &prompt.root; ./R3SETUP -f CENTRAL.R3S für 4.6C, unabhängig davon, ob der Fehler mit CENTRAL.R3S oder mit DATABASE.R3S auftrat. Zu bestimmten Zeitpunkten nimmt R3SETUP an, dass sowohl der Datenbank- als auch die &sap;-Prozesse vorhanden sind und laufen (da dies Schritte sind, die es bereits ausgeführt hat). Sollten Fehler auftreten (z.B. wenn sich die Datenbank nicht starten lässt), müssen Sie sowohl die Datenbank als auch &sap; manuell neu starten, nachdem Sie die Fehler behoben haben. Erst danach darf R3SETUP erneut gestartet werden. Achten Sie auch darauf, den &oracle;-Listener erneut zu starten (als Benutzer orasid mittels umask 0; lsnrctl start), wenn dieser beendet wurde (z.B. durch einen notwendigen Neustart des Systems). Fehler im Stadium OSUSERSIDADM_IND_ORA bei der Ausführung von <command>R3SETUP</command> Wenn sich R3SETUP in diesem Stadium beschwert, editieren Sie die bei der Installation verwendete Version der Vorlage (CENTRDB.R3S (4.6B) oder entweder CENTRAL.R3S oder DATABASE.R3S (4.6C)). Finden Sie [OSUSERSIDADM_IND_ORA] oder suchen Sie nach dem einzigen STATUS=ERROR-Eintrag und ändern Sie die folgenden Werte: HOME=/home/sidadm (war voher leer) STATUS=OK (hatte den Status ERROR) Danach können Sie R3SETUP erneut aufrufen. Fehler im Stadium OSUSERDBSID_IND_ORA bei der Ausführung von <command>R3SETUP</command> Wahrscheinlich beschwert sich R3SETUP auch in diesem Stadium. Der hier auftretende Fehler ähnelt dem im Abschnitt OSUSERSIDADM_IND_ORA. Editieren Sie einfach die bei der Installation verwendete Version der Vorlage (das heißt CENTRDB.R3S (4.6B) oder entweder CENTRAL.R3S oder DATABASE.R3S (4.6C)). Finden Sie [OSUSERDBSID_IND_ORA] oder suchen Sie nach dem einzigen STATUS=ERROR-Eintrag und ändern Sie folgenden Eintrag: STATUS=OK Danach können Sie R3SETUP erneut aufrufen. Fehler <errorname>oraview.vrf FILE NOT FOUND</errorname> bei der &oracle;-Installation Sie haben die Option &oracle; On-Line Text Viewer nicht deaktiviert, bevor Sie die Installation gestartet haben. Per Voreinstellung ist diese Option aktiviert, obwohl sie unter Linux gar nicht verfügbar ist. Deaktivieren Sie daher diese Option im &oracle;-Installationsmenü und starten Sie die Installation erneut. Fehler <errorname>TEXTENV_INVALID</errorname> bei der Ausführung von <command>R3SETUP</command>, RFC oder beim Start von SAPGUI Tritt dieser Fehler auf, so fehlt die korrekte Lokalisierung. &sap;-Hinweis 0171356 führt die notwendigen RPMs auf, die installiert sein müssen (zum Beispiel saplocales-1.0-3, saposcheck-1.0-1 für RedHat 6.1). Falls Sie alle damit verbundenen Fehler ignoriert haben, und bei der Ausführung von R3SETUP den STATUS jeweils von ERROR auf OK (in CENTRDB.R3S) gesetzt haben, um R3SETUP anschließend neu zu starten, wurde das &sap;-System nicht ordnungsgemäß konfiguriert. Das bedeutet, dass Sie nicht via SAPgui am System anmelden können, obwohl das System trotzdem gestartet werden kann. Ein Versuch, sich über die alte Linux-SAPgui anzumelden, führte zu folgenden Fehlermeldungen: Sat May 5 14:23:14 2001 *** ERROR => no valid userarea given [trgmsgo. 0401] Sat May 5 14:23:22 2001 *** ERROR => ERROR NR 24 occured [trgmsgi. 0410] *** ERROR => Error when generating text environment. [trgmsgi. 0435] *** ERROR => function failed [trgmsgi. 0447] *** ERROR => no socket operation allowed [trxio.c 3363] Speicherzugriffsfehler Dieses Verhalten kommt daher, weil &sap.r3; nun nicht in der Lage ist, eine korrekte Lokalisierung zuzuweisen, und sich daher nicht ordnungsgemäß konfigurieren kann (durch fehlende Einträge in einigen Datenbank-Tabellen). Um sich in &sap; anmelden zu können, müssen Sie folgende Einträge zur Datei DEFAULT.PFL (lesen Sie dazu auch Hinweis 0043288) hinzufügen: abap/set_etct_env_at_new_mode = 0 install/collate/active = 0 rscp/TCP0B = TCP0B Starten Sie nun das &sap;-System neu. Sie sind nun in der Lage, sich anzumelden, obwohl einige länderspezifische Spracheinstellungen fehlerhaft sein könnten. Nachdem Sie diese Ländereinstellungen korrigiert (und die korrekten Lokalisierungen installiert) haben, können Sie diese Einträge wieder aus DEFAULT.PFL löschen und das &sap;-System anschließend neu starten. <errorcode>ORA-00001</errorcode> Dieser Fehler trat nur bei einer Installation von &oracle; 8.1.7 unter FreeBSD auf. Dies geschah deshalb, weil sich die &oracle;-Datenbank nicht initialisieren konnte und daher abstürzte. Dadurch verblieben Semaphore und Shared-Memory im System. Der nächste Startversuch führte dann zur Meldung ORA-00001. Suchen Sie diese Semaphore mittels ipcs -a und entfernen Sie sie mit ipcrm. <errorcode>ORA-00445</errorcode> (Hintergrundprozess PMON wurde nicht gestartet) Dieser Fehler trat bei &oracle; 8.1.7 auf. Die Meldung erscheint, wenn die Datenbank mit dem normalen startsap-Skript (zum Beispiel startsap_majestix_00) aber als Benutzer prdadm gestartet wird. Dies kann vermieden werden, indem die Datenbank als Benutzer oraprd über svrmgrl gestartet wird: &prompt.user; svrmgrl SVRMGR> connect internal; SVRMGR> startup; SVRMGR> exit <errorcode>ORA-12546</errorcode> (den Listener mit den richtigen Berechtigungen starten) Starten Sie den &oracle;-Listener als Benutzer oraids mit folgendem Befehl: &prompt.root; umask 0; lsnrctl start Ansonsten könnten Sie die Meldung ORA-12546 erhalten, da die Sockets nun nicht die richtigen Berechtigungen aufweisen. Lesen Sie dazu auch den &sap;-Hinweis 0072984. <errorcode>ORA-27102</errorcode> (kein freier Speicher mehr) Dieser Fehler trat auf, wenn versucht wurde, für MAXDSIZ und DFLDSIZ Werte über 1 GB (1024x1024x1024) festzulegen. Zusätzlich führte dies zur Fehlermeldung Linux Error 12: Cannot allocate memory. Fehler im Stadium [DIPGNTAB_IND_IND] bei der Ausführung von <command>R3SETUP</command> Für allgemeine Informationen lesen Sie bitte den &sap;-Hinweis 0130581 # (R3SETUP - Abbruch im Stadium DIPGNTAB). Bei der IDES-spezifischen Installation verwendete der Installationsprozess aus irgendwelchen Gründen nicht den korrekten &sap;-Systemnamen IDS, sondern den leeren String "". Dies führte zu einigen kleineren Problemen beim Zugriff auf bestimmte Verzeichnisse, da die Pfade durch SID (in diesem Fall IDS) dynamisch generiert werden. Das heißt anstatt auf /usr/sap/IDS/SYS/... /usr/sap/IDS/DVMGS00 zuzugreifen, wurden folgende Pfade verwendet: /usr/sap//SYS/... /usr/sap/D00 Um dennoch mit der Installation fortfahren zu können, wurden ein Link sowie ein zusätzliches Verzeichnis erzeugt: &prompt.root; pwd /compat/linux/usr/sap &prompt.root; ls -l total 4 drwxr-xr-x 3 idsadm sapsys 512 May 5 11:20 D00 drwxr-x--x 5 idsadm sapsys 512 May 5 11:35 IDS lrwxr-xr-x 1 root sapsys 7 May 5 11:35 SYS -> IDS/SYS drwxrwxr-x 2 idsadm sapsys 512 May 5 13:00 tmp drwxrwxr-x 11 idsadm sapsys 512 May 4 14:20 trans Dieses Verhalten wird auch in den &sap;-Hinweisen 0029227 und 0008401 beschrieben. Bei der Installtion von &sap; 4.6C trat allerdings keines dieser Probleme auf. Fehler im Stadium [RFCRSWBOINI_IND_IND] bei der Ausführung von <command>R3SETUP</command> Bei der Installation von &sap; 4.6C trat dieser Fehler als Folge eines anderen, bereits vorher aufgetretenen Fehlers auf. Daher müssen Sie sich die entsprechenden Protokolldateien durchsehen, und danach das wirkliche (bereits vorher aufgetretene) Problem beheben. Wenn Sie nach dem Durchsehen der Protokolldateien feststellen, dass dieser Fehler wirklich der eigentliche Fehler ist (lesen Sie dazu wiederum die &sap;-Hinweise), können Sie den STATUS des betreffenden Schritts von ERROR auf OK setzen (und zwar in der Datei CENTRDB.R3S). Anschließend starten Sie R3SETUP erneut. Nach der Installation müssen Sie den Report RSWBOINS der Transaktion SE38 ausführen. Lesen Sie den &sap;-Hinweis 0162266, um weitere Informationen zu den Stadien RFCRSWBOINI und RFCRADDBDIF zu erhalten. Fehler im Stadium [RFCRADDBDIF_IND_IND] bei der Ausführung von <command>R3SETUP</command> Hier gilt das Gleiche wie für den letzten Fehler. Stellen Sie durch Überprüfen der Protokolldateien sicher, dass dieser Fehler nicht durch ein früheres Problem verursacht wird. Wenn Sie sicher sind, dass &sap;-Hinweis 0162266 auf Ihr System zutrifft, setzen Sie den STATUS des betreffenden Stadiums von ERROR auf OK (und zwar in der Datei CENTRDB.R3S). Anschließend starten Sie R3SETUP erneut. Nach der Installation müssen Sie den Report RADDBDIF der Transaktion SE38 ausführen. sigaction sig31: File size limit exceeded Dieser Fehler trat beim Start des &sap;-Prozesses disp+work auf. Wird &sap; mit startsap-Skript gestartet, werden Subprozesse gestartet, deren Aufgabe es ist, alle anderen &sap;-Prozesse zu starten. Als Folge davon erkennt startsap dabei auftretende Fehler nicht. Um zu überprüfen, ob die &sap;-Prozesse korrekt gestartet wurden, überprüfen Sie den Prozessstatus mit ps ax | grep SID. Sie erhalten dadurch eine Liste aller &oracle;- und &sap;-Prozesse. Wenn einige Prozesse fehlen, oder Sie sich nicht mit dem &sap;-System verbinden können, überprüfen Sie wiederum die entsprechenden Protokolldateien, die sich unter /usr/sap/SID/DVEBMGSnr/work/ befinden. Die zu durchsuchenden Dateien heißen dev_ms und dev_disp. Wenn &oracle; und &sap; mehr Speicher anfordern als in der Kernelkonfigurationsdatei festgelegt wurde, wird das Signal 31 ausgeliefert. Der Fehler kann behoben werden, indem im Kernel ein größerer Wert verwendet wird. # larger value for 46C production systems: options SHMMAXPGS=393216 # smaller value sufficient for 46B: #options SHMMAXPGS=262144 Der Start von <command>saposcol</command> schlug fehl Das Programm saposcol (Version 4.6D) kann einige Probleme verursachen. Das &sap;-System verwendet saposcol, um Daten über die Systemleistung zu sammeln. Für die Benutzung des &sap;-Systems hingegen ist es es nicht erforderlich. Daher handelt es sich hier auch nur um ein kleineres Problem. Ältere Versionen von saposcol (z.B. 4.6B) funktionieren, sammeln allerdings nicht alle Daten (viele Aufrufe geben, zum Beispiel die CPU-Nutzung, einfach 0 (Null) zurück. Weiterführende Themen Wenn Sie sich fragen, wie die Linux-Binärkompatibilität unter FreeBSD realisiert wurde, sollten Sie diesen Abschnitt lesen. Der Großteil der folgenden Informationen stammt aus einer E-Mail, die von Terry Lambert (tlambert@primenet.com) an die FreeBSD-Chat-Mailingliste (freebsd-chat@FreeBSD.org) geschrieben wurde (Message ID: <199906020108.SAA07001@usr09.primenet.com>). Wie funktioniert es? execution class loader FreeBSD verfügt über eine execution class loader genannte Abstraktion. Dabei handelt es sich um einen Eingriff in den &man.execve.2; Systemaufruf. FreeBSD verfügt über eine Liste von Ladern, anstelle eines einzigen, auf #! zurückgreifenden Laders, um Shell-Interpreter oder Shell-Skripte auszuführen. Historisch gesehen untersuchte der einzige, auf UNIX-Plattformen vorhandene Lader die "magische Zahl" (in der Regel die ersten 4 oder 8 Bytes der Datei), um festzustellen, ob der Binärtyp dem System bekannt war. War dies der Fall, wurde der Binärlader aufgerufen. Wenn es sich nicht um den zum System gehörigen Binärtyp handelte, gab &man.execve.2; einen Fehler zurück, und die Shell versuchte stattdessen, die Datei als Shell-Befehl auszuführen. Dabei wurde als Standardeinstellung was auch immer die aktuelle Shell ist festgelegt. Später wurde ein Hack in &man.sh.1; eingefügt, der die zwei ersten Zeichen untersuchte. Wenn diese :\n entsprachen, wurde stattdessen die &man.csh.1;-Shell aufgerufen (wir glauben, dass dies zuerst von SCO umgesetzt wurde). FreeBSD versucht heute eine Liste von Ladern, unter denen sich ein allgemeiner Lader für Interpreter befindet. Der auszuführende Interpreter wird im ersten, durch Leerzeichen getrennten Feld, der #!-Zeile angegeben. Lässt sich der Interpreter nicht ermitteln, wird auf /bin/sh zurückgegriffen. ELF Für die Linux ABI-Unterstützung erkennt FreeBSD die magische Zahl als ELF-Binärdatei (Zu diesem Zeitpunkt wird nicht zwischen FreeBSD, &solaris;, Linux oder anderen Systemen unterschieden, die über ELF-Binärdateien verfügen.). Solaris Der ELF-Lader sucht nach einer speziellen Kennzeichnung, die aus einem Kommentarabschnitt in der ELF-Datei besteht, und die in SVR4/&solaris; ELF Binärdateien nicht vorhanden ist. Damit Linux-Binärdateien (unter FreeBSD) funktionieren, müssen sie als Linux gekennzeichnet werden, und zwar durch &man.brandelf.1;: &prompt.root; brandelf -t Linux file Nachdem dies geschehen ist, erkennt der ELF-Lader die Linux-Kennzeichnung der Datei. ELF brandelf Wenn der ELF-Lader die Linux-Kennzeichnung sieht, wird ein Zeiger in der proc-Struktur ersetzt. Alle Systemaufrufe werden durch diesen Zeiger indiziert (in einem traditionellen &unix; System wäre das ein sysent[]-Strukturfeld, das die Systemaufrufe enthält). Der Prozess wird weiterhin speziell gekennzeichnet, so dass der Trap-vector im Signal-trampoline-code eine spezielle Behandlung erfährt und das Linux-Kernelmodul verschiedene kleinere Korrekturen vornehmen kann. Der Linux-Systemaufrufvektor enthält neben anderen Dingen eine Liste der sysent[]-Einträge, deren Adressen sich im Kernelmodul befinden. Wenn ein Linux-Programm einen Systemaufruf ausführt, dereferenziert die Trap-Behandlungsroutine den Zeiger auf die Eintrittspunkte für die Systemaufrufe und erhält damit die Linux-Eintrittspunkte und nicht die FreeBSD-Eintrittspunkte. Zusätzlich verändert der Linuxmodus die Systempfade dynamisch; genauso, wie dies die Option beim Einbinden von Dateisystemen macht (Achtung: nicht das Dateisystem unionfs!). Zuerst wird die Datei im Verzeichnis /compat/linux/Originalpfad gesucht, danach, wenn sie dort nicht gefunden wurde, wird sie im FreeBSD-Verzeichnis /Originalpfad gesucht. Dadurch wird sichergestellt, dass Binärdateien, die zur Ausführung andere Binärdateien benötigen, ausgeführt werden können (so dass alle Linux-Werkzeuge unter der ABI laufen). Dies bedeutet auch, dass Linux-Binärdateien FreeBSD-Binärdateien laden und ausführen können, wenn keine passenden Linux-Binärdateien vorhanden sind. Ein in /compat/linux plaziertes &man.uname.1; kann damit Linux-Programmen vorgaukeln, dass sie auf einem Linux-System laufen. Im Endeffekt gibt es einen Linux-Kernel innerhalb des FreeBSD-Kernels. Die Sprungtabellen für Linux- beziehungsweise FreeBSD-Systemaufrufe verweisen allerdings auf dieselben Funktionen, die Kerneldienste wie Dateisystemoperationen, Operationen für den virtuellen Speicher, Signalübermittlung und System V IPC bereitstellen, Der einzige Unterschied ist, dass Binärdateien unter FreeBSD FreeBSD-glue-Funktionen verwenden. Linux-Binärdateien hingegen verwenden die Linux-glue-Funktionen. Die meisten älteren Betriebssysteme hatten ihre eigenen glue-Funktionen: Funktionsadressen in einem globalen, statischen sysent[] Strukturfeld an Stelle von Funktionsadressen, die durch einen dynamisch initialisierten Zeiger aus der proc Struktur, die den Aufruf gemacht hatte, dereferenziert wurden. Welche ist die echte FreeBSD-ABI? Das spielt keine Rolle. Grundsätzlich ist der einzige Unterschied (zurzeit ist das so; dies könnte sich in zukünftigen Versionen leicht ändern und wird sich wahrscheinlich auch ändern), dass die FreeBSD-glue-Funktionen statisch in den Kernel gelinkt sind, und dass die Linux-glue-Funktionen statisch gelinkt oder über ein Modul eingebunden werden können. Ja, aber ist das wirkliche eine Emulation? Nein. Es ist eine Implementierung eines ABIs, keine Emulation. Es ist kein Emulator (oder Simulator, um der nächsten Frage zuvorzukommen) beteiligt. Warum wird es manchmal Linux-Emulation genannt? Um es schwerer zu machen, FreeBSD zu verkaufen. Wirklich, das kommt daher, weil dies zu einer Zeit implemtiert wurde, in der es kein anderes Wort (als Emulation) gab, das beschrieb, was vor sich ging. Wenn der Kernel nicht entsprechend konfiguriert wurde oder das Modul geladen wurde, war es falsch zu behaupten, FreeBSD würde Linux-Binärprogramme ausführen. Man benötigte ein Wort, das beschrieb, was da geladen wurde – daher Der Linux-Emulator.
diff --git a/de_DE.ISO8859-1/books/handbook/mirrors/chapter.sgml b/de_DE.ISO8859-1/books/handbook/mirrors/chapter.sgml index 1713d5b6fc..53b9a869d6 100644 --- a/de_DE.ISO8859-1/books/handbook/mirrors/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/mirrors/chapter.sgml @@ -1,3323 +1,3341 @@ Bezugsquellen für &os; CD-ROM und DVD Verleger &os;-Pakete &os;-Pakete (&os;-CDs, zusätzliche Software und gedruckte Dokumentation) erhalten Sie von mehreren Händlern:
CompUSA WWW:
Frys Electronics WWW:
&os;-CDs und -DVDs Die &os;-CDs und -DVDs werden von vielen Online-Händlern angeboten:
&os; Mall, Inc. 700 Harvest Park Ste F Brentwood, CA 94513 USA Telefon: +1 925 240-6652 Fax: +1 925 674-0821 E-Mail: info@freebsdmall.com WWW:
Dr. Hinner EDV St. Augustinus-Str. 10 D-81825 München Germany Telefon: (089) 428 419 WWW:
Ikarios 22-24 rue Voltaire 92000 Nanterre France WWW:
JMC Software Ireland Telefon: 353 1 6291282 WWW:
The Linux Emporium Hilliard House, Lester Way Wallingford OX10 9TA United Kingdom Telefon: +44 1491 837010 Fax: +44 1491 837016 WWW:
Linux+ DVD Magazine Lewartowskiego 6 Warsaw 00-190 Poland Telefon: +48 22 860 18 18 E-Mail: editors@lpmagazine.org WWW:
Linux System Labs Australia 21 Ray Drive Balwyn North VIC - 3104 Australia Telefon: +61 3 9857 5918 Fax: +61 3 9857 8974 WWW:
LinuxCenter.Ru Galernaya Street, 55 Saint-Petersburg 190000 Russia Telefon: +7-812-3125208 E-Mail: info@linuxcenter.ru WWW:
Lieferanten Wenn Sie &os;-CD-ROM-Produkte weiterverkaufen möchten, kontaktieren Sie einen der folgenden Lieferanten:
Cylogistics 809B Cuesta Dr., #2149 Mountain View, CA 94040 USA Telefon: +1 650 694-4949 Fax: +1 650 694-4953 E-Mail: sales@cylogistics.com WWW:
Ingram Micro 1600 E. St. Andrew Place Santa Ana, CA 92705-4926 USA Telefon: 1 (800) 456-8000 WWW:
Kudzu, LLC 7375 Washington Ave. S. Edina, MN 55439 USA Telefon: +1 952 947-0822 Fax: +1 952 947-0876 E-Mail: sales@kudzuenterprises.com
LinuxCenter.Kz Ust-Kamenogorsk Kazakhstan Telefon: +7-705-501-6001 E-Mail: info@linuxcenter.kz WWW:
LinuxCenter.Ru Galernaya Street, 55 Saint-Petersburg 190000 Russia Telefon: +7-812-3125208 E-Mail: info@linuxcenter.ru WWW:
Navarre Corp 7400 49th Ave South New Hope, MN 55428 USA Telefon: +1 763 535-8333 Fax: +1 763 535-0341 WWW:
FTP-Server Die offiziellen Quellen von &os; sind mit anonymous FTP über ein weltweites Netz von FTP-Spiegeln erhältlich. Obwohl über eine gute Anbindung verfügt, sollten Sie einen Spiegel in Ihrer Nähe verwenden (insbesondere, wenn Sie selber einen Spiegel einrichten wollen). Die Datenbank der &os;-Spiegel ist aktueller als die folgende Liste, da sie im Gegensatz zu einer statischen Liste die Informationen aus dem DNS erhält. Sie können &os; auch über anonymous FTP von den folgenden Spiegeln beziehen. Wenn Sie &os; über anonymous FTP beziehen wollen, wählen Sie bitte einen Spiegel in Ihrer Nähe. Die unter Haupt-Spiegel aufgeführten Spiegel stellen normalerweise das komplette &os;-Archiv (alle momentan erhältlichen Versionen für jede unterstützte Architektur) zur Verfügung. Wahrscheinlich geht es aber schneller, wenn Sie einen Spiegel in Ihrer Nähe benutzen. Die Länder-Spiegel stellen die neusten Versionen für die beliebtesten Architekturen bereit, sie stellen aber unter Umständen nicht das komplette &os;-Archiv bereit. Auf alle Server kann mit anonymous FTP zugegriffen werden, einige Server bieten auch andere Zugriffsmethoden an. Die zur Verfügung stehenden Zugriffsmethoden sind bei jedem Server in Klammern angegeben. &chap.mirrors.ftp.inc; BitTorrent BitTorrent Die ISO-Images für die Release-CDs sind via BitTorrent abrufbar. Eine Sammlung von Torrent-Dateien zum Herunterladen der Images ist unter http://torrents.freebsd.org:8080 verfügbar. Die BitTorrent Client-Software ist als Port net-p2p/py-bittorrent oder als vorkompiliertes Paket erhältlich. Nach dem Herunterladen der ISO-Images mit BitTorrent können Sie diese auf CD oder DVD brennen, so wie im burncd- beschrieben. Anonymous CVS <anchor id="anoncvs-intro">Einführung CVS anonymous Anonymous CVS (oder anoncvs) dient zum Synchronisieren mit entfernten Repositories und steht mit den CVS Werkzeugen, die im &os; Basissystem enthalten sind, zur Verfügung. Benutzer von &os; können damit unter anderem lesende Operationen auf den Anoncvs Servern des &os; Projects durchführen, ohne über besondere Berechtigungen zu verfügen. Um es zu benutzen, setzen Sie einfach die CVSROOT Umgebungsvariable auf einen Anoncvs Server und geben beim Login mit cvs login das Passwort anoncvs an. Danach können Sie mit &man.cvs.1; wie auf jedes lokale Repository (allerdings nur lesend) zugreifen. cvs login speichert Passwörter zur Authentifizierung an einem CVS Server in der Datei .cvspass in Ihrem HOME-Verzeichnis. Wenn diese Datei beim ersten Benutzen von cvs login nicht existiert, erhalten Sie vielleicht eine Fehlermeldung. In diesem Fall legen Sie einfach eine leere .cvspass Datei an und melden sich erneut an. CVSup und Anoncvs bieten dieselbe Funktionalität, die folgenden Kriterien helfen Ihnen zu entscheiden, welche Methode Sie benutzen sollen. CVSup geht wesentlich effizienter mit Netzwerk-Ressourcen um und ist auch technisch ausgereifter. Allerdings müssen Sie zuerst einen speziellen Client installieren und konfigurieren, bevor Sie CVSup benutzen können. Weiterhin können Sie mit CVSup nur relativ große Teile der Quellen, die Sammlungen genannt werden, synchronisieren. Im Gegensatz dazu können Sie mit Anoncvs jede beliebige Datei oder indem Sie einfach den CVS Namen des Moduls angeben, ein beliebiges Programm, wie ls oder grep, bearbeiten. Natürlich können Sie mit Anoncvs nur lesend auf ein CVS Repository zugreifen. Wenn Sie lokal mit dem &os;-Repository entwickeln wollen, dann ist CVSup die einzige Wahl. <anchor id="anoncvs-usage">Benutzen von Anonymous CVS Setzen Sie einfach die CVSROOT Umgebungsvariable, um &man.cvs.1; das CVS Repository eines &os; Anoncvs-Servers bekannt zu geben. Zurzeit stehen folgende Server zur Verfügung: Frankreich: :pserver:anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs (Das Passwort für pserver ist anoncvs, ssh-Zugriffe verwenden kein Passwort.) Japan: :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs (Benutzen Sie cvs login und das Passwort anoncvs.) Taiwan: :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs (pserver: Benutzen Sie cvs login und ein beliebiges Passwort. ssh: kein Passwort.) SSH2 HostKey: 1024 02:ed:1b:17:d6:97:2b:58:5e:5c:e2:da:3b:89:88:26 /etc/ssh/ssh_host_rsa_key.pub SSH2 HostKey: 1024 e8:3b:29:7b:ca:9f:ac:e9:45:cb:c8:17:ae:9b:eb:55 /etc/ssh/ssh_host_dsa_key.pub USA: freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs (nur ssh ohne Passwort). SSH HostKey: 1024 a1:e7:46:de:fb:56:ef:05:bc:73:aa:91:09:da:f7:f4 root@sanmateo.ecn.purdue.edu SSH2 HostKey: 1024 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65 ssh_host_dsa_key.pub USA: anoncvs@anoncvs1.FreeBSD.org:/home/ncvs (nur ssh ohne Passwort). SSH2 HostKey: 2048 53:1f:15:a3:72:5c:43:f6:44:0e:6a:e9:bb:f8:01:62 /etc/ssh/ssh_host_dsa_key.pub Mit CVS können Sie praktisch jede Version von &os;, die schon einmal existiert hat (oder in manchen Fällen existieren wird) auschecken. Sie sollten daher damit vertraut sein, wie Sie mit Tags unter &man.cvs.1; arbeiten (die Option). Zudem müssen Sie die Namen der Tags im &os;-Repository kennen. Es gibt zwei verschiedene TagsTags sind symbolische Namen, die im Repository vergeben werden. : Tags, die Revisionen bezeichnen und Tags, die Zweige bezeichnen. Die Ersten sind statisch und fest an eine Revision gebunden. Ein Tag, das einen Zweig bezeichnet, bezieht sich dagegen zu einem gegebenen Zeitpunkt immer auf die aktuellste Revision. Da ein Tag eines Zweiges nicht an eine bestimmte Revision gebunden ist, kann sich dessen Bedeutung von heute auf morgen ändern. In finden Sie eine Liste der gültigen Tags. Beachten Sie bitte, dass keines der Tags auf die Ports-Sammlung anwendbar ist, da diese nicht über Zweige verfügt. Wenn Sie ein Tag eines Zweiges verwenden, erhalten Sie die aktuellsten Dateien dieses Entwicklungszweiges. Wenn Sie eine frühere Revision erhalten möchten, können Sie zum Beispiel einen Zeitpunkt mit der Option angeben. Weitere Informationen dazu entnehmen Sie bitte &man.cvs.1;. Beispiele Im Folgenden finden Sie einige Beispiele für den Umgang mit Anonymous CVS. Sie sollten sich aber die Manualpage von &man.cvs.1; sorgfältig durchlesen, bevor Sie anfangen. &man.ls.1; von -CURRENT auschecken &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs &prompt.user; cvs login Wenn Sie dazu aufgefordert werden, benutzen Sie ein beliebiges Passwort. &prompt.user; cvs co ls Den <filename>src/</filename>-Baum über SSH auschecken &prompt.user; cvs -d freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs co src The authenticity of host 'anoncvs.freebsd.org (128.46.156.46)' can't be establiestablished. DSA key fingerprint is 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'anoncvs.freebsd.org' (DSA) to the list of known hosts. &man.ls.1; aus dem 6-STABLE-Zweig auschecken &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs &prompt.user; cvs login Wenn Sie dazu aufgefordert werden, benutzen Sie ein beliebiges Passwort. &prompt.user; cvs co -rRELENG_6 ls Änderungen in &man.ls.1; zwischen 5.3 RELEASE und 5.4 RELEASE (als unified diff) &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs &prompt.user; cvs login Wenn Sie dazu aufgefordert werden, benutzen Sie ein beliebiges Passwort. &prompt.user; cvs rdiff -u -rRELENG_5_3_0_RELEASE -rRELENG_5_4_0_RELEASE ls Gültige Modulnamen herausfinden &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs &prompt.user; cvs login Wenn Sie dazu aufgefordert werden, benutzen Sie ein beliebiges Passwort. &prompt.user; cvs co modules &prompt.user; more modules/modules Weitere Ressourcen Die folgenden Ressourcen sind nützlich, um den Umgang mit CVS zu lernen: CVS Tutorial von der California Polytechnic State University. CVS Home, die Homepage des CVS-Projekts. CVSweb das Web Interface zu CVS des &os; Projekts. CTM CTM Mit CTM Abkürzung für CVS Through eMail können Sie einen entfernten Verzeichnisbaum mit einem zentralen Baum synchronisieren. Es wurde extra zum Synchronisieren der &os; Quellen entwickelt, obwohl es mit der Zeit vielleicht auch andere Anwendungen geben wird. Zurzeit existiert leider so gut wie keine Dokumentation zum Erstellen der Deltas. Wenn Sie Hilfe benötigen oder CTM für andere Zwecke einsetzen wollen, wenden Sie sich bitte an die Mailingliste &a.ctm-users.name;. Warum soll ich <application>CTM</application> benutzen? Mit CTM erhalten Sie eine lokale Kopie des &os;-Quellbaums, den es in mehreren Varianten gibt. Sie können das ganze Repository oder nur einen Zweig spiegeln. Wenn Sie ein aktiver &os;-Entwickler mit einer schlechten oder gar keiner TCP/IP Verbindung sind, oder die Änderungen einfach automatisch zugesandt bekommen wollen, dann ist CTM das Richtige für Sie. Für die Zweige mit der meisten Aktivität müssen Sie sich täglich bis zu drei Deltas beschaffen, Sie sollten allerdings erwägen, die Deltas automatisch über E-Mail zu beziehen. Die Größe der Updates wird so klein wie möglich gehalten. Normalerweise sind sie kleiner als 5 kB, manchmal sind sie 10-50 kB groß (etwa jedes 10. Update) und ab und an werden Sie auch einmal ein Update mit 100 kB oder mehr erhalten. Sie sollten sich über die Vorbehalte gegen die Verwendung der Quellen anstelle eines offiziellen Releases bewusst sein. Das trifft besonders auf &os.current; zu, lesen Sie dazu bitte den Abschnitt &os.current;. Was brauche ich, um <application>CTM</application> zu benutzen? Zwei Sachen: Das CTM Programm und die initialen Deltas, von denen aus Sie auf die aktuellen Stände kommen. CTM ist schon seit der Version 2.0 Teil des &os;-Basissystems. Sie finden es in /usr/src/usr.sbin/ctm, wenn Sie eine Kopie der Quellen besitzen. Die Deltas, die CTM verarbeitet, können Sie über FTP oder E-Mail beziehen. Wenn Sie über einen FTP Zugang zum Internet verfügen, erhalten Sie die Deltas unter der folgenden URL: Die Deltas werden auch von CTM Spiegeln bereitgehalten. Wechseln Sie in das passende Verzeichnisse zum Beispiel src-cur für &os.current; und laden Sie sich von dort die Deltas herunter. Sie können die Deltas auch über E-Mail beziehen. Abonnieren Sie dazu eine der CTM-Verteilerlisten. Über &a.ctm-cvs-cur.name; erhalten Sie den kompletten CVS-Baum, über &a.ctm-src-cur.name; erhalten Sie &os.current; und über &a.ctm-src-4.name; erhalten Sie den &os; 4.X-Zweig. Wenn Sie nicht wissen, wie Sie eine der Mailinglisten abonnieren, folgen Sie einem der Verweise von oben oder besuchen Sie die Seite &a.mailman.lists.link;. Weitere Informationen erhalten Sie, wenn Sie dort auf die gewünschte Liste klicken. Benutzen Sie ctm_rmail, um die CTM Updates, die Sie per E-Mail empfangen, auszupacken und anzuwenden. Wenn Sie diesen Prozess automatisiert ablaufen lassen möchten, können Sie dazu einen Eintrag in /etc/aliases verwenden. Genauere Informationen finden Sie in der Manualpage von ctm_rmail. Sie sollten die Mailingliste &a.ctm-announce.name; abonnieren, egal wie Sie die CTM-Deltas erhalten. Ankündigungen, die den Betrieb des CTM-Systems betreffen, werden nur auf dieser Liste bekannt gegeben. Klicken Sie auf den Namen der Liste oder besuchen Sie die Seite &a.mailman.lists.link;, um diese Liste zu abonnieren. Initialisieren von <application>CTM</application> Bevor Sie die CTM Deltas benutzen können, brauchen Sie einen Startpunkt, auf den die nachfolgenden Deltas angewendet werden. Sie können natürlich mit einem leeren Verzeichnis beginnen. In diesem Fall benötigen Sie ein XEmpty-Delta, mit dem Sie den CTM-Verzeichnisbaum initialisieren. Wenn Sie Glück haben, finden Sie ein XEmpty-Delta, mit dem sie beginnen können, auf einer der CDs Ihrer Distribution. Da die Verzeichnisbäume mehrere Megabyte groß sind, sollten Sie nach Möglichkeit etwas schon vorhandenes benutzen. Wenn Sie eine -RELEASE CD besitzen, können Sie die Quellen von dieser CD benutzen. Sie ersparen sich damit das Übertragen großer Datenmengen. Die Deltas, mit denen Sie beginnen können, enthalten ein X in ihrem Namen, wie in src-cur.3210XEmpty.gz. Hinter dem X wird der Startpunkt der Deltas angegeben, in diesem Fall steht Empty für ein leeres Verzeichnis. Nach etwa 100 Deltas wird ein neues XEmpty-Delta erstellt. Mit ungefähr 75 Megabyte komprimierter Daten sind diese XEmpty-Deltas übrigens sehr groß. Nachdem Sie Ihren Startpunkt festgelegt haben, benötigen Sie alle Deltas mit einer höheren Nummer. Benutzen von <application>CTM</application> Um ein Delta einzuspielen, benutzen Sie das folgende Kommando: &prompt.root; cd /Pfad/zu/den/Quellen &prompt.root; ctm -v -v /Pfad/zu/den/Deltas/src-xxx.* CTM kann mit Deltas arbeiten, die mit gzip komprimiert wurden. Sie brauchen die Deltas vorher nicht mit gunzip zu dekomprimieren und sparen damit Plattenplatz. Ihr Quellbaum wird erst dann verändert, wenn CTM die Deltas sauber verarbeiten kann. Die Integrität der Deltas und ihre Anwendbarkeit auf den Quellbaum lassen sich durch die Angabe des Schalters -c überprüfen, CTM ändert in diesem Fall Ihren Quellbaum nicht. CTM verfügt über weitere Kommandozeilenoptionen, Informationen dazu finden Sie in der Manualpage oder dem Quellcode. Das war schon alles. Um Ihre Quellen aktuell zu halten, verwenden Sie CTM jedes Mal, wenn Sie neue Deltas bekommen. Löschen Sie die Deltas nicht, wenn Sie diese nur schwer wieder beschaffen können. Behalten Sie sie für den Fall, das etwas passiert. Auch wenn Sie nur Disketten besitzen, sollten Sie erwägen, die Deltas mit fdwrite zu sichern. Umgang mit lokalen Änderungen Entwickler wollen mit den Dateien im Quellbaum experimentieren und diese verändern. In beschränkter Weise werden lokale Änderungen von CTM unterstützt. Wenn CTM die Datei foo bearbeiten will, überprüft es zuerst ob die Datei foo.ctm existiert. Wenn diese Datei existiert, werden Änderungen in ihr anstatt in foo vorgenommen. Mit diesem Verfahren ist eine leichte Handhabung lokaler Änderungen möglich. Kopieren Sie die Dateien, die Sie ändern möchten, in Dateien, die das Suffix .ctm tragen. Sie können dann ungestört mit dem Quellcode arbeiten, während CTM die .ctm Dateien aktualisiert. Weitere <application>CTM</application>-Optionen Was wird aktualisiert? Eine Liste der Änderungen, die CTM an Ihrem Quellbaum vornehmen wird, erhalten Sie, wenn Sie die Option angeben. Das ist nützlich, wenn Sie Logs über die Änderungen führen wollen, geänderte Dateien vor- oder nachbearbeiten wollen, oder einfach ein bisschen paranoid sind. Sicherungen vor einer Aktualisierung erstellen Sie wollen vielleicht die Dateien, die durch eine CTM Aktualisierung verändert werden, sichern. Mit weisen Sie CTM an, alle Dateien, die durch ein CTM Delta verändert würden, nach backup-file zu sichern. Dateien ausschließen Manchmal wollen Sie nur bestimmte Teile aktualisieren oder nur bestimmte Dateien aus einer Folge von Deltas extrahieren. Sie können die Liste der Dateien, mit denen CTM arbeitet, einschränken, indem Sie reguläre Ausdrücke mit den Optionen und angeben. Wenn Sie eine aktuelle Kopie von lib/libc/Makefile aus den gesicherten CTM Deltas erhalten wollen, setzen Sie das folgende Kommando ab: &prompt.root; cd /wo/Sie/es/auspacken/wollen/ &prompt.root; ctm -e '^lib/libc/Makefile' ~ctm/src-xxx.* Die Optionen und werden in der Reihenfolge angewandt, in der sie auf der Kommandozeile angegeben wurden. Eine Datei wird nur dann von CTM verarbeitet, wenn dies nach der Anwendung der Optionen und noch erlaubt ist. Pläne für <application>CTM</application> Mehrere: Hinzufügen eines Authentifizierungsmechanismus, damit gefälschte CTM-Deltas erkannt werden können. Aufräumen der CTM-Optionen, die mit der Zeit unübersichtlich und irreführend wurden. Verschiedenes Es gibt Deltas für die Ports-Sammlung, die aber nicht intensiv genutzt werden. CTM-Spiegel Die CTM-Deltas können Sie mit anonymous FTP von den folgenden Spiegeln beziehen. Versuchen Sie bitte einen Spiegel in Ihrer Nähe zu benutzen. Bei Problemen wenden Sie sich bitte an die Mailingliste &a.ctm-users.name;. Kalifornien, Bay Area, Offizieller Server Südafrika, Backup-Server für alte Deltas Taiwan/R.O.C. Wenn die Liste keinen Spiegel in Ihrer Nähe enthält oder Sie Probleme mit dem ausgewählten Spiegel haben, versuchen Sie einen Spiegel mit einer Suchmaschine, wie alltheweb, zu finden. Benutzen von CVSup Einführung CVSup ist eine Anwendung, die Verzeichnisbäume von einem entfernten CVS-Server bereitstellt und aktualisiert. Die Quellen von &os; werden in einem CVS-Repository auf einer Entwicklungsmaschine in Kalifornien gepflegt. Mit CVSup können sich &os;-Benutzer den eigenen Quellbaum auf aktuellem Stand halten. Zum Aktualisieren benutzt CVSup die Pull-Methode, bei der die Aktualisierungen vom Client angefragt werden. Der Server wartet dabei passiv auf Anfragen von Clients, das heißt er verschickt nicht unaufgefordert Aktualisierungen. Somit gehen alle Anfragen vom Client aus und die Benutzer müssen CVSup entweder manuell starten oder einen cron Job einrichten, um regelmäßig Aktualisierungen zu erhalten. CVSup in genau dieser Schreibweise bezeichnet die Anwendung, die aus dem Client cvsup und dem Server cvsupd besteht. cvsup läuft auf den Maschinen der Benutzer, cvsupd läuft auf jedem der &os;-Spiegel. Wenn Sie die &os;-Dokumentation und die Mailinglisten lesen, werden Sie oft auf Sup, dem Vorgänger von CVSup stoßen. CVSup wird in gleicher Weise wie Sup benutzt und verfügt sogar über Konfigurationsdateien, die kompatibel zu denen von Sup sind. Da CVSup schneller und flexibler als Sup ist, wird Sup vom &os; Project nicht mehr benutzt. Mit csup gibt es in inzwischen auch eine in C geschriebene Neuimplementierung von CVSup. Der größte Vorteil dieser neuen Version ist neben einer höheren Geschwindigkeit der, dass dieses Programm nicht von der Sprache Modula-3 abhängig ist und Sie daher dieses Paket nicht mitinstallieren müssen. Ab &os; 6.2 ist csup bereits im Basissystem enthalten und kann sofort verwendet werden. Verwenden Sie hingegen eine ältere &os;-Version, können Sie &man.csup.1; über den Port net/csup installieren. Alternativ können Sie zur Installation auch ein vorkompiliertes Paket (Package) verwenden. csup unterstützt allerdings keinen CVS-Modus. Wollen Sie komplette Repositories spiegeln, müssen Sie also weiterhin CVSup einsetzen. Wollen Sie künftig csup einsetzen, überspringen Sie in den folgenden Ausführungen einfach den Abschnitt zur Installation von CVSup und ersetzen alle Vorkommen von CVSup durch csup. Installation von <application>CVSup</application> CVSup können Sie leicht installieren, wenn Sie das vorkompilierte Paket net/cvsup aus der Ports-Sammlung benutzen. Alternativ können Sie net/cvsup auch ausgehend von den Quellen bauen, doch seien Sie gewarnt: net/cvsup hängt vom Modula-3 System ab, das viel Zeit und Platz zum Herunterladen und Bauen braucht. Wenn Sie CVSup auf einer Maschine ohne &xfree86; oder &xorg;, beispielsweise einem Server, benutzen, stellen Sie sicher, dass Sie den Port ohne das CVSup-GUI, net/cvsup-without-gui verwenden. Wollen Sie csup unter &os; 6.1 oder älter installieren, können Sie dazu das vorkompilierte Paket net/csup oder den Port net/csup (zur Installation aus den Quellen) verwenden. Konfiguration von CVSup Das Verhalten von CVSup wird mit einer Konfigurationsdatei gesteuert, die supfile genannt wird. Beispiele für Konfigurationsdateien finden Sie in dem Verzeichnis . Ein supfile enthält die folgenden Informationen: Welche Dateien Sie erhalten wollen. Welche Versionen der Dateien Sie benötigen. Woher Sie die Dateien beziehen wollen. Wo Sie die erhaltenen Dateien speichern. Wo Sie die Status-Dateien aufbewahren wollen. In den folgenden Abschnitten erstellen wir ein typisches supfile indem wir nach und nach diese Punkte klären. Zuerst beschreiben wir aber den Aufbau dieser Konfigurationsdatei. Ein supfile ist eine Textdatei. Kommentare beginnen mit einem # und gelten bis zum Zeilenende. Leerzeilen und Zeilen, die nur Kommentare enthalten, werden ignoriert. Die anderen Zeilen legen die Dateien fest, die ein Benutzer erhalten will. Der Server organisiert verschiedene Dateien in einer Sammlung, deren Name auf einer Zeile angegeben wird. Nach dem Namen der Sammlung können mehrere durch Leerzeichen getrennte Felder folgen, die die oben angesprochenen Informationen festlegen. Es gibt zwei Arten von Feldern: Felder, die Optionen festlegen und Felder mit Parametern. Optionen bestehen aus einem Schlüsselwort, wie oder und stehen alleine. Ein Parameterfeld beginnt mit einem Schlüsselwort, dem = und ein Parameter, wie in , folgt. Dieses Feld darf keine Leerzeichen enthalten. In einem supfile werden normalerweise mehrere Sammlungen angefordert. Die erforderlichen Felder können explizit für jede Sammlung angegeben werden, dann werden jedoch die Zeilen ziemlich lang. Außerdem ist dieses Vorgehen sehr unhandlich, da die meisten Felder für alle Sammlungen gleich sind. CVSup bietet die Möglichkeit, Vorgaben für die Felder der Sammlungen festzulegen. Zeilen, die mit der Pseudo-Sammlung *default beginnen, legen Optionen und Parameter für nachfolgende Sammlungen im supfile fest. Der Vorgabewert kann in der Zeile einer bestimmten Sammlung überschrieben werden. Durch Hinzufügen weiterer *default Zeilen können die Vorgaben auch mitten im supfile überschrieben oder erweitert werden. Mit diesem Wissen können wir nun ein supfile erstellen, das den Quellbaum von &os;-CURRENT anfordert und aktualisiert. Welche Dateien wollen Sie empfangen? Dateien werden von CVSup in Sammlungen organisiert. Die erhältlichen Sammlungen werden später beschrieben. Wir wollen den Quellbaum von &os; empfangen, der in der Sammlung src-all enthalten ist. Das supfile enthält pro Zeile eine Sammlung, in diesem Fall also nur eine einzige Zeile: src-all Welche Versionen der Dateien werden benötigt? Mit CVSup können Sie jede Version der Quellen bekommen, da der cvsupd-Server seine Daten direkt aus dem CVS-Repository bezieht. Sie können die benötigten Versionen in den Parameterfeldern tag= und angeben. Achten Sie darauf, dass Sie das richtige tag=-Feld angeben. Einige Tags sind nur für spezielle Sammlungen gültig. Wenn Sie ein falsches Tag angeben oder sich verschreiben, wird CVSup Dateien löschen, die Sie wahrscheinlich gar nicht löschen wollten. Achten Sie insbesondere bei den ports-*-Sammlungen darauf, ausschließlich tag=. zu verwenden. Mit tag= wird ein symbolischer Name aus dem Repository angegeben. Es gibt zwei verschiedene Tags: Tags, die Revisionen bezeichnen und Tags, die Zweige bezeichnen. Die ersteren sind statisch und fest an eine Revision gebunden. Ein Tag, das einen Zweig bezeichnet, bezieht sich dagegen zu einem gegebenen Zeitpunkt immer auf die aktuellste Revision. Da ein Tag eines Zweiges nicht an eine bestimmte Revision gebunden ist, kann sich dessen Bedeutung von heute auf morgen ändern. zählt für Benutzer relevante Tags auf. Wenn Sie in der Konfigurationsdatei ein Tag, wie RELENG_4, angeben, müssen Sie diesem tag= vorstellen: tag=RELENG_4. Denken Sie daran, dass es für die Ports-Sammlung nur tag=. gibt. Achten Sie darauf, dass Sie den Namen eines Tags richtig angeben. CVSup kann nicht zwischen richtigen und falschen Tags unterscheiden. Wenn Sie sich bei der Angabe eines Tags vertippen, nimmt CVSup an, Sie hätten ein gültiges Tag angegeben, dem nur keine Dateien zugeordnet sind. Die Folge davon ist, dass Ihre vorhandenen Quellen gelöscht werden. Wenn Sie ein Tag angeben, das sich auf einen Zweig bezieht, erhalten Sie die aktuellsten Revisionen der Dateien auf diesem Zweig. Wenn Sie eine frühere Revision erhalten möchten, können Sie diese im Feld angeben. Einzelheiten dazu finden Sie in der Manualpage von cvsup. Wir möchten gerne &os;-CURRENT beziehen und fügen die folgende Zeile am Anfang der Konfigurationsdatei ein: *default tag=. Eine wichtige Ausnahme ist wenn Sie weder ein tag=-Feld noch ein date=-Feld angeben. In diesem Fall erhalten Sie anstelle einer speziellen Revision die wirklichen RCS-Dateien aus dem CVS-Repository des Servers. Diese Vorgehensweise wird von Entwicklern bevorzugt, da sie mit einem eigenen Repository leicht die Entwicklungsgeschichte und Veränderungen von Dateien verfolgen können. Dieser Vorteil muss allerdings mit sehr viel Plattenplatz bezahlt werden. Woher sollen die Dateien bezogen werden? Im host=-Feld wird angegeben, woher cvsup die Dateien holen soll. Sie können hier jeden der CVSup-Spiegel angeben, doch sollten Sie einen Server in Ihrer Nähe auswählen. Für dieses Beispiel wollen wir den erfundenen Server cvsup99.FreeBSD.org verwenden: *default host=cvsup99.FreeBSD.org Bevor Sie CVSup laufen lassen, sollten Sie hier einen existierenden Server einsetzen. Den zu verwendenden Server können Sie auf der Kommandozeile mit überschreiben. Wo sollen die Dateien gespeichert werden? Im prefix=-Feld teilen Sie cvsup mit, wo die Dateien gespeichert werden sollen. In diesem Beispiel werden wir die Quelldateien direkt im Verzeichnisbaum für Quellen /usr/src ablegen. Das Verzeichnis src ist schon in der Sammlung, die wir beziehen enthalten, so dass wir die folgende Zeile angeben: *default prefix=/usr Wo sollen die Statusinformationen von cvsup gespeichert werden? cvsup legt in einem Verzeichnis Statusinformationen ab, die festhalten, welche Versionen schon empfangen wurden. Wir verwenden das Verzeichnis /var/db: *default base=/var/db Wenn das Verzeichnis für die Statusinformationen nicht existiert, sollten Sie es jetzt anlegen, da cvsup ohne dieses Verzeichnis nicht startet. Verschiedene Einstellungen: Eine weitere Zeile sollte normalerweise in jedem supfile sein: *default release=cvs delete use-rel-suffix compress Mit release=cvs wird angegeben, dass der Server das &os;-Haupt-Repository abfragen soll, was praktisch immer der Fall ist (die Ausnahmen werden in diesem Text nicht diskutiert). delete erlaubt es CVSup, Dateien zu löschen. Diese Option sollten Sie immer angeben, damit CVSup Ihren Quellbaum auch wirklich aktuell halten kann. CVSup löscht nur Dateien für die es auch verantwortlich ist. Andere Dateien, die sich in einem Baum unter Kontrolle von CVSup befinden, werden nicht verändert. Wenn Sie wirklich etwas über das obskure use-rel-suffix erfahren wollen, lesen Sie bitte in der Manualpage nach, ansonsten geben Sie es einfach an und vergessen es. Wenn Sie compress angeben, werden Daten auf dem Kommunikationskanal komprimiert. Wenn Sie über eine T1-Leitung oder eine schnellere Netzanbindung verfügen, brauchen Sie diese Option vielleicht nicht. In allen anderen Fällen beschleunigt sie aber den Ablauf. Zusammenfassung: Das vollständige supfile unseres Beispiels sieht nun so aus: *default tag=. *default host=cvsup99.FreeBSD.org *default prefix=/usr *default base=/var/db *default release=cvs delete use-rel-suffix compress src-all Die <filename>refuse</filename> Datei CVSup benutzt die Pull-Methode, das heißt wenn sich ein Client mit einem Server verbindet, erhält er eine Liste der verfügbaren Sammlungen und wählt aus diesen die herunterzuladenden Dateien aus. In der Voreinstellung wählt der Client alle Dateien aus, die zu einer gegebenen Sammlung und zu einem gegebenen Tag passen. Dieses Verhalten ist aber nicht immer erwünscht, besonders wenn Sie die doc, ports oder www Verzeichnisbäume synchronisieren. Die wenigsten Leute beherrschen vier oder fünf Sprachen und benötigen Dateien mit speziellen Anpassungen für eine Sprache. Wenn Sie die Ports-Sammlung synchronisieren, können Sie anstelle von ports-all einzelne Ports, wie ports-astrology oder ports-biology angeben. Die doc und www Verzeichnisbäume verfügen aber nicht über Sammlungen für spezielle Sprachen. In diesem Fall müssen Sie eines der vielen eleganten Merkmale von CVSup benutzen: Die refuse Datei. Mit einer refuse Datei können Sie bestimmte Dateien einer Sammlung von der Übertragung ausschließen. Der Ort der refuse ist base/sup/refuse, wobei base in Ihrem supfile festgelegt wurde. Wir verwenden das Verzeichnis /var/db, der Ort der refuse Datei ist daher /var/db/sup/refuse. Das Format der refuse Datei ist einfach: Sie enthält eine Liste der Dateien und Verzeichnisse, die Sie nicht herunterladen wollen. Wenn Sie zum Beispiel die Dokumentation nicht in anderen Sprachen als Englisch lesen wollen, könnte Ihre refuse-Datei wie folgt aussehen: doc/bn_* doc/da_* doc/de_* doc/el_* doc/es_* doc/fr_* doc/hu_* doc/it_* doc/ja_* doc_mn_* doc/nl_* doc/no_* doc/pl_* doc/pt_* doc/ru_* doc/sr_* doc/tr_* doc/zh_* Die Aufzählung setzt sich für andere Sprachen fort. Eine vollständige Liste finden Sie im &os; CVS Repository. Die refuse Datei spart Anwendern von CVSup, die über eine langsame Internetanbindung verfügen oder deren Internetverbindung zeitlich abgerechnet wird, wertvolle Zeit, da sie Dateien, die sie nicht benötigen, nicht mehr herunterladen müssen. Weitere Informationen zu refuse Dateien und anderen Eigenschaften von CVSup entnehmen Sie bitte der Manualpage. Ausführen von <application>CVSup</application> Wir können nun eine Aktualisierung mit der folgenden Kommandozeile starten: &prompt.root; cvsup supfile supfile gibt dabei das eben erstelle supfile an. Wenn Sie X11 benutzen, wird cvsup ein GUI starten. Drücken Sie go und schauen Sie zu. Das Beispiel aktualisiert die Dateien im Verzeichnisbaum /usr/src. Sie müssen cvsup als root starten, damit Sie die nötigen Rechte haben, die Dateien zu aktualisieren. Sie sind vielleicht ein bisschen nervös weil Sie das Programm zum ersten Mal anwenden und möchten zuerst einmal einen Testlauf durchführen. Legen Sie dazu ein temporäres Verzeichnis an und übergeben es auf der Kommandozeile von cvsup: &prompt.root; mkdir /var/tmp/dest &prompt.root; cvsup supfile /var/tmp/dest Aktualisierungen werden dann nur in dem angegebenen Verzeichnis vorgenommen. CVSup untersucht die Dateien in /usr/src, wird aber keine dieser Dateien verändern. Die veränderten Dateien finden Sie stattdessen in /var/tmp/dest/usr/src. Die Statusdateien von CVSup werden ebenfalls nicht geändert, sondern in dem angegebenen Verzeichnis abgelegt. Wenn Sie Leseberechtigung in /usr/src haben, brauchen Sie das Programm noch nicht einmal unter root laufen zu lassen. Wenn Sie X11 nicht benutzen wollen oder keine GUIs mögen, sollten Sie cvsup wie folgt aufrufen: &prompt.root; cvsup -g -L 2 supfile verhindert den Start des GUIs. Wenn Sie kein X11 laufen haben, passiert das automatisch, ansonsten müssen Sie diesen Schalter angeben. Mit gibt CVSup Einzelheiten zu jeder Aktualisierung aus. Die Wortfülle der Meldungen können Sie von bis einstellen. In der Voreinstellung werden nur Fehlermeldungen ausgegeben. Eine Zusammenfassung der Optionen von CVSup erhalten Sie mit cvsup -H. Genauere Informationen finden Sie in der Manualpage von CVSup. Wenn Sie mit dem Ablauf der Aktualisierung zufrieden sind, können Sie CVSup regelmäßig aus &man.cron.8; ausführen. In diesem Fall sollten Sie natürlich nicht das GUI benutzen. <application>CVSup</application> Sammlungen Die CVSup Sammlungen sind hierarchisch organisiert. Es gibt wenige große Sammlungen, die in kleinere Teilsammlungen unterteilt sind. Wenn Sie eine große Sammlung beziehen, entspricht das dem Beziehen aller Teilsammlungen. Der Hierarchie der Sammlung wird in der folgenden Aufzählung durch Einrückungen dargestellt. Die am häufigsten benutzen Sammlungen sind src-all und ports-all. Die anderen Sammlungen werden von wenigen Leuten zu speziellen Zwecken benutzt und es kann sein, dass diese nicht auf allen Spiegeln zur Verfügung stehen. cvs-all release=cvs Das &os;-Haupt-Repository einschließlich der Kryptographie-Module. distrib release=cvs Dateien, die zum Verteilen und Spiegeln von &os; benötigt werden. doc-all release=cvs Quellen des &os;-Handbuchs und weiterer Dokumentation. Diese Sammlung enthält nicht die &os;-Webseite. ports-all release=cvs Die &os;-Ports-Sammlung. Wenn Sie nicht die gesamte Ports-Sammlung (ports-all) aktualisieren wollen, sondern nur eine der nachstehend aufgeführten Teilsammlungen, aktualisieren Sie immer die Teilsammlung ports-base. Diese Teilsammlung enthält das Bausystem der Ports. Immer wenn ports-base geändert wird, ist es so gut wie sicher, dass diese Änderung auch tatsächlich von einem Port benutzt wird. Der Bau eines Ports, der auf Änderungen im Bausystem angewiesen wird, wird fehlschlagen, wenn das Bausystem noch auf einem alten Stand ist. Aktualisieren Sie vor allen Dingen ports-base, wenn Sie bei einem Bau merkwürdige Fehlermeldungen erhalten und kein aktuelles Bausystem benutzen. Wenn Sie die Datei ports/INDEX selbst erzeugen, brauchen Sie unbedingt die Sammlung ports-all (den ganzen Ports-Baum). Es ist nicht möglich, ports/INDEX nur mit einem Teilbaum zu erstellen. Lesen Sie dazu bitte die FAQ. ports-accessibility release=cvs Werkzeuge für behinderte Benutzer. ports-arabic release=cvs Arabische Sprachunterstützung. ports-archivers release=cvs Werkzeuge zum Archivieren. ports-astro release=cvs Astronomie-Programme. ports-audio release=cvs Audio-Programme. ports-base release=cvs Das Bausystem der Ports-Sammlung. Dazu gehören verschiedene Dateien in den Unterverzeichnissen Mk/ und Tools/ von /usr/ports. Aktualisieren Sie diese Teilsammlung jedes Mal, wenn Sie einen Teil der Ports-Sammlung aktualisieren. Lesen Sie dazu auch den obigen Hinweis zur Ports-Sammlung. ports-benchmarks release=cvs Benchmarks. ports-biology release=cvs Biologie. ports-cad release=cvs Computer Aided Design Werkzeuge. ports-chinese release=cvs Chinesische Sprachunterstützung. ports-comms release=cvs Programme zur Datenkommunikation. ports-converters release=cvs Zeichensatz Konvertierer. ports-databases release=cvs Datenbanken. ports-deskutils release=cvs Sachen, die sich vor dem Computer-Zeitalter auf dem Schreibtisch befanden. ports-devel release=cvs Werkzeuge für Entwickler. ports-dns release=cvs Software für DNS. ports-editors release=cvs Editoren. ports-emulators release=cvs Programme, die andere Betriebssysteme emulieren. ports-finance release=cvs Finanz-Anwendungen. ports-ftp release=cvs Werkzeuge für FTP Clients und Server. ports-games release=cvs Spiele. ports-german release=cvs Deutsche Sprachunterstützung. ports-graphics release=cvs Graphik-Programme. ports-hebrew release=cvs Hebräische Sprachunterstützung. ports-hungarian release=cvs Ungarische Sprachunterstützung. ports-irc release=cvs Internet Relay Chat Werkzeuge. ports-japanese release=cvs Japanische Sprachunterstützung. ports-java release=cvs &java; Werkzeuge. ports-korean release=cvs Koreanische Sprachunterstützung. ports-lang release=cvs Programmiersprachen. ports-mail release=cvs E-Mail Programme. ports-math release=cvs Programme zur numerischen Mathematik. ports-mbone release=cvs MBone Anwendungen. ports-misc release=cvs Verschiedene Werkzeuge. ports-multimedia release=cvs Multimedia-Anwendungen. ports-net release=cvs Netzwerk-Programme. ports-net-im release=cvs Diverse Instant-Messenger. ports-net-mgmt release=cvs Software zum Verwalten von Netzwerken. ports-net-p2p release=cvs Software für die Nutzung von Peer-to-Peer-Netzwerken. ports-news release=cvs USENET News Werkzeuge. ports-palm release=cvs Programme für den Palm. ports-polish release=cvs Polnische Sprachunterstützung. ports-ports-mgmt release=cvs Werkzeuge zum Management von Ports und Paketen. ports-portuguese release=cvs Portugiesische Sprachunterstützung. ports-print release=cvs Druckprogramme. ports-russian release=cvs Russische Sprachunterstützung. ports-science release=cvs Wissenschaft. ports-security release=cvs Werkzeuge zum Thema Sicherheit. ports-shells release=cvs Kommandozeilen-Shells. ports-sysutils release=cvs System-Werkzeuge. ports-textproc release=cvs Programme zur Textverarbeitung (ohne Desktop Publishing). ports-ukrainian release=cvs Ukrainische Sprachunterstützung. ports-vietnamese release=cvs Vietnamesische Sprachunterstützung. ports-www release=cvs Software rund um das World Wide Web. ports-x11 release=cvs X-Window Programme. ports-x11-clocks release=cvs X11-Uhren. ports-x11-drivers release=cvs X11-Treiber. ports-x11-fm release=cvs X11-Dateiverwalter. ports-x11-fonts release=cvs X11-Zeichensätze und Werkzeuge dazu. ports-x11-toolkits release=cvs X11-Werkzeuge. ports-x11-servers release=cvs X11-Server. ports-x11-themes release=cvs X11-Themes. ports-x11-wm release=cvs X11-Fensterverwalter. projects-all release=cvs Quelltexte der verschiedenen &os;-Projekte. src-all release=cvs Die &os;-Quellen einschließlich der Kryptographie-Module. src-base release=cvs Verschiedene Dateien unter /usr/src. src-bin release=cvs Benutzer-Werkzeuge die im Einzelbenutzermodus gebraucht werden (/usr/src/bin). src-cddl release=cvs Werkzeuge und Bibliotheken, die der CDDL-Lizenz unterliegen (/usr/src/cddl). src-contrib release=cvs Werkzeuge und Bibliotheken, die nicht aus dem &os; Project stammen und wenig verändert übernommen werden. (/usr/src/contrib). src-crypto release=cvs Kryptographische Werkzeuge und Bibliotheken, die nicht aus dem &os; Project stammen und wenig verändert übernommen werden. (/usr/src/crypto). src-eBones release=cvs Kerberos und DES (/usr/src/eBones). Wird in aktuellen Releases von &os; nicht benutzt. src-etc release=cvs Konfigurationsdateien des Systems (/usr/src/etc). src-games release=cvs Spiele (/usr/src/games). src-gnu release=cvs Werkzeuge, die unter der GNU Public License stehen (/usr/src/gnu). src-include release=cvs Header Dateien (/usr/src/include). src-kerberos5 release=cvs Kerberos5 (/usr/src/kerberos5). src-kerberosIV release=cvs KerberosIV (/usr/src/kerberosIV). src-lib release=cvs Bibliotheken (/usr/src/lib). src-libexec release=cvs Systemprogramme, die von anderen Programmen ausgeführt werden (/usr/src/libexec). src-release release=cvs Dateien, die zum Erstellen eines &os; Releases notwendig sind (/usr/src/release). src-rescue release=cvs Statisch gelinkte Programme zur Wiederherstellung eines defekten Systems. Lesen Sie dazu auch die Manualpage &man.rescue.8; (/usr/src/rescue). src-sbin release=cvs Werkzeuge für den Einzelbenutzermodus (/usr/src/sbin). src-secure release=cvs Kryptographische Bibliotheken und Befehle (/usr/src/secure). src-share release=cvs Dateien, die von mehreren Systemen gemeinsam benutzt werden können (/usr/src/share). src-sys release=cvs Der Kernel (/usr/src/sys). src-sys-crypto release=cvs Kryptographie Quellen des Kernels (/usr/src/sys/crypto). src-tools release=cvs Verschiedene Werkzeuge zur Pflege von &os; (/usr/src/tools). src-usrbin release=cvs Benutzer-Werkzeuge (/usr/src/usr.bin). src-usrsbin release=cvs System-Werkzeuge (/usr/src/usr.sbin). www release=cvs Die Quellen der &os;-WWW-Seite. distrib release=self Die Konfigurationsdateien des CVSup Servers. Diese werden von den CVSup benutzt. gnats release=current Die GNATS Datenbank, in der Problemberichte verwaltet werden. mail-archive release=current Das Archiv der &os;-Mailinglisten. www release=current Die formatierten Dateien der &os;-WWW-Seite (nicht die Quellen). Diese werden von den WWW-Spiegeln benutzt. Weiterführende Informationen Die CVSup FAQ und weitere Informationen über CVSup finden Sie auf The CVSup Home Page. &os; spezifische Diskussionen über CVSup finden auf der Mailingliste &a.hackers; statt. Dort und auf der Liste &a.announce; werden neue Versionen von CVSup angekündigt. Bei Fragen und Problemberichten zu CVSup lesen Sie bitte die CVSup FAQ. CVSup-Server Die folgende Aufzählung enthält CVSup Server für &os;: &chap.mirrors.cvsup.inc; CVS-Tags Wenn Sie Quellen mit CVS oder CVSup erhalten oder aktualisieren wollen, müssen Sie ein Tag angeben. Ein Tag kann einen bestimmten &os;-Zweig oder einen bestimmten Zeitpunkt (Release-Tag) bestimmen. Tags für Zweige Mit Ausnahme von HEAD (das immer ein gültiges Tag ist), können die folgenden Tags nur im src/-Quellbaum verwendet werden. Die Quellbäume ports/, doc/ und www/ sind nicht verzweigt. HEAD Symbolischer Name für den Hauptzweig, auch &os.current; genannt. Dies ist die Vorgabe, wenn keine Revision angegeben wird. In CVSup wird dieses Tag mit einem . (Punkt) bezeichnet. In CVS ist das die Vorgabe, wenn Sie kein Tag oder eine Revision angeben. Außer Sie wollen einen -STABLE Rechner auf -CURRENT aktualisieren, ist es nicht ratsam, die -CURRENT Quellen auf einem -STABLE Rechner einzuspielen. RELENG_8 Der Entwicklungszweig für &os;-8.X, auch bekannt als &os; 8-STABLE. RELENG_8_0 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 8.0 durchgeführt werden. RELENG_7 Der Entwicklungszweig für &os;-7.X, auch als &os; 7-STABLE bekannt. + + + RELENG_7_3 + + + Der Zweig, auf dem sicherheitsrelevante oder kritische + Fehlerbehebungen für &os; 7.3 + durchgeführt werden. + + RELENG_7_2 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 7.2 durchgeführt werden. RELENG_7_1 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 7.1 durchgeführt werden. RELENG_7_0 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 7.0 durchgeführt werden. RELENG_6 Der Entwicklungszweig für &os;-6.X, auch als &os; 6-STABLE bekannt. RELENG_6_4 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 6.4 durchgeführt werden. RELENG_6_3 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 6.3 durchgeführt werden. RELENG_6_2 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 6.2 durchgeführt werden. RELENG_6_1 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 6.1 durchgeführt werden. RELENG_6_0 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 6.0 durchgeführt werden. RELENG_5 Der &os; 5.X Entwicklungszweig, der auch &os; 5-STABLE genannt wird. RELENG_5_5 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 5.5 durchgeführt werden. RELENG_5_4 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 5.4 durchgeführt werden. RELENG_5_3 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 5.3 durchgeführt werden. RELENG_5_2 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 5.2 und &os; 5.2.1 durchgeführt werden. RELENG_5_1 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 5.1 durchgeführt werden. RELENG_5_0 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 5.0 durchgeführt werden. RELENG_4 Der &os; 4.X Entwicklungszweig, der auch &os; 4-STABLE genannt wird. RELENG_4_11 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 4.11 durchgeführt werden. RELENG_4_10 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 4.10 durchgeführt werden. RELENG_4_9 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 4.9 durchgeführt werden. RELENG_4_8 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 4.8 durchgeführt werden. RELENG_4_7 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 4.7 durchgeführt werden. RELENG_4_6 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 4.6 und &os; 4.6.2 durchgeführt werden. RELENG_4_5 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 4.5 durchgeführt werden. RELENG_4_4 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 4.4 durchgeführt werden. RELENG_4_3 Der Zweig, auf dem sicherheitsrelevante oder kritische Fehlerbehebungen für &os; 4.3 durchgeführt werden. RELENG_3 Der &os;-3.X Entwicklungszweig, der auch 3.X-STABLE genannt wird. RELENG_2_2 Der &os;-2.2.X Entwicklungszweig, der auch 2.2-STABLE genannt wird. Release-Tags Diese Tags geben den Zeitpunkt an, an dem eine bestimme &os;-Version veröffentlicht wurde. Das Erstellen einer Release ist in den Dokumenten Release Engineering Information und Release Process beschrieben. Der src-Baum benutzt Tags, deren Namen mit RELENG_ anfangen. Die Bäume ports und doc benutzen Tags, deren Namen mit RELEASE anfangen. Im Baum www werden keine Release-Tags verwendet. RELENG_8_0_0_RELEASE &os; 8.0 + + + RELENG_7_3_0_RELEASE + + + &os; 7.3 + + RELENG_7_2_0_RELEASE &os; 7.2 RELENG_7_1_0_RELEASE &os; 7.1 RELENG_7_0_0_RELEASE &os; 7.0 RELENG_6_4_0_RELEASE &os; 6.4 RELENG_6_3_0_RELEASE &os; 6.3 RELENG_6_2_0_RELEASE &os; 6.2 RELENG_6_1_0_RELEASE &os; 6.1 RELENG_6_0_0_RELEASE &os; 6.0 RELENG_5_5_0_RELEASE &os; 5.5 RELENG_5_4_0_RELEASE &os; 5.4 RELENG_4_11_0_RELEASE &os; 4.11 RELENG_5_3_0_RELEASE &os; 5.3 RELENG_4_10_0_RELEASE &os; 4.10 RELENG_5_2_1_RELEASE &os; 5.2.1 RELENG_5_2_0_RELEASE &os; 5.2 RELENG_4_9_0_RELEASE &os; 4.9 RELENG_5_1_0_RELEASE &os; 5.1 RELENG_4_8_0_RELEASE &os; 4.8 RELENG_5_0_0_RELEASE &os; 5.0 RELENG_4_7_0_RELEASE &os; 4.7 RELENG_4_6_2_RELEASE &os; 4.6.2 RELENG_4_6_1_RELEASE &os; 4.6.1 RELENG_4_6_0_RELEASE &os; 4.6 RELENG_4_5_0_RELEASE &os; 4.5 RELENG_4_4_0_RELEASE &os; 4.4 RELENG_4_3_0_RELEASE &os; 4.3 RELENG_4_2_0_RELEASE &os; 4.2 RELENG_4_1_1_RELEASE &os; 4.1.1 RELENG_4_1_0_RELEASE &os; 4.1 RELENG_4_0_0_RELEASE &os; 4.0 RELENG_3_5_0_RELEASE &os;-3.5 RELENG_3_4_0_RELEASE &os;-3.4 RELENG_3_3_0_RELEASE &os;-3.3 RELENG_3_2_0_RELEASE &os;-3.2 RELENG_3_1_0_RELEASE &os;-3.1 RELENG_3_0_0_RELEASE &os;-3.0 RELENG_2_2_8_RELEASE &os;-2.2.8 RELENG_2_2_7_RELEASE &os;-2.2.7 RELENG_2_2_6_RELEASE &os;-2.2.6 RELENG_2_2_5_RELEASE &os;-2.2.5 RELENG_2_2_2_RELEASE &os;-2.2.2 RELENG_2_2_1_RELEASE &os;-2.2.1 RELENG_2_2_0_RELEASE &os;-2.2.0 AFS-Server Die folgende Aufzählung enthält AFS Server für &os;: Schweden Die Dateien sind unter dem Pfad /afs/stacken.kth.se/ftp/pub/FreeBSD/ erreichbar. stacken.kth.se # Stacken Computer Club, KTH, Sweden 130.237.234.43 #hot.stacken.kth.se 130.237.237.230 #fishburger.stacken.kth.se 130.237.234.3 #milko.stacken.kth.se Betreuer ftp@stacken.kth.se rsync-Server rsync wird ähnlich wie &man.rcp.1; verwendet, besitzt aber mehr Optionen und verwendet das rsync remote-update Protokoll, das nur geänderte Dateien überträgt und damit viel schneller als ein normaler Kopiervorgang ist. rsync ist sehr nützlich, wenn Sie einen &os;-FTP-Spiegel oder einen CVS-Spiegel betreiben. Das Programm ist für viele Betriebssysteme erhältlich, mit &os; können Sie den Port net/rsync oder das fertige Paket benutzen. Die folgenden Server stellen &os; über das rsync Protokoll zur Verfügung: Großbritannien rsync://rsync.mirrorservice.org/ Verfügbare Sammlungen: sites/ftp.freebsd.org: Kompletter Spiegel des &os;-FTP-Servers. Niederlande rsync://ftp.nl.FreeBSD.org/ Verfügbare Sammlungen: &os;: Kompletter Spiegel des &os;-FTP-Servers. Russland rsync://ftp.mtu.ru/ Verfügbare Sammlungen: &os;: Kompletter Spiegel des &os;-FTP-Servers. &os;-gnats: Die GNATS-Datenbank zur Verwaltung von Problemberichten. &os;-Archive: Ein Spiegel des &os;-Archive-FTP-Servers. Taiwan rsync://ftp.tw.FreeBSD.org/ rsync://ftp2.tw.FreeBSD.org/ rsync://ftp6.tw.FreeBSD.org/ Verfügbare Sammlungen: &os;: Kompletter Spiegel des &os;-FTP-Servers. Tschechische Republik rsync://ftp.cz.FreeBSD.org/ Verfügbare Sammlungen: ftp: Unvollständiger Spiegel des &os;-FTP-Servers. &os;: Vollständiger Spiegel des &os;-FTP-Servers. USA rsync://ftp-master.FreeBSD.org/ Dieser Server darf nur von primären Spiegeln benutzt werden. Verfügbare Sammlungen: &os;: Das Hauptarchiv des &os; FTP Servers. acl: Die primäre ACL-Liste. rsync://ftp13.FreeBSD.org/ Verfügbare Sammlungen: &os;: Kompletter Spiegel des &os;-FTP-Servers.
diff --git a/de_DE.ISO8859-1/books/handbook/security/chapter.sgml b/de_DE.ISO8859-1/books/handbook/security/chapter.sgml index 78aee98636..a21d11195e 100644 --- a/de_DE.ISO8859-1/books/handbook/security/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/security/chapter.sgml @@ -1,5313 +1,4785 @@ Matthew Dillon Viel von diesem Kapitel stammt aus der security(7) Manualpage von Martin Heinen Übersetzt von Sicherheit Sicherheit Übersicht Dieses Kapitel bietet eine Einführung in die Konzepte der Systemsicherheit. Neben einigen Daumenregeln werden weiterführende Themen wie S/Key, OpenSSL und Kerberos diskutiert. Die meisten der hier besprochenen Punkte treffen sowohl auf die Systemsicherheit sowie die Internetsicherheit zu. Das Internet hat aufgehört ein friedlicher Ort zu sein, an dem Sie nur nette Leute finden werden. Es ist unumgänglich, dass Sie Ihre Daten, Ihr geistiges Eigentum, Ihre Zeit und vieles mehr vor dem Zugriff von Hackern schützen. &os; besitzt eine Reihe von Werkzeugen und Mechanismen, um die Integrität und die Sicherheit Ihrer Systeme und Netzwerke zu gewährleisten. - Nach dem Sie dieses Kapitel durchgearbeitet haben, werden + Nachdem Sie dieses Kapitel durchgearbeitet haben, werden Sie: Grundlegende auf &os; bezogene Sicherheitsaspekte kennen. Die verschiedenen Verschlüsselungsmechanismen von &os;, wie DES oder MD5, kennen. Wissen, wie Sie ein Einmalpasswörter zur Authentifizierung verwenden. TCP-Wrapper für inetd einrichten können. Wissen, wie Sie KerberosIV vor 5.0-Release einrichten. Wissen, wie Sie Kerberos5 unter &os; einrichten. Firewalls mit IPFW erstellen können. Wissen, wie Sie IPsec konfigurieren und ein VPN zwischen &os;/&windows; Systemen einrichten, OpenSSH, &os;s Implementierung von SSH, konfigurieren und benutzen können. Portaudit anwenden können, um Softwarepakete Dritter, die Sie über die Ports-Sammlung installieren, auf bekannte Sicherheitslücken hin zu überprüfen. Mit &os;-Sicherheitshinweisen umgehen können. Eine Vorstellung davon haben, was Prozessüberwachung (Process Accounting) ist und wie Sie diese Funktion unter &os; aktivieren können. Bevor Sie dieses Kapitel lesen, sollten Sie Grundlegende Konzepte von &os; und dem Internet verstehen. Dieses Buch behandelt weitere Sicherheitsthemen. Beispielsweise werden vorgeschriebene Zugriffskontrollen in und Firewalls in besprochen. Einführung Sicherheit ist ein Konzept, das beim Systemadministrator anfängt und aufhört. Obwohl alle BSD &unix; Mehrbenutzersysteme über Sicherheitsfunktionen verfügen, ist es wohl eine der größten Aufgaben eines Systemadministrators zusätzliche Sicherheitsmechanismen zu erstellen und zu pflegen. Maschinen sind nur so sicher wie sie gemacht werden und Sicherheitsanforderungen stehen oft der Benutzerfreundlichkeit entgegen. Auf &unix; Systemen können sehr viele Prozesse gleichzeitig laufen und viele dieser Prozesse sind Server, das heißt von außen kann auf sie zugegriffen werden. In einer Zeit, in der die Minicomputer und Mainframes von gestern die Desktops von heute sind und Rechner immer mehr vernetzt werden, kommt der Sicherheit eine große Bedeutung zu. Zur Systemsicherheit gehört auch die Beschäftigung mit verschiedenen Arten von Angriffen, auch solchen, die versuchen, ein System still zu legen, oder sonst unbrauchbar zu machen ohne root zu kompromittieren. Sicherheitsaspekte lassen sich in mehrere Kategorien unterteilen: Denial-of-Service Angriffe. Kompromittierte Accounts. Kompromittierter root-Account durch zugreifbare Server. Kompromittierter root-Account durch kompromittierte Accounts. Einrichten von Hintertüren. DoS Angriffe Denial-of-Service (DoS) Sicherheit DoS Angriffe Denial-of-Service (DoS) Denial-of-Service (DoS) Ein Denial-of-Service (Verhinderung von Diensten, DoS) Angriff entzieht einer Maschine Ressourcen, die sie zur Bereitstellung von Diensten benötigt. Meist versuchen Denial-of-Service Angriffe die Dienste oder den Netzwerkstack einer Maschine zu überlasten, um so die Maschine auszuschalten oder nicht nutzbar zu machen. Einige Angriffe versuchen, Fehler im Netzwerkstack auszunutzen, und die Maschine mit einem einzigen Paket auszuschalten. Diese Art des Angriffs kann nur verhindert werden, indem der entsprechende Fehler im Kernel behoben wird. Oft können Angriffe auf Dienste durch die Angabe von Optionen verhindert werden, die die Last, die ein Dienst auf das System unter widrigen Umständen ausüben kann, begrenzt. Angriffen auf das Netzwerk ist schwerer zu begegnen. Außer durch Trennen der Internetverbindung ist zum Beispiel einem Angriff mit gefälschten Paketen nicht zu begegnen. Diese Art von Angriff wird Ihr System zwar nicht unbrauchbar machen, kann aber die Internetverbindung sättigen. Sicherheit kompromittierte Accounts Kompromittierte Accounts kommen noch häufiger als DoS Angriffe vor. Viele Systemadministratoren lassen auf ihren Maschinen noch die Dienste telnetd, rlogind, rshd und ftpd laufen. Verbindungen zu diesen Servern werden nicht verschlüsselt. Wenn Sie eine größere Benutzerzahl auf Ihrem System haben, die sich von einem entfernten System anmelden, ist die Folge davon, dass das Passwort eines oder mehrerer Benutzer ausgespäht wurde. Ein aufmerksamer Systemadministrator wird die Logs über Anmeldungen von entfernten Systemen auf verdächtige Quelladressen, auch für erfolgreiche Anmeldungen, untersuchen. Es ist immer davon auszugehen, dass ein Angreifer, der Zugriff auf einen Account hat, Zugang zum root-Account erlangt. Allerdings gibt der Zugriff auf einen Account auf einem gut gesicherten und gepflegten System nicht notwendig Zugriff auf den root-Account. Diese Unterscheidung ist wichtig, da ein Angreifer, der keinen Zugang zu root besitzt, seine Spuren nicht verwischen kann. Er kann höchstens die Dateien des betreffenden Benutzers verändern oder die Maschine stilllegen. Kompromittierte Accounts sind sehr häufig, da Benutzer meist nicht dieselben Vorsichtsmaßnahmen wie Administratoren treffen. Sicherheit Hintertüren Es gibt viele Wege, Zugang zum root-Account eines Systems zu bekommen: Ein Angreifer kann das Passwort von root kennen, er kann einen Fehler in einem Server entdecken, der unter root läuft und dann über eine Netzwerkverbindung zu diesem Server einbrechen. Oder er kennt einen Fehler in einem SUID-root Programm, der es ihm erlaubt, root zu werden, wenn er einmal einen Account kompromittiert hat. Wenn ein Angreifer einen Weg gefunden hat, root zu werden, braucht er vielleicht keine Hintertür auf dem System installieren. Viele der heute bekannten und geschlossenen Sicherheitslöcher, die zu einem root Zugriff führen, verlangen vom Angreifer einen erheblichen Aufwand, um seine Spuren zu verwischen. Aus diesem Grund wird er sich wahrscheinlich entschließen, eine Hintertür (engl. Backdoor) zu installieren. Eine Hintertür erlaubt es dem Angreifer leicht auf den root-Account zuzugreifen. Einem klugen Systemadministrator erlaubt sie allerdings auch, den Einbruch zu entdecken. Wenn Sie es einem Angreifer verwehren, Hintertüren zu installieren, kann das schädlich für Ihre Sicherheit sein, da es vielleicht verhindert, dass die Lücke, die der Angreifer für den Einbruch ausgenutzt hat, entdeckt wird. Sicherheitsmaßnahmen sollten immer in mehreren Schichten angelegt werden. Die Schichten können wie folgt eingeteilt werden: Absichern von root und Accounts. Absichern von unter root laufenden Servern und SUID/SGID Programmen. Absichern von Accounts. Absichern der Passwort-Datei. Absichern des Kernels, der Geräte und von Dateisystemen. Schnelles Aufdecken von unbefugten Veränderungen des Systems. Paranoia. Die einzelnen Punkte der obigen Liste werden im nächsten Abschnitt genauer behandelt. Absichern von &os; Sicherheit &os; absichern Kommandos und Protokolle In diesem Abschnitt werden Anwendungen fett gekennzeichnet, spezifische Kommandos werden in einer Fixschrift dargestellt und Protokolle verwenden die normale Schriftart. Diese typographische Konvention hilft, Begriffe wie ssh zu unterscheiden, die sowohl Protokoll als auch Kommando sein können. Die folgenden Abschnitte behandeln die im letzten Abschnitt erwähnten Methoden Ihr &os;-System zu sichern. Absichern von <username>root</username> und Accounts su Zuallererst, kümmern Sie sich nicht um die Absicherung von Accounts, wenn Sie root noch nicht abgesichert haben. Auf den meisten Systemen ist root ein Passwort zugewiesen. Sie sollten immer davon ausgehen, dass dieses Passwort kompromittiert ist. Das heißt nicht, dass Sie das Passwort entfernen sollten, da es meist für den Konsolenzugriff notwendig ist. Vielmehr heißt es, dass Sie das Passwort nicht außerhalb der Konsole, auch nicht zusammen mit &man.su.1;, verwenden sollten. Stellen Sie sicher, dass Ihre PTYs in ttys als unsicher markiert sind und damit Anmeldungen von root mit telnet oder rlogin verboten sind. Wenn Sie andere Anwendungen wie SSH zum Anmelden benutzen, vergewissern Sie sich, dass dort ebenfalls Anmeldungen als root verboten sind. Für SSH editieren Sie /etc/ssh/sshd_config und überprüfen, - dass PermitRootLogin auf NO + dass PermitRootLogin auf no gesetzt ist. Beachten Sie jede Zugriffsmethode – Dienste wie FTP werden oft vergessen. Nur an der Systemkonsole sollte ein direktes Anmelden als root möglich sein. wheel Natürlich müssen Sie als Systemadministrator root-Zugriff erlangen können. Dieser sollte aber durch zusätzliche Passwörter geschützt sein. Ein Weg, Zugang zu root zu ermöglichen, ist es, berechtigte Mitarbeiter in /etc/group in die Gruppe wheel aufzunehmen. Die Personen, die Mitglieder in der Gruppe wheel sind, können mit su zu root wechseln. Ihre Mitarbeiter sollten niemals die Gruppe wheel als primäre Gruppe in /etc/passwd besitzen. Mitarbeiter sollten der Gruppe staff angehören und über /etc/group in wheel aufgenommen werden. Es sollten auch nur die Mitarbeiter, die wirklich root Zugriff benötigen in wheel aufgenommen werden. Mit anderen Authentifizierungsmethoden müssen Sie niemanden in wheel aufnehmen. Wenn Sie z.B. Kerberos benutzen, wechseln Sie mit &man.ksu.1; zu root und der Zugriff wird mit der Datei .k5login geregelt. Dies ist vielleicht eine bessere Lösung, da es der wheel-Mechanismus einem Angreifer immer noch möglich macht, den root-Account zu knacken, nachdem er einen Mitarbeiter-Account geknackt hat. Obwohl der wheel-Mechanismus besser als gar nichts ist, ist er nicht unbedingt die sicherste Lösung. Um ein Konto komplett zu sperren, verwenden Sie den Befehl &man.pw.8;: &prompt.root;pw lock staff Danach ist es diesem Benutzer nicht mehr möglich (auch nicht mit &man.ssh.1;), sich anzumelden. Eine weitere Möglichkeit, bestimmte Benutzer zu sperren, ist es, das verschlüsselte Passwort durch das Zeichen * zu ersetzen. Da ein verschlüsseltes Passwort niemals diesem Zeichen entsprechen kann, kann sich der betroffene Benutzer ebenfalls nicht mehr anmelden. Beispielsweise müsste dazu das Konto foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh wie folgt abgeändert werden: foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh Durch diese Änderung wird der Benutzer foobar daran gehindert, sich auf konventionellem Wege am System anzumelden. Diese Maßnahmen greifen allerdings nicht, wenn das betroffene System auch eine Anmeldung über Kerberos oder &man.ssh.1; erlaubt. Diese Sicherheitsmechanismen setzen voraus, dass Sie sich von einer restriktiven Maschine auf einer weniger restriktiven Maschine anmelden. Wenn zum Beispiel auf Ihrem Hauptrechner alle möglichen Arten von Servern laufen, so sollten auf Ihrer Workstation keine Server laufen. Um Ihre Workstation vernünftig abzusichern, sollten auf Ihr so wenig Server wie möglich bis hin zu keinem Server laufen. Sie sollten zudem über einen Bildschirmschoner verfügen, der mit einem Passwort gesichert ist. Natürlich kann ein Angreifer, der physikalischen Zugang zu einer Maschine hat, jede Art von Sicherheitsmechanismen umgehen. Dieses Problem sollten Sie daher auch in Ihren Überlegungen berücksichtigen. Beachten Sie dabei aber, dass der Großteil der Einbrüche über das Netzwerk erfolgt und die Einbrecher keinen Zugang zu der Maschine besitzen. KerberosIV Mit Kerberos können Sie das Passwort eines Mitarbeiters an einer Stelle ändern und alle Maschinen, auf denen der Mitarbeiter einen Account hat, beachten die Änderung sofort. Wird der Account eines Mitarbeiters einmal kompromittiert, so sollte die Fähigkeit, das Passwort mit einem Schlag auf allen Maschinen zu ändern, nicht unterschätzt werden. Mit einzelnen Passwörtern wird es schwierig, das Passwort auf N Maschinen zu ändern. Mit Kerberos können Sie auch Beschränkungen für Passwörter festlegen: Nicht nur das Ticket kann nach einiger Zeit ungültig werden, Sie können auch festlegen, dass ein Benutzer nach einer bestimmten Zeit, z.B. nach einem Monat, das Passwort wechseln muss. Absichern von unter <username>root</username> laufenden Servern und SUID/SGID Programmen ntalk comsat finger Sandkästen sshd telnetd rshd rlogind Ein kluger Systemadministrator lässt nur die Dienste, die er wirklich braucht, laufen; nicht mehr und auch nicht weniger. Beachten Sie, dass Server von Dritten die fehleranfälligsten sind. Wenn Sie z.B. eine alte Version von imapd oder popper laufen lassen, ist das so, als würden Sie der ganzen Welt freien Zugang zu root geben. Lassen Sie keine Server laufen, die Sie vorher nicht genau überprüft haben. Viele Server müssen nicht unter root laufen, zum Beispiel können ntalk, comsat und finger in speziellen Sandkästen unter einem Benutzer laufen. Ein Sandkasten ist keine perfekte Lösung, wenn Sie nicht eine Menge Arbeit in die Konfiguration investieren, doch bewährt sich hier das Prinzip, die Sicherheit in Schichten aufzubauen. Wenn es einem Angreifer gelingt, in einen Server, der in einem Sandkasten läuft, einzubrechen, dann muss er immer noch aus dem Sandkasten selber ausbrechen. Je mehr Schichten der Angreifer zu durchbrechen hat, desto kleiner sind seine Aussichten auf Erfolg. In der Vergangenheit wurden praktisch in jedem Server, der unter root läuft, Lücken gefunden, die zu einem root Zugriff führten. Dies betrifft selbst die grundlegenden Systemdienste. Wenn Sie eine Maschine betreiben, auf der man sich nur mit SSH anmelden kann, dann stellen Sie die Dienste telnetd, rshd oder rlogind ab! In der Voreinstellung laufen unter &os; ntalkd, comsat und finger nun in einem Sandkasten. Ein weiteres Programm, das in einem Sandkasten laufen sollte, ist &man.named.8;. In /etc/defaults/rc.conf sind die notwendigen Argumente, um named in einem Sandkasten laufen zu lassen, in kommentierter Form schon enthalten. Abhängig davon, ob Sie ein neues System installieren oder ein altes System aktualisieren, sind die hierfür benötigten Benutzer noch nicht installiert. Ein kluger Systemadministrator sollte immer nach Möglichkeiten suchen, Server in einem Sandkasten laufen zu lassen. sendmail Einige Server wie sendmail, popper, imapd und ftpd werden normalerweise nicht in Sandkästen betrieben. Zu einigen Servern gibt es Alternativen, aber diese wollen Sie vielleicht wegen der zusätzlich nötigen Arbeit nicht installieren (ein weiteres Beispiel für den Widerspruch zwischen Sicherheit und Benutzerfreundlichkeit). In diesem Fall müssen Sie die Server unter root laufen lassen und auf die eingebauten Mechanismen vertrauen, Einbrüche zu entdecken. Weitere potentielle Löcher, die zu einem root-Zugriff führen können, sind die auf dem System installierten SUID- und SGID-Programme. Die meisten dieser Programme wie rlogin stehen - in /bin, /sbin, - /usr/bin, oder /usr/sbin. + in /bin, + /sbin, + /usr/bin, oder + /usr/sbin. Obwohl nichts 100% sicher ist, können Sie davon ausgehen, dass die SUID- und SGID-Programme des Basissystems ausreichend sicher sind. Allerdings werden ab und an in diesen Programmen Löcher gefunden. 1998 wurde in Xlib ein Loch gefunden, das xterm, der normal mit SUID installiert wird, verwundbar machte. Es ist besser auf der sicheren Seite zu sein, als sich später zu beklagen, darum wird ein kluger Systemadministrator den Zugriff auf SUID-Programme mit einer Gruppe, auf die nur Mitarbeiter zugreifen können, beschränken. SUID-Programme, die niemand benutzt, sollten mit chmod 000 deaktiviert werden. Zum Beispiel braucht ein Server ohne Bildschirm kein xterm Programm. SGID-Programme sind vergleichbar gefährlich. Wenn ein Einbrecher Zugriff auf SGID-kmem Programm erhält, kann er vielleicht /dev/kmem und damit die verschlüsselte Passwortdatei lesen. Dies kompromittiert unter Umständen jeden Account, der mit einem Passwort geschützt ist. Alternativ kann ein Einbrecher, der in die Gruppe kmem eingebrochen ist, die Tastendrücke auf PTYs verfolgen. Dies schließt auch PTYs mit ein, auf denen sich ein Benutzer mit sicheren Methoden anmeldet. Ein Einbrecher, der Zugriff auf die tty Gruppe hat, kann auf fast jeden Terminal anderer Benutzer schreiben. Wenn der Benutzer einen Terminal-Emulator benutzt, der über eine Tastatur-Simulation verfügt, könnte der Angreifer Daten generieren, die den Terminal veranlassen, ein Kommando unter diesem Benutzer laufen zu lassen. Absichern von Accounts Accounts sind für gewöhnlich sehr schwierig abzusichern. Während Sie drakonische Beschränkungen für Ihre Mitarbeiter einrichten und deren Passwörter als ungültig markieren können, werden Sie das vielleicht bei den normalen Accounts nicht durchsetzen. Wenn Sie über ausreichend Macht verfügen, gelingt es Ihnen vielleicht doch, ansonsten müssen Sie diese Accounts aufmerksam überwachen. Wegen der zusätzlichen Administrationsarbeit und der nötigen technischen Unterstützung ist die Verwendung von SSH und Kerberos mit normalen Accounts erschwert, obwohl das natürlich sicherer als die Verwendung von verschlüsselten Passwörtern ist. Absichern der Passwort-Datei Der einzig sichere Weg ist, so viele Accounts wie möglich als ungültig zu markieren und SSH oder Kerberos zu benutzen, um auf sie zuzugreifen. Obwohl die Datei /etc/spwd.db, die die verschlüsselten Passwörter enthält, nur von root gelesen werden kann, mag ein Angreifer lesenden Zugriff auf diese Datei erlangen, ohne die Fähigkeit sie auch zu beschreiben. Ihre Überwachungsskripten sollten Änderungen an der Passwort-Datei melden (siehe Überprüfen der Integrität von Dateien weiter unten). Absichern des Kernels, der Geräte und von Dateisystemen Wenn ein Angreifer root-Zugriff erlangt, kann er so ziemlich alles mit Ihrem System anstellen, doch sollten Sie es ihm nicht zu leicht machen. Die meisten modernen Kernel haben zum Beispiel einen Gerätetreiber, der es erlaubt, Pakete abzuhören. Unter &os; wird das Gerät bpf genannt. Für gewöhnlich wird ein Angreifer versuchen, dieses Gerät zu nutzen, um Pakete abzuhören. Sie sollten ihm diese Gelegenheit nicht geben und auf den meisten Systemen ist das Gerät bpf nicht nötig. sysctl Auch wenn Sie bpf nicht verwenden, müssen Sie sich immer noch um /dev/mem und /dev/kmem sorgen. Außerdem kann der Angreifer immer noch auf die rohen Geräte (raw devices) schreiben. Weiterhin gibt es ein Programm zum Nachladen von Modulen in den Kernel: &man.kldload.8;. Ein unternehmungslustiger Angreifer kann dies benutzen, um sein eigenes bpf oder ein anderes zum Abhören - geeignetes Gerät in den laufenden Kernel einzubringen. Um diese - Probleme zu vermeiden, müssen Sie den Kernel auf einer - höheren Sicherheitsstufe, mindestens 1, - laufen lassen. Die Sicherheitsstufe wird durch die Variable - kern.securelevel, die mit sysctl - gesetzt werden kann, angegeben. Nachdem Sie die Sicherheitsstufe - auf 1 gesetzt haben, sind schreibende Zugriffe - auf rohe Geräte verboten und die speziellen - chflags Optionen, wie schg - werden erzwungen. Sie müssen sicherstellen, dass die - schg Option auf allen kritischen Programmen, - Verzeichnissen und Skripten, die bis zum Setzen der Option laufen, - aktiviert ist. Das mag übertrieben sein da eine Migration - des Systems erschwert wird, wenn Sie auf einer höheren - Sicherheitsstufe arbeiten. Sie können einen Kompromiss - erreichen, indem Sie das System auf einer erhöhten - Sicherheitsstufe laufen lassen, aber die schg - Option nicht für jede Datei und jedes Verzeichnis auf der Welt - setzen. Eine andere Möglichkeit besteht darin, - / und /usr einfach - schreibgeschützt einzuhängen. Bedenken Sie aber, dass - Sie das Aufdecken eines Einbruchs vielleicht verhindern, wenn - Sie zu drastische Maßnahmen zum Schutz Ihres Systems - verwenden. + geeignetes Gerät in den laufenden Kernel einzubringen. Um + dieses Problem zu vermeiden, müssen Sie den Kernel auf + einem höheren Sicherheitslevel laufen lassen, mindestens + auf securelevel 1. + + Das Securelevel des Kernels kann auf verschiedene Wege + gesetzt werden. Der einfachste Weg ist das erhöhen des + Securelevel des laufenden Kernels durch ein + sysctl der kern.securelevel + Kernel Variablen: + + &prompt.root; sysctl kern.securelevel=1 + + Standardmässig bootet der &os; Kernel mit einem + Securelevel von -1. Der Securelevel wird solange bei -1 bleiben, + bis er entweder durch den Administrator oder von &man.init.8; + durch einen Eintrag im Startup Script verändert wird. Der + Securelevel kann während des Systemstarts durch das Setzen + der Variable kern_securelevel_enable auf + YES und der Wert der Variable + kern_securelevel auf den gewünschten + Securelevel in der /etc/rc.conf + erhöht werden. + + Der Standard Securelevel von einem &os;-System direkt nach + dem Start ist -1. Dies wird insecure mode genannt, + da zum Beispiel unverändeliche Dateiflags abgeschaltet werden + könnten, von allen Geräten gelesen und auf alle geschrieben + werden kann. + + Sobald der Securelevel auf den Wert 1 oder höher gesetzt + ist, werden die append-only und die unveränderlichen Dateien + geschützt, die Flags können nicht abgeschaltet werden + und der Zugriff auf raw Devices ist verboten. Höhere Levels + verbieten mehr Aktionen. Für einen vollständige Liste + aller Securelevels, lesen Sie bitte die &man.security.7; + Manual Seite (oder die Manual Seite von &man.init.8; für + ältere Releases als &os; 7.0). + + + Das Erhöhen des Securelevels auf 1 oder höher + kann einige Probleme mit X11 verursachen (Zugriff auf + /dev/io wird geblockt), ebenso die Installation + von &os; aus den Quellen (der installworld + Teil muss zeitweilig die append-only und die + unveränderlichen Flags einiger Dateien zurücksetzen), + und auch noch in einigen anderen Fällen. Manchmal kann es, + wie bei X11, durch das sehr frühe Starten von &man.xdm.1; + im Boot Prozess möglich sein, dies zu umgehen, wenn der + Securelevel noch niedrig genug ist. + Workarounds wie dieser sind nicht f¨r alle Securelevels + und für alle Einschränkungen, die sie schaffen, + möglich. Ein bisschen Vorausplanung ist eine gute + Idee. Das Verständnis für die Beschränkungen, + die durch jedes Securelevel verursacht werden, ist wichtig, da sie + die einfache Benutzung des Systems verschlechtern. Es vereinfacht + auch die Wahl einer Standardeinstellung und schützt vor + Überraschungen. + + + Wenn das Securelevel des Kernel auf einen Wert von 1 oder + höher gesetzt ist, kann es sinnvoll sein das + schg Flag auf kritische Startdateien, + Verzeichnisse und Scripte (z.B. alles was läuft bis zu + dem Punkt auf dem das Securelevel gesetzt ist) zu setzen. Dies + könnte etwas ü,bertrieben sein, und auch das Upgrade + des Systems ist sehr viel schwerer, wenn es auf einem hohen + Securelevel läuft. Ein strengerer Kompromiss ist es, das + System auf einem höheren Securelevel laufen zu lassen, aber + keine schg Flags für alle Systemdateien + und Verzeichnisse zu setzen. Eine andere Möglichkeit ist es, + einfach die Verzeichnisse / und + /usr read-only zu mounten. + Es sei darauf hingewiesen, dass Sie nicht vor lauter Überlegen + das Wichtigste, nämlich die Entdeckung eines Eindringens, + vergessen. + Überprüfen der Integrität von Dateien Sie können die Systemkonfiguration und die Dateien nur so weit schützen, wie es die Benutzbarkeit des Systems nicht einschränkt. Wenn Sie zum Beispiel mit chflags die Option schg - auf die meisten Dateien in / und - /usr setzen, kann das Ihre Arbeit mehr behindern + auf die meisten Dateien in / und + /usr setzen, kann das Ihre + Arbeit mehr behindern als nützen. Die Maßnahme schützt zwar die Dateien, schließt aber auch eine Möglichkeit, Veränderungen zu entdecken, aus. Die letzte Schicht des Sicherheitsmodells – das Aufdecken von Einbrüchen – ist sicherlich die wichtigste. Alle Sicherheitsmaßnahmen sind nichts wert, oder wiegen Sie in falscher Sicherheit, wenn Sie nicht in der Lage sind, einen möglichen Einbruch zu entdecken. Die Hälfte der Sicherheitsmaßnahmen hat die Aufgabe, einen Einbruch zu verlangsamen, um es zu ermöglichen, den Einbrecher auf frischer Tat zu ertappen. Der beste Weg, einen Einbruch zu entdecken, ist es, nach veränderten, fehlenden oder unerwarteten Dateien zu suchen. Der wiederum beste Weg, nach veränderten Dateien zu suchen, ist es, die Suche von einem anderen (oft zentralen) besonders geschützten System durchzuführen. Es ist wichtig, dass Ihre Sicherheitsüberprüfungen vor einem Angreifer verborgen bleiben und daher sind sie auf einem besonders geschützten System gut aufgehoben. Um dies optimal auszunutzen, müssen Sie dem besonders geschützten System Zugriffsrechte auf die zu schützenden Systeme geben. Sie können die Dateisysteme der zu schützenden Systeme schreibgeschützt für das besonders geschützte System exportieren, oder Sie können der besonders geschützten Maschine SSH auf die anderen Maschinen erlauben, - indem Sie SSH Schlüsselpaare + indem Sie SSH-Schlüsselpaare installieren. Mit Ausnahme des verursachten Netzwerkverkehrs ist die NFS-Methode die am wenigsten sichtbare. Sie erlaubt es Ihnen, nahezu unentdeckt die Dateisysteme der Clients zu beobachten. Wenn Ihr besonders geschütztes System mit den Clients über einen Switch verbunden ist, ist die NFS-Methode oft das Mittel der Wahl. Wenn das besonders geschützte System allerdings mit einem Hub verbunden ist, oder der Zugriff über mehrere Router geschieht, ist die NFS-Methode aus der Netzwerksicht zu unsicher. In einem solchen Fall ist SSH besser geeignet, auch wenn es deutliche Spuren hinterlässt. Wenn das besonders geschützte System lesenden Zugriff auf die Clients hat, müssen Sie Skripten schreiben, die die Überwachung durchführen. Wenn Sie die NFS-Methode verwenden, können Sie dazu einfache Systemwerkzeuge wie &man.find.1; und &man.md5.1; benutzen. Am besten berechnen Sie einmal am Tag MD5-Prüfsummen der Dateien, Konfigurationsdateien - in /etc und /usr/local/etc + in /etc und + /usr/local/etc sollten öfter überprüft werden. Wenn Unstimmigkeiten zwischen den auf der besonders geschützten Maschine gehaltenen MD5-Prüfsummen und den ermittelten Prüfsummen festgestellt werden, sollte Ihr System einen Systemadministrator benachrichtigen, der den Unstimmigkeiten dann nachgehen sollte. Ein gutes Skript überprüft das System auch auf verdächtige SUID-Programme sowie gelöschte oder neue Dateien in - / und /usr. + / und + /usr. Wenn Sie SSH anstelle von NFS benutzen, wird das Erstellen der Skripten schwieriger. Sie müssen die Skripten und die Programme wie find mit scp auf den Client kopieren. Damit machen Sie die Überprüfung für einen Angreifer sichtbar. Außerdem kann der SSH-Client auf dem - Zielsystem schon kompromittiert sein. Zusammenfassend, kann der + Zielsystem schon kompromittiert sein. Zusammenfassend kann der Einsatz von SSH nötig sein, wenn Sie über ungesicherte Verbindungen arbeiten, aber der Umgang mit dieser Methode ist auch sehr viel schwieriger. Ein gutes Sicherheitsskript wird auch Dateien von Benutzern, die den Zugriff auf ein System ermöglichen, wie .rhosts, .shosts, .ssh/authorized_keys usw., auf Veränderungen untersuchen, die über die Möglichkeiten einer Überprüfung mit MD5 (die ja nur Veränderungen erkennen kann) hinausgehen. Wenn Sie über große Partitionen verfügen, kann es zu lange dauern, jede Datei zu überprüfen. In diesem Fall sollten Sie beim Einhängen des Dateisystems Optionen setzen, die das Ausführen von SUID-Programmen verbieten. &man.mount.8; stellt dazu nosuid zur Verfügung. Sie sollten diese Dateien aber trotzdem mindestens einmal die Woche überprüfen, da das Ziel dieser Schicht das Aufdecken eines Einbruchs, auch wenn er nicht erfolgreich war, ist. Die Prozessüberwachung (siehe &man.accton.8;) des Betriebssystems steht ein günstiges Werkzeug zur Verfügung, dass sich bei der Analyse eines Einbruchs als nützlich erweisen kann. Insbesondere können Sie damit herausfinden, wie der Einbrecher in das System eingedrungen ist, vorausgesetzt die Dateien der Prozessüberwachung sind noch alle intakt. Schließlich sollten die Sicherheitsskripten die Logdateien analysieren. Dies sollte so sicher wie möglich durchgeführt werden, nützlich ist das Schreiben von Logdateien auf entfernte Systeme mit syslog. Ein Einbrecher wird versuchen, seine Spuren zu verwischen. Die Logdateien sind wichtig für den Systemadministrator, da er aus ihnen den Zeitpunkt und die Art des Einbruchs bestimmen kann. Eine Möglichkeit, die Logdateien unverändert aufzuheben, ist es, die Systemkonsole auf einen seriellen Port zu legen und die Informationen dort von einer gesicherten Maschine auszulesen. Paranoia Es schadet nicht, ein bisschen paranoid zu sein. Grundsätzlich darf ein Systemadministrator jede Sicherheitsmaßnahme treffen, die die Bedienbarkeit des Systems nicht einschränkt. Er kann auch Maßnahmen treffen, die die Bedienbarkeit einschränken, wenn er diese vorher genau durchdacht hat. Was noch wichtiger ist: Halten Sie sich nicht sklavisch an dieses Dokument, sondern führen Sie eigene Maßnahmen ein, um nicht einem künftigen Angreifer, der auch Zugriff auf dieses Dokument hat, alle Ihre Methoden zu verraten. Denial-of-Service Angriffe Denial-of-Service (DoS) Dieser Abschnitt behandelt Denial-of-Service Angriffe (DoS). Ein DoS-Angriff findet typischerweise auf der Paketebene statt. Während Sie nicht viel gegen moderne Angriffe mit falschen Paketen, die das Netzwerk sättigen, ausrichten können, können Sie sehr wohl den Schaden begrenzen, den solche Angriffe verursachen können und insbesondere einen kompletten Serverausfall verhindern, indem Sie beispielsweise folgende Vorkehrungen treffen: Begrenzen von fork() Aufrufen. Begrenzen von Sprungbrett-Angriffen (ICMP response Angriffen, ping zu Broadcast-Adressen usw.). Kernel-Cache für Routen. Ein häufiger DoS-Angriff gegen forkende Server versucht den Server dazu zu bringen, solange neue Prozesse zu starten, bis das System den ganzen Speicher und alle Dateideskriptoren verbraucht hat, was dann zu einem Ausfall des Servers führt. &man.inetd.8; besitzt einige Optionen, um diese Art von Angriffen zu begrenzen. Beachten Sie bitte, dass es möglich ist, einen Ausfall einer Maschine zu verhindern, doch ist es generell nicht möglich, den Ausfall eines Dienstes bei dieser Art von Angriffen zu verhindern. Lesen Sie sich bitte die Manualpages von inetd gut durch und achten Sie speziell auf die Optionen , und . Angriffe mit gefälschten IP-Adressen umgehen , so dass normalerweise eine Kombination der Optionen benutzt werden muss. Manche Server, die nicht von inetd gestartet werden, besitzen Optionen, um den Start über fork() einzuschränken. Sendmail besitzt die Option , die besser als die eingebauten Optionen zur Begrenzung der Systemauslastung funktioniert. Sie sollten beim Start von sendmail MaxDaemonChildren so hoch setzen, dass Sie die erwartete Auslastung gut abfangen können. Allerdings sollten Sie den Wert nicht so hoch setzen, dass der Rechner über seine eigenen Füße fällt. Es ist auch klug, Sendmail im Queue-Modus () laufen zu lassen. Der Dæmon (sendmail -bd) sollte getrennt von den Queue-Läufen (sendmail -q15m) laufen. Wenn Sie trotzdem eine sofortige Auslieferung der Post wünschen, können Sie die Queue in einem geringeren Intervall, etwa , abarbeiten. Geben Sie für dieses Sendmail aber einen vernünftigen Wert für MaxDaemonChildren an, um Fehler zu verhindern. Syslogd kann direkt angegriffen werden. Daher empfehlen wir Ihnen unbedingt die Option zu benutzen. Sollte das nicht möglich sein, benutzen Sie bitte . Vorsicht ist auch mit Diensten geboten, die automatisch eine Rückverbindung eröffnen, wie der reverse-identd der TCP-Wrapper. Diese Funktion der TCP-Wrapper sollten Sie normalerweise nicht benutzen. Es empfiehlt sich sehr, interne Dienste vor externen Zugriffen durch eine Firewall an der Grenze Ihres Netzwerks zu schützen. Dahinter steckt mehr die Idee, das Netzwerk vor Überlastung durch Angriffe von außen zu schützen, als interne Dienste vor einem root-Zugriff aus dem Netz zu schützen. Konfigurieren Sie immer eine Firewall, die alle Zugriffe blockiert, das heißt blockieren Sie alles außer den Ports A, B, C, D und M-Z. Damit können Sie Zugriffe auf alle niedrigen Ports blockieren und Zugriffe auf spezielle Dienste wie named, wenn Sie den primären Namensdienst für eine Zone anbieten, ntalkd oder sendmail erlauben. Wenn Sie die Firewall so konfigurieren, das sie in der Voreinstellung alle Zugriffe erlaubt, ist es sehr wahrscheinlich, dass Sie vergessen, eine Reihe von Diensten zu blockieren bzw. einen internen Dienst einführen und dann vergessen die Firewall zu aktualisieren. Sie können immer die höheren Portnummern öffnen, ohne die niedrigen Portnummern, die nur von root benutzt werden dürfen, zu kompromittieren. Beachten Sie bitte auch, dass es &os; erlaubt, die Portnummern, die für dynamische Verbindungen zur Verfügung stehen, zu konfigurieren. Mit sysctl lassen sich verschiedene Bereiche der net.inet.ip.portrange Variablen setzen (eine Liste erhalten Sie mit sysctl -a | fgrep portrange). So können Sie zum Beispiel die Portnummern 4000 bis 5000 für den normalen Bereich und die Nummern 49152 bis 65535 für den hohen Bereich vorsehen. Dies erleichtert Ihnen die Konfiguration der Firewall, da Sie nun Zugriffe auf Ports unterhalb von 4000, mit Ausnahme der Dienste, die von außen erreichbar sein sollen, blockieren können. Eine andere Form eines DoS-Angriffs nutzt einen Server als Sprungbrett, der Server wird dabei so angegriffen, dass seine Antworten ihn selber, das lokale Netzwerk oder einen anderen Server überlasten. Der am häufigsten verwendete Angriff dieser Art ist der ICMP ping broadcast Angriff. Der Angreifer fälscht dazu ping-Pakete, die zu der Broadcast-Adresse Ihres LANs gesendet werden, indem er darin als Quelladresse die Adresse des Opfers einsetzt. Wenn die Router an der Grenze Ihres Netzwerks ping-Pakete auf Broadcast-Adressen nicht abwehren, wird Ihr LAN genügend Netzwerkverkehr generieren, um das Ziel des Angriffs zu überlasten. Dies kann besonders effektiv sein, wenn der Angreifer diese Methode mit mehreren Dutzend Broadcast-Adressen über mehrere Netzwerke einsetzt. Es wurden schon Broadcast-Angriffe mit über 120 Megabit pro Sekunde gemessen. Ein zweiter Sprungbrett-Angriff wird gegen das Fehlerbehandlungssystem von ICMP eingesetzt. Indem ein Angreifer Pakete konstruiert, die eine ICMP-Fehlermeldung hervorrufen, kann er das einkommende Netzwerk des Servers sättigen und diesen wiederum veranlassen sein ausgehendes Netzwerk mit ICMP-Antworten zu sättigen. Diese Art des Angriffs kann den kompletten Speicher des Servers aufbrauchen und damit den Server stilllegen, insbesondere wenn der Server nicht in der Lage ist, die generierten ICMP-Antworten schnell genug abzuführen. Verwenden Sie die sysctl-Variable net.inet.icmp.icmplim, um die Auswirkungen solcher Angriffe zu begrenzen. Die letzte weit verbreitete Form von Sprungbrett-Angriffen verwendet interne inetd-Dienste wie den UDP echo-Dienst. Der Angreifer fälscht dazu einfach ein UDP-Paket, indem er als Quellport den echo-Port von Server A und als Zielport den echo-Port von Server B angibt, wobei beide Server in Ihrem LAN stehen. Die beiden Server werden nun dieses Paket zwischen sich hin und her schicken. Der Angreifer kann die beiden Server und das LAN einfach damit überlasten, dass er mehrere Pakete dieser Art generiert. Ähnliche Probleme gibt es mit dem internen chargen-Port, daher sollten Sie die internen inetd-Testdienste abstellen. Gefälschte IP-Pakete können dazu benutzt werden, den Kernel-Cache für Routen zu überlasten. Schauen Sie sich bitte die sysctl-Parameter net.inet.ip.rtexpire, rtminexpire und rtmaxcache an. Ein Angriff der gefälschte Pakete mit zufälligen Quelladressen einsetzt, bewirkt, dass der Kernel eine Route im Route-Cache anlegt, die Sie sich mit netstat -rna | fgrep W3 ansehen können. Diese Routen verfallen für gewöhnlich nach 1600 Sekunden. Wenn der Kernel feststellt, dass die Routingtabelle im Cache zu groß geworden ist, wird er dynamisch den Wert von rtexpire verringern. Dieser Wert wird aber nie kleiner werden als rtminexpire. Daraus ergeben sich zwei Probleme: Der Kernel reagiert nicht schnell genug, wenn ein Server mit einer niedrigen Grundlast plötzlich angegriffen wird. rtminexpire ist nicht klein genug, um einen anhaltenden Angriff zu überstehen. Wenn Ihre Server über eine T3 oder eine noch schnellere Leitung mit dem Internet verbunden sind, ist es klug, mit &man.sysctl.8; die Werte für rtexpire und rtminexpire händisch zu setzen. Setzen Sie bitte keinen der Werte auf Null, außer Sie wollen die Maschine zum Erliegen bringen. Ein Wert von 2 Sekunden für beide Parameter sollte ausreichen, um die Routingtabelle vor einem Angriff zu schützen. Anmerkungen zum Zugriff mit Kerberos und SSH ssh KerberosIV Es gibt ein paar Punkte, die Sie beachten sollten, wenn Sie Kerberos oder SSH einsetzen wollen. Kerberos 5 ist ein ausgezeichnetes Authentifizierungsprotokoll. Leider gibt es Fehler in den für Kerberos angepassten Versionen von telnet und rlogin, die sie ungeeignet für den Umgang mit binären Datenströmen machen. Weiterhin verschlüsselt Kerberos Ihre Sitzung nicht, wenn Sie nicht die Option verwenden, mit SSH wird dagegen alles verschlüsselt. Ein Problem mit SSH sind Weiterleitungen von Verbindungen. Wenn Sie von einer sicheren Maschine, auf der sich Ihre Schlüssel befinden, eine Verbindung zu einer ungesicherten Maschine aufmachen, wird für die Dauer der Sitzung ein Port für Weiterleitungen geöffnet. Ein Angreifer, der auf der unsicheren Maschine Zugang zu root hat, kann diesen Port benutzen, um Zugriff auf andere Maschinen zu erlangen, die mit Ihren Schlüsseln zugänglich sind. Wir empfehlen Ihnen, für die Logins Ihrer Mitarbeiter immer SSH zusammen mit Kerberos einzusetzen. Damit reduzieren Sie die Abhängigkeit von potentiell gefährdeten Schlüsseln und schützen gleichzeitig die Passwörter mit Kerberos. SSH-Schlüsselpaare sollten nur für automatisierte Aufgaben von einem besonders gesicherten Server eingesetzt werden (Kerberos kann für diese Art von Aufgaben nicht eingesetzt werden). Weiterhin empfehlen wir Ihnen, das Weiterreichen von Schlüsseln in der SSH-Konfiguration abzustellen bzw. die from=IP/DOMAIN Option in authorized_keys zu verwenden, die den Schlüssel nur von bestimmten Maschinen aus nutzbar macht. Bill Swingle Teile umgeschrieben und aktualisiert von DES, Blowfish, MD5, und Crypt Sicherheit Crypt Crypt Blowfish DES MD5 Jedem Benutzer eines &unix; Systems ist ein Passwort zugeordnet. Es scheint offensichtlich, dass das Passwort nur dem Benutzer und dem System bekannt sein muss. Um die Passwörter geheim zu halten, werden sie mit einer nicht umkehrbaren Hash-Funktion verschlüsselt, das heißt sie können leicht verschlüsselt aber nicht entschlüsselt werden. Was wir gerade als offensichtlich dargestellt haben, ist also nicht wahr: Das Betriebssystem kennt das Passwort wirklich nicht, es kennt nur das verschlüsselte Passwort. Die einzige Möglichkeit, das originale Passwort herauszufinden, besteht darin, alle möglichen Passwörter auszuprobieren (brute force Suche). Zu der Zeit als &unix; entstanden ist, war die einzig sichere Möglichkeit Passwörter zu verschlüsseln, leider DES (Data Encryption Standard). Für die Einwohner der USA stellte das kein Problem dar, aber da der Quellcode von DES nicht aus den USA exportiert werden durfte, musste ein Weg gefunden werden, der die Gesetze der USA nicht verletzte und gleichzeitig die Kompatibilität mit anderen &unix; Systemen, die immer noch DES benutzten, wahrte. Die Lösung bestand darin, die Verschlüsselungsbibliotheken aufzuspalten. Benutzer in den USA konnten die DES-Bibliotheken installieren und nutzen. In der Grundeinstellung benutzt &os; MD5 als Verschlüsselungsmethode, das exportiert werden durfte und damit von jedem genutzt werden konnte. Es wird davon ausgegangen, dass MD5 sicherer als DES ist, so dass DES nur aus Kompatibilitätsgründen installiert werden sollte. Erkennen der Verschlüsselungsmethode Derzeit werden DES-, MD5- und Blowfish-Hash-Funktionen unterstützt. In der Voreinstellung benutzt &os; die MD5-Hash-Funktion. Sie können leicht herausfinden, welche Verschlüsselungsmethode von &os; verwendet wird. Ein Weg besteht darin, die verschlüsselten Passwörter in /etc/master.passwd zu untersuchen. Passwörter, die mit MD5 verschlüsselt wurden, sind länger als die mit DES verschlüsselten und beginnen mit den Zeichen $1$. Passwörter, die mit $2a$ anfangen, wurden mit der Blowfish-Funktion verschlüsselt. DES Passwörter besitzen keine offensichtlichen Merkmale, an denen sie identifiziert werden könnten. Sie sind aber kürzer als MD5-Passwörter und sind in einem 64 Zeichen umfassenden Alphabet kodiert, das das $-Zeichen nicht enthält. Ein relativ kurzes Passwort, das nicht mit einem $-Zeichen anfängt, ist wahrscheinlich ein DES-Passwort. Die Verschlüsselungsmethode für neue Passwörter wird durch passwd_format in /etc/login.conf bestimmt. Der Wert dieser Variablen kann entweder des, md5 oder blf sein. Näheres schlagen Sie bitte in &man.login.conf.5; nach. Einmalpasswörter Einmalpasswörter Sicherheit Einmalpasswörter In der Voreinstellung unterstützt &os; OPIE (One-time Passwords in - Everything, das in der Regel MD5-Hash-Funktionen + Everything), das in der Regel MD5-Hash-Funktionen einsetzt. Im Folgenden werden drei verschiedene Passwörter verwendet. Das erste ist Ihr normales System- oder Kerberos-Passwort und wird im Folgenden System-Passwort genannt. Das zweite ist das Einmalpasswort, das bei OPIE von opiekey generiert und von opiepasswd und dem Login-Programm akzeptiert wird. Im Folgenden wird es Einmalpasswort genannt. Das dritte Passwort ist das geheime Passwort, das Sie mit opiekey (manchmal auch mit opiepasswd) zum Erstellen der Einmalpasswörter verwenden. Dieses Passwort werden wir im Folgenden geheimes Passwort oder schlicht Passwort nennen. Das geheime Passwort steht in keiner Beziehung zu Ihrem System-Passwort, beide können gleich sein, obwohl das nicht empfohlen wird. Die geheimen Passwörter von OPIE sind nicht auf eine Länge von 8 Zeichen, wie alte &unix; Passwörter Unter &os; darf das System-Passwort maximal 128 Zeichen lang sein., beschränkt. Sie können so lang sein, wie Sie wollen. Gebräuchlich sind Passwörter, die sich aus sechs bis sieben Wörtern zusammensetzen. Das OPIE-System arbeitet größtenteils unabhängig von den auf &unix;-Systemen verwendeten Passwort-Mechanismen. Neben dem Passwort gibt es noch zwei Werte, die für OPIE wichtig sind. Der erste ist der Initialwert (engl. seed oder key), der aus zwei Buchstaben und fünf Ziffern besteht. Der zweite Wert ist der Iterationszähler, eine Zahl zwischen 1 und 100. OPIE generiert das Einmalpasswort, indem es den Initialwert und das geheime Passwort aneinander hängt und dann die MD5-Hash-Funktion so oft, wie durch den Iterationszähler gegeben, anwendet. Das Ergebnis wird in sechs englische Wörter umgewandelt, die Ihr Einmalpasswort sind. Das Authentifizierungssystem (meistens PAM) merkt sich das zuletzt benutzte Einmalpasswort und Sie sind authentisiert, wenn die Hash-Funktion des Passworts dem vorigen Passwort entspricht. Da nicht umkehrbare Hash-Funktionen benutzt werden, ist es unmöglich, aus einem bekannten Passwort weitere gültige Einmalpasswörter zu berechnen. Der Iterationszähler wird nach jeder erfolgreichen Anmeldung um eins verringert und stellt so die Synchronisation zwischen Benutzer und Login-Programm sicher. Wenn der Iterationszähler den Wert 1 erreicht, muss OPIE neu initialisiert werden. In jedem System werden mehrere Programme verwendet, die weiter unten beschrieben werden. opiekey verlangt einen Iterationszähler, einen Initialwert und ein geheimes Passwort. Daraus generiert es ein Einmalpasswort oder eine Liste von Einmalpasswörtern. opiepasswd wird dazu benutzt, um OPIE zu initialisieren. Mit diesem Programm können Passwörter, Iterationszähler oder Initialwerte geändert werden. Als Parameter verlangt es entweder ein geheimes Passwort oder einen Iterationszähler oder einen Initialwert und ein Einmalpasswort. opieinfo hingegen gibt den momentanen Iterationszähler und Initialwert eines Benutzers aus. Diese werden aus der Datei /etc/opiekeys ermittelt. Im Folgenden werden vier verschiedene Tätigkeiten beschrieben. Zuerst wird erläutert, wie opiepasswd über eine gesicherte Verbindung eingesetzt werden, um Einmalpasswörter das erste Mal zu konfigurieren oder das Passwort oder den Initialwert zu ändern. Als nächstes wird erklärt, wie opiepasswd über eine nicht gesicherte Verbindung, oder zusammen mit opiekey über eine gesicherte Verbindung eingesetzt werden, um dasselbe zu erreichen. Als drittes wird beschrieben, wie opiekey genutzt wird, um sich über eine nicht gesicherte Verbindung anzumelden. Die vierte Tätigkeit beschreibt, wie mit opiekey eine Reihe von Schlüsseln generiert wird, die Sie sich aufschreiben oder ausdrucken können, um sich von Orten anzumelden, die über keine gesicherten Verbindungen verfügen. Einrichten über eine gesicherte Verbindung Um OPIE erstmals zu initalisieren, rufen Sie opiepasswd auf: &prompt.user; opiepasswd -c [grimreaper] ~ $ opiepasswd -f -c Adding unfurl: Only use this method from the console; NEVER from remote. If you are using telnet, xterm, or a dial-in, type ^C now or exit with no password. Then run opiepasswd without the -c parameter. Using MD5 to compute responses. Enter new secret pass phrase: Again new secret pass phrase: ID unfurl OTP key is 499 to4268 MOS MALL GOAT ARM AVID COED Nach der Aufforderung Enter new secret pass phrase: oder Enter secret password: geben Sie bitte Ihr Passwort ein. Dies ist nicht das Passwort, mit dem Sie sich anmelden, sondern es wird genutzt, um das Einmalpasswort zu generieren. Die Zeile, die mit ID anfängt, enthält Ihren Login-Namen, den Iterationszähler und den Initialwert. Diese Werte müssen Sie sich nicht behalten, da das System sie zeigen wird, wenn Sie sich anmelden. In der letzten Zeile steht das Einmalpasswort, das aus diesen Parametern und Ihrem geheimen Passwort ermittelt wurde. Wenn sie sich jetzt wieder anmelden wollten, dann müssten Sie dieses Passwort benutzen. Einrichten über eine nicht gesicherte Verbindung Um Einmalpasswörter über eine nicht gesicherte Verbindung einzurichten, oder das geheime Passwort zu ändern, müssen Sie über eine gesicherte Verbindung zu einer Stelle verfügen, an der Sie opiekey ausführen. Dies kann etwa die Eingabeaufforderung auf einer Maschine, der Sie vertrauen, sein. Zudem müssen Sie einen Iterationszähler vorgeben (100 ist ein guter Wert) und einen Initialwert wählen, wobei Sie auch einen zufällig generierten benutzen können. Benutzen Sie opiepasswd über die ungesicherte Verbindung zu der Maschine, die Sie einrichten wollen: &prompt.user; opiepasswd Updating unfurl: You need the response from an OTP generator. Old secret pass phrase: otp-md5 498 to4268 ext Response: GAME GAG WELT OUT DOWN CHAT New secret pass phrase: otp-md5 499 to4269 Response: LINE PAP MILK NELL BUOY TROY ID mark OTP key is 499 gr4269 LINE PAP MILK NELL BUOY TROY Drücken Sie Return, um die Vorgabe für den Initialwert zu akzeptieren. Bevor Sie nun das Zugriffspasswort (engl. access password) eingeben, rufen Sie über die gesicherte Verbindung opikey mit denselben Parametern auf: &prompt.user; opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT Gehen Sie nun zurück zu der nicht gesicherten Verbindung und geben dort das eben generierte Einmalpasswort ein. Erzeugen eines einzelnen Einmalpasswortes Nachdem Sie OPIE eingerichtet haben, werden Sie beim nächsten Anmelden wie folgt begrüßt: &prompt.user; telnet example.com Trying 10.0.0.1... Connected to example.com Escape character is '^]'. FreeBSD/i386 (example.com) (ttypa) login: <username> otp-md5 498 gr4269 ext Password: Anmerkung: OPIE besitzt eine nützliche Eigenschaft, die hier nicht gezeigt ist. Wenn Sie an der Eingabeaufforderung Return eingeben, wird die echo-Funktion eingeschaltet, das heißt Sie sehen, was Sie tippen. Dies ist besonders nützlich, wenn Sie ein generiertes Passwort von einem Ausdruck abtippen müssen. MS-DOS Windows MacOS Jetzt müssen Sie Ihr Einmalpasswort generieren, um der Anmeldeaufforderung nachzukommen. Dies muss auf einem gesicherten System geschehen, auf dem Sie oder opiekey ausführen können. Dieses Programm gibt es übrigens auch für DOS, &windows; und &macos;. Es benötigt den Iterationszähler sowie den Initialwert als Parameter, die Sie mittels cut-and-paste direkt von der Login-Aufforderung nehmen können. Auf dem sicheren System: &prompt.user; opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT Mit dem jetzt generierten Einmalpasswort können Sie die Anmeldeprozedur fortsetzen. Erzeugen von mehreren Einmalpasswörtern Manchmal müssen Sie sich an Orte begeben, an denen Sie keinen Zugriff auf eine sichere Maschine oder eine sichere Verbindung haben. In diesem Fall können Sie vorher mit opiekey einige Einmalpasswörter generieren, die Sie sich ausdrucken und mitnehmen können. Zum Beispiel: &prompt.user; opiekey -n 5 30 zz99999 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: <secret password> 26: JOAN BORE FOSS DES NAY QUIT 27: LATE BIAS SLAY FOLK MUCH TRIG 28: SALT TIN ANTI LOON NEAL USE 29: RIO ODIN GO BYE FURY TIC 30: GREW JIVE SAN GIRD BOIL PHI Mit fordern Sie fünf Passwörter der Reihe nach an. Der letzte Iterationszähler wird durch gegeben. Beachten Sie bitte, dass die Passwörter in der umgekehrten Reihenfolge, in der sie zu benutzen sind, ausgeben werden. Wenn Sie wirklich paranoid sind, schreiben Sie sich jetzt die Passwörter auf, ansonsten drucken Sie sie mit lpr aus. Beachten Sie, dass jede Zeile den Iterationszähler und das Einmalpasswort zeigt, trotzdem finden Sie es vielleicht hilfreich, eine Zeile nach Gebrauch durchzustreichen. Einschränken der Benutzung von System-Passwörtern OPIE kann die Verwendung von System-Passwörtern abhängig von der Quell-IP-Adresse einschränken. Die dazu nötigen Einstellungen werden in der Datei /etc/opieaccess vorgenommen, die bei der Installation des Systems automatisch erzeugt wird. Weitere Informationen über diese Datei und Sicherheitshinweise zu ihrer Verwendung entnehmen Sie bitte der Hilfeseite &man.opieaccess.5;. Die Datei opieaccess könnte beispielsweise die folgende Zeile enthalten: permit 192.168.0.0 255.255.0.0 Diese Zeile erlaubt es Benutzern, die sich von einer der angegebenen Quell-IP-Adressen anmelden, ihr System-Passwort zu verwenden. Beachten Sie bitte, dass eine Quell-IP-Adresse leicht gefälscht werden kann. Findet sich in opieaccess kein passender Eintrag, muss die Anmeldung mit OPIE erfolgen. Tom Rhodes Beigetragen von TCP-Wrapper TCP-Wrapper Wahrscheinlich hat jeder, der &man.inetd.8; kennt, schon mal von den TCP-Wrappern gehört. Die wenigsten erkennen den vollen Nutzen der TCP-Wrapper in einer Netzumgebung. Es scheint, dass die meisten Leute Netzverbindungen mit einer Firewall absichern wollen. Auch wenn eine Firewall ein mächtiges Instrument ist, gibt es Sachen, die eine Firewall nicht kann. Eine Firewall kann beispielsweise keine Nachricht an den Verbindungsursprung senden. Genau das und mehr können aber die TCP-Wrapper. Im Folgenden werden die Funktionen der TCP-Wrapper und Beispiele für deren Konfiguration vorgestellt. Die TCP-Wrapper erweitern die - Steuerungsmöglichkeiten, die inetd + Steuerungsmöglichkeiten, die inetd über die Dienste unter seiner Kontrolle hat. Beispielsweise können Verbindungen protokolliert, Nachrichten zurückgesandt oder nur interne Verbindungen angenommen werden. Die TCP-Wrapper bieten nicht nur eine weitere Sicherheitsschicht, die teilweise auch von Firewalls geboten wird, sie bieten darüber hinaus Funktionen zur Steuerung von Verbindungen, die eine Firewall nicht bietet. Die erweiterten Funktionen der TCP-Wrapper sind kein Firewall-Ersatz. Sie sollten zusammen mit einer Firewall und anderen Sicherheitsvorkehrungen eingesetzt werden. Die TCP-Wrapper sind eine weitere Sicherheitsschicht zum Schutz eines Systems. - Da die Wrapper die Funktion von inetd + Da die Wrapper die Funktion von inetd erweitern, wird im Folgenden vorausgesetzt, dass Sie den Abschnitt über die inetd-Konfiguration schon gelesen haben. Streng genommen handelt es sich bei den von &man.inetd.8; gestarteten Programmen nicht um Daemonen. Da sich diese Bezeichnung aber eingebürgert hat, wird sie auch in diesem Abschnitt verwendet. TCP-Wrapper einrichten - Um die TCP-Wrapper unter &os; - zu benutzen, muss nur der inetd - aus rc.conf mit den voreingestellten - Optionen gestartet werden. - Die Konfigurationsdatei /etc/hosts.allow - darf keine Fehler enthalten; falls doch, werden die - Fehler mit &man.syslogd.8; protokolliert. + Um die TCP-Wrapper unter &os; + zu benutzen, muss nur der inetd + aus rc.conf mit den voreingestellten + Optionen gestartet werden. + Die Konfigurationsdatei /etc/hosts.allow + darf keine Fehler enthalten; falls doch, werden die + Fehler mit &man.syslogd.8; protokolliert. - Im Gegensatz zu anderen Implementationen der - TCP-Wrapper wird vom Gebrauch - der Datei hosts.deny abgeraten. - Die Konfiguration sollte sich vollständig in der - Datei /etc/hosts.allow befinden. + Im Gegensatz zu anderen Implementationen der + TCP-Wrapper wird vom Gebrauch + der Datei hosts.deny abgeraten. + Die Konfiguration sollte sich vollständig in der + Datei /etc/hosts.allow befinden. - In der einfachsten Konfiguration werden Dienste - abhängig vom Inhalt der Datei - /etc/hosts.allow erlaubt oder - gesperrt. Unter &os; wird in der Voreinstellung - jeder von inetd gestartete Dienst - erlaubt. Sehen wir uns zunächst die Grundkonfiguration - an. - - Eine Konfigurationszeile ist wie folgt aufgebaut: - Dienst : Adresse : Aktion. - Dienst ist der von inetd - gestartete Dienst (auch Daemon genannt). Die - Adresse kann ein gültiger - Rechnername, eine IP-Adresse oder - eine IPv6-Adresse in Klammern - ([ ]) sein. - Der Wert allow im Feld - Aktion erlaubt Zugriffe, der Wert - deny verbietet Zugriffe. - Die Zeilen in hosts.allow - werden für jede Verbindung der Reihe nach - abgearbeitet. Trifft eine Zeile auf eine Verbindung - zu, wird die entsprechende Aktion ausgeführt - und die Abarbeitung ist beendet. - - Es gibt noch weitere Konfigurationsoptionen, die - gleich erläutert werden. Das bisher Gesagte - reicht, um eine einfache Regel aufzustellen. Wenn - Sie einkommende POP3-Verbindungen - für den Dienst - mail/qpopper - erlauben wollen, erweitern Sie - hosts.allow um die nachstehende - Zeile: + In der einfachsten Konfiguration werden Dienste + abhängig vom Inhalt der Datei + /etc/hosts.allow erlaubt oder + gesperrt. Unter &os; wird in der Voreinstellung + jeder von inetd gestartete Dienst + erlaubt. Sehen wir uns zunächst die Grundkonfiguration + an. + + Eine Konfigurationszeile ist wie folgt aufgebaut: + Dienst : Adresse : Aktion. + Dienst ist der von inetd + gestartete Dienst (auch Daemon genannt). Die + Adresse kann ein gültiger + Rechnername, eine IP-Adresse oder + eine IPv6-Adresse in Klammern + ([ ]) sein. + Der Wert allow im Feld + Aktion erlaubt Zugriffe, der Wert + deny verbietet Zugriffe. + Die Zeilen in hosts.allow + werden für jede Verbindung der Reihe nach + abgearbeitet. Trifft eine Zeile auf eine Verbindung + zu, wird die entsprechende Aktion ausgeführt + und die Abarbeitung ist beendet. + + Es gibt noch weitere Konfigurationsoptionen, die + gleich erläutert werden. Das bisher Gesagte + reicht, um eine einfache Regel aufzustellen. Wenn + Sie einkommende POP3-Verbindungen + für den Dienst + mail/qpopper + erlauben wollen, erweitern Sie + hosts.allow um die nachstehende Zeile: # This line is required for POP3 connections: qpopper : ALL : allow - Nachdem Sie die Zeile hinzugefügt haben, muss der - inetd neu gestartet werden. Sie - können dazu das Kommando &man.kill.1; verwenden - oder /etc/rc.d/inetd restart - ausführen. + Nachdem Sie die Zeile hinzugefügt haben, muss der + inetd neu gestartet werden. Sie + können dazu das Kommando &man.kill.1; verwenden + oder /etc/rc.d/inetd restart + ausführen. Erweiterte Konfiguration der TCP-Wrapper Die TCP-Wrapper besitzen weitere Optionen, die bestimmen, wie Verbindungen behandelt werden. In einigen Fällen ist es gut, wenn bestimmten Rechnern oder Diensten eine Nachricht geschickt wird. In anderen Fällen soll vielleicht der Verbindungsaufbau protokolliert oder eine E-Mail an einen Administrator versandt werden. Oder ein Dienst soll nur für das lokale Netz bereitstehen. Dies alles ist mit so genannten Wildcards, Metazeichen und der Ausführung externer Programme möglich und wird in den nächsten zwei Abschnitten erläutert. Externe Kommandos ausführen Stellen Sie sich vor, eine Verbindung soll verhindert werden und gleichzeitig soll demjenigen, der die Verbindung aufgebaut hat, eine Nachricht geschickt werden. Auf welche Art müssen die TCP-Wrapper konfiguriert werden? Die Option führt beim Verbindungsaufbau ein Kommando aus. In der Datei hosts.allow ist ein Beispiel für diese Option enthalten: # Alle anderen Dienste sind geschützt ALL : ALL \ : severity auth.info \ : twist /bin/echo "You are not welcome to use %d from %h." Für jeden Dienst, der nicht vorher in der Datei hosts.allow konfiguriert wurde, wird die Meldung You are not allowed to use daemon from hostname. zurückgegegeben. Dies ist besonders nützlich, wenn Sie die Gegenstelle sofort benachrichtigen wollen, nachdem die Verbindung getrennt wurde. Beachten Sie, dass der Text der Meldung in Anführungszeichen (") stehen muss, es gibt keine Ausnahmen zu dieser Regel. Ein so konfigurierter Server ist anfällig für Denial-of-Service-Angriffe. Ein Angreifer kann die gesperrten Dienste mit Verbindungsanfragen überfluten. Um einem Denial-of-Service-Angriff zu entgehen, benutzen Sie die Option . - Wie die Option verbietet + Wie die Option verbietet die Option die Verbindung und führt externe Kommandos aus. Allerdings sendet die Option der Gegenstelle keine Rückmeldung. Sehen Sie sich die nachstehende Konfigurationsdatei an: # Verbindungen von example.com sind gesperrt: ALL : .example.com \ : spawn (/bin/echo %a from %h attempted to access %d >> \ /var/log/connections.log) \ : deny Damit sind Verbindungen von der Domain *.example.com gesperrt. Jeder Verbindungsaufbau wird zudem in der Datei /var/log/connections.log protokolliert. Das Protokoll enthält den Rechnernamen, die IP-Adresse und den Dienst, der angesprochen wurde. In der Konfigurationsdatei wurde beispielsweise - das Metazeichen %a verwendet. Es gibt weitere + das Metazeichen %a verwendet. Es gibt weitere Metazeichen, die in der Hilfeseite &man.hosts.access.5; beschrieben werden. Wildcards Bisher verwendeten die Beispiele immer die - Wildcard ALL. Die Wildcard + Wildcard ALL. Es gibt andere Wildcards, + welche die Funktionalität ein bisschen erweitern. Die Wildcard ALL passt beispielsweise auf jeden Dienst, jede Domain oder jede IP-Adresse. Eine andere Wildcard ist PARANOID. Sie passt - auf jeden Rechner dessen IP-Adresse + auf jeden Rechner, dessen IP-Adresse möglicherweise gefälscht ist. Dies ist dann der Fall, wenn der Verbindungsaufbau von einer IP-Adresse erfolgt, die nicht - zu dem übermittelten Rechnernamen passt. - Für solche Fälle werden mit der - Wildcard PARANOID Aktionen - festgelegt, beispielsweise: - + zu dem übermittelten Rechnernamen passt. Das folgende + Beispiel sollte das ganze etwas klarer werden lassen: + + # Block possibly spoofed requests to sendmail: sendmail : PARANOID : deny In diesem Beispiel werden alle Verbindungen zu sendmail verboten, die von einer IP-Adresse ausgehen, die nicht zum Rechnernamen passt. Die Wildcard PARANOID kann einen Dienst unbrauchbar machen, wenn der Client oder der Server eine fehlerhafte DNS-Konfiguration besitzt. - Setzen Sie die Wildcard bitte umsichtig ein. + Seien Sie daher besonders vorsichtig, wenn Sie diese Wildcard + in Ihre Konfiguration aufnehmen wollen. Weiteres über Wildcards und deren Funktion lesen Sie bitte in der Hilfeseite &man.hosts.access.5; nach. - In der Voreinstellung sind alle Dienste erlaubt. + Damit die gezeigten Beispiele funktionieren, müssen Sie die erste Konfigurationszeile in der Datei hosts.allow auskommentieren. Mark Murray Beigesteuert von Mark Dapoz Basiert auf einem Beitrag von <application>KerberosIV</application> KerberosIV Kerberos ist ein zusätzliches Netzwerkprotokoll, das es Benutzern erlaubt, sich über einen sicheren Server zu authentifizieren. Dienste wie rlogin, rcp oder das sichere Kopieren von Dateien zwischen Systemen und andere risikoreiche Tätigkeiten werden durch Kerberos erheblich sicherer und kontrollierbarer. Die folgende Anleitung kann nur als Wegweiser dazu dienen, wie Sie Kerberos für &os; konfigurieren. Eine komplette Beschreibung des Systems finden Sie in den entsprechenden Hilfeseiten. Installation von <application>KerberosIV</application> MIT KerberosIV installieren Kerberos ist eine optionale Komponente von &os;. Am leichtesten installieren Sie die Software, wenn Sie bei der ersten Installation von &os; in sysinstall die Distribution krb4 oder krb5 auswählen. Damit installieren Sie entweder die eBones (KerberosIV) oder Heimdal (Kerberos5) Version von Kerberos. Beide Versionen werden mit &os; ausgeliefert, da sie außerhalb von den USA oder Kanada entwickelt werden. Sie unterliegen deshalb auch nicht den restriktiven Exportbeschränkungen der USA und sind auch für Bewohner anderer Länder zugänglich. Als Alternative steht die MIT Variante von Kerberos in der Ports-Sammlung unter security/krb5 zur Verfügung. Erstellen der initialen Datenbank Die folgenden Schritte werden nur auf dem Kerberos-Server durchgeführt. Stellen Sie bitte vorher sicher, dass keine alten Kerberos-Datenbanken mehr vorhanden sind. Im - Verzeichnis /etc/kerberosIV sollten sich nur - die folgenden Dateien befinden: + Verzeichnis /etc/kerberosIV + sollten sich nur die folgenden Dateien befinden: &prompt.root; cd /etc/kerberosIV &prompt.root; ls README krb.conf krb.realms Wenn noch andere Dateien, wie principal.* oder master_key, existieren, müssen Sie die alte Kerberos-Datenbank mit kdb_destroy löschen. Wenn Kerberos nicht läuft, können Sie die Dateien auch einfach löschen. Sie sollten nun die Dateien krb.conf und krb.realms editieren, um Ihr Kerberos-Realm zu definieren. Das folgende Beispiel zeigt dies für das Realm EXAMPLE.COM auf dem Server grunt.example.com. krb.conf sollte wie folgt aussehen: &prompt.root; cat krb.conf EXAMPLE.COM EXAMPLE.COM grunt.example.com admin server CS.BERKELEY.EDU okeeffe.berkeley.edu ATHENA.MIT.EDU kerberos.mit.edu ATHENA.MIT.EDU kerberos-1.mit.edu ATHENA.MIT.EDU kerberos-2.mit.edu ATHENA.MIT.EDU kerberos-3.mit.edu LCS.MIT.EDU kerberos.lcs.mit.edu TELECOM.MIT.EDU bitsy.mit.edu ARC.NASA.GOV trident.arc.nasa.gov Die zusätzlich aufgeführten Realms brauchen Sie nicht anzulegen. Sie zeigen hier nur, wie man Kerberos dazu bringt, andere Realms zu erkennen. Sie können Sie also auch weglassen. Die erste Zeile benennt das Realm, in dem das System arbeitet. Die anderen Zeilen enthalten Realm/Host Paare. Der erste Wert jeder Zeile ist das Realm, der zweite Teil ein Host, der in diesem Realm Key Distribution Center ist. Die Schlüsselwörter admin server nach einem Hostnamen bedeuten, dass dieser Host auch einen administrativen Datenbankserver zur Verfügung stellt. Weitere Erklärungen zu diesen Begriffen finden Sie in den Kerberos Manualpages. Als nächstes muss grunt.example.com in das Realm EXAMPLE.COM aufgenommen werden. Des Weiteren erstellen wir einen Eintrag, der alle Rechner der Domäne .example.com in das Realm EXAMPLE.COM aufnimmt. krb.realms sollte danach so aussehen: &prompt.root; cat krb.realms grunt.example.com EXAMPLE.COM .example.com EXAMPLE.COM .berkeley.edu CS.BERKELEY.EDU .MIT.EDU ATHENA.MIT.EDU .mit.edu ATHENA.MIT.EDU Die zusätzlichen Realms sind hier wieder als Beispiel gedacht. Sie können sie der Einfachheit halber auch weglassen. Die erste Zeile nimmt ein einzelnes System in das Realm auf. Die anderen Zeilen zeigen, wie bestimmte Subdomänen einem bestimmten Realm zugeordnet werden. Das folgende Kommando muss nur auf dem Kerberos-Server (oder Key Distribution Center) laufen. Mit kdb_init können wir die Datenbank anlegen: &prompt.root; kdb_init Realm name [default ATHENA.MIT.EDU ]: EXAMPLE.COM You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter Kerberos master key: Anschließend muss der Schlüssel gespeichert werden, damit Server auf der lokalen Maschine darauf zugreifen können. Dies geschieht mit kstash: &prompt.root; kstash Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Das verschlüsselte Master-Passwort wurde in /etc/kerberosIV/master_key gesichert. Anlegen von Prinzipals Für jedes System, das mit Kerberos gesichert werden soll, müssen zwei Prinzipale in die Datenbank eingetragen werden. Ihre Namen sind kpasswd und rcmd. Beide Prinzipale müssen für jedes System angelegt werden, wobei die Instanz der Name des jeweiligen Systems ist. Die Dæmonen kpasswd und rcmd erlauben es anderen Systemen, Kerberos-Passwörter zu ändern und Kommandos wie &man.rcp.1;, &man.rlogin.1; und &man.rsh.1; laufen zu lassen. Beide Einträge werden im Folgenden angelegt: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: passwd Instance: grunt <Not found>, Create [y] ? y Principal: passwd, Instance: grunt, kdc_key_ver: 1 New Password: <---- geben Sie hier Zufallswerte ein Verifying password New Password: <---- geben Sie hier Zufallswerte ein Random password [y] ? y Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: rcmd Instance: grunt <Not found>, Create [y] ? Principal: rcmd, Instance: grunt, kdc_key_ver: 1 New Password: <---- geben Sie hier Zufallswerte ein Verifying password New Password: <---- geben Sie hier Zufallswerte ein Random password [y] ? Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- geben Sie nichts an, um das Programm zu verlassen Erstellen der Server-Datei Wir müssen nun für jede Maschine die Instanzen, die Dienste definieren, aus der Datenbank mit ext_srvtab extrahieren. Die erstelle Datei muss auf einem sicheren Weg in das - Verzeichnis /etc jedes Clients + Verzeichnis /etc jedes Clients kopiert werden. Die Datei muss auf jedem Server und auf jedem Client vorhanden sein und ist unabdingbar für Kerberos. &prompt.root; ext_srvtab grunt Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'grunt-new-srvtab'.... Das Kommando erzeugt Dateien mit einem temporären Namen, der es anderen Servern erlaubt, ihre Datei abzuholen. Die Datei muss auf dem entsprechenden System in srvtab umbenannt werden. Auf dem originalen System können Sie &man.mv.1; benutzen, um die Datei umzubenennen: &prompt.root; mv grunt-new-srvtab srvtab Wenn die Datei für ein Client-System bestimmt ist und das Netzwerk nicht sicher ist, kopieren Sie die Datei auf ein bewegliches Medium und transportieren sie physikalisch. Kopieren Sie die Datei - auf den Client in das Verzeichnis /etc. + auf den Client in das Verzeichnis + /etc. Benennen Sie die Datei in srvtab um und setzen Sie schließlich noch die Berechtigungen auf 600: &prompt.root; mv grumble-new-srvtab srvtab &prompt.root; chmod 600 srvtab Füllen der Datenbank Wir können nun Benutzer in der Datenbank anlegen. Mit kdb_edit legen wir zuerst die Benutzerin jane an: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: <Not found>, Create [y] ? y Principal: jane, Instance: , kdc_key_ver: 1 New Password: <---- geben Sie ein sicheres Passwort ein Verifying password New Password: <---- wiederholen Sie die Eingabe Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- geben Sie nichts an, um das Programm zu verlassen Testen Zuerst müssen die Kerberos-Dæmonen gestartet sein. Wenn Sie /etc/rc.conf richtig angepasst haben, passiert das automatisch, wenn Sie booten. Dieser Schritt ist nur auf dem Kerberos-Server notwendig, die Clients bekommen alles - was sie brauchen aus dem /etc/kerberosIV + was sie brauchen aus dem + /etc/kerberosIV Verzeichnis. &prompt.root; kerberos & Kerberos server starting Sleep forever on error Log file is /var/log/kerberos.log Current Kerberos master key version is 1. Master key entered. BEWARE! Current Kerberos master key version is 1 Local realm: EXAMPLE.COM &prompt.root; kadmind -n & KADM Server KADM0.0A initializing Please do not use 'kill -9' to kill this job, use a regular kill instead Current Kerberos master key version is 1. Master key entered. BEWARE! Jetzt können wir mit kinit versuchen, ein Ticket für die ID jane, die wir oben angelegt haben, zu erhalten: &prompt.user; kinit jane MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane" Password: Mit klist können Sie sich vergewissern, dass Sie die Tickets auch erhalten haben: &prompt.user; klist Ticket file: /tmp/tkt245 Principal: jane@EXAMPLE.COM Issued Expires Principal Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.EXAMPLE.COM@EXAMPLE.COM Versuchen Sie nun das Passwort mit &man.passwd.1; zu ändern, um zu überprüfen, dass der kpasswd Dæmon auch auf der Kerberos-Datenbank autorisiert ist: &prompt.user; passwd realm EXAMPLE.COM Old password for jane: New Password for jane: Verifying password New Password for jane: Password changed. Anlegen von <command>su</command> Privilegien Mit Kerberos kann jedem Benutzer, der root-Privilegien braucht, ein eigenes Passwort für &man.su.1; zugewiesen werden. Dies wird dadurch erreicht, dass die Instanz eines Prinzipals root ist. Mit kbd_edit legen wir nun den Eintrag jane.root in der Kerberos-Datenbank an: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: root <Not found>, Create [y] ? y Principal: jane, Instance: root, kdc_key_ver: 1 New Password: <---- geben Sie ein sicheres Passwort ein Verifying password New Password: <---- geben Sie das Passwort erneut ein Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- Keep this short! Attributes [ 0 ] ? Edit O.K. Principal name: <---- geben Sie nichts an, um das Programm zu verlassen Versuchen Sie nun, für diesen Prinzipal Tickets zu bekommen: &prompt.root; kinit jane.root MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane.root" Password: Als nächstes fügen wir den Prinzipal in .klogin von root ein: &prompt.root; cat /root/.klogin jane.root@EXAMPLE.COM Jetzt benutzen wir &man.su.1;: &prompt.user; su Password: und kontrollieren, welche Tickets wir haben: &prompt.root; klist Ticket file: /tmp/tkt_root_245 Principal: jane.root@EXAMPLE.COM Issued Expires Principal May 2 20:43:12 May 3 04:43:12 krbtgt.EXAMPLE.COM@EXAMPLE.COM Weitere Kommandos In einem der Beispiele haben wir einen Prinzipal mit dem Namen jane und der Instanz root angelegt. Der Prinzipal entstand aus einem Benutzer mit dem gleichen Namen. Unter Kerberos ist es Standard, dass ein principal.instance der Form username.root es dem Benutzer username erlaubt, mit &man.su.1; root zu werden, wenn die entsprechenden Einträge in .klogin von root existieren: &prompt.root; cat /root/.klogin jane.root@EXAMPLE.COM Das gilt auch für die .klogin-Datei im Heimatverzeichnis eines Benutzers: &prompt.user; cat ~/.klogin jane@EXAMPLE.COM jack@EXAMPLE.COM Die Einträge erlauben jedem, der sich im Realm EXAMPLE.COM als jane oder jack mit kinit authentifiziert hat, mittels &man.rlogin.1;, &man.rsh.1; oder &man.rcp.1; auf den Account jane und dessen Dateien zuzugreifen. Im folgenden Beispiel meldet sich jane mit Kerberos auf grunt an: &prompt.user; kinit MIT Project Athena (grunt.example.com) Password: &prompt.user; rlogin grunt Last login: Mon May 1 21:14:47 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 Im folgenden Beispiel wurde der Prinzipal jack mit einer Instanz null angelegt. Mit der obigen .klogin-Datei kann er sich nun auf derselben Maschine als jane anmelden: &prompt.user; kinit &prompt.user; rlogin grunt -l jane MIT Project Athena (grunt.example.com) Password: Last login: Mon May 1 21:16:55 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 Tillman Hodgson Beigetragen von Mark Murray Beruht auf einem Beitrag von <application>Kerberos5</application> Das Basissystem enthält ab &os; 5.1 nur noch Kerberos5. Die Konfiguration von Kerberos5 ist der Konfiguration von KerberosIV sehr ähnlich. Wenn Sie KerberosIV benötigen, installieren Sie den Port security/krb4. Der folgende Abschnitt beschreibt ausschließlich Kerberos5 für &os;-Releases ab 5.0. Kerberos ist ein Netzwerk-Protokoll, das Benutzer mithilfe eines sicheren Servers authentifiziert. Mit Risiken behaftete Dienste, wie das Anmelden an entfernten Systemen oder das Kopieren von Daten auf entfernte Systeme, werden durch Kerberos erheblich sicherer und lassen sich leichter steuern. Kerberos hat eine Aufgabe: Die sichere Prüfung der Identität eines Benutzers (Authentifizierung) über das Netzwerk. Das System überprüft weder die Berechtigungen der Benutzer (Autorisierung), noch verfolgt es die durchgeführten Aktionen (Audit). Daher sollte Kerberos zusammen mit anderen Sicherheits-Systemen eingesetzt werden, die diese Funktionen bereitstellen. Die Daten einer Kommunikation können verschlüsselt werden, nachdem die Kommunikationspartner mit Kerberos ihre Identität geprüft haben. Die folgenden Anweisungen beschreiben, wie Sie das mit &os; gelieferte Kerberos einrichten. Eine vollständige Beschreibung des Systems entnehmen Sie bitte den entsprechenden Hilfeseiten. Die Beschreibung der Kerberos-Installation benutzt folgende Namensräume: Die DNS-Domain (Zone) heißt example.org. Das Kerberos-Realm heißt EXAMPLE.ORG. Benutzen Sie echte Domain-Namen, wenn Sie Kerberos einrichten. Damit vermeiden Sie DNS-Probleme und stellen die Zusammenarbeit mit anderen Kerberos-Realms sicher. Geschichte Kerberos5 Geschichte Das MIT entwickelte Kerberos, um Sicherheitsprobleme auf dem Netzwerk zu lösen. Das Kerberos-Protokoll verwendet starke Kryptographie, sodass ein Server die Identität eines Clients (der umgekehrte Vorgang ist auch möglich) über ein unsicheres Netzwerk feststellen kann. Der Begriff Kerberos wird sowohl für das Protokoll als auch für Programme verwendet, die Kerberos benutzen (wie Kerberos-Telnet). Die aktuelle Protokollversion ist 5 und wird in RFC 1510 beschrieben. Mehrere Implementierungen des Protokolls stehen frei zur Verfügung und decken viele Betriebssysteme ab. Das Massachusetts Institute of Technology (MIT), an dem Kerberos ursprünglich entwickelt wurde, entwickelt seine Kerberos-Version weiter. In den USA wird diese Version häufig eingesetzt, unterlag aber Export-Beschränkungen, da sie in den USA entwickelt wurde. Die MIT-Version von Kerberos befindet sich im Port security/krb5. Heimdal ist eine weitere Implementierung der Protokollversion 5. Sie wurde außerhalb der USA entwickelt und unterliegt daher keinen Export-Beschränkungen. Heimdal-Kerberos befindet sich im Port security/heimdal und das Basissystem von &os; enthält eine minimale Installation von Heimdal. Um möglichst viele Benutzer anzusprechen, verwenden die folgenden Beispiele die in &os; enthaltene Heimdal-Distribution. Das Heimdal <acronym>KDC</acronym> einrichten Kerberos5 Key Distribution Center Kerberos authentifiziert Benutzer an einer zentralen Stelle: dem Key Distribution Center (KDC). Das KDC verteilt Tickets, mit denen ein Dienst die Identität eines Benutzers feststellen kann. Alle Mitglieder eines Kerberos-Realms vertrauen dem KDC, daher gelten für das KDC erhöhte Sicherheitsanforderungen. Obwohl das KDC wenig Ressourcen eines Rechners benötigt, sollte es wegen der Sicherheitsanforderungen auf einem separaten Rechner installiert werden. Das KDC wird in /etc/rc.conf wie folgt aktiviert: kerberos5_server_enable="YES" kadmind5_server_enable="YES" Danach wird die Konfigurationsdatei von Kerberos, /etc/krb5.conf, erstellt: [libdefaults] default_realm = EXAMPLE.ORG [realms] EXAMPLE.ORG = { kdc = kerberos.example.org admin_server = kerberos.example.org } [domain_realm] .example.org = EXAMPLE.ORG Diese Einstellungen setzen voraus, dass der voll qualifizierte Name des KDCs kerberos.example.org ist. Wenn Ihr KDC einen anderen Namen hat, müssen Sie in der DNS-Zone einen Alias-Eintrag (CNAME-Record) für das KDC hinzufügen. Auf großen Netzwerken mit einem ordentlich konfigurierten BIND DNS-Server kann die Datei verkürzt werden: [libdefaults] default_realm = EXAMPLE.ORG Die Zonendatei von example.org muss dann die folgenden Zeilen enthalten: _kerberos._udp IN SRV 01 00 88 kerberos.example.org. _kerberos._tcp IN SRV 01 00 88 kerberos.example.org. _kpasswd._udp IN SRV 01 00 464 kerberos.example.org. _kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org. _kerberos IN TXT EXAMPLE.ORG Damit Klienten die Kerberos-Dienste benutzen können, muss die Datei /etc/krb5.conf entweder die vollständige Konfiguration enthalten oder eine minimale Konfiguration enthalten und zusätzlich ein DNS-Server richtig eingerichtet sein. Im nächsten Schritt wird die Kerberos-Datenbank eingerichtet. Die Datenbank enthält die Schlüssel aller Prinzipale und ist mit einem Passwort geschützt. Dieses Passwort brauchen Sie nicht zu behalten, da ein davon abgeleiteter Schlüssel in der Datei /var/heimdal/m-key gespeichert wird. Den Schlüssel erstellen Sie, indem Sie das Programm kstash aufrufen und ein Passwort eingeben. Nachdem Sie den Schlüssel in /var/heimdal/m-key erstellt haben, können Sie die Datenbank mit dem Kommando kadmin initialisieren. Verwenden Sie hierbei die Option (lokal). Mit dieser Option wird die Datenbank lokal modifiziert. Normal würde der kadmind-Dienst benutzt, der aber zu diesem Zeitpunkt noch nicht läuft. An der Eingabeaufforderung von kadmin können Sie mit dem Kommando init die Datenbank des Realms einrichten. Zuletzt erstellen Sie mit dem Kommando add Ihren ersten Prinzipal. Benutzen Sie die voreingestellten Optionen; Sie können die Einstellungen später mit dem Kommando modify ändern. An der Eingabeaufforderung zeigt das Kommando ? Hilfetexte an. Zusammengefasst wird die Datenbank wie folgt eingerichtet: &prompt.root; kstash Master key: xxxxxxxx Verifying password - Master key: xxxxxxxx &prompt.root; kadmin -l kadmin> init EXAMPLE.ORG Realm max ticket life [unlimited]: kadmin> add tillman Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: Password: xxxxxxxx Verifying password - Password: xxxxxxxx Jetzt kann das KDC gestartet werden. Führen Sie zum Start der Dienste die Kommandos /etc/rc.d/kerberos start und /etc/rc.d/kadmind start aus. Obwohl zu diesem Zeitpunkt noch keine kerberisierten Dienste laufen, können Sie die Funktion des KDCs schon überprüfen. Für den eben angelegten Benutzer können Sie sich vom KDC Tickets holen und diese Tickets anzeigen: &prompt.user; kinit tillman tillman@EXAMPLE.ORG's Password: &prompt.user; klist Credentials cache: FILE: /tmp/krb5cc_500 Principal: tillman@EXAMPLE.ORG Issued Expires Principal Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG Dieses Ticket kann, nachdem Sie Ihre Arbeit beendet haben, zurückgezogen werden: - &prompt.user; k5destroy + &prompt.user; kdestroy <application>Kerberos</application>-Dienste einrichten Kerberos5 Dienste einrichten Alle Rechner, die kerberisierte Dienste anbieten, müssen eine Kopie der Kerberos-Konfigurationsdatei /etc/krb5.conf besitzen. Sie können die Datei einfach vom KDC kopieren. Anschließend müssen Sie die Datei /etc/krb5.keytab erzeugen. Im Gegensatz zu normalen Workstations benötigt jeder Server eine keytab. Diese Datei enthält den Schlüssel des Servers, mit dem sich der Server und das KDC gegenseitig authentifizieren können. Die Datei muss sicher auf den Server transportiert werden (beispielsweise mit &man.scp.1; oder einer Diskette). Unter keinen Umständen darf die Datei im Klartext, zum Beispiel mit FTP, übertragen werden, da sonst die Sicherheit des Servers gefährdet ist. Sie können die keytab auch mit dem Programm kadmin übertragen. Da Sie mit kadmin sowieso einen Host-Prinzipal für den Server einrichten müssen, ist das ganz praktisch. Sie müssen allerdings schon ein Ticket besitzen und berechtigt sein, kadmin auszuführen. Die Berechtigung erhalten Sie durch einen Eintrag in der Zugriffskontrollliste kadmind.acl. Weitere Informationen über Zugriffskontrolllisten erhalten Sie in den Heimdal-Info-Seiten (info heimdal) im Abschnitt Remote administration. Wenn der Zugriff auf kadmin von entfernten Maschinen verboten ist, müssen Sie sich sicher auf dem KDC anmelden (lokale Konsole, &man.ssh.1; oder kerberisiertes Telnet) und die keytab lokal mit kadmin -l erzeugen. Nachdem Sie die Datei /etc/krb5.conf installiert haben, können Sie das Kommando kadmin benutzen. An der Eingabeaufforderung von kadmin erstellt das Kommando add --random-key den Host-Prinzipal und das Kommando ext extrahiert den Schlüssel des Prinzipals in eine Datei: &prompt.root; kadmin kadmin> add --random-key host/myserver.example.org Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: kadmin> ext host/myserver.example.org kadmin> exit Das Kommando ext (von extract) speichert den extrahierten Schlüssel in der Datei /etc/krb5.keytab. Wenn auf dem KDC, vielleicht aus Sicherheitsgründen, kadmind nicht läuft, können Sie das Kommando kadmin von entfernten Rechnern nicht benutzen. In diesem Fall legen Sie den Host-Prinzipal host/myserver.EXAMPLE.ORG direkt auf dem KDC an. Den Schlüssel extrahieren Sie in eine temporäre Datei (damit die Datei /etc/krb5.keytab nicht überschrieben wird): &prompt.root; kadmin kadmin> ext --keytab=/tmp/example.keytab host/myserver.example.org kadmin> exit Anschließend müssen Sie die erzeugte example.keytab sicher auf den Server kopieren (mit scp oder mithilfe einer Diskette). Geben Sie auf jeden Fall einen anderen Namen für die keytab an, weil sonst die keytab des KDCs überschrieben würde. Wegen der Datei krb5.conf kann der Server nun mit dem KDC kommunizieren und seine Identität mithilfe der Datei krb5.keytab nachweisen. Jetzt können wir kerberisierte Dienste aktivieren. Für telnet muss die folgende Zeile in /etc/inetd.conf eingefügt werden: telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user Ausschlaggebend ist, dass die Authentifizierungs-Methode mit auf user gesetzt wird. Weitere Details entnehmen Sie bitte der Hilfeseite &man.telnetd.8;. Nachdem sie die Zeile in /etc/inetd.conf eingefügt haben, starten Sie &man.inetd.8; mit dem Kommando /etc/rc.d/inetd restart durch. <application>Kerberos</application>-Clients einrichten Kerberos5 Clients einrichten Ein Client lässt sich leicht einrichten. Sie benötigen nur die Kerberos-Konfigurationsdatei /etc/krb5.conf. Kopieren Sie die Konfigurationsdatei einfach vom KDC auf den Client. Sie können jetzt mit kinit Tickets anfordern, mit klist Tickets anzeigen und mit kdestroy Tickets löschen. Sie können mit Kerberos-Anwendungen kerberisierte Server ansprechen. Wenn das nicht funktioniert, Sie aber Tickets anfordern können, hat wahrscheinlich der kerberisierte Server ein Problem und nicht der Client oder das KDC. Wenn Sie eine Anwendung wie telnet testen, können Sie mit einem Paket-Sniffer (beispielsweise &man.tcpdump.1;) überprüfen, dass Passwörter verschlüsselt übertragen werden. Probieren Sie auch die Option von telnet, die den gesamten Datenverkehr verschlüsselt (analog zu ssh). Zu Heimdal gehören noch weitere Anwendungen. Allerdings enthält das &os;-Basissystem nur eine minimale Heimdal-Installation mit nur einer kerberisierten Anwendung: telnet. Der Heimdal-Port enthält noch mehr kerberisierte Anwendungen wie ftp, rsh, rcp und rlogin. Der MIT-Port enthält ebenfalls weitere kerberisierte Anwendungen. <filename>.k5login</filename> und <filename>.k5users</filename> .k5login .k5users Normalerweise wird ein Kerberos-Prinzipal wie tillman@EXAMPLE.ORG auf ein lokales Benutzerkonto, beispielsweise tillman, abgebildet. Daher benötigen Client-Anwendungen (zum Beispiel telnet) keinen Benutzernamen. Manchmal wird aber Zugriff auf ein lokales Benutzerkonto benötigt, zu dem es keinen passenden Kerberos-Prinzipal gibt. Der Prinzipal tillman@EXAMPLE.ORG bräuchte beispielsweise Zugriff auf das Konto webdevelopers. Ebenso könnten andere Prinzipale auf dieses Konto zugreifen wollen. Die Dateien .k5login und .k5users im Heimatverzeichnis eines Benutzerkontos gewähren Zugriffe ähnlich wie die Dateien .hosts und .rhosts. Um den Prinzipalen tillman@example.org und jdoe@example.org auf das Konto webdevelopers zu geben, wird im Heimatverzeichnis von webdevelopers die Datei .k5login mit folgendem Inhalt angelegt: tillman@example.org jdoe@example.org Die angegebenen Prinzipale haben nun ohne ein gemeinsames Passwort Zugriff auf das Konto. Einzelheiten entnehmen Sie bitte den Hilfeseiten zu diesen Dateien. Die Datei .k5users wird in der Hilfeseite des Kommandos ksu beschrieben. Tipps und Fehlersuche Kerberos5 Fehlersuche Wenn Sie den Heimdal-Port oder den MIT-Port benutzen, muss in der Umgebungsvariable PATH der Pfad zu den Programmen des Ports vor dem Pfad zu den Kerberos-Programmen des Systems stehen. Sind die Uhrzeiten der Systeme synchronisiert? Wenn nicht, schlägt vielleicht die Authentifizierung fehl. beschreibt, wie Sie mithilfe von NTP die Uhrzeiten synchronisieren. Die MIT- und Heimdal-Systeme arbeiten bis auf kadmin gut zusammen. Für kadmin wurde das Protokoll nicht normiert. Wenn Sie den Namen eines Rechners ändern, müssen Sie auch den host/-Prinzipal ändern und die Datei keytab aktualisieren. Dies betrifft auch spezielle Einträge wie den Prinzipal für Apaches www/mod_auth_kerb. Die Rechnernamen müssen vor- und rückwärts aufgelöst werden (im DNS oder in /etc/hosts). CNAME-Einträge im DNS funktionieren, aber die entsprechenden A- und PTR-Einträge müssen vorhanden und richtig sein. Wenn sich Namen nicht auflösen lassen, ist die Fehlermeldung nicht gerade selbstsprechend: Kerberos5 refuses authentication because Read req failed: Key table entry not found. Einige Betriebssysteme installieren ksu mit falschen Zugriffsrechten; es fehlt das Set-UID-Bit für root. Das mag aus Sicherheitsgründen richtig sein, doch funktioniert ksu dann nicht. Dies ist kein Fehler des KDCs. Wenn Sie für einen Prinzipal unter MIT-Kerberos Tickets mit einer längeren Gültigkeit als der vorgegebenen zehn Stunden einrichten wollen, müssen Sie zwei Sachen ändern. Benutzen Sie das modify_principal von kadmin, um die maximale Gültigkeitsdauer für den Prinzipal selbst und den Prinzipal krbtgt zu erhöhen. Mit einem Packet-Sniffer können Sie feststellen, dass Sie sofort nach dem Aufruf von kinit eine Antwort vom KDC bekommen – noch bevor Sie überhaupt ein Passwort eingegeben haben! Das ist in Ordnung: Das KDC händigt ein Ticket-Granting-Ticket (TGT) auf Anfrage aus, da es durch einen vom Passwort des Benutzers abgeleiteten Schlüssel geschützt ist. Wenn das Passwort eingegeben wird, wird es nicht zum KDC gesendet, sondern zum Entschlüsseln der Antwort des KDCs benutzt, die kinit schon erhalten hat. Wird die Antwort erfolgreich entschlüsselt, erhält der Benutzer einen Sitzungs-Schlüssel für die künftige verschlüsselte Kommunikation mit dem KDC und das Ticket-Granting-Ticket. Das Ticket-Granting-Ticket wiederum ist mit dem Schlüssel des KDCs verschlüsselt. Diese Verschlüsselung ist für den Benutzer völlig transparent und erlaubt dem KDC, die Echtheit jedes einzelnen TGT zu prüfen. Wenn Sie OpenSSH verwenden und Tickets mir einer langen Gültigkeit (beispielsweise einer Woche) benutzen, setzen Sie die Option in der Datei sshd_config auf no. Ansonsten werden Ihre Tickets gelöscht, wenn Sie sich abmelden. Host-Prinzipale können ebenfalls Tickets mit längerer Gültigkeit besitzen. Wenn der Prinzipal eines Benutzers über ein Ticket verfügt, das eine Woche gültig ist, das Ticket des Host-Prinzipals aber nur neun Stunden gültig ist, funktioniert der Ticket-Cache nicht wie erwartet. Im Cache befindet sich dann ein abgelaufenes Ticket des Host-Prinzipals. Wenn Sie mit krb5.dict die Verwendung schlechter Passwörter verhindern wollen, geht das nur mit Prinzipalen, denen eine Passwort-Policy zugewiesen wurde. Die Hilfeseite von kadmind beschreibt kurz, wie krb5.dict verwendet wird. Das Format von krb5.dict ist einfach: Die Datei enthält pro Zeile ein Wort. Sie können daher einen symbolischen Link auf /usr/share/dict/words erstellen. Unterschiede zum <acronym>MIT</acronym>-Port Der Hauptunterschied zwischen MIT-Kerberos und Heimdal-Kerberos ist das Kommando kadmin. Die Befehlssätze des Kommandos (obwohl funktional gleichwertig) und das verwendete Protokoll unterscheiden sich in beiden Varianten. Das KDC lässt sich nur mit dem kadmin Kommando der passenden Kerberos-Variante verwalten. Für dieselbe Funktion können auch die Client-Anwendungen leicht geänderte Kommandozeilenoptionen besitzen. Folgen Sie bitte der Anleitung auf der Kerberos-Seite () des MITs. Achten Sie besonders auf den Suchpfad für Anwendungen. Der MIT-Port - wird standardmäßig in /usr/local/ + wird standardmäßig in + /usr/local/ installiert. Wenn die Umgebungsvariable PATH zuerst die Systemverzeichnisse enthält, werden die Systemprogramme anstelle der MIT-Programme ausgeführt. Wenn Sie den MIT-Port security/krb5 verwenden, erscheint bei der Anmeldung mit telnetd und klogind die Fehlermeldung incorrect permissions on cache file. Lesen Sie dazu bitte die im Port enthaltene Datei /usr/local/share/doc/krb5/README.FreeBSD. Wichtig ist, dass zur Authentifizierung die Binärdatei login.krb5 verwendet wird, die für durchgereichte Berechtigungen die Eigentümer korrekt ändert. In der Datei rc.conf müssen folgende Zeilen aufgenommen werden: kerberos5_server="/usr/local/sbin/krb5kdc" kadmind5_server="/usr/local/sbin/kadmind" kerberos5_server_enable="YES" kadmind5_server_enable="YES" Diese Zeilen sind notwendig, weil die Anwendungen von MIT-Kerberos Binärdateien unterhalb von /usr/local installieren. + class="directory">/usr/local installieren. Beschränkungen von <application>Kerberos</application> Kerberos5 Beschränkungen <application>Kerberos</application> muss ganzheitlich verwendet werden Jeder über das Netzwerk angebotetene Dienst muss mit Kerberos zusammenarbeiten oder auf anderen Wegen gegen Angriffe aus dem Netzwerk geschützt sein. Andernfalls können Berechtigungen gestohlen und wiederverwendet werden. Es ist beispielsweise nicht sinnvoll, für Anmeldungen mit rsh und telnet Kerberos zu benutzen, dagegen aber POP3-Zugriff auf einen Mail-Server zu erlauben, da POP3 Passwörter im Klartext versendet. <application>Kerberos</application> ist für Einbenutzer-Systeme gedacht In Mehrbenutzer-Umgebungen ist Kerberos unsicherer als in Einbenutzer-Umgebungen, da die Tickets im für alle - lesbaren Verzeichnis /tmp + lesbaren Verzeichnis /tmp gespeichert werden. Wenn ein Rechner von mehreren Benutzern verwendet wird, ist es möglich, dass Tickets gestohlen werden. Dieses Problem können Sie lösen, indem Sie mit der Kommandozeilenoption oder besser mit der Umgebungsvariablen KRB5CCNAME einen Ort für die Tickets vorgeben. Diese Vorgehensweise wird leider selten benutzt. Es reicht, die Tickets im Heimatverzeichnis eines Benutzers zu speichern und mit Zugriffsrechten zu schützen. Das <acronym>KDC</acronym> ist verwundbar Das KDC muss genauso abgesichert werden wie die auf ihm befindliche Passwort-Datenbank. Auf dem KDC dürfen keine anderen Dienste laufen und der Rechner sollte physikalisch gesichert sein. Die Gefahr ist groß, da Kerberos alle Passwörter mit einem Schlüssel, dem Haupt-Schlüssel, verschlüsselt. Der Haupt-Schlüssel wiederum wird in einer Datei auf dem KDC gespeichert. Ein kompromittierter Haupt-Schlüssel ist nicht ganz so schlimm wie allgemein angenommen. Der Haupt-Schlüssel wird nur zum Verschlüsseln der Passwort-Datenbank und zum Initialisieren des Zufallsgenerators verwendet. Solange der Zugriff auf das KDC abgesichert ist, kann ein Angreifer wenig mit dem Haupt-Schlüssel anfangen. Wenn das KDC nicht zur Verfügung steht, vielleicht wegen eines Denial-of-Service Angriffs oder wegen eines Netzwerkproblems, ist eine Authentifizierung unmöglich. Damit können die Netzwerk-Dienste nicht benutzt werden; das KDC ist also ein optimales Ziel für einen Denial-of-Service Angriff. Sie können diesem Angriff ausweichen, indem Sie mehrere KDCs (einen Master und einen oder mehrere Slaves) verwenden. Der Rückfall auf ein sekundäres KDC oder eine andere Authentifizierungs-Methode (dazu ist PAM bestens geeignet) muss sorgfältig eingerichtet werden. Mängel von <application>Kerberos</application> Mit Kerberos können sich Benutzer, Rechner und Dienste gegenseitig authentifizieren. Allerdings existiert kein Mechanismus, der das KDC gegenüber Benutzern, Rechnern oder Diensten authentifiziert. Ein verändertes kinit könnte beispielsweise alle Benutzernamen und Passwörter abfangen. Die von veränderten Programmen ausgehende Gefahr können Sie lindern, indem Sie die Integrität von Dateien mit Werkzeugen wie security/tripwire prüfen. Weiterführende Dokumentation Kerberos5 weiterführende Dokumentation The Kerberos FAQ Designing an Authentication System: a Dialogue in Four Scenes RFC 1510, The Kerberos Network Authentication Service (V5) MIT Kerberos-Seite Heimdal Kerberos-Seite Tom Rhodes Beigetragen von OpenSSL Sicherheit OpenSSL OpenSSL Es wird oft übersehen, dass OpenSSL Teil des &os;-Basissystems ist. OpenSSL bietet eine verschlüsselte Transportschicht oberhalb der normalen Kommunikationsschicht und kann daher zusammen mit vielen Netzdiensten benutzt werden. Anwendungsbeispiele für OpenSSL sind die verschlüsselte Authentifizierung von E-Mail-Clients oder Web-Transaktionen wie das Bezahlen mit einer Kreditkarte. OpenSSL kann während des Baus in viele Ports, wie www/apache13-ssl und mail/sylpheed-claws, integriert werden. Ist beim Aufruf von make die Variable WITH_OPENSSL_BASE nicht explizit auf yes gesetzt, baut die Ports-Sammlung meist den Port security/openssl. Das OpenSSL von &os; stellt die Protokolle Secure Sockets Layer v2/v3 (SSLv2/SSLv3) und Transport Layer Security v1 (TLSv1) zur Verfügung. Die OpenSSL-Bibliotheken stellen kryptographische Funktionen bereit. Mit OpenSSL kann der IDEA-Algorithmus verwendet werden, wegen Patenten in den USA ist der Algorithmus in der Voreinstellung allerdings deaktiviert. Wenn Sie die IDEA-Lizenz akzeptieren, können Sie den IDEA-Algorithmus aktivieren, indem Sie die Variable MAKE_IDEA in make.conf setzen. Meist wird OpenSSL eingesetzt, um Zertifikate für Anwendungen bereitzustellen. Die Zertifikate stellen die Identität einer Firma oder eines Einzelnen sicher. Wenn ein Zertifikat nicht von einer Zertifizierungsstelle (Certificate Authority, CA) gegengezeichnet wurde, erhalten Sie normalerweise eine Warnung. Eine Zertifizierungsstelle ist eine Firma wie VeriSign, die Zertifikate von Personen oder Firmen gegenzeichnet und damit die Korrektheit der Zertifikate bestätigt. Diese Prozedur kostet Geld, ist aber keine Voraussetzung für den Einsatz von Zertifikaten, beruhigt aber sicherheitsbewusste Benutzer. Zertifikate erzeugen OpenSSL Zertifikate erzeugen Ein Zertifikat erzeugen Sie mit dem nachstehenden Kommando: &prompt.root; openssl req -new -nodes -out req.pem -keyout cert.pem Generating a 1024 bit RSA private key ................++++++ .......................................++++++ writing new private key to 'cert.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:PA Locality Name (eg, city) []:Pittsburgh Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []:Systems Administrator Common Name (eg, YOUR name) []:localhost.example.org Email Address []:trhodes@FreeBSD.org Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:SOME PASSWORD An optional company name []:Another Name Beachten Sie bitte, dass die Eingabe bei Common Name ein gültiger Domain-Name sein muss. Eine andere Eingabe erzeugt ein unbrauchbares Zertifikat. Das Zertifikat kann mit einer Gültigkeitsdauer und anderen Verschlüsselungsalgorithmen erzeugt werden. Die Hilfeseite &man.openssl.1; beschreibt die zur Verfügung stehenden Optionen. Das Verzeichnis, in dem Sie den letzten Befehl ausgeführt haben, enthält nun zwei Dateien: Die Anforderung für ein neues Zertifikat wurde in req.pem gespeichert. Diese Datei können Sie an eine Zertifizierungsstelle senden, wo Ihre Angaben geprüft werden. Nach erfolgreicher Prüfung wird das Zertifikat an Sie zurückgesandt. Die zweite Datei, cert.pem, enthält den privaten Schlüssel für Ihr Zertifikat und darf auch keine Fall in fremde Hände geraten, da ein Angreifer sonst in der Lage ist, anderen Personen oder Rechnern vorzugaukeln, dass es sich bei ihm um Sie handelt. Wenn Sie keine Signatur einer Zertifizierungsstelle benötigen, können Sie ein selbst-signiertes Zertifikat erstellen. Erzeugen Sie dazu zuerst einen RSA-Schlüssel: &prompt.root; openssl dsaparam -rand -genkey -out myRSA.key 1024 Erzeugen Sie dann den CA-Schlüssel: &prompt.root; openssl gendsa -des3 -out myca.key myRSA.key Erstellen Sie mit diesem Schlüssel das Zertifikat: &prompt.root; openssl req -new -x509 -days 365 -key myca.key -out new.crt Zwei neue Dateien befinden sich nun im Verzeichnis: Der Schlüssel der Zertifizierungsstelle myca.key und das Zertifikat selbst, new.crt. Sie sollten in einem Verzeichnis, vorzugsweise unterhalb von /etc abgelegt werden, das nur von root lesbar ist. Setzen Sie die Zugriffsrechte der Dateien mit chmod auf 0700. Beispiel für Zertifikate Was fangen Sie mit einem Zertifikat an? Sie könnten damit beispielsweise die Verbindungen zu Sendmail verschlüsseln. Dies würde die Klartext-Authentifizierung für Benutzer des lokalen MTA überflüssig machen. Das ist nicht unbedingt die beste Lösung, da einige MUAs Warnungen ausgeben, wenn ein Zertifikat nicht lokal installiert ist. Die Installation von Zertifikaten wird in der Dokumentation der MUAs beschrieben. Ergänzen Sie die Konfigurationsdatei von sendmail (.mc) um die nachstehenden Zeilen: dnl SSL Options define(`confCACERT_PATH',`/etc/certs')dnl define(`confCACERT',`/etc/certs/new.crt')dnl define(`confSERVER_CERT',`/etc/certs/new.crt')dnl define(`confSERVER_KEY',`/etc/certs/myca.key')dnl define(`confTLS_SRV_OPTIONS', `V')dnl - Im Verzeichnis - /etc/certs - befindet sich der Schlüssel und das Zertifikat. - Bauen Sie danach im Verzeichnis - /etc/mail - mit dem Kommando make install - die .cf-Datei und starten - Sie anschließend sendmail - mit make restart neu. + Im Verzeichnis /etc/certs + befindet sich der Schlüssel und das Zertifikat. Bauen Sie danach + im Verzeichnis /etc/mail + mit dem Kommando make + install die + .cf-Datei und starten Sie anschließend + sendmail mit make + restart neu. Wenn alles gut ging, erscheinen keine Fehlermeldungen in der Datei /var/log/maillog und Sie sehen sendmail in der Prozessliste. Testen Sie nun den Mailserver mit dem Kommando &man.telnet.1;: &prompt.root; telnet example.com 25 Trying 192.0.34.166... Connected to example.com. Escape character is '^]'. 220 example.com ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT) ehlo example.com 250-example.com Hello example.com [192.0.34.166], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH LOGIN PLAIN 250-STARTTLS 250-DELIVERBY 250 HELP quit 221 2.0.0 example.com closing connection Connection closed by foreign host. Wenn in einer Zeile STARTTLS erscheint, hat alles funktioniert. Nik Clayton
nik@FreeBSD.org
Geschrieben von
VPNs mit IPsec IPsec Dieser Abschnitt beschreibt, wie Sie mit &os;-Gateways ein Virtual-Private-Network (VPN) einrichten. Als Beispiel wird ein VPN zwischen zwei Netzen verwendet, die über das Internet miteinander verbunden sind. Hiten M. Pandya
hmp@FreeBSD.org
Geschrieben von
IPsec Grundlagen - Dieser Abschnitt zeigt Ihnen, wie Sie IPsec einrichten - und damit &os;-Systeme und µsoft.windows; 2000/XP Systeme - sicher miteinander verbinden. Um IPsec einzurichten, - sollten Sie einen neuen Kernel erzeugen können (siehe + Dieser Abschnitt zeigt Ihnen, wie Sie IPsec einrichten. Um IPsec + einzurichten, sollten Sie einen neuen Kernel bauen können (siehe ). IPsec ist ein Protokoll, das auf dem Internet-Protokoll (IP) aufbaut. Mit IPsec können mehrere Systeme geschützt miteinander kommunizieren. Das in - &os; realisierte IPsec-Protokoll baut auf der - KAME-Implementierung + &os; realisierte IPsec-Protokoll baut auf der KAME-Implementierung auf und unterstützt sowohl IPv4 als auch IPv6. - - &os enthält eine von Hardware - beschleunigte Variante des IPsec-Protokolls. Diese - Variante wurde von OpenBSD übernommen und wird - Fast-IPsec genannt. Das - &man.crypto.4;-Subsystem arbeitet mit Kryptographie-Hardware - zusammen, die IPsec beschleunigt. Das Subsystem - ist neu und bietet noch nicht alle Funktionen, die - KAME-IPsec bietet. Wenn Sie die Hardware-Beschleunigung - nutzen wollen, fügen Sie folgende Zeile der - Kernelkonfiguration hinzu: - - - Kerneloption - FAST_IPSEC - - - options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) - - Momentan können Sie Fast-IPsec - nicht zusammen mit KAME-IPsec benutzen. Weiteres zu - Fast-IPsec erfahren Sie in der - Hilfeseite &man.fast.ipsec.4;. - - - - Damit Firewalls den Status von &man.gif.4;-Tunneln - überwachen können, müssen Sie die Option - in Ihrer - Kernelkonfiguration aktivieren: - - options IPSEC_FILTERGIF #filter ipsec packets from a tunnel - - IPsec ESP IPsec AH IPsec besteht wiederum aus zwei Protokollen: Encapsulated Security Payload (ESP) verschlüsselt IP-Pakete mit einem symmetrischen Verfahren (beispielsweise Blowfish oder 3DES). Damit werden die Pakete vor Manipulationen Dritter geschützt. Der Authentication Header (AH) - enthät eine kryptographische Prüsumme, + enthät eine kryptographische Prüfsumme, die sicher stellt, dass ein IP-Paket nicht verändert wurde. Der Authentication-Header folgt nach dem normalen IP-Header und erlaubt dem Empfänger eines IP-Paketes, dessen Integrität zu prüfen. ESP und AH können, je nach Situation, zusammen oder einzeln verwendet werden. VPN Virtual Private Network VPN IPsec kann in zwei Modi betrieben werden: Der Transport-Modus verschlüsselt die Daten zwischen zwei Systemen. Der Tunnel-Modus verbindet zwei Subnetze miteinander. Durch einen Tunnel können dann beispielsweise verschlüsselte Daten übertragen werden. Ein Tunnel wird auch als Virtual-Private-Network (VPN) bezeichnet. Detaillierte Informationen über das IPsec-Subsystem von &os; enthält die Hilfeseite &man.ipsec.4;. Die folgenden Optionen in der Kernelkonfiguration aktivieren IPsec: Kerneloption IPSEC - - Kerneloption - IPSEC_ESP - - options IPSEC #IP security -options IPSEC_ESP #IP security (crypto; define w/ IPSEC) +device crypto Kerneloption IPSEC_DEBUG Wenn Sie zur Fehlersuche im IPsec-Subsystem Unterstützung wünschen, sollten Sie die folgende Option ebenfalls aktivieren: options IPSEC_DEBUG #debug for IP security
Was ist ein VPN? Es gibt keinen Standard, der festlegt, was ein Virtual-Private-Network ist. VPNs können mit verschiedenen Techniken, die jeweils eigene Vor- und Nachteile besitzen, implementiert werden. Dieser Abschnitt stellt eine Möglichkeit vor, ein VPN aufzubauen. - VPN zwischen zwei Netzen über das Internet + Das Szenario: Zwei Netzwerke, ein Heim- und ein + Firmennetzwerk. Beide sind mit dem Internet verbunden und + verhalten sich dank <acronym>VPN</acronym> wie ein Netzwerk. VPN einrichten Dieses Szenario hat die folgenden Vorausetzungen: Es müssen zwei Netzwerke vorhanden sein. Beide Netzwerke müssen intern IP benutzen. - Beide Netzwerke sind über einen &os;-Gateway + Beide Netzwerke sind über ein &os;-Gateway mit dem Internet verbunden. Der Gateway jedes Netzwerks besitzt mindestens eine öffentliche IP-Adresse. Die intern verwendeten IP-Adressen können private oder öffentliche Adressen sein. - Der Gateway kann, wenn nötig, IP-Adressen mit - NAT umschreiben. - - - - Die IP-Adressen der internen Netzwerke - dürfen nicht überlappen. - Mit NAT ließe sich diese Anforderung zwar umgehen, doch - wäre die Konfiguration und Pflege des resultierenden - Netzwerks zu aufwändig. + Sie dürfen sich nicht überlappen; zum Beispiel: + nicht beide sollten 192.168.1.x + benutzen. + - Wenn die zu verbindenden Netzwerke intern dieselben - IP-Adressen benutzen (beispielsweise - 192.168.1.x), müssen - einem der Netzwerke neue IP-Adressen zugewiesen werden. - - Die Netzwerktopologie sieht wie folgt aus: - - - - - - - -Netzwerk #1 [ Interne Rechner ] Privates Netz, 192.168.1.2-254 - [ Win9x/NT/2K ] - [ UNIX ] - | - | - .---[fxp1]---. Private IP, 192.168.1.1 - | FreeBSD | - `---[fxp0]---' Öffentliche IP, A.B.C.D - | - | - -=-=- Internet -=-=- - | - | - .---[fxp0]---. Öffentliche IP, W.X.Y.Z - | FreeBSD | - `---[fxp1]---' Private IP, 192.168.2.1 - | - | -Netzwerk #2 [ Interne Rechner ] - [ Win9x/NT/2K ] Privates Netz, 192.168.2.2-254 - [ UNIX ] - - - - Beachten Sie die beiden öffentlichen IP-Adressen. - Im Folgenden werden sie durch Buchstaben (als Platzhalter) - gekennzeichnet. Setzen Sie hierfür Ihre eigenen - öffentlichen IP-Adressen ein. Beide Gateways - besitzen die interne Adresse - x.x.x.1 und beide - Netzwerke besitzen unterschiedliche private IP-Adressen: - 192.168.1.x und - 192.168.2.x. Die Default-Route - aller internen Systeme ist jeweils die Gateway-Maschine - (x.x.x.1). - - Aus der Sicht der Systeme sollen jetzt beide - Netzwerke wie über einen Router, der in diesem - Fall etwas langsamer ist, verbunden werden. - - Auf dem Rechner 192.168.1.20 - soll also beispielsweise der folgende Befehl funktionieren: - - ping 192.168.2.34 - - &windows;-Systeme sollen die Systeme auf dem anderen - Netzwerk erkennen und Shares sollen funktionieren. Alles - soll genauso wie in lokalen Netzwerken funktionieren. - - Zusätzlich soll die Kommunikation zwischen beiden - Netzwerken noch verschlüsselt werden. - - Das VPN wird in mehreren Schritten aufgebaut: - - - - Zuerst wird eine virtuelle Verbindung zwischen - beiden Netzwerken über das Internet eingerichtet. - Die virtuelle Verbindung können Sie mit Werkzeugen - wie &man.ping.8; prüfen. - - - - Danach wird eine Sicherheitsrichtlinie - (Security-Policy) festgelegt, - die automatisch den Datenverkehr zwischen beiden - Netzwerken verschlüsselt und entschlüsselt. - Mit Werkzeugen wie &man.tcpdump.1; können Sie - überprüfen, dass die Daten tatsächlich - verschlüsselt werden. - + + + + + Tom + Rhodes + +
trhodes@FreeBSD.org
+
+ Geschrieben von +
+
+
- - Wenn sich &windows;-Systeme im VPN gegenseitig - erkennen sollen, so sind noch weitere - Konfigurationsschritte notwendig, die aber nicht - in diesem Abschnitt beschrieben werden. - -
+ Konfiguration von IPsec in &os; + + Als erstes muss security/ipsec-tools aus + der Ports-Sammlung installiert werden. Dieses Softwarepaket + Dritter enthält einige Anwendungen, die ihnen bei der + Konfiguration von IPsec helfen. + + Als nächstes müssen zwei &man.gif.4;-Pseudogeräte + angelegt werden, um die Pakete zu tunneln und dafür zu sorgen, + dass beide Netzwerke richtig miteinander kommunizieren können. + Geben Sie als Benutzer root die folgenden Befehle + ein: Austausch der internen und + externen Werte durch die realen internen + und externen Gateways: + + &prompt.root; ifconfig gif0 create + &prompt.root; ifconfig gif0 internal1 internal2 + &prompt.root; ifconfig gif0 tunnel external1 external2 + + Beispiel: Die öffentliche IP-Adresse + des Firmennetzwerkes (LAN) ist: + 172.16.5.4 mit einer internen + IP-Adresse von + 10.246.38.1. Das Heimnetzwerk + (LAN) hat die öffentliche + IP-Adresse + 192.168.1.12 mit der internen + privaten IP-Adresse + 10.0.0.5. + + Dies mag verwirrend erscheinen, schauen Sie sich deshalb + das folgende Beispiel aus dem &man.ifconfig.8;-Befehl an: + + Gateway 1: + +gif0: flags=8051 mtu 1280 +tunnel inet 172.16.5.4 --> 192.168.1.12 +inet6 fe80::2e0:81ff:fe02:5881%gif0 prefixlen 64 scopeid 0x6 +inet 10.246.38.1 --> 10.0.0.5 netmask 0xffffff00 + +Gateway 2: + +gif0: flags=8051 mtu 1280 +tunnel inet 192.168.1.12 --> 172.16.5.4 +inet 10.0.0.5 --> 10.246.38.1 netmask 0xffffff00 +inet6 fe80::250:bfff:fe3a:c1f%gif0 prefixlen 64 scopeid 0x4 + + Wenn Sie fertig sind, sollten beide privaten + IPs mit dem &man.ping.8; Befehl, wie die folgende + Darstellung zeigt, erreichbar sein: + + priv-net# ping 10.0.0.5 +PING 10.0.0.5 (10.0.0.5): 56 data bytes +64 bytes from 10.0.0.5: icmp_seq=0 ttl=64 time=42.786 ms +64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=19.255 ms +64 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=20.440 ms +64 bytes from 10.0.0.5: icmp_seq=3 ttl=64 time=21.036 ms +--- 10.0.0.5 ping statistics --- +4 packets transmitted, 4 packets received, 0% packet loss +round-trip min/avg/max/stddev = 19.255/25.879/42.786/9.782 ms + +corp-net# ping 10.246.38.1 +PING 10.246.38.1 (10.246.38.1): 56 data bytes +64 bytes from 10.246.38.1: icmp_seq=0 ttl=64 time=28.106 ms +64 bytes from 10.246.38.1: icmp_seq=1 ttl=64 time=42.917 ms +64 bytes from 10.246.38.1: icmp_seq=2 ttl=64 time=127.525 ms +64 bytes from 10.246.38.1: icmp_seq=3 ttl=64 time=119.896 ms +64 bytes from 10.246.38.1: icmp_seq=4 ttl=64 time=154.524 ms +--- 10.246.38.1 ping statistics --- +5 packets transmitted, 5 packets received, 0% packet loss +round-trip min/avg/max/stddev = 28.106/94.594/154.524/49.814 ms + + Wie erwartet, können nun beiden Seiten + ICMP-Pakete von ihren privaten Adressen + senden und empfangen. Als nächstes müssen beide + Gateways so konfiguriert werden, dass sie die Pakete des anderen + Netzwerkes richtig routen. Mit dem folgenden Befehl + erreicht man das Ziel: + + &prompt.root; corp-net# route add 10.0.0.0 10.0.0.5 255.255.255.0 + &prompt.root; corp-net# route add net 10.0.0.0: gateway 10.0.0.5 + + &prompt.root; priv-net# route add 10.246.38.0 10.246.38.1 255.255.255.0 + &prompt.root; priv-net# route add host 10.246.38.0: gateway 10.246.38.1 + + Ab jetzt sollten die Rechner von den Gateways sowie von den + Rechnern hinter den Gateways erreichbar sein. Dies wird an dem + folgendem Beispiel deutlich: + + corp-net# ping 10.0.0.8 +PING 10.0.0.8 (10.0.0.8): 56 data bytes +64 bytes from 10.0.0.8: icmp_seq=0 ttl=63 time=92.391 ms +64 bytes from 10.0.0.8: icmp_seq=1 ttl=63 time=21.870 ms +64 bytes from 10.0.0.8: icmp_seq=2 ttl=63 time=198.022 ms +64 bytes from 10.0.0.8: icmp_seq=3 ttl=63 time=22.241 ms +64 bytes from 10.0.0.8: icmp_seq=4 ttl=63 time=174.705 ms +--- 10.0.0.8 ping statistics --- +5 packets transmitted, 5 packets received, 0% packet loss +round-trip min/avg/max/stddev = 21.870/101.846/198.022/74.001 ms + +priv-net# ping 10.246.38.107 +PING 10.246.38.1 (10.246.38.107): 56 data bytes +64 bytes from 10.246.38.107: icmp_seq=0 ttl=64 time=53.491 ms +64 bytes from 10.246.38.107: icmp_seq=1 ttl=64 time=23.395 ms +64 bytes from 10.246.38.107: icmp_seq=2 ttl=64 time=23.865 ms +64 bytes from 10.246.38.107: icmp_seq=3 ttl=64 time=21.145 ms +64 bytes from 10.246.38.107: icmp_seq=4 ttl=64 time=36.708 ms +--- 10.246.38.107 ping statistics --- +5 packets transmitted, 5 packets received, 0% packet loss +round-trip min/avg/max/stddev = 21.145/31.721/53.491/12.179 ms + + Das Konfigurieren der Tunnel ist der einfache Teil. Die + Konfiguration einer sicheren Verbindung geht sehr viel mehr in + die Tiefe. Die folgende Konfiguration benutzt pre-shared + (PSK) RSA-Schlüssel. + Abgesehen von den IP-Adressen, sind beide + /usr/local/etc/racoon/racoon.conf identisch + und sehen ähnlich aus wie: + + path pre_shared_key "/usr/local/etc/racoon/psk.txt"; #location of pre-shared key file +log debug; #log verbosity setting: set to 'notify' when testing and debugging is complete + +padding # options are not to be changed +{ + maximum_length 20; + randomize off; + strict_check off; + exclusive_tail off; +} + +timer # timing options. change as needed +{ + counter 5; + interval 20 sec; + persend 1; +# natt_keepalive 15 sec; + phase1 30 sec; + phase2 15 sec; +} + +listen # address [port] that racoon will listening on +{ + isakmp 172.16.5.4 [500]; + isakmp_natt 172.16.5.4 [4500]; +} + +remote 192.168.1.12 [500] +{ + exchange_mode main,aggressive; + doi ipsec_doi; + situation identity_only; + my_identifier address 172.16.5.4; + peers_identifier address 192.168.1.12; + lifetime time 8 hour; + passive off; + proposal_check obey; +# nat_traversal off; + generate_policy off; + + proposal { + encryption_algorithm blowfish; + hash_algorithm md5; + authentication_method pre_shared_key; + lifetime time 30 sec; + dh_group 1; + } +} + +sainfo (address 10.246.38.0/24 any address 10.0.0.0/24 any) # address $network/$netmask $type address $network/$netmask $type ( $type being any or esp) +{ # $network must be the two internal networks you are joining. + pfs_group 1; + lifetime time 36000 sec; + encryption_algorithm blowfish,3des,des; + authentication_algorithm hmac_md5,hmac_sha1; + compression_algorithm deflate; +} + + Die Erklärung einer jeden verfügbaren Option würde + den Rahmen dieses Textes sprengen. Es gibt sehr viele + relevante Informationen in der + racoon-Konfigurationsanleitung. + + Die SPD-Methoden müssn noch konfiguriert + werden so dass, &os; und racoon in der + Lage sind den Netzwerkverkehr zwischen den Hosts zu ver- + und entschlüsseln. + + Dies wird durch ein einfaches Shellscript ähnlich wie das + folgende, das auf dem Firmennetzwerk-Gateway liegt, + ausgeführt. Diese Datei wird während der + Systeminitialisierung ausgeführt und sollte unter + /usr/local/etc/racoon/setkey.conf + abgespeichert werden. + +flush; +spdflush; + +# To the home network +spdadd 10.246.38.0/24 10.0.0.0/24 any -P out ipsec esp/tunnel/172.16.5.4-192.168.1.12/use; +spdadd 10.0.0.0/24 10.246.38.0/24 any -P in ipsec esp/tunnel/192.168.1.12-172.16.5.4/use; + + Einmal abgespeichert, kann racoon + durch das folgende Kommando auf beiden Gateways gestartet + werden: - - Schritt 1: Die virtuelle Verbindung einrichten - - Nehmen wir an, sie wollten von der Gateway-Maschine - im Netzwerk #1 (öffentliche IP-Adresse - A.B.C.D, private IP-Adresse - 192.168.1.1) das Kommando - ping 192.168.2.1 absetzen. - 192.168.2.1 ist die private - IP-Adresse des Systems W.X.Y.Z - im Netzwerk #2. Welche Voraussetzungen müssen - erfüllt sein, damit der Befehl funktioniert? - - - - Die Gateway-Maschine muss das System - 192.168.2.1 erreichen - können. Das heißt, eine Route zu diesem - System muss existieren. - - - - Private IP-Adressen, wie der Bereich - 192.168.x, sollten im - Internet nicht verwendet werden. Jedes Paket zu - 192.168.2.1 muss daher - in ein anderes Paket gepackt werden, das von - A.B.C.D kommt und - zu W.X.Y.Z geschickt - wird. Das erneute Verpacken der Pakete wird als - Kapselung bezeichnet. - - - - Wenn das Paket W.X.Y.Z - erreicht, muss es dort ausgepackt und an - 192.168.2.1 ausgeliefert - werden. - - - - Sie können sich diese Prozedur so vorstellen, - dass ein Tunnel zwischen beiden Netzwerken existiert. - Die beiden Tunnel-Enden besitzen die IP-Adressen - A.B.C.D und - W.X.Y.Z. Der Tunnel - muss zudem Verkehr zwischen den privaten IP-Adressen - erlauben und transportiert so Daten zwischen privaten - IP-Adressen über das Internet. - - Unter &os; wird der Tunnel mit - gif-Geräten (generic - interface) erstellt. Auf jedem Gateway - muss das gif-Gerät mit - vier IP-Adressen eingerichtet werden: Zwei öffentliche - IP-Adressen und zwei private IP-Adressen. - - Die gif-Geräte werden vom - Kernel bereitgestellt und müssen in der - Kernelkonfigurationsdatei auf beiden Maschinen angegeben - werden: + &prompt.root; /usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf -l /var/log/racoon.log + + Die Ausgabe sollte so ähnlich aussehen: + + corp-net# /usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf +Foreground mode. +2006-01-30 01:35:47: INFO: begin Identity Protection mode. +2006-01-30 01:35:48: INFO: received Vendor ID: KAME/racoon +2006-01-30 01:35:55: INFO: received Vendor ID: KAME/racoon +2006-01-30 01:36:04: INFO: ISAKMP-SA established 172.16.5.4[500]-192.168.1.12[500] spi:623b9b3bd2492452:7deab82d54ff704a +2006-01-30 01:36:05: INFO: initiate new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0] +2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=28496098(0x1b2d0e2) +2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.12[0] spi=47784998(0x2d92426) +2006-01-30 01:36:13: INFO: respond new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0] +2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=124397467(0x76a279b) +2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.12[0] spi=175852902(0xa7b4d66) + + Um sicherzustellen, dass der Tunnel richtig funktioniert, + wechseln Sie auf eine andere Konsole und benutzen Sie + &man.tcpdump.1; mit dem folgenden Befehl, um sich den + Netzwerkverkehr anzusehen. Tauschen Sie em0 + durch die richtige Netzwerkkarte aus. + + &prompt.root; tcpdump -i em0 host 172.16.5.4 and dst 192.168.1.12 + + Die Ausgabe der Konsole sollte dem hier ähneln. Wenn + nicht, gibt es ein Problem und ein Debuggen der ausgegebenen + Daten ist notwendig. + + 01:47:32.021683 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xa) +01:47:33.022442 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xb) +01:47:34.024218 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xc) + + An diesem Punkt sollten beide Netzwerke verfügbar sein und + den Anschein haben, dass sie zum selben Netzwerk gehören. + Meistens sind beide Netzwerke durch eine Firewall geschützt. + Um den Netzwerkverkehr zwischen den beiden Netzwerken zu erlauben, + ist es notwendig Regeln zu erstellen. Für die &man.ipfw.8; + Firewall fügen Sie folgende Zeilen in ihre + Firewall-Konfigurationsdatei ein: + + ipfw add 00201 allow log esp from any to any +ipfw add 00202 allow log ah from any to any +ipfw add 00203 allow log ipencap from any to any +ipfw add 00204 allow log udp from any 500 to any - device gif - - Wie gewöhnlich müssen Sie danach einen - neuen Kernel erstellen, installieren und das System - neu starten. - - Der Tunnel wird in zwei Schritten aufgebaut. Mit - &man.ifconfig.8; werden zuerst die öffentlichen - IP-Adressen konfiguriert. Anschließend werden - die privaten IP-Adressen mit &man.ifconfig.8; eingerichtet. - - Auf der Gateway-Maschine im Netzwerk #1 bauen - Sie den Tunnel mit den folgenden Kommandos auf: - - &prompt.root; ifconfig gif0 create -&prompt.root; ifconfig gif0 tunnel A.B.C.D W.X.Y.Z -&prompt.root; ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff - - - Auf dem anderen Gateway benutzen Sie dieselben Kommandos, - allerdings mit vertauschten IP-Adressen: - - &prompt.root; ifconfig gif0 create -&prompt.root; ifconfig gif0 tunnel W.X.Y.Z A.B.C.D -&prompt.root; ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff - - - Die Konfiguration können Sie anschließend mit - dem folgenden Kommando überprüfen: - - ifconfig gif0 - - Auf dem Gateway in Netzwerk #1 sollten Sie - beispielsweise die nachstehende Ausgabe erhalten: - - &prompt.root; ifconfig gif0 -gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280 - tunnel inet A.B.C.D --> W.X.Y.Z - inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff - - - Wie Sie sehen, ist ein Tunnel zwischen den IP-Adressen - A.B.C.D und - W.X.Y.Z aufgebaut worden, - der Verkehr zwischen den Adressen - 192.168.1.1 und - 192.168.2.1 zulässt. - - Gleichzeitig wurde ein Eintrag in der Routing-Tabelle - erstellt, den Sie sich mit netstat -rn - ansehen können. Auf der Gateway-Maschine in Netzwerk #1 - sieht das so aus: - - &prompt.root; netstat -rn -Routing tables - -Internet: -Destination Gateway Flags Refs Use Netif Expire -... -192.168.2.1 192.168.1.1 UH 0 0 gif0 -... - - Die Route ist eine Host-Route, wie in der Spalte - Flags angegeben. Das heißt - die beiden Gateways wissen wie sie einander erreichen, - sie kennen allerdings nicht das Netzwerk auf der - anderen Seite. Dieses Problem werden wir gleich - angehen. - - Wahrscheinlich ist auf beiden Gateways eine Firewall - eingerichtet. Für den VPN-Verkehr muss die Firewall - umgegangen werden. Sie können generell den Verkehr - zwischen beiden Netzwerken erlauben oder Regeln erstellen, - die beide Tunnel-Enden des VPNs voreinander schützen. - - Der Test des VPNs wird erheblich leichter, wenn Sie - jeden Verkehr zwischen den Tunnel-Enden in der Firewall - erlauben. Wenn Sie auf der Gateway-Maschine &man.ipfw.8; - einsetzen, erlaubt die folgende Regel jeden Verkehr - zwischen den Tunnel-Enden, ohne die anderen Regeln zu - beeinflussen: - - ipfw add 1 allow ip from any to any via gif0 - - Diese Regel muss offensichtlich auf beiden Gateway-Maschinen - existieren. - - Damit sollten Sie das Kommando ping - jetzt absetzen können. Auf dem System - 192.168.1.1 sollte der - nachstehende Befehl Antworten erhalten: - - ping 192.168.2.1 - - Denselben Test können Sie auch auf der anderen - Gateway-Maschine ausführen. - - Allerdings können Sie noch nicht die anderen - internen Maschinen auf den Netzwerken erreichen. Die Ursache - ist das Routing – die Gateway kennen sich zwar - gegenseitig, wissen aber noch nichts von den Netzwerken - hinter dem anderen Gateway. - - Um die Netzwerke bekannt zu geben, muss auf jeder - Gateway-Maschine noch eine statische Route hinzugefügt - werden. Auf der ersten Gateway-Maschine setzen Sie dazu - das folgende Kommando ab: - - route add 192.168.2.0 192.168.2.1 netmask 0xffffff00 - - Dies entspricht der Anweisung: Um Rechner - auf dem Netz 192.168.2.0 - zu erreichen, schicke die Pakete zum System - 192.168.2.1. Auf - dem anderen Gateway muss das analoge Kommando (mit den - IP-Adressen 192.168.1.x) - abgesetzt werden. - - Damit ist jetzt der IP-Verkehr zwischen beiden - Netzwerken möglich. - - Zwei Drittel des VPNs zwischen beiden Netzen - ist nun eingerichtet. Es ist virtuell und - es ist ein Netzwerk. Es ist allerdings - noch nicht privat. Dies können Sie - mit &man.ping.8; und &man.tcpdump.1; überprüfen. - Setzen Sie auf dem ersten Gateway den folgenden Befehl ab: - - tcpdump dst host 192.168.2.1 - - Starten Sie dann, ebenfalls auf dem ersten Gateway, den - folgenden Befehl: - - ping 192.168.2.1 - - Sie werden die nachstehende Ausgabe erhalten: - - 16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request -16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply -16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request -16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply -16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request -16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply - - Die ICMP-Nachrichten werden unverschlüsselt - übertragen. Mit der Option - von &man.tcpdump.1; können Sie sich weitere Daten - der Pakete anzeigen lassen. - - Die Daten sollen aber automatisch verschlüsselt - werden. Wie das geht, wird im nächsten Abschnitt - erläutert. - - - Zusammenfassung - - Fügen Sie in beiden Kerneln die Zeile - device gif ein und bauen Sie die Kernel - neu. - - - - Fügen Sie auf dem Gateway in Netzwerk #1 - folgende Zeilen in /etc/rc.conf - ein: - - gif_interfaces="gif0" -gifconfig_gif0="A.B.C.D W.X.Y.Z" -ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff" -static_routes="vpn" -route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00" - - Setzen Sie dabei die richtigen IP-Adressen für - die Platzhalter ein. - - - - Fügen Sie auf beiden Gateways die nachstehende - Regel in das Firewall-Skript (zum Beispiel - /etc/rc.firewall) ein: - - ipfw add 1 allow ip from any to any via gif0 - - - - Nehmen Sie in /etc/rc.conf auf dem - Gateway #2 analoge Änderungen, die IP-Adressen - müssen vertauscht werden, vor. - - - + + Die Regelnummern müssen eventuell, je nach ihrer + Hostkonfiguration, angepasst werden. + - - Schritt 2: Die Verbindung mit IPsec schützen - - Um die Verbindung zu schützen, verwenden wir IPsec. - IPsec bietet einen Mechanismus, mit dem sich zwei - Systeme auf einen Schlüssel einigen können. - Mit diesem Schlüssel wird dann der Datenverkehr zwischen - beiden Systemen verschlüsselt. - - Es gibt hierbei zwei Sachen die konfiguriert werden - müssen: - - - - Die Security-Association bestimmt, - mit welchen Methoden der Verkehr zwischen beiden Systemen - verschlüsselt wird. - - - - Die Security-Policy bestimmt, - was verschlüsselt wird. Es soll ja nicht der - gesamte Datenverkehr nach außen verschlüsselt - werden, sondern nur der Teil des Verkehrs, der zum - VPN gehört. - - - - Die Security-Association wie auch die Security-Policy - werden vom Kernel verwaltet und können von Anwendungen - verändert werden. Dazu müssen allerdings zuerst - IPsec und das Encapsulated-Security-Payload (ESP) Protokoll - in die Kernelkonfigurationsdatei eingetragen werden: - - - Kerneloption - IPSEC - - - options IPSEC -options IPSEC_ESP - - Wie üblich, müssen Sie danach den Kernel - übersetzen, installieren und das System neu starten. - Die Kernel müssen auf beiden Gateway-Maschinen - neu erstellt werden. - - - IKE - - - Sie können die Security-Association auf zwei - Arten konfigurieren: Manuell, dann müssen Sie - den Verschlüsselungsalgorithmus, die Schlüssel - und alles Weitere selbst konfigurieren. Oder automatisch, - mithilfe eines Dæmons, der das Internet-Key-Exchange - Protokoll (IKE) beherrscht. - - Im Allgemeinen wird die letzte Variante bevorzugt. - Sie ist auch wesentlich leichter einzurichten. - - - IPsec - Security-Policy - - - - setkey - - - Mit &man.setkey.8; können Sie Security-Policies - editieren und anzeigen. Die Beziehung von - setkey und der Tabelle der - Security-Policies im Kernel entspricht - dem Verhältnis von &man.route.8; und der Routing-Tabelle. - Die momentanen Security-Associations lassen sich ebenfalls - mit setkey anzeigen; - setkey verhält sich in diesem Fall - wie netstat -r, um die Analogie - fortzuführen. - - Sie haben die Wahl zwischen mehreren Programmen, - wenn Sie Security-Associations mit &os; verwalten - wollen. Im Folgenden wird racoon - beschrieben, das Sie über den Port security/ipsec-tools - installieren können. - - - racoon - - - Auf beiden Gateway-Maschinen muss - racoon laufen. - Konfiguriert wird jeweils die IP-Adresse der Gegenstelle - sowie der geheime Schlüssel. Dabei muss auf beiden - Gateway-Maschinen der gleiche Schlüssel verwendet - werden. - - Die beiden raccon-Daemonen prüfen mithilfe des - geheimen Schlüssels gegenseitig ihre Identität. - Anschließend generieren Sie einen neuen geheimen - Schlüssel, mit dem dann der Datenverkehr im VPN - verschlüsselt wird. Dieser Schlüssel wird - von Zeit zu Zeit geändert. Ein Angreifer, - der einen der Schlüssel geknackt hat – das ist - schon ziemlich unwahrscheinlich – kann somit nicht - viel mit diesem Schlüssel anfangen, da schon wieder ein - anderer Schlüssel verwendet wird. - - Die Konfiguration von racoon befindet sich in - ${PREFIX}/etc/racoon. In der - dort befindlichen Konfigurationsdatei sollten Sie nicht - allzu viele Änderungen vornehmen müssen. - Sie müssen allerdings den so genannten - Pre-Shared-Key (den vorher ausgetauschten - Schlüssel) ändern. - - In der Voreinstellung befindet sich dieser Schlüssel - in der Datei ${PREFIX}/etc/racoon/psk.txt. - Dieser Schlüssel wird nicht zum - Verschlüsseln des Datenverkehrs verwendet. Er dient - lediglich der Authentifizierung der beiden racoon-Daemonen. - - Für jeden entfernten Kommunikationspartner enthält - psk.txt eine Zeile. Damit besteht die - Datei psk.txt in unserem Beispiel - aus einer Zeile (wir verwenden einen entfernten - Kommunikationspartner). - - Auf dem Gateway #1 sieht diese Zeile wie - folgt aus: - - W.X.Y.Z geheim - - Die Zeile besteht aus der öffentlichen IP-Adresse - der Gegenstelle, Leerzeichen und dem geheimen Schlüssel. - Sie sollten natürlich nicht geheim - verwenden. Für den geheimen Schlüssel gelten - dieselben Regeln wie für Passwörter. - - Auf dem anderen Gateway sieht die Zeile - folgendermaßen aus: - - A.B.C.D geheim - - Die Zeile besteht aus der öffentlichen IP-Adresse - der Gegenstelle, Leerzeichen und dem geheimen Schlüssel. - Die Zugriffsrechte von psk.txt müssen - auf 0600 (Lese- und Schreibzugriff nur - für root) gesetzt sein, bevor - racoon gestartet wird. - - Auf beiden Gateway-Maschinen muss racoon laufen. Sie - brauchen ebenfalls Firewall-Regeln, die IKE-Verkehr - erlauben. IKE verwendet UDP, um Nachrichten zum - ISAKMP-Port (Internet Security Association Key Management Protocol) - zu schicken. Die Regeln sollten früh in der - Regelkette auftauchen: - - ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp -ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp - - Wenn racoon läuft, können Sie versuchen, - mit ping von einem Gateway-Rechner aus - den anderen Gateway zu erreichen. Die Verbindung wird zwar immer - noch nicht verschlüsselt, aber racoon wird die - Security-Association zwischen beiden Systemen einrichten. - Dies kann eine Weile dauern, und Sie bemerken vielleicht - eine kleine Verzögerung, bevor die Antworten von - der Gegenstelle kommen. - - Die Security-Association können Sie sich auf einem - der beiden Gateway-Systeme mit &man.setkey.8; ansehen: - - setkey -D - - Damit ist die erste Hälfte der Arbeit getan. - Jetzt muss noch die Security-Policy konfiguriert werden. - - Damit wir eine sinnvolle Security-Policy erstellen - können, fassen wir das bisher geleistete zusammen. - Die Diskussion gilt für beide Enden des Tunnels. - - Jedes gesendete IP-Paket enthält im Header - Informationen über das Paket selbst. Im Header - befinden sich die IP-Adressen des Senders und des - Empfängers. Wie wir bereits wissen, dürfen - private IP-Adressen, wie - 192.168.x.y nicht auf - das Internet gelangen. Pakete zu privaten IP-Adressen - müssen zuerst in einem anderen Paket gekapselt - werden. In diesem Paket werden die privaten IP-Adressen - durch öffentliche IP-Adressen ersetzt. - - Das ausgehende Paket hat beispielsweise wie folgt - ausgesehen: - - - - - - - - - .----------------------. - | Src: 192.168.1.1 | - | Dst: 192.168.2.1 | - | <other header info> | - +----------------------+ - | <packet data> | - `----------------------' - - - - Es wird in ein anderes Paket umgepackt (gekapselt) - und sieht danach wie folgt aus: - - - - - - - - - .--------------------------. - | Src: A.B.C.D | - | Dst: W.X.Y.Z | - | <other header info> | - +--------------------------+ - | .----------------------. | - | | Src: 192.168.1.1 | | - | | Dst: 192.168.2.1 | | - | | <other header info> | | - | +----------------------+ | - | | <packet data> | | - | `----------------------' | - `--------------------------' - - - - Die Kapselung wird vom gif-Gerät - vorgenommen. Das neue Paket enthält im Header eine - öffentliche IP-Adresse und der Datenteil des Pakets - enthält das ursprüngliche Paket. - - Natürlich soll der gesamte Datenverkehr des VPNs - verschlüsselt werden. Dies kann man wie folgt - ausdrücken: - - - Wenn ein Paket von A.B.C.D - zu W.X.Y.Z geschickt wird, - verschlüssele es entsprechend der - Security-Association. - - - - Wenn ein Paket von W.X.Y.Z - kommt und für A.B.C.D - bestimmt ist, entschlüssele es entsprechend der - Security-Association. - - - Das ist fast richtig. Mit diesen Regeln würde - der ganze Verkehr von und zu W.X.Y.Z - verschlüsselt, auch wenn er nicht zum VPN gehört. - Die richtige Formulierung lautet: - - - Wenn ein Paket, das ein gekapseltes Paket enthält, - von A.B.C.D zu - W.X.Y.Z geschickt wird, - verschlüssele es entsprechend der - Security-Association. - - - - Wenn ein Paket, das ein gekapseltes Paket enthält, - von W.X.Y.Z kommt und für - A.B.C.D bestimmt ist, - entschlüssele es entsprechend der - Security-Association. - - - Dies ist eine zwar subtile aber eine - notwendige Änderung. - - Die Security-Policy können Sie mit &man.setkey.8; - erstellen. &man.setkey.8; besitzt eine Konfigurations-Syntax - zur Erstellung der Security-Policy. Sie können die - Konfiguration über die Standardeingabe oder in einer - Datei, die Sie mit der Option angeben, - erstellen. - - Gateway #1 (öffentliche IP-Adresse: - A.B.C.D) muss - folgendermaßen konfiguriert werden, um alle - ausgehenden Pakete an W.X.Y.Z - zu verschlüsseln: - - spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; - - Speichern Sie dieses Kommando in einer Datei, beispielsweise - /etc/ipsec.conf ab. Rufen Sie - anschließend das nachstehende Kommando auf: - - &prompt.root; setkey -f /etc/ipsec.conf - - weist &man.setkey.8; an, - der Security-Policy-Datenbank eine Regel hinzuzufügen. - Der Rest der Zeile gibt an, auf welche Pakete diese - Regel zutrifft. A.B.C.D/32 - und W.X.Y.Z/32 sind - die IP-Adressen und Netzmasken, die Systeme angeben, - auf die diese Regel zutrifft. Im Beispiel gilt die - Regel für die beiden Gateway-Systeme. - zeigt an, dass die Regel nur - für Pakete gilt, die gekapselte Pakete enthalten. - legt fest, dass die Regel nur - für ausgehende Pakete gilt. - - gibt an, dass die Pakete - geschützt werden. Das benutzte Protokoll - wird durch angegeben. - kapselt das Paket in ein - IPsec-Paket. Die nochmalige Angabe von - A.B.C.D und - W.X.Y.Z gibt die - Security-Association an. Das abschließende - erzwingt die Verschlüsselung - der Pakete. - - Diese Regel gilt nur für ausgehende Pakete. - Sie brauchen eine analoge Regel für eingehende - Pakete: - - spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; - - In dieser Regel wird anstelle - von benutzt und die IP-Adressen - sind notwendigerweise umgekehrt angegeben. - - Das zweite Gateway-System mit der IP-Adresse - W.X.Y.Z braucht - entsprechende Regeln: - - spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; -spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; - - Schließlich brauchen Sie auf beiden Gateway-Systemen - noch Firewall-Regeln, die ESP- und IPENCAP-Pakete in beide - Richtungen erlauben: - - ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z -ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D -ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z -ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D - - Da die Regeln symmetrisch sind, können sie auf - beiden Systemen verwendet werden. - - Damit sehen ausgehende Pakete wie folgt aus: - - - - - - - - - .------------------------------. --------------------------. - | Src: A.B.C.D | | - | Dst: W.X.Y.Z | | - | < weitere Header > | | Encrypted - +------------------------------+ | packet. - | .--------------------------. | -------------. | contents - | | Src: A.B.C.D | | | | are - | | Dst: W.X.Y.Z | | | | completely - | | < weitere Header > | | | |- secure - | +--------------------------+ | | Encap'd | from third - | | .----------------------. | | -. | packet | party - | | | Src: 192.168.1.1 | | | | Original |- with real | snooping - | | | Dst: 192.168.2.1 | | | | packet, | IP addr | - | | | < weitere Header > | | | |- private | | - | | +----------------------+ | | | IP addr | | - | | | <Paket-Daten> | | | | | | - | | `----------------------' | | -' | | - | `--------------------------' | -------------' | - `------------------------------' --------------------------' - - - - - Am anderen Ende des VPNs werden die Pakete zuerst - entsprechend der von racoon ausgehandelten Security-Association - entschlüsselt. Das gif-Interface - entfernt dann die zweite Schicht, damit das ursprüngliche - Paket zum Vorschein kommt. Dieses kann dann in das interne - Netzwerk transportiert werden. - - Dass die Pakete wirklich verschlüsselt werden, - können Sie wieder mit &man.ping.8; überprüfen. - Melden Sie sich auf dem Gateway - A.B.C.D an und rufen - das folgende Kommando auf: - - tcpdump dst host 192.168.2.1 - - Auf demselben Rechner setzen Sie dann noch das - nachstehende Kommando ab: - - ping 192.168.2.1 - - Dieses Mal wird die Ausgabe wie folgt aussehen: - - XXX tcpdump output - - Jetzt zeigt &man.tcpdump.1; ESP-Pakete an. Auch wenn - Sie diese mit der Option untersuchen, - werden Sie wegen der Verschlüsselung nur - unverständliche Zeichen sehen. - - Herzlichen Glückwunsch. Sie haben soeben ein - VPN zwischen zwei entfernten Netzen eingerichtet. - - - Zusammenfassung - - IPsec muss in beiden Kernelkonfigurationsdateien - enthalten sein: - - options IPSEC -options IPSEC_ESP - - - - Installieren Sie den Port security/ipsec-tools. Tragen Sie - auf beiden Rechnern in - ${PREFIX}/etc/racoon/psk.txt jeweils - die IP-Adresse des entfernten Gateways und den geheimen - Schlüssel ein. Setzen Sie die Zugriffsrechte der - Datei auf 0600. - - - - Fügen Sie auf jedem Rechner die folgenden - Zeilen zu /etc/rc.conf hinzu: - - ipsec_enable="YES" -ipsec_file="/etc/ipsec.conf" - - - - Erstellen Sie auf jedem Rechner die Datei - /etc/ipsec.conf mit den nötigen - -Zeilen. Auf dem Gateway #1 - hat die Datei folgenden Inhalt: - - spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec - esp/tunnel/A.B.C.D-W.X.Y.Z/require; -spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec - esp/tunnel/W.X.Y.Z-A.B.C.D/require; - - Auf dem Gateway #2 sieht die Datei so aus: - - spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec - esp/tunnel/W.X.Y.Z-A.B.C.D/require; -spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec - esp/tunnel/A.B.C.D-W.X.Y.Z/require; - - - - Fügen Sie auf beiden Rechnern Firewall-Regeln - hinzu, die IKE-, ESP- und IPENCAP-Verkehr erlauben: - - ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp -ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp -ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z -ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D -ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z -ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D - - - - Das VPN wurde in zwei Schritten eingerichtet. Maschinen - auf beiden Netzen können miteinander kommunizieren - und der Datenverkehr zwischen beiden Netzen wird automatisch - verschlüsselt. - + Für Benutzer der &man.pf.4;- oder &man.ipf.8;-Firewall + sollte folgendes funktionieren: + + pass in quick proto esp from any to any +pass in quick proto ah from any to any +pass in quick proto ipencap from any to any +pass in quick proto udp from any port = 500 to any port = 500 +pass in quick on gif0 from any to any +pass out quick proto esp from any to any +pass out quick proto ah from any to any +pass out quick proto ipencap from any to any +pass out quick proto udp from any port = 500 to any port = 500 +pass out quick on gif0 from any to any + + Zum Ende, um dem Computer den Start vom + VPN während der Systeminitialisierung + zu erlauben, fügen Sie folgende Zeilen in ihre + /etc/rc.conf: ein + + ipsec_enable="YES" +ipsec_program="/usr/local/sbin/setkey" +ipsec_file="/usr/local/etc/racoon/setkey.conf" # allows setting up spd policies on boot +racoon_enable="yes"
Chern Lee Beigetragen von OpenSSH OpenSSH Sicherheit OpenSSH OpenSSH stellt Werkzeuge bereit, um sicher auf entfernte Maschinen zuzugreifen. Die Kommandos rlogin, rsh, rcp und telnet können durch OpenSSH ersetzt werden. Zusätzlich können TCP/IP-Verbindungen sicher durch SSH weitergeleitet (getunnelt) werden. Mit SSH werden alle Verbindungen verschlüsselt, dadurch wird verhindert, dass die Verbindung zum Beispiel abgehört oder übernommen (Hijacking) werden kann. OpenSSH wird vom OpenBSD-Projekt gepflegt und basiert auf SSH v1.2.12 mit allen aktuellen Fixen und Aktualisierungen. OpenSSH ist mit den SSH-Protokollen der Versionen 1 und 2 kompatibel. Vorteile von OpenSSH Mit &man.telnet.1; oder &man.rlogin.1; werden Daten in einer unverschlüsselten Form über das Netzwerk gesendet. Daher besteht die Gefahr, das Benutzer/Passwort Kombinationen oder alle Daten an beliebiger Stelle zwischen dem Client und dem Server abgehört werden. Mit OpenSSH stehen eine Reihe von Authentifizierungs- und Verschlüsselungsmethoden zur Verfügung, um das zu verhindern. Aktivieren von sshd OpenSSH aktivieren Unter &os; entscheidet der Anwender bei einer Standard-Installation, ob der sshd-Daemon aktiviert werden soll. Um zu überprüfen, ob sshd auf Ihrem System aktiviert ist, suchen Sie in rc.conf nach der folgenden Zeile: sshd_enable="YES" Ist diese Zeile vorhanden, wird &man.sshd.8;, der OpenSSH-Dæmon, beim Systemstart automatisch aktiviert. Alternativ können Sie OpenSSH auch über das &man.rc.8;-Skript /etc/rc.d/sshd starten: /etc/rc.d/sshd start SSH Client OpenSSH Client &man.ssh.1; arbeitet ähnlich wie &man.rlogin.1;: &prompt.root; ssh user@example.com Host key not found from the list of known hosts. Are you sure you want to continue connecting (yes/no)? yes Host 'example.com' added to the list of known hosts. user@example.com's password: ******* Der Anmeldevorgang wird danach, wie von rlogin oder telnet gewohnt, weiterlaufen. SSH speichert einen Fingerabdruck des Serverschlüssels. Die Aufforderung, yes einzugeben, erscheint nur bei der ersten Verbindung zu einem Server. Weitere Verbindungen zu dem Server werden gegen den gespeicherten Fingerabdruck des Schlüssels geprüft und der Client gibt eine Warnung aus, wenn sich der empfangene Fingerabdruck von dem gespeicherten unterscheidet. Die Fingerabdrücke der Version 1 werden in ~/.ssh/known_hosts, die der Version 2 in ~/.ssh/known_hosts2 gespeichert. In der Voreinstellung akzeptieren aktuelle OpenSSH-Server nur SSH v2 Verbindungen. Wenn möglich, wird Version 2 verwendet, ist dies nicht möglich, fällt der Server auf Version 1 zurück. Der Client kann gezwungen werden, nur eine der beiden Versionen zu verwenden, indem die Option (für die Version 1) oder (für die Version 2) übergeben wird. Die Unterstützung für Version 1 ist nur noch aus Kompatibilitätsgründen zu älteren Versionen enthalten. Secure Copy OpenSSH secure copy scp Mit &man.scp.1; lassen sich Dateien analog wie mit &man.rcp.1; auf entfernte Maschinen kopieren. Mit scp werden die Dateien allerdings in einer sicheren Weise übertragen. &prompt.root; scp user@example.com:/COPYRIGHT COPYRIGHT user@example.com's password: COPYRIGHT 100% |*****************************| 4735 00:00 &prompt.root; Da der Fingerabdruck schon im vorigen Beispiel abgespeichert wurde, wird er bei der Verwendung von scp in diesem Beispiel überprüft. Da die Fingerabdrücke übereinstimmen, wird keine Warnung ausgegeben. Die Argumente, die scp übergeben werden, gleichen denen von cp in der Beziehung, dass die ersten Argumente die zu kopierenden Dateien sind und das letzte Argument den Bestimmungsort angibt. Da die Dateien über das Netzwerk kopiert werden, können ein oder mehrere Argumente die Form besitzen. Konfiguration OpenSSH Konfiguration Die für das ganze System gültigen Konfigurationsdateien des OpenSSH-Dæmons und des Clients finden sich in dem Verzeichnis - /etc/ssh. + /etc/ssh. Die Client-Konfiguration befindet sich in ssh_config, die des Servers befindet sich in sshd_config. Das SSH-System lässt sich weiterhin über die Anweisungen (Vorgabe ist /usr/sbin/sshd) und in /etc/rc.conf konfigurieren. ssh-keygen Mit &man.ssh-keygen.1; können DSA- oder RSA-Schlüssel für einen Benutzer erzeugt werden, die anstelle von Passwörtern verwendet werden können: &prompt.user; ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/user/.ssh/id_dsa): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_dsa. Your public key has been saved in /home/user/.ssh/id_dsa.pub. The key fingerprint is: bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com &man.ssh-keygen.1; erzeugt einen öffentlichen und einen privaten Schlüssel für die Authentifizierung. Der private Schlüssel wird in ~/.ssh/id_dsa oder ~/.ssh/id_rsa gespeichert, während sich der öffentliche Schlüssel in ~/.ssh/id_dsa.pub oder ~/.ssh/id_rsa.pub befindet, je nachdem, ob es sich um einen DSA- oder einen RSA-Schlüssel handelt. Der öffentliche Schlüssel muss sowohl für RSA- als auch für DSA-Schlüssel in die Datei ~/.ssh/authorized_keys auf dem entfernten Rechner aufgenommen werden, damit der Schlüssel funktioniert. Damit werden Verbindungen zu der entfernten Maschine über SSH-Schlüsseln anstelle von Passwörtern authentifiziert. Wenn bei der Erstellung der Schlüssel mit &man.ssh-keygen.1; ein Passwort angegeben wurde, wird der Benutzer bei jeder Anmeldung zur Eingabe des Passworts aufgefordert. Um den Umgang mit SSH-Schlüsseln zu erleichtern, kann &man.ssh-agent.1; die Verwaltung dieser Schlüssel für Sie übernehmen. Lesen Sie dazu den weiter unten. Die Kommandozeilenoptionen und Dateinamen sind abhängig von der OpenSSH-Version. Die für Ihr System gültigen Optionen finden Sie in der Hilfeseite &man.ssh-keygen.1;. ssh-agent und ssh-add Mit &man.ssh-agent.1; und &man.ssh-add.1; ist es möglich, SSH-Schlüssel in den Speicher zu laden, damit die Passphrase nicht jedesmal eingegeben werden muss. &man.ssh-agent.1; übernimmt die Authentifizierung von ihm geladener privater Schlüssel. &man.ssh-agent.1; sollte nur dazu verwendet werden, ein anderes Programm zu starten, beispielsweise eine Shell oder einen Window-Manager. Um &man.ssh-agent.1; in einer Shell zu verwenden, muss es mit einer Shell als Argument aufgerufen werden. Zusätzlich müssen die zu verwaltende Identität (durch &man.ssh-add.1;) sowie deren Passphrase für den privaten Schlüssel übergeben werden. Nachdem dies erledigt ist, kann sich ein Benutzer über &man.ssh.1; auf jedem Rechner anmelden, der einen entsprechenden öffentlichen Schlüssel besitzt. Dazu ein Beispiel: &prompt.user; ssh-agent csh &prompt.user; ssh-add Enter passphrase for /home/user/.ssh/id_dsa: Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa) &prompt.user; Um &man.ssh-agent.1; unter X11 zu verwenden, müssen Sie &man.ssh-agent.1; in Ihre ~/.xinitrc aufnehmen. Dadurch können alle unter X11 gestarteten Programme die Dienste von &man.ssh-agent.1; nutzen. Ihre ~/.xinitrc könnte dazu etwas so aussehen: exec ssh-agent startxfce4 Dadurch wird bei jedem Start von X11 zuerst &man.ssh-agent.1; aufgerufen, das wiederum XFCE startet. Nachdem Sie diese Änderung durchgeführt haben, müssen Sie X11 neu starten. Danach können Sie mit &man.ssh-add.1; Ihre SSH-Schlüssel laden. SSH-Tunnel OpenSSH Tunnel Mit OpenSSH ist es möglich, einen Tunnel zu erstellen, in dem ein anderes Protokoll verschlüsselt übertragen wird. Das folgende Kommando erzeugt einen Tunnel für telnet: &prompt.user; ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com &prompt.user; Dabei wurden die folgenden Optionen von ssh verwendet: Erzwingt die Version 2 des Protokolls (Benutzen Sie die Option nicht mit langsamen SSH-Servern). Zeigt an, dass ein Tunnel erstellt werden soll. Ohne diese Option würde ssh eine normale Sitzung öffnen. Zwingt ssh im Hintergrund zu laufen. Ein lokaler Tunnel wird in der Form localport:remotehost:remoteport angegeben. Die Verbindung wird dabei von dem lokalen Port localport auf einen entfernten Rechner weitergeleitet. - Gibt den entfernten SSH server an. + Gibt den entfernten SSH-Server an. Ein SSH-Tunnel erzeugt ein Socket auf localhost und dem angegebenen Port. Jede Verbindung, die auf dem angegebenen Socket aufgemacht wird, wird dann auf den spezifizierten entfernten Rechner und Port weitergeleitet. Im Beispiel wird der Port 5023 auf die entfernte Maschine und dort auf localhost Port 23 weitergeleitet. Da der Port 23 für Telnet reserviert ist, erzeugt das eine sichere Telnet-Verbindung durch einen SSH-Tunnel. Diese Vorgehensweise kann genutzt werden, um jedes unsichere TCP-Protokoll wie SMTP, POP3, FTP, usw. weiterzuleiten. Mit SSH einen sicheren Tunnel für SMTP erstellen &prompt.user; ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com user@mailserver.example.com's password: ***** &prompt.user; telnet localhost 5025 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailserver.example.com ESMTP Zusammen mit &man.ssh-keygen.1; und zusätzlichen Benutzer-Accounts können Sie leicht benutzbare SSH-Tunnel aufbauen. Anstelle von Passwörtern können Sie Schlüssel benutzen und jeder Tunnel kann unter einem eigenen Benutzer laufen. Beispiel für SSH-Tunnel Sicherer Zugriff auf einen POP3-Server Nehmen wir an, an Ihrer Arbeitsstelle gibt es einen SSH-Server, der Verbindungen von außen akzeptiert. Auf dem Netzwerk Ihrer Arbeitsstelle soll sich zudem noch ein Mail-Server befinden, der POP3 spricht. Das Netzwerk oder die Verbindung von Ihrem Haus zu Ihrer Arbeitsstelle ist unsicher und daher müssen Sie Ihre E-Mail über eine gesicherte Verbindung abholen können. Die Lösung zu diesem Problem besteht darin, eine SSH-Verbindung von Ihrem Haus zu dem SSH-Server an Ihrer Arbeitsstelle aufzubauen, und von dort weiter zum Mail-Server zu tunneln. &prompt.user; ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com user@ssh-server.example.com's password: ****** Wenn Sie den Tunnel eingerichtet haben, konfigurieren Sie Ihren Mail-Client so, dass er POP3 Anfragen zu localhost Port 2110 sendet. Die Verbindung wird dann sicher zu mail.example.com weitergeleitet. Umgehen einer strengen Firewall Einige Netzwerkadministratoren stellen sehr drakonische Firewall-Regeln auf, die nicht nur einkommende Verbindungen filtern, sondern auch ausgehende. Es kann sein, dass Sie externe Maschinen nur über die Ports 22 und 80 (SSH und Web) erreichen. Sie wollen auf einen Dienst, der vielleicht nichts mit Ihrer Arbeit zu tun hat, wie einen Ogg Vorbis Musik-Server, zugreifen. Wenn der Ogg Vorbis Server nicht auf den Ports 22 oder 80 läuft, können Sie aber nicht auf ihn zugreifen. Die Lösung hier ist es, eine SSH-Verbindung zu einer Maschine außerhalb der Firewall aufzumachen und durch diese zum Ogg Vorbis Server zu tunneln. &prompt.user; ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org user@unfirewalled-system.example.org's password: ******* Konfigurieren Sie Ihren Client so, dass er localhost und Port 8888 benutzt. Die Verbindung wird dann zu music.example.com Port 8000 weitergeleitet und Sie haben die Firewall erfolgreich umgangen. Die Option <varname>AllowUsers</varname> Es ist in der Regel ein gute Idee, festzulegen, welche Benutzer sich von welchem Rechner aus anmelden können. Dies lässt sich beispielsweise über die Option AllowUsers festlegen. Soll sich etwa nur root vom Rechner mit der IP-Adresse 192.168.1.32 aus einwählen dürfen, würden Sie folgenden Eintrag in /etc/ssh/sshd_config aufnehmen: AllowUsers root@192.168.1.32 Damit sich admin von jedem Rechner aus anmelden kann, geben Sie nur den Benutzernamen an: AllowUsers admin Sie können auch mehrere Benutzer in einer Zeile aufführen: AllowUsers root@192.168.1.32 admin Nur ein Benutzer, der in dieser Liste aufgeführt ist, darf sich auf diesem Rechner anmelden. Nachdem Sie /etc/ssh/sshd_config angepasst haben, muss &man.sshd.8; seine Konfigurationsdateien neu einlesen. Dazu geben Sie Folgendes ein: &prompt.root; /etc/rc.d/sshd reload Weiterführende Informationen OpenSSH &man.ssh.1; &man.scp.1; &man.ssh-keygen.1; &man.ssh-agent.1; &man.ssh-add.1; &man.ssh.config.5; &man.sshd.8; &man.sftp-server.8; &man.sshd.config.5; Tom Rhodes Beigetragen von ACL Zugriffskontrolllisten für Dateisysteme Zusammen mit anderen Verbesserungen des Dateisystems wie Schnappschüsse gibt es ab &os; 5.0 Zugriffskontrolllisten (access control list, ACL). Zugriffskontrolllisten erweitern die normalen Zugriffsrechte von &unix; Systemen auf eine kompatible (&posix;.1e) Weise und bieten feiner granulierte Sicherheitsmechanismen. Zugriffskontrolllisten für Dateisysteme werden mit der nachstehenden Zeile in der Kernelkonfiguration aktiviert: options UFS_ACL Diese Option ist in der GENERIC-Konfiguration aktiviert. Das System gibt eine Warnung aus, wenn ein Dateisystem mit ACLs eingehangen werden soll und die Unterstützung für ACLs nicht im Kernel aktiviert ist. Das Dateisystem muss weiterhin erweiterte Attribute zur Verfügung stellen, damit ACLs verwendet werden können. Das neue UNIX-Dateisystem UFS2 stellt diese Attribute standardmäßig zur Verfügung. Die Konfiguration erweiterter Attribute auf UFS1 ist mit einem höheren Aufwand als die Konfiguration erweiterter Attribute auf UFS2 verbunden. Zudem ist UFS2 mit erweiterten Attributen leistungsfähiger als UFS1. Zugriffskontrolllisten sollten daher mit UFS2 verwendet werden. Die Angabe der Option in /etc/fstab aktiviert Zugriffskontrolllisten für ein Dateisystem. Die bevorzugte Möglichkeit ist die Verwendung von Zugriffskontrolllisten mit &man.tunefs.8; (Option ), im Superblock des Dateisystems festzuschreiben. Diese Möglichkeit hat mehrere Vorteile: Nochmaliges Einhängen eines Dateisystems (Option von &man.mount.8;) verändert den Status der Zugriffskontrolllisten nicht. Die Verwendung von Zugriffskontrolllisten kann nur durch Abhängen und erneutes Einhängen eines Dateisystems verändert werden. Das heißt auch, dass Zugriffskontrolllisten nicht nachträglich auf dem Root-Dateisystem aktiviert werden können. Die Zugriffskontrolllisten auf den Dateisystemen sind, unabhängig von den Option in /etc/fstab oder Namensänderungen der Geräte, immer aktiv. Dies verhindert auch, dass Zugriffskontrolllisten aus Versehen auf Dateisystem ohne Zugriffskontrolllisten aktiviert werden und durch falsche Zugriffsrechte Sicherheitsprobleme entstehen. Es kann sein, dass sich der Status von Zugriffskontrolllisten später durch nochmaliges Einhängen des Dateisystems (Option von &man.mount.8;) ändern lässt. Die momentane Variante ist aber sicherer, da der Status der Zugriffskontrolllisten nicht versehentlich geändert werden kann. Allgemein sollten Zugriffskontrolllisten auf einem Dateisystem, auf dem sie einmal verwendet wurden, nicht deaktiviert werden, da danach die Zugriffsrechte falsch sein können. Werden Zugriffskontrolllisten auf einem solchen Dateisystem wieder aktiviert, werden die Zugriffsrechte von Dateien, die sich zwischenzeitlich geändert haben, überschrieben, was zu erneuten Problemen führt. Die Zugriffsrechte einer Datei werden durch ein + (Plus) gekennzeichnet, wenn die Datei durch Zugriffskontrolllisten geschützt ist: drwx------ 2 robert robert 512 Dec 27 11:54 private drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1 drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2 drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3 drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html - Die Verzeichnisse directory1, - directory2 und directory3 + Die Verzeichnisse directory1, + directory2 und + directory3 sind durch Zugriffskontrolllisten geschützt, das Verzeichnis - public_html nicht. + public_html nicht. Zugriffskontrolllisten benutzen Das Werkzeug &man.getfacl.1; zeigt Zugriffskontrolllisten an. Das folgende Kommando zeigt die ACLs auf der Datei test: &prompt.user; getfacl test #file:test #owner:1001 #group:1001 user::rw- group::r-- other::r-- Das Werkzeug &man.setfacl.1; ändert oder entfernt ACLs auf Dateien. Zum Beispiel: &prompt.user; setfacl -k test Die Option entfernt alle ACLs einer Datei oder eines Dateisystems. Besser wäre es, die Option zu verwenden, da sie die erforderlichen Felder beibehält. &prompt.user; setfacl -m u:trhodes:rwx,g:web:r--,o::--- test Mit dem vorstehenden Kommando werden die eben entfernten Zugriffskontrolllisten wiederhergestellt. Der Befehl gibt die Fehlermeldung Invalid argument aus, wenn Sie nicht existierende Benutzer oder Gruppen als Parameter angeben. Tom Rhodes Beigetragen von Portaudit Sicherheitsprobleme in Software Dritter überwachen In den letzten Jahren wurden zahlreiche Verbesserungen in der Einschätzung und dem Umgang mit Sicherheitsproblemen erzielt. Die Gefahr von Einbrüchen in ein System wird aber immer größer, da Softwarepakete von Dritten auf nahezu jedem Betriebssystem installiert und konfiguriert werden. Die Einschätzung der Verletzlichkeit eines Systems ist ein Schlüsselfaktor für dessen Sicherheit. &os; veröffentlicht zwar Sicherheitshinweise (security advisories) für das Basissystem, das Projekt ist allerdings nicht dazu in der Lage, dies auch für die zahlreichen Softwarepakete von Dritten zu tun. Dennoch gibt es einen Weg, auch diese Programmpakete zu überwachen. Das in der Ports-Sammlung enthaltene Programm Portaudit wurde gezielt dafür entwickelt. - Der Port security/portaudit + Der Port ports-mgmt/portaudit fragt dazu eine Datenbank, die vom &os; Security Team sowie den Ports-Entwicklern aktualisiert und gewartet wird, auf bekannte Sicherheitsprobleme ab. Bevor Sie Portaudit verwenden können, müssen Sie es über die Ports-Sammlung installieren: &prompt.root; cd /usr/ports/security/portaudit && make install clean Während der Installation werden die Konfigurationsdateien für &man.periodic.8; aktualisiert, was es Portaudit erlaubt, seine Ausgabe in den täglichen Sicherheitsbericht einzufügen. Stellen Sie auf jeden Fall sicher, dass diese (an das E-Mail-Konto von root gesendeten) Sicherheitsberichte auch gelesen werden. An dieser Stelle ist keine weitere Konfiguration nötig. Nach der Installation kann ein Administrator die unter - /var/db/portaudit lokal + /var/db/portaudit lokal gespeicherte Datenbank aktualisieren und sich danach durch folgenden Befehl über mögliche Sicherheitslücken der von ihm installierten Softwarepakete informieren: &prompt.root; portaudit -Fda Die Datenbank wird automatisch aktualisiert, wenn &man.periodic.8; ausgeführt wird. Der eben genannte Befehl ist daher optional, er wird aber für das folgende Beispiel benötigt. Nach erfolgter Installation der Datenbank kann ein Administrator über die Ports-Sammlung installierte Softwarepakete Dritter jederzeit überprüfen. Dazu muss er lediglich folgenden Befehl eingeben: &prompt.root; portaudit -a Existiert in Ihren installierten Softwarepaketen eine Sicherheitslücke, wird Portaudit eine Ausgabe ähnlich der folgenden produzieren: Affected package: cups-base-1.1.22.0_1 Type of problem: cups-base -- HPGL buffer overflow vulnerability. Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html> 1 problem(s) in your installed packages found. You are advised to update or deinstall the affected package(s) immediately. Wenn Sie die angegebene URL über einen Internetbrowser aufrufen, erhalten Sie weitere Informationen über die bestehende Sicherheitslücke, wie die betroffenen Versionen, die Version des &os;-Ports sowie Hinweise auf weitere Seiten, die ebenfalls Sicherheitshinweise zu diesem Problem bieten. Portaudit ist ein mächtiges Werkzeug und insbesondere in Zusammenarbeit mit dem Port Portupgrade äußerst hilfreich. Tom Rhodes Beigesteuert von Sicherheitshinweise &os; Sicherheitshinweise Wie für andere hochwertige Betriebssysteme auch werden für &os; Sicherheitshinweise herausgegeben. Die Hinweise werden gewöhnlich auf den Sicherheits-Mailinglisten und in den Errata veröffentlicht, nachdem das Sicherheitsproblem behoben ist. Dieser Abschnitt beschreibt den Umgang mit den Sicherheitshinweisen. Wie sieht ein Sicherheitshinweis aus? Der nachstehende Sicherheitshinweis stammt von der Mailingliste &a.security-notifications.name;: ============================================================================= &os;-SA-XX:XX.UTIL Security Advisory The &os; Project Topic: denial of service due to some problem Category: core Module: sys Announced: 2003-09-23 Credits: Person@EMAIL-ADDRESS Affects: All releases of &os; &os; 4-STABLE prior to the correction date Corrected: 2003-09-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE) 2003-09-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6) 2003-09-23 20:07:06 UTC (RELENG_5_0, 5.0-RELEASE-p15) 2003-09-23 16:44:58 UTC (RELENG_4_8, 4.8-RELEASE-p8) 2003-09-23 16:47:34 UTC (RELENG_4_7, 4.7-RELEASE-p18) 2003-09-23 16:49:46 UTC (RELENG_4_6, 4.6-RELEASE-p21) 2003-09-23 16:51:24 UTC (RELENG_4_5, 4.5-RELEASE-p33) 2003-09-23 16:52:45 UTC (RELENG_4_4, 4.4-RELEASE-p43) 2003-09-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39) CVE Name: CVE-XXXX-XXXX For general information regarding FreeBSD Security Advisories, including descriptions of the fields above, security branches, and the following sections, please visit http://www.FreeBSD.org/security/. I. Background II. Problem Description III. Impact IV. Workaround V. Solution VI. Correction details VII. References Das Feld Topic enthält eine Beschreibung des Sicherheitsproblems und benennt das betroffene Programm. Das Feld Category beschreibt den betroffenen Systemteil. Mögliche Werte für dieses Feld sind core, contrib oder ports. Die Kategorie core gilt für Kernkomponenten des &os;-Betriebssystems, die Kategorie contrib beschreibt zum Basissystem gehörende Software Dritter beispielsweise sendmail. Die Kategorie ports beschreibt Software, die Teil der Ports-Sammlung ist. Das Feld Module beschreibt die betroffene Komponente. Im Beispiel ist sys angegeben, das heißt dieses Problem betrifft eine Komponente, die vom Kernel benutzt wird. Das Feld Announced gibt den Zeitpunkt der Bekanntgabe des Sicherheitshinweises an. Damit existiert das Sicherheitsproblem, ist vom Sicherheits-Team bestätigt worden und eine entsprechende Korrektur wurde in das Quellcode-Repository von &os; gestellt. Das Feld Credits gibt die Person oder Organisation an, die das Sicherheitsproblem bemerkte und gemeldet hat. Welche &os;-Releases betroffen sind, ist im Feld Affects angegeben. Die Version einer Datei, die zum Kernel gehört, können Sie schnell mit ident ermitteln. Bei Ports ist die Versionsnummer angegeben, die Sie im Verzeichnis /var/db/pkg finden. Wenn Sie Ihr System nicht täglich aktualisieren, ist Ihr System wahrscheinlich betroffen. Wann das Problem in welchem Release behoben wurde, steht im Feld Corrected. Reserviert für Informationen, über die in der Common Vulnerabilities Database nach Sicherheitslücken gesucht werden kann. Im Feld Background wird das betroffene Werkzeug beschrieben. Meist finden Sie hier warum das Werkzeug Bestandteil von &os; ist, wofür es benutzt wird und eine kurze Darstellung der Herkunft des Werkzeugs. Im Feld Problem Description befindet sich eine genaue Darstellung des Sicherheitsproblems. Hier wird fehlerhafter Code beschrieben oder geschildert, wie ein Werkzeug ausgenutzt wird. Das Feld Impact beschreibt die Auswirkungen des Sicherheitsproblems auf ein System, beispielsweise erweiterte Rechte oder gar Superuser-Rechte für normale Benutzer. Im Feld Workaround wird eine Umgehung des Sicherheitsproblems beschrieben. Die Umgehung ist für Administratoren gedacht, die ihr System aus Zeitnot, Netzwerk-technischen oder anderen Gründen nicht aktualisieren können. Nehmen Sie Sicherheitsprobleme ernst: Auf einem betroffenen System sollte das Problem entweder behoben oder, wie hier beschrieben, umgangen werden. Im Feld Solution enthält eine getestete Schritt-für-Schritt Anleitung, die das Sicherheitsproblem behebt. Das Feld Correction Details enthält die CVS-Tags der betroffenen Dateien zusammen mit zugehörigen Revisionsnummern. Im Feld References finden sich Verweise auf weitere Informationsquellen. Dies können URLs zu Webseiten, Bücher, Mailinglisten und Newsgroups sein. Tom Rhodes Beigetragen von Prozess-Überwachung Prozess-Überwachung Prozess-Überwachung (Process accounting) ist ein Sicherheitsverfahren, bei dem ein Administrator verfolgt, welche Systemressourcen verwendet werden und wie sich diese auf die einzelnen Anwender verteilen. Dadurch kann das System überwacht werden und es ist sogar möglich, zu kontrollieren, welche Befehle ein Anwender eingibt. Diese Fähigkeiten haben sowohl Vor- als auch Nachteile. - Positiv ist, dass man ein Einbruchsversuch bis an den Anfang + Positiv ist, dass man einen Einbruchsversuch bis an den Anfang zurückverfolgen kann. Von Nachteil ist allerdings, dass durch diesen Prozess Unmengen an Protokolldateien erzeugt werden, die auch dementsprechenden Plattenplatz benötigen. Dieser Abschnitt beschreibt die Grundlagen der Prozess-Überwachung. Die Prozess-Überwachung aktivieren und konfigurieren Bevor Sie die Prozess-Überwachung verwenden können, müssen Sie diese aktivieren. Dazu führen Sie als root die folgenden Befehle aus: &prompt.root; touch /var/account/acct &prompt.root; accton /var/account/acct &prompt.root; echo 'accounting_enable="YES"' >> /etc/rc.conf Einmal aktiviert, wird sofort mit der Überwachung von CPU-Statistiken, Befehlen und anderen Vorgängen begonnen. Protokolldateien werden in einem nur von Maschinen lesbaren Format gespeichert, daher müssen Sie diese über &man.sa.8; aufrufen. Geben Sie keine Optionen an, gibt sa Informationen wie die Anzahl der Aufrufe pro Anwender, die abgelaufene Zeit in Minuten, die gesamte CPU- und Anwenderzeit in Minuten, die durchschnittliche Anzahl der Ein- und Ausgabeoperationen und viel andere mehr aus. Um Informationen über ausgeführte Befehle zu erhalten, verwenden Sie &man.lastcomm.1;. So können Sie etwa ermittlen, welche Befehle von wem auf welchem &man.ttys.5; ausgeführt wurden: &prompt.root; lastcomm ls trhodes ttyp1 Das Ergebnis sind alle bekannten Einsätze von ls durch trhodes auf dem Terminal ttyp1. Zahlreiche weitere nützliche Optionen finden Sie in den Manualpages zu &man.lastcomm.1;, &man.acct.5; sowie &man.sa.8;.
diff --git a/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml b/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml index 789d2934cc..3d69a1a0c1 100644 --- a/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml @@ -1,1183 +1,1191 @@ Murray Stokely Beigetragen von Oliver Peter Übersetzt von Virtualisierung Übersicht Virtualisierungssoftware erlaubt es, mehrere Betriebssysteme gleichzeitig auf dem selben Computer laufen zu lassen. Derartige Softwaresysteme für PCs setzen in der Regel ein Host-Betriebssystem voraus, auf dem die Virtualisierungssoftware läuft und unterstützen eine nahezu beliebige Anzahl von Gast-Betriebssystemen. Nachdem Sie dieses Kapitel gelesen haben, Kennen Sie den Unterscheid zwischen einem Host-Betriebssystem und einem Gast-Betriebssystem. Können Sie &os; auf einem &intel;-basierenden &apple; &macintosh; installieren. Wissen Sie, wie man &os; unter Linux mit &xen; installiert. Können Sie &os; unter µsoft.windows; und Virtual PC installieren. Wissen Sie, wie man ein virtualisiertes &os;-System für optimale Leistung konfiguriert. Bevor Sie dieses Kapitel lesen, sollten Sie Die Grundlagen von &unix; und &os; verstehen (). &os; installieren können (). Wissen, wie man seine Netzwerkverbindung konfiguriert (). Software Dritter installieren können (). &os; als Gast-Betriebssystem Parallels unter MacOS X Parallels Desktop für &mac; ist ein kommerzielles Softwareprodukt, welches für &intel;-basierende &apple; &mac;-Computer mit &macos; X 10.4.6 oder höher verfügbar ist. &os; wird von diesem Softwarepaket als Gast-Betriebssystem vollständig unterstützt. Nach der Installation von Parallels auf &macos; X konfigurieren Sie als erstes eine virtuelle Maschine, in der Sie danach das gewünschte Gast-Betriebssystem (in unserem Fall &os;) installieren. Installation von &os; unter Parallels/&macos; X Der erste Schritt bei der Installation von &os; unter Parallels/&macos; X ist es, eine virtuelle Maschine zu konfigurieren, in der Sie &os; installieren können. Dazu wählen Sie bei der Frage nach dem Guest OS Type &os; aus: Danach legen Sie geeignete Größen für Festplatten- und Arbeitsspeicher für die zu erstellende &os;-Instanz fest. 4 GB Plattenplatz sowie 512 MB RAM sind in der Regel für die Arbeit unter Parallels ausreichend: Wählen Sie den gewünschten Netzwerktyp aus und konfigurieren Sie Ihre Netzwerkverbindung: Speichern Sie Ihre Eingaben, um die Konfiguration abzuschließen: Nachdem Sie die virtuelle Maschine erstellt haben, installieren Sie im nächsten Schritt &os; in dieser virtuellen Maschine. Dazu verwenden Sie am besten eine offizielle &os;-CDROM oder Sie laden von einem offiziellen FTP-Server ein ISO-Abbild auf Ihren &mac; herunter. Danach klicken Sie auf das Laufwerksymbol in der rechten unteren Ecke des Parallels-Fensters, um ihr virtuelles Laufwerk mit dem ISO-Abbild oder mit dem physikalischen CD-ROM-Laufwerk ihres Computers zu verknüpfen. Nachdem Sie diese Verknüpfung hergestellt haben, starten sie die virtuelle &os;-Maschine neu, indem Sie wie gewohnt auf das Symbol "Neustarten" klicken. Parallels startet nun ein Spezial-BIOS, das zuerst prüft, ob Sie eine CD-ROM eingelegt haben (genau so, wie es auch ein echtes BIOS machen würde). In unserem Fall findet das BIOS ein &os;-Installationsmedium und beginnt daher eine normale Installation mit sysinstall (wie in des Handbuchs beschreiben). Nachdem die Installation abgeschlossen ist, können Sie die virtuelle Maschine starten. &os; für den Einsatz unter Parallels/&macos; X optimieren Nachdem Sie &os; erfolgreich unter &macos; X mit Parallels installiert haben, sollten Sie ihr virtuelles &os;-System für virtualisierte Operationen optimieren: Setzen der Bootloader-Variablen Die wichtigste Änderung ist es, die Variable zu verkleinern, um so die CPU-Auslastung in der Parallels-Umgebung zu verringern. kern.hz=100 Ohne diese Einstellung kann ein unbeschäftigtes &os; unter Parallels trotzdem rund 15 Prozent der CPU-Leistung eines Single Prozessor &imac;'s verbrauchen. Nach dieser Änderung reduziert sich dieser Wert auf etwa 5 Prozent. Erstellen einer neuen Kernelkonfigurationsdatei Sie können alle SCSI-, FireWire- und USB-Laufwerks-Treiber entfernen. Parallels stellt einen virtuellen Netzwerkadapter bereit, der den &man.ed.4;-Treiber verwendet. Daher können alle Netzwerkgeräte bis auf &man.ed.4; und &man.miibus.4; aus dem Kernel entfernt werden. Netzwerkbetrieb einrichten Die einfachste Netzwerkkonfiguration ist der Einsatz von DHCP, um Ihre virtuelle Maschine mit dem gleichen lokalen Netzwerk, in dem sich der Host-&mac; befindet, zu verbinden. Dazu fügen Sie die Zeile ifconfig_ed0="DHCP" in die Datei /etc/rc.conf ein. Weitere Informationen zur Konfiguration des Netzwerks unter &os; finden Sie im des Handbuchs. Fukang Chen (Loader) Beigetragen von &os; mit &xen; unter Linux einsetzen Der &xen; Hypervisor ist ein als Open Source verfügbares Para-Virtualisierungsprodukt, das von der kommerziellen Firma XenSource unterstützt wird. Gast-Betriebssysteme werden dabei als domU-Domains, Host-Betriebssysteme hingegen als dom0 bezeichnet. Um eine virtuelle &os;-Instanz unter Linux auszuführen, müssen Sie zuerst &xen; für Linux dom0 installieren. Als Host-Betriebssystem wird im folgenden Beispiel die Distribution Slackware verwendet. &xen; 3 unter Linux dom0 &xen; 3.0 von XenSource herunterladen Laden Sie die Datei xen-3.0.4_1-src.tgz von herunter. Den Tarball entpacken &prompt.root; cd xen-3.0.4_1-src &prompt.root; KERNELS="linux-2.6-xen0 linux-2.6-xenU" make world &prompt.root; make install Den dom0-Kernel neu kompilieren: &prompt.root; cd xen-3.0.4_1-src/linux-2.6.16.33-xen0 &prompt.root; make menuconfig &prompt.root; make &prompt.root; make install Ältere Versionen von &xen; müssen gegebenenfalls mit make ARCH=xen menuconfig näher spezifiziert werden. Einen Menü-Eintrag in die menu.lst von Grub aufnehmen Editieren Sie /boot/grub/menu.lst und fügen Sie die folgenden Zeilen hinzu: title Xen-3.0.4 root (hd0,0) kernel /boot/xen-3.0.4-1.gz dom0_mem=262144 module /boot/vmlinuz-2.6.16.33-xen0 root=/dev/hda1 ro Starten Sie Ihren Computer neu, um &xen; zu aktivieren Anschließend editieren Sie /etc/xen/xend-config.sxp und fügen die folgenden Zeilen hinzu: (network-script 'network-bridge netdev=eth0') Danach kann &xen; gestartet werden: &prompt.root; /etc/init.d/xend start &prompt.root; /etc/init.d/xendomains start Damit ist dom0 gestartet: &prompt.root; xm list Name ID Mem VCPUs State Time(s) Domain-0 0 256 1 r----- 54452.9 &os; 7-CURRENT als domU verwenden Laden Sie den &os;-domU-Kernel für &xen; 3.0 sowie das Festplattenabbild von http://www.fsmware.com/ herunter: kernel-current mdroot-7.0.bz2 xmexample1.bsd Kopieren Sie xmexample1.bsd nach /etc/xen/ und passen Sie die Einträge für Kernel und Festplattenabbild an Ihre Konfiguration an. Ihre Konfiguration sollte ähnlich dem folgenden Beispiel aussehen: kernel = "/opt/kernel-current" memory = 256 name = "freebsd" vif = [ '' ] disk = [ 'file:/opt/mdroot-7.0,hda1,w' ] #on_crash = 'preserve' extra = "boot_verbose" extra += ",boot_single" extra += ",kern.hz=100" extra += ",vfs.root.mountfrom=ufs:/dev/xbd769a" Die Datei mdroot-7.0.bz2 sollte unkomprimiert sein. Als Nächstes muss der __xen_guest-Abschnitt in kernel-current verändert und das von &xen; 3.0.3 benötigte VIRT_BASE hinzugefügt werden: &prompt.root; objcopy kernel-current -R __xen_guest &prompt.root; perl -e 'print "LOADER=generic,GUEST_OS=freebsd,GUEST_VER=7.0,XEN_VER=xen-3.0,BSD_SYMTAB,VIRT_BASE=0xC0000000\x00"' > tmp &prompt.root; objcopy kernel-current --add-section __xen_guest=tmp &prompt.root; objdump -j __xen_guest -s kernel-current kernel-current: file format elf32-i386 Contents of section __xen_guest: 0000 4c4f4144 45523d67 656e6572 69632c47 LOADER=generic,G 0010 55455354 5f4f533d 66726565 6273642c UEST_OS=freebsd, 0020 47554553 545f5645 523d372e 302c5845 GUEST_VER=7.0,XE 0030 4e5f5645 523d7865 6e2d332e 302c4253 N_VER=xen-3.0,BS 0040 445f5359 4d544142 2c564952 545f4241 D_SYMTAB,VIRT_BA 0050 53453d30 78433030 30303030 3000 SE=0xC0000000. Nun kann die domU erstellt und gestartet werden: &prompt.root; xm create /etc/xen/xmexample1.bsd -c Using config file "/etc/xen/xmexample1.bsd". Started domain freebsd WARNING: loader(8) metadata is missing! Copyright (c) 1992-2006 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 7.0-CURRENT #113: Wed Jan 4 06:25:43 UTC 2006 kmacy@freebsd7.gateway.2wire.net:/usr/home/kmacy/p4/freebsd7_xen3/src/sys/i386-xen/compile/XENCONF WARNING: DIAGNOSTIC option enabled, expect reduced performance. Xen reported: 1796.927 MHz processor. Timecounter "ixen" frequency 1796927000 Hz quality 0 CPU: Intel(R) Pentium(R) 4 CPU 1.80GHz (1796.93-MHz 686-class CPU) Origin = "GenuineIntel" Id = 0xf29 Stepping = 9 Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH, DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE> Features2=0x4400<CNTX-ID,<b14>> real memory = 265244672 (252 MB) avail memory = 255963136 (244 MB) xc0: <Xen Console> on motherboard cpu0 on motherboard Timecounters tick every 10.000 msec [XEN] Initialising virtual ethernet driver. xn0: Ethernet address: 00:16:3e:6b:de:3a [XEN] Trying to mount root from ufs:/dev/xbd769a WARNING: / was not properly dismounted Loading configuration files. No suitable dump device was found. Entropy harvesting: interrupts ethernet point_to_point kickstart. Starting file system checks: /dev/xbd769a: 18859 files, 140370 used, 113473 free (10769 frags, 12838 blocks, 4.2% fragmentation) Setting hostname: demo.freebsd.org. lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1 netmask 0xff000000 Additional routing options:. Mounting NFS file systems:. Starting syslogd. /etc/rc: WARNING: Dump device does not exist. Savecore not run. ELF ldconfig path: /lib /usr/lib /usr/lib/compat /usr/X11R6/lib /usr/local/lib a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout Starting usbd. usb: Kernel module not available: No such file or directory Starting local daemons:. Updating motd. Starting sshd. Initial i386 initialization:. Additional ABI support: linux. Starting cron. Local package initialization:. Additional TCP options:. Starting background file system checks in 60 seconds. Sun Apr 1 02:11:43 UTC 2007 FreeBSD/i386 (demo.freebsd.org) (xc0) login: Die domU sollte nun den &os; 7.0-CURRENT-Kernel ausführen: &prompt.root; uname -a FreeBSD demo.freebsd.org 7.0-CURRENT FreeBSD 7.0-CURRENT #113: Wed Jan 4 06:25:43 UTC 2006 kmacy@freebsd7.gateway.2wire.net:/usr/home/kmacy/p4/freebsd7_xen3/src/sys/i386-xen/compile/XENCONF i386 Das Netzwerk kann nun unter der domU konfiguriert werden. Die &os;-domU wird ein spezielles Gerät namens xn0 verwenden: &prompt.root; ifconfig xn0 10.10.10.200 netmask 255.0.0.0 &prompt.root; ifconfig xn0: flags=843<UP,BROADCAST,RUNNING,SIMPLEX> mtu 1500 inet 10.10.10.200 netmask 0xff000000 broadcast 10.255.255.255 ether 00:16:3e:6b:de:3a lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1 netmask 0xff000000 Unter der Slackware-dom0 sollten einige &xen;-spezifische Netzwerkgeräte erscheinen: &prompt.root; ifconfig eth0 Link encap:Ethernet HWaddr 00:07:E9:A0:02:C2 inet addr:10.10.10.130 Bcast:0.0.0.0 Mask:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:815 errors:0 dropped:0 overruns:0 frame:0 TX packets:1400 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:204857 (200.0 KiB) TX bytes:129915 (126.8 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:99 errors:0 dropped:0 overruns:0 frame:0 TX packets:99 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:9744 (9.5 KiB) TX bytes:9744 (9.5 KiB) peth0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:1853349 errors:0 dropped:0 overruns:0 frame:0 TX packets:952923 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2432115831 (2.2 GiB) TX bytes:86528526 (82.5 MiB) Base address:0xc000 Memory:ef020000-ef040000 vif0.1 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:1400 errors:0 dropped:0 overruns:0 frame:0 TX packets:815 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:129915 (126.8 KiB) TX bytes:204857 (200.0 KiB) vif1.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:3 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:157 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:140 (140.0 b) TX bytes:158 (158.0 b) xenbr1 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:112 (112.0 b) TX bytes:0 (0.0 b) &prompt.root; brctl show bridge name bridge id STP enabled interfaces xenbr1 8000.feffffffffff no vif0.1 peth0 vif1.0 Johann Kois Übersetzt von Virtual PC unter &windows; Virtual PC für &windows; wird von µsoft; kostenlos zum Download angeboten. Die Systemanforderungen für dieses Programm finden Sie hier. Nachdem Sie Virtual PC unter µsoft.windows; installiert haben, müssen Sie eine virtuelle Maschine konfigurieren und das gewünschte Betriebssystem installieren. &os; in Virtual PC/µsoft.windows; installieren Der erste Schritt zur Installation von &os; in µsoft.windows;/Virtual PC ist es, eine neue virtuelle Maschine zu erstellen, in die Sie &os; installieren können. Dazu wählen Sie die Option Create a virtual machine, wenn Sie danach gefragt werden: Bei der Frage nach dem Operating system wählen Sie Other: Danach müssen Sie den von Ihnen gewüschten Plattenplatz sowie die Größe des Hauptspeichers angeben. 4 GB Plattenplatz sowie 512 MB RAM sollten für die Installation von &os; in Virtual PC ausreichend sein: Speichern Sie Ihre Eingaben und beenden Sie die Konfiguration: Wählen Sie nun die für &os; erstellte virtuelle Maschine aus und klicken Sie auf Settings, um das Netzwerk zu konfigurieren: Nun können Sie &os; installieren. Dazu verwenden Sie am besten eine offizielle &os;-CD-ROM oder ein ISO-Image, das Sie von einem offiziellen &os;-FTP-Server heruntergeladen haben. Wenn Sie ein ISO-Image auf Ihrer Festplatte gespeichert haben, oder eine &os;-CD-ROM in Ihr CD-Laufwerk eingelegt haben, doppelklicken Sie auf die virtuelle Maschine, die Sie für &os; angelegt haben. Danach klicken Sie auf CD und wählen die Option Capture ISO Image... im Virtual PC-Fenster. Danach können Sie im folgenden Fenster das CD-Laufwerk mit Ihrem physikalischen CD-Laufwerk oder mit dem ISO-Image verknüpfen. Danach starten Sie die virtuelle Maschine neu, indem Sie zuerst auf Action und danach auf Reset klicken. Virtual PC startet Ihre virtuelle Maschine nun neu und prüft zuerst, ob die virtuelle Maschine über ein CD-Laufwerk verfügt. Da dies hier der Fall ist, beginnt nun eine normale, auf sysinstall basierende Installation, die in beschrieben wird. Sie können &os; nun installieren. Verzichten Sie an dieser Stelle aber unbedingt auf die X11-Konfiguration. Nachdem die Installation abgeschlossen ist, entfernen Sie die CD-ROM aus dem Laufwerk (oder lösen die Verknüpfung zum ISO-Image). Danach starten Sie die virtuelle Maschine neu, um &os; zu starten. &os; in µsoft.windows;/Virtual PC konfigurieren Nachdem Sie &os; auf Ihrem µsoft.windows;-System erfolgreich unter Virtual PC installiert haben, sollten Sie ihr virtuelles &os; noch anpassen, um eine optimale Funktion zu gewährleisten. Setzen der Bootloader-Variablen Die wichtigste Änderung ist es, die Variable zu verkleinern, um so die CPU-Auslastung in der Virtual PC-Umgebung zu verringern. Dazu fügen Sie die folgende Zeile in die Datei /boot/loader.conf ein: kern.hz=100 Ohne diese Einstellung kann ein unbeschäftigtes &os; unter Virutal PC trotzdem rund 40 Prozent der CPU-Leistung eines Ein-Prozessor-Systems verbrauchen. Nach dieser Änderung reduziert sich dieser Wert auf etwa 5 Prozent. Erstellen einer neuen Kernelkonfigurationsdatei Sie können alle SCSI-, FireWire- und USB-Laufwerks-Treiber entfernen. Virtual PC stellt einen virtuellen Netzwerkadapter bereit, der den &man.de.4;-Treiber verwendet. Daher können alle Netzwerkgeräte bis auf &man.de.4; und &man.miibus.4; aus dem Kernel entfernt werden. Das Netzwerk einrichten Die einfachste Netzwerkkonfiguration ist der Einsatz von DHCP, um Ihre virtuelle Maschine mit dem gleichen lokalen Netzwerk, in dem sich Ihr Host-µsoft.windows; befindet, zu verbinden. Dazu fügen Sie die Zeile ifconfig_de0="DHCP" in die Datei /etc/rc.conf ein. Weitere Informationen zur Konfiguration des Netzwerks unter &os; finden Sie im des Handbuchs. Johann Kois Übersetzt von VMware unter MacOS VMware Fusion für &mac; ist ein kommerzielles Programm, das für &intel; basierte &apple; &mac;-Computer mit &macos; 10.4.9 oder neuer erhältlich ist. &os; wird von diesem Produkt vollständig als Gast-Betriebssystem unterstützt. Nachdem Sie VMware Fusion unter &macos; X installiert haben, können Sie das gewünschte Gastbetriebssystem (in unserem Fall &os;) installieren. &os; in VMware/&macos; X installieren Zuerst müssen Sie VMware Fusion starten, um eine virtuelle Maschine zu erstellen. Dazu wählen Sie die Option "New": Dadurch wird ein Assistent gestartet, der Ihnen bei der Erzeugung einer neuen virtuellen Maschine behilflich ist. Clicken Sie auf "Continue", um den Prozess zu starten: Wählen Sie Other als das Operating System, danach &os; oder &os; 64-bit, je nach dem, welche Version Sie installieren wollen, wenn Sie nach der zu installierenden Version gefragt werden: Vergeben Sie einen Namen für virtuelle Maschine an und legen Sie den Speicherort fest: Legen Sie die Größe Ihrer virtuellen Festplatte fest: Nachdem Sie auf "Finish" geklickt haben, wird die virtuelle Maschine gestartet: Nun können Sie &os; wie gewohnt installieren (lesen Sie dazu auch des Handbuchs): Nachdem die Installation abgeschlossen ist, können Sie noch verschiedene Parameter der virtuellen Maschine, etwa den Speicherverbrauch, konfigurieren: Die Hardware der virtuellen Maschine kann nicht geändert werden, solange die virtuelle Maschine läuft. Die Anzahl der CPUs der virtuellen Maschine: Den Status des CD-Laufwerks. Sie können das CD-Laufwerk von der virtuellen Maschine lösen, wenn Sie es nicht benötigen. Zuletzt sollten Sie noch festlegen, wie sich die virtuelle Maschine mit dem Netzwerk verbinden soll. Sollen neben dem Gastsystem auch andere Rechner auf Ihre virtuelle Maschine zugreifen können, müssen Sie die Option Connect directly to the physical network (Bridged) wählen. Ist dies nicht der Fall, sollten Sie die Option Share the host's internet connection (NAT) wählen. In dieser Einstellung kann die virtuelle Maschine zwar auf auf das Internet zugreifen, andere Rechner dürfen aber nicht auf die virtuelle Maschine zugreifen. Nachdem Sie die Konfiguration abgeschlossen haben, können Sie &os; starten. &os; unter &macos; X/VMware konfigurieren Nachdem Sie FreeeBSD erfolgreich unter VMware für &macos; X installiert haben, sollten Sie ihr virtuelles &os; noch anpassen, um eine optimale Funktion zu gewährleisten. Die wichtigste Änderung ist es, die Variable zu verkleinern, um so die CPU-Auslastung in der VMware-Umgebung zu verringern. kern.hz=100 Ohne diese Einstellung kann ein unbeschäftigtes &os; unter VMware trotzdem rund 15 Prozent der CPU-Leistung eines Single Prozessor &imac;'s verbrauchen. Nach dieser Änderung reduziert sich dieser Wert auf etwa 5 Prozent. Erstellen einer neuen Kernelkonfigurationsdatei Sie können alle FireWire- und USB-Laufwerks-Treiber entfernen. VMware stellt einen virtuellen Netzwerkadapter bereit, der den &man.em.4;-Treiber verwendet. Daher können alle Netzwerkgeräte bis auf &man.em.4; und &man.miibus.4; aus dem Kernel entfernt werden. Netzwerkbetrieb einrichten Die einfachste Netzwerkkonfiguration ist der Einsatz von DHCP, um Ihre virtuelle Maschine mit dem gleichen lokalen Netzwerk, in dem sich der Host-&mac; befindet, zu verbinden. Dazu fügen Sie die Zeile ifconfig_em0="DHCP" in die Datei /etc/rc.conf ein. Weitere Informationen zur Konfiguration des Netzwerks unter &os; finden Sie im des Handbuchs. Benedict Reuschling Übersetzt von Christoph Sold &os; als Host-Betriebssystem Seit einigen Jahren wurde &os; nicht offiziell von irgendeiner der verfügbaren Virtualisierungslösungen als Host-Betriebssystem unterstützt. Viele Anwender verwenden aber noch ältere VMware-Versionen (z.B. emulators/vmware3), welches die &linux;-Kompatibilitätsschicht nutzt. Kurz nach der Veröffentlichung von &os; 7.2 erschien &virtualbox; als Open-Source Edition (OSE) von &sun; in der Ports-Sammlung als ein direkt auf &os; lauffähiges Programm. &virtualbox; ist ein vollständiges Virtualisierungspaket, das aktiv weiterentwickelt wird und für die meisten Betriebssysteme einschliesslich &windows;, &macos;, &linux; und &os; zur Verfügung steht. Es kann sowohl &windows; als auch &unix;-ähnliche Gastsysteme betreiben. Es ist als Open Source und als proprietäre Edition erhältlich. Die wichtigste Einschränkung der OSE aus Anwendersicht ist die fehlende USB-Unterstützung. Weitere Unterschiede können von der Editions-Seite des &virtualbox;-Wikis, das unter zu finden ist, entnommen werden. Momentan steht nur OSE unter &os; zur Verfügung. &virtualbox; installieren &virtualbox; steht als &os;-Port in - emulators/virtualbox bereit und + emulators/virtualbox-ose bereit und kann über den folgenden Befehl installiert werden: - &prompt.root; cd /usr/ports/emulators/virtualbox + &prompt.root; cd /usr/ports/emulators/virtualbox-ose &prompt.root; make install clean Eine nützliche Option im Konfigurationsdialog ist die GuestAdditions-Programmsammlung. Diese stellen eine Reihe von nützlichen Eigenschaften in den Gastbetriebssystemen zur Verfügung, wie beispielsweise Mauszeigerintegration (was es ermöglicht, die Maus zwischen dem Host und dem Gast zu teilen ohne eine spezielle Tastenkombination für diesen Wechsel zu drücken), sowie schnelleres Rendern von Videos, besonders in &windows; Gästen. Diese Gastzusätze sind im Devices-Menü zu finden, nachdem die Installation des Gastbetriebssystem abgeschlossen ist. Ein paar Konfigurationsänderungen sind notwendig, bevor &virtualbox; das erste Mal gestartet wird. Der Port installiert ein Kernelmodul in /boot/modules, das in den laufenden Kernel geladen werden muss: &prompt.root; kldload vboxdrv Um sicherzustellen, dass das Modul immer nach einem Neustart geladen wird, fügen Sie die folgende Zeile in die Datei /boot/loader.conf ein: vboxdrv_load="YES" - &virtualbox; benötigt auch das + Ältere Versionen als 3.1.2 von + &virtualbox; benötigen auch das eingehängte proc-Dateisystem: - + class="directory">proc-Dateisystem. Dies wird in + aktuellen Versionen nicht mehr benötigt, da dort die + Funktionen von der &man.sysctl.3; Bibliothek bereitgestellt + werden. + + Wenn Sie eine ältere Version aus den Ports benutzen, befolgen + Sie die unten stehenden Anweisungen und stellen Sie sicher, dass + proc eingehangen ist. + &prompt.root; mount -t procfs proc /proc Um auch diese Einstellung nach einem Neustart zu erhalten, wird die folgende Zeile in /etc/fstab eingefügt: proc /proc procfs rw 0 0 Möglicherweise erscheint eine Fehlermeldung ähnlich der Folgenden, wenn &virtualbox; von einem Terminal aus gestartet wird: VirtualBox: supR3HardenedExecDir: couldn't read "", errno=2 cchLink=-1 Wahrscheinlich ist der Übeltäter das proc-Dateisystem. Verwenden Sie bitte das mount-Kommando um zu überprüfen, ob es korrekt eingehängt ist. Die Gruppe vboxusers wird während der Installation von &virtualbox; angelegt. Alle Benutzer, die Zugriff auf &virtualbox; haben sollen, müssen in diese Gruppe aufgenommen werden. Der pw-Befehl kann benutzt werden, um neue Mitglieder hinzuzufügen: &prompt.root; pw groupmod vboxusers -m yourusername Um &virtualbox; zu starten, wählen Sie entweder den Eintrag Sun VirtualBox aus dem Menü Ihrer graphischen Benutzeroberfläche, oder geben Sie den folgenden Befehl in ein Terminal ein: &prompt.user; VirtualBox Besuchen Sie die offizielle Webseite von &virtualbox; unter , um weitere Informationen zur Konfiguration und Verwendung zu erhalten. Da der &os;-Port noch recht neu ist, befindet er sich noch unter ständiger Entwicklung. Um die aktuellen Nachrichten und Anleitungen zur Fehlerbehebung zu erhalten, besuchen Sie die entsprechende Seite im &os;-Wiki unter . Andere Virtualisierungsmöglichkeiten Zusätzlich wird daran gearbeitet, &xen; als funktionierende Host-Umgebung (dom0) für &os; verfügbar zu machen. diff --git a/de_DE.ISO8859-1/books/porters-handbook/book.sgml b/de_DE.ISO8859-1/books/porters-handbook/book.sgml index 3dcea7150b..d0ae8a4cb0 100644 --- a/de_DE.ISO8859-1/books/porters-handbook/book.sgml +++ b/de_DE.ISO8859-1/books/porters-handbook/book.sgml @@ -1,15503 +1,15509 @@ %books.ent; ]> Das FreeBSD Porter-Handbuch The FreeBSD German Documentation Project April 2000 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 The FreeBSD German Documentation Project &bookinfo.trademarks; &bookinfo.legalnotice; Einführung Die Ports-Sammlung von FreeBSD ist der gebräuchlichste Weg, um Anwendungen ("Ports") unter FreeBSD zu installieren. Wie alles andere in FreeBSD auch, ist sie hauptsächlich das Ergebnis der Arbeit von Freiwilligen. Es ist wichtig, diesen Aspekt beim Lesen im Hinterkopf zu behalten. In FreeBSD kann jeder einen neuen Port einsenden oder sich dazu bereit erklären, einen bereits vorhandenen Port zu pflegen, sofern der Port derzeit keinen Maintainer hat – dazu sind keine besonderen Rechte nötig. Einen neuen Port erstellen Sie sind also daran interessiert, einen neuen Port zu erstellen oder einen vorhandenen zu aktualisieren? Großartig! Die folgenden Kapitel beinhalten einige Richtlinien, um einen neuen Port für FreeBSD zu erstellen. Wenn Sie einen vorhandenen Port auf den neuesten Stand bringen wollen, sollten Sie mit fortfahren. Wenn Ihnen dieses Dokument nicht detailliert genug ist, sollten Sie einen Blick in /usr/ports/Mk/bsd.port.mk werfen. Das Makefile jedes Ports bindet diese Datei ein. Auch wenn Sie nicht täglich mit Makefiles arbeiten, sollten Sie gut damit zurecht kommen, da die Datei gut dokumentiert ist und Sie eine Menge Wissen daraus erlangen können. Zusätzlich können Sie speziellere Fragen an die &a.ports;-Mailingliste stellen. Nur ein Bruchteil der Variablen (VAR), die von Ihnen gesetzt werden können, finden hier Erwähnung. Die meisten von ihnen (wenn nicht sogar alle) sind am Anfang von /usr/ports/Mk/bsd.port.mk erläutert. Beachten Sie bitte, dass diese Datei eine nicht standardkonforme Tabulator-Einstellung verwendet. Emacs und Vim sollten diese Einstellung jedoch automatisch beim Öffnen der Datei setzen. Sowohl &man.vi.1; als auch &man.ex.1; können mit dem Befehl :set tabstop=4 dazu gebracht werden, die Datei richtig anzuzeigen, wenn sie geöffnet wird. Port erstellen auf die Schnelle Dieser Abschnitt beschreibt, wie Sie schnell einen Port erstellen können. In vielen Fällen ist dies allerdings nicht ausreichend, dann werden Sie in diesem Buch weiterlesen müssen. Als Erstes besorgen Sie sich das Original-Tarball (komprimiertes Archiv) und legen es im DISTDIR ab, welches standardmäßig /usr/ports/distfiles ist. Im Folgenden wird angenommen, dass die Software unverändert kompiliert werden konnte, dass also keinerlei Änderungen nötig waren, um den Port auf Ihrem FreeBSD-Rechner zum Laufen zu bringen. Falls Sie Änderungen vornehmen mussten, werden Sie auch den nächsten Abschnitt beachten müssen. Das <filename>Makefile</filename> schreiben Ein minimales Makefile sieht in etwa so aus: # New ports collection makefile for: oneko # Date created: 5 December 1994 # Whom: asami # # $FreeBSD$ # PORTNAME= oneko PORTVERSION= 1.1b CATEGORIES= games MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/ MAINTAINER= asami@FreeBSD.org COMMENT= A cat chasing a mouse all over the screen MAN1= oneko.1 MANCOMPRESSED= yes USE_IMAKE= yes .include <bsd.port.mk> Versuchen Sie es zu verstehen. Machen Sie sich keine Gedanken um die $FreeBSD$-Zeile, diese wird automatisch vom CVS eingefügt, wenn der Port in den Haupt-Ports-Tree importiert wird. Ein detailliertes Beispiel finden Sie im Abschnitt sample Makefile. Die Beschreibungsdateien erstellen Es gibt zwei Beschreibungsdateien, die für jeden Port benötigt werden, ob sie tatsächlich im Paket enthalten sind oder nicht. Dies sind pkg-descr und pkg-plist. Der pkg- Präfix unterscheidet sie von anderen Dateien. <filename>pkg-descr</filename> Diese enthält eine längere Beschreibung des Ports. Einer oder mehrere Absätze, die kurz und prägnant erklären, was der Port macht, sind ausreichend. pkg-descr enthält keine Anleitung oder detaillierte Beschreibung wie der Port benutzt oder kompiliert wird! Bitte seien Sie vorsichtig, wenn Sie aus dem README oder der Manualpage kopieren ; Diese sind oft keine prägnanten Beschreibungen des Ports oder sie sind in einem ungünstigen Format (Manualpages haben z.B. bündige Zwischenräume). Wenn es für die portierte Software eine offizielle Webseite gibt, sollten Sie diese hier angeben. Fügen Sie hierzu eine der Webseiten mit dem Präfix WWW: ein, damit automatische Werkzeuge korrekt arbeiten. Das folgende Beispiel zeigt wie Ihre pkg-descr aussehen sollte: This is a port of oneko, in which a cat chases a poor mouse all over the screen. : (etc.) WWW: http://www.oneko.org/ <filename>pkg-plist</filename> Diese Datei enthält eine Liste aller Dateien, die von diesem Port installiert werden. Sie wird auch die Packliste genannt, da das Paket durch die hier aufgeführten Dateien erstellt wird. Die Pfadangaben sind relativ zum Installationspräfix (für gewöhnlich /usr/local oder /usr/X11R6). Wenn Sie die MANn-Variablen verwenden (was Sie auch machen sollten), führen Sie hier keine Manualpages auf. Wenn der Port während der Installation Verzeichnisse erstellt, stellen Sie sicher entsprechende @dirrm-Zeilen einzufügen, um die Verzeichnisse zu entfernen, wenn das Paket gelöscht wird. Hier ist ein kleines Beispiel: bin/oneko lib/X11/app-defaults/Oneko lib/X11/oneko/cat1.xpm lib/X11/oneko/cat2.xpm lib/X11/oneko/mouse.xpm @dirrm lib/X11/oneko Für weitere Details zur Packliste lesen Sie in der &man.pkg.create.1; Manualpage nach. Es wird empfohlen alle Dateinamen in dieser Datei alphabetisch sortiert zu halten. Das erlaubt Ihnen die Änderungen bei einem Upgrade Ihres Ports deutlich einfacher zu Überprüfen. Eine Packlist von Hand zu erzeugen kann eine sehr mühsame Aufgabe sein. Wenn der Port eine große Anzahl Dateien installiert, kann es Zeit sparen, eine Packliste automatisch zu erstellen. Es gibt nur einen Fall, in dem pkg-plist weggelassen werden kann. Wenn der Port nur eine handvoll Dateien und Verzeichnisse installiert, können diese in den Variablen PLIST_FILES und PLIST_DIRS im Makefile aufgelistet werden. Zum Beispiel könnten wir im obigen Beispiel ohne pkg-plist für den oneko-Port auskommen, indem wir die folgenden Zeilen ins Makefile einfügen: PLIST_FILES= bin/oneko \ lib/X11/app-defaults/Oneko \ lib/X11/oneko/cat1.xpm \ lib/X11/oneko/cat2.xpm \ lib/X11/oneko/mouse.xpm PLIST_DIRS= lib/X11/oneko Natürlich sollte PLIST_DIRS ungesetzt bleiben, wenn der Port keine eigenen Verzeichnisse installiert. Der Preis für diese Art die Dateien eines Ports anzugeben ist, dass man keine Befehlsfolgen wie in &man.pkg.create.1; nutzen kann. Deshalb ist es nur für einfache Ports geeignet und macht diese noch einfacher. Gleichzeitig bringt es den Vorteil die Anzahl der Dateien in der Ports-Sammlung zu reduzieren. Deshalb ziehen Sie bitte diese Vorgehensweise in Erwägung, bevor Sie pkg-plist benutzen. Später werden wir uns ansehen, wie pkg-plist und PLIST_FILES benutzt werden können, um anspruchsvollere Aufgaben zu erfüllen. Die Checksummendatei erzeugen Geben Sie einfach make makesum ein. Die Regeln von Make sorgen dafür, dass die Datei distinfo automatisch erstellt wird. Wenn sich die Checksumme einer heruntergeladenen Datei regelmäßig ändert und Sie sicher sind, dass Sie der Quelle trauen können (weil sie z.B. von einer Hersteller-CD oder täglich erstellter Dokumentation stammt), sollten Sie diese Dateien in der Variable IGNOREFILES angeben. Dann wird die Checksumme für diese Datei bei make makesum nicht berechnet, sondern auf IGNORE gesetzt. Den Port testen Sie sollten sicherstellen, dass die Port-Regeln genau das einhalten, was Sie von ihnen erwarten, auch beim Erzeugen eines Pakets aus dem Port. Dies sind die wichtigen Punkte, die Sie überprüfen sollten. pkg-plist enthält nichts, das nicht von Ihrem Port installiert wurde. pkg-plist enthält alles, was von Ihrem Port installiert wurde. Ihr Port kann mit Hilfe von make reinstall mehrmals installiert werden. Ihr Port räumt bei der Deinstallation hinter sich auf. Empfohlene Testreihenfolge make install make package make deinstall pkg_add Paket-Name make deinstall make reinstall make package Stellen Sie bitte sicher, dass während make package und make deinstall keine Warnungen ausgegeben werden. Nach Schritt 3 überprüfen Sie bitte, ob alle neuen Verzeichnisse korrekt entfernt wurden. Und versuchen Sie die Software nach Schritt 4 zu benutzen, um sicherzustellen, dass sie korrekt funktioniert, wenn diese aus einem Paket installiert wird. Der gründlichste Weg diese Schritte zu automatisieren ist eine Tinderbox zu installieren. Diese verwaltet Jails, in denen Sie alle oben genannten Schritte durchführen können, ohne den Zustand Ihres laufenden Systems zu verändern. Mehr Informationen hierzu entält ports/ports-mgmt/tinderbox Ihren Port mit <command>portlint</command> überprüfen Bitte verwenden Sie portlint, um festzustellen, ob Ihr Port unseren Richtlinien entspricht. Das Programm ports-mgmt/portlint ist Teil der Ports-Sammlung. Stellen Sie vor allem sicher, dass das Makefile in der richtigen Form und das Paket passend benannt ist. Den Port einreichen Als Erstes sorgen Sie bitte dafür, dass Sie den Abschnitt DOs and DON'Ts gelesen haben. Nun, da Sie mit Ihrem Port zufrieden sind, müssen Sie ihn nur noch in den Haupt-Ports-Tree von FreeBSD einbringen, damit alle daran teilhaben können. Wir benötigen nicht Ihr work-Verzeichnis oder Ihr pkgname.tgz-Paket – diese können Sie nun löschen. Als Nächstes fügen Sie bitte einfach die Ausgabe von shar `find port_dir` in einen Fehlerbericht (PR - Problem Report) und senden diesen mittels &man.send-pr.1; (unter Bug Reports and General Commentary finden Sie weitere Informationen über &man.send-pr.1;). Ordnen Sie den Fehlerbericht bitte in die Kategorie Ports mit der Klasse Change-Request ein (Markieren Sie den Bericht nicht als vertraulich (confidential)!). Fügen Sie bitte eine kurze Beschreibung des Programms, das Sie portiert haben, in das Beschreibungs-Feld des Problemberichts und das Shar (Shell-Archiv) in das Fix-Feld ein. Sie können uns die Arbeit um einiges vereinfachen, wenn Sie eine gute Beschreibung in der Zusammenfassung des Problemberichtes verwenden. Wir bevorzugen etwas wie Neuer Port: <Kategorie>/<Portname><Kurzbeschreibung des Ports> für neue Ports und Update Port: <Kategorie>/<Portname> <Kurzbeschreibung des Updates> für Portupdates. Wenn Sie sich an dieses Schema halten, ist die Chance, dass sich jemand bald Ihren Bericht ansieht, deutlich besser. Noch einmal: Bitte fügen Sie nicht das distfile der Originalquelle, das work-Verzeichnis oder das Paket, das Sie mit make package erstellt haben, ein. Haben Sie bitte etwas Geduld, nachdem Sie den Port eingereicht haben. Manchmal kann es einige Monate dauern, bevor ein Port in FreeBSD eingefügt wird, obwohl es wahrscheinlich nur ein paar Tage dauert. Sie können sich die Liste der Ports, die darauf warten in FreeBSD committet zu werden, ansehen. Nachdem wir einen Blick auf Ihren Port geworfen haben, werden wir, wenn nötig, bei Ihnen nachfragen und ihn in die Ports-Sammlung übernehmen. Ihr Name taucht dann auch in der Liste der Additional FreeBSD Contributors und in anderen Dateien auf. Ist das nicht toll?! :-) Einen Port in aller Ruhe erstellen Ok, das war nicht ganz einfach und der Port hat einige Veränderungen erfordert, um funktionieren zu können. In diesem Abschnitt werden wir Schritt für Schritt erklären, wie man den funktionierenden Port den Vorgaben der Ports entsprechend anpasst. Die Funktionsweise Beginnen wir mit der Abfolge der Ereignisse, die eintreten, wenn der Nutzer das erste make in Ihrem Portsverzeichnis ausführt. Sie empfinden es für das Verständnis vielleicht hilfreich bsd.port.mk in einem anderen Fenster offen zu haben, während Sie diesen Abschnitt lesen. Aber machen Sie sich keine Sorgen, falls Sie nicht wirklich verstehen, was bsd.port.mk macht, die Wenigsten begreifen dies... :> Das Target fetch wird aufgerufen. Es ist dafür verantwortlich sicherzustellen, dass der Tarball lokal im DISTDIR verfügbar ist. Falls fetch die benötigten Dateien in DISTDIR nicht finden kann, durchsucht es die URL MASTER_SITES, welche im Makefile gesetzt ist, ebenso wie unsere Haupt-FTP-Seite unter ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/ , wo wir genehmigte Distfiles als Backup aufbewahren. Danach wird versucht, so eine direkte Internetverbindung besteht, dass genannte Distfile mit FETCH herunterzuladen. Falls dies gelingt, wird die Datei in DISTDIR für weitere Nutzung abgelegt und fährt fort. Das Target extract wird aufgerufen. Es sucht nach den Distfiles Ihres Ports (normalerweise ein gzip-komprimierter Tarball) in DISTDIR und entpackt diese in ein temporäres Unterverzeichnis, welches von WRKDIR festgelegt wird (standardmäßig work). Das Target patch wird aufgerufen. Zuerst werden alle in PATCHFILES festgelegten Patches eingespielt. Anschließend werden, falls Patches der Form patch-* in PATCHDIR (standardmäßig das files-Unterverzeichnis) gefunden werden, diese in alphabetischer Reihenfolge eingespielt. Das Target configure wird aufgerufen. Dieses kann viele verschiedene Dinge machen. Existiert scripts/configure, so wird es aufgerufen. Falls HAS_CONFIGURE oder GNU_CONFIGURE gesetzt sind, wird WRKSRC/configure ausgeführt. Falls USE_IMAKE gesetzt ist, wird XMKMF (standardmäßig xmkmf -a) ausgeführt. Das Target build wird aufgerufen. Es ist für das Wechseln in das private Arbeitsverzeichnis (WRKSRC) und das Bauen des Ports zuständig. Ist USE_GMAKE gesetzt, so wird GNU make verwendet, sonst das System-make. Die oben genannten Schritte sind die Standardaktionen. Zusätzlich können Sie pre- irgendwas oder post-irgendwas als Targets definieren oder Skripten mit diesen Namen in das scripts-Unterverzeichnis legen. Sie werden dann vor bzw. nach den Standardaktionen aufgerufen. Angenommen Sie haben das Target post-extract in Ihrem Makefile definiert und eine Datei pre-build im scripts Unterverzeichnis, so wird das Target post-extract nach dem normalen Entpacken aufgerufen und das Skript pre-build ausgeführt, bevor die vordefinierten Bau-Regeln abgearbeitet sind. Es wird empfohlen, dass Sie Makefile-Targets verwenden, falls die Aktionen es erlauben, da es so für jemanden einfacher sein wird herauszufinden, was für eine nicht-standardmäßige Aktion der Port benötigt. Die Standardaktionen werden aus den Targets bsd.port.mk do-irgendwas übernommen. Zum Beispiel sind die Befehle zum Entpacken eines Ports im Target do-extract zu finden. Falls Sie mit einem vorgegebenen Target nicht zufrieden sind, können Sie es verändern, indem Sie das Target do-irgendwas in Ihrem Makefile neu definieren. Die Haupt-Targets (z.B. extract, configure usw.) machen nicht mehr als sicherzustellen, dass bis hierhin alle Abschnitte abgeschlossen sind, um danach die eigentlichen Targets oder Skripte aufzurufen. Und es ist nicht beabsichtigt, dass diese geändert werden. Falls Sie das Entpacken verändern wollen, verändern Sie do-extract, aber niemals die Art, wie extract arbeitet! Jetzt, da Sie verstehen, was geschieht, wenn der Benutzer make eingibt, lassen Sie uns durch die empfohlenen Schritte gehen, um den perfekten Port zu erstellen. Den originalen Quelltext besorgen Normalerweise liegt der original Quelltext als gepackte Datei (foo.tar.gz oder foo.tar.Z) vor. Kopieren Sie diese nach DISTDIR. Nutzen Sie, soweit möglich, immer die Quellen aus dem Hauptzweig. Es ist notwendig die Variable MASTER_SITES anzupassen, um anzugeben, wo sich der originale Quelltext befindet. In bsd.sites.mk finden sich hilfreiche Definitionen für die gebräuchlichsten Seiten. Bitte nutzen Sie diese Seiten und die zugehörigen Definitionen, soweit dies möglich ist. Damit wird vermieden, immer und immer wieder dieselben Informationen zu wiederholen. Da die Hauptseiten regelmäßig angepasst werden müssen, vereinfacht dieses Vorgehen die Pflege der Dateien für jeden Beteiligten. Falls keine zuverlässige und gut erreichbare FTP/HTTP-Seite zu finden ist, oder nur Seiten auffindbar sind, die keinen Standards entsprechen, sollte eine Kopie des Quelltextes auf einer zuverlässigen Seite abgelegt werden. Dies könnte z.B. die eigene Internetseite sein. Ist kein geeigneter Ort zum Ablegen des Quelltextes auffindbar, ist es möglich diesen intern auf ftp.FreeBSD.org abzulegen; dies sollte jedoch als letzte Möglichkeit angesehen werden. Das Distfile muss in diesem Fall in ~/public_distfiles/ eines freefall-Accounts abgelegt werden. Bitten Sie den Committer Ihres Ports dies zu erledigen. Er wird außerdem MASTER_SITES nach MASTER_SITE_LOCAL und MASTER_SITE_SUBDIR auf den freefall-Benutzernamen angepasst. Sollte sich das Distfile des Ports regelmäßig ohne Versionsanpassungen des Autors ändern, sollte überlegt werden, das Disfile auf der eigenen Internetseite abzulegen und diese in der Liste der MASTER_SITES an die erste Stelle zu setzen. Falls möglich, sollte der Autor des Ports gebeten werden, dies zu erledigen; hierüber wird die Kontrolle des Quelltextes verbessert. Wird eine eigene Version des Quelltextes auf eigenen Internetseiten verfügbar gemacht, verhindert dies Warnungen von checksum mismatch und reduziert den Arbeitsaufwand der Maintainer der FTP-Seiten. Auch wenn nur eine Quelle für den Quelltext des Ports zur Verfügung steht, ist es empfohlen, ein Backup auf einer weiteren Seite abzulegen und diese als zweiten Eintrag in MASTER_SITES aufzunehmen. Sind für den Port zusätzlich aus dem Internet verfügbare Patches erforderlich, sollten diese ebenfalls in DISTDIR abgelegt werden. Sollten diese Patches von anderer Quelle als der Hauptseite des Ports stammen, ist das kein Grund zur Sorge. Es gibt Wege diesem Umstand gerecht zu werden (beachten Sie die unten stehende Beschreibung zu PATCHFILES ). Den Port bearbeiten Entpacken Sie eine Kopie des Tarballs in ein privates Verzeichnis und nehmen Sie alle Änderungen vor, die nötig sind, um den Port unter einer aktuellen FreeBSD-Version kompilieren zu können. Protokollieren Sie sorgfältig alle Schritte, die Sie vornehmen, da Sie den Prozess in Kürze automatisieren werden. Alles, auch das Entfernen, Hinzufügen oder Bearbeiten von Dateien, sollte von einem automatisierten Skript oder einer Patch-Datei machbar sein, wenn Ihr Port fertig ist. Falls Ihr Port bedeutende Interaktionen/Veränderungen durch den Benutzer benötigt, um ihn zu Kompilieren oder zu Installieren, sollten Sie einen Blick auf Larry Walls klassische Configure-Skripte werfen oder vielleicht etwas Ähnliches selbst erstellen. Das Ziel der Ports-Sammlung ist es, jeden Port so plug-and-play-fähig wie möglich für den Endbenutzer zu machen, während ein Minimum an Speicherplatz gebraucht wird. Solange nicht anders angegeben wird von Patch-Dateien, Skripten und anderen Dateien, die Sie erstellt und der FreeBSD Ports-Sammlung hinzugefügt haben, angenommen, dass Sie unter den standardmäßigen BSD-Copyright-Bedingungen stehen. Fehlerbehebung (Patches) Bei der Vorbereitung eines Ports können die Dateien, die hinzugefügt oder verändert wurden, mittels &man.diff.1; abgefangen werden, um Sie später an &man.patch.1; zu übergeben. Jeder Patch, der dem Quelltext übergeben werden soll, sollte in einer Datei patch-* abgelegt werden, wobei * dem Pfadnamen der zu korrigierenden Datei entspricht, wie er auch in patch-Imakefile oder im patch-src-config.h erscheint. Diese Dateien sollten in PATCHDIR (normalerweise files) abgelegt sein, von wo sie automatisch übernommen werden. Alle Patches müssen sich relativ zur WRKSRC-Variable (normalerweise dem Verzeichnis, in dem sich der Quelltext des Ports entpackt und wo auch der Bau stattfindet) befinden. Um Korrekturen und Updates zu vereinfachen, sollte es vermieden werden, mehr als einen Patch für eine Datei zu nutzen (z.B. patch-file und patch-file2, welche beide WRKSRC/foobar.c verändern). Für die Benennung der Patches sollten nur die Zeichen [-+._a-zA-Z0-9] genutzt werden. Bitte verwenden Sie keine weiteren Zeichen als die angegebenen. Die Namensvergabe sollte nicht patch-aa oder patch-ab etc. entsprechen, erwähnen Sie immer den Pfad und Dateinamen. RCS-Zeichenketten sollten vermieden werden, da CVS diese verstümmeln würde, sobald wir diese Dateien in die Ports-Sammlung einpflegen. Wenn wir die Dateien wieder abrufen wären diese verändert und der Patch würde fehlschlagen. RCS-Zeichenketten sind in Dollar-Zeichen ($) eingefügte Zeichen und beginnen üblicherweise mit $Id oder $RCS. Die Option rekursiv () zu nutzen &man.diff.1;, um Patches zu erstellen, ist zulässig, jedoch sollte der Patch anschließend geprüft werden, um Unnötiges aus dem Patch zu entfernen. Im Einzelnen bedeutet dies, dass Diffs zwischen zwei Backup-Dateien, Makefiles oder wenn der Port Imake oder GNU configure usw. nutzt, überflüssig sind und entfernt werden sollten. Falls es es notwendig war, configure.in zu bearbeiten und es soll autoconf zum Neuerstellen von configure genutzt werden, sollten die Diffs aus configure nicht genutzt werden (diese werden oft einige tausend Zeilen groß!); – hier sollte USE_AUTOTOOLS=autoconf:261 definiert und das Diff aus configure.in genutzt werden. Zusätzlich sollte man unnötige Markup-Änderungen in Patches/Änderungen möglichst vermeiden. In der Open Source-Welt teilen sich Projekte häufig große Teile des Quellcodes. Allerdings verwenden die einzelnen Projekte oft unterschiedliche Programmierstile und Vorgaben für Einrückungen. Wenn man also einen funktionierenden Teil einer Funktion aus einem Projekt verwendet, um ein ähnliches Problem in einem anderen Projekt zu lösen, sollte man besonders vorsichtig sein, weil sich ansonsten die CVS-Änderungseinträge mit überflüssigen Einträgen füllen, die nur das Markup des Quellcodes betreffen, ohne dass sich an der Funktion des eigentlichen Quellcode etwas ändert (withspace-only changes). Solche Änderungen vergrößern nicht nur das CVS-Repository, sondern erschweren es auch die Ursache für eventuell auftretende Probleme zu finden. War es notwendig eine Datei zu entfernen, wird dies besser mittels des post-extract-Targets als über den Patch selbst realisiert. Ein einfacher Austausch kann direkt über das Makefile des Ports umgesetzt werden, indem der in-place-Modus von &man.sed.1; genutzt wird. Dies ist sehr hilfreich, wenn variable Werte korrigiert werden sollen. Beispiel: post-patch: @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README @${REINPLACE_CMD} -e 's|-pthread|${PTHREAD_LIBS}|' ${WRKSRC}/configure Relativ häufig ergibt sich die Situation, in der die portierte Software die CR/LF-Konventionen für Zeilenenden nutzt (dies ist bei unter &windows; entwickelter Software häufig der Fall). Dies kann bei weiteren Patches Probleme (Compiler-Warnungen, Fehlermeldungen bei der Ausführung von Skripten wie z.B. /bin/sh^M not found) und anderes ergeben. Um schnell alle Dateien von CR/LF nach LF zu konvertieren, kann USE_DOS2UNIX=yes in das Makefile des Ports geschrieben werden. Hierzu kann eine Liste der zu konvertierenden Dateien erstellt werden: USE_DOS2UNIX= util.c util.h Sollen Gruppen von Dateien über verschiedene Unterverzeichnisse konvertiert werden, kann DOS2UNIX_REGEX genutzt werden, dessen Argumente find-kompatible, reguläre Ausdrücke sind. Mehr zur Formatierung findet sich in &man.re.format.7;. Diese Option ist beim Konvertieren aller Dateien mit definierter Endung, z.B. aller Dateien im Quellcode, wobei binäre Dateien unberührt bleiben, sinnvoll: USE_DOS2UNIX= yes DOS2UNIX_REGEX= .*\.(c|cpp|h) Konfigurieren Fügen Sie alle zusätzlichen Veränderungsbefehle Ihrem Skript configure hinzu und speichern Sie es im scripts-Unterverzeichnis. Wie vorstehend schon erwähnt, können Sie dies auch mit den Targets Makefile und/oder Skripte mit dem Namen pre-configure oder post-configure erledigen. Handhabung von Benutzereingaben Sollte der Port Eingaben vom Benutzer benötigen, muss IS_INTERACTIVE im Makefile des Ports gesetzt werden. Dies erlaubt overnight builds Ihren Port zu überspringen, falls der Nutzer die Variable BATCH setzt (setzt der Nutzer hingegen die Variable INTERACTIVE, werden nur Ports gebaut, die Interaktion vom Nutzer erwarten). Dies erspart den Rechnern, welche kontinuierlich Ports bauen, eine Menge Zeit (siehe unten). Zudem ist es empfohlen, falls sinnvolle Vorgaben für interaktive Optionen gesetzt sind, die PACKAGE_BUILDING-Variable zu prüfen und das interaktive Skript abzuschalten. Dies macht es uns möglich, Pakete für CDROMs und FTP-Server zu bauen. Die Konfiguration des Makefile Das Konfigurieren des Makefile ist sehr einfach und wir schlagen vor, dass Sie zunächst einen Blick auf vorhandene Beispiele werfen. Zusätzlich gibt es ein Beispiel eines Makefile in diesem Handbuch. Schauen Sie es sich an und verfolgen Sie bitte die Abfolge der Variablen und Abschnitte in dieser Vorlage. Damit erleichtern Sie es anderen, Ihren Port zu lesen. Bedenken Sie bitte die folgenden Probleme in der hier vorgegebenen Abfolge der Unterabschnitte dieses Kapitels, wenn Sie Ihr neues Makefile erstellen: Der originale Quelltext Liegt der Quelltext in DISTDIR als eine standardisierte und mit gzip gepackte Datei in der Art foozolix-1.2.tar.gz? Falls ja, können Sie zum nächsten Schritt übergehen. Falls nicht, sollten Sie versuchen, die Variablen DISTVERSION, DISTNAME, EXTRACT_CMD, EXTRACT_BEFORE_ARGS, EXTRACT_AFTER_ARGS, EXTRACT_SUFX, oder DISTFILES zu ändern. Das hängt davon ab, wie fremdartig das Distributionsfile Ihres Ports ist (der häufigste Fall ist EXTRACT_SUFX=.tar.Z, wenn der Tarball durch ein normales compress und nicht durch gzip gepackt wurde). Im schlimmsten Fall können Sie einfach Ihre eigene Vorgabe mittels do-extract erzeugen und die Standardvorgabe überschreiben; aber dies sollte in den wenigsten Fällen, wenn überhaupt, notwendig sein. Bezeichnungen Der erste Teil des Makefile beschreibt die Versionsnummer des Ports und führt ihn in der richtigen Kategorie auf. <makevar>PORTNAME</makevar> und <makevar>PORTVERSION</makevar> Setzen Sie bitte die Variable PORTNAME auf den Basisnamen Ihres Ports und die Variable PORTVERSION auf dessen Versionsnummer. <makevar>PORTREVISION</makevar> und <makevar>PORTEPOCH</makevar> <makevar>PORTREVISION</makevar> Die PORTREVISION-Variable ist ein streng monoton wachsender Wert, welcher auf 0 zurückgesetzt wird, nachdem PORTVERSION erhöht wurde (d.h. jedes Mal, wenn ein offizielles Release erfolgt). Sie wird an den Namen des Pakets angehängt, wenn sie ungleich 0 ist. Änderungen an PORTREVISION werden von automatisierten Werkzeugen (z.B. &man.pkg.version.1;) genutzt, um anzuzeigen, dass ein neues Paket verfügbar ist. PORTREVISION sollte jedes Mal erhöht werden, wenn eine Änderung am Port erfolgt, die beträchtliche Auswirkungen auf den Inhalt oder Struktur des aus dem Port erzeugten Pakets zur Folge hat. Beispiele dafür, wann PORTREVISION erhöht werden sollte: Hinzufügen von Patches, welche Sicherheitslücken schließen, Fehler beseitigen oder neue Funktionalität zum Port hinzufügen. Änderungen am Makefile des Ports, welche compile-time-Optionen hinzufügen oder entfernen. Änderungen bezüglich Packliste oder am Verhalten während der Installation des Pakets (d.h. Änderungen an einem Skript, welches Ausgangsdaten für das Paket erzeugt, wie z.B. SSH-Hostschlüssel). Versionssprung einer Shared-Library, welche eine Abhängigkeit dieses Ports ist (In diesem Fall würde ein Anwender bei der Installation des alten Pakets scheitern, falls er eine neue Version der Abhängigkeit bereits installiert hat, weil nach der alten Bibliothek libfoo.x anstatt nach libfoo.(x+1)) gesucht wird). Schleichende Änderungen am Distfile, welche bedeutende funktionale Änderungen verursachen, d.h. Änderungen des Distfile erfordern eine Korrektur an distinfo, ohne dass damit zusammenhängend die PORTVERSION verändert wird, obwohl ein diff -ru zwischen der alten und der neuen Version bedeutende Veränderungen am Code nachweist. Beispiele für Änderungen, welche keine Erhöhung von PORTREVISION erfordern: Stilistische Änderungen am Grundgerüst des Ports ohne funktionale Änderungen am daraus resultierenden Paket. Änderungen an der Variable MASTER_SITES oder andere funktionale Änderungen, welche das resultierende Paket nicht verändern. Marginale Patches am Distfile wie die Korrektur von Tippfehlern, welche nicht wichtig genug sind, um dem Benutzer die Bürde eines Upgrades aufzuerlegen. Build fixes, die ein Paket erst kompilierbar machen, welches ohne diese Änderungen vorher nicht erzeugt werden konnte (solange die Änderungen keine funktionale Differenz bringen auf Plattformen, auf denen dieses Paket schon vorher gebaut werden konnte). Da PORTREVISION den Inhalt des Pakets wiederspiegelt, ist es nicht notwendig PORTREVISION zu erhöhen, wenn das Paket vorher nicht erstellt werden konnte. Als Faustregel gilt: Stellen Sie sich die Frage, ob die durchgeführte Änderung am Port jedem hilft (entweder aufgrund einer Verbesserung, Beseitigung eines Fehlers, oder der Annahme, dass das neue Paket überhaupt erst funktioniert) und wägen Sie es gegen den Umstand ab, dass jedermann, der seine Ports-Sammlung regelmässig auf dem neuesten Stand hält, zu einer Aktualisierung gezwungen wird. Falls Sie die Frage positiv beantworten sollten, erhöhen Sie die Variable PORTREVISION. <makevar>PORTEPOCH</makevar> Von Zeit zu Zeit geschieht es, dass irgendjemand (Drittanbieter von Software oder FreeBSD Ports Committer) etwas Dummes tut und eine Version einer Software veröffentlicht, deren Versionsnummer niedriger ist als die der vorherigen. Ein Beispiel hierfür ist ein Port, der von foo-20000801 auf foo-1.0 geändert wird (der Erstere wird fälschlicherweise als neue Version behandelt, weil 2000801 ein numerisch größerer Wert ist als 1). In Situationen wie diesen sollte die Variable PORTEPOCH erhöht werden. Wenn PORTEPOCH größer als 0 ist, wird sie an den Namen des Pakets angehängt, wie in Abschnitt 0 oberhalb bereits beschrieben. PORTEPOCH darf niemals verringert oder auf 0 gesetzt werden, weil der Vergleich des Pakets mit einem früheren Zeitpunkt scheitern würde (d.h. das Paket würde niemals als veraltet erkannt werden): Die neue Versionsnummer (1.0,1 im obigen Beispiel) ist immer noch numerisch kleiner als die vorherige Version (2000801), aber das Suffix ,1 wird von automatisierten Werkzeugen gesondert behandelt und wird als größer erkannt, als das implizit angenommene Suffix ,0 im früheren Paket. Das Entfernen oder Zurücksetzen von PORTEPOCH führt zu unendlichem Ärger. Wenn Sie die obigen Ausführungen nicht vollständig verstanden haben, lesen Sie es bitte unbedingt nochmals bis Sie es vollständig verinnerlicht haben, oder fragen Sie vor jeder Änderung auf den Mailinglisten nach! Es wird erwartet, dass PORTEPOCH für die weitaus überwiegende Zahl der Ports nicht verwendet wird und der verantwortungsvolle und vorausschauende Umgang mit PORTVERSION macht es meist überflüssig, falls ein späteres Release die Versionsstruktur ändern sollte. Vorsicht ist geboten, wenn ein Release einer Drittanbieter-Software ohne eine offizielle Versionsnummer veröffentlicht wird, wie z.B. bei Snapshot-Versionen. Man ist versucht, das Release mit dem jeweiligen Datum zu bezeichnen, was unweigerlich zu den oben beschriebenen Problemen führt, wenn das nächste offizielle Release erscheint. Wenn z.B. ein Snapshot zum Datum 20000917 veröffentlicht wird und die vorherige Version der Software war 1.2, dann sollte der Snapshot die PORTVERSION 1.2.20000917 oder ähnlich erhalten und nicht 20000917, damit das nachfolgende Release, angenommen 1.3, immer noch einen größeren numerischen Wert aufweist. Beispiel für den Gebrauch von <makevar>PORTREVISION</makevar> und <makevar>PORTEPOCH</makevar> Der gtkmumble-Port, Version 0.10, befindet sich in der Ports-Sammlung: PORTNAME= gtkmumble PORTVERSION= 0.10 PKGNAME wird zu gtkmumble-0.10. Ein Sicherheitsloch wurde entdeckt, das einen lokalen Patch von FreeBSD erforderlich macht. PORTREVISION wird entsprechend erhöht. PORTNAME= gtkmumble PORTVERSION= 0.10 PORTREVISION= 1 PKGNAME wird zu gtkmumble-0.10_1 Eine neue Version wird vom Software-Drittanbieter veröffentlicht, bezeichnet mit der Version 0.2 (es stellt sich heraus, dass der Autor beabsichtigte, dass 0.10 eigentlich 0.1.0 bedeuten sollte, nicht was kommt nach 0.9  – Hoppla, aber nun ist es zu spät). Da die neue Unterversion 2 numerisch kleiner ist als die vorherige Version 10, muss PORTEPOCH erhöht werden, um sicherzustellen, dass das neue Paket auch als neuer erkannt wird. Da es ein neues Release des Drittanbieters ist, wird PORTREVISION auf 0 zurückgesetzt (oder aus dem Makefile entfernt). PORTNAME= gtkmumble PORTVERSION= 0.2 PORTEPOCH= 1 PKGNAME wird zu gtkmumble-0.2,1 Das nächste Release ist 0.3. Da PORTEPOCH niemals verringert wird, sind die Versionsvariablen nun wie folgt: PORTNAME= gtkmumble PORTVERSION= 0.3 PORTEPOCH= 1 PKGNAME wird zu gtkmumble-0.3,1 Falls PORTEPOCH mit diesem Upgrade auf 0 zurückgesetzt worden wäre, dann würde jemand, der das Paket gtkmumble-0.10_1 installiert hätte, das Paket gtkmumble-0.3 nicht als neuer erkennen, da 3 immer noch numerisch kleiner ist als 10. Bedenken Sie, dass genau dies der springende Punkt an PORTEPOCH ist. <makevar>PKGNAMEPREFIX</makevar> und <makevar>PKGNAMESUFFIX</makevar> Zwei optionale Variablen, PKGNAMEPREFIX und PKGNAMESUFFIX, werden verknüpft mit PORTNAME und PORTVERSION, um PKGNAME zu bilden als ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION} . Stellen Sie bitte unbedingt sicher, dass diese Variablen den Richtlinien für einen guten Paketnamen entsprechen. Insbesondere dürfen Sie keinesfalls einen Bindestrich (-) in PORTVERSION verwenden. Falls das Paket den language- oder -compiled.specifics-Teil aufweist (siehe unten) benutzen Sie PKGNAMEPREFIX oder PKGNAMESUFFIX respektive. Machen Sie diese Variablen nicht zum Bestandteil von PORTNAME! <makevar>LATEST_LINK</makevar> In einigen Fällen können mehrere Versionen einer Applikation gleichzeitig in der Ports-Sammlung sein. Das index build- und das package build-System müssen nun in der Lage sein, diese als unterschiedliche Ports zu erkennen, obwohl diese Versionen alle die gleichen Variablen PORTNAME, PKGNAMEPREFIX und sogar PKGNAMESUFFIX aufweisen. In solchen Fällen sollte die optionale Variable LATEST_LINK auf einen unterschiedlichen Wert für alle Ports gesetzt werden mit Ausnahme des Haupt-Ports. Beispiele hierfür sind die editors/vim5 und editors/vim-Ports und die www/apache*-Familie. Beachten Sie bitte, dass die Frage der Auswahl der wichtigsten Version (am populärsten, am besten Unterstützt, zuletzt gepatcht usw.) ausserhalb der Möglichkeiten dieses Handbuches liegt. Wir sagen Ihnen nur, wie Sie die anderen Ports spezifizieren, nachdem Sie den Haupt-Port erkoren haben. Namensregeln für Pakete Im Folgenden finden Sie die Regeln für die Benennung Ihrer Pakete. Diese sollen gewährleisten, dass das Paketverzeichnis leicht zu durchsuchen ist, da es bereits abertausende Pakete gibt und die Nutzer sich mit Schauder abwenden, wenn Ihre Augen überstrapaziert werden! Der Paketname soll aussehen wie language_region-name-compiled.specifics-version.numbers. Der Paketname ist definiert als ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION} . Stellen Sie bitte sicher, dass die Variablen Ihres Ports diesem Format entsprechen. FreeBSD bemüht sich ausserordentlich, die Landessprachen seiner Nutzer zu unterstützen. Die language-Variable soll eine Abkürzung mit 2 Buchstaben sein der Sprachen gemäß ISO-639, falls der Port für eine bestimmte Sprache spezifisch ist. Beispiele hierfür sind ja für Japanisch, ru für Russisch, vi für Vietnamesisch, zh für Chinesisch, ko für Koreanisch und de für Deutsch. Sollte der Port spezifisch sein für eine gewisse Region innerhalb eines Sprachraumes, dann fügen Sie bitte auch den Ländercode mit 2 Buchstaben hinzu. Beispiele sind en_US für nordamerikanisches Englisch und fr_CH für schweizerisches Französisch. Der language-Teil muss in der PKGNAMEPREFIX-Variable gesetzt werden. Der erste Buchstabe des name-Teils muss kleingeschrieben werden (der Rest des Namens kann Großbuchstaben enthalten. Daher seien Sie bitte umsichtig, wenn Sie den Namen einer Software konvertieren, welche Grossbuchstaben enthält). Es ist Tradition, Perl 5-Module durch ein vorstehendes p5- und durch Umwandlung des doppelten Doppelpunktes in Bindestriche zu bezeichnen. So wird z.B. aus dem Data::Dumper-Modul der p5-Data-Dumper-Port. Vergewissern Sie sich, dass der Name des Ports und seine Versionsnummer klar getrennt sind und in den Variablen PORTNAME und PORTVERSION stehen. Der einzige Grund, um in PORTNAME einen Versionsteil aufzunehmen ist der, dass die Software wirklich so bezeichnet wird, wie z.B. die Ports textproc/libxml2 oder japanese/kinput2-freewnn. Ansonsten sollte PORTNAME keine versionsspezifischen Bestandteile aufweisen. Es ist vollkommen normal, dass viele Ports den gleichen PORTNAME aufweisen wie z.B. die www/apache*-Ports. In diesem Falle werden unterschiedliche Versionen (und unterschiedliche Indexeinträge) unterschieden durch die Werte von PKGNAMEPREFIX, PKGNAMESUFFIX und LATEST_LINK. Falls der Port mit verschiedenen, fest kodierten Vorgaben (üblicherweise Teil des Verzeichnisnamens in einer Familie von Ports) gebaut werden kann, dann soll der -compiled.specifics-Teil die einkompilierten Vorgaben anzeigen (der Bindestrich ist optional). Beispiele hierfür sind Papiergrößen und Font-Einheiten. Der -compiled.specifics-Teil muss in der Variablen PKGNAMESUFFIX gesetzt werden. Die Versionszeichenfolge sollte einen Bindestrich (-) am Schluss haben und eine von Punkten getrennte Liste von Integer-Zahlen und kleingeschriebenen Buchstaben sein. Es ist nicht zulässig, einen weiteren Bindestrich innerhalb des Versionsstrings zu verwenden! Die einzige Ausnahme hiervon ist die Zeichenfolge pl (bedeutet patchlevel), welche nur dann gebraucht werden darf, wenn die Applikation über keine Haupt– oder Unterversionsnummern verfügt. Wenn die Versionsbezeichnung der Software Zeichenketten wie alpha, beta, rc oder pre enthält, dann nehmen Sie bitte den ersten Buchstaben daraus und setzen ihn unmittelbar hinter einen Punkt. Falls die Versionszeichenfolge nach diesem Punkt fortgesetzt wird, sollen die Zahlen ohne einen Punkt zwischen den einzelnen Buchstaben folgen. Das Ziel ist es, die Ports anhand der Versionszeichenfolge zu sortieren. Stellen Sie bitte unbedingt sicher, dass die Bestandteile der Versionsnummer immer durch einen Punkt getrennt sind und falls Datumsangaben verwandt werden diese im Format yyyy.mm.dd und nicht dd.mm.yyyy oder gar dem nicht Y2K-kompatiblen Format yy.mm.dd vorliegen. Hier sind einige reale Beispiele, die aufzeigen, wie man den Namen einer Applikation zu einem vernünftigen Paketnamen umwandelt: Softwarename PKGNAMEPREFIX PORTNAME PKGNAMESUFFIX PORTVERSION Grund mule-2.2.2 (leer) mule (leer) 2.2.2 Keine Änderung erforderlich EmiClock-1.0.2 (leer) emiclock (leer) 1.0.2 keine Großbuchstaben für einzelne Applikationen rdist-1.3alpha (leer) rdist (leer) 1.3.a Keine Zeichenketten wie alpha erlaubt es-0.9-beta1 (leer) es (leer) 0.9.b1 keine Zeichenketten wie beta erlaubt mailman-2.0rc3 (leer) mailman (leer) 2.0.r3 keine Zeichenketten wie rc erlaubt v3.3beta021.src (leer) tiff (leer) 3.3 Was sollte denn das eigentlich sein? tvtwm (leer) tvtwm (leer) pl11 Versionsstring zwingend erforderlich piewm (leer) piewm (leer) 1.0 Versionsstring zwingend erforderlich xvgr-2.10pl1 (leer) xvgr (leer) 2.10.1 pl nur erlaubt, wenn keine Versionsnummer vorhanden gawk-2.15.6 ja- gawk (leer) 2.15.6 Japanische Sprachversion psutils-1.13 (leer) psutils -letter 1.13 Papergröße beim Paketbau fix kodiert pkfonts (leer) pkfonts 300 1.0 Paket für 300 DPI Schriftarten Falls es in der Originalquelle überhaupt keinen Anhaltspunkt für irgendeine Versionsbezeichnung gibt und es unwahrscheinlich ist, dass der Autor jemals eine neue Version veröffentlichen wird, dann setzen Sie bitte die Version einfach auf 1.0 (wie im obigen Beispiel piewm). Sie können auch den Autor fragen oder eine Datumszeichenfolge (yyyy.mm.dd) als Version verwenden. Kategorisierung <makevar>CATEGORIES</makevar> Wenn ein Paket erzeugt wird, dann wird es unter /usr/ports/packages/All abgelegt und von einem oder mehreren Unterverzeichnissen werden auf /usr/ports/packages Links erstellt. Die Namen dieser Unterverzeichnisse werden durch die Variable CATEGORIES festgelegt. Dies geschieht, um dem Nutzer zu helfen, eine große Zahl von Paketen auf einer FTP-Webseite oder einer CD/DVD zu durchsuchen. Bitte werfen Sie einen Blick auf die Aktuelle Liste der Kategorien und suchen Sie die beste Kategorie für Ihren Port aus. Diese Liste legt auch fest, an welcher Stelle in der Ports-Sammlung der Port eingefügt wird. Falls Sie mehrere Kategorien angeben wird angenommen, dass die Dateien des Ports im Unterverzeichnis mit dem Namen der ersten angegebenen Kategorie liegen. Schauen Sie bitte unten für weitere Informationen darüber, wie man die richtige Kategorie bestimmt. Aktuelle Liste der Kategorien Hier ist die aktuelle Liste der Kategorien. Die mit einem Asterisk (*) bezeichneten sind virtuelle Kategorien, also solche, welche über kein eigenes Unterverzeichnis in der Ports-Sammlung verfügen. Sie werden nur als Sekundärkategorien benutzt und sind nur für Suchzwecke eingerichtet worden. Für nicht-virtuelle Kategorien finden Sie eine einzeilige Beschreibung in der Variable COMMENT im Makefile des jeweiligen Unterverzeichnisses. Kategorie Beschreibung Anmerkung accessibility Ports für behinderte Menschen. afterstep* Ports für den AfterStep Window Manager. arabic Arabische Sprachunterstützung. archivers Archivierungswerkzeuge. astro Ports für Astronomie. audio Sound-Unterstützung. benchmarks Benchmarking-Werkzeuge. biology Software für Biologie. cad CAD-Werkzeuge. chinese Chinesische Sprachunterstützung. comms Kommunikationsprogramme. Hauptsächlich Software für serielle Schnittstellen. converters Zeichensatz-Konverter. databases Datenbanken. deskutils Dinge, die vor der Erfindung des Computers auf dem Schreibtisch waren. devel Entwicklungs-Werkzeuge. Legen Sie keine Bibliotheken hier ab, nur weil es Bibliotheken sind, es sei denn, sie gehören wirklich nirgendwo anders hin. dns DNS-bezogene Software. docs* Meta-Ports für die FreeBSD-Dokumentation. editors allgemeine Editoren. Spezielle Editoren gehören in Ihre jeweilige Kategorie, (z.B. gehört ein mathematischer Formeleditor in math). elisp* Emacs-lisp-Ports. emulators Emulatoren für andere Betriebssysteme. Terminal-Emulatoren gehören nicht hierher; X-basierende gehören zu x11 und text-basierende zu comms oder misc, abhängig von deren genauer Funktionalität. finance Finanz-Software und ähnliches. french Französische Sprachunterstützung. ftp FTP Client- und Server-Werkzeuge. Falls Ihr Port sowohl FTP als auch HTTP unterstützt, stellen Sie ihn in ftp mit der Zweitkategorie www. games Spiele. geography* geografische Software. german Deutsche Sprachunterstützung. gnome* Ports für GNOME gnustep* Software für GNUstep. graphics grafische Werkzeuge. hamradio* Software für Amateurfunk. haskell* Software für die Haskell-Programmiersprache. hebrew Hebräische Sprachunterstützung. hungarian Ungarische Sprachunterstützung. ipv6* IPv6-bezogene Software. irc Internet Relay Chat (IRC)-Werkzeuge. japanese Japanische Sprachunterstützung. java Software für die Java-Programmiersprache. Die java-Kategorie sollte nicht die Einzige für einen Port sein mit Ausnahme der direkt nur mit der Programmiersprache zusammenhängenden Applikationen. Porter sollten java nicht als Hauptkategorie eines Ports wählen. kde* Ports für das K Desktop Environment (KDE)-Projekt. kld* Kernelmodule. korean Koreanische Sprachunterstützung. lang Programmiersprachen. linux* Linux-Applikationen und -Werkzeuge. lisp* Software für die Lisp-Programmiersprache. mail Mail-Software. math Numerische Berechnungen und andere mathematische Werkzeuge. mbone MBone-Applikationen. misc Verschiedene Werkzeuge. Hauptsächlich Werkzeuge, die nicht anderswo hingehören. Versuchen Sie, falls irgend möglich, eine bessere Kategorie für Ihren Port zu finden als misc, weil Ports hier leicht untergehen. multimedia Multimedia-Software. net Verschiedene Netzwerk-Software. net-im Instant Messaging-Software. net-mgmt Netzwerk-Management-Software. net-p2p Peer to peer-Netzwerkprogramme. news USENET News-Software. palm Software für Palm™. parallel* Applikationen für paralleles Rechnen. pear* Ports für das Pear PHP-Framework. perl5* Ports, welche Perl Version 5 benötigen. plan9* Verschiedene Programme von Plan9. polish Polnische Sprachunterstützung. ports-mgmt Hilfsprogramme für das Installieren und Entwickeln von FreeBSD Ports und Paketen. portuguese Portugiesische Sprachunterstützung. print Drucker-Software. Desktop Veröffentlichungs-Werkzeuge (DTP, Betrachter etc.) gehören auch hierher. python* Software für Python. ruby* Software für Ruby. rubygems* Ports für RubyGems-Pakete. russian Russische Sprachunterstützung. scheme* Software für die Scheme-Programmiersprache. science Wissenschaftliche Programme, die in keine andere Kategorie passen wie z.B. astro, biology und math. security Security-Werkzeuge. shells Shells. spanish* Spanische Sprachunterstützung. sysutils System-Werkzeuge. tcl* Ports, welche Tcl benötigen. textproc Textverarbeitungsprogramme. Dies beinhaltet nicht DTP-Werkzeuge, diese gehören in print. tk* Ports, welche Tk benötigen. ukrainian Ukrainische Sprachunterstützung. vietnamese Vietnamesische Sprachunterstützung. windowmaker* Ports für den WindowMaker Window-Manager. www Software für das World Wide Web (WWW). HTML-Werkzeuge gehören auch hierher. x11 X-Window-System und dergleichen. Diese Kategorie ist nur für Software, welche direkt X unterstützt. Fügen Sie keine normalen X-Applikationen hinzu. Die meisten davon gehören in eine andere x11-*-Kategorie (siehe unten). Falls Ihr Port eine X-Applikation ist, dann definieren Sie bitte USE_XLIB (impliziert durch USE_IMAKE) und fügen ihn der entsprechenden Kategorie hinzu. x11-clocks X11-Uhren. x11-drivers X11-Treiber. x11-fm X11-Dateimanager. x11-fonts X11-Schriftarten und Werkzeuge. x11-servers X11-Server. x11-themes X11-Themes. x11-toolkits X11-Toolkits. x11-wm X11-Window-Manager. xfce* Ports in Zusammenhang mit Xfce. zope* Zope-Unterstützung. Wählen der richtigen Kategorie Da viele der Kategorien sich überlappen, müssen Sie oft festlegen, welches die primäre Kategorie Ihres Ports ist. Hierzu gibt es einige Regeln, welche diese Auswahl bestimmen. Hier ist die Liste der Regeln mit abnehmender Wichtigkeit: Die erste (primäre) Kategorie muss eine physische (keine virtuelle, siehe oben) sein. Dies ist notwendig damit Pakete erstellt werden können. Die nachfolgenden Kategorien können wahllos virtuelle oder physische Kategorien sein. Sprachspezifische Kategorien kommen immer zuerst. Wenn Ihr Port z.B. Japanische X11-Schriftarten installiert, dann muss Ihre CATEGORIES-Zeile japanese x11-fonts enthalten. Spezifische Kategorien werden vor weniger spezifischen Kategorien aufgelistet. Ein HTML-Editor sollte z.B. als www editors aufgeführt werden und nicht umgekehrt. Genauso sollten Sie keinen Port unter net aufführen, wenn er zu irc, mail, mbone, news, security oder www passt, da net stillschweigend eingeschlossen ist in diesen Kategorien. x11 wird nur als sekundäre Kategorie benutzt, wenn die primäre Kategorie eine sprachspezifische ist. Keinesfalls sollten Sie x11 in die Kategorie-Zeile einer X-Applikation setzen. Emacs modes gehören in die gleiche Kategorie wie die vom jeweiligen mode unterstützte Applikation und nicht in editors. Ein Emacs mode z.B. für das Editieren von Quelltext einer bestimmten Programmiersprache gehört zur Kategorie lang. Für Ports, die vom Benutzer ladbare Kernelmodule installieren, sollte die virtuelle Kategorie kld in die CATEGORIES-Zeile aufgenommen werden. misc sollte nicht zusammen mit irgendeiner anderen nicht-virtuellen Kategorie auftreten. Falls Sie misc mit einer anderen Kategorie in CATEGORIES haben bedeutet dies, dass Sie gefahrlos misc streichen und die andere Kategorie alleine verwenden können! Falls Ihr Port wirklich in keine andere Kategorie passt, verwenden Sie bitte misc. Falls Sie sich über die Kategorie im Unklaren sind, hinterlassen Sie bitte einen Kommentar in Ihrem per &man.send-pr.1; eingereichten Bericht, damit wir diese Frage vor dem Import diskutieren können. Falls Sie ein Committer sind, schicken Sie bitte eine Nachricht an &a.ports;, damit die Frage im Vorhinein erörtert werden kann. Neue Ports werden zu häufig falsch kategorisiert und werden sofort wieder verschoben. Das bläht das Master Source Repository unnötig auf. Eine neue Kategorie vorschlagen Da die Ports-Sammlung über viele Jahre gewachsen ist, wurden viele neue Kategorien hinzugefügt. Neue Kategorien können virtuell (ohne eigenes Unterverzeichnis in der Ports-Sammlung) oder physisch sein. Der nachfolgende Text führt einige Punkte auf, welche bei der Neueinführung einer physischen Kategorie beachtet werden müssen, damit Sie dies bei einem eventuellen Vorschlag Ihrerseits berücksichtigen können. Unsere bestehende Maxime ist die Vermeidung der Neuanlage von physischen Kategorien, solange nicht eine große Zahl von Ports zugeordnet werden können oder falls ihr nicht Ports zugehören würden, welche eine logisch abgegrenzte Gruppe von limitiertem öffentlichem Interesse zugehören würden (zum Beispiel neue Sprachkategorien) oder vorzugsweise beides. Die Erklärung dafür ist, dass eine Neuanlage einer physischen Kategorie einen erheblichen Arbeitsaufwand sowohl für die Committer als auch diejenigen Nutzer bedeutet, welche die Änderungen der Ports-Sammlung nachvollziehen. Zusätzlich verursachen Vorschläge für neue Kategorien oftmals Kontroversen (natürlich deswegen, weil es keinen klaren Konsens darüber gibt, welche Kategorie als zu groß betrachtet werden muss noch ob sich bestimmte Kategorien zur einfachen Suche eignen (und wie viele Kategorien überhaupt ideal wären) und so weiter). Hier ist das Prozedere: Schlagen Sie die neue Kategorie auf &a.ports; vor. Sie sollten eine detaillierte Begründung für die neue Kategorie beifügen einschließlich einer Erklärung, warum Sie meinen, die existierenden Kategorien seien nicht ausreichend. Zeigen Sie außerdem eine Liste der zu verschiebenden Ports (falls neue Ports in GNATS auf ihren commit warten, die in diese Kategorie passen würden. Listen Sie diese bitte auch mit auf). Sind Sie der Maintainer oder Einreicher dieser Ports, erwähnen Sie es bitte. Es verleiht Ihrem Vorschlag mehr Gewicht. Nehmen Sie an der Diskussion teil. Falls es Unterstützung für Ihren Vorschlag geben sollte, reichen Sie bitte einen PR ein, welcher die Begründung und die Liste der betroffenen Ports enthält, die verschoben werden müssen. Idealerweise sollte der PR Patches für Folgendes enthalten: Makefiles für die neuen Ports nach dem Repocopy Makefile für die neue Kategorie Makefile für die alten Kategorien der betroffenen Ports Makefiles für Ports, welche von den alten Ports abhängen Für zusätzliches Ansehen sorgen Sie, wenn Sie die anderen Dateien, die geändert werden müssen, beifügen wie in der Direktive des Committer's Guide beschrieben. Da es die Ports-Infrastruktur beeinflusst und nicht nur die Durchführung von Repocopies und möglicherweise sogar Regressionstests auf dem Build Cluster durchgeführt werden müssen, sollte der PR dem Ports Management Team &a.portmgr; zugeordnet werden. Sobald der PR bestätigt wurde muss ein Committer den Rest der Prozedur durchführen, welche im Committers Guide beschrieben ist. Das Vorschlagen einer neuen virtuellen Kategorie ist ähnlich, aber wesentlich weniger aufwendig, weil keine Ports verschoben werden müssen. In diesem Falle müssen nur die Patches an den PR beigefügt werden, welche die neue Kategorie zur Variable CATEGORIES der betroffenen Ports hinzufügen. Vorschlagen einer Neuorganisation aller Kategorien Von Zeit zu Zeit schlägt jemand eine komplette Neuorganisation aller Ports, entweder mit einer zweistufigen Struktur oder irgendeiner Art von Schlüsselwörtern, vor. Bis heute wurde keiner dieser Vorschläge umgesetzt, weil sie zwar einfach zu machen sind, aber der Aufwand zur Umsetzung und Reorganisation der kompletten Ports-Sammlung schlichtweg mörderisch wäre. Bitte lesen Sie die Geschichte dieser Vorschläge in den Archiven der Mailinglisten nach, bevor Sie diese Ideen nochmals unterbreiten. Zudem sollten Sie gewappnet sein, dass man Sie auffordert, einen arbeitsfähigen Prototyp vorzulegen. Die Distributionsdateien Der zweite Teil des Makefile beschreibt die Dateien, welche heruntergeladen werden müssen, um den Port zu bauen und wo diese Dateien zu finden sind. <makevar>DISTVERSION/DISTNAME</makevar> DISTNAME ist der Name der Applikation wie er von den Autoren vergeben wurde. DISTNAME hat als Vorgabe ${PORTNAME}-${PORTVERSION} also überschreiben Sie diese Vorgabe nur, wenn es notwendig ist. DISTNAME wird nur an zwei Stellen genutzt. Erstens: (DISTFILES) hat als Vorgabe ${DISTNAME}${EXTRACT_SUFX}. Zweitens: Die Distributionsdatei soll in einem Unterverzeichnis namens WRKSRC extrahiert werden, dessen Vorgabe work/${DISTNAME} ist. Manche Drittanbieter-Namen, welche nicht in das Schema ${PORTNAME}-${PORTVERSION} passen, können durch Setzen von DISTVERSION automatisch behandelt werden. PORTVERSION und DISTNAME werden automatisch abgeleitet, können aber natürlich manuell überschrieben werden. Die folgende Tabelle führt einige Beispiele auf: DISTVERSION PORTVERSION 0.7.1d 0.7.1.d 10Alpha3 10.a3 3Beta7-pre2 3.b7.p2 8:f_17 8f.17 PKGNAMEPREFIX und PKGNAMESUFFIX beeinflussen DISTNAME nicht. Beachten Sie bitte auch, dass Sie DISTNAME unverändert lassen sollten, falls WRKSRC denselben Wert hat wie work/${PORTNAME}-${PORTVERSION} und gleichzeitig dass Archiv des originalen Quelltextes anders benannt ist als ${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}. Es ist einfacher DISTFILES zu definieren, als DISTNAME und WRKSRC (und möglicherweise EXTRACT_SUFX) zu setzen. <makevar>MASTER_SITES</makevar> Dokumentieren Sie das Verzeichnis der FTP/HTTP-URL, welche auf den originalen Tarball zeigt, in der Variable MASTER_SITES. Bitte vergessen Sie niemals den Schrägstrich (/) am Ende! Die make-Makros werden versuchen, diese Festlegung für die Aufbereitung der Distributionsdateien mittels FETCH zu benutzen, falls sie diese nicht schon auf dem System finden. Es wird empfohlen, mehrere Webseiten in dieser Liste aufzuführen, vorzugsweise auf verschiedenen Kontinenten. Dies ist ein Schutz gegen Probleme bei größeren Ausfällen im Internet. Wir planen sogar Unterstützung einzubauen, die automatisch einen Server in der Nähe zum Herunterladen bestimmt. Die Verfügbarkeit von vielen Webseiten wird dieses Vorhaben beträchtlich erleichtern. Falls der originale Tarball Teil eines populären Archivs ist, wie X-contrib, GNU oder Perl CPAN, können Sie möglicherweise auf diese Seiten in einer einfachen und kompakten Form mittels MASTER_SITE_* (d.h., MASTER_SITE_XCONTRIB, MASTER_SITE_GNU und MASTER_SITE_PERL_CPAN) referenzieren. Setzen Sie einfach MASTER_SITES auf eine dieser Variablen und MASTER_SITE_SUBDIR auf den Pfad innerhalb des Archivs. Hier ist ein Beispiel: MASTER_SITES= ${MASTER_SITE_XCONTRIB} MASTER_SITE_SUBDIR= applications Diese Variablen werden in /usr/ports/Mk/bsd.sites.mk definiert. Es werden ständig neue Einträge hinzugefügt, daher stellen Sie bitte unbedingt sicher, dass Sie die neueste Version verwenden, bevor Sie einen Port einschicken. Der Nutzer kann ebenfalls die Variable MASTER_SITE_* in der /etc/make.conf setzen. Dadurch werden unsere Vorgaben überschrieben und stattdessen werden die Spiegel-Server seiner Wahl für die populären Archive genutzt. <makevar>EXTRACT_SUFX</makevar> Falls Sie eine Distributionsdatei haben, die ein eigentümliches Suffix nutzt, um die Art der Kompression anzuzeigen, dann setzen Sie EXTRACT_SUFX. Ist die Distributionsdatei zum Beispiel im Stil von foo.tgz anstatt des normalen foo.tar.gz benannt, würden Sie schreiben: DISTNAME= foo EXTRACT_SUFX= .tgz Falls erforderlich, setzen die Variablen USE_BZIP2 und USE_ZIP automatisch EXTRACT_SUFX auf .tar.bz2 oder .zip. Falls keine der beiden gesetzt ist, dann verwendet EXTRACT_SUFX die Vorgabe .tar.gz. Sie müssen niemals beide Variablen EXTRACT_SUFX und DISTFILES setzen. <makevar>DISTFILES</makevar> Manchmal haben die zu ladenden Dateien keinerlei Ähnlichkeit mit dem Namen des Ports. Es könnte z.B. source.tar.gz oder ähnlich heißen. In anderen Fällen könnte der Quelltext in mehreren Archiven sein und alle müssen heruntergeladen werden. Falls dies der Fall ist, setzen Sie DISTFILES als eine durch Leerzeichen getrennte Liste aller Dateien, die geladen werden müssen. DISTFILES= source1.tar.gz source2.tar.gz Wenn nicht ausdrücklich gesetzt, verwendet DISTFILES als Vorgabe ${DISTNAME}${EXTRACT_SUFX}. <makevar>EXTRACT_ONLY</makevar> Falls nur einige der DISTFILES extrahiert werden müssen (z.B. eine Datei ist der Quelltext und eine andere ist ein unkomprimiertes Dokument), dann listen Sie die zu extrahierenden Dateien in EXTRACT_ONLY auf. DISTFILES= source.tar.gz manual.html EXTRACT_ONLY= source.tar.gz Falls keine der DISTFILES unkomprimiert sein sollte, dann setzen Sie EXTRACT_ONLY auf einen leeren String. EXTRACT_ONLY= <makevar>PATCHFILES</makevar> Falls Ihr Port zusätzliche Patches benötigt, welche per FTP oder HTTP verfügbar sind, dann setzen Sie PATCHFILES auf den Namen der Dateien und PATCH_SITES auf die URL des Verzeichnisses, das diese Patches enthält (das Format ist das gleiche wie MASTER_SITES). Falls ein Patch wegen einiger zusätzlicher Pfadnamen nicht relativ zum Anfang des Quelltextbaumes (d.h., WRKSRC) liegt, dann setzen Sie bitte PATCH_DIST_STRIP entsprechend. Wenn z.B. alle Pfadnamen in diesem Patch ein zusätzliches foozolix-1.0/ vor ihren Dateinamen aufweisen, dann setzen Sie bitte PATCH_DIST_STRIP=-p1. Kümmern Sie sich nicht darum, ob die Patches komprimiert sind. Sie werden automatisch dekomprimiert, wenn die Dateinamen auf .gz oder .Z enden. Falls der Patch zusammen mit anderen Dateien in einem gezippten Tarball verteilt wird (z.B. mit Dokumentation), dann können Sie nicht PATCHFILES verwenden. In diesem Fall fügen Sie den Namen und den Ort dieses Tarballs zu DISTFILES und MASTER_SITES. Benutzen Sie dann die EXTRA_PATCHES-Variable, um auf diese Dateien zu zeigen und bsd.port.mk wird automatisch diese Dateien nutzen. Kopieren Sie niemals Patch-Dateien in das PATCHDIR-Verzeichnis, weil es möglicherweise nicht beschreibbar ist. Der Tarball wird zusammen mit dem anderen Quelltext extrahiert werden. Eine ausdrückliche Dekomprimierung eines mit gzip oder compress erzeugten Tarball ist nicht notwendig. Sollten Sie dies dennoch vorgeben, so beachten Sie bitte peinlich genau, dass Sie nichts überschreiben, was bereits im Verzeichnis vorhanden ist. Vergessen Sie auch nicht den kopierten Patch im Target von pre-clean zu entfernen. Verschiedene Distributionsdateien oder Patches von verschiedenen Seiten und Verzeichnissen (<literal>MASTER_SITES:n</literal>) (Betrachten Sie es als in irgendeiner Form fortgeschrittenes Thema. Neulinge sollten möglicherweise diesen Abschnitt beim ersten Lesen überspringen). Dieser Abschnitt stellt Informationen über die Mechanismen zum Herunterladen von Dateien zur Verfügung und behandelt die Variablen MASTER_SITES:n und MASTER_SITES_NN. Wir beziehen uns im weiteren Text auf diese Variablen als MASTER_SITES:n. Etwas Hintergrundinformation zu Beginn: OpenBSD verfügt über eine sehr elegante Option innerhalb der Variablen DISTFILES und PATCHFILES. Sowohl Dateien als auch Patches können mit angehängten :n-Bezeichnern versehen werden wobei n in beiden Fällen [0-9] sein kann und eine Gruppenzugehörigkeit anzeigt. Ein Beispiel hierfür ist: DISTFILES= alpha:0 beta:1 In OpenBSD wird die Datei alpha mit der Variable MASTER_SITES0 verknüpft anstatt dem in FreeBSD gebräuchlichen MASTER_SITES und beta mit MASTER_SITES1. Das ist eine sehr interessante Möglichkeit, die endlose Suche nach der richtigen Download-Seite zu verkürzen. Stellen Sie sich zwei Dateien in DISTFILES und 20 Webseiten in der Variable MASTER_SITES vor. Alle Seiten sind erschreckend langsam, beta findet sich auf allen Seiten in MASTER_SITES und alpha kann nur auf der zwanzigsten Seite gefunden werden. Wäre es nicht reine Verschwendung, wenn der Maintainer alle Seiten zuvor überprüfen müsste? Kein guter Start für das wundervolle Wochenende! Übertragen Sie diesen Umstand auf noch mehr DISTFILES und mehr MASTER_SITES. Ganz sicher würde unser distfiles survey master die Erleichterung sehr zu schätzen wissen, die eine solche Verringerung der Netzwerkbelastung bringen würde. In den nächsten Abschnitten sehen Sie die Implementierung dieser Idee durch FreeBSD. Dabei wurde das Konzept von OpenBSD ein wenig verbessert. Prinzipielle Information Dieser Abschnitt informiert Sie, wie Sie schnell ein fein granuliertes Herunterladen von vielen Dateien und Fehlerbereinigungen von verschiedenen Webseiten und Unterverzeichnissen bewerkstelligen. Wir beschreiben hier den Fall der vereinfachten Nutzung von MASTER_SITES:n. Das ist für die meisten Szenarien ausreichend. Falls Sie weitere Informationen benötigen, sollten Sie den nächsten Abschnitt lesen. Einige Programme bestehen aus mehreren Dateien, welche von verschiedenen Webseiten heruntergeladen werden müssen. Zum Beispiel besteht Ghostscript aus dem Kern des Programms und einer großen Zahl von Treiberdateien, die vom Drucker des Benutzers abhängen. Einige dieser Treiberdateien werden mit der Kernapplikation mitgeliefert aber viele müssen von verschiedenen Webseiten heruntergeladen werden. Um das zu unterstützen, muss jeder Eintrag in DISTFILES mit einem Komma und einem tag name abgeschlossen werden. Jeder in MASTER_SITES aufgeführte Webseite folgt ein Komma und eine Marke (tag), die anzeigt, welche Datei von dieser Webseite heruntergeladen werden kann. Stellen Sie sich bitte eine Applikation vor, deren Quelltext in zwei Teile aufgeteilt ist, source1.tar.gz und source2.tar.gz, welche von zwei verschiedenen Webseiten heruntergeladen werden müssen. Das Makefile des Port würde Zeilen enthalten wie in . Vereinfachtes Beispiel für den Gebrauch von <literal>MASTER_SITES:n</literal> mit einer Datei pro Webseite MASTER_SITES= ftp://ftp.example1.com/:source1 \ ftp://ftp.example2.com/:source2 DISTFILES= source1.tar.gz:source1 \ source2.tar.gz:source2 Verschiedene Dateien können die gleiche Marke aufweisen. Ausgehend vom vorherigen Beispiel nehmen wir an, dass es noch eine dritte Datei gibt (source3.tar.gz), welche von ftp.example2.com heruntergeladen werden soll. Das Makefile würde dann aussehen wie . Vereinfachtes Beispiel für den Gebrauch von <literal>MASTER_SITES:n</literal> mit mehr als einer Datei pro Webseite MASTER_SITES= ftp://ftp.example1.com/:source1 \ ftp://ftp.example2.com/:source2 DISTFILES= source1.tar.gz:source1 \ source2.tar.gz:source2 \ source3.tar.gz:source2 Ausführliche Information In Ordnung, das vorherige Beispiel reicht nicht für Ihre Bedürfnisse? In diesem Abschnitt werden wir im Detail erklären, wie der fein granulierte Mechanismus zum Herunterladen (MASTER_SITES:n) funktioniert und wie Sie Ihre Ports modifizieren, um ihn zu nutzen. Elemente können nachstehend bezeichnet werden mit :n wobei n in diesem Falle [^:,]+ ist. Das heißt n könnte theoretisch jede alphanumerische Zeichenkette sein, aber wir beschränken sie auf [a-zA-Z_][0-9a-zA-Z_]+ für diesen Moment. Zudem ist die Zeichenkette case sensitive; d.h. n unterscheidet sich von N. Allerdings dürfen die folgenden Wörter nicht gebraucht werden, da sie spezielle Bedeutungen haben: default, all und ALL (diese Wörter werden intern genutzt in Punkt ). Ausserdem ist DEFAULT ein reserviertes Wort (beachten Sie ). Elemente mit angehängtem :n gehören zur Gruppe n, :m gehört zur Gruppe m und so weiter. Elemente ohne Anhängsel sind gruppenlos, d.h. sie gehören alle zu der speziellen Gruppe DEFAULT. Falls sie an irgendeinem Element DEFAULT hängen, ist dies überflüssig, es sei denn Sie wollen, dass ein Element sowohl zu DEFAULT als auch anderen Gruppen gleichzeitig gehört (beachten Sie ). Die folgenden Beispiele sind gleichwertig, aber das erste Beispiel ist vorzuziehen: MASTER_SITES= alpha MASTER_SITES= alpha:DEFAULT Gruppen sind nicht ausschliessend, d.h. ein Element kann mehreren Gruppen gleichzeitig angehören und eine Gruppe wiederum kann entweder mehrere Elemente oder überhaupt keine aufweisen. Wiederholte Elemente sind schlicht nur wiederholte Elemente. Wenn Sie wollen, dass ein Element gleichzeitig zu mehreren Gruppen gehört, dann können Sie diese durch ein Komma (,) trennen. Anstatt jedes Mal ein anderes Anhängsel zu verwenden und Wiederholungen aufzuführen, können Sie mehrere Gruppen auf einmal in einem einzigen Anhängsel bestimmen. Zum Beispiel markiert :m,n,o ein Element, welches zu den Gruppen m, n und o gehört. Alle folgenden Beispiele sind gleichwertig, aber das erste Beispiel ist vorzuziehen: MASTER_SITES= alpha alpha:SOME_SITE MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE MASTER_SITES= alpha:SOME_SITE,DEFAULT MASTER_SITES= alpha:DEFAULT,SOME_SITE Alle Webseiten in einer Gruppe werden gemäß MASTER_SORT_AWK sortiert. Alle Gruppen innerhalb von MASTER_SITES und PATCH_SITES werden genauso sortiert. Gruppensemantik kann benutzt werden in den folgenden Variablen: MASTER_SITES, PATCH_SITES, MASTER_SITE_SUBDIR, PATCH_SITE_SUBDIR, DISTFILES und PATCHFILES entsprechend der folgenden Syntax: Elemente mit MASTER_SITES, PATCH_SITES, MASTER_SITE_SUBDIR und PATCH_SITE_SUBDIR müssen mit einem Schrägstrich beendet werden ( /). Falls Elemente zu irgendwelchen Gruppen gehören, muss :n direkt nach dem Trenner / stehen. Der MASTER_SITES:n-Mechanismus verlässt sich auf das Vorhandensein des Trennzeichens /, um verwirrende Elemente zu vermeiden in denen :n ein zulässiger Bestandteil des Elementes ist und das Auftreten von :n die Gruppe n anzeigt. Aus Kompatibilitätsgründen (da der /-Trenner sowohl in MASTER_SITE_SUBDIR als auch PATCH_SITE_SUBDIR-Elementen nicht erforderlich ist) wird, falls das auf das Anhängsel folgende nächste Zeichen kein / ist, auch :n als gültiger Teil des Elementes behandelt anstatt als Gruppenzusatz, selbst wenn ein Element ein angehängtes :n aufweist. Beachten Sie sowohl als auch . Ausführliches Beispiel von <literal>MASTER_SITES:n</literal> in <makevar>MASTER_SITE_SUBDIR</makevar> MASTER_SITE_SUBDIR= old:n new/:NEW Verzeichnisse innerhalb der Gruppe DEFAULT -> old:n Verzeichnisse innerhalb der Gruppe NEW -> new Ausführliches Beispiel von <literal>MASTER_SITES:n</literal> mit Komma-Operator, mehreren Dateien, mehreren Webseiten und mehreren Unterverzeichnissen MASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \ http://site3/:group3 http://site4/:group4 \ http://site5/:group5 http://site6/:group6 \ http://site7/:DEFAULT,group6 \ http://site8/%SUBDIR%/:group6,group7 \ http://site9/:group8 DISTFILES= file1 file2:DEFAULT file3:group3 \ file4:group4,group5,group6 file5:grouping \ file6:group7 MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \ directory-one/:group6,DEFAULT \ directory Das vorstehende Beispiel führt zu einem fein granulierten Herunterladen. Die Webseiten werden in der exakten Reihenfolge ihrer Nutzung aufgelistet. file1 wird heruntergeladen von MASTER_SITE_OVERRIDE http://site1/directory-trial:1/ http://site1/directory-one/ http://site1/directory/ http://site2/ http://site7/ MASTER_SITE_BACKUP file2 wird genauso heruntergeladen wie file1, da sie zur gleichen Gruppe gehören MASTER_SITE_OVERRIDE http://site1/directory-trial:1/ http://site1/directory-one/ http://site1/directory/ http://site2/ http://site7/ MASTER_SITE_BACKUP file3 wird heruntergeladen von MASTER_SITE_OVERRIDE http://site3/ MASTER_SITE_BACKUP file4 wird heruntergeladen von MASTER_SITE_OVERRIDE http://site4/ http://site5/ http://site6/ http://site7/ http://site8/directory-one/ MASTER_SITE_BACKUP file5 wird heruntergeladen von MASTER_SITE_OVERRIDE MASTER_SITE_BACKUP file6 wird heruntergeladen von MASTER_SITE_OVERRIDE http://site8/ MASTER_SITE_BACKUP Wie gruppiere ich eine der speziellen Variablen aus bsd.sites.mk, d.h. MASTER_SITE_SOURCEFORGE? Lesen Sie . Ausführliches Beispiel von <literal>MASTER_SITES:n</literal> mit <makevar>MASTER_SITE_SOURCEFORGE</makevar> MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/} DISTFILES= something.tar.gz:sourceforge something.tar.gz wird von allen Webseiten innerhalb von MASTER_SITE_SOURCEFORGE heruntergeladen. Wie nutze ich dies mit PATCH*-Variablen. In allen Beispielen wurden MASTER*-Variablen genutzt, aber sie funktionieren exakt genauso mit PATCH*-Variablen, wie Sie an . sehen können. Vereinfachte Nutzung von <literal>MASTER_SITES:n</literal> mit <makevar>PATCH_SITES</makevar>. PATCH_SITES= http://site1/ http://site2/:test PATCHFILES= patch1:test Was ändert sich für die Ports? Was ändert sich nicht? Alle bestehenden Ports bleiben gleich. Der Code für MASTER_SITES:n wird nur aktiviert, falls es Elemente mit angehängtem :n entsprechend den zuvor erwähnten Syntax-Regeln wie in gezeigt gibt. Das Target des Port bleibt gleich: checksum, makesum, patch, configure, build etc. Mit der offensichtlichen Ausnahme von do-fetch, fetch-list, master-sites und patch-sites. do-fetch: nutzt die neue Gruppierung DISTFILES und PATCHFILES mit ihren darauf zutreffenden Gruppenelementen in MASTER_SITES und PATCH_SITES welche zutreffende Gruppenelemente sowohl in MASTER_SITE_SUBDIR als auch PATCH_SITE_SUBDIR aufweisen. Sehen Sie hierzu . fetch-list: arbeitet wie das alte fetch-list mit der Ausnahme, dass es nur wie do-fetch gruppiert. master-sites und patch-sites: (inkompatibel zu älteren Versionen) geben nur die Elemente der Gruppe DEFAULT zurück. Beziehungsweise sie führen genau genommen die Targets von master-sites-default und patch-sites-default aus. Weiterhin ist der Gebrauch des Target entweder von master-sites-all oder patch-sites-all der direkten Überprüfung von MASTER_SITES oder PATCH_SITES vorzuziehen. Zudem ist nicht garantiert, dass das direkte Überprüfen in zukünftigen Versionen funktionieren wird. Sehen Sie für weitere Informationen zu diesen neuen Port-Targets. Neue Port-Targets Es gibt master-sites-n und patch-sites-n-Targets, welche die Elemente der jeweiligen Gruppe n innerhalb von MASTER_SITES und PATCH_SITES auflisten. Beispielweise werden sowohl master-sites-DEFAULT als auch patch-sites-DEFAULT die Elemente der Gruppe DEFAULT, master-sites-test und patch-sites-test der Gruppe test usw. zurückgeben. Es gibt das neue Target master-sites-all und patch-sites-all, welche die Arbeit der alten Targets master-sites und patch-sites übernehmen. Sie geben die Elemente aller Gruppen zurück,als würden sie zur gleichen Gruppe gehören - mit dem Vorbehalt, dass sie so viele MASTER_SITE_BACKUP und MASTER_SITE_OVERRIDE auflisten wie Gruppen mittels DISTFILES oder PATCHFILES definiert sind. Das gleiche gilt entsprechend für master-sites-all und patch-sites-all. <makevar>DIST_SUBDIR</makevar> Verhindern Sie, dass Ihr Port das Verzeichnis /usr/ports/distfiles in Unordnung bringt. Falls Ihr Port eine ganze Reihe von Dateien herunterladen muss oder eine Datei enthält, die einen Namen hat, der möglicherweise mit anderen Ports in Konflikt stehen könnte (d.h.Makefile), dann setzen Sie die Variable DIST_SUBDIR auf den Namen des Ports (${PORTNAME} oder ${PKGNAMEPREFIX}${PORTNAME} sollte hervorragend funktionieren). Dies wird DISTDIR von der Vorgabe /usr/ports/distfiles auf /usr/ports/distfiles/DIST_SUBDIR ändern und stellt tatsächlich alle für Ihren Port benötigten Dateien in dieses Unterverzeichnis. Es wird zusätzlich nach dem Unterverzeichnis mit dem gleichen Namen auf der Sicherung der Hauptseite auf ftp.FreeBSD.org suchen (das ausdrückliche Setzen von DISTDIR in Ihrem Makefile wird dies nicht gewährleisten, also nutzen Sie bitte DIST_SUBDIR). Dies hat keine Auswirkungen auf die Variable MASTER_SITES, die Sie in Ihrem Makefile definieren. <makevar>ALWAYS_KEEP_DISTFILES</makevar> Falls Ihr Port binäre Distfiles benutzt und eine Lizenz aufweist, die verlangt, dass das der Quelltext in Form binärer Pakete verteilt werden muss, z.B. GPL, dann wird ALWAYS_KEEP_DISTFILES den &os; Build Cluster anweisen eine Kopie der Dateien in DISTFILES vorzuhalten. Nutzer dieser Ports benötigen generell diese Dateien nicht, daher ist es ein gutes Konzept, nur dann die Distfiles zu DISTFILES hinzuzufügen, wenn PACKAGE_BUILDING definiert ist. Nutzung von <makevar>ALWAYS_KEEP_DISTFILES</makevar>. .if defined(PACKAGE_BUILDING) DISTFILES+= foo.tar.gz ALWAYS_KEEP_DISTFILES= yes .endif Wenn Sie zusätzliche Dateien zu DISTFILES hinzufügen, dann beachten Sie bitte, dass Sie diese auch in distinfo aufführen. Zudem werden die zusätzlichen Dateien normalerweise ebenso in WRKDIR extrahiert, was für einige Ports zu unbeabsichtigten Seiteneffekten führen mag und spezielle Behandlung erfordert. <makevar>MAINTAINER</makevar> Fügen Sie hier Ihre E-Mailadresse ein. Bitte. :-) Beachten Sie bitte, dass nur eine einzelne E-Mailadresse ohne Kommentar in der Variable MAINTAINER zulässig ist. Das Format sollte user@hostname.domain sein. Bitte fügen Sie keinen beschreibenden Text wie z.B. Ihren wirklichen Namen ein, dies verwirrt lediglich bsd.port.mk. Der Maintainer ist dafür verantwortlich, dass der Port aktuell gehalten wird und er sorgt dafür, dass der Port korrekt arbeitet. Für eine detaillierte Beschreibung der Verantwortlichkeiten eines Maintainers beachten Sie bitte den Abschnitt Die Herausforderung für einen Port-Maintainer. Änderungen am Port werden dem Maintainer zur Begutachtung und Zustimmung vorgelegt, bevor sie committed werden. Falls der Maintainer einem Aktualisierungs-Wunsch nicht binnen 2 Wochen (ausgenommen wichtige öffentliche Feiertage) zustimmt, dann wird dies als Maintainer-Timeout betrachtet und eine Aktualisierung kann ohne ausdrückliche Zustimmung des Maintainers erfolgen. Falls der Maintainer nicht binnen 3 Monaten zustimmt, wird er als abwesend ohne Grund betrachtet und kann als Maintainer des fraglichen Ports durch eine andere Person ersetzt werden. Ausgenommen davon ist alles, was durch das &a.portmgr; oder das &a.security-officer; betreut wird. Es dürfen niemals committs ohne vorherige Zustimmung an solchen Ports vorgenommen werden! Wir behalten uns das Recht vor, die Einreichungen eines Maintainers ohne ausdrückliche Zustimmung zu ändern, falls wir der Auffassung sind, dass dadurch die Einhaltung von Richtlinien und stilistischen Vorgaben für die Ports-Sammlung besser erfüllt wird. Zudem können größere Änderungen an der Infrastruktur der Ports zu Änderungen an einem bestimmten Port ohne Zustimmung des Maintainers führen. Diese Änderungen beeinflussen niemals die Funktionalität eines Ports. Das &a.portmgr; behält sich das Recht vor, die Maintainerschaft jedem aus irgendeinem Grund zu entziehen oder ausser Kraft zu setzen, und das Security Officer Team &a.security-officer; behält sich das Recht vor, jede Maintainerschaft aus Sicherheitsgründen aufzuheben oder ausser Kraft zu setzen. <makevar>COMMENT</makevar> Dies ist eine einzeilige Beschreibung des Ports. Bitte fügen Sie nicht den Paketnamen (oder die Version der Software) in den Kommentar ein. Der Kommentar soll mit einem Großbuchstaben beginnen und ohne Punkt enden. Hier ist ein Beispiel: COMMENT= A cat chasing a mouse all over the screen Die COMMENT-Variable soll unmittelbar nach der MAINTAINER-Variable im Makefile stehen. Bitte versuchen Sie die COMMENT-Zeile auf weniger als 70 Zeichen zu begrenzen, da sie den Nutzern als einzeilige Zusammenfassung des Ports angezeigt wird. Abhängigkeiten (dependencies) Viele Ports hängen von anderen Ports ab. Es gibt sieben Variablen, welche Sie benutzen können, um sicherzustellen, dass alle benötigten Teile auf dem Rechner des Nutzers sind. Zusätzlich gibt es einige vordefinierte Variablen für Abhängigkeiten in häufigen Fällen und einige, welche das Verhalten der Abhängigkeiten bestimmen. <makevar>LIB_DEPENDS</makevar> Diese Variable spezifiziert die Shared-Libraries, von denen der Port abhängt. Es ist eine Liste von lib:dir:target-Tupeln wobei lib den Name der gemeinsam genutzten Bibliothek, dir das Verzeichnis, in welchem sie zu finden ist, falls nicht verfügbar, und target das Target in diesem Verzeichnis angeben. Zum Beispiel wird LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg auf eine jpeg-Bibliothek mit der Hauptversionsnummer 9 prüfen, in das graphics/jpeg-Unterverzeichnis Ihrer Ports-Sammlung wechseln, es bauen und installieren, falls es nicht gefunden wird. Der target-Teil kann weggelassen werden, falls er identisch mit DEPENDS_TARGET ist (Vorgabe hierfür ist install). Der lib-Teil ist ein regulärer Ausdruck, welcher die Ausgabe von ldconfig -r ausgewertet. Werte wie intl.[5-7] und intl sind zulässig. Das erste Muster, intl.[5-7], stimmt überein mit: intl.5, intl.6 oder intl.7. Das zweite Muster, intl, stimmt überein mit jeder Version der intl-Bibliothek. Die Abhängigkeit wird zwei Mal überprüft, einmal innerhalb des extract-Target und dann innerhalb des install-Target. Zudem wird der Name der Abhängigkeit in das Paket eingefügt, damit &man.pkg.add.1; es automatisch installiert, falls es nicht auf dem Rechner des Nutzers ist. <makevar>RUN_DEPENDS</makevar> Diese Variable legt Binärdateien oder Dateien, von denen der Port abhängt, für die Laufzeit fest. Es ist eine Liste von path:dir:target-Tupeln, wobei path der Name der Binärdatei oder Datei, dir das Verzeichnis, in welchem sie gefunden werden kann, falls nicht vorhanden, und target das Target in diesem Verzeichnis angeben. Falls path mit einem Slash (/) beginnt, wird es als Datei behandelt und deren Vorhandensein wird mit test -e; überprüft. Andernfalls wird angenommen, dass es eine Binärdatei ist und which -s wird benutzt, um zu überprüfen, ob das Programm im Pfad vorhanden ist. Zum Beispiel wird RUN_DEPENDS= ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \ xmlcatmgr:${PORTSDIR}/textproc/xmlcatmgr überprüfen, ob die Datei oder das Verzeichnis /usr/local/etc/innd existiert und es erstellen und installieren aus dem news/inn-Unterverzeichnis der Ports-Sammlung, falls es nicht gefunden wird. Es wird zudem überprüft, ob die Binärdatei namens xmlcatmgr im Suchpfad vorhanden ist und danach zum Unterverzeichnis textproc/xmlcatmgr in Ihrer Ports-Sammlung wechseln, es bauen und installieren, falls es nicht gefunden wird. In diesem Fall ist innd eine Binärdatei. Falls sich eine Binärdatei an einem ungewöhnlichen Platz befindet, der nicht im Suchpfad ist, dann sollten Sie die volle Pfadangabe verwenden. Der offizielle Suchpfad PATH, welcher im Ports Cluster benutzt wird, ist /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin Die Abhängigkeit wird innerhalb des install-Target überprüft. Zudem wird der Name der Abhängigkeit in das Paket übernommen, damit &man.pkg.add.1; es automatisch installieren wird, falls es auf dem System des Nutzers nicht vorhanden ist. Der target-Teil kann weggelassen werden, wenn er der gleiche ist wie in der Variable DEPENDS_TARGET. <makevar>BUILD_DEPENDS</makevar> Diese Variable legt Binärdateien oder Dateien fest, die dieser Port zur Erstellung benötigt. Wie RUN_DEPENDS ist es eine Liste von path:dir:target-Tupeln. Zum Beispiel wird BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip überprüfen, ob eine Binärdatei unzip vorhanden ist und in das Unterverzeichnis archivers/unzip Ihrer Ports-Sammlung wechseln und sie erstellen und installieren, falls sie nicht gefunden wird. Erstellen bedeutet hier alles von der Extraktion bis zur Kompilierung. Die Abhängigkeit wird im extract-Target überprüft. Der target-Teil kann weggelassen werden, falls er identisch mit der Variable DEPENDS_TARGET ist. <makevar>FETCH_DEPENDS</makevar> Diese Variable legt eine Binärdatei oder Datei fest, welche der Port benötigt, um heruntergeladen werden zu können. Wie die vorherigen beiden Variablen ist er eine Liste von path:dir:target-Tupeln. Zum Beispiel wird FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2 überprüfen, ob eine Binärdatei namens ncftp2 vorhanden ist, in das Unterverzeichnis net/ncftp2 Ihrer Ports-Sammlung wechseln, sie erstellen und installieren, falls sie nicht gefunden wird. Die Abhängigkeit wird innerhalb des fetch-Target überprüft. Der target-Teil kann weggelassen werden, falls er identisch mit der Variable DEPENDS_TARGET ist. <makevar>EXTRACT_DEPENDS</makevar> Diese Variable spezifiziert eine Binärdatei oder eine Datei, welche dieser Port für die Extraktion benötigt. Wie die vorherigen Variablen ist er eine Liste von path:dir:target-Tupeln. Zum Beispiel wird EXTRACT_DEPENDS= unzip:${PORTSDIR}/archivers/unzip überprüfen, ob eine Binärdatei namens unzip vorhanden ist, in das Unterverzeichnis archivers/unzip Ihrer Ports-Sammlung wechseln, sie erstellen und installieren, falls sie nicht gefunden wird. Die Abhängigkeit wird innerhalb des extract-Target überprüft. Der target-Teil kann weggelassen werden, falls er identisch mit der Variable DEPENDS_TARGET ist. Nutzen Sie diese Variable nur, wenn die Extraktion nicht funktioniert (die Vorgabe nimmt gzip an) und nicht mit USE_ZIP oder USE_BZIP2 wie in beschrieben zum Laufen gebracht werden kann. <makevar>PATCH_DEPENDS</makevar> Diese Variable legt eine Binärdatei oder eine Datei fest, welche dieser Port zum Patchen benötigt. Wie die vorhergehenden Variablen ist diese eine Liste von path:dir:target-Tupeln. Zum Beispiel wird PATCH_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract in das Unterverzeichnis java/jfc Ihrer Ports-Sammlung wechseln, um es zu entpacken. Die Abhängigkeit wird innerhalb des patch-Target überprüft. Der target-Teil kann entfallen, falls er identisch mit der Variable DEPENDS_TARGET ist. <makevar>USE_<replaceable>*</replaceable></makevar> Es gibt eine Reihe von Variablen, um gebräuchliche Abhängigkeiten einzukapseln, die viele Ports aufweisen. Obwohl Ihre Verwendung optional ist, können sie helfen die Übersichtlichkeit des Makefile eines Ports zu erhöhen. Jede von ihnen ist im Stil von USE_*. Der Gebrauch dieser Variablen ist beschränkt auf das Makefile eines Ports und ports/Mk/bsd.*.mk. Es ist nicht entworfen worden, um durch den Nutzer setzbare Optionen einzukapseln; benutzen Sie WITH_* und WITHOUT_* für diese Zwecke. Es ist immer falsch, irgendeine USE_*-Variable in der /etc/make.conf zu setzen. Zum Beispiel würde das Setzen von USE_GCC=3.2 eine Abhängigkeit für GCC32 für jeden Port einschliesslich GCC32 selbst hinzufügen! Die <makevar>USE_<replaceable>*</replaceable></makevar>-Varibalen Variable Bedeutung USE_BZIP2 Der Tarball dieses Ports wird mit bzip2 komprimiert. USE_ZIP Der Tarball des Ports wird mit zip komprimiert. USE_BISON Der Port benutzt bison für die Erstellung. USE_CDRTOOLS Der Port erfordert cdrecord entweder von sysutils/cdrtools oder sysutils/cdrtools-cjk, abhängig davon, was der Nutzer vorgibt. USE_GCC Dieser Port benötigt eine bestimmte Version von gcc zur Erstellung. Die genaue Version kann festgelegt werden mit Werten wie 3.2. Mit 3.2+ kann die mindestens erforderliche Version spezifiziert werden. Der gcc aus dem Basissystem wird genutzt, wenn er die erforderliche Version erfüllt, andernfalls wird eine geeignete Version des gcc aus den Ports kompiliert und die Variablen CC und CXX werden angepasst.
Variablen zugehörig zu gmake und dem configure-Skript werden in beschrieben, währenddessen autoconf, automake und libtool in beschrieben sind. Perl-spezifische Variablen werden in behandelt. X11-Variablen sind aufgelistet in . behandelt GNOME-bezogene Variablen und KDE-bezogene Variablen. dokumentiert Java-Variablen, während Informationen zu Apache, PHP und PEAR-Modulen enthält. Python wird in und Ruby in erörtert. stellt Variablen für SDL-Programme zur Verfügung und enthält schliesslich Variablen für Xfce.
Minimale Version einer Abhängigkeit Eine minimale Version einer Abhängigkeit kann in jeder *_DEPENDS-Variable festgelegt werden mit Ausnahme von LIB_DEPENDS durch Anwendung folgender Syntax: p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy Das erste Feld enthält einen abhängigen Paketnamen, welcher einem Eintrag in der Paketdatenbank entsprechen muss und einen Vergleich mit einer Paketversion. Die Abhängigkeit wird erfüllt, wenn p5-Spiffy-0.26 oder eine neuere Version auf dem System installiert ist. Anmerkungen zu Abhängigkeiten Wie vorstehend beschrieben ist das Vorgabe-Target DEPENDS_TARGET, wenn eine Abhängigkeit benötigt wird. Die Vorgabe hierfür ist install. Dies ist eine Nutzer-Variable; sie wird niemals im Makefile eines Ports definiert. Falls Ihr Port einen besonderen Weg benötigt, um mit einer Abhängigkeit umzugehen, dann benutzen Sie bitte den :target-Teil der *_DEPENDS-Variablen, anstatt DEPENDS_TARGET zu ändern. Falls Sie make clean schreiben, werden dessen Abhängigkeiten auch gesäubert. Falls Sie dies nicht wollen, definieren Sie die Variable NOCLEANDEPENDS in Ihrer Umgebung. Dies kann besonders erstrebenswert sein, wenn der Port etwas in seiner Liste von Abhängigkeiten hat, das sehr viel Zeit für einen rebuild benötigt wie KDE, GNOME oder Mozilla. Um von einem anderen Port bedingungslos abhängig zu sein, benutzen Sie bitte die Variable ${NONEXISTENT} als erstes Feld von BUILD_DEPENDS oder RUN_DEPENDS. Benutzen Sie dies nur, wenn Sie den Quelltext eines anderen Port benötigen. Sie können auch oft Kompilierzeit sparen, wenn Sie das Target festlegen. Zum Beispiel wird BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract immer zum jpeg-Port wechseln und ihn extrahieren. Zirkuläre Abhängigkeiten sind fatal Führen Sie niemals irgendwelche zirkulären Abhängigkeiten in der Ports-Sammlung ein! Die Struktur für die Erstellung von Ports dulde keinerlei zirkuläre Abhängigkeiten. Falls Sie dennoch eine verwenden, wird es irgendjemanden irgendwo auf der Welt geben, dessen FreeBSD-Installation nahezu sofort zusammenbricht und vielen anderen wird es sehr schnell genauso ergehen. So etwas kann extrem schwer festzustellen sein. Falls Sie Zweifel haben vor einer Änderung, dann vergewissern Sie sich, dass Sie folgendes getan haben: cd /usr/ports; make index. Dieser Prozess kann auf alten Maschinen sehr langsam sein, aber Sie ersparen sich und einer Vielzahl von Menschen möglicherweise eine Menge Ärger.
<makevar>MASTERDIR</makevar> Falls Ihr Port wegen einer Variable, die verschiedene Werte annimmt (z.B. Auflösung oder Papiergröße), leicht unterschiedliche Versione von Paketen erzeugen muss, dann legen Sie bitte ein Unterverzeichnis pro Paket an, um es für den Nutzer einfacher begreiflich zu machen, was zu machen ist. Aber versuchen Sie dabei so viele Dateien wie möglich zwischen diesen Ports gemeinsam zu nutzen. Normalerweise benötigen Sie nur ein sehr kurzes Makefile in allen ausser einem Unterverzeichnis, wenn Sie Variablen intelligent nutzen. In diesem einzigen Makefile können Sie MASTERDIR verwenden, um anzugeben, wo der Rest der Dateien liegt. Benutzen Sie bitte auch eine Variable für PKGNAMESUFFIX, damit die Pakete unterschiedliche Namen haben werden. Wir demonstrieren dies am Besten an einem Beispiel. Es ist Teil von japanese/xdvi300/Makefile; PORTNAME= xdvi PORTVERSION= 17 PKGNAMEPREFIX= ja- PKGNAMESUFFIX= ${RESOLUTION} : # default RESOLUTION?= 300 .if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \ ${RESOLUTION} != 300 && ${RESOLUTION} != 400 @${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\"" @${ECHO_MSG} "Possible values are: 118, 240, 300 (default) and 400." @${FALSE} .endif japanese/xdvi300 verfügt ebenfalls über alle Patches, Paket-Dateien usw. Wenn Sie make eintippen, wird der Port die Standardvorgabe für die Auflösung nehmen (300) und den Port ganz normal erstellen. Genauso wie für alle anderen Auflösungen ist dies das vollständige xdvi118/Makefile: RESOLUTION= 118 MASTERDIR= ${.CURDIR}/../xdvi300 .include "${MASTERDIR}/Makefile" (xdvi240/Makefile und xdvi400/Makefile sind ähnlich). Die MASTERDIR-Definition teilt dem bsd.port.mk mit, dass die normalen Unterverzeichnisse wie FILESDIR und SCRIPTDIR unter xdvi300 gefunden werden können. Die RESOLUTION=118-Zeile wird die RESOLUTION=300-Zeile in xdvi300/Makefile überschreiben und der Port wird mit einer Auflösung von 118 erstellt. Manualpages Die Variablen MAN[1-9LN] werden automatisch jede Manualpage zur pkg-plist hinzufügen (dies bedeutet, dass Sie Manualpages nicht in der pkg-plist auflisten dürfen, lesen Sie bitte Erstellung der PLIST für weitere Details). Sie veranlassen zudem den Installationsabschnitt dazu, die Manualpages zu Komprimieren oder zu Dekomprimieren abhängig vom gesetzten Wert der Variable NOMANCOMPRESS in /etc/make.conf. Falls Ihr Port versucht verschiedene Namen für Manualpages unter Zuhilfenahme von Symlinks oder Hardlinks zu installieren, müssen Sie die Variable MLINKS nutzen, um diese zu identifizieren. Der von Ihrem Port installierte Link wird von bsd.port.mk gelöscht und wieder eingefügt, um sicherzustellen, dass er auf die korrekte Datei zeigt. Jede Manualpage, welche in MLINKS aufgeführt ist, darf nicht in der pkg-plist aufgenommen werden. Falls die Manualpages während der Installation komprimiert werden sollen, müssen Sie die Variable MANCOMPRESSED setzen. Diese Variable kann drei Werte annehmen, yes, no und maybe. yes bedeutet, dass Manualpages bereits komprimiert installiert sind, bei no sind sie es nicht und maybe bedeutet, dass die Software bereits den Wert von NOMANCOMPRESS beachtet, damit bsd.port.mk nichts Besonderes auszuführen hat. MANCOMPRESSED wird automatisch auf yes gesetzt, wenn USE_IMAKE vorgegeben ist und gleichzeitig NO_INSTALL_MANPAGES nicht. Im umgekehrten Falle ist MANCOMPRESSED auf no gesetzt. Sie müssen es nicht explizit angeben, außer die Standardvorgabe ist für Ihren Port nicht passend. Wenn Ihr Port den man tree irgendwo anders als in der Variable MANPREFIX verankert, können Sie ihn mit MANPREFIX bestimmen. Sollten zudem Manualpages nur in bestimmten Abschnitten an einem nicht-standardkonformen Platz liegen, wie z.B. bestimmte Perl-Modul-Ports, dann können Sie mittels der Variable MANsectPREFIX (wobei sect ein Wert aus 1-9, L oder N ist) individuelle Pfade zu den Manualpages festlegen. Wenn Ihre Manualpages in sprachspezifische Unterverzeichnisse installiert werden, dann bestimmen Sie bitte den Namen der Sprache mit der Variable MANLANG. Der Wert dieser Variable ist mit "" vorgegeben (das bedeutet nur Englisch). Hier ist ein Beispiel, welches alles zusammenfasst. MAN1= foo.1 MAN3= bar.3 MAN4= baz.4 MLINKS= foo.1 alt-name.8 MANLANG= "" ja MAN3PREFIX= ${PREFIX}/share/foobar MANCOMPRESSED= yes Dies zeigt an, dass sechs Dateien von diesem Port installiert werden; ${MANPREFIX}/man/man1/foo.1.gz ${MANPREFIX}/man/ja/man1/foo.1.gz ${PREFIX}/share/foobar/man/man3/bar.3.gz ${PREFIX}/share/foobar/man/ja/man3/bar.3.gz ${MANPREFIX}/man/man4/baz.4.gz ${MANPREFIX}/man/ja/man4/baz.4.gz ${MANPREFIX}/man/man8/alt-name.8.gz kann zusätzlich von Ihrem Port installiert werden, oder auch nicht. Unabhängig davon wird ein Symlink erstellt, welcher die Manualpages foo(1) und alt-name(8) einbindet. Falls nur manche Manualpages übersetzt sind, können Sie einige dynamisch vom MANLANG-Inhalt erzeugte Variablen nutzen: MANLANG= "" de ja MAN1= foo.1 MAN1_EN= bar.1 MAN3_DE= baz.3 Dies führt zu folgender Liste von Dateien: ${MANPREFIX}/man/man1/foo.1.gz ${MANPREFIX}/man/de/man1/foo.1.gz ${MANPREFIX}/man/ja/man1/foo.1.gz ${MANPREFIX}/man/man1/bar.1.gz ${MANPREFIX}/man/de/man3/baz.3.gz Info-Dateien Falls Ihr Paket GNU-Info-Dateien installiert, sollten diese in der INFO-Variablen augelistet sein (ohne das angehängte .info) mit einem Eintrag für jedes Dokument. Von diesen Dateien wird angenommen, dass sie nach PREFIX/INFO_PATH installiert werden. Sie können INFO_PATH ändern, falls Ihr Paket einen anderen Ort vorsieht. Jedoch wird dies nicht empfohlen. Die Einträge enthalten nur den relativen Pfad zu PREFIX/INFO_PATH. Zum Beispiel installiert lang/gcc33 Info-Dateien nach PREFIX/INFO_PATH/gcc33, wobei INFO etwa so aussieht: INFO= gcc33/cpp gcc33/cppinternals gcc33/g77 ... Entsprechende Installations-/Deinstalltions-Codes werden vor der Paket-Registrierung automatisch der vorläufigen pkg-plist hinzugefügt. Makefile-Optionen Einige größere Applikationen können mit einer Reihe von Konfigurationen, die zusätzliche Funktionalitäten hinzufügen, erstellt werden, falls eine oder mehrere Bibliotheken oder Applikationen verfügbar sind. Dazu gehören die Auswahl von natürlichen Sprachen, GUI versus Kommandozeilen-Versionen oder die Auswahl aus mehreren Datenbank-Programmen. Da nicht alle Nutzer diese Bibliotheken oder Applikationen wollen, stellt das Ports-System hooks (Haken) zur Verfügung, damit der Autor des Ports bestimmen kann, welche Konfiguration erstellt werden soll. KNOBS (Einstellungen) <makevar>WITH_<replaceable>*</replaceable></makevar> und <makevar>WITHOUT_<replaceable>*</replaceable></makevar> Diese Variablen sind entworfen worden, um vom System-Administrator gesetzt zu werden. Es gibt viele, die in ports/KNOBS standardisiert sind. Benennen Sie Schalter bei der Erstellung eines Ports nicht programmspezifisch. Verwenden Sie zum Beispiel im Avahi-Port WITHOUT_MDNS anstelle von WITHOUT_AVAHI_MDNS. Sie sollten nicht annehmen, dass ein WITH_* notwendigerweise eine korrespondierende WITHOUT_*-Variable hat oder umgekehrt. Im Allgemeinen wird diese Vorgabe einfach unterstellt. Falls nicht anderweitig festgelegt, werden diese Variablen nur dahingehend überprüft, ob sie gesetzt sind oder nicht – nicht darauf, ob sie auf bestimmte Werte wie YES oder NO gesetzt sind. Häufige <makevar>WITH_<replaceable>*</replaceable></makevar> und <makevar> WITHOUT_<replaceable>*</replaceable></makevar>-Variablen Variable Bedeutung WITHOUT_NLS Falls gesetzt, bedeutet sie, dass eine Internationalisierung nicht benötigt wird, was Kompilierzeit sparen kann. Als Vorgabe wird Internationalisierung gebraucht. WITH_OPENSSL_BASE Nutze die Version von OpenSSL aus dem Basissystem. WITH_OPENSSL_PORT Installiert die Version von OpenSSL aus security/openssl, auch wenn das Basissystem auf aktuellem Stand ist. WITHOUT_X11 Falls der Port mit oder ohne Unterstützung für X erstellt werden kann, dann sollte normalerweise mit X-Unterstützung erstellt werden. Falls die Variable gesetzt ist, soll die Version ohne X-Unterstützung erstellt werden.
Benennung von Knobs (Einstellungen) Um die Anzahl der Knobs niedrig zu halten und zum Vorteil des Anwenders, wird empfohlen, dass Porter ähnliche Namen für Knobs verwenden. Eine Liste der beliebtesten Knobs kann in der KNOBS-Datei eingesehen werden. Knob-Namen sollten wiederspiegeln, was der Knob bedeutet und was er bewirkt. Wenn ein Port einen lib-Präfix im PORTNAME hat, dann soll das lib-Präfix im Knob-Namen entfallen.
<makevar>OPTIONS</makevar> Hintergrund Die OPTIONS-Variable gibt dem Nutzer, der diesen Port installiert, einen Dialog mit auswählbaren Optionen und speichert diese in /var/db/ports/portname/options. Bei der nächsten Neuerstellung des Ports werden diese Einstellungen wieder verwandt. Sie werden sich niemals mehr an all die zwanzig WITH_* und WITHOUT_*-Optionen erinnern müssen, die Sie benutzt haben, um diesen Port zu erstellen! Wenn der Anwender make config benutzt (oder ein make build das erste Mal laufen lässt) wird das Framework auf /var/db/ports/portname/options die Einstellungen prüfen. Falls die Datei nicht existiert, werden die Werte von OPTIONS genutzt, um eine Dialogbox zu erzeugen, in welcher die Optionen an- oder abgeschaltet werden können. Dann wird die options-Datei gespeichert und die ausgewählten Variablen werden bei der Erstellung des Ports benutzt. Falls eine neue Version des Ports OPTIONS hinzufügt, wird der Dialog mit den gespeicherten Werten dem Nutzer angezeigt. Benutzen Sie make showconfig, um die gespeicherte Konfiguration zu betrachten. Benutzen Sie make rmconfig, um die gespeicherte Konfiguration zu Löschen. Syntax Die Syntax für die OPTIONS-Variable lautet: OPTIONS= OPTION "descriptive text" default ... Der Wert als Vorgabe ist entweder ON oder OFF. Wiederholungen dieser drei Felder sind erlaubt. OPTIONS-Definitionen müssen vor der Einbindung von bsd.port.options.mk erscheinen. Die WITH_* und WITHOUT_*-Variablen können nur nach der Einbindung von bsd.port.options.mk getestet werden. bsd.port.pre.mk kann auch stattdessen eingebunden werden und wird immer noch von vielen Ports eingebunden, die vor der Einführung von bsd.port.options.mk erstellt wurden. Jedoch wirken manche Variablen nicht wie gewohnt nach der Einbindung von bsd.port.pre.mk, typischerweise USE_*-Optionen. Einfache Anwendung von <makevar>OPTIONS</makevar> OPTIONS= FOO "Enable option foo" On \ BAR "Support feature bar" Off .include <bsd.port.options.mk> .if defined(WITHOUT_FOO) CONFIGURE_ARGS+= --without-foo .else CONFIGURE_ARGS+= --with-foo .endif .if defined(WITH_BAR) RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar .endif .include <bsd.port.mk> Veraltete Anwendung von <makevar>OPTIONS</makevar> OPTIONS= FOO "Enable option foo" On .include <bsd.port.pre.mk> .if defined(WITHOUT_FOO) CONFIGURE_ARGS+= --without-foo .else CONFIGURE_ARGS+= --with-foo .endif .include <bsd.port.post.mk> Automatische Aktivierung von Funktionen Wenn Sie ein GNU-Konfigurationsskript benutzen, sollten Sie ein Auge darauf werfen, welche Funktionen durch die automatische Erkennung aktiviert werden. Schalten Sie Funktionen, die Sie nicht möchten, ausdrücklich durch Verwendung von --without-xxx oder --disable-xxx in der Variable CONFIGURE_ARGS einzeln ab. Falsche Behandlung einer Option .if defined(WITH_FOO) LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo CONFIGURE_ARGS+= --enable-foo .endif Stellen Sie sich vor im obigen Beispiel ist eine Bibliothek libfoo auf dem System installiert. Der Nutzer will nicht, dass diese Applikation libfoo benutzt, also hat er die Option auf "off" im make config-Dialog umgestellt. Aber das Konfigurationsskript der Applikation hat erkannt, dass die Bibliothek auf dem System vorhanden ist und fügt ihre Funktionen in die Binärdatei ein. Falls der Nutzer sich nun entschliesst libfoo von seinem System zu entfernen, dann wird das Ports-System nicht protestieren (es wurde keine Abhängigkeit von libfoo eingetragen), aber die Applikation bricht ab. Korrekte Behandlung einer Option .if defined(WITH_FOO) LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo CONFIGURE_ARGS+= --enable-foo .else CONFIGURE_ARGS+= --disable-foo .endif Im zweiten Beispiel wird die Bibliothek libfoo explizit abgeschaltet. Das Konfigurationsskript aktiviert die entsprechenden Funktionen nicht in der Applikation trotz der Anwesenheit der Bibliothek auf dem System.
Die Festlegung des Arbeitsverzeichnisses Jeder Port wird extrahiert in ein Arbeitsverzeichnis, welches beschreibbar sein muss. Das Ports-System gibt als Standard vor, dass die DISTFILES in einem Verzeichnis namens ${DISTNAME} entpackt werden. Mit anderen Worten, wenn Sie: PORTNAME= foo PORTVERSION= 1.0 festgelegt haben, dann enthalten die Distributions-Dateien des Ports ein Verzeichnis auf oberster Ebene, foo-1.0, und der Rest der Dateien befindet sich unter diesem Verzeichnis. Es gibt eine Reihe von Variablen, die Sie überschreiben können, falls dies nicht der Fall sein sollte. <makevar>WRKSRC</makevar> Diese Variable listet den Namen des Verzeichnisses, welches erstellt wird, wenn die Distfiles der Applikation extrahiert werden. Wenn unser vorheriges Beispiel in einem Verzeichnis namens foo (und nicht foo-1.0) extrahiert wurde, würden Sie schreiben: WRKSRC= ${WRKDIR}/foo oder möglicherweise WRKSRC= ${WRKDIR}/${PORTNAME} <makevar>NO_WRKSUBDIR</makevar> Wenn der Port überhaupt nicht in einem Unterverzeichnis extrahiert wird, sollten Sie dies mit dem Setzen von NO_WRKSUBDIR anzeigen. NO_WRKSUBDIR= yes <makevar>CONFLICTS</makevar> Falls Ihr Paket nicht mit anderen Paketen koexistieren kann (wegen Dateikonflikten, Laufzeit-Inkompatibilitäten usw.), führen Sie bitte die anderen Paketnamen in der Variable CONFLICTS auf. Sie können hier Shell-Globs wie * und ? verwenden. Paketnamen sollten in der gleichen Weise aufgezählt werden, wie sie in /var/db/pkg auftauchen. Bitte stellen Sie sicher, dass CONFLICTS nicht mit dem Paket des Ports selbst übereinstimmt, da ansonsten das Erzwingen der Installation durch FORCE_PKG_REGISTER nicht länger funktionieren wird. CONFLICTS setzt automatisch die Variable IGNORE, welche ausführlicher in dokumentiert ist. Beim Entfernen eines von mehreren in Konflikt stehenden Ports ist es ratsam, die CONFLICTS-Einträge in den anderen Ports für einige Monate beizubehalten, um Nutzer zu unterstützen, die ihre Ports nur sporadisch aktualisieren. Installation von Dateien INSTALL_* macros Nutzen Sie die Makros in bsd.port.mk, um korrekte Modi und Eigentümer von Dateien in Ihren *-install-Targets sicherzustellen. INSTALL_PROGRAM ist ein Befehl, um binäre Binärdateien zu installieren. INSTALL_SCRIPT ist ein Befehl, um ausführbare Skripte zu installieren. INSTALL_KLD ist ein Befehl, mit dem Kernelmodule installiert werden können. Einige Architekturen haben Probleme mit stripped-Modulen. Daher sollten Sie diesen Befehl anstelle von INSTALL_PROGRAM verwenden. INSTALL_DATA ist ein Befehl, um gemeinsam nutzbare Daten zu installieren. INSTALL_MAN ist ein Befehl, um Manualpages oder andere Dokumentation zu installieren (es wird nichts komprimiert). Das sind grundsätzlich alle install-Befehle mit ihren passenden Flags. Zerlegen von Binärdateien Zerlegen Sie keine Binärdateien manuell, wenn Sie es nicht müssen. Alle Binaries sollten gestripped werden; allerdings vermag das INSTALL_PROGRAM-Makro gleichzeitig eine Binärdatei zu installieren und zu strippen (beachten Sie den nächsten Abschnitt). Wenn Sie eine Datei strippen müssen, aber nicht das INSTALL_PROGRAM-Makro nutzen wollen, dann kann ${STRIP_CMD} Ihr Programm strippen. Dies wird typischerweise innerhalb des post-install-Targets gemacht. Zum Beispiel: post-install: ${STRIP_CMD} ${PREFIX}/bin/xdl Nutzen Sie &man.file.1; für die installierte Applikation, um zu überprüfen, ob eine Binärdatei gestripped ist oder nicht. Wenn es nicht meldet not stripped, dann ist es bereits gestripped. Zudem wird &man.strip.1; nicht ein bereits gestripptes Programm nochmals versuchen zu strippen, sondern wird stattdessen einfach sauber beenden. Installation eines ganzen Verzeichnisbaums inklusive Dateien Manchmal muss man eine große Zahl von Dateien unter Erhalt ihrer hierarchischen Struktur installieren, d.h. Kopieraktionen über einen ganzen Verzeichnisbaum von WRKSRC zu einem Zielverzeichnis unter PREFIX. Für diesen Fall gibt es zwei Makros. Der Vorteil der Nutzung dieser Makros anstatt cp ist, dass sie korrekte Besitzer und Berechtigungen auf den Zieldateien garantieren. Das erste Makro, COPYTREE_BIN, wird alle installierten Dateien ausführbar markieren und damit passend für die Installation in PREFIX/bin vorbereiten. Das zweite Makro, COPYTREE_SHARE, setzt keine Ausführungsberechtigungen auf Dateien und ist daher geeignet für die Installation von Dateien im Target von PREFIX/share. post-install: ${MKDIR} ${EXAMPLESDIR} (cd ${WRKSRC}/examples/ && ${COPYTREE_SHARE} \* ${EXAMPLESDIR}) Dieses Beispiel wird den Inhalt des examples-Verzeichnisses im Distfile des Drittanbieters in das Beispielverzeichnis Ihres Ports kopieren. post-install: ${MKDIR} ${DATADIR}/summer (cd ${WRKSRC}/temperatures/ && ${COPYTREE_SHARE} "June July August" ${DATADIR}/summer/) Und dieses Beispiel wird die Daten der Sommermonate in das summer-Unterverzeichnis eines DATADIR installieren. Zusätzliche find-Argumente können mit dem dritten Argument an die COPYTREE_*-Makros übergeben werden. Um zum Beispiel alle Dateien aus dem 1. Beispiel ohne die Makefiles zu installieren, kann man folgenden Befehl benutzen. post-install: ${MKDIR} ${EXAMPLESDIR} (cd ${WRKSRC}/examples/ && \ ${COPYTREE_SHARE} \* ${EXAMPLESDIR} "! -name Makefile") Beachten Sie bitte, dass diese Makros die installierten Dateien nicht zur pkg-plist hinzufügen, Sie müssen sie immer noch selbst auflisten. Installation zusätzlicher Dokumentation Falls Ihre Software zusätzlich zu den üblichen Manualpages und Info-Seiten weitere Dokumentation hat und Sie diese für nützlich halten, dann installieren Sie sie unter PREFIX/share/doc. Dies kann wie vorstehend im Target des post-install geschehen. Legen Sie ein neues Verzeichnis für Ihren Port an. Das Verzeichnis sollte wiederspiegeln, was der Port ist. Das bedeutet normalerweise PORTNAME. Wie auch immer, wenn Sie meinen, der Nutzer möchte verschiedene Versionen des Ports zur gleichen Zeit installiert haben, dann können Sie die gesamte Variable PKGNAME nutzen. Machen Sie die Installation von der Variablen NOPORTDOCS abhängig, damit die Nutzer sie in /etc/make.conf abschalten können: post-install: .if !defined(NOPORTDOCS) ${MKDIR} ${DOCSDIR} ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR} .endif Hier einige praktische Variablen und wie sie standardmässig bei Verwendung im Makefile expandiert werden: DATADIR wird expandiert zu PREFIX/share/PORTNAME. DATADIR_REL wird expandiert zu share/PORTNAME. DOCSDIR wird expandiert zu PREFIX/share/doc/PORTNAME. DOCSDIR_REL wird expandiert zu share/doc/PORTNAME. EXAMPLESDIR wird expandiert zu PREFIX/share/examples/PORTNAME. EXAMPLESDIR_REL wird expandiert zu share/examples/PORTNAME. NOPORTDOCS behandelt nur zusätzliche Dokumentation, die in DOCSDIR installiert ist. Für normale Manualpages und Info-Seiten wird die Variable benutzt. Dinge, welche in DATADIR und EXAMPLESDIR installiert werden, legen die Variablen NOPORTDATA und NOPORTEXAMPLES fest. Die Variablen werden nach PLIST_SUB exportiert. Ihre Werte erscheinen dort als Pfadnamen relativ zu PREFIX, falls möglich. Das bedeutet, dass share/doc/PORTNAME standardmässig ersetzt wird durch %%DOCSDIR%% in der Packliste usw. (mehr zur Ersetzung durch die pkg-plist finden Sie hier). Alle installierten Dokumentationsdateien und –Verzeichnisse sollten in der pkg-plist dem %%PORTDOCS%%-Präfix enthalten sein, zum Beispiel: %%PORTDOCS%%%%DOCSDIR%%/AUTHORS %%PORTDOCS%%%%DOCSDIR%%/CONTACT %%PORTDOCS%%@dirrm %%DOCSDIR%% Alternativ zur Auflistung der Dokumentationsdateien in der pkg-plist kann in einem Port auch die Variable PORTDOCS gesetzt werden für eine Liste von Dateien und Shell-Globs, um diese zur endgültigen Packliste hinzuzufügen. Die Namen werden relativ zur Variable DOCSDIR sein. Wenn Sie also einen Port haben, welcher PORTDOCS benutzt, und Sie haben eine vom Standard abweichenden Platz für seine Dokumentation, dann müssen Sie die Variable DOCSDIR entsprechend setzen. Wenn ein Verzeichnis in PORTDOCS aufgeführt ist, oder von einem Shell-Glob dieser Variable abgebildet wird, dann wird der komplette Verzeichnisbaum inklusive Dateien und Verzeichnissen in der endgültigen Packliste aufgenommen. Wenn die Variable NOPORTDOCS gesetzt ist, dann werden die Dateien und Verzeichnisse, die in PORTDOCS aufgelistet sind, nicht installiert und werden auch nicht zur Packliste des Ports hinzugefügt. Wie oben gezeigt bleibt es dem Port selbst überlassen, die Dokumentation in PORTDOCS zu installieren. Ein typisches Beispiel für den Gebrauch von PORTDOCS sieht wie folgt aus: PORTDOCS= README.* ChangeLog docs/* Die Äquivalente zu PORTDOCS für unter DATADIR und EXAMPLESDIR installierte Dateien sind PORTDATA beziehungsweise PORTEXAMPLES. Sie können auch pkg-message benutzen, um Meldungen während der Installation anzuzeigen. Lesen Sie diesen Abschnitt über den Gebrauch von pkg-message für weitere Details. Die pkg-message-Datei muss nicht zur pkg-plist hinzugefügt werden. Unterverzeichnisse mit PREFIX Lassen Sie den Port die Dateien in die richtigen Unterverzeichnisse von PREFIX verteilen. Einige Ports werfen alles in einen Topf und legen es im Unterverzeichnis mit dem Namen des Ports ab, was falsch ist. Ausserdem legen viele Ports alles ausser Binaries, Header-Dateien und Manualpages in ein Unterverzeichnis von lib, was natürlich auch nicht der BSD-Philosophie entspricht und nicht gut funktioniert. Viele der Dateien sollten in eines der folgenden Verzeichnisse geschoben werden: etc (Konfigurationsdateien), libexec (intern gestartete Binärdateien), sbin (Binärdateien für Superuser/Manager), info (Dokumentation für Info-Browser) oder share (Architektur-unabhängige Dateien). Lesen Sie hierzu &man.hier.7;; weitestgehend greifen die Regeln für /usr auch für /usr/local. Die Ausnahme sind Ports, welche mit news aus dem USENET arbeiten. In diesem Falle sollte PREFIX/news als Zielort für die Dateien benutzt werden.
Besonderheiten Es gibt einige Dinge mehr, die zu beachten sind, wenn man einen Port erstellt. Dieser Abschnitt erklärt die wichtigsten. Shared-Libraries Wenn Ihr Port eine oder mehrere Shared-Libraries installiert, dann definieren Sie bitte eine USE_LDCONFIG make-Variable, die bsd.port.mk anweisen wird, ${LDCONFIG} -m auf das Verzeichnis, in das die neue Library installiert wird (normalerweise PREFIX/lib), während des post-install-Targets anzuwenden, um sie im Shared-Library-Cache zu registrieren. Diese Variable, wenn definiert, wird auch dafür sorgen, dass ein entsprechendes @exec /sbin/ldconfig -m und @unexec /sbin/ldconfig -R-Paar zu Ihrer pkg-plist-Datei hinzugefügt wird, sodass ein Benutzer, der das Paket installiert, die Bibliothek danach sofort benutzen kann und das System nach deren Deinstallation nicht glaubt, die Bibliothek wäre noch da. USE_LDCONFIG= yes Wenn nötig, können Sie das Standardverzeichnis außer Kraft setzen, indem Sie den USE_LDCONFIG Wert auf eine Liste von Verzeichnissen setzen, in die Shared Libraries installiert werden sollen. Wenn Ihr Port z.B. diese Bibliotheken nach PREFIX/lib/foo und PREFIX/lib/bar installiert, könnten Sie folgendes in Ihrem Makefile benutzen: USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar Bitte überprüfen Sie dies genau. Oft ist das überhaupt nicht nötig oder kann durch -rpath oder das Setzen von LD_RUN_PATH während des Linkens umgangen werden (s. lang/moscow_ml für ein Beispiel), oder durch einen Shell-Wrapper, der LD_LIBRARY_PATH setzt, bevor er die Binärdatei ausführt, wie es www/mozilla tut. Wenn Sie 32-Bit Libraries auf 64-Bit Systemen installieren, benutzen Sie stattdessen USE_LDCONFIG32. Versuchen Sie Shared-Library-Versionsnummern im libfoo.so.0 Format zu halten. Unser Runtime-Linker kümmert sich nur um die Major (erste) Nummer. Wenn sich die Major-Library-Versionsnummer während der Aktualisierung zu einer neuen Portversion erhöht, sollte auch die PORTREVISION aller Ports, die die Shared-Library linken, erhöht werden, damit diese mit der neuen Version der Bibliothek neu kompiliert werden. Ports mit beschränkter Verbreitung Lizenzen variieren und manche geben Restriktionen vor, wie die Applikation gepackt werden oder ob sie gewinnorientiert verkauft werden kann, usw. Es liegt in Ihrer Verantwortung als Porter die Lizenzbestimmungen der Software zu lesen und sicherzustellen, dass das FreeBSD-Projekt nicht haftbar gemacht wird für Lizenzverletzungen durch Weiterverbreitung des Quelltextes oder kompilierter Binaries über FTP/HTTP oder CD-ROM. Im Zweifelsfall kontaktieren Sie bitte die &a.ports;. In solchen Situationen können die in den folgenden Abschnitten beschriebenen Variablen gesetzt werden. <makevar>NO_PACKAGE</makevar> Diese Variable zeigt an, dass wir keine binären Pakete dieser Applikation erzeugen dürfen - z.B. wenn die Lizenz die Weiterverteilung von binären Paketen oder Paketen verbietet, die aus verändertem Quelltext erzeugt wurden. Die DISTFILES des Ports dürfen allerdings frei über FTP/HTTP Mirrors weiterverbreitet werden. Sie dürfen auch auf CD-ROM (oder ähnlichen Medien) weiterverbreitet werden - es sei denn, NO_CDROM ist ebenfalls gesetzt. NO_PACKAGE sollte auch benutzt werden, wenn das binäre Paket nicht allgemein brauchbar ist und die Applikation immer aus dem Quelltext kompiliert werden sollte. Zum Beispiel, wenn die Applikation konfigurierte Informationen über den Rechner/Installationsort bei der Installation einkompiliert bekommt, setzen Sie NO_PACKAGE. NO_PACKAGE sollte auf eine Zeichenkette gesetzt werden, die den Grund beschreibt, warum kein Paket erzeugt werden soll. <makevar>NO_CDROM</makevar> Diese Variable gibt an, dassobwohl wir binäre Pakete erzeugen dürfen – wir weder diese Pakete noch die DISTFILES des Ports auf einer CD-ROM (oder ähnlichen Medien) verkaufen dürfen. Die DISTFILES des Ports dürfen allerdings immer noch auf FTP/HTTP Mirrors. Wenn diese Variable und auch NO_PACKAGE gesetzt ist, dann werden nur die DISTFILES des Ports erhältlich sein – und das nur mittels FTP/HTTP. NO_CDROM sollte auf eine Zeichenkette gesetzt werden, die den Grund beschreibt, warum der Port nicht auf CD-ROM weiterverbreitet werden kann. Das sollte z.B. gemacht werden, wenn die Lizenz des Ports nur für nichtkommerzielle Zwecke gilt. <makevar>NOFETCHFILES</makevar> Dateien, die in der Variable NOFETCHFILES aufgelistet sind, sind von keiner der MASTER_SITES abrufbar. Ein Beispiel solch einer Datei ist eine selbige, welche vom Anbieter auf CD-ROM bereitgestellt wird. Werkzeuge, die das Vorhandensein dieser Dateien auf den MASTER_SITES überprüfen, sollten diese Dateien ignorieren und sie nicht melden. <makevar>RESTRICTED</makevar> Setzen Sie diese Variable, wenn die Lizenz der Applikation weder das Spiegeln der DISTFILES der Applikation noch das Weiterverbreiten von binären Paketen in jedweder Art erlaubt. NO_CDROM oder NO_PACKAGE sollten nicht zusammen mit RESTRICTED gesetzt werden, weil letztere Variable die anderen beiden impliziert. RESTRICTED sollte auf eine Zeichenkette gesetzt werden, die den Grund beschreibt, warum der Port nicht weiterverbreitet werden kann. Typischerweise besagt dies, dass der Port proprietäre Software enthält und der Benutzer die DISTFILES manuell herunterladen muss – möglicherweise erst nachdem er sich für die Software registriert oder die Bedingungen eines Endbenutzer-Lizenzvertrags (EULA) akzeptiert hat. <makevar>RESTRICTED_FILES</makevar> Wenn RESTRICTED oder NO_CDROM gesetzt ist, ist diese Variable auf ${DISTFILES} ${PATCHFILES} voreingestellt, sonst ist sie leer. Wenn nicht jede dieser Dateien beschränkt ist, dann führen Sie die betroffenen Dateien in dieser Variable auf. Beachten Sie, dass der Porter für jede aufgeführte Distributionsdatei einen Eintrag zu /usr/ports/LEGAL hinzufügen sollte, der genau beschreibt, was die Beschränkung mit sich bringt. Build-Mechanismen Paralleles Bauen von Ports Das Ports-Framework von &os; unterstützt das parallele Bauen von Ports, indem es mehrere make-Instanzen ausführt, damit SMP-Systeme ihre gesamte CPU-Rechenleistung ausnützen können und so das Bauen von Ports schneller und effektiver werden kann. Dies ermöglicht der Parameter -jX an &man.make.1;, wenn Code von Drittanbietern kompiliert wird. Leider können nicht alle Ports wirklich gut mit dem Parallelbau umgehen. Deshalb ist es erforderlich, dass dieses Feature explizit durch MAKE_JOBS_SAFE=yes irgendwo unterhalb des Abschnitts für Abhängigkeiten im Makefile aktiviert wird. Eine weitere Möglichkeit im Umgang mit dieser Option besteht für den Maintainer darin, MAKE_JOBS_UNSAFE=yes zu setzen. Diese Variable wird dann verwendet, wenn ein Port bekannterweise mit -jX nicht gebaut werden kann, der Benutzer jedoch für alle Ports den Mehrprozessorbau durch FORCE_MAKE_JOBS=yes in /etc/make.conf erzwingt. <command>make</command>, <command>gmake</command> und <command>imake</command> Wenn Ihr Port GNU make benutzt, dann setzen Sie bitte USE_GMAKE=yes. Port-Variablen im Zusammenhang mit gmake Variable Bedeutung USE_GMAKE Der Port benötigt gmake für den Build. GMAKE Der ganze Pfad zu gmake, wenn es nicht im PATH ist.
Wenn Ihr Port eine X-Applikation ist, die Makefile-Dateien aus Imakefile-Dateien mit imake erzeugt, dann setzen Sie USE_IMAKE=yes. Das sorgt dafür, dass die Konfigurationsphase automatisch ein xmkmf -a ausführt. Wenn das Flag ein Problem für Ihren Port darstellt, setzen Sie XMKMF=xmkmf. Wenn der Port imake benutzt, aber das install.man-Target nicht versteht, dann sollte NO_INSTALL_MANPAGES=yes gesetzt werden. Wenn das Makefile im Quelltext Ihres Ports etwas anderes als all als Haupt-Build-Target hat, setzen Sie ALL_TARGET entsprechend. Das Gleiche gilt für install und INSTALL_TARGET.
<command>configure</command> Skript Wenn Ihr Port ein configure-Skript benutzt, um Makefile-Dateien aus Makefile.in-Dateien zu erzeugen, setzen Sie GNU_CONFIGURE=yes. Wenn Sie dem configure-Skript zusätzliche Argumente übergeben wollen (das Vorgabeargument ist --prefix=${PREFIX} --infodir=${PREFIX}/${INFO_PATH} --mandir=${MANPREFIX}/man --build=${CONFIGURE_TARGET}), setzen Sie diese zusätzlichen Argumente in CONFIGURE_ARGS. Zusätzliche Umgebungsvariablen können überdie Variable CONFIGURE_ENV übergeben werden. Variablen für Ports, die configure benutzen Variable Bedeutung GNU_CONFIGURE Der Port benutzt ein configure-Skript, um das Bauen vorzubereiten. HAS_CONFIGURE Wie GNU_CONFIGURE, nur dass kein Standard-Konfigurations-Target zu CONFIGURE_ARGS hinzugefügt wird. CONFIGURE_ARGS Zusätzliche Argumente für das configure-Skript. CONFIGURE_ENV Zusätzliche Umgebungsvariablen für die Abarbeitung des configure-Skriptes. CONFIGURE_TARGET Ersetzt das Standard-Konfigurations-Target. Vorgabewert ist ${MACHINE_ARCH}-portbld-freebsd${OSREL}.
Benutzung von <command>scons</command> Wenn Ihr Port SCons benutzt, definieren Sie USE_SCONS=yes. Variablen für Ports, die <command>scons</command> benutzen Variable Bedeutung SCONS_ARGS Port-spezifische SCons-Argumente, die der SCons-Umgebung übergeben werden. SCONS_BUILDENV Variablen, die in der System-Umgebung gesetzt werden sollen. SCONS_ENV Variablen, die in der SCons-Umgebung gesetzt werden sollen. SCONS_TARGET Letztes Argument, das SCons übergeben wird – ähnlich MAKE_TARGET.
Um SConstruct im Quelltext alles, was SCons in SCONS_ENV übergeben wird, respektieren zu lassen (das ist hauptsächlich CC/CXX/CFLAGS/CXXFLAGS), patchen Sie SConstruct, sodass das Build Environment wie folgt konstruiert wird: env = Environment(**ARGUMENTS) Es kann dann mit env.Append und env.Replace modifiziert werden.
Benutzung von GNU autotools Einführung Die verschiedenen GNU autotools stellen einen Abstraktionsmechanismus bereit für das Kompilieren von Software für eine Vielfalt von Betriebssystemen und Maschinenarchitekturen. Innerhalb der Ports-Sammlung kann ein einzelner Port diese Werkzeuge mit Hilfe eines einfachen Konstrukts benutzen: USE_AUTOTOOLS= tool:version[:operation] ... Als dies geschrieben wurde konnte tool eins von libtool, libltdl, autoconf, autoheader, automake oder aclocal sein. version gibt die einzelne Werkzeug-Revision an, die benutzt werden soll (siehe devel/{automake,autoconf,libtool}[0-9]+ für mögliche Versionen). operation ist eine optionale Angabe, die modifiziert, wie das Werkzeug benutzt wird. Es können auch mehrere Werkzeuge angegeben werden – entweder durch Angabe aller in einer einzigen Zeile oder durch Benutzung des += Makefile-Konstrukts. Schliesslich gibt es das spezielle Tool, genannt autotools, das der Einfachheit dient indem es von alle verfügbaren Versionen der Autotools abhängt, was sinnvoll für Cross-Development ist. Dies kann auch erreicht werden, indem man den Port devel/autotools installiert. <command>libtool</command> Shared-Libraries, die das GNU Build-System benutzen, verwenden normalerweise libtool, um die Kompilierung und Installation solcher Bibliotheken anzupassen. Die übliche Praxis ist, eine Kopie von libtool, die mit dem Quelltext geliefert wird, zu benutzen. Falls Sie ein externes libtool benötigen, können Sie die Version, die von der Ports-Sammlung bereitgestellt wird, benutzen: USE_AUTOTOOLS= libtool:version[:env] Ohne zusätzliche Angaben sagt libtool:version dem Build-System, dass es das Konfigurationsskript mit der auf dem System installierten Kopie von libtool patchen soll. Die Variable GNU_CONFIGURE ist impliziert. Außerdem werden einige make– und shell-Variablen zur weiteren Benutzung durch den Port gesetzt. Für Genaueres siehe bsd.autotools.mk. Mit der Angabe :env wird nur die Umgebung vorbereitet. Schließlich können optional LIBTOOLFLAGS und LIBTOOLFILES gesetzt werden, um die häufigsten Argumente und durch libtool gepatchten Dateien außer Kraft zu setzen. Die meisten Ports werden das aber nicht brauchen. Für Weiteres siehe bsd.autotools.mk. <command>libltdl</command> Einige Ports benutzen das libltdl-Bibliothekspaket, welches Teil der libtool-Suite ist. Der Gebrauch dieser Bibliothek macht nicht automatisch den Gebrauch von libtool selbst nötig, deshalb wird ein separates Konstrukt zur Verfügung gestellt. USE_AUTOTOOLS= libltdl:version Im Moment sorgt dies nur für eine LIB_DEPENDS-Abhängigkeit von dem entsprechenden libltdl-Port und wird zur Vereinfachung zur Verfügung gestellt, um Abhängigkeiten von den Autotools-Ports ausserhalb des USE_AUTOTOOLS-Systems zu eliminieren. Es gibt keine weiteren Angaben für dieses Werkzeug. <command>autoconf</command> und <command>autoheader</command> Manche Ports enthalten kein Konfigurationsskript, sondern eine autoconf-Vorlage in der configure.ac-Datei. Sie können die folgenden Zuweisungen benutzen, um autoconf das Konfigurationsskript erzeugen zu lassen, und auch autoheader Header-Vorlagen zur Benutzung durch das Konfigurationsskript erzeugen zu lassen. USE_AUTOTOOLS= autoconf:version[:env] und USE_AUTOTOOLS= autoheader:version welches auch die Benutzung von autoconf:version impliziert. Ähnlich wie bei libtool, bereitet die Angabe des optionalen :env nur die Umgebung für weitere Benutzung vor. Ohne dieses wird der Port auch gepatched und erneut konfiguriert. Die zusätzlichen optionalen Variablen AUTOCONF_ARGS und AUTOHEADER_ARGS können durch das Makefile des Ports ausser Kraft gesetzt werden, wenn erforderlich. Wie bei den libtool-Äquivalenten werden die meisten Ports dies aber nicht benötigen. <command>automake</command> und <command>aclocal</command> Manche Pakete enthalten nur Makefile.am-Dateien. Diese müssen durch automake in Makefile.in-Dateien konvertiert und dann durch configure weiterbearbeitet werden, um schließlich ein Makefile zu erzeugen. Ähnliches gilt für Pakete, die gelegentlich keine aclocal.m4-Dateien mitliefern, welche ebenfalls zum Erstellen der Software benötigt werden. Diese können durch aclocal erzeugt werden, welches configure.ac oder configure.in durchsucht. aclocal hat eine ähnliche Beziehung zu automake wie autoheader zu autoconf – beschrieben im vorherigen Abschnitt. aclocal impliziert die Benutzung von automake, also haben wir: USE_AUTOTOOLS= automake:version[:env] und USE_AUTOTOOLS= aclocal:version was auch die Benutzung von automake:version impliziert. Ähnlich wie bei libtool und autoconf, bereitet die optionale Angabe :env nur die Umgebung zur weiteren Benutzung vor. Ohne sie wird der Port erneut konfiguriert. Wie schon autoconf und autoheader, hat sowohl automake als auch aclocal eine optionale Argument-Variable AUTOMAKE_ARGS bzw. ACLOCAL_ARGS, die durch das Makefile des Ports, falls nötig, außer Kraft gesetzt werden kann. Benutzung von GNU <literal>gettext</literal> Grundlegende Benutzung Wenn Ihr Port gettext benötigt, setzen Sie einfach USE_GETTEXT auf yes, und Ihr Port bekommt die Abhängigkeit von devel/gettext. Der Wert von USE_GETTEXT kann auch die benötigte Version der libintl-Bibliothek angeben, der grundlegenden Teil von gettext – jedoch wird von der Benutzung dieser Funktion dringend abgeraten: Ihr Port sollte einfach nur mit der aktuellen Version von devel/gettext funktionieren. Ein ziemlich häufiger Fall ist, dass ein Port gettext und configure benutzt. Normalerweise sollte GNU configure gettext automatisch finden können. Sollte das einmal nicht funktionieren, können Hinweise über den Ort von gettext in CPPFLAGS und LDFLAGS wie folgt übergeben werden: USE_GETTEXT= yes CPPFLAGS+= -I${LOCALBASE}/include LDFLAGS+= -L${LOCALBASE}/lib GNU_CONFIGURE= yes CONFIGURE_ENV= CPPFLAGS="${CPPFLAGS}" \ LDFLAGS="${LDFLAGS}" Natürlich kann der Code kompakter sein, wenn es keine weiteren Flags gibt, die configure übergeben werden müssen: USE_GETTEXT= yes GNU_CONFIGURE= yes CONFIGURE_ENV= CPPFLAGS="-I${LOCALBASE}/include" \ LDFLAGS="-L${LOCALBASE}/lib" Optionale Benutzung Manche Softwareprodukte erlauben die Deaktivierung von NLS - z.B. durch Übergeben von an configure. In diesem Fall sollte Ihr Port gettext abhängig vom Status von WITHOUT_NLS benutzen. Für Ports mit niedriger bis mittlerer Komplexität können Sie sich auf das folgende Idiom verlassen: GNU_CONFIGURE= yes .if !defined(WITHOUT_NLS) USE_GETTEXT= yes PLIST_SUB+= NLS="" .else CONFIGURE_ARGS+= --disable-nls PLIST_SUB+= NLS="@comment " .endif Der nächste Punkt auf Ihrer Todo-Liste ist dafür zu sorgen, dass die Message-Catalog-Dateien nur bedingt in der Packliste aufgeführt werden. Der Makefile-Teil dieser Aufgabe ist schon durch obiges Idiom erledigt. Das wird im Abschnitt über Fortgeschrittene pkg-plist-Methoden erklärt. Kurz gesagt, jedes Vorkommen von %%NLS%% in pkg-plist wird durch @comment , wenn NLS abgeschaltet ist, oder durch eine leere Zeichenkette, wenn NLS aktiviert ist, ersetzt. Folglich werden die Zeilen, denen %%NLS%% vorangestellt ist, zu reinen Kommentaren in der endgültigen Packliste, wenn NLS abgeschaltet ist; andernfalls wird der Prefix einfach nur ausgelassen. Alles, was Sie jetzt noch machen müssen, ist %%NLS%% vor jedem Pfad zu einer Message-Catalog-Datei in pkg-plist einzufügen. Zum Beispiel: %%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo %%NLS%%share/locale/no/LC_MESSAGES/foobar.mo In sehr komplexen Fällen müssen Sie eventuell fortgeschrittenere Techniken als die hier vorgestellte benutzen - wie z.B. Dynamische Packlistenerzeugung. Behandlung von Message-Catalog-Verzeichnissen Bei der Installation von Message-Catalog-Dateien gibt es einen Punkt zu beachten. Ihr Zielverzeichnis, das unter LOCALBASE/share/locale liegt, sollte nur selten von Ihrem Port erzeugt und gelöscht werden. Die Verzeichnisse für die gebräuchlichsten Sprachen sind in /etc/mtree/BSD.local.dist aufgelistet; das heisst, sie sind Teil des Systems. Die Verzeichnisse für viele andere Sprachen sind Teil des Ports devel/gettext. Sie wollen vielleicht dessen pkg-plist zur Hand nehmen, um festzustellen, ob Ihr Port eine Message-Catalog-Datei für eine seltene Sprache installiert. Die Benutzung von <literal>perl</literal> Wenn MASTER_SITES auf MASTER_SITE_PERL_CPAN gesetzt ist, dann ist der bevorzugte Wert von MASTER_SITE_SUBDIR der Top-Level-Name der Hierarchie. Zum Beispiel ist der empfohlene Wert für p5-Module-Name-Module. Die Top-Level-Hierarchie kann unter cpan.org angeschaut werden. Dies sorgt dafür, dass der Port weiter funktioniert, wenn sich der Autor des Moduls ändert. Die Ausnahme dieser Regel ist, dass das entsprechende Verzeichnis selber oder das Distfile in diesem Verzeichnis nicht existiert. In solchen Fällen ist die Benutzung der Id des Autors als MASTER_SITE_SUBDIR erlaubt. Jede der Einstellungen unten kann sowohl auf YES als auch auf eine Versionszeichenkette wie 5.8.0+ gesetzt werden. Wenn YES benutzt wird, bedeutet das, dass der Port mit jeder der unterstützten Perl-Versionen funktioniert. Falls ein Port nur mit einer bestimmten Perl-Version funktioniert, kann darauf mit einer Versionszeichenkette hingewiesen werden, die entweder eine Mindest- (z.B. 5.7.3+), Maximal- (z.B. 5.8.0-) oder Absolutversion (z.B. 5.8.3) festlegt. Variablen für Ports, die <literal>perl</literal> benutzen Variable Bedeutung USE_PERL5 Bedeutet, dass der Port perl 5 zum Erstellen und zum Ausführen benutzt. USE_PERL5_BUILD Bedeutet, dass der Port perl 5 zum Erstellen benutzt. USE_PERL5_RUN Bedeutet, dass der Port perl 5 zur Laufzeit benutzt. PERL Der gesamte Pfad zu perl 5 – entweder im Basissystem oder nachinstalliert über einen Port – ohne die Versionsnummer. Benutzen Sie diese Variable, wenn Sie #!-Zeilen in Skripten ersetzen müssen. PERL_CONFIGURE Perls MakeMaker für die Konfiguration benutzen. Dies impliziert USE_PERL5. PERL_MODBUILD Module::Build für configure, build und install benutzen. Dies impliziert PERL_CONFIGURE. Nur lesbare Variablen PERL_VERSION Die volle Version des installierten perl (z.B. 5.8.9). PERL_LEVEL Die installierte perl-Version als ein Integer der Form MNNNPP (z.B. 500809). PERL_ARCH Wo perl architektur abhängige Bibliotheken ablegt. Vorgabe ist ${ARCH}-freebsd. PERL_PORT Name des perl-Ports, der installiert ist (z.B. perl5). SITE_PERL Verzeichnis, in das die Site-spezifischen perl-Pakete kommen. Dieser Wert wird zu PLIST_SUB hinzugefügt.
Ports von Perl-Modulen, die keine offizielle Webseite haben, sollen in der WWW-Zeile ihrer pkg-descr-Datei auf cpan.org verlinken. Die bevorzugte URL-Form ist http://search.cpan.org/dist/Module-Name/ (inklusive des Slash am Ende).
Benutzung von X11 X.Org-Komponenten Die X11-Implementierung, welche die Ports-Sammlung bereitstellt, ist X.Org. Wenn Ihre Applikation von X-Komponenten abhängt, listen Sie die benötigten Komponenten in USE_XORG auf. Als dies geschrieben wurde, wurden die folgenden Komponenten bereitgestellt: bigreqsproto compositeproto damageproto dmx dmxproto evieproto fixesproto fontcacheproto fontenc fontsproto fontutil glproto ice inputproto kbproto libfs oldx printproto randrproto recordproto renderproto resourceproto scrnsaverproto sm trapproto videoproto x11 xau xaw xaw6 xaw7 xaw8 xbitmaps xcmiscproto xcomposite xcursor xdamage xdmcp xevie xext xextproto xf86bigfontproto xf86dgaproto xf86driproto xf86miscproto xf86rushproto xf86vidmodeproto xfixes xfont xfontcache xft xi xinerama xineramaproto xkbfile xkbui xmu xmuu xorg-server xp xpm xprintapputil xprintutil xpr oto xproxymngproto xrandr xrender xres xscrnsaver xt xtrans xtrap xtst xv xvmc xxf86dga xxf86misc xxf86vm. Die aktuelle Liste finden Sie immer in /usr/ports/Mk/bsd.xorg.mk. Das Mesa Projekt ist ein Versuch, eine freie OpenGL Implementierung bereitzustellen. Sie können eine Abhängigkeit von verschiedenen Komponenten diese Projektes in der Variable USE_GL spezifizieren. ouml;gliche Optionen sind: glut, glu, glw, gl und linux. Für Abwärtskompatibilität gilt der Wert yes als glu. Beispiel für USE_XORG USE_XORG= xrender xft xkbfile xt xaw USE_GL= glu Viele Ports definieren USE_XLIB, was dafür sorgt, dass der Port von allen (rund 50) Bibliotheken abhängt. Diese Variable existiert, um Abwärtskompatibilität sicherzustellen (sie stammt noch aus der Zeit vor dem modularem X.Org), und sollte bei neuen Ports nicht mehr benutzt werden. Variablen für Ports, die X benutzen USE_XLIB Der Port benutzt die X-Bibliotheken. Soll nicht mehr verwendet werden - benutzen Sie stattdessen eine Liste von Komponenten in USE_XORG. USE_X_PREFIX Soll nicht mehr benutzt werden, ist jetzt äquivalent zu USE_XLIB und kann einfach durch letzteres ersetzt werden. USE_IMAKE Der Port benutzt imake. Impliziert USE_X_PREFIX. XMKMF Ist auf den Pfad zu xmkmf gesetzt, wenn nicht in PATH. Vorgabe ist xmkmf -a.
Variablen bei Abhängigkeit von einzelnen Teilen von X11 X_IMAKE_PORT Ein Port, der imake und einige andere Werkzeuge, die zum Erstellen von X11 benutzt werden, bereitstellt. X_LIBRARIES_PORT Ein Port, der die X11-Bibliotheken bereitstellt. X_CLIENTS_PORT Ein Port, der X11-Clients bereitstellt. X_SERVER_PORT Ein Port, der den X11-Server bereitstellt. X_FONTSERVER_PORT Ein Port, der den Fontserver bereitstellt. X_PRINTSERVER_PORT Ein Port, der den Printserver bereitstellt. X_VFBSERVER_PORT Ein Port, der den virtuellen Framebuffer-Server bereitstellt. X_NESTSERVER_PORT Ein Port, der einen nested X-Server bereitstellt. X_FONTS_ENCODINGS_PORT Ein Port, der Kodierungen für Schriftarten bereitstellt. X_FONTS_MISC_PORT Ein Port, der verschiedene Bitmap-Schriftarten bereitstellt. X_FONTS_100DPI_PORT Ein Port, der 100dpi Bitmap-Schriftarten bereitstellt. X_FONTS_75DPI_PORT Ein Port, der 75dpi Bitmap-Schriftarten bereitstellt. X_FONTS_CYRILLIC_PORT Ein Port, der kyrillische Bitmap-Schriftarten bereitstellt. X_FONTS_TTF_PORT Ein Port, der &truetype;-Schriftarten bereitstellt. X_FONTS_TYPE1_PORT Ein Port, der Type1-Schriftarten bereitstellt. X_MANUALS_PORT Ein Port, der entwicklerorientierte Manualpages bereitstellt.
Benutzung von X11-bezogenen Variablen in einem Port # Port benutzt X11-Bibliotheken und hängt vom Font-Server sowie # von kyrillischen Schriftarten ab. RUN_DEPENDS= ${LOCALBASE}/bin/xfs:${X_FONTSERVER_PORT} \ ${LOCALBASE}/lib/X11/fonts/cyrillic/crox1c.pcf.gz:${X_FONTS_CYRILLIC_PORT} USE_XORG= x11 xpm
Ports, die Motif benötigen Wenn Ihr Port eine Motif-Bibliothek benötigt, definieren Sie USE_MOTIF im Makefile. Die Standard-Motif-Implementierung ist x11-toolkits/open-motif. Benutzer können stattdessen x11-toolkits/lesstif wählen, indem Sie die WANT_LESSTIF-Variable setzen. Die Variable MOTIFLIB wird von bsd.port.mk auf die entsprechende Motif-Bibliothek gesetzt. Bitte patchen Sie den Quelltext Ihres Ports, sodass er überall ${MOTIFLIB} benutzt, wo die Motif-Bibliothek im Original Makefile oder Imakefile referenziert wird. Es gibt zwei verbreitete Fälle: Wenn sich der Port in seinem Makefile oder Imakefile auf die Motif-Bibliothek als -lXm bezieht, ersetzen Sie das einfach durch ${MOTIFLIB}. Wenn der Port in seinem Imakefile XmClientLibs benutzt, ersetzen Sie das durch ${MOTIFLIB} ${XTOOLLIB} ${XLIB}. Anmerkung: MOTIFLIB expandiert (normalerweise) zu -L/usr/X11R6/lib -lXm oder /usr/X11R6/lib/libXm.a - d.h. Sie müssen kein -L oder -l davor einfügen. X11 Schriftarten Wenn Ihr Port Schriftarten für das X-Window-System installiert, legen Sie diese nach LOCALBASE/lib/X11/fonts/local. Erzeugen eines künstlichen <envar>DISPLAY</envar> durch Xvfb Manche Applikationen benötigen ein funktionierendes X11-Display, damit die Kompilierung funktioniert. Das stellt für Systeme, die ohne Display laufen, ein Problem dar. Wenn die folgende Variable benutzt wird, startet die Bauumgebung den virtuellen Framebuffer-X-Server, und ein funktionierendes DISPLAY wird dem Build übergeben. USE_DISPLAY= yes Desktop-Einträge Desktop-Einträge (Freedesktop Standard) können in Ihrem Port einfach über die DESKTOP_ENTRIES-Variable erzeugt werden. Diese Einträge erscheinen dann im Applikationsmenü von standardkonformen Desktop-Umgebungen wie GNOME oder KDE. Die .desktop-Datei wird dann automatisch erzeugt, installiert und der pkg-plist hinzugefügt. Die Syntax ist: DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify Die Liste der möglichen Kategorien ist auf der Freedesktop Webseite abrufbar. StartupNotify zeigt an, ob die Applikation den Status in Umgebungen, die Startup-Notifications kennen, löschen wird. Beispiel: DESKTOP_ENTRIES= "ToME" "Roguelike game based on JRR Tolkien's work" \ "${DATADIR}/xtra/graf/tome-128.png" \ "tome -v -g" "Application;Game;RolePlaying" \ false
Benutzung von GNOME Das FreeBSD/GNOME-Projekt benutzt seine eigene Gruppe von Variablen, um zu definieren, welche GNOME-Komponenten ein bestimmter Port benutzt. Eine umfassende Liste dieser Variablen existiert innerhalb der Webseite des FreeBSD/GNOME-Projektes. Benutzung von KDE Variablen-Definitionen Variablen für Ports, die KDE benutzen USE_KDELIBS_VER Der Port benutzt KDE-Bibliotheken. Die Variable spezifiziert die Major Version von KDE, die benutzt werden soll, und impliziert USE_QT_VER der entsprechenden Version. Der einzig mögliche Wert ist 3. USE_KDEBASE_VER Der Port benutzt die KDE-Base. Die Variable spezifiziert die Major Version von KDE, die benutzt werden soll, und impliziert USE_QT_VER der entsprechenden Version. Der einzig mögliche Wert ist 3.
Ports, die Qt benötigen Variablen für Ports, die Qt benötigen USE_QT_VER Der Port benutzt das Qt-Toolkit. Mögliche Werte sind 3 und 4; diese spezifizieren die Major Version von Qt, die benutzt werden soll. Entsprechende Parameter werden an das configure-Skript und make übergeben. QT_PREFIX Enthält den Pfad, wohin Qt installiert ist (nur lesbare Variable). MOC Enthält den Pfad von moc (nur lesbare Variable). Voreingestellt entsprechend des USE_QT_VER-Werts. QTCPPFLAGS Zusätzliche Compiler-Flags, die über CONFIGURE_ENV an das Qt-Toolkit übergeben werden. Voreingestellt entsprechend des USE_QT_VER-Wertes. QTCFGLIBS Zusätzliche Bibliotheken, die über CONFIGURE_ENV für das Qt-Toolkit gelinkt werden sollen. Voreingestellt entsprechend des USE_QT_VER-Wertes. QTNONSTANDARD Änderungen von CONFIGURE_ENV, CONFIGURE_ARGS und MAKE_ENV sollen unterdrückt werden.
Zusätzliche Variablen für Ports, die Qt 4.xi benutzen QT_COMPONENTS Spezifiziert Tool– und Bibliothek-Abhängigkeiten für Qt4. Siehe unten für Details. UIC Enthält den Pfad von uic (nur lesbare Variable). Voreingestellt entsprechend des USE_QT_VER-Wertes. QMAKE Enthält den Pfad von qmake (nur lesbare Variable). Voreingestellt entsprechend des USE_QT_VER-Wertes. QMAKESPEC Enthält den Pfad der Konfigurationsdatei für qmake (nur lesbare Variable). Voreingestellt entsprechend des USE_QT_VER-Wertes.
Wenn USE_QT_VER gesetzt ist, werden dem configure-Skript einige nützliche Einstellungen übergeben: CONFIGURE_ARGS+= --with-qt-includes=${QT_PREFIX}/include \ --with-qt-libraries=${QT_PREFIX}/lib \ --with-extra-libs=${LOCALBASE}/lib \ --with-extra-includes=${LOCALBASE}/include CONFIGURE_ENV+= MOC="${MOC}" CPPFLAGS="${CPPFLAGS} ${QTCPPFLAGS}" LIBS="${QTCFGLIBS}" \ QTDIR="${QT_PREFIX}" KDEDIR="${KDE_PREFIX}" Wenn USE_QT_VER auf 4 gesetzt ist, werden auch die folgenden Einstellungen übergeben: CONFIGURE_ENV+= UIC="${UIC}" QMAKE="${QMAKE}" QMAKESPEC="${QMAKESPEC}" MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"
Komponentenauswahl (nur bei Qt 4.x) Wenn USE_QT_VER auf 4 gesetzt ist, können individuelle Qt4-Tool- und Bibliotheksabhängigkeiten in der Variable QT_COMPONENTS angegeben werden. An jede Komponente kann _build oder _run als Suffix angehängt werden, was eine Abhängigkeit zur Build- bzw. Laufzeit angibt. Ohne Suffix gilt die Abhängigkeit sowohl zur Build- als auch zur Laufzeit. Bibliothekskomponenten sollten normalerweise ohne Suffix angegeben werden, Tool-Komponenten mit _build und Plugin-Komponenten mit _run. Die gebräuchlichsten Komponenten werden im Folgenden angegeben (alle verfügbaren Komponenten sind in _QT_COMPONENTS_ALL in /usr/ports/Mk/bsd.qt.mk aufgelistet): Verfügbare Qt4-Bibliothekskomponenten Name Beschreibung corelib Kern-Bibliothek (kann weggelassen werden– es sei denn, der Port benutzt nichts außer corelib) gui Graphische Benutzeroberflächen-Bibliothek network Netzwerk-Bibliothek opengl OpenGL-Bibliothek qt3support Qt3-Kompatibilitäts-Bibliothek qtestlib Modultest-Bibliothek script Skript-Bibliothek sql SQL-Bibliothek xml XML-Bibliothek
Sie können herausfinden, welche Bibliotheken die Applikation benötigt, indem Sie nach erfolgreicher Kompilierung ldd auf die Hauptbinärdatei anwenden. Verfügbare Qt4-Tool-Komponenten Name Beschreibung moc meta object compiler (wird zum Build fast jeder Qt-Applikation benötigt) qmake Makefile-Generator / Build-Werkzeug rcc Resource-Compiler (wird benötigt, falls die Applikation *.rc oder *.qrc Dateien enthält) uic User-Interface-Compiler (wird benötigt, falls die Applikation von Qt-Designer erzeugte *.ui Dateien enthält - gilt für praktisch jede Qt-Applikation mit einer GUI)
Verfügbare Qt4-Plugin-Komponenten Name Beschreibung iconengines SVG-Icon-Engine Plugin (wenn die Applikation SVG-Icons mitliefert) imageformats Bildformatplugins für GIF, JPEG, MNG und SVG (wenn die Applikation Bilddateien mitliefert)
Qt4-Komponenten auswählen In diesem Beispiel benutzt die portierte Applikation die Qt4 GUI-Bibliothek, die Qt4-Core-Bibliothek, alle Qt4-Codeerzeugungstools und Qt4's Makefile Generator. Da die GUI-Bibliothek eine Abhängigkeit von der Core-Bibliothek impliziert, muss corelib nicht angegeben werden. Die Qt4-Codeerzeugungstools moc, uic und rcc, sowie der Makefile Generator qmake werden nur für den Build benötigt, deshalb bekommen die den Suffix _build: USE_QT_VER= 4 QT_COMPONENTS= gui moc_build qmake_build rcc_build uic_build
Zusätzliche Besonderheiten Wenn die Applikation keine configure Datei, sondern eine .pro Datei hat, können Sie das Folgende benutzen: HAS_CONFIGURE= yes do-configure: @cd ${WRKSRC} && ${SETENV} ${CONFIGURE_ENV} \ ${QMAKE} -unix PREFIX=${PREFIX} texmaker.pro Beachten Sie die Ähnlichkeit mit der qmake-Zeile im mitgelieferten BUILD.sh-Skript. Die Übergabe von CONFIGURE_ENV stellt sicher, dass qmake die QMAKESPEC-Variable übergeben bekommt, ohne die es nicht funktioniert. qmake erzeugt Standard-Makefiles, sodass es nicht nötig ist ein eigenes neues build-Target zu schreiben. Qt-Applikationen sind oft so geschrieben, dass sie plattformübergreifend sind, und oft ist X11/Unix nicht die Plattform, auf der sie entwickelt werden. Das sorgt oft für bestimmte fehlende Kleinigkeiten wie z.B.: Fehlende zusätzliche Include-Pfade. Viele Applikationen kommen mit System-Tray-Icon Support– unterlassen es aber Includes oder Bibliotheken in den X11 Verzeichnissen zu suchen. Sie können qmake über die Kommandozeile sagen, es soll Verzeichnisse zu den Include- und Bibliotheks-Suchpfaden hinzufügen - z.B.: ${QMAKE} -unix PREFIX=${PREFIX} INCLUDEPATH+=${LOCALBASE}/include \ LIBS+=-L${LOCALBASE}/lib sillyapp.pro Falsche Installations-Pfade. Manchmal werden Daten wie Icons oder .desktop-Dateien per Vorgabe in Verzeichnisse installiert, die nicht von XDG-kompatiblen Applikationen durchsucht werden. editors/texmaker ist hierfür ein Beispiel– siehe patch-texmaker.pro im files-Verzeichnis dieses Ports als eine Vorlage, die zeigt, wie man dies direkt in der Qmake Projektdatei löst.
Benutzung von Java Variablen-Definitionen Wenn Ihr Port ein Java™ Development Kit (JDK) benötigt, entweder zum Bauen, zur Laufzeit oder sogar, um das Distfile auszupacken, dann sollten Sie USE_JAVA setzen. Es gibt mehrere JDKs in der Ports-Sammlung– von verschiedenen Anbietern und in verschiedenen Versionen. Wenn Ihr Port eine bestimmte dieser Versionen benötigt, können Sie definieren welche. Die aktuelle Version ist java/jdk15. Variablen, die von Ports, die Java benutzen, gesetzt werden müssen Variable Bedeutung USE_JAVA Sollte definiert sein, damit die übrigen Variablen irgendeinen Effekt haben. JAVA_VERSION Durch Leerzeichen getrennte Liste von geeigneten Java-Versionen für den Port. Ein optionales "+" ermöglicht die Angabe eines Bereiches von Versionen (mögliche Werte: 1.1[+] 1.2[+] 1.3[+] 1.4[+]). JAVA_OS Durch Leerzeichen getrennte Liste von geeigneten JDK-Port-Betriebssystemen für den Port. (erlaubte Werte: native linux). JAVA_VENDOR Durch Leerzeichen getrennte Liste von geeigneten JDK-Port-Anbietern für den Port. (erlaubte Werte: freebsd bsdjava sun ibm blackdown). JAVA_BUILD Bedeutet, falls gesetzt, dass der ausgewählte JDK-Port zu den Build-Abhängigkeiten des Ports hinzugefügt werden soll. JAVA_RUN Bedeutet, falls gesetzt, dass der ausgewählte JDK-Port zu den Laufzeit-Abhängigkeiten des Ports hinzugefügt werden soll. JAVA_EXTRACT Bedeutet, falls gesetzt, dass der ausgewählte JDK-Port zu den Extract-Abhängigkeiten des Ports hinzugefügt werden soll. USE_JIKES Legt fest, ob der Port den jikes Bytecode-Compiler zum Kompilieren benutzen soll. Wenn kein Wert für diese Variable gesetzt ist, wird der Port jikes für die Kompilierung benutzen– falls vorhanden. Sie können die Benutzung von jikes auch ausdrücklich verbieten oder erzwingen (durch Setzen auf 'no' oder 'yes'). Im letzteren Fall wird devel/jikes zu den Build-Abhängigkeiten des Ports hinzugefügt. In jedem Fall wird, wenn jikes tatsächlich statt javac zur Kompilierung benutzt wird, die Variable HAVE_JIKES von bsd.java.mk definiert.
Das Folgende ist eine Liste aller Variablen, die ein Port bekommt, nachdem er USE_JAVA gesetzt hat: Bereitgestellte Variablen für Ports, die Java benutzen Variable Wert JAVA_PORT Der Name des JDK-Ports (z.B. 'java/jdk14'). JAVA_PORT_VERSION Die volle Version des JDK Ports (z.B. '1.4.2'). Wenn Sie nur die ersten beiden Stellen dieser Versionsnummer benötigen, benutzen Sie ${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}. JAVA_PORT_OS Das vom JDK-Port benutzte Betriebssystem (z.B. 'linux'). JAVA_PORT_VENDOR Der Anbieter des JDK-Ports (z.B. 'sun'). JAVA_PORT_OS_DESCRIPTION Beschreibung des vom JDK-Port benutzten Betriebssystems (z.B. 'Linux'). JAVA_PORT_VENDOR_DESCRIPTION Beschreibung des Anbieters des JDK-Ports (z.B. 'FreeBSD Foundation'). JAVA_HOME Pfad zum Installationsverzeichnis des JDK (z.B. '/usr/local/jdk1.3.1'). JAVAC Pfad zum Java-Compiler, der benutzt werden soll (z.B. '/usr/local/jdk1.1.8/bin/javac' oder '/usr/local/bin/jikes'). JAR Pfad zum jar-Werkzeug, das benutzt werden soll (z.B. '/usr/local/jdk1.2.2/bin/jar' oder '/usr/local/bin/fastjar'). APPLETVIEWER Pfad zum appletviewer-Werkzeug (z.B. '/usr/local/linux-jdk1.2.2/bin/appletviewer'). JAVA Pfad zur java Binärdatei. Benutzen Sie dies, um Java-Programme auszuführen (z.B. '/usr/local/jdk1.3.1/bin/java'). JAVADOC Pfad zum javadoc-Werkzeug. JAVAH Pfad zum javah-Programm. JAVAP Pfad zum javap-Programm. JAVA_KEYTOOL Pfad zum keytool-Werkzeug. Diese Variable ist nur verfügbar, wenn das JDK Java 1.2 oder höher ist. JAVA_N2A Pfad zum native2ascii-Werkzeug. JAVA_POLICYTOOL Pfad zum policytool Programm. Diese Variable ist nur verfügbar, wenn das JDK Java 1.2 oder höher ist. JAVA_SERIALVER Pfad zum serialver-Werkzeug. RMIC Pfad zum RMI Stub/Skeleton-Generator, rmic. RMIREGISTRY Pfad zum RMI Registry-Werkzeug, rmiregistry. RMID Pfad zum RMI Daemon rmid. Diese Variable ist nur verfügbar, wenn das JDK Java 1.2 oder höher unterstützt. JAVA_CLASSES Pfad zum Archiv, das die JDK-Klassendateien enthält. Für das JDK 1.2 oder später ist dies ${JAVA_HOME}/jre/lib/rt.jar. Frühere JDKs benutzten ${JAVA_HOME}/lib/classes.zip. HAVE_JIKES Ist dann gesetzt, wenn jikes vom Port benutzt wird (s. USE_JIKES oben).
Sie können das java-debug make-Target benutzen, um Information zum Debuggen Ihres Ports zu erhalten. Es wird die Werte vieler der obenangegebenen Variablen anzeigen. Zusätzlich sind die folgenden Konstanten definiert, damit alle Java-Ports auf eine konsistente Art installiert werden können: Konstanten, die für Ports, welche Java benutzen, definiert sind Konstante Wert JAVASHAREDIR Das Basis-Verzeichnis für alles, was mit Java zusammenhängt. Standardmäßig ${PREFIX}/share/java. JAVAJARDIR Das Verzeichnis, wohin JAR-Dateien installiert werden sollen. Standardmäßig ${JAVASHAREDIR}/classes. JAVALIBDIR Das Verzeichnis, in dem JAR-Dateien, die von anderen Ports installiert wurden, liegen. Standardmäßig ${LOCALBASE}/share/java/classes.
Die entsprechenden Einträge sind sowohl in PLIST_SUB (dokumentiert in ) als auch in SUB_LIST definiert.
Kompilieren mit Ant Wenn der Port mit Apache Ant kompiliert werden soll, muss er USE_ANT setzen. Ant wird dann als das sub-make-Kommando betrachtet. Wenn kein do-build-Target vom Port definiert ist, wird eine Standardvorgabe benutzt, die einfach Ant entsprechend MAKE_ENV, MAKE_ARGS und ALL_TARGETS aufruft. Das ähnelt dem USE_GMAKE-Mechanismus, der in dokumentiert ist. Wenn jikes anstelle von javac benutzt wird (siehe USE_JIKES in ), dann wird Ant es automatisch benutzen, um den Port zu kompilieren. Optimales Verfahren Wenn Sie eine Java-Bibliothek portieren, sollte Ihr Port die JAR-Datei(en) in ${JAVAJARDIR} installieren, und alles andere unter ${JAVASHAREDIR}/${PORTNAME} (ausgenommen die Dokumentation - siehe unten). Um die Größe der Packlistendatei zu reduzieren, können die JAR-Datei(en) direkt im Makefile angegeben werden. Benutzen Sie einfach die folgende Anweisung (wobei myport.jar der Name der JAR-Datei ist, die als Teil des Ports installiert wird): PLIST_FILES+= %%JAVAJARDIR%%/myport.jar Beim Portieren einer Java-Applikation installiert der Port normalerweise alles unter einem einzigen Verzeichnis (inklusive seiner JAR-Abhängigkeiten). Die Benutzung von ${JAVASHAREDIR}/${PORTNAME} wird in dieser Beziehung dringend empfohlen. Es liegt im Entscheidungsbereich des Portierenden, ob der Port die zusätzlichen JAR-Abhängigkeiten unter diesem Verzeichnis installieren oder direkt die schon installierten (aus ${JAVAJARDIR}) benutzen soll. Unabhängig von der Art Ihres Ports (Bibliothek oder Applikation), sollte die zusätzliche Dokumentation an die gleiche Stelle installiert werden wie bei jedem anderen Port auch. Das JavaDoc-Werkzeug ist dafür bekannt einen unterschiedlichen Satz von Dateien abhängig von der Version des benutzten JDKs zu erstellen. Für Ports, die nicht die Benutzung eines bestimmten JDKs vorgeben, ist es deshalb eine komplexe Aufgabe die Packliste (pkg-plist) festzulegen. Dies ist ein Grund, warum dringend angeraten wird, das PORTDOCS-Makro zu benutzen. Außerdem, selbst wenn Sie den Satz von Dateien, den javadoc erzeugen wird, voraussagen können, die Größe der resultierenden pkg-plist befürwortet die Benutzung von PORTDOCS. Der Vorgabewert für DATADIR ist ${PREFIX}/share/${PORTNAME}. Es ist eine gute Idee, DATADIR für Java-Ports stattdessen auf ${JAVASHAREDIR}/${PORTNAME} zu setzen. In der Tat wird DATADIR automatisch zu PLIST_SUB (dokumentiert in ) hinzugefügt, d.h. Sie können %%DATADIR%% direkt in pkg-plist benutzen. Zu der Frage, ob Java-Ports aus dem Quelltext gebaut werden, oder direkt bereitgestellte binäre Distributionen benutzt werden sollten, gab es, als dies geschrieben wurde, keine definierte Richtlinie. Allerdings ermutigen Mitglieder des &os; Java-Projekts Porter dazu, Ihre Ports aus dem Quelltext kompilieren zu lassen, wann immer dies kein Problem darstellt. Alle Eigenschaften, die in diesem Abschnitt präsentiert wurden sind in bsd.java.mk implementiert. Sollten Sie jemals der Meinung sein, dass Ihr Port ausgefeiltere Java-Unterstützung benötigt, schauen Sie bitte erst in das bsd.java.mk CVS Log, weil es normalerweise immer etwas Zeit braucht bis die neuesten Eigenschaften dokumentiert sind. Wenn Sie glauben, dass der fehlende Support auch für viele andere Java Ports nützlich sein könnte, wenden Sie sich bitte an die &a.java;. Obwohl es eine java-Kategorie für Fehlerberichte gibt, bezieht sich diese auf die JDK-Portierungsbemühungen des &os; Java-Projektes. Deshalb sollten Sie Ihren Java-Port in der ports-Kategorie einreichen wie bei jeden anderen Port auch - es sei denn, die Angelegenheit, die Sie zu klären versuchen, steht in Zusammenhang entweder mit einer JDK-Implementierung oder bsd.java.mk. Gleichermaßen gibt es eine definierte Richtlinie für die CATEGORIES eines Java-Ports, die in erklärt wird.
Webanwendungen, Apache und PHP Apache Variablen für Ports, die Apache verwenden USE_APACHE Der Port benötigt Apache. Mögliche Werte: yes (beliebige Version), 1.3, 2.0, 2.2, 2.0+, etc. – Standard ist Version 1.3. WITH_APACHE2 Der Port benötigt Apache 2.0. Ist diese Variable nicht gesetzt, so benötigt der Port Apache 1.3. Diese Variable ist veraltet und sollte nicht mehr verwendet werden. APXS Vollständiger Pfad zu der apxs Binärdatei. Die Variable kann neu gesetzt werden. HTTPD Vollständiger Pfad zu der httpd Binärdatei. Die Variable kann neu gesetzt werden. APACHE_VERSION Beinhaltet die Versionsnummer des aktuell installierten Apache (nur lesbare Variable). Diese Variable ist nach Einbinden der Datei bsd.port.pre.mk verfügbar. Mögliche Werte: 13, 20, 22. APACHEMODDIR Verzeichnis der Apache-Module. Diese Variable wird automatisch in pkg-plist ersetzt. APACHEINCLUDEDIR Verzeichnis der Apache Header-Dateien. Diese Variable wird automatisch in pkg-plist ersetzt. APACHEETCDIR Verzeichnis der Apache-Konfigurationsdateien. Diese Variable wird automatisch in pkg-plist ersetzt.
Nützliche Variablen für Ports von Apache-Modulen MODULENAME Name des Moduls. Standardwert ist PORTNAME. Beispiel: mod_hello SHORTMODNAME Der gekürzte Name des Moduls. Standardmäßig wird der Wert von MODULENAME übernommen. Beispiel: hello AP_FAST_BUILD Verwende apxs zum Kompilieren und Installieren des Moduls. AP_GENPLIST Eine pkg-plist wird automatisch erzeugt. AP_INC Verzeichnis für zusätzliche Header-Dateien, die beim Kompilieren mitverwendet werden. AP_LIB Verzeichnis für zusätzliche Bibliothek-Dateien, welche beim Kompilieren mitverwendet werden. AP_EXTRAS Zusätzliche Flags für apxs.
Webanwendungen Webanwendungen sollten nach PREFIX/www/programmname installiert werden. Der Einfachheit halber ist dieser Pfad sowohl im Makefile als auch in pkg-plist als WWWDIR verfügbar. Der relative Pfad PREFIX ist hingegen im Makefile durch die Variable WWWDIR_REL festgelegt. Der Benutzername und die Benutzergruppe, mit deren Rechte Webanwendungen laufen, sind in WWWOWN und WWWGRP festgelegt. Standardwert ist bei beiden www. Falls ein Port mit anderen Rechten gestartet werden soll, so sollte die Anweisung WWWOWN?= myuser verwendet werden. Dies vereinfacht dem Benutzer eine Anpassung dieser Werte. Falls die Webanwendung nicht explizit Apache benötigt, so sollte dieser auch nicht als Abhängigkeit des Ports aufgeführt werden. Dadurch bleibt es dem Benutzer überlassen Apache oder einen anderen Webserver zu verwenden. PHP Variablen für Ports, die PHP verwenden USE_PHP Der Port benötigt PHP. Der Wert yes bewirkt eine Abhängigkeit des Ports von PHP. Es kann auch eine Liste der benötigten PHP-Erweiterungen angegeben werden. Beispiel: pcre xml gettext DEFAULT_PHP_VER Legt die Version von PHP fest, die standardmäßig installiert wird, falls noch kein PHP vorhanden ist. Standardwert ist 4. Mögliche Werte sind: 4,5 IGNORE_WITH_PHP Der Port funktioniert nicht mit der angegebenen Version von PHP. Mögliche Werte: 4, 5 USE_PHPIZE Der Port wird als PHP-Erweiterung gebaut. USE_PHPEXT Der Port wird wie eine PHP-Erweiterung behandelt – Installation und Eintragung in die PHP-Registry für Erweiterungen. USE_PHP_BUILD Setzt PHP als build-Anhängigkeit. WANT_PHP_CLI Benötigt die Kommandozeilen-Version von PHP. WANT_PHP_CGI Benötigt die CGI-Version von PHP. WANT_PHP_MOD Benötigt das Apache-Modul von PHP. WANT_PHP_SCR Benötigt die Kommandozeilen- oder die CGI-Version von PHP. WANT_PHP_WEB Benötigt das Apache-Modul oder die CGI-Version von PHP.
PEAR Module Das Portieren von PEAR-Modulen ist sehr einfach. Mit Hilfe der Variablen FILES, TESTS, DATA, SQLS, SCRIPTFILES, DOCS und EXAMPLES können die zu installierenden Dateien angegeben werden. Alle aufgeführten Dateien werden automatisch in die jeweiligen Verzeichnisse installiert und der Datei pkg-plist hinzugefügt. Die Datei ${PORTSDIR}/devel/pear/bsd.pear.mk muss am Ende des Makefiles eingebunden werden. Beispiel eines Makefiles für eine PEAR Klasse PORTNAME= Date PORTVERSION= 1.4.3 CATEGORIES= devel www pear MAINTAINER= example@domain.com COMMENT= PEAR Date and Time Zone Classes BUILD_DEPENDS= ${PEARDIR}/PEAR.php:${PORTSDIR}/devel/pear-PEAR RUN_DEPENDS= ${BUILD_DEPENDS} FILES= Date.php Date/Calc.php Date/Human.php Date/Span.php \ Date/TimeZone.php TESTS= test_calc.php test_date_methods_span.php testunit.php \ testunit_date.php testunit_date_span.php wknotest.txt \ bug674.php bug727_1.php bug727_2.php bug727_3.php \ bug727_4.php bug967.php weeksinmonth_4_monday.txt \ weeksinmonth_4_sunday.txt weeksinmonth_rdm_monday.txt \ weeksinmonth_rdm_sunday.txt DOCS= TODO _DOCSDIR= . .include <bsd.port.pre.mk> .include "${PORTSDIR}/devel/pear/bsd.pear.mk" .include <bsd.port.post.mk>
Python benutzen Die Ports unterstützen parallele Installationen mehrerer Python-Versionen. Ports sollten sicherstellen, dass der richtige python-Interpreter verwendet wird – entsprechend der durch den Benutzer definierbaren Variable PYTHON_VERSION. Häufig bedeutet dies, dass der Pfad zum python-Interpreter durch den Wert der Variablen PYTHON_CMD ersetzt werden muss. Ports, die Dateien unter PYTHON_SITELIBDIR installieren, sollten pyXY- als Präfix des Paketnamens haben, sodass in deren Paketname die zugehörige Python Version aufgeführt wird. PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} Nützliche Variablen für Ports, die Python verwenden USE_PYTHON Der Port benötigt Python. Die minimal benötigte Version kann durch Werte wie 2.3+ angegeben werden. Bereiche von Versionsnummern können durch Angabe der minimalen und maximalen Versionsnummer, getrennt durch einen Gedankenstrich, festgelegt werden, z.B.: 2.1-2.3 USE_PYDISTUTILS Verwende Python-distutils zum Konfigurieren, Kompilieren und Installieren. Dies ist erforderlich, falls der Port eine setup.py-Datei beinhaltet. Dadurch werden die do-build und do-install-Ziele und eventuell auch das do-configure-Ziel übergangen, falls GNU_CONFIGURE nicht definiert ist. PYTHON_PKGNAMEPREFIX Wird als PKGNAMEPREFIX verwendet, um Pakete für unterschiedliche Python-Versionen zu trennen. Beispiel: py24- PYTHON_SITELIBDIR Verzeichnis des site-Pakete Baums, der das Installationsverzeichnis von Python (üblicherweise LOCALBASE) beinhaltet. Die PYTHON_SITELIBDIR-Variable kann sehr nützlich bei der Installation von Python-Modulen sein. PYTHONPREFIX_SITELIBDIR Die präfix-freie Variante von PYTHON_SITELIBDIR. Benutzen Sie immer %%PYTHON_SITELIBDIR%% in pkg-plist, wenn möglich. Der Standardwert von %%PYTHON_SITELIBDIR%% ist lib/python%%PYTHON_VERSION%%/site-packages PYTHON_CMD Kommandozeilen-Interpreter für Python mit Versionsnummer. PYNUMERIC Liste der Abhängigkeiten für numerische Erweiterungen. PYNUMPY Liste der Abhängigkeiten für die neue numerische Erweiterung numpy. (PYNUMERIC ist vom Anbieter als veraltet deklariert) PYXML Liste der Abhängigkeiten für XML-Erweiterungen (wird ab Python 2.0 nicht mehr benötigt, da im Basispaket enthalten). USE_TWISTED Setzt die Abhängigkeit des Ports von twistedCore. Die Liste der erforderlichen Komponenten kann als Wert spezifiziert werden. Beispiel: web lore pair flow USE_ZOPE Setzt Zope, eine Plattform für Webanwendungen, als Abhängigkeit des Ports. Setzt die Versionsabhängigkeit von Python auf 2.3. Setzt ZOPEBASEDIR auf das Verzeichnis, in welches Zope installiert wurde.
Eine vollständige Liste aller verfügbaren Variablen ist in /usr/ports/Mk/bsd.python.mk zu finden.
Benutzung von <application>Tcl/Tk</application> Die Ports-Sammlung unterstützt die parallele Installation mehrerer Tcl/Tk-Versionen. Ports sollten mindestens die vorgegebene Tcl/Tk-Version oder höher zu unterstützen versuchen anhand der Variablen USE_TCL und USE_TK. Es ist möglich, die gewünschte Version von tcl mit der Variable WITH_TCL_VER vorzuschreiben. Äußerst nützliche Variablen für Ports, die <application>Tcl/Tk</application> benutzen USE_TCL Der Port benötigt die Tcl-Bibliothek (nicht die Shell). Eine notwendige Mindestversion kann mit Werten wie 84+ angegeben werden. Einzelne nicht unterstützte Versionen können mit der Variable INVALID_TCL_VER festgelegt werden. USE_TCL_BUILD Der Port benötigt Tcl nur während der Zeit, in der er gebaut wird. USE_TCL_WRAPPER Ports, welche zwar die Tcl-Shell, aber nicht eine bestimmte Version von tclsh verlangen, sollten diese neue Variable verwenden. Ein Wrapperskript für tclsh wird auf dem System installiert. Der Benutzer kann festlegen, welche tcl-Shell gewünscht ist bzw. verwendet werden soll. WITH_TCL_VER Benutzerdefinierte Variable, welche die gewünschte Tcl-Version bestimmt. PORTNAME_WITH_TCL_VER Gleich wie WITH_TCL_VER, nur portspezifisch. USE_TCL_THREADS Fordere threadfähiges Tcl/Tk. USE_TK Der Port benötigt die Tk-Bibliothek (nicht die Wish-Shell). Impliziert USE_TCL mit dem gleichen Wert. Für weitere Informationen siehe die Beschreibung der Variable USE_TCL. USE_TK_BUILD Analog zur Variable USE_TCL_BUILD. USE_TK_WRAPPER Analog zur Variable USE_TCL_WRAPPER. WITH_TK_VER Analog zur Variable WITH_TCL_VER und impliziert WITH_TCL_VER mit dem gleichen Wert.
Eine vollständige Liste der zur Verfügung stehenden Variablen befindet sich in /usr/ports/Mk/bsd.tcl.mk.
Emacs benutzen Dieser Abschnitt muss noch geschrieben werden. Ruby benutzen Nützliche Variablen für Ports, die Ruby verwenden Variable Description USE_RUBY Der Port benötigt Ruby. USE_RUBY_EXTCONF Der Port verwendet extconf.rb für die Konfiguration. USE_RUBY_SETUP Der Port verwendet setup.rb für die Konfiguration. RUBY_SETUP Legt den alternativen Namen von setup.rb fest. Üblich ist der Wert install.rb.
Die folgende Tabelle listet ausgewählte Variablen auf, die Portautoren über die Port-Infrastruktur zur Verfügung stehen. Diese Variablen sollten für die Installation von Dateien in die entsprechenden Verzeichnisse verwendet werden. Sie sollten in pkg-plist so häufig wie möglich verwendet und in einem Port nicht neu definiert werden. Ausgewählte read-only-Variablen für Ports, die Ruby verwenden Variable Beschreibung Beispiel RUBY_PKGNAMEPREFIX Wird als PKGNAMEPREFIX verwendet, um Pakete für verschiedene Versionen von Ruby zu unterscheiden. ruby18- RUBY_VERSION Vollständige Version von Ruby in der Form x.y.z. 1.8.2 RUBY_SITELIBDIR Installationsverzeichnis der von der Rechnerarchitektur unabhängigen Bibliotheken. /usr/local/lib/ruby/site_ruby/1.8 RUBY_SITEARCHLIBDIR Installationsverzeichnis der von der Rechnerarchitektur abhängigen Bibliotheken. /usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd6 RUBY_MODDOCDIR Installationsverzeichnis für die Dokumentation der Module. /usr/local/share/doc/ruby18/patsy RUBY_MODEXAMPLESDIR Installationsverzeichnis für die Beispiele der Module. /usr/local/share/examples/ruby18/patsy
Eine vollständige Liste der verfügbarenVariablen kann in /usr/ports/Mk/bsd.ruby.mk eingesehen werden.
SDL verwenden Die Variable USE_SDL wird für die automatische Konfiguration der Abhängigkeiten für Ports benutzt, die auf SDL basierende Bibliotheken wie devel/sdl12 und x11-toolkits/sdl_gui verwenden. Die folgenden SDL-Bibliotheken sind derzeit bekannt: sdl: devel/sdl12 gfx: graphics/sdl_gfx gui: x11-toolkits/sdl_gui image: graphics/sdl_image ldbad: devel/sdl_ldbad mixer: audio/sdl_mixer mm: devel/sdlmm net: net/sdl_net sound: audio/sdl_sound ttf: graphics/sdl_ttf Falls ein Port z.B. von net/sdl_net und audio/sdl_mixer abhängt, so wäre die Syntax: USE_SDL= net mixer Die Abhängigkeit von devel/sdl12, die durch net/sdl_net und audio/sdl_mixer entsteht, wird automatisch zum Port hinzugefügt. Falls USE_SDL im Port verwendet wird, so wird automatisch: die Abhängigkeit von sdl12-config zu BUILD_DEPENDS hinzugefügt die Variable SDL_CONFIG zu CONFIGURE_ENV hinzugefügt die Abhängigkeit der ausgewählten Bibliotheken zu LIB_DEPENDS hinzugefügt Um zu überprüfen, ob die SDL-Bibliotheken verfügbar sind, kann die Variable WANT_SDL verwendet werden: WANT_SDL=yes .include <bsd.port.pre.mk> .if ${HAVE_SDL:Mmixer}!="" USE_SDL+= mixer .endif .include <bsd.port.post.mk> <application>wxWidgets</application> verwenden Dieser Abschnitt beschreibt den Status der wxWidgets-Bibliotheken in den Ports und deren Einbindung in das Ports-System. Einführung Es gibt viele Probleme bei der gleichzeitigen Verwendung unterschiedlicher Versionen von wxWidgets-Bibliotheken (Dateien unterschiedlicher wxWidgets-Versionen haben denselben Dateinamen). In den Ports wurde das Problem dadurch gelöst, dass jede Version unter einem eigenen Namen installiert wird, der die Versionsnummer als Suffix beinhaltet. Der offensichtliche Nachteil dabei ist, dass jede Anwendung so verändert werden muss, dass sie die erwartete Version vorfindet. Die meisten solcher Anwendungen benutzen das wx-config-Skript, um die benötigten Compiler- und Linkerflags zu erhalten. Dieses Skript hat für jede verfügbare Version einen anderen Namen. Die meisten Anwendungen beachten eine Umgebungsvariable oder ein Argument beim configure-Skript, um das gewünschte wx-config-Skript festzulegen. Ansonsten müssen sie gepatcht werden. Auswahl der Version Um festzulegen, welche Version der wxWidgets verwendet werden soll, gibt es zwei Variablen (falls nur eine der beiden definiert wird, so wird die andere auf einen Standardwert gesetzt): Variablen, um die <application>wxWidgets</application>-Version festzulegen Variable Beschreibung Standardwert USE_WX Liste der Versionen, die der Port verwenden kann Alle verfügbaren Versionen USE_WX_NOT Liste der Versionen, die der Port nicht verwenden kann Nichts
Es folgt eine Liste an möglichen wxWidgets-Versionen und deren zugehöriger Port: Verfügbare <application>wxWidgets</application>-Versionen Version Port 2.4 x11-toolkits/wxgtk24 2.6 x11-toolkits/wxgtk26 2.8 x11-toolkits/wxgtk28
Ab Version 2.5 werden auch Versionen in Unicode unterstützt und über einen Unterport mit dem Suffix -unicode installiert. Dies kann aber auch über Variablen gehandhabt werden (siehe ). Die Variablen in können auf einen oder mehrere (durch Leerzeichen getrennt) der folgenden Werte gesetzt werden: Spezifikationen der <application>wxWidgets</application>-Versionen Beschreibung Beispiel Einzelne Version 2.4 Aufsteigende Versionsnummern 2.4+ Absteigende Versionsnummern 2.6- Versionsinterval (muss aufsteigend sein) 2.4-2.6
Desweiteren gibt es Variablen, über die eine bevorzugte Version festgelegt werden kann. Die Versionen können als Liste angegeben werden, wobei die Reihenfolge der Priorisierung entspricht. Variablen zur Festlegung der bevorzugten <application>wxWidgets</application>-Version Name Bestimmt für WANT_WX_VER den Port WITH_WX_VER den Benutzer
Komponentenauswahl Desweiteren gibt es Anwendungen, die nicht direkt wxWidgets-Bibliotheken sind, aber trotzdem mit diesen zusammenhängen. Diese Anwendungen können über die Variable WX_COMPS festgelegt werden. Die folgenden Komponenten sind verfügbar: Verfügbare <application>wxWidgets</application>-Komponenten Name Beschreibung Versionsbeschränkungen wx Hauptbibliothek Nichts contrib Beigesteuerte Bibliothek Nichts python wxPython (Python-Bindungen) 2.4-2.6 mozilla wxMozilla 2.4 svg wxSVG 2.6
Der Typ der Abhängigkeit kann für jede Komponente durch hinzufügen eines Suffix (durch Strichpunkt getrennt) festgelegt werden. Falls der Typ nicht angegeben wird, wird ein Standardwert verwendet (siehe ). Die folgenden Typen sind verfügbar: Verfügbare Typen von <application>wxWidgets</application>-Abhängigkeiten Name Beschreibung build Komponente wird zum Bau benötigt – äquivalent zu BUILD_DEPENDS run Komponente wird zum Ausführen benötigt – äquivalent zu RUN_DEPENDS lib Komponente wird zum Bau und Ausführen benötigt – äquivalent zu LIB_DEPENDS
Die Standardwerte für die einzelnen Komponenten sind in der folgenden Tabelle aufgeführt: Standardtypen der <application>wxWidgets</application>-Abhängigkeiten Komponente Typ der Abhängigkeit wx lib contrib lib python run mozilla lib svg lib
Auswahl von <application>wxWidgets</application>-Komponenten Der folgende Ausschnitt entspricht einem Port, der die wxWidgets-Version 2.4 und die zugehörigen Bibliotheken verwendet. USE_WX= 2.4 WX_COMPS= wx contrib
Unicode Die wxWidgets-Bibliotheken unterstützen Unicode seit der Version 2.5. In den Ports sind beide Versionen verfügbar und können über die folgenden Variablen ausgewählt werden: Variablen, um Unicode in den <application>wxWidgets</application>-Versionen auszuwählen Variable Beschreibung Bestimmt für WX_UNICODE Der Port funktioniert ausschließlich mit der Unicode-Version den Port WANT_UNICODE Der Port funktioniert in beiden Versionen – bevorzugt wird jedoch Unicode den Port WITH_UNICODE Der Port verwendet die Unicode-Version den Benutzer WITHOUT_UNICODE Der Port verwendet, falls unterstützt, die normale Version (falls WX_UNICODE nicht definiert ist) den Benutzer
Die Variable WX_UNICODE darf nicht bei Ports benutzt werden, die sowohl die Version mit als auch ohne Unterstützung für Unicode verwenden können. Falls der Port standardmäßig Unterstützung für Unicode bieten soll, verwenden Sie WANT_UNICODE stattdessen.
Feststellen der installierten Version Um eine bereits installierte Version zu finden, muss WANT_WX definiert werden. Falls diese Variable nicht auf eine bestimmte Versionsnummer gesetzt wird, werden die Komponenten einen Suffix mit der Versionsnummer tragen. Die Variable HAVE_WX wird gesetzt, falls eine installierte Version vorgefunden wurde. Installierte <application>wxWidgets</application>-Versionen und –Komponenten feststellen Der folgende Ausschnitt kann in einem Port verwendet werden, der wxWidgets verwendet, falls es installiert ist, oder falls eine Option dafür ausgewählt wurde. WANT_WX= yes .include <bsd.port.pre.mk> .if defined(WITH_WX) || ${HAVE_WX:Mwx-2.4} != "" USE_WX= 2.4 CONFIGURE_ARGS+=--enable-wx .endif Der folgende Ausschnitt kann verwendet werden, um die Unterstützung für wxPython zusätzlich zu der von wxWidgets zu aktivieren (beide in Version 2.6), wenn das installiert ist, oder die Option ausgewählt wurde. USE_WX= 2.6 WX_COMPS= wx WANT_WX= 2.6 .include <bsd.port.pre.mk> .if defined(WITH_WXPYTHON) || ${HAVE_WX:Mpython} != "" WX_COMPS+= python CONFIGURE_ARGS+=--enable-wxpython .endif Vordefinierte Variablen Die folgenden Variablen sind in den Ports verfügbar (nachdem sie entsprechend definiert wurden). Vordefinierte Variablen für Ports, die <application>wxWidgets</application> verwenden Name Beschreibung WX_CONFIG Pfad zum wxWidgets wx-config-Skript (mit unterschiedlichem Namen) WXRC_CMD Pfad zum wxWidgets wxrc-Programm (mit unterschiedlichem Namen) WX_VERSION Version der wxWidgets, die verwendet werden soll (z.B. 2.6) WX_UNICODE Falls Unterstützung für Unicode nicht explizit definiert, jedoch verwendet wird, dann wird die Unterstützung automatisch aktiviert.
Verarbeitung in <filename>bsd.port.pre.mk</filename> Falls die Variablen gleich nach dem Importieren von bsd.port.pre.mk benutzt werden sollen, so muss die Variable WX_PREMK definiert werden. Falls WX_PREMK definiert ist, so werden Version, Abhängigkeiten, Komponenten und vordefinierte Variablen nicht geändert, wenn die Variablen des wxWidgets-Ports nach dem Einbinden von bsd.port.pre.mk geändert werden. Verwendung von <application>wxWidgets</application>-Variablen in Kommandos Der folgende Ausschnitt zeigt die Verwendung von WX_PREMK durch Ausführen des wx-config-Skriptes, um die vollständige Version als Zeichenkette zu erhalten, diese dann einer Variablen zuzuweisen und die Variable anschließend einem Programm zu übergeben. USE_WX= 2.4 WX_PREMK= yes .include <bsd.port.pre.mk> .if exists(${WX_CONFIG}) VER_STR!= ${WX_CONFIG} --release PLIST_SUB+= VERSION="${VER_STR}" .endif Die wxWidgets-Variablen können problemlos in Kommandos benutzt werden, falls diese in Targets ohne gesetztes WX_PREMK verwendet werden. Weitere <command>configure</command>-Argumente Einige GNU configure-Skripte können wxWidgets nicht auffinden, falls nur die Umgebungsvariable WX_CONFIG gesetzt ist, sondern benötigen zusätzliche Argumente. Dafür kann die Variable WX_CONF_ARGS benutzt werden. Zulässige Werte für <makevar>WX_CONF_ARGS</makevar> Möglicher Wert Resultierendes Argument absolute --with-wx-config=${WX_CONFIG} relative --with-wx=${LOCALBASE} --with-wx-config=${WX_CONFIG:T}
Verwendung von <application>Lua</application> Dieser Abschnitt beschreibt den Status der Lua-Bibliotheken in den Ports und deren Einbindung in das Ports System. Einführung Es gibt viele Probleme bei der gleichzeitigen Verwendung unterschiedlicher Versionen von Lua-Bibliotheken (Dateien unterschiedlicher Versionen haben denselben Dateinamen). In den Ports wurde das Problem gelöst, indem jede Version unter einem eigenen Namen mit der Versionsnummer als Suffix installiert wird. Der offensichtliche Nachteil dabei ist, dass jede Anwendung so verändert werden muss, dass sie die erwartete Version vorfindet. Dies kann jedoch durch zusätzliche Flags für Compiler und Linker gelöst werden. Auswahl der Version Um festzulegen, welche Version von Lua verwendet werden soll, gibt es zwei Variablen (falls nur eine der beiden definiert ist, so wird die andere auf einen Standardwert gesetzt): Variablen, um die <application>Lua</application>-Version festzulegen Variable Beschreibung Standardwert USE_LUA Liste der Versionen, welche der Port verwenden kann Alle verfügbaren Versionen USE_LUA_NOT Liste der Versionen, die der Port nicht verwenden kann Nichts
Es folgt eine Liste an möglichen Lua-Versionen und deren zugehöriger Port: Verfügbare <application>Lua</application>-Versionen Version Port 4.0 lang/lua4 5.0 lang/lua50 5.1 lang/lua
Die Variablen in können auf einen oder mehrere (durch Leerzeichen getrennt) der folgenden Werte gesetzt werden: Spezifikationen der <application>Lua</application>-Versionen Beschreibung Beispiel Spezielle Version 4.0 Aufsteigende Versionen 5.0+ Absteigende Versionen 5.0- Versionenintervall (muss aufsteigend sein) 5.0-5.1
Desweiteren gibt es Variablen, über die eine bevorzugte Version festgelegt werden kann. Die Versionen können als Liste angegeben werden, wobei die Reihenfolge der Priorisierung entspricht. Variablen zur Festlegung der bevorzugten <application>Lua</application>-Version Name Bestimmt für WANT_LUA_VER den Port WITH_LUA_VER den Benutzer
Auswahl der <application>Lua</application>-Version Der folgende Ausschnitt entspricht einem Port, der Lua in den Versionen 5.0 oder 5.1 verwenden kann und standardmäßig 5.0 verwendet. Diese Einstellung kann durch die benutzerdefinierte Variable WITH_LUA_VER überschrieben werden. USE_LUA= 5.0-5.1 WANT_LUA_VER= 5.0
Komponentenauswahl Desweiteren gibt es Anwendungen, die nicht direkt Lua-Bibliotheken sind, aber trotzdem mit diesen zusammenhängen. Diese Anwendungen können über die Variable LUA_COMPS festgelegt werden. Die folgenden Komponenten sind verfügbar: Verfügbare <application>Lua</application>-Komponenten Name Beschreibung Versionseinschränkungen lua Hauptbibliothek Keine tolua Bibliothek für die Unterstützung von C/C++-Code 4.0-5.0 ruby Ruby-Bindungen 4.0-5.0
Es gibt weitere Komponenten, die jedoch Module für den Interpreter sind und nicht von Anwendungen benutzt werden (nur von anderen Modulen). Der Typ der Abhängigkeit kann für jede Komponente durch Hinzufügen eines Suffix (durch Strichpunkt getrennt) festgelegt werden. Falls der Typ nicht angegeben wird, wird ein Standardwert verwendet (siehe ). Die folgenden Typen sind verfügbar: Verfügbare Typen von <application>Lua</application>-Abhängigkeiten Name Beschreibung build Komponente wird zum Bau benötigt – äquivalent zu BUILD_DEPENDS run Komponente wird zum Ausführen benötigt – äquivalent zu RUN_DEPENDS lib Komponente wird zum Bau und zum Ausführen benötigt – äquivalent zu LIB_DEPENDS
Die Standardwerte für die einzelnen Komponenten sind in der folgenden Tabelle aufgeführt: Standardtypen für <application>Lua</application>-Abhängigkeiten Komponente Typ der Abhängigkeit lua lib für 4.0-5.0 (shared) und build für 5.1 (static) tolua build (static) ruby lib (shared)
Auswahl von <application>Lua</application>-Komponenten Der folgende Ausschnitt entspricht einem Port, welcher die Lua-Version 4.0 und die zugehörigen Ruby-Bindungen verwendet. USE_LUA= 4.0 LUA_COMPS= lua ruby
Feststellen der installierten Version Um eine bereits installierte Version zu finden, muss WANT_LUA definiert werden. Falls diese Variable nicht auf eine bestimmte Versionsnummer gesetzt wird, werden die Komponenten einen Suffix mit der Versionsnummer tragen. Die Variable HAVE_LUA wird gesetzt, falls eine installierte Version vorgefunden wurde. Installierte <application>Lua</application>-Versionen und– Komponenten feststellen Der folgende Ausschnitt kann in einem Port verwendet werden, der Lua benutzt, falls es installiert ist oder eine Option dafür ausgewählt wurde. WANT_LUA= yes .include <bsd.port.pre.mk> .if defined(WITH_LUA5) || ${HAVE_LUA:Mlua-5.[01]} != "" USE_LUA= 5.0-5.1 CONFIGURE_ARGS+=--enable-lua5 .endif Der folgende Ausschnitt kann verwendet werden, um die Unterstützung für tolua zusätzlich zu der von Lua zu aktivieren (beide in Version 4.0), wenn dies installiert ist oder die Option ausgewählt wurde. USE_LUA= 4.0 LUA_COMPS= lua WANT_LUA= 4.0 .include <bsd.port.pre.mk> .if defined(WITH_TOLUA) || ${HAVE_LUA:Mtolua} != "" LUA_COMPS+= tolua CONFIGURE_ARGS+=--enable-tolua .endif Vordefinierte Variablen Die folgenden Variablen sind in den Ports verfügbar (nachdem sie entsprechend definiert wurden). Vordefinierte Variablen für Ports, die <application>Lua</application> verwenden Name Beschreibung LUA_VER Die Lua-Version, die verwendet wird (z.B. 5.1) LUA_VER_SH Die Hauptversion für shared-Lua-Bibliotheken (z.B. 1) LUA_VER_STR Die Lua-Version ohne die Punkte (z.B. 51) LUA_PREFIX Der Präfix, unter dem Lua (und Komponenten) installiert ist LUA_SUBDIR Das Verzeichnis unter ${PREFIX}/bin, ${PREFIX}/share und ${PREFIX}/lib, in welchem Lua installiert ist LUA_INCDIR Das Verzeichnis, in dem Lua- und tolua-Header-Dateien installiert sind LUA_LIBDIR Das Verzeichnis, in dem Lua– und tolua-Bibliotheken installiert sind LUA_MODLIBDIR Das Verzeichnis, in dem Lua Modul-Bibliotheken (.so) installiert sind LUA_MODSHAREDIR Das Verzeichnis, in dem Lua-Module (.lua) installiert sind LUA_PKGNAMEPREFIX Der Paketnamen-Präfix, der von Lua-Modulen verwendet wird LUA_CMD Das Verzeichnis, in dem der Lua-Interpreter liegt LUAC_CMD Das Verzeichnis, in dem der Lua-Compiler liegt TOLUA_CMD Das Verzeichnis, in dem das tolua-Programm liegt
Einem Port mitteilen, in welchem Verzeichnis <application>Lua</application> liegt Der folgende Ausschnitt zeigt, wie einem Port, welcher ein configure-Skript verwendet, mitgeteilt werden kann, wo die Lua-Header-Dateien und Bibliotheken liegen. USE_LUA= 4.0 GNU_CONFIGURE= yes CONFIGURE_ENV= CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"
Verarbeitung in <filename>bsd.port.pre.mk</filename> Falls die Variablen gleich nach dem Einbinden von bsd.port.pre.mk benutzt werden sollen, so muss die Variable LUA_PREMK definiert werden. Falls LUA_PREMK definiert ist, so werden Version, Abhängigkeiten, Komponenten und vordefinierte Variablen nicht geändert, wenn die Variablen des Lua-Ports nach dem Einbinden von bsd.port.pre.mk geändert werden. Verwendung von <application>Lua</application>-Variablen in Kommandos Der folgende Ausschnitt zeigt die Verwendung von LUA_PREMK durch Ausführen des Lua-Interpreters, um die vollständige Version als Zeichenkette zu erhalten, diese dann einer Variablen zuzuweisen und die Variable schließlich einem Programm zu übergeben. USE_LUA= 5.0 LUA_PREMK= yes .include <bsd.port.pre.mk> .if exists(${LUA_CMD}) VER_STR!= ${LUA_CMD} -v CFLAGS+= -DLUA_VERSION_STRING="${VER_STR}" .endif Die Lua-Variablen können problemlos in Befehlen benutzt werden, falls diese in Targets ohne gesetztes LUA_PREMK verwendet werden.
Xfce verwenden Die USE_XFCE-Variable wird für die automatische Konfiguration der Abhängigkeiten eingesetzt, welche die Xfce-Basisbibliotheken oder Anwendungen wie x11-toolkits/libxfce4gui und x11-wm/xfce4-panel verwenden. Die folgenden Xfce-Bibliotheken und -Anwendungen werden derzeit unterstützt: libexo: x11/libexo libgui: x11-toolkits/libxfce4gui libutil: x11/libxfce4util libmcs: x11/libxfce4mcs mcsmanager: sysutils/xfce4-mcs-manager panel: x11-wm/xfce4-panel thunar: x11-fm/thunar wm: x11-wm/xfce4-wm xfdev: dev/xfce4-dev-tools Die folgenden zusätzlichen Parameter werden unterstützt: configenv: Benutzen Sie dies, wenn Ihr Port eine speziell angepasste CONFIGURE_ENV-Variable benötigt, um seine erforderlichen Bibliotheken zu finden. -I${LOCALBASE}/include -L${LOCALBASE}/lib wird CPPFLAGS hinzugefügt und ergibt CONFIGURE_ENV. Wenn also ein Port von sysutils/xfce4-mcs-manager abhängt und die speziellen CPPFLAGS in seiner configure-Umgebung verlangt, dann würde die Syntax wie folgt aussehen: USE_XFCE= mcsmanager configenv Benutzung von Datenbanken Variablen für Ports, die Datenbanken benutzen Variable Bedeutung USE_BDB Falls die Variable auf yes gesetzt ist, füge eine Abhängigkeit von databases/db41 hinzu. Die Variable kann auch folgende Werte annehmen: 2, 3, 40, 41, 42, 43, 44, 45, 46 oder 47. Sie können eine Folge akzeptierter Werte angeben - USE_BDB=42+ stellt die höchste installierte Version fest und greift auf 42 zurück, falls sonst nichts installiert ist. USE_MYSQL Falls die Variable auf yes gesetzt ist, füge databases/mysql50-server als Abhängigkeit hinzu. Die damit verknüpfte Variable WANT_MYSQL_VER kann Werte wie 323, 40, 41, 50, 51 oder 60 annehmen. USE_PGSQL Falls die Variable auf yes gesetzt ist, füge eine Abhängigkeit von databases/postgresql82 hinzu. Die damit verknüpfte Variable WANT_MYSQL_VER kann Werte wie 73, 74, 80, 81, 82 oder 83 annehmen.
Starten und Anhalten von Diensten (rc Skripten) rc.d-Skripten werden zum Starten von Diensten während des Systemstarts verwendet und um den Administratoren einen Standardweg zum Anhalten und Starten von Diensten zu bieten. Ports halten sich an dieses systemweite rc.d-Framework. Details zu deren Benutzung können im rc.d Kapitel des Handbuchs nachgelesen werden. Ausführliche Beschreibungen der verfügbaren Befehle stehen in &man.rc.8; und &man.rc.subr.8;. Desweiteren gibt es einen Artikel zu praktischen Aspekten bezüglich rc.d-Skripten. Ein oder mehrere rc-Skripten können installiert werden mittels: USE_RC_SUBR= doormand Skripten müssen im Unterverzeichnis files abgelegt und jeder Skript-Datei muss ein .in-Suffix hinzugefügt werden. Der einzige Unterschied zu einem rc.d-Skript aus dem Basissystem ist, dass die Zeile . /etc/rc.subr in . %%RC_SUBR%% umbenannt werden muss, da ältere Versionen von &os; die Datei /etc/rc.subr nicht besitzen. Standarderweiterungen wie SUB_LIST werden ebenfalls unterstützt. Die Verwendung von %%PREFIX%% und %%LOCALBASE%% wird dringend empfohlen. Näheres zu SUB_LIST kann im zugehörigen Kapitel nachgelesen werden. Für &os;-Versionen, die älter als 6.1-RELEASE sind, ist die Integration mittels &man.rcorder.8; möglich, indem USE_RCORDER anstatt USE_RC_SUBR verwendet wird. Die Verwendung dieser Methode wird aber nicht mehr empfohlen. Seit &os; 6.1-RELEASE sind lokale rc.d-Skripten (inklusive der durch Ports installierten) im allgemeinen &man.rcorder.8; des Basissystems. Beispiel eines einfachen rc.d-Skripts: #!/bin/sh # PROVIDE: doormand # REQUIRE: LOGIN # # Add the following lines to /etc/rc.conf.local or /etc/rc.conf # to enable this service: # # doormand_enable (bool): Set to NO by default. # Set it to YES to enable doormand. # doormand_config (path): Set to %%PREFIX%%/etc/doormand/doormand.cf # by default. # . %%RC_SUBR%% name="doormand" rcvar=${name}_enable command=%%PREFIX%%/sbin/${name} pidfile=/var/run/${name}.pid load_rc_config $name : ${doormand_enable="NO"} : ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"} command_args="-p $pidfile -f $doormand_config" run_rc_command "$1" Für die Wertzuweisung von Variablen sollte "=" anstatt ":=" verwendet werden, da bei Ersterem nur auf einen Standardwert gesetzt wird, wenn die Variable vorher noch nicht gesetzt war, und bei Letzterem dieser gesetzt wird, auch wenn der Wert vorher Null gewesen ist. Ein Benutzer kann durchaus einen Ausdruck wie doormand_flags="" in seiner rc.conf.local-Datei stehen haben, und eine Variablenzuweisung mittels ":=" würde in diesem Fall die Benutzerdefinition überschreiben. Der Suffix des rc-Skriptes wird durch RC_SUBR_SUFFIX für die weitere Verwendung im Makefile des Ports bereitgestellt. Aktuelle Versionen von &os; fügen keinen Suffix den Skriptnamen hinzu im Gegensatz zu ältere Versionen, die dies mit dem Suffix .sh taten. Es sollten keine weiteren Skripten mit der .sh-Endung hinzugefügt werden. Irgendwann wird es ein Massenumbenennen aller Skripten im Repository geben, die immer noch diese Endung haben. Anhalten und Deinstallieren von Diensten Es ist möglich, dass ein Dienst während der Deinstallation automatisch angehalten wird. Es wird empfohlen dieses Verhalten nur zu implementieren, wenn es unbedingt erforderlich ist zuerst den Dienst anzuhalten und dann die Dateien zu entfernen. Normalerweise sollte es dem Administrator überlassen werden, ob ein Dienst durch Deinstallieren angehalten werden soll. Dies betrifft auch den Vorgang des Aktualisierens. Der Datei pkg-plist sollte eine Zeile wie folgt zugefügt werden: @stopdaemon doormand Das Argument muss dabei mit dem Inhalt der USE_RC_SUBR-Variablen übereinstimmen.
Fortgeschrittene <filename>pkg-plist</filename>-Methoden Änderungen an <filename>pkg-plist</filename> mit Hilfe von make-Variablen Einige Ports, insbesondere die p5--Ports, müssen, abhängig von ihren Konfigurationsoptionen (oder im Falle der p5-Ports von der perl-Version), die pkg-plist verändern. Um dies zu vereinfachen, werden für jeden Eintrag in pkg-plist die Variablen %%OSREL%%, %%PERL_VER%% und %%PERL_VERSION%% durch die jeweiligen Werte ersetzt. Der Wert von %%OSREL%% ist die Revisionsnummer des Betriebssystems (z.B. 4.9). %%PERL_VERSION%% und %%PERL_VER%% geben die vollständige Versionsnummer von perl (z.B. 5.8.9) an. Weitere, die Dokumentationsdateien des Ports betreffende %%VARS%%, werden im entsprechenden Abschnitt erläutert. Falls Sie weitere Ersetzungen von Variablen durchführen müssen, können Sie in der Variable PLIST_SUB eine Liste von VAR=VALUE-Paaren angeben, wobei in der pkg-plist %%VAR%% durch VALUE ersetzt wird. Wenn Sie z.B. einen Port haben, der viele Dateien in ein versionsspezifisches Unterverzeichnis installiert, dann können Sie etwas wie OCTAVE_VERSION= 2.0.13 PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION} in das Makefile schreiben und %%OCTAVE_VERSION%% verwenden, unabhängig davon, wo die Variable in pkg-plist verwendet wird. In diesem Fall müssen Sie bei einem Upgrade des Ports nicht dutzende (oder manchmal sogar hunderte) Zeilen in pkg-plist anpassen. Diese Ersetzung (ebenso wie das Hinzufügen weiterer Manualpages) wird zwischen den pre-install- und do-install-Targets ausgeführt, indem aus PLIST gelesen und in TMPPLIST geschrieben wird (Standard: WRKDIR/.PLIST.mktmp). Falls Ihr Port also PLIST während dem Erstellen generiert, so sollte dies vor oder in pre-install geschehen. Muss Ihr Port die resultierende Datei verändern, so sollte dies in post-install mit der Ausgabedatei TMPPLIST erfolgen. Eine weitere Möglichkeit, die Paketliste eines Ports zu verändern, besteht darin die Variablen PLIST_FILES und PLIST_DIRS zu setzen. Der Wert jeder der beiden Variablen stellt eine Liste von Pfadnamen dar, die zusammen mit dem Inhalt von PLIST in TMPPLIST geschrieben wird. Dabei unterliegen die Namen in PLIST_FILES und PLIST_DIRS der weiter oben beschriebenen Substitution von %%VAR%%. Die Namen aus PLIST_FILES werden ansonsten unverändert in die endgültige Paketliste übernommen, während den Namen aus PLIST_DIRS noch der Wert von @dirrm vorangestellt wird. Damit die Verwendung von PLIST_FILES und PLIST_DIRS überhaupt möglich ist, müssen diese gesetzt werden, bevor TMPPLIST geschrieben wird – z.B. in pre-install oder vorher. Leere Verzeichnisse Aufräumen leerer Verzeichnisse Bitte sorgen Sie dafür, dass ihre Ports bei der Deinstallation leere Verzeichnisse löschen. Dazu wird für jedes Verzeichnis, das der Port erzeugt hat, eine @dirrm-Zeile angegeben. Um ein Verzeichnis zu löschen müssen Sie zuerst dessen Unterverzeichnisse entfernen. : lib/X11/oneko/pixmaps/cat.xpm lib/X11/oneko/sounds/cat.au : @dirrm lib/X11/oneko/pixmaps @dirrm lib/X11/oneko/sounds @dirrm lib/X11/oneko Es kann allerdings auch vorkommen, dass @dirrm Fehler ausgibt, da andere Ports ein Verzeichnis ebenfalls nutzen. Deshalb können Sie @dirrmtry verwenden, um nur Verzeichnisse zu löschen, die wirklich leer sind, und damit Warnhinweise vermeiden. @dirrmtry share/doc/gimp Dadurch wird es weder eine Fehlermeldung geben noch wird &man.pkg.delete.1; abnormal beendet werden - auch dann nicht, wenn ${PREFIX}/share/doc/gimp nicht leer ist, da andere Ports hier ebenfalls Dateien installiert haben. Erstellen leerer Verzeichnisse Um leere Verzeichnisse während der Installation eines Ports zu erstellen, bedarf es etwas Aufmerksamkeit. Diese Verzeichnisse werden nicht erstellt, wenn das Paket installiert wird, da Pakete nur die Dateien speichern und &man.pkg.add.1; nur die Verzeichnisse erstellt, die dafür benötigt werden. Um sicher zu gehen, dass das leere Verzeichnis erstellt wird, wenn ein Paket installiert wird, muss die folgende Zeile in pkg-plist über der entsprechenden @dirrm Zeile eingetragen werden: @exec mkdir -p %D/share/foo/templates Konfigurationsdateien Sollte Ihr Port Konfigurationsdateien in PREFIX/etc benötigen, so sollten Sie diese nicht einfach installieren und in pkg-plist auflisten. Dies würde &man.pkg.delete.1; veranlassen, diese Dateien zu löschen, selbst wenn wenn sie vom Benutzer editiert wurden. Stattdessen sollten Beispieldateien mit einem entsprechenden Suffix (beispielsweise filename.sample) versehen werden. Ist die Konfigurationsdatei nicht vorhanden, so sollte die Beispieldatei an deren Platz kopiert werden. Bei der Deinstallation sollte die Konfigurationsdatei gelöscht werden, aber nur, wenn sie nicht vom Benutzer verändert wurde. Das alles muss sowohl im Makefile des Ports als auch in der pkg-plist (für die Installation aus einem Paket) sichergestellt werden. Beispiel aus einem Makefile: post-install: @if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \ ${CP} -p ${PREFIX}/etc/orbit.conf.sample ${PREFIX}/etc/orbit.conf ; \ fi Beispiel aus einer pkg-plist: @unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi etc/orbit.conf.sample @exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fi Wahlweise können Sie auch eine Nachricht ausgegeben lassen, in der Sie den Nutzer auffordern, die Datei an die richtige Stelle zu kopieren und zu bearbeiten, bevor das Programm ausgeführt werden kann. Dynamische oder statische Paketliste Eine statische Paketliste ist eine Paketliste, die in der Ports-Sammlung, entweder in Form der pkg-plist (mit oder ohne der Ersetzung von Variablen) oder durch PLIST_FILES und PLIST_DIRS im Makefile eingebettet, verfügbar ist. Selbst wenn der Inhalt durch ein Werkzeug oder ein Target im Makefile automatisch erzeugt wird, bevor die Datei von einem Committer in die Ports-Sammlung aufgenommen wird, so ist dies immer noch eine statische Liste, da es möglich ist den Dateiinhalt zu betrachten ohne ein Distfile Herunterladen oder Kompilieren zu müssen. Eine dynamische Paketliste ist eine Paketliste, die beim Kompilieren des Ports erstellt wird, abhängig davon, welche Dateien und Verzeichnisse installiert werden. Es ist nicht möglich diese Liste zu betrachten, bevor der Quelltext heruntergeladen und kompiliert oder nachdem ein make clean ausgeführt wurde. Der Einsatz dynamischer Paketlisten ist zwar nicht untersagt, aber Sie sollten, wann immer das möglich ist, statische Paketlisten verwenden, da die Nutzer dann &man.grep.1; auf alle verfügbaren Ports anwenden können, um z.B. herauszufinden, von welchem eine bestimmte Datei installiert wurde. Dynamische Paketlisten sollten für komplexe Ports verwendet werden, bei denen sich die Liste abhängig von den gewählten Funktionen sehr stark ändern kann (wodurch die Pflege von statischen Listen unmöglich wird), oder Ports, welche die Paketliste abhängig von den Versionen verwendeter Abhängigkeiten verändern (z.B. Ports, die Ihre Dokumentation mit Javadoc erzeugen). Maintainer, die dynamische Paketlisten bevorzugen, werden dazu aufgefordert, neue Targets zu Ihren Ports hinzuzufügen, welche die pkg-plist-Datei erzeugen, sodass Benutzer den Inhalt überprüfen können. Automatisiertes Erstellen von Paketlisten Als Erstes sollten Sie sich vergewissern, dass der Port bis auf pkg-plist vollständig ist. Als Nächstes erstellen Sie einen temporären Verzeichnisbaum, in welchem Ihr Port installiert werden kann, und installieren Sie alle Abhängigkeiten. &prompt.root; mkdir /var/tmp/$(make -V PORTNAME) &prompt.root; mtree -U -f $(make -V MTREE_FILE) -d -e -p /var/tmp/$(make -V PORTNAME) &prompt.root; make depends PREFIX=/var/tmp/$(make -V PORTNAME) Speichern Sie die Verzeichnisstruktur in einer neuen Datei. &prompt.root; (cd /var/tmp/$(make -V PORTNAME) && find -d * -type d) | sort > OLD-DIRS Erstellen Sie eine leere pkg-plist-Datei: &prompt.root; :>pkg-plist Wenn Ihr Port auf PREFIX achtet (was er machen sollte), so kann der Port nun installiert und die Paketliste erstellt werden. &prompt.root; make install PREFIX=/var/tmp/$(make -V PORTNAME) &prompt.root; (cd /var/tmp/$(make -V PORTNAME) && find -d * \! -type d) | sort > pkg-plist Sie müssen auch alle neu erstellten Verzeichnisse in die Paketliste aufnehmen. &prompt.root; (cd /var/tmp/$(make -V PORTNAME) && find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' >> pkg-plist Zu guter Letzt muss die Paketliste noch manuell aufgeräumt werden - es funktioniert eben nicht alles automatisch. Manualpages sollten im Makefile des Ports unter MANn aufgeführt sein und nicht in der Paketliste. Konfigurationsdateien des Benutzers sollten entfernt oder als filename.sample installiert werden. Die info/dir-Datei sollte nicht aufgeführt sein und die zugehörigen install-info-Zeilen sollten hinzugefügt werden, wie im info files-Abschnitt beschrieben. Alle Bibliotheken, die der Port installiert, sollten aufgelistet werden, wie es im Shared Libraries-Abschnitt festgelegt ist. Alternativ dazu können Sie das plist-Skript in /usr/ports/Tools/scripts/ verwenden, um die Paketliste automatisch zu erstellen. Das plist-Skript ist ein Ruby-Skript, das die meisten der in den vorangehenden Absätzen kurz dargestellten manuellen Schritte automatisiert. Der erste Schritt ist derselbe wie oben: Nehmen Sie die ersten drei Zeilen, also mkdir, mtree und make depends. Installieren und bauen Sie dann den Port: &prompt.root; make install PREFIX=/var/tmp/$(make -V PORTNAME) Und lassen Sie plist die pkg-plist-Datei erstellen: &prompt.root; /usr/ports/Tools/scripts/plist -Md -m $(make -V MTREE_FILE) /var/tmp/$(make -V PORTNAME) > pkg-plist Die Paketliste muss immer noch von Hand aufgeräumt werden, wie es oben erklärt wurde. Ein weiteres Werkzeug zur Erzeugung einer ersten pkg-plist-Datei ist ports-mgmt/genplist. Wie bei jedem automatisierten Hilfswerkzeug, sollte die erzeugte pkg-plist-Datei überprüft und bei Bedarf von Hand nachbearbeitet werden. Die <filename>pkg-<replaceable>*</replaceable></filename> Dateien Es gibt noch einige Tricks mit pkg-*, die wir noch nicht erwähnt haben, die aber oft sehr praktisch sind. <filename>pkg-message</filename> Wenn Sie dem Anwender bei der Installation weitere Informationen anzeigen wollen, so können Sie diese Nachricht in pkg-message speichern. Diese Vorgehensweise ist oft nützlich, um zusätzliche Schritte anzuzeigen, die nach &man.pkg.add.1; durchgeführt werden müssen. Dadurch können Sie auch Lizenzinformationen darstellen. Wollen Sie nur ein paar Zeilen über die Einstellungen zum Erstellen des Ports oder Warnungen ausgeben, benutzen Sie ECHO_MSG. pkg-message ist nur für Schritte nach der Installation vorgesehen. Sie sollten den Unterschied zwischen ECHO_MSG und ECHO_CMD beachten: Ersteres wird benutzt, um Informationen auf dem Bildschirm auszugeben, während Letzteres für Kommando-Pipelining bestimmt ist. Ein gutes Beispiel für die Benutzung der beiden Befehle ist in shells/bash2/Makefile zu finden: update-etc-shells: @${ECHO_MSG} "updating /etc/shells" @${CP} /etc/shells /etc/shells.bak @( ${GREP} -v ${PREFIX}/bin/bash /etc/shells.bak; \ ${ECHO_CMD} ${PREFIX}/bin/bash) >/etc/shells @${RM} /etc/shells.bak Die pkg-message wird nicht zur pkg-plist hinzugefügt. Sie wird auch nicht automatisch angezeigt, falls ein Anwender den Port installiert. Sie müssen also die Ausgabe selbst im post-install-Ziel des Make-Vorgangs veranlassen. <filename>pkg-install</filename> Sollte es nötig sein, dass Ihr Port bei der Installation des Binärpakets mit &man.pkg.add.1; Befehle ausführt, können Sie das Skript pkg-install benutzen. Dieses Skript wird automatisch dem Paket hinzugefügt und zweimal von &man.pkg.add.1; ausgeführt: Zuerst als ${SH} pkg-install ${PKGNAME} PRE-INSTALL und beim zweiten Mal als ${SH} pkg-install ${PKGNAME} POST-INSTALL. $2 kann also getestet werden, um festzustellen, in welchem Modus das Skript ausgeführt wird. Die Umgebungsvariable PKG_PREFIX wird auf das Verzeichnis gesetzt, in welches das Paket installiert wird. Siehe &man.pkg.add.1; für weiterführende Informationen. Das Skript wird nicht automatisch ausgeführt, wenn Sie den Port mit make install installieren. Wenn Sie es ausführen lassen wollen, dann müssen Sie es im Makefile aufrufen: PKG_PREFIX=${PREFIX} ${SH} ${PKGINSTALL} ${PKGNAME} PRE-INSTALL. <filename>pkg-deinstall</filename> Dieses Skript wird ausgeführt, wenn ein Paket deinstalliert wird. Es wird zweimal von &man.pkg.delete.1; aufgerufen. Das erste Mal als ${SH} pkg-deinstall ${PKGNAME} DEINSTALL und dann als ${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL. <filename>pkg-req</filename> Muss Ihr Port entscheiden, ob er installiert werden soll oder nicht, können Sie ein pkg-req-Bedingungsskript verwenden. Dieses wird automatisch bei der Installation/ Deinstallation aufgerufen, um zu entscheiden, ob die Installation/ Deinstallation fortgesetzt werden soll. Das Skript wird während der Installation von &man.pkg.add.1; als pkg-req ${PKGNAME} INSTALL aufgerufen. Bei der Deinstallation wird es von &man.pkg.delete.1; als pkg-req ${PKGNAME} DEINSTALL ausgeführt. Ändern der Namen der <filename>pkg-<replaceable>*</replaceable></filename> Dateien Alle Namen der pkg-* Dateien werden durch Variablen festgelegt. Sie können sie bei Bedarf also im Makefile des Ports ändern. Das ist besonders nützlich, wenn Sie die gleichen pkg-* Dateien in mehreren Ports nutzen oder in eine der oben genannten Dateien schreiben wollen. Schreiben Sie niemals außerhalb des Unterverzeichnisses WRKDIR pkg-*, eine Erklärung hierzu finden Sie in Schreiben ausserhalb von WRKDIR. Hier ist eine Liste von Variablennamen und ihren Standardwerten (PKGDIR ist standardmäßig ${MASTERDIR}). Variable Standardwert DESCR ${PKGDIR}/pkg-descr PLIST ${PKGDIR}/pkg-plist PKGINSTALL ${PKGDIR}/pkg-install PKGDEINSTALL ${PKGDIR}/pkg-deinstall PKGREQ ${PKGDIR}/pkg-req PKGMESSAGE ${PKGDIR}/pkg-message Bitte benutzen Sie diese Variablen anstatt PKG_ARGS zu ändern. Wenn Sie PKG_ARGS modifizieren, werden diese Dateien bei der Installation des Ports nicht korrekt in /var/db/pkg installiert. Nutzung von <makevar>SUB_FILES</makevar> und <makevar>SUB_LIST</makevar> Die Variablen SUB_FILES und SUB_LIST sind nützlich, um dynamische Werte in Port-Dateien zu verwenden, wie beispielsweise der Installations-PREFIX in pkg-message. Die Variable SUB_FILES enthält eine Liste von Dateien, die automatisch verändert werden. Jede Datei in SUB_FILES muss ein entsprechendes Pendant datei.in im Verzeichnis FILESDIR haben. Die modifizierte Version wird in WRKDIR angelegt. Dateien, die als Werte von USE_RC_SUBR (oder veraltet in USE_RCORDER) gespeichert werden, werden automatisch zu SUB_FILES hinzugefügt. Für die Dateien pkg-message, pkg-install, pkg-deinstall und pkg-req werden die jeweiligen Makefile-Variablen selbsttätig auf die geänderte Version der Datei gesetzt. Die Variable SUB_LIST ist eine Liste von VAR=WERT-Paaren. Jedes Paar %%VAR%% in den Dateien von SUB_FILES wird mit WERT ersetzt. Einige gebräuchliche Paare werden automatisch definiert: PREFIX, LOCALBASE, DATADIR, DOCSDIR, EXAMPLESDIR. Jede Zeile, die mit @comment beginnt, wird nach der Variablen-Ersetzung aus der neu erstellten Datei gelöscht. Im folgenden Beispiel wird %%ARCH%% mit der Systemarchitektur in pkg-message ersetzt: SUB_FILES= pkg-message SUB_LIST= ARCH=${ARCH} Beachten Sie bitte, dass in diesem Beispiel die Datei pkg-message.in im Verzeichnis FILESDIR vorhanden sein muss. Hier ein Beispiel für eine gute pkg-message.in: Now it is time to configure this package. Copy %%PREFIX%%/share/examples/putsy/%%ARCH%%.conf into your home directory as .putsy.conf and edit it. Ihren Port testen <command>make describe</command> ausführen Einige der &os;-Werkzeuge zur Pflege von Ports, wie zum Beispiel &man.portupgrade.1;, verwenden eine Datenbank names /usr/ports/INDEX, welche Eigenschaften, wie z.B. Port-Abhängigkeiten, verfolgt. INDEX wird vom Makefile der höchsten Ebene, ports/Makefile, mittels make index erstellt, welches in das Unterverzeichnis jedes Ports wechselt und dort make describe ausführt. Wenn also make describe bei einem Port fehlschlägt, kann INDEX nicht generiert werden und schnell werden viele Leute darüber unzufrieden sein. Es ist wichtig diese Datei erzeugen zu können, unabhängig davon, welche Optionen in make.conf vorhanden sind. Bitte vermeiden Sie es daher beispielsweise .error-Anweisungen zu benutzen, wenn zum Beispiel eine Abhängigkeit nicht erfüllt wird (Lesen Sie dazu bitte ). Wenn make describe eine Zeichenkette anstatt einer Fehlermeldung erzeugt, sind Sie wahrscheinlich auf der sicheren Seite. Vergleichen Sie die erzeugte Zeichenkette mit bsd.port.mk, um mehr über deren Bedeutung zu erfahren. Beachten Sie bitte außerdem, dass die Benutzung einer aktuellen Version von portlint (wie im nächsten Abschnitt beschrieben) automatisch make describe startet. Portlint Bitte überprüfen Sie Ihre Arbeit stets mit portlint, bevor Sie diese einreichen oder committen. portlint warnt Sie bei häufigen Fehlern, sowohl funktionaler als auch stilistischer Natur. Für einen neuen (oder repokopierten) Port ist portlint -A die gründlichste Variante; für einen bereits existierenden Port ist portlint -C ausreichend. Da portlint heuristische Methoden zur Fehlersuche benutzt, kann es vorkommen, dass Warnungen für Fehler erzeugt werden, die keine sind. Gelegentlich kann etwas, das als Problem angezeigt wird, aufgrund von Einschränkungen im Port-System nicht anders gelöst werden. Wenn es Zweifel gibt, fragen Sie am besten auf &a.ports; nach. Port Tools Das Programm ports-mgmt/porttools ist Teil der Ports-Sammlung. port ist das Front-End-Skript, das Ihnen dabei behilflich sein kann Ihre Arbeit als Tester zu vereinfachen. Um einen neuen Port zu testen oder einen bereits bestehenden Port zu aktualisieren, können Sie port test verwenden, damit die Tests, inklusive der portlint-Überprüfung, durchgeführt werden. Dieser Befehl spürt ausserdem alle nicht in pkg-plist enthaltenen Dateien auf und gibt eine Liste dieser aus. Hier ein Beispiel: &prompt.root; port test /usr/ports/net/csup <makevar>PREFIX</makevar> und <makevar>DESTDIR</makevar> PREFIX bestimmt, an welche Stelle der Port installiert werden soll. In der Regel ist dies/usr/local oder /opt. Benutzer können PREFIX setzen, wie sie wollen. Ihr Port muss sich an diese Variable halten. DESTDIR, wenn es vom Benutzer gesetzt wird, bestimmt die alternative Umgebung (in der Regel eine Jail oder ein installiertes System, welches an anderer Stelle als / eingehängt ist). Ein Port wird unter DESTDIR/PREFIX installiert und registriert sich in der Paket-Datenbank unter DESTDIR/var/db/pkg. Da DESTDIR mittels eines &man.chroot.8;-Aufrufs vom Ports-System automatisch gesetzt wird, brauchen Sie keine Änderungen oder besondere Pflege für DESTDIR-konforme Ports. Der Wert von PREFIX wird auf LOCALBASE gesetzt (Standard ist /usr/local). Falls USE_LINUX_PREFIX gesetzt ist, wird PREFIX LINUXBASE annehmen (Standard ist /compat/linux). Die Vermeidung der hart kodierten Angaben von /usr/local oder /usr/X11R6 im Quelltext wird den Port viel flexibler machen und erleichtert es die Anforderungen anderer Einsatzorte zu erfüllen. Für X-Ports, die imake benutzen, geschieht dies automatisch; andernfalls kann dies erreicht werden, indem alle Angaben von /usr/local (oder /usr/X11R6 für X-Ports, die nicht imake benutzen) in den verschiedenen Makefiles im Port ersetzt werden, um ${PREFIX} zu lesen, da diese Variable automatisch an jede Stufe des Build- und Install-Prozesses übergeben wird. Vergewissern Sie sich bitte, dass Ihre Anwendung nichts unter /usr/local an Stelle von PREFIX installiert. Um dies festzustellen, können Sie folgendes machen: &prompt.root; make clean; make package PREFIX=/var/tmp/$(make -V PORTNAME) Wenn etwas außerhalb von PREFIX installiert wird, so gibt der Prozess der Paketerstellung eine Meldung aus, dass es die Dateien nicht finden kann. Dies prüft nicht das Vorhandensein eines internen Verweises oder die richtige Verwendung von LOCALBASE für Verweise auf Dateien anderer Ports. Das Testen der Installation in /var/tmp/$(make -V PORTNAME) würde dies erledigen. Die Variable PREFIX kann in Ihrem Makefile oder der Umgebung des Benutzers neu gesetzt werden. Allerdings wird für einzelne Ports dringend davon abgeraten diese Variable in den Makefiles direkt zu setzen. Verweisen Sie bitte außerdem auf Programme/Dateien von anderen Ports durch die oben erwähnten Variablen und nicht mit den eindeutigen Pfadnamen. Wenn Ihr Port zum Beispiel vom Makro PAGER erwartet, dass es den vollständigen Pfadnamen von less enthält, benutzen Sie folgendes Compiler-Flag: -DPAGER=\"${LOCALBASE}/bin/less\" anstatt -DPAGER=\"/usr/local/bin/less\". Somit ist die Wahrscheinlichkeit höher, dass es auch funktioniert, wenn der Administrator den ganzen /usr/local-Baum an eine andere Stelle verschoben hat. Die Tinderbox Wenn Sie ein begeisterter Ports-Entwickler sind möchten Sie vielleicht einen Blick auf die Tinderbox werfen. Es ist ein leistungsstarkes System zur Erstellung und zum Testen von Ports, welches auf Skripten basiert, die auf Pointyhat verwendet werden. Sie können Tinderbox installieren, indem Sie den Port ports-mgmt/tinderbox benutzen. Bitte lesen Sie die mitgelieferte Dokumentation gründlich, da die Konfiguration nicht einfach ist. Um Näheres darüber zu erfahren, besuchen Sie bitte die Tinderbox Homepage. Einen Port aktualisieren Wenn Sie feststellen, dass ein Port verglichen mit der neuesten Version des Originalautors nicht mehr auf dem aktuellen Stand ist, sollten Sie als Erstes sicherstellen, dass Sie die aktuellste Version des Ports haben. Diese finden Sie im Verzeichnis ports/ports-current der FreeBSD FTP-Spiegelseiten. Wenn Sie allerdings mit mehr als ein paar Ports arbeiten, werden Sie es wahrscheinlich einfacher finden CVSup zu benutzen, um Ihre gesamte Ports-Sammlung aktuell zu halten, wie es im Handbuch beschrieben wird. Das hat zusätzlich den Vorteil, dass Sie so auch alle Abhängigkeiten des Ports aktuell halten. Der nächste Schritt besteht darin festzustellen, ob bereits eine Aktualisierung des Ports darauf wartet committet zu werden. Um das sicherzustellen haben Sie folgende Möglichkeiten. Es gibt eine durchsuchbare Schnittstelle zur FreeBSD Problembericht Datenbank (PR - Problem Report) (auch bekannt als GNATS). Wählen Sie dazu Ports im Drop-Down-Menü und geben Sie den Namen des Ports ein. Allerdings wird manchmal vergessen den Namen des Ports eindeutig im Feld für die Zusammenfassung anzugeben. In diesem Fall können Sie das FreeBSD Ports Monitoring System (auch bekannt als portsmon) nutzen. Dieses versucht PRs von Ports nach Portname zu sortieren. Um PRs nach einem bestimmten Port zu durchsuchen können Sie die Übersicht eines Ports verwenden. Wenn es keine wartenden PRs gibt, ist der nächste Schritt eine E-Mail an den Maintainer des Ports zu schicken, wie von make maintainer gezeigt wird. Diese Person arbeitet vielleicht schon an einer Aktualisierung, oder hat einen guten Grund den Port im Moment nicht zu aktualisieren (z.B. wegen Stabilitätsproblemen der neuen Version). Sie wollen sicher nicht die Arbeit des Maintainers doppelt machen. Beachten Sie bitte, dass für Ports ohne Maintainer ports@FreeBSD.org eingetragen ist. Das ist nur die allgemeine &a.ports;-Mailingliste, deshalb wird es in diesem Fall wahrscheinlich nicht helfen eine E-Mail dorthin zu schicken. Wenn Sie der Maintainer bittet die Aktualisierung zu erledigen, oder falls es keinen Maintainer gibt, haben Sie Gelegenheit FreeBSD zu helfen, indem Sie die Aktualisierung selbst bereitstellen. Bitte führen Sie die Änderungen durch und speichern Sie die Ausgabe des rekursiven diff des neuen und alten Portverzeichnisses (wenn Ihr verändertes Portverzeichnis z.B. superedit und das Original superedit.bak heißt, dann speichern Sie bitte die Ergebnisse von diff -ruN superedit.bak superedit). Sowohl vereinheitlichendes als auch kontextabhängiges diff (Auflistung der Unterschiede zweier Dateien) sind akzeptabel, aber im Allgemeinen bevorzugen Port-Committer vereinheitlichende diffs. Bitte beachten Sie die Verwendung der -N-Option. Dies ist der gebräuchliche Weg diff dazu zu bewegen korrekt damit umzugehen, neue Dateien anzulegen und alte zu löschen. Bevor Sie das diff einsenden überprüfen Sie bitte die Ausgabe, um sicherzugehen, dass die Änderungen sinnvoll sind. Um gängige Operationen mit Korrekturdateien zu vereinfachen, können Sie /usr/ports/Tools/scripts/patchtool.py benutzen. Aber lesen Sie bitte vorher /usr/ports/Tools/scripts/README.patchtool. Falls der Port keinen Maintainer hat und Sie ihn selbst aktiv benutzen, ziehen Sie bitte in Erwägung sich als Maintainer zu melden. &os; hat mehr als 2000 Ports ohne Maintainer und in diesem Bereich werden immer zusätzliche Freiwillige benötigt (Für eine ausführliche Beschreibung der Verantwortlichkeiten eines Maintainers lesen Sie bitte im Developer's Handbook nach). Der beste Weg uns das diff zu schicken ist mittels &man.send-pr.1; (Kategorie Ports). Wenn Sie der Maintainer des Ports sind, fügen Sie bitte [maintainer update] an den Anfang Ihrer Zusammenfassung und setzen Sie die Klasse des PR auf maintainer-update. Ansonsten sollte die Klasse des PR change-request sein. Bitte erwähnen Sie alle hinzugefügten oder gelöschten Dateien in der Nachricht, da diese beim Commit ausdrücklich an &man.cvs.1; übergeben werden müssen. Wenn das diff größer ist als 20 Kilobyte komprimieren und uuencoden Sie es bitte. Ansonsten können Sie es in den PR einfügen wie es ist. Bevor Sie den PR mit &man.send-pr.1; abschicken, sollten Sie den Abschnitt Den Problembericht schreiben im Artikel über Problemberichte lesen. Dieser enthält sehr viel mehr Informationen darüber, wie man nützliche Problemberichte verfasst. Wenn Sie Ihre Aktualisierung aufgrund von Sicherheitsbedenken oder eines schwerwiegenden Fehlers bereitstellen wollen, informieren Sie bitte das &a.portmgr;, um einen sofortigen Rebuild und eine Neuverteilung des Pakets Ihres Ports durchzuführen. Sonst werden ahnungslose Nutzer von &man.pkg.add.1; über mehrere Wochen die alte Version durch pkg_add -r installieren. Noch einmal: Bitte verwenden Sie &man.diff.1; und nicht &man.shar.1;, um Aktualisierungen existierender Ports zu senden. Nun, da Sie all das geschafft haben, werden Sie in nachlesen können, wie Sie den Port aktuell halten. Sicherheit der Ports Warum Sicherheit so wichtig ist Es finden sich immer wieder Fehler in Software. Die gefährlichsten davon sind wohl jene, die Sicherheitslücken öffnen. Technisch gesehen müssen diese Lücken geschlossen werden, indem die Fehler, die Sie verursacht haben, beseitigt werden. Aber die Vorgehensweisen, wie mit bloßen Fehlern und Sicherheitslücken umgegangen wird, sind sehr unterschiedlich. Ein typischer kleiner Fehler betrifft nur Nutzer, die eine bestimmte Kombination von Optionen aktiviert haben, die den Fehler auslöst. Der Entwickler wird letztendlich einen Patch herausgeben, gefolgt von einer neuen Version des Programms, die den Fehler nicht mehr enthält – jedoch wird die Mehrheit der Nutzer nicht sofort aktualisieren, da sie von diesem Fehler nicht betroffen sind. Ein kritischer Fehler, der zu Datenverlust führen kann, stellt ein schwerwiegendes Problem dar. Dennoch sind sich umsichtige Nutzer bewusst, dass Datenverlust verschiedene Ursachen – neben Softwarefehlern – haben kann, und machen deshalb Sicherungskopien wichtiger Daten. Zumal ein kritischer Fehler sehr schnell entdeckt wird. Bei einer Sicherheitslücke ist dies ganz anders. Erstens wird sie vielleicht jahrelang nicht entdeckt, da dies oftmals keine Fehlfunktion im Programm verursacht. Zweitens kann eine böswillige Person unerlaubten Zugriff auf ein unsicheres System erlangen, um empfindliche Daten zu verändern oder zu zerstören; im schlimmsten Fall findet der Nutzer nicht einmal die Ursache des Schadens. Drittens hilft der Zugriff auf ein unsicheres System dem Angreifer oft in ein anderes System einzudringen, welches ansonsten nicht gefährdet wäre. Deshalb reicht es nicht aus eine Sicherheitslücke nur zu schließen: Die Zielgruppe sollte möglichst genau und umfassend darüber informiert werden, damit sie die Gefahr einschätzen und passende Maßnahmen ergreifen können. Sicherheitslücken schliessen Bei Ports und Paketen kann eine Sicherheitslücke im ursprünglichen Programm oder in den Port-Dateien verursacht werden. Im ersten Fall wird der ursprüngliche Entwickler den Fehler wahrscheinlich umgehend korrigieren oder eine neue Version herausgeben und Sie müssen den Port nur aktualisieren und die Korrekturen des Autors beachten. Falls sich die Korrektur aus irgendeinem Grund verzögert, sollten Sie den Port als FORBIDDEN markieren oder selbst den Fehler für den Port korrigieren. Falls die Sicherheitslücke im Port verursacht wird, sollten Sie ihn sobald wie möglich berichtigen. In jedem Fall sollte die Standardvorgehensweise zum Einreichen von Änderungen beachtet werden – es sei denn, Sie haben das Recht diese direkt in den Ports-Baum zu committen. Ports-Committer zu sein ist nicht genug, um Änderungen an einem beliebigen Port zu committen. Bitte denken Sie daran, dass Ports üblicherweise Maintainer haben, die Sie respektieren sollten. Bitte stellen Sie sicher, dass die Revision des Ports erhöht wird, sobald die Sicherheitslücke geschlossen wurde. Dadurch sehen die Nutzer, die installierte Pakete regelmäßig aktualisieren, dass es an der Zeit ist eine Aktualisierung durchzuführen. Außerdem wird ein neues Paket gebaut, über FTP– und WWW-Spiegel verteilt und die unsichere Version damit verdrängt. PORTREVISION sollte erhöht werden – es sei denn, PORTREVISION hat sich im Laufe der Korrektur des Fehlers geändert. Das heißt, Sie sollten PORTREVISION erhöhen, wenn Sie eine Korrektur hinzugefügt haben. Sie sollten diese aber nicht erhöhen, wenn Sie den Port auf die neueste Version des Programms gebracht haben und PORTREVISION somit schon verändert wurde. Bitte beachten Sie den betreffenden Abschnitt für weitere Informationen. Die Community informiert halten Die VuXML-Datenbank Ein sehr wichtiger und dringender Schritt, den man unternehmen muss, sobald eine Sicherheitslücke entdeckt wurde, ist die Gemeinschaft der Anwender des Ports über die Gefahr zu informieren. Diese Benachrichtigung hat zwei Gründe. Erstens wird es sinnvoll sein, wenn die Gefahr wirklich so groß ist, sofort Abhilfe zu schaffen, indem man z.B. den betreffenden Netzwerkdienst beendet oder den Port komplett deinstalliert, bis die Lücke geschlossen wurde. Und Zweitens pflegen viele Nutzer installierte Pakete nur gelegentlich zu aktualisieren. Sie werden aus der Mitteilung erfahren, dass Sie das Paket, sobald eine Korrektur verfügbar ist, sofort aktualisieren müssen. Angesichts der riesigen Zahl an Ports kann nicht für jeden Vorfall ein Sicherheitshinweis erstellt werden, ohne durch die Flut an Nachrichten die Aufmerksamkeit der Empfänger zu verlieren, im Laufe der Zeit kommt es so zu ernsten Problemen. Deshalb werden Sicherheitslücken von Ports in der FreeBSD VuXML-Datenbank aufgezeichnet. Das Team der Sicherheitsverantwortlichen beobachtet diese wegen Angelegenheiten, die Ihr Eingreifen erfordern. Wenn Sie Committerrechte haben, können Sie die VuXML-Datenbank selbst aktualisieren. Auf diese Weise helfen Sie den Sicherheitsverantwortlichen und liefern die kritischen Informationen frühzeitig an die Community. Aber auch wenn Sie kein Committer sind und glauben, Sie haben eine außergewöhnlich schwerwiegende Lücke gefunden – egal welche – zögern Sie bitte nicht die Sicherheitsverantwortlichen zu kontaktieren, wie es in den FreeBSD Sicherheitsinformationen beschrieben wird. In Ordnung, Sie haben sich also für den schwierigen Weg entschieden. Wie vielleicht aus dem Titel hervorgeht, ist die VuXMl-Datenbank hauptsächlich ein XML-Dokument. Die Quelldatei vuln.xml können Sie im Port security/vuxml finden. Deshalb wird der komplette Pfadname PORTSDIR/security/vuxml/vuln.xml lauten. Jedes Mal, wenn Sie eine Sicherheitslücke in einem Port entdecken, fügen Sie bitte einen Eintrag dafür in diese Datei ein. Solange Sie nicht mit VuXML vertraut sind, ist es das Beste, was Sie machen können, einen vorhandenen Eintrag, der zu Ihrem Fall passt, zu kopieren und als Vorlage zu verwenden. Eine kurze Einführung in VuXML Das komplette XML ist komplex und würde den Rahmen dieses Buches sprengen. Allerdings benötigen Sie für einen grundlegenden Einblick in die Struktur eines VuXML-Eintrags nur eine Vorstellung der Tags. XML-Tags bestehen aus Namen, die in spitzen Klammern eingeschlossen sind. Zu jedem öffnenden <Tag> muss ein passendes </Tag> existieren. Tags können geschachtelt werden. Wenn sie geschachtelt werden müssen die inneren Tags vor den Äußeren geschlossen werden. Es gibt eine Hierarchie von Tags – das heißt komplexere Regeln zur Schachtelung. Klingt so ähnlich wie HTML, oder? Der größte Unterschied ist: XML ist erweiterbar (eXtensible) – das heißt es basiert darauf maßgeschneiderte Tags zu definieren. Aufgrund seiner wesentlichen Struktur bringt XML ansonsten formlose Daten in eine bestimmte Form. VuXML ist speziell darauf zugeschnitten Beschreibungen von Sicherheitslücken zu verwalten. Lassen Sie uns nun einen realistischen VuXML-Eintrag betrachten: <vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"> <topic>Several vulnerabilities found in Foo</topic> <affects> <package> <name>foo</name> <name>foo-devel</name> <name>ja-foo</name> <range><ge>1.6</ge><lt>1.9</lt></range> <range><ge>2.*</ge><lt>2.4_1</lt></range> <range><eq>3.0b1</eq></range> </package> <package> <name>openfoo</name> <range><lt>1.10_7</lt></range> <range><ge>1.2,1</ge><lt>1.3_1,1</lt></range> </package> </affects> <description> <body xmlns="http://www.w3.org/1999/xhtml"> <p>J. Random Hacker reports:</p> <blockquote cite="http://j.r.hacker.com/advisories/1"> <p>Several issues in the Foo software may be exploited via carefully crafted QUUX requests. These requests will permit the injection of Bar code, mumble theft, and the readability of the Foo administrator account.</p> </blockquote> </body> </description> <references> <freebsdsa>SA-10:75.foo</freebsdsa> <freebsdpr>ports/987654</freebsdpr> <cvename>CAN-2010-0201</cvename> <cvename>CAN-2010-0466</cvename> <bid>96298</bid> <certsa>CA-2010-99</certsa> <certvu>740169</certvu> <uscertsa>SA10-99A</uscertsa> <uscertta>SA10-99A</uscertta> <mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> <url>http://j.r.hacker.com/advisories/1</url> </references> <dates> <discovery>2010-05-25</discovery> <entry>2010-07-13</entry> <modified>2010-09-17</entry> </dates> </vuln> Die Namen der Tags sollten selbsterklärend sein  – also werfen wir einen genaueren Blick auf die Felder, die Sie selbst ausfüllen müssen: Dies ist die höchste Tag-Ebene eines VuXML-Eintrags. Es ist ein vorgeschriebenes Attribut vid, welches eine allgemein einzigartige Kennung (universally unique identifier, UUID) in Anführungszeichen für diesen Eintrag festlegt. Sie sollten eine UUID für jeden neuen VuXML-Eintrag erzeugen (und vergessen Sie nicht die UUID der Vorlage zu ersetzen, es sei denn, Sie schreiben den Eintrag von Grund auf selbst). Sie können &man.uuidgen.1; verwenden, um eine VuXML UUID zu erzeugen. Wahlweise können Sie, wenn Sie FreeBSD 4.x verwenden, den Port devel/p5-Data-UUID verwenden und folgenden Befehl aufrufen: perl -MData::UUID -le 'print lc new Data::UUID->create_str' Dies ist eine einzeilige Beschreibung des gefundenen Fehlers. Hier werden die Namen betroffener Pakete aufgeführt. Es können mehrere Namen angegeben werden, da mehrere Pakete von einem einzigen Master-Port oder Software-Produkt abhängen können. Das schließt Stable– und Developement-Zweige, lokalisierte Versionen und Slave-Ports ein, die verschiedene Auswahlmöglichkeiten wichtiger Kompilierungszeit-Optionen bieten. Es liegt in Ihrer Verantwortung all diese betroffenen Pakete zu finden, wenn Sie den VuXML-Eintrag schreiben.Behalten Sie im Hinterkopf, dass make search name=foo Ihr Freund ist. Die wichtigsten Punkte, auf die Sie achten sollten, sind die folgenden: die foo-devel Variante eines foo Ports; andere Varianten mit einem Suffix wie -a4 (für Druck-betreffende Pakete), -without-gui (für Pakete mit deaktivierter X-Unterstützung) oder ähnliche jp-, ru-, zh- und andere, eventuell lokalisierte, Varianten in den entsprechenden Länderkategorien der Ports-Sammlung Betroffene Versionen der Pakete werden hier als ein Bereich oder mehrere durch eine Kombination aus <lt>, <le> , <eq>, <ge>, und <gt>-Elementen ausgegeben. Die angegebenen Bereiche sollten sich nicht überschneiden. In einer Bereichsangabe steht * (Asterisk) für die kleinste Versionsnummer. Insbesondere ist 2.* kleiner als 2.a. Deshalb kann ein Stern benutzt werden, um auf alle möglichen Alpha -, Beta– und RC -Versionen zuzutreffen. Zum Beispiel passt <ge>2.*</ge><lt>3.* </lt> auf alle Versionen der Form 2.x, während <ge> 2.0</ge><lt>3.0</lt> das nicht erfüllt, da es nicht auf 2.r3 passt, auf 3.b aber schon. Das obige Beispiel legt fest, dass Versionen von 1.6 bis 1.9 betroffen sind – außerdem Versionen 2.x vor 2.4_1 und Version 3.0b1. Mehrere zusammenhängende Gruppen von Paketen (im wesentlichen Ports) können im Abschnitt <affected> aufgeführt werden. Das kann man benutzen, wenn sich Programme (sagen wir FooBar, FreeBar und OpenBar) denselben Quelltext als Grundlage haben und sich noch dessen Fehler und Sicherheitslücken teilen. Beachten Sie den Unterschied zum Anführen mehrerer Namen innerhalb eines <package> Abschnittes. Die Versionsbereiche sollten, wenn möglich, sowohl PORTEPOCH als auch PORTREVISION erlauben. Bitte denken Sie daran, dass gemäß der Vergleichsregeln eine Version mit einer PORTEPOCH, die nicht Null ist, größer ist als jede Version ohne PORTEPOCH. Das heißt, 3.0,1 ist größer als 3.1 oder sogar 8.9. Das ist die Zusammenfassung des Problems. In diesem Feld wird XHTML verwendet. Zumindest umschließende <p> und </p> sollten auftauchen. Komplexere Tags sind zwar möglich, aber sollten nur um der Genauigkeit und Klarheit willen verwendet werden: Bitte verwenden Sie hier kein Eye-Candy. Dieser Abschnitt enthält Verweise auf relevante Dokumente. Es wird empfohlen so viele Referenzen wie nötig aufzuführen. Das ist ein FreeBSD Sicherheitshinweis. Das ist ein FreeBSD Problembericht. Das ist eine Mitre CVE Kennung. Das ist eine SecurityFocus Fehler-Kennung. Das ist ein Sicherheitshinweis von US-CERT. Das ist eine Mitteilung über eine Schwachstelle von US-CERT. Das ist ein Cyber-Sicherheitsalarm von US-CERT. Das ist ein technischer Cyber-Sicherheitsalarm von US-CERT. Das ist eine URL zu einem archivierten Posting auf einer Mailingliste. Das Attribut msgid ist optional und gibt die Nachrichtenkennung des Postings an. Das ist eine gewöhnliche URL. Sie sollte nur verwendet werden, wenn keine der anderen Referenzkategorien verfügbar ist. Das ist das Datum, an dem die Sicherheitslücke bekannt wurde (JJJJ-MM-TT). Das ist das Datum, an dem der Eintrag hinzugefügt wurde (JJJJ-MM-TT). Das ist das Datum, an dem zuletzt irgendeine Information des Eintrags verändert wurde (JJJJ-MM-TT). Neue Einträge dürfen dieses Feld nicht enthalten. Es sollte beim Editieren eines existierenden Eintrags eingefügt werden. Ihre Änderungen an der VuXML-Datenbank testen Nehmen wir an, Sie haben gerade einen Eintrag für eine Sicherheitslücke in dem Paket clamav geschrieben oder ausgefüllt, die in der Version 0.65_7 korrigiert wurde. Als Voraussetzung sollten Sie eine neue Version der Ports ports-mgmt/portaudit und ports-mgmt/portaudit-db installieren. Zuerst überprüfen Sie bitte, ob bereits ein Eintrag für diese Schwachstelle existiert. Wenn es einen solchen Eintrag gibt, sollte er auf die vorige Version 0.65_6 zutreffen: &prompt.user; packaudit &prompt.user; portaudit clamav-0.65_6 Um packaudit auszuführen, müssen Sie die Berechtigung haben DATABASEDIR zu schreiben – üblicherweise ist das /var/db/portaudit. Wenn keine vorhandenen Einträge gefunden werden haben Sie grünes Licht einen neuen Eintrag für diese Sicherheitslücke anzulegen. Sie können nun eine neue UUID erzeugen (wir nehmen an, diese lautet 74a9541d-5d6c-11d8-80e3-0020ed76ef5a) und einen neuen Eintrag in der VuXML-Datenbank anlegen. Bitte überprüfen Sie danach die Syntax mit folgendem Befehl: &prompt.user; cd ${PORTSDIR}/security/vuxml && make validate Sie werden zumindest eines der folgenden Pakete benötigen: textproc/libxml2, textproc/jade. Jetzt bauen Sie bitte die portaudit-Datenbank aus der VuXML-Datei neu: &prompt.user; packaudit Um sicherzustellen, dass der Abschnitt <affected> Ihres Eintrags die richtigen Pakete betrifft, verwenden Sie bitte den folgenden Befehl: &prompt.user; portaudit -f /usr/ports/INDEX -r 74a9541d-5d6c-11d8-80e3-0020ed76ef5a Bitte lesen Sie in &man.portaudit.1; nach, um ein besseres Verständnis der Befehlssyntax zu entwickeln. Bitte stellen Sie sicher, dass Ihr Eintrag keine falschen Treffer in der Ausgabe erzeugt. Jetzt überprüfen Sie bitte, dass Ihr Eintrag die richtigen Versionen des Pakets angibt: &prompt.user; portaudit clamav-0.65_6 clamav-0.65_7 Affected package: clamav-0.65_6 (matched by clamav<0.65_7) Type of problem: clamav remote denial-of-service. Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html> 1 problem(s) found. Offensichtlich sollte die erste Version ausgegeben werden – die zweite jedoch nicht. Abschließend überprüfen Sie bitte, ob die Webseite, die aus der VuXML-Datenbank erzeugt wird, wie erwartet aussieht: &prompt.user; mkdir -p ~/public_html/portaudit &prompt.user; packaudit &prompt.user; lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html Was man machen respektive vermeiden sollte Einführung Hier ist eine Liste von gebräuchlichen Dos and Don'ts (Dinge, die man machen oder vermeiden sollte), welchen Sie während des Portierungsprozesses begegnen werden. Sie sollten Ihren Port anhand dieser Liste überprüfen. Sie können auch Ports in der PR Datenbank, welche andere Menschen eingereicht haben, kontrollieren. Senden Sie bitte Kommentare zu Ports, die Sie verifizieren wie unter Bug Reports and General Commentary beschrieben. Der Abgleich von Ports aus der PR-Datenbank hilft uns diese schneller zu committen, und zeigt auch, dass Sie wissen, worum es geht. <makevar>WRKDIR</makevar> Schreiben Sie in keine Dateien außerhalb von WRKDIR. WRKDIR ist der einzige Ort, welcher während des Erstellen des Ports garantiert beschreibbar ist (siehe Ports Installieren von CDROM für ein Beispiel, um Ports in einem schreibgeschützen Zweig zu erstellen). Wenn Sie eine der pkg-* Dateien modifizieren müssen, sollten Sie eine Variable erneut definieren, anstatt die Datei zu überschreiben. <makevar>WRKDIRPREFIX</makevar> Vergewissern Sie sich, dass Ihr Port WRKDIRPREFIX beachtet. Die meisten Ports sollten sich darüber keine Sorgen machen. Beachten Sie bitte, falls auf WRKDIR eines anderen Ports verwiesen wird, dass die korrekte Position WRKDIRPREFIXPORTSDIR/subdir/name/work, und nicht etwa PORTSDIR/subdir/name/work, .CURDIR/../../subdir/name/work oder ähnliches ist. Falls Sie WRKDIR selbst definieren, sollten Sie sicherstellen, dass Sie ${WRKDIRPREFIX}${.CURDIR} am Anfang anfügen. Unterschiedliche Betriebssysteme und Betriebssystemversionen Sie können auf Quelltext treffen, welcher Modifizierungen oder bedingtes Kompilieren, abhängig davon, unter welcher Unix-Version er läuft, benötigt. Falls Sie Änderungen an solch einem Quelltext vornehmen müssen, stellen Sie bitte sicher, dass Sie Ihre Änderungen so allgemein wie möglich halten, damit wir den Quelltext auf ältere FreeBSD-Systeme portieren und zur Quer-Portierung auf andere BSD-Systeme, wie etwa 4.4BSD von CSRG, BSD/386, 386BSD, NetBSD und OpenBSD verwenden können. Der bevorzugte Weg, um 4.3BSD/Reno (1990) und neuere Versionen des BSD-Quelltextes zu unterscheiden, ist das BSD-Makro zu nutzen, welches in sys/param.h definiert ist. Hoffentlich ist diese Datei schon enthalten – falls nicht, so fügen Sie folgenden Quelltext: #if (defined(__unix__) || defined(unix)) && !defined(USG) #include <sys/param.h> #endif an der richtigen Stelle in der .c Datei hinzu. Wir glauben, dass jedes System, welches diese beiden Symbole definiert, die Datei sys/param.h besitzt. Wenn Sie auf Systeme stoßen, wo dies nicht so ist, würden wir gerne davon erfahren. Bitte senden Sie eine E-Mail an &a.ports;. Eine andere Möglichkeit zur Unterscheidung ist der GNU Autoconf-Stil: #ifdef HAVE_SYS_PARAM_H #include <sys/param.h> #endif Vergessen Sie nicht -DHAVE_SYS_PARAM_H zu den CFLAGS im Makefile hinzuzufügen, falls Sie diese Methode benutzen sollten. Sobald Sie sys/param.h hinzugefügt haben, können Sie mit Hilfe von #if (defined(BSD) && (BSD >= 199103)) unterscheiden, ob der Quelltext auf einer 4.3 Net2 Code-Basis oder neuer (z.B. FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 und niedriger) kompiliert werden wird. Benutzen Sie: #if (defined(BSD) && (BSD >= 199306)) um zu differenzieren, ob der Quelltext auf der Basis von 4.4 Code oder neuer (z.B. FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0 oder höher) kompiliert werden wird. Der Wert des BSD-Makros ist 199506 für die 4.4BSD-Lite2 Codebasis. Beachten Sie bitte, dass dies hier nur der Information wegen angegeben ist. Das Makro sollte nicht dazu benutzt werden, um zwischen Versionen von FreeBSD, welche auf 4.4-Lite basieren, und Versionen, welche Änderungen von 4.4-Lite2 übernommen haben, zu unterscheiden. Das __FreeBSD__ Makro sollte stattdessen verwandt werden. Sparsam sollte eingesetzt werden: __FreeBSD__ ist in allen Versionen von FreeBSD definiert. Benutzen Sie dieses Makro, falls die Änderung(en), die Sie machen, nur FreeBSD betrifft. Portierungsfallen, wie der Gebrauch von sys_errlist[] gegenüber strerror() sind Berkeley-Eigenheiten, keine FreeBSD Änderungen. In FreeBSD 2.x, ist __FreeBSD__ auf 2 definiert. In älteren Versionen, ist es 1. Alle späteren Versionen erhöhen es, damit es mit der Haupt-Versionsnummer übereinstimmt. Falls Sie zwischen einem FreeBSD 1.x und einem FreeBSD 2.x (oder höher) System unterscheiden müssen, ist es normalerweise richtig, die BSD-Makros (wie oben beschrieben) zu benutzen. Gibt es tatsächlich eine FreeBSD-spezifische Änderung (wie z.B. spezielle Optionen von Shared-Libraries für ld), ist es nicht zu beanstanden __FreeBSD__ und #if __FreeBSD__ > 1 zu nutzen, um FreeBSD 2.x und spätere Systeme zu erkennen. Falls Sie eine höhere Genauigkeit benötigen, um FreeBSD Systeme seit 2.0-RELEASE zu erkennen, können Sie folgendes nutzen: #if __FreeBSD__ >= 2 #include <osreldate.h> # if __FreeBSD_version >= 199504 /* 2.0.5+ release specific code here */ # endif #endif In den Tausenden von Ports, die bis jetzt erstellt wurden, gab es nur ein oder zwei Fälle, in denen __FreeBSD__ hätte benutzt werden sollen. Nur weil ein früherer Port es an der falschen Stelle benutzt hatte, bedeutet das nicht, dass Sie dies auch machen sollten. __FreeBSD_version Werte Hier ist eine praktische Liste von __FreeBSD_version-Werten wie in sys/param.h definiert: __FreeBSD_version-Werte Wert Datum Release 119411 2.0-RELEASE 199501, 199503 19. März 1995 2.1-CURRENT 199504 9. April 1995 2.0.5-RELEASE 199508 26. August 1995 2.2-CURRENT vor 2.1 199511 10. November 1995 2.1.0-RELEASE 199512 10. November 1995 2.2-CURRENT vor 2.1.5 199607 10. Juli 1996 2.1.5-RELEASE 199608 12. Juli 1996 2.2-CURRENT vor 2.1.6 199612 15. November 1996 2.1.6-RELEASE 199612 2.1.7-RELEASE 220000 19. Februar 1997 2.2-RELEASE (nicht geändert) 2.2.1-RELEASE (nicht geändert) 2.2-STABLE nach 2.2.1-RELEASE 221001 15. April 1997 2.2-STABLE nach texinfo-3.9 221002 30. April 1997 2.2-STABLE nach top 222000 16. Mai 1997 2.2.2-RELEASE 222001 19. Mai 1997 2.2-STABLE nach 2.2.2-RELEASE 225000 2. Oktober 1997 2.2.5-RELEASE 225001 20. November 1997 2.2-STABLE nach 2.2.5-RELEASE 225002 27. Dezember 1997 2.2-STABLE nach der Aufnahme von ldconfig -R 226000 24. März 1998 2.2.6-RELEASE 227000 21. Juli 1998 2.2.7-RELEASE 227001 21. Juli 1998 2.2-STABLE nach 2.2.7-RELEASE 227002 19. September 1998 2.2-STABLE nach &man.semctl.2; Änderung 228000 29. November 1998 2.2.8-RELEASE 228001 29. November 1998 2.2-STABLE nach 2.2.8-RELEASE 300000 19. Februar 1996 3.0-CURRENT vor &man.mount.2; Änderung 300001 24. September 1997 3.0-CURRENT nach &man.mount.2; Änderung 300002 2. Juni 1998 3.0-CURRENT nach &man.semctl.2; Änderung 300003 7. Juni 1998 3.0-CURRENT nach ioctl arg Änderungen 300004 3. September 1998 3.0-CURRENT nach ELF-Konvertierung 300005 16. Oktober 1998 3.0-RELEASE 300006 16. Oktober 1998 3.0-CURRENT nach 3.0-RELEASE 300007 22. Januar 1999 3.0-STABLE nach 3/4 Zweig 310000 9. Februar 1999 3.1-RELEASE 310001 27. März 1999 3.1-STABLE nach 3.1-RELEASE 310002 14. April 1999 3.1-STABLE nach Änderung der C++ Konstruktor/Destruktor-Reihenfolge 320000 3.2-RELEASE 320001 8. Mai 1999 3.2-STABLE 320002 29. August 1999 3.2-STABLE nach binär-inkompatibler IPFW und Socket-Änderungen 330000 2. September 1999 3.3-RELEASE 330001 16. September 1999 3.3-STABLE 330002 24. November 1999 3.3-STABLE nach Hinzufügen von &man.mkstemp.3; zur libc 340000 5. Dezember 1999 3.4-RELEASE 340001 17. Dezember 1999 3.4-STABLE 350000 20. Juni 2000 3.5-RELEASE 350001 12. Juli 2000 3.5-STABLE 400000 22. Januar 1999 4.0-CURRENT nach 3.4 Zweig 400001 20. Februar 1999 4.0-CURRENT nach der Änderung im Verhalten des dynamischen Linkers. 400002 13. März 1999 4.0-CURRENT nach Änderung der C++ Konstruktor/Destruktor Reihenfolge. 400003 27. März 1999 4.0-CURRENT nach funktionierendem &man.dladdr.3;. 400004 5. April 1999 4.0-CURRENT nach der __deregister_frame_info Fehlerbehebung für den dynamischen Linker (auch 4.0-CURRENT nach EGCS 1.1.2 Integration). 400005 27. April 1999 4.0-CURRENT nach &man.suser.9; API Änderung (auch 4.0-CURRENT nach newbus). 400006 31. Mai 1999 4.0-CURRENT nach Änderung der cdevsw-Registrierung. 400007 17. Juni 1999 4.0-CURRENT nach Hinzufügen von so_cred für Zugangsberechtigungen auf Socket-Ebene. 400008 20. Juni 1999 4.0-CURRENT nach Hinzufügen eines poll Syscall-Wrappers zur libc_r. 400009 20. Juli 1999 4.0-CURRENT nach der Änderung des Kernel dev_t-Typs zum struct specinfo-Zeiger. 400010 25. September 1999 4.0-CURRENT nach dem Beseitigen eines Fehlers in &man.jail.2;. 400011 29. September 1999 4.0-CURRENT nach der sigset_t Datentyp Änderung. 400012 15. November 1999 4.0-CURRENT nach dem Wechsel zum GCC 2.95.2-Compiler. 400013 4. Dezember 1999 4.0-CURRENT nach Hinzufügen der erweiterbaren Linux Mode ioctl-Routinen. 400014 18. Januar 2000 4.0-CURRENT nach dem OpenSSL-Import. 400015 27. Januar 2000 4.0-CURRENT nach der C++ ABI Änderung in GCC 2.95.2 von -fvtable-thunks zu -fno-vtable-thunks als Standard. 400016 27. Februar 2000 4.0-CURRENT nach OpenSSH-Import. 400017 13. März 2000 4.0-RELEASE 400018 17. März 2000 4.0-STABLE nach 4.0-RELEASE 400019 5. Mai 2000 4.0-STABLE nach der Einführung von verzögerten Prüfsummen. 400020 4. Juni 2000 4.0-STABLE nach dem Einpflegen des libxpg4-Quelltextes in die libc. 400021 8. Juli 2000 4.0-STABLE nach der Aktualisierung von Binutils auf 2.10.0, Änderungen der binären ELF-Markierungen, Aufnahme von tcsh ins Basissystem. 410000 14. Juli 2000 4.1-RELEASE 410001 29. Juli 2000 4.1-STABLE nach 4.1-RELEASE 410002 16. September 2000 4.1-STABLE nachdem &man.setproctitle.3; von der libutil in die libc verschoben wurde. 411000 25. September 2000 4.1.1-RELEASE 411001 4.1.1-STABLE nach 4.1.1-RELEASE 420000 31. Oktober 2000 4.2-RELEASE 420001 10. Januar 2001 4.2-STABLE nach Kombinaion von libgcc.a und libgcc_r.a und zugehörigen Änderungen der GCC-Bindungen. 430000 6. März 2001 4.3-RELEASE 430001 18. Mai 2001 4.3-STABLE nach der Einführung von wint_t. 430002 22. Juli 2001 4.3-STABLE nach dem Einpflegen der PCI Stromstatus-API. 440000 1. August 2001 4.4-RELEASE 440001 23. Oktober 2001 4.4-STABLE nach der Einführung von d_thread_t. 440002 4. November 2001 4.4-STABLE nach den Änderungen der mount-Struktur (betrifft Dateisystem-Kernelmodule). 440003 18. Dezember 2001 4.4-STABLE nachdem die Userland-Komponenten von smbfs importiert worden sind. 450000 20. Dezember 2001 4.5-RELEASE 450001 24. Februar 2002 4.5-STABLE nach der Umbenennung von Elementen der USB-Struktur. 450004 16. April 2002 4.5-STABLE nachdem die sendmail_enable &man.rc.conf.5; Variable geändert worden ist, um den Wert NONE zu akzeptieren. 450005 27. April 2002 4.5-STABLE nachdem XFree86 4 als Standard zum Bauen der Pakete benutzt wird. 450006 1. Mai 2002 4.5-STABLE nach dem Reparieren des Empfangsfilters, welcher anfällig für einfache DoS-Attacken war. 460000 21. Juni 2002 4.6-RELEASE 460001 21. Juni 2002 4.6-STABLE &man.sendfile.2; repariert, um mit der Dokumentation übereinzustimmen, und nicht mehr die Anzahl der gesendeten Header mit der Anzahl der Daten, welche aus der Datei geschickt werden, gegenzurechnen. 460002 19. Juli 2002 4.6.2-RELEASE 460100 26. Juni 2002 4.6-STABLE 460101 26. Juni 2002 4.6-STABLE nach dem Einfließen von `sed -i' aus CURRENT. 460102 1. September 2002 4.6-STABLE nach dem Einfließen von vielen neuen pkg_install-Funktionen aus HEAD (HEAD = die aktuellste und letzte Version des Quellverzeichnisbaumes). 470000 8. Oktober 2002 4.7-RELEASE 470100 9. Oktober 2002 4.7-STABLE 470101 10. November 2002 Beginn von generierten __std{in,out,err}p Referenzen statt __sF. Dies ändert std{in,out,err} von einem Ausdruck während des Kompilierens zu einem Laufzeitausdruck. 470102 23. Januar 2003 4.7-STABLE nach dem Einfliessen von mbuf-Änderungen, um m_aux mbufs mit denen von m_tag zu ersetzen 470103 14. Februar 2003 4.7-STABLE erhält OpenSSL 0.9.7 480000 30. März 2003 4.8-RELEASE 480100 5. April 2003 4.8-STABLE 480101 22. Mai 2003 4.8-STABLE nachdem &man.realpath.3; Thread-sicher gemacht wurde. 480102 10. August 2003 4.8-STABLE Änderung der 3ware-API in twe. 490000 27. Oktober 2003 4.9-RELEASE 490100 27. Oktober 2003 4.9-STABLE 490101 8. Januar 2004 4.9-STABLE nachdem e_sid zu der Struktur kinfo_eproc hinzugefügt wurde. 490102 4. Februar 2004 4.9-STABLE nach dem Einfliessen der libmap-Funktionalität für rtld. 491000 25. Mai 2004 4.10-RELEASE 491100 1. Juni 2004 4.10-STABLE 491101 11. August 2004 4.10-STABLE nach dem Einfliessen von Revision 20040629 der Paket-Werkzeuge aus CURRENT. 491102 16. November 2004 4.10-STABLE nach der Fehlerbehebung in der VM, um das Freigeben von fiktiven Speicherseiten korrekt zu handhaben. 492000 17. Dezember 2004 4.11-RELEASE 492100 17. Dezember 2004 4.11-STABLE 492101 18. April 2006 4.11-STABLE nach dem Hinzufügen von libdata/ldconfig Verzeichnissen zu den mtree-Dateien. 500000 13. März 2000 5.0-CURRENT 500001 18. April 2000 5.0-CURRENT nach Hinzufügen von zusätzlichen Feldern in den ELF-Headern und Ändern der Methode zur ELF-Markierung von Binärdateien. 500002 2. Mai 2000 5.0-CURRENT nach kld-Metadaten Änderungen. 500003 18. Mai 2000 5.0-CURRENT nach buf/bio Änderungen. 500004 26. Mai 2000 5.0-CURRENT nach binutils Aktualisierung. 500005 3. Juni 2000 5.0-CURRENT nach dem Einfliessen des libxpg4 Quelltextes in die libc und der Einführung der TASKQ-Schnittstelle. 500006 10. Juni 2000 5.0-CURRENT nach dem Hinzufügen der AGP-Schnittstellen. 500007 29. Juni 2000 5.0-CURRENT nach der Aktualisierung von Perl auf Version 5.6.0. 500008 7. Juli 2000 5.0-CURRENT nach der Aktualisierung des KAME-Quelltextes zu den 2000/07-Quellen. 500009 14. Juli 2000 5.0-CURRENT nach ether_ifattach() und ether_ifdetach() Änderungen. 500010 16. Juli 2000 5.0-CURRENT nachdem die mtree-Standards zurück zur ursprünglichen Variante geändert wurden; -L hinzugefügt, um Symlinks zu folgen. 500011 18. Juli 2000 5.0-CURRENT nachdem die kqueue-API geändert worden ist. 500012 2. September 2000 5.0-CURRENT nachdem &man.setproctitle.3; von libutil nach libc verschoben worden ist. 500013 10. September 2000 5.0-CURRENT nach dem ersten SMPng-Commit. 500014 4. Januar 2001 5.0-CURRENT nachdem <sys/select.h> nach <sys/selinfo.h> verschoben worden ist. 500015 10. Januar 2001 5.0-CURRENT nach dem Kombinieren von libgcc.a und libgcc_r.a und damit verbundene Änderungen an GCC-Bindungen. 500016 24. Januar 2001 5.0-CURRENT nach der Änderung das Zusammenbinden von libc und libc_r zu erlauben, womit die -pthread Option veraltet ist. 500017 18. Februar 2001 5.0-CURRENT nach dem Umschalten von struct ucred zu struct xucred, um die vom Kernel exportierte API für mount u.a.zu stabilisieren. 500018 24. Februar 2001 5.0-CURRENT nach dem Hinzufügen der CPUTYPE make Variable zum Kontrollieren von CPU-spezifischen Optimierungen. 500019 9. Juni 2001 5.0-CURRENT nach dem Verschieben von machine/ioctl_fd.h nach sys/fdcio.h 500020 15. Juni 2001 5.0-CURRENT nach der Umbenennung der locale-Namen. 500021 22. Juni 2001 5.0-CURRENT nach dem Bzip2-Import. Kennzeichnet auch, dass S/Key entfernt wurde. 500022 12. Juli 2001 5.0-CURRENT nach SSE Unterstützung. 500023 14. September 2001 5.0-CURRENT nach KSE-Meilenstein 2. 500024 1. Oktober 2001 5.0-CURRENT nach d_thread_t, und nachdem UUCP in die Ports verschoben worden ist. 500025 4. Oktober 2001 5.0-CURRENT nach Änderungen in der ABI bei der Weitergabe von Deskriptoren und Berechtigungen auf 64 Bit Plattformen. 500026 9. Oktober 2001 5.0-CURRENT nachdem XFree86 4 als Standard zum Erstellen der Pakete benutzt wird und die neue libc strnstr()-Funktion hinzugefügt wurde. 500027 10. Oktober 2001 5.0-CURRENT nachdem die neue libc strcasestr()-Funktion hinzugefügt wurde. 500028 14. Dezember 2001 5.0-CURRENT nachdem die Userland-Komponenten von smbfs importiert wurden. (nicht geändert) 5.0-CURRENT nachdem die neuen C99-Ganzzahlen mit spezifischer Breite hinzugefügt wurden. 500029 29. Januar 2002 5.0-CURRENT nachdem eine Änderung im Rückgabewert von &man.sendfile.2; gemacht wurde. 500030 15. Februar 2002 5.0-CURRENT nach der Einführung des Types fflags_t, welches die passende Größe für Dateiflags hat. 500031 24. Februar 2002 5.0-CURRENT nach der Umbenennung der USB elements-Struktur. 500032 16. März 2002 5.0-CURRENT nach der Einführung von Perl 5.6.1. 500033 3. April 2002 5.0-CURRENT nachdem die sendmail_enable &man.rc.conf.5; Variable geändert worden ist, um den Wert NONE zu akzeptieren. 500034 30. April 2002 5.0-CURRENT nachdem mtx_init() einen dritten Parameter entgegen nimmt. 500035 13. Mai 2002 5.0-CURRENT mit GCC 3.1. 500036 17. Mai 2002 5.0-CURRENT ohne Perl in /usr/src 500037 29. Mai 2002 5.0-CURRENT nach dem Hinzufügen von &man.dlfunc.3; 500038 24. Juli 2002 5.0-CURRENT nachdem die Typen von einigen Elementen der sockbuf-Struktur geändert wurden und nachdem die Struktur neu geordnet wurde. 500039 1. September 2002 5.0-CURRENT nach dem GCC 3.2.1 Import. Und auch nachdem die Header nicht mehr _BSD_FOO_T_ sondern _FOO_T_DECLARED benutzen. Dieser Wert kann auch als konservative Schätzung für den Beginn der Unterstützung des &man.bzip2.1; Pakets verwendet werden. 500040 20. September 2002 5.0-CURRENT nachdem verschiedene Änderungen an Plattenfunktionen gemacht wurden, um die Anhängigkeit von Interna der disklabel-Struktur zu entfernen. 500041 1. Oktober 2002 5.0-CURRENT nach dem Hinzufügen von &man.getopt.long.3; zur libc. 500042 15. Oktober 2002 5.0-CURRENT nach der Aktualisierung von Binutils auf 2.13, bei denen die FreeBSD-Emulation, vec und das Ausgabeformat geändert wurden. 500043 1. November 2002 5.0-CURRENT nach dem Hinzufügen schwacher pthread_XXX Stubs zur libc, womit libXThrStub.so veraltet ist. 5.0-RELEASE. 500100 17. Januar 2003 5.0-CURRENT nach dem Erstellen des RELENG_5_0-Zweiges 500101 19. Februar 2003 <sys/dkstat.h> ist leer und sollte nicht inkludiert werden. 500102 25. Februar 2003 5.0-CURRENT nach der Änderung in der d_mmap_t-Schnittstelle. 500103 26. Februar 2003 5.0-CURRENT nachdem taskqueue_swi geädert wurde, um ohne Giant zu arbeiten, und taskqueue_swi_giant hinzugefügt wurde, um Giant zu verwenden. 500104 27. Februar 2003 cdevsw_add() und cdevsw_remove() gibt es nicht länger. Auftauchen der MAJOR_AUTO-Allokationsmöglichkeit. 500105 4. März 2003 5.0-CURRENT nach der neuen cdevsw-Initialisierungsmethode. 500106 8. März 2003 devstat_add_entry() wurde durch devstat_new_entry() ersetzt. 500107 15. März 2003 Devstat Schnittstellenänderung; siehe sys/sys/param.h 1.149. 500108 15. März 2003 Token-Ring Schnittstellenänderungen. 500109 25. März 2003 Hinzufügen von vm_paddr_t. 500110 28. März 2003 5.0-CURRENT nachdem &man.realpath.3; Thread-sicher gemacht wurde. 500111 9. April 2003 5.0-CURRENT nachdem &man.usbhid.3; mit NetBSD synchronisiert wurde. 500112 17. April 2003 5.0-CURRENT nach der neuen NSS Implementierung und Hinzufügen der POSIX.1 getpw*_r, getgr*_r Funktionen. 500113 2. Mai 2003 5.0-CURRENT nach Entfernen des alten rc-Systems. 501000 4. Juni 2003 5.1-RELEASE. 501100 2. Juni 2003 5.1-CURRENT nach dem Erstellen des RELENG_5_1 Zweiges. 501101 29. Juni 2003 5.1-CURRENT nachdem die Semantik von sigtimedwait(2) and sigwaitinfo(2) korrigiert wurden. 501102 3. Juli 2003 5.1-CURRENT nach dem Hinzufügen der lockfunc und lockfuncarg-Felder zu &man.bus.dma.tag.create.9;. 501103 31. Juli 2003 5.1-CURRENT nach der Integration des GCC 3.3.1-pre 20030711 Snapshots. 501104 5. August 2003 5.1-CURRENT 3ware-API Änderungen in twe. 501105 17. August 2003 5.1-CURRENT Unterstützung von dynamisch gebundenen /bin und /sbin und Verschieben von Bibliotheken nach /lib. 501106 8. September 2003 5.1-CURRENT nachdem im Kernel Unterstützung für Coda 6.x hinzugefügt wurden. 501107 17. September 2003 5.1-CURRENT nachdem die 16550 UART-Konstanten von <dev/sio/sioreg.h> nach <dev/ic/ns16550.h> verschoben wurden. Und nachdem die libmap Funktionalität vorbehaltlos vom rtld unterstützt wurde. 501108 23. September 2003 5.1-CURRENT nach Aktualisierung der PFIL_HOOKS API. 501109 27. September 2003 5.1-CURRENT nachdem kiconv(3) hinzugefügt wurde. 501110 28. September 2003 5.1-CURRENT nachdem der standardmäßige Ablauf von open und close in cdevsw geändert wurde. 501111 16. Oktober 2003 5.1-CURRENT nachdem das Layout von cdevsw geändert wurde. 501112 16. Oktober 2003 5.1-CURRENT nach dem Hinzufügen von Mehrfachvererbung in kobj. 501113 31. Oktober 2003 5.1-CURRENT nach der if_xname Änderung in der Struktur ifnet 501114 16. November 2003 5.1-CURRENT nachdem /bin und /sbin geändert wurden, um sie dynamisch zu binden. 502000 7. Dezember 2003 5.2-RELEASE 502010 23. Februar 2004 5.2.1-RELEASE 502100 7. Dezember 2003 5.2-CURRENT nach dem Erstellen des RELENG_5_2-Zweiges. 502101 19. Dezember 2003 5.2-CURRENT nachdem die __cxa_atexit/__cxa_finalize Funktionen zur libc hinzugefügt wurden. 502102 30. Januar 2004 5.2-CURRENT nachdem die Standard-Thread Bibliothek von libc_r zu libpthread geändert wurde. 502103 21. Februar 2004 5.2-CURRENT nach dem Gerätetreiber API Megapatch. 502104 25. Februar 2004 5.2-CURRENT nachdem getopt_long_only() hinzugefügt wurde. 502105 5. März 2004 5.2-CURRENT nachdem NULL für C in ((void *)0) geändert wurde, was mehr Warnungen erzeugt. 502106 8. März 2004 5.2-CURRENT nachdem pf beim Bauen und Installieren mit eingebunden wird. 502107 10. März 2004 5.2-CURRENT nachdem time_t auf der sparc64-Plattform in einen 64-bit Wert geändert wurde. 502108 12. März 2004 5.2-CURRENT nachdem sich die Unterstützung für den Intel C/C++-Compiler in einigen Headern und execve(2) geändert hat, um sich strikter an POSIX zu halten. 502109 22. März 2004 5.2-CURRENT nach der Einführung der bus_alloc_resource_any API 502110 27. März 2004 5.2-CURRENT nach dem Hinzufügen von UTF-8 locales 502111 11. April 2004 5.2-CURRENT nach dem Entfernen der getvfsent(3) API 502112 13. April 2004 5.2-CURRENT nach dem Hinzufügen der .warning Directive für make. 502113 4. Juni 2004 5.2-CURRENT nachdem ttyioctl() zwingend erforderlich für serielle Treiber gemacht wurde. 502114 13. Juni 2004 5.2-CURRENT nach dem Import des ALTQ-Frameworks. 502115 14. Juni 2004 5.2-CURRENT nachdem sema_timedwait(9) geändert wurde, 0 bei Erfolg und einen von 0 verschiedenen Fehlercode im Falle eines Fehlers zurückzuliefern. 502116 16. Juni 2004 5.2-CURRENT nach dem Ändern der Kernel Struktur dev_t, in ein Zeiger auf die Struktur cdev * 502117 17. Juni 2004 5.2-CURRENT nach dem Ändern der Kernelstruktur udev_t in dev_t. 502118 17. Juni 2004 5.2-CURRENT nachdem Unterstützung für CLOCK_VIRTUAL und CLOCK_PROF zu clock_gettime(2) und clock_getres(2) hinzugefügt wurde. 502119 22. Juni 2004 5.2-CURRENT nachdem die Überprüfung des Klonens von Netzwerk-Schnittstellen geändert wurde. 502120 2. Juli 2004 5.2-CURRENT nach dem Einfliessen von Revision 20040629 der Paket-Werkzeuge. 502121 9. Juli 2004 5.2-CURRENT nachdem Bluetooth-Quelltext als nicht i386-spezifisch markiert wurde. 502122 11. Juli 2004 5.2-CURRENT nach der Einführung des KDB Debugger Frameworks, der Umwandlung des DDB in ein Backend und der Einführung des GDB-Backends. 502123 12. Juli 2004 5.2-CURRENT nachdem VFS_ROOT geändert wurde, eine Struktur thread als Argument zu aktzeptieren, wie vflush. Die Struktur kinfo_proc enthält nun einen Zeiger auf Benutzer Daten. Der Umstieg auf xorg als standardmäßige X Implementierung wurde auch zu dieser Zeit durchgeführt. 502124 24. Juli 2004 5.2-CURRENT nachdem die Art und Weise, wie rc.d-Skripte von Ports und Altlasten gestartet werden, getrennt wurde. 502125 28. Juli 2004 5.2-CURRENT nachdem die vorherige Änderung rückgängig gemacht wurde. 502126 31. Juli 2004 5.2-CURRENT nach dem Entfernen von kmem_alloc_pageable() und dem Import von GCC 3.4.2. 502127 2. August 2004 5.2-CURRENT nachdem die UMA Kernel API geändert wurde, um Konstruktoren und Initialisierungsmethoden zu erlauben fehlzuschlagen. 502128 8. August 2004 5.2-CURRENT nach der Änderung in der vfs_mount Signatur sowie allgemeines Ersetzen von PRISON_ROOT durch SUSER_ALLOWJAIL in der suser(9) API. 503000 23. August 2004 5.3-BETA/RC vor der Änderung der pfil-API. 503001 22. September 2004 5.3-RELEASE 503100 16. Oktober 2004 5.3-STABLE nach dem Erstellen des RELENG_5_3-Zweiges. 503101 3. Dezember 2004 5.3-STABLE nach dem Hinzufügen von Fülloptionen im Stile der libc zu &man.strftime.3;. 503102 13. Februar 2005 5.3-STABLE nachdem OpenBSD's nc(1) von CURRENT importiert wurde. 503103 27. Februar 2005 5.4-PRERELEASE nach dem Einfliessen der Reparaturen aus CURRENT, in <src/include/stdbool.h> und <src/sys/i386/include/_types.h>, um die GCC-Kompatibilität des Intel C/C++-Compilers zu benutzen. 503104 28. Februar 2005 5.4-PRERELEASE nach dem Einfliessen der Änderung aus CURRENT in ifi_epoch statt der lokalen Zeit die Betriebszeit des Systems zu benutzen. 503105 2. März 2005 5.4-PRERELEASE nach dem Einfliessen der Reparaturen von EOVERFLOW in vswprintf(3) aus CURRENT. 504000 3. April 2005 5.4-RELEASE. 504100 3. April 2005 5.4-STABLE nach dem Erstellen des RELENG_5_4-Zweiges. 504101 11. Mai 2005 5.4-STABLE nach dem Vergrößern der standardmäßigen Stackgröße für Threads. 504102 24. Juni 2005 5.4-STABLE nach dem Hinzufügen von sha256. 504103 3. Oktober 2005 5.4-STABLE nach dem Einfliessen von if_bridge aus CURRENT. 504104 13. November 2005 5.4-STABLE nach dem Einfliessen von bsdiff und portsnap aus CURRENT. 504105 17. Januar 2006 5.4-STABLE nach dem Einfliessen der Änderung von ldconfig_local_dirs aus CURRENT. 505000 12. Mai 2006 5.5-RELEASE. 505100 12. Mai 2006 5.5-STABLE nach dem Erstellen des RELENG_5_5-Zweiges. 600000 18. August 2004 6.0-CURRENT 600001 27. August 2004 6.0-CURRENT nach der festen Aktivierung von PFIL_HOOKS im Kernel. 600002 30. August 2004 6.0-CURRENT nach der anfänglichen Einführung von ifi_epoch zur Struktur if_data. Wurde nach ein paar Tagen wieder rückgängig gemacht. Benutzen Sie diesen Wert bitte nicht. 600003 8. September 2004 6.0-CURRENT nach dem erneuten Hinzufügen des Elements ifi_epoch zur Struktur if_data. 600004 29. September 2004 6.0-CURRENT nach dem Hinzufügen der Struktur inpcb als Argument in der pfil API. 600005 5. Oktober 2004 6.0-CURRENT nach dem Hinzufügen des "-d DESTDIR" Schalters zu newsyslog. 600006 4. November 2004 6.0-CURRENT nach dem Hinzufügen von Fülloptionen im Style der libc zu &man.strftime.3;. 600007 12. Dezember 2004 6.0-CURRENT nach dem Hinzufügen von 802.11 Framework Neuerungen. 600008 25. Januar 2005 6.0-CURRENT Änderung an den VOP_*VOBJECT() Funktionen und Einführung des MNTK_MPSAFE Schalters für Dateisysteme, welche ohne Giant arbeiten. 600009 4. Februar 2005 6.0-CURRENT nach dem Hinzufügen von cpufreq Framework und Treibern. 600010 6. Februar 2005 6.0-CURRENT nachdem OpenBSD's nc(1) importiert wurde. 600011 12. Februar 2005 6.0-CURRENT nachdem der Anschein von matherr() Unterstützung in SVID2 entfernt wurde. 600012 15. Februar 2005 6.0-CURRENT nach dem Vergrößern der standardmäßigen Stackgröße für Threads. 600013 19. Februar 2005 6.0-CURRENT nach dem Einfliessen der Reparaturen in <src/include/stdbool.h> und <src/sys/i386/include/_types.h>, um die GCC-Kompatibilität des Intel C/C++-Compilers zu benutzen. 600014 21. Februar 2005 6.0-CURRENT nachdem die Überprüfungen auf EOVERFLOW in vswprintf(3) korrigiert wurden. 600015 25. Februar 2005 6.0-CURRENT nach dem Einfliessen der Änderung, in ifi_epoch, statt der lokalen Zeit, die Betriebzeit des Systems zu benutzen. 600016 26. Februar 2005 6.0-CURRENT nachdem das Format von LC_CTYPE auf der Festplatte verändert wurde. 600017 27. Februar 2005 6.0-CURRENT nachdem das Format der NLS-Kataloge auf der Festplatte verändert wurde. 600018 27. Februar 2005 6.0-CURRENT nachdem das Format von LC_COLLATE auf der Festplatte verändert wurde. 600019 28. Februar 2005 Installation der acpica Include-Dateien in /usr/include. 600020 9. März 2005 Hinzufügen des MSG_NOSIGNAL Schalters zur send(2) API. 600021 17. März 2005 Hinzufügen von Feldern zu cdevsw 600022 21. März 2005 gtar wurde aus dem Basissystem entfernt. 600023 13. April 2005 Die Optionen LOCAL_CREDS, LOCAL_CONNWAIT für Sockets wurde zu unix(4) hinzugefügt. 600024 19. April 2005 &man.hwpmc.4; und zugehörige Werkzeuge wurden zu 6.0-CURRENT hinzugefügt. 600025 26. April 2005 Die Struktur icmphdr wurden zu 6.0-CURRENT hinzugefügt. 600026 3. Mai 2005 pf Aktualisierung auf 3.7. 600027 6. Mai 2005 Kernel libalias und ng_nat wurden eingeführt. 600028 13. Mai 2005 POSIX ttyname_r(3) wurde über unistd.h und libc zur Verfügung gestellt. 600029 29. Mai 2005 6.0-CURRENT nachdem libpcap zu Version v0.9.1 alpha 096 aktualisiert wurde. 600030 5. Juni 2005 6.0-CURRENT nach dem Import von NetBSDs if_bridge(4). 600031 10. Juni 2005 6.0-CURRENT nachdem die Struktur ifnet aus dem Treiber softcs herausgelöst wurde. 600032 11. Juli 2005 6.0-CURRENT nach dem Import von libpcap v0.9.1. 600033 25. Juli 2005 6.0-STABLE nachdem die Versionen aller gemeinsam genutzten Bibliotheken, welche seit RELENG_5 nicht geändert wurden, erhöht wurden. 600034 13. August 2005 6.0-STABLE nachdem das Argument credential zu der dev_clone-Ereignisbehandlung hinzugefügt wurde. 6.0-RELEASE. 600100 1. November 2005 6.0-STABLE nach dem Erstellen des 6.0-RELEASE-Zweiges. 600101 21. Dezember 2005 6.0-STABLE nach dem Aufnehmen von Skripten aus den local_startup-Verzeichnissen in &man.rcorder.8; des Basissystems. 600102 30. Dezember 2005 6.0-STABLE nach dem Aktualisieren der ELF-Typen und Konstanten. 600103 15. Januar 2006 6.0-STABLE nach dem Einfliessen der pidfile(3)-API aus CURRENT. 600104 17. Januar 2006 6.0-STABLE nach dem Einfliessen der Änderung von ldconfig_local_dirs aus CURRENT. 600105 26. Februar 2006 6.0-STABLE nach der NLS-Katalogunterstützung von csh(1). 601000 6. Mai 2006 6.1-RELEASE 601100 6. Mai 2006 6.1-STABLE nach 6.1-RELEASE. 601101 22. Juni 2006 6.1-STABLE nach dem Import von csup. 601102 11. Juli 2006 6.1-STABLE nach der iwi(4)-Aktualisierung. 601103 17. Juli 2006 6.1-STABLE nach der Aktualisierung der Namensauflösung zu BIND9 und Aufnahme der ablaufinvarianten Versionen der netdb-Funktionen. 601104 8. August 2006 6.1-STABLE nachdem Unterstützung für DSO (dynamic shared objects - gemeinsam genutzte, dynamische Objekte) in OpenSSL aktiviert wurde. 601105 2. September 2006 6.1-STABLE nachdem 802.11 Reparaturen die API der IEEE80211_IOC_STA_INFO ioctl geändert haben. 602000 15. November 2006 6.2-RELEASE 602100 15. September 2006 6.2-STABLE nach 6.2-RELEASE. 602101 12. Dezember 2006 6.2-STABLE nach dem Hinzufügen der Wi-Spy Eigenart. 602102 28. Dezember 2006 6.2-STABLE nachdem pci_find_extcap() hinzugefügt wurde. 602103 16. Januar 2007 6.2-STABLE nach dem Einpflegen der dlsym Änderung aus CURRENT, ein angefordertes Symbol sowohl in der spezifizierten dso, als auch in den impliziten Abhängigkeiten nachzuschlagen. 602104 28. Januar 2007 6.2-STABLE nach dem Einpflegen von ng_deflate(4) und ng_pred1(4) netgraph Knoten und neuen Kompressions- und -Verschlüsselungmodi für den ng_ppp(4) Knoten aus CURRENT. 602105 20. Februar 2007 6.2-STABLE nach dem Einpflegen der BSD lizensierten Version von &man.gzip.1;, welche von NetBSD portiert wurde aus CURRENT. 602106 31. März 2007 6.2-STABLE nach dem Einpflegen der PCI MSI und MSI-X Unterstützung aus CURRENT. 602107 6. April 2007 6.2-STABLE nach dem Einpflegen von ncurses 5.6 und Unterstützung für Multibyte-Zeichen aus CURRENT. 602108 11. April 2007 6.2-STABLE nach dem Einpflegen des 'SG' Peripheriegerätes aus CURRENT in CAM, welches einen Teil der SCSI SG passthrough Geräte API von Linux enthält. 602109 17. April 2007 6.2-STABLE nach dem Einpflegen von readline 5.2 Patchset 002 aus CURRENT. 602110 2. Mai 2007 6.2-STABLE nach dem Einpflegen von pmap_invalidate_cache(), pmap_change_attr(), pmap_mapbios(), pmap_mapdev_attr(), und pmap_unmapbios() für amd64 und i386 aus CURRENT. 602111 11. Juni 2007 6.2-STABLE nach dem Einpflegen von BOP_BDFLUSH aus CURRENT und dem daraus resultierendem Bruch mit dem Dateisystemmodul KBI. 602112 21. September 2007 6.2-STABLE nach dem Einpflegen von libutil(3) aus CURRENT. 602113 25. Oktober 2007 6.2-STABLE, nach der Trennung in "wide und single byte ctype". Neu kompilierte Binärdateien, die ctype.h referenzieren, erfordern möglicherweise ein neues Symbol, __mb_sb_limit, das auf älteren Systemen nicht verfügbar ist. 602114 30. Oktober 2007 6.2-STABLE, nachdem die ctype ABI-Aufwärtskompatibilität wiederhergestellt wurde. 602115 21. November 2007 FreeBSD 6.2-STABLE nach der Entfernung/Eliminierung der wide und single Byte ctype-Trennung 603000 25. November 2007 6.3-RELEASE 603100 25. November 2007 6.3-STABLE nach 6.3-RELEASE. 603101 7. Dezember 2007 6.3-STABLE, nachdem der Support für den Multibyte-Datentyp im Bit-Makro gefixt wurde. 603102 24. April 2008 6.3-STABLE nach Hinzufügen von l_sysid zu struct flock. 603103 27. Mai 2008 6.3-STABLE nach Einfließen der memrchr-Funktion. 603104 15. Juni 2008 6.3-STABLE nach Übernahme der Unterstützung von :u als Variablenwandler in make(1). 604000 4. Oktober 2008 6.4-RELEASE 604100 4. Oktober 2008 6.4-STABLE nach 6.4-RELEASE. 700000 11. Juli 2005 7.0-CURRENT. 700001 23. Juli 2005 7.0-CURRENT nachdem die Versionen aller gemeinsam genutzten Bibliotheken, welche seit RELENG_5 nicht geändert wurden, erhöht wurden. 700002 13. August 2005 7.0-CURRENT nachdem ein Berechtigungs-Argument zur dev_clone-Ereignisroutine hinzugefügt wurde. 700003 25. August 2005 7.0-CURRENT nachdem memmem(3) zur libc hinzugefügt wurde. 700004 30. Oktober 2005 7.0-CURRENT nachdem die Argumente der Kernelfunktion solisten(9) modifiziert wurden, um einen Backlog-Parameter (Anzahl der maximalen wartenden Verbindungen) zu akzeptieren. 700005 11. November 2005 7.0-CURRENT nachdem IFP2ENADDR() geändert wurde, einen Zeiger auf IF_LLADDR() zurückzugeben. 700006 11. November 2005 7.0-CURRENT nach dem Hinzufügen des if_addr-Elements zur Struktur ifnet und dem Entfernen von IFP2ENADDR(). 700007 2. Dezember 2005 7.0-CURRENT nach dem Aufnehmen von Skripten aus den local_startup Verzeichnissen in &man.rcorder.8; des Basissystems. 700008 5. Dezember 2005 7.0-CURRENT nach dem Entfernen der MNT_NODEV mount-Option. 700009 19. Dezember 2005 7.0-CURRENT nach ELF-64 Typen Änderungen und Symbol Versionierung. 700010 20. Dezember 2005 7.0-CURRENT nach Hinzufügen der hostb und vgapci Treiber, Hinzufügen von pci_find_extcap() und Änderung der AGP Treiber die Apertur nicht länger abzubilden. 700011 31. Dezember 2005 7.0-CURRENT nachdem auf allen Plattformen außer Alpha tv_sec in time_t umgewandelt wurde. 700012 8. Januar 2006 7.0-CURRENT nach Änderung von ldconfig_local_dirs. 700013 12. Januar 2006 7.0-CURRENT nach Änderung in /etc/rc.d/abi um /compat/linux/etc/ld.so.cache als Symlink in ein schreibgeschütztes Dateisystem zu unterstützen. 700014 26. Januar 2006 7.0-CURRENT nach pts Import. 700015 26. März 2006 7.0-CURRENT nach Einführung von Version 2 der &man.hwpmc.4;'s ABI. 700016 22. April 2006 7.0-CURRENT nach dem Hinzufügen von &man.fcloseall.3; zur libc. 700017 13. Mai 2006 7.0-CURRENT nach dem Entfernen von ip6fw. 700018 15. Juli 2006 7.0-CURRENT nach dem Import von snd_emu10kx. 700019 29. Juli 2006 7.0-CURRENT nach dem Import von OpenSSL 0.9.8b. 700020 3. September 2006 7.0-CURRENT nach dem Hinzufügen der bus_dma_get_tag-Funktion 700021 4. September 2006 7.0-CURRENT nach dem Import von libpcap 0.9.4 und tcpdump 3.9.4. 700022 9. September 2006 7.0-CURRENT nach der dlsym Änderung, ein angefordertes Symbol sowohl in der spezifizierten dso, als auch in den impliziten Abhängigkeiten nachzuschlagen. 700023 23. September 2006 7.0-CURRENT nach dem Hinzufügen neuer Sound-IOCTLs für die OSSv4-Mixer-API. 700024 28. September 2006 7.0-CURRENT nach dem Import von OpenSSL 0.9.8d. 700025 11. November 2006 7.0-CURRENT nach dem Hinzufügen der libelf. 700026 26. November 2006 7.0-CURRENT nach größeren Änderungen an den Sound sysctls. 700027 30. November 2006 7.0-CURRENT nach dem Hinzufügen der Wi-Spy-Eigenart. 700028 15. Dezember 2006 7.0-CURRENT nach dem Hinzufügen von sctp-Aufrufen zur libc. 700029 26. Januar 2007 7.0-CURRENT nach dem Ersetzen von GNU &man.gzip.1; durch eine von NetBSD portierte Version, die unter BSD-Lizenz steht. 700030 7. Februar 2007 7.0-CURRENT nach dem Entfernen der IPIP Tunnelkapselung (VIFF_TUNNEL) aus dem IPv4 Multicast-Forwarding-Quelltext. 700031 23. Februar 2007 7.0-CURRENT nach den Modifizierungen an bus_setup_intr() (newbus). 700032 2. März 2007 7.0-CURRENT nach der Aufnahme der Firmware für ipw(4) und iwi(4). 700033 9. März 2007 7.0-CURRENT nach Unterstützung für Multibyte-Zeichen. 700034 19. März 2007 7.0-CURRENT nach Änderungen, wie insmntque(), getnewvnode() und vfs_hash_insert() arbeiten. 700035 26. März 2007 7.0-CURRENT nach Hinzufügen eines Benachrichtigungsmechanismus für CPU Frequenzänderungen. 700036 6. April 2007 7.0-CURRENT nach dem Import des ZFS Dateisystemes. 700037 8. April 2007 7.0-CURRENT nach dem Einpflegen des 'SG' Peripheriegerätes in CAM, welches einen Teil der SCSI SG passthrough Geräte API von Linux enthält. 700038 30. April 2007 7.0-CURRENT nachdem &man.getenv.3;, &man.putenv.3;, &man.setenv.3; und &man.unsetenv.3; geändert wurden, um POSIX konform zu sein. 700039 1. Mai 2007 7.0-CURRENT nachdem die Änderungen von 700038 rückgängig gemacht wurden. 700040 10. Mai 2007 7.0-CURRENT nach dem Hinzufügen von &man.flopen.3; zur libutil. 700041 13. Mai 2007 7.0-CURRENT nachdem Symbol Versionierung aktiviert und die standardmäßige Thread-Bibliothek zu libthr geändert wurde. 700042 19. Mai 2007 7.0-CURRENT nach dem Import von GCC 4.2.0. 700043 21. Mai 2007 7.0-CURRENT nachdem die Versionen aller Shared-Libraries, welche seit RELENG_6 nicht geändert wurden, erhöht worden sind. 700044 7. Juni 2007 7.0-CURRENT nachdem das Argument für vn_open()/VOP_OPEN() vom Dateideskriptorindex zur Struktur file * geädert wurde. 700045 10. Juni 2007 7.0-CURRENT nachdem &man.pam.nologin.8; geädert wurde, eine Kontoverwaltungs-Funktion statt einer Authentifizierungsfunktion für das PAM-Framework zur Verfügung zu stellen. 700046 11. Juni 2007 7.0-CURRENT nach aktualisierter 802.11 wireless Unterstützung. 700047 11. Juni 2007 7.0-CURRENT, nachdem TCP-LRO-Schnittstellen-Ressourcen hinzugefügt wurden. 700048 12. Juni 2007 7.0-CURRENT, nachdem die RFC 3678 API-Unterstützung zum IPv4-Stack hinzugefügt wurde. Veraltetes RFC 1724-Verhalten des IP_MULTICAST_IF ioctl wurde entfernt; 0.0.0.0/8 darf nicht länger als Schnittstellen-Index benutzt werden. Stattdessen sollte die Struktur ipmreqn verwendet werden. 700049 3. Juli 2007 7.0-CURRENT, nachdem pf von OpenBSD 4.1 importiert wurde (nicht geändert) 7.0-CURRENT, nachdem die IPv6-Unterstützung um FAST_IPSEC erweitert, KAME IPSEC entfernt und FAST_IPSEC in IPSEC umbenannt wurde. 700050 4. Juli 2007 7.0-CURRENT, nachdem Aufrufe von setenv/putenv/usw. von der traditionellen BSD-Art und Weise nach POSIX konvertiert wurden. 700051 4. Juli 2007 7.0-CURRENT, nachdem neue Systemaufrufe (mmap/lseek/usw.) implementiert wurden. 700052 6. Juli 2007 7.0-CURRENT, nachdem die I4B-Header nach include/i4b verschoben wurden. 700053 30. September 2007 7.0-CURRENT, nachdem die Unterstützung für PCI Domänen hinzugefügt wurde. 700054 25. Oktober 2007 7.0-CURRENT, nach der Trennung in "wide und single byte ctype". 700055 28. Oktober 2007 7.0-RELEASE sowie 7.0-CURRENT, nachdem die ABI-Abwärtskompatibilität für die FreeBSD 4/5/6-Versionen der PCIOCGETCONF-, PCIOCREAD- sowie PCIOCWRITE IOCTLs hinzugefügt wurde. Damit verbunden war, dass die ABI der PCIOCGETCONF IOCTL erneut deaktiviert werden musste. 700100 22. Dezember 2007 7.0-STABLE nach 7.0-RELEASE. 700101 8. Februar 2008 7.0-STABLE nach Einführung von m_collapse(). 700102 30. März 2008 7.0-STABLE nach Einfließen von kdb_enter_why(). 700103 10. April 2008 7.0-STABLE nach Hinzufügen von l_sysid zu struct flock. 700104 11. April 2008 7.0-STABLE nach Übernahme von procstat(1). 700105 11. April 2008 7.0-STABLE nach Einführung von umtx-Features. 700106 15. April 2008 7.0-STABLE nach Hinzufügen der Unterstützung von &man.write.2; zu &man.psm.4;. 700107 20. April 2008 7.0-STABLE nach Hinzufügen des Befehls F_DUP2FD zu &man.fcntl.2;. 700108 5. Mai 2008 7.0-STABLE nach einigen Änderungen an &man.lockmgr.9;, welche die Einbindung von sys/lock.h zur Verwendung von &man.lockmgr.9; voraussetzen. 700109 27. Mai 2008 7.0-STABLE nach Einfließen der memrchr-Funktion. 700110 5. August 2008 7.0-STABLE nach Einführung eines Clients für den Kernel NFS lockd. 700111 20. August 2008 7.0-STABLE nach Hinzufügen einer Unterstützung von physisch fortlaufender Jumbo Frames. 700112 27. August 2008 7.0-STABLE nach Einfließen einer Kernelunterstützung für DTrace. 701000 25. November 2008 7.1-RELEASE 701100 25. November 2008 7.1-STABLE nach 7.1-RELEASE. 701101 10. Januar 2009 7.1-STABLE nach Übernahme von strndup. 701102 17. Januar 2009 7.1-STABLE nach Hinzufügen einer Unterstützung von cpuctl(4). 701103 7. Februar 2009 7.1-STABLE nach Einfließen der Unterstützung von Jails mit keinen oder mehreren IPv4-/IPv6-Adressen. 701104 14. Februar 2009 7.1-STABLE, nachdem der Besitzer des Suspend in struct mount gespeichert wird und die Funktion vfs_susp_clean in struct vfsops aufgenommen ist. 701105 12. März 2009 7.1-STABLE nach der inkompatiblen Änderung am sysctl kern.ipc.shmsegs, um die Anforderung größerer Segmente von gemeinsam genutzten SysV-Speicher auf 64bit-Architekturen zu erlauben. 701106 14. März 2009 7.1-STABLE nach der Übernahme einer Fehlerbehebung für Warteoperationen, die POSIX-Semaphore verwenden. 702000 15. April 2009 7.2-RELEASE 702100 15. April 2009 7.2-STABLE nach 7.2-RELEASE. 702101 15. Mai 2009 7.2-STABLE, nachdem ichsmb(4) dahingehend geändert wurde, dass es links-ausgerichtete Adressierung von Slaves verwendet, um anderen SMBus-Kontrollertreibern zu entsprechen. 702102 28. Mai 2009 7.2-STABLE nach dem Einfließen der Funktion fdopendir. + + 702103 + 06. Juni 2009 + 7.2-STABLE nach dem Einfließen von PmcTools. + + 800000 11. Oktober 2007 8.0-CURRENT. Nach der Trennung in "wide und single byte ctype". 800001 16. Oktober 2007 8.0-CURRENT, nachdem libpcap 0.9.8 und tcpdump 3.9.8 importiert wurden. 800002 21. Oktober 2007 8.0-CURRENT, nachdem kthread_create() und Konsorten in kproc_create() usw. umbenannt wurden. 800003 24. Oktober 2007 8.0-CURRENT, nachdem die ABI-Abwärtskompatibilität für die FreeBSD 4/5/6-Versionen der PCIOCGETCONF-, PCIOCREAD- sowie PCIOCWRITE IOCTLs hinzugefügt wurde. Damit verbunden war, dass die ABI der PCIOCGETCONF IOCTL erneut deaktiviert werden musste. 800004 12. November 2007 8.0-CURRENT, nachdem der agp(4) Treiber verschoben wurde von src/sys/pci nach src/sys/dev/agp. 800005 4. Dezember 2007 8.0-CURRENT nach Änderungen am Jumbo Frame Allocator. 800006 7. Dezember 2007 8.0-CURRENT, nach dem Hinzufügen der callgraph capture Funktionalität zu &man.hwpmc.4;. 800007 25. Dezember 2007 8.0-CURRENT nach dem Hinzufügen von "why" als Argument in kdb_enter(). 800008 28. Dezember 2007 8.0-CURRENT nach Entfernen der Option LK_EXCLUPGRADE. 800009 9. Januar 2008 8.0-CURRENT nach Einführung von &man.lockmgr.disown.9; 800010 10. Januar 2008 8.0-CURRENT nach Änderungen am &man.vn.lock.9;-Prototyp. 800011 13. Januar 2008 8.0-CURRENT nach Änderungen an den Prototypen von &man.VOP.LOCK.9; und &man.VOP.UNLOCK.9;. 800012 19. Januar 2008 8.0-CURRENT nach Einführung von &man.lockmgr.recursed.9;, &man.BUF.RECURSED.9; und &man.BUF.ISLOCKED.9; sowie Entfernung von BUF_REFCNT(). 800013 23. Januar 2008 8.0-CURRENT nach Einführung der ASCII-Kodierung. 800014 24. Januar 2008 8.0-CURRENT nach Änderungen am &man.lockmgr.9;-Prototyp und Entfernung von lockcount() sowie LOCKMGR_ASSERT(). 800015 26. Januar 2008 8.0-CURRENT nach Erweiterung der Datentypen der &man.fts.3;-Strukturen. 800016 1. Februar 2008 8.0-CURRENT nach Hinzufügen eines neuen Parameters zu MEXTADD(9). 800017 6. Februar 2008 8.0-CURRENT nach Einführung der Optionen LK_NODUP und LK_NOWITNESS in die &man.lockmgr.9;-Umgebung. 800018 8. Februar 2008 8.0-CURRENT nach Hinzufügen von m_collapse. 800019 9. Februar 2008 8.0-CURRENT nach Hinzufügen einer Arbeits-, Wurzel- und Jailverzeichnisunterstützung zur sysctl-Variable kern.proc.filedesc. 800020 13. Februar 2008 8.0-CURRENT nach Einführung der Funktionen &man.lockmgr.assert.9; und BUF_ASSERT. 800021 15. Februar 2008 8.0-CURRENT nach Einführung von &man.lockmgr.args.9; und Entfernung der Option LK_INTERNAL. 800022 (zurückgezogen) 8.0-CURRENT nach Setzen von BSD &man.ar.1; als Systemstandard. 800023 25. Februar 2008 8.0-CURRENT nach Prototypenänderungen an &man.lockstatus.9; und &man.VOP.ISLOCKED.9;, eigens zur Abschaffung des Parameters struct thread. 800024 1. März 2008 8.0-CURRENT nach Beseitigung der Funktionen lockwaiters und BUF_LOCKWAITERS, Änderung des Rückgabewerts der Funktion brelvp von void nach int sowie Einführung neuer Optionen für &man.lockinit.9;. 800025 8. März 2008 8.0-CURRENT nach Hinzufügen des Kommandos F_DUP2FD zu &man.fcntl.2;. 800026 12. März 2008 8.0-CURRENT nach Änderung des Parameters für die Priorität an cv_broadcastpri, sodass 0 für keine Priorität steht. 800027 24. März 2008 8.0-CURRENT nach Änderung der Monitoring ABI von BPF, als Zero-Copy Puffer hinzugefügt wurden. 800028 26. März 2008 8.0-CURRENT nach Hinzufügen von l_sysid zu struct flock. 800029 28. März 2008 8.0-CURRENT nach Wiedereingliederung der Funktion BUF_LOCKWAITERS und Hinzufügen von &man.lockmgr.waiters.9;. 800030 1. April 2008 8.0-CURRENT nach Einführung der Funktionen &man.rw.try.rlock.9; und &man.rw.try.wlock.9;. 800031 6. April 2008 8.0-CURRENT nach Einführung der Funktionen lockmgr_rw und lockmgr_args_rw. 800032 8. April 2008 8.0-CURRENT nach Implementierung des Systemaufrufs openat und seiner Verwandten, Einführung der Option O_EXEC in &man.open.2; und Bereitstellung der entsprechenden Systemaufrufe innerhalb der &linux;-Kompatibilitätsumgebung. 800033 8. April 2008 8.0-CURRENT nach Hinzufügen der Unterstützung von &man.write.2; in der nativen Operationsebene von &man.psm.4;. Es können nun beliebig Kommandos nach /dev/psm%d geschrieben und der Status dann von dort gelesen werden. 800034 10. April 2008 8.0-CURRENT nach Einführung der Funktion memrchr. 800035 16. April 2008 8.0-CURRENT nach Einführung der Funktion fdopendir. 800036 20. April 2008 8.0-CURRENT nach Umstellung des Standards 802.11 auf Unterstützung von Multi-BSS (auch vaps). 800037 9. Mai 2008 8.0-CURRENT nach Hinzufügen einer Unterstützung für Multi Routing-Tabellen (siehe setfib(1), setfib(2)). 800038 26. Mai 2008 8.0-CURRENT nach Entfernen von netatm und ISDN4BSD. 800039 14. Juni 2008 8.0-CURRENT nach Entfernen von sgtty. 800040 26. Juni 2008 8.0-CURRENT nach Einführung eines Clients für den Kernel NFS lockd. 800041 22. Juli 2008 8.0-CURRENT nach Hinzufügen von arc4random_buf(3) und arc4random_uniform(3). 800042 8. August 2008 8.0-CURRENT nach Hinzufügen von cpuctl(4). 800043 13. August 2008 8.0-CURRENT nach Änderung von bpf(4) zur Verwendung einer einzelnen Gerätedatei anstatt von Klonierung. 800044 17. August 2008 8.0-CURRENT nach Übernahme des ersten Teils aus dem vimage-Projekt durch Erweitern globaler Variablen um den Präfix V_. Zukünftig werden die virtualisierten Variablen dann mit Hilfe von Makros in ihre globalen Namen aufgelöst. 800045 20. August 2008 8.0-CURRENT nach Eingliederung des MPSAFE TTY-Layers, einschließlich Änderungen an diversen Treibern und Werkzeugen, die mit ihm kommunizieren. 800046 8. September 2008 8.0-CURRENT nach Abschottung der GDT pro CPU auf der AMD64-Architektur. 800047 10. September 2008 8.0-CURRENT nach Entfernen von VSVTX, VSGID und VSUID. 800048 16. September 2008 8.0-CURRENT nach Anpassung des Codes für Kernel NFS mount, sodass einzelne Mountoptionen im Parameter struct iovec an nmount() akzeptiert werden und nicht nur ein großes struct nfs_args. 800049 17. September 2008 8.0-CURRENT nach Entfernen von &man.suser.9; und &man.suser.cred.9;. 800050 20. Oktober 2008 8.0-CURRENT nach API-Änderungen im Umgang mit dem Buffer Cache. 800051 23. Oktober 2008 8.0-CURRENT nach Entfernen der Makros &man.MALLOC.9; und &man.FREE.9;. 800052 28. Oktober 2008 8.0-CURRENT nach Einführung von accmode_t und Umbennung des Parameters a_mode an VOP_ACCESS nach a_accmode. 800053 2. November 2008 8.0-CURRENT nach Änderung des Prototyps von &man.vfs.busy.9; und Einführung der Optionen MBF_NOWAIT sowie MBF_MNTLSTLOCK. 800054 22. November 2008 8.0-CURRENT nach Hinzufügen von Funktionen im Bereich buf_ring, Memory Barriers und ifnet, um mehrere Sendeschlangen auf Hardwareebene für Karten zu ermöglichen, die dies unterstützen, sowie einer Ring Buffer-Implementierung ohne Lock, um Treibern zu ermöglichen, Paketschlangen effizienter zu verwalten. 800055 27. November 2008 8.0-CURRENT nach Hinzufügen einer Unterstützung für &intel; Core, Core2 und Atom zu &man.hwpmc.4;. 800056 29. November 2008 8.0-CURRENT nach Einführung von Jails mit mehreren oder gar keinen IPv4-/IPv6-Adressen. 800057 1. Dezember 2008 8.0-CURRENT nach Wechsel zum ath_hal Quellcode. 800058 12. Dezember 2008 8.0-CURRENT nach Einführung der Funktion VOP_VPTOCNP. 800059 15. Dezember 2008 8.0-CURRENT gliedert das neue ARPv2 ein. 800060 19. Dezember 2008 8.0-CURRENT nach Hinzufügen von makefs. 800061 15. Januar 2009 8.0-CURRENT nach Umsetzung von TCP Appropriate Byte Counting. 800062 28. Januar 2009 8.0-CURRENT nach Entfernen von minor(), minor2unit(), unit2minor() usw. 800063 18. Februar 2009 8.0-CURRENT nach Änderung der GENERIC-Konfiguration zur Verwendung des USB2-Stack und Hinzufügen von fdevname(3). 800064 23. Februar 2009 8.0-CURRENT, nachdem der USB2-Stack nach dev/usb verschoben wurde, um es zu ersetzen. 800065 26. Februar 2009 8.0-CURRENT nach Umbenennen aller Funktionen in libmp(3). 800066 27. Februar 2009 8.0-CURRENT nach Anpassung des devfs-Verhaltens im Zusammenhang mit USB. 800067 28. Februar 2009 8.0-CURRENT nach Hinzufügen von getdelim(), getline(), stpncpy(), strnlen(), wcsnlen(), wcscasecmp() und wcsncasecmp(). 800068 2. März 2009 8.0-CURRENT nach Umbenennen der Geräteklasse ushub in uhub. 800069 9. März 2009 8.0-CURRENT nach Umbenennen von libusb20.so.1 in libusb.so.1. 800070 9. März 2009 8.0-CURRENT nach der Einführung von IGMPv3 und Source-Specific-Multicast (SSM) in den IPv4-Stack. 800071 14. März 2009 8.0-CURRENT nach der Anpassung von gcc zur Verwendung der C99-Inline-Semantik in den Modi c99 und gnu99. 800072 15. März 2009 8.0-CURRENT, nachdem die Option IFF_NEEDSGIANT entfernt wurde; Netzwerktreiber, die nicht MPSAFE sind, werden nicht mehr unterstützt. 800073 18. März 2009 8.0-CURRENT, nachdem die dynamische Ersetzung von Zeichenkettenkürzeln für rpath und benötigte Pfade implementiert wurde. 800074 24. März 2009 8.0-CURRENT nach dem Einfließen von tcpdump 4.0.0 und libpcap 1.0.0. 800075 6. April 2009 8.0-CURRENT, nachdem die Deklarationen von struct vnet_net, struct vnet_inet und struct vnet_ipfw geändert wurden. 800076 9. April 2009 8.0-CURRENT nach dem Hinzufügen von Laufzeitprofilen in dummynet. 800077 14. April 2009 8.0-CURRENT nach dem Entfernen von VOP_LEASE() und vop_vector.vop_lease. 800078 15. April 2009 8.0-CURRENT, nachdem die Felder aus struct rt_weight zu struct rt_metrics und struct rt_metrics_lite hinzugefügt wurden, wobei die Deklaration von struct rt_metrics_lite geändert wurde. RTM_VERSION wurde hochgezählt (zurückgezogen). 800079 15. April 2009 8.0-CURRENT, nachdem Pointer auf struct llentry zu struct route und struct route_in6 hinzugefügt wurden. 800080 15. April 2009 8.0-CURRENT nach Änderung der Deklaration von struct inpcb. 800081 19. April 2009 8.0-CURRENT nach Änderung der Deklaration von struct malloc_type. 800082 21. April 2009 8.0-CURRENT nach Änderung der Deklaration von struct ifnet und Hinzufügen von if_ref() und if_rele() zur Verwaltung von Referenzen auf ifnet. 800083 22. April 2009 8.0-CURRENT nach der Implementierung einer systemnahen Bluetooth-HCI-API. 800084 29. April 2009 8.0-CURRENT nach Änderungen an IPv6-SSM und MLDv2. 800085 30. April 2009 8.0-CURRENT, nachdem der Bau von VIMAGE-Kernel mit einem aktiven Image unterstützt wird. 800086 8. Mai 2009 8.0-CURRENT nach Hinzufügen der Unterstützung für Eingabezeilen mit beliebiger Länge durch patch(1). 800087 11. Mai 2009 8.0-CURRENT nach einigen Änderungen im Zusammenhang mit dem VFS-KPI. Der Thread-Parameter wurde von den FSD-Teilen des VFS entfernt. VFS_*-Funktionen benötigen den Kontext nicht mehr, da er sich immer auf curthread bezieht. In wenigen Sonderfällen ist das bisherige Verhalten nicht geändert worden. 800088 20. Mai 2009 8.0-CURRENT nach Änderungen am net80211-Monitormodus. 800089 23. Mai 2009 8.0-CURRENT nach dem Hinzufügen der Unterstützung von UDP-Kontrollblocks. 800090 23. Mai 2009 8.0-CURRENT nach der Virtualisierung der Schnittstellenklonierung. 800091 27. Mai 2009 8.0-CURRENT nach dem Hinzufügen von hierarchischen Jails und dem Entfernen des globalen securelevel. 800092 29. Mai 2009 8.0-CURRENT nach der Änderung des sx_init_flags()-KPI. SX_ADAPTIVESPIN wurde zurückgezogen und eine neue Option SX_NOADAPTIVE wurde eingeführt, um die umgekehrte Logik zu behandeln. 800093 29. Mai 2009 8.0-CURRENT nach dem Hinzufügen von mnt_xflag zu struct mount. 800094 30. Mai 2009 8.0-CURRENT nach dem Hinzufügen von &man.VOP.ACCESSX.9;. 800095 30. Mai 2009 8.0-CURRENT nach der Änderung des Polling-KPI. Die Polling-Handler liefern nun die Zahl der verarbeiteten Pakete zurück. Die neue Option IFCAP_POLLING_NOCOUNT wurde weiter eingeführt, um anzugeben, dass der Rückgabewert nicht von Bedeutung ist und das Zählen der Pakete ausgelassen werden soll. 800096 1. Juni 2009 8.0-CURRENT nach der Aktualisierung der netisr-Implementierung und nachdem die Weise, wie FIBs gespeichert werden und wie auf sie zugegriffen wird, geändert wurde.
Beachten Sie, dass 2.2-STABLE sich nach dem 2.2.5-RELEASE manchmal als 2.2.5-STABLE identifiziert. Das Muster war früher das Jahr gefolgt von dem Monat, aber wir haben uns entschieden, ab 2.2. einen geradlinigeren Ansatz mit major/minor-Nummern zu benutzen. Dies liegt daran, dass gleichzeitiges Entwickeln an mehreren Zweigen es unmöglich macht, die Versionen nur mit Hilfe des Datums des Releases zu unterteilen. Wenn Sie jetzt einen Port erstellen brauchen Sie sich nicht um alte -CURRENTs zu kümmern; diese sind hier nur als Referenz augeführt.
Etwas hinter die <filename>bsd.port.mk</filename>-Anweisung schreiben Schreiben Sie bitte nichts hinter die .include <bsd.port.mk>-Zeile. Normalerweise kann dies vermieden werden, indem Sie die Datei bsd.port.pre.mk irgendwo in der Mitte Ihres Makefiles und bsd.port.post.mk am Ende einfügen. Sie dürfen entweder nur das bsd.port.pre.mk/bsd.port.post.mk-Paar oder bsd.port.mk alleine hinzufügen; vermischen Sie diese Verwendungen nicht! bsd.port.pre.mk definiert nur einige Variablen, welche in Tests im Makefile benutzt werden können, bsd.port.post.mk definiert den Rest. Hier sind einige wichtige Variablen, welche in bsd.port.pre.mk definiert sind (dies ist keine vollständige Liste, lesen Sie bitte bsd.port.mk für eine vollständige Auflistung). Variable Beschreibung ARCH Die Architektur, wie von uname -m zurückgegeben (z.B. i386) OPSYS Der Typ des Betriebsystems, wie von uname -s zurückgegeben (z.B. FreeBSD) OSREL Die Release Version des Betriebssystems (z.B., 2.1.5 oder 2.2.7) OSVERSION Die numerische Version des Betriebssystems; gleichbedeutend mit __FreeBSD_version. PORTOBJFORMAT Das Objektformat des Systems (elf oder aout; beachten Sie, dass für moderne Versionen von FreeBSD aout veraltet ist). LOCALBASE Die Basis des local Verzeichnisbaumes (z.B. /usr/local/) PREFIX Wo der Port sich selbst installiert (siehe Mehr Informationen über PREFIX). Falls Sie die Variablen USE_IMAKE, USE_X_PREFIX, oder MASTERDIR definieren müssen, sollten Sie dies vor dem Einfügen von bsd.port.pre.mk machen. Hier sind ein paar Beispiele von Dingen, die Sie hinter die Anweisung bsd.port.pre.mk schreiben können: # lang/perl5 muss nicht kompliliert werden, falls perl5 schon auf dem System ist .if ${OSVERSION} > 300003 BROKEN= perl ist im System .endif # nur eine Versionsnummer für die ELF Version der shlib .if ${PORTOBJFORMAT} == "elf" TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR} .else TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR} .endif # die Software erstellt schon eine Verknüpfung fü ELF, aber nicht fü a.out post-install: .if ${PORTOBJFORMAT} == "aout" ${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so .endif Sie haben sich daran erinnert Tabulator statt Leerzeichen nach BROKEN= und TCL_LIB_FILE= zu benutzen, oder? :-). Benutzen Sie die <function>exec</function>-Anweisung in Wrapper-Skripten Falls der Port ein Shellskript installiert, dessen Zweck es ist ein anderes Programm zu starten, und falls das Starten des Programmes die letzte Aktion des Skripts ist, sollten Sie sicherstellen, dass Sie die Funktion exec dafür benutzen; zum Beispiel: #!/bin/sh exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@" Die Funktion exec ersetzt den Shell-Prozess mit dem angegebenen Programm. Falls exec ausgelassen wird, verbleibt der Shell-Prozess im Speicher während das Programm ausgefährt wird und verbraucht unnötig Systemressourcen. UIDs und GIDs Die aktuellen Listen von reservierten UIDs und GIDs sind in ports/UIDs und ports/GIDs zu finden. Falls Ihr Port einen bestimmten Benutzer auf dem zu installierendem System benötigt, lassen Sie das pkg-install-Skript den Aufruf von pw machen, um ihn automatisch anzulegen. Schauen Sie sich für ein Beispiel sysutils/symon an. Ihr Port muss eine feste Benutzer/Gruppen-ID verwenden. Sie müssen eine nicht benutzte UID zwischen 50 und 999 benutzen und entweder in ports/UIDs (für Benutzer) oder in ports/GIDs (für Gruppen) registrieren. Stellen Sie sicher, dass Sie keine UIDs verwenden, welche schon vom System oder von einem anderen Port gebraucht werden. Bitte fügen Sie einen Patch für diese beiden Datei hinzu, falls für Ihren Port ein neuer Benutzer oder Gruppe angelegt werden muss. Aufgaben vernünftig lösen Das Makefile sollte die nötigen Schritte einfach und vernünftig durchführen. Wenn Sie ein einige Zeilen einsparen oder die Lesbarkeit verbessern können, dann machen Sie dies bitte. Beispiele sind: Ein make-Konstrukt .if anstatt eines Shellkonstrukt if zu verwenden, anstatt do-extract neu zu definieren, dies mit EXTRACT* machen, oder GNU_CONFIGURE anstelle von CONFIGURE_ARGS += --prefix=${PREFIX} zu verwenden. Falls Sie sich in einer Situation wiederfinden, in der Sie viel Code neu schreiben müssen, um etwas zu testen, sollten Sie zuerst bsd.port.mk erneut konsultieren und nachprüfen ob es nicht bereits eine Lösung für Ihr Problem enthält. Es ist zwar schwer zu lesen, beinhaltet jedoch eine Menge kurzer Lösungen für viele scheinbar schwierige Probleme. Berücksichtigen Sie sowohl <makevar>CC</makevar> als auch <makevar>CXX</makevar> Der Port sollte sowohl die CC- wie auch die CXX-Variable berücksichtigen. Damit ist gemeint, dass der Port diese Variablen nicht ohne Rücksicht auf eventuell schon gesetzte Werte einfach überschreiben sollte; stattdessen sollten neue Werte an schon existierende angehängt werden. Dadurch können Build-Optionen, die alle Ports betreffen, global definiert werden. Falls der Port diese Variablen nicht berücksichtigt, sollte NO_PACKAGE=ignores either cc or cxx ins Makefile eingefügt werden. Im Folgenden wird ein Beispiel eines Makefiles gezeigt, welches die beiden Variablen CC und CXX berücksichtigt. Beachten Sie das ?=: CC?= gcc CXX?= g++ Nachfolgend ein Beispiel, welches weder CC noch CXX berücksichtigt: CC= gcc CXX= g++ Die Variablen CC und CXX können auf FreeBSD-Systemen in /etc/make.conf definiert werden. Im ersten Beispiel wird ein Wert nur dann gesetzt, falls dieser vorher noch nicht gesetzt war, um so systemweite Definitionen zu berücksichtigen. Im zweiten Beispiel werden die Variablen ohne Rücksicht überschrieben. Berücksichtigen Sie <makevar>CFLAGS</makevar> Der Port sollte die Variable CFLAGS berücksichtigen. Damit ist gemeint, dass der Port den Wert dieser Variablen nicht absolut setzen und damit existierende Werte überschreiben sollte; stattdessen sollte er weitere Werte der Variablen durch Anhängen hinzufügen. Dadurch können Build-Optionen, die alle Ports betreffen, global definiert werden. Falls der Port diese Variablen nicht berücksichtigt, sollte NO_PACKAGE=ignores cflags ins Makefile eingefügt werden. Im Folgenden wird ein Beispiel eines Makefiles gezeigt, welches die Variable CFLAGS berücksichtigt. Beachten Sie das +=: CFLAGS+= -Wall -Werror Nachfolgend finden Sie ein Beispiel, welches die CFLAGS-Variable nicht berücksichtigt: CFLAGS= -Wall -Werror Die Variable CFLAGS wird auf FreeBSD-Systemen in /etc/make.conf definiert. Im ersten Beispiel werden weitere Flags an die Variable CFLAGS angehängt und somit der bestehende Wert nicht gelöscht. Im zweiten Beispiel wird die Variable ohne Rücksicht überschrieben. Sie sollten Optimierungsflags aus Makefiles Dritter entfernen. Die CFLAGS des Systems beinhalten systemweite Optimierungsflags. Ein Beispiel eines unveränderten Makefiles: CFLAGS= -O3 -funroll-loops -DHAVE_SOUND Werden nun systemweite Optimierungsflags verwendet so würde das Makefile in etwa folgendermaßen aussehen: CFLAGS+= -DHAVE_SOUND Threading-Bibliotheken Die Threading-Bibliothek muss mit Hilfe eines speziellen Linker-Flags -pthread in die Binärdateien unter &os; gebunden werden. Falls ein Port auf ein direktes Verlinken gegen -lpthread oder -lc_r besteht, passen Sie den Port bitte so an, dass er die durch das Port-Framework bereitgestellte Variable PTHREAD_LIBS verwendet. Diese Variable hat üblicherweise den Wert -pthread, kann aber auf einigen Architekturen und &os;-Versionen abweichende Werte haben und daher sollte nie -pthread direkt in Patches geschrieben werden, sondern immer PTHREAD_LIBS. Falls durch das Setzen von PTHREAD_LIBS der Bau des Ports mit der Fehlermeldung unrecognized option '-pthread' abbricht, kann die Verwendung des gcc als Linker durch setzen von CONFIGURE_ENV auf LD=${CC} helfen. Die Option -pthread wird nicht direkt von ld unterstützt. Rückmeldungen Brauchbare Änderungen/Patches sollten an den ursprünglichen Autor/Maintainer der Software geschickt werden, damit diese in der nächsten Version der Software mit aufgenommen werden können. Dadurch wird Ihre Aufgabe für die nächste Version der Software deutlich einfacher. <filename>README.html</filename> Nehmen Sie bitte keine README.html in den Port auf. Diese Datei ist kein Bestandteil der CVS-Sammlung sondern wird durch make readme erzeugt. Einen Port durch <makevar>BROKEN</makevar>, <makevar>FORBIDDEN</makevar> oder <makevar>IGNORE</makevar> als nicht installierbar markieren In manchen Fällen sollten Benutzer davon abgehalten werden einen Port zu installieren. Um einem Benutzer mitzuteilen, dass ein Port nicht installiert werden sollte, gibt es mehrere Variablen für make, die im Makefile des Ports genutzt werden können. Der Wert der folgenden make-Variablen wird dem Benutzer als Grund für die Ablehnung der Installation des Ports zurückgegeben. Bitte benutzen Sie die richtige make-Variable, denn jede enthält eine völlig andere Bedeutung für den Benutzer und das automatische System, das von dem Makefile abhängt, wie der Ports-Build-Custer, FreshPorts und portsmon. Variablen BROKEN ist reserviert für Ports, welche momentan nicht korrekt kompiliert, installiert oder deinstalliert werden. Es sollte für Ports benutzt werden, von denen man annimmt, dass dies ein temporäres Problem ist. Falls angegeben, wird der Build-Cluster dennoch versuchen den Port zu bauen, um zu sehen, ob das zugrunde liegende Problem behoben wurde (das ist jedoch im Allgemeinen nicht der Fall). Benutzen Sie BROKEN zum Beispiel, wenn ein Port: nicht kompiliert beim Konfiguration- oder Installation-Prozess scheitert Dateien außerhalb von ${LOCALBASE} installiert beim Deinstallieren nicht alle seine Dateien sauber entfernt (jedoch kann es akzeptable und wünschenswert sein, Dateien, die vom Nutzer verändert wurden, nicht zu entfernen) FORBIDDEN wird für Ports verwendet, die Sicherheitslücken enthalten oder die ernste Sicherheitsbedenken für das FreeBSD-System aufwerfen, wenn sie installiert sind (z.B. ein als unsicher bekanntes Programm, oder ein Programm, das einen Dienst zur Verfügung stellt, der leicht kompromittiert werden kann). Ports sollten als FORBIDDEN gekennzeichnet werden, sobald ein Programm eine Schwachstelle hat und kein Update veröffentlicht wurde. Idealerweise sollten Ports so bald wie möglich aktualisiert werden wenn eine Sicherheitslücke entdeckt wurde, um die Zahl verwundbarer FreeBSD-Hosts zu verringern (wir schätzen es für unsere Sicherheit bekannt zu sein), obwohl es manchmal einen beachtlichen Zeitabstand zwischen der Bekanntmachung einer Schwachstelle und dem entsprechenden Update gibt. Bitte kennzeichnen Sie einen Port nicht aus irgendeinem Grund außer Sicherheit als FORBIDDEN. IGNORE ist für Ports reserviert, die aus anderen Gründen nicht gebaut werden sollten. Es sollte für Ports verwendet werden, in denen ein strukturelles Problem vermutet wird. Der Build-Cluster wird unter keinen Umständen Ports, die mit IGNORE markiert sind, erstellen. Verwenden Sie IGNORE zum Beispiel, wenn ein Port: kompiliert, aber nicht richtig läuft nicht auf der installierten Version von &os; läuft &os; Kernelquelltext zum Bauen benötigt, aber der Benutzer diese nicht installiert hat ein Distfile benötigt, welches aufgrund von Lizenzbeschränkungen nicht automatisch abgerufen werden kann nicht korrekt mit einem momentan installiertem Port arbeitet (der Port hängt zum Beispiel von www/apache21 ab, aber www/apache13 ist installiert) Wenn ein Port mit einem momentan installiertem Port kollidiert (zum Beispiel, wenn beide eine Datei an die selbe Stelle installieren, diese aber eine andere Funktion hat), benutzen Sie stattdessen CONFLICTS. CONFLICTS setzt IGNORE dann selbstständig. Um einen Port nur auf bestimmte Systemarchitekturen mit IGNORE zu markieren, gibt es zwei Variablen, die automatisch IGNORE für Sie setzen: ONLY_FOR_ARCHS und NOT_FOR_ARCHS. Beispiele: ONLY_FOR_ARCHS= i386 amd64 NOT_FOR_ARCHS= alpha ia64 sparc64 Eine eigene IGNORE-Ausgabe kann mit ONLY_FOR_ARCHS_REASON und NOT_FOR_ARCHS_REASON festgelegt werden. Für eine bestimmte Architektur sind Angaben durch ONLY_FOR_ARCHS_REASON_ARCH und NOT_FOR_ARCHS_REASON_ARCH möglich. Wenn ein Port i386-Binärdateien herunterlädt und installiert, sollte IA32_BINARY_PORT gesetzt werden. Wenn die Variable gesetzt ist, wird überprüft, ob das Verzeichnis /usr/lib32 für IA32-Versionen der Bibliotheken vorhanden ist, und ob der Kernel mit IA32-Kompatibilität gebaut wurde. Wenn eine dieser zwei Voraussetzungen nicht erfüllt ist, wird IGNORE automatisch gesetzt. Anmerkungen zur Implementierung Zeichenketten sollten nicht in Anführungszeichen gesetzt werden. Auch die Wortwahl der Zeichenketten sollte die Art und Weise beachten, wie die Informationen dem Nutzer angezeigt werden. Beispiele: BROKEN= this port is unsupported on FreeBSD 5.x IGNORE= is unsupported on FreeBSD 5.x resultieren in den folgenden Ausgaben von make describe: ===> foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x. ===> foobar-0.1 is unsupported on FreeBSD 5.x. Kennzeichnen eines Ports zur Entfernung durch <makevar>DEPRECATED</makevar> oder <makevar>EXPIRATION_DATE</makevar> Denken Sie bitte daran, dass BROKEN und FORBIDDEN nur als temporärer Ausweg verwendet werden sollten, wenn ein Port nicht funktioniert. Dauerhaft defekte Ports sollten komplett aus der Ports-Sammlung entfernt werden. Wenn es sinnvoll ist, können Benutzer vor der anstehenden Entfernung eines Ports mit DEPRECATED und EXPIRATION_DATE gewarnt werden. Ersteres ist einfach eine Zeichenkette, die angibt, warum der Port entfernt werden soll. Letzteres ist eine Zeichenkette im ISO 8601-Format (JJJJ-MM-TT). Beides wird dem Benutzer gezeigt. Es ist möglich DEPRECATED ohne EXPIRATION_DATE zu setzen (zum Beispiel, um eine neuere Version des Ports zu empfehlen), aber das Gegenteil ist sinnlos. Es gibt keine Vorschrift wie lange die Vorwarnzeit sein muss. Gegenwärtig ist es üblich einen Monat für sicherheitsrelevante Probleme und zwei Monate für Build-Probleme anzusetzen. Dies gibt allen interessierten Committern ein wenig Zeit die Probleme zu beheben. Vermeiden Sie den Gebrauch des <literal>.error</literal>-Konstruktes Der korrekte Weg eines Makefile anzuzeigen, dass der Port aufgrund eines externen Grundes nicht installiert werden kann (zum Beispiel, weil der Benutzer eine ungültige Kombination von Build-Optionen angegeben hat), ist IGNORE auf einen nicht leeren Wert zu setzen. Dieser wird dann formatiert und dem Benutzer von make install ausgegeben. Es ist ein verbreiteter Fehler .error für diesem Zweck zu verwenden. Das Problem dabei ist, dass viele automatisierte Werkzeuge, die mit dem Ports-Baum arbeiten, in dieser Situation fehlschlagen. Am Häufigsten tritt das Problem beim Versuch /usr/ports/INDEX zu bauen auf (siehe ). Jedoch schlagen auch trivialere Befehle wie make -V maintainer in diesem Fall fehl. Dies ist nicht akzeptabel! Wie vermeidet man die Verwendung von <literal>.error</literal> Nehmen Sie an, dass die Zeile USE_POINTYHAT=yes in make.conf enthalten ist. Der erste der folgenden zwei Makefile-Schnipsel lässt make index fehlschlagen, während der zweite dies nicht tut. .if USE_POINTYHAT .error "POINTYHAT is not supported" .endif .if USE_POINTYHAT IGNORE=POINTYHAT is not supported .endif Verwendung von <filename>sysctl</filename> Vom Gebrauch von sysctl wird, außer in Targets, abgeraten. Das liegt daran, dass die Auswertung aller makevars, wie sie während make index verwendet werden, dann den Befehl ausführen muss, welches den Prozess weiter verlangsamt. Die Verwendung von &man.sysctl.8; sollte immer durch die Variable SYSCTL erfolgen, da diese den vollständigen Pfad enthält und überschrieben werden kann, so dies als notwendig erachtet wird. Erneutes Ausliefern von Distfiles Manchmal ändern die Autoren der Software den Inhalt veröffentlichter Distfiles, ohne den Dateinamen zu ändern. Sie müssen überprüfen, ob die Änderungen offizell sind und vom Autor durchgeführt wurden. Es ist in der Vergangenheit vorgekommen, dass Distfiles still und heimlich auf dem Download-Server geändert wurden, um Schaden zu verursachen oder die Sicherheit der Nutzer zu kompromittieren. Verschieben Sie das alte Distfile und laden Sie das neue herunter. Entpacken Sie es und vergleichen Sie den Inhalt mittels &man.diff.1;. Wenn Sie nichts Verdächtiges sehen können Sie distinfo aktualisieren. Stellen Sie sicher, dass die Änderungen in Ihrem PR oder Commit-Protokoll zusammengefasst sind, um zu Gewährleisten, dass nichts Negatives passiert ist. Sie können auch mit den Autoren der Software in Verbindung treten und sich die Änderungen bestätigen lassen. Notwendige Abhilfen (Workarounds) Manchmal ist es nötig Fehler in Programmen, die mit älteren Versionen von &os; ausgeliefert werden, zu umgehen. Einige Versionen von &man.make.1; waren zumindest auf &os; 4.8 und 5.0 in Bezug auf die Behandlung von Vergleichen mit OSVERSION defekt. Dies führte häufig zu Fehlern während make describe (und damit auch während des make index für alle Ports). Abhilfe schafft hier, den bedingten Vergleich in Leerzeichen einzuschließen, z.B.: if ( ${OSVERSION} > 500023 ) Beachten Sie, dass eine Test-Installation eines Ports auf 4.9 oder 5.2 dieses Problem nicht aufspürt. Verschiedenes Die Dateien pkg-descr und pkg-plist sollten beide doppelt kontrolliert werden. Wenn Sie einen Port nachprüfen und glauben, dass man es besser machen kann, dann verbessern Sie ihn bitte. Bitte kopieren Sie nicht noch mehr Exemplare der GNU General Public License in unser System. Bitte überprüfen Sie alle gesetzlichen Punkte gründlich! Lassen Sie uns bitte keine illegale Software verbreiten!
Beispiel eines <filename>Makefile</filename> Hier ein Beispiel für ein Makefile, welches als Vorlage für einen neuen Port dienen kann. Alle zusätzlichen Kommentare in eckigen Klammern müssen entfernt werden! Es wird empfohlen, die hier gezeigte Formatierung zu übernehmen (Reihenfolge der Variablen, Leerzeichen zwischen einzelnen Abschnitten, usw.). Dadurch werden die wichtigen Informationen sofort ersichtlich. Zur Überprüfung Ihres Makefiles sollten Sie portlint verwenden. [the header...just to make it easier for us to identify the ports.] # New ports collection makefile for: xdvi [the "version required" line is only needed when the PORTVERSION variable is not specific enough to describe the port.] # Date created: 26 May 1995 [this is the person who did the original port to FreeBSD, in particular, the person who wrote the first version of this Makefile. Remember, this should not be changed when upgrading the port later.] # Whom: Satoshi Asami <asami@FreeBSD.org> # # $FreeBSD$ [ ^^^^^^^^^ This will be automatically replaced with RCS ID string by CVS when it is committed to our repository. If upgrading a port, do not alter this line back to "$FreeBSD$". CVS deals with it automatically.] # [section to describe the port itself and the master site - PORTNAME and PORTVERSION are always first, followed by CATEGORIES, and then MASTER_SITES, which can be followed by MASTER_SITE_SUBDIR. PKGNAMEPREFIX and PKGNAMESUFFIX, if needed, will be after that. Then comes DISTNAME, EXTRACT_SUFX and/or DISTFILES, and then EXTRACT_ONLY, as necessary.] PORTNAME= xdvi PORTVERSION= 18.2 CATEGORIES= print [do not forget the trailing slash ("/")! if you are not using MASTER_SITE_* macros] MASTER_SITES= ${MASTER_SITE_XCONTRIB} MASTER_SITE_SUBDIR= applications PKGNAMEPREFIX= ja- DISTNAME= xdvi-pl18 [set this if the source is not in the standard ".tar.gz" form] EXTRACT_SUFX= .tar.Z [section for distributed patches -- can be empty] PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/ PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz [maintainer; *mandatory*! This is the person who is volunteering to handle port updates, build breakages, and to whom a users can direct questions and bug reports. To keep the quality of the Ports Collection as high as possible, we no longer accept new ports that are assigned to "ports@FreeBSD.org".] MAINTAINER= asami@FreeBSD.org COMMENT= A DVI Previewer for the X Window System [dependencies -- can be empty] RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript LIB_DEPENDS= Xpm.5:${PORTSDIR}/graphics/xpm [this section is for other standard bsd.port.mk variables that do not belong to any of the above] [If it asks questions during configure, build, install...] IS_INTERACTIVE= yes [If it extracts to a directory other than ${DISTNAME}...] WRKSRC= ${WRKDIR}/xdvi-new [If the distributed patches were not made relative to ${WRKSRC}, you may need to tweak this] PATCH_DIST_STRIP= -p1 [If it requires a "configure" script generated by GNU autoconf to be run] GNU_CONFIGURE= yes [If it requires GNU make, not /usr/bin/make, to build...] USE_GMAKE= yes [If it is an X application and requires "xmkmf -a" to be run...] USE_IMAKE= yes [et cetera.] [non-standard variables to be used in the rules below] MY_FAVORITE_RESPONSE= "yeah, right" [then the special rules, in the order they are called] pre-fetch: i go fetch something, yeah post-patch: i need to do something after patch, great pre-install: and then some more stuff before installing, wow [and then the epilogue] .include <bsd.port.mk> Auf dem Laufenden bleiben Die &os; Ports-Sammlung verändert sich ständig. Hier finden Sie einige Informationen, wie Sie auf dem Laufenden bleiben. FreshPorts Einer der einfachsten Wege, um sich über Aktualisierungen, die bereits durchgeführt wurden, zu informieren, ist sich bei FreshPorts anzumelden. Sie können dort beliebige Ports auswählen, die Sie beobachten möchten. Maintainern wird ausdrücklich empfohlen sich anzumelden, da Sie nicht nur über Ihre eigenen Änderungen informiert werden, sondern auch über die aller anderen Committer (Diese sind oft nötig, um über Änderungen des zugrunde liegenden Frameworks informiert zu bleiben. Obwohl es höflich wäre, vorher über solche Änderungen benachrichtigt zu werden, wird es manchmal vergessen oder ist einfach nicht möglich. Außerdem sind die Änderungen manchmal nur sehr klein. Wir erwarten von jedem in solchen Fällen nach bestem Gewissen zu urteilen). Wenn Sie Fresh-Ports benutzen möchten, benötigen Sie nur einen Account. Falls Sie sich mit einer @FreeBSD.org E-Mailadresse registriert haben, werden Sie den Anmeldelink am rechten Rand der Seite finden. Diejenigen, die bereits einen FeshPorts-Account haben, aber nicht Ihre @FreeBSD.org E-Mailadresse benutzen, können einfach Ihre E-Mailadresse auf @FreeBSD.org ändern, sich anmelden, und dann die Änderung rückgängig machen. FreshPorts bietet auch eine Überprüfungsfunktion, die automatisch alle Committs zum &os; Ports-Baum testet. Wenn Sie sich für diesen Dienst anmelden, werden Sie über alle Fehler, die bei der Überprüfung Ihres Committs auftreten, informiert. Die Webschnittstelle zum Quelltext-Repository Es ist möglich die Dateien des Quellen-Repositories mit Hilfe einer Webschnittstelle durchzusehen. Änderungen, die das gesamte Ports-System betreffen, werden jetzt in der Datei CHANGES dokumentiert. Solche, die nur bestimmte Ports betreffen, in der Datei UPDATING. Aber die maßgebliche Antwort auf alle Fragen liegt zweifellos darin, den Quelltext von bsd.port.mk und dazugehörige Dateien zu lesen. Die &os; Ports-Mailingliste Wenn Sie Maintainer sind, sollten Sie in Erwägung ziehen die &a.ports;-Mailingliste zu verfolgen. Wichtige Änderungen an der grundlegenden Funktionsweise von Ports werden dort angekündigt und dann in CHANGES committet. Der Cluster zum Bauen von &os;-Ports auf <hostid role="hostname">pointyhat.FreeBSD.org</hostid> Eine der weniger bekannten Stärken von &os; ist es, dass ein ganzer Cluster von Maschinen nur dafür reserviert ist, andauernd die Ports-Sammlung zu bauen, und zwar für jedes große &os; Release und jede Tier-1-Architektur. Die Ergebnisse können Sie unter package building logs and errors finden. Alle Ports ausser denjenigen, die als IGNORE markiert sind, werden gebaut. Ports, die als BROKEN markiert sind, werden dennoch ausprobiert, um zu sehen, ob das zugrunde liegende Problem gelöst wurde (Dies wird erreicht, indem TRYBROKEN an das Makefile des Ports übergeben wird). Die &os; Port-Distfile-Prüfung Der Build-Cluster ist dazu bestimmt, das neueste Release jedes Ports aus bereits heruntergeladenden Distfiles zu bauen. Da sich das Internet aber ständig verändert, können Distfiles schnell verloren gehen. Die FreeBSD Ports Distfiles Prüfung versucht jeden Download-Standort für jeden Port anzufragen, um herauszufinden, ob jedes Distfile noch verfügbar ist. Maintainer werden gebeten diesen Bericht regelmäßig durchzusehen, nicht nur, um den Build-Prozess für die Nutzer zu beschleunigen, sondern auch um zu vermeiden, dass auf den Maschinen, die freiwillig zur Verfügung gestellt werden, um all diese Dateien anzubieten, Ressourcen verschwendet werden. Das &os; Ports-Monitoring-System Eine weitere praktische Ressource ist das FreeBSD Ports-Monitoring-System (auch bekannt als portsmon). Dieses System besteht aus einer Datenbank, die Informationen von mehreren Quellen bezieht und es erlaubt diese über ein Webinterface abzufragen. Momentan werden die Ports-Problemberichte (PRs), die Fehlerprotokolle des Build-Clusters und die einzelnen Dateien der Ports-Sammlung verwendet. In Zukunft soll das auf die Distfile-Prüfung und weitere Informationsquellen ausgedehnt werden. Als Ausgangspunkt können Sie alle Informationen eines Ports mit Hilfe der Übersicht eines Ports betrachten. Zum Zeitpunkt des Schreibens ist dies die einzige Quelle, die GNATS PR-Einträge auf Portnamen abbildet (PR-Einreicher geben den Portnamen nicht immer in der Zusammenfassung an, obwohl wir uns das wünschen würden). Also ist portsmon ein guter Anlaufpunkt, wenn Sie herausfinden wollen, ob zu einem existierenden Port PRs oder Buildfehler eingetragen sind. Oder um herauszufinden, ob ein neuer Port, den Sie erstellen wollen, bereits eingereicht wurde.
diff --git a/de_DE.ISO8859-1/share/sgml/mailing-lists.ent b/de_DE.ISO8859-1/share/sgml/mailing-lists.ent index 3dd022940f..fc05aeb3a8 100644 --- a/de_DE.ISO8859-1/share/sgml/mailing-lists.ent +++ b/de_DE.ISO8859-1/share/sgml/mailing-lists.ent @@ -1,633 +1,639 @@ FreeBSD list server"> &a.mailman.listinfo;"> de-bsd-translators@de.FreeBSD.org"> de-bsd-questions@de.FreeBSD.org"> FreeBSD ACPI"> freebsd-acpi"> FreeBSD advocacy"> freebsd-advocacy"> FreeBSD AFS porting"> freebsd-afs"> FreeBSD Adapteci AIC7xxx discussions"> freebsd-aic7xxx"> FreeBSD Alpha porting"> freebsd-alpha"> Porting FreeBSD to AMD64 systems"> freebsd-amd64"> FreeBSD announcements"> freebsd-announce"> FreeBSD Apache"> freebsd-apache"> FreeBSD architecture and design"> freebsd-arch"> FreeBSD ARM porting"> freebsd-arm"> FreeBSD ATM networking"> freebsd-atm"> FreeBSD source code audit"> freebsd-audit"> FreeBSD binary update system"> freebsd-binup"> FreeBSD Bluetooth mailing list"> freebsd-bluetooth"> FreeBSD bugbusters"> freebsd-bugbusters"> FreeBSD problem reports"> freebsd-bugs"> FreeBSD chat"> freebsd-chat"> FreeBSD clustering"> freebsd-cluster"> FreeBSD committers"> FreeBSD core team"> &os.current;"> freebsd-current"> CTM announcements"> ctm-announce"> CTM distribution of CVS files"> ctm-cvs-cur"> CTM 4-STABLE src branch distribution"> ctm-src-4"> CTM -CURRENT src branch distribution"> ctm-src-cur"> CTM user discussion"> ctm-users"> FreeBSD CVS commit message"> cvs-all"> FreeBSD CVS doc commit"> cvs-doc"> FreeBSD CVS ports commit"> cvs-ports"> FreeBSD CVS projects commit"> cvs-projects"> FreeBSD CVS src commit"> cvs-src"> FreeBSD CVSweb maintenance"> freebsd-cvsweb"> FreeBSD based Databases"> freebsd-database"> FreeBSD developers"> Writing device drivers for FreeBSD"> freebsd-drivers"> FreeBSD documentation project"> freebsd-doc"> FreeBSD doc/ Committer"> FreeBSD doc/ developers"> FreeBSD users of Eclipse EDI, tools, rich client apps and ports."> freebsd-eclipse"> FreeBSD-embedded mailing list"> freebsd-embedded"> FreeBSD-emulation"> freebsd-emulation"> FreeBSD-eol mailing list"> freebsd-eol"> FreeBSD FireWire (IEEE 1394) discussion"> freebsd-firewire"> FreeBSD filesystem project"> freebsd-fs"> FreeBSD gecko mailing list"> freebsd-gecko"> FreeBSD GEOM"> freebsd-geom"> FreeBSD GNOME and GNOME applications"> freebsd-gnome"> FreeBSD technical discussions"> freebsd-hackers"> FreeBSD hardware and equipment"> freebsd-hardware"> FreeBSD mirror sites"> freebsd-hubs"> FreeBSD internationalization"> freebsd-i18n"> FreeBSD i386-specific issues"> freebsd-i386"> FreeBSD IA32 porting"> freebsd-ia32"> FreeBSD IA64 porting"> freebsd-ia64"> FreeBSD IPFW code"> freebsd-ipfw"> FreeBSD ISDN"> freebsd-isdn"> FreeBSD Internet service providers"> freebsd-isp"> FreeBSD jails mailing list"> freebsd-jail"> FreeBSD Java Language"> freebsd-java"> FreeBSD related employment"> freebsd-jobs"> FreeBSD KDE/Qt and KDE applications"> freebsd-kde"> FreeBSD LFS porting"> freebsd-lfs"> FreeBSD libh installation and packaging system"> freebsd-libh"> FreeBSD MIPS porting"> freebsd-mips"> FreeBSD mirror site administrators"> mirror-announce"> FreeBSD laptop computer"> freebsd-mobile"> Mono and C# applications on FreeBSD"> freebsd-mono"> FreeBSD port of the Mozilla browser"> freebsd-mozilla"> FreeBSD multimedia"> freebsd-multimedia"> FreeBSD networking"> freebsd-net"> FreeBSD new users"> freebsd-newbies"> New Bus Architecture"> freebsd-new-bus"> FreeBSD OpenOffice"> freebsd-openoffice"> FreeBSD performance"> freebsd-performance"> FreeBSD Perl"> freebsd-perl"> FreeBSD packet filter mailing list"> freebsd-pf"> FreeBSD non-Intel platforms porting"> freebsd-platforms"> FreeBSD core team policy decisions"> freebsd-policy"> FreeBSD ports"> freebsd-ports"> FreeBSD ports/ developers"> FreeBSD ports bugs"> freebsd-ports-bugs"> FreeBSD ports/ Committer"> FreeBSD PowerPC porting"> freebsd-ppc"> Technical discussion of FreeBSD on HP ProLiant server platforms"> freebsd-proliant"> FreeBSD Python mailing list"> freebsd-python"> FreeBSD Quality Assurance"> freebsd-qa"> FreeBSD general questions"> freebsd-questions"> FreeBSD boot script system mailing list"> freebsd-rc"> FreeBSD realtime extensions"> freebsd-realtime"> FreeBSD Ruby mailing list"> freebsd-ruby"> FreeBSD SCSI subsystem"> freebsd-scsi"> FreeBSD security"> freebsd-security"> FreeBSD security notifications"> freebsd-security-notifications"> FreeBSD-small"> freebsd-small"> FreeBSD symmetric multiprocessing"> freebsd-smp"> FreeBSD SPARC porting"> freebsd-sparc64"> FreeBSD src/ Committer"> FreeBSD src/ developers"> &os.stable;"> freebsd-stable"> FreeBSD C99 and POSIX compliance"> freebsd-standards"> FreeBSD sun4v porting mailing list"> freebsd-sun4v"> SVN commit messages for the entire src tree (except for user and projects)"> svn-src-all"> SVN commit messages for the src tree for head/-current"> svn-src-head"> SVN commit messages for the src projects tree"> svn-src-projects"> SVN commit messages for releases in the src tree"> svn-src-release"> SVN commit messages for the release engineering / security commits to the src tree"> svn-src-releng"> SVN commit messages for all the -stable branches of the src tree"> svn-src-stable"> SVN commit messages for only the 6-stable src tree"> svn-src-stable-6"> SVN commit messages for only the 7-stable src tree"> svn-src-stable-7"> + + +SVN commit + messages for only the 8-stable src tree"> +svn-src + stable-8"> SVN commit messages for the old stable src trees"> svn-src-stable-other"> SVN commit messages for the admin / configuration tree"> svn-src-svnadmin"> SVN commit messages for the experimental user src tree"> svn-src-user"> SVN commit messages for the vendor work area tree"> svn-src-vendor"> FreeBSD test"> freebsd-test"> FreeBSD performance and stability testing"> freebsd-testing"> FreeBSD threads"> freebsd-threads"> FreeBSD tokenring"> freebsd-tokenring"> FreeBSD USB"> freebsd-usb"> FreeBSD user group coordination"> freebsd-user-groups"> FreeBSD vendors pre-release coordination"> freebsd-vendors"> Discussion of various virtualization techniques supported by FreeBSD"> freebsd-virtualization"> Diskussion über die Infrastruktur von VuXML"> freebsd-vuxml"> FreeBSD Work-In-Progress Status"> freebsd-wip-status"> FreeBSD Webmaster"> freebsd-www"> FreeBSD X11 mailing list"> freebsd-x11"> FreeBSD port to Xen mailing list"> freebsd-xen"> bug-followup@FreeBSD.org"> majordomo@FreeBSD.org">