diff --git a/de_DE.ISO8859-1/articles/Makefile b/de_DE.ISO8859-1/articles/Makefile index 889dea6346..4ec255330c 100644 --- a/de_DE.ISO8859-1/articles/Makefile +++ b/de_DE.ISO8859-1/articles/Makefile @@ -1,19 +1,20 @@ # # The FreeBSD Documentation Project # The FreeBSD German Documentation Project # # $FreeBSD$ -# $FreeBSDde: de-docproj/articles/Makefile,v 1.5 2007/07/11 18:41:07 jkois Exp $ +# $FreeBSDde: de-docproj/articles/Makefile,v 1.6 2009/01/17 11:49:01 jkois Exp $ # basiert auf: 1.42 SUBDIR = contributing SUBDIR+= contributing-ports SUBDIR+= explaining-bsd SUBDIR+= laptop +SUBDIR+= linux-comparison SUBDIR+= new-users SUBDIR+= version-guide # ROOT_SYMLINKS+= new-users DOC_PREFIX?= ${.CURDIR}/../.. .include "${DOC_PREFIX}/share/mk/doc.project.mk" diff --git a/de_DE.ISO8859-1/articles/linux-comparison/Makefile b/de_DE.ISO8859-1/articles/linux-comparison/Makefile new file mode 100644 index 0000000000..33e518932b --- /dev/null +++ b/de_DE.ISO8859-1/articles/linux-comparison/Makefile @@ -0,0 +1,24 @@ +# +# The FreeBSD Documentation Project +# The FreeBSD German Documentation Project +# +# $FreeBSD$ +# $FreeBSDde: de-docproj/articles/linux-comparison/Makefile,v 1.1 2009/01/17 11:49:02 jkois Exp $ +# basiert auf: 1.1 +# +# Article: Vergleich FreeBSD - Linux + +DOC?= article + +FORMATS?= html html-split +WITH_ARTICLE_TOC?= YES + +INSTALL_COMPRESSED?=gz +INSTALL_ONLY_COMPRESSED?= + +SRCS= article.sgml + +URL_RELPREFIX?= ../../../.. +DOC_PREFIX?= ${.CURDIR}/../../.. + +.include "${DOC_PREFIX}/share/mk/doc.project.mk" diff --git a/de_DE.ISO8859-1/articles/linux-comparison/article.sgml b/de_DE.ISO8859-1/articles/linux-comparison/article.sgml new file mode 100644 index 0000000000..ce620be548 --- /dev/null +++ b/de_DE.ISO8859-1/articles/linux-comparison/article.sgml @@ -0,0 +1,760 @@ + + + +%articles.ent; + +]> + +
+ + &os;: Eine Open Source-Alternative zu &linux; + + + Dru + Lavigne + +
dru@isecom.org
+
+
+ + + 2005 + Dru Lavigne + + + $FreeBSD$ + + + &tm-attrib.freebsd; + &tm-attrib.linux; + &tm-attrib.unix; + &tm-attrib.general; + + + &legalnotice; + + + Das Ziel dieses Artikels ist es, einige der Funktionen und + Vorzüge, die &os; bietet, zu erläutern und an + geeigneten Stellen mit denen von &linux; zu vergleichen. + Dieses Dokument stellt damit einen Ausgangspunkt für + diejenigen dar, die sich für + Open Source-Alternativen zu &linux; interessieren. + + Übersetzt von Fabian Ruch. + +
+ + + Einleitung + + &os; ist ein &unix;-ähnliches Betriebssystem, das auf + der + Berkeley Software Distribution (BSD) + basiert. Während &os; und &linux; häufig als sehr + ähnlich empfunden werden, gibt es doch Unterschiede: + + + + &linux; selbst ist ein Kernel. Distributionen (z.B. + Red Hat, Debian, SUSE) stellen dem Benutzer ein + Installationswerkzeug und Programme zur Verfügung. Auf + der &linux;-Projektseite befindet sich eine Auflistung verschiedener + Distributionen mit mehr als 300 Einträgen. + Während dem Benutzer ein Höchstmaß an + Flexibilität geboten wird, erhöht das Bestehen + dieser Vielzahl an Distributionen auch die Schwierigkeit, + die eigenen Kenntnisse von einer Distribution auf eine + andere zu übertragen. Distributionen unterscheiden sich + nicht nur in der Einfachheit der Installation und der zur + Verfügung stehenden Programme, sie unterscheiden sich + auch in der Verzeichnisstruktur, in den verfügbaren + Shells und Window Managern sowie in den Vorgehensweisen + bei der Installation und Aktualisierung von Software. + + &os; ist ein komplettes Betriebssystem (Kernel und + Userland) mit einem hoch angesehenem Erbe, das bis in die + Wurzeln der &unix;-Entwicklung + + + &os;-Historie + + + zurückreicht. Da der Kernel und die bereitgestellten + Programme unter der Aufsicht desselben + Release Engineering Teams stehen, ist die + Wahrscheinlichkeit gering, dass Inkompatibilitäten + zwischen Bibliotheken auftreten. Mit Sicherheitslücken + kann sich das Security Team zeitnah befassen. Wenn neue + Programm- oder Kernel-Funktionen hinzugefügt werden, + braucht der Benutzer nur die Release Notes lesen, die + auf der &os;-Projektseite + veröffentlicht werden. + + + + &os; verfügt über eine großen und gut + organisierten Entwicklerstamm, der gewährleistet, dass + Änderungen auf schnelle und geregelte Art und Weise + durchgeführt werden. Dazu gehören mehrere tausend + Entwickler, die regelmäßig Code beisteuern, von + denen jedoch nur etwa 300 ein sogenanntes Commit Bit + besitzen, das es ihnen erlaubt, direkt Änderungen am + Kernel, den Programmen und der offiziellen Dokumentation + durchzuführen. Das Release Engineering Team + ist zuständig für die Qualitätssicherung und + das Security Team für die Behandlung von + Sicherheitsproblemen. Des Weiteren existiert eine + gewählte Core Group, die aus + 8 Senior Committern besteht und die Gesamtleitung + des Projekts übernimmt. + + Im Gegensatz dazu müssen Änderungen am + &linux;-Kernel erst vom Kernel Source Maintainer + Linus Torvalds bewilligt werden. Wie Änderungen an + Distributionen erfolgen, kann von Projekt zu Projekt stark + variieren und ist abhängig von der Größe des + jeweiligen Entwicklerstamms sowie dessen + Organisation. + + + + Während &os; und &linux; beide ein + Open Source-Lizenzmodell verwenden, weichen die + tatsächlichen Lizenzen voneinander ab. Der + &linux;-Kernel steht unter der GPL-Lizenz, + &os; dagegen unter der BSD-Lizenz. + Diese und andere Open Source-Lizenzen sind auf der + Website der Open Source-Initiative + näher beschrieben. + + Die Philosophie hinter der GPL will sicherstellen, dass + lizenzierter Code Open Source bleibt. Dies wird + bewerkstelligt, indem die Verteilung von solchem Code + eingeschränkt ist. Dagegen enthält die + BSD-Lizenz keine vergleichbaren + Einschränkungen, wodurch jeder die Freiheit hat, + lizenzierten Code Open Source zu belassen oder für + ein proprietäres kommerzielles Produkt zu + schließen + + + Übersicht über die Vorzüge der beiden + Lizenzen GPL + und BSDL, ohne Partei zu beziehen. + + + . Stabilen und sicheren Code unter die BSD-Lizenz zu stellen + ermöglicht, dass viele Betriebssysteme wie Mac OS X + auf &os;-Code basieren. Daneben bedeutet die Nutzung von + Code unter der BSD-Lizenz in eigenen Projekten auch, dies + tun zu können, ohne Angst vor einer zukünftigen + gesetzlichen Haftung haben zu müssen. + + + + + + Merkmale von &os; + + + Unterstützte Plattformen + + &os; hat sich den guten Ruf erworben, ein sicheres und + stabiles Betriebssystem für die &i386;-Plattform von + &intel; zu sein. Jedoch unterstützt &os; auch die + folgenden Architekturen: + + + + alpha + + + + amd64 + + + + ia64 + + + + &i386; + + + + pc98 + + + + &sparc64; + + + + Außerdem wird laufend an Portierungen von &os; + gearbeitet, welche die folgenden Architekturen + unterstützen: + + + + &arm; + + + + &mips; + + + + &powerpc; + + + + Ständig aktualisierte Listen mit unterstützter + Hardware werden für jede Architektur einzeln gepflegt, + sodass auf einen Blick festgestellt werden kann, ob bestimmte + Hardware unterstützt wird. Für Server gibt es zum + Beispiel ausgezeichnete Unterstützung von + Hardware RAIDs und Netzwerkkarten. + + &os; stellt auch ein großartiges Betriebssystem + für Arbeitsplatzrechner und Laptops dar. Es ist unter + anderem das X Window System verfügbar, das auch + &linux;-Distributionen mitliefern, um dem Benutzer eine + grafische Benutzeroberfläche bieten zu können. + Außerdem stehen mehr als 18.000 Programme Dritter + zur einfachen Installation bereit + + + &os;-Ports: Zur + Installation von Software genügt ein einfaches + pkg_add -r + Paketname + + + . Darunter finden sich KDE, GNOME und OpenOffice. + + Es existieren verschiedene Projekte, welche die + Installation von &os; als Betriebssystem für den + Arbeitsplatz einfacher gestalten wollen. Die nennenswertesten + sind: + + + + DesktopBSD strebt + ein stabiles und leistungsfähiges Betriebssystem + für den Arbeitsplatz an + + + + FreeSBIE + ist als Live-CD von &os; verfügbar + + + + PC-BSD ist + mit seinem einfach zu bedienenden grafischen + Installationswerkzeug gerade für Anwender + geeignet + + + + + + Erweiterbare Frameworks + + &os; verfügt über viele solcher Frameworks, + sodass es problemlos an die eigenen Bedürfnisse angepasst + werden kann. Einige wichtige sind: + + + + Netgraph + + + Netgraph ist ein baukastenartiges + Netzwerkteilsystem, das verwendet werden kann, um die + bestehende Netzwerkinfrastruktur des Kernels zu + erweitern. Entwickler haben durch Hooks die + Möglichkeit, eigene Komponenten abzuleiten. + Infolgedessen gestaltet sich der kurzfristige Bau von + Prototypen und die anschließende + Produktionsentwicklung bei erweiterten Netzwerkdiensten + viel einfacher und weniger fehleranfällig. Viele + funktionsfähige Komponenten werden mit &os; + mitgeliefert, die unter anderem Unterstützung + bieten für: + + + + PPPoE + + + + ATM + + + + ISDN + + + + Bluetooth + + + + HDLC + + + + Etherchannel + + + + Frame Relay + + + + L2TP + + + + + + + GEOM + + + GEOM ist ein baukastenartiges Framework zur + Umsetzung von I/O-Anfragen bei Festplatten. Da es sich + um eine ein- und ausschaltbare Speicherebene handelt, + ist es möglich, neue Speicherdienste schnell zu + entwickeln und sauber in das Speicherteilsystem von &os; + zu integrieren. Einige Beispiele, bei denen dies von + Nutzen sein kann, sind: + + + + Gestaltung von RAID-Lösungen + + + + Bereitstellung kompletter kryptographischer + Sicherung gespeicherter Daten + + + + Neuere &os;-Versionen beinhalten viele + Administrationswerkzeuge, um die bestehenden + GEOM-Komponenten zu verwenden. Zum Beispiel kann mit + Hilfe von &man.gmirror.8; ein Festplattenspiegel, mit + &man.gstripe.8; ein Festplattenzusammenschluss und mit + &man.gshsec.8; ein Shared Secret gesichertes + Gerät erstellt werden. + + + + + GEOM Based Disk Encryption (GBDE) + + + GBDE bietet starken + kryptographischen Schutz für Dateisysteme, + Swap-Geräte und andere Anwendungen von + Speichermedien. Darüber hinaus verschlüsselt + GBDE transparent das gesamte + Dateisystem und nicht nur einzelne Dateien. Es wird + niemals Klartext auf die Festplatte geschrieben. + + + + + Mandatory Access Control (MAC) + + + MAC + ermöglicht eine bessere Zugriffskontrolle für + Dateien und soll die herkömmliche + Betriebssystemautorisierung durch Dateizugriffsrechte + erweitern. Da MAC als + baukastenartiges Framework implementiert ist, kann ein + &os;-System entsprechend der geforderten Richtlinien + konfiguriert werden; von der Erfüllung des HIPAA + bis hin zu den Bedürfnissen eines Systems nach + militärischen Standards. + + &os; beinhaltet Komponenten, die folgende + Richtlinien umsetzen (das Framework ermöglicht + jedoch die Entwicklung von Komponenten zur Umsetzung + jeder geforderten Richtlinie): + + + + Biba-Sicherheitsmodell + + + + Port ACLs + + + + Vertraulichkeit: + Multi Level Security (MLS) + + + + Datenintegrität: + Low Watermark Mandatory Access Control (LOMAC) + + + + Prozessabschottung + + + + + + + Pluggable Authentication Modules (PAM) + + + Sowohl &linux; als auch &os; unterstützen PAM. + Damit hat ein Administrator die Möglichkeit, die + herkömmliche &unix;-Authentifizierung über + Benutzername und Passwort zu erweitern. &os; stellt + Komponenten zur Einbindung vieler + Authentifizierungsmechanismen zur Verfügung; + darunter befinden sich: + + + + Kerberos 5 + + + + OPIE + + + + RADIUS + + + + TACACS+ + + + + Der Administrator hat damit auch die + Möglichkeit, Richtlinien festzulegen, die Probleme + wie die Sicherheit des Benutzerpasswortes + betreffen. + + + + + + + + Sicherheit + + Sicherheit ist von großer Bedeutung für das + &os; Release Engineering Team. + Dies äußert sich in einigen konkreten + Bereichen: + + + + Alle Sicherheitsfragen und Problemlösungen werden + vom Security Team bearbeitet und in Form von + öffentlichen Warnhinweisen bekanntgegeben. Bekannte + Sicherheitsprobleme werden vom Security Team schnell + gelöst. Weitere Informationen zur Vorgehensweise des + &os;-Projekts in Sicherheitsfragen und Verweise auf + Sicherheitsinformationen sind hier verfügbar. + + + + Eines der Probleme im Zusammenhang mit + Open Source-Software ist die riesige Auswahl an + verfügbaren Programmen. Es gibt buchstäblich + zehntausende Open Source-Projekte, wobei jedes + unterschiedlich empfindlich auf Sicherheitsprobleme + reagiert. &os; ist dieser Herausforderung mit VuXML + entgegengetreten. Alle Programme, die zusammen mit &os; + ausgeliefert werden oder in den Ports zur Verfügung + stehen, werden mit einer Datenbank verglichen, die bekannte + und nicht behobene Sicherheitslücken enthält. Ein + Administrator kann &man.portaudit.1; verwenden, um sofort + festzustellen, ob ein installiertes Programm + Sicherheitslücken aufweist, und gegebenenfalls eine + Beschreibung des Problems sowie einen Verweis auf eine + detailliertere Darstellung der Schwachstelle zu + erhalten. + + + + &os; bietet ebenfalls viele Mechanismen, die es einem + Administrator erlauben, das Betriebssystem an die eigenen + Sicherheitsansprüche anzupassen: + + + + &man.jail.8; bietet die Möglichkeit, Prozesse + einzusperren; dies eignet sich besonders für Programme, + die keine eigene Chroot-Umgebung besitzen. + + + + &man.chflags.1; erhöhen die Sicherheit durch + herkömmliche &unix;-Zugriffsrechte. Zum Beispiel kann + festgelegt werden, dass bestimmte Dateien selbst vom + Superuser nicht bearbeitet oder gelöscht werden + können. + + + + &os; stellt drei eingebaute Firewalls mit States- und + NAT-Unterstützung zur Verfügung, um flexibel den + richtigen Regelwerk für die eigenen + Sicherheitsbedürfnisse auswählen zu + können. + + + + Der &os;-Kernel kann schnell und einfach angepasst + werden, um nicht gebrauchte Funktionalität zu + entfernen. Es stehen auch ladbare Module und Werkzeuge zur + Verfügung, um Module aufzulisten, zu laden und zu + entladen. + + + + Der sysctl-Mechanismus erlaubt es einem Administrator, + den Kernel-Status (ohne einen Neustart) anzuzeigen und + und zu ändern. + + + + + + Hilfestellung + + Wie &linux; bietet auch &os; viele Anlaufstellen für + Hilfesuchende, die teilweise kostenlos und teilweise kommerziell + sind. + + + Kostenlose Angebote + + + + &os; ist eines der am besten dokumentierten + Betriebssysteme und die Dokumentation ist sowohl als Teil + des Betriebssystems als auch im Internet verfügbar. + Die Manualpages sind übersichtlich, präzise und + enthalten funktionsfähige Beispiele. Das &os;-Handbuch + bietet Hintergrundinformationen und + Konfigurationsbeispiele zu so ziemlich jeder Anwendung von + &os;. + + + + Es existieren viele Mailinglisten + zu &os;. Der Nachrichtenverkehr wird archiviert und ist + durchsuchbar. Falls eine Frage mit Hilfe des Handbuchs + nicht beantwortet werden konnte, wurde sie mit + größer Wahrscheinlichkeit schon auf einer der + Mailinglisten beantwortet. Handbuch und Mailinglisten + stehen in verschiedenen Sprachen zur Verfügung, die + alle auf der Startseite des &os; Projects + auswählbar sind. + + + + Es gibt viele IRC-Kanäle, Foren und + Benutzergruppen zu &os;. Eine Auswahl finden Sie + hier. + + + + Falls ein &os;-Administrator, -Entwickler oder -Berater + gebraucht wird, sollte eine Aufgabenbeschreibung zusammen mit + dem Einsatzort an freebsd-jobs@FreeBSD.org + gesendet werden. + + + + Kommerzielle Angebote + + Es gibt viele Anbieter kommerzieller Hilfestellung + für &os;. Um einen Anbieter in der Nähe zu finden, + stehen unter anderem folgende Quellen zur + Verfügung: + + + + Eine Liste kommerzieller Anbieter + auf der &os;-Projektseite + + + + FreeBSDMall, die + schon beinahe 10 Jahre kommerzielle Hilfestellung + anbietet + + + + BSDTracker-Datenbank + + + + Es gibt außerdem die Initiative, eine Zertifizierung von + BSD-Systemadministratoren anzubieten. Weitere Informationen dazu + finden Sie unter . + + Projekte, die eine Common Criteria-Zertifizierung + benötigen, können die Hilfe von TrustedBSD in + Anspruch nehmen, um (beispielsweise durch den Einsatz des + &os; MAC Frameworks) diesen Prozess zu erleichtern. + + + + + Vorteile durch die Wahl von &os; + + Es gibt viele Vorteile, die für den Einsatz von &os; in + einer bestehenden Infrastruktur sprechen: + + + + &os; verfügt über gute Dokumentation und + richtet sich nach vielen Standards. Das bedeutet für + vorhandene fortgeschrittene Benutzer und erfahrene + Systemadministratoren, dass bestehende &linux;- und + &unix;-Fähigkeiten kurzerhand mit in die + &os;-Administration übernommen werden + können. + + + + Betriebsinterne Entwickler haben vollen Zugriff auf den + gesamten Code + + + Ferner ist der gesamte Code unter Verwendung einer + Webschnittstelle + durchsuchbar. + + + für jedes einzelne &os; Release; bis hin zum + ersten Release. Zusammen mit dem Code sind alle + Protokolleinträge verfügbar, die den Zusammenhang + für Änderungen und Fehlerbehebungen liefern. + Außerdem kann ein Entwickler jedes Release ohne + Probleme reproduzieren, indem der gewünschte Code nach + Kennzeichnung ausgewählt und geladen wird. Dagegen hat + &linux; dieses Modell traditionell nicht umgesetzt, jedoch + ist inzwischen ein durchdachteres Entwicklungsmodell + + + Es ist ein interessanter Überblick über + das sich entwickelnde Entwicklungsmodell + von &linux; verfügbar. + + + eingeführt worden. + + + + Betriebsinterne Entwickler haben auch vollen Zugriff auf + die GNATS-Fehlerdatenbank + von &os;. Es besteht die Möglichkeit, die Einträge + zu bekannten Fehlern zu durchsuchen und zu verfolgen sowie + eigene Korrekturen zur Abnahme und zum möglichen + Einpflegen in den &os;-Code einzusenden. + + + + Die BSD-Lizenz erlaubt die uneingeschränkte + Anpassung des Codes, damit dieser dem Geschäftszweck + entspricht. Im Gegensatz zur GPL gibt es keine + Einschränkungen, was die Verbreitung des angepassten + Codes angeht. + + + + + + Fazit + + &os; ist ein ausgereiftes &unix;-ähnliches + Betriebssystem, das viele der Eigenschaften besitzt, die von + einem modernen &unix;-System erwartet werden. Für + diejenigen, die eine Open Source-Lösung für eine + bestehende Infrastruktur suchen, ist &os; gewiss eine exzellente + Wahl. + +
+ diff --git a/de_DE.ISO8859-1/books/Makefile b/de_DE.ISO8859-1/books/Makefile index 31ef9b1ac1..a5b2217540 100644 --- a/de_DE.ISO8859-1/books/Makefile +++ b/de_DE.ISO8859-1/books/Makefile @@ -1,18 +1,18 @@ # # The FreeBSD Documentation Project # The FreeBSD German Documentation Project # # $FreeBSD$ -# $FreeBSDde: de-docproj/books/Makefile,v 1.6 2007/08/20 19:11:15 jkois Exp $ +# $FreeBSDde: de-docproj/books/Makefile,v 1.7 2009/02/10 11:36:13 jkois Exp $ # -SUBDIR = developers-handbook +SUBDIR= developers-handbook SUBDIR+= faq SUBDIR+= fdp-primer SUBDIR+= handbook SUBDIR+= porters-handbook ROOT_SYMLINKS= handbook DOC_PREFIX?= ${.CURDIR}/../.. .include "${DOC_PREFIX}/share/mk/doc.project.mk" diff --git a/de_DE.ISO8859-1/books/developers-handbook/book.sgml b/de_DE.ISO8859-1/books/developers-handbook/book.sgml index bfb70f2e6a..66a9699c6a 100644 --- a/de_DE.ISO8859-1/books/developers-handbook/book.sgml +++ b/de_DE.ISO8859-1/books/developers-handbook/book.sgml @@ -1,238 +1,266 @@ %books.ent; %chapters; ]> FreeBSD Developers' Handbook The FreeBSD Documentation Project August 2000 2000 2001 2002 2003 2004 2005 2006 The FreeBSD Documentation Project 2008 2009 The FreeBSD German Documentation Project &bookinfo.legalnotice; &tm-attrib.freebsd; &tm-attrib.apple; &tm-attrib.ibm; &tm-attrib.ieee; &tm-attrib.intel; &tm-attrib.linux; &tm-attrib.microsoft; &tm-attrib.opengroup; &tm-attrib.sun; &tm-attrib.general; - Willkommen zum Entwickler-Handbuch. Dieses Handbuch ist - jederzeit unter Bearbeitung und das - Ergebnis der Arbeit vieler Einzelpersonen. Dies kann - dazu führen, dass bestimmte Bereiche nicht mehr aktuell - sind und auf den neuesten Stand gebracht werden müssen. - Bei Unklarheiten empfiehlt es sich daher stets, auch die - - englische Originalversion des Handbuchs zu lesen. - - Wenn Sie bei der Übersetzung dieses Handbuchs mithelfen - möchten, senden Sie bitte eine E-Mail an die Mailingliste - &a.de.translators;. + Willkommen zum Entwickler-Handbuch. Dieses Handbuch ist + jederzeit unter Bearbeitung und das + Ergebnis der Arbeit vieler Einzelpersonen. Dies kann dazu + führen, dass bestimmte Bereiche nicht mehr aktuell sind + und auf den neuesten Stand gebracht werden müssen. Bei + Unklarheiten empfiehlt es sich daher stets, auch die + englische Originalversion des Handbuchs zu + lesen. + + Wenn Sie bei der Übersetzung dieses Handbuchs + mithelfen möchten, senden Sie bitte eine E-Mail an die + Mailingliste &a.de.translators;. Die aktuelle Version dieses Handbuchs ist immer auf dem &os;-Webserver verfügbar und kann in verschiedenen Formaten und in komprimierter Form vom &os;-FTP-Server oder einem der zahlreichen Spiegel - herunter geladen werden (ältere Versionen finden Sie hingegen - unter ). + url="&url.base;/doc/de_DE.ISO8859-1/books/handbook/mirrors-ftp.html">Spiegel + heruntergeladen werden (ältere Versionen finden Sie + hingegen unter ). Grundlagen &chap.introduction; &chap.tools; &chap.secure; &chap.l10n; &chap.policies; &chap.testing; Interprozess-Kommunikation &chap.sockets; &chap.ipv6; - Kernel &chap.dma; &chap.kernelbuild; &chap.kerneldebug; - Architekturen &chap.x86; - Anhang - - + - - - Dave - A - Patterson - - - John - L - Hennessy - - - 1998Morgan Kaufmann Publishers, - Inc. - 1-55860-428-6 - - Morgan Kaufmann Publishers, Inc. - - Computer Organization and Design - The Hardware / Software Interface - 1-2 + + + Dave + A + Patterson + + + + John + L + Hennessy + + + + + 1998 + Morgan Kaufmann Publishers, Inc. + + + 1-55860-428-6 + + + Morgan Kaufmann Publishers, + Inc. + + + Computer Organization and Design + + The Hardware / Software Interface + + 1-2 - - W. - Richard - Stevens - - - 1993Addison Wesley Longman, - Inc. - 0-201-56317-7 - - Addison Wesley Longman, Inc. - - Advanced Programming in the Unix Environment - 1-2 + + W. + Richard + Stevens + + + + + 1993 + Addison Wesley Longman, Inc. + + + 0-201-56317-7 + + + Addison Wesley Longman, Inc. + + + Advanced Programming in the Unix Environment + + 1-2 - - - Marshall - Kirk - McKusick - - - George - Neville-Neil - - - 2004Addison-Wesley Publishing Company, - Inc. - 0-201-70245-2 - - Addison-Wesley - - The Design and Implementation of the FreeBSD Operating System - 1-2 + + + Marshall + Kirk + McKusick + + + + George + Neville-Neil + + + + + 2004 + Addison-Wesley Publishing Company, Inc. + + + 0-201-70245-2 + + + Addison-Wesley + + + The Design and Implementation of the &os; Operating + System + + 1-2 - - - Aleph - One - - - Phrack 49; "Smashing the Stack for Fun and Profit" + + + Aleph + One + + + + Phrack 49; "Smashing the Stack for Fun and + Profit" - - - Chrispin - Cowan - - - Calton - Pu - - - Dave - Maier - - - StackGuard; Automatic Adaptive Detection and Prevention of - Buffer-Overflow Attacks + + + Chrispin + Cowan + + + + Calton + Pu + + + + Dave + Maier + + + + StackGuard; Automatic Adaptive Detection and Prevention + of Buffer-Overflow Attacks - + Todd Miller + Theo de Raadt + strlcpy and strlcat -- consistent, safe string copy and - concatenation. + concatenation. - - - + diff --git a/de_DE.ISO8859-1/books/developers-handbook/dma/chapter.sgml b/de_DE.ISO8859-1/books/developers-handbook/dma/chapter.sgml index 973f2be73e..e4bfa31553 100644 --- a/de_DE.ISO8859-1/books/developers-handbook/dma/chapter.sgml +++ b/de_DE.ISO8859-1/books/developers-handbook/dma/chapter.sgml @@ -1,1477 +1,1477 @@ Daniel Seuffert Übersetzt von DMA DMA: Was es ist und wie es funktioniert Copyright © 1995,1997 &a.uhclem;, Alle Rechte vorbehalten. 10. Dezember 1996. Letztes Update Oktober 1997. Direct Memory Access (DMA) ist eine Methode, die es erlaubt, Daten von einem Ort in einem Rechner an einen anderen ohne Eingriff des Prozessors (CPU) zu übertragen. Die Art und Weise, in der die DMA-Funktion implementiert ist, variiert zwischen den Rechnerarchitekturen. Daher - beschränken wir uns im Folgenden ausschliesslich auf die + beschränken wir uns im Folgenden ausschließlich auf die Methoden und Implementierungen auf IBM Personal Computer (PC), dem IBM PC/AT und all seinen Nachfolgern und Nachbauten. Das DMA-Subsystem basiert auf dem &intel; 8237 DMA-Controller. Der 8237 enthält vier DMA-Kanäle, welche unabhängig voneinander programmiert werden können, und jeder dieser Kanäle kann zu einem beliebigen Zeitpunkt aktiv sein. Diese Kanäle sind mit 0, 1, 2 und 3 nummeriert. Beginnend mit dem PC/AT fügte IBM einen zweiten 8237-Chip hinzu und nummerierte dessen Kanäle mit 4, 5, 6 und 7. Der originale DMA-Controller (0, 1, 2 and 3) bewegt ein Byte bei jedem Transfer. Der zweite DMA-Controller (4, 5, 6, and 7) bewegt 16-Bits aus zwei benachbarten Speicherplätzen bei jedem Transfer, wobei das erste Byte immer von einer geradzahligen Adresse stammt. Die zwei Controller sind identische Komponenten und der Unterschied in der Transfergröße wird durch die Art und Weise verursacht, wie der zweite Controller im System beschaltet ist. Der 8237 hat zwei elektrische Signale für jeden Kanal: DRQ und -DACK. Zusätzlich gibt es weitere Signale mit den Namen HRQ (Hold Request), HLDA (Hold Acknowledge), -EOP (End of Process) sowie die Kontrollsignale für den Bus: -MEMR (Memory Read), -MEMW (Memory Write), -IOR (I/O Read) und -IOW (I/O Write). Der 8237 DMA-Controller ist ein sogenannter - fly-by-DMA-Controller. Das bedeutet, daß + fly-by-DMA-Controller. Das bedeutet, dass die von einem zu einem anderen Bereich bewegten Daten weder den DMA-Chip durchlaufen noch darin gespeichert werden. Daraus folgt, dass der DMA-Controller nur zwischen einem I/O-Port und einer Speicheradresse Daten bewegen kann, nicht zwischen zwei I/O-Ports oder zwei Speicherbereichen. - Der 8237 erlaubt es, daß zwei Kanäle verbunden + Der 8237 erlaubt es, dass zwei Kanäle verbunden werden, um DMA-Operationen zwischen zwei Speicherbereichen in - einem nicht-fly-by-Modus zu durchzuführen. + einem nicht-fly-by-Modus durchzuführen. Aber niemand in der PC-Industrie benutzt diese begrenzte Resource, da es schneller ist die Daten mittels der CPU zwischen Speicherbereichen zu bewegen. In der PC-Architekur wird jeder DMA-Kanal normalerweise nur dann aktiviert, wenn die Hardware, welche einen gegebenen DMA-Kanal benutzt, einen Transfer durch Setzen der DRQ-Linie verlangt. Beispiel eines DMA-Transfers Hier ist ein Beispiel für die notwendigen Schritte, welche einen DMA-Transfer veranlassen und durchführen. In diesem Beispiel hat der Diskettencontroller (floppy disk controller, FDC) nur ein Byte zu lesen und verlangt vom - DMA-Controller dieses Byte im Speicher an der Adresse - 0x00123456 abzulegen. Der Prozess beginnt damit, daß der + DMA-Controller dieses Byte im Speicher unter der Adresse + 0x00123456 abzulegen. Der Prozess beginnt damit, dass der FDC das DRQ2-Signal (die DRQ-Linie für DMA-Kanal 2) setzt, um den DMA-Controller zu alarmieren. - Der DMA-Controller registriert, daß das DRQ2-Signal - gesetzt ist. Der DMA-Controller stellt sicher, daß der + Der DMA-Controller registriert, dass das DRQ2-Signal + gesetzt ist. Der DMA-Controller stellt sicher, dass der DMA-Kanal 2 programmiert und unmaskiert (freigegeben) ist. Der - DMA-Controller stellt gleichzeitig sicher, daß keiner + DMA-Controller stellt gleichzeitig sicher, dass keiner der anderen DMA-Kanäle aktiv ist oder aktiv sein möchte und eine höhere Prioritäti hat. Sobald all diese Überprüfungen durchlaufen sind, fordert der DMA-Controller die CPU auf, den Bus freizugeben, damit der DMA-Controller ihn nutzen kann. Diese Anforderung erfolgt - durch setzen des HRQ-Signals, welches zur CPU geht. + durch Setzen des HRQ-Signals, welches zur CPU geht. Die CPU erkennt das HRQ-Signal und führt den aktuellen Befehl komplett aus. Sobald die CPU den Bus freigeben kann, wird sie dies tun. Nun sind alle normalerweise von der CPU erzeugten Signale (-MEMR, -MEMW, -IOR, -IOW und ein paar andere) in einem Status mit einem dritten Zustand (weder hoch noch niedrig) und die CPU teilt dem DMA-Controller - mittels des HLDA-Signals mit, daß er nun die Kontrolle + mittels des HLDA-Signals mit, dass er nun die Kontrolle über den Bus hat. Abhängig vom Prozessor kann die CPU noch einige zusätzliche Befehle ausführen ohne die Kontrolle des - Bus, aber letztendlich muß sie warten, wenn sie Befehle + Bus, aber letztendlich muss sie warten, wenn sie Befehle verarbeiten will, welche etwas aus dem Speicher lesen müssen, was nicht im internen Prozessor-Cache oder der Pipeline ist. Da der DMA-Controller nun verantwortlich ist, aktiviert er seine -MEMR, -MEMW, -IOR, -IOW Output-Signale und der Output des DMA-Controllers wird auf 0x3456 gesetzt, damit das zu übertragende Byte zu einem bestimmten Speicherbereich gelangt. Der DMA-Controller verständigt nun das Gerät, - welches die Anforderung veranlasst hat, daß der Transfer - beginnt. Dies geschieht durch setzen des Signals -DACK oder im + welches die Anforderung veranlasst hat, dass der Transfer + beginnt. Dies geschieht durch Setzen des Signals -DACK oder im Fall des Diskettencontrollers durch -DACK2. Der Floppy-Controller ist nun dafür verantwortlich das zu übertragende Byte auf den Datenbahnen des Bus zu platziren. Sofern der Floppy-Controller nicht mehr Zeit braucht, um das Daten-Byte auf den Bus zu bringen (falls dies erforderlich ist benachrichtigt das Peripheriegerät mittels READY-Signal den DMA-Controller), dann wird der DMA-Controller ein Zeitsignal warten und die Signale -MEMW und -IOR widerrufen, damit der Speicher das Byte auf dem Bus - sperrt und speichert und der FDC weiß, daß das + sperrt und speichert und der FDC weiß, dass das Byte übertragen wurde. Da der DMA-Zyklus nur ein einzelnes Byte auf einmal überträgt, wird der FDC nun das Signal DRQ2 - deaktivieren und der DMA-Controller weiß, daß er + deaktivieren und der DMA-Controller weiß, dass er nicht länger benötigt wird. Der DMA-Controller setzt - das -DACK2 -Signal wieder und der FDC registriert, daß - er aufhören muß Daten an den Bus zu senden. + das -DACK2-Signal wieder und der FDC registriert, dass + er aufhören muss Daten an den Bus zu senden. Der DMA-Controller wird nun überprüfen, ob andere DMA-Kanäle irgendwelche Arbeiten bereithalten. Falls keiner der Kanäle DRQ-Signale gesetzt hat, - weiß der Controller, daß er seine Arbeit beendet + weiß der Controller, dass er seine Arbeit beendet hat und setzt -MEMR, -MEMW, -IOR, -IOW und die Adress-Signale auf den dritten Zustand. Abschliessend setzt der DMA-Controller wieder das HRQ-Signal. Die CPU registriert dies und entfernt das HOLDA-Signal wieder. Die CPU aktiviert nun ihre -MEMR, -MEMW, -IOR, -IOW und Adress-Ausgänge und fährt mit der Verarbeitung von Befehlen und dem Zugriff auf Hauptspeicher und Peripherie fort. Für einen typischen Sektor einer Diskette wird der obige Prozess 512 Mal wiederholt, einmal für jedes Byte. Nach dem Transfer eines Byte wird jeweils das Adressregister im DMA-Controller erhöht und der Zähler vermindert, welcher anzeigt, wieviel Bytes noch zu übertragen sind. Sobald der Zähler Null erreicht hat, setzt der - DMA-Controller das EOP-Signal, welches anzeigt, daß der + DMA-Controller das EOP-Signal, welches anzeigt, dass der Zähler Null erreicht hat und keine weiteren Daten zu übertragen sind, bis der DMA-Controller wieder durch die CPU programmiert wird. Dieses Ereignis bezeichnet man als Terminal Count (TC). Es gibt nur ein EOP-Signal und da nur - jeweils ein DMA-Kanal gleichzeitig aktiv sein kann, muß + jeweils ein DMA-Kanal gleichzeitig aktiv sein kann, muss der aktive DMA-Kanal auch derjenige sein, welcher soeben seine Aufgabe beendet hat. Falls ein Peripheriegerät einen Interrupt erzeugen will, wenn der Transfer eines Pufferspeichers beendet ist, dann kann es überprüfen, ob sein -DACK-Signal und EOP-Signal gleichzeitig anliegen. Falls dies zutrifft wird der DMA-Controller keine weiteren Informationen ohne Eingriff der CPU für dieses Peripheriegerät übertragen. Das Peripheriegerät kann nun eines der Interrupt-Signale einfügen, um die Aufmerksamkeit der CPU zu erlangen. In der PC-Architektur ist der DMA-Controller selbst nicht in der Lage Interrupts zu erzeugen. Das Peripheriegerät und seine beigeordnete Hardware sind für die Erzeugung jedes Interrupts verantwortlich, welcher auftritt. In der Folge gibt es Peripheriegeräte, welche DMA nutzen aber keine Interrupts erzeugen. - Es ist wichtig zu verstehen, daß obwohl die CPU + Es ist wichtig zu verstehen, dass obwohl die CPU jedesmal den Bus an den DMA-Controller freigibt, wenn dieser ihn anfordert, dieser Vorgang sowohl für das - Betriebssystem als auch die Applikation unsichtbar ist ausser - kleinen Änderungen im Zeitbedarf, des Prozessors beim + Betriebssystem als auch die Applikation unsichtbar ist - außer + bei kleinen Änderungen im Zeitbedarf des Prozessors beim Ausführen von Befehlen, wenn der DMA-Controller aktiv - ist. Folglich muß der Prozessor die + ist. Folglich muss der Prozessor die Peripheriegeräte und die Register im DMA-Chip ständig abfragen oder einen Interrupt von einem - Peripheriegerät empfangen, um sicher zu sein, daß + Peripheriegerät empfangen, um sicher zu sein, dass ein bestimmter DMA-Transfer beendet wurde. DMA-Seitenregister und 16 Megabyte-Adressraumbeschränkungen - Sie haben vielleicht vorhin bemerkt, daß der + Sie haben vielleicht vorhin bemerkt, dass der DMA-Controller die Adress-Linien nicht auf 0x00123456 gesetzt hat, wie wir angaben, sondern auf 0x3456. Der Grund hierfür erfordert ein wenig Erklärung. Als der originale IBM PC entworfen wurde hat IBM entschieden sowohl DMA als auch Interrupt-Controller einzusetzen, welche für den 8085 entwickelt worden waren, einen 8 Bit-Prozessor mit einem Adressraum von 16 Bit (64K). - Da der IBM PC mehr als 64K unterstützte mußte etwas + Da der IBM PC mehr als 64K unterstützte, musste etwas geschehen, damit der DMA-Controller Adressbereiche oberhalb der 64K-Grenze auslesen und beschreiben konnte. IBM führte einen zusätzlichen, externen Signalspeicher für jeden DMA-Kanal ein, welcher die oberen Bits einer Adresse enthält, welche ausgelesen oder beschrieben werden soll. Immer wenn ein DMA-Controller aktiv ist, wird der Inhalt dieses Signalspeichers cwauf denzum Adress-Bus geschrieben und dort gehalten, bis die DMA-Operation für diesen Kanal beendet ist. IBM nannte diese zusätzlichen Signalspeicher Seitenregister (Page Register). Für das obige Beispiel würde der DMA-Controller also den 0x3456-Teil der Adresse auf den Bus setzen und das Seitenregister für den DMA-Kanal 2 würde dem Bus 0x0012xxxx hinzufügen. Zusammen bilden beide Werte die komplette Speicheradresse, auf die zugegriffen werden soll. Da das Seitenregister unabhängig vom DMA-Chip ist, darf der zu lesende oder zu schreibende Speicherbereich die 64K-Grenze nicht überschreiten. Wenn der DMA-Controller beispielsweise auf die Speicheradresse 0xffff zugreift, dann wird der Controller nach dem Transfer das Adress-Register erhöhen und auf das nächste Byte an der Adresse 0x0000, nicht 0x10000, zugreifen. Dieses Zuzulassen ist wahrscheinlich nicht beabsichtigt. Physikalische 64K-Grenzen sollten nicht mit 8086-Modus 64K-Segmenten verwechselt werden, welche durch mathematisches Addieren eines Segment-Registers an ein Offset-Register erzeugt werden. Seitenregister haben keinen Adressüberhang und werden imathematisch durch ein OR zusammengefügt. - Um die Angelegenheit noch komplizierter zu machen weisen - die externen DMA Signalspeicher auf dem PC/AT nur 8 Bytes auf, - also 8+16 = 24 Bits. Dies bedeutet, daß der + Um die Angelegenheit noch komplizierter zu machen, weisen + die externen DMA-Signalspeicher auf dem PC/AT nur 8 Bytes auf, + also 8+16 = 24 Bits. Dies bedeutet, dass der DMA-Controller nur auf Speicherbereiche zwischen 0 und 16 Megabyte zeigen kann. Für neuere Rechner, die mehr als 16 Megabyte an Speicher aufweisen, kann der Standard PC-kompatible DMA-Controller keine Speicherbereiche oberhalb von 16 Megabyte adressieren. Um diese Beschränkung zu umgehen reservieren Betriebssysteme einen RAM-Puffer in einem Bereich unterhalb von 16 Megabyte, der außerdem einen physisch begrenzten Bereich von 64K nicht überschreitet. Dann wird der - DMA-Controller so programmiert, daß er Daten vom + DMA-Controller so programmiert, dass er Daten vom Peripheriegerät in diesen Puffer überträgt. Sobald der DMA-Controller die Daten in den Puffer übertragen hat, wird das Betriebssystem sie in den Bereich übertragen, an dem sie wirklich gespeichert werden sollen. Beim Schreiben von Daten von Adressen oberhalb von 16 Megabyte an ein DMA-basiertes Peripheriegerät müssen die Daten zuerst von dort, wo sie liegen, in einen Puffer unterhalb von 16 Megabyte geschrieben werden und dann kann der DMA-Controller die Daten vom Puffer auf die Peripherie kopieren. In FreeBSD werden diese reservierten Puffer Bounce Buffers genannt. In der &ms-dos;-Welt werden sie manchmal als Smart Buffers bezeichnet. Eine neuere Ausführung des 8237, 82374 genannt, weist 16 Bit-Seitenregister auf und erlaubt Zugriff auf den gesamten 32 Bit Adressraum ohne Zuhilfenahme von Bounce Buffers. DMA-Operationsmodi und Einstellungen Der 8237 DMA-Controller kann in verschiedenen Modi betrieben werden. Die Wichtigsten sind: Single Ein einziges Byte (oder Wort) wird übertragen. - Der DMA-Controller muß für jedes + Der DMA-Controller muss für jedes zusätzliche Byte den Bus freigeben und neu anfordern. Dieser Modus wird normalerweise von Geräten benutzt, welche nicht einen gesamten Block von Daten auf einmal übertragen können. Das Peripheriegerät wird den DMA-Controller jedesmal anfordern, wenn es für einen weiteren Transfer bereit ist. Der Standard PC-kompatible Floppy-Controller (NEC 765) hat nur einen Puffer mit einem Byte, daher nutzt er diesen Modus. Block/Demand Sobald der DMA-Controller den Bus übernommen - hat wird ein ganzer Block von Daten übertragen bis + hat, wird ein ganzer Block von Daten übertragen bis zu einem Maximum von 64K. Wenn das Peripheriegerät zusätzliche Zeit benötigt, kann es das READY-Signal setzen, um den Transfer kurzfristig zu unterbrechen. READY sollte nicht exzessiv benutzt werden und für langsame Peripheriegeräte sollte stattdessen der Single Transfer-Modus genutzt werden. Der Unterschied zwischen Block und Demand ist, - daß sobald ein Block-Transfer gestartet ist, + dass sobald ein Block-Transfer gestartet ist, dieser solange läuft, bis der Transfer-Zähler - Null erreicht. DRQ muß nur gesetzt werden, bis + Null erreicht. DRQ muss nur gesetzt werden, bis -DACK gesetzt wird. Der Demand-Modus überträgt - ein weiteres Byte bis DRQ gelöscht wird. An diesem + ein weiteres Byte, bis DRQ gelöscht wird. An diesem Punkt unterbricht der DMA-Controller die Übertragung und gibt den Bus wieder an die CPU zurück. Wenn DRQ wieder eingesetzt wird geht der Transfer an der Stelle weiter, an welcher er unterbrochen wurde. Ältere Festplattencontroller benutzten den Demand-Modus bis die CPU-Geschwindigkeiten stiegen, sodass der Transfer mittels CPU schneller war, insbesondere wenn die benutzten Speicherbereiche jenseits der 16 Megabyte-Marke lagen. Cascade Dieser Mechanismus erlaubt einem DMA-Kanal den Bus anzufordern, wobei dann aber das zugehörige Peripheriegerät dafür verantwortlich ist die Adressinformationen an den Bus zu senden anstatt des DMA-Controllers. Dies wird auch dazu genutzt, um eine Technik zu implementieren, die man als Bus Mastering bezeichnet. Wenn ein DMA-Kanal im Cascade-Modus Kontrolle über den Bus erlangt, dann stellt der Controller nicht die Adressen und I/O-Kontrollsignale auf den Bus, wie es normalerweise der Fall ist. Stattdessen setzt der Controller nur das -DACK-Signal für den aktiven DMA-Kanal. Nun ist es Aufgabe Peripheriegerätes, welches mit diesem DMA-Kanal verbunden ist, die Adressen und Bus-Kontrollsignale zu liefern. Das Peripheriegerät hat vollständige Kontrolle über den Bus und kann Lese- oder Schreibvorgänge an jeder Adresse unterhalb von 16 Megabyte ausführen. Wenn es fertig ist, setzt es das DRQ-Signal und der DMA-Controller kann die Kontrolle an die CPU oder einen anderen DMA-Kanal übergeben. Der Cascade-Modus kann verwendet werden, um mehrere DMA-Controller in Reihe zu schalten und genau dafür wird der DMA-Kanal 4 in der PC-Architektur genutzt. Wenn ein Peripheriegerät den Bus auf den DMA-Kanälen 0, 1, 2 oder 3 verlangt, dann setzt der abhängige DMA-Controller (slave DMA) HLDREQ, aber dieses Signal ist in Wirklichkeit verbunden mit DRQ4 auf dem primären DMA-Controller anstatt mit der CPU. Der primäre DMA-Controller nimmt an, er habe Arbeit zu leisten auf Kanal 4, und fordert den Bus an von der CPU mit dem HLDREQ-Signal. Sobald die CPU die Kontrolle des Bus an den primären DMA-Controller übergeben hat, wird -DACK4 gesetzt und dieser Kanal ist in Wirklichkeit mit dem abhängigen DMA-Controller über das HDLA-Signal verbunden. Der abhängige Controller überträgt dann die Daten für den DMA-Kanal, der die Anforderung gestellt hat (0, 1, 2 oder 3) oder der Controller übergibt den Bus an ein Peripheriegerät, welches selbst ein eigenes Bus-Mastering durchführen will, z.B. einen SCSI-Controller. Wegen dieser Schaltungsanordnung können auf PC/AT-Systemen nur die DMA-Kanäle 0, 1, 2, 3, 5, 6 und 7 mit Peripheriegeräten genutzt werden. Der DMA-Kanal 0 war auf frühen IBM PCs für Auffrischungs-Operationen reserviert, aber auf modernen Rechnern ist er allgemein für Peripheriegeräte verfügbar. Wenn ein Peripheriegerät Bus Mastering - durchführt ist es wichtig, daß es konstant + durchführt, ist es wichtig, dass es konstant Daten vom oder zum Speicher überträgt, solange es die Kontrolle über den Bus hält. Falls das - Peripheriegerät dies nicht kann muß es den + Peripheriegerät dies nicht kann, muss es den Bus häufig freigeben, damit das System Auffrischungsoperationen am Hauptspeicher vornehmen kann. Das dynamische RAM als Hauptspeicher in allen PCs - muß regelmässig aufgefrischt werden, damit + muss regelmäßig aufgefrischt werden, damit die gespeicherten Bits geladen gehalten - werden. Dynamisches Ram besteht aus Millionen + werden. Dynamisches Ram besteht aus Millionen von Transistoren, die jedes ein Bit Daten enthalten. Die Transistoren sind geladen, um 1 darzustellen, oder entladen, um 0 zu repräsentieren. Da alle Transistoren Ladung - abgeben, muß in regelmässigen Abständen + abgeben, muss in regelmäßigen Abständen der Ladungsinhalt aufgefrischt werden durch Wiederbeschreibung, um den Wert 1 zu erhalten. Die RAM-Chips übernehmen diese Aufgabe selbst, aber sie müssen dazu vom Rest des Rechners angewiesen werden, damit die Auffrischungsaktivitäten nicht mit den normalen Zugriffen auf das RAM kollidieren. Falls der Rechner das RAM nicht auffrischen kann wird der Inhalt des Speichers binnen weniger Millisekunden beschädigt. Da Lese- und Schreibzyklen als Auffrischungszyklen zählen (ein Auffrischungszyklus eines dynamischen RAM ist in Wirklichkeit ein unvollständiger Lesezyklus), wird diese Aktion den gesamten Speicher auffrischen, solange der abhängige Controller fortfährt Daten an aufeinander folgenden Speicherbereiche zu lesen oder dorthin zu schreiben. Bus-Mastering findet man in einigen SCSI-Controllern und anderen hochwertigen Peripherie-Controllern. Autoinitialize Dieser Modus veranlasst den DMA-Controller dazu Byte-, Block- oder Demand-Transfers auszuführen. Aber wenn der DMA-Übertragungszähler Null erreicht hat, dann werden die Zähler und Adressen wieder auf den Wert zurückgesetzt, den sie - aufweisen, als der DMA-Kanal ursprünglich - programmiert wurde. Daß bedeutet, daß + aufwiesen, als der DMA-Kanal ursprünglich + programmiert wurde. Das bedeutet, dass Transfers zugelassen werden, solange das Peripheriegerät sie anfordert. Es ist Aufgabe der CPU neue Daten rechtzeitig in den Puffer zu schicken, damit das Peripheriegerät sie schreiben kann bzw. die neuen Daten aus dem Puffer zu lesen, wenn der DMA-Controller bei Eingabeoperationen Daten schreibt. Diese Technik wird häufig bei Audiogeräten genutzt, die kleine oder gar keine Sample-Puffer in Hardware aufweisen. Dadurch entsteht zusätzlicher CPU-Overhead bei der Verwaltung dieses zirkulären Puffers, aber in manchen Fällen ist es der einzige Weg, um die Latenz zu beseitigen, die auftritt, wenn der DMA-Zähler Null erreicht und der DMA-Controller mit den Transfers anhält, bis er neu programmiert ist. Das Programmieren des DMA-Controllers Der zu programmierende DMA-Kanal sollte immer maskiert werden, bevor irgendwelche Einstellungen geladen werden. Dies soll deswegen geschehen, weil die Hardware unerwarteterweise DRQ für diesen Kanal setzen könnte und der Controller könnte antworten, obwohl noch nicht alle Parameter geladen oder aktualisiert wurden. - Nach der Maskierung muß der Host die Richtung des + Nach der Maskierung muss der Host die Richtung des Transfers festlegen (Speicher-zu-I/O oder I/O-zu-Speicher), welcher DMA-Modus für den Transfer genutzt wird (Single, - Block, Demand, Cascade, etc) und schliesslich werden die + Block, Demand, Cascade, etc.) und schließlich werden die Adresse und die Länge des Transfers geladen. Die Länge ist um 1 kleiner als die durch den DMA-Controller zu übertragende. Das LSB und das MSB der Adresse und der Länge werden auf den gleichen 8 Bit I/O-Port geschrieben, - also muß zunächst ein anderer Port geschrieben - werden, um zu gewährleisten, daß der DMA-Controller + also muss zunächst ein anderer Port geschrieben + werden, um zu gewährleisten, dass der DMA-Controller das erste Byte als LSB und das zweite Byte als MSB der Länge und der Adresse akzeptiert. - Stellen Sie dann sicher, daß Sie das Seitenregister - aktualisiert haben, welches extern zum DMA-Controller ist, und + Stellen Sie dann sicher, dass Sie das Seitenregister + aktualisiert haben, welches extern zum DMA-Controller ist und durch ein anderes Set von I/O-Ports angesprochen wird. - Sobald alle Einstellungen fertig sind kann der DMA-Kanal + Sobald alle Einstellungen fertig sind, kann der DMA-Kanal demaskiert werden. Dieser Kanal wird nun als geschützt betrachtet und wird antworten, wenn die DRQ-Linie für diesen Kanal gesetzt wird. Schlagen Sie im Hardware Handbuch für ausführliche Programmierdetails zum 8237 nach. Sie werden auch auf die I/O-Portübersicht für den PC zurückgreifen mü, welches beschreibt, wo die DMA-Register und Seitenregister sich befinden. Eine vollständige Tabelle der Ports finden Sie unten. DMA Port-Übersicht - Alle Systeme die auf dem IBM-PC und PC/AT basieren weisen + Alle Systeme, die auf dem IBM-PC und PC/AT basieren, weisen die gleiche DMA-Hardware an identischen I/O-Ports auf. Die vollständige Liste ist unten aufgeführt. Dem DMA-Controller #2 zugewiesene Ports sind auf nicht-AT-Systemeni undefiniert. 0x00–0x1f DMA-Controller #1 (Kanäle 0, 1, 2 und 3) - DMA Adress- und Zähl-Register + DMA-Adressregister und -Zählregister 0x00 write Kanal 0 Startadresse 0x00 read Kanal 0 gegenwärtige Adresse 0x01 write Kanal 0 Anfangs-Wortnummer 0x01 read Kanal 0 verbleibende Wortzahl 0x02 write Kanal 1 Startadresse 0x02 read Kanal 1 gegenwärtige Adresse 0x03 write Kanal 1 Anfangs-Wortnummer 0x03 read Kanal 1 verbleibende Wortzahl 0x04 write Kanal 2 Startadresse 0x04 read Kanal 2 gegenwärtige Adresse 0x05 write Kanal 2 Anfangs-Wortnummer 0x05 read Kanal 2 verbleibende Wortzahl 0x06 write Kanal 3 Startadresse 0x06 read Kanal 3 gegenwärtige Adresse 0x07 write Kanal 3 Anfangs-Wortnummer 0x07 read Kanal 3 verbleibende Wortzahl DMA-Befehlsregister 0x08 write Befehlsregister 0x08 read Status-Register 0x09 write Anforderungsregister 0x09 read - 0x0a write Single Mask Register Bit 0x0a read - 0x0b write Modusregister 0x0b read - 0x0c write Flip-Flop zm Löschen des LSB/MSB 0x0c read - 0x0d write Master Clear/Reset 0x0d read Temporäres Register (in neueren Versionen nicht verfügbar). 0x0e write Läsche Mask-Register 0x0e read - 0x0f write Schreibe alle Mask-Register-Bits 0x0f read Lese alle Mask-Register-Bits (nur auf &intel; 82374) - 0xc0–0xdf DMA-Controller #2 (Kanals 4, 5, 6 and + <title>0xc0–0xdf DMA-Controller #2 (Kanäle 4, 5, 6 und 7) - DMA Adressen- und Zählerregister + DMA-Adressregister und -Zählregister 0xc0 write Kanal 4 Startadresse 0xc0 read Kanal 4 gegenwärtige Adresse 0xc2 write Kanal 4 Anfangs-Wortnummer 0xc2 read Kanal 4 verbleibende Wortzahl 0xc4 write Kanal 5 Startadresse 0xc4 read Kanal 5 gegenwärtige Adresse 0xc6 write Kanal 5 Anfangs-Wortnummer 0xc6 read Kanal 5 verbleibende Wortzahl 0xc8 write Kanal 6 Startadresse 0xc8 read Kanal 6 gegenwärtige Adresse 0xca write Kanal 6 Anfangs-Wortnummer 0xca read Kanal 6 verbleibende Wortzahl 0xcc write Kanal 7 Startadresse 0xcc read Kanal 7 gegenwärtige Adresse 0xce write Kanal 7 Anfangs-Wortnummer 0xce read Kanal 7 verbleibende Wortzahl - DMA Befehlsregisters + DMA-Befehlsregister 0xd0 write Befehlsregister 0xd0 read Status-Register 0xd2 write Anforderungsregister 0xd2 read - 0xd4 write Single Mask Register Bit 0xd4 read - 0xd6 write Modusregister 0xd6 read - 0xd8 write Flip-Flop zum Löschen des LSB/MSB 0xd8 read - 0xda write Master Clear/Reset 0xda read temporäres Register (nicht verfügbar auf &intel; 82374) 0xdc write Lösche Mask-Register 0xdc read - 0xde write Schreibe alle Mask-Register-Bits 0xdf read Lese alle Mask-Register-Bits (nur auf &intel; 82374) 0x80–0x9f DMA-Seitenregister 0x87 r/w Kanal 0 niederes Byte (23-16) Seitenregister 0x83 r/w Kanal 1 niederes Byte (23-16) Seitenregister 0x81 r/w Kanal 2 niederes Byte (23-16) Seitenregister 0x82 r/w Kanal 3 niederes Byte (23-16) Seitenregister 0x8b r/w Kanal 5 niederes Byte (23-16) Seitenregister 0x89 r/w Kanal 6 niederes Byte (23-16) Seitenregister 0x8a r/w Kanal 7 niederes Byte (23-16) Seitenregister 0x8f r/w niederes Byte Seitenauffrischung 0x400–0x4ff 82374 Erweiterte DMA-Register Die &intel; 82374 EISA-System-Komponente (EISA System Component ESC) wurde Anfang 1996 eingeführt und beinhaltet einen DMA-Controller, der die Funktionen des 8237 und zusätzlich andere PC-kompatible Kern-Peripheriekomponenten in einer einzigen Komponente vereint. Dieser Chip wurde für EISA und PCI-Plattformen entworfen und stellt moderne DMA-Funktionen wie Scatter-Gather, Ring-Puffer und direkten Zugriff des DMA-Controllers auf alle 32 Bit des Adressraumes zur Verfügung. Werden diese Leistungsmerkmale genutzt, dann sollte Code hinzugefügt werden, der die gleiche Funktionalität für Geräte aus den 16 Jahren PC-kompatibler Geräte vor diesem Chip zur Verfügung stellt. Aus Kompatibilitätsgründen müssen einige der Register des 82374 programmiert werden nachdem die traditionellen Register des 8237 für jeden Transfer programmiert wurden. Das - Schreiben auf eines der traditionellen 8237-Register - führt dazu, daß einige der erweiterten Register - des 82374 aus Kompatibilitätsgründeni auf Null + Schreiben in eines der traditionellen 8237-Register + führt dazu, dass einige der erweiterten Register + des 82374 aus Kompatibilitätsgründen auf Null gesetzt werden. 0x401 r/w Kanal 0 hohes Byte (Bits 23-16) Word-Zähler 0x403 r/w Kanal 1 hohes Byte (Bits 23-16) Word-Zähler 0x405 r/w Kanal 2 hohes Byte (Bits 23-16) Word-Zähler 0x407 r/w Kanal 3 hohes Byte (Bits 23-16) Word-Zähler 0x4c6 r/w Kanal 5 hohes Byte (Bits 23-16) Word-Zähler 0x4ca r/w Kanal 6 hohes Byte (Bits 23-16) Word-Zähler 0x4ce r/w Kanal 7 hohes Byte (Bits 23-16) Word-Zähler 0x487 r/w Kanal 0 hohes Byte (Bits 31-24) Seitenregister 0x483 r/w Kanal 1 hohes Byte (Bits 31-24) Seitenregister 0x481 r/w Kanal 2 hohes Byte (Bits 31-24) Seitenregister 0x482 r/w Kanal 3 hohes Byte (Bits 31-24) Seitenregister 0x48b r/w Kanal 5 hohes Byte (Bits 31-24) Seitenregister 0x489 r/w Kanal 6 hohes Byte (Bits 31-24) Seitenregister 0x48a r/w Kanal 6 hohes Byte (Bits 31-24) Seitenregister 0x48f r/w hohes Byte Seitenauffrischung 0x4e0 r/w Kanal 0 Halteregister (Bits 7-2) 0x4e1 r/w Kanal 0 Halteregister (Bits 15-8) 0x4e2 r/w Kanal 0 Halteregister (Bits 23-16) 0x4e4 r/w Kanal 1 Halteregister (Bits 7-2) 0x4e5 r/w Kanal 1 Halteregister (Bits 15-8) 0x4e6 r/w Kanal 1 Halteregister (Bits 23-16) 0x4e8 r/w Kanal 2 Halteregister (Bits 7-2) 0x4e9 r/w Kanal 2 Halteregister (Bits 15-8) 0x4ea r/w Kanal 2 Halteregister (Bits 23-16) 0x4ec r/w Kanal 3 Halteregister (Bits 7-2) 0x4ed r/w Kanal 3 Halteregister (Bits 15-8) 0x4ee r/w Kanal 3 Halteregister (Bits 23-16) 0x4f4 r/w Kanal 5 Halteregister (Bits 7-2) 0x4f5 r/w Kanal 5 Halteregister (Bits 15-8) 0x4f6 r/w Kanal 5 Halteregister (Bits 23-16) 0x4f8 r/w Kanal 6 Halteregister (Bits 7-2) 0x4f9 r/w Kanal 6 Halteregister (Bits 15-8) 0x4fa r/w Kanal 6 Halteregister (Bits 23-16) 0x4fc r/w Kanal 7 Halteregister (Bits 7-2) 0x4fd r/w Kanal 7 Halteregister (Bits 15-8) 0x4fe r/w Kanal 7 Halteregister (Bits 23-16) 0x40a write Kanal 0-3 Chaining-Modusregister 0x40a read Kanal Interrupt Status-Register 0x4d4 write Kanal 4-7 Chaining-Modusregister 0x4d4 read Chaining Mode Status 0x40c read Chain Buffer Expiration Kontrollregister 0x410 write Kanal 0 Scatter-Gather Befehlsregister 0x411 write Kanal 1 Scatter-Gather Befehlsregister 0x412 write Kanal 2 Scatter-Gather Befehlsregister 0x413 write Kanal 3 Scatter-Gather Befehlsregister 0x415 write Kanal 5 Scatter-Gather Befehlsregister 0x416 write Kanal 6 Scatter-Gather Befehlsregister 0x417 write Kanal 7 Scatter-Gather Befehlsregister 0x418 read Kanal 0 Scatter-Gather Statusregister 0x419 read Kanal 1 Scatter-Gather Statusregister 0x41a read Kanal 2 Scatter-Gather Statusregister 0x41b read Kanal 3 Scatter-Gather Statusregister 0x41d read Kanal 5 Scatter-Gather Statusregister 0x41e read Kanal 5 Scatter-Gather Statusregister 0x41f read Kanal 7 Scatter-Gather Statusregister 0x420-0x423 r/w Kanal 0 Scatter-Gather Descriptor Table Pointer Register 0x424-0x427 r/w Kanal 1 Scatter-Gather Descriptor Table Pointer Register 0x428-0x42b r/w Kanal 2 Scatter-Gather Descriptor Table Pointer Register 0x42c-0x42f r/w Kanal 3 Scatter-Gather Descriptor Table Pointer Register 0x434-0x437 r/w Kanal 5 Scatter-Gather Descriptor Table Pointer Register 0x438-0x43b r/w Kanal 6 Scatter-Gather Descriptor Table Pointer Register 0x43c-0x43f r/w Kanal 7 Scatter-Gather Descriptor Table Pointer Register diff --git a/de_DE.ISO8859-1/books/developers-handbook/policies/Makefile b/de_DE.ISO8859-1/books/developers-handbook/policies/Makefile index f5ad879ef5..b27ef581cd 100644 --- a/de_DE.ISO8859-1/books/developers-handbook/policies/Makefile +++ b/de_DE.ISO8859-1/books/developers-handbook/policies/Makefile @@ -1,17 +1,17 @@ # # Build the Handbook with just the content from this chapter. # # $FreeBSD$ -# $FreeBSDde: de-docproj/books/developers-handbook/policies/Makefile,v 1.1.1.1 2007/08/01 19:18:33 as Exp $ +# $FreeBSDde: de-docproj/books/developers-handbook/policies/Makefile,v 1.2 2009/02/14 22:12:52 miwi Exp $ # basiert auf: 1.1 # CHAPTERS= policies/chapter.sgml VPATH= .. MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX} DOC_PREFIX?= ${.CURDIR}/../../../.. .include "../Makefile" diff --git a/de_DE.ISO8859-1/books/faq/book.sgml b/de_DE.ISO8859-1/books/faq/book.sgml index 0ec685671e..5e5eeb43c0 100644 --- a/de_DE.ISO8859-1/books/faq/book.sgml +++ b/de_DE.ISO8859-1/books/faq/book.sgml @@ -1,13389 +1,13403 @@ %books.ent; ]> Häufig gestellte Fragen zu FreeBSD - 5.X und 6.X + 6.X und 7.X Frequently Asked Questions zu FreeBSD - 5.X und 6.X + 6.X und 7.X The FreeBSD German Documentation Project Deutsche Übersetzung von Robert S. F. Drehmel, Dirk Gouders, Udo Erdelhoff und Johann Kois - $FreeBSDde: de-docproj/books/faq/book.sgml,v 1.623 2008/12/22 22:05:42 bcr Exp $ + $FreeBSDde: de-docproj/books/faq/book.sgml,v 1.627 2009/02/15 14:28:37 bcr Exp $ 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 + + 2009 The FreeBSD Documentation Project 2000 2001 2002 2003 2004 2005 2006 2007 2007 2008 + + 2009 The FreeBSD German Documentation Project &bookinfo.legalnotice; &tm-attrib.freebsd; &tm-attrib.3com; &tm-attrib.adobe; &tm-attrib.creative; &tm-attrib.cvsup; &tm-attrib.ibm; &tm-attrib.ieee; &tm-attrib.intel; &tm-attrib.iomega; &tm-attrib.linux; &tm-attrib.microsoft; &tm-attrib.mips; &tm-attrib.netscape; &tm-attrib.opengroup; &tm-attrib.oracle; &tm-attrib.sgi; &tm-attrib.sparc; &tm-attrib.sun; &tm-attrib.usrobotics; &tm-attrib.xfree86; &tm-attrib.general; Dies ist die FAQ für die FreeBSD-Versionen - 5.X und 6.X. Alle Einträge sollten für FreeBSD - ab Version 5.0 relevant sein, andernfalls wird darauf explizit - hingewiesen. Falls Sie daran + 6.X und 7.X. + Alle Einträge sollten für FreeBSD + ab Version 6.X relevant sein, andernfalls + wird darauf explizit hingewiesen. Falls Sie daran interessiert sein sollten, an diesem Projekt mitzuarbeiten, senden Sie eine Mail an die Mailingliste &a.de.translators;. Die aktuelle Version dieses Dokuments ist ständig auf dem FreeBSD World-Wide-Web-Server verfügbar. Sie kann aber auch als eine einzige große HTML-Datei, als Textdatei, als &postscript;- oder PDF-Datei sowie in verschiedenen anderen Formaten vom FreeBSD FTP-Server heruntergeladen werden. Alternativ können Sie die FAQ auch durchsuchen. Einleitung - Willkommen zur FreeBSD 5.X-6.X FAQ! + Willkommen zur FreeBSD + 6.X-7.X FAQ! Wie auch bei den Usenet FAQs üblich, wird mit diesem Dokument beabsichtigt, die am häufigsten gestellten Fragen bezüglich des Betriebssystems FreeBSD zu erfassen und sie natürlich auch zu beantworten. Obwohl FAQs ursprünglich lediglich dazu dienen sollten, die Netzbelastung zu reduzieren und das ständige Wiederholen derselben Fragen zu vermeiden, haben sie sich als wertvolle Informationsquellen etabliert. Wir haben uns die größte Mühe gegeben, diese FAQ so lehrreich wie möglich zu gestalten; falls Sie irgendwelche Vorschläge haben, wie sie verbessert werden kann, senden Sie diese bitte an die Mailingliste des &a.de.translators;. Was ist FreeBSD? FreeBSD ist, kurz gesagt, ein &unix; ähnliches Betriebssystem für die Plattformen AMD64 sowie &intel; EM64T, &i386;, IA-64, &arm;, &powerpc;, PC-98 und &ultrasparc;, das auf der 4.4BSD-Lite-Release der University of California at Berkeley (UCB) basiert; außerdem flossen einige Erweiterungen aus der 4.4BSD-Lite2-Release mit ein. Es basiert außerdem indirekt auf der von William Jolitz unter dem Namen 386BSD herausgebrachten Portierung der Net/2-Release der UCB auf die &i386;-Plattform - allerdings ist nur wenig vom 386BSD-Code übriggeblieben. Eine umfassendere Beschreibung darüber, was FreeBSD ist und wie Sie es für Ihre Zwecke verwenden können, finden Sie auf den Internetseiten des FreeBSD Projects. Unternehmen, Internet Service Provider, Forscher, Computerfachleute, Studenten und Privatnutzer auf der ganzen Welt benutzen FreeBSD für die Arbeit, die Ausbildung oder zur Freizeitgestaltung. Ausführlichere Informationen zu FreeBSD, finden Sie im FreeBSD Handbuch. Welches Ziel hat das FreeBSD Project? Die Ziel von FreeBSD ist es, Software zur Nutzung für beliebige Zwecke, bedingungslos zur Verfügung zu stellen. Viele von uns haben erheblich zur Erstellung des Codes (und zum Projekt) beigetragen und hätten jetzt oder in Zukunft sicherlich nichts gegen einen geringen finanziellen Ausgleich einzuwenden, aber wir beabsichtigen definitiv nicht, darauf zu bestehen. Wir sind der Meinung, dass unsere Mission zuerst und vorderst darin besteht, allen und jedem Kommenden Code für welchen Zweck auch immer zur Verfügung zu stellen, damit der Code möglichst weit eingesetzt wird und den größtmöglichen Nutzen liefert. Das ist, so glauben wir, eines der fundamentalsten Ziele von freier Software und eines, das wir enthusiastisch unterstützen. Der Code in unserem Quellbaum, der der GNU General Public License (GPL) oder der GNU Library General Public License (LGPL) unterliegt, ist mit zusätzlichen, geringfügigen Bedingungen verknüpft, jedoch handelt es sich dabei lediglich um erzwungene Bereitstellung statt des sonst üblichen Gegenteils. Auf Grund der zusätzlichen Komplexität, die durch den kommerziellen Einsatz von GPL Software entstehen kann, bemühen wir uns jedoch, solche Software, wo möglich, durch solche, die der etwas lockereren FreeBSD Lizenz unterliegt, zu ersetzen. Beinhaltet das FreeBSD-Copyright irgendwelche Einschränkungen? Ja. Diese Einschränkungen regeln aber nicht, wie Sie mit dem Sourcecode umgehen, sondern betreffen nur den Umgang mit dem FreeBSD Project an sich. Wenn Sie sich ernsthaft damit auseinandersetzen wollen, lesen Sie einfach die FreeBSD-Lizenz. Wenn Sie einfach nur neugierig sind, sollte diese Zusammenfassung ausreichen: Behaupten Sie nicht, Sie hätten es geschrieben. Verklagen Sie uns nicht, wenn irgend etwas nicht funktioniert. Kann FreeBSD mein bisher verwendetes Betriebssystem ersetzen? In den meisten Fällen lautet die Antwort ja. Allerdings ist diese Frage nicht ganz so einfach, wie sie scheint. Die meisten Anwender benutzen kein Betriebssystem, sondern Anwendungen. Die Anwendungen sind es, die das Betriebssystem benutzen. FreeBSD ist dazu gedacht, eine stabile und vielfältige Umgebung für Anwendungen bereitzustellen. Es unterstützt viele unterschiedliche Web-Browser, Büroanwendungen, E-Mail-Programme, Grafik-Programme, Entwicklungsumgebungen, Netzwerk-Server, und so ziemlich alles andere, was Sie sich wünschen können. Die meisten dieser Anwendungen sind in der Ports-Sammlung verfügbar. Wenn Sie Anwendung benutzen müssen, die es nur für ein bestimmtes Betriebssystem gibt, dann kommen Sie an diesem Betriebssystem nicht vorbei. Allerdings stehen die Chancen nicht schlecht, dass es eine vergleichbare Anwendung für FreeBSD gibt. Wenn Sie einen verläßlichen Server für ihr Büro oder das Internet brauchen, oder eine stabilen Arbeitsplatz, oder einfach nur die Fähigkeit, ihre Arbeit ohne dauernde Abstürze machen zu können, dann kann FreeBSD genau das sein. Viele Anwender auf der ganzen Welt, vom Anfänger bis zum erfahrenen Administrator, benutzen an Ihren Arbeitsplätzen ausschließlich FreeBSD. Wenn Sie von einem anderen &unix; System zu FreeBSD wechseln, dürfte Ihnen vieles bekannt vorkommen. Wenn Ihr Hintergrund ein Grafik-orientiertes Betriebssystem wie &windows; oder ein älteres &macos; ist, werden Sie zusätzliche Zeit investieren müssen, um den &unix; Stil zu verstehen. Dieser FAQ und das FreeBSD Handbuch sind die besten Startpunkte. Warum heißt es FreeBSD? Es darf kostenlos genutzt werden - sogar von kommerziellen Benutzern. Der komplette Quellcode für das Betriebssystem ist frei verfügbar und die Benutzung, Verbreitung und Einbindung in andere (kommerzielle und nicht-kommerzielle) Arbeiten sind mit den geringstmöglichen Einschränkungen versehen worden. Jedem ist es freigestellt, Code für Verbesserungen oder die Behebung von Fehlern einzusenden und ihn zum Quellbaum hinzufügen zu lassen (dies ist natürlich Gegenstand von ein oder zwei offensichtlichen Klauseln). Es wird darauf hingewiesen, dass das englische Wort free hier in den Bedeutungen umsonst und Sie können tun, was immer Sie möchten genutzt wird. Abgesehen von ein oder zwei Dingen, die Sie mit dem FreeBSD-Code nicht tun können (z.B. vorgeben, ihn geschrieben zu haben), können Sie damit tatsächlich tun, was auch immer Sie möchten. Wie unterschieden sich FreeBSD, NetBSD, OpenBSD und andere Open-Source BSD-Systeme? James Howards Artikel The BSD Family Tree, der in DaemonNews erschienen ist, beschreibt sehr gut die Geschichte und die Unterschiede der BSD-Varianten. Welches ist die aktuelle FreeBSD-Version? Momentan gibt es zwei Entwicklungszweige, die für die Erstellung von Releases verwendet werden. - Die 5.X-RELEASEs werden auf dem - 5-STABLE-Zweig erstellt, die - 6.X-RELEASEs auf dem 6-STABLE-Zweig. - - Bis zur Veröffentlichung von &os; 5.3 galt - die 4.X-Serie als -STABLE. Seither - gibt es für den Zweig 4.X nur mehr eine - erweiterte Unterstützung in der Form + Die 6.X-RELEASEs werden auf dem + 6-STABLE-Zweig erstellt, die + 7.X-RELEASEs auf dem + 7-STABLE-Zweig. + + Bis zur Veröffentlichung von &os; 7.0 galt + die 6.X-Serie als + -STABLE. Seither + gibt es für den Zweig 6.X nur mehr + eine erweiterte Unterstützung in der Form von Korrekturen von größeren Problemen, wie neu entdeckten Sicherheitsheitslücken. Aus dem Zweig - 5-STABLE werden zwar noch + 6-STABLE werden zwar noch RELEASEs erzeugt, er gilt aber als ausgereift. Aktive Weiterentwicklungen konzentrieren sich daher auf den - Zweig 6-STABLE. + Zweig 7-STABLE. Version &rel.current; ist das aktuelle Release des - 6-STABLE-Zweigs und ist im - Januar 2007 erschienen. + 7-STABLE-Zweigs und ist im + Januar 2009 erschienen. Version &rel2.current; ist das aktuelle Release aus dem - 5-STABLE-Zweig und ist im - Mai 2006 erschienen. + 6-STABLE-Zweig und ist im + November 2008 erschienen. Kurz gesagt, -STABLE ist für ISPs und andere Benutzer gedacht, die mehr Wert auf Stabilität und eine niedrige Änderungsfrequenz als auf die neuesten und möglicherweise unstabilen Features im aktuellen -CURRENT Snapshot legen. Releases können aus jedem Zweig entstehen, Sie sollten -CURRENT allerdings nur dann benutzen, wenn Sie auf ein erhöhtes Fehlverhalten im Vergleich zu -STABLE auch vorbereitet sind. Releases entstehen nur alle paar Monate. Viele Leute halten ihre Systeme aktueller (lesen Sie die Fragen zu &os;-CURRENT und &os;-STABLE), aber das erfordert ein erhöhtes Engagement, da die Sourcen sich ständig verändern. Weitere Informationen über Releases entnehmen Sie der Seite Release Engineering des FreeBSD Webauftritts. - Was ist FreeBSD-CURRENT? + Was ist FreeBSD-CURRENT? &os;-CURRENT ist die Entwicklungsversion des Betriebssystems, aus der zu gegebener Zeit &os.stable; werden wird. Als solche ist sie lediglich für Entwickler, die am System mitarbeiten und für unentwegte Bastler von Interesse. Details zum Betrieb von - -CURRENT finden Sie im -CURRENT finden Sie im entsprechenden Abschnitt des Handbuchs. Falls Sie nicht mit dem Betriebssystem vertraut sind oder nicht in der Lage sein sollten, den Unterschied zwischen einen echten und einem temporären Problem zu erkennen, sollten Sie &os;-CURRENT nicht verwenden. Dieser Zweig entwickelt sich manchmal sehr schnell weiter und kann gelegentlich für mehrere Tage hintereinander nicht installierbar sein. Von Personen, die &os;-CURRENT verwenden, wird erwartet, dass Sie dazu in der Lage sind, Probleme zu analysieren und nur dann von ihnen berichten, wenn es sich um Fehler und nicht um kurzzeitige Störungen handelt. Fragen wie make world produziert Fehlermeldungen - bezüglich Gruppen werden in der -CURRENT + bezüglich Gruppen werden in der &a.current; Mailingliste manchmal nicht beachtet. - Jeden Tag wird der aktuelle Entwicklungsstand in den - Zweigen -CURRENT und -STABLE in einer Jeden Monat wird der aktuelle Entwicklungsstand in den + Zweigen -CURRENT und + -STABLE in einer Snapshot - Release festgehalten. Mittlerweile werden sogar CDROM - Distributionen dieser gelegentlichen Snapshots zur - Verfügung gestellt. Die Ziele dieser Snapshot + Release festgehalten. Die Ziele dieser Snapshot Releases sind: Die aktuelle Version der Installationssoftware zu testen. - Personen, die -CURRENT oder -STABLE benutzen + Personen, die -CURRENT oder + -STABLE benutzen möchten, aber nicht über die nötige Zeit oder Bandbreite verfügen, um tagesaktuell zu bleiben, soll eine bequeme Möglichkeit geboten werden, es auf ihr System zu bringen. Die Erhaltung von Referenzpunkten des fraglichen Codes, für den Fall, dass wir später - einmal ernsthaften Schaden anrichten sollten (obwohl + einmal ernsthaften Schaden anrichten sollten - obwohl CVS verhindern sollte, dass solche Situationen - entstehen :) + entstehen. Sicherzustellen, dass alle zu testenden, neuen Merkmale und Fehlerbehebungen zu möglichst vielen potentiellen Testern gelangen. - Von keinem -CURRENT Snapshot kann + Von keinem -CURRENT Snapshot kann Produktionsqualität für beliebige Zwecke erwartet werden. Wenn Sie eine stabile und ausgetestete Version benötigen, sollten Sie eine - vollständige Release oder einen -STABLE Snapshot - verwenden. + vollständige Release oder einen -STABLE + Snapshot verwenden. Snapshot-Releases sind auf der Snapshots-Seite verfügbar. - In der Regel wird jeden Tag ein Snapshot jedes zur - Zeit aktiven Zweiges erstellt. + Offizielle Snapshots werden in der Regel jeden Monat für + jeden aktiven Zweig erstellt. Es gibt auch täglich erstellte + Snapshots der populären &arch.i386; und &arch.amd64; Zweige, + die auf + bereitliegen. - Was ist das Konzept von FreeBSD-STABLE? + Was ist das Konzept von FreeBSD-STABLE? Zur der Zeit, als FreeBSD 2.0.5 herausgegeben wurde, wurde entschieden, die Entwicklung von FreeBSD zweizuteilen. Ein Zweig wurde -STABLE, der andere -CURRENT - genannt. FreeBSD-STABLE ist für Anbieter von - Internetdiensten und andere kommerzielle Unternehmen + genannt. FreeBSD-STABLE ist für Anbieter + von Internetdiensten und andere kommerzielle Unternehmen gedacht, für die plötzliche Veränderungen und experimentelle Features unerwünscht sind. In diesem Zweige werden nur ausgetestete Fehlerbehebungen und kleine, inkrementelle Änderungen - aufgenommen. FreeBSD-CURRENT ist eine ununterbrochene - Linie seitdem die Version 2.0 herausgegeben worden - ist. Sie führt zu 6.2-RELEASE (und darüber - hinaus). Unmittelbar vor der Veröffentlichung von - 6.0-RELEASE wurde der 6-STABLE-Zweig erschaffen und - &os.current; wurde zu 7-CURRENT. Weitere Informationen zu - diesem Thema finden Sie unter + aufgenommen. FreeBSD-CURRENT ist eine + ununterbrochene Linie seitdem die Version 2.0 herausgegeben + worden ist. Sie führt zu &rel.current;-RELEASE (und darüber + hinaus). Weitere Informationen zu diesen Zweigen finden Sie unter FreeBSD Release Engineering: Creating the Release - Branch. + Branch, der Status der Zweige und der Zeitplan zur + anstehenden Veröffentlichung kann unter der Seite Release Engineering + Information gefunden werden. Der Zweig 2.2-STABLE wurde mit der Veröffentlichung der Version 2.2.8 eingestellt. Der Zweig 3-STABLE endete mit Version 3.5.1, der letzten - 3.X-Version, der Zweig 4.X endete mit der Version 4.11, - der letzten 4.X-Version. Änderungen in diesen Zweigen - beschränken sich im allgemeinen auf die Korrektur von - sicherheitsrelevanten Fehlern. Der Zweig 5-STABLE wird zwar - noch unterstützt, die Unterstützung - beschränkt sich allerdings auf das Schließen von - neu entdeckten Sicherheitslücken und die Behebung - von anderen ernsten Problemen. + 3.X-Version, der Zweig + 4.X endete mit der Version 4.11, + der letzten 4.X-Version. Änderungen + in diesen Zweigen beschränken sich im allgemeinen auf die + Korrektur von sicherheitsrelevanten Fehlern. Der Zweig 5-STABLE + wurde mit 5.5, der letzten 5.X Version, + beendet. 6-STABLE wird noch unterstützt, die + Unterstützung beschränkt sich allerdings auf das + Schließen von neu entdeckten Sicherheitslücken und die + Behebung von anderen ernsten Problemen. &rel.current;-STABLE ist der Zweig, auf den sich die - Entwicklung von -STABLE zurzeit konzentriert. Das neueste - Release aus dem &rel.current;-STABLE-Zweig ist + Entwicklung von -STABLE zur Zeit konzentriert. + Das neueste Release aus dem &rel.current;-STABLE-Zweig ist &rel.current;-RELEASE und ist im Januar 2007 erschienen. - Aus dem 7-CURRENT-Zweig entsteht die nächste + Aus dem 8-CURRENT-Zweig entsteht die nächste &os;-Generation. Weitere Informationen über diesen Zweig finden Sie unter Was ist FreeBSD-CURRENT?. Wann werden FreeBSD-Versionen erstellt? - Im Schnitt gibt das &a.re; alle vier Monate eine neue - FreeBSD-Version frei. Das Erscheinungsdatum - einer neuer Version wird frühzeitig bekanntgegeben, - damit die am System arbeitenden Personen wissen, bis wann - ihre Projekte abgeschlossen und ausgetestet sein + Im Schnitt gibt das &a.re; alle 18 Monate eine neue + Haupt-Version und etwa alle 8 Monate eine Unter-Version frei. + Das Erscheinungsdatum einer neuer Version wird frühzeitig + bekanntgegeben, damit die am System arbeitenden Personen wissen, + bis wann ihre Projekte abgeschlossen und ausgetestet sein müssen. Vor jedem Release gibt es eine Testperiode um sicherzustellen, dass die neu hinzugefügten Features nicht die Stabilität des Releases beeinträchtigen. Viele Benutzer halten dies für einen großen Vorteil von FreeBSD, obwohl es manchmal frustrierend sein kann, so lange auf die Verfügbarkeit der aktuellsten Leckerbissen zu warten. Weitere Informationen über die Entwicklung von Releases, sowie eine Übersicht über kommende Releases, - erhlaten Sie auf den release - engineering Seiten der FreeBSD Webseite. + erhalten Sie auf den Release + Engineering Seiten der FreeBSD Webseite. Für diejenigen, die ein wenig mehr Spannung brauchen (oder möchten), werden täglich Snapshots herausgegeben, wie oben beschrieben. Wer ist für FreeBSD verantwortlich? Schlüsseldiskussionen, die das FreeBSD Project betreffen, wie z.B. über die generelle Ausrichtung des Projekts und darüber, wem es erlaubt sein soll, Code zum Quellbaum hinzuzufügen, werden innerhalb eines Core Teams von 9 Personen geführt. Es gibt ein weitaus größeres Team von über 350 Committern, die dazu autorisiert sind, Änderungen am FreeBSD Quellbaum durchzuführen. Jedoch werden die meisten nicht-trivialen Änderungen zuvor in den Mailinglisten diskutiert und es bestehen keinerlei Einschränkungen darüber, wer sich an diesen Diskussionen beteiligen darf. Wie kann ich FreeBSD beziehen? Jede bedeutende Ausgabe von FreeBSD ist per Anonymous-FTP vom FreeBSD FTP Server erhältlich: - Das aktuelle 6-STABLE-Release, &rel.current;-RELEASE, + Das aktuelle 7-STABLE-Release, &rel.current;-RELEASE, finden Sie im Verzeichnis &rel.current;-RELEASE. - Snapshots-Releases werden täglich aus dem + Snapshots-Releases werden monatlich aus dem -CURRENT-Zweig sowie aus dem -STABLE-Zweig erzeugt. Sie sollten aber nur von Entwicklern und sehr erfahrenen Testern verwendet werden. - Das aktuelle Release von 5-STABLE, + Das aktuelle Release von 6-STABLE, &rel2.current;-RELEASE finden Sie im Verzeichnis &rel2.current;-RELEASE. Wo und wie Sie FreeBSD auf CD, DVD, und anderen Medien beziehen können, erfahren Sie im Handbuch. Wie greife ich auf die Datenbank mit Problemberichten zu? Die Datenbank mit Problemberichten (PR, problem report) und Änderungsanfragen von Benutzern kann über die webbasierte + url="http://www.de.FreeBSD.org/cgi/query-pr.cgi?query"> PR-Abfrage-Schnittstelle abgefragt werden. Mit dem Programm &man.send-pr.1; können Sie Problemberichte oder Änderungsanträge per E-Mail einsenden. Alternativ können Sie Problemberichte auch über Ihren Browser und die webbasierte PR-Eingabe-Schnittstelle erstellen. Bevor Sie einen Fehler melden, sollten Sie sich zuerst den Artikel Writing FreeBSD Problem Reports durchlesen, damit Sie wissen, wie Sie eine gute Fehlermeldung verfassen. Gibt es weitere Informationsquellen? Sie finden eine umfassende Liste unter Documentation auf der FreeBSD-Webseite. Dokumentation und Support Gibt es gute Bücher über FreeBSD? Im Zuge des FreeBSD Projekts sind diverse gute Dokumente entstanden, die unter der folgenden URL abgerufen werden können: . Die Dokumente stehen auch als Pakete, die Sie leicht installieren können, zur Verfügung. In den nächsten Abschnitten erfahren Sie mehr über diese Pakete. - Zusätzlich enthalten die Bibliographien am Ende - dieser FAQ und im Handbuch Verweise auf weitere empfohlene - Bücher. + Zusätzlich enthält + die Bibliographie am Ende + dieser FAQ und diejenige im + Handbuch Verweise auf weitere empfohlene Bücher. Ist die Dokumentation auch in anderen Formaten verfügbar? Zum Beispiel als einfacher Text (ASCII) oder als &postscript;? Ja. Werfen Sie einen Blick auf das Verzeichnis /pub/FreeBSD/doc/ auf dem FreeBSD FTP-Server. Dort finden sie Dokumentation in vielen verschiedenen Format. Die Dokumentation wurde nach vielen verschiedenen Kriterien sortiert. Die Kriterien sind: Der Name des Dokumentes, z.B. FAQ oder Handbuch. Die Sprache und der Zeichensatz, die in dem Dokument verwendet werden. Diese entsprechen den Anpassungen, die Sie auf Ihrem FreeBSD-System im Verzeichnis /usr/share/locale finden. Zurzeit werden die folgenden Sprachen und Zeichensätze benutzt: Name Bedeutung bn_BD.ISO10646-1 Bengalisch (oder Bangla) da_DK.ISO8859-1 Dänisch de_DE.ISO8859-1 Deutsch en_US.ISO8859-1 Amerikanisches Englisch el_GR.ISO8859-7 Griechisch es_ES.ISO8859-1 Spanisch fr_FR.ISO8859-1 Französisch it_IT.ISO8859-15 Italienisch hu_HU.ISO8859-2 Ungarisch ja_JP.eucJP Japanisch (EUC-kodiert) mn_MN.UTF-8 Mongolisch (UTF-8-kodiert) nl_NL.ISO8859-1 Niederländisch no_NO.ISO8859-1 Norwegisch pl_PL.ISO8859-2 Polnisch pt_BR.ISO8859-1 Brasilianisches Portugiesisch ru_RU.KOI8-R Russisch (KOI8-R-kodiert) sr_YU.ISO8859-2 Serbisch tr_TR.ISO8859-9 Türkisch zh_CN.GB2312 Vereinfachtes Chinesisch (GB2312-kodiert) zh_TW.Big5 Chinesisch (Big5-kodiert) Einige Dokumente sind nicht in allen Sprachen verfügbar. Das Format des Dokumentes. Die Dokumentation wird in verschiedenen Formaten erzeugt, von denen jedes seine eigenen Vor- und Nachteile hat. Einige Formate lassen sich gut an einem Bildschirm lesen, während andere Formate dafür gedacht sind, ein ansprechendes Druckbild zu erzeugen. Das die Dokumentation in verschiedenen Formaten verfügbar ist, stellt sicher, dass unsere Leser die für sie relevanten Teile unabhängig vom Ausgabemedium (Bildschirm oder Papier) lesen können. Derzeit werden die folgenden Formate unterstützt: Format Erklärung html-split Viele kleine HTML-Dateien, die sich gegenseitig referenzieren. html Eine große HTML-Datei, die das komplette Dokument enthält. pdb Palm Pilot Datenbank für das Programm iSilo. pdf Adobe's Portable Document Format ps &postscript; rtf Microsoft's Rich Text Format Die Seitennummern werden nicht automatisch aktualisiert, wenn Sie diese Datei in Word laden. Wenn Sie das Dokument geladen haben, müssen Sie Sie Ctrl A , Ctrl End , F9 eingeben, um die Seitennummern aktualisieren zu lassen. txt Ganz normaler Text Das zur Komprimierung verwendete Programm. Zur Zeit werden drei verschiedene Methoden benutzt. Wenn die Dokumentation im Format html-split vorliegt, werden die Dateien mit &man.tar.1; zusammengefasst. Die so entstandene .tar Datei wird dann mit einer der unten genannten Methoden komprimiert. Bei allen anderen Formaten existiert nur eine Datei mit dem Namen type.format (z.B. article.pdf, book.html, und so weiter). Diese Dateien werden mit zwei verschiedenen Programmen komprimiert. Programm Beschreibung zip Das Zip-Format. Wenn Sie diese Dateien unter FreeBSD entpacken wollen, müssen sie vorher den Port archivers/unzip installieren. bz2 Das BZip2-Format. Es wird seltener als das Zip-Format benutzt, erzeugt aber normalerweise kleinere Archive. Sie müssen den Port archivers/bzip2 installieren, um diese Dateien entpacken zu können. Ein Beispiel: Die mit BZip2 gepackte Version des Handbuchs im &postscript;-Format hat den Namen book.ps.bz2 und ist im Verzeichnis handbook/ zu finden. Nachdem Sie das Format und das Kompressionsverfahren ausgewählt haben, müssen Sie die komprimierten Dateien selber herunterladen, entpacken und an die richtigen Stellen kopieren. Wenn Sie zum Beispiel die mit &man.bzip2.1; gepackte split HTMLVersion der englischen FAQ herunterladen und installieren wollten, bräuchten Sie die Datei doc/en_US.ISO8859-1/books/faq/book.html-split.tar.bz2. Um diese Datei herunterzuladen und auszupacken, wären die folgenden Schritte notwendig. &prompt.root; fetch ftp://ftp.de.FreeBSD.org/pub/FreeBSD/doc/en_US.ISO8859-1/books/faq/book.html-split.tar.bz2 &prompt.root; gzip -d book.html-split.tar.bz2 &prompt.root; tar xvf book.html-split.tar Danach haben Sie eine Sammlung vieler kleiner .html Datei. Die wichtigste Datei hat Namen index.html und enthält das Inhaltsverzeichnis, eine Einleitung und Verweise auf die anderen Teile des Dokumentes. Falls notwendig, können Sie die diversen Dateien jetzt an ihren endgültigen Bestimmungsort verschieben oder kopieren. Woher bekomme ich Informationen zu den FreeBSD Mailinglisten? Vollständige Informationen finden Sie im Handbucheintrag über Mailinglisten. Welche Newsgruppen existieren zu FreeBSD? Sie finden alle Informationen hierzu im Handbucheintrag zu Newsgruppen. Gibt es FreeBSD IRC (Internet Relay Chat) Kanäle? Ja, die meisten großen IRC Netze bieten einen FreeBSD Chat-Channel: Channel FreeBSD im EFNet ist ein FreeBSD-Forum, aber gehen Sie nicht dorthin, um technische Unterstützung zu suchen, oder, um zu versuchen, die Leute dort dazu zu bringen, Ihnen dabei zu helfen, das mühselige Lesen von Manuals zu ersparen oder eigene Nachforschungen zu betreiben. Es ist in erster Linie ein Chat-Channel und die Themen dort umfassen Sex, Sport oder Kernwaffen ebensogut, wie FreeBSD. Sie wurden gewarnt! Der Channel ist auf dem Server irc.chat.org verfügbar. Der Channel #FreeBSDhelp im EFNet hat sich dagegen auf die Unterstützung der Benutzer von FreeBSD spezialisiert. In diesem Channel sind Fragen deutlich willkommener als im Channel #FreeBSD. Der Channel ##FreeBSD auf Freenode bietet allgemeine Hilfe zu FreeBSD-Themen. Durchschnittlich sind zu jeden Zeitpunkt etwa 300 Benutzer online. Zwar werden auch nicht-FreeBSD-spezifische Themen diskutiert, den Hauptteil der Diskussionen dreht sich aber um die Lösung der Probleme von FreeBSD-Anwendern. Die Teilnehmer dieses Channels helfen Ihnen auch bei Fragen zu elementaren Dingen und zeigen Ihnen auch, wo Sie die entsprechenden Erklärungen im FreeBSD-Handbuch oder anderen Ressourcen finden können. Obwohl die Teilnehmer des Channels über die ganze Welt verstreut sind, werden alle Diskussionen auf Englisch geführt. Wollen Sie die Diskussion in Ihrer Sprache führen, sollten Sie Ihre Frage trotzdem auf Englisch stellen und - danach gegebenfalls einen neuen Channel in der Form + danach gegebenenfalls einen neuen Channel in der Form ##freebsd-Ihre_Sprache eröffnen. Der Channel #FreeBSD im DALNET ist in den USA unter irc.dal.net und in Europa unter irc.eu.dal.net verfügbar. Der Channel #FreeBSDHelp im DALNET ist in den USA unter irc.dal.net sowie in Europa unter irc.eu.dal.net verfügbar. Der Channel #FreeBSD im UNDERNET ist in den USA unter us.undernet.org und in Europa unter eu.undernet.org verfügbar. Es handelt sich hierbei um einen Hilfe-Channel, man wird Sie daher auf Dokumente verweisen, die Sie selbst lesen müssen. Der Channel #FreeBSD im RUSNET ist ein russischsprachiger Channel, der sich der Unterstützung von &os;-Anwendern verschrieben hat. Er ist auch ein guter Startpunkt für nichttechnische Diskussionen. Der Channel #bsdchat auf Freenode (Sprache: traditionelles Chinesisch, UTF-8-kodiert) hat sich der Unterstützung von &os;-Anwendern verschrieben. Er ist auch ein guter Startpunkt für nichttechnische Diskussionen. Alle diese Kanäle unterscheiden sich voneinander und sind nicht miteinander verbunden. Ebenso unterscheiden sich Ihre Chat-Stile, weshalb es sein kann, dass Sie zunächst alle Kanäle ausprobieren müssen, um den zu Ihrem Chat-Stil passenden zu finden. Hier gilt, was für jeden IRC-Verkehr gilt: falls sie sich leicht angegriffen fühlen oder nicht mit vielen jungen (und einigen älteren) Leuten, verbunden mit dem nutzlosen Gezanke umgehen können, dann ziehen Sie es gar nicht erst in Erwägung. Gibt es Firmen, die Training und Support für FreeBSD anbieten? DaemonNews bietet Training und Support für FreeBSD an. Weitergehende Informationen finden Sie in der BSD Mall. Die FreeBSD Mall bietet ebenfalls professionellen - FreeBSD support an. Weitergehende Informationen finden + FreeBSD Support an. Weitergehende Informationen finden Sie auf ihrer Webseite. Wenn Ihre Firma oder Organisation ebenfalls Training und Support anbietet und hier genannt werden möchte, wenden Sie sich bitte an das FreeBSD Project. Nik Clayton
nik@FreeBSD.org
Installation Welche Dateien muss ich herunterladen, um FreeBSD zu bekommen? Sie benötigen drei Floppy-Images: floppies/boot.flp, floppies/kern1.flp sowie floppies/kern2.flp. Diese Images müssen mit Hilfe von Werkzeugen wie fdimage oder &man.dd.1; auf Disketten kopiert werden. Falls Sie selbst die einzelnen Distributionen herunterladen müssen (um z.B. von einem DOS-Dateisystem aus zu installieren), empfehlen wir, sich die folgenden Distributionen zu besorgen: base/ manpages compat* doc src/ssys.* Vollständige Instruktionen für dieses Vorgehen und ein wenig mehr zur Installation generell finden Sie im Handbucheintrag zur Installation von FreeBSD. Was soll ich tun, wenn das Floppy-Image nicht auf eine Diskette passt? - Eine 3,5-Zoll (1,44MB) Diskette kann 1474560 Byte an - Daten fassen und das Boot-Image ist exakt 1474560 Byte + Eine 3,5-Zoll (1,44 MB) Diskette kann 1474560 Byte an + Daten fassen und das Boot-Image ist exakt 1474560 Byte groß. Häufige Fehler bei der Erstellung der Boot-Diskette sind: Bei der Benutzung von FTP das Floppy-Image nicht im Binär-Modus herunterzuladen. Einige FTP-Clients benutzen als Voreinstellung den ASCII-Modus und versuchen, alle Zeilenendezeichen an das Zielsystem anzupassen. Dadurch wird das Boot-Image in jedem Fall unbrauchbar. Überprüfen Sie die Größe des heruntergeladenen Boot-Images: falls sie nicht exakt mit der auf dem Server übereinstimmt, hat das Herunterladen nicht richtig funktioniert. Abhilfe: geben Sie binary an der FTP-Eingabeaufforderung ein, nach dem Sie mit dem Server verbunden sind und bevor Sie das Image herunterladen. Die Benutzung des DOS-Befehls copy (oder eines entsprechendes Werkzeugs der grafischen Benutzeroberfläche), um das Boot-Image auf die Diskette zu übertragen. Programme wie copy sind hier unbrauchbar, weil das Image zur direkten Übertragung erstellt wurde. Das Image stellt den gesamten Disketteninhalt dar, Spur für Spur, und nicht eine gewöhnliche Datei. Sie müssen es roh mit speziellen Werkzeugen (z.B. fdimage oder rawrite) übertragen, wie es in der Installationsanleitung zu FreeBSD beschrieben ist. Wo befinden sich die Instruktionen zur Installation von FreeBSD? Installationsanleitungen finden Sie im Handbucheintrag zur Installation von FreeBSD. Was benötige ich zum Betrieb von FreeBSD? - Der Betrieb von &os; 5.X und neuer erfordert + Der Betrieb von &os; und neuer erfordert mindestens einen 486er Prozessor mit mindestens 24 MB RAM sowie mindestens 150 MB an Festplattenspeicher. Alle &os;-Versionen laufen mit einer einfachen MDA-Grafikkarte, für &xorg; benötigen Sie allerdings eine VGA- oder eine bessere Videokarte. Lesen Sie auch den Abschnitt Hardwarekompatibilität. Wie kann ich eine angepasste Installationsdiskette erstellen? Zurzeit gibt es keine Möglichkeit, nur die angepassten Installationsdisketten zu erstellen. Sie müssen sich eine ganz neues Release erstellen, das Ihre Installationsdiskette enthält. Wenn Sie eine modifizierte Ausgabe erstellen wollen, finden Sie eine Anleitung im Artikel FreeBSD Release Engineering. Kann ich mehr als ein Betriebssystem auf meinem PC unterbringen? Sehen Sie sich Die Multi-OS-Seite an. Kann &windows; neben FreeBSD existieren? Installieren Sie zuerst &windows;, dann FreeBSD. Der Bootmanager von FreeBSD kann dann entweder &windows; oder FreeBSD booten. Falls Sie &windows; nach FreeBSD installieren, wird es, ohne zu fragen, Ihren Bootmanager überschreiben. Lesen Sie den nächsten Abschnitt, falls das passieren sollte. &windows; hat meinen Bootmanager zerstört! Wie stelle ich ihn wieder her? Es gibt drei Möglichkeiten, den FreeBSD-Bootmanager neu zu installieren: - Unter DOS wechseln Sie in das Verzeichnis tools/ + Unter DOS wechseln Sie in das Verzeichnis + tools/ Ihrer FreeBSD-Distribution und suchen nach bootinst.exe. Rufen sie es so auf: ...\TOOLS> bootinst.exe boot.bin und der Bootmanager wird neu installiert. Booten Sie FreeBSD wieder mit der Bootdiskette und - wählen Sie den Menüeintrag Custom Installation. - Wählen Sie Partition. Wählen Sie das - Laufwerk, auf dem sich der Bootmanager befand + wählen Sie den Menüeintrag Custom + Installation. + Wählen Sie Partition. + Wählen Sie das Laufwerk, auf dem sich der Bootmanager befand (wahrscheinlich der erste Eintrag) und wenn Sie in den - Partitioneditor gelangen, wählen Sie als aller + Partitioneditor gelangen, drücken Sie als aller erstes (nehmen Sie z.B. keine Änderungen vor) - (W)rite. Sie werden nach einer Bestätigung - gefragt, antworten ja und vergessen Sie nicht, in der - Bootmanager-Auswahl Boot Manager - auszuwählen. Hierdurch wird der Bootmanager - wieder auf die Festplatte geschrieben. Verlassen Sie - nun das Installationsmenü und rebooten wie + (W)rite. Sie werden nach einer Bestätigung + gefragt, wählen Sie &gui.yes; und vergessen Sie nicht, in der + Bootmanager-Auswahl den FreeBSD Boot + Manager auszuwählen. Hierdurch wird der + Bootmanager wieder auf die Festplatte geschrieben. Verlassen + Sie nun das Installationsmenü und rebooten wie gewöhnlich von der Festplatte. Booten Sie FreeBSD wieder mit der Bootdiskette (oder der CDROM) und wählen Sie den - Menüpunkt Fixit. Wählen Sie - die für Sie passende Option, entweder die + Menüpunkt Fixit. Wählen + Sie die für Sie passende Option, entweder die Fixit-Diskette oder die CD Nummer 2 (die Option live Filesystem). Wechseln Sie zur Fixit-Shell und geben Sie den folgenden Befehl ein: Fixit# fdisk -B -b /boot/boot0 bootdevice Als bootdevice müssen Sie das von Ihrem System verwendete Gerät angeben, z.B. ad0 (erste IDE-Platte), ad4 (erste IDE-Platte an einem zusätzlichen Controller), da0 (erste SCSI-Platte), usw. Mein IBM Thinkpad Modell A, T oder X, hängt sich auf, wenn ich FreeBSD zum ersten Mal starte. Was soll ich machen? Ein Fehler in den ersten BIOS-Versionen dieser Geräte führt dazu, dass sie die von FreeBSD genutzte Partition für eine Suspend-To-Disk-Partition halten. Wenn das BIOS dann versucht, diese Partition auszuwerten, hängt sich das System auf. Laut IBM In einer Mail von Keith Frechette kfrechet@us.ibm.com. wurde der Fehler wurde in den folgenden BIOS-Versionen behoben: Gerät BIOS Version T20 IYET49WW oder neuer T21 KZET22WW oder neuer A20p IVET62WW oder neuer A20m IWET54WW oder neuer A21p KYET27WW oder neuer A21m KXET24WW oder neuer A21e KUET30WW Es ist möglich, dass neuere Version des IBM BIOS den Fehler wieder enthalten. Dieser Beitrag von Jacques Vidrine auf der Mailingliste &a.mobile; beschreibt eine Technik, die Ihnen weiterhelfen könnte, wenn Ihr IBM Laptop mit FreeBSD nicht bootet und Sie eine neuere oder ältere BIOS-Version einspielen können. Wenn Ihr Thinkpad über eine ältere BIOS-Version verfügt und Sie das BIOS nicht aktualisieren können, ist eine der möglichen Lösungen, FreeBSD zu installieren, die Partitions-ID zu ändern und danach neue Bootblocks zu installieren, die mit der geänderten ID umgehen können. Zunächst müssen Sie die Maschine so weit wiederherstellen, dass sie über den Selbst-Test hinauskommt. Dazu ist es erforderlich, dass das System beim Start keine Partitions-ID auf seiner primären Festplatte findet. Eine Variante ist, die Platte auszubauen und vorübergehend in einem älteren Thinkpad (z.B. dem Thinkpad 600) oder (mit einem passenden Adapter) in einen normalen PC einzubauen. Sobald dies erfolgt ist, können Sie die FreeBSD-Partition löschen und die Festplatte wieder in das Thinkpad einbauen. Das Thinkpad sollte jetzt wieder starten können. Danach können Sie mit der nachfolgend beschriebenen Anleitung eine funktionsfähige FreeBSD-Installation erhalten. Beschaffen Sie sich boot1 und boot2 von . Legen Sie diese Dateien so ab, dass Sie während der Installation darauf zugreifen können. Installieren Sie ganz wie gewohnt FreeBSD auf dem Thinkpad. Allerdings dürfen Sie den Dangerously Dedicated-Modus nicht benutzen. Nach dem Abschluss der Installation dürfen Sie die Maschine nicht neu starten. Wechseln Sie zur Emergency Holographic Shell ( Alt F4 ) oder starten Sie eine fixit Shell. Benutzen Sie &man.fdisk.8;, um die Partitions-ID von FreeBSD von 165 in 166 zu ändern (dieser Wert wird von OpenBSD benutzt). Kopieren Sie die Dateien boot1 und boot2 auf die lokale Festplatte. Installieren Sie boot1 und boot2 mit &man.disklabel.8; auf die FreeBSD-Slice. &prompt.root; disklabel -B -b boot1 -s boot2 ad0sn Setzen Sie für n die Nummer der Slice ein, auf der sie FreeBSD installiert haben. Starten Sie das System neu. Am Boot-Prompt sollten Sie die Auswahl OpenBSD erhalten. Damit wird in Wirklichkeit FreeBSD gestartet. Was Sie machen müssen, wenn Sie FreeBSD und OpenBSD parallel installieren wollen, sollten Sie zu Übungszwecken einfach einmal selbst herausfinden. Kann ich FreeBSD auf einer Festplatte mit beschädigten Blöcken installieren? Prinzipiell ja. Allerdings ist das keine gute Idee. Wenn Ihnen bei einer modernen IDE-Platte defekte Sektoren gemeldet werden, wird die Platte mit großer Wahrscheinlichkeit innerhalb kurzer Zeit vollständig ausfallen, da die Meldung ein Zeichen dafür ist, dass die für die Korrektur reservierten Sektoren bereits verbraucht wurden. Wir raten Ihnen, die Platte auszutauschen. Falls Sie ein SCSI-Laufwerk mit beschädigten Blöcken besitzen, lesen Sie diese Antwort. Wenn ich von der Installationsdiskette boote, geschehen merkwürdige Dinge! Was sollte ich tun? Falls Sie beobachten, dass ihr Rechner sich bis zum Stillstand abmüht oder spontan rebootet, während Sie versuchen, von der Installationsdiskette zu booten, sollten Sie sich drei Fragen stellen: Haben Sie eine brandneue, frisch formatierte, fehlerfreie Diskette benutzt (günstigerweise eine brandneue, direkt aus dem Karton und nicht eine Diskette aus einem Magazin, das schon seit drei Jahren unter Ihrem Bett lag)? Haben Sie das Floppy-Image im Binär- (oder Image) Modus heruntergeladen? (Schämen Sie sich nicht. Sogar die besten unter uns haben wenigstens einmal Binärdateien versehentlich im ASCII-Modus heruntergeladen!) Falls Sie &windows; 95 oder &windows; 98 benutzen, haben Sie es heruntergefahren und fdimage bzw. rawrite in einfachem, reinem DOS neu gestartet? Es scheint, dass diese Betriebssysteme Programme stören, die direkt auf Hardware schreiben, wie es das Erstellungsprogramm für die Diskette tut; selbst bei der Ausführung des Programms in einem DOS-Fenster in der grafischen Benutzeroberfläche kann dieses Problem auftreten. Es wurde auch darüber berichtet, dass &netscape; Probleme beim Herunterladen der Bootdisketten verursacht. Es ist also wahrscheinlich besser, einen anderen FTP-Client zu benutzen. Ich habe zur Installation von meinem ATAPI CDROM gebootet, aber das Installationsprogramm sagt mir, dass es kein CDROM gefunden hat. Was geht hier ab? Dieses Problem wird üblicherweise durch ein falsch konfiguriertes CDROM verursacht. Bei vielen PCs ist das CDROM der Slave am zweiten IDE-Controller, ein Master ist nicht vorhanden. Laut Spezifikation ist diese Konfiguration illegal, aber &windows; verletzt die Spezifikation und das BIOS ignoriert sie, wenn es von einem CDROM booten soll. Daher konnten Sie zwar vom CDROM booten, während FreeBSD es nicht für die Installation benutzen kann. Um dieses Problem zu lösen, müssen Sie entweder das CDROM als Master an den IDE-Controller anschließen oder dafür sorgen, dass an dem vom CDROM genutzten IDE-Controller das CD-ROM als Slave und ein anderes Gerät als Master angeschlossen ist. Kann ich auf meinem Laptop per PLIP (Parallel Line IP) installieren? Ja, Sie brauchen dazu nur ein ganz normales Laplink-Kabel. Weitere Informationen zum Thema Netzwerke am Druckerport finden sie im Kapitel PLIP des Handbuchs. Welche Geometrie sollte ich für ein Festplattenlaufwerk verwenden? Unter der Geometrie einer Festplatte verstehen wir die Anzahl Zylinder, Schreib-/Leseköpfen und Sektoren/Spur auf einer Festplatte. Im folgenden wird dafür der Übersichtlichkeit halber der Begriff C/H/S verwendet. Das BIOS des PCs berechnet mit diesen Angaben, auf welche Bereiche der Festplatte es für Schreib-/Lesezugriffe zugreifen muss). Aus einigen Gründen scheint dies gerade bei frischgebackenen Systemadministratoren für sehr viel Verwirrung zu sorgen. Zunächst einmal ist die physikalische Geometrie eines SCSI-Laufwerks vollkommen irrelevant, da FreeBSD mit Blöcken arbeitet. Tatsächlich gibt es die physikalische Geometrie nicht, da die Sektordichte auf einer Festplatte variiert. Was die Hersteller als die wahre physikalische Geometrie bezeichnen, ist im allgemeinen die Geometrie, die aufgrund ihrer Ergebnisse im geringsten ungenutzten Speicher resultiert. Bei IDE-Platten arbeitet FreeBSD mit C/H/S-Angaben, aber alle modernen Laufwerke wandeln diese intern ebenfalls in Blocknummern um. Wichtig ist nur die logische Geometrie. Das BIOS kann die logische Geometrie der Festplatte abfragen; die erhaltenen Daten werden dann vom BIOS bei Zugriffen auf die Festplatte genutzt. Da FreeBSD das BIOS benutzt, während es bootet, ist es sehr wichtig, dass diese Angaben richtig sind. Insbesondere müssen alle Betriebssysteme mit derselben Geometrie arbeiten, falls Sie mehr als ein Betriebssystem auf einer Festplatte haben. Andernfalls werden Sie ernsthafte Bootprobleme bekommen! Bei SCSI-Festplatten hängt die zu verwendende Geometrie davon ab, ob der Extended Translation Support auf Ihrem Controller eingeschaltet ist (oft auch als Unterstützung für DOS-Platten >1GB oder ähnlich bezeichnet). Falls sie ausgeschaltet ist, benutzen Sie N Zylinder, 64 Köpfe und 32 Sektoren/Spur, wobei N die Kapazität der Festplatte in MB ist. Zum Beispiel sollten für eine 2GB Festplatte 2048 Zylinder, 64 Köpfe und 32 Sektoren/Spur angegeben werden. Falls sie eingeschaltet ist (was oft der Fall ist, um bestimmte Einschränkungen von &ms-dos; zu umgehen) und die Plattenkapazität mehr als - 1GB beträgt, benutzen Sie M Zylinder, 63 + 1 GB beträgt, benutzen Sie M Zylinder, 63 Sektoren/Spur (nicht 64) und 255 Köpfe, wobei M der Plattenkapazität in MB, dividiert durch 7,844238 - entspricht (!). Also würde unsere 2GB Beispielplatte + entspricht (!). Also würde unsere 2 GB Beispielplatte 261 Zylinder, 63 Sektoren/Spur und 255 Köpfe haben. Falls Sie sich hier nicht sicher sind oder FreeBSD während der Installation die Geometrie nicht richtig erkennt, hilft es normalerweise, eine kleine DOS-Partition auf der Festplatte anzulegen. Das BIOS sollte dann in der Lage sein, die richtige Geometrie zu erkennen. Sie können die Partition jederzeit im Partitioneditor entfernen, falls Sie sie nicht behalten möchten. Allerdings kann Sie ganz nützlich sein, um Netzwerkkarten zu programmieren und ähnliches. Alternativ können Sie das frei verfügbare Programm pfdisk.exe verwenden. Sie - finden es im Unterverzeichnis tools - auf der FreeBSD-CDROM und allen FreeBSD FTP-Servern). Mit - diesem Programm können Sie herausfinden, welche - Geometrie die anderen Betriebssysteme auf der Festplatte - verwenden. Diese Geometrie können Sie im + finden es im Unterverzeichnis + tools auf der FreeBSD-CDROM + und allen FreeBSD FTP-Servern). Mit diesem Programm können + Sie herausfinden, welche Geometrie die anderen Betriebssysteme auf + der Festplatte verwenden. Diese Geometrie können Sie im Partitioneditor eingeben. Gibt es irgendwelche Einschränkungen, wie ich die Festplatte aufteilen darf? Ja. Sie müssen sicherstellen, dass Ihre Rootpartition innerhalb der ersten 1024 Zylinder liegt, damit das BIOS den Kernel von Ihr booten kann. (Beachten Sie, dass es sich um eine Einschränkung durch das BIOS des PCs handelt und nicht durch FreeBSD). Für ein SCSI-Laufwerk bedeutet dies normalerweise, dass sich die Rootpartition in den - ersten 1024MB befindet (oder in den ersten 4096MB, falls + ersten 1024 MB befindet (oder in den ersten 4096 MB, falls die Extended Translation eingeschaltet ist - siehe die vorherige Frage). Der entsprechende Wert für IDE ist - 504MB. + 504 MB. - Verträgt sich FreeBSD mit Plattenmanagern? + Verträgt sich &os; mit Plattenmanagern? - FreeBSD erkennt den Ontrack Plattenmanager und - berücksichtigt ihn. Andere Plattenmanager werden - nicht unterstützt. + &os; erkennt den Ontrack Disk + Manager und berücksichtigt ihn. Andere + Plattenmanager werden nicht unterstützt. - Falls Sie die Festplatte nur mit FreeBSD benutzen + Falls Sie die Festplatte nur mit &os; benutzen wollen, brauchen Sie keinen Plattenmanager. Wenn Sie Sie die Platte einfach in der vom BIOS maximal - unterstützten Größe (normalerweise 504 - Megabyte) konfigurieren, sollte FreeBSD erkennen, wie viel + unterstützten Größe (normalerweise + 504 Megabyte) konfigurieren, sollte &os; erkennen, wie viel Platz Sie tatsächlich haben. Falls Sie eine alte Festplatte mit einem MFM-Controller verwenden, könnte - es sein, dass Sie FreeBSD explizit angeben + es sein, dass Sie &os; explizit angeben müssen, wie viele Zylinder es benutzen soll. - Falls Sie die Festplatte mit FreeBSD und einem anderen + Falls Sie die Festplatte mit &os; und einem anderen Betriebssystem benutzen wollen, sollten Sie auch in der Lage sein, ohne einen Plattenmanager auszukommen: stellen sie einfach sicher, dass sich die Bootpartition von - FreeBSD und der Bereich für das andere Betriebssystem - in den ersten 1024 Zylindern befinden. Eine 20 Megabyte + &os; und der Bereich für das andere Betriebssystem + in den ersten 1024 Zylindern befinden. Eine 20 Megabyte Bootpartition sollte völlig genügen, wenn Sie einigermaßen sorgfältig arbeiten. Beim ersten Booten von FreeBSD erscheint Missing Operating System. Was ist passiert? Dies ist ein klassischer Fall von Konflikten bei den verwendeten Plattengeometrien von FreeBSD und DOS oder anderen Betriebssystemen. Sie werden FreeBSD neu installieren müssen. Bei Beachtung obiger Instruktionen wird in den meisten Fällen alles funktionieren. Wieso komme ich nicht weiter als bis zum F?-Prompt des Bootmanagers? Dies ist ein weiteres Symptom für das bereits in der vorherigen Frage beschriebene Problem. Ihre Einstellungen zur Geometrie im BIOS und in FreeBSD stimmen nicht überein! Falls Ihr Controller oder BIOS Zylinderumsetzung (oft als >1GB drive support bezeichnet), probieren Sie eine Umsetzung dieser Einstellung und Neuinstallation von FreeBSD. Muss ich den vollständigen Quellcode installieren? Im allgemeinen nicht. Wir empfehlen jedoch dringend die Installation des base Source-Kit, das viele der hier erwähnten Dateien enthält und des sys (Kernel) Source-Kit, das den Quellcode für den Kernel enthält. Außer dem Programm zur Konfiguration des Kernels (&man.config.8;) gibt es im System nichts, zu dessen Funktion der Quellcode erforderlich ist. Mit Ausnahme der Kernelquellen ist unsere Build-Struktur so aufgebaut, dass Sie den Quellcode von überall her per NFS read-only mounten und dennoch neue Binaries erstellen können. (Wegen der Einschränkung bezüglich der Kernelquellen empfehlen wir, diese nicht direkt nach - /usr/src zu mounten, sondern - irgendwoanders hin mit passenden symbolischen Links, um + /usr/src zu mounten, sondern + irgendwo anders hin mit passenden symbolischen Links, um die Toplevel-Struktur des Quellbaumes zu duplizieren.) Die Quellen verfügbar zu haben und zu wissen, wie man ein System mit ihnen erstellt, wird es Ihnen wesentlich einfacher machen, zu zukünftigen Ausgaben von FreeBSD zu wechseln. Um einen Teil der Quellen auszuwählen, verwenden - Sie den Menüpunkt Custom, wenn Sie sich im Menü - Distributions des Systeminstallationstools - befinden. + Sie den Menüpunkt Custom, wenn Sie + sich im Menü Distributions des + Systeminstallationstools befinden. Muss ich einen Kernel erstellen? Ursprünglich war die Erstellung eines neuen Kernels bei fast jeder Installation von FreeBSD erforderlich, aber neuere Ausgaben haben von der Einführung weitaus benutzerfreundlicherer - Kernelkonfigurationswerkzeuge profitiert. Seit &os; 5.X - erfolgt die Kernelkonfiguration in der Regel durch die - die deutlich flexibleren hints, - die am Loader-Prompt eingegeben werden können. + Kernelkonfigurationswerkzeuge profitiert. Die Kernelkonfiguration + erfolgt in der Regel durch die die deutlich flexibleren + hints, die am Loader-Prompt eingegeben werden + können. Es kann dennoch sinnvoll sein, einen neuen Kernel zu erstellen, der nur die benötigten Treiber enthält, um ein wenig Hauptspeicher zu sparen, für die meisten Systeme ist dies aber nicht mehr länger erforderlich. - Soll ich DES, Blowfisch oder MD5 zur Verschlüsselung der + Soll ich DES, Blowfish oder MD5 zur Verschlüsselung der Passwörter benutzen? FreeBSD benutzt standardmäßig MD5 zur Verschlüsselung der Passwörter. Es wird angenommen, dass diese Methode sicherer ist als das traditionell benutzte Verfahren, das auf dem DES Algorithmus basierte. Es ist immer noch möglich, DES-Passwörter zu benutzen, wenn Sie die Datei mit den Passwörtern mit älteren System - austauschen müssen. Ältere System verstehen - meist nur das unsichere Verfahren, dieses steht Ihnen zur - Verfügung, wenn Sie mit sysinstall die - crypto Distribution installieren. Sie - können auch die crypto Sourcecodes installieren, wenn - Sie Ihr System über die Sourcen aktualisieren. Die crypto - Bibliotheken erlauben es Ihnen das sichere Blowfisch Verfahren - für die Verschlüsselung der Passwörter - einzusetzen. Das für neue Passwörter benutzte - Verschlüsselungsverfahren wird über die - Einstellung passwd_format in + austauschen müssen. &os; erlaubt es Ihnen, auch das sichere + Blowfish-Verfahren für die Verschlüsselung der + Passwörter einzusetzen. Das für neue Passwörter + benutzte Verschlüsselungsverfahren wird über die + Einstellung passwd_format in /etc/login festgelegt. Die - möglichen Werte sind entweder des, - blf (falls sie zur Verfügung stehen) - oder md5. Weitere + möglichen Werte sind entweder des, + blf (falls sie zur Verfügung stehen) + oder md5. Weitere Informationen über die Einstellungen für den Login erhalten Sie in &man.login.conf.5;. Woran kann es liegen, dass ich zwar von der Diskette booten kann, aber nicht weiter als bis zur Meldung Probing Devices... komme? Falls Sie ein IDE &iomegazip;- oder &jaz;-Laufwerk eingebaut haben, entfernen Sie es und versuchen Sie es erneut. Solche Laufwerke könnten dem Bootvorgang stören. Nach der Installation des Systems können Sie das Laufwerk wieder einbauen. Dieser Fehler wird hoffentlich in einer späteren Version behoben werden. Wieso wird mit der Fehler panic: cant mount root gemeldet, wenn ich das System nach der Installation reboote? Dieser Fehler beruht auf Unstimmigkeiten zwischen den Festplatteninformationen im Bootblock und denen im Kernel. Der Fehler tritt normalerweise auf IDE-Systemen mit zwei Festplatten auf, bei denen die Festplatten als Master- oder Single-Device auf separaten IDE-Controllern angeschlossen sind und FreeBSD auf der Platte am zweiten Controller installiert wurde. Der Bootblock vermutet, dass das System auf ad0 (der zweiten BIOS-Platte) installiert ist, während der Kernel der ersten Platte auf dem zweiten Controller die Gerätekennung ad2 zuteilt. Der Kernel versucht nach der Geräteüberprüfung die vom Bootblock angenommene Bootdisk ad0 zu mounten, obwohl sie in Wirklichkeit ad2 heißt - und scheitert. Tun Sie folgendes, um dieses Problem zu beheben: Rebooten Sie das System und drücken Sie Enter, wenn die Meldung Booting kernel in 10 seconds; hit [Enter] to interrupt erscheint. Dadurch gelangen Sie in den Boot Loader. Geben Sie nun set root_disk_unit="disk_number" ein. disk_number hat den Wert 0, wenn FreeBSD auf dem Master des ersten IDE-Controllers installiert wurde; 1, wenn FreeBSD auf dem Slave des ersten IDE-Controllers installiert wurde; 2, wenn FreeBSD auf dem Master des zweiten IDE-Controllers installiert wurde; und 3, wenn FreeBSD auf dem Slave des zweiten IDE-Controllers installiert wurde. Nach der Eingabe von boot sollte Ihr System jetzt korrekt starten. Damit Sie dieses Ritual nicht bei jedem Start des Systems durchführen müssen, sollten Sie die Zeile root_disk_unit="disk_number" in die Datei /boot/loader.conf.local eintragen. Stellen Sie eine ununterbrochene Folge der Festplatten her, indem Sie die FreeBSD-Platte am ersten IDE-Controller anschließen. Gibt es eine Hauptspeicherbegrenzung? Bei einer &i386;-Standardinstallation werden maximal - 4 Gigabyte Hauptspeicher unterstützt. Seit - &os; 4.9 und 5.1 wird auch ein größerer - Hauptspeicher unterstützt. Dazu müssen Sie die - zusätzliche Option PAE (&man.pae.4;) in Ihren Kernel - kompilieren: + 4 GB Hauptspeicher unterstützt, mehr Speicher ist + mittels &man.pae.4; verfügbar. Dazu müssen Sie die + zusätzliche Option PAE in Ihren Kernel kompilieren: options PAE - &os;/pc98 unterstützt maximal 4 GB Hauptspeicher, + &os;/pc98 unterstützt maximal 4 GB Hauptspeicher, daher kann PAE auf diesen Systemen nicht verwendet werden. Sonstige von &os; unterstützte Architekturen haben ein sehr viel höheres theoretisches Speicherlimit (viele Terabytes). - Wo liegen die Grenzen für - ffs-Dateisysteme? + Wo liegen die Grenzen für FFS-Dateisysteme? - Theoretisch liegt das Limit für ffs-Dateisysteme - bei 8 Terabyte (2G-Blöcke) oder 16TB für die - Standard-Blockgröße von 8k. In der Praxis - setzt die Software das Limit auf 1 Terabyte herab, aber - durch Modifikationen sind auch Dateisysteme mit 4 Terabyte + Theoretisch liegt das Limit für FFS-Dateisysteme + bei 8 Terabyte (2 G-Blöcke) oder 16 TB für + die Standard-Blockgröße von 8 KB. In der Praxis + setzt die Software das Limit auf 1 TB herab, aber + durch Modifikationen sind auch Dateisysteme mit 4 TB möglich (und existieren auch). Die maximale Größe einer einzelnen - ffs-Datei liegt bei ungefähr 1G Blöcken (4TB, - falls die Blockgröße 4k beträgt). + FFS-Datei liegt bei ungefähr 1 G Blöcken (4 TB, + falls die Blockgröße 4 KB beträgt). Maximale Dateigröße Blockgröße - geht + Geht - sollte gehen + Sollte Gehen - 4K + 4 KB - 4T-1 + > 4 GB - >4T + 4 TB - 1 - 8K + 8 KB - >32G + > 32 GB - 32T-1 + 32 TB - 1 - 16K + 16 KB - >128G + > 128 GB - 32T-1 + 32 TB - 1 - 32K + 32 KB - >512G + > 512 GB - 64T-1 + 64 TB - 1 - 64K + 64 KB - >2048G + > 2048 GB - 128T-1 + 128 TB - 1
Wenn die im Dateisystem verwendete - Blockgröße 4k beträgt, wird mit dreifacher + Blockgröße 4 KB beträgt, wird mit dreifacher Indirektion gearbeitet und die Limitierung sollte durch die höchste Blocknummer erfolgen, die mit dreifacher - Indirektion dargestellt werden kann (ungefähr 1k^3 + - 1k^2 + 1k). In Wirklichkeit liegt das Limit aber bei der - (falschen) Anzahl von 1G-1 Blocknummern im Dateisystem. - Die maximale Anzahl der Blocknummern müsste 2G-1 - sein. Es gibt einige Fehler für Blocknummern nahe - 2G-1, aber solche Blocknummern sind bei einer - Blockgröße von 4k unerreichbar. + Indirektion dargestellt werden kann (ungefähr + 10243 + 10242 + 1024). + In Wirklichkeit liegt das Limit aber bei der (falschen) Anzahl von + 1 G - 1 Blocknummern im Dateisystem. + Die maximale Anzahl der Blocknummern müsste + 2 G - 1 sein. Es gibt einige Fehler für + Blocknummern nahe 2 G - 1, aber solche Blocknummern + sind bei einer Blockgröße von 4 KB + unerreichbar. - Bei Blocknummern von 8k und größer sollte - das Limit bei 2G-1 Blocknummern liegen, - tatsächlich liegt es aber bei 1G-1 Blocknummern. - Die Verwendung der korrekten Grenze von 2G-1 - verursacht Probleme. + Bei Blocknummern von 8 KB und größer sollte + das Limit bei 2 G - 1 Blocknummern liegen, + tatsächlich liegt es aber bei 1 G - 1 + Blocknummern. Die Verwendung der korrekten Grenze von + 2 G - 1 verursacht Probleme.
Wieso erhalte ich die Fehlermeldung archsw.readin.failed beim Start des Systems, nachdem ich einen neuen Kernel erstellt habe? Ihr System und Ihr Kernel sind nicht synchron - dies ist nicht erlaubt. Sie müssen Ihren Kernel mit make buildworld und make buildkernel aktualisieren. Sie können den zu bootenden Kernel direkt im zweiten Schritt angeben, indem Sie eine beliebige Taste - drücken, wenn das | erscheint und bevor der Loader - startet. + drücken, wenn das | erscheint und bevor + der Loader startet. Mein System stürzt beim Booten ab! Was kann ich tun? Deaktivieren Sie die ACPI-Unterstützung. Dazu - drücken Sie beim Start des Bootloaders die Leertaste. - Das System zeigt folgendes an: + drücken Sie beim Start des Bootloaders die + Leertaste. Das System zeigt folgendes an: OK Geben Sie nun unset acpi_load und danach boot ein.
Hardware-Kompatibilität Allgemeines Ich will mir neue Hardware für mein FreeBSD-System zulegen, was soll ich kaufen? Diese Frage wird ständig auf den FreeBSD-Mailinglisten diskutiert. Da sich die Hardware ständig ändert, ist das allerdings keine Überraschung. Trotzdem sollten Sie unbedingt die Hardware-Informationen von &os; (&rel.current; oder &rel2.current;) und die Archive der Mailinglisten durchsehen, bevor Sie nach der neuesten/besten Hardware fragen. Normalerweise gab es kurz zuvor eine Diskussion über genau die Hardware, die Sie sich zulegen wollen. Wenn Sie sich einen Laptop zulegen wollen, sollten Sie einen Blick in das Archiv der Mailingliste &a.mobile; werfen. Ansonsten empfiehlt sich ein Blick in das Archiv von &a.questions; oder auch einer spezialisierte Mailingliste für diese Art von Hardware. Architekturen und Prozessoren Unterstützt FreeBSD neben x86 auch andere Architekturen? Ja. FreeBSD ist zurzeit für die Intel x86 und AMD64 Architekturen verfügbar. Intel EM64T, IA-64, &arm;, &powerpc;, sun4v und &sparc64; werden ebenfalls unterstützt. Die Neuzugänge auf der Liste der in Zukunft unterstützten Plattformen sind &mips; und &s390;. Abonnieren Sie die Mailingliste &a.mips;, wenn Sie mehr über den Stand der Entwicklung erfahren wollen. Schließen Sie sich der Mailingliste &a.platforms; an, wenn Sie an grundsätzlichen Diskussionen über neue Architekturen interessiert sind. Falls Ihre Maschine eine andere Architektur aufweist und Sie unbedingt sofort etwas benötigen, schlagen wir vor, dass Sie sich einmal NetBSD oder OpenBSD ansehen. Unterstützt FreeBSD Symmetric-Multiproccessing (SMP)? Ja, seit &os;-Version 5.2 wurde SMP bereits im GENERIC-Kernel aktiviert. Dies sollte eigentlich auch für &os; 5.3 gelten. Allerdings traten bei der Entwicklung des Kernels auf einigen Rechnern Probleme auf. Daher entschloss man sich, SMP in der Voreinstellung zu deaktivieren, bis diese Probleme behoben sind. Dies ist eine der vordringlichen Aufgaben für &os; 5.4. Festplatten, Bandlaufwerke, sowie CD- und DVD-Laufwerke Welche Arten von Festplatten werden von FreeBSD unterstützt? FreeBSD unterstützt EIDE-, SATA-, SCSI- und SAS-Laufwerke (mit kompatiblen Controllern - siehe folgenden Abschnitt), sowie alle Laufwerke, die die original Western Digital-Schnittstelle (MFM, RLL, ESDI und natürlich IDE) benutzen. Ein paar Controller mit proprietären Schnittstellen könnten nicht laufen: halten Sie sich an WD1002/3/6/7-Schnittstellen und Clones. Welche SCSI- oder SAS-Controller werden unterstützt? Sie finden eine vollständige und aktuelle Liste in den Hardware-Informationen zu &os; (&rel.current; oder &rel2.current;). Welche Arten von Bandlaufwerken werden unterstützt? FreeBSD unterstützt SCSI-, QIC-36- (mit QIC-02-Schnittstelle) und QIC-40/80-Bandlaufwerke (diskettenbasiert). Hierzu gehören auch 8-mm (aka Exabyte) und DAT-Laufwerke. Die QIC-40/80-Laufwerke sind bekanntlich sehr langsam. Einige der frühen 8-mm-Laufwerke sind nicht besonders kompatibel zu SCSI-2 und könnten unter FreeBSD nicht einwandfrei funktionieren. Unterstützt FreeBSD Bandwechsler? Das Gerät &man.ch.4; und das Kommando chio unterstützen Bandwechsler. Details zum Betrieb des Wechslers finden Sie in der Hilfeseite &man.chio.1;. Falls Sie nicht AMANDA oder ein anderes Produkt benutzen, das den Wechsler bereits kennt, bedenken Sie, dass die Programme nur wissen, wie sie ein Band von einem Punkt zu einem anderen bewegen müssen. Sie selbst müssen sich also merken, in welchem Einschub sich ein Band befindet und zu welchem Einschub das Band, das sich gerade im Laufwerk befindet, zurück muss. Welche CDROM-Laufwerke werden von FreeBSD unterstützt? Jedes an einem unterstützten Controller angeschlossene SCSI-Laufwerk wird unterstützt. Die folgenden proprietären CDROM-Schnittstellen werden ebenfalls unterstützt: Mitsumi LU002 (8bit), LU005 (16bit) und FX001D (16bit 2x Speed). Sony CDU 31/33A Sound Blaster Non-SCSI CDROM Matsushita/Panasonic CDROM ATAPI compatible IDE CDROMs Von allen Nicht-SCSI-Laufwerken ist bekannt, dass sie im Vergleich zu SCSI-Laufwerken extrem langsam sind. Einige ATAPI-CDROMs könnten nicht funktionieren. FreeBSD kann direkt von der offiziellen &os; CD-ROM, sowie den CD-ROMs von Daemon News und &os; Mall, gebootet werden. Welche CD-Brenner werden von FreeBSD unterstützt? FreeBSD unterstützt alle ATAPI-kompatiblen IDE CD-R und CD-RW Brenner. Lesen Sie dazu auch &man.burncd.8;. FreeBSD unterstützt ebenfalls SCSI CD-R und CD-RW Brenner. Installieren und benutzen Sie das Paket cdrecord aus der Ports-Sammlung. Dazu müssen Sie allerdings das Gerät pass mit in Ihren Kernel aufnehmen. Unterstützt FreeBSD &iomegazip;-Laufwerke? FreeBSD unterstützt alle gängigen SCSI- und ATAPI-&iomegazip;-Laufwerke. Ihr SCSI-ZIP-Laufwerk darf nur mit den SCSI-Ziel-IDs 5 oder 6 laufen, aber Sie können sogar davon booten, falls das BIOS Ihres Hostadapters dies unterstützt. Es ist nicht bekannt, welche Hostadapter das Booten von anderen Zielen als 0 oder 1 erlauben; daher werden Sie in ihren Handbüchern nachsehen müssen, wenn Sie dieses Merkmal benutzen möchten. FreeBSD unterstützt ZIP-Laufwerke, die an der parallelen Schnittstelle angeschlossen sind. Der Kernel sollte die folgenden Treiber enthalten: scbus0, da0, ppbus0 und vp0 (der GENERIC-Kernel enthält alle, außer vp0). Wenn diese Treiber vorhanden sind, sollte das Laufwerk an der parallelen Schnittstelle als /dev/da0s4 verfügbar sein. Zip-Datenträger können mit mount /dev/da0s4 /mnt ODER (DOS-formatierte) mount_msdos /dev/da0s4 /mnt gemountet werden. Lesen Sie auch den FAQ-Eintrag zu Wechseldatenträgern und die Anmerkungen zum Thema Formatierung im Kapitel Administration. Unterstützt FreeBSD &jaz;, EZ und andere Wechsellaufwerke? Ja. Bei den meisten dieser Geräte handelt es sich um SCSI-Geräte, die von FreeBSD auch als solche angesprochen werden. Lediglich das IDE-EZ-Laufwerk wird als IDE-Laufwerk angesprochen. Schalten Sie die Laufwerke ein, bevor Sie Ihr System booten. Müssen Sie Medien im laufenden Betrieb wechseln, sollten Sie zuvor &man.mount.8;, &man.umount.8;, sowie &man.camcontrol.8; (für SCSI-Laufwerke) oder &man.atacontrol.8; (für IDE-Laufwerke), sowie den Abschnitt zur Nutzung von Wechsellaufwerken dieser FAQ lesen. Tastaturen und Mäuse Unterstützt FreeBSD meine Tastatur mit USB-Anschluss? Ja. FreeBSD unterstützt USB-Tastaturen, wenn Sie die USB-Unterstützung in /etc/rc.conf aktivieren. Wenn Sie die Unterstützung für USB-Tastaturen konfiguriert haben, ist die AT-Tastatur als /dev/kbd0 und die USB-Tastatur als /dev/kbd1 verfügbar. Dies gilt natürlich nur, wenn beide Tastaturen angeschlossen sind; falls nur die USB-Tastatur angeschlossen ist, ist diese als /dev/ukbd0 verfügbar. Wenn Sie die USB-Tastatur an der Systemkonsole benutzen wollen, müssen Sie dies dem System explizit mitteilen. Dazu muss das folgende Kommando während des Systemstarts ausgeführt werden: &prompt.root; kbdcontrol -k /dev/kbd1 < /dev/ttyv0 > /dev/null Wenn Sie nur die USB-Tastatur angeschlossen haben, ist diese als /dev/ukbd0 verfügbar; daher muss in diesem Fall das folgende Kommando benutzt werden: &prompt.root; kbdcontrol -k /dev/ukbd0 < /dev/ttyv0 > /dev/null Tragen Sie dieses Kommando in Datei /etc/rc.i386 ein. Sobald Sie diese Schritte durchgeführt haben, sollte die USB-Tastatur ohne weitere Änderungen auch unter X benutzbar sei. Zurzeit kann es noch Probleme geben, wenn Sie eine USB-Tastatur im laufenden Betrieb einstecken oder abziehen. Um Probleme zu vermeiden, sollten Sie die Tastatur anschließen, bevor Sie das System anschalten und die Tastatur nicht abziehen, solange das System noch läuft. Weitere Informationen erhalten Sie in &man.ukbd.4;. Ich habe eine unübliche Busmaus. Wie muss ich sie konfigurieren? FreeBSD unterstützt die Busmaus und InPort-Busmaus von Herstellern wie Microsoft, Logitech und ATI. Der Gerätetreiber ist im GENERIC-Kernel allerdings nicht eingebunden. Wenn Sie den Bus-Gerätetreiber benötigen, müssen Sie daher einen angepassten Kernel erstellen. Dazu fügen Sie die folgende Zeile in Ihre Kernelkonfigurationsdatei ein: device mse0 at isa? port 0x23c irq5 Die Busmaus wird üblicherweise zusammen mit einer speziellen Karte ausgeliefert. Sie könnte es Ihnen ermöglichen, andere Werte für die Port-Adresse und den Interrupt zu setzen. Weitere Informationen finden Sie in Handbuch zu Ihrer Maus und in der &man.mse.4; Manualpage. Wie benutze ich meine PS/2 (Mouse-Port oder Tastatur)-Maus? PS/2 Mäuse werden von FreeBSD unterstützt. Der notwendige Gerätetreiber, psm, ist bereits im GENERIC-Kernel enthalten. Wenn Sie einen angepassten Kernel ohne diesen Treiber benutzen, müssen Sie folgende Zeile in Ihre Kernelkonfigurationsdatei einfügen und den Kernel neu kompilieren: device psm0 at atkbdc? irq 12 Wenn der Kernel das Gerät psm0 beim Booten korrekt erkennt, stellen Sie sicher, dass sich im Verzeichnis /dev ein Eintrag für psm0 befindet. Durch die Eingabe von &prompt.root; cd /dev; sh MAKEDEV psm0 können Sie diesen Eintrag auch selbst erstellen. Dazu müssen Sie allerdings als root angemeldet sind. Lassen Sie diesen Schritt aus, wenn Sie FreeBSD 5.0-RELEASE oder eine neuere Version mit &man.devfs.5; verwenden. Die Gerätedateien werden in diesem Fall automatisch in /dev erstellt. Kann man die Maus irgendwie außerhalb des X Window Systems benutzen? - Falls Sie den normalen Konsoltreiber &man.syscons.4; benutzen, + Falls Sie den normalen Konsolentreiber &man.syscons.4; benutzen, können Sie den Mauszeiger auf Textkonsolen zum Kopieren und Einfügen von Text verwenden. Starten Sie den Mausdämon &man.moused.8; und schalten Sie den Mauszeiger auf der virtuellen Konsole ein: &prompt.root; moused -p /dev/xxxx -t yyyy &prompt.root; vidcontrol -m on xxxx ist der Gerätename der Maus und yyyy ist das Protokoll. Der Mausdämon erkennt die Protokolle der meisten Mäuse (mit Ausnahme alter serieller Mäuse) automatisch, wenn Sie auto für das Protokoll angeben. Falls das Protokoll nicht automatisch erkannt wird, finden Sie die unterstützten Protokolle in der &man.moused.8; Manualpage. Wenn Sie eine PS/2-Maus besitzen und diese beim Systemstart aktivieren wollen, tragen Sie die Zeile moused_enable="YES" in die Datei /etc/rc.conf ein. Falls Sie den Mausdämon auf allen virtuellen Bildschirmen anstatt nur auf der Konsole benutzen wollen, tragen Sie außerdem allscreens_flags="-m on" in /etc/rc.conf ein. Während der Mausdämon läuft, muss der Zugriff auf die Maus zwischen dem Mausdämon und anderen Programmen, wie X Windows, koordiniert werden. Die FAQ Warum funktioniert meine meine Maus unter X nicht? enthält weitere Details. Wie funktioniert das Kopieren und Einfügen von Text mit der Maus auf einer Textkonsole? Wenn Sie es geschafft haben, den Mausdämon zu starten (wie im vorherigen Abschnitt gezeigt), halten Sie die linke Maustaste gedrückt und bewegen Sie die Maus, um einen Textabschnitt zu markieren. Dann drücken Sie die mittlere Maustaste, um den Text an der Cursorposition einzufügen. Wenn Sie keine 3-Tasten-Maus besitzen, können Sie die mittlere Maustaste mit einer Tastenkombination emulieren oder die Funktion der mittleren Taste auf eine andere Taste legen. Einzelheiten dazu enthält die Hilfeseite &man.moused.8;. Meine Maus hat ein neumodisches Rad und mehr Knöpfe. Kann ich sie in FreeBSD benutzen? Unglücklicherweise lautet die Antwort: Vielleicht. Solche Mäuse mit zusätzlichen Extras erfordern in den meisten Fällen spezielle Treiber. Wenn der Gerätetreiber für die Maus oder das Anwendungsprogramm keine spezielle Unterstützung für die Maus bietet, wird sie sich wie eine gewöhnliche Maus mit zwei oder drei Knöpfen verhalten. Ob und wie Sie das Rad unter X benutzen können, können Sie im passenden Abschnitt der FAQ erfahren. Wie benutze ich Maus/Trackball/Touchpad auf meinem Laptop? Bitte lesen Sie die Antwort zur vorherigen Frage. Wie kann ich die Delete-Taste in der sh und csh einsetzen? Für die Bourne Shell fügen Sie die folgende Zeile in die Datei .shrc ein (lesen Sie dazu auch die Manualpages &man.sh.1; sowie &man.editrc.5;). bind ^? ed-delete-next-char # for console bind ^[[3~ ed-delete-next-char # for xterm Für die C Shell nehmen Sie hingegen die folgende Zeile in die Datei .cshrc auf (lesen Sie dazu auch die Manualpage &man.csh.1;). bindkey ^? delete-char # for console bindkey ^[[3~ delete-char # for xterm Weitere Informationen zu diesem Thema finden sich auch hier. Netzkarten und serielle Geräte Welche Netzwerkkarten unterstützt FreeBSD? In den Hardware Informationen zu jedem FreeBSD Release werden die unterstützten Karten aufgezählt. Unterstützt FreeBSD Software Modems, wie die Winmodems? FreeBSD unterstützt viele Software-Modems, wenn Sie zusätzliche Software installieren. Der Port comms/ltmdm bietet Unterstützung für Modems, die auf dem oft verwendeten Lucent LT Chipsatz basieren. Der Port comms/mwavem bietet Unterstützung für die Modems im IBM Thinkpad 600 und 700. Sie können FreeBSD nicht über ein Software-Modem installieren, diese Software kann nur installiert werden, nachdem das Betriebssystem installiert wurde. Gibt es einen FreeBSD-Treiber für die Karten der Serie 43xx von Broadcom? Nein, und es wird wohl auch nie einen geben. Broadcom weigert sich, Informationen zu ihren drahtlosen Chipsätzen zu veröffentlichen. Wahrscheinlich liegt dies daran, dass Broadcom auch softwaregesteuerte Radios herstellt. Damit ihre Produkte von der FCC zugelassen werden, muss sichergestellt sein, dass Benutzer nicht in der Lage sind, Betriebsfrequenzen, Modulationsparameter, Ausgangsleistung und andere Werte nach Belieben einzustellen. Ohne solche Informationen ist es aber nahezu unmöglich, einen Treiber zu programmieren. Welche seriellen Multi-Port-Karten werden von FreeBSD unterstützt? Es existiert eine Liste der unterstützten Karten im Abschnitt Serielle Datenübertragung des Handbuchs. Von einigen NoName-Nachbauten ist ebenfalls bekannt, dass sie funktionieren, speziell von den AST-kompatiblen. In &man.sio.4; finden Sie weitere Informationen zur Konfiguration solcher Karten. Wie kann ich den boot:-Prompt auf einer seriellen Konsole erscheinen lassen? Lesen Sie diesen Abschnitt des Handbuchs. Soundkarten Welche Soundkarten werden von FreeBSD unterstützt? &os; unterstützt verschiedene Soundkarten wie &soundblaster;, &soundblaster; Pro, &soundblaster; 16, Pro Audio Spectrum 16, AdLib und Gravis UltraSound. Lesen Sie die &os; Release Informationen sowie &man.snd.4;, wenn Sie genauere Informationen benötigen. MPU-401 und kompatible MIDI-Karten werden begrenzt unterstützt. Ebenso unterstützt werden Karten, die der µsoft; Sound System-Spezifikation entsprechen. Das gilt nur für Sound! Dieser Treiber unterstützt keine CDROMs, SCSI oder Joysticks auf diesen Karten, außer der &soundblaster;. Die &soundblaster;-SCSI-Schnittstelle und einige Nicht-SCSI-CDROMs werden unterstützt, Sie können von diesen Geräten aber nicht booten. Abhilfen für fehlenden Sound bei Verwendung des &man.pcm.4;-Treibers? Einige Soundkarten, darunter solche mit es1370-Chip, setzen die Lautstärke bei jedem Systemstart auf 0. In diesem Fall müssen Sie nach jedem Bootvorgang den folgenden Befehl ausführen: &prompt.root; mixer pcm 100 vol 100 cd 100 Sonstige Hardware Unterstützt FreeBSD Power-Management auf meinem Laptop? FreeBSD 4.X unterstützt APM auf einigen Systemen. Lesen Sie dazu auch &man.apm.4;. FreeBSD 5.X und neuer unterstützen einen Großteil der ACPI-Funktionen moderner Hardware. Lesen Sie dazu auch &man.acpi.4;. Unterstützt Ihr System sowohl APM als auch ACPI, können Sie beide Systeme testen und sich für das System entscheiden, das Ihren Anforderungen am besten entspricht. Wie kann ich ACPI deaktivieren? Fügen Sie die Zeile hint.acpi.0.disabled="1" in die Datei /boot/device.hints ein. Wieso hängt sich mein Micron-System beim Booten auf? Lesen Sie die vorherige Antwort. Wenn ich ein System mit einem ASUS K7V Mainboard von der Bootdiskette starte, hängt sich das System auf. Wie kann ich dieses Problem lösen? Schalten Sie im BIOS die Option boot virus protection aus. Warum arbeitet meine &tm.3com; PCI-Netzwerkkarte in meinem Micron-Computer nicht? Einige Micron Motherboards besitzen eine nicht-konforme PCI-BIOS-Implementierung, die die PCI-Geräte nicht an den angegebenen Adressen konfiguriert. Hierdurch entstehen Probleme, wenn FreeBSD bootet. Deaktivieren Sie die Option Plug and Play Operating System im BIOS, um das Problem zu umgehen. Meine PCMCIA-Karte funktioniert nicht und ich erhalte die Meldung: cbb0: unsupported card type detected.. Was kann ich tun? Sie können die ursprüngliche OLDCARD-Implementierung verwenden. Dazu entfernen Sie die folgenden Zeilen aus Ihrer Kernelkonfigurationsdatei: device cbb device pccard device cardbus Danach fügen Sie die folgenden Zeilen ein: device pcic device card 1 Um die Änderungen zu aktivieren, müssen Sie den neuen Kernel noch wie im Abschnitt Konfiguration des FreeBSD-Kernels des Handbuchs beschrieben bauen und installieren. Fehlerbehebung Warum zeigt &os; eine falsche Speichergröße an? Das liegt an den Unterschieden zwischen physikalischen und virtuellen Speicheraddressen. Bei moderner PC-Hardware ist es üblich, den Speicherbereich zwischen 3,5 und 4 Gigabyte für spezielle Aufgaben (normalerweise für PCI) zu reservieren. Dieser Adressbereich wird dabei dazu verwendet, um auf PCI-Hardware zuzugreifen. Dadurch kann in diesem Speicherbereich kein physikalischer Speicher existieren. Was mit dem in diesen Bereich gehörenden physikalischen Speicher passiert, hängt von der von Ihnen eingesetzten Hardware ab. Unglücklicherweise gibt es noch immer Hardware, die hier gar nichts macht. In diesem Fall ist Ihr System nicht in der Lage, auf diese 500 Megabyte des RAMs zuzugreifen. Ein Großteil der heute existierenden Hardware ist aber inzwischen in der Lage, diesen Speicherbereich in einen höheren Speicherbereich umzulenken, damit Sie weiterhin darauf zugreifen können. Allerdings kann es durch dieses Umlenken zu verwirrende Meldungen während des Systemstarts kommen. Unter 32-Bit-Versionen von &os; scheint dieser Speicherbereich nicht verfügbar zu sein, da er in einen Bereich oberhalb von 4 Gigabyte übertragen wurde, auf den ein 32-Bit-Kernel allerdings nicht zugreifen kann. Ist dies bei Ihnen der Fall, müssen Sie die PAE-Unterstützung in Ihren Kernel kompilieren. Lesen Sie dazu auch den entsprechenden FAQ-Eintrag. Verwenden Sie hingegen eine 64-Bit-Version von &os; oder einen 32-Bit-Kernel mit aktivierter PAE-Unterstützung, ist &os; in der Lage, diesen Speicherbereich korrekt zu erkennen und umzulenken, damit Sie weiterhin darauf zugreifen können. Allerdings wird in diesem Fall beim Systemstart mehr Speicher angezeigt, als tatsächlich auf Ihrem System vorhanden ist. Dies ist aber normal und wird nach dem Ende des Systemstarts automatisch korrigiert. Was sollte ich tun, wenn auf meiner Festplatte fehlerhafte Blöcke sind? SCSI-Laufwerke sollten in der Lage sein, diese automatisch zu verlagern. Bei einigen Laufwerken ist diese Eigenschaft jedoch aus unerfindlichen Gründen bei der Auslieferung ausgeschaltet... Um sie einzuschalten, müssen Sie den Page-Mode des ersten Gerätes editieren. Unter FreeBSD können Sie das (als root) mit folgendem Befehl tun &prompt.root; camcontrol modepage sd0 -m 1 -e -P 3 und die Werte für AWRE und ARRE von 0 auf 1 ändern: AWRE (Auto Write Reallocation Enbld): 1 ARRE (Auto Read Reallocation Enbld): 1 Moderne IDE-Controller sind in der Lage, fehlerhafte Blöcke automatisch zu verlagern. Diese Funktionen sind bereits ab Werk aktiviert. Werden dennoch fehlerhafte Blöcke gemeldet (egal auf welchem Laufwerk), sollten Sie über den Kauf einer neuen Platte nachdenken. Zwar könnte es Ihnen mit Diagnoseprogrammen des Plattenherstellers gelingen, diese fehlerhaften Blöcke zu sperren. Allerdings können Sie damit den endgültigen Ausfall der Platte bestenfalls hinauszögern. Wieso wird der SCSI-Controller meines HP Netserver nicht erkannt? Hierbei handelt es sich um ein bekanntes Problem. Der auf dem Board befindliche EISA-SCSI-Controller auf dem HP Netserver belegt die EISA-Slotnummer 11, wodurch sich alle wirklichen EISA-Slots vor ihm befinden. Leider kollidiert der Adressraum von EISA-Slots >=10 mit dem Adressraum, der PCI zugeordnet ist und die Autokonfiguration von FreeBSD kann mit dieser Situation derzeit nicht besonders gut umgehen. Die einfachste Alternative ist, diese Kollision einfach zu leugnen. Setzen Sie dazu die Kerneloption EISA_SLOTS auf den Wert 12. Konfigurieren und kompilieren Sie den Kernel, wie im Handbucheintrag zur Kernelkonfiguration beschrieben. Dies bringt Ihnen natürlich das klassische Huhn-Ei-Problem, wenn Sie auf einer solchen Maschine installieren wollen. Um dieses Problem zu umgehen, existiert ein spezieller Hack in UserConfig. Benutzen Sie nicht die visuelle Schnittstelle, sondern die rohe Kommandozeilenschnittstelle. Geben Sie einfach eisa 12 quit am Prompt ein und Sie können Ihr System ganz normal installieren. Sie sollten auf jeden Fall einen angepassten Kernel zu kompilieren und installieren. Zukünftige Versionen werden hoffentlich eine passende Lösung für dieses Problem beinhalten. Sie können keine dangerously dedicated Platte auf einem HP Netserver verwenden. Lesen Sie weitere Informationen finden Sie in diesem Hinweis. Was bedeuten die ständigen Meldungen ed1: timeout? Dies wird meistens durch einen Interruptkonflikt verursacht (z.B., wenn zwei Karten den selben Interrupt benutzen). Booten Sie mit der Option und ändern Sie die Einträge zu ed0/de0/... (d.h. Ihrem Board entsprechend). Wenn Sie den BNC-Anschluss Ihrer Netzwerkkarte benutzen, könnte es auch sein, dass es sich Geräte-Timeouts aufgrund fehlerhafter Terminierung handelt. Um dies zu überprüfen, verbinden Sie einen Terminator direkt mit der Netzwerkkarte (ohne Kabel) und beobachten Sie, ob die Fehlermeldungen verschwinden. Einige NE2000 kompatible Karten melden diesen Fehler, wenn keine Verbindung am UTP-Eingang existiert oder wenn das Kabel nicht eingesteckt ist. Warum funktioniert meine &tm.3com; 3C509 plötzlich nicht mehr? Diese Karte ist dafür berüchtigt, ihre Konfiguration zu vergessen. Sie müssen die Karte mit dem DOS-Programm 3c5x9.exe neu konfigurieren. Mein an der parallel Schnittstelle angeschlossener Drucker ist unglaublich langsam. Was kann ich tun? Falls das einzige Problem ist, dass er schrecklich langsam ist, dann sollte Sie versuchen, die Kommunikationseinstellungen der parallelen Schnittstellen zu ändern, wie es im Kapitel Drucken des Handbuchs beschrieben ist. Wieso brechen meine Programme gelegentlich mit Signal 11-Fehlern ab? Das Signal 11 wird generiert, wenn ein Prozess versucht, auf Speicher zuzugreifen, obwohl er vom Betriebssystem dazu nicht befugt wurde. Wenn Ihnen das scheinbar zufällig immer wieder passiert, sollten Sie der Sache einmal auf der Grund gehen. Das Problem hat in der Regel eine der folgenden Ursachen: Wenn das Problem nur in einer bestimmten Anwendung auftritt, die Sie selbst entwickeln, dann ist es wahrscheinlich ein Fehler in Ihren Sourcen. Wenn das Problem in einem Teil von FreeBSD auftritt, könnte es natürlich auch ein Fehler sein; aber in den meisten Fällen werden diese Probleme gefunden und behoben, bevor die typischen Leser der FAQ (wir) diese Teile der Sourcen benutzen können (dafür gibt es schließlich -CURRENT). Wenn der Fehler auftritt, wenn Sie ein Programm compilieren aber dabei immer wieder an anderer Stelle auftritt, dann ist das ein ganz eindeutiger Hinweis, dass das Problem nicht bei FreeBSD liegt. Nehmen wir zum Beispiel an, dass Sie make buildworld ausführen und die Compilierung von ls.c in ls.o abbricht. Wenn Sie nochmal make buildworld durchführen und die Compilierung an der gleichen Stelle abbricht, handelt es sich um einen Fehler in den Sourcen. Aktualisieren Sie Ihre Sourcen und versuchen Sie es noch einmal. Wenn der Fehler jedoch an einer anderen Stelle auftritt, liegt das Problem mit an Sicherheit grenzender Wahrscheinlichkeit bei Ihrer Hardware. Was Sie tun sollten: Im ersten Fall können Sie einen Debugger wie z.B. &man.gdb.1; benutzen, um die Stelle im Programm zu finden, an der auf eine falsche Adresse zugegriffen wird und danach den Fehler beheben. Im zweiten Fall müssen Sie sicherstellen, dass das Problem nicht von Ihrer Hardware verursacht wird. Typische Ursachen dafür sind unter anderem: Es könnte sein, dass Ihren Festplatten zu warm werden: Überprüfen Sie, ob die Lüfter in Ihrem Gehäuse noch funktionieren, damit Ihre Festplatten (und andere Hardware) nicht heißlaufen. Der Prozessor überhitzt, weil Sie Ihn übertaktet haben oder der CPU-Kühler ausgefallen ist. Sie müssen sicherstellen, dass Sie Ihre Hardware unter den Bedingungen betreiben, für die sie spezifiziert ist, - zumindestens während Sie versuchen, das Problem + zumindest während Sie versuchen, das Problem zu lösen. Mit anderen Worten: Betreiben Sie Ihre CPU mit der normalen Taktfrequenz. Wenn Sie übertakten, sollten Sie daran denken, dass ein langsames System deutlich billiger ist als ein defektes System. Die große Masse hat nicht sehr häufig Mitgefühl mit Problemen bei übertakteten System, auch wenn Sie es für ungefährlich halten. Unzuverlässiger Speicher: Wenn Sie mehr als ein SIMM/DIMM installiert haben, sollten Sie sie alle ausbauen und die Maschine testweise mit jedem SIMM oder DIMM einzeln betreiben. So können Sie feststellen, ob die Ursache ein einzelnes SIMM/DIMM oder auch eine Kombination von Modulen ist. Zu optimistische Einstellung des Mainboards: In Ihrem BIOS und mit den Jumpern auf dem Mainboard können Sie diverse Timings ändern. In den meisten Fällen reichen die Defaults aus, aber manchmal kann es durch zu wenig wait states, die Einstellung RAM Speed: Turbo oder ähnliches zu merkwürdigen Problemen kommen. Ein möglicher Ansatz ist, die BIOS defaults zu laden, allerdings könnte es sinnvoll sein, die aktuellen Einstellungen vorher zu notieren. Schlechte oder fehlerhafte Stromversorgung des Mainboards: Wenn Sie unbenutzte Steckkarten, Platten oder CDROMs in Ihrem System haben, sollten Sie sie testweise ausbauen oder die Stromversorgung abziehen. Dadurch können Sie prüfen, ob Ihr Netzteil eventuell mit einer geringeren Last besser zurechtkommt. Sie können auch testweise ein anderes, am besten ein leistungsfähigeres, Netzteil ausprobieren. Wenn Sie zurzeit ein 250W-Netzteil benutzen, sollten Sie testweise ein 300W-Netzteil einbauen. Die sollten ebenfalls die SIG11 FAQ (unten aufgeführt) lesen, da sie gute Erklärungen für alle diese Probleme enthält (allerdings aus &linux;-Sicht). Sie erklärt ebenfalls, warum sowohl Programme als auch Geräte zur Speicherprüfung fehlerhaften Speicher teilweise nicht erkennen. Wenn alle diese Schritte nicht helfen, ist es möglich, dass Sie einen Fehler in FreeBSD gefunden haben. Folgen Sie einfach den Anweisungen für die Erstellung eines Problem Reports. Es existiert eine ausführliche FAQ hierzu unter der SIG11-Problem-FAQ Mein System stürzt mit der Meldung Fatal trap 12: page fault in kernel mode oder panic: ab und gibt eine Menge zusätzlicher Informationen aus. Was kann ich tun? Die Entwickler von FreeBSD interessieren sich für solchen Meldungen, allerdings brauchen Sie deutlich mehr Informationen als die, die Ihnen angezeigt werden. Kopieren Sie die komplette Meldungen und lesen Sie nun den FAQ-Eintrag über kernel panics. Erzeugen sie einen Kernel mit den zusätzlichen Daten zur Fehlersuche, und dann einen backtrace. Das hört sich komplizierter an, als es ist. Sie brauchen keine Programmier-Erfahrung, Sie müssen einfach nur den Anweisungen folgen. Wieso wird beim Booten der Bildschirm schwarz und reagiert nicht mehr? Dies ist ein bekanntes Problem mit der ATI Mach 64 Videokarte. Das Problem besteht darin, dass diese Karte die Adresse 2e8 benutzt und die vierte serielle Schnittstelle ebenfalls. Aufgrund eines Fehlers (einer Besonderheit?) im &man.sio.4;-Treiber wird diese Schnittstelle angesprochen, auch wenn Sie gar keine vierte serielle Schnittstelle besitzen und sogar, wenn Sie sio3 (die vierte Schnittstelle), die normalerweise diese Adresse verwendet, deaktivieren. Bis der Fehler behoben ist, können Sie folgende Abhilfe verwenden: Geben Sie am Bootprompt ein. (Dies bringt den Kernel in den Konfigurationsmodus). Deaktivieren Sie sio0, sio1, sio2 und sio3 (alle). Auf diese Weise wird der &man.sio.4;-Treiber nicht aktiviert und das Problem tritt nicht mehr auf. Geben Sie exit ein, um den Bootvorgang fortzusetzen. Falls sie in der Lage sein wollen Ihre seriellen Schnittstellen zu benutzen, müssen Sie einen neuen Kernel mit folgenden Modifikationen erstellen: suchen Sie in /usr/src/sys/dev/sio.c (oder in /usr/src/sys/pc98/cbus/sio.c für pc98) nach der Zeichenkette 0x2e8 und löschen Sie sie und das vorhergehende Komma (nicht das folgende Komma). Nun folgen Sie der normalen Prozedur zur Erstellung eines neuen Kernels. Auch nach Anwendung dieser Maßnahmen könnte es sein, dass Ihr X Windows-System nicht einwandfrei funktioniert. Wenn dies der Fall ist, stellen Sie sicher, dass es sich bei der von Ihnen benutzten X Windows-Version mindestens um &xfree86; 3.3.3 oder höher handelt. Diese Version und höhere besitzen eine integrierte Unterstützung für Mach64-Karten und sogar einen dedizierten X-Server für sie. Wieso verwendet FreeBSD nur 64 MB Hauptspeicher, obwohl in meinem Rechner 128 MB sind? Aufgrund der Art und Weise, wie FreeBSD die Hauptspeichergröße vom BIOS mitgeteilt bekommt, kann es lediglich 16-Bit Werte in kByte-Größe (65535 kByte = 64MB) erkennen (oder weniger... einige BIOSe setzen die Hauptspeichergröße auf 16MB). Falls Sie mehr als 64MB besitzen, wird FreeBSD versuchen, das zu erkennen, was aber nicht immer funktioniert. Um dieses Problem zu umgehen, müssen Sie die untenstehende Kerneloption verwenden. Es gibt einen Weg, vollständige Hauptspeicherinformationen vom BIOS zu erhalten, aber in den Bootblöcken ist nicht genügend Platz dafür vorhanden. Wenn der Platzmangel in den Bootblöcken eins Tages behoben ist, werden wir die erweiterten BIOS-Funktionen dazu nutzen, die vollständigen Hauptspeicherinformationen zu erhalten... aber zurzeit sind wir auf die Kerneloption angewiesen. options MAXMEM=n Hierbei ist n Ihre Hauptspeichergröße in Kilobyte. Bei einer 128 MB-Maschine müßten Sie 131072 benutzen. Ich habe mehr als 1 GB RAM. Trotzdem stürzt mein System mit der Meldung kmem_map too small ab. Was läuft hier schief? Im Normalfall bestimmt FreeBSD einige Kernelparameter, darunter die maximale Anzahl der Dateien, die gleichzeitig geöffnet sein können, aus der Größe des im System installierten Hauptspeichers. Auf Systemen mit mindestens 1 GB Hauptspeicher kann dieser auto sizing-Mechanismus diese Werte fälschlicherweise zu hoch ansetzen: Beim Systemstart fordert der Kernel dann verschiedene Tabellen und andere Strukturen an, die den Großteil des verfügbaren Kernelspeichers verbrauchen. Dies führt dazu, dass der Kernel während des Betriebs keine dynamischen Speicheranforderungen mehr ausführen kann und mit einer Kernelpanik abstürzt. Bauen Sie in diesem Fall Ihren eigenen Kernel. Dazu setzen Sie in Ihrer Kernelkonfigurationsdatei auf 400 MB (). 400 MB sollten für Maschinen bis 6 GB Hauptspeicher ausreichend sein. Ich habe weniger als 1 GB Hauptspeicher. Dennoch stürzt mein System mit der Meldung kmem_map too small ab! Diese Meldung zeigt an, dass der virtuelle Speicher für Netzwerkpuffer (spezieller mbuf-Cluster) aufgebraucht ist. Sie können die für mbuf verfügbare Größe an VM erhöhen, indem Sie den Anweisungen des Abschnitts Netzwerk-Limits des Handbuchs folgen. Wieso erhalte ich die Meldung /kernel: proc: table is full? Der FreeBSD-Kernel beschränkt die Anzahl der gleichzeitig laufenden Prozesse. Die Anzahl errechnet sich aus dem Wert der Variablen MAXUSERS in der Konfigurationsdatei des Kernels. Auch andere Einstellungen wie die Anzahl der Puffer für Netzwerkoperationen (Details dazu finden Sie in diesem Abschnitt). werden durch MAXUSERS beeinflusst. Wenn Ihr System stark belastet ist, sollten Sie den Wert von MAXUSERS erhöhen. Dadurch werden diverse Einstellung des Systems angepasst und die maximale Anzahl gleichzeitig laufender Prozesse erhöht. Um den Wert von MAXUSERS anzupassen, folgen Sie den Anweisungen des Abschnitts Datei- und Prozesslimits des Handbuchs. Dieser Abschnitt spricht zwar nur von Dateien, für Prozesse gelten aber die gleichen Beschränkungen. Wenn Ihr System nicht besonders stark ausgelastet ist und Sie einfach nur mehr gleichzeitig laufende Prozesse erlauben wollen, können Sie den Wert der Variable kern.maxproc in der Datei /boot/loader.conf anpassen. Um die Änderung zu aktivieren, müssen Sie Ihr System neu starten. Wollen Sie Ihr System zusätzlich optimieren, sollten Sie &man.loader.conf.5; und &man.sysctl.conf.5; lesen. Wenn diese Prozesse von einem einzigen Benutzer ausgeführt werden, müssen Sie den Wert von kern.maxprocperuid ebenfalls erhöhen. Dieser Wert muss immer mindestens um eins geringer sein als der Wert von kern.maxproc value. (Der Grund für diese Einschränkung ist, dass ein Systemprogramm, &man.init.8;, immer ausgeführt werden muss.) Damit Änderungen einer sysctl-Variable dauerhaft erhalten bleiben, nehmen Sie diese in /etc/sysctl.conf auf. Weitere Informationen zur Optimierung Ihres Systems finden Sie im Abschnitt Einstellungen mit sysctl des Handbuchs. Wieso erhalte ich die Meldung CMAP busy panic, wenn ich mein System mit einem neuen Kernel starte? Die Logik, die versucht, veraltete /var/db/kvm_*.db-Dateien zu erkennen, versagt manchmal und die Benutzung einer unpassenden Datei kann zu Paniksituationen führen. Falls das passiert, rebooten Sie im Single-User-Modus und löschen Sie die Dateien: &prompt.root; rm /var/db/kvm_*.db Was soll mir die Meldung ahc0: brkadrint, Illegal Host Access at seqaddr 0x0 sagen? Dies ist ein Konflikt mit einem Ultrastor SCSI Hostadapter. Rufen Sie während des Bootprozesses das Kernelkonfigurationsmenü auf und deaktivieren Sie uha0, welches das Problem verursacht. Wenn ich mein System starte, erhalte ich die Meldung ahc0: illegal cable configuration, obwohl die Verkabelung korrekt ist. Woran liegt das? - Auf Ihrem Mainboard fehlen ein paar Logikbausteinen, + Auf Ihrem Mainboard fehlen ein paar Logikbausteine, die für die Unterstützung der automatischen Terminierung notwendig sind. Stellen Sie in Ihrem SCSI-BIOS manuell die korrekte Terminierung für Ihr System ein, anstatt sich auf die automatische Terminierung zu verlassen. Der Treiber für den AIC7XXX kann nicht erkennen, ob die externen Logikbausteine für die Erkennung der Kabel (und damit automatische Terminierung) vorhanden sind. Der Treiber muss sich darauf verlassen, dass diese vorhanden sind, wenn in der Konfiguration automatische Terminierung eingestellt ist. Ohne die externen Bausteine ist es sehr wahrscheinlich, dass der Treiber die Terminierung falsch einstellt, was die Zuverlässigkeit des SCSI-Busses herabsetzen kann. Wieso meldet Sendmail mail loops back to myself? Sie finden eine detaillierte Antwort auf diese Frage im Handbuch. Wieso funktionieren bildschirmorientierte Anwendungen beim Zugriff über ein Netzwerk nicht richtig? Die entfernte Maschine scheint den Terminaltyp auf etwas anderes als den Typ cons25, der von FreeBSD verlangt wird, zu setzen. Es gibt mehrere mögliche Abhilfen für dieses Problem: Setzen Sie die Shell-Variable TERM nach dem Einloggen auf der entfernten Maschine auf ansi oder sco, sofern die entfernte Maschine diese Terminaltypen kennt. Benutzen Sie einen VT100-Emulator wie screen auf der - FreeBSD-Console. screen + FreeBSD-Konsole. screen bietet Ihnen die Möglichkeit, mehrere gleichzeitige Sitzungen von einem Bildschirm aus laufen zu lassen. Es ist ein sehr nettes Programm. Jedes screen-Fenster verhält sich, wie ein VT100-Terminal, weshalb die Variable TERM am entfernten Ende auf vt100 gesetzt werden sollte. Installieren Sie den Eintrag cons25 in der Bildschirmdatenbank der entfernten Maschine. Wie das zu geschehen hat, hängt vom Betriebssystem der entfernten Maschine ab. Das Systemadministrationshandbuch für das entfernte System sollte Ihnen hierbei helfen können. Starten Sie einen X-Server auf der FreeBSD-Seite und benutzen Sie einen X-basierten Terminalemulator wie xterm oder rxvt, um sich auf der entfernten Maschine einzuloggen. Die Variable TERM auf dem entfernten Host sollte auf xterm oder vt100 gesetzt werden. Wieso meldet mein Rechner calcru: negative time...? Dies kann durch verschiedene Hardware- oder Softwareprobleme in Verbindung mit Interrupts verursacht werden. Das kann aufgrund von Fehlern sein, aber es kann auch durch die Eigenarten bestimmter Geräte passieren. TCP/IP über die parallele Schnittstelle mit einer großen MTU laufen zu lassen, ist ein sicherer Weg, um dieses Problem hervorzurufen. Grafikbeschleuniger können es auch verursachen. In diesem Fall sollten Sie zunächst die Interrupteinstellungen der Karte überprüfen. Ein Seiteneffekt dieses Problems sind Prozesse, die mit der Meldung SIGXCPU exceeded cpu time limit abbrechen. Falls das Problem nicht anders gelöst werden kann, besteht die Lösung darin, diese sysctl-Variable zu setzen: &prompt.root; sysctl -w kern.timecounter.method=1 Die Option von &man.sysctl.8; sollte nicht mehr benutzt werden. Ab FreeBSD 4.4 wird die Option ignoriert. Sie können die Option auch weglassen, wenn Sie mit sysctl Variablen setzen. Das bedeutet zwar Performanceeinbußen, aber in Anbetracht der Ursache für dieses Problem werden Sie das wahrscheinlich nicht bemerken. Fall das Problem weiter bestehen bleibt, lassen sie die sysctl-Variable auf 1 stehen und setzen Sie die Option NTIMECOUNTER im Kernel auf immer höhere Werte. Wenn Sie irgendwann NTIMECOUNTER=20 erreicht haben sollten, ist das Problem nicht gelöst. Die Interrupts auf Ihrer Maschine sind für eine verlässliche Zeiterhaltung nicht zu gebrauchen. Warum wird meine PnP-Karte nicht mehr (oder nur noch als unknown) erkannt, seit ich FreeBSD 4.X benutze? FreeBSD 4.X ist deutlich PnP-orientierter und das führt leider dazu, dass einige PnP-Geräte (wie z.B. Soundkarten und interne Modems) nicht mehr funktionieren, obwohl Sie von FreeBSD 3.X noch erkannt wurden. Die Gründe für dieses Verhalten werden in der unten zitierten Mail von Mail von Peter Wemm erklärt. Diese Mail stammt von der Mailingliste freebsd-questions und war eine Antwort auf eine Frage bezüglich eines internen Modem, das nach dem Update auf FreeBSD 4.X nicht mehr erkannt wurde. Die mit [] gekennzeichneten Kommentare wurden eingefügt, um an einigen Stellen die Bezüge klarzustellen.
Das PnP-BIOS hat es [das Modem] vorkonfiguriert und es dann im Adressraum liegenlassen, daher haben es die alten ISA-Erkennungsroutinen [in 3.X] gefunden. In 4.0 sind die ISA-Routinen deutlich PnP-orientierter. Es war möglich [in 3.X], dass eine ISA-Erkennungsroutinen ein zugelaufenes Gerät fand; während die PnP-Treiber zwar die ID erkannten, das Gerät aber wegen des Ressourcekonfliktes nicht benutzen konnten. Daher werden die programmierbaren Karten zunächst einmal abgeschaltet, um diese doppelte Erkennung vermeiden zu können. Das bedeutet allerdings auch, dass die Treiber die PnP-ID kennen muss, um PnP-Hardware unterstützen zu können. Wir haben uns vorgenommen, den Benutzern eine einfachere Möglichkeit zur Manipulation dieser Informationen zur Verfügung zu stellen.
Damit Ihr Gerät wieder funktioniert, müssen Sie seine PnP-ID herausfinden und die ID in die Listen eintragen, die zur Erkennung von PnP-Geräten genutzten werden. Zu diesem Zweck wird das Gerät mit &man.pnpinfo.8; analysiert. Das Beispiel zeigt die Ausgaben von &man.pnpinfo.8; für ein internes Modem: &prompt.root; pnpinfo Checking for Plug-n-Play devices... Card assigned CSN #1 Vendor ID PMC2430 (0x3024a341), Serial Number 0xffffffff PnP Version 1.0, Vendor Version 0 Device Description: Pace 56 Voice Internal Plug & Play Modem Logical Device ID: PMC2430 0x3024a341 #0 Device supports I/O Range Check TAG Start DF I/O Range 0x3f8 .. 0x3f8, alignment 0x8, len 0x8 [16-bit addr] IRQ: 4 - only one type (true/edge) [weitere TAG Zeilen gestrichen] TAG End DF End Tag Successfully got 31 resources, 1 logical fdevs -- card select # 0x0001 CSN PMC2430 (0x3024a341), Serial Number 0xffffffff Logical device #0 IO: 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 IRQ 5 0 DMA 4 0 IO range check 0x00 activate 0x01 Sie benötigen die Information aus der Zeile Vendor ID ganz im Anfang. Die in Klammern ausgegebene hexadezimale Zahl (0x3024a341 in diesem Beispiel) ist die PnP ID und die unmittelbar davor stehende Zeichenkette (PMC2430) ist eine eindeutige Herstellerkennung. Benutzen Sie &man.pciconf.8; wenn &man.pnpinfo.8; die Karte nicht anzeigt. Der Teil der Ausgabe von pciconf -vl für eine auf dem Motherboard integrierte Soundkarte sieht zum Beispiel so aus: &prompt.root; pciconf -vl chip1@pci0:31:5: class=0x040100 card=0x00931028 chip=0x24158086 rev=0x02 hdr=0x00 vendor = 'Intel Corporation' device = '82801AA 8xx Chipset AC'97 Audio Controller' class = multimedia subclass = audio Sie benötigen die Chip-ID 0x24158086, die hinter chip aufgeführt ist. Die Herstellerkennung oder die Chip-ID müssen in die Datei /usr/src/sys/isa/sio.c eingetragen werden. Sie sollten zunächst ein Backup von sio.c anlegen, falls etwas schief gehen sollte. Sie werden auch einen Patch erzeugen müssen, um ihn zusammen mit Ihrem PR einzusenden. (Sie wollten doch einen PR schreiben, oder etwa nicht?) Öffnen Sie nun sio.c mit einem Editor und suchen Sie nach der Zeile static struct isa_pnp_id sio_ids[] = { und blättern Sie dann nach unten, um die passende Stelle für Ihr Gerät zu finden. Unten finden Sie Beispiel für die Einträge, diese sind nach der Herstellerkennung sortiert. Diese sollte in dem Kommentar auf der rechten Seite aufgenommen werden, dazu kommt die Gerätebeschreibung (Device Description) aus der Ausgabe von &man.pnpinfo.8;: {0x0f804f3f, NULL}, /* OZO800f - Zoom 2812 (56k Modem) */ {0x39804f3f, NULL}, /* OZO8039 - Zoom 56k flex */ {0x3024a341, NULL}, /* PMC2430 - Pace 56 Voice Internal Modem */ {0x1000eb49, NULL}, /* ROK0010 - Rockwell ? */ {0x5002734a, NULL}, /* RSS0250 - 5614Jx3(G) Internal Modem */ Fügen Sie die hexadezimale Gerätekennung an der richtigen Stelle ein, speichern Sie die Datei ab, erzeugen Sie einen neuen Kernel und starten Sie Ihr System neu. Ihr Gerät sollte nun wie bei FreeBSD 3.X als sio Gerät erkannt werden.
Warum erhalte ich die Meldung nlist failed, wenn ich Programme wie top oder systat benutze? Das Programm sucht nach einem speziellen Symbol im Kernel, kann es aber aus irgendeinem Grunde nicht finden. Dieser Fehler wird von einem dieser Probleme verursacht: Ihr Kernel und die sonstigen Programme (das Userland) sind nicht mehr auf dem gleichen Stand. Mit anderen Worten, Sie haben zwar einen neuen Kernel erzeugt, aber kein installworld (oder umgekehrt); darum weicht die Symboltabelle von dem ab, was die Anwendung erwartet. Wenn dies der Fall ist, müssen Sie lediglich die noch fehlenden Schritte des Upgrades durchführen. Die richtige Vorgehensweise kann /usr/src/UPDATING entnommen werden. Um Ihren Kernel zu laden, benutzen Sie nicht /boot/loader, sondern laden ihn direkt mit boot2 (siehe &man.boot.8;). Es ist zwar nicht immer ein Fehler, /boot/loader zu umgehen; allerdings ist er in der Regel besser dazu geeignet, die Symbole des Kernels für normale Anwendungen verfügbar zu machen. Wieso dauert es so lange, bis eine Verbindung (&man.ssh.1; oder &man.telnet.1;) aufgebaut wird? Das Symptom: Nach dem Aufbau des TCP-Verbindung vergeht einige Zeit, bis endlich die Abfrage des Passwortes (bzw. der Login-Prompt bei Telnet) erscheint. Das Problem: In den meisten Fällen versucht der Server in der Zwischenzeit, die IP-Adresse des Clients in einen Rechnernamen zu übersetzen. Viele Server (darunter die Telnet- und SSH-Server von FreeBSD) machen das, um den Hostnamen z.B. für spätere Verwendung durch den Systemadministrator in eine Protokolldatei schreiben zu können. Die Lösung: wenn das Problem bei jedem Server auftritt, den Sie von Ihrem Computer (dem Client) ansprechen, dann wird das Problem vom Client verursacht. Wenn das Problem aber nur auftritt, wenn jemand Ihren Rechner (den Server) anspricht, dann liegt die Ursache beim Server. Wenn das Problem vom Client verursacht wird, müsssen Sie die Einträge im DNS korrigieren, damit der Server Ihre IP-Adresse übersetzen kann. Wenn das Problem in Ihrem lokalen Netzwerk auftritt, sollten Sie es als Problem des Servers behandeln und weiterlesen; wenn es allerdings im Internet auftritt, werden Sie sich wahrscheinlich an Ihrem ISP wenden müssen, damit dieser das Problem für Sie korrigiert. Wenn das Problem vom Server verursacht wird und Sie sich in einem lokalen Netzwerk befinden, dann müssen Sie Ihren Server so konfigurieren, dass er die lokal genutzten IP-Adressen in Rechnernamen übersetzen kann. Weitere Informationen erhalten Sie in den Onlinehilfen zu &man.hosts.5; und &man.named.8;. Wenn dieses Problem im Internet auftritt, könnte die Ursache auch darin liegen, dass die Namensauflösung auf dem Server nicht funktioniert. Versuchen Sie, einen anderen Hostnamen wie z.B. www.yahoo.com aufzulösen. Wenn das nicht funktioniert, liegt das Problem bei Ihrem System. Haben Sie &os; gerade erst installiert, kann es auch sein, dass die Domänen- und Nameserverinformationen noch nicht in /etc/resolv.conf vorhanden sind. Dadurch kommt es häufig zu Verzögerungen beim Einsatz von SSH, weil die Option UseDNS in der Voreinstellung auf yes gesetzt ist (in der Datei sshd_config im Verzeichnis /etc/ssh). Ist dies bei Ihnen der Fall, müssen Sie entweder die fehlenden Informationen in /etc/resolv.conf eintragen oder als temporäre Maßnahme UseDNS auf no setzen. Was bedeutet stray IRQ? Stray IRQs sind ein Zeichen für Probleme bei der Behandlung von Hardware-IRQs. Sie werden meistens von Geräten verursacht, die ihren Interrupt Request zurückziehen, obwohl gerade der interrupt request acknowledge-Zyklus läuft. Sie können drei Dinge tun: Ertragen Sie die Warnungen. Sie erhalten nur die ersten 5 für jeden IRQ, alle anderen werden unterdrückt. Eliminieren Sie die Meldungen, indem Sie in isa_strayintr() den Wert 5 auf 0 ändern, um alle Meldungen zu unterdrücken. Eliminieren Sie die Meldungen, indem Sie Hardware für den Parallelport installieren, die IRQ 7 nutzt und vom PPP Treiber verwendet wird (das passiert auf den meisten Systemen), und installieren Sie eine IDE-Platte oder andere Hardware sowie einen dazu passenden Treiber, um IRQ 15 zu nutzen. Warum sehe ich in der Ausgabe von dmesg häufig die Meldung file: table is full? Diese Fehlermeldung besagt, dass Sie die zur Verfügung stehenden File-Handles des Systems verbraucht haben. Was das genau bedeutet und wie Sie dieses Problem lösen können, steht im Abschnitt kern.maxfiles im Kapitel Anpassung der Kernelkonfiguration des Handbuchs. Warum ist die Uhrzeit auf meinem Laptop immer falsch? Ihr Laptop verfügt über mehr als eine Uhr und FreeBSD benutzt leider die falsche. Starten Sie &man.dmesg.8; und achten Sie auf die Zeilen, in denen das Wort Timecounter vorkommt. Die von FreeBSD benutzte Uhr steht in der letzten Zeile, mit an Sicherheit grenzender Wahrscheinlichkeit wird es TSC sein. &prompt.root; dmesg | grep Timecounter Timecounter "i8254" frequency 1193182 Hz Timecounter "TSC" frequency 595573479 Hz Sie können das überprüfen, indem Sie den Wert der Systemvariablen kern.timecounter.hardware abfragen. &prompt.root; sysctl kern.timecounter.hardware kern.timecounter.hardware: TSC Es ist durchaus möglich, dass das BIOS die TSC Uhr ändert, um beispielsweise den CPU-Takt zu während des Batteriebetrieb zu ändern, oder im Stromsparmodus; leider bemerkt FreeBSD diese Änderungen nicht und daher scheint die Uhr falsch zu gehen. In diesem Beispiel ist die Uhr i8254 ebenfalls verfügbar; um sie auszuwählen, muss ihr Name in die Systemvariable kern.timecounter.hardware geschrieben werden. &prompt.root; sysctl -w kern.timecounter.hardware=i8254 kern.timecounter.hardware: TSC -> i8254 Die Uhrzeit Ihres Laptops sollte nun genauer funktionieren. Damit diese Änderung automatisch beim Start des Systems durchgeführt wird, müssen Sie die folgende Zeile in die /etc/sysctl.conf eintragen. kern.timecounter.hardware=i8254 Warum erkennt mein Laptop PC-Cards nicht? Dieses Problem tritt häufig auf Laptops mit mehreren Betriebssystemen auf. Einige nicht-BSD Betriebssysteme lassen die Hardware in einem inkonsistenten Zustand. Die Karte wird dann von &man.pccardd.8; als "(null)""(null)" anstelle des tatsächlichen Modells gefunden. Um dies zu beheben, müssen Sie die Hardware zurücksetzen, das heißt der PC-Card Einschub muss stromlos sein. Gehen Sie dazu nicht in den Standby- oder Suspend-Modus und stellen Sie sicher, dass der Laptop wirklich ausgeschaltet ist. Warten Sie einen Moment und booten dann, Ihre PC-Card sollte jetzt funktionieren. Einige Laptops schalten sich nicht wirklich aus. Wenn der obige Vorschlag nichts genutzt hat, entfernen Sie bitte die Batterie, warten einen Moment und booten erneut. Wieso hängt sich FreeBSD nach dem BIOS-Bildschirm mit der Meldung Read error auf? Der Bootloader von FreeBSD erkennt die Geometrie Ihrer Festplatte nicht richtig. Sie müssen die Geometrie manuell festlegen, wenn sie mit &man.fdisk.8; FreeBSD-Bereiche erzeugen oder ändern. Die richtigen Werte für die Geometrie können Sie im BIOS des Rechners ablesen. Achten Sie auf die Anzahl der Zylinder, Köpfe und Sektoren für Ihre Festplatte. Im fdisk von &man.sysinstall.8; müssen Sie G eingeben, um die Geometrie zu definieren. Sie erhalten eine Dialogbox, in der Sie die Anzahl der Zylinder, Köpfe und Sektoren eingeben können. Verwenden Sie die Angaben des BIOS und setzen Sie Schrägstriche zwischen die Zahlen. 5000 Zylinder, 250 Köpfe und 60 Sektoren würden also als 5000/250/60 eingegeben. Schließen Sie die Eingabe mit Enter ab und drücken Sie W, um die neue Partitionstabelle auf die Festplatte schreiben zu lassen. Ein anderes Betriebssystem hat meinen Bootmanager zerstört. Wie kann ich ihn wiederherstellen? Starten Sie &man.sysinstall.8; und wählen Sie Configure, dann Fdisk. Wählen Sie die Platte, auf der sich der Boot Manager befand, mit der Leertaste aus. Drücken Sie W, um die Änderungen auf die Platten schreiben zu lassen. Nun erscheint eine Abfrage, welcher Bootmanager installiert werden soll. Wählen Sie diesen an und er wird wieder installiert. Was soll mir die Meldung swap_pager: indefinite wait buffer: sagen? Ein Programm wollte Speicher auf Platte auslagern, und dieser Vorgang konnte nicht innerhalb von 20 Sekunden durchgeführt werden. Mögliche Gründe sind defekte Blöcke auf der Platte, falsche oder fehlerhafte Verkabelung sowie Probleme mit anderen Komponenten, die am Zugriff auf die Festplatte beteiligt sind. Wenn die Festplatte selbst fehlerhaft sind, sollten Sie entsprechende Meldungen in /var/log/messages und den Ausgaben von dmesg finden. Andernfalls sollten Sie die Kabel und Verbindungen überprüfen. Was sind UDMA ICRC Fehler und wie behebe ich sie? Der &man.ata.4;-Treiber meldet UDMA ICRC Fehler wenn eine DMA-Übertragung zu oder von einem Laufwerk fehlgeschlagen ist. Der Treiber versucht die Übertragung mehrmals durchzuführen und schaltet, wenn die Versuche fehlschlagen, vom DMA-Modus auf den langsameren PIO-Modus um. Der Fehler kann viele Ursachen haben, häufig ist ein Kabel kaputt oder die Geräte sind falsch verkabelt. Prüfen Sie, ob die ATA-Kabel unbeschädigt sind und für den verwendeten Ultra-DMA-Modus tauglich sind. Ebenso müssen Wechselrahmen für den verwendeten Modus geeignet sein. Stellen Sie sicher, dass alle Kabel fest angeschlossen sind. Es gab auch schon Probleme, wenn ein altes Laufwerk zusammen mit einem Ultra-DMA-66 oder einem schnelleren Laufwerk auf einem Kanal betrieben wurde. Es kann aber auch sein, dass das Laufwerk kaputt ist. Die meisten Hersteller stellen Test-Programme für ihre Laufwerke zur Verfügung. Überprüfen Sie damit Ihr Laufwerk und wenn nötig, sichern Sie Ihre Daten und ersetzen das Laufwerk. &man.atacontrol.8; zeigt für jedes ATA-Gerät den verwendeten DMA- oder PIO-Modus an. Das Kommando atacontrol mode Kanal zeigt die auf einem Kanal verwendeten Modi (die Kanäle werden von 0 an nummeriert). Was ist ein lock order reversal? Eine Antwort auf diese Frage findet sich im FreeBSD-Glossar unter LOR. Warum erhalte ich die Meldung Called ... with the following non-sleepable locks held? Diese Meldung erscheint, wenn eine Funktion, die sich im Ruhemodus befindet, aufgerufen wird, während ein Mutex oder eine andere (nicht in den Ruhemodus versetzbare) Sperre aktiv war. Der Grund dafür ist, dass ein Mutex nicht für längere Zeitspannen aktiv sein soll, sondern nur für die Synchronisation von Gerätetreibern mit dem Rest des Kernels während eines Interrupts. Unter FreeBSD dürfen Interrupts nicht in den Ruhemodus versetzt werden. Daher ist es von entscheidender Bedeutung, dass während des Bestehens eines Mutex kein Kernelsubsystem für einen längeren Zeitraum blockiert ist. Um solche Fehler abzufangen, können Sicherungen (Assertions) in den Kernel eingebaut werden, die danach mit dem &man.witness.4;-Subsystem interagieren. Dadurch wird (in Abhängigkeit von Ihrer Systemkonfiguration) eine Warnung oder eine Fehlermeldung ausgegeben, falls der Aufruf einer Funktion während des Bestehens eines Mutex zu einer Blockierung führen kann. Zusammenfassend kann man sagen, dass diese Warnungen in der Regel zwar nicht bedrohlich sind. Unter bestimmten Umständen kann es aber dennoch zu unerwünschten Nebenwirkungen, angefangen von einer Erhöhung der Reaktionszeit bis hin zu einem kompletten Einfrieren des Systems kommen. Warum bricht buildworld/installworld mit der Meldung touch: not found ab? Dieser Fehler bedeutet nicht, dass &man.touch.1; nicht auf Ihrem System vorhanden ist. Vielmehr sind Dateien die Ursache, deren Erzeugungsdatum in der Zukunft liegt. Wenn Ihre CMOS-Uhr auf Ihre lokale Zeit eingestellt ist, müssen Sie adjkerntz -i verwenden, um die Kerneluhr anzupassen, wenn Sie in den Single-User-Modus booten.
Kommerzielle Anwendungen Dieser Abschnitt ist immer noch sehr dürftig, aber wir hoffen natürlich, dass Unternehmen einen Beitrag leisten werden! :) Die FreeBSD-Gruppe hat keinerlei finanzielle Interessen an einem der hier aufgelisteten Unternehmen, sondern listet sie lediglich als öffentlichen Service auf (und ist der Meinung, dass ein kommerzielles Interesse an FreeBSD sehr positiven Einfluss auf ein langfristiges Bestehen von FreeBSD haben kann). Wir möchten Anbieter kommerzieller Software dazu aufrufen, ihren Eintrag hier aufnehmen zu lassen. Auf der Anbieter-Seite finden Sie eine längere Liste. Wo bekomme ich FreeBSD-Versionen der klassischen Büro-Anwendungen? Das als Open Source verfügbare Office-Paket OpenOffice.org läuft nativ unter FreeBSD. Die um zusätzliche Funktionen erweiterte kommerzielle OpenOffice.org-Version StarOffice läuft in der &linux;-Version ebenfalls problemlos unter FreeBSD. In der Ports-Sammlung sind weitere Textbearbeitungsprogramme, Tabellenkalkulationen und Zeichenprogramme enthalten. Woher kann ich &motif; für FreeBSD bekommen? Der Quelltext für &motif; 2.2.2 wurde von der Open Group herausgegeben. Sie können entweder das Package x11-toolkits/open-motif installieren oder es mit dem entsprechenden Port selbst compilieren. Weitere Informationen über die Benutzung der Ports erhalten Sie im Kapitel Ports des Handbuchs. Die Open &motif; Distribution darf nur weitergegeben werden, wenn sie auf einem Open Source Betriebssystem benutzt wird. Weiterhin gibt es auch kommerzielle &motif;-Pakete, die zwar nicht kostenlos sind, aber dafür auch mit closed source Software benutzt werden dürfen. Um die günstigste ELF-&motif; 2.1.20 Distribution für FreeBSD (&i386;) zu bekommen, wenden Sie sich bitte an Apps2go. Es gibt zwei Distributionen, die development edition und die runtime edition (wesentlich günstiger). Diese Distributionen enthalten: OSF/&motif; manager, xmbind, panner, wsm. Development-Kit mit uil, mrm, xm, xmcxx, Include- und Imake-Dateien. Statische und dynamische ELF-Bibliotheken. Demonstrations-Applets. Achten Sie darauf, dass Sie bei der Bestellung angeben, dass Sie die FreeBSD-Version von &motif; möchten (vergessen Sie auch nicht, die Architektur anzugeben)! Von Apps2go werden auch Versionen für NetBSD und OpenBSD verkauft. Dieses Produkt ist zurzeit nur zum Download per FTP verfügbar. Weitere Informationen Apps2go Web-Seite oder sales@apps2go.com oder support@apps2go.com oder Telefon (817) 431 8775 oder +1 817 431-8775 Eine &motif; 2.0 Distribution für FreeBSD im a.out-Format gibt es bei Xi Graphics. Diese Distribution enthält:/ OSF/&motif; manager, xmbind, panner, wsm. Development-Kit mit uil, mrm, xm, xmcxx, Include- und Imake-Dateien. Statische und dynamische Bibliotheken (zur Verwendung unter FreeBSD 2.2.8 und frühere). Demonstrations-Applets. Vorformatierte Manualpages. Achten Sie darauf, bei der Bestellung anzugeben, dass Sie die FreeBSD-Version von &motif; möchten! Xi Graphics verkauft auch Versionen für BSDI und &linux;. Dieses Produkt ist derzeit ein Satz von vier Disketten... zukünftig wird es eine einheitliche CD-Distribution geben, wie beim CDE. Woher kann ich CDE für FreeBSD bekommen? Xi Graphics hat einmal CDE für FreeBSD verkauft, tut es aber nicht mehr. KDE ist ein Open-Source X11-Desktop, der CDE in vielen Punkten ähnelt. Eventuell gefällt Ihnen auch das "Look and Feel" von xfce. KDE und xfce sind über die Ports-Sammlung von FreeBSD verfügbar. Gibt es irgendwelche kommerzielle leistungsfähige X-Server? Ja, Xi Graphics vertreibt beschleunigte X-Produkte für FreeBSD und andere Intel-basierte Systeme. Das Angebot von Xi Graphics besteht aus einem leistungsfähigen X-Server, der einfache Konfiguration und Unterstützung für den parallelen Einsatz mehrerer Videokarten bietet. Es wird in binärer Form in einer einheitlichen Diskettendistribution für FreeBSD und &linux; vertrieben. XI Graphics bietet auch leistungsfähige X-Server, die auf die Unterstützung von Laptops zugeschnitten sind. Es gibt ein kostenloses Kompatibilitäts-Demo der Version 5.0. Xi Graphics vertreibt auch &motif; und CDE für FreeBSD (siehe oben). Weitere Informationen Xi Graphics Web-Seite oder sales@xig.com oder support@xig.com oder Telefon (800) 946 7433 oder +1 303 298-7478. Gibt es irgendwelche Datenbanksysteme für FreeBSD? Ja! Lesen Sie den Abschnitt kommerzielle Anbieter auf der FreeBSD-Web-Seite. Schauen Sie auch im Abschnitt Datenbanken der Ports-Sammlung nach. Kann ich &oracle; unter FreeBSD laufen lassen? Ja. Die folgenden Seiten beschreiben genau, wie sich &linux;-&oracle; unter FreeBSD installieren lässt: http://www.unixcities.com/oracle/index.html http://www.shadowcom.net/freebsd-oracle9i/ Benutzerprogramme Nun, wo sind die ganzen Benutzerprogramme? Werfen Sie bitte einen Blick auf die Ports-Seite, um Informationen über die nach FreeBSD portierten Softwarepakete zu erhalten. Die Liste enthält zurzeit &os.numports; Einträge und wächst täglich. Informieren Sie sich daher regelmäßig auf dieser Seite oder abonnieren Sie die Mailingliste &a.announce;, um sich über Änderungen zu informieren. Die meisten Ports sollten auf den 6.X, 7.X und 8.X-Systemen laufen. Jedes Mal, wenn ein FreeBSD-Release erstellt wird, wird auch ein Snapshot des Port-Baumes vom Zeitpunkt des Releases in das Verzeichnis ports/ eingefügt. Wir unterstützen auch das Konzept von Packages - im Grunde genommen nicht mehr als komprimierte Binärdistributionen mit ein wenig zusätzlicher Intelligenz zur Ermöglichung angepasster Installationen. Ein Package kann leicht installiert und wieder deinstalliert werden, ohne, dass man etwas über wissen muss, welche Dateien es enthält. Benutzen Sie das Packages Menü in &man.sysinstall.8; (unter dem Menüpunkt post-configuration) oder führen Sie den Befehl &man.pkg.add.1; mit den speziellen Paketdateien aus, die Sie installieren möchten. Paketdateien können für gewöhnlich an der Endung .tgz oder .tbz erkannt werden und diejenigen, die über eine CDROM-Distribution verfügen, haben auf ihrer CD ein Verzeichnis packages/All, das solche Dateien enthält. Für verschiedene FreeBSD-Versionen können sie von folgenden Adressen auch über das Netz heruntergeladen werden: für 6.X-RELEASE/6-STABLE ftp://ftp.de.FreeBSD.org/pub/FreeBSD/ports/i386/packages-6-stable für 7.X-RELEASE/7-STABLE ftp://ftp.de.FreeBSD.org/pub/FreeBSD/ports/i386/packages-7-stable für 8-CURRENT ftp://ftp.de.FreeBSD.org/pub/FreeBSD/ports/i386/packages-8-current oder von Ihrem nächstgelegenen Mirror. Beachten Sie, dass nicht alle Ports als Package verfügbar sind, da ständig neue hinzugefügt werden. Es ist immer eine gute Idee, sich regelmäßig auf der ftp.de.FreeBSD.org Masterseite darüber zu informieren, welche Packages verfügbar sind. Wie konfiguriere ich INN (Internet News) für meine Maschine? Ein idealer Startpunkt nach der Installation des Packages oder Ports news/inn ist Dave Barr's INN-Seite, wo Sie die INN-FAQ finden. Unterstützt FreeBSD &java;? Ja. Informieren Sie sich bitte unter http://www.de.FreeBSD.org/java/. Warum kann ich manche Ports auf meiner 6.X oder 7.X-STABLE-Maschine nicht erstellen? Wenn Sie eine FreeBSD-Version benutzen, die deutlich älter als das aktuelle -CURRENT oder -STABLE ist, könnte es sein, dass Sie vorher Ihre Ports-Sammlung aktualisieren müssen. Lesen Sie dazu den Abschnitt Keeping Up des Porters-Handbuch. Ist Ihre Ports-Sammlung aktuell, könnte es sein, dass jemand eine Änderung am Port durchgeführt hat, die für -CURRENT funktioniert, den Port für -STABLE aber unbrauchbar gemacht hat. Bitte senden Sie einen Fehlerbericht mit dem Befehl &man.send-pr.1;. Von der Ports-Sammlung wird nämlich erwartet, dass sie sowohl auf -CURRENT als auch auf -STABLE funktioniert. Ich habe gerade versucht, INDEX mit make index zu bauen, und es hat nicht geklappt. Woran liegt das? Stellen Sie zuerst sicher, dass Ihre Ports-Sammlung aktuell ist. Fehler, die einen Bau von INDEX aus einer aktuellen Ports-Sammlung verhindern, sind sofort sichtbar und werden daher fast immer umgehend behoben. Ist Ihre Ports-Sammlung jedoch aktuell, haben Sie vielleicht ein anderes Problem. make index hat einen Bug im Umgang mit unvollständigen Kopien der Ports-Sammlung. Es nimmt an, dass Sie über eine lokale Kopie aller Ports verfügen, von denen jeder lokale Port abhängt. Wenn Sie also beispielsweise eine Kopie von foo/bar auf Ihrem System haben, und foo/bar ist von baz/quux abhängig, dann muss auch eine Kopie von baz/quux auf Ihrem System vorhanden sein, sowie eine Kopie aller Ports, von denen baz/quux abhängt. Anderenfalls ist make index aufgrund fehlender Informationen nicht in der Lage, den Abhängigkeitsbaum zu erzeugen. Dieses Problem tritt vor allem dann auf, wenn &os;-Benutzer &man.cvsup.1; (oder &man.csup.1;) verwenden, um die Ports-Sammlung zu aktualisieren und dabei verschiedene Kategorien durch die Datei refuse von der Aktualisierung ausschließen. Theoretisch ist es zwar möglich, Kategorien auszuschließen, in der Praxis gibt es aber zu viele Ports, die von Ports in anderen Kategorien abhängen. Wenn Sie also INDEX bauen wollen, müssen Sie über eine komplette Kopie der Ports-Sammlung verfügen. Es gibt seltene Fälle, in denen INDEX nicht gebaut werden kann, wenn bestimmte WITH_* oder WITHOUT_* Variablen in make.conf gesetzt sind. Wenn Sie dieses Problem haben, sollten Sie diese make-Variablen deaktivieren und INDEX erneut bauen, bevor Sie das Problem an &a.ports; melden. Warum ist CVSup nicht im FreeBSD-Basisquellbaum enthalten? Das Basissystem von FreeBSD soll selbstverwaltend sein. Es soll also möglich sein, das komplette Betriebssystem mit einer beschränkten Anzahl von Werkzeugen zu starten. Daher werden die zum Bau von FreeBSD nötigen Werkzeuge mit dem Quelltext gekoppelt. Zu diesen Werkzeugen gehören ein C-Compiler (&man.gcc.1;), &man.make.1;, &man.awk.1; und andere. Da CVSup in Modula-3 geschrieben wurde, müsste ein Modula-3-Compiler ins Basissystem aufgenommen und auch gewartet werden. Dies würde einen gestiegenen Speicherbedarf für die FreeBSD-Quellen sowie einen erhöhten Wartungsaufwand verursachen. Daher ist es sowohl für Entwickler als auch Benutzer einfacher, CVSup bei Bedarf als Port oder als Paket von einer Installations-CD zu installieren. Wie dem auch sei, &os;-Benutzer müssen seit FreeBSD 6.2-RELEASE nicht mehr ohne einen kompatiblen CVSup-Client auskommen. Dank &a.mux; wurde CVSup als &man.csup.1; in C neu geschrieben und ist mittlerweile Teil des Basissystems. Obwohl zur Zeit noch nicht alle Eigenschaften von CVSup implementiert sind, ist es gut genug (und sehr schnell!) darin, ihre Quellen zu synchronisieren. Für &os;-Systeme vor 6.2 kann es als Port oder Paket (siehe net/csup) installiert werden. Ich habe die Sourcen aktualisiert, wie aktualisiere ich jetzt die installierten Ports? FreeBSD enthält zwar kein Programm, das die installierten Ports aktualisiert, allerdings existieren diverse Programme, die diesen Prozess etwas vereinfachen. Weiterhin können Sie zusätzliche Programme installieren, die Sie dabei unterstützen, siehe Ports aktualisieren im FreeBSD Handbuch. Warum ist /bin/sh so spartanisch? Warum benutzt FreeBSD nicht die bash oder eine ähnliche Shell? Weil der &posix;-Standard definiert, dass es so eine Shell geben muss. Die ausführlichere Antwort: Viele Leute müssen Shell-Programme schreiben, die auf vielen verschiedenen Systemen nutzbar sein müssen. Aus diesem Grund enthält der &posix;-Standard eine sehr detaillierte Definition der Shell und der Hilfsprogramme. Die meisten Programme werden für die Bourne Shell geschrieben; außerdem nutzen mehrere wichtige Schnittstellen (&man.make.1;, &man.system.3;, &man.popen.3; und ihre Entsprechungen in höheren Programmiersprachen wie Perl und Tcl) die Bourne Shell, um Befehle auszuführen. Da die Bourne Shell an so vielen Stellen und so häufig genutzt wird, muss sie die folgenden Anforderungen erfüllen: Schneller Start, ein klar definiertes Verhalten und ein möglichst geringer Speicherverbrauch. Wir haben bei der vorliegenden Implementierung versucht, möglichst viele dieser Anforderungen zu erfüllen. Um /bin/sh nicht zu groß werden zu lassen, haben wir viele der Annehmlichkeiten der anderen Shells weggelassen. Aus diesem Grund gibt es in den Ports die luxuriöseren Shells wie bash, scsh, tcsh und zsh. Vergleichen Sie einfach mal den Speicherverbrauch der verschiedenen Shells, indem Sie ps aufrufen und sich die Angaben in den Spalten VSZ und RSS ansehen. Wieso dauert es so lange, bis &netscape; und Opera starten? In den meisten Fällen liegt es daran, dass Ihre DNS-Einstellungen fehlerhaft sind. Sowohl &netscape; als auch Opera stellen Anfragen an DNS, wenn Sie gestartet werden. Das Fenster des Browsers erscheint erst, wenn das Programm eine Antwort erhalten hat oder es festgestellt hat, dass Ihr System nicht an ein Netzwerk angeschlossen ist. Ich habe die Ports-Sammlung mit CVSup aktualisiert. Viele Ports lassen sich danach nicht mehr bauen und geben seltsame Fehlermeldungen aus. Was ist passiert? Ist die Ports-Sammlung kaputt? Sie sollten immer die Teilsammlung ports-base aktualisieren, wenn Sie nur Teile der Ports-Sammlung mit Hilfe der CVSup-Teilsammlungen aktualisieren. Die Erklärung dazu finden Sie im Handbuch. Wie erzeuge ich Audio-CDs aus MIDI-Dateien? Installieren Sie zuerst den Port audio/timidity++. Danach müssen Sie manuell die GUS-Patche von Eric A. Welsh von installieren. Wenn TiMidity++ richtig installiert wurde, können Sie mit dem folgenden Kommando MIDI-Dateien in das WAV-Format konvertieren: &prompt.user; timidity -Ow -s 44100 -o /tmp/juke/01.wav 01.mid Die WAV-Dateien können dann in andere Formate konvertiert werden oder (wie im FreeBSD-Handbuch beschrieben) auf Audio-CDs gebrannt werden. Kernelkonfiguration Ich möchte meinen Kernel anpassen. Ist das schwierig? Überhaupt nicht! Lesen Sie den Abschnitt zur Kernelkonfiguration im Handbuch. Der neue kernel wird zusammen mit seinen Modulen im Verzeichnis /boot/kernel installiert werden. Der alte Kernel und dessen Module wird in das Verzeichnis /boot/kernel.old verschoben, damit Sie, wenn Sie einen Fehler beim herumexperimentieren mit Ihrer Konfiguration gemacht haben, die vorherige Version Ihres Kernels starten können. Was kann ich machen, wenn meine Kernel-Kompilierungen fehlschlagen, weil _hw_float fehlt? Sie haben wahrscheinlich npx0 aus Ihrer Kernelkonfigurationsdatei entfernt, weil Sie keinen mathematischen Co-Prozessor besitzen. Die Gerätedatei npx0 ist allerdings VERPFLICHTEND. Ihre Hardware unterstützt Gleitkommaoperationen, selbst wenn dafür kein eigenes Bauteil (wie bei den 386er-Prozessoren) mehr verwendet wird. Daher müssen Sie die Gerätedatei npx0 einbinden. Selbst wenn es Ihnen gelingen sollte, einen Kernel ohne npx0-Unterstützung zu bauen, werden Sie diesen nicht booten können. Warum ist mein Kernel so groß (über 10 MByte)? Sie haben Ihren Kernel wahrscheinlich im Debug Modus erstellt. Ein Debug-Kernel enthält viele zusätzliche Informationen für die Fehlersuche, daher ist er so groß. Bitte beachten Sie, dass die Verwendung eines Debug-Kernels die Performance des Systems nicht oder nur minimal reduziert; außerdem ist es für den Fall einer system panic sehr praktisch, einen Debug-Kernel zur Hand zu haben. Wenn Ihnen allerdings der Plattenplatz ausgeht oder Sie einfach rein prinzipiell keinen Debug-Kernel benutzen wollen, müssen die beiden folgenden Bedingungen erfüllt sein: Die Konfigurationsdatei für Ihren Kernel darf die folgende Zeile nicht enthalten: makeoptions DEBUG=-g Sie dürfen &man.config.8; nicht mit dem Parameter starten. Sollten Sie sich nicht an diese Einschränkungen halten, wird Ihr Kernel im Debug-Modus erstellt. Solange Sie sich an diese Einschränkungen halten, können Sie Ihren Kernel ganz normal erstellen und die Größe des Kernels sollte deutlich sinken. Ein normaler Kernel ist nur 1.5 MByte bis 2 MByte groß. Wieso erhalte ich Meldungen über Interrupt-Konflikte, wenn ich eine Karte mit mehreren seriellen Schnittstellen einsetzen will? Wenn ich einen Kernel mit Unterstützung für serielle Multi-Port-Schnittstellen kompiliere, bekomme ich den Hinweis, dass nur der erste Port geprüft wird und die restlichen auf Grund von Interrupt-Konflikten übersprungen werden. Wie kann ich das Beheben? Das Problem besteht darin, dass in FreeBSD Code integriert ist, um den Kernel vor Abstürzen aufgrund von Hardware- oder Software-Konflikten zu bewahren. Behoben wird es, indem die IRQ-Angaben für alle Ports, bis auf einen ausgelassen werden. Hier ist ein Beispiel: # # Multiport high-speed serial line - 16550 UARTS # device sio2 at isa? port 0x2a0 tty irq 5 flags 0x501 vector siointr device sio3 at isa? port 0x2a8 tty flags 0x501 vector siointr device sio4 at isa? port 0x2b0 tty flags 0x501 vector siointr device sio5 at isa? port 0x2b8 tty flags 0x501 vector siointr Wieso kann ich nicht einmal den Standard-Kernel (GENERIC) bauen? Es gibt eine Reihe von möglichen Ursachen für dieses Problem: Sie benutzen die neuen Kommandos make buildkernel und make installkernel nicht, obwohl die Sourcen auf Ihrem System nicht zum laufenden System passen (z.B. benutzen Sie die Sourcen von 6.3-RELEASE auf einem System mit 6.0-RELEASE). Wenn Sie ein Upgrade durchführen wollen, sollten Sie /usr/src/UPDATING lesen, beachten Sie insbesondere den Abschnitt COMMON ITEMS gegen Ende des Dokuments. Sie benutzen zwar make buildkernel und make installkernel, aber Sie haben nicht darauf geachtet, dass vorher ein komplettes make buildworld durchgelaufen sein muss. Um seine Arbeit erledigen zu können, benötigt make buildkernel Dateien, die von make buildworld erzeugt werden. Auch wenn Sie FreeBSD-STABLE verwenden, ist es durchaus möglich, dass Sie die Sourcen genau zum falschen Zeitpunkt aktualisiert haben: Während Sie gerade modifiziert wurden oder kurzzeitig fehlerhaft waren. Eine absolute und vollständige Garantie, dass Sie die Sourcen compilieren können, gibt es nur für die Releases, bei FreeBSD-STABLE ist das nicht immer so. Wenn Sie es noch nicht versucht haben, sollten Sie ihre Source nochmals aktualisieren. Es ist denkbar, dass der von Ihnen genutzte Server zurzeit Probleme hat, benutzen Sie daher testweise auch einmal einen anderen Server. Wie kann ich prüfen, welchen Scheduler das System benutzt? Überprüfen Sie dazu, ob auf Ihrem System die sysctl-Variable kern.sched.quantum existiert. Ist dies bei Ihnen der Fall, werden Sie eine Ausgabe ähnlich der folgenden sehen: &prompt.user; sysctl kern.sched.quantum kern.sched.quantum: 99960 Wenn die sysctl-Variable kern.sched.quantum existiert, dann verwenden Sie den 4BSD-Scheduler (&man.sched.4bsd.4;). Existiert sie nicht, erzeugt &man.sysctl.8; eine Fehlermeldung (die Sie aber ignorieren können): &prompt.user; sysctl kern.sched.quantum sysctl: unknown oid 'kern.sched.quantum' Seit &os; 5.3-RELEASE wird der Name des verwendeten Schedulers direkt als Wert der sysctl-Variable kern.sched.name ausgegeben: &prompt.user; sysctl kern.sched.name kern.sched.name: 4BSD Was bedeutet kern.sched.quantum? kern.sched.quantum ist die maximale Anzahl Ticks, die ein Prozess ununterbrochen laufen kann. Die Variable ist charakteristisch für den 4BSD Scheduler, somit kann der verwendete Scheduler über die Existenz dieser Variablen bestimmt werden. Platten, Dateisysteme und Boot Loader Wie kann ich meine neue Festplatte in mein FreeBSD-System einbinden? Lesen Sie den Abschnitt Hinzufügen von Laufwerken im Handbuch. Wie verschiebe ich mein System auf meine neue, große Platte? Die beste Methode ist, das Betriebssystem auf der neuen Platte neu zu installieren und danach die Daten zu verschieben. Wenn Sie -STABLE über eine Release hinaus genutzt haben oder eine Release aktualisiert haben, ist das sehr empfehlenswert. Sie können auf beiden Platten &man.boot0cfg.8; installieren und die beiden Versionen so lange parallel betreiben, bis Ihnen die neue Konfiguration gefällt. Wenn Sie dies tun wollen, können Sie im übernächsten Absatz erfahren, wie sie Ihre Daten verschieben können. Falls Sie sich entscheiden, das nicht zu tun, müssen Sie Ihre neue Platte partitionieren und labeln. Benutzen Sie dafür entweder &man.sysinstall.8; oder &man.fdisk.8; und &man.disklabel.8;. Weiterhin sollten Sie mit &man.boot0cfg.8; auf beiden Platten booteasy installieren, damit Sie in der Lage sind, das alte und das neue System abwechselnd zu starten, nachdem der Kopiervorgang abgeschlossen ist. Im Formatting-Media Tutorial finden Sie weitere Informationen zu diesen Schritten. Nachdem Sie die neue Platte eingerichtet haben, können Sie Ihre Daten verschieben. Dummerweise können Sie die Daten nicht einfach kopieren. Dinge wie Gerätedateien (in /dev), erweiterte Dateiattribute und symbolische Links führen dazu, dass das in die Hose geht. Sie müssen ein Programm benutzen, das damit umgehen kann, und das ist &man.dump.8;. Es wird oft empfohlen, die Daten im Single-User Modus zu verschieben, aber das ist nicht unbedingt notwendig. Sie sollten auf gar keinen Fall etwas anderes als &man.dump.8; und &man.restore.8; benutzen, um Ihr Root-Filesystem zu verschieben. Es könnte auch mit &man.tar.1; funktionieren - oder auch nicht. Sie sollten ebenfalls &man.dump.8; und &man.restore.8; benutzen, wenn Sie eine komplette Partition auf eine andere, leere Partition verschieben wollen. Um die Daten einer Partition mit dump auf eine andere Partition zu verschieben, müssen Sie die folgenden Schritte ausführen: Richten Sie in der neuen Partition mit newfs ein Dateisystem ein. Mounten Sie die Partition temporär an einer geeigneten Stelle. Wechseln Sie mit cd in dieses Verzeichnis. Lesen Sie die alte Partition mit dump aus und lenken Sie die Ausgabe auf die neue Partition um. Wenn Sie zum Beispiel root auf /dev/ad1s1a verschieben wollen und diese derzeit auf /mnt gemountet ist, bedeutet das: &prompt.root; newfs /dev/ad1s1a &prompt.root; mount /dev/ad1s1a /mnt &prompt.root; cd /mnt &prompt.root; dump 0af - / | restore xf - Wenn Sie Ihre Partitionen mit &man.dump.8; umorganisieren wollen, steht Ihnen etwas mehr Arbeit bevor. Wenn Sie eine Partition wie /var in die übergeordnete Partition verschieben wollen, müssen Sie zunächst eine neue Partition erzeugen, die die beiden alten Partitionen aufnehmen kann. Der zweite Schritt ist, wie oben beschrieben die übergeordnete Partition in die neue Partition zu verschieben. Im dritten und letzten Schritt verschieben Sie dann die untergeordnete Partition in das leere Verzeichnis, das im zweiten Schritt entstanden ist: &prompt.root; newfs /dev/ad1s1a &prompt.root; mount /dev/ad1s1a /mnt &prompt.root; cd /mnt &prompt.root; dump 0af - / | restore xf - &prompt.root; cd var &prompt.root; dump 0af - /var | restore xf - Wenn Sie ein Verzeichnis aus einer Partition herauslösen wollen, also z.B. /var auf eine eigene Partition verlegen wollen, dann müssen Sie zunächst beide Partitionen anlegen. Danach müssen Sie die untergeordnete Partition im passenden Verzeichnis unterhalb des temporären mount points mounten und zum Abschluß die alte Partition verschieben: &prompt.root; newfs /dev/ad1s1a &prompt.root; newfs /dev/ad1s1d &prompt.root; mount /dev/ad1s1a /mnt &prompt.root; mkdir /mnt/var &prompt.root; mount /dev/ad1s1d /mnt/var &prompt.root; cd /mnt &prompt.root; dump 0af - / | restore xf - Eventuell sagen Ihnen für Benutzerdaten &man.cpio.1;, &man.pax.1; oder &man.tar.1; eher zu als &man.dump.8;. Allerdings haben alle diese Programme den Nachteil, dass sie die erweiterten Dateiattribute nicht verstehen, daher sollten Sie bei ihrem Einsatz aufpassen. Gefährdet eine dangerously dedicated Festplatte meine Gesundheit? Die Installationsprozedur bietet Ihnen zwei verschiedene Methoden, Ihre Festplatte(n) zu partitionieren. Die Standardmethode macht sie kompatibel zu anderen Betriebssystemen auf derselben Maschine, indem &man.fdisk.8;-Tabelleneinträge (unter FreeBSD slices genannt) mit einem FreeBSD-Eintrag, in dem eigene Partitionen untergebracht werden, benutzt werden. Optional kann ausgewählt werden, ob ein Boot-Selektor installiert werden soll, um zwischen den möglichen Betriebssystemen auf der/den Platte(n) wechseln zu können. Bei der zweiten Methode wird die gesamte Platte für FreeBSD genutzt und nicht versucht, kompatibel zu anderen Betriebssystemen zu sein. Nun, warum wird es gefährlich genannt? Eine Platte in diesem Modus enthält nichts, was von normalen PC-Hilfsprogrammen als gültige &man.fdisk.8;-Tabelle betrachtet werden würde. Abhängig von der Qualität ihres Designs werden sie sich bei Ihnen beschweren, sobald sie mit einer solchen Platte in Kontakt kommen, oder noch schlimmer, sie könnten den Bootstrap von FreeBSD beschädigen, ohne Sie zu fragen oder darauf hinzuweisen. Hinzu kommt, dass vom Layout von dangerously dedicated Platten bekannt ist, dass es viele BIOSe verwirrt, einschließlich solcher von AWARD (wie es z.B. im HP Netserver oder Micronics-Systemen, sowie vielen anderen zu finden ist) und Symbios/NCR (für die bekannte 53C8xx-Reihe von SCSI-Controllern). Dies ist keine vollständige Liste - es gibt weitere. Symptome für diese Verwirrung sind read error-Meldungen, die vom FreeBSD-Bootstrap ausgegeben werden, wenn es sich selbst nicht finden kann, sowie Systemabstürze beim Booten. Warum gibt es diesen Modus dann überhaupt? Es spart ein paar kByte an Plattenplatz und kann echte Probleme verursachen, die zu einer Neuinstallation führen. Die Ursprünge des Dangerously dedicated Modus liegen in der Absicht, eines der häufigsten Probleme, das Erstinstallierer von FreeBSD plagt, zu verhindern - die BIOS-Werte für die Geometrie einer Festplatte auf der Festplatte selbst anzupassen. Geometrie ist ein veraltetes Konzept, das aber immer noch die Grundlage für die Interaktion zwischen dem PC-BIOS und den Festplatten ist. Wenn das Installationsprogramm von FreeBSD Slices erstellt, muss es sich die Lage dieser Slices auf der Festplatte in einer Art merken, die damit übereinstimmt, wie das BIOS erwartet, sie zu finden. Wenn das falsch geschieht, werden Sie nicht in der Lage sein, zu booten. Durch den Dangerously dedicated Modus wird versucht, dies zu umgehen, indem das Problem vereinfacht wird. In einigen Fällen klappt das zwar, aber er ist eher als allerletzter Ausweg gedacht - in 99 von 100 Fällen gibt es bessere Möglichkeiten, das Problem zu lösen. Wie vermeiden Sie also die Notwendigkeit zum DD Modus, wenn Sie installieren? Beginnen Sie, indem Sie sich notieren, welche Geometrie das BIOS für Ihre Platten benutzt. Sie können erreichen, dass der Kernel sie beim Booten ausgibt, indem Sie an der Eingabeaufforderung boot: angeben, oder boot -v im Loader verwenden. Kurz bevor das Installationsprogramm startet, wird der Kernel eine Liste mit den BIOS-Geometrien ausgeben. Keine Panik - warten Sie, bis das Installationsprogramm gestartet wurde und benutzen Sie Scrollback, um die Zahlen zu lesen. Typischerweise befinden sich die BIOS-Platten in derselben Reihenfolge, wie FreeBSD Ihre Platten auflistet - zuerst IDE, dann SCSI. Wenn Sie Ihre Festplatte in Slices unterteilen, überprüfen Sie, ob die Plattengeometrie, die im FDISK-Menü angegeben ist, korrekt ist (das heißt mit den Einstellungen im BIOS übereinstimmen). Falls die Werte nicht stimmen, benutzen Sie G, um sie zu korrigieren. Diese Schritte sind nötig, wenn sich absolut nichts auf der Festplatte befindet, oder, wenn die Festplatte vorher in einem anderen System benutzt worden ist. Beachten Sie, dass dies nur für die Festplatte nötig ist, von der Sie booten wollen. Mit weiteren vorhandenen Platten wird FreeBSD sich problemlos zurechtfinden. Wenn Sie es geschafft haben, dass das BIOS und FreeBSD in der Festplattengeometrie übereinstimmen, dann sind Ihre Probleme ziemlich sicher vorüber - ohne, dass es nötig gewesen wäre, den DD-Modus zu benutzen. Falls sie jedoch immer noch mit der gefürchteten read error-Meldung begrüßt werden sollten, wenn Sie versuchen, zu booten, wird es Zeit, dass Sie Ihre Finger kreuzen und es einfach versuchen - es gibt nichts mehr zu verlieren. Um eine dangerously dedicated Festplatte wieder für einen normalen PC brauchbar zu machen, gibt es zwei Möglichkeiten. Die erste ist, ausreichend viele NULL-Bytes in den MBR zu schreiben, um irgendwelche nachfolgenden Installation glauben zu machen, dass es sich um eine leere Festplatte handelt. Sie können das zum Beispiel so tun: &prompt.root; dd if=/dev/zero of=/dev/rda0 count=15 Alternativ installiert der undokumentierte DOS-Befehl C:\> fdisk /mbr einen neuen Master-Boot-Record, das heißt der BSD-Bootstrap wird zerstört. Auf welchen Partitionen kann ich problemlos Soft Updates einsetzen? Ich habe gehört, das der Einsatz von Soft Updates auf / Probleme verursachen kann. Die schnelle Antwort: Sie können Soft Updates bedenkenlos auf alle Partitionen benutzen. Die ausführliche Antwort: Es gab lange Zeit Bedenken, was den Einsatz von Soft Updates auf der root-Partition betrifft. Der Grund sind zwei Charakteristika der Soft Updates: Zum einen kann es bei einem Absturz des System auf einer Partition mit Soft Updates zum Datenverlust kommen. Die Partition ist zwar noch brauchbar, aber einige Daten können verloren gehen. Weiterhin kann es durch Soft Updates zu einem zeitweisen Mangel an Plattenplatz kommen. Bei der Benutzung von Soft Updates kann es bis zu dreißig Sekunden dauern, bis der Kernel Änderungen auf das physikalische Speichermedium schreibt. Wenn Sie eine große Datei löschen, ist diese Datei noch auf der Platte vorhanden, bis der Kernel die Löschoperation tatsächlich durchführt. Das kann zu einem sehr einfachen Problem führen: Stellen Sie sich vor, Sie löschen eine große Datei und legen gleich darauf eine andere große Datei an. Da die erste Datei noch nicht wirklich gelöscht wurde, ist eventuell nicht genug Platz für die zweite große Datei. Sie erhalten die Fehlermeldung, dass nicht genug freier Platz vorhanden ist, obwohl Sie ganz genau wissen, dass Sie gerade eben Platz geschaffen haben. Wenn Sie die Operation ein paar Sekunden später wiederholen, funktioniert alles wie von Geisterhand. Dieser Effekt hat mehr als einen Benutzer verwirrt und Zweifel an seiner geistigen Stabilität oder dem FreeBSD-Dateisystem aufkommen lassen. Wenn der Kernel ein Datenpaket annimmt und das System abstürzt, bevor er dies Daten auf die Platte geschrieben hat, kann es zum Verlust oder zur Zerstörung von Daten kommen. Dieses Risiko ist nur sehr gering und normalerweise tragbar. Wenn Sie allerdings einen IDE-Write-Cache verwenden, steigt das Risiko; daher wird normalerweise empfohlen, auf den Einsatz dieser Technik zu verzichten, wenn Sie Soft Updates benutzen. Diese beiden Probleme betreffen alle Partitionen, die Soft Updates verwenden. Was bedeutet das für die Root-Partition? Die wichtigen Daten auf der Root-Partition ändern sich nur sehr selten. Dateien wie /boot/kernel/kernel und der Inhalt /etc werden nur bei der Wartung des Systems geändert, oder wenn Benutzer ihre Passwörter ändern. Wenn das System in den 30 Sekunden nach einer solchen Änderung abstürzt, ist es möglich, das Daten verloren gehen. Dieses Risiko ist in den meisten Fällen unerheblich, aber es ist vorhanden. Wenn das zu viel Risiko ist, dann sollten Sie Soft Updates nicht auf der Root-Partition einsetzen. / war schon immer eine der kleinsten Partitionen. Standardmäßig legt FreeBSD das Verzeichnis /tmp direkt auf /. Wenn in Ihrem /tmp viel Betrieb ist, kann es gelegentlich zu den oben beschriebenen Platzproblemen kommen. Um das Problem zu lösen, sollten sie einen symbolischen Link von /tmp nach /var/tmp legen. Was stimmt mit meinem &man.ccd.4; nicht? Das Symptom hierfür ist: &prompt.root; ccdconfig -C ccdconfig: ioctl (CCDIOCSET): /dev/ccd0c: Inappropriate file type or format Das geschieht für gewöhnlich, wenn Sie versuchen, die c Partitionen, die standardmäßig vom Typ unbenutzt sind, zu verbinden. Der &man.ccd.4;-Treiber verlangt Partitionen vom Typ FS_BSDFFS. Editieren Sie den Plattenlabel der Platten, die Sie zu verknüpfen versuchen und ändern Sie die Typen der Partitionen in 4.2BSD. Warum kann ich den Plattenlabel meines &man.ccd.4; nicht editieren? Das Symptom hierfür ist: &prompt.root; disklabel ccd0 (hier wird etwas vernünftiges ausgegeben; versuchen wir nun, es zu editieren) &prompt.root; disklabel -e ccd0 -(editiern, speichern, beenden) +(editieren, speichern, beenden) disklabel: ioctl DIOCWDINFO: No disk label on disk; use "disklabel -r" to install initial label Der Grund ist, dass der von &man.ccd.4; zurückgelieferte Plattenlabel ein vorgetäuschter ist, der sich nicht wirklich auf der Platte befindet. Sie können das Problem beheben, indem Sie ihn explizit zurückschreiben, wie z.B. hier: &prompt.root; disklabel ccd0 > /tmp/disklabel.tmp &prompt.root; disklabel -Rr ccd0 /tmp/disklabel.tmp &prompt.root; disklabel -e ccd0 (nun wird es funktionieren) Kann ich andere fremde Dateisysteme unter FreeBSD mounten? FreeBSD unterstützt verschiedene fremde Dateisysteme. Digital UNIX UFS-CDROMs können unter FreeBSD direkt gemountet werden. Das Mounten von Partitionen von Digital &unix; und anderen Systemen, die UFS unterstützen, könnte schwieriger sein, abhängig von den Details der Plattenpartitionierung des betreffenden Betriebssystems. &linux; FreeBSD unterstützt ext2fs-Partitionen. Unter &man.mount.ext2fs.8; finden Sie weitere Informationen. &windowsnt; Ein NTFS-Treiber, der nur Lesezugriffe gestattet, ist Teil von &os;. Weitere Informationen entnehmen Sie bitte der Hilfeseite &man.mount.ntfs.8;. FAT FreeBSD enthält ein FAT-Treiber, der Lese- und Schreibzugriffe ermöglicht. Weitere Informationen entnehmen Sie bitte der Hilfeseite &man.mount.msdosfs.8;. ReiserFS FreeBSD enthält einen Treiber, der Lesezugriffe auf ReiserFS-Partitionen erlaubt. Weiter Informationen dazu finden Sie in der Manualpage &man.mount.reiserfs.8;. FreeBSD unterstützt auch verschiedene Netzwerk-Dateisysteme, wie NFS (&man.mount.nfs.8;), NetWare (&man.mount.nwfs.8;), sowie die SMB-Dateisysteme von Microsoft (&man.mount.smbfs.8;). Wie mounte ich eine erweiterte DOS-Partition? Die erweiterten DOS-Partitionen befinden sich hinter ALLEN primären Partitionen. Wenn sich zum Beispiel eine Partition E als sekundäre DOS-Partition auf Ihrem zweiten SCSI-Laufwerk befindet, müssen Sie die speziellen Dateien für Slice 5 im Verzeichnis /dev erstellen und dann /dev/da1s5 mounten: &prompt.root; cd /dev &prompt.root; ./MAKEDEV da1s5 &prompt.root; mount -t msdos /dev/da1s5 /dos/e Gibt es ein verschlüsselndes Dateisystem für &os;? Ja. Sie können entweder &man.gbde.8; oder &man.geli.8; einsetzen. Lesen Sie dazu auch den Abschnitt Partitionen verschlüsseln des Handbuchs. Wie kann ich den &windowsnt;-Loader zum Booten von FreeBSD verwenden? Das grundsätzliche Vorgehen besteht darin, dass Sie den ersten Sektor Ihrer eigentlichen FreeBSD-Rootpartition in eine Datei auf der DOS/&windowsnt;-Partition kopieren. Angenommen, sie nennen die Datei etwa c:\bootsect.bsd (durch c:\bootsect.dos inspiriert), dann können Sie die Datei c:\boot.ini etwa wie folgt editieren: [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows NT" C:\BOOTSECT.BSD="FreeBSD" C:\="DOS" Falls FreeBSD auf derselben Platte, wie die &windowsnt;-Bootpartition installiert ist, kopieren Sie einfach /boot/boot1 nach C:\BOOTSECT.BSD. Falls FreeBSD auf einer anderen Platte installiert ist, wird /boot/boot1 nicht funktionieren; Sie brauchen in diesem Fall /boot/boot0. /boot/boot0 muss mit &man.sysinstall.8; installiert werden. Wählen Sie dazu den FreeBSD-Bootmanager aus, wenn Sie gefragt werden, ob sie einen Bootmanager installieren wollen. Dieser Schritt ist notwendig, weil /boot/boot0 eine leere Partitionstabelle enthält, die von &man.sysinstall.8; mit NULL-Zeichen ausgefüllt wird, bevor /boot/boot0 in den MBR kopiert wird. Sie dürfen auf gar keinen Fall einfach /boot/boot0 statt /boot/boot1 kopieren. Wenn Sie das doch tun sollten, wird Ihre Partitionstabelle überschrieben und Ihr Rechner wird nicht mehr starten! Wenn der Bootmanager von FreeBSD gestartet wird, merkt er sich das zuletzt gestartet Betriebssystem, indem er dessen Partition als aktiv markiert. Danach kopiert er sich selbst (alle 512 Bytes) in den MBR. Wenn Sie also einfach /boot/boot0 nach C:\BOOTSECT.BSD kopieren, würde der Bootmanager eine leere Partitionstabelle (mit einem als aktiv markiertem Eintrag) in den MBR kopieren. Wie boote ich FreeBSD und &linux; mit LILO? Falls sich FreeBSD und &linux; auf derselben Platte befinden, folgen Sie einfach den Installationsanweisungen von LILO zum Booten eines Nicht-&linux;-Betriebssystems. Ganz knapp sind dies: Booten Sie &linux; und fügen Sie die folgenden Zeilen in die Datei /etc/lilo.conf ein: other=/dev/hda2 table=/dev/hda label=FreeBSD (hierbei wird angenommen, dass Ihre FreeBSD-Partition &linux; unter /dev/hda2 bekannt ist; ändern Sie dies entsprechend Ihren Einstellungen). Führen Sie nun als root den Befehl lilo aus und Sie sind fertig. Falls FreeBSD sich auf einer anderen Platte befindet, müssen Sie loader=/boot/chain.b zu den LILO-Angaben hinzufügen. Zum Beispiel: other=/dev/dab4 table=/dev/dab loader=/boot/chain.b label=FreeBSD In einigen Fällen könnte es sein, dass Sie beim FreeBSD-Bootloader die BIOS-Laufwerksnummer angeben müssen, um von der zweiten Platte booten zu können. Wenn Ihre FreeBSD-SCSI-Platte vom BIOS zum Beispiel als BIOS-Platte 1 erkannt wird, müssen Sie am Prompt des FreeBSD-Bootloaders eingeben: Boot: 1:da(0,a)/kernel Sie können &man.boot.8; so konfigurieren, dass das beim Booten automatisch geschieht. Das &linux;+FreeBSD mini-HOWTO ist ein guter Ratgeber bei Fragen zur Interaktion von FreeBSD und &linux;. Wie boote ich &os; und &linux; mit GRUB? Es ist sehr einfach, GRUB zum Starten von &os; einzusetzen. Dazu müssen Sie lediglich die folgenden Zeilen in die Konfigurationsdatei - /boot/grub/grub.conf aufnehmen: + /boot/grub/menu.lst (oder + /boot/grub/grub.conf bei manchen Systemen wie + z.B. Red Hat Linux und dessen Abkömmlinge) aufnehmen. title FreeBSD 6.1 - root (hd0,a) + root (hd0,a) kernel /boot/loader - Dabei steht hd0,a für die + Dabei steht hd0,a für die root-Partition Ihrer ersten Festplatte. Benötigen Sie auch die Slice-Nummer, so verwenden Sie einen Eintrag - der Form (hd0,2,a). In der + der Form (hd0,2,a). In der Voreinstellung ist die Angabe der Slice-Nummer aber nicht nötig, da GRUB automatisch das erste Slice (das die - Bezeichnung 'a' hat) nutzt. + Bezeichnung a hat) nutzt. - Wie boote ich FreeBSD und &linux; mit BootEasy? + Wie boote ich FreeBSD und &linux; mit + BootEasy? Installieren Sie LILO am Anfang Ihrer &linux;-Bootpartition, anstatt im Master Boot Record. Sie - können LILO dann von BootEasy aus booten. + können LILO dann von BootEasy + aus booten. Wenn Sie &windows; 95 und &linux; benutzen, wird das ohnehin empfohlen, um es einfacher zu machen, &linux; wieder zu booten, wenn es nötig werden sollte, dass Sie &windows; 95 neu installieren (&windows; 95 ist ein eifersüchtiges Betriebssystem, das kein anderes Betriebssystem im Master Boot Sektor duldet). Wie kann ich das ??? des Boot-Managers durch etwas Sinnvolles ersetzen? Solange Sie den Boot-Manager nicht komplett neu schreiben, gar nicht. Allerdings gibt es in der Kategorie sysutils der Ports diverse Boot-Manager, die diese Funktionalität bieten. Ich habe ein Wechsellaufwerk. Wie benutze ich es? Ob es sich um ein Wechsellaufwerk handelt, um ein &iomegazip; oder ein EZ-Laufwerk (oder sogar ein Diskettenlaufwerk, wenn Sie es auf diese Weise benutzen möchten), oder um eine neue Festplatte - wenn es einmal installiert und vom System erkannt ist und Sie Ihre Kassette/Diskette/was_auch_immer eingelegt haben, ist das Vorgehen bei allen Geräten ziemlich ähnlich. (dieser Abschnitt basiert auf Mark Mayo's ZIP-FAQ) Wenn es sich um ein ZIP- oder Diskettenlaufwerk handelt, und sich bereits ein DOS-Dateisystem darauf befindet, können Sie einen Befehl wie diesen für eine Diskette benutzen: &prompt.root; mount -t msdos /dev/fd0c /floppy oder diesen: &prompt.root; mount -t msdos /dev/da2s4 /zip für eine ZIP-Disk mit der Herstellerkonfiguration. Benutzen Sie bei anderen Platten &man.fdisk.8; oder &man.sysinstall.8;, um herauszufinden, wie sie konfiguriert sind. Die restlichen Beispiele sind für ein ZIP-Laufwerk unter da2, der dritten SCSI-Platte. Wenn es sich nicht um eine Diskette oder eine Wechselplatte handelt, die Sie mit anderen Leuten austauschen wollen, ist es wahrscheinlich besser, ein BSD-Dateisystem darauf zu installieren. Hierdurch bekommen Sie Unterstützung für lange Dateinamen, eine mindestens doppelt so hohe Leistungsausnutzung und wesentlich höhere Stabilität. Zunächst müssen Sie die Partitionen/Dateisysteme auf DOS-Ebene nochmals erstellen. Sie können entweder &man.fdisk.8; oder /stand/sysinstall benutzen, oder, bei einem kleinen Laufwerk, dem Sie eine Unterstützung für mehrere Betriebssysteme nicht zumuten wollen, entfernen Sie einfach die komplette FAT Partitionstabelle (Slices) und benutzen Sie einfach die BSD-Partitionierung: &prompt.root; dd if=/dev/zero of=/dev/rda2 count=2 &prompt.root; disklabel -Brw da2 auto Sie können disklabel oder /stand/sysinstall benutzen, um mehrere BSD-Partitionen zu erstellen. Dies werden Sie sicherlich bei einer fest eingebauten Platte wollen, aber bei einem Wechsellaufwerk wie einem ZIP ist das wahrscheinlich irrelevant. Zum Schluß erstellen Sie ein neues Dateisystem - dieses befindet sich auf unserem ZIP-Laufwerk und belegt die gesamte Platte: &prompt.root; newfs /dev/rda2c anschließend mounten Sie es: &prompt.root; mount /dev/da2c /zip Und sicherlich ist es keine schlechte Idee, eine Zeile ähnlich der folgenden in die Datei /etc/fstab einzufügen, damit Sie in Zukunft nur mount /zip einzugeben brauchen: /dev/da2c /zip ffs rw,noauto 0 0 Wieso erhalte ich die Meldung Incorrect super block beim Mounten einer CDROM? Sie müssen &man.mount.8; mitteilen, was für ein Gerät Sie mounten wollen. Genauere Informationen dazu finden Sie im Kapitel Optische Speichermedien des Handbuch, genauer gesagt im Abschnitt Benutzung von Daten-CDs. Wieso erhalte ich die Meldung Device not configured, wenn ich eine CDROM mounte? Das bedeutet im allgemeinen, dass sich keine CDROM im Laufwerk befindet, oder, dass das Laufwerk auf dem Bus nicht sichtbar ist. Dieses Problem wird im Kapitel Benutzung von Daten-CDs des Handbuchs ausführlich diskutiert. Wieso werden alle Sonderzeichen in den Dateinamen auf meinen CDs durch ? ersetzt, wenn ich die CD unter FreeBSD benutze? Wahrscheinlich werden auf der CDROM die Joliet Erweiterungen für die Speicherung von Datei- und Verzeichnisnamen benutzt. Werfen Sie einen Blick in das Kapitel Erzeugung von CD-ROMs im Handbuch, speziell in den Abschnitt über Benutzung von Daten-CDs. [Anmerkung des Übersetzers: Es geht hier nicht um die deutschen Sonderzeichen, da diese schon im normalen ISO8859-1 enthalten sind. Die Probleme treten auf, wenn man z.B. russische CDs (ISO8859-5) verwendet.] Ich habe eine CD mit FreeBSD gebrannt und kann sie nicht mit anderen Betriebssystemen lesen. Warum? Sie haben wahrscheinlichste eine Datei direkt auf CD geschrieben, statt ein ISO 9660-Dateisystems erzeugt zu haben. Werfen Sie einen Blick in das Kapitel Erzeugung von CD-ROMs im Handbuch, speziell in den Abschnitt über reine Daten-CDs. Wie kann ich ein Image einer Daten-CD erzeugen? Diese Information finden Sie im Abschnitt Kopieren von CD-ROMs des Handbuchs. Weitere Informationen über die Arbeit mit CD-ROMs finden Sie im Abschnitt Erzeugen von CD-ROMs im Kapitel Speichermedien des Handbuchs. Wieso kommt mount nicht meiner Audio-CD zurecht? Wenn Sie versuchen sollten, eine Audio-CD zu mounten, erhalten Sie die Meldung cd9660: /dev/acd0c: Invalid argument. Der Grund dafür ist, dass mount nur für Dateisysteme vorgehen ist. Audio CDs habe kein Dateisystem, sondern nur Daten. Wenn Sie eine Audio CD auslesen wollen, brauchen Sie ein entsprechendes Programm wie z.B. audio/xmcd aus den Ports. Wie nutze ich mount für eine Multi-Session CD? Standardmäßig benutzt &man.mount.8; den letzten (aktuellsten) Daten-Track der CD. Wenn Sie eine ältere Session benutzen wollen, müssen Sie diese mit der Option definieren. Weitere Informationen finden Sie in der Onlinehilfe zu &man.mount.cd9660.8; Wie lasse ich normale Benutzer Disketten, CDROMs und andere Wechseldatenträger mounten? Normale Benutzer können dazu berechtigt werden, Geräte zu mounten. Das geht so: Setzen Sie als root die sysctl-Variable vfs.usermount auf 1: &prompt.root; sysctl -w vfs.usermount=1 Ordnen Sie als root den Block-Geräten, die den Wechsellaufwerken zugeordnet sind, die entsprechenden Zugriffsrechte zu. Wenn Sie zum Beispiel den Benutzer den Zugriff auf das erste Diskettenlaufwerk zu erlauben wollen: &prompt.root; chmod 666 /dev/fd0 Um den Mitgliedern der Gruppe operator den Zugriff auf das CDROM zu gestatten: &prompt.root; chgrp operator /dev/acd0c &prompt.root; chmod 640 /dev/acd0c Ab &os; 5.X müssen Sie zusätzlich /etc/devfs.conf anpassen, weil diese Einstellungen ansonsten beim Systemneustart verloren gehen. - Damit normale Benutzer bespielsweise das erste + Damit normale Benutzer beispielsweise das erste Diskettenlaufwerk mounten können, fügen Sie als root folgende Zeilen in /etc/devfs.conf ein: # Allen Benutzern erlauben, das erste Diskettenlaufwerk zu mounten. own /dev/fd0 root:operator perm /dev/fd0 0666 Damit alle Mitglieder der Gruppe operator das CD-ROM-Laufwerk mounten können, die folgenden Zeilen: # Alle Mitglieder der Gruppe operator dürfen CD-ROMs mounten. own /dev/acd0 root:operator perm /dev/acd0 0660 Fügen Sie zum Abschluss die Zeile vfs.usermount=1 in die Datei /etc/sysctl.conf ein, damit die Einstellung bei einem Neustart des Systems automatisch erhalten bleibt. Alle Benutzer können nun /dev/fd0 auf ein Verzeichnis, das ihnen gehört, mounten: &prompt.user; mkdir ~/my-mount-point &prompt.user; mount -t msdos /dev/fd0 ~/my-mount-point Die zur Gruppe operator gehörenden Benutzer können nun /dev/acd0c auf ein Verzeichnis, das ihnen gehört, mounten: &prompt.user; mkdir ~/my-mount-point &prompt.user; mount -t cd9660 /dev/acd0c ~/my-mount-point Das Unmounten des Gerätes ist simpel: &prompt.user; umount ~/my-mount-point Die Aktivierung von vfs.usermount hat jedoch negative Auswirkungen auf Sicherheitsaspekte. Ein besserer Weg, um auf &ms-dos;-formatierte Datenträger zuzugreifen, ist die Benutzung des Packages emulators/mtools. Denken Sie daran, dass Sie die Gerätenamen in diesen Beispielen an Ihre Konfiguration anpassen müssen. Wieso geben die Befehle du und df unterschiedliche Werte für den freien Plattenplatz aus? Der Grund ist die Funktionsweise von du und df. du geht durch einen Dateibaum, ermittelt die Größe jeder einzelnen Datei, und gibt die Summe aus. df fragt lediglich das Dateisystem wie viel Platz noch frei ist. Das scheint zwar auf den ersten Blick sehr ähnlich zu sein; allerdings wird sich ein leeres Verzeichnis auf die Ausgabe von df auswirken, während es auf das Ergebnis von du keinen Einfluss hat. Wenn Sie eine Datei löschen, während sie von einem Programm genutzt wird, wird diese Datei erst gelöscht, wenn sie vom Programm freigegeben wird. Allerdings wird die Datei sofort aus dem Verzeichnis entfernt. Sie können dieses Verhalten mit einem Programm wie more sehr einfach nachvollziehen. Dazu brauchen Sie nur eine Datei, die groß genug ist, um die Ausgabe von du und df zu beeinflussen. Bei der Größe aktueller Platten muss diese Datei schon sehr groß sein! Wenn Sie diese Datei löschen, während Sie sie sich in more anzeigen lassen, hat more kein Problem. Der Eintrag für die Datei wird lediglich aus dem Verzeichnis entfernt, damit kein anderes Programm mehr darauf zugreifen kann. Laut du ist die Datei verschwunden – es hat das Verzeichnis untersucht und die Datei nicht gefunden. Laut df ist die Datei aber vorhanden, da sie im Dateisystem immer noch Platz belegt. Sobald Sie more beenden, werden die Ergebnisse von du und df wieder übereinstimmen. Bitte beachten Sie, dass die Freigabe des Plattenplatzes durch die Soft Updates um bis zu 30 Sekunden verzögert werden kann. Die oben beschriebene Situation tritt sehr häufig auf Web-Servern auf. Viele Anwender installieren einen FreeBSD Web-Server und vergessen die Rotation der Logfiles, bis irgendwann die Partition /var überläuft. Der Administrator löscht die Datei, aber das System beschwert sich immer noch über fehlenden Plattenplatz. Die Datei wird erst freigegeben, wenn der Web-Server beendet und neu gestartet wird; dadurch kann das System den Plattenplatz freigeben. Um solche und ähnliche Unfälle zu verhindern, sollten Sie &man.newsyslog.8; einsetzen. Wie kann ich den Swap-Bereich vergrößern? Im Kapitel Konfiguration und Tuning des Handbuches gibt es einen Abschnitt mit einer Schritt-für-Schritt Anleitung. Warum ist meine Festplatte unter &os; kleiner, als sie laut Hersteller sein soll? Festplattenhersteller definieren ein Gigabyte als eine Milliarde Bytes, für &os; ist ein Gigabyte hingegen 1.073.741.824 Bytes groß. Aus diesem Grund wird für eine Platte, die laut Herstellerangaben 80 GB groß ist, während des Bootvorgangs eine Größe von 76.319 MB angezeigt. Beachten Sie auch, dass &os; (in der Voreinstellung) 8 % des Plattenplatzes für sich reserviert. Warum kann eine Partition zu mehr als 100% gefüllt sein? Ein Teil jeder UFS Partition, in der Vorgabe sind das 8%, ist für das Betriebssystem und den Benutzer root reserviert. &man.df.1; rechnet diesen Teil bei der Ausgabe der Capacity Spalte nicht ein, so dass dort Werte über 100% angezeigt werden können. Die Anzahl der Blöcke in der blocks Spalte ist ebenfalls um 8% größer als die Summe der benutzten und verfügbaren Blöcke (die Spalten Used und Avail). Wie viel Platz reserviert wird, können Sie mit der Option von &man.tunefs.8; einstellen. Systemadministration Wo befinden sich die Konfigurationsdateien für den Systemstart? /etc/defaults/rc.conf (siehe &man.rc.conf.5;) ist die primäre Konfigurationsdatei. Die Startskripten des Systems, wie /etc/rc und /etc/rc.d (siehe &man.rc.8;) inkludieren diese Datei. Ändern Sie diese Datei nicht! Wenn Sie den Wert einer der in /etc/defaults/rc.conf gesetzten Variablen ändern wollen, fügen Sie die entsprechende Zeile in die Datei /etc/rc.conf ein und ändern die Zeile dort. Wenn Sie zum Beispiel den mitgelieferten DNS-Server named aktivieren wollen, müssen Sie lediglich das folgende Kommando eingeben: &prompt.root; echo named_enable="YES" >> /etc/rc.conf Wenn Sie lokale Server starten wollen, müssen Sie passende Shellskripten im Verzeichnis /usr/local/etc/rc.d/ ablegen. Die Dateien müssen als ausführbar markiert sein und die Endung .sh haben. Wie kann ich am Einfachsten einen Benutzer hinzufügen? Benutzen Sie den Befehl &man.adduser.8; und für kompliziertere Fälle den Befehl &man.pw.8;. Benutzen Sie den Befehl &man.rmuser.8;, um einen Benutzer wieder zu löschen. Sie können, wenn nötig. auch &man.pw.8; benutzen. Warum erhalte ich Meldungen wie root: not found, nachdem ich meine crontab geändert habe? Die übliche Ursache dieses Problems ist, dass Sie die crontab des Systems (/etc/crontab) geändert und dann mit &man.crontab.1; installiert haben: &prompt.root; crontab /etc/crontab Diese Vorgehensweise ist falsch. Die crontab des Systems hat ein anderes Format als die crontabs für die einzelnen Benutzer, die mit &man.crontab.1; aktualisiert werden (genauere Informationen über die Unterschiede erhalten Sie in &man.crontab.5;). Wenn Sie so vorgegangen sind, ist die zweite crontab einfach nur eine Kopie von /etc/crontab, allerdings im falschen Format. Löschen Sie sie mit dem folgenden Befehl: &prompt.root; crontab -r Wenn Sie /etc/crontab wieder ändern müssen, sollten Sie einfach gar nichts tun, um &man.cron.8; über die Änderung zu informieren, er erkennt die Änderung automatisch. Wenn Sie ein Kommando jeden Tag, jede Woche oder jeden Monat ausführen lassen wollen, ist es wahrscheinlich einfacher, wenn Sie entsprechende Shell-Scripte in /usr/local/etc/periodic ablegen. Diese werden dann von &man.periodic.8; zusammen mit den anderen regelmäßigen Tätigkeiten ausgeführt. Der eigentliche Grund für den Fehler ist die Tatsache, dass die crontab des Systems ein zusätzliches Feld enthält; dieses Feld gibt an, mit welcher Benutzerkennung der Befehl ausgeführt werden soll. In der mitgelieferten crontab ist das bei allen Einträgen die Benutzerkennung root. Wenn diese Datei als die crontab des Benutzers username (die nicht mit der crontab des Systems identisch ist) verwendet wird, hält &man.cron.8; die Zeichenkette root für den Namen des zu startenden Programmes, aber dieses Programm gibt es nicht. Wieso meldet mir &man.su.1; you are not in the correct group to su root, wenn ich mit &man.su.1; root werden will? Das ist ein Sicherheits-Feature. Wenn Sie mit &man.su.1; zum Account root (oder jedem anderen Account mit Super-User-Privilegien) wechseln wollen, müssen Sie ein Mitglied der Gruppe wheel sein. Wenn es dieses Feature nicht gäbe, könnte jeder, der einen Account auf dem System hat und zufällig das Passwort für root erfährt, mit Super-User-Rechten auf das System zugreifen. Durch dieses Feature ist die Lage anders, wenn Sie nicht Mitglied von wheel sind, können Sie nicht einmal versuchen, dass Passwort einzugeben. Um einem Benutzer zu erlauben, mit &man.su.1; root zu werden, müssen Sie ihn nur in die Gruppe wheel eintragen. Ich habe einen Fehler in der rc.conf oder einer der anderen Dateien für den Systemstart und jetzt kann ich sie nicht ändern, weil das Dateisystem read-only ist. Was kann ich tun? Wenn Sie aufgefordert werden, den Pfadnamen der Shell einzugeben, drücken Sie einfach ENTER. Geben Sie danach mount / ein, um das Root-Dateisystem im Schreib/Lese-Modus zu mounten. Sie werden wahrscheinlich auch mount -a -t ufs ausführen müssen, um das Dateisystem mit Ihrem Lieblingseditor zu mounten. Wenn Ihr Lieblingseditor auf einem Netzwerklaufwerk liegt, müssen Sie entweder das Netzwerk von Hand konfigurieren oder einen Editor benutzen, der auf einem lokalen Laufwerk vorhanden ist, z.B. &man.ed.1;. Wenn Sie einen bildschirmorientierten Editor wie zum Beispiel &man.vi.1; oder &man.emacs.1; benutzen wollen, werden Sie auch den Befehl export TERM=cons25 ausführen müssen, damit diese Editoren die richtigen Einstellungen aus der Datenbank &man.termcap.5; übernehmen. Sobald Sie diese Schritte ausgeführt, können Sie den Fehler in der /etc/rc.conf ganz normal beheben. Die Fehlermeldungen, die Ihnen unmittelbar nach den Startmeldungen des Kernels angezeigt wurden, sollten Ihnen die Nummer der Zeile mit dem Fehler melden. Wieso habe ich habe Probleme, meinen Drucker einzurichten? Bitte sehen Sie im Handbucheintrag über Drucker nach. Es sollte die meisten Ihrer Probleme behandeln. Lesen sie den Handbucheintrag über Drucker. Einige Drucker benötigen einen auf dem Rechner laufenden Treiber, um drucken zu können. Diese so genannten WinPrinter oder GDI-Drucker werden von FreeBSD nicht unterstützt und an diesem Zustand wird sich wohl auch nichts ändern. Wenn Ihr Drucker nicht unter DOS oder &windowsnt; 4.0 verwendet werden kann, handelt es sich um einen WinPrinter und wird in der Regel auch nicht unter FreeBSD funktionieren. Ihre einzige Chance, einen dieser Drucker benutzen können, ist der Port ports/print/pnm2ppa. Wie kann ich die Tastaturbelegung meines Systems korrigieren? Informationen dazu finden Sie im Kapitel länderspezifische Einstellungen des Handbuchs, insbesondere im Abschnitt Konfiguration der Konsole. Wieso erhalte ich beim Start des Systems Meldungen wie unknown: <PNP0303> can't assign resources? Die nachfolgende Erklärung stammt aus einer Mail auf der Mailingliste freebsd-current.
&a.wollman;, 24 April 2001 Die Geräte, für die can't assign resources-Meldungen ausgegeben werden, sind Legacy ISAGeräte, für die ein nicht PNP-fähiger Treiber in den Kernel eingebunden wurde. Dabei handelt es sich um Geräte wie den Tastaturkontroller, den programmierbaren Interrupt-Kontroller und diverse andere Standardkomponenten. Die Ressourcen können nicht zugewiesen werden, weil es schon einen Treiber gibt, der diese Ressourcen benutzt.
Wieso funktionieren die Benutzer-Quotas nicht richtig? Es kann sein, dass Ihr Kernel nicht für den Einsatz von Quotas konfiguriert ist. Damit Sie mit Quotas arbeiten können, müssen Sie folgende Zeile in Ihre Kernelkonfigurationsdatei aufnehmen und den Kernel neu bauen: options QUOTA Weitere Informationen zum Einsatz von Quotas finden Sie im entsprechenden Abschnitt des Handbuchs. Benutzen Sie keine Quotas für /. Erstellen Sie die Quotas-Datei in dem Dateisystem, für das die Quotas gelten sollen, z.B.: Filesystem Quota file /usr /usr/admin/quotas /home /home/admin/quotas Unterstützt FreeBSD IPC-Grundfunktionen von System V? Ja, FreeBSD unterstützt IPC im Stil von System V einschließlich gemeinsamen Speicher, Nachrichten und Semaphoren bereits mit dem GENERIC-Kernel. Wenn Sie einen angepassten Kernel verwenden, müssen Sie die folgenden Zeilen in Ihre Kernelkonfigurationsdatei einfügen: options SYSVSHM options SYSVSHM # enable shared memory options SYSVSEM # enable for semaphores options SYSVMSG # enable for messaging Danach kompilieren und installieren Sie den neuen Kernel. Welchen Mail-Server kann ich an Stelle von sendmail benutzen? sendmail ist zwar der Mail-Server, der bei FreeBSD standardmäßig installiert wird, aber Sie können Ihn problemlos durch einen anderen MTA (z.B. aus den Ports) ersetzen. In der Port-Sammlung gibt es bereits viele verschiedene MTAs, mail/exim, mail/postfix, mail/qmail, sowie mail/zmailer sind einige der beliebteren Alternativen. Konkurrenz belebt das Geschäft und die Tatsache, dass Sie die Qual der Wahl haben, ist ein Vorteil. Daher sollten Sie Fragen wie Ist sendmail besser als Qmail? besser nicht auf den Mailinglisten stellen. Wenn Sie dieses Thema interessiert, sollten sie zunächst die Archive durchsehen. Die Vorteile und Nachteile jedes einzelnen der verfügbaren MTAs sind schon mehrere Male bis zur Erschöpfung diskutiert worden. Was kann ich machen, wenn ich das Rootpasswort vergessen habe? Keine Panik! Starten Sie Ihr System neu und geben Sie boot -s an der Eingabeaufforderung Boot: ein, um in den Einzelbenutzermodus zu gelangen. Bei der Frage danach, welche Shell benutzt werden soll, drücken Sie einfach ENTER. Nun erscheint die Eingabeaufforderung &prompt.root;. Geben Sie mount -u / ein, um Ihr Root-Dateisystem für Lese- und Schreibzugriffe zu remounten und dann mount -a, um alle Dateisysteme zu remounten. Mit passwd root können Sie das Rootpasswort ändern und mit &man.exit.1; können Sie mit dem Booten fortfahren. Wie verhindere ich, dass das System mit Ctrl Alt Delete rebootet werden kann? Falls Sie syscons (den Standard-Treiber für die Konsole) benutzen, fügen Sie folgende Zeile in Ihre Kernelkonfigurationsdatei ein: options SC_DISABLE_REBOOT Falls Sie den Konsolen-Treiber PCVT verwenden, benutzen Sie stattdessen die folgende Zeile: options PCVT_CTRL_ALT_DEL Alternativ können Sie auch die folgende sysctl-Variable setzen (die aktiviert wird, ohne dass Sie Ihr System dazu neu starten oder einen angepassten Kernel erstellen müssen): &prompt.root; sysctl hw.syscons.kbd_reboot=0 Wie kann ich Textdateien von DOS Systemen auf &unix; Systemen verwenden? Benutzen Sie diesen Perl-Befehl: &prompt.user; perl -i.bak -npe 's/\r\n/\n/g' file ... file ist/sind die zu verarbeitende(n) Datei(en). Die Änderungen erfolgen in der Originaldatei, die zuvor mit der Erweiterung .bak gesichert wird. Alternativ können Sie den Befehl &man.tr.1; benutzen: &prompt.user; tr -d '\r' < dos-text-file > unix-file dos-text-file ist die Datei, die den Text im DOS-Format enthält und unix-file wird die konvertierte Ausgabe enthalten. Diese Möglichkeit könnte etwas schneller sein, als die Benutzung von Perl. Wie beende ich Prozesse namentlich? Benutzen Sie &man.killall.1;. Warum nervt su mich damit, dass ich nicht in der ACL von root bin? Der Fehler stammt vom verteilten Authentifizierungssystem Kerberos. Das Problem ist nicht ernsthaft, aber störend. Sie können entweder su mit der Option -K benutzen, oder Kerberos deinstallieren, wie in der nächsten Frage beschrieben. Wie deinstalliere ich Kerberos? Um Kerberos aus dem System zu entfernen, müssen Sie die bin-Distribution der von Ihnen benutzen RELEASE neu installieren. Wenn Sie die CDROM besitzen, können Sie sie mounten (wir nehmen an, unter /cdrom) und folgende Schritte ausführen: &prompt.root; cd /cdrom/bin &prompt.root; ./install.sh Alternativ können Sie alle Zeilen mit MAKE_KERBEROS aus der /etc/make.conf entfernen und dann ein make world durchführen. Wo ist /dev/MAKEDEV hin? Ab FreeBSD 5.X werden Geräte automatisch von &man.devfs.8; zur Verfügung gestellt. Die Gerätetreiber erstellen die Gerätedateien, wenn diese benötigt werden. Das Skript /dev/MAKEDEV wird nicht mehr gebraucht. Wenn Sie FreeBSD 4.X oder eine frühere Version benutzen und /dev/MAKEDEV fehlt, dann haben Sie ein Problem. Kopieren Sie das Skript aus den Systemquellen. Es liegt wahrscheinlich unter /usr/src/etc/MAKEDEV. Wie füge ich Pseudo-Terminals zum System hinzu? Wenn Sie viele Benutzer von telnet, ssh, X oder screens haben, könnte es sein, dass Ihnen die Pseudo-Terminals ausgehen. So fügen Sie weitere hinzu: Erstellen und installieren Sie einen neuen Kernel mit der Zeile pseudo-device pty 256 in der Konfigurationsdatei. Führen Sie die Befehle &prompt.root; cd /dev &prompt.root; ./MAKEDEV pty{1,2,3,4,5,6,7} aus, um 256 Geräteeinträge für die neuen Terminals zu erstellen. Editieren Sie die Datei /etc/ttys und fügen Sie Zeilen für jeden der 256 Terminals ein. Sie sollten so aussehen, wie die existierenden Einträge, also etwa so: ttyqc none network Die Reihenfolge der Buchstabenzuordnung lautet mit einem regulären Ausdruck tty[pqrsPQRS][0-9a-v]. Starten Sie das System mit dem neuen Kernel erneut, wenn Sie bereit sind. Warum kann ich das Gerät snd0 nicht erstellen? Es gibt kein Gerät snd. Diese Bezeichnung ist nur ein Sammelbegriff für die diversen Geräte, die zusammen das Soundsystem von FreeBSD bilden, wie zum Beispiel mixer, sequencer, und dsp. So erzeugen Sie diese Geräte: &prompt.root; cd /dev &prompt.root; sh MAKEDEV snd0 Lassen Sie diesen Schritt aus, wenn Sie FreeBSD 5.0-RELEASE oder eine neuere Version mit &man.devfs.5; verwenden. Die Gerätedateien werden in diesem Fall automatisch in /dev erstellt. Wie lade ich /etc/rc.conf und starte /etc/rc neu, ohne zu rebooten? Gehen Sie in den Einzelbenutzermodus und dann zurück in den Mehrbenutzermodus. Geben Sie auf der Konsole folgendes ein: &prompt.root; shutdown now (Hinweis: ohne -r oder -h) &prompt.root; return &prompt.root; exit Ich wollte auf das aktuelle -STABLE updaten, und plötzlich läuft hier ein -BETAx, -RC oder -PRERELEASE. Was ist passiert? Kurze Antwort: Das ist nur ein anderer Name. RC ist die Abkürzung für Release Candidate. Es bedeutet, dass eine neue Release bevorsteht. Und -PRERELEASE bedeutet bei FreeBSD normalerweise, dass die Sourcen zur Vorbereitung auf eine Release eingefroren wurden (in einigen Releases wurde -BETA anstelle von -PRERELEASE verwendet). Ausführliche Antwort: Bei FreeBSD gibt es zwei Quellen für Releases. Die Major Releases wie 4.0-RELEASE und 5.0-RELEASE werden aus dem aktuellen Stand des Hauptzweiges der Entwicklung (besser und kürzer als -CURRENT bekannt) - erzeugt. Minor Releases wie 4.1-RELEASE or 5.2-RELEASE + erzeugt. Minor Releases wie 4.1-RELEASE oder 5.2-RELEASE stammen aus dem aktiven -STABLE Zweig. Seit 4.3-RELEASE gibt es es nun auch einen eigenen Zweig für jede Release, der für die Leute gedacht ist, die ein sehr konservativ weiterentwickeltes System benötigen (im Normalfall also nur Updates aus dem Bereich Sicherheit). Bevor in einem Zweig eine Release erfolgt, muss in diesem Zweig ein bestimmter Prozess ablaufen. Ein Teil dieses Prozesses ist der code freeze, der Stop der Weiterentwicklung. Sobald dieser Schritt erfolgt ist, wird der Name des Zweiges geändert, um anzuzeigen, dass demnächst eine Release erfolgen wird. Wenn der Zweig zum Beispiel 4.5-STABLE genannt wurde, wird der Name in 4.6-PRERELEASE geändert, um dies zu verdeutlichen. Weiterhin ist das ein Zeichen, dass jetzt besonders intensiv getestet werden sollte. In dieser Phase können Fehler im Sourcecode noch korrigiert werden. Wenn der Sourcecode so weit gereift ist, dass eine Release erstellt werden kann, wird der Name in 4.6-RC geändert, um genau dies anzuzeigen. In dieser Phase können nur noch extrem wichtige Korrekturen aufgenommen werden. Sobald die Release (in diesem Beispiel 4.6-RELEASE) erfolgt ist, wird der Zweig in 4.6-STABLE umbenannt. Weitere Informationen über Versionsnummern und die verschiedenen Entwicklungszweige enthält der Artikel Release Engineering. Als ich versucht habe, einen neuen Kernel zu installieren, ist das chflags fehlgeschlagen. Was mache ich jetzt? Kurze Antwort: Ihre Sicherheitseinstellung (der securelevel) ist wahrscheinlich größer als 0. Sie müssen das System neu starten und den Kernel im Single-User Modus installierten. Ausführliche Antwort: Wenn die Sicherheitseinstellung größer als 0 ist, erlaubt Ihnen FreeBSD nicht, die Systemflags zu ändern. Um den aktuellen Securelevel zu ermitteln, können Sie das folgende Kommando benutzen: &prompt.root; sysctl kern.securelevel Sie können die Sicherheitseinstellung nicht verringern, Sie müssen das System neu starten und den Kernel im Single-User Mode installieren oder die Sicherheitseinstellung in /etc/rc.conf ändern und dann das System neu starten. Weitere Detail zur Sicherheitseinstellung erhalten Sie in &man.init.8;, weitere Informationen zur rc.conf erhalten Sie in /etc/defaults/rc.conf und &man.rc.conf.5;. Ich kann die Systemzeit nicht um mehr als eine Sekunde verstellen. Was mache ich jetzt? Kurze Antwort: Ihre Sicherheitseinstellung (der securelevel) ist wahrscheinlich größer als 1. Sie müssen das System neu starten und die Systemzeit im Single-User Modus verstellen. Ausführliche Antwort: Wenn die Sicherheitseinstellung größer als 1 ist, erlaubt Ihnen FreeBSD nicht, die Systemzeit zu ändern. Um den aktuellen Securelevel zu ermitteln, können Sie das folgende Kommando benutzen: &prompt.root; sysctl kern.securelevel Sie können die Sicherheitseinstellung nicht verringern, Sie müssen das System neu starten und die Systemzeit im Single-User Mode ändern oder die Sicherheitseinstellung in /etc/rc.conf ändern und dann das System neu starten. Weitere Detail zur Sicherheitseinstellung erhalten Sie in &man.init.8;, weitere Informationen zur rc.conf erhalten Sie in /etc/defaults/rc.conf und &man.rc.conf.5;. Warum braucht &man.rpc.statd.8; 256 MByte Speicher? Nein, das Programm hat keinen Fehler und es verbraucht auch nicht 256 MByte Speicher. rpc.statd projiziert nur einen übertrieben großen Speicherbereich in seinen eigenen Adressraum. Von einem rein technischen Standpunkt aus ist das nichts verwerfliches, allerdings verwirrt es Programme wie &man.top.1; und &man.ps.1;. &man.rpc.statd.8; projiziert seine Statusdatei (die in /var liegt) in seinen Adressraum. Um die Probleme zu vermeiden, die bei einer Vergrößerung dieser Projektion entstehen könnten, wird gleich ein möglichst großer Speicherbereich benutzt. Dies kann man sehr schön im Sourcecode sehen: Die Längenangabe beim Aufruf von &man.mmap.2; ist 0x10000000, ein sechzehntel des Adressraums bei IA32, oder genau 256 MByte. Warum kann ich das Dateiattribut schg nicht löschen? Sie betreiben Ihr System mit einer erhöhten Sicherheitsstufe. Senken Sie die Sicherheitsstufe und versuchen Sie es dann noch einmal. Weitere Informationen erhalten Sie im FAQ Eintrag über Sicherheitsstufen und in der Online-Hilfe &man.init.8;. Warum funktioniert die .shosts Authentifizierung von SSH in neueren Version von FreeBSD nicht mehr? Die .shosts Authentifizierung funktioniert nicht mehr, weil &man.ssh.1; in neueren Versionen von FreeBSD nicht mehr SUID-root installiert wird. Um dieses Problem zu lösen, gibt es die folgenden Möglichkeiten: Um das Problem für immer zu lösen, müssen Sie in /etc/make.conf die Variable ENABLE_SUID_SSH auf true setzen und ssh neu übersetzen (oder make world ausführen. Übergangsweise können Sie auch die Dateirechte von /usr/bin/ssh auf 4555 setzen, indem Sie den Befehl chmod 4555 /usr/bin/ssh als root ausführen. Fügen Sie anschließend ENABLE_SUID_SSH= true in die Datei /etc/make.conf ein, damit diese Änderung erhalten bleibt, wenn Sie das nächste Mal make world ausführen. Was ist vnlru? vnlru schreibt vnodes auf Platte und gibt sie wieder frei, falls das System die Grenzwert kern.maxvnodes erreicht. Dieser Thread des Kernel tut meistens gar nichts und wird nur aktiv, wenn Sie extrem viel RAM haben und gleichzeitig auf viele zehntausende kleine Dateien zugreifen. Was bedeuten die Zustände, die top für Speicherseiten ausgibt? Speicherseiten werden vom Kernel in verschiedenen Listen verwaltet: Active: Seiten, die vor Kurzem benutzt wurden. Inactive: Seiten, die länger nicht benutzt wurden. Cache: Meistens Seiten, die vorher im Zustand Inactive waren und noch gültige Daten enthalten. Diese Seiten können sofort in ihrem alten Kontext oder in einem neuen Kontext verwendet werden. Wenn eine Seite unverändert (clean) ist, kann ein Zustandswechsel direkt von Active nach Cache erfolgen. Ob dieser Zustandswechsel möglich ist, wird durch die Seitenersetzungsstrategie bestimmt, die der Entwickler des VM-Systems festgelegt hat. Free: Seiten, die keine Daten enthalten. Diese Seiten können sofort benutzt werden, wenn Seiten im Zustand Cache nicht benutzt werden können. Seiten im Zustand Free können auch während eines Interrupts angefordert werden. Wired: Seiten, die fest im Speicher liegen und nicht ausgelagert werden können. Normalerweise werden solche Seiten vom Kernel benutzt, manchmal werden Sie aber auch für spezielle Zwecke von Prozessen verwendet. Seiten im Zustand Inactive werden oft auf Plattenspeicher geschrieben (sozusagen ein sync des VM-Systems). Wenn die CPU erkennen kann, das eine Seite unmodifiziert (clean) ist, kann auch eine Active-Seite auf den Plattenspeicher ausgeschrieben werden. In bestimmten Situationen ist es von Vorteil, wenn ein Block von VM-Seiten, unabhängig von seinem Zustand, ausgeschrieben werden kann. Die Inactive-Liste enthält wenig benutzte Seiten, die ausgeschrieben werden könnten. Seiten im Zustand Cached sind schon ausgeschrieben und stehen Prozessen für die Verwendung im alten oder in einem neuen Kontext zur Verfügung. Seiten im Zustand Cache sind nicht ausreichend geschützt und können während Unterbrechungen nicht benutzt werden. Die eben beschriebene Behandlung von Speicherseiten kann durch weitere Zustände (wie das das Busy-Flag) verändert werden. Wie viel freien Speicher hat mein System? Es gibt verschiedene Arten von freiem Speicher. Eine Art ist die Speichermenge, die sofort, ohne etwas auszulagern, zur Verfügung steht. Der gesamte VM-Bereich ist eine weitere Art des freien Speichers. Die Betrachtung ist komplex, hängt aber von der Größe des Swap-Bereichs und der Größe des Arbeitsspeichers ab. Es gibt weitere Definitionen für freien Speicher, die aber alle relativ nutzlos sind. Wichtig ist hingegen, dass wenig Seiten ausgelagert werden (paging) und der Swap-Bereich ausreichend groß ist. Ich kann /var/empty nicht löschen! Das Verzeichnis /var/empty wird von &man.sshd.8; benötigt, wenn es mit Privilege Separation läuft. Das Verzeichnis /var/empty ist leer, gehört root und ist durch das Dateiattribut schg geschützt. Wir empfehlen Ihnen, das Verzeichnis zu belassen. Sollten Sie es aber trotzdem löschen wollen, müssen Sie zuerst das schg-Attribut entfernen. Schauen Sie sich dazu die Hilfeseite &man.chflags.1; an und beachten Sie die Antwort auf die Frage wie das schg-Attribut entfernt wird.
Das X Window System und virtuelle Konsolen Was ist das X Window System? Das X Window System (oder auch nur X11) ist das am häufigsten verwendete Window System für &unix;- und &unix;-ähnliche Systeme, zu denen auch &os; gehört. Der X  Protokollstandard wird von der X.org Foundation definiert - und liegt aktuell in Version 11 Relase &xorg.version; vor und wird + und liegt aktuell in Version 11 Release &xorg.version; vor und wird häufig auch nur als X11 bezeichnet. Das X Window System wurde für viele verschiedene Architekturen und Betriebssysteme implementiert. Eine serverseitige Implementierung wird dabei als X-Server bezeichnet. Welche X-Implementierungen sind für &os; verfügbar? Früher war &xfree86;, die X-Implementierung des XFree86 Projects, Inc., der Standard unter &os;. Dieser X-Server wurde bis einschließlich &os; Version 4.10 und 5.2 als Standard-X-Server installiert. Die von &xorg; veröffentlichte Implementierung diente nur als Referenzplattform, weil der verwendete Code über die Jahre sehr ineffizient geworden war. Anfang 2004 verließen einige Entwickler das XFree86 Project, um fortan &xorg; direkt zu unterstützen. Der Grund dafür waren Meinungsverschiedenheiten über die Geschwindigkeit der Weiterentwicklung, die zukünftige Ausrichtung des Projekts sowie persönliche Differenzen. Zur gleichen Zeit aktualisierte &xorg; ihren Quellcodebaum auf die &xfree86;-Version 4.3.99.903, brachte viele Änderungen, die bisher getrennt verwaltet worden waren, in das Projekt ein und veröffentlichte das Paket als X11R6.7.0, bevor - &xfree86; die Lizenz änderte. Ein seperates, aber + &xfree86; die Lizenz änderte. Ein separates, aber mit &xorg; verbundenes Projekt, freedesktop.org (oder fd.o), arbeitet an einer Überarbeitung des ursprünglichen &xfree86;-Codes, um einerseits mehr Rechenarbeit an die Grafikkarten zu übertragen (mit dem Ziel einer deutlich erhöhten Geschwindigkeit) und andererseits den Code zu modularisieren (mit dem Ziel einer verbesserten Wartung, einer schnelleren Entwicklung sowie einer vereinfachten Konfiguration). &xorg; plant, die Weiterentwicklungen von freedesktop.org in seine zukünftigen Versionen zu integrieren. Seit Juli 2004 ist &xorg; der Standard-X-Server für &os;. Die &xfree86;-Ports (x11/XFree86-4) sind aber weiterhin über die Ports-Sammlung verfügbar. Weitere Informationen zum X Window System finden Sie im X11-Kapitel des FreeBSD-Handbuchs. Der vorletzte Absatz beschreibt nur die Standardeinstellung. Es ist nach wie vor möglich, beide Implementierungen unter &os; zu verwenden. Lesen Sie dazu die Anweisungen im Eintrag vom 23.07.2004 in der Datei /usr/ports/UPDATING. Beachten Sie, dass es derzeit nicht möglich ist, Teile aus beiden Implementierungen parallel zu verwenden. Sie müssen sich also für eine der beiden Implementierungen entscheiden. Funktionieren meine Programme auch mit der &xorg;-Implementierung noch? Der &xorg;-Server basiert auf der gleichen X11R6-Spezifikation, die auch &xfree86; verwendet, daher sollte ein Großteil der Anwendungen problemlos funktionieren. Einige selten verwendete Protokolle werden allerdings nicht mehr unterstützt (XIE, PEX, sowie lbxproxy). Die beiden ersten Protokolle wurden allerdings auch vom &xfree86;-Port nicht unterstützt. Warum hat sich das X Project überhaupt aufgespalten? Diese Frage ist nicht &os;-spezifisch. Es gibt zu diesem Thema umfangreiche Postings in diversen Mailinglist-Archiven. Suchen Sie daher über eine Suchmaschine danach, statt diese Frage auf einer &os;-Mailingliste zu stellen. Warum hat sich &os; für &xorg; als Standard-X-Server entschieden? Die Entwickler von &xorg; geben an, dass sie neue Versionen rascher veröffentlichen und neue Eigenschaften schneller implementieren wollen. Außerdem verwenden sie nach wie vor die traditionelle X-Lizenz, während &xfree86; nun eine veränderte Version benutzt. Diese Entscheidung wird nach wie vor heftig diskutiert. Nur die Zeit wird zeigen, welche Implementierung technisch überlegen ist. Jeder &os;-Benutzer hat aber die freie Wahl zwischen den beiden Implementierungen. Ich möchte X benutzen, was muss ich tun? Wenn Sie X auf einem existierenden System installieren wollen, sollten Sie den Meta-Port x11/xorg verwenden, der alle benötigen Komponenten baut und installiert. Lesen Sie danach die Dokumentation zu &man.xorgconfig.1;, das Sie bei der Konfiguration des X-Servers für Ihre Grafikkarte, Maus usw. unterstützt. Bevorzugen Sie eine grafische Konfigurationsoberfläche, sollten Sie sich &man.xorgcfg.1; ansehen. Weitere Informationen finden sich im Abschnitt X11 des FreeBSD-Handbuchs. - Evtentuell möchten Sie sich auch den Xaccel-Server + Eventuell möchten Sie sich auch den Xaccel-Server ansehen. Nähere Details finden Sie im Abschnitt über Xi Graphics. Ich habe versucht, X zu starten, aber wenn ich startx eingebe, erhalte ich die Fehlermeldung KDENABIO failed (Operation not permitted). Was soll ich jetzt machen? Das System läuft auf einer erhöhten Sicherheitsstufe (securelevel). X kann auf einer erhöhten Sicherheitsstufe nicht gestartet werden, weil X dazu Schreibzugriff auf /dev/io benötigt. Lesen Sie dazu auch &man.init.8;. Die Frage ist also eigentlich, was Sie anders machen sollten. Sie haben zwei Möglichkeiten: Setzen Sie die Sicherheitsstufe wieder zurück auf 0 (die Einstellung erfolgt in der Regel in /etc/rc.conf) oder starten Sie &man.xdm.1; während des Starts des Systems, bevor die Sicherheitsstufe erhöht wird. Der Abschnitt enthält Informationen darüber, wie Sie &man.xdm.1; beim Start des Systems starten können. Warum funktioniert meine Maus unter X nicht? - Wenn Sie syscons (den Standard-Konsoltreiber) + Wenn Sie syscons (den Standard-Konsolentreiber) benutzen, können Sie FreeBSD so konfigurieren, dass auf jedem virtuellen Bildschirm ein Mauszeiger unterstützt wird. Um Konflikte mit X zu vermeiden, unterstützt syscons ein virtuelles Gerät mit dem Namen /dev/sysmouse. Über dieses virtuelle Gerät können andere Programme - alle Mausbewegungen und Mausclicks im MouseSystems-Format + alle Mausbewegungen und Mausklicks im MouseSystems-Format mitlesen. Falls Sie Ihre Maus auf einer oder mehreren virtuellen Konsolen und X benutzen wollen, sollten Sie zunächst lesen und dann moused installieren. Die Datei /etc/X11/xorg.conf sollte die folgenden Einträge enthalten: Section "InputDevice" Option "Protocol" "SysMouse" Option "Device" "/dev/sysmouse" ..... Einige Leute ziehen es vor, unter X /dev/mouse zu benutzen. Hierzu sollte /dev/mouse nach /dev/sysmouse gelinkt werden: &prompt.root; cd /dev &prompt.root; rm -f mouse &prompt.root; ln -s sysmouse mouse Kann ich meine Rad-Maus auch unter X benutzen? Ja. Dazu müssen Sie X nur mitteilen, dass Sie eine Maus mit 5 Tasten haben. Dazu fügen Sie die Zeilen Buttons 5 sowie ZAxisMapping 4 5 in den Abschnitt InputDevice der Datei /etc/X11/xorg.conf ein. Das Beispiel zeigt, wie ein solcher Abschnitt aussehen könnte. Abschnitt <quote>InputDevice</quote> für Rad-Mäuse in der Konfigurationsdatei von &xorg; Section "InputDevice" Identifier "Mouse1" Driver "mouse" Option "Protocol" "auto" Option "Device" "/dev/sysmouse" Option "Buttons" "5" Option "ZAxisMapping" "4 5" EndSection <quote>.emacs</quote> Beispiel für seitenweises Blättern mit einer Rad-Maus (optional) ;; wheel mouse (global-set-key [mouse-4] 'scroll-down) (global-set-key [mouse-5] 'scroll-up) X verbietet Verbindungen von entfernten Systemen! Aus Sicherheitsgründen verbietet der X-Server in der Voreinstellung Verbindungen von entfernten Systemen. Starten Sie den X-Server mit der Option , wenn Sie Verbindungen von entfernten Systemen erlauben wollen: &prompt.user; startx -listen_tcp Wieso funktionieren Menüs und Dialoge in X nicht richtig? Versuchen Sie, die Num Lock-Taste auszustellen. Falls Ihre Num Lock-Taste beim Booten standardmäßig eingeschaltet ist, sollten Sie die folgende Zeile in den Abschnitt Keyboard der Datei /etc/X11/xorg.conf einfügen: # Let the server do the NumLock processing. This should only be # required when using pre-R6 clients ServerNumLock Was ist eine virtuelle Konsole und wie erstelle ich mehr? Mit virtuellen Konsolen können Sie mehrere simultane Sitzungen auf einer Maschine laufen lassen, ohne so komplizierte Dinge wie die Einrichtung eines Netzwerkes oder die Benutzung von X zu benötigen. Wenn das System startet, wird es nach der Anzeige aller Bootmeldungen eine Eingabeaufforderung auf dem Bildschirm anzeigen. Sie können dann auf der ersten virtuellen Konsole Ihren Benutzernamen und das Passwort eingeben und anfangen, zu arbeiten (oder zu spielen!). Gelegentlich möchten Sie möglicherweise eine weitere Sitzung starten wollen, vielleicht, um die Dokumentation zu einem Programm, das Sie gerade benutzen, einzusehen, oder, um Ihre Mails zu lesen, während Sie auf das Ende einer FTP-Übertragung warten. Drücken Sie einfach Alt F2 (halten Sie die Alt-Taste gedrückt und drücken Sie die Taste F2) und Sie gelangen zur Anmelde-Aufforderung auf der zweiten virtuellen Konsole! Wenn Sie zurück zur ersten Sitzung möchten, drücken Sie Alt F1 . Die Standardinstallation von FreeBSD bietet acht aktivierte virtuelle Konsolen. Mit Alt F1 , Alt F2 , Alt F3 und so weiter wechseln Sie zwischen diesen virtuellen Konsolen. Um mehr von ihnen zu aktivieren, editieren Sie /etc/ttys und fügen Einträge für ttyv4 bis zu ttyvc nach dem Kommentar zu virtuellen Terminals ein: # Edit the existing entry for ttyv3 in /etc/ttys and change # "off" to "on". ttyv3 "/usr/libexec/getty Pc" cons25 on secure ttyv4 "/usr/libexec/getty Pc" cons25 on secure ttyv5 "/usr/libexec/getty Pc" cons25 on secure ttyv6 "/usr/libexec/getty Pc" cons25 on secure ttyv7 "/usr/libexec/getty Pc" cons25 on secure ttyv8 "/usr/libexec/getty Pc" cons25 on secure ttyv9 "/usr/libexec/getty Pc" cons25 on secure ttyva "/usr/libexec/getty Pc" cons25 on secure ttyvb "/usr/libexec/getty Pc" cons25 on secure - Benutzen Sie so wenig oder soviele, wie Sie + Benutzen Sie so wenig oder so viele, wie Sie möchten. Je mehr virtuelle Terminals Sie benutzen, desto mehr Ressourcen werden gebraucht; das kann wichtig sein, wenn Sie 8MB RAM oder weniger besitzen. Sie können auch secure in insecure ändern. Wenn Sie einen X-Server benutzen möchten, müssen Sie mindestens ein virtuelles Terminal unbenutzt (oder ausgeschaltet) lassen damit der Server es benutzen kann. Das heißt, dass Sie Pech haben, wenn Sie für jede Ihrer 12 Alt-Funktionstasten eine Anmeldeaufforderung haben möchten - Sie können das nur für elf von ihnen tun, wenn Sie einen X-Server auf derselben Maschine laufen lassen möchten. Der einfachste Weg, eine Konsole zu deaktivieren, ist, sie auszuschalten. Wenn Sie zum Beispiel die oben erwähnte volle Zuordnung aller 12 Terminals hätten, müssten Sie die Einstellung für das virtuelle Terminal 12 von: ttyvb "/usr/libexec/getty Pc" cons25 on secure in: ttyvb "/usr/libexec/getty Pc" cons25 off secure ändern. Wenn Ihre Tastatur nur über zehn Funktionstasten verfügt, bedeutet das: ttyv9 "/usr/libexec/getty Pc" cons25 off secure ttyva "/usr/libexec/getty Pc" cons25 off secure ttyvb "/usr/libexec/getty Pc" cons25 off secure (Sie können diese Zeilen auch einfach löschen.) Die einfachste (und sauberste) Möglichkeit, die virtuellen Konsolen zu aktivieren, ist, zu rebooten. Wenn Sie jedoch auf keinen Fall rebooten möchten, können Sie auch einfach das X Window System herunterfahren und als root &prompt.root; kill -HUP 1 ausführen. Es ist unbedingt erforderlich, dass Sie das X Window System vollständig herunterfahren, falls es läuft. Falls Sie es nicht tun, könnte es sein, dass sich ihr System nach der Eingabe des kill-Befehls aufhängt. Wie greife ich von X aus auf virtuelle Konsolen zu? Benutzen Sie Ctrl Alt Fn um auf eine virtuelle Konsole umzuschalten. Mit Ctrl Alt F1 würden Sie zur ersten virtuellen Konsole umschalten. Sobald Sie auf eine virtuelle Konsole umgeschaltet haben, können Sie ganz normal Alt Fn benutzen, um zwischen den einzelnen virtuellen Konsolen umzuschalten. Um zu Ihrer X-Sitzung zurückzukehren, müssen Sie auf die virtuelle Konsole umschalten, auf der X läuft. Wenn Sie X über der Eingabeaufforderung gestartet haben (z.B. mit startx), benutzt X die nächste freie virtuelle Konsole und nicht die Konsole, von der es gestartet wurde. Wenn Sie acht aktive virtuelle Konsole haben, dann wird X die neunte benutzen und Sie können mit AltF9 umschalten. Wie starte ich XDM beim Booten? Es gibt zwei Denkansätze, wie &man.xdm.1; zu starten ist. Bei dem einen wird xdm unter Nutzung des mitgelieferten Beispiels über /etc/ttys (&man.ttys.5;) gestartet, während beim zweiten Ansatz rc.local (&man.rc.8;) oder das Skript X.sh im Verzeichnis /usr/local/etc/rc.d verwendet wird. Beide Ansätze sind gleichwertig und der eine wird in Situationen funktionieren, in denen der andere es nicht tut. In beiden Fällen ist das Ergebnis das gleiche: X liefert eine graphische Anmeldeaufforderung. Die ttys-Methode hat den Vorteil, dass dokumentiert ist, auf welchem vty X gestartet wird und der Neustart des X-Servers beim Abmelden an init übergeben wird. Die rc.local-Methode erleichtert ein Killen von xdm, falls Probleme beim Start des X-Servers auftreten sollten. Beim Laden von rc.local sollte xdm ohne irgendwelche Argumente (das heißt als Daemon) gestartet werden. xdm muss gestartet werden NACHDEM getty läuft, andernfalls entsteht ein Konflikt zwischen getty und xdm und die Konsole bleibt gesperrt. Der beste Weg, um dies zu vermeiden, ist, das Skript für etwa zehn Sekunden anzuhalten und dann xdm zu starten. Wenn Sie xdm durch einen Eintrag in /etc/ttys starten lassen, kann es zu einem Konflikt zwischen xdm und &man.getty.8; kommen. Um dieses Problem zu vermeiden, sollten Sie die Nummer des vt in die Datei /usr/local/lib/X11/xdm/Xservers eintragen. :0 local /usr/local/bin/X vt4 Diese Zeile führt dazu, dass der X Server /dev/ttyv3 nutzt. Die beiden Zahlen weichen voneinander ab: Der X-Server beginnt die Zählung der vty bei 1, während der FreeBSD-Kernel bei 0 beginnt. Wieso erhalte ich die Meldung Couldn't open console, wenn ich xconsole benutze? Wenn Sie X mit startx starten, werden die Zugriffsrechte für /dev/console leider nicht geändert, was dazu führt, dass Dinge wie xterm -C und xconsole nicht funktionieren. Das hängt damit zusammen, wie die Zugriffsrechte für die Konsole standardmäßig gesetzt sind. Auf einem Mehrbenutzersystem möchte man nicht unbedingt, dass jeder Benutzer einfach auf die Systemkonsole schreiben kann. Für Benutzer, die sich auf einer Maschine direkt mit einem VTY anmelden, existiert die Datei &man.fbtab.5;, um derartige Probleme zu lösen. In Kürze: sorgen Sie dafür, dass sich eine nicht auskommentierte Zeile der Form /dev/ttyv0 0600 /dev/console in der Datei /etc/fbtab befindet. Das sorgt dafür, dass wer auch immer sich auf /dev/ttyv0 anmeldet, auch die Konsole besitzt. Früher konnte ich &xfree86; als normaler User starten. Warum sagt mir das System jetzt, dass ich root sein muss? Alle X-Server müssen mit der ID root laufen, um direkt auf die Videohardware zuzugreifen. Die älteren Versionen von &xfree86; (bis einschließlich 3.3.6) installierten alle mitgelieferten Server so, dass sie automatisch unter ID root ausgeführt werden (setuid to root). Dies stellt natürlich eine Gefahrenquelle dar, da die X-Server große, komplexe Programme sind. Alle neueren Versionen von &xfree86; installieren die Server aus genau diesem Grund nicht mehr "setuid root". Es ist natürlich nicht tragbar, den X-Server immer mit der ID root laufen zu lassen; auch aus Gründen der Sicherheit ist es keine gute Idee. Es gibt zwei Möglichkeiten, um X auch als normaler Benutzer starten zu können. Die erste ist die Verwendung von xdm oder eines ähnlichen Programms; die zweite ist die Benutzer von Xwrapper. xdm ist ein ständig laufendes Programm, mit dem Logins über eine graphische Benutzeroberfläche sind. Es wird normalerweise beim Systemstart initialisiert und für die Authentifizierung der Benutzer und den Start ihrer Sitzungen verantwortlich. Es ist also die graphische Entsprechung von &man.getty.8; und &man.login.1;. Weitere Informationen zum Thema xdm finden Sie in der &xfree86; Dokumentation und dem entsprechenden FAQ-Eintrag. Xwrapper ist eine Hülle für den X-Server. Mit diesem kleinen Utility ist es möglich, manuell den X-Server zu starten und weiterhin eine annehmbare Sicherheit zu haben. Das Tools prüft, ob die per Kommandozeile übergebenen Argumente halbwegs sinnvoll sind. Wenn dies der Fall ist, startet es den entsprechenden X-Server. Wenn Sie (aus welchem Grund auch immer) keine graphische Anmeldung wollen, ist Xwrapper die optimale Lösung. Wenn Sie die vollständige Ports-Sammlung installiert haben, finden Sie das Tool im Verzeichnis /usr/ports/x11/wrapper. Warum funktioniert meine PS/2-Maus nicht richtig? Ihre Maus und der Maustreiber sind etwas aus der Synchronisation geraten. In seltenen Fällen kann es jedoch sein, dass der Treiber fälschlicherweise Synchronisationsprobleme meldet und Sie in den Kernelmeldungen folgendes sehen: psmintr: out of sync (xxxx != yyyy) und Ihre Maus nicht richtig zu funktionieren scheint. Falls das passiert, deaktivieren Sie den Code zur Überprüfung der Synchronisation, indem Sie die Treiberangaben für den PS/2-Maustreiber auf 0x100 setzen. Rufen Sie UserConfig durch Angabe der Option am Boot-Prompt auf: boot: -c Geben sie dann in der Kommandozeile von UserConfig folgendes ein: UserConfig> flags psm0 0x100 UserConfig> quit Meine PS/2-Maus von MouseSystems scheint nicht zu funktionieren. Es wurde berichtet, dass einige Modelle der PS/2-Mäuse von MouseSystems nur funktionieren, wenn sie im hochauflösenden Modus betrieben werden. Andernfalls springt der Mauszeiger sehr oft in die linke obere Ecke des Bildschirms. Das Flag 0x04 des Maustreibers bringt die Maus in den hochauflösenden Modus. Rufen Sie UserConfig durch Angabe der Option am Boot-Prompt auf: boot: -c Geben sie dann in der Kommandozeile von UserConfig folgendes ein: UserConfig> flags psm0 0x04 UserConfig> quit Lesen Sie den vorigen Abschnitt über eine andere mögliche Ursache für Probleme mit der Maus. Wie kann ich einen anderen X-Server installieren? &os;-Versionen vor 5.3 verwendeten &xfree86; 4.X als Standard-X-Server. Seither wird &xorg; als Standard-X-Server verwendet. Wenn Sie einen anderen X-Server installieren wollen, müssen Sie die folgende Zeile in Ihre /etc/make.conf einfügen. (Existiert die Datei nicht, müssen Sie sie zuvor anlegen.) X_WINDOW_SYSTEM= xorg Diese Variable kann die Werte xorg, xfree86-4, oder xfree86-3 annehmen. Wie vertausche ich die Maustasten? Benutzen Sie den Befehl xmodmap -e "pointer = 3 2 1" in Ihrer .xinitrc oder .xsession. Wie installiere ich einen Splash-Screen und wo finde ich sie? &os; erlaubt die Anzeige von Splash-Screens während des Bootvorganges. Die Splash-Screens dürfen Bitmaps mit 256 Farben (*.BMP) oder ZSoft-PCX-Dateien *.PCX) sein. Damit sie mit normalen VGA-Karten dargestellt werden können, darf die Größe 320x200 Bildpunkte nicht überschreiten. Wenn Sie in ihrem Kernel die VESA-Unterstützung eingebunden haben, beträgt die maximale Größe 1024x768 Pixel. Die derzeitige VESA-Unterstützung kann entweder direkt durch die Kernelkonfigurationsoption VESA in den Kernel eingebunden werden, oder durch das Laden des VESA-kld-Moduls während des Bootens. Um einen Splash-Screen zu benutzen, müssen Sie die Startdateien, die den Bootprozess von &os; kontrollieren, modifizieren. Dazu müssen Sie die Datei /boot/loader.rc erstellen, die die folgenden Zeilen enthält: include /boot/loader.4th start Außerdem benötigen Sie die Datei /boot/loader.conf, die die folgenden Zeilen enthält: splash_bmp_load="YES" bitmap_load="YES" Dies setzt voraus, dass Sie /boot/splash.bmp als Ihren Splash-Screen benutzen. Wenn Sie lieber eine PCX-Datei benutzen wollen, dann kopieren Sie sie nach /boot/splash.pcx, erstellen Sie eine Datei /boot/loader.rc, wie oben beschrieben und eine Datei /boot/loader.conf, die folgendes enthält: splash_pcx_load="YES" bitmap_load="YES" bitmap_name="/boot/splash.pcx" Alles, was Sie nun brauchen, ist ein Splash-Screen. - Hierzu können Sie durch die Gallerie bei + Hierzu können Sie durch die Galerie bei surfen. Kann ich die &windows;-Tasten unter X benutzen? Ja, Sie müssen lediglich mit &man.xmodmap.1; festlegen, welche Aktion diese Tasten auslösen sollen. Unter der Annahme, dass alle &windows; Tastaturen dem Standard entsprechen, lauten die Keycodes für die drei Tasten 115 - &windows;-Taste zwischen den Alt- und Strg-Tasten auf der linken Seite 116 - &windows;-Taste rechts von der AltGr-Taste 117 - Menü-Taste, links von der rechten Strg-Taste Nach der folgenden Anweisung erzeugt die linke &windows;-Taste ein Komma. &prompt.root; xmodmap -e "keycode 115 = comma" Sie werden Ihren Window Manager wahrscheinlich neu starten müssen, damit diese Einstellung wirksam wird. Um die neue Belegung der &windows;-Tasten automatisch beim Start von X zu erhalten, könnten Sie entsprechende xmodmap Anweisungen in ihre ~/.xinitrc einfügen. Die bevorzugte Variante ist aber, eine Datei mit dem Namen ~/.xmodmaprc zu erzeugen, die nur die Parameter für den Aufruf von xmodmap enthält. Wenn Sie mehrere Tasten umdefinieren wollen, muss jede Definition in eine eigene Zeile gesetzt werden. Weiterhin müssen Sie in Ihrer ~/.xinitrc noch die folgende Zeile einfügen: xmodmap $HOME/.xmodmaprc Sie könnten die drei Tasten zum Beispiel mit den Funktionen F13, F14 und F15 belegen. Dadurch ist es sehr einfach, diese Tasten mit nützlichen Funktionen eines Programmes oder Desktops zu verknüpfen. Falls Sie das auch tun wollen, sollten in Ihrer ~/.xmodmaprc die folgenden Anweisungen stehen. keycode 115 = F13 keycode 116 = F14 keycode 117 = F15 Falls Sie zum Beispiel fvwm2 benutzen, können Sie ihn so einstellen, dass F13 das Fenster unter dem Mauszeiger minimiert bzw. maximiert. F14 holt das Fenster unter dem Mauszeiger in den Vordergrund bzw. ganz nach hinten, wenn es bereits im Vordergrund ist. F15 öffnet das Arbeitsplatz (Programme) Menü, auch wenn der Cursor nicht auf den Hintergrund zeigt. Dies ist extrem praktisch, wenn der gesamte Bildschirm von Fenster belegt wird; als kleiner Bonus gibt es sogar einen Zusammenhang zwischen dem Symbol auf der Taste und der durchgeführten Aktion. Dieses Verhalten kann man mit den folgenden Einträgen in der Datei ~/.fvwmrc erhalten: Key F13 FTIWS A Iconify Key F14 FTIWS A RaiseLower Key F15 A A Menu Workplace Nop Wird 3D Hardware Beschleunigung für &opengl; unterstützt? Dies hängt davon ab, welche Version von &xfree86; oder &xorg; und welche Grafikkarte Sie verwenden. Wenn Sie eine Karte mit NVIDIA-Chipsatz besitzen, benutzen Sie die binären Treiber für FreeBSD, die Sie auf der - Drivers-Seite von NVIDEA finden. + Drivers-Seite von NVIDIA finden. Wenn Sie &xfree86;-4 oder &xorg; mit Grafikkarten wie der Matrox G200/G400, ATI Rage 128/Radeon, oder 3dfx Voodoo 3, 4, 5, und Banshee einsetzen, erhalten Sie weitere Informationen auf der Webseite &xfree86;-4 Direct Rendering on FreeBSD. Netzwerke Woher kann ich Informationen über Diskless Booting bekommen? Diskless Booting bedeutet, dass die FreeBSD-Maschine über ein Netzwerk gebootet wird und die notwendigen Dateien von einem Server anstatt von der Festplatte liest. Vollständige Details finden Sie im Handbucheintrag über den plattenlosen Betrieb. Kann eine FreeBSD-Maschine als Netzwerkrouter genutzt werden? Ja. Genaue Informationen zu diesem Thema finden Sie im Abschnitt Gateways und Routen des Handbuchkapitels Weiterführende Netzwerkthemen. Kann ich meine &windows;-Maschine über FreeBSD ans Internet anbinden? Personen, die diese Frage stellen, haben typischerweise zwei PCs zu Hause: einen mit FreeBSD und einen mit einer &windows;-Variante. Die Idee ist, die FreeBSD-Maschine an das Internet anzubinden, um in der Lage zu sein, von der &windows;-Maschine über die FreeBSD-Maschine auf das Internet zuzugreifen. Das ist tatsächlich nur ein Spezialfall der vorherigen Frage. Das User-Mode &man.ppp.8; von &os; kennt die Option . Wenn Sie &man.ppp.8; mit der Option starten, in /etc/rc.conf die Variable gateway_enable auf YES setzen und Ihre &windows;-Maschine korrekt konfigurieren, sollte das hervorragend funktionieren. Weitere Informationen erhalten Sie in der Hilfeseite &man.ppp.8; oder im Abschnitt User-PPP des Handbuchs. Wenn Sie Kernel-Mode PPP verwenden oder ihre Verbindung zum Internet über Ethernet erstellt wurde, müssen Sie &man.natd.8; verwenden. Weitere Informationen dazu finden Sie im natd-Abschnitt des Handbuchs. Unterstützt FreeBSD SLIP und PPP? Ja. Lesen Sie die Manualpages &man.slattach.8;, &man.sliplogin.8;, &man.pppd.8; und &man.ppp.8;. &man.ppp.8; und &man.pppd.8; liefern Unterstützung sowohl für eingehende, als auch ausgehende Verbindungen. &man.sliplogin.8; behandelt ausschließlich eingehende Verbindungen und &man.slattach.8; behandelt ausschließlich ausgehende Verbindungen. Diese Programme werden im Abschnitt PPP und SLIP des Handbuchs beschrieben. Falls Sie nur durch einen Shell-Account Zugang zum Internet haben, sehen Sie sich einmal das Package net/slirp an. Es kann Ihnen (eingeschränkten) Zugang zu Diensten wie ftp und http direkt von Ihrer lokalen Maschine aus ermöglichen. Unterstützt FreeBSD NAT oder Masquerading? Ja. Wenn Sie NAT über eine User-PPP-Verbindung einsetzen wollen, lesen Sie bitte den User-PPP Abschnitt des Handbuchs. Wollen Sie NAT über eine andere Verbindung einsetzen, lesen Sie bitte den - NATD Abschnit + NATD-Abschnitt des Handbuchs. Wie verbinde ich zwei FreeBSD-Maschinen mit PLIP über die parallele Schnittstelle? Dieses Thema wird im Handbuch-Kapitel PLIP behandelt. Wieso kann ich das Gerät /dev/ed0 nicht erstellen? Weil das nicht notwendig ist. Bei Berkeley-basierten Netzwerkimplementationen kann nur vom Kernel-Code aus direkt auf Netzwerkkarten zugegriffen werden. Zur weiteren Information lesen Sie bitte die Datei /etc/rc.network und die Manualpages zu den unterschiedlichen Netzwerkprogrammen, die dort erwähnt werden. Falls Sie danach total verwirrt sind, sollten Sie sich ein Buch besorgen, das die Netzwerkadministration auf einem anderen BSD-ähnlichen Betriebssystem beschreibt; mit wenigen signifikanten Ausnahmen gleicht die Netzwerkadministration auf FreeBSD im Grunde der auf &sunos; 4.0 oder Ultrix. Wie kann ich Ethernet-Aliase einrichten? Wenn sich die zweite Adresse im gleichen Subnetz befindet wie eine der Adressen, die bereits auf dem Interface konfiguriert sind, benutzen Sie netmask 0xffffffff in Ihrer &man.ifconfig.8; Befehlszeile, wie z.B.: &prompt.root; ifconfig ed0 alias 204.141.95.2 netmask 0xffffffff Andernfalls geben sie die Adresse und die Netzmaske so an, wie sie es bei einem normalen Interface auch tun würden: &prompt.root; ifconfig ed0 alias 172.16.141.5 netmask 0xffffff00 Wie bringe ich meine 3C503 dazu, den anderen Anschluss zu benutzen? Wenn Sie die anderen Anschlüsse benutzen möchten, müssen Sie einen zusätzlichen Parameter in der &man.ifconfig.8;-Befehlszeile spezifizieren. Der Standard-Anschluss ist link0. Um den AUI-Anschluss anstelle des BNC-Anschlusses zu verwenden, benutzen Sie link2. Diese Angaben sollten durch Benutzung der Variablen ifconfig_* in der Datei /etc/rc.conf spezifiziert werden. Warum habe ich Probleme mit NFS und FreeBSD? Gewisse PC-Netzwerkkarten sind (um es gelinde auszudrücken) besser als andere und können manchmal Probleme mit netzwerkintensiven Anwendungen wie NFS verursachen. Weitere Informationen zu diesem Thema finden Sie im Handbucheintrag zu NFS. Warum kann ich per NFS nicht von einer &linux;-Maschine mounten? Einige Versionen des NFS-Codes von &linux; akzeptieren Mount-Requests nur von einem privilegierten Port. Versuchen Sie &prompt.root; mount -o -P linuxbox:/blah /mnt Warum kann ich per NFS nicht von einer Sun-Maschine mounten? Sun Workstations mit &sunos; 4.X akzeptieren Mount-Requests nur von einem privilegierten Port. Versuchen Sie &prompt.root; mount -o -P sunbox:/blah /mnt Warum meldet mir mountd auf meinem FreeBSD NFS-Server ständig can't change attributes und bad exports list? Die häufigste Ursache für dieses Problem ist, dass Sie den Aufbau der &man.exports.5; nicht oder nicht richtig verstanden haben. Überprüfen Sie Ihre &man.exports.5; und lesen das Kapitel NFS im Handbuch, speziell den Abschnitt Konfiguration. Warum habe ich Probleme, per PPP mit NeXTStep-Maschinen zu kommunizieren? Versuchen Sie, die TCP-Erweiterung in /etc/rc.conf zu deaktivieren, indem Sie die folgende Variable auf NO setzen: tcp_extensions=NO Xylogic's Annex-Maschinen arbeiten hier auch fehlerhaft und Sie müssen die obige Änderung benutzen, um über Sie Verbindungen herzustellen. Wie aktiviere ich die Unterstützung für IP-Multicast? Multicast-Host-Funktionen werden standardmäßig unterstützt. Wenn Sie Ihre Maschine als Multicast-Router betreiben wollen, müssen Sie Ihren Kernel mit der Option MROUTING neu kompilieren und &man.mrouted.8; starten. Wenn Sie die Variable mrouted_enable in der Datei /etc/rc.conf auf "YES" setzen, wird &man.mrouted.8; während des Systemstart automatisch gestartet. MBONE-Tools sind in ihrer eigenen Ports-Kategorie mbone verfügbar. Schauen Sie dort nach, wenn Sie die Konferenztools vic und vat suchen! Welche Netzwerkkarten basieren auf dem DEC-PCI-Chipsatz? Hier ist eine von Glen Foster gfoster@driver.nsta.org zusammengetragene Liste mit einigen aktuellen Ergänzungen: Netzwerkkarten mit DEC-PCI-Chipsatz Vendor Model ASUS PCI-L101-TB Accton ENI1203 Cogent EM960PCI Compex ENET32-PCI D-Link DE-530 Dayna DP1203, DP2100 DEC DE435, DE450 Danpex EN-9400P3 JCIS Condor JC1260 Linksys EtherPCI Mylex LNP101 SMC EtherPower 10/100 (Modell 9332) SMC EtherPower (Model 8432) TopWare TE-3500P Znyx (2.2.X) ZX312, ZX314, ZX342, ZX345, ZX346, ZX348 Znyx (3.X) ZX345Q, ZX346Q, ZX348Q, ZX412Q, ZX414, ZX442, ZX444, ZX474, ZX478, ZX212, ZX214 (10mbps/hd)
Warum muss ich für Hosts auf meiner Site den FQDN benutzen? Sie werden wahrscheinlich feststellen, dass der Host sich tatsächlich in einer anderen Domäne befindet; wenn Sie sich zum Beispiel in foo.example.org befinden und einen Host namens mumble in der Domäne example.org erreichen wollen, werden Sie den fully-qualified Domainnamen mumble.example.org, anstatt nur mumble benutzen müssen. Traditionell war dies bei BSD-BIND-Resolvern erlaubt. Die aktuelle Version von bind, die mit FreeBSD ausgeliefert wird, ermöglicht jedoch nicht mehr die standardmäßige Abkürzung von nicht-fully-qualified Domainnamen für andere als ihre eigene Domäne. Ein nicht-qualifizierter Host mumble muss also entweder als mumble.foo.example.org gefunden werden, oder er wird in der Hauptdomäne gesucht. Dies unterscheidet sich vom vorherigen Verhalten, wo die Suche über mumble.example.org und mumble.edu fortgesetzt wurde. Werfen Sie einen Blick in RFC 1535, um zu erfahren, warum dies als schlechter Stil oder sogar als eine Sicherheitslücke betrachtet wurde. Als Abhilfe können Sie die Zeile search foo.example.org example.org anstelle der vorherigen domain foo.example.org in Ihre Datei /etc/resolv.conf einfügen. Stellen Sie jedoch sicher, dass die Suchreihenfolge nicht über die Grenze zwischen lokaler und öffentlicher Administration, wie RFC 1535 sie nennt, hinausreicht. Wieso erhalte ich bei allen Netzwerkoperationen die Meldung Permission denied? Dieses Problem kann auftreten, wenn Sie einen Kernel mit der Option IPFIREWALL erstellt haben. In der Voreinstellung werden alle Pakete, die nicht explizit erlaubt wurden, blockiert. Falls sie Ihr System unbeabsichtigt als Firewall konfiguriert haben, können Sie die Netzwerkfunktionalität wiederherstellen, indem Sie als root folgendes eingeben: &prompt.root; ipfw add 65534 allow all from any to any Sie können in /etc/rc.conf auch firewall_type="open" setzen. Weitere Informationen über die Konfiguration einer FreeBSD-Firewall finden Sie im Kapitel Firewalls des Handbuchs. Wie viele Einbußen zieht IPFW nach sich? Diese Frage wird im Handbuch-Kapitel Firewalls im Abschnitt IPFW Overhead und Optimierung ausführlich behandelt. Warum kann ich bei &man.ipfw.8; einen Dienst nicht mit fwd auf eine andere Maschine umlenken? Der wahrscheinlichste Grund ist, dass Sie Network Address Translation (NAT) brauchen und nicht die einfache Weiterleitung von Pakete. Die fwd Anweisung macht genau das, was da steht: Sie leitet Pakete weiter; die Daten in den Paketen werden aber nicht verändert. Ein Beispiel: 01000 fwd 10.0.0.1 from any to foo 21 Wenn ein Paket mit dem Ziel foo die Maschine mit dieser Regel erreicht, wird das Paket an 10.0.0.1 weitergeleitet; die Zieladresse im Paket lautet aber immer noch foo! Die Zieladresse wird nicht in 10.0.0.1 geändert. Die meisten Rechner werden allerdings Pakete verwerfen, wenn die Zieladresse des Paketes nicht mit der Adresse des Rechners übereinstimmt. Das ist der Grund, warum eine fwd Regel oft nicht den Effekt hat, den der Benutzer wollte. Dieses Verhalten ist aber kein Fehler, sondern erwünscht. Wenn Sie einen Dienst auf eine andere Maschine umleiten wollen, sollten Sie sich den FAQ-Eintrag über die Umleitung von Diensten oder die Online-Hilfe zu &man.natd.8; durchlesen. Auch in der Ports Sammlung sind diverse Hilfsprogramme für diesen Zweck enthalten. Wie kann ich Service-Requests von einer Maschine auf eine andere umleiten? Sie können FTP-Requests (und andere Dienste) mit dem Package socket umleiten, das im Ports-Tree in der Kategorie sysutils verfügbar ist. Ersetzen sie die Befehlszeile für den Dienst einfach so, dass stattdessen socket aufgerufen wird, zum Beispiel so: ftp stream tcp nowait nobody /usr/local/bin/socket socket ftp.example.com ftp wobei ftp.example.com und ftp entsprechend der Host und der Port sind, wohin umgeleitet werden soll. Woher kann ich ein Bandbreiten-Managementtool bekommen? Für FreeBSD gibt es drei Bandbreiten-Managementtools. &man.dummynet.4; ist als Teil von &man.ipfw.4; in FreeBSD integriert. ALTQ ist für FreeBSD 4.X kostenlos verfügbar und seit FreeBSD 5.X als Bestandteil von &man.pf.4; im Basissystem enthalten. Bei Bandwidth Manager von Emerging Technologies handelt es sich hingegen um ein kommerzielles Produkt. Warum erhalte ich die Meldung /dev/bpf0: device not configured? Der Berkeley-Paket-Filter (&man.bpf.4;) muss in den Kernel eingebunden werden, bevor er von einem Programme aus genutzt werden kann. Fügen Sie folgendes zu Ihrer Kernelkonfigurationsdatei hinzu und erstellen Sie einen neuen Kernel: pseudo-device bpf # Berkeley Packet Filter Unter FreeBSD 4.X und früheren Versionen müssen Sie noch die Gerätedateien erstellen. Wechseln Sie dazu nach dem Neustart in das Verzeichnis /dev und führen Sie den folgenden Befehl aus: &prompt.root; sh MAKEDEV bpf0 Weitere Informationen über den Umgang mit Geräten finden Sie im Handbucheintrag über Device Nodes. Habe ich, analog zum smbmount von &linux;, eine Möglichkeit, auf ein freigegebenes Laufwerk einer &windows;-Maschine in meinem Netzwerk zuzugreifen? Benutzen Sie die Kernel-Erweiterungen und Benutzerprogramme aus dem Programmpaket SMBFS. Das Paket und weitergehende Informationen sind unter net/smbfs in den Ports verfügbar; ab der Version 4.5 ist SMBFS Bestandteil des Basissystems. Was bedeutet die Meldung icmp-response bandwidth limit 300/200 pps in meinen Logfiles? Mit dieser Meldung teilt Ihnen der Kernel mit, dass irgend jemand versucht, ihn zur Generierung von zu vielen ICMP oder TCP reset (RST) Antworten zu provozieren. ICMP Antworten sind oft das Ergebnis von Verbindungsversuchen zu unbenutzten UDP Ports. TCP Resets werden generiert, wenn jemand versucht, eine Verbindung zu einem ungenutzten TCP Port aufzubauen. Die Meldungen können unter anderem durch die folgenden Ereignisse ausgelöst werden: Denial of Service (DoS) Angriffe mit der Brechstange (und nicht durch Angriffe mit einzelnen Paketen, die gezielt eine Schwachstelle des Systems ausnutzen sollen). Port Scans, bei denen versucht wird, Verbindungen zu einer großen Anzahl von Ports (und nicht nur einigen bekannten Ports) herzustellen. Die erste Zahl gibt an, wie viele Pakete vom Kernel ohne das Limit versendet worden wären; die zweite Zahl gibt das Limit an. Sie können das Limit mit Hilfe der sysctl-Variable net.inet.icmp.icmplim einstellen. Im Beispiel wird das Limit auf 300 Pakete pro Sekunde gesetzt: &prompt.root; sysctl -w net.inet.icmp.icmplim=300 Wenn Sie zwar die Begrenzung benutzen möchten, aber die Meldungen nicht in Ihren Logfiles sehen möchten, können Sie die Meldungen mit der sysctl-Variable net.inet.icmp.icmplim_output abschalten: &prompt.root; sysctl -w net.inet.icmp.icmplim_output=0 Falls Sie die Begrenzung ganz abschalten wollen, können Sie die Sysctl-Variable net.inet.icmp.icmplim auf 0. Wir raten Ihnen aus den oben genannten Gründen dringend von diesem Schritt ab. Was bedeutet die Meldung arp: unknown hardware address format? Ein Gerät im lokalen Ethernet verwendet eine MAC-Adresse in einem Format, das FreeBSD nicht kennt. Der wahrscheinlichste Grund ist, dass jemand Experimente mit einer Ethernet-Karte anstellt. Die Meldung tritt sehr häufig in Netzwerken mit Cable Modems auf. Die Meldung ist harmlos und sollte die Performance Ihres Systems nicht negativ beeinflussen. Ich habe gerade CVSup installiert, aber das Programm bricht mit Fehlermeldungen ab. Was ist da schief gelaufen? Schauen Sie bitte zuerst nach, ob Sie eine Fehlermeldung wie die unten gezeigte erhalten. /usr/libexec/ld-elf.so.1: Shared object "libXaw.so.6" not found Solche Fehlermeldungen erhalten Sie, wenn Sie den net/cvsup Port auf einer Maschine installieren, die kein &xfree86;-System besitzt. Wenn Sie das GUI von CVSup benutzen wollen, müssen Sie &xfree86; installieren. Wenn Sie CVSup nur auf der Kommandozeile benutzen wollen, entfernen Sie bitte den Port, den Sie gerade installiert haben. Installieren Sie stattdessen den Port net/cvsup-without-gui. Genauere Informationen finden Sie im CVSup Abschnitt des Handbuchs.
Sicherheit Was ist ein Sandkasten (sandbox)? Sandkasten (sandbox) ist ein Ausdruck aus dem Bereich Sicherheit. Er hat zwei Bedeutungen: Ein Programm, das innerhalb virtueller Wände ausgeführt wird. Wenn ein Angreifer über eine Sicherheitslücke in diesen Programm einbricht, verhindern diese Wände ein tieferes Vordringen in das System. Man sagt: Der Prozess kann innerhalb der Wände spielen, das heißt nichts, was der Prozess in Bezug auf die Ausführung von Code tut, kann die Wände durchbrechen. Es ist - also keine detailierte Revision des Codes + also keine detaillierte Revision des Codes erforderlich, um gewisse Aussagen über seine Sicherheit machen zu können. Die Wände könnten z.B. eine Benutzerkennung sein. Dies ist die Definition, die in den Hilfeseiten &man.security.7; und &man.named.8; benutzt wird. Nehmen Sie zum Beispiel den Dienst ntalk (siehe auch /etc/inetd.conf). Dieser Dienst ist früher mit der Benutzerkennung root gelaufen; nun läuft er mit der Benutzerkennung tty. Der Benutzer tty ist ein Sandkasten, der dazu gedacht ist, es jemandem, der über ntalk erfolgreich in das System eingebrochen ist, schwer zu machen, über diese Benutzerkennung hinaus vorzudringen. Ein Prozess, der sich innerhalb einer simulierten Maschine befindet. Dies ist etwas fortgeschrittener; grundsätzlich bedeutet es, dass jemand, der in der Lage ist, in einen Prozess einzudringen, annehmen könnte, er könnte weiter in die Maschine eindringen, tatsächlich aber nur in eine Simulation der Maschine einbricht und keine echten Daten verändert. Der gängigste Weg, dies zu erreichen, ist, in einem Unterverzeichnis eine simulierte Umgebung zu erstellen und den Prozess in diesem Verzeichnis mit chroot auszuführen (für diesen Prozess ist / dieses Verzeichnis und nicht das echte / des Systems). Eine weitere gebräuchliche Anwendung ist, ein untergeordnetes Dateisystem nur mit Leserechten zu mounten, und dann darüber eine Dateisystemebene zu erstellen, die einem Prozess einen scheinbar schreibberechtigten Blick in das Dateisystem gibt. Der Prozess mag glauben, dass er in der Lage ist, diese Dateien zu verändern, aber nur der Prozess sieht diesen Effekt - andere Prozess im System natürlich nicht. Es wird versucht, diese Art von Sandkasten so transparent zu gestalten, dass der Benutzer (oder Hacker) nicht merkt, dass er sich in ihm befindet. Ein &unix; System implementiert zwei Arten von Sandkästen - eine auf Prozessebene und die andere auf der Ebene der Benutzerkennung. Jeder Prozess auf einem &unix; System ist komplett von allen anderen Prozessen abgeschirmt. Ein Prozess kann den Adressraum eines anderen Prozesses nicht modifizieren. Das ist anders als bei &windows;, wo ein Prozess leicht den Adressraum eines anderen überschreiben kann, was zu einem Absturz führt. Ein Prozess gehört einer bestimmten Benutzerkennung. Falls die Benutzerkennung nicht die von root ist, dient sie dazu, den Prozess von Prozessen anderer Benutzer abzuschirmen. Die Benutzerkennung wird außerdem dazu genutzt, Daten auf der Festplatte abzuschirmen. Was sind die Sicherheitsstufen? Die Sicherheitsstufen sind ein Sicherheitsmechanismus, der im Kernel angesiedelt ist. Wenn die Sicherheitsstufe einen positiven Wert hat, verhindert der Kernel die Ausführung bestimmter Tätigkeiten; nicht einmal der Super-User (also root) darf sie durchführen. Zurzeit können über die Sicherheitsstufen unter anderem die folgenden Tätigkeiten geblockt werden: Änderungen bestimmter Dateiattribute, wie zum Beispiel schg (das "system immutable" Attribut) Schreibender Zugriff auf die Speicherbereiche des Kernels mittels /dev/mem und /dev/kmem. Laden von Kernel-Modulen. Änderungen an den Firewall-Regeln. Um die eingestellte Sicherheitsstufe eines aktiven Systems abzufragen, reicht das folgende einfache Kommando: &prompt.root; sysctl kern.securelevel Die Ausgaben wird den Namen der &man.sysctl.8;-Variablen (in diesem Fall kern.securelevel) und eine Zahl enthalten. Die Zahl ist der aktuelle Wert der Sicherheitsstufe. Wenn die Zahl positiv - (größer als Null) ist, sind zumindestens einige + (größer als Null) ist, sind zumindest einige der Schutzmaßnahmen aktiviert. Sie können die Sicherheitsstufe eines laufenden Systems nicht verringern, da dies den Mechanismus wertlos machen würden. Wenn Sie eine Tätigkeit ausführen müssen, bei der die Sicherheitsstufe nicht-positiv sein muss (z.B. ein installworld oder eine Änderung der Systemzeit), dann müssen Sie die entsprechende Einstellung in /etc/rc.conf ändern (suchen Sie nach den Variablen kern_securelevel und kern_securelevel_enable) und das System rebooten. Weitere Informationen über die Sicherheitsstufen und genaue Informationen, was die Einstellungen bewirken, können Sie der Online-Hilfe &man.init.8; entnehmen. Die Sicherheitsstufen sind kein magischer Zauberstab, der alle Ihre Problem löst; es gibt viele bekannte Probleme. Und in der Mehrzahl der Fälle vermitteln sie ein falsches Gefühl der Sicherheit. Eines der größten Probleme ist, dass alle für den Start des Systems benötigten Dateien geschützt sein müssen, damit die Sicherheitsstufe effektiv sein können. Wenn es ein Angreifer schafft, seine eigenen Programme ausführen zu lassen, bevor die Sicherheitsstufe gesetzt wird (was leider erst gegen Ende des Startvorgangs erfolgen kann, da viele der notwendigen Tätigkeiten für den Systemstart nicht mit einer gesetzten Sicherheitsstufe möglich wären), werden die Schutzmechanismen ausgehebelt. Es ist zwar nicht technisch unmöglich, alle beim Systemstart genutzten Dateien zu schützen; allerdings würde in einem so geschützten System die Administration zu einem Alptraum, da man das System neu starten oder in den Single-User Modus bringen müsste, um eine Konfigurationsdatei ändern zu können. Dieses und andere Probleme werden häufig auf den Mailinglisten diskutiert, speziell auf auf der Mailingliste &a.security;. Das verfügbare Archiv enthält ausgiebige Diskussionen. Einige Benutzer sind guter Hoffnung, dass das System der Sicherheitsstufen bald durch ein besser konfigurierbares System ersetzt wird, aber es gibt noch keine definitiven Aussagen. Fühlen Sie sich gewarnt. Wieso wartet BIND (named) sowohl auf Port 53 als auch auf einem hohen Port auf Anfragen? FreeBSD benutzt eine Version von BIND, die einen Port mit einer hohen, zufälligen Nummer für den Versand von Anfragen nutzt. Wenn Sie Port 53 für abgehende Anfragen benutzen wollen, um durch eine Firewall zu kommen oder sich einfach nur besser zu fühlen, können die folgenden Zeilen in /etc/namedb/named.conf eintragen. options { query-source address * port * 53; }; Wenn Sie möchten, können Sie statt * auch eine einzelne IP-Adresse eintragen, um die Dinge noch weiter einzuschränken. Ach übrigens, herzlichen Glückwunsch. Es ist eine sehr gute Angewohnheit, die Ausgaben von &man.sockstat.1; durchzusehen und auf merkwürdige Dinge zu achten. Wieso wartet sendmail neuerdings sowohl auf Port 587 als auch auf dem Standard-Port 25 auf Anfragen? Aktuelle sendmail-Versionen unterstützen eine neue Technik zur Einlieferung von Mails, die Port 587 nutzt. Diese Technik wird zwar noch nicht oft angewendet, erfreut sich aber ständig steigender Popularität. Woher kommt dieser Benutzer toor mit UID 0? Ist mein System gehackt worden? Keine Panik. toor ist ein alternativer Account für den Super-User (wenn man root rückwärts schreibt, erhält man toor). Früher wurde er nur erzeugt, wenn die Shell &man.bash.1; installiert wurde, heute wird er auf jeden Fall erzeugt. Dieser Account ist für die Verwendung mit einer alternativen Shell vorgesehen; damit ist es nicht mehr erforderlich, die Shell von root zu ändern. Dies ist wichtig, wenn eine Shell verwendet wird, die nicht zum Lieferumfang von FreeBSD gehört, zum Beispiel aus einem Port oder einem Package. Diese Shells werden in der Regel in /usr/local/bin installiert und dieses Verzeichnis liegt standardmäßig auf einem anderem Filesystem. Wenn die Shell von root in /usr/local/bin liegt und /usr (oder das Filesystem, auf dem /usr/local/bin liegt) nicht gemountet werden kann, kann sich root nicht mehr einloggen, um das Problem zu beheben. Es ist allerdings möglich, das System zu rebooten und das Problem im Single-User Modus zu lösen, da man hier gefragt wird, welche Shell benutzt werden soll. Einige Anwender benutzen toor mit einer alternativen Shell für die tägliche Arbeit und benutzen root (mit der Standard-Shell) für den Single-User Modus und für Notfälle. Standardmäßig kann man sich nicht als toor anmelden, da der Account kein gültiges Passwort hat; Sie müssen sich also als root anmelden und ein Passwort für toor setzen, wenn Sie diesen Account benutzen wollen. Warum funktioniert suidperl nicht richtig? Aus Sicherheitsgründen wird suidperl standardmäßig ohne das SUID-Bit installiert. Der Systemadministrator kann das normale Verhalten mit dem folgenden Befehl herstellen: &prompt.root; chmod u+s /usr/bin/suidperl Wenn Sie wollen, dass suidperl auch beim Update via Sourcecode das SUID-Bit erhält, müssen Sie in /etc/make.conf die Zeile ENABLE_SUIDPERL=true einfügen, bevor Sie perl bauen. PPP Ich bekomme &man.ppp.8; nicht zum Laufen. Was mache ich falsch? Sie sollten zuerst &man.ppp.8; (die Manualpage zu ppp) und den Abschnitt zu PPP im Handbuch lesen. Aktivieren Sie das Logging mit folgendem Befehl: set log Phase Chat Connect Carrier lcp ipcp ccp command Dieser Befehl kann an der Eingabeaufforderung von &man.ppp.8; eingegeben oder in die Konfigurationsdatei /etc/ppp/ppp.conf eingetragen werden (der beste Ort hierfür ist der Anfang des Abschnitts default. Stellen Sie sicher, dass die Datei /etc/syslog.conf die folgenden Zeilen enthält: !ppp *.* /var/log/ppp.log und, dass die Datei /var/log/ppp.log existiert. Sie können nun über die Logfiles eine Menge darüber herausfinden, was geschieht. Es macht nichts, wenn die Einträge in den Logfiles Ihnen gar nichts sagen. Wenn Sie jemandem um Hilfe bitten müssen, könnten sie für ihn von Nutzen sein. Warum hängt sich ppp auf, wenn ich es benutze? Das liegt meistens daran, dass Ihr Rechnername nicht aufgelöst werden kann. Um dieses Problem zu lösen, müssen Sie sicherstellen, dass die Datei /etc/hosts von Ihrem Resolver zuerst genutzt wird. Dazu muss in der Datei /etc/host.conf der Eintrag hosts an die erste Stelle gesetzt werden. Erstellen Sie dann einfach für Ihren lokalen Rechner einen Eintrag in der Datei /etc/hosts. Falls Sie kein lokales Netzwerk besitzen, ändern Sie die localhost-Zeile: 127.0.0.1 foo.example.com foo localhost Andernfalls fügen Sie einfach einen weiteren Eintrag für Ihren lokalen Rechner hinzu. Weitere Details finden Sie in den betreffenden Manualpages. Wenn Sie fertig sind sollten Sie ping -c1 `hostname` erfolgreich ausführen können. Warum wählt &man.ppp.8; im -auto-Modus nicht? Überprüfen Sie zunächst, ob Sie einen Standard-Gateway eingestellt haben. Wenn Sie netstat -rn ausführen, sollten Sie zwei Einträge ähnlich den folgenden sehen: Destination Gateway Flags Refs Use Netif Expire default 10.0.0.2 UGSc 0 0 tun0 10.0.0.2 10.0.0.1 UH 0 0 tun0 Hier wird angenommen, dass Sie die Adressen aus dem Handbuch, der Manualpage oder aus der Datei ppp.conf.sample benutzt haben. Falls Sie keine Standardroute haben, kann es daran liegen, dass Sie eine alte Version von &man.ppp.8; benutzen, die das Wort HISADDR in der Datei ppp.conf nicht versteht. Ein weiterer Grund dafür, dass die Zeile für die Standardroute fehlt, könnte der sein, dass Sie fälschlicherweise eine Standardroute in der Datei /etc/rc.conf eingetragen und die folgende Zeile in ppp.conf ausgelassen haben: delete ALL Lesen Sie in diesem Fall den Abschnitt Abschließende Systemkonfiguration des Handbuchs. Was bedeutet No route to host? Dieser Fehler beruht für gewöhnlich auf einem fehlenden Abschnitt MYADDR: delete ALL add 0 0 HISADDR in Ihrer Datei /etc/ppp/ppp.linkup. Er ist nur notwendig, wenn Sie eine dynamische IP-Adresse besitzen oder die Adresse Ihres Gateways nicht kennen. Wenn Sie den interaktiven Modus benutzen, können Sie folgendes eingeben, nachdem Sie in den packet mode gelangt sind (den Paket Modus erkennen Sie an PPP im Prompt): delete ALL add 0 0 HISADDR Weitere Details finden Sie im Abschnitt PPP und Dynamische IP-Adressen des Handbuchs. Wieso werden meine Verbindungen nach ca. drei Minuten beendet? Der Standardtimeout für &man.ppp.8; beträgt drei Minuten. Er kann durch die Zeile set timeout NNN eingestellt werden, wobei NNN die Inaktivität in Sekunden, bevor die Verbindung geschlossen wird, angibt. Falls NNN Null ist, wird die Verbindung niemals aufgrund eines Timeouts geschlossen. Es ist möglich, diesen Befehl in die Datei ppp.conf einzubinden, oder ihn an der Eingabeaufforderung im interaktiven Modus einzugeben. Durch eine Verbindung zum Server-Socket von ppp über &man.telnet.1; oder &man.pppctl.8; ist es auch möglich, den Timeout bei aktiver Verbindung anzupassen. Weitere Details finden Sie in der Manualpage &man.ppp.8;. Wieso bricht meine Verbindung bei hoher Auslastung ab? Falls Sie Link-Quality-Reporting (LQR) konfiguriert haben, ist es möglich, dass zu viele LQR-Pakete zwischen Ihrer Maschine und dem verbundenen Rechner verloren gehen. ppp folgert daraus, dass die Verbindung nicht in Ordnung ist und schließt sie. Vor FreeBSD Version 2.2.5 war LQR standardmäßig aktiviert; nun ist es standardmäßig deaktiviert. Es kann durch folgende Zeile deaktiviert werden: disable lqr Warum brechen meine Verbindungen nach unbestimmter Zeit zusammen? Wenn die Qualität Ihrer Telefonleitung zu schlecht oder bei Ihrem Anschluss die Option (Telekomdeutsch: das Leistungsmerkmal) Anklopfen aktiviert ist, kann es manchmal vorkommen, dass Ihr Modem auflegt, weil es (fälschlicherweise) annimmt, dass es das Trägersignal verloren hat. Bei den meisten Modems gibt es eine Einstellmöglichkeit, um anzugeben, wie tolerant es gegenüber vorübergehenden Verlusten des Trägersignals sein soll. Bei einem USR &sportster; wird dies zum Beispiel im Register S10 in Zehntelsekunden angegeben. Um Ihr Modem toleranter zu machen, können Sie zu Ihrem Wählbefehl die folgende Sende-Empfangs-Sequenz hinzufügen: set dial "...... ATS10=10 OK ......" Weitere Information sollten Sie dem Handbuch Ihres Modems entnehmen können. Warum hängen meine Verbindung nach einer unbestimmten Zeit? Viele Leute machen Erfahrungen mit hängenden Verbindungen ohne erkennbaren Grund. Als erstes muss festgestellt werden, welche Seite der Verbindung hängt. Wenn Sie ein externes Modem benutzen, können Sie einfach versuchen, &man.ping.8; zu benutzen, um zu sehen, ob die TD-Anzeige aufleuchtet, wenn Sie Daten übertragen. Falls sie aufleuchtet (und die RD-Anzeige nicht), liegt das Problem am anderen Ende. Falls TD nicht aufleuchtet, handelt es sich um ein lokales Problem. Bei einem internen Modem müssen Sie den Befehl set server in Ihrer Datei ppp.conf benutzen. Stellen Sie über &man.pppctl.8; eine Verbindung zu &man.ppp.8; her, wenn die Verbindung hängt. Falls Ihre Netzwerkverbindung plötzlich wieder funktioniert (ppp wurde durch die Aktivität auf dem Diagnose-Socket wiederbelebt) oder Sie keine Verbindung bekommen (vorausgesetzt, der Befehl set socket wurde beim Start erfolgreich ausgeführt), handelt es sich um ein lokales Problem. Falls Sie eine Verbindung bekommen und die externe Verbindung weiterhin hängt, aktivieren Sie lokales asynchrones Logging mit set log local async und benutzen Sie &man.ping.8; von einem anderen Fenster oder Bildschirm aus, um die externe Verbindung zu benutzen. Das asynchrone Logging zeigt Ihnen, welche Daten über die Verbindung gesendet und empfangen werden. Falls Daten hinausgehen, aber nicht zurückkommen, handelt es sich um ein externes Problem. Wenn Sie festgestellt haben, ob es sich um ein lokales oder um ein externes Problem handelt, haben Sie zwei Möglichkeiten: Wenn es ein externes Problem ist, lesen Sie bitte bei weiter. Handelt es sich um ein lokales Problem, lesen Sie bitte . Was kann ich machen, wenn die Gegenstelle nicht antwortet? Hier können Sie wenig tun. Die meisten ISPs werden ablehnen, Ihnen zu helfen, wenn Sie kein Betriebssystem von Microsoft benutzen. Sie können enable lqr in Ihrer Datei ppp.conf angeben, wodurch &man.ppp.8; ermöglicht wird, ein externes Versagen zu erkennen und aufzulegen, aber diese Erkennung ist relativ langsam und deshalb nicht besonders nützlich. Evtl. sagen Sie Ihrem ISP nicht, dass Sie user-PPP benutzen... Versuchen Sie zunächst, jegliche Datenkompression auszuschalten, indem Sie folgendes zu Ihrer Konfiguration hinzufügen: disable pred1 deflate deflate24 protocomp acfcomp shortseq vj deny pred1 deflate deflate24 protocomp acfcomp shortseq vj Stellen Sie nun wieder eine Verbindung her, um festzustellen, ob sich etwas geändert hat. Falls es nun besser läuft oder falls das Problem vollständig behoben ist, versuchen Sie durch schrittweises Ändern der Einstellungen festzustellen, welche Einstellung den Unterschied bewirkt. Hierdurch erhalten Sie schlüssige Fakten für ein Gespräch mit Ihrem ISP (andererseits wird hierdurch offensichtlich, dass Sie kein Microsoft-Produkt benutzen). Aktivieren Sie asynchrones Logging und warten Sie, bis die Verbindung wieder hängt, bevor Sie sich an Ihren ISP wenden. Hierzu kann einiges an Plattenplatz nötig sein. Die Daten, die als letztes von dem Port gelesen wurden, könnten von Interesse sein. Für gewöhnlich handelt es sich um ASCII-Text, der sogar den Fehler beschreiben kann (Memory fault, core dumped). Falls Ihr ISP hilfsbereit ist, sollte er in der Lage sein, an seinem Ende das Logging zu aktivieren und wenn das nächste Mal die Verbindung abbricht, könnte er Ihnen mitteilen, worin das Problem auf seiner Seite besteht. Gerne können Sie Details auch an &a.brian; schicken, oder Ihren ISP bitten, sich direkt an ihn zu wenden. Was kann ich tun, wenn sich &man.ppp.8; aufhängt? In diesem Fall erstellen Sie am besten &man.ppp.8; neu, indem Sie CFLAGS+=-g und STRIP= am Ende des Makefiles einfügen und dann make clean && make && make install ausführen. Suchen Sie die Prozessnummer von &man.ppp.8; mit ps ajxww | fgrep ppp, wenn &man.ppp.8; sich aufhängt und führen Sie gdb ppp PID aus. Am gdb-Prompt können Sie bt benutzen, um einen Auszug des Stacks zu erhalten. Senden Sie die Ergebnisse an &a.brian;. Warum passiert nach der Nachricht Login OK! nichts? - Bei Freebsd-Versionen vor 2.2.5 wartete &man.ppp.8; + Bei &os;-Versionen vor 2.2.5 wartete &man.ppp.8; darauf, dass der Partner das Line Control Protocol (LCP) initiiert. Viele ISPs starten nicht mit der Initiierung, sondern erwarten dies vom Client. Benutzen Sie die folgende Zeile, um &man.ppp.8; zu veranlassen, LCP zu initiieren: set openmode active Für gewöhnlich schadet es nicht, wenn beide Seiten versuchen, Verhandlungen einzuleiten. Deshalb ist openmode nun standardmäßig aktiv. Im nächsten Abschnitt wird allerdings erklärt, in welchen Fällen es doch schadet. Ich sehe ständig Fehlermeldungen über gleiche Magic Numbers Was heißt das? Nach dem Aufbau einer Verbindung kann es sein, dass Sie in der Logdatei gelegentlich Meldungen mit dem Hinweis magic is the same sehen. Manchmal sind diese Meldungen harmlos und manchmal bricht die eine oder andere Seite die Verbindung ab. Die meisten Implementationen von PPP können dieses Problem nicht handhaben und Sie werden wiederholte Konfigurationsanforderungen und -bestätigungen in der Logdatei finden, bis &man.ppp.8; schließlich aufgibt und die Verbindung beendet. Dies geschieht normalerweise auf Servern mit langsamen Festplatten, bei denen ein getty auf dem Port ausgeführt und &man.ppp.8; nach dem Einloggen von einem Login-Skript oder einem Programm aus gestartet wird. Ich habe auch davon gehört, dass dies bei der Benutzung von slirp regelmäßig auftritt. Der Grund hierfür ist, dass das ppp auf der Client-Seite in der Zeit, die benötigt wird, getty zu beenden und ppp zu starten, bereits beginnt, Line Control Protocol (LCP) Pakete zu senden. Da ECHO auf dem Serverport weiterhin eingeschaltet ist, werden diese Pakete zum &man.ppp.8; auf der Client-Seite reflektiert. Ein Teil der LCP-Verhandlungen ist die Einrichtung einer Magic Number für jede Seite der Verbindung, damit Echos erkannt werden können. Das Protokoll besagt, dass, wenn der Partner versucht, die gleiche Magic Number auszuhandeln, ein NAK zurückgesendet und eine neue "Magic Number" gewählt werden soll. Während der Server das ECHO eingeschaltet hat, sendet der Client LCP Pakete, sieht die gleiche Magic Number im reflektierten Paket und erzeugt ein NAK. Er sieht auch das reflektierte NAK (was bedeutet, dass &man.ppp.8; seine "Magic Number" ändern muss). Hierdurch wird eine Vielzahl von Änderungen der Magic Number hervorgerufen, die sich allesamt im tty-Puffer des Servers ansammeln. Sobald &man.ppp.8; auf dem Server startet, wird es mit Änderungen der Magic Number überflutet und entscheidet, dass es sich zur Genüge mit den LCP-Verhandlungen beschäftigt hat und gibt auf. Und während sich der Client noch darüber freut, dass er keine weiteren Reflexionen sieht, wird ihm gemeldet, dass der Server auflegt. Dies kann verhindert werden, indem dem Partner durch die folgende Zeile in der Datei ppp.conf erlaubt wird, mit der Verhandlung zu beginnen: set openmode passive Hierdurch wird &man.ppp.8; mitgeteilt, darauf zu warten, dass der Server mit den LCP-Verhandlungen beginnt. Einige Server starten jedoch nie mit der Verhandlungen; falls dies der Fall ist, können Sie folgendes tun: set openmode active 3 Hierdurch bleibt &man.ppp.8; für drei Sekunden passiv und fängt dann erst an, LCP-Anforderungen zu senden. Falls der Partner während dieser Zeit beginnt, Anforderungen zu senden, wird &man.ppp.8; direkt antworten und nicht erst, nachdem die drei Sekunden abgelaufen sind. Die LCP-Verhandlungen dauern an, bis die Verbindung geschlossen wird. Was mache ich falsch? Es gibt eine Fehlfunktion in der Implementierung von &man.ppp.8;, die darin besteht, dass LCP-, CCP- & IPCP-Antworten nicht mit den ursprünglichen Anforderungen assoziiert werden. Für den Fall, dass eine Implementation von PPP mehr als sechs Sekunden langsamer ist, als die andere Seite, resultiert das darin, dass die andere Seite zwei weitere LCP-Konfigurationsanforderungen sendet, was fatale Auswirkungen hat. Stellen Sie sich vor, wir hätten es mit zwei Implementierungen A und B zu tun. A beginnt unmittelbar nach der Verbindung, LCP-Anforderungen zu senden und B benötigt sieben Sekunden, zu starten. Wenn B startet, hat A bereits drei LCP-Anforderungen gesendet. Wir nehmen an, dass ECHO ausgeschaltet ist; andernfalls würden wir Probleme mit der "Magic Number" beobachten, wie bereits im vorherigen Abschnitt beschrieben. B sendet eine Anforderung und anschließend eine Bestätigung der ersten Anforderung von A. Dies führt dazu, dass A in den Zustand OPENED übergeht und eine Bestätigung (die erste) zurück an B sendet. In der Zwischenzeit sendet B zwei weitere Bestätigungen als Antwort auf die zusätzlichen Anforderungen, die von A gesendet worden sind, bevor B gestartet ist. B empfängt dann die erste Bestätigung von A und geht in den Zustand OPENED über. A empfängt die zweite Bestätigung von B, geht zurück in den Zustand REQ-SENT und sendet eine weitere (vierte) Anforderung entsprechend dem RFC. A empfängt dann die dritte Bestätigung und geht in den Zustand OPENED über. In der Zwischenzeit empfängt B die vierte Anforderung von A, wechselt in den Zustand ACK-SENT und sendet eine weitere (zweite) Anforderung und (vierte) Bestätigung entsprechend dem RFC. A erhält die Anforderung, geht in den Zustand REQ-SENT über, sendet eine weitere Anforderung, erhält unverzüglich die nächste Bestätigung und geht in OPENED über. Das geht so weiter, bis eine Seite erkennt, dass man zu keinem Ergebnis gelangt und aufgibt. Am besten verhindert man solche Situationen, indem man eine Seite als passiv konfiguriert, also dafür sorgt, dass eine Seite darauf wartet, dass die andere mit den Verhandlungen beginnt. Das kann durch den Befehl set openmode passive geschehen. Diese Option sollten Sie mit Vorsicht genießen. Folgenden Befehl sollten Sie benutzen, um die Wartezeit auf den Beginn der Verhandlungen des Partners von &man.ppp.8; zu begrenzen: set stopped N Alternativ kann der Befehl set openmode active N (wobei N die Wartezeit in Sekunden vor Beginn der Verhandlungen angibt) benutzt werden. Weitere Details finden Sie in den Manualpages. Warum reagiert &man.ppp.8; nicht mehr, wenn ich es mit shell verlassen habe? Wenn Sie den Befehl shell oder ! benutzen, führt &man.ppp.8; eine Shell aus (falls Sie Argumente übergeben haben, führt &man.ppp.8; diese Argumente aus). &man.ppp.8; wartet auf die Beendigung des Befehls, bevor es seine Arbeit fortsetzt. Falls Sie versuchen, die PPP-Verbindung während der Programmausführung zu benutzen, wird es so aussehen, als wäre die Verbindung eingefroren. Das liegt daran, dass &man.ppp.8; auf die Beendigung des Befehls wartet. Falls Sie solche Befehle verwenden möchten, benutzen Sie stattdessen den Befehl !bg. Hierdurch wird der angegebene Befehl im Hintergrund ausgeführt und &man.ppp.8; kann fortfahren, die Verbindung zu bedienen. Warum wird &man.ppp.8; niemals beendet, wenn ich es über ein Nullmodem-Kabel benutze? Es gibt keine Möglichkeit für &man.ppp.8;, automatisch festzustellen, ob eine direkte Verbindung beendet worden ist. Das liegt an den Leitungen, die bei einem seriellen Nullmodem-Kabel benutzt werden. Wenn Sie diese Art der Verbindung verwenden, sollte LQR immer aktiviert werden: enable lqr LQR wird standardmäßig akzeptiert, wenn es vom Partner ausgehandelt wird. Warum wählt &man.ppp.8; im Modus -auto ohne Grund? Falls &man.ppp.8; unerwarteterweise wählt, müssen Sie den Grund herausfinden und Wählfilter (dfilters) einsetzen, um dies zu verhindern. Benutzen Sie die folgende Zeile, um den Grund herauszufinden: set log +tcp/ip Dadurch wird jeglicher Verkehr über die Verbindung geloggt. Wenn das nächste mal unerwartet eine Verbindung hergestellt wird, werden Sie den Grund zusammen mit einer hilfreichen Zeitangabe in der Logdatei finden. Sie können nun das Wählen aufgrund dieser Bedingungen verhindern. Normalerweise wird diese Art von Problemen durch Anfragen an den DNS verursacht. Um zu verhindern, dass DNS-Anfragen den Aufbau der Verbindung hervorrufen (das verhindert nicht, dass Pakete über eine bestehende Verbindung gesendet werden), benutzen Sie die folgenden Zeilen: set dfilter 1 deny udp src eq 53 set dfilter 2 deny udp dst eq 53 set dfilter 3 permit 0/0 0/0 Dies ist nicht immer brauchbar, weil es effektiv Ihre Fähigkeit, auf Anforderung wählen zu können einschränkt - die meisten Programme müssen eine DNS-Anfrage durchführen, bevor Sie andere, das Netzwerk betreffenden Dinge tun können. Im Fall von DNS sollten Sie versuchen, herauszufinden, welches Programm tatsächlich versucht, einen Hostnamen aufzulösen. Sehr oft handelt es sich hier um &man.sendmail.8;. Sie sollten sicherstellen, dass Sie sendmail in der Konfigurationsdatei sagen, dass keine DNS-Anfragen durchführen soll. Weitere Details enthält der Abschnitt E-Mail über Einwahl-Verbindungen des Handbuchs. Sie könnten z.B. die folgende Zeile in Ihre .mc-Datei einfügen: define(`confDELIVERY_MODE', `d')dnl Das veranlasst sendmail dazu, alles in eine Warteschlange einzureihen, bis die Warteschlange verarbeitet wird (normalerweise wird sendmail mit aufgerufen, was besagt, dass die Warteschlange alle 30 Minuten abgearbeitet wird) oder, bis ein sendmail -q ausgeführt wird (z.B. aus Ihrer Datei ppp.linkup heraus). Was bedeuten diese CCP-Fehler? Ich sehe ständig folgende Fehler in meiner Logdatei: CCP: CcpSendConfigReq CCP: Received Terminate Ack (1) state = Req-Sent (6) Das liegt daran, dass &man.ppp.8; versucht, die Komprimierung Predictor1 auszuhandeln und der Partner über keinerlei Komprimierung verhandeln will. Die Meldungen sind harmlos, aber wenn Sie sie beseitigen möchten, können Sie die Komprimierung Predictor1 auch lokal ausschalten: disable pred1 Warum loggt ppp die Geschwindigkeit meiner Verbindung nicht? Um alle Zeilen Ihrer Modemkonversation mitzuloggen, müssen Sie folgendes einstellen: set log +connect Dies veranlasst &man.ppp.8; dazu, alles bis zur letzten angeforderten expext-Zeile mitzuloggen. Falls Sie die Geschwindigkeit Ihrer Verbindung erfahren möchten und PAP oder CHAP (und deshalb nach dem CONNECT im Wählskript nichts mehr zu chatten haben - kein set login-Skript), müssen Sie sicherstellen, dass Sie &man.ppp.8; anweisen, die gesamte CONNECT-Zeile zu erwarten, etwa so: set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 4 \"\" ATZ OK-ATZ-OK ATDT\\T TIMEOUT 60 CONNECT \\c \\n" Hier bekommen wir unser CONNECT, senden nichts, erwarten dann einen Line-Feed, der &man.ppp.8; zwingt, die gesamte CONNECT-Antwort zu lesen. Warum ignoriert &man.ppp.8; das Zeichen \ in meinem Chat-Skript? ppp analysiert jede Zeile in Ihrer Konfigurationsdatei, damit es Zeichenketten wie z.B. set phone "123 456 789" korrekt interpretieren kann (und erkennen, dass es sich bei der Nummer tatsächlich nur um ein Argument handelt). Um das Zeichen " anzugeben, müssen Sie ihm einen Backslash (\) voranstellen. Wenn der Chat-Interpreter jedes Argument analysiert, reinterpretiert er die Argumente, um irgendwelche speziellen Escape-Sequenzen wie z.B. \P oder \T (sehen Sie in die Manualpage) zu finden. Das Ergebnis dieser Doppelanalyse ist, dass Sie daran denken müssen, die richtige Anzahl an Escape-Zeichen zu verwenden. Falls Sie tatsächlich das Zeichen \ z.B. zu Ihrem Modem senden möchten, brauchen Sie etwas ähnliches, wie: set dial "\"\" ATZ OK-ATZ-OK AT\\\\X OK" woraus sich folgende Zeichen ergeben: ATZ OK AT\X OK oder set phone 1234567 set dial "\"\" ATZ OK ATDT\\T" was folgende Zeichen ergibt: ATZ OK ATDT1234567 Warum gibt es die Datei ppp.core nicht, wenn &man.ppp.8; einen Segmentation Fault erzeugt hat? Weder &man.ppp.8; noch andere Programme sollten Core-Dumps erzeugen. Da &man.ppp.8; mit der effektiven Benutzerkennung 0 ausgeführt wird, wird das Betriebssystem &man.ppp.8;'s Coreimage nicht auf die Festplatte schreiben, bevor es &man.ppp.8; beendet hat. Falls &man.ppp.8; jedoch tatsächlich aufgrund einer Speicherverletzung abbricht und Sie die aktuellste Version (siehe Anfang dieses Kapitels) benutzen, dann sollten Sie folgendes tun: &prompt.user; tar xfz ppp-*.src.tar.gz &prompt.user; cd ppp*/ppp &prompt.user; echo STRIP= >>Makefile &prompt.user; echo CFLAGS+=-g >>Makefile &prompt.user; make clean all &prompt.user; su &prompt.root; make install &prompt.root; chmod 555 /usr/sbin/ppp Nun ist die installierte Version von &man.ppp.8; mit einem Debugger ausführbar. Sie können &man.ppp.8; nun nur noch als root ausführen, da alle vorherigen Zugriffsrechte aufgehoben worden sind. Achten Sie darauf, in welchem Verzeichnis Sie sich gerade befinden, wenn Sie &man.ppp.8; starten. Wenn nun wieder eine Speicherverletzung auftreten sollte, wird &man.ppp.8; einen Speicherauszug erzeugen, den Sie in der Datei ppp.core finden. Sie sollten dann folgendes tun: &prompt.user; su &prompt.root; gdb /usr/sbin/ppp ppp.core (gdb) bt ..... (gdb) f 0 .... (gdb) i args .... (gdb) l ..... Mit Hilfe all dieser Informationen sollte es möglich sein, das Problem zu diagnostizieren. Falls Sie mit &man.gdb.1; vertraut sind, könnten Sie weitere Einzelheiten herausfinden, z.B. wodurch der Fehler tatsächlich hervorgerufen wurde und die Adressen & Werte der betreffenden Variablen. Warum bekommt das Programm, das eine automatische Anwahl ausgelöst hat, keine Verbindung? Dies war ein bekanntes Problem bei &man.ppp.8;-Konfigurationen, bei denen automatisch dynamische, lokale IP-Adressen mit dem Partner ausgehandelt werden. In der aktuellsten Version ist das Problem behoben - suchen Sie in den Manualpages nach iface. Das Problem bestand darin, dass, wenn das erste Programm &man.connect.2; aufruft, die IP-Adresse der tun-Schnittstelle dem Socketendpunkt zugeordnet wird. Der Kernel erstellt das erste ausgehende Paket und schreibt es in das tun-Gerät. &man.ppp.8; liest dann das Paket und baut eine Verbindung auf. Falls die Schnittstellenadresse sich nun aufgrund &man.ppp.8;s dynamischer Adresszuordnung ändert, wird der originale Socketendpunkt ungültig. Alle weiteren Pakete, die zum Partner gesendet werden, werden für gewöhnlich verworfen. Selbst wenn sie nicht verworfen werden würden, würden alle Antworten nicht an den betreffenden Rechner gelangen, weil die IP-Adresse nicht mehr zu diesem Rechner gehört. Theoretisch gibt es mehrere Möglichkeiten, dieses Problem anzugehen. Am schönsten wäre es, wenn der Partner die gleiche IP-Adresse wieder zuordnen würde, wenn möglich :-) Die derzeitige Version von &man.ppp.8; tut das, aber die meisten anderen Implementierungen nicht. Die einfachste Maßnahme von unserer Seite wäre die, niemals die IP-Adresse der tun-Schnittstelle zu ändern, sondern stattdessen alle ausgehenden Pakete so zu ändern, dass als Absender-IP-Adresse anstelle der IP-Adresse der Schnittstelle die ausgehandelte IP-Adresse gesetzt wird. Das ist im wesentlichen das, was durch die Option iface-alias in der aktuellsten Version von &man.ppp.8; bewirkt wird (mit Unterstützung von &man.libalias.3; und &man.ppp.8;'s Schalter) - alle Schnittstellenadressen werden beibehalten und auf die letzte ausgehandelte Adresse umgesetzt. Eine andere Alternative (und wahrscheinlich die zuverlässigste) wäre die, einen Systemaufruf zu implementieren der die IP-Adressen aller verbundenen Sockets von einer Adresse in eine andere ändert. &man.ppp.8; würde diesen Aufruf benutzen, um die Sockets aller laufenden Programme zu ändern, nachdem eine neue IP-Adresse ausgehandelt worden ist. Der gleiche Systemaufruf könnte von DHCP-Clients benutzt werden, wenn sie gezwungen werden, einen re-bind() auf ihren Sockets auszuführen. Noch eine andere Möglichkeit wäre die, das Aktivieren von Schnittstellen ohne IP-Adresse zu erlauben. Ausgehende Paketen würde die IP-Adresse 255.255.255.255 gegeben, bis der erste ioctl() mit SIOCAIFADDR erfolgt. Dies würde in der vollständigen Verbindung des Sockets resultieren. Es wäre die Aufgabe von &man.ppp.8;, die Absender-IP-Adresse zu ändern, allerdings nur dann, wenn sie 255.255.255.255 lautet und nur die IP-Adresse und IP-Prüfsumme müssten geändert werden. Dies wäre allerdings keine besonders elegante Lösung, da der Kernel fehlerhafte Pakete an eine unzureichend konfigurierte Schnittstelle senden würde, in der Annahme, dass andere Mechanismen in der Lage sind, diese Dinge rückwirkend zu beheben. Warum laufen die meisten Spiele mit dem Schalter nicht? Der Grund dafür, dass Spiele und andere Programme nicht funktionieren, wenn libalias benutzt wird, ist der, dass der Rechner außerhalb des lokalen Netzes versucht, eine Verbindung aufzubauen und (unaufgefordert) UDP-Pakete an den Rechner innerhalb des lokalen Netzes zu senden. Die Software, die für die NAT zuständig ist, weiß nicht, dass sie diese Pakete an den internen Rechner weiterleiten soll. Um dies zu beheben, stellen Sie zunächst sicher, dass die Software, mit der Sie Probleme haben, die einzige ist, die gerade läuft. Benutzen Sie dann entweder tcpdump auf der tun-Schnittstelle des Gateways oder aktivieren Sie auf dem Gateway das Logging von TCP/IP (set log +tcp/ip) unter &man.ppp.8;. Wenn Sie nun das betreffende Programm starten, sollten Sie sehen, wie Pakete den Gateway-Rechner passieren. Wenn von außen etwas zurückkommt, wird es ignoriert (das ist das Problem). Merken Sie sich die Portnummer dieser Pakete und beenden Sie das betreffende Programm. Wiederholen Sie diesen Schritt einige Male, um festzustellen, ob die Portnummern konsistent sind. Falls dem so ist, wird die folgende Zeile im entsprechenden Abschnitt von /etc/ppp/ppp.conf dafür sorgen, dass das Programm funktioniert: nat port proto internalmachine:port port wobei für proto entweder tcp oder udp zu setzen ist, internalmachine den Rechner bezeichnet, an den die Pakete geschickt werden sollen und port die betreffende Portnummer. Sie können das Programm nicht auf einem anderen Rechner benutzen, ohne die obige Zeile abzuändern und die Benutzung des Programms auf zwei internen Rechnern steht außer Frage - schließlich sieht die Außenwelt Ihr gesamtes internes Netz so, als wäre es ein einzelner Rechner. Falls die Portnummern nicht konsistent sind, gibt es drei weitere Optionen: Ermöglichen Sie die Unterstützung durch libalias. Beispiele für spezielle Fälle finden Sie in /usr/src/lib/libalias/alias_*.c (alias_ftp.c ist ein schöner Prototyp). Hierzu gehört für gewöhnlich das Lesen bestimmter, erkannter, ausgehender Pakete, die Identifizierung der Instruktion, die den entfernten Rechner dazu veranlasst, auf einem bestimmten (wahlfreien) Port eine Verbindung zurück zum lokalen Rechner herzustellen, sowie das Erstellen einer Route in der Aliastabelle, so dass nachfolgende Pakete wissen, wohin sie gehören. Dieses ist zwar die komplizierteste Lösung, aber die beste, die auch dafür sorgt, dass die Software auf mehreren Rechnern funktioniert. Benutzen Sie einen Proxy. Die Anwendung könnte z.B. socks5 unterstützen, oder (wie im Fall von cvsup) eine Option passiv besitzen, die stets verhindert, dass verlangt wird, dass der Partner eine Verbindung zurück zur lokalen Maschine aufbaut. Leiten Sie mit nat addr alles zur lokalen Maschine um. Dieses Vorgehen ähnelt dem mit einem Vorschlaghammer. Hat jemand eine Liste mit nützlichen Portnummern erstellt? Noch nicht, aber hieraus könnte eine solche entstehen (falls Interesse besteht). In jedem Beispiel sollte internal durch die IP-Adresse der Maschine ersetzt werden, auf der das Spiel laufen soll. Asheron's Call nat port udp internal:65000 65000 Konfigurieren Sie das Spiel manuell auf Port 65000 um. Wenn Sie von mehreren Rechner aus spielen wollen, weisen Sie jedem eine eindeutige Portnummer zu (also 65001, 65002, u.s.w.) und fügen Sie für jede Maschine eine eigene nat port Zeile ein. Half Life nat port udp internal:27005 27015 PCAnywhere 8.0 nat port udp internal:5632 5632 nat port tcp internal:5631 5631 Quake nat port udp internal:6112 6112 Quake 2 nat port udp internal:27901 27910 nat port udp internal:60021 60021 nat port udp internal:60040 60040 Red Alert nat port udp internal:8675 8675 nat port udp internal:5009 5009 Was sind FCS-Fehler? FCS steht für Frame Check Sequence. Jedes PPP-Paket besitzt eine Checksumme, um sicherzustellen, dass die empfangenen Daten dieselben sind, wie die versendeten. Falls die FCS eines ankommenden Paketes fehlerhaft ist, wird das Paket verworfen und der Zähler HDLC FCS wird erhöht. Der HDLC-Fehlerwert kann durch den Befehl show hdlc angezeigt werden. Falls Ihre Leitung schlecht ist (oder falls Ihr serieller Treiber Pakete verwirft), werden sie gelegentliche FCS-Fehler sehen. Normalerweise lohnt es sich nicht, sich hierüber Gedanken zu machen, obwohl das Kompressionsprotokoll hierdurch wesentlich langsamer wird. Wenn Sie ein externes Modem besitzen, stellen Sie sicher, dass Ihr Kabel ausreichend gegen Interferenzen abgeschirmt ist - das könnte das Problem beseitigen. Falls Ihre Leitung einfriert, sobald die Verbindung steht, und viele FCS-Fehler auftreten, könnte das daran liegen, dass Ihre Leitung nicht 8-Bit-rein ist. Stellen Sie sicher, dass Ihr Modem keinen Software-Flow-Control (XON/XOFF) verwendet. Falls Ihre Datenschnittstelle Software-Flow-Control verwenden muss, benutzen Sie den Befehl set accmap 0x000a0000, um &man.ppp.8; zu sagen, dass es die Zeichen ^Q und ^S maskieren soll. Ein weiterer Grund dafür, dass zu viele FCS-Fehler auftreten, könnte der sein, dass das andere Ende aufgehört hat, ppp zu sprechen. Aktivieren Sie async Logging, um festzustellen, ob es sich bei den eingehenden Daten tatsächlich um einen login- oder Shell-Prompt handelt. Wenn Sie am anderen Ende einen Shell-Prompt haben, ist es möglich, durch den Befehl close lcp &man.ppp.8; zu beenden, ohne die Verbindung zu beenden (ein folgender term-Befehl wird Sie wieder mit der Shell auf dem entfernten Rechner verbinden. Falls nichts in Ihrer Logdatei darauf hindeutet, warum die Verbindung beendet wurde, sollten Sie den Administrator des externen Rechners (Ihren ISP?) fragen, warum die Sitzung beendet worden ist. Wieso hängen die Verbindungen meiner &macos;- und &windows; 98-Maschinen (und eventuell auch andere µsoft; Betriebssysteme), wenn auf meinem Gateway PPPoE läuft? Vielen Dank an Michael Wozniak mwozniak@netcom.ca für die Erklärung und an Dan Flemming danflemming@mac.com für die Lösung für &macos;. Die Ursache des Problems ist ein so genannter Black Hole Router. &macos; und &windows; 98 (und wahrscheinlich auch die anderen Betriebssysteme von Microsoft) senden TCP Pakete, bei denen zum einen die angeforderte Segmentgröße zu groß für einen PPPoE-Rahmen ist (die Default-MTU für Ethernet beträgt 1500 Byte) und bei denen das don't fragment Bit gesetzt ist (das ist bei TCP allerdings Standard). Außerdem sendet der Router beim Provider nicht die eigentlich notwendigen must fragment-Meldungen zu dem Webserver, von dem Sie gerade eine Seite laden wollen. Es ist auch möglich, dass diese Meldung zwar erzeugt, aber danach von einem Firewall vor dem Webserver abgefangen wird. Wenn Ihnen dieser Webserver nun ein Paket schickt, das nicht in einen PPPoE-Rahmen passt, dann verwirft der Router dieses Paket und die Seite wird nicht geladen (einige Seiten/Grafiken werden geladen, weil ihre Größe kleiner ist als die MSS). Dies scheint leider der Normalfall zu sein (wenn die Leute doch nur wüssten, wie man einen Router konfiguriert... stöhn...) Eine der möglichen Lösungen für dieses Problem ist die Erzeugung des folgenden Schlüssels in der Registry des Windows-Clients: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0000\MaxMTU Der Schlüssels sollte vom Typ String sein und den Wert 1436 haben, da einige ADSL-Router nicht mit größeren Paketen umgehen können. Wenn Sie &windows; 2000 verwenden, müssen Sie hingegen den Schlüssel Tcpip\Parameters\Interfaces\ID der Netzwerkkarte\MTU benutzen, außerdem müssen Sie als Typ DWORD verwenden. Die Knowledge Base von µsoft; enthält weitere Informationen darüber, wie sie die MTU einer &windows;-Maschine ändern, damit diese mit einem NAT-Router korrekt zusammenarbeitet. Vom besonderen Interesse sind die Artikel Q158474 - &windows; TCPIP Registry Entries und Q120642 - TCPIP & NBT Configuration Parameters for &windowsnt;. Bei &windows; 2000 können Sie alternativ auch, wie im Artikel 120642 beschrieben, mit regedit das DWORD Tcpip\Parameters\Interfaces\ID der Netzwerkkarte\EnablePMTUBHDetect auf 1 setzen. Mit den Bordmitteln von &macos; ist es leider nicht möglich, die TCP/IP-Einstellungen zu verändern. Es gibt jedoch kommerzielle Lösungen wie zum Beispiel OTAdvancedTuner (OT steht für OpenTransport, den TCP/IP-Stack von &macos;) von Sustainable Softworks, mit denen man die TCP/IP-Einstellungen bearbeiten kann. Wenn Sie als &macos;-Anwender NAT benutzen, sollten Sie im entsprechenden drop-down Menü den Punkt ip_interface_MTU auswählen und in der Dialogbox 1450 statt 1500 eingeben. Aktivieren Sie den Punkt Save as Auto Configure und klicken Sie danach auf Make Active. &man.ppp.8; kennt seit Version 2.3 den Befehl enable tcpmssfixup, mit dem die MSS automatisch korrigiert wird. Wenn Sie einen ältere Version von &man.ppp.8; benutzen müssen, könnte der Port tcpmssd für Sie interessant sein. Nichts von alledem hilft - ich bin verzweifelt! Was soll ich machen? Falls alles andere fehlschlägt, senden Sie möglichst umfangreiche Informationen, einschließlich Ihrer Konfigurationsdateien, wie Sie &man.ppp.8; starten, die relevanten Teile Ihrer Logdateien und die Ausgabe des Befehls netstat -rn (vor und nach Aufbau der Verbindung) an die Mailingliste &a.de.questions; oder die Newsgroup de.comp.os.unix.bsd. Irgend jemand sollte Ihnen dann weiterhelfen. Serielle Verbindungen Dieses Kapitel beantwortet häufig gestellte Fragen zu seriellen Verbindungen mit FreeBSD. PPP und SLIP werden im Abschnitt Netzwerke behandelt. Wie kann ich feststellen, ob FreeBSD meine seriellen Schnittstellen gefunden hat? Wenn der FreeBSD Kernel bootet, testet er die seriellen Schnittstellen, für die er konfiguriert wurde. Sie können entweder Ihrem System aufmerksam beim Booten zusehen und die angezeigten Nachrichten lesen, oder Sie führen den Befehl &prompt.user; dmesg | grep sio aus, nachdem Ihr System hochgefahren ist und läuft. Hier ist ein Beispiel einer Ausgabe nach dem oben genannten Befehl: sio0: at 0x3f8-0x3ff irq 4 on isa sio0: type 16550A sio1: at 0x2f8-0x2ff irq 3 on isa sio1: type 16550A Es zeigt zwei serielle Schnittstellen. Die erste verwendet Port-Adresse 0x3f8, IRQ 4 und hat einen 16550A UART Chip. Die zweite benutzt ebenfalls einen 16550A UART, jedoch Port-Adresse 0x2f8 und IRQ 3. Modemkarten werden wie serielle Schnittstellen behandelt. Der einzige Unterschied ist, dass an diesen Schnittstellen immer ein Modem angeschlossen ist. Der GENERIC Kernel beinhaltet Unterstützung für zwei serielle Schnittstellen, die den im Beispiel genannten Port und IRQ verwenden. Wenn diese Einstellungen nicht richtig für Ihr System sind, Sie Modemkarten hinzugefügt oder mehr serielle Schnittstellen haben als Ihre Kernelkonfiguration zulässt, konfigurieren Sie Ihren Kernel einfach neu. In dem Kapitel über die Kernelkonfiguration finden Sie mehr Details. Wie kann ich feststellen, ob FreeBSD meine Modemkarten gefunden hat? Die vorherige Frage sollte darauf eine Antwort geben. Wie kann ich auf die seriellen Schnittstellen in FreeBSD zugreifen? Die in &man.sio.4; beschriebene serielle Schnittstelle sio2 (COM3 unter &ms-dos;/&windows;), ist /dev/cuaa2 für Geräte mit abgehenden Verbindungen und /dev/ttyd2 für Geräte mit eingehenden Verbindungen. Was ist der Unterschied zwischen den beiden Geräteklassen? Sie benutzen ttydX für eingehende Verbindungen. Wird /dev/ttydX im blockierenden Modus geöffnet, wartet ein Prozess darauf, dass das entsprechende cuaaX Gerät inaktiv und der Empfangssignalpegel Mit Empfangssignalpegel oder Trägersignalerkennung wird hier die carrier detect Leitung bezeichnet. aktiv ist. Wird das cuaaX Gerät geöffnet, vergewissert es sich, dass die serielle Schnittstelle nicht bereits von dem ttydX Gerät in Gebrauch ist. Sollte die Schnittstelle verfügbar sein, stiehlt es sie von dem ttydX Gerät. Das cuaaX Gerät kümmert sich nicht um Trägersignalerkennung. Mit diesem Schema und einem automatisch antwortenden Modem, können sich Benutzer von aussen einloggen, Sie können weiterhin mit demselben Modem wählen und das System kümmert sich um die Konflikte. Wie kann ich die Unterstützung für eine Karte mit mehreren seriellen Schnittstellen aktivieren? Die Sektion über die Kernelkonfiguration bietet Informationen darüber, wie Sie Ihren Kernel konfigurieren. Für eine Karte mit mehreren seriellen Schnittstellen, schreiben Sie eine &man.sio.4; Zeile für jede serielle Schnittstelle auf der Karte in die Kernelkonfigurationsdatei. Aber achten Sie darauf, den IRQ und die Vektorbezeichnung nur in einem der - Einträge zu plazieren. Alle seriellen Schnittstellen + Einträge zu platzieren. Alle seriellen Schnittstellen auf der Karte sollten sich einen IRQ teilen. Daher sollten Sie den IRQ nur beim letzten Eintrag angeben. Aktivieren Sie auch die COM_MULTIPORT Option. Das folgende Beispiel ist geeignet für eine AST Karte mit 4 seriellen Schnittstellen, die IRQ 7 benutzt: options "COM_MULTIPORT" device sio4 at isa? port 0x2a0 tty flags 0x781 device sio5 at isa? port 0x2a8 tty flags 0x781 device sio6 at isa? port 0x2b0 tty flags 0x781 device sio7 at isa? port 0x2b8 tty flags 0x781 irq 7 vector siointr Die Flags zeigen an, dass die Master-Schnittstelle die Minor-Nummer 7 (0x700) hat, Diagnosen während des Bootens ermöglicht sind (0x080), und dass sich alle Schnittstellen einen IRQ teilen (0x001). Kann FreeBSD mehrere Karten mit mehreren seriellen Schnittstellen mit den gleichen IRQs verwalten? Noch nicht. Sie müssen für jede Karte einen anderen IRQ verwenden. Kann ich die vorgegebenen seriellen Parameter für eine Schnittstelle einstellen? Das ttydX (oder cuaaX) Gerät ist das reguläre Gerät, das man in Anwendungen öffnet. Wenn ein Prozess es öffnet, hat es die voreingestellten Terminal Eingabe/Ausgabe-Einstellungen. Sie können diese Einstellungen mit dem Befehl &prompt.root; stty -a -f /dev/ttyd1 ansehen. Wenn Sie die Einstellungen für dieses Gerät ändern, sind die Einstellungen gültig, bis das Gerät geschlossen wird. Wird es danach geöffnet, hat es wieder die vorgegebenen Einstellungen. Um Änderungen an den vorgegebenen Einstellungen vorzunehmen, können Sie das Anfangsstatus-Gerät öffnen und dessen Einstellungen anpassen. Um zum Beispiel den CLOCAL Modus, 8 Bits und XON/XOFF Datenflusskontrolle als Standard für ttyd5 einzustellen, geben Sie &prompt.root; stty -f /dev/ttyid5 clocal cs8 ixon ixoff ein. Eine gute Stelle um dies zu tun ist in /etc/rc.serial. Jetzt hat eine Anwendung diese Einstellungen als Standardwerte, wenn sie ttyd5 öffnet. Die Anwendung kann die Einstellungen jedoch immer noch nach Belieben verändern. Man aber kann auch bestimme Einstellungen davor schützen, von einer Anwendung verändert zu werden, indem man Veränderungen am lock state Gerät vornimmt. Um beispielsweise die Geschwindigkeit von ttyd5 auf 57600 bps festzusetzen: &prompt.root; stty -f /dev/ttyld5 57600 Wenn jetzt eine Anwendung ttyd5 öffnet und versucht die Geschwindigkeit zu verändern, wird diese bei 57600 bps bleiben. Natürlich sollten Sie das Schreiben auf die Anfangsstatus- und lock state-Geräte nur root erlauben. Das &man.MAKEDEV.8; Skript tut dies nicht, wenn es die Geräte-Einträge erstellt. Wie kann ich Einwahl-Logins über mein Modem aktivieren? Also Sie wollen ein Internet Service Provider werden, ja? Als erstes brauchen Sie eines oder mehrere Modems, die automatisches Antworten beherrschen. Ihr Modem sollte auf Trägersignalerkennung reagieren und nicht fortlaufend die Leitung offen halten. Es muss auflegen und sich neu initialisieren können, wenn die Data Terminal Ready (DTR) Leitung ausgeschaltet wird. Es sollte wahrscheinlich RTS/CTS oder gar keine lokale Datenflusskontrolle benutzen. Zuletzt muss es eine konstante Geschwindigkeit zwischen dem Computer und sich selbst verwenden, aber es sollte (um die Anrufer freundlich zu behandeln) eine Geschwindigkeit zwischen sich und dem entfernten Modem aushandeln können. Für viele Modems, die mit dem Hayes Befehlssatz kompatibel sind, erzeugt der folgende Befehl diese Einstellungen und legt sie im nicht-flüchtigen Speicher ab: AT &C1 &D3 &K3 &Q6 S0=1 &W Die Sektion über das Senden von AT-Befehlen bietet weitere Informationen, wie man diese Einstellungen vornimmt, ohne zu einem &ms-dos; Terminalprogramm zu flüchten. Als nächstes erstellen Sie einen Eintrag in /etc/ttys für das Modem. Diese Datei listet alle Schnittstellen auf, auf denen das - Betriebssystem Einlogversuche erwartet. Fügen Sie + Betriebssystem Anmeldeversuche erwartet. Fügen Sie eine solche Zeile hinzu: ttyd1 "/usr/libexec/getty std 57600" dialup on insecure Diese Zeile bedeutet, dass an der zweiten seriellen Schnittstelle (/dev/ttyd1) ein Modem angeschlossen ist, das mit 57600 bps läuft und keine Parität besitzt (std.57600 aus /etc/gettytab). Der Terminal-Typ für diese Schnittstelle ist dialup (Einwahl). Die Schnittstelle ist eingeschaltet (on) und unsicher (insecure) – das bedeutet, man kann sich über diese Schnittstelle nicht als root einloggen. Für Einwahlanschlüsse wie diesen, benutzen Sie den ttydX Eintrag. Es ist relativ geläufig, dialup als Terminal-Typ zu verwenden. Viele Benutzer richten in ihren .profile oder .login Dateien eine Abfrage für das eigentliche Terminal ein, wenn der Start-Typ dialup ist. Das Beispiel zeigt die Schnittstelle als unsicher und um über diese Schnittstelle root zu werden, müssen Sie sich als normaler Benutzer einloggen und &man.su.1;. Wenn sie secure (sicher) als Einstellung verwenden, kann sich root direkt einloggen. Nachdem Sie Modifikationen in /etc/ttys vorgenommen haben, müssen Sie ein hangup oder HUP Signal an &man.init.8; senden: &prompt.root; kill -HUP 1 Das bringt &man.init.8; dazu, die Datei /etc/ttys neu einzulesen. init startet dann an allen als eingeschaltet (on) markierten Schnittstellen die getty-Prozesse. Sie können herausfinden ob noch Logins für Ihre Schnittstelle verfügbar sind, wenn Sie folgendes eingeben: &prompt.user; ps -ax | grep '[t]tyd1' Sie sollten etwas sehen, das so ähnlich aussieht wie: 747 ?? I 0:00:04 /usr/libexec/getty std.57600 ttyd1 Wie kann ich ein Hardware-Terminal mit meiner FreeBSD Box verbinden? Wenn Sie einen anderen Computer als Terminal für Ihr FreeBSD System verwenden wollen, verbinden Sie die beiden seriellen Schnittstellen mit einem Nullmodem-Kabel. Wenn Sie ein echtes (Hardware-)Terminal benutzen, lesen Sie die Begleitinformationen. Ändern Sie /etc/ttys wie oben angegeben. Wenn Sie zum Beispiel ein WYSE-50 Terminal mit der fünften seriellen Schnittstelle verbinden wollen, schreiben Sie einen Eintrag wie diesen: ttyd4 "/usr/libexec/getty std.38400" wyse50 on secure Das Beispiel zeigt, dass die Schnittstelle an /dev/ttyd4 mit einem wyse50 Terminal mit 38400 bps und ohne Parität (std.38400 aus /etc/gettytab) verbunden ist und root Logins möglich sind (secure). Warum kann ich tip oder cu nicht laufen lassen? Vielleicht sind auf Ihrem System die Programme &man.tip.1; und &man.cu.1; nur von uucp und der Gruppe dialer ausführbar. Sie können die Gruppe dialer verwenden, um zu kontrollieren wer Zugriff auf Ihr Modem oder entfernte Systeme hat. Fügen Sie sich einfach selbst zur Gruppe dialer hinzu. Als Alternative können Sie jeden Benutzer auf Ihrem System &man.tip.1; und &man.cu.1; verwenden lassen, dazu müssen Sie das folgende eingeben: &prompt.root; chmod 4511 /usr/bin/cu &prompt.root; chmod 4511 /usr/bin/tip Mein Hayes Modem wird nicht unterstützt – was kann ich tun? Eigentlich ist die Onlinehilfe für &man.tip.1; nicht mehr aktuell. Es gibt einen eingebauten, allgemeinen Hayes Wähler. Verwenden Sie einfach at=hayes in /etc/remote. Der Hayes Treiber ist nicht schlau genug, um ein paar der erweiterten Merkmale von neueren Modems zu erkennen – Nachrichten wie BUSY, NO DIALTONE oder CONNECT 115200 verwirren ihn nur. Sie sollten diese Nachrichten mit Hilfe von ATX0&W abschalten, wenn Sie tip benutzen. Das Anwahl-Timeout von &man.tip.1; beträgt 60 Sekunden. Ihr Modem sollte weniger verwenden, oder tip denkt, dass ein Kommunikationsfehler vorliegt. Versuchen Sie es mit ATS7=45&W. Tatsächlich unterstützt die ausgelieferte Version von &man.tip.1; es noch nicht vollständig. Die Lösung ist, tipconf.h im Verzeichnis /usr/src/usr.bin/tip/tip zu editieren. Dafür benötigen Sie natürlich die Quellcode Distribution. Editieren Sie die Zeile #define HAYES 0 in #define HAYES 1 um. Dann führen Sie make und make install aus. Es sollte jetzt funktionieren. Wie soll ich die AT Befehle eingeben? Erstellen Sie einen so genannten direct Eintrag in /etc/remote. Wenn Ihr Modem zum Beispiel an der ersten seriellen Schnittstelle, /dev/cuaa0, angeschlossen ist, dann fügen Sie die folgende Zeile hinzu: cuaa0:dv=/dev/cuaa0:br#19200:pa=none Verwenden Sie die höchste bps Rate, die Ihr Modem in der br Fähigkeit unterstützt. Geben Sie dann tip cuaa0 ein und Sie sind mit Ihrem Modem verbunden. Wenn auf Ihrem System keine /dev/cuaa0 Datei existiert, geben Sie folgendes ein: &prompt.root; cd /dev &prompt.root; sh MAKEDEV cuaa0 Oder benutzen Sie cu als root mit dem folgenden Befehl: &prompt.root; cu -lline -sspeed line steht für die serielle Schnittstelle (/dev/cuaa0) und speed für die Geschwindigkeit (57600). Wenn Sie mit dem Eingeben der AT Befehle fertig sind, beenden Sie mit ~.. Wieso funktioniert das <@> Zeichen für die pn Fähigkeit nicht? Das <@> Zeichen in der Telefonnummerfähigkeit sagt tip, dass es in der Datei /etc/phones nach einer Nummer suchen soll. Aber <@> ist auch ein spezielles Zeichen in den Dateien, in denen Fähigkeiten beschrieben werden, wie /etc/remote. Schreiben Sie es mit einem '\' (backslash): pn=\@ Wie kann ich von der Kommandozeile eine Telefonnummer wählen? Stellen Sie einen allgemeinen Eintrag in /etc/remote. Zum Beispiel: tip115200|Dial any phone number at 115200 bps:\ :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du: tip57600|Dial any phone number at 57600 bps:\ :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du: Mit einem Befehl wie tip -115200 5551234 können Sie dann wählen. Sollten Sie &man.cu.1; im Gegensatz zu &man.tip.1; bevorzugen, verwenden Sie einen allgemeinen cu-Eintrag: cu115200|Use cu to dial any number at 115200bps:\ :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du: Zum Wählen können Sie dann cu 5551234 -s 115200 eingeben. Muss ich dabei jedes Mal die bps Rate angeben? Schreiben Sie einen tip1200 oder einen cu1200 Eintrag, aber geben Sie auch die bps Rate an, die Ihr Modem wirklich unterstützt. Leider denkt &man.tip.1;, dass 1200 bps ein guter Standardwert ist und deswegen sucht es nach einem tip1200-Eintrag. Natürlich müssen Sie nicht wirklich 1200 bps benutzen. Wie kann ich möglichst komfortabel über einen Terminal-Server auf verschiedene Rechner zugreifen? Sie müssen nicht warten bis Sie verbunden sind, und jedes Mal CONNECT Rechner eingeben, benutzen Sie tip's cm Fähigkeit. Sie können diese Einträge in /etc/remote verwenden: pain|pain.deep13.com|Forrester's machine:\ :cm=CONNECT pain\n:tc=deep13: muffin|muffin.deep13.com|Frank's machine:\ :cm=CONNECT muffin\n:tc=deep13: deep13:Gizmonics Institute terminal server:\ :dv=/dev/cuaa2:br#38400:at=hayes:du:pa=none:pn=5551234: Mit den Befehlen tip pain oder tip muffin können Sie eine Verbindungen zu den Rechnern pain oder muffin herstellen; mit tip deep13 verbinden Sie sich mit dem Terminal Server. Kann tip mehr als eine Verbindung für jede Seite ausprobieren? Das ist oft ein Problem, wenn eine Universität mehrere Telefonleitungen hat und viele tausend Studenten diese benutzen wollen. Erstellen Sie einen Eintrag für Ihre Universität in /etc/remote und benutzen Sie <\@> für die pn Fähigkeit: big-university:\ :pn=\@:tc=dialout dialout:\ :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none: Listen Sie die Telefonnummern der Universität in /etc/phones auf: big-university 5551111 big-university 5551112 big-university 5551113 big-university 5551114 &man.tip.1; probiert jede der Nummern in der aufgelisteten Reihenfolge und gibt dann auf. Möchten Sie, dass tip beim Versuchen eine Verbindung herzustellen nicht aufgibt, lassen Sie es in einer while-Schleife laufen. Warum muss ich zweimal Ctrl P tippen, um ein Ctrl P zu senden? Ctrl P ist das voreingestellte Zeichen, mit dem eine Übertragung erzwungen werden kann und wird benutzt, um &man.tip.1; zu sagen, dass das nächste Zeichen direkt gesendet werden soll und nicht als Fluchtzeichen interpretiert werden soll. Mit Hilfe der ~s Fluchtsequenz, mit der man Variablen setzen kann, können Sie jedes andere Zeichen als force-Zeichen definieren. Geben Sie ~sforce=zeichen ein und drücken Sie Enter. Für zeichen können Sie ein beliebiges einzelnes Zeichen einsetzen. Wenn Sie zeichen weglassen, ist das force-Zeichen nul, das Sie mit Ctrl 2 oder Ctrl SPACE eingeben können. Ein guter Wert für zeichen ist Shift Ctrl 6 , welches ich erst auf ein paar Terminal-Servern in Benutzung gesehen habe. Sie können das force-Zeichen auch bestimmen, indem Sie in $HOME/.tiprc das folgende einstellen: force=single-char Warum ist auf einmal alles was ich schreibe in GROSSBUCHSTABEN?? Sie müssen Ctrl A eingegeben haben, das raise-Zeichen von &man.tip.1; das speziell für Leute mit defekten Caps Lock Tasten eingerichtet wurde. Benutzen Sie ~s wie oben und setzen Sie die Variable raisechar auf etwas, das Ihnen angemessen erscheint. Tatsächlich kann die Variable auf das gleiche Zeichen wie das force-Zeichen gesetzt werden, wenn Sie diese Fähigkeiten niemals benutzen wollen. Hier ist ein Muster der .tiprc Datei, perfekt für Emacs Benutzer, die oft Ctrl 2 und Ctrl A tippen müssen: force=^^ raisechar=^^ Das ^^ steht für Shift Ctrl 6 . Wie kann ich Dateien mit tip übertragen? Wenn Sie mit einem anderen &unix; System kommunizieren, können Sie Dateien senden und empfangen – mit ~p (put) und ~t (take). Diese Befehle lassen &man.cat.1; und &man.echo.1; auf dem entfernten System laufen, um Dateien zu akzeptieren und zu senden. Die Syntax ist: ~p <local-file> [<remote-file>] ~t <remote-file> [<local-file>] Es gibt keine Fehlerkontrolle, deshalb sollten Sie besser ein anderes Protokoll benutzen, wie zmodem. Wie kann ich zmodem mit tip laufen lassen? Zuerst installieren Sie ein zmodem Programm aus der Ports-Sammlung (eines der beiden aus der comms-Kategorie, lrzsz oder rzsz). Um Dateien zu empfangen, starten Sie das Programm zum Senden auf dem entfernten Computer. Drücken Sie dann Enter gefolgt von ~C rz (oder ~C lrz, wenn Sie lrzsz installiert haben), um diese lokal zu empfangen. Um Dateien zu senden, starten Sie das Programm zum Empfangen auf dem entfernten Computer. Drücken Sie dann Enter gefolgt von ~C sz Dateien (oder ~C lsz Dateien), um sie zum entfernten System zu senden. Verschiedene Fragen FreeBSD benutzt viel mehr Swap-Speicher als &linux;. Warum? Es sieht nur so aus, als ob FreeBSD mehr Swap benutzt, als &linux;. Tatsächlich ist dies nicht der Fall. In dieser Hinsicht besteht der Hauptunterschied zwischen FreeBSD und &linux; darin, dass FreeBSD vorbeugend vollkommen untätige, unbenutzte Seiten aus dem Hauptspeicher in den Swap-Bereich auslagert, um mehr Hauptspeicher für die aktive Nutzung zur Verfügung zu stellen. &linux; tendiert dazu, nur als letzten Ausweg Seiten in den Swap-Bereich auszulagern. Die spürbar höhere Nutzung des Swap-Speichers wird durch die effizientere Nutzung des Hauptspeichers wieder ausgeglichen. Beachten Sie, dass FreeBSD in dieser Hinsicht zwar vorbeugend arbeitet, es entscheidet jedoch nicht willkürlich, Seiten auszulagern, wenn das System vollkommen untätig ist. Deshalb werden Sie feststellen, dass nicht alle Seiten Ihres Systems ausgelagert wurden, wenn Sie morgens aufstehen, nachdem das System eine Nacht lang nicht benutzt worden ist. Warum zeigt mir &man.top.1; so wenig freien Speicher an, obwohl nur wenige Programme laufen? Die Antwort ist ganz einfach: Freier Speicher ist verschwendeter Speicher. Der FreeBSD Kernel verwendet den von den Programmen nicht genutzten Speicher automatisch für den Plattencache. Die in &man.top.1; für Inact, Cache und Buf gemeldeten Werte stehen alle für zwischengespeicherte Daten mit unterschiedlichem Alter. Wenn das System wiederholt auf Daten zugreifen muss, braucht es nicht auf die langsame Platte zuzugreifen, da die Daten noch zwischengespeichert sind. Dadurch erhöht sich die Performance. Ganz generell ist es ein gutes Zeichen, wenn &man.top.1; einen kleinen Wert bei Free anzeigt, solange der Wert nicht extrem klein ist. Anmerkung des Übersetzers: Mit extrem klein sind hier Werte unterhalb 512 KByte gemeint. Warum ändert chmod die Zugriffsrechte auf symbolische Links nicht? Für symbolische Links gibt es keine separaten Zugriffsrechte und standardmäßig folgt &man.chmod.1; dem Link nicht; die Zugriffsrechte für die Datei, auf die der symbolische Link zeigt, werden also nicht verändert. Wenn Sie eine Datei mit dem Namen foo und einen auf diese Datei zeigenden symbolischen Link mit dem Namen bar haben, wird das folgende Kommando niemals einen Fehler melden. &prompt.user; chmod g-w bar Trotzdem werden die Zugriffsrechte für foo nicht geändert. Hierzu müssen Sie entweder oder zusammen mit der Option benutzen. Weitere Informationen finden Sie in den Manualpages &man.chmod.1; und &man.symlink.7;. Die Option bewirkt ein rekursives &man.chmod.1;. Seien Sie vorsichtig, wenn Sie bei &man.chmod.1; Verzeichnisse oder symbolische Links zu Verzeichnissen angeben. Wenn Sie die Zugriffsrechte eines Verzeichnisses ändern möchten, das durch einen symbolischen Link referenziert wird, benutzen Sie &man.chmod.1; ohne irgendwelche Optionen und folgen dem symbolischen Link durch einen abschließenden Schrägstrich (/). Falls z.B. foo ein symbolischer Link zum Verzeichnis bar ist und Sie die Zugriffsrechte von foo (tatsächlich bar) ändern möchten, dann benutzen Sie etwas ähnliches wie: &prompt.user; chmod 555 foo/ Durch den abschließenden Schrägstrich folgt &man.chmod.1; dem symbolischen Link foo, um die Zugriffsrechte für das Verzeichnis bar zu ändern. Kann ich DOS-Programme unter FreeBSD ausführen? Ja. Sie können emulators/doscmd verwenden, das über die Ports-Sammlung verfügbar ist. doscmd war früher Teil des Basissystems von &os;, es wurde aber vor der Veröffentlichung von &os; 5.3 daraus entfernt. Falls doscmd nicht ausreicht, können Sie den Port emulators/pcemu verwenden, der einen 8088 und genug BIOS-Funktionen emuliert, um DOS-Textanwendungen laufen zu lassen. Der Port benötigt das X-Window-System. Was muss ich tun, um die FreeBSD-Dokumentation in meine Muttersprache zu übersetzen? Informationen zu diesem Thema finden Sie in der FAQ des FreeBSD German Documentation Project. Warum kommen alle meine Mails, die ich an @FreeBSD.org schicke, wieder zurück? Das Mailsystem von FreeBSD.org verwendet einige der strengeren Überprüfungen von Postfix für eingehende Mails. Mails, bei denen es Anzeichen für Konfigurationsprobleme oder Spam gibt, werden nicht akzeptiert. Dies kann aus einem der folgenden Gründe geschehen: Die Mail kommt von einem System oder Netzwerk, dass für Spam-Aktivitäten bekannt ist. Die Mailserver von FreeBSD akzeptierten keine Mails von bekannten Spam-Quellen. Wenn Sie eine Firma oder Domain benutzen, die Spam erzeugt oder verteilt, sollten Sie sich einen anderen ISP suchen. Der Mailtext enthält HTML. Mail sollte immer im Klartext gesendet werden, Sie sollten ihr Mailprogramm entsprechend einstellen. Das Mailsystem kann die IP-Adresse des einliefernden Systems nicht in einen symbolischen Namen umwandeln. Funktionierendes reverse DNS ist eine Vorbedingung, damit ihre Mails angenommen wird. Sorgen Sie dafür, dass der reverse DNS für Ihren Mailserver korrekt konfiguriert wird. Viele Anbieter für Privatkunden geben Ihnen diese Möglichkeit nicht. In diesem Fall sollten Sie Ihre Mails über den Mailserver Ihres Providers versenden. Der Rechnername, der im EHLO/HELO Teil der SMTP Kommunikation übergeben wird, kann nicht zu einer IP-Adresse aufgelöst werden. Damit die E-Mail akzeptiert wird, brauchen Sie einen voll qualifizierten Rechnernamen, der im DNS eingetragen ist. Wenn Sie diesen nicht besitzen, benutzen Sie bitte den Mailserver Ihres Providers, um E-Mails zu verschicken. Die Message-ID Ihrer Mail endet in localhost. Einige Mail-Clients generieren eine Message-ID, die nicht akzeptiert wird. Sie müssen Ihren Mail-Client so konfigurieren, dass er eine gültige Message-ID generiert. Alternativ können Sie die Message-ID von Ihrem Mailserver umschreiben lassen. Wo kann ich einen freien FreeBSD-Account bekommen? Das FreeBSD Project bietet zwar keinen freien Zugang zu seinen Servern an; andere Firmen bieten jedoch frei zugängliche &unix; Systeme. Die Kosten variieren und es kann sein, dass nicht alle Dienste zur Verfügung stehen. Arbornet, Inc, auch als M-Net bekannt, bietet seit 1983 uneingeschränkten Zugang zu &unix; Systemen. Zunächst wurde eine Altos-Maschine mit System III benutzt, 1991 erfolgte dann der Wechsel zu BSD/OS. Im Juni 2000 erfolgte ein erneuter Wechsel, diesmal zu FreeBSD. M-Net bietet Zugang mit Telnet und SSH und den Zugang zur gesamten Software von FreeBSD. Allerdings ist der Zugriff auf das Netzwerk auf Mitglieder und Gönner beschränkt, die eine Spende an die nicht-kommerzielle Organisation geleistet haben. M-Net stellt zusätzlich ein Mailbox-System und einen interaktiven Chat zur Verfügung. Grex bietet ein ganz ähnlichen Dienst wie M-Net an, dazu gehören auch das Mailbox-System und der interaktive Chat. Allerdings wird eine SUN4M mit &sunos; benutzt. Was ist sup und wie benutze ich es? Der Name SUP steht für Software Update Protocol und wurde von der CMU (Carnegie Mellon University) entwickelt, um ihre Entwicklungszweige zu synchronisieren. Wir haben es benutzt, um entfernte Sites mit unseren zentralen Quellcodeentwicklungen zu synchronisieren. SUP ist nicht sehr bandbreitenfreundlich und wurde abgelöst. Die derzeit empfohlene Methode, um Ihren Quellcode auf dem neuesten Stand zu halten ist CVSup. Wie heißt das niedliche rote Kerlchen? Er ist namenlos, es ist einfach der der BSD Daemon. Wenn Sie ihm unbedingt einen Namen geben wollen, rufen Sie ihn beastie. Beachten Sie aber, dass beastie wie BSD ausgesprochen wird. Weitere Informationen über den BSD daemon finden Sie auf seiner Homepage. Kann ich Bilder des BSD Daemon verwenden? Eventuell. Der BSD Daemon unterliegt dem Copyright von Marshall Kirk McKusick. Wenn Sie genaue Informationen über die Einschränkungen bei der Nutzung brauchen, sollten Sie sein Statement on the Use of the BSD Daemon Figure lesen. Kurz gesagt, können Sie den BSD Daemon benutzen, solange es für einen privaten Zweck ist und die Nutzung geschmackvoll bleibt. Für den kommerziellen Einsatz brauchen Sie die Zustimmung von Kirk McKusick. Weitere Informationen erhalten Sie auf der Webseite BSD Daemon's home page. Woher kann ich Bilder des BSD Daemon bekommen? Einige Bilder in den Format xfig und eps sind unter /usr/share/examples/BSD_daemon/ zu finden. Ich habe in den Mailinglisten eine Abkürzung oder einen Begriff gesehen, den ich nicht kenne. Wo erhalte ich eine Erklärung dazu? Sehen Sie bitte im FreeBSD-Glossar nach. Warum sollte mich die Farbe des Fahrradschuppens interessieren? Die ganz, ganz kurze Antwort ist: Überhaupt nicht. Die etwas längere Antwort lautet: Nur weil Sie in der Lage sind, einen Fahrradschuppen zu bauen, müssen Sie noch lange nicht andere davon abhalten, nur weil Ihnen die Farbe nicht gefällt. Dies ist natürlich eine Metapher dafür, dass Sie nicht eine Diskussion über jede kleine Änderung beginnen sollen, nur weil Sie das können. Einige Leute behaupten sogar, dass die Anzahl der (nutzlosen) Kommentare über eine Änderung umgekehrt proportional zur Komplexität der Änderung ist. Die noch längere und vollständigere Antwort ist, dass &a.phk; nach einen langen Diskussion über das Thema "Soll &man.sleep.1; Sekundenbruchteile als Parameter akzeptieren?" eine lange Mail mit dem Titel A bike shed (any colour will do) on greener grass... schrieb. Die einschlägigen Teile der Nachricht lauteten:
&a.phk; in freebsd-hackers, 2.10.1999 Einige von Euch haben mich gefragt, Was meinst Du mit dem Fahrradschuppen? Es ist eine lange oder eigentlich eher eine sehr alte und doch sehr kurze Geschichte. C. Northcote Parkinson schrieb in den frühen Sechzigern ein Buch mit dem Namen Parkinson's Law, das viele Einblick in die Beziehungen innerhalb des Managements gibt. [ein paar Kommentare zum Buch gestrichen] In dem Beispiel mit dem Fahrradschuppen ist die andere wichtige Komponente ein Kernkraftwerk. Ich glaube, dass zeigt schon, wie alt dieses Buch ist. Parkinson zeigte, dass man zum Vorstand gehen kann und die Genehmigung für ein mehrere Millionen oder sogar Milliarden Dollar teures Kernkraftwerk bekommt; wenn man aber einen Fahrradschuppen bauen will, wird man in endlose Diskussionen verwickelt. Laut Parkinson liegt das daran, dass ein Kernkraftwerk so groß, so teuer und so kompliziert ist, dass die Leute es nicht verstehen. Und bevor sie versuchen, es zu verstehen, verlassen Sie sich lieber darauf, dass irgend jemand sicherlich die ganzen Details geprüft hat, bevor das Projekt bis zum Vorstand gekommen ist. Im Buch von Richard P. Feynmann finden sich einige interessante und sehr passende Beispiele aus dem Gebiet von Los Alamos. Ein Fahrradschuppen ist was anderes. Jeder kann an seinem freien Wochenende einen bauen und hat trotzdem noch genug Zeit für die Sportschau. Daher ist es unwichtig, wie gut man sich vorbereitet und wie sinnvoll der eigene Vorschlag ist. Irgend jemand wird die Möglichkeit nutzen und zeigen, dass er seine Arbeit tut, dass er aufmerksam ist, dass er da ist. In Dänemark nennen wir dieses Verhalten Seine Fingerabdrücke hinterlassen. Es geht um persönlichen Stolz und Prestige; die Chance, auf irgend etwas zu zeigen und zu sagen zu können: Da! Das habe Ich getan. Politiker leiden sehr stark darunter, aber viele Leute verhalten sich so, wenn sie die Chance haben. Denkt einfach mal an Fußabdrücke in feuchtem Zement.
Nicht ganz ernstgemeinte Fragen Wie cool ist FreeBSD? Q. Hat irgend jemand Temperaturmessungen durchgeführt, während FreeBSD läuft? Ich weiss, dass &linux; cooler läuft, als DOS, habe aber niemals gesehen, dass FreeBSD erwähnt wurde. Es scheint sehr heiß zu laufen. A. Nein, aber wir haben zahlreiche Geschmackstests mit verblendeten Freiwilligen durchgeführt, denen außerdem zuvor 250 Mikrogramm LSD-25 verabreicht wurden. 35% der Freiwilligen sagte, dass FreeBSD nach Orange schmeckte, &linux; hingegen schmecke wie purple haze (Anm. d. Übersetzers: Song von Jimmy Hendrix und LSD-Marke). Keine der Gruppen hat besondere Abweichungen der Temperatur erwähnt. Eventuell hätten wir sämtliche Ergebnisse dieser Untersuchung fortwerfen sollen, als wir festgestellt haben, dass zu viele der Freiwilligen den Raum während der Tests verlassen haben und dadurch die Ergebnisse verfälscht haben. Wir glauben, dass die meisten der Freiwilligen nun bei Apple sind und an ihrer neuen scratch and sniff Oberfläche arbeiten. Es ist ein lustiges, altes Geschäft, in dem wir uns befinden! Ernsthaft, FreeBSD und &linux; benutzen beide die Instruktion HLT (halt), wenn das System untätig ist, wodurch der Energieverbrauch und dadurch die produzierte Wärme reduziert wird. Falls Sie auch noch APM (Advanced Power Management) konfiguriert haben, kann FreeBSD Ihre CPU auch in einen Low-Power-Modus bringen. Wer kratzt in meinen Speicherbänken?? Q. Gibt es irgend etwas seltsames, das FreeBSD tut, wenn ich den Kernel kompiliere, das dazu führt, dass der Speicher ein kratzendes Geräusch macht? Bei der Kompilierung (und auch für einen kurzen Moment nach der Erkennung des Floppy-Laufwerks beim Hochfahren), kommt ein seltsames kratzendes Geräusch von etwas das die Speicherbänke zu sein scheinen. A. Ja! In der BSD-Dokumentation finden Sie häufige Verweise auf Daemons und was die meisten Leute nicht wissen, ist, dass diese sich auf echte, nicht-körperlichen Wesen beziehen, die Besitz von Ihrem Computer ergriffen haben. Das kratzende Geräusch, das von Ihrem Speicher kommt, ist in Wirklichkeit hochtöniges Flüstern, das unter den Daemons ausgetauscht wird, während Sie entscheiden, wie Sie die verschiedenen Systemadministrationsaufgaben, am besten erledigen. Wenn Sie das Geräusch stört, wird ein fdisk /mbr sie vertreiben, aber wundern Sie sich nicht, wenn sie feindlich reagieren und versuchen, Sie aufzuhalten. Wenn Sie während der Ausführung zu irgendeinem Zeitpunkt die teuflische Stimme von Bill Gates aus dem eingebauten Lautsprecher kommen hören, laufen Sie weg und sehen Sie sich auf keinen Fall um! Befreit von dem ausgleichenden Einfluss der BSD Dämonen sind die beiden Dämonen von DOS und &windows; oft dazu in der Lage, die totale Kontrolle über Ihre Maschine für die ewige Verdammung Ihrer Seele zurückzuerlangen. Da Sie jetzt die Wahrheit kennen, würden Sie es vorziehen, sich an die Geräusche zu gewöhnen, wenn Sie die Wahl hätten. Wie viele FreeBSD-Hacker braucht man, um eine Glühbirne auszuwechseln? Eintausendeinhundertundneunundsechzig: Dreiundzwanzig, die sich bei -CURRENT beschweren, dass das Licht aus ist; Vier, die behaupten, dass es sich um ein Konfigurationsproblem handelt und dass solche Dinge wirklich nach -questions gehören; Drei, die PRs hierzu einreichen, einer von ihnen wird falsch unter DOC abgelegt und fristet sein Dasein im Dunkeln; Einen, der eine ungetestete Glühbirne einreicht, wonach buildworld nicht mehr funktioniert, und sie dann fünf Minuten später wieder herausnimmt; Acht, die die PR-Erzeuger beschimpfen, weil sie zu ihren PRs keine Patche hinzugefügt haben; Fünf, die sich darüber beschweren, dass buildworld nicht mehr funktioniert; Einunddreißig, die antworten, dass es bei ihnen funktioniert und dass sie cvsup wohl zu einigem ungünstigen Zeitpunkt durchgeführt haben; Einen, der einen Patch für eine neue Glühbirne an -hackers schickt; Einen, der sich beschwert, dass es vor drei Jahren Patches hierfür hatte, aber als er sie nach -CURRENT schickte, sind sie einfach ignoriert worden und er hatte schlechte Erfahrungen mit dem PR-System; nebenbei ist die vorgeschlagene Glühbirne nicht reflexiv; Siebenunddreißig, die schreien, dass Glühbirnen nicht in das Basissystem gehören, dass Committer nicht das Recht haben, solche Dinge durchzuführen, ohne die Gemeinschaft zu konsultieren und WAS GEDENKT -CORE HIER ZU TUN!? Zweihundert, die sich über die Farbe des Fahrradschuppens beschweren; Drei, die darauf hinweisen, dass der Patch nicht mit &man.style.9; übereinstimmt; Siebzehn, die sich beschweren, dass die vorgeschlagene neue Glühbirne der GPL unterliegt; Fünfhundertundsechsundachtzig, die sich in einen Streit über die vergleichbaren Vorteile der GPL, der BSD-Lizenz, der MIT-Lizenz, der NPL und der persönlichen Hygiene nichtgenannter FSF-Gründer verwickeln; Sieben, die unterschiedliche Teile des Threads nach -chat und -advocacy weiterleiten; Einer, der die vorgeschlagene Glühbirne einbaut, obwohl sie dunkler leuchtet, als die alte; Zwei, die sie wieder ausbauen, und in einer wütenden Nachricht argumentieren, dass FreeBSD besser ganz im Dunkeln dasteht, als mit einer dämmerigen Glühbirne; Sechsundvierzig, die sich lärmend wegen des Wiederausbaus der dämmerigen Glühbirne streiten und eine Erklärung von -core verlangen; Elf, die eine kleinere Glühbirne beantragen, damit sie in ihr Tamagotchi passt, falls wir irgendwann beschließen, FreeBSD auf diese Plattform zu portieren; Dreiundsiebzig, die sich über die SNR auf -hackers und -chat beschweren und aus Protest abmelden; Dreizehn, die unsubscribe, How do I unsubscribe? oder Please remove me from the list gefolgt von der üblichen Fußzeile abschicken; Einen, der eine funktionierende Glühbirne einbaut, während alle zu beschäftigt damit sind, mit jedem zu streiten, um es zu bemerken; Einunddreißig, die herausstellen, dass die neue Glühbirne 0,364% heller leuchten würde, wenn sie mit TenDRA kompiliert werden würde (obwohl sie in einen Würfel umgeformt werden müsste) und dass FreeBSD deshalb nach TenDRA, anstatt nach GCC wechseln sollte; Einen, der sich beschwert, dass bei der neuen Glühbirne die Verkleidung fehlt; Neun (einschließlich der PR-Ersteller), die fragen Was ist MFC? Siebenundfünfzig, die sich zwei Wochen, nachdem die Birne gewechselt worden ist, darüber beschweren, dass das Licht aus war. &a.nik; hat hinzugefügt: Ich habe ziemlich hierüber gelacht. Und dann dachte ich: "Halt, sollte in dieser Liste nicht irgendwo 'Einer, der es dokumentiert' sein?" Und dann wurde ich erleuchtet :-) Was passiert mit den Daten, die nach /dev/null geschrieben werden? Sie werden in einer speziellen Datensenke der CPU in Wärme umgewandelt, die dann über den Kühlkörper und den Lüfter abgeführt wird. Dies ist einer der Gründe für die Kühlung von CPUs; die Anwender gewöhnen sich an die schnelleren Prozessoren, gehen nicht mehr so sorgfältig mit Ihren Daten um und so landen immer mehr Daten in /dev/null, was zur Überhitzung der CPU führt. Wenn Sie /dev/null löschen (was die Datensenke ziemlich sicher abschaltet), wird Ihre CPU zwar nicht mehr so heiß, dafür wird Ihr System aber sehr schnell von den überzähligen Daten überladen und merkwürdige Effekte zeigen. Wenn Sie eine sehr schnell Netzwerkverbindung haben, können Sie Ihre CPU kühlen, indem sie Daten aus /dev/random lesen und in die Weite des Netzwerkes schicken; allerdings besteht hier die Gefahr der Überhitzung von Netzwerk und /. Außerdem dürfte Ihr ISP ziemlich wütend werden, da der größte Teil der Daten von seinen Geräten in Hitze umgewandelt werden wird; da ISPs aber über Klimaanlagen verfügen, sollte das kein großes Problem sein, solange Sie es nicht übertreiben. Nachtrag Paul Robinson: Es gibt andere Mittel und Wege. Wie jeder gute Systemadministrator weiss, gehört es zum guten Ton, einigen Daten zum Bildschirm zu senden, damit die Leuchtkäferchen, die das Bild anzeigen, glücklich sind. Die Leuchtkäferchen werden nach der Farbe Ihrer Hüte (Rot, Grün, oder Blau) unterschieden und sie verstecken bzw. zeigen sich (wobei man die Farbe ihrer Hüte erkennen kann) bei jeder Nahrungsaufnahme. Grafikkarten wandeln Daten in Leuchkäfer-Nahrung um und schicken sie dann zu den Leuchtkäfern - teure Karten erzeugen bessere Nahrung und sorgen so für besseres Verhalten der Leuchtkäfer. Diese brauchen allerdings einen konstanten Stimulus - darum gibt es Bildschirmschoner. Darum lautet mein Vorschlag, die zufälligen Daten einfach zum Bildschirm zu schicken, damit sie von den Leuchtkäfern verzehrt werden. Dabei entsteht keine Hitze, die Leuchtkäfer bleiben glücklich und man wird seine überflüssigen Daten sehr schnell los, auch wenn der Bildschirm etwas merkwürdig aussieht. Übrigens: Als Ex-Admin eines großen ISPs, der so seine Probleme mit der Kühlung seines Rechenzentrums hatte, kann ich nur davon abraten, überflüssige Daten einfach in das Netzwerk zu schicken. Die Heinzelmännchen, die die Pakete verteilen und versenden, regen sich darüber ganz furchtbar auf. Weiterführende Themen Wie kann ich mehr über die Interna von FreeBSD erfahren? Zurzeit gibt es nur ein Buch über die Interna von FreeBSD, The Design and Implementation of the FreeBSD Operating System von Marshall Kirk McKusick und George V. Neville-Neil, ISBN 0-201-70245-2, das sich auf FreeBSD 5.X konzentriert. Allgemeines Wissen über &unix; kann allerdings in den meisten Fällen auf FreeBSD angewendet werden. Eine Liste finden Sie im entsprechenden Abschnitt der Bibliographie. Wie kann ich bei der Entwicklung von FreeBSD mitarbeiten? Genauere Informationen finden Sie im Artikel FreeBSD unterstützen. Wir können Hilfe immer gut gebrauchen! Was sind SNAPs und RELEASEs? Derzeit existieren drei aktive/halbaktive Zweige im FreeBSD-CVS-Repository. In früheren Zweigen ändert sich wenig, daher gibt es nur drei aktive Entwicklungszweige: RELENG_5 bzw. 5.X-STABLE RELENG_6 bzw. 6-STABLE HEAD bzw. -CURRENT oder 7.X-CURRENT HEAD ist keine wirkliche Bezeichnung für einen Zweig, wie die anderen beiden. Es ist lediglich eine symbolische Konstante für den aktuellen, nicht verzweigten Entwicklungsstrom, auf den wir uns einfach als -CURRENT beziehen. Derzeit steht -CURRENT für den 7.X-Entwicklungsstrom, der 5-STABLE-Zweig (RELENG_5) wurde im Oktober 2004, der 6-STABLE-Zweig (RELENG_6) im November 2005 von -CURRENT abgespalten. Wie kann ich meine eigene, angepasstes Release erstellen? Eine Anleitung dazu finden Sie im Artikel FreeBSD Release Engineering. Wieso überschreibt make world das installierte System? Das ist beabsichtigt. Wie der Name schon andeutet, erstellt make world alle Systemdateien von Grund auf neu. Sie können also sicher sein, am Ende eine saubere, konsistente Umgebung zu haben (das ist der Grund, warum es so lange dauert). Falls die Umgebungsvariable DESTDIR während der Ausführung von make world oder make install definiert ist, werden die neu erstellten Binaries unter ${DESTDIR} in einem zum installierten identischen Verzeichnisbaum abgelegt. Einige zufällige Kombinationen von Änderungen von Shared Libraries und Neuerstellungen von Programmen können hierbei jedoch ein Scheitern von make world verursachen. Warum ist cvsup.FreeBSD.org kein Round-Robin-Eintrag im DNS, so dass Anfragen auf alle CVsup-Server verteilt werden? Die CVsup-Server gleichen sich stündlich mit dem Hauptserver ab. Allerdings findet der Abgleich nicht zur gleichen Zeit statt, daher können einige Server neuere Quellen bereitstellen als andere Server. Alle Server stellen jedoch Quellen bereit, die maximal eine Stunde alt sind. Wäre cvsup.FreeBSD.org ein Round-Robin-Eintrag im DNS, der Benutzern einen zufälligen Server zuteilt, könnten beim zweiten Lauf von CVsup ältere Quellen als beim ersten Lauf heruntergeladen werden. Warum meldet mein System (bus speed defaulted) beim Start? Die Adaptec 1542 SCSI Hostadapter erlauben dem Benutzer die Buszugriffsgeschwindigkeit per Software zu konfigurieren. Ältere Versionen des 1542-Treibers versuchten, die schnellstmögliche Geschwindigkeit herauszufinden und konfigurierten den Adapter entsprechend. Wir haben festgestellt, dass dies auf einigen Systemen nicht funktioniert, weshalb Sie nun die Kernelkonfigurationsoption TUNE_1542 definieren müssen, um es zu aktivieren. Die Benutzung auf Systemen, auf denen es funktioniert, könnte Ihre Platten schneller machen, aber auf den Systemen, auf denen es nicht funktioniert, könnten Ihre Daten beschädigt werden. Kann ich -CURRENT mit begrenztem Internetzugang folgen? Ja, Sie können das tun, ohne den gesamten Quellbaum herunterzuladen, indem Sie die Einrichtung CTM benutzen. Wie haben Sie die Distribution in 240k-Dateien aufgespalten? Bei neueren BSD-basierten Systemen gibt es eine Option zu &man.split.1;, die das Splitten von Dateien an willkürlichen Bytegrenzen erlaubt. Hier ist ein Beispiel aus /usr/src/Makefile. bin-tarball: (cd ${DISTDIR}; \ tar cf - . \ gzip --no-name -9 -c | \ split -b 240640 - \ ${RELEASEDIR}/tarballs/bindist/bin_tgz.) Ich habe eine Kernelerweiterung geschrieben. An wen sende ich sie? Lesen Sie bitte den Artikel FreeBSD unterstützen. Und Danke, dass Sie darüber nachdenken! Wie werden Plug&Play ISA-Karten erkannt und initialisiert? Von: Frank Durda IV uhclem@nemesis.lonestar.org Kurz gesagt gibt es nur wenige I/O-Ports über die PnP-Karten antworten, wenn der Host fragt, ob jemand da ist. Wenn die PnP-Erkennungsroutine startet, fragt sie, ob irgendwelche PnP-Karten vorhanden sind und alle PnP-Karten antworten mit ihrer Modellnummer auf demselben Port, von dem sie auch gelesen haben. Die Erkennungsroutine erhält also ein geodertes Ja auf diese Frage. Mindestens ein Bit wird bei dieser Antwort gesetzt sein. Die Erkennungsroutine ist dann in der Lage, dafür zu sorgen, dass Karten mit Modellnummern (zugeordnet von Microsoft/Intel) kleiner als X off-line gesetzt werden. Sie prüft dann, ob immer noch Karten da sind, die auf die Frage antworten. Falls die Antwort 0 war, sind keine Karten mit IDs größer X vorhanden. Nun prüft die Erkennungsroutine, ob Karten unterhalb X vorhanden sind. Dann setzt die Erkennungsroutine alle Karten größer als X-(limit/4) off-line und wiederholt die Frage. Wenn diese halbbinäre Suche nach IDs in Folge genügend oft wiederholt worden ist, wird die Erkennungsroutine schließlich alle in einem Rechner befindlichen PnP-Karten identifiziert haben und das mit einer Iterationszahl sehr viel kleiner als 2^64. Die IDs bestehen aus zwei 32-Bit-Feldern (daher 2^64) + acht Bit Prüfsumme. Die ersten 32 Bit sind die Herstellerkennung. Es wurde zwar nicht bestätigt, aber es wird angenommen, dass unterschiedliche Kartentypen desselben Herstellers unterschiedliche 32-Bit Herstellerkennungen besitzen können. 32 Bit nur für eindeutige Hersteller zu benötigen, scheint etwas übertrieben. Die niedrigen 32 Bit sind eine Seriennummer, Ethernetadresse - etwas, das die betreffende Karte einzigartig macht. Die Hersteller dürfen niemals eine zweite Karte mit denselben niedrigen 32 Bit herstellen, es sei denn, die höheren 32 Bit sind unterschiedlich. Sie können also mehrere Karten des selben Typs im Rechner haben und die gesamten 64 Bit bleiben stets eindeutig. Die 32-Bit-Gruppen können niemals nur aus Nullen bestehen. Das erlaubt es, bei der binären Suche zu Beginn nur auf von Null verschiedene Bits zu achten. Wenn das System alle vorhandenen Karten-IDs identifiziert hat, reaktiviert es jede Karte - eine nach der anderen (über dieselben I/O-Ports) und ermittelt, welche Ressourcen von der jeweiligen Karte benötigt werden, welche Wahlmöglichkeiten für Interrupts bestehen usw. Alle Karten werden abgefragt, um diese Informationen zusammenzustellen. Diese Informationen werden dann mit Informationen aus allen ECU-Dateien auf der Festplatte oder mit im MLB-BIOS verdrahteten Informationen verknüpft. Die ECU- und BIOS-PnP-Unterstützung für Hardware auf dem MLB ist für gewöhnlich künstlich und was die Peripheriegeräte tun ist nicht wirklich echtes PnP. Durch die Untersuchung der BIOS-Informationen und der ECU-Informationen können die Erkennungsroutinen jedoch die von PnP-Geräten benutzten Ressourcen so ändern, dass vermieden wird, dass bereits von anderen Geräten benutzte Ressourcen verwendet werden. Dann werden die PnP-Geräte nochmals besucht und ihre I/O, DMA, IRQ und Memory-Map-Adressen werden zugeordnet. Die Geräte werden an diesen Stellen sichtbar werden und dort bis zum nächsten Reboot verbleiben. Allerdings hindert Sie auch nichts daran, sie zu verschieben, wohin Sie wollen. Im obigen Teil wurde sehr viel vereinfacht, aber die grundlegende Idee sollte klar geworden sein. Microsoft hat einige der primären Druckerstatusports für PnP übernommen, da keine Karte diese Adressen für die entgegengesetzten I/O-Zyklen decodiert. Ich habe während der frühen Überprüfungsperiode des PnP-Vorschlags eine echte IBM Druckerkarte gefunden, die Schreibzugriffe auf dem Statusport decodiert hat, aber MS hat nur tough gesagt. Also schreiben sie auf den Druckerstatusport, um Adressen zu setzen, benutzen zusätzlich diese Adresse + 0x800 und einen dritten I/O-Port zum Lesen, der irgendwo zwischen 0x200 und 0x3ff liegen kann. Wie bekomme ich eine Major-Number für einen Gerätetreiber, den ich geschrieben habe? &os.current; stellt seit Februar 2003 Major-Numbers für Geräte zur Laufzeit automatisch bereit. Nach Möglichkeit sollte diese neue Funktion benutzt werden, anstatt eine Major-Number statisch festzulegen. Weitere Hinweise finden Sie in src/sys/conf/majors. Wenn Sie eine statisch festgelegte Major-Number benötigen, hängt das weitere Verfahren davon ab, ob Sie den Treiber frei verfügbar machen wollen. Falls dem so ist, senden Sie uns bitte eine Kopie der Treiber-Sourcen und zusätzlich die entsprechenden Änderungen der Datei files.i386, ein Beispiel für einen Eintrag in der Konfigurationsdatei und den entsprechenden Code für &man.MAKEDEV.8;, der die Gerätedateien für Ihr Gerät erzeugt. Falls Sie nicht beabsichtigen, den Treiber frei verfügbar zu machen, oder es aufgrund von Lizenzbeschränkungen nicht können, dann ist die Major-Number 32 für zeichenorientierte und die Major-Number 8 für blockorientierte Geräte speziell für diesen Zweck reserviert. In jedem Fall würden wir uns freuen, auf der Mailingliste &a.hackers; etwas über Ihren neuen Treiber zu hören. Gibt es alternative Layoutverfahren für Verzeichnisse? Als Antwort auf die Frage nach alternativen Layoutverfahren für Verzeichnisse ist das Schema, das derzeit benutzt wird, unverändert von dem, das ich 1983 geschrieben habe. Ich habe das Vorgehen für das originale Fast-Filesystem geschrieben und es niemals überarbeitet. Es funktioniert gut, wenn es darum geht, zu verhindern, dass Zylindergruppen volllaufen. Wie viele von Ihnen angemerkt haben, funktioniert es schlecht für find. Die meisten Dateisysteme werden von Archiven erstellt, die mit einer Tiefensuche (also ftw) erstellt wurden. Diese Verzeichnisse werden über die Zylindergruppen hinweg entfaltet und erzeugen denkbar ungünstigste Voraussetzungen für zukünftige Tiefensuchen. Falls man die Gesamtzahl der zu erstellenden Verzeichnisse wüsste, wäre die Lösung die, (gesamt / fs_ncg) pro Zylindergruppe zu erstellen, bevor fortgefahren wird. Offensichtlich müsste man eine Heuristik erstellen, um die Zahl zu schätzen. Sogar die Benutzung einer kleinen, fixen Zahl, z.B. 10, würde eine Verbesserung um Größenordnungen ausmachen. Um Wiederherstellungen von normalem Betrieb (wo der derzeitige Algorithmus vermutlich sinnvoller ist) zu unterscheiden, könnten Sie die Clusterung von bis zu 10 benutzen, wenn sie alle innerhalb eines 10-Sekunden-Fensters durchgeführt würden. Jedenfalls ist mein Schluss, dass dies ein fruchtbares Gebiet für Experimente ist. Kirk McKusick, September 1998 Wie kann ich optimalen Nutzen aus einer kernel panic ziehen? [Dieser Abschnitt wurde von &a.des;, der einige Tippfehler korrigiert und die Kommentare in eckigen Klammern hinzugefügt hat, aus einer Mail von &a.wpaul; in der Mailingliste freebsd-current entnommen.] From: Bill Paul <wpaul@skynet.ctr.columbia.edu> Subject: Re: the fs fun never stops To: Ben Rosengart Date: Sun, 20 Sep 1998 15:22:50 -0400 (EDT) Cc: current@FreeBSD.org [<Ben Rosengart> sendete die folgende Panik-Meldung] > Fatal trap 12: page fault while in kernel mode > fault virtual address = 0x40 > fault code = supervisor read, page not present > instruction pointer = 0x8:0xf014a7e5 ^^^^^^^^^^ > stack pointer = 0x10:0xf4ed6f24 > frame pointer = 0x10:0xf4ed6f28 > code segment = base 0x0, limit 0xfffff, type 0x1b > = DPL 0, pres 1, def32 1, gran 1 > processor eflags = interrupt enabled, resume, IOPL = 0 > current process = 80 (mount) > interrupt mask = > trap number = 12 > panic: page fault [Wenn] Sie eine Meldung wie diese sehen, reicht es nicht, sie einfach zu reproduzieren und sie einzusenden. Der Wert des Instruktionszeigers, den ich oben hervorgehoben habe, ist wichtig; leider ist er auch konfigurationsabhängig. Mit anderen Worten variieren die Werte abhängig von dem Kernel-Image, das Sie tatsächlich benutzen. Wenn Sie ein GENERIC Kernelimage von einem der Snapshots benutzen, dann ist es für jemand anderen möglich, die fehlerhafte Instruktion herauszufinden, aber wenn Sie einen angepassten Kernel benutzen, können nur Sie uns sagen, wo der Fehler auftrat. Was Sie tun sollten, ist folgendes: Notieren Sie sich den Wert des Instruktionszeigers. Beachten Sie, dass der Teil 0x8: am Anfang in diesem Fall nicht von Bedeutung ist; der Teil 0xf0xxxxxx ist der, den wir wollen. Tun Sie folgendes, wenn das System rebootet: &prompt.user; nm -n /kernel.that.caused.the.panic | grep f0xxxxxx wobei 0xf0xxxxxx der Wert des Instruktionszeigers ist. Es besteht die Möglichkeit, dass Sie keinen exakten Treffer erzielen, weil die Symbole in der Symboltabelle des Kernels Funktionseinstiegspunkte sind und die Adresse - des Instruktionszeiger irgendwo innerhalb einer + des Instruktionszeigers irgendwo innerhalb einer Funktion liegen wird und nicht am Anfang. Falls sie keinen exakten Treffer erzielen, lassen Sie den letzten Teil des Werts des Instruktionszeigers weg und - versuchen es nocheinmal, z.B.: + versuchen es noch einmal, z.B.: &prompt.user; nm -n /kernel.that.caused.the.panic | grep f0xxxxx Falls das kein Ergebnis liefert, hacken Sie eine weitere Ziffer ab. Wiederholen Sie die Schritte, bis Sie irgendeine Ausgabe erhalten. Das Ergebnis wird eine Liste möglicher Funktionen sein, die die Panik verursacht haben. Das ist zwar kein absolut genauer Mechanismus, um die Fehlerursache ausfindig zu machen, aber es ist besser als gar nichts. Ich sehe ständig Leute, die Panik-Meldungen wie diese zeigen, aber ich sehe kaum jemanden, der sich die Zeit nimmt, den Instruktionszeiger einer Funktion aus der Symboltabelle des Kernel zuzuordnen. Der beste Weg, den Grund für eine Panik herauszufinden, ist der, einen Crash-Dump festzuhalten und dann &man.gdb.1; zu benutzen, um den Stack im Crash-Dump zurückzuverfolgen. Jedenfalls ist die Methode, die ich normalerweise benutze, folgende: Richten Sie eine Kernelkonfigurationsdatei ein, fügen Sie optional options DDB hinzu, falls Sie glauben, dass Sie den Kerneldebugger benötigen. (Ich benutze ihn hauptsächlich zum Setzen von Haltepunkten, wenn ich eine Endlosschleife irgendeiner Art vermute.) Benutzen Sie config -g KERNELCONFIG, um das Erstellungsverzeichnis einzurichten. cd /sys/compile/KERNELCONFIG; make Warten Sie, bis der Kernel fertig kompiliert ist. make install reboot Der &man.make.1;-Prozess wird zwei Kernel erstellt haben: kernel und kernel.debug. kernel wurde als /kernel installiert, während kernel.debug als Quelle für Debuggersymbole für &man.gdb.1; benutzt werden kann. Um sicherzustellen, dass ein Crash-Dump erhalten bleibt, müssen Sie /etc/rc.config editieren und dumpdev so setzen, dass es auf Ihre Swap-Partition zeigt. Das bewirkt, dass die &man.rc.8;-Skripte den Befehl &man.dumpon.8; benutzen, um Crash-Dumps zu ermöglichen. Sie können &man.dumpon.8; auch manuell ausführen. Nach einer Panik kann der Crash-Dump mit &man.savecore.8; wiederhergestellt werden; wenn dumpdev in /etc/rc.conf gesetzt ist, werden die &man.rc.8;-Skripte &man.savecore.8; automatisch ausführen und den Crash-Dump unter /var/crash ablegen. Crash-Dumps von FreeBSD sind für gewöhnlich genauso groß wie der physikalische Hauptspeicher Ihres Rechners. Das heißt, wenn Sie 64MB RAM haben, werden sie einen 64MB Crash-Dump erhalten. Deshalb müssen Sie dafür sorgen, dass genügend Speicherplatz in /var/crash zur Verfügung steht, um den Dump aufnehmen zu können. Alternativ führen Sie &man.savecore.8; manuell aus und lassen es den Crash-Dump in einem anderen Verzeichnis wiederherstellen, in dem Sie mehr Platz haben. Es ist möglich, die Größe des Crash-Dumps zu begrenzen, indem options MAXMEM=(foo) benutzt wird, um den Speicher, den der Kernel benutzt, auf einen etwas vernünftigeren Wert zu setzen. Wenn Sie z.B. 128MB RAM haben, können Sie die Speicherbenutzung des Kernels auf 16MB begrenzen, so dass die Größe Ihres Crash-Dumps 16MB - anstatt 128MB beträgen wird. + anstatt 128MB betragen wird. Wenn Sie den Crash-Dump wiederhergestellt haben, können Sie den Stack mit &man.gdb.1; so zurückverfolgen: &prompt.user; gdb -k /sys/compile/KERNELCONFIG/kernel.debug /var/crash/vmcore.0 (gdb) where Beachten Sie, dass es mehrere Seiten mit wertvollen Informationen geben könnte; idealerweise sollten Sie &man.script.1; benutzen, um sie alle festzuhalten. Wenn Sie das vollständige Kernelimage mit allen Debugginginformationen benutzen, müssten Sie exakt die Zeile des Kernel-Sourcecodes finden, wo die Panik aufgetreten ist. Für gewöhnlich müssen Sie den Stack von unten an zurückverfolgen, um die genaue Ereignisabfolge, die zum Crash führte, zurückzuverfolgen. Sie können &man.gdb.1; auch zum Ausdrucken der Inhalte verschiedener Variablen oder Strukturen benutzen, um den Systemstatus zum Zeitpunkt des Absturzes zu untersuchen. Wenn Sie nun wirklich verrückt sind und einen zweiten Computer haben, können Sie &man.gdb.1; auch für entferntes Debugging konfigurieren, so dass Sie &man.gdb.1; auf einem System benutzen können, um den Kernel auf einem anderen System zu debuggen, einschließlich dem Setzen von Haltepunkten und dem Bewegen in Einzelschritten durch den Kernelcode, genauso, wie Sie es mit einem normalen Benutzerprogramm tun können. Ich habe noch nicht damit gespielt weil ich nicht oft Gelegenheit habe, zwei Rechner nebeneinander für Debuggingzwecke einzurichten. [Bill hat hinzugefügt: "Ich vergaß, etwas zu erwähnen: wenn Sie DDB aktiviert haben und der Kernel im Debugger landet, können Sie eine Panik (und einen Crash-Dump) erzwingen, indem Sie einfach 'panic' am ddb-Prompt eingeben. Er könnte während der Panikphase wieder im Debugger stoppen. Falls er das tut, geben Sie 'continue' ein, dann wird er den Crash-Dump beenden." -ed] Wieso funktioniert dlsym() nicht mehr für ELF-Executables? Die ELF-Werkzeuge machen die in einem Executable definierten Symbole dem dynamischen Linker nicht standardmäßig sichtbar. Konsequenterweise werden dlsym()-Suchen nach Handlern aus Aufrufen von dlopen(NULL, flags) diese Symbole nicht finden können. Wenn Sie mit dlsym() nach im Hauptexecutable eines Prozesses vorhandenen Symbolen suchen wollen, müssen Sie das Executable mit der Option von &man.ld.1; linken. Wie kann ich den Adressraum des Kernels vergrössern oder verkleinern? Standardmäßig beträgt der Adressraum des Kernels 256MB (FreeBSD 3.X) bzw. 1 GB (FreeBSD 4.X). Wenn Sie einen netzwerkintensiven Server (z.B. einen großen FTP- oder HTTP-Server) betreiben, kann es sein, dass Sie der Meinung sind, dass 256MB nicht ausreichen. Wie also erhöhen Sie den Adressraum? Hier gibt es zwei Aspekte. Erstens müssen Sie dem Kernel sagen, dass er einen größeren Anteil des Adressraums für sich selbst reservieren soll. Da der Kernel am oberen Ende des Adressraums geladen wird, müssen Sie zweitens die Ladeadresse verringern, damit er mit dem Kopf nicht gegen die Obergrenze stößt. Das erste Ziel erreicht man, indem man den Wert von NKPDE in src/sys/i386/include/pmap.h erhöht. Für einen Adressraum von 1 GB sieht das so aus: #ifndef NKPDE #ifdef SMP #define NKPDE 254 /* addressable number of page tables/pde's */ #else #define NKPDE 255 /* addressable number of page tables/pde's */ #endif /* SMP */ #endif Dividieren Sie die gewünschte Adressraumgröße (in Megabyte) durch vier und subtrahieren Sie dann eins für UP und zwei für SMP, um den korrekten Wert für NKPDE zu finden. Um das zweite Ziel zu erreichen müssen Sie die korrekte Ladeadresse berechnen: subtrahieren Sie einfach die Größe des Adressraums (in Byte) von 0x100100000; für einen Adressraum von 1 GB lautet das Ergebnis 0xc0100000. Setzen Sie LOAD_ADDRESS in src/sys/i386/conf/Makefile.i386 auf diesen Wert; setzen Sie dann den Location-Counter am Anfang der Abschnittsliste in src/sys/i386/conf/kernel.script auf denselben Wert: OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) ENTRY(btext) SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/obj/elf/home/src/tmp/usr/i386-unknown-freebsdelf/lib); SECTIONS { /* Read-only sections, merged into text segment: */ . = 0xc0100000 + SIZEOF_HEADERS; .interp : { *(.interp) } Konfigurieren und erstellen Sie Ihren Kernel dann neu. Sie werden vermutlich Probleme mit &man.ps.1;, &man.top.1; und ähnlichen Programmen haben. Ein make world sollte diese beheben; alternativ können Sie die gepatchte pmap.h in das Verzeichnis /usr/include/vm kopieren und danach libkvm, &man.ps.1; und &man.top.1; neu erzeugen. Hinweis: die Größe des Kernel-Adressraums muss ein Vielfaches von vier Megabyte betragen. [&a.dg; fügt hinzu: Ich glaube, der Kerneladressraum muss eine Zweierpotenz sein, aber ich bin mir dessen nicht sicher. Der alte (ältere) Bootcode pflegte die oberen Adressbits zu mißbrauchen und ich glaube, er erwartete mindestens 256MB Granularität.] Danksagung Dieses kleine unschuldige Dokument mit Häufig gestellten Fragen wurde in den letzten 10 Jahren von Hunderten, wenn nicht Tausenden, geschrieben, neu geschrieben, überarbeitet, gefaltet, verdreht, durcheinander gebracht, wieder aufgebaut, verstümmelt, seziert, durchgekaut, überdacht, und wiederbelebt. Und das nicht nur einmal. Wir möchten allen dafür Verantwortlichen danken und wir fordern auch Sie auf, dieser Gruppe beizutreten, um diese FAQ noch besser zu machen. Folgende Personen haben durch die Beantwortung von Fragen, sowie durch Hinweise und Kommentare an der Entstehung der deutschen Übersetzung mitgewirkt: Ross Alexander &a.jhb; &a.nik; Glen Foster Oliver Fromme Frank Gruender Chris Hill James Howard &a.jkh; &a.alex; &a.jmas; Mike Meyer Dan O'Connor Eric Ogren &a.de.pierau; Oliver Schneider Christoph Sold Und an alle anderen, an die wir nicht gedacht haben. Entschuldigung und herzlichen Dank! &bibliography;
diff --git a/de_DE.ISO8859-1/books/fdp-primer/the-website/chapter.sgml b/de_DE.ISO8859-1/books/fdp-primer/the-website/chapter.sgml index 94f4410366..c94c95463f 100644 --- a/de_DE.ISO8859-1/books/fdp-primer/the-website/chapter.sgml +++ b/de_DE.ISO8859-1/books/fdp-primer/the-website/chapter.sgml @@ -1,461 +1,461 @@ Johann Kois Übersetzt von Die Webseite Vorbereitung Sorgen Sie für genügend Plattenplatz (zwischen 200 und 500 MB). Der genaue Wert hängt davon ab, welche Methode Sie zum Bau der Webseiten verwenden. Dieser Platz wird von den SGML-Werkzeugen, den benötigten Teilen des CVS-Baums, für temporären Speicher zum Bau der Seiten sowie für die Installation der Webseiten benötigt. Stellen Sie sicher, dass Ihre Dokumentationsports aktuell sind. Wenn Sie sich nicht sicher sind, entfernen Sie die alten Ports mit &man.pkg.delete.1;, bevor Sie die neue Version installieren. Derzeit wird unter anderem jade-1.2 vorausgesetzt. Haben Sie beispielsweise jade-1.1 installiert, deinstallieren Sie es mit: &prompt.root; pkg_delete jade-1.1 Sie haben zwei Möglichkeiten, an die für den Bau der Webseiten nötigen Dateien zu gelangen: Sie können csup verwenden, um eine lokale Kopie der Dateien von einem CVSup-Server herunterzuladen. Dies ist die einfachste Methode, da Sie keine zusätzlichen Programme installieren müssen. Das im nächsten Abschnitt beschriebene supfile lädt jeweils die aktuellste Version der benötigten Dateien herunter. Diese Methode ist ausreichend, wenn Sie die Webseiten nur lokal bauen wollen, aber keine Veränderungen committen wollen. Seit &os; 6.2-RELEASE ist &man.csup.1; Teil des &os;-Basissystems. Verwenden Sie eine ältere &os;-Version, müssen Sie net/csup über die Ports-Sammlung installieren. Alternativ verwenden Sie cvsup im cvs-Modus, um ein lokales CVS-Repository zu erzeugen und zu verwalten. Dazu müssen Sie zwar ein zusätzliches Programm (net/cvsup-without-gui) installieren, haben aber zusätzliche Möglichkeiten, etwa die Verwaltung verschiedener Revisionen der doc/www-Dateien und deren Historie. Außerdem erlaubt es diese Methode Ihnen, Veränderungen in das zentrale &os;-CVS-Repository zu committen. Die einfache Methode: <command>csup</command> verwenden csup ist Teil des &os;-Basissystems und wird inzwischen von den meisten Benutzern zur Aktualisierung der Ports-Sammlung verwendet. Das folgende supfile kann dazu verwendet werden, um die zum Bau der Webseiten benötigten Dateien auszuchecken: # # This file checks out all collections required to rebuild # the FreeBSD website # # Use the nearest CVSup mirror # listed at http://www.freebsd.org/doc/handbook/mirrors.html. *default host=cvsup10.FreeBSD.org *default base=/var/db *default prefix=/usr/build *default release=cvs tag=. *default delete use-rel-suffix *default compress # This will retrieve the entire doc branch of the FreeBSD repository. doc-all # This will retrieve the files required for the website www # This will retrieve some basic ports info required for the build ports-base Ändern Sie den Eintrag default host in einen CVSup-Spiegelserver in Ihrer Nähe, bevor Sie mit dem Checkout beginnen. Außerdem sollten Sie den Eintrag default prefix ändern, wenn Sie die ausgecheckten Dateien an einem anderen Ort speichern wollen. Danach speichern Sie die Datei beispielsweise als doc-www-supfile ab und führen den folgenden Befehl aus: &prompt.root; csup doc-www-supfile Nachdem dieser Befehl ausgeführt wurde, finden Sie drei neue Verzeichnisse, doc/, www/ sowie ports/ im Verzeichnis, das Sie durch den Eintrag default prefix (in unserem Beispiel /usr/build) festgelegt haben. Wir werden das gleiche Verzeichnis für den Bau der Webseiten verwenden, achten Sie daher unbedingt darauf, dass Sie über genügend Plattenplatz auf dieser Partition verfügen. Das ist alles. Sie können nun mit dem Bau der Webseiten beginnen. Die flexible Methode: Ein lokales doc/www-<application>CVS</application>-Repository verwenden Diese Methode bietet Ihnen (wie bereits erwähnt), mehr Flexibilität, Sie müssen aber den Port oder das Paket net/cvsup-without-gui installieren. Um net/cvsup-without-gui über die Ports-Sammlung zu installieren, muss zusätzlich der Port lang/ezm3 (ein Modula 3-Compiler) installiert werden. Die Installation dieses Ports ist sehr zeitintensiv, daher ist es in der Regel am einfachsten, CVSup als Paket (Package) zu installieren. CVSup besitzt einen speziellen cvs-Modus, mit dem Sie ,v-Dateien (aus denen ein CVS-Repository besteht) auschecken können. Dies ist mit csup derzeit noch nicht möglich. Weiterführende Informationen zu CVSup finden Sie im Abschnitt Synchronisation der Quellen des &os;-Handbuchs. Das supfile im folgenden Beispiel checkt alle cvs-Sammlungen aus, die Sie für den Bau der Webseiten benötigen und speichert Sie in einem lokalen CVS-Repository: # # This file will create a local CVS repository # with the collections required for a complete # FreeBSD website rebuild. It should be used with # cvsup *only* (csup will not work) *default host=cvsup10.FreeBSD.org *default base=/var/db *default prefix=/usr/dcvs *default release=cvs *default delete use-rel-suffix *default compress # The following collections are needed # for the website build ports-base doc-all www # These collections are needed # for CVS functionality cvsroot-common cvsroot-ports cvsroot-doc Ändern Sie den Eintrag default host in einen CVSup-Spiegelserver in Ihrer Nähe, bevor Sie mit dem Checkout beginnen. Außerdem sollten Sie den Eintrag default prefix ändern, wenn Sie die ausgecheckten Dateien an einem anderen Ort speichern wollen. Danach speichern Sie die Datei beispielsweise als doc-www-cvsfile ab und führen den folgenden Befehl aus: &prompt.root; cvsup doc-www-cvsfile Zusätzlich sollten Sie die Umgebungsvariable CVSROOT in den Startdateien Ihrer Shell setzen. Dazu nehmen Sie beispielsweise den folgenden Eintrag in die Datei ~/.cshrc auf (wenn Sie die csh einsetzen): setenv CVSROOT /usr/dcvs Wenn Sie diese Variable gesetzt haben, können Sie die Option (siehe weiter unten) weglassen, wenn Sie cvs-Operationen im Repository ausführen: Derzeit benötigen Sie für ein Repository, das nur die zum Bau der Webseiten nötigen Dateien enthält, mehr als 400 MB freien Plattenplatz. Der Bau der Webseiten erfordert temporär weitere 200 MB. Nachdem cvsup seine Arbeit beendet hat, können Sie die Dateien in das Verzeichnis, in dem Sie die Webseiten bauen wollen, auschecken: &prompt.root; mkdir /usr/build &prompt.root; cd /usr/build &prompt.root; cvs /usr/dcvs co doc www ports Der letzte Befehl entspricht dem Auschecken der Dateien von einem CVSup-Server mit csup. Danach haben Sie ein Bau-Verzeichis analog zur csup-Methode. cvsup erlaubt es Ihnen auch, Ihr CVS-Repository regelmäßig zu aktualisieren. Im Gegensatz zum ersten Aufruf dauern diese Aktualisierungen in der Regel nur wenige Minuten. Die Webseiten bauen Nachdem Sie eine der beiden Methoden erfolgreich ausgeführt haben, können Sie mit dem Bau der Webseiten beginnen. In unserem Beispiel erfolgt der Bau im Verzeichnis /usr/build, in dem sich bereits alle benötigten Dateien befinden. Wechseln Sie in das Bau-Verzeichis. &prompt.root; cd /usr/build Sie starten den Bau der Webseiten, indem Sie in das Unterverzeichnis www/en wechseln und dort den Befehl &man.make.1; all ausführen. &prompt.root; cd www/en &prompt.root; make all Installieren der Webseiten auf Ihrem Server Wechseln Sie wieder in das Verzeichnis en, falls Sie dieses inzwischen verlassen haben. &prompt.root; cd /usr/build/www/en Führen Sie &man.make.1; install - aus, und setzen Sie die Variable DESTDIR auf + aus und setzen Sie die Variable DESTDIR auf das Verzeichnis, in das Sie die Webseiten installieren wollen. &prompt.root; env DESTDIR=/usr/local/www make install Wenn Sie die Webseiten bereits früher in dieses Verzeichnis installiert haben, wurden während der Installation keine veralteten Seiten entfernt. Wenn Sie die Webseiten beispielsweise täglich neu bauen und installieren, findet und entfernt der folgende Befehl alle Dateien, die in den letzten drei Tagen nicht aktualisiert wurden: &prompt.root; find /usr/local/www 3 | xargs rm Umgebungsvariablen CVSROOT Der Ort des CVS-Baums. Sie sollten diese Variable setzen, wenn Sie die CVSup-Methode verwenden. &prompt.root; CVSROOT=/usr/dcvs; export CVSROOT CVSROOT ist eine Umgebungsvariable. Sie müssen sie daher auf der Kommandozeile oder in Ihren .dot-Dateien (beispielsweise in ~/.profile) setzen. Die genaue Syntax hängt von der von Ihnen eingesetzten Shell (das letzte Beispiel gilt nur für die bash und bash-ähnliche Shells) ab. ENGLISH_ONLY Ist diese Variable gesetzt und nicht leer, bauen und installieren die Makefiles ausschließlich die englischen Dokumente. Sämtliche Übersetzungen werden dabei ignoriert. Dazu ein Beispiel: &prompt.root; make ENGLISH_ONLY=YES all install Wenn Sie die Variable ENGLISH_ONLY deaktivieren und alle Webseiten inklusive aller Übersetzungen bauen wollen, setzen Sie die Variable ENGLISH_ONLY auf einen leeren Wert: &prompt.root; make ENGLISH_ONLY="" all install clean WEB_ONLY Ist diese Variable gesetzt und nicht leer, bauen und installieren die Makefiles nur die HTML-Seiten des Verzeichnisses www. Alle Dokumente des doc-Verzeichnisses (Handbuch, FAQ, Artikel) werden dabei ignoriert: &prompt.root; make WEB_ONLY=YES all install WEB_LANG Ist diese Variable gesetzt, wird die Dokumentation nur - für die durch diese Variable gestgelegten Sprachen + für die durch diese Variable festgelegten Sprachen gebaut und im Verzeichnis www installiert. Alle weiteren Sprachen (ausgenommen Englisch) werden ignoriert. Dazu ein Beispiel: &prompt.root; make WEB_LANG="el es hu nl" all install NOPORTSCVS Ist diese Variable gesetzt, checken die Makefiles keine Dateien aus dem Ports-CVS-Repository aus. Stattdessen werden die Dateien aus dem Verzeichnis /usr/ports (oder aus dem Verzeichnis, auf das die Variable PORTSBASE zeigt) verwendet. WEB_ONLY, ENGLISH_ONLY, - WEB_LANG, und NOPORTSCVS + WEB_LANG und NOPORTSCVS sind Variablen für Makefiles. Diese werden entweder in /etc/make.conf, in Makefile.inc oder als Umgebungsvariablen auf der Kommandozeile oder in Ihrer Konfigurationsdatei gesetzt. diff --git a/de_DE.ISO8859-1/books/fdp-primer/writing-style/chapter.sgml b/de_DE.ISO8859-1/books/fdp-primer/writing-style/chapter.sgml index 1326ba7cba..0a2015f696 100644 --- a/de_DE.ISO8859-1/books/fdp-primer/writing-style/chapter.sgml +++ b/de_DE.ISO8859-1/books/fdp-primer/writing-style/chapter.sgml @@ -1,534 +1,534 @@ Johann Kois Übersetzt von Der Schreibstil Damit von verschiedenen Autoren geschriebene Dokumente zueinander konsistent bleiben, gibt es einige Richtlinien, denen Autoren bei der Erstellung ihrer Dokumente folgen müssen. Verwendung von amerikanischem Englisch Es gibt mehrere englische Varianten und damit verbunden verschiedene Schreibweisen für das gleiche Wort. Wo dies der Fall ist, ist die amerikanische Schreibweise zu verwenden. Man schreibt daher color statt colour, rationalize statt rationalise, und so weiter. Die Verwendung von Britischem Englisch ist akzeptabel, wenn es sich um einen neuen Beitrag handelt, solange die gesamte Schreibweise eines Dokuments einheitlich bleibt. Alle anderen Dokumente wie Bücher, Internetseiten, Manualpages und andere müssen allerdings amerikanisches Englisch verwenden. Vermeiden von Zusammenziehungen Verwenden Sie keine Zusammenziehungen, sondern schreiben Sie die Phrase immer aus. Die Schreibweise Don't use contractions. wäre also nicht korrekt. Die Vermeidung von Zusammenziehungen sorgt für einen etwas formelleren Ton, ist präziser und erleichtert die Arbeit der Übersetzer. Nutzung von Kommas bei Aufzählungen Bei einer Aufzählung innerhalb eines Absatzes sollten Sie zwischen den einzelnen Begriffen Kommas setzen. Zwischen dem letzten und vorletzten Begriff setzen Sie ein Komma und das Wort und. Dazu ein Beispiel:
Das ist eine Liste von ein, zwei und drei Dingen.
Handelt es sich dabei um eine Liste von drei Begriffen, ein, zwei, und drei, oder um eine Liste von zwei Begriffen, ein und zwei und drei? Es ist daher besser, explizit ein serielles Komma zu setzen:
Das ist eine Liste von ein, zwei, und drei Dingen.
Vermeidung von redundanten Begriffen Versuchen Sie, keine redundanten Phrasen zu verwenden. Dies gilt insbesondere für die Ausdrücke der Befehl, die Datei, und man command. Die folgenden zwei Beispiele veranschaulichen dies für Befehle. Bevorzugt wird die Schreibweise des zweiten Beispiels. Verwenden Sie den Befehl cvsup, um Ihre Quellen zu aktualisieren. Verwenden Sie cvsup, um Ihre Quellen zu aktualisieren. Analoges gilt für Dateinamen, wobei wiederum die zweite Schreibweise bevorzugt wird. … in der Datei /etc/rc.local … in /etc/rc.local Auch für Manualpages gibt es zwei Schreibweisen. Auch hier wird die zweite Schreibweise bevorzugt (das zweite Beispiel nutzt das Tag citerefentry). Weitere Informationen finden Sie in man csh. Weitere Informationen finden Sie in &man.csh.1;. Zwei Leerzeichen am Satzende Verwenden Sie immer zwei Leerzeichen am Ende eines Satzes. Dadurch erhöht sich die Lesbarkeit des Textes und die Nutzung von Werkzeugen wie Emacs wird vereinfacht. Nun könnte man behaupten, dass ein Punkt vor einem Großbuchstaben das Satzende markiert. Vor allem bei Namen, beispielsweise bei Jordan K. Hubbard, ist dies allerdings nicht der Fall. Wir haben hier ein großes K, gefolgt von einem Punkt und einem Leerzeichen. Dennoch handelt es sich nicht um den Anfang eines neuen Satzes.
Eine ausführliche Beschreibung des korrekten Schreibstils finden Sie im Buch Elements of Style von William Strunk. Anleitungen für einen korrekten Schreibstil Damit die Quellen der Dokumentation selbst dann konsistent bleiben, wenn viele Leute daran arbeiten, folgen Sie bitte den folgenden Konventionen. Groß- und Kleinschreibung Tags werden in Kleinbuchstaben geschrieben, Sie schreiben also para, nicht PARA. Text im SGML-Kontext wird hingegen in Großbuchstaben geschrieben. Man schreibt also <!ENTITY…> und <!DOCTYPE…>, nicht <!entity…> und <!doctype…>. Abkürzungen (Akronyme) Abkürzungen sollten bei ihrer ersten Verwendung immer ausgeschrieben werden. Man schreibt also beispielsweise Network Time Protocol (NTP). Nachdem die Abkürzung definiert wurde, sollte hingegen nur noch die Abkürzung verwendet werden, es sei denn, die Verwendung des - gesamten Begriffes macht im jeweiligen Kontext mehr Sinn. + gesamten Begriffes ergibt im jeweiligen Kontext mehr Sinn. Im Normalfall werden Akronyme in jedem Dokument nur einmal definiert. Es ist allerdings auch möglich, sie für jedes Kapitel erneut zu definieren. Die drei ersten Vorkommen der Abkürzung sollten in acronym-Tags eingeschlossen werden. Zusätzlich wird ein role-Attribut mit dem vollständigen Begriff definiert. Dadurch kann ein Link zu einem Glossar erzeugt werden. Außerdem wird der komplette Begriff angezeigt, wenn man den Mauscursor über die Abkürzung bewegt. Einrückung Die erste Zeile jeder Datei hat die Einrückung 0, und zwar unabhängig von der Einrückung der Datei, in der sie enthalten ist. Öffnende Tags erhöhen die Einrückung um zwei Leerzeichen. Schließende Tags verringern sie hingegen um zwei Leerzeichen. Ein Block von acht Leerzeichen wird durch einen Tabulator ersetzt. Ein solcher Block beginnt immer am Anfang einer Zeile, führende Leerzeichen sind hier also nicht erlaubt. Vermeiden Sie außerdem Leerzeichen am Zeilenende. Der Inhalt von Elementen wird um zwei Leerzeichen eingerückt, wenn er sich über mehr als eine Zeile erstreckt. Der Quellcode dieses Abschnitts sieht daher in etwa so aus: ... ... Einrückung Die erste Zeile jeder Datei hat die Einrückung 0, und zwar unabhängig von der Einrückung der Datei, in der sie enthalten ist. ...
]]> Wenn Sie Emacs oder XEmacs verwenden, um Ihre Dateien zu bearbeiten, sollte der sgml-mode automatisch geladen werden, und die lokalen Emacs-Variablen am Ende einer Datei sollten diesen Stil erzwingen. Verwenden Sie Vim, sollten Sie Ihren Editor so konfigurieren: augroup sgmledit autocmd FileType sgml set formatoptions=cq2l " Special formatting options autocmd FileType sgml set textwidth=70 " Wrap lines at 70 columns autocmd FileType sgml set shiftwidth=2 " Automatically indent autocmd FileType sgml set softtabstop=2 " Tab key indents 2 spaces autocmd FileType sgml set tabstop=8 " Replace 8 spaces with a tab autocmd FileType sgml set autoindent " Automatic indentation augroup END Die korrekte Schreibweise von Tags Einrücken von Tags Tags, die die gleiche Einrückung aufweisen wie das vorangegangene Tag, sollten durch eine Leerzeile getrennt werden, Tags mit unterschiedlicher Einrückung hingegen nicht: NIS October 1999 ... ... ... ... ... ... ... ]]> Gliederung von Tags Tags wie zum Beispiel itemizedlist, die immer weitere Tags einschließen und selbst keine Zeichen enthalten, befinden sich immer in einer eigenen Zeile. Tags wie para und term können selbst Text enthalten, und ihr Inhalt beginnt direkt nach dem Tag, und zwar in der gleichen Zeile. Dies gilt analog, wenn diese zwei Tag-Arten wieder geschlossen werden. Eine Vermischung dieser Tags kann daher zu Problemen führen. Wenn auf ein Start-Tag, das keine Zeichen enthalten kann, unmittelbar ein Tag folgt, das andere Tags einschließen muss, um Zeichen darzustellen, befinden sich diese Tags auf verschiedenen Zeilen. Das zweite Tag wird dabei entsprechend eingerückt. Wenn ein Tag, das Zeichen enthalten kann, direkt nach einem Tag, das keine Zeichen enthalten kann, geschlossen wird, befinden sich beide Tags in der gleichen Zeile. Markup-Änderungen (<foreignphrase>white space changes</foreignphrase>) Wenn Sie Änderungen committen, committen Sie niemals Inhalts- und Formatierungsänderungen zur gleichen Zeit. Nur auf diese Weise können die Übersetzungs-Teams sofort erkennen, welche Änderungen durch Ihren Commit verursacht wurden, ohne darüber nachdenken zu müssen, ob sich der Inhalt einer Zeile oder nur deren Formatierung geändert hat. Nehmen wir an, Sie haben zwei Sätze in einen Absatz eingefügt. Daher sind zwei Zeilen nun länger als 80 Zeichen. Zuerst committen Sie Ihre inhaltliche Änderung inklusive der zu langen Zeilen. Im nächsten Commit korrigieren Sie den Zeilenumbruch und geben in der Commit-Mitteilung an, dass es sich nur um Änderung am Markup handelt (whitespace-only change), und Übersetzer den Commit daher ignorieren können. Vermeiden von fehlerhaften Zeilenumbrüchen (Nutzung von <foreignphrase>non-breaking space</foreignphrase>) Vermeiden Sie Zeilenumbrüche an Stellen, an denen diese - häßlich aussehen oder es erschweren, einem Satz zu + hässlich aussehen oder es erschweren, einem Satz zu folgen. Zeilenumbrüche hängen von der Breite des gewählten Ausgabemedium ab. Insbesondere bei der Verwendung von Textbrowsern können schlecht formatierte Absätze wie der folgende entstehen: Data capacity ranges from 40 MB to 15 GB. Hardware compression … Die Nutzung der Entity &nbsp; verhindert Zeilenumbrüche zwischen zusammengehörenden Teilen. Verwenden Sie non-breaking spaces daher in den folgenden Fällen: Zwischen Zahlen und Einheiten: Zwischen Programmnamen und Versionsnummern: Zwischen mehreren zusammengehörenden Wörtern (Vorsicht bei Namen, die aus mehr als 3-4 Wörtern bestehen, wie The FreeBSD Brazilian Portuguese Documentation Project): Häufig verwendete Wörter Die folgende Liste enthält einige Beispiele, wie bestimmte Wörter innerhalb des FreeBSD Documentation Projects geschrieben werden. Finden Sie ein gesuchtes Wort hier nicht, sehen Sie bitte in der Liste häufig verwendeter Wörter von O'Reilly nach. 2.2.X 4.X-STABLE CD-ROM DoS (Denial of Service) Ports Collection IPsec Internet MHz Soft Updates Unix disk label email file system manual page mail server name server null-modem web server diff --git a/de_DE.ISO8859-1/books/porters-handbook/book.sgml b/de_DE.ISO8859-1/books/porters-handbook/book.sgml index 5398deb4f3..25582e059b 100644 --- a/de_DE.ISO8859-1/books/porters-handbook/book.sgml +++ b/de_DE.ISO8859-1/books/porters-handbook/book.sgml @@ -1,14079 +1,14667 @@ %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. 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 - graphics - grafische Werkzeuge. + gnustep* + Software für GNUstep. - 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. - - tcl80* - Ports, welche Tcl 8.0 benötigen. - - - - - tcl82* - Ports, welche Tcl 8.2 benötigen. - - - - - tcl83* - Ports, welche Tcl 8.3 benötigen. - - - - - tcl84* - Ports, welche Tcl 8.4 benötigen. - - - textproc Textverarbeitungsprogramme. Dies beinhaltet nicht DTP-Werkzeuge, diese gehören in print. tk* Ports, welche Tk benötigen. - - tk80* - Ports, welche Tk 8.0 benötigen. - - - - - tk82* - Ports, welche Tk 8.2 benötigen. - - - - - tk83* - Ports, welche Tk 8.3 benötigen. - - - - - tk84* - Ports, welche Tk 8.4 benötigen. - - - - - tkstep80* - Ports, welche TkSTEP 8.0 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 + url="&url.articles.committers-guide;/article.html#PORTS">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 + 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 mit einem 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 \ - wish8.0:${PORTSDIR}/x11-toolkits/tk80 + 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 - wish8.0 im Suchpfad vorhanden ist und + xmlcatmgr im Suchpfad vorhanden ist und danach zum Unterverzeichnis - x11-toolkits/tk80 in Ihrer + 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/Mk/bsd.*.mk - standardisiert sind. Andere sind es nicht, - was verwirrend sein kann. Falls Sie eine solche - Konfigurationsvariable hinzufügen müssen, - dann nehmen Sie bitte eine aus der folgenden Liste. + 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. - Die + <title>Häufige <makevar>WITH_<replaceable>*</replaceable></makevar> und <makevar> WITHOUT_<replaceable>*</replaceable></makevar>-Variablen Variable Bedeutung - - WITH_APACHE2 - - Falls gesetzt, benutze - www/apache20 - anstelle der Vorgabe www/apache13. - - - - WITH_BERKELEY_DB - - Definiere diese Variable, um die - Fähigkeit zu erhalten, eine Variante - der Berkeley Database wie z.B. databases/db41 zu - nutzen. Eine verwandte Variable, - WITH_BDB_VER, kann mit Werten - wie 2, 3, 4, 41 oder 42 festgelegt werden. - - - - WITH_MYSQL - - Definiere diese Variable, um die - Fähigkeit zu erhalten, eine Variante - von MySQL zu nutzen wie z.B. databases/mysql40-server. - Eine verwandte Variable ist, - WANT_MYSQL_VER, welche - mit Werten wie 323, 40, 41, oder 50 - belegt werden kann. - - 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 - Nutze die Version von OpenSSL aus security/openssl und - überschreibe die Version, welche original - im Basissystem installiert wurde. - - - - WITH_POSTGRESQL - - Definiere diese Variable, um die - Fähigkeit zu erhalten, eine Variante - der Datenbank PostGreSQL wie databases/postgresql72 - auszuwählen. + 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.pre.mk erscheinen. Die WITH_* und WITHOUT_*-Variablen können nur nach der Einbindung von bsd.port.pre.mk getestet werden. Beispiel Einfache Anwendung von <makevar>OPTIONS</makevar> OPTIONS= FOO "Enable option foo" On \ BAR "Support feature bar" Off .include <bsd.port.pre.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.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 <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 - ${CONFIGURE_TARGET}), setzen Sie diese + --build=${CONFIGURE_TARGET}), setzen Sie diese zusätzlichen Argumente in CONFIGURE_ARGS. Zusätzliche Umgebungsvariablen können überdie Variable CONFIGURE_ENV übergeben werden. - Wenn Ihr Paket GNU configure - benutzt und die entstandene Binärdatei hat einen - komischen Namen wie - i386-portbld-freebsd4.7-appname, - dann müssen Sie zusätzlich die - CONFIGURE_TARGET-Variable setzen, - um das Target so anzugeben, wie Skripten, die von neueren - Versionen von autoconf erzeugt wurden, - es erwarten. Fügen Sie das Folgende direkt nach der - Zeile GNU_CONFIGURE=yes in Ihrem - Makefile hinzu: - - CONFIGURE_TARGET=--build=${MACHINE_ARCH}-portbld-freebsd${OSREL} - 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.00503). PERL_VER Die kurze Angabe der installierten perl-Version (z.B. 5.005). PERL_LEVEL Die installierte perl-Version als ein Integer der Form MNNNPP (z.B. 500503). 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= ${X11BASE}/bin/xfs:${X_FONTSERVER_PORT} \ - ${X11BASE}/lib/X11/fonts/cyrillic/crox1c.pcf.gz:${X_FONTS_CYRILLIC_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_XLIB= yes +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 - X11BASE/lib/X11/fonts/local. + 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 den FreeBSD - Package-Building-Cluster, der ohne Display läuft, - ein Problem dar. Wenn der folgende kanonische Hack - benutzt wird, startet der Package-Building-Cluster den + 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+=${X11BASE}/include \ - LIBS+=-L${X11BASE}/lib sillyapp.pro + ${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=${X11BASE} + --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%%, - %%LOCALBASE%% und - %%X11BASE%% wird dringend empfohlen. + %%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%% gibt die vollständige Versionsnummer von perl (z.B. 5.00502) und %%PERL_VER%% die Versionsnummer ohne Patchlevel (z.B. 5.005) 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. Der erste Schritt ist + 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, X11BASE, + 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_X_PREFIX oder - USE_IMAKE gesetzt ist, - wird PREFIX X11BASE - entsprechen (aus - Kompatiblitätsgründen standardmäßig - LOCALBASE, das in Zukunft aber - komplett verschwinden wird). 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. - Bitte verzichten Sie auf das Setzen von - USE_X_PREFIX, es sei denn, Ihr Port - benötigt dies wirklich (das heißt, er muss auf - Dateien in X11BASE verweisen). - 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 Release __FreeBSD_version 2.0-RELEASE 119411 2.1-CURRENT 199501, 199503 2.0.5-RELEASE 199504 2.2-CURRENT vor 2.1 199508 2.1.0-RELEASE 199511 2.2-CURRENT vor 2.1.5 199512 2.1.5-RELEASE 199607 2.2-CURRENT vor 2.1.6 199608 2.1.6-RELEASE 199612 2.1.7-RELEASE 199612 2.2-RELEASE 220000 2.2.1-RELEASE 220000 (keine Änderung) 2.2-STABLE nach 2.2.1-RELEASE 220000 (keine Änderung) 2.2-STABLE nach texinfo-3.9 221001 2.2-STABLE nach top 221002 2.2.2-RELEASE 222000 2.2-STABLE nach 2.2.2-RELEASE 222001 2.2.5-RELEASE 225000 2.2-STABLE nach 2.2.5-RELEASE 225001 2.2-STABLE nach der Aufnahme von ldconfig -R 225002 2.2.6-RELEASE 226000 2.2.7-RELEASE 227000 2.2-STABLE nach 2.2.7-RELEASE 227001 2.2-STABLE nach &man.semctl.2; Änderung 227002 2.2.8-RELEASE 228000 2.2-STABLE nach 2.2.8-RELEASE 228001 3.0-CURRENT vor &man.mount.2; Änderung 300000 3.0-CURRENT nach &man.mount.2; Änderung 300001 3.0-CURRENT nach &man.semctl.2; Änderung 300002 3.0-CURRENT nach ioctl arg Änderungen 300003 3.0-CURRENT nach ELF-Konvertierung 300004 3.0-RELEASE 300005 3.0-CURRENT nach 3.0-RELEASE 300006 3.0-STABLE nach 3/4 Zweig 300007 3.1-RELEASE 310000 3.1-STABLE nach 3.1-RELEASE 310001 3.1-STABLE nach Änderung der C++ Konstruktor/Destruktor-Reihenfolge 310002 3.2-RELEASE 320000 3.2-STABLE 320001 3.2-STABLE nach binär-inkompatibler IPFW und Socket-Änderungen 320002 3.3-RELEASE 330000 3.3-STABLE 330001 3.3-STABLE nach Hinzufügen von &man.mkstemp.3; zur libc 330002 3.4-RELEASE 340000 3.4-STABLE 340001 3.5-RELEASE 350000 3.5-STABLE 350001 4.0-CURRENT nach 3.4 Zweig 400000 4.0-CURRENT nach der Änderung im Verhalten des dynamischen Linkers. 400001 4.0-CURRENT nach Änderung der C++ Konstruktor/Destruktor Reihenfolge. 400002 4.0-CURRENT nach funktionierendem &man.dladdr.3;. 400003 4.0-CURRENT nach der __deregister_frame_info Fehlerbehebung für den dynamischen Linker (auch 4.0-CURRENT nach EGCS 1.1.2 Integration). 400004 4.0-CURRENT nach &man.suser.9; API Änderung (auch 4.0-CURRENT nach newbus). 400005 4.0-CURRENT nach Änderung der cdevsw-Registrierung. 400006 4.0-CURRENT nach Hinzufügen von so_cred für Zugangsberechtigungen auf Socket-Ebene. 400007 4.0-CURRENT nach Hinzufügen eines poll Syscall-Wrappers zur libc_r. 400008 4.0-CURRENT nach der Änderung des Kernel dev_t-Typs zum struct specinfo-Zeiger. 400009 4.0-CURRENT nach dem Beseitigen eines Fehlers in &man.jail.2;. 400010 4.0-CURRENT nach der sigset_t Datentyp Änderung. 400011 4.0-CURRENT nach dem Wechsel zum GCC 2.95.2-Compiler. 400012 4.0-CURRENT nach Hinzufügen der erweiterbaren Linux Mode ioctl-Routinen. 400013 4.0-CURRENT nach dem OpenSSL-Import. 400014 4.0-CURRENT nach der C++ ABI Änderung in GCC 2.95.2 von -fvtable-thunks zu -fno-vtable-thunks als Standard. 400015 4.0-CURRENT nach OpenSSH-Import. 400016 4.0-RELEASE 400017 4.0-STABLE nach 4.0-RELEASE 400018 4.0-STABLE nach der Einführung von verzögerten Prüfsummen. 400019 4.0-STABLE nach dem Einpflegen des libxpg4-Quelltextes in die libc. 400020 4.0-STABLE nach der Aktualisierung von Binutils auf 2.10.0, Änderungen der binären ELF-Markierungen, Aufnahme von tcsh ins Basissystem. 400021 4.1-RELEASE 410000 4.1-STABLE nach 4.1-RELEASE 410001 4.1-STABLE nachdem &man.setproctitle.3; von der libutil in die libc verschoben wurde. 410002 4.1.1-RELEASE 411000 4.1.1-STABLE nach 4.1.1-RELEASE 411001 4.2-RELEASE 420000 4.2-STABLE nach Kombinaion von libgcc.a und libgcc_r.a und zugehörigen Änderungen der GCC-Bindungen. 420001 4.3-RELEASE 430000 4.3-STABLE nach der Einführung von wint_t. 430001 4.3-STABLE nach dem Einpflegen der PCI Stromstatus-API. 430002 4.4-RELEASE 440000 4.4-STABLE nach der Einführung von d_thread_t. 440001 4.4-STABLE nach den Änderungen der mount-Struktur (betrifft Dateisystem-Kernelmodule). 440002 4.4-STABLE nachdem die Userland-Komponenten von smbfs importiert worden sind. 440003 4.5-RELEASE 450000 4.5-STABLE nach der Umbenennung von Elementen der USB-Struktur. 450001 4.5-STABLE nachdem die sendmail_enable &man.rc.conf.5; Variable geändert worden ist, um den Wert NONE zu akzeptieren. 450004 4.5-STABLE nachdem XFree86 4 als Standard zum Bauen der Pakete benutzt wird. 450005 4.5-STABLE nach dem Reparieren des Empfangsfilters, welcher anfällig für einfache DoS-Attacken war. 450006 4.6-RELEASE 460000 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. 460001 4.6.2-RELEASE 460002 4.6-STABLE 460100 4.6-STABLE nach dem Einfließen von `sed -i' aus CURRENT. 460101 4.6-STABLE nach dem Einfließen von vielen neuen pkg_install-Funktionen aus HEAD (HEAD = die aktuellste und letzte Version des Quellverzeichnisbaumes). 460102 4.7-RELEASE 470000 4.7-STABLE 470100 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. 470101 4.7-STABLE nach dem Einfliessen von mbuf-Änderungen, um m_aux mbufs mit denen von m_tag zu ersetzen 470102 4.7-STABLE erhält OpenSSL 0.9.7 470103 4.8-RELEASE 480000 4.8-STABLE 480100 4.8-STABLE nachdem &man.realpath.3; Thread-sicher gemacht wurde. 480101 4.8-STABLE Änderung der 3ware-API in twe. 480102 4.9-RELEASE 490000 4.9-STABLE 490100 4.9-STABLE nachdem e_sid zu der Struktur kinfo_eproc hinzugefügt wurde. 490101 4.9-STABLE nach dem Einfliessen der libmap-Funktionalität für rtld. 490102 4.10-RELEASE 491000 4.10-STABLE 491100 4.10-STABLE nach dem Einfliessen von Revision 20040629 der Paket-Werkzeuge aus CURRENT. 491101 4.10-STABLE nach der Fehlerbehebung in der VM, um das Freigeben von fiktiven Speicherseiten korrekt zu handhaben. 491102 4.11-RELEASE 492000 4.11-STABLE 492100 4.11-STABLE nach dem Hinzufügen von libdata/ldconfig Verzeichnissen zu den mtree-Dateien. 492101 5.0-CURRENT 500000 5.0-CURRENT nach Hinzufügen von zusätzlichen Feldern in den ELF-Headern und Ändern der Methode zur ELF-Markierung von Binärdateien. 500001 5.0-CURRENT nach kld-Metadaten Änderungen. 500002 5.0-CURRENT nach buf/bio Änderungen. 500003 5.0-CURRENT nach binutils Aktualisierung. 500004 5.0-CURRENT nach dem Einfliessen des libxpg4 Quelltextes in die libc und der Einführung der TASKQ-Schnittstelle. 500005 5.0-CURRENT nach dem Hinzufügen der AGP-Schnittstellen. 500006 5.0-CURRENT nach der Aktualisierung von Perl auf Version 5.6.0. 500007 5.0-CURRENT nach der Aktualisierung des KAME-Quelltextes zu den 2000/07-Quellen. 500008 5.0-CURRENT nach ether_ifattach() und ether_ifdetach() Änderungen. 500009 5.0-CURRENT nachdem die mtree-Standards zurück zur ursprünglichen Variante geändert wurden; -L hinzugefügt, um Symlinks zu folgen. 500010 5.0-CURRENT nachdem die kqueue-API geändert worden ist. 500011 5.0-CURRENT nachdem &man.setproctitle.3; von libutil nach libc verschoben worden ist. 500012 5.0-CURRENT nach dem ersten SMPng-Commit. 500013 5.0-CURRENT nachdem <sys/select.h> nach <sys/selinfo.h> verschoben worden ist. 500014 5.0-CURRENT nach dem Kombinieren von libgcc.a und libgcc_r.a und damit verbundene Änderungen an GCC-Bindungen. 500015 5.0-CURRENT nach der Änderung das Zusammenbinden von libc und libc_r zu erlauben, womit die -pthread Option veraltet ist. 500016 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. 500017 5.0-CURRENT nach dem Hinzufügen der CPUTYPE make Variable zum Kontrollieren von CPU-spezifischen Optimierungen. 500018 5.0-CURRENT nach dem Verschieben von machine/ioctl_fd.h nach sys/fdcio.h 500019 5.0-CURRENT nach der Umbenennung der locale-Namen. 500020 5.0-CURRENT nach dem Bzip2-Import. Kennzeichnet auch, dass S/Key entfernt wurde. 500021 5.0-CURRENT nach SSE Unterstützung. 500022 5.0-CURRENT nach KSE-Meilenstein 2. 500023 5.0-CURRENT nach d_thread_t, und nachdem UUCP in die Ports verschoben worden ist. 500024 5.0-CURRENT nach Änderungen in der ABI bei der Weitergabe von Deskriptoren und Berechtigungen auf 64 Bit Plattformen. 500025 5.0-CURRENT nachdem XFree86 4 als Standard zum Erstellen der Pakete benutzt wird und die neue libc strnstr()-Funktion hinzugefügt wurde. 500026 5.0-CURRENT nachdem die neue libc strcasestr()-Funktion hinzugefügt wurde. 500027 5.0-CURRENT nachdem die Userland-Komponenten von smbfs importiert wurden. 500028 5.0-CURRENT nachdem die neuen C99-Ganzzahlen mit spezifischer Breite hinzugefügt wurden. (Nicht hochgezählt.) 5.0-CURRENT nachdem eine Änderung im Rückgabewert von &man.sendfile.2; gemacht wurde. 500029 5.0-CURRENT nach der Einführung des Types fflags_t, welches die passende Größe für Dateiflags hat. 500030 5.0-CURRENT nach der Umbenennung der USB elements-Struktur. 500031 5.0-CURRENT nach der Einführung von Perl 5.6.1. 500032 5.0-CURRENT nachdem die sendmail_enable &man.rc.conf.5; Variable geändert worden ist, um den Wert NONE zu akzeptieren. 500033 5.0-CURRENT nachdem mtx_init() einen dritten Parameter entgegen nimmt. 500034 5.0-CURRENT mit GCC 3.1. 500035 5.0-CURRENT ohne Perl in /usr/src 500036 5.0-CURRENT nach dem Hinzufügen von &man.dlfunc.3; 500037 5.0-CURRENT nachdem die Typen von einigen Elementen der sockbuf-Struktur geändert wurden und nachdem die Struktur neu geordnet wurde. 500038 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. 500039 5.0-CURRENT nachdem verschiedene Änderungen an Plattenfunktionen gemacht wurden, um die Anhängigkeit von Interna der disklabel-Struktur zu entfernen. 500040 5.0-CURRENT nach dem Hinzufügen von &man.getopt.long.3; zur libc. 500041 5.0-CURRENT nach der Aktualisierung von Binutils auf 2.13, bei denen die FreeBSD-Emulation, vec und das Ausgabeformat geändert wurden. 500042 5.0-CURRENT nach dem Hinzufügen schwacher pthread_XXX Stubs zur libc, womit libXThrStub.so veraltet ist. 5.0-RELEASE. 500043 5.0-CURRENT nach dem Erstellen des RELENG_5_0-Zweiges 500100 <sys/dkstat.h> ist leer und sollte nicht inkludiert werden. 500101 5.0-CURRENT nach der Änderung in der d_mmap_t-Schnittstelle. 500102 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. 500103 cdevsw_add() und cdevsw_remove() gibt es nicht länger. Auftauchen der MAJOR_AUTO-Allokationsmöglichkeit. 500104 5.0-CURRENT nach der neuen cdevsw-Initialisierungsmethode. 500105 devstat_add_entry() wurde durch devstat_new_entry() ersetzt. 500106 Devstat Schnittstellenänderung; siehe sys/sys/param.h 1.149. 500107 Token-Ring Schnittstellenänderungen. 500108 Hinzufügen von vm_paddr_t. 500109 5.0-CURRENT nachdem &man.realpath.3; Thread-sicher gemacht wurde. 500110 5.0-CURRENT nachdem &man.usbhid.3; mit NetBSD synchronisiert wurde. 500111 5.0-CURRENT nach der neuen NSS Implementierung und Hinzufügen der POSIX.1 getpw*_r, getgr*_r Funktionen. 500112 5.0-CURRENT nach Entfernen des alten rc-Systems. 500113 5.1-RELEASE. 501000 5.1-CURRENT nach dem Erstellen des RELENG_5_1 Zweiges. 501100 5.1-CURRENT nachdem die Semantik von sigtimedwait(2) and sigwaitinfo(2) korrigiert wurden. 501101 5.1-CURRENT nach dem Hinzufügen der lockfunc und lockfuncarg-Felder zu &man.bus.dma.tag.create.9;. 501102 5.1-CURRENT nach der Integration des GCC 3.3.1-pre 20030711 Snapshots. 501103 5.1-CURRENT 3ware-API Änderungen in twe. 501104 5.1-CURRENT Unterstützung von dynamisch gebundenen /bin und /sbin und Verschieben von Bibliotheken nach /lib. 501105 5.1-CURRENT nachdem im Kernel Unterstützung für Coda 6.x hinzugefügt wurden. 501106 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. 501107 5.1-CURRENT nach Aktualisierung der PFIL_HOOKS API. 501108 5.1-CURRENT nachdem kiconv(3) hinzugefügt wurde. 501109 5.1-CURRENT nachdem der standardmäßige Ablauf von open und close in cdevsw geändert wurde. 501110 5.1-CURRENT nachdem das Layout von cdevsw geändert wurde. 501111 5.1-CURRENT nach dem Hinzufügen von Mehrfachvererbung in kobj. 501112 5.1-CURRENT nach der if_xname Änderung in der Struktur ifnet 501113 5.1-CURRENT nachdem /bin und /sbin geändert wurden, um sie dynamisch zu binden. 501114 5.2-RELEASE 502000 5.2.1-RELEASE 502010 5.2-CURRENT nach dem Erstellen des RELENG_5_2-Zweiges. 502100 5.2-CURRENT nachdem die __cxa_atexit/__cxa_finalize Funktionen zur libc hinzugefügt wurden. 502101 5.2-CURRENT nachdem die Standard-Thread Bibliothek von libc_r zu libpthread geändert wurde. 502102 5.2-CURRENT nach dem Gerätetreiber API Megapatch. 502103 5.2-CURRENT nachdem getopt_long_only() hinzugefügt wurde. 502104 5.2-CURRENT nachdem NULL für C in ((void *)0) geändert wurde, was mehr Warnungen erzeugt. 502105 5.2-CURRENT nachdem pf beim Bauen und Installieren mit eingebunden wird. 502106 5.2-CURRENT nachdem time_t auf der sparc64-Plattform in einen 64-bit Wert geändert wurde. 502107 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. 502108 5.2-CURRENT nach der Einführung der bus_alloc_resource_any API 502109 5.2-CURRENT nach dem Hinzufügen von UTF-8 locales 502110 5.2-CURRENT nach dem Entfernen der getvfsent(3) API 502111 5.2-CURRENT nach dem Hinzufügen der .warning Directive für make. 502112 5.2-CURRENT nachdem ttyioctl() zwingend erforderlich für serielle Treiber gemacht wurde. 502113 5.2-CURRENT nach dem Import des ALTQ-Frameworks. 502114 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. 502115 5.2-CURRENT nach dem Ändern der Kernel Struktur dev_t, in ein Zeiger auf die Struktur cdev * 502116 5.2-CURRENT nach dem Ändern der Kernelstruktur udev_t in dev_t. 502117 5.2-CURRENT nachdem Unterstützung für CLOCK_VIRTUAL und CLOCK_PROF zu clock_gettime(2) und clock_getres(2) hinzugefügt wurde. 502118 5.2-CURRENT nachdem die Überprüfung des Klonens von Netzwerk-Schnittstellen geändert wurde. 502119 5.2-CURRENT nach dem Einfliessen von Revision 20040629 der Paket-Werkzeuge. 502120 5.2-CURRENT nachdem Bluetooth-Quelltext als nicht i386-spezifisch markiert wurde. 502121 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. 502122 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. 502123 5.2-CURRENT nachdem die Art und Weise, wie rc.d-Skripte von Ports und Altlasten gestartet werden, getrennt wurde. 502124 5.2-CURRENT nachdem die vorherige Änderung rückgängig gemacht wurde. 502125 5.2-CURRENT nach dem Entfernen von kmem_alloc_pageable() und dem Import von GCC 3.4.2. 502126 5.2-CURRENT nachdem die UMA Kernel API geändert wurde, um Konstruktoren und Initialisierungsmethoden zu erlauben fehlzuschlagen. 502127 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. 502128 5.3-BETA/RC vor der Änderung der pfil-API. 503000 5.3-RELEASE 503001 5.3-STABLE nach dem Erstellen des RELENG_5_3-Zweiges. 503100 5.3-STABLE nach dem Hinzufügen von Fülloptionen im Stile der libc zu &man.strftime.3;. 503101 5.3-STABLE nachdem OpenBSD's nc(1) von CURRENT importiert wurde. 503102 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. 503103 5.4-PRERELEASE nach dem Einfliessen der Änderung aus CURRENT in ifi_epoch statt der lokalen Zeit die Betriebszeit des Systems zu benutzen. 503104 5.4-PRERELEASE nach dem Einfliessen der Reparaturen von EOVERFLOW in vswprintf(3) aus CURRENT. 503105 5.4-RELEASE. 504000 5.4-STABLE nach dem Erstellen des RELENG_5_4-Zweiges. 504100 5.4-STABLE nach dem Vergrößern der standardmäßigen Stackgröße für Threads. 504101 5.4-STABLE nach dem Hinzufügen von sha256. 504102 5.4-STABLE nach dem Einfliessen von if_bridge aus CURRENT. 504103 5.4-STABLE nach dem Einfliessen von bsdiff und portsnap aus CURRENT. 504104 5.4-STABLE nach dem Einfliessen der Änderung von ldconfig_local_dirs aus CURRENT. 504105 5.5-RELEASE. 505000 5.5-STABLE nach dem Erstellen des RELENG_5_5-Zweiges. 505100 6.0-CURRENT 600000 6.0-CURRENT nach der festen Aktivierung von PFIL_HOOKS im Kernel. 600001 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. 600002 6.0-CURRENT nach dem erneuten Hinzufügen des Elements ifi_epoch zur Struktur if_data. 600003 6.0-CURRENT nach dem Hinzufügen der Struktur inpcb als Argument in der pfil API. 600004 6.0-CURRENT nach dem Hinzufügen des "-d DESTDIR" Schalters zu newsyslog. 600005 6.0-CURRENT nach dem Hinzufügen von Fülloptionen im Style der libc zu &man.strftime.3;. 600006 6.0-CURRENT nach dem Hinzufügen von 802.11 Framework Neuerungen. 600007 6.0-CURRENT Änderung an den VOP_*VOBJECT() Funktionen und Einführung des MNTK_MPSAFE Schalters für Dateisysteme, welche ohne Giant arbeiten. 600008 6.0-CURRENT nach dem Hinzufügen von cpufreq Framework und Treibern. 600009 6.0-CURRENT nachdem OpenBSD's nc(1) importiert wurde. 600010 6.0-CURRENT nachdem der Anschein von matherr() Unterstützung in SVID2 entfernt wurde. 600011 6.0-CURRENT nach dem Vergrößern der standardmäßigen Stackgröße für Threads. 600012 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. 600013 6.0-CURRENT nachdem die Überprüfungen auf EOVERFLOW in vswprintf(3) korrigiert wurden. 600014 6.0-CURRENT nach dem Einfliessen der Änderung, in ifi_epoch, statt der lokalen Zeit, die Betriebzeit des Systems zu benutzen. 600015 6.0-CURRENT nachdem das Format von LC_CTYPE auf der Festplatte verändert wurde. 600016 6.0-CURRENT nachdem das Format der NLS-Kataloge auf der Festplatte verändert wurde. 600017 6.0-CURRENT nachdem das Format von LC_COLLATE auf der Festplatte verändert wurde. 600018 Installation der acpica Include-Dateien in /usr/include. 600019 Hinzufügen des MSG_NOSIGNAL Schalters zur send(2) API. 600020 Hinzufügen von Feldern zu cdevsw 600021 gtar wurde aus dem Basissystem entfernt. 600022 Die Optionen LOCAL_CREDS, LOCAL_CONNWAIT für Sockets wurde zu unix(4) hinzugefügt. 600023 &man.hwpmc.4; und zugehörige Werkzeuge wurden zu 6.0-CURRENT hinzugefügt. 600024 Die Struktur icmphdr wurden zu 6.0-CURRENT hinzugefügt. 600025 pf Aktualisierung auf 3.7. 600026 Kernel libalias und ng_nat wurden eingeführt. 600027 POSIX ttyname_r(3) wurde über unistd.h und libc zur Verfügung gestellt. 600028 6.0-CURRENT nachdem libpcap zu Version v0.9.1 alpha 096 aktualisiert wurde. 600029 6.0-CURRENT nach dem Import von NetBSDs if_bridge(4). 600030 6.0-CURRENT nachdem die Struktur ifnet aus dem Treiber softcs herausgelöst wurde. 600031 6.0-CURRENT nach dem Import von libpcap v0.9.1. 600032 6.0-STABLE nachdem die Versionen aller gemeinsam genutzten Bibliotheken, welche seit RELENG_5 nicht geändert wurden, erhöht wurden. 600033 6.0-STABLE nachdem das Argument credential zu der dev_clone-Ereignisbehandlung hinzugefügt wurde. 6.0-RELEASE. 600034 6.0-STABLE nach dem Erstellen des 6.0-RELEASE-Zweiges. 600100 6.0-STABLE nach dem Aufnehmen von Skripten aus den local_startup-Verzeichnissen in &man.rcorder.8; des Basissystems. 600101 6.0-STABLE nach dem Aktualisieren der ELF-Typen und Konstanten. 600102 6.0-STABLE nach dem Einfliessen der pidfile(3)-API aus CURRENT. 600103 6.0-STABLE nach dem Einfliessen der Änderung von ldconfig_local_dirs aus CURRENT. 600104 6.0-STABLE nach der NLS-Katalogunterstützung von csh(1). 600105 6.1-RELEASE 601000 6.1-STABLE nach 6.1-RELEASE. 601100 6.1-STABLE nach dem Import von csup. 601101 6.1-STABLE nach der iwi(4)-Aktualisierung. 601102 6.1-STABLE nach der Aktualisierung der Namensauflösung zu BIND9 und Aufnahme der ablaufinvarianten Versionen der netdb-Funktionen. 601103 6.1-STABLE nachdem Unterstützung für DSO (dynamic shared objects - gemeinsam genutzte, dynamische Objekte) in OpenSSL aktiviert wurde. 601104 6.1-STABLE nachdem 802.11 Reparaturen die API der IEEE80211_IOC_STA_INFO ioctl geändert haben. 601105 6.2-RELEASE 602000 6.2-STABLE nach 6.2-RELEASE. 602100 6.2-STABLE nach dem Hinzufügen der Wi-Spy Eigenart. 602101 6.2-STABLE nachdem pci_find_extcap() hinzugefügt wurde. 602102 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. 602103 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. 602104 6.2-STABLE nach dem Einpflegen der BSD lizensierten Version von &man.gzip.1;, welche von NetBSD portiert wurde aus CURRENT. 602105 6.2-STABLE nach dem Einpflegen der PCI MSI und MSI-X Unterstützung aus CURRENT. 602106 6.2-STABLE nach dem Einpflegen von ncurses 5.6 und Unterstützung für Multibyte-Zeichen aus CURRENT. 602107 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. 602108 6.2-STABLE nach dem Einpflegen von readline 5.2 Patchset 002 aus CURRENT. 602109 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. 602110 6.2-STABLE nach dem Einpflegen von BOP_BDFLUSH aus CURRENT und dem daraus resultierendem Bruch mit dem Dateisystemmodul KBI. 602111 6.2-STABLE nach dem Einpflegen von libutil(3) aus CURRENT. 602112 + 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. 602113 + 6.2-STABLE, nachdem die ctype ABI-Aufwärtskompatibilität wiederhergestellt wurde. 602114 + FreeBSD 6.2-STABLE nach der Entfernung/Eliminierung der wide und single Byte ctype-Trennung 602115 + 6.3-RELEASE 603000 + 6.3-STABLE nach 6.3-RELEASE. 603100 + 6.3-STABLE, nachdem der Support für den Multibyte-Datentyp im Bit-Makro gefixt wurde. 603101 + + + 6.3-STABLE nach Hinzufügen von l_sysid zu + struct flock. + 603102 + + + + 6.3-STABLE nach Einfließen der + memrchr-Funktion. + 603103 + + + + 6.3-STABLE nach Übernahme der + Unterstützung von :u als + Variablenwandler in make(1). + 603104 + + + + 6.4-RELEASE + 604000 + + + + 6.4-STABLE nach 6.4-RELEASE. + 604100 + + 7.0-CURRENT. 700000 7.0-CURRENT nachdem die Versionen aller gemeinsam genutzten Bibliothken, welche seit RELENG_5 nicht geändert wurden, erhöht wurden. 700001 7.0-CURRENT nachdem ein Berechtigungs-Argument zur dev_clone-Ereignisroutine hinzugefügt wurde. 700002 7.0-CURRENT nachdem memmem(3) zur libc hinzugefügt wurde. 700003 7.0-CURRENT nachdem die Argumente der Kernelfunktion solisten(9) modifiziert wurden, um einen Backlog-Parameter (Anzahl der maximalen wartenden Verbindungen) zu akzeptieren. 700004 7.0-CURRENT nachdem IFP2ENADDR() geändert wurde, einen Zeiger auf IF_LLADDR() zurückzugeben. 700005 7.0-CURRENT nach dem Hinzufügen des if_addr-Elements zur Struktur ifnet und dem Entfernen von IFP2ENADDR(). 700006 7.0-CURRENT nach dem Aufnehmen von Skripten aus den local_startup Verzeichnissen in &man.rcorder.8; des Basissystems. 700007 7.0-CURRENT nach dem Entfernen der MNT_NODEV mount-Option. 700008 7.0-CURRENT nach ELF-64 Typen Änderungen und Symbol Versionierung. 700009 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. 700010 7.0-CURRENT nachdem auf allen Plattformen außer Alpha tv_sec in time_t umgewandelt wurde. 700011 7.0-CURRENT nach Änderung von ldconfig_local_dirs. 700012 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. 700013 7.0-CURRENT nach pts Import. 700014 7.0-CURRENT nach Einführung von Version 2 der &man.hwpmc.4;'s ABI. 700015 7.0-CURRENT nach dem Hinzufügen von &man.fcloseall.3; zur libc. 700016 7.0-CURRENT nach dem Entfernen von ip6fw. 700017 7.0-CURRENT nach dem Import von snd_emu10kx. 700018 7.0-CURRENT nach dem Import von OpenSSL 0.9.8b. 700019 7.0-CURRENT nach dem Hinzufügen der bus_dma_get_tag-Funktion 700020 7.0-CURRENT nach dem Import von libpcap 0.9.4 und tcpdump 3.9.4. 700021 7.0-CURRENT nach der dlsym Änderung, ein angefordertes Symbol sowohl in der spezifizierten dso, als auch in den impliziten Abhängigkeiten nachzuschlagen. 700022 7.0-CURRENT nach dem Hinzufügen neuer Sound-IOCTLs. 700023 7.0-CURRENT nach dem Import von OpenSSL 0.9.8d. 700024 7.0-CURRENT nach dem Hinzufügen der libelf. 700025 7.0-CURRENT nach größeren Änderungen an den Sound sysctls. 700026 7.0-CURRENT nach dem Hinzufügen der Wi-Spy-Eigenart. 700027 7.0-CURRENT nach dem Hinzufügen von sctp-Aufrufen zur libc. 700028 7.0-CURRENT nach dem Ersetzen von GNU &man.gzip.1; durch eine von NetBSD portierte Version, die unter BSD-Lizenz steht. 700029 7.0-CURRENT nach dem Entfernen der IPIP Tunnelkapselung (VIFF_TUNNEL) aus dem IPv4 Multicast-Forwarding-Quelltext. 700030 7.0-CURRENT nach den Modifizierungen an bus_setup_intr() (newbus). 700031 7.0-CURRENT nach der Aufnahme der Firmware für ipw(4) und iwi(4). 700032 7.0-CURRENT nach Unterstützung für Multibyte-Zeichen. 700033 7.0-CURRENT nach Änderungen, wie insmntque(), getnewvnode() und vfs_hash_insert() arbeiten. 700034 7.0-CURRENT nach Hinzufügen eines Benachrichtigungsmechanismus für CPU Frequenzänderungen. 700035 7.0-CURRENT nach dem Import des ZFS Dateisystemes. 700036 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. 700037 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. 700038 7.0-CURRENT nachdem die Änderungen von 700038 rückgängig gemacht wurden. 700039 7.0-CURRENT nach dem Hinzufügen von &man.flopen.3; zur libutil. 700040 7.0-CURRENT nachdem Symbol Versionierung aktiviert und die standardmäßige Thread-Bibliothek zu libthr geändert wurde. 700041 7.0-CURRENT nach dem Import von GCC 4.2.0. 700042 7.0-CURRENT nachdem die Versionen aller Shared-Libraries, welche seit RELENG_6 nicht geändert wurden, erhöht worden sind. 700043 7.0-CURRENT nachdem das Argument für vn_open()/VOP_OPEN() vom Dateideskriptorindex zur Struktur file * geädert wurde. 700044 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. 700045 7.0-CURRENT nach aktualisierter 802.11 wireless Unterstützung. 700046 7.0-CURRENT, nachdem TCP-LRO-Schnittstellen-Ressourcen hinzugefügt wurden. 700047 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. 700048 7.0-CURRENT, nachdem pf von OpenBSD 4.1 importiert wurde 700049 7.0-CURRENT, nachdem die IPv6-Unterstützung um FAST_IPSEC erweitert, KAME IPSEC entfernt und FAST_IPSEC in IPSEC umbenannt wurde. (nicht geändert) 7.0-CURRENT, nachdem Aufrufe von setenv/putenv/usw. von der traditionellen BSD-Art und Weise nach POSIX konvertiert wurden. 700050 7.0-CURRENT, nachdem neue Systemaufrufe (mmap/lseek/usw.) implementiert wurden. 700051 7.0-CURRENT, nachdem die I4B-Header nach include/i4b verschoben wurden. 700052 + 7.0-CURRENT, nachdem die Unterstützung für PCI Domänen hinzugefügt wurde. 700053 + 7.0-CURRENT, nach der Trennung in "wide und single byte ctype". 700054 + 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. 700055 + 7.0-STABLE nach 7.0-RELEASE. 700100 + + + 7.0-STABLE nach Einführung von + m_collapse(). + 700101 + + + + 7.0-STABLE nach Einfließen von + kdb_enter_why(). + 700102 + + + + 7.0-STABLE nach Hinzufügen von l_sysid zu + struct flock. + 700103 + + + + 7.0-STABLE nach Übernahme von + procstat(1). + 700104 + + + + 7.0-STABLE nach Einführung von + umtx-Features. + 700105 + + + + 7.0-STABLE nach Hinzufügen der + Unterstützung von &man.write.2; zu + &man.psm.4;. + 700106 + + + + 7.0-STABLE nach Hinzufügen des Befehls + F_DUP2FD zu &man.fcntl.2;. + 700107 + + + + 7.0-STABLE nach einigen Änderungen an + &man.lockmgr.9;, welche die Einbindung von + sys/lock.h zur Verwendung von + &man.lockmgr.9; voraussetzen. + 700108 + + + + 7.0-STABLE nach Einfließen der + memrchr-Funktion. + 700109 + + + + 7.0-STABLE nach Einführung eines Clients + für den Kernel NFS lockd. + 700110 + + + + 7.0-STABLE nach Hinzufügen einer + Unterstützung von physisch fortlaufender + Jumbo Frames. + 700111 + + + + 7.0-STABLE nach Einfließen einer + Kernelunterstützung für DTrace. + 700112 + + + + 7.1-RELEASE + 701000 + + + + 7.1-STABLE nach 7.1-RELEASE. + 701100 + + + + 7.1-STABLE nach Übernahme von + strndup. + 701101 + + + + 7.1-STABLE nach Hinzufügen einer + Unterstützung von cpuctl(4). + 701102 + + 8.0-CURRENT. Nach der Trennung in "wide und single byte ctype". 800000 + 8.0-CURRENT, nachdem libpcap 0.9.8 und tcpdump 3.9.8 importiert wurden. 800001 + 8.0-CURRENT, nachdem kthread_create() und Konsorten in kproc_create() usw. umbenannt wurden. 800002 + 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. 800003 + 8.0-CURRENT, nachdem der agp(4) Treiber verschoben wurde von src/sys/pci nach src/sys/dev/agp. 800004 + + + 8.0-CURRENT nach Änderungen + am Jumbo Frame Allocator. + 800005 + + 8.0-CURRENT, nach dem Hinzufügen der callgraph capture Funktionalität zu &man.hwpmc.4;. 800006 + 8.0-CURRENT nach dem Hinzufügen von "why" als Argument in kdb_enter(). 800007 + + + 8.0-CURRENT nach Entfernen der Option + LK_EXCLUPGRADE. + 800008 + + + + 8.0-CURRENT nach Einführung von + &man.lockmgr.disown.9; + 800009 + + + + 8.0-CURRENT nach Änderungen am + &man.vn.lock.9;-Prototyp. + 800010 + + + + 8.0-CURRENT nach Änderungen an den + Prototypen von &man.VOP.LOCK.9; und + &man.VOP.UNLOCK.9;. + 800011 + + + + 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(). + 800012 + + + + 8.0-CURRENT nach Einführung der + ASCII-Kodierung. + 800013 + + + + 8.0-CURRENT nach Änderungen am + &man.lockmgr.9;-Prototyp und Entfernung von + lockcount() sowie + LOCKMGR_ASSERT(). + 800014 + + + + 8.0-CURRENT nach Erweiterung der Datentypen der + &man.fts.3;-Strukturen. + 800015 + + + + 8.0-CURRENT nach Hinzufügen eines neuen + Parameters zu MEXTADD(9). + 800016 + + + + 8.0-CURRENT nach Einführung der Optionen + LK_NODUP und LK_NOWITNESS in die + &man.lockmgr.9;-Umgebung. + 800017 + + + + 8.0-CURRENT nach Hinzufügen von + m_collapse. + 800018 + + + + 8.0-CURRENT nach Hinzufügen einer Arbeits-, + Wurzel- und Jailverzeichnisunterstützung zur + sysctl-Variable kern.proc.filedesc. + 800019 + + + + 8.0-CURRENT nach Einführung der Funktionen + &man.lockmgr.assert.9; und + BUF_ASSERT. + 800020 + + + + 8.0-CURRENT nach Einführung von + &man.lockmgr.args.9; und Entfernung der Option + LK_INTERNAL. + 800021 + + + + 8.0-CURRENT nach Setzen von BSD &man.ar.1; + als Systemstandard. + 800022 + + + + 8.0-CURRENT nach Prototypenänderungen an + &man.lockstatus.9; und &man.VOP.ISLOCKED.9;, eigens zur + Abschaffung des Parameters + struct thread. + 800023 + + + + 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;. + 800024 + + + + 8.0-CURRENT nach Hinzufügen des Kommandos + F_DUP2FD zu &man.fcntl.2;. + 800025 + + + + 8.0-CURRENT nach Änderung des Parameters + für die Priorität an cv_broadcastpri, sodass + 0 für keine Priorität steht. + 800026 + + + + 8.0-CURRENT nach Änderung der + Monitoring ABI von BPF, als Zero-Copy Puffer + hinzugefügt wurden. + 800027 + + + + 8.0-CURRENT nach Hinzufügen von l_sysid zu + struct flock. + 800028 + + + + 8.0-CURRENT nach Wiedereingliederung der Funktion + BUF_LOCKWAITERS und + Hinzufügen von &man.lockmgr.waiters.9;. + 800029 + + + + 8.0-CURRENT nach Einführung der Funktionen + &man.rw.try.rlock.9; und &man.rw.try.wlock.9;. + 800030 + + + + 8.0-CURRENT nach Einführung der Funktionen + lockmgr_rw und + lockmgr_args_rw. + 800031 + + + + 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. + 800032 + + + + 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. + 800033 + + + + 8.0-CURRENT nach Einführung der Funktion + memrchr. + 800034 + + + + 8.0-CURRENT nach Einführung der Funktion + fdopendir. + 800035 + + + + 8.0-CURRENT nach Umstellung des Standards 802.11 + auf Unterstützung von Multi-BSS (auch + vaps). + 800036 + + + + 8.0-CURRENT nach Hinzufügen einer + Unterstützung für + Multi Routing-Tabellen (siehe setfib(1), + setfib(2)). + 800037 + + + + 8.0-CURRENT nach Entfernen von netatm und + ISDN4BSD. + 800038 + + + + 8.0-CURRENT nach Entfernen von sgtty. + 800039 + + + + 8.0-CURRENT nach Einführung eines Clients + für den Kernel NFS lockd. + 800040 + + + + 8.0-CURRENT nach Hinzufügen von + arc4random_buf(3) und arc4random_uniform(3). + 800041 + + + + 8.0-CURRENT nach Hinzufügen von + cpuctl(4). + 800042 + + + + 8.0-CURRENT nach Änderung von bpf(4) zur + Verwendung einer einzelnen Gerätedatei anstatt + von Klonierung. + 800043 + + + + 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. + 800044 + + + + 8.0-CURRENT nach Eingliederung des + MPSAFE TTY-Layers, einschließlich + Änderungen an diversen Treibern und Werkzeugen, + die mit ihm kommunizieren. + 800045 + + + + 8.0-CURRENT nach Abschottung der GDT pro CPU auf + der AMD64-Architektur. + 800046 + + + + 8.0-CURRENT nach Entfernen von VSVTX, VSGID und + VSUID. + 800047 + + + + 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. + 800048 + + + + 8.0-CURRENT nach Entfernen von &man.suser.9; und + &man.suser.cred.9;. + 800049 + + + + 8.0-CURRENT nach API-Änderungen im Umgang + mit dem Buffer Cache. + 800050 + + + + 8.0-CURRENT nach Entfernen der Makros + &man.MALLOC.9; und &man.FREE.9;. + 800051 + + + + 8.0-CURRENT nach Einführung von accmode_t + und Umbennung des Parameters a_mode an VOP_ACCESS nach + a_accmode. + 800052 + + + + 8.0-CURRENT nach Änderung des Prototyps von + &man.vfs.busy.9; und Einführung der Optionen + MBF_NOWAIT sowie MBF_MNTLSTLOCK. + 800053 + + + + 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. + 800054 + + + + 8.0-CURRENT nach Hinzufügen einer + Unterstützung für &intel; Core, Core2 + und Atom zu &man.hwpmc.4;. + 800055 + + + + 8.0-CURRENT nach Einführung von Jails mit + mehreren oder gar keinen IPv4-/IPv6-Adressen. + 800056 + + + + 8.0-CURRENT nach Wechsel zum + ath_hal Quellcode. + 800057 + + + + 8.0-CURRENT nach Einführung der Funktion + VOP_VPTOCNP. + 800058 + + + + 8.0-CURRENT gliedert das neue ARPv2 ein. + 800059 + + + + 8.0-CURRENT nach Hinzufügen von + makefs. + 800060 + + + + 8.0-CURRENT nach Umsetzung von + TCP Appropriate Byte Counting. + 800061 + + + + 8.0-CURRENT nach Entfernen von minor(), + minor2unit(), unit2minor() usw. + 800062 +
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/) - - X11BASE - Die Basis des X11 Verzeichnisbaumes - (z.B., /usr/X11R6) - - 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 net/cvsup-mirror an. Beachten Sie - bitte, dass wir von diesem Vorgehen stark abraten! Bitte - registrieren Sie Benutzer/Gruppen wie unten - beschrieben. - - Falls Ihr Port die gleichen Benutzer/Gruppen IDs - benutzen muss, egal ob als Binär-Paket installiert oder - als Port kompiliert, müssen Sie eine nicht benutzte UID + role="package">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. Für ein Beispiel schauen Sie sich bitte - japanese/Wnn6 an. + 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} und - ${X11BASE} installiert + ${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.