aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/de/books
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/content/de/books')
-rw-r--r--documentation/content/de/books/_index.adoc7
-rw-r--r--documentation/content/de/books/books.adoc4
-rw-r--r--documentation/content/de/books/developers-handbook/_index.adoc111
-rw-r--r--documentation/content/de/books/developers-handbook/bibliography/chapter.adoc40
-rw-r--r--documentation/content/de/books/developers-handbook/chapters-order.adoc12
-rw-r--r--documentation/content/de/books/developers-handbook/introduction/chapter.adoc130
-rw-r--r--documentation/content/de/books/developers-handbook/ipv6/chapter.adoc685
-rw-r--r--documentation/content/de/books/developers-handbook/kernelbuild/chapter.adoc84
-rw-r--r--documentation/content/de/books/developers-handbook/kerneldebug/chapter.adoc665
-rw-r--r--documentation/content/de/books/developers-handbook/l10n/chapter.adoc210
-rw-r--r--documentation/content/de/books/developers-handbook/policies/chapter.adoc366
-rw-r--r--documentation/content/de/books/developers-handbook/secure/chapter.adoc212
-rw-r--r--documentation/content/de/books/developers-handbook/sockets/chapter.adoc36
-rw-r--r--documentation/content/de/books/developers-handbook/testing/chapter.adoc71
-rw-r--r--documentation/content/de/books/developers-handbook/tools/chapter.adoc1228
-rw-r--r--documentation/content/de/books/developers-handbook/x86/chapter.adoc3879
-rw-r--r--documentation/content/de/books/faq/_index.adoc3057
-rw-r--r--documentation/content/de/books/faq/chapters-order.adoc1
-rw-r--r--documentation/content/de/books/handbook/_index.adoc53
-rw-r--r--documentation/content/de/books/handbook/advanced-networking/_index.adoc2831
-rw-r--r--documentation/content/de/books/handbook/audit/_index.adoc404
-rw-r--r--documentation/content/de/books/handbook/basics/_index.adoc1577
-rw-r--r--documentation/content/de/books/handbook/bibliography/_index.adoc152
-rw-r--r--documentation/content/de/books/handbook/book.adoc172
-rw-r--r--documentation/content/de/books/handbook/boot/_index.adoc419
-rw-r--r--documentation/content/de/books/handbook/bsdinstall/_index.adoc1062
-rw-r--r--documentation/content/de/books/handbook/chapters-order.adoc41
-rw-r--r--documentation/content/de/books/handbook/config/_index.adoc1525
-rw-r--r--documentation/content/de/books/handbook/cutting-edge/_index.adoc917
-rw-r--r--documentation/content/de/books/handbook/desktop/_index.adoc575
-rw-r--r--documentation/content/de/books/handbook/disks/_index.adoc2169
-rw-r--r--documentation/content/de/books/handbook/dtrace/_index.adoc238
-rw-r--r--documentation/content/de/books/handbook/eresources/_index.adoc1126
-rw-r--r--documentation/content/de/books/handbook/filesystems/_index.adoc97
-rw-r--r--documentation/content/de/books/handbook/firewalls/_index.adoc2230
-rw-r--r--documentation/content/de/books/handbook/geom/_index.adoc1131
-rw-r--r--documentation/content/de/books/handbook/introduction/_index.adoc214
-rw-r--r--documentation/content/de/books/handbook/jails/_index.adoc1087
-rw-r--r--documentation/content/de/books/handbook/kernelconfig/_index.adoc294
-rw-r--r--documentation/content/de/books/handbook/l10n/_index.adoc580
-rw-r--r--documentation/content/de/books/handbook/linuxemu/_index.adoc254
-rw-r--r--documentation/content/de/books/handbook/mac/_index.adoc933
-rw-r--r--documentation/content/de/books/handbook/mail/_index.adoc954
-rw-r--r--documentation/content/de/books/handbook/mirrors/_index.adoc598
-rw-r--r--documentation/content/de/books/handbook/multimedia/_index.adoc1072
-rw-r--r--documentation/content/de/books/handbook/network-servers/_index.adoc2475
-rw-r--r--documentation/content/de/books/handbook/parti.adoc20
-rw-r--r--documentation/content/de/books/handbook/partii.adoc20
-rw-r--r--documentation/content/de/books/handbook/partiii.adoc14
-rw-r--r--documentation/content/de/books/handbook/partiv.adoc21
-rw-r--r--documentation/content/de/books/handbook/partv.adoc10
-rw-r--r--documentation/content/de/books/handbook/pgpkeys/_index.adoc55
-rw-r--r--documentation/content/de/books/handbook/ports/_index.adoc1151
-rw-r--r--documentation/content/de/books/handbook/ppp-and-slip/_index.adoc833
-rw-r--r--documentation/content/de/books/handbook/preface/_index.adoc251
-rw-r--r--documentation/content/de/books/handbook/printing/_index.adoc734
-rw-r--r--documentation/content/de/books/handbook/security/_index.adoc2129
-rw-r--r--documentation/content/de/books/handbook/serialcomms/_index.adoc1366
-rw-r--r--documentation/content/de/books/handbook/usb-device-mode/_index.adoc261
-rw-r--r--documentation/content/de/books/handbook/virtualization/_index.adoc1078
-rw-r--r--documentation/content/de/books/handbook/x11/_index.adoc1411
-rw-r--r--documentation/content/de/books/handbook/zfs/_index.adoc2416
-rw-r--r--documentation/content/de/books/porters-handbook/_index.adoc83
-rw-r--r--documentation/content/de/books/porters-handbook/chapters-order.adoc14
-rw-r--r--documentation/content/de/books/porters-handbook/keeping-up/chapter.adoc67
-rw-r--r--documentation/content/de/books/porters-handbook/makefile/chapter.adoc1866
-rw-r--r--documentation/content/de/books/porters-handbook/own-port/chapter.adoc39
-rw-r--r--documentation/content/de/books/porters-handbook/pkg-files/chapter.adoc136
-rw-r--r--documentation/content/de/books/porters-handbook/plist/chapter.adoc209
-rw-r--r--documentation/content/de/books/porters-handbook/port-upgrading/chapter.adoc157
-rw-r--r--documentation/content/de/books/porters-handbook/porting-dads/chapter.adoc2762
-rw-r--r--documentation/content/de/books/porters-handbook/porting-samplem/chapter.adoc116
-rw-r--r--documentation/content/de/books/porters-handbook/quick-porting/chapter.adoc197
-rw-r--r--documentation/content/de/books/porters-handbook/security/chapter.adoc232
-rw-r--r--documentation/content/de/books/porters-handbook/slow/chapter.adoc143
-rw-r--r--documentation/content/de/books/porters-handbook/special/chapter.adoc2217
-rw-r--r--documentation/content/de/books/porters-handbook/testing/chapter.adoc99
-rw-r--r--documentation/content/de/books/porters-handbook/why-port/chapter.adoc30
78 files changed, 56115 insertions, 0 deletions
diff --git a/documentation/content/de/books/_index.adoc b/documentation/content/de/books/_index.adoc
new file mode 100644
index 0000000000..17572a88c5
--- /dev/null
+++ b/documentation/content/de/books/_index.adoc
@@ -0,0 +1,7 @@
+---
+title: Books
+---
+
+= Books
+
+{{< list-books-directories >}}
diff --git a/documentation/content/de/books/books.adoc b/documentation/content/de/books/books.adoc
new file mode 100644
index 0000000000..f428e3b577
--- /dev/null
+++ b/documentation/content/de/books/books.adoc
@@ -0,0 +1,4 @@
+handbook
+developers-handbook
+faq
+porters-handbook
diff --git a/documentation/content/de/books/developers-handbook/_index.adoc b/documentation/content/de/books/developers-handbook/_index.adoc
new file mode 100644
index 0000000000..18be34514d
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/_index.adoc
@@ -0,0 +1,111 @@
+---
+title: FreeBSD Developers' Handbook
+authors:
+ - author: The FreeBSD Documentation Project
+copyright: 1995-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "apple", "ibm", "ieee", "intel", "linux", "microsoft", "opengroup", "sun", "general"]
+---
+
+= FreeBSD Developers' Handbook
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Inhaltsverzeichnis
+:part-signifier: Teil
+:chapter-signifier: Kapitel
+:appendix-caption: Anhang
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+ifeval::["{backend}" == "html5"]
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+:imagesdir: ../../../../images/books/developers-handbook/
+:chapters-path: content/de/books/developers-handbook/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/de/mailing-lists.adoc[]
+include::../../../../shared/de/teams.adoc[]
+include::../../../../shared/de/urls.adoc[]
+:imagesdir: ../../../static/images/books/developers-handbook/
+:chapters-path:
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/de/mailing-lists.adoc[]
+include::../../../../shared/de/teams.adoc[]
+include::../../../../shared/de/urls.adoc[]
+:imagesdir: ../../../static/images/books/developers-handbook/
+:chapters-path:
+endif::[]
+
+[.abstract-title]
+[abstract]
+Zusammenfassung
+
+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 link:{developers-handbook}[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 {de-doc}.
+
+Die aktuelle Version dieses Handbuchs ist immer auf dem http://www.FreeBSD.org/[FreeBSD-Webserver] verfügbar und kann in verschiedenen Formaten und in komprimierter Form vom link:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc[FreeBSD-FTP-Server] oder einem der zahlreichen link:{handbook}#mirrors-ftp[Spiegel] heruntergeladen werden (ältere Versionen finden Sie hingegen unter http://docs.FreeBSD.org/doc/[http://docs.FreeBSD.org/doc/]).
+
+'''
+
+toc::[]
+
+// Section one
+[[basics]]
+= Grundlagen
+
+include::{chapters-path}introduction/chapter.adoc[leveloffset=+1, lines=7..22;33..-1]
+include::{chapters-path}tools/chapter.adoc[leveloffset=+1, lines=10..32;43..-1]
+include::{chapters-path}secure/chapter.adoc[leveloffset=+1, lines=9..25;36..-1]
+include::{chapters-path}l10n/chapter.adoc[leveloffset=+1, lines=7..23;34..-1]
+include::{chapters-path}policies/chapter.adoc[leveloffset=+1, lines=10..26;37..-1]
+include::{chapters-path}testing/chapter.adoc[leveloffset=+1, lines=7..23;34..-1]
+
+// Section two
+[[ipc]]
+= Interprozess-Kommunikation
+include::{chapters-path}sockets/chapter.adoc[leveloffset=+1, lines=9..25;36..-1]
+include::{chapters-path}ipv6/chapter.adoc[leveloffset=+1, lines=7..24;35..-1]
+
+// Section three
+[[kernel]]
+= Kernel
+include::{chapters-path}kernelbuild/chapter.adoc[leveloffset=+1, lines=7..23;34..-1]
+include::{chapters-path}kerneldebug/chapter.adoc[leveloffset=+1, lines=11..27;38..-1]
+
+// Section four
+[[architectures]]
+= Architekturen
+include::{chapters-path}x86/chapter.adoc[leveloffset=+1, lines=7..23;34..-1]
+
+// Appendices
+[[appendices]]
+= Anhang
+
+include::{chapters-path}bibliography/chapter.adoc[leveloffset=+1, lines=6..20;29..-1]
diff --git a/documentation/content/de/books/developers-handbook/bibliography/chapter.adoc b/documentation/content/de/books/developers-handbook/bibliography/chapter.adoc
new file mode 100644
index 0000000000..a2847e37ac
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/bibliography/chapter.adoc
@@ -0,0 +1,40 @@
+---
+title: Literaturverzeichnis
+prev: books/developers-handbook/x86
+---
+
+[bibliography]
+[[bibliography]]
+= Literaturverzeichnis
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums!:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: A
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+[[COD,1]] [1] Dave A Patterson and John L Hennessy. Copyright(R) 1998 Morgan Kaufmann Publishers, Inc. 1-55860-428-6. Morgan Kaufmann Publishers, Inc. Computer Organization and Design. The Hardware / Software Interface. 1-2.
+
+[[APUE, 2]] [2] W. Richard Stevens. Copyright(R) 1993 Addison Wesley Longman, Inc. 0-201-56317-7. Addison Wesley Longman, Inc. Advanced Programming in the Unix Environment. 1-2.
+
+[[DIFOS, 3]] [3] Marshall Kirk McKusick and George Neville-Neil. Copyright(R) 2004 Addison-Wesley. 0-201-70245-2. Addison-Wesley. The Design and Implementation of the FreeBSD Operating System. 1-2.
+
+[[Phrack, 4]] [4] Aleph One. Phrack 49; "Smashing the Stack for Fun and Profit".
+
+[[StackGuard, 5]] [5] Chrispin Cowan, Calton Pu, and Dave Maier. StackGuard; Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks.
+
+[[OpenBSD, 6]] [6] Todd Miller and Theo de Raadt. strlcpy and strlcat -- consistent, safe string copy and concatenation.
+
diff --git a/documentation/content/de/books/developers-handbook/chapters-order.adoc b/documentation/content/de/books/developers-handbook/chapters-order.adoc
new file mode 100644
index 0000000000..90183764d6
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/chapters-order.adoc
@@ -0,0 +1,12 @@
+introduction/chapter.adoc
+tools/chapter.adoc
+secure/chapter.adoc
+l10n/chapter.adoc
+policies/chapter.adoc
+testing/chapter.adoc
+sockets/chapter.adoc
+ipv6/chapter.adoc
+kernelbuild/chapter.adoc
+kerneldebug/chapter.adoc
+x86/chapter.adoc
+bibliography/chapter.adoc
diff --git a/documentation/content/de/books/developers-handbook/introduction/chapter.adoc b/documentation/content/de/books/developers-handbook/introduction/chapter.adoc
new file mode 100644
index 0000000000..be3e2fbe27
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/introduction/chapter.adoc
@@ -0,0 +1,130 @@
+---
+title: Kapitel 1. Einführung
+prev: books/developers-handbook/
+next: books/developers-handbook/tools
+---
+
+[[introduction]]
+= Einführung
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 1
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[introduction-devel]]
+== Unter FreeBSD entwickeln
+
+Hier sind wir also. Ihr System ist vollständig installiert und Sie wollen mit dem Programmieren beginnen. Aber womit sollen Sie anfangen? Was bietet Ihnen FreeBSD? Was kann es für einen Programmierer tun?
+
+Dies sind einige der Fragen, welche dieses Handbuch zu beantworten versucht. Natürlich gibt es, analog zu anderen Berufen, auch bei Programmierern unterschiedliche Leistungsniveaus. Für die einen ist es ein Hobby, für die anderen ist es der Beruf. Die Informationen in diesem Kapitel dürften eher für den Programmieranfänger geeignet sein; allerdings könnte es auch für Programmierer, die bisher nichts mit der FreeBSD-Plattform zu tun hatten, interessante Informationen enthalten.
+
+[[introduction-bsdvision]]
+== Die Vision von BSD
+
+Ziel ist es, das bestmögliche UNIX(R)-artige Betriebssystempaket zu erstellen, mit dem gebührenden Respekt gegenüber der Ideologie der ursprünglichen Software, sowie der Bedienbarkeit, Leistungsfähigkeit und Stabilität.
+
+[[introduction-archguide]]
+== Grundlegende Richtlinien
+
+Unsere Ideologie kann durch die folgenden Leitfäden beschrieben werden.
+
+* Füge keine neue Funktionalität hinzu, solange ein Programmierer diese nicht zur Fertigstellung einer realen Anwendung benötigt.
+* Zu entscheiden, was ein System ist, ist genauso wichtig wie zu entscheiden, was ein System nicht ist. Versuchen Sie nicht, alle möglichen Wünsche zu erfüllen; machen Sie lieber das System erweiterbar, so dass zusätzliche Bedürfnisse in einer aufwärtskompatiblen Weise bedient werden können.
+* Das Einzige, das schlimmer ist, als von einem Beispiel auf die Allgemeinheit zu schließen, ist, von überhaupt keinem Beispiel auf die Allgemeinheit zu schließen.
+* Solange ein Problem nicht vollständig verstanden wurde, ist es besser, keine Lösung bereitzustellen.
+* Wenn Sie 90% des gewünschten Effektes bei nur 10% des Aufwands erreichen können, sollten Sie besser die einfachere Lösung verwenden.
+* Grenzen Sie Komplexität so gut wie möglich ein.
+* Stellen Sie Mechanismen anstelle von Strategien bereit. Überlassen Sie insbesondere Strategien für die Benutzerschnittstelle dem Benutzerprogramm.
+
+Aus Scheifler & Gettys: "X Window System"
+
+[[introduction-layout]]
+== Der Aufbau von [.filename]#/usr/src#
+
+Der vollständige Quelltext von FreeBSD ist über unser öffentliches Repository verfügbar. Der Quelltext wird normalerweise in [.filename]#/usr/src# abgelegt und enthält die folgenden Unterverzeichnisse:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Verzeichnis
+| Beschreibung
+
+|[.filename]#bin/#
+|Quelldateien für Dateien in [.filename]#/bin#
+
+|[.filename]#cddl/#
+|Quelldateien für Programme, die unter der Common Development and Distribution License stehen
+
+|[.filename]#contrib/#
+|Quelldateien für Dateien von beigesteuerter Software
+
+|[.filename]#crypto/#
+|Quelldateien für die Kryptographie
+
+|[.filename]#etc/#
+|Quelldateien für Dateien in [.filename]#/etc#
+
+|[.filename]#games/#
+|Quelldateien für Dateien in [.filename]#/usr/games#
+
+|[.filename]#gnu/#
+|Programme, die unter der GNU Public License stehen
+
+|[.filename]#include/#
+|Quelldateien für Dateien in [.filename]#/usr/include#
+
+|[.filename]#kerberos5/#
+|Quelldateien für Kerberos Version 5
+
+|[.filename]#lib/#
+|Quelldateien für Dateien in [.filename]#/usr/lib#
+
+|[.filename]#libexec/#
+|Quelldateien für Dateien in [.filename]#/usr/libexec#
+
+|[.filename]#release/#
+|Dateien, die für die Erstellung eines FreeBSD-Releases nötig sind
+
+|[.filename]#rescue/#
+|Bausystem für die [.filename]#/rescue#-Programme
+
+|[.filename]#sbin/#
+|Quelldateien für Dateien in [.filename]#/sbin#
+
+|[.filename]#secure/#
+|Quelldateien für FreeSec
+
+|[.filename]#share/#
+|Quelldateien für Dateien in [.filename]#/usr/share#
+
+|[.filename]#sys/#
+|Kernel-Quelldateien
+
+|[.filename]#tools/#
+|Programme zum Verwalten und Testen von FreeBSD
+
+|[.filename]#usr.bin/#
+|Quelldateien für Dateien in [.filename]#/usr/bin#
+
+|[.filename]#usr.sbin/#
+|Quelldateien für Dateien in [.filename]#/usr/sbin#
+|===
diff --git a/documentation/content/de/books/developers-handbook/ipv6/chapter.adoc b/documentation/content/de/books/developers-handbook/ipv6/chapter.adoc
new file mode 100644
index 0000000000..e658b60db9
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/ipv6/chapter.adoc
@@ -0,0 +1,685 @@
+---
+title: Kapitel 8. IPv6 Internals
+prev: books/developers-handbook/sockets
+next: books/developers-handbook/kernelbuild
+---
+
+[[ipv6]]
+= IPv6 Internals
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:appendix-caption: Anhang
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 8
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[ipv6-implementation]]
+== IPv6/IPsec-Implementierung
+
+Dieser Abschnitt erklärt die von der IPv6- und IPsec-Implementierung abhängigen Internas. Die Funktionalitäten wurden vom http://www.kame.net/[KAME-Projekt] abgeleitet
+
+[[ipv6details]]
+=== IPv6
+
+==== Konformität
+
+Die IPv6 abhängigen Funktionen richten sich nach, oder versuchen sich nach den neuesten IPv6-Spezifikationen zu richten. (_Achtung_: Dies ist keine vollständige Liste - es wäre zu aufwändig, diese zu pflegen...).
+
+Für weitere Details beachten sie bitte die entsprechenden Kapitel, RFCs, manual pages, oder Kommentare in den Quelltexten.
+
+Konformitätsprüfungen wurden basierend auf KAME-STABLE-Kit des TAHI-Projekts durchgeführt. Die Ergebnisse können unter http://www.tahi.org/report/KAME/[http://www.tahi.org/report/KAME/] eingesehen werden. In der Vergangenheit begleiteten wir auch Tests mit unseren älteren "Snapshots" an der Univ. of New Hampshire IOL (http://www.iol.unh.edu/[http://www.iol.unh.edu/]).
+
+* RFC1639: FTP Operation Over Big Address Records (FOOBAR)
+
+** RFC2428 wird gegenüber RFC1639 bevorzugt. FTP-Clients versuchen zuerst RFC2428, dann im Fehlerfall RFC1639.
+
+* RFC1886: DNS Extensions to support IPv6
+* RFC1933: Transition Mechanisms for IPv6 Hosts and Routers
+
+** IPv4 kompatible Adressen werden nicht unterstützt.
+** Automatisches Tunneln (beschrieben in 4.3 dieses RFC) wird nicht unterstützt.
+** Die man:gif[4]-Schnittstelle implementiert einen IPv[46]-over-IPv[46] Tunnel in einer allgemeinen Art und Weise und es umfaßt "configured tunnel" wie in der Spezifikation beschrieben. Siehe auch <<gif,23.5.1.5>> in diese Dokument für weitere Details.
+
+* RFC1981: Path MTU Discovery for IPv6
+* RFC2080: RIPng for IPv6
+
+** usr.sbin/route6d unterstützt dies.
+
+* RFC2292: Advanced Sockets API for IPv6
+
+** Unterstützte Bibliotheksfunktionen bzw. Kernel-APIs, siehe auch [.filename]#sys/netinet6/ADVAPI#.
+
+* RFC2362: Protocol Independent Multicast-Sparse Mode (PIM-SM)
+
+** RFC2362 definiert Paketformate für PIM-SM. [.filename]#draft-ietf-pim-ipv6-01.txt# wurde basierend auf diesem RFC verfaßt.
+
+* RFC2373: IPv6 Addressing Architecture
+
+** Unterstützt vom Knoten erforderliche Adressen und richtet sich nach den Erfordernissen des Bereichs.
+
+* RFC2374: An IPv6 Aggregatable Global Unicast Address Format
+
+** Unterstützt die 64-Bit-Breite einer Interface ID.
+
+* RFC2375: IPv6 Multicast Address Assignments
+
+** Userland-Applikationen nutzen die bekannten Adressen, die in den RFC festgelegt sind.
+
+* RFC2428: FTP Extensions for IPv6 and NATs
+
+** RFC2428 wird gegenüber RFC1639 bevorzugt. FTP-Clients versuchen zuerst RFC2428, dann im Fehlerfall RFC1639.
+
+* RFC2460: IPv6 specification
+* RFC2461: Neighbor discovery for IPv6
+
+** Siehe auch <<neighbor-discovery,23.5.1.2>> in diesem Dokument für weitere Details.
+
+* RFC2462: IPv6 Stateless Address Autoconfiguration
+
+** Siehe auch <<ipv6-pnp,23.5.1.4>> in diesem Dokument für weitere Details.
+
+* RFC2463: ICMPv6 for IPv6 specification
+
+** Siehe auch <<icmpv6,23.5.1.9>> in diesem Dokument für weitere Details.
+
+* RFC2464: Transmission of IPv6 Packets over Ethernet Networks
+* RFC2465: MIB for IPv6: Textual Conventions and General Group
+
+** Notwendige Statistiken werden vom Kernel gesammelt. Die aktuelle IPv6-MIB-Unterstützung wird als Patch-Sammlung für ucd-snmp bereitgestellt.
+
+* RFC2466: MIB for IPv6: ICMPv6 group
+
+** Notwendige Statistiken werden vom Kernel gesammelt. Die aktuelle IPv6-MIB-Unterstützung wird als Patch-Sammlung für ucd-snmp bereitgestellt.
+
+* RFC2467: Transmission of IPv6 Packets over FDDI Networks
+* RFC2497: Transmission of IPv6 packet over ARCnet Networks
+* RFC2553: Basic Socket Interface Extensions for IPv6
+
+** IPv4 mapped address (3.7) and special behavior of IPv6 wildcard bind socket (3.8) are supported. See <<ipv6-wildcard-socket,23.5.1.12>> in this document for details.
+
+* RFC2675: IPv6 Jumbogramms
+
+** Siehe auch <<ipv6-jumbo,23.5.1.7>> in diesem Dokument für weitere Details.
+
+* RFC2710: Multicast Listener Discovery for IPv6
+* RFC2711: IPv6 router alert option
+* [.filename]#draft-ietf-ipngwg-router-renum-08#: Router renumbering for IPv6
+* [.filename]#draft-ietf-ipngwg-icmp-namelookups-02#: IPv6 Name Lookups Through ICMP
+* [.filename]#draft-ietf-ipngwg-icmp-name-lookups-03#: IPv6 Name Lookups Through ICMP
+* [.filename]#draft-ietf-pim-ipv6-01.txt#: PIM for IPv6
+
+** man:pim6dd[8] implementiert dense mode. man:pim6sd[8] implementiert sparse mode.
+
+* [.filename]#draft-itojun-ipv6-tcp-to-anycast-00#: Unterbrechen einer TCP-Verbindung toward IPv6 anycast address
+* [.filename]#draft-yamamoto-wideipv6-comm-model-00#
+
+** Beachte <<ipv6-sas,23.5.1.6>> in deisem Dokument für weitere Deatils.
+
+* [.filename]#draft-ietf-ipngwg-scopedaddr-format-00.txt#: Eine Erweiterung des Format for IPv6 Scoped Addresses
+
+[[neighbor-discovery]]
+==== Neighbor Discovery
+
+Neighbor Discovery ist weitestgehend stabil. Zur Zeit werden Addressauflösung, Duplicated Address Detection (DAD), und Neighbor Unreachability Detection (NUD) unterstützt. In der näheren Zukunft werden wir Proxy Neighbor Advertisement Unterstützung in den Kernel einbauen und Unsolicited Neighbor Advertisement Übertragungskommandos als Verwaltungsprogramm zur Verfügung stellen.
+
+Falls DAD versagt, wird die Adresse als "duplicated" markiert und eine Nachricht wird erzeugt, die an Syslog gesandt wird (und für gewöhnlich an die Konsole). Die "duplicated"-Markierung kann mit man:ifconfig[8] überprüft werden. Es liegt in der Verantwortung des Administrators, auf DAD-Fehler zu achten und diese zu beheben. Dieses Verhalten sollte in der näheren Zukunft verbessert werden.
+
+Manche Netzwerktreiber verbinden Multicast-Pakete mit sich selbst, sogar, wenn es vorgeschrieben ist, es nicht zu tun (vor allem im Promiscuous-Modus). In solchen Fällen könnte DAD versagen, weil die DAD-Steuerung ein inbound NS packet sieht (eigentlich vom Knoten selber) und betrachtet es als ein Duplikat. Sie könnten sich die #if-Bedingung ansehen, die in sys/netinet6/nd6_nbr.c:nd6_dad_timer() als "Workaround" mit "heuristics" markiert ist (Beachte, dass das Kodefragment im Abschnitt "heuristics" nicht der Spezifikation entspricht).
+
+Neighbor Discovery specification (RFC2461) kommuniziert in den folgenden Fällen nicht über neighbor cache handling:
+
+. Der Knoten empfing ein unverlangtes RS/NS/NA/redirect-Paket ohne Link-Layer-Adresse, wenn kein neighbor cache-Eintrag vorhanden ist.
+. neighbor cache handling bei Geräten ohne Link-Layer-Adresse (wir benötigen einen neighbor cache Eintrag für das IsRouter-Bit)
+
+Im ersten Fall implemenierten wir einen Workaround basierend auf Diskussionen in der IETF-Ipngwg-Mailing-Liste. Für weitere Details beachten Sie die Kommentare im Quelltext und im Email-Thread, der bei (IPng 7155) mit dem Datum vom 6. Feb 1999 gestartet wurde.
+
+IPv6 on-link Erkennungsregel (RFC2461) ist recht unterschiedlich zu Übernahmen im BSD-Netzwerkkode. Zur Zeit wird keine on-link Erkennungsregel unterstützt, bei der die Defaultrouter-Liste leer ist (RFC2461, Abschnitt 5.2, letzter Satz im zweiten Absatz - beachte, dass die Spezifikation das Wort "host" und "Knoten" an mehreren Stellen im Abschnitt mißbraucht).
+
+Um mögliche DoS-Attacken und unendliche Schleifen zu verhindern, werden bis jetzt nur 10 Optionen bei ND-Paketen akzeptiert. Deshalb werden nur die ersten 10 Präfixe berücksichtigt, wenn man 20-Präfixoptionen zu RA hinzugefügt hat. Falls das zu Schwierigkeiten führen sollte, dann sollte in der FREEBSD-CURRENT-Mailing-Liste gefragt werden und/oder die Variable nd6_maxndopt in [.filename]#sys/netinet6/nd6.c# modifizieren. Falls die Nachfrage groß genug ist, könnte man einen sysctl-Knopf für die Variable vorsehen.
+
+[[ipv6-scope-index]]
+==== Bereichsindex
+
+IPv6 benutzt Adressbereiche (Scoped Addresses). Deshalb ist es sehr wichtig, mit einer IPv6-Adresse einen Bereichsindex anzugeben (Schnittstellenindex für link-local-Adresse, oder einen Lageindex für site-local-Adressen). Ohne einen Bereichsindex ist ein IPv6-Adressbereich für den Kernel zweideutig und dem Kernel ist es nicht möglich, die Ausgabeschnittstelle für ein Paket festzustellen.
+
+Gewöhnliche Userland-Anwendungen sollten die erweiterte Programmierschnittstelle (RFC2292) benutzen, um den Bereichsindex oder Schnittstellenindex festzulegen. Für ähnliche Zwecke wurde in RFC2553 sin6_scope_id member in der sockaddr_in6-Struktur definiert. Wie auch immer, die Semantik für sin6_scope_id ist ziemlich wage. Wenn man auf Portierbarkeit der Anwendung achten muß, dann schlagen wir vor, die erweiterte Programmierschnittstelle anstelle von sin6_scope_id zu benutzen.
+
+Im Kernel ist ein Schnittstellenindex für link-local scoped-Adressen in das zweite 16bit-Wort (drittes und viertes Byte) der IPv6-Adresse eingebettet. Zum Beispiel sieht man folgendes
+
+[source,bash]
+....
+fe80:1::200:f8ff:fe01:6317
+....
+
+in der Routing-Tabelle und in der Schnittstellenadress-Struktur (structin6_ifaddr). Oben genannte Adresse ist eine "link-local unicast address" die zu einer Netzwerkschnittstelle gehört, deren Schnittstellenbezeichner 1 (eins) ist. Der eingebettete Index ermöglicht es, IPv6 link local-Adressen über mehrere Schnittstellen hinweg effektiv und mit wenig Änderungen am Kode zu identifizieren.
+
+Routing-Dämonen und Konfigurationsprogramme wie man:route6d[8] und man:ifconfig[8] werden den "eingebetteten" Bereichsindex verändern müssen. Diese Programme benutzen routing sockets und ioctls (wie SIOCGIFADDR_IN6) und die Kernel-Programmierschnittstelle wird IPv6-Adressen, dessen zweites 16-Bit-Word gesetzt ist, zurückgeben. Diese Programmierschnittstellen dienen zur Änderung der Kernel-internen Struktur. Programme, die diese Programmierschnittstellen benutzen, müssen ohnehin auf Unterschiede in den Kerneln vorbereitet sein.
+
+Wenn man einen Adressbereich in der Kommandozeile angibt, schreibt man niemals die eingebettete Form (so etwas wie ff02:1::1 or fe80:2::fedc). Man erwartet nicht, dass es funktioniert. Man benutzt immer die Standardform wie ff02::1 oder fe80::fedc, zusammen mit der Kommandozeilenoption, die die Schnittstelle festlegt (wie `ping6 -I ne0 ff02::1`). Allgemein gilt, wenn ein Kommando keine Kommandozeilenoption hat, um die Ausgabeschnittstelle zu definieren, ist dieses Kommando noch nicht für Adressbereiche bereit. Dies scheint der Prämisse von IPv6 entgegenzustehen. Wir glauben, dass die Spezifikationen einige Verbesserungen benötigen.
+
+Einige der Userland-Werkzeuge unterstützen die erweiterte numerische IPv6-Syntax wie sie in [.filename]#draft-ietf-ipngwg-scopedaddr-format-00.txt# beschrieben ist. Man kann die ausgehende Verbindung angeben, indem man den Namen der ausgehenden Schnittstelle wie folgt benutzt: "fe80::1%ne0". Auf diese Art und Weise ist man in der Lage, eine link-local scoped Adresse ohne viele Schwierigkeiten anzugeben.
+
+Um die Erweiterungen im eigenen Programm zu nutzen, muss man man:getaddrinfo[3] und man:getnameinfo[3] mit NI_WITHSCOPEID verwenden. Die Implementierung setzt im Moment eine 1-zu-1 Beziehung zwischen einer Verbindung und einer Schnittstelle voraus, die stärker ist, als es die Spezifikationen beschreiben.
+
+[[ipv6-pnp]]
+==== Plug and Play
+
+Der grösste Teil der statuslosen IPv6-Adress-Autokonfiguration ist im Kernel implementiert. Neighbor-Discovery-Funktionen sind als ganzes im Kernel implementiert. Router-Advertisement (RA) Eingabe für Hosts ist im Kernel implementiert. Router-Solicitation (RS) Ausgabe für Hosts, RS-Eingabe für Router und RA-Ausgabe für Router ist im Userland implementiert.
+
+===== Zuweisung von link-local und speziellen Adressen
+
+Die IPv6 link-local-Adresse wird aus einer IEEE802-Adresse (Ethernet MAC address) erzeugt. Jeder Schnittstelle wird automatisch eine IPv6 link-local-Adresse zugewiesen, sobald die Schnittstelle aktiv ist (IFF_UP). Ebenso wird eine direkte Route für die link-local-Adresse zur Routing-Tabelle hinzugefügt.
+
+Hier ist eine Ausgabe des netstat-Kommandos:
+
+[source,bash]
+....
+Internet6:
+Destination Gateway Flags Netif Expire
+fe80:1::%ed0/64 link#1 UC ed0
+fe80:2::%ep0/64 link#2 UC ep0
+....
+
+Schnittstellen, die keine IEEE802-Adresse haben (Pseudo-Schnittstellen wie Tunnel-Schnittstellen oder ppp-Schnittstellen), borgen sich eine IEEE802-Adresse von anderen Schnittstellen wie Ethernet-Schnittstellen aus, wann immer das möglich ist. Wenn keine IEEE802-Geräte eingebaut sind, wird als letzte Möglichkeit eine Pseudo-Zufallszahl - MD5(hostname) - als Quelle für eine link-local-Adresse benutzt. Falls diese für den Einsatz nicht geeignet sein sollte, dann muss man eine link-local-Adresse manuell konfigurieren.
+
+Falls eine Schnittstelle nicht imstande ist, IPv6-Adressen zu handhaben (wie fehlende Unterstützung des multicast), wird keine link-local-Adresse der Schnittstelle zugewiesen. Siehe Abschnitt 2 für weitere Details.
+
+Jede Schnittstelle verbindet die solicited multicast Adresse und link-local all-nodes multicast-Adressen (z.B. fe80::1:ff01:6317 und ff02::1, jeweils zu der Verbindung, an die die Schnittstelle verbunden ist). zusätzlich zu einer link-local-Adresse wird eine loopback-Adresse (::1) einer loopback-Schnittstelle zugewiesen. Außerdem werden ::1/128 und ff01::/32 automatisch zur Routing-Tabelle hinzugefügt und die loopback-Schnittstelle verbindet sich mit der node-local multicast Gruppe ff01::1.
+
+===== Stateless address autoconfiguration beim Host
+
+In der IPv6-Spezifikation werden Knoten in zwei Kategorien unterteilt: _Router_ und _Hosts_. Router leiten Pakete, die an andere adressiert sind, weiter, Hosts leiten Pakete nicht weiter. net.inet6.ip6.forwarding definiert, ob dieser Knoten ein Router oder ein Host ist (Router falls es 1 ist, Host, falls es 0 ist).
+
+Sobald ein Host ein Router-Advertisement vom Router hört, kann er sich selbst mit statusloser automatischer Adressen konfigurieren. Dieses Verhalten kann mit net.inet6.ip6.accept_rtadv (der Host konfiguriert sich selber, wenn es auf 1 gesetzt ist) beeinflusst werden. Bei einer automatischen Konfiguration wird das Netzwerkadresspräfix für die empfangende Schnittstelle (für gewöhnlich das globale Adresspräfix) hinzugefügt. Die Standard-Route wird ebenso konfiguriert. Router erzeugen periodisch Router-Advertisement-Pakete. Um einen benachbarten Router aufzufordern, ein RA-Paket zu erzeugen, kann eine Host-Router-Solicitation übertragen werden. Um jederzeit ein RS-Paket zu erzeugen, benutzt man das _rtsol_-Kommando. Ein man:rtsold[8]-Dämon ist ebenso verfügbar. man:rtsold[8] erzeugt Router-Solicitation, wann immer es notwendig ist und es funktioniert großartig "bei normadischem Einsatz" (Notebooks/Laptops). Falls jemand Router-Advertisements zu ignorieren wünscht, setzt man mit sysctl et.inet6.ip6.accept_rtadv auf 0.
+
+Um Router-Advertisement von einem Router aus zu erzeugen, benutzt man den man:rtadvd[8]-Dämon.
+
+Beachte, dass die IPv6-Spezifikation von folgenden Punkte ausgeht und nicht konforme Fälle werden als nicht spezifiziert ausgelassen:
+
+* Nur Hosts hören auf Router-Angebote
+* Hosts haben eine einzige Netzwerk-Schnittstelle (außer loopback)
+
+Deshalb ist es unklug, net.inet6.ip6.accept_rtadv bei Routern oder bei Hosts mit mehreren Schnittstellen einzuschalten. Ein falsch konfigurierter Knoten kann sich seltsam verhalten (nicht konforme Konfiguration ist für diejenigen erlaubt, die Experimente durchführen möchten).
+
+Eine Zusammenfassung des sysctl-Angaben:
+
+[source,bash]
+....
+ accept_rtadv forwarding Rolle des Knotens
+ --- --- ---
+ 0 0 Host (wird manuell konfiguriert)
+ 0 1 Router
+ 1 0 automatisch konfigurierter Host
+ (Die Spezifikation setzt voraus, dass der Host nur eine einzelne Schnittstelle hat, ein automatisch konfigurierter Host mit mehreren Schnittstellen ist außerhalb der Betrachtung)
+ 1 1 ungültig, oder für Experimentierzwecke (außerhalb der Spezifikation)
+....
+
+RFC2462 hat eine Überprüfungsregel gegen eingehende RA-prefix-information-option, in 5.5.3 (e). Dies dient zum Schutz des Hosts vor schlecht oder falsch konfigurierten Routern, die eine sehr kurze Präfixlebenszeit ankündigen. Es gab Aktualisierungen von Jim Bound in der ipngwg-Mailing-Liste (suche nach "(ipng 6712)" im Archive) und es wurde Jims Aktualisierung implementiert.
+
+Siehe auch <<neighbor-discovery,23.5.1.2>> im Dokument für das Verhältnis zwischen DAD und autoconfiguration.
+
+[[gif]]
+==== Generische Tunnel-Schnittstelle
+
+GIF (Generische Schnittstelle) ist eine Pseudoschnittstelle für konfigurierte Tunnel. Details sind in man:gif[4] beschrieben. Im Moment sind
+
+* v6 in v6
+* v6 in v4
+* v4 in v6
+* v4 in v4
+
+verfügbar. Benutze man:gifconfig[8], um die physikalische (außerhalb liegende) Quelle und die Zieladresse den gif-Schnittstellen zuzuweisen. Eine Konfiguration, die die selbe Adressfamilie für innere und äußere IP-Header (v4 in v4, oder v6 in v6) benutzt, ist gefährlich. Es ist sehr leicht, Schnittstellen und Routing-Tabellen so zu konfigurieren, dass eine unendliche Ebene von Tunneln ausgeführt wird. _Seien Sie also gewarnt_.
+
+gif kann ECN-freundlich konfiguriert werden. Beachte <<ipsec-ecn,23.5.4.5>> für eine ECN-Freundlichkeit von Tunneln und man:gif[4] wie man sie konfiguriert.
+
+Falls man einen IPv4-in-IPv6-Tunnel mit einer gif-Schnittstelle konfigurieren möchte, sollte man man:gif[4] sorgfältig lesen. Man muss die IPv6 link-local Adresse, die automatisch der gif-Schnittstelle zugewiesen wird, entfernen.
+
+[[ipv6-sas]]
+==== Source Address Selection
+
+Im Moment ist die Regel zur Auswahl der Quelle bereichsorientiert (es gibt einige Ausnahmen - siehe unten). Für ein gegebenes Ziel wird eine Quell-IPv6-Adresse durch folgende Regel ausgewählt:
+
+. Falls die Quelladresse explizit durch den Benutzer angegeben ist (z.B. über das erweiterte API), dann wird die angegebene Adresse benutzt.
+. Falls eine Adresse der ausgehenden Schnittstelle zugewiesen wird, die den selben Bereich wie die Zieladresse hat (was normalerweise durch einen Blick in die Routing-Tabelle festgestellt werden kann), dann wird diese Adresse benutzt.
++
+Dies ist ein typischer Fall.
+. Falls keine Adresse der obigen Bedingung genügt, dann wählt man eine globale Adresse, die einer der Schnittstellen des sendenden Knotens zugewiesen ist.
+. Falls keine Adresse der obigen Bedingung genügt und die Zieladresse ist im site local-Bereich, dann wählt man eine eine site local-Adresse, die einer der Schnittstellen des sendenden Knotens zugewiesen ist.
+. Falls keine Adresse der obigen Bedingung genügt, dann wählt man eine Adresse, die mit einem Eintrag in der Routing-Tabelle für das Ziel verbunden ist. Dies ist die letzte Möglichkeit, die eine Bereichsverletzung verursachen könnte.
+
+Zum Beispiel, ::1 ist ausgewählt für ff01::1, fe80:1::200:f8ff:fe01:6317 für fe80:1::2a0:24ff:feab:839b (beachte den eingebetteten Schnittstelleindex - beschrieben in <<ipv6-scope-index,23.5.1.3>> - er hilft uns, die richtige Quelladresse auszuwählen. Diese eingebetteten Indexe werden nicht übertragen). Falls die ausgehende Schnittstelle mehrere Adressen für einen Bereich hat, wird die Quelle gewählt, die die breiteste passende Basis hat (Regel 3). Angenommen 2001:0DB8:808:1:200:f8ff:fe01:6317 und 2001:0DB8:9:124:200:f8ff:fe01:6317 sind einer ausgehenden Schnittstelle zugewiesen. 2001:0DB8:808:1:200:f8ff:fe01:6317 wird als Quelle für das Ziel 2001:0DB8:800::1 ausgewählt.
+
+Beachte, dass obige Regel nicht in der IPv6-Spezifikation dokumentiert ist. Es wird als "up to implementation"-Punkt betrachtet. Es gibt einige Fälle, bei denen die obige Regel nicht benutzt werden soll. Ein Beispiel ist die verbundene TCP-Sitzung und man benutzt die Adresse, die in tcb als Quelle gehalten wird. Ein anderes Beispiel ist die Quelladresse für Neighbor Advertisement. Laut Spezifikation (RFC2461 7.2.2) sollte die Quelle des NA die Zieladresse des korrespondierenden Ziel des NS sein. In diesem Fall folgen wir eher der Spezifikation, als der obigen longest-match-Regel.
+
+Für neue Verbindungen werden (wenn Regel eins nicht zutrifft) abgelehnte Adressen (Adressen mit bevorzugter Lebenszeit = 0) nicht ausgewählt, wenn andere Auswahlmöglichkeiten bestehen. Wenn keine anderen Auswahlmöglichkeiten bestehen, werden abgelehnte Adressen als letzte Möglichkeit benutzt. Falls mehrere Auswahlmöglichkeiten für abgelehnte Adressen bestehen, dann wird ogige Regel verwendet, um aus diesen abgelehnten Adressen auszuwählen. Falls man aus bestimmten Gründen die Benutzung abgelehnter Adressen unterbinden möchte, dann setzt man net.inet6.ip6.use_deprecated auf 0. Der Punkt bezüglich der abgelehnten Adressen ist in RFC2462 5.5.4 beschrieben (Beachte: Im Moment wird in der IETF ipngwg darüber debatiert, wie angelehnte Adressen benutzt werden sollen).
+
+[[ipv6-jumbo]]
+==== Jumbo Payload
+
+Die Jumbo-Payload hop-by-hop-Option ist implementiert und kann benutzt werden, um IPv6-Pakete mit Datenpaketen größer als 65.535 Oktette. Aber im Moment wird keine physikalische Schnittstelle unterstützt, deren MTU größer ist als 65.536, so dass diese Datenpakete nur bei den loopback-Schnittstellen zu finden sind (z.B. lo0).
+
+Falls man die Jumbo Payloads testen möchte, muss man zunächst den Kernel rekonfigurieren, so dass die MTU der loopback-Schnittstelle grösser 65.535 Bytes sein kann. Füge folgende Zeile zur Kernel-Konfiguration hinzu:
+
+`options "LARGE_LOMTU" #Um Jumbo Payload zu testen`
+
+und dann kompiliere den Kernel neu.
+
+Dann kann man die Jumbo-Payloads mittels man:ping6[8]-Kommando mit den Optionen -b und -s testen. Die Option -b muss angegeben werden, um die Größe des Socket-Puffers zu erhön, und die Option -s gibt die Größe des Pakets an, die größer als 65.535 sein sollte. Beispielsweise gibt man folgendes ein:
+
+[source,bash]
+....
+% ping6 -b 70000 -s 68000 ::1
+....
+
+Die IPv6-Spezifikation verlangt, dass die Jumbo-Payload-Option nicht in einem Paket verwendet werden darf, das einen fragmentierten Header hat. Falls diese Bedingung nicht zutrifft, dann muss eine ICMPv6-Parameter-Problem-Nachricht an den Absender geschickt werden. Die Spezifikation ist befolgt, aber man kann normalerweise nicht einen ICMPv6-Fehler sehen, der durch diese Forderung hervorgerufen wird.
+
+Wenn ein IPv6-Paket empfangen wird, dann wird die Rahmenlänge geprüft und sie wird mit der Größe verglichen, die im Datenfeld für die Paketgröße des IPv6-Headers oder im Wert für die Jumbo-Payload-Option angegeben ist, sofern vorhanden. Falls ersterer kleiner als letzterer ist, dann wird das Paket abgelehnt und die Statistiken werden erhöht. Man kann die Statistik als Ausgabe des man:netstat[8]-Kommandos mit der ``-s -p ip6``-Option sehen:
+
+[source,bash]
+....
+% netstat -s -p ip6
+ ip6:
+ (snip)
+ 1 with data size < data length
+....
+
+So, der Kernel sendet keinen ICMPv6-Fehler, außer das fehlerhafte Paket ist ein aktuelles Jumbo-Payload, dessen Paketgröße größer als 65,535 Bytes ist. Wie oben beschrieben, gibt es momentan keine physikalische Schnittstelle, die eine so riesige MTU unterstützt, daher gibt es so selten einen ICMPv6-Fehler.
+
+TCP/UDP over Jumbogramm wird im Moment nicht unterstützt. Dies kommt daher, weil wir kein Medium (außer loopback) haben, dies zu testen. Melden Sie sich, falls Sie es benötigen.
+
+IPsec funktioniert nicht mit Jumbogramm. Dies ist bedingt durch einige Änderungen an der Spezifikation, welche die Unterstützung von AH mit Jumbogramm betrifft (AH-Header-Größe beeinflusst die Länge des Datenpakets und das macht es richtig schwierig, ein eingehendes Paket mit Jumbo-Payload-Option so gut zu authentifizieren wie ein AH).
+
+Es gibt grundlegende Punkte in der *BSD-Unterstützung für Jumbogramms. Wir würden jene gerne ansprechen, aber wir benötigen mehr Zeit diese fertig zu stellen. Um ein paar zu benennen:
+
+* mbuf pkthdr.len-Feld ist in 4.4BSD typisiert als "int", so dass es kein Jumbogramm mit len > 2G bei 32Bit-Architekturen aufnehmen kann. Wenn wir Jumbogramme geeignet unterstützen wollten, dann muss das Feld erweitert werden, damit es 4G + IPv6-Header + link-layer-Header aufnehmen kann. Deshalb muss es schließlich auf int64_t (u_int32_t ist NICHT genug) erweitert werden.
+* Irrigerweise benutzen wir "int" an vielen Stellen, um die Paketlänge aufzunehmen. Wir müssen sie in einen größeren ganzzahligen Typ konvertieren. Es braucht große Vorsicht, weil wir sonst einen Überlauf während der Berechnung der Paketlänge erleben können.
+* Irrigerweise prüfen wir das ip6_plen-Feld des IPv6-Header für packet payload length an verschiedenen Stellen. Wir sollten mbuf pkthdr.len stattdessen prüfen. ip6_input() wird bei der Eingabe eine Prüfung der Jumbo -Payload-Option durchführen und wir können danach mbuf pkthdr.len sicher benutzen.
+* Natürlich braucht der TCP-Kode an einigen Stellen eine sorgfältige Aktualisierung.
+
+==== Verhindern von Schleifen beim Verarbeiten von Headern
+
+Die IPv6-Spezifikation erlaubt eine willkürliche Zahl von Erweiterungs-Headern, die in einem Paket platziert werden können. Wenn wir IPv6-Kode für die Paketverarbeitung auf die Art und Weise implementieren wie wir es beim BSD-IPv4-Kode geschehen ist, dann würde wegen einer lange Kette von Funktionsaufrufen der Kernel-Stack überlaufen. sys/netinet6-Kode ist behutsam entwickelt wurden, um einen Überlauf des Kernel-Stacks zu verhindern. Deswegen definiert der sys/netinet6-Kode seine eigene Protocol-Switch-Struktur "struct ip6protosw" (siehe auch [.filename]#netinet6/ip6protosw.h#). Aus Gründen der Kompatibilität gibt es keine solche Aktualisierung im IPv4-Teil (sys/netinet), aber eine kleine Änderung ist zum pr_input()-Prototyp hinzugefügt worden. So ist "struct ipprotosw" ebenso definiert. Deswegen kann der Kernel-Stack sich aufblähen, wenn man ein IPsec-over-IPv4-Paket mit einer massiven Zahl von IPSec-Header empfängt. IPsec-over-IPv6 ist in Ordnung. (Natürlich muss für all diese zu verarbeitenden IPSec-Header jeder einzelne IPSec-Header jede IPSec-Prüfung durchlaufen. So wird es einem anonymen Angreifer unmöglich gemacht eine Attacke durchzuführen.)
+
+[[icmpv6]]
+==== ICMPv6
+
+Nachdem RFC2463 veröffentlicht worden war, hat die IETF-ipngwg beschlossen ICMPv6-Fehler-Pakete gegen ICMPv6 umzuleiten, um einen ICMPv6-Sturm auf einem Netzwerkmedium zu unterbinden. Dies ist bereits im Kernel implementiert.
+
+==== Anwendungen
+
+Für Programmierung des Userland unterstützen wir das IPv6-Socket-API wie es in RFC2553, RFC2292 und in aufkommenden Internet-Konzepten beschrieben ist.
+
+TCP/UDP über IPv6 ist verfügbar und ziemlich stabil. Man kann sich an man:telnet[1], man:ftp[1], man:rlogin[1], man:rsh[1], man:ssh[1], usw. erfreuen. Diese Anwendungen sind unabhängig vom Protokoll. Das liegt daran, weil diese Programme automatisch IPv4 oder IPv6 entsprechend des DNS auswählen.
+
+==== Kernel Interna
+
+Während ip_forward() ip_output() aufruft, ruft ip6_forward() direkt if_output() auf, da Router IPv6-Pakete nicht in Fragmente teilen dürfen.
+
+ICMPv6 sollte das original Paket so lang wie möglich bis maximal 1280 halten. UDP6/IP6 port unreach, zum Beispiel, sollte alle Erweiterungs-Header und die unveränderten UDP6- und IP6-Header enthalten. Um das originale Paket zu erhalten, konvertieren alle IP6-Funktionen außer TCP niemals Network-Byte-Order in Host-Byte-Order.
+
+tcp_input(), udp6_input() und icmp6_input() können nicht voraussetzen, dass der IP6-Header vor dem Transport-Header, der zum Extension-Header gehört, kommt. Deshalb wurde in6_cksum() implementiert, um Pakete, deren IP6-Header und Transport-Header nicht fortlaufend ist, zu behandeln. Weder TCP/IP6- noch UDP6/IP6-Header-Strukturen existieren, um eine Prüsumme zu bilden.
+
+Um IP6-Header, Extension-Header und Transport-Headers leichter verarbeiten zu können, werden nun Netzwerktreiber benötigt, die Pakete in einem internen mbuf oder in einem oder mehreren externen mbuf speichern können. Ein typischer alter Treiber legt zwei interne mbuf für 96 - 204 Bytes an Daten an, wie auch immer wird ein solches Paket jetzt in einem externen mbuf gespeichert.
+
+`netstat -s -p ip6` ermittelt, ob der Treiber sich nach solchen Erfordernissen richtet, oder nicht. Im folgenden Beispiel verletzt "cce0" dies Erfordernisse (Für weitere Informationen, siehe Abschnitt 2.).
+
+[source,bash]
+....
+Mbuf statistics:
+ 317 one mbuf
+ two or more mbuf::
+ lo0 = 8
+ cce0 = 10
+ 3282 one ext mbuf
+ 0 two or more ext mbuf
+....
+
+Jede Eingabefunktion ruft IP6_EXTHDR_CHECK am Anfang auf, um zu prüfen, ob der Bereich zwischen IP6 und seinen Header durchgehend ist. IP6_EXTHDR_CHECK ruft m_pullup() nur dann auf, wenn mbuf das M_LOOP-Flag gestzt hat, weil das Paket von der Loopback-Schnittstelle kommt. m_pullup() wird niemals aufgerufen, wenn Pakete von physikalischen Netzwerkschnittstellen kommen.
+
+IP- und IP6-Reassemble-Funktionen rufen niemals m_pullup() auf.
+
+[[ipv6-wildcard-socket]]
+==== IPv4-Mapped-Address und IPv6-Wildcard-Socket
+
+RFC2553 beschreibt IPv4-Mapped-Address (3.7) und die spezielle Verhaltensweise des IPv6-Wildcard-Bind-Socket (3.8). Die Spezifikation gestattet es:
+
+* IPv4-Verbindungen von AF_INET6-Wildcard-Bind-Socket zu erlauben.
+* IPv4-Pakete über AF_INET6-Socket zu transportieren, indem eine spezielle Form der Adresse wie ::ffff:10.1.1.1 benutzt wird.
+
+Aber die Spezifikation ist sehr kompliziert und spezifiziert nicht, wie der Socket-Layer sich verhalten soll. Darauf Bezug nehmend nennen wir hier ersteren "hörende Seite" und letzteren "beginnende Seite".
+
+Man kann einen Wildcard-Bind auf demselben Port bei beiden Adressfamilien durchführen.
+
+Die folgende Tabelle zeigt das Verhalten von FreeBSD 4.x.
+
+[source,bash]
+....
+Hörende Seite Beginnende Seite
+ (AF_INET6-Wildcard- (Verbindung zu ::ffff:10.1.1.1)
+ Socket erreicht IPv4 Verb.)
+ --- ---
+FreeBSD 4.x Konfigurierbar unterstützt
+ Standard: erlaubt
+....
+
+Die folgende Abschnitte zeigen mehr Details und wie man das Verhalten konfigurieren kann.
+
+Kommentare auf der hörenden Seite:
+
+Es sieht so aus, dass RFC2553 zu wenig zu den Punkten über Wildcard-Bind erläutert, speziell zum Punkt über Port-Space, Fehler-Modus und Beziehung zwischen AF_INET/INET6 wildcard bind. Es kann mehrere unterschiedliche Interpretationen zu diesem RFC geben, die sich nach diesen richten, aber sich unterschiedlich verhalten. Um eine portable Anwendung zu implementieren, sollte man deshalb nicht ein bestimmtes Verhalten des Kernels voraussetzen. Der Einsatz von man:getaddrinfo[3] ist der sicherste Weg. Port number space und wildcard bind issues wurden Mitte Mai 1999 detailliert in der Ipv6imp-Mailing-Liste diskutiert und es sieht so aus, als ob es keinen konkreten Konsens gab (means, up to implementers). Vielleicht sollte man die Archive der Mailing-Liste prüfen.
+
+Wenn eine Server-Anwendung IPv4- und IPv6-Verbindungen annehmen möchte, dann gibt es zwei Alternativen.
+
+Eine benutzt AF_INET- und AF_INET6-Socket (man benötigt zwei Sockets). Benutze man:getaddrinfo[3] mit gesetztem AI_PASSIVE-Bit in ai_flags, man:socket[2] und man:bind[2] für alle zurückgegebenen Adressen. Mit dem öffnen mehrerer Sockets kann man Verbindungen an dem Socket mit der richtigen Adressfamilie annehmen. IPv4-Verbindungen werden vom AF_INET-Socket und IPv6-Verbindungen vom AF_INET6-Socket angenommen.
+
+Ein anderer Weg ist einen AF_INET6 wildcard bind-Socket zu verwenden. Man benutzt man:getaddrinfo[3] mit AI_PASSIVE in ai_flags, mit AF_INET6 in ai_family, man setzt das erste Argument hostname auf NULL, man:socket[2] und man:bind[2] auf die zurückgegebene Adresse (es sollte eine unspezifizierte IPv6-Adresse sein). Man kann IPv4- und IPv6-Paket über diesen Socket annehmen.
+
+Um nur IPv6-Datenverkehr portabel an AF_INET6 wildcard gebundenen Socket zu unterstützen, prüft man, sobald die Verbindung Zustande gekommen ist, immer die Peer-Adresse gegen den hörenden AF_INET6-Socket. Wenn die Adresse eine IPv4-Mapped-Adresse ist, dann sollte man die Verbindung zurückweisen. Man kann die Bedingung mit dem IN6_IS_ADDR_V4MAPPED()-Makro prüfen.
+
+Um diesen Punkt leichter lösen zu können, gibt es für man:setsockopt[2] die System abhängige Option IPV6_BINDV6ONLY, die wie folgt benutzt wird.
+
+[source,bash]
+....
+ int on;
+
+ setsockopt(s, IPPROTO_IPV6, IPV6_BINDV6ONLY,
+ (char *)&on, sizeof (on)) < 0));
+....
+
+Wenn der Aufruf erfolgreich ist, dann empfängt dieser Socket nur IPv6-Pakete.
+
+Kommentare zur sendenden Seite:
+
+Ratschlag an Anwendungsentwickler: um eine portable IPv6-Anwendung zu implementieren (die mit verschiedenen IPv6-Kerneln funktioniert), ist das Folgende der Schlüssel zum Erfolg wie wir glauben:
+
+* NIEMALS AF_INET oder AF_INET6 hart kodieren.
+* Benutze man:getaddrinfo[3] und man:getnameinfo[3] überall im System. Benutze niemals gethostby*(), getaddrby*(), inet_*() oder getipnodeby*() (Um bestehende Applikationen leicht IPv6 fähig zu machen, wird getipnodeby*() manchmal nützlich sein. Falss es aber möglich sein sollte, versuche den Kode neu zu schreiben und man:getaddrinfo[3] und man:getnameinfo[3] zu benutzen)
+* Wenn man sich an ein Ziel verbinden möchte, benutze man:getaddrinfo[3] und versuche alle zurückgegebenen Ziele, wie man:telnet[1] es macht.
+* Einige IPv6-Stacks sind mit fehlerhafter man:getaddrinfo[3] verschickt worden. Man verschickt als letzte Möglichkeit eine minimal arbeitende Version der Anwendung.
+
+Wenn man einen AF_INET6-Socket für jeweils eine ausgehende IPv4- und IPv6-Verbingung benutzen möchte, dann muss man man:getipnodebyname[3] benutzen. Wenn man seine existierende Anwendung mit wenig Aufwand IPv6-fähig machen möchte, dann sollte dieser Versuch gewählt werden. Aber beachte bitte, dass dies eine temporäre Lösung ist, weil man:getipnodebyname[3] selber noch zu empfehlen ist, da es noch keine Adressbereiche verarbeitet. Für eine IPv6-NAmensauflösung ist man:getaddrinfo[3] das bevorzugte API. Deshalb sollte man seine Anwendung so umschreiben, dass man:getaddrinfo[3] benutzt wird, wann man Zeit dazu hat.
+
+Wenn man Anwendungen schreibt, die ausgehende Verbindungen herstellen, wird die Geschichte viel einfacher, wenn man AF_INET und AF_INET6 als total getrennte Adressfamilien behandelt. {set,get}sockopt funktioniert viel einfacher, DNS-Angelegenheiten werden einfacher gemacht. Wir empfehlen sich nicht auf IPv4-Mapped-Adressen zu verlassen.
+
+===== Einheitlicher TCP-und INPCB-Kode
+
+FreeBSD 4.x benutzt shared TCP-Kode zwischen IPv4 und IPv6 (von sys/netinet/tcp*) und separaten udp4/6-Kode. Es benutzt eine vereinheitlichte inpcb-Struktur.
+
+Die Plattform kann für eine Unterstützung von IPv4-mapped-Adressen konfiguriert werden. Die Kernel-Konfiguration läßt sich wie folgt zusammenfassen:
+
+* By default, AF_INET6 socket will grab IPv4 connections in certain condition, and can initiate connection to IPv4 destination embedded in IPv4 mapped IPv6 address.
+* Man kann es wie unten beschrieben abschalten.
++
+`sysctl net.inet6.ip6.mapped_addr=0`
+
+====== Hörende Seite
+
+Jeder Socket kann für eine Unterstützung eines speziellen AF_INET6 wildcard bind (Standardmäßig eingeschaltet) konfiguriert werden. Man kann es auf Socket-Basis mit man:setsockopt[2] wie unten beschrieben abschalten.
+
+[source,bash]
+....
+ int on;
+
+ setsockopt(s, IPPROTO_IPV6, IPV6_BINDV6ONLY,
+ (char *)&on, sizeof (on)) < 0));
+....
+
+Wildcard-AF_INET6-Socket schnappt sich die IPv4-Verbindung, wenn, und nur wenn folgende Bedingungen erfüllt sind::
+
+* Es gibt keinen AF_INET-Socket, der zu einer IPv4-Verbindung passt
+* Der AF_INET6-Socket ist so konfiguriert, dass er IPv4-Datenverkehr akzeptiert, z.B. gibt getsockopt(IPV6_BINDV6ONLY) 0 zurück.
+
+Es gibt kein Problem mit der Öffnen/Schließen-Reihenfolge.
+
+====== initiating side
+
+FreeBSD 4.x unterstützt ausgehende Verbindungen zu IPv4 mapped Adressen (::ffff:10.1.1.1), falls der Knoten so konfiguriert ist, dass er IPv4 mapped Adressen unterstützt.
+
+==== sockaddr_storage
+
+Als RFC2553 kurz vor der Vollendung stand, gab es eine Diskussion, wie struct sockaddr_storage Mitglieder benannt werden sollten. Ein Vorschlag war "__" den Mitgliedern (wie "__ss_len") voranzustellen und es sollten sie nicht verändert werden. Der andere Vorschlag war, nichts voranzustellen (wie "ss_len") also mußten wir solche Mitglieder direkt verändern. Es gab keinen klaren Konsens.
+
+Als Ergebnis definiert RFC2553 die Struktur sockaddr_storage wie folgt:
+
+[source,bash]
+....
+ struct sockaddr_storage {
+ u_char __ss_len; /* address length */
+ u_char __ss_family; /* address family */
+ /* and bunch of padding */
+ };
+....
+
+Im Gegensatz dazu definiert der XNET-Entwurf die Struktur wie folgt:
+
+[source,bash]
+....
+ struct sockaddr_storage {
+ u_char ss_len; /* address length */
+ u_char ss_family; /* address family */
+ /* and bunch of padding */
+ };
+....
+
+Im Dezember 1999 kam man überein, dass RFC2553bis letztere Definition (XNET) aufnehmen sollte.
+
+Die aktuelle Implementierung ist konform zur XNET-Definition basierend auf der RFC2553bis Diskussion.
+
+Wenn man mehrere IPv6-Implementierungen betrachtet, wird man beide Definitionen sehen. Für Userland-Programmierer ist der folgende Weg der meist portable um damit umzugehen:
+
+. Man versichert sich, dass ss_family und/oder ss_len für die Plattform verfügbar sind, indem man GNU autoconf verwendet,
+. Man benutzet -Dss_family=__ss_family um alle Vorkommen (einschließlich der Header-Files) zu __ss_family zu vereinheitlichen, oder
+. Man benutzt niemals __ss_family. Man führe einen Typecast nach sockaddr * durch und verwendet sa_family wie folgt:
++
+[source,bash]
+....
+ struct sockaddr_storage ss;
+ family = ((struct sockaddr *)&ss)->sa_family
+....
+
+=== Netzwerktreiber
+
+Die beiden folgenden Dinge müssen zwingend von Standardtreibern unterstützt werden:
+
+. Mbuf-Clustering-Erfordernis. In diesem stabilen Release haben wir für alle Betriebssystem MINCLSIZE in MHLEN+1 geändert, damit sich alle Treiber wie erwartet verhalten.
+. Multicast. Falls man:ifmcstat[8] keine Multicast-Gruppe für die Schnittstelle liefert, dann muss diese Schnittstelle überarbeitet werden.
+
+Falls keiner der Treiber die Erfordernisse erfüllt, dann können die Treiber nicht für IPv6/IPSec-Kommunikation verwendet werden. Falls man ein Problem beim Einsatz von IPv6/IPSec mit seiner Karte hat, dann melde es bitte bei {freebsd-bugs}.
+
+(Beachte: In der Vergangenheit haben wir gefordert, dass alle PCMCIA-Treiber einen Aufruf nach in6_ifattach() haben. Inzwischen haben wir keine solche Forderung mehr)
+
+=== Translator
+
+Wir kategorisieren einen IPv4/IPv6-Translator in 4 Typen:
+
+* _Translator A_ --- Er wird im frühen Stadium des Übergangs benutzt um es zu ermöglichen, dass eine Verbindung von einem IPv6-Host auf einer IPv6-Insel zu einem IPv4-Host im IPv4-Ozean hergestellt wird.
+* _Translator B_ --- Er wird im frühen Stadium des Übergangs benutzt um es zu ermöglichen, dass eine Verbindung von einem IPv4-Host im IPv4-Ozean zu einem IPv6-Host auf einer IPv6-Insel hergestellt wird.
+* _Translator C_ --- Er wird im frühen Stadium des Übergangs benutzt um es zu ermöglichen, dass eine Verbindung von einem IPv4-Host auf einer IPv4-Insel zu einem IPv6-Host im IPv6-Ozean hergestellt wird.
+* _Translator D_ --- Er wird im frühen Stadium des Übergangs benutzt um es zu ermöglichen, dass eine Verbindung von einem IPv6-Host im IPv6-Ozean zu einem IPv4-Host auf einer IPv4-Insel hergestellt wird.
+
+Ein TCP-Relay-Translator der Kategorie A wird unterstützt. Er wird "FAITH" genannt. Wir stellen ebenso einen IP-Header-Translator der Kataegorie A zur Verfügung (Letzterer ist noch nicht in FreeBSD 4.x übernommen).
+
+==== FAITH TCP-Relay-Translator
+
+Das FAITH-System benutzt mit Hilfe des Kernels den man:faithd[8] genannten TCP-Relay-Daemon. FAITH wird einen IPv6-Adress-Präfix reservieren und eine TCP-Verbindungen an diesen Präfix zum IPv4-Ziel weiterleiten.
+
+Wenn beispielsweise der IPv6-Präfix 2001:0DB8:0200:ffff:: ist und das IPv6-Ziel für TCP-Verbindungen 2001:0DB8:0200:ffff::163.221.202.12 ist, dann wird die Verbindung an das IPv4-Ziel 163.221.202.12 weitergeleitet.
+
+[source,bash]
+....
+ IPv4-Ziel-Knoten (163.221.202.12)
+ ^
+ | IPv4 tcp toward 163.221.202.12
+ FAITH-relay dual stack node
+ ^
+ | IPv6 TCP toward 2001:0DB8:0200:ffff::163.221.202.12
+ source IPv6 node
+....
+
+man:faithd[8] muss auf FAITH-relay dual stack node aufgerufen werden.
+
+Für weitere Details siehe [.filename]#src/usr.sbin/faithd/README#
+
+[[ipsec-implementation]]
+=== IPsec
+
+IPsec besteht hauptsächlich aus drei Komponenten.
+
+. Policy Management
+. Key Management
+. AH und ESP Behandlung
+
+==== Regel Management
+
+Im Kernel ist experimenteller Kode für Regel-Management implementiert. Es gibt zwei Wege eine Sicherheitsregel zu handhaben. Einer ist eine Regel für jeden Socket mithilfe von man:setsockopt[2] zu konfigurieren. Für diesen Fall ist die Konfiguration der Regel in man:ipsec_set_policy[3] beschrieben. Der andere Weg ist eine auf einem Kernel-Packet-Filter basierende Regel mithilfe der PF_KEY-Schnittstelle mittels man:setkey[8] zu konfigurieren.
+
+Der Regeleintrag mit seinen Indices wird nicht sortiert, so dass es sehr wichtig ist, wann ein Eintrag hinzugefügt wird.
+
+==== Key Management
+
+Der in dieser Bibliothek (sys/netkey) implementierte Kode für das key management ist eine Eigenentwicklung der PFKEYv2-Implementierung. Er ist konform zu RFC2367.
+
+Die Eigenentwicklung des IKE-Daemons "racoon" ist in der Bibliothek (kame/kame/racoon) implementiert. Grundsätzlich muss man racoon als Dämonprozess laufen lassen, dann setzt man eine Regel auf, die Schlüssel erwartet (ähnlich wie `ping -P 'out ipsec esp/transport//use'`). Der Kernel wird den racoon-Dämon wegen des notwendigen Austauschs der Schlüssel kontaktieren.
+
+==== AH- und ESP-Handhabung
+
+Das IPsec-Modul ist als "hook" in die Standard-IPv4/IPv6-Verarbeitung implementiert. Sobald ein Paket gesendet wird, prüft ip{,6_output(), ob eine ESP/AH-Verarbeitung notwendig ist. Es findet eine Überprüfung statt, ob eine passende SPD (Security Policy Database) gefunden wurde. Wenn ESP/AH benötigt wird, dann wird {esp,ah}{4,6}_output() aufgerufen und mbuf wird folglich aktualisiert. Wenn ein Paket empfangen wird, dann wird {esp,ah}4_input() basierend auf der Protokollnummer aufgerufen, z.B. (*inetsw[proto])(). {esp,ah}4_input() entschlüsselt/prüft die Authentizität des Pakets und entfernt den daisy-chained-Header und das Padding des ESP/AH. Es ist sicherer den ESP/AH-Header beim Empfang zu entfernen, weil man das empfangene Paket niemals so wie es ist benutzt.
+
+Mit der Verwendung von ESP/AH wird die effektive TCP4/6-Datensegmentgröße durch weitere von ESP/AH eingefügte Daisy-chained-Headers beeinflußt. Unser Kode berücksichtigt dies.
+
+Grundlegende Crypto-Funktionen sind im Verzeichnis "sys/crypto" zu finden. ESP/AH-Umformungen sind zusammen mit den Wrapper-Funktionen in {esp,ah}_core.c gelistet. Wenn man einige Algorithmen hinzufügen möchte, dann fügt man in {esp,ah}_core.c eine Wrapper-Funktion hinzu und trägt seinen Crypto-Algorithmus in sys/crypto ein.
+
+Der Tunnel-Modus wird in diesem Release teilweise mit den folgenden Restriktionen unterstützt:
+
+* Der IPsec-Tunnel ist nicht mit der generischen Tunnelschnittstelle kombiniert. Man muss sehr vorsichtig sein, weil man sonst eine Endlosschleife zwischen ip_output() und tunnelifp->if_output() aufbaut. Die Meinungen gehen auseinander, ob es besser ist dies zu vereinheitlichen, oder nicht.
+* Die Betrachtung von MTU und des "Don't Fragment"-Bits (IPv4) müssen mehr geprüft werden, aber grundsätzlichen arbeiten sie gut.
+* Das Authentifizierungsmodel für einen AH-Tunnel muss überarbeitet werden. Man muss eventuell die "policy management engine" überarbeiten.
+
+==== Konformität zu RFCs und IDs
+
+Der IPsec-Kode im Kernel ist konform (oder versucht konform zu sein) zu den folgenden Standards:
+
+Die "alte IPsec"-Spezifikation, die in [.filename]#rfc182[5-9].txt# dokumentiert ist
+
+Die "neue IPsec"-Spezifikation, die [.filename]#rfc240[1-6].txt#, [.filename]#rfc241[01].txt#, [.filename]#rfc2451.txt# und [.filename]#draft-mcdonald-simple-ipsec-api-01.txt# (Der Entwurf ist erloschen, aber man kann ihn sich von link:ftp://ftp.kame.net/pub/internet-drafts/[ ftp://ftp.kame.net/pub/internet -drafts/] holen) dokumentiert ist (Beachte: Die IKE-Spezifikationen [.filename]#rfc241[7-9].txt# sind im Userland als "racoon"-IKE-Daemon implementiert).
+
+Aktuell werden folgende Algorithmen unterstützt:
+
+* altes IPsec-AH
+
+** null crypto Prüfsumme (Kein Dokument, nur für Debug-Zwecke)
+** keyed MD5 mit 128bit crypto Prüfsumme ([.filename]#rfc1828.txt#)
+** keyed SHA1 mit 128bit crypto Prüfsumme (kein Document)
+** HMAC MD5 mit 128bit crypto Prüfsumme ([.filename]#rfc2085.txt#)
+** HMAC SHA1 mit 128bit crypto Prüfsumme (kein Dokument)
+
+* altes IPsec-ESP
+
+** null encryption (kein Dokument, ähnlich zu [.filename]#rfc2410.txt#)
+** DES-CBC-Modus ([.filename]#rfc1829.txt#)
+
+* neues IPsec-AH
+
+** null crypto Prüfsumme (kein Dokument, nur für Debug-Zwecke)
+** keyed MD5 mit 96bit crypto Prüfsumme (kein Dokument)
+** keyed SHA1 mit 96bit crypto Prüfsumme (kein Dokument)
+** HMAC MD5 mit 96bit crypto Prüfsumme ([.filename]#rfc2403.txt#)
+** HMAC SHA1 mit 96bit crypto Prüfsumme ([.filename]#rfc2404.txt#)
+
+* neues IPsec-ESP
+
+** null encryption ([.filename]#rfc2410.txt#)
+** DES-CBC mit abgeleiteter IV ([.filename]#draft-ietf-ipsec-ciph-des-derived-01.txt#, Entwurf abgelaufen)
+** DES-CBC mit expliziter IV ([.filename]#rfc2405.txt#)
+** 3DES-CBC mit expliziter IV ([.filename]#rfc2451.txt#)
+** BLOWFISH CBC ([.filename]#rfc2451.txt#)
+** CAST128 CBC ([.filename]#rfc2451.txt#)
+** RC5 CBC ([.filename]#rfc2451.txt#)
+** Jeder Algorithmus kann kombiniert werden mit:
+
+*** ESP-Beglaubigung mit HMAC-MD5(96bit)
+*** ESP-Beglaubigung mit HMAC-SHA1(96bit)
+
+Die folgenden Algorithmen werden NICHT unterstützt:
+
+* altes IPsec-AH
+
+** HMAC MD5 mit 128bit crypto Prüfsumme + 64bit replay prevention ([.filename]#rfc2085.txt#)
+** keyed SHA1 mit 160bit crypto Prüfsumme + 32bit padding ([.filename]#rfc1852.txt#)
+
+IPsec (im Kernel) und IKE (im Userland als "racoon") wurden bei unterschiedlichen Interoperabilitätstests geprüft und es ist bekannt, dass es mit vielen anderen Implementierungen gut zusammenarbeitet. Außerdem wurde die IPsec-Implementierung sowie die breite Abdeckung mit IPsec-Crypto-Algorithmen, die in den RFCs dokumentiert sind, geprüft (es werden nur Algorithmen ohne intellektuelle Besitzansprüche behandelt).
+
+[[ipsec-ecn]]
+==== ECN-Betrachtung von IPsec-Tunneln
+
+ECN-freundliche IPsec-Tunnel werden unterstützt wie es in [.filename]#draft-ipsec-ecn-00.txt# beschrieben ist.
+
+Normale IPsec-Tunnel sind in RFC2401 beschrieben. Für eine Kapselung wird das IPv4-TOS-Feld (oder das IPv6-Traffic-Class-Feld) vom inneren in den äußeren IP-Header kopiert. Für eine Entkapselung wird der ässere IP-Header einfach verworfen. Die Entkapselungsregel ist nicht mit ECN kompatibel, sobald das ECN-Bit im äußeren IP-TOS/Traffic-Class-Feld verloren geht.
+
+Um einen IPsec-Tunnel ECN-freundlich zu machen, sollte man die Kapselungs- und Entkapselungsprozeduren modifizieren. Dies ist in http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt[ http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt], Kapitel 3, beschrieben.
+
+Die IPsec-Tunnel-Implementierung kann drei Zustände annehmen, indem man net.inet.ipsec.ecn (oder net.inet6.ipsec6.ecn) auf diese Werte setzt:
+
+* RFC2401: Keine Betrachtung von ECN (Sysctl-Wert -1)
+* ECN verboten (Sysctl-Wert 0)
+* ECN erlaubt (Sysctl-Wert 1)
+
+Beachte, dass dieses Verhalten per-node konfigurierbar ist und nicht per-SA (draft-ipsec-ecn-00 möchte per-SA Konfiguration).
+
+Das Verhalten ist wie folgt zusammengefaßt (man beachte auch den Quelltext für weitere Details):
+
+[source,bash]
+....
+ encapsulate decapsulate
+ --- ---
+RFC2401 kopiere alle TOS-Bits lösche TOS-Bits im äußeren
+ von innen nach außen. (benutze innere TOS-Bits so wie sie sind)
+
+ECN verboten kopiere TOS-Bits außer für ECN lösche TOS-Bits im äußeren
+ (maskiert mit 0xfc) von innen (benutze innere TOS-Bits so wie sie sind)
+ nach außen. Setze ECN-Bits auf 0.
+
+ECN erlaubt kopiere TOS-Bits außer für ECN benutze innere TOS-Bits mit einigen Änderungen.
+ CE (maskiert mit 0xfe) von Wenn das äußere ECN-CE-Bit 1 ist,
+ innen nach außen. setze das ECN-CE-Bit im
+ Setze ECN-CE-Bit auf 0. Inneren.
+....
+
+Allgemeine Strategie zur Konfiguration:
+
+* Wenn beide IPsec-Tunnel-Endpunkte ein ECN-freundliches Verhalten beherrschen, dann sollte man besser beide Endpunkte auf "ECN allowed" (Sysctl-Wert 1) setzen.
+* Wenn das andere Ende das TOS-Bit sehr strikt handhabt, dann benutzt man "RFC2401" (Sysctl-Wert -1).
+* in den anderen Fällen benutzt man "ECN verboten" (Sysctl-Wert 0).
+
+Der Standard ist "ECN verboten" (Sysctl-Wert 0).
+
+Für weitere Informationen siehe auch:
+
+http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt[ http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt], RFC2481 (Explicit Congestion Notification), src/sys/netinet6/{ah,esp}_input.c
+
+(Dank gebührt Kenjiro Cho mailto:kjc@csl.sony.co.jp[kjc@csl.sony.co.jp] für seine detailliert Analyse)
+
+==== Interoperabilität
+
+Hier sind einige Plattformen angegeben, die in der Vergangenheit die IPsec/IKE-Interoperabilität mit dem KAME-Kode getestet haben. Beachte, dass beide Enden vielleicht ihre Implementierung verändert haben, deshalb sollte man folgende Liste nur für Referenzzwecke benutzen.
+
+Altiga, Ashley-laurent (vpcom.com), Data Fellows (F-Secure), Ericsson ACC, FreeS/WAN, HITACHI, IBM AIX(R), IIJ, Intel, Microsoft(R) Windows NT(R), NIST (linux IPsec + plutoplus), Netscreen, OpenBSD, RedCreek, Routerware, SSH, Secure Computing, Soliton, Toshiba, VPNet, Yamaha RT100i
diff --git a/documentation/content/de/books/developers-handbook/kernelbuild/chapter.adoc b/documentation/content/de/books/developers-handbook/kernelbuild/chapter.adoc
new file mode 100644
index 0000000000..1f80480a2b
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/kernelbuild/chapter.adoc
@@ -0,0 +1,84 @@
+---
+title: Kapitel 9. Einen FreeBSD-Kernel bauen und installieren
+prev: books/developers-handbook/ipv6
+next: books/developers-handbook/kerneldebug
+---
+
+[[kernelbuild]]
+= Einen FreeBSD-Kernel bauen und installieren
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 9
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+Ein Kernelentwickler muss wissen, wie der Bau eines angepassten Kernels funktioniert, da das Debuggen des FreeBSD-Kernels nur durch den Bau eines neuen Kernels möglich ist. Es gibt zwei Wege, einen angepassten Kernel zu bauen:
+
+* Den "traditionellen" Weg
+* Den "neuen" Weg
+
+[NOTE]
+====
+Die folgenden Ausführungen setzen voraus, dass Sie den Abschnitt link:{handbook}#kernelconfig-building[Erstellen und Installation eines angepassten Kernels] des FreeBSD-Handbuchs gelesen haben und daher wissen, wie man einen FreeBSD-Kernel baut.
+====
+
+[[kernelbuild-traditional]]
+== Einen Kernel auf die "traditionelle" Art und Weise bauen
+
+Bis FreeBSD 4.X wurde dieser Weg zum Bau eines angepassten Kernels empfohlen. Sie können Ihren Kernel nach wie vor auf diese Art und Weise bauen (anstatt das Target "buildkernel" der Makefiles im Verzeichnis [.filename]#/usr/src/# zu verwenden). Dies kann beispielsweise sinnvoll sein, wenn Sie am Kernel-Quellcode arbeiten. Haben Sie nur ein oder zwei Optionen der Kernelkonfigurationsdatei geändert, ist dieser Weg in der Regel schneller als der "neue" Weg. Andererseits kann es aber auch zu unerwarteten Fehlern beim Bau des Kernels kommen, wenn Sie Ihren Kernel unter aktuellen FreeBSD-Versionen auf diese Art und Weise bauen.
+
+[.procedure]
+====
+. Erzeugen Sie den Kernel-Quellcode mit man:config[8]:
++
+[source,bash]
+....
+# /usr/sbin/config MYKERNEL
+....
++
+. Wechseln Sie in das Build-Verzeichnis. man:config[8] gibt den Namen dieses Verzeichnisses aus, wenn die Erzeugung des Kernel-Quellcodes im vorherigen Schritt erfolgreich abgeschlossen wurde.
++
+[source,bash]
+....
+# cd ../compile/MYKERNEL
+....
++
+. Kompilieren Sie den neuen Kernel:
++
+[source,bash]
+....
+# make depend
+# make
+....
++
+. Installieren Sie den neuen Kernel:
++
+[source,bash]
+....
+# make install
+....
+====
+
+[[kernelbuild-new]]
+== Einen Kernel auf die "neue" Art und Weise bauen
+
+Dieser Weg wird für alle aktuellen FreeBSD-Versionen empfohlen. Lesen Sie bitte den Abschnitt link:{handbook}#kernelconfig-building[Erstellen und Installation eines angepassten Kernels] des FreeBSD-Handbuchs, wenn Sie Ihren Kernel auf diese Art und Weise bauen wollen.
diff --git a/documentation/content/de/books/developers-handbook/kerneldebug/chapter.adoc b/documentation/content/de/books/developers-handbook/kerneldebug/chapter.adoc
new file mode 100644
index 0000000000..e59118f16f
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/kerneldebug/chapter.adoc
@@ -0,0 +1,665 @@
+---
+title: Kapitel 10. Kernel-Fehlersuche
+authors:
+ - author: Paul Richards
+ - author: Jörg Wunsch
+ - author: Robert Watson
+prev: books/developers-handbook/kernelbuild
+next: books/developers-handbook/x86
+---
+
+[[kerneldebug]]
+= Kernel-Fehlersuche
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 10
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[kerneldebug-obtain]]
+== Besorgen eines Speicherauszugs nach einem Kernel-Absturz (Kernel-Crash-Dump)
+
+Wenn ein Entwicklungs-Kernel (z.B. FreeBSD-CURRENT) wie zum Beispiel ein Kernel unter Extrembedingungen (z.B. sehr hohe Belastungsraten (Load), eine äußerst hohe Anzahl an gleichzeitigen Benutzern, Hunderte man:jail[8]s usw.) eingesetzt oder eine neue Funktion oder ein neuer Gerätetreiber in FreeBSD-STABLE verwendet wird (z.B. PAE), tritt manchmal eine Kernel-Panic ein. In einem solchen Fall zeigt dieses Kapitel, wie dem Absturz nützliche Informationen entnommen werden können.
+
+Bei Kernel-Panics ist ein Neustart unvermeidlich. Nachdem ein System neu gestartet wurde, ist der Inhalt des physikalischen Speichers (RAM), genauso wie jedes Bit, das sich vor der Panic auf dem Swap-Gerät befand, verloren. Um die Bits im physikalischen Speicher zu erhalten, zieht der Kernel Nutzen aus dem Swap-Gerät als vorübergehenden Ablageort, wo die Bits, welche sich im RAM befinden, auch nach einem Neustart nach einem Absturz verfügbar sind. Durch diese Vorgehensweise kann ein Kernel-Abbild, wenn FreeBSD nach einem Absturz startet, abgezogen und mit der Fehlersuche begonnen werden.
+
+[NOTE]
+====
+Ein Swap-Gerät, das als Ausgabegerät (Dump-Device) konfiguriert wurde, verhält sich immer noch wie ein Swap-Gerät. Die Ausgabe auf Nicht-Swap-Geräte (wie zum Beispiel Bänder oder CDRWs) wird zur Zeit nicht unterstützt. Ein "Swap-Gerät" ist gleichbedeutend mit einer "Swap-Partition".
+====
+
+Es stehen verschiedene Arten von Speicherabzügen zur Verfügung: komplette Speicherabzüge (full memory dumps), welche den gesamten Inhalt des physischen Speichers beinhalten, Miniauszüge (minidumps), die nur die gerade verwendeten Speicherseiten des Kernels enthalten (FreeBSD 6.2 und höhere Versionen) und Textauszüge (textdumps), welche geskriptete oder Debugger-Ausgaben enthalten (FreeBSD 7.1 und höher). Miniauszüge sind der Standardtyp der Abzüge seit FreeBSD 7.0 und fangen in den meisten Fällen alle nötigen Informationen ein, die in einem kompletten Kernel-Speicherabzug enthalten sind, da die meisten Probleme nur durch den Zustand des Kernels isoliert werden können.
+
+[[config-dumpdev]]
+=== Konfigurieren des Ausgabegeräts
+
+Bevor der Kernel den Inhalt seines physikalischen Speichers auf einem Ausgabegerät ablegt, muss ein solches konfiguriert werden. Ein Ausgabegerät wird durch Benutzen des man:dumpon[8]-Befehls festgelegt, um dem Kernel mitzuteilen, wohin die Speicherauszüge bei einem Kernel-Absturz gesichert werden sollen. Das man:dumpon[8]-Programm muss aufgerufen werden, nachdem die Swap-Partition mit man:swapon[8] konfiguriert wurde. Dies wird normalerweise durch Setzen der `dumpdev`-Variable in man:rc.conf[5] auf den Pfad des Swap-Geräts (der empfohlene Weg, um einen Kernel-Speicherauszug zu entnehmen) bewerkstelligt, oder über `AUTO`, um die erste konfigurierte Swap-Partition zu verwenden. In HEAD ist die Standardeinstellung für `dumpdev`[.filename]#AUTO# und änderte sich in den RELENG_*-Zweigen (mit Ausnahme von RELENG_7, bei dem `AUTO` beibehalten wurde) auf `NO`. In FreeBSD 9.0-RELEASE und späteren Versionen fragt bsdinstall, ob Speicherauszüge für das Zielsystem während des Installationsvorgangs aktiviert werden sollen.
+
+[TIP]
+====
+
+Vergleichen Sie [.filename]#/etc/fstab# oder man:swapinfo[8] für eine Liste der Swap-Geräte.
+====
+
+[IMPORTANT]
+====
+Stellen Sie sicher, dass das in man:rc.conf[5] festgelegte `dumpdir` vor einem Kernel-Absturz vorhanden ist.
+
+[source,bash]
+....
+# mkdir /var/crash
+# chmod 700 /var/crash
+....
+
+Denken Sie auch daran, dass der Inhalt von [.filename]#/var/crash# heikel ist und sehr wahrscheinlich vertrauliche Informationen wie Passwörter enthält.
+====
+
+[[extract-dump]]
+=== Entnehmen eines Kernel-Speicherauszugs (Kernel-Dump)
+
+Sobald ein Speicherauszug auf ein Ausgabegerät geschrieben wurde, muss er entnommen werden, bevor das Swap-Gerät eingehängt wird. Um einen Speicherauszug aus einem Ausgabegerät zu entnehmen, benutzen Sie das man:savecore[8]-Programm. Falls `dumpdev` in man:rc.conf[5] gesetzt wurde, wird man:savecore[8] automatisch beim ersten Start in den Multiuser-Modus nach dem Absturz und vor dem Einhängen des Swap-Geräts aufgerufen. Der Speicherort des entnommenen Kernels ist im man:rc.conf[5]-Wert `dumpdir`, standardmäßig [.filename]#/var/crash#, festgelegt und der Dateiname wird [.filename]#vmcore.0# sein.
+
+In dem Fall, dass bereits eine Datei mit dem Namen [.filename]#vmcore.0# in [.filename]#/var/crash# (oder auf was auch immer `dumpdir` gesetzt ist) vorhanden ist, erhöht der Kernel die angehängte Zahl bei jedem Absturz um eins und verhindert damit, dass ein vorhandener [.filename]#vmcore# (z.B. [.filename]#vmcore.1#) überschrieben wird. Während der Fehlersuche, möchten Sie höchst wahrscheinlich den [.filename]#vmcore# mit der höchsten Version in [.filename]#/var/crash# benutzen, wenn Sie den passenden [.filename]#vmcore# suchen.
+
+[TIP]
+====
+
+Falls Sie einen neuen Kernel testen, aber einen anderen starten müssen, um Ihr System wieder in Gang zu bringen, starten Sie es nur in den Singleuser-Modus, indem Sie das `-s`-Flag an der Boot-Eingabeaufforderung benutzen, und nehmen dann folgende Schritte vor:
+
+[source,bash]
+....
+# fsck -p
+# mount -a -t ufs # make sure /var/crash is writable
+# savecore /var/crash /dev/ad0s1b
+# exit # exit to multi-user
+....
+
+Dies weist man:savecore[8] an, einen Kernel-Speicherauszug aus [.filename]#/dev/ad0s1b# zu entnehmen und den Inhalt in [.filename]#/var/crash# abzulegen. Vergessen Sie nicht sicherzustellen, dass das Zielverzeichnis [.filename]#/var/crash# genug freien Speicherplatz für den Speicherauszug zur Verfügung hat. Vergessen Sie auch nicht, den korrekten Pfad des Swap-Geräts anzugeben, da es sehr wahrscheinlich anders als [.filename]#/dev/ad0s1b# lautet!
+====
+
+[[kerneldebug-gdb]]
+== Fehlersuche in einem Speicherauszug nach einem Kernel-Absturz mit `kgdb`
+
+[NOTE]
+====
+Dieser Abschnitt deckt man:kgdb[1] ab, wie es in FreeBSD 5.3 und später zu finden ist. In früheren Versionen muss `gdb -k` benutzt werden, um einen Kernspeicherauszug auszulesen.
+====
+
+Sobald ein Speicherauszug zur Verfügung steht, ist es recht einfach nützliche Informationen für einfache Probleme daraus zu bekommen. Bevor Sie sich auf die Interna von man:kgdb[1] stürzen, um die Fehler im Kernspeicherauszug zu suchen und zu beheben, machen Sie die Debug-Version Ihres Kernels (normalerweise [.filename]#kernel.debug# genannt) und den Pfad der Quelldateien, die zum Bau Ihres Kernels verwendet wurden (normalerweise [.filename]#/usr/obj/usr/src/sys/KERNCONF#, wobei [.filename]#KERNCONF# das in einer Kernel-man:config[5] festgelegte `ident` ist), ausfindig. Mit diesen beiden Informationen kann die Fehlersuche beginnen.
+
+Um in den Debugger zu gelangen und mit dem Informationserhalt aus dem Speicherauszug zu beginnen, sind zumindest folgende Schritte nötig:
+
+[source,bash]
+....
+# cd /usr/obj/usr/src/sys/KERNCONF
+# kgdb kernel.debug /var/crash/vmcore.0
+....
+
+Sie können Fehler im Speicherauszug nach dem Absturz suchen, indem Sie die Kernel-Quellen benutzen, genauso wie Sie es bei jedem anderen Programm können.
+
+Dieser erste Speicherauszug ist aus einem 5.2-BETA-Kernel und der Absturz ist tief im Kernel begründet. Die Ausgabe unten wurde dahingehend bearbeitet, dass sie nun Zeilennummern auf der linken Seite einschließt. Diese erste Ablaufverfolgung (Trace) untersucht den Befehlszeiger (Instruction-Pointer) und beschafft eine Zurückverfolgung (Back-Trace). Die Adresse, die in Zeile 41 für den `list`-Befehl benutzt wird, ist der Befehlszeiger und kann in Zeile 17 gefunden werden. Die meisten Entwickler wollen zumindest dies zugesendet bekommen, falls Sie das Problem nicht selber untersuchen und beheben können. Falls Sie jedoch das Problem lösen, stellen Sie sicher, dass Ihr Patch seinen Weg in den Quellbaum mittels eines Fehlerberichts, den Mailinglisten oder ihres Privilegs, zu committen, findet!
+
+[source,bash]
+....
+ 1:# cd /usr/obj/usr/src/sys/KERNCONF
+ 2:# kgdb kernel.debug /var/crash/vmcore.0
+ 3:GNU gdb 5.2.1 (FreeBSD)
+ 4:Copyright 2002 Free Software Foundation, Inc.
+ 5:GDB is free software, covered by the GNU General Public License, and you are
+ 6:welcome to change it and/or distribute copies of it under certain conditions.
+ 7:Type "show copying" to see the conditions.
+ 8:There is absolutely no warranty for GDB. Type "show warranty" for details.
+ 9:This GDB was configured as "i386-undermydesk-freebsd"...
+10:panic: page fault
+11:panic messages:
+12:---
+13:Fatal trap 12: page fault while in kernel mode
+14:cpuid = 0; apic id = 00
+15:fault virtual address = 0x300
+16:fault code: = supervisor read, page not present
+17:instruction pointer = 0x8:0xc0713860
+18:stack pointer = 0x10:0xdc1d0b70
+19:frame pointer = 0x10:0xdc1d0b7c
+20:code segment = base 0x0, limit 0xfffff, type 0x1b
+21: = DPL 0, pres 1, def32 1, gran 1
+22:processor eflags = resume, IOPL = 0
+23:current process = 14394 (uname)
+24:trap number = 12
+25:panic: page fault
+26 cpuid = 0;
+27:Stack backtrace:
+28
+29:syncing disks, buffers remaining... 2199 2199 panic: mi_switch: switch in a critical section
+30:cpuid = 0;
+31:Uptime: 2h43m19s
+32:Dumping 255 MB
+33: 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240
+34:---
+35:Reading symbols from /boot/kernel/snd_maestro3.ko...done.
+36:Loaded symbols for /boot/kernel/snd_maestro3.ko
+37:Reading symbols from /boot/kernel/snd_pcm.ko...done.
+38:Loaded symbols for /boot/kernel/snd_pcm.ko
+39:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240
+40:240 dumping++;
+41:(kgdb) list *0xc0713860
+42:0xc0713860 is in lapic_ipi_wait (/usr/src/sys/i386/i386/local_apic.c:663).
+43:658 incr = 0;
+44:659 delay = 1;
+45:660 } else
+46:661 incr = 1;
+47:662 for (x = 0; x < delay; x += incr) {
+48:663 if ((lapic->icr_lo & APIC_DELSTAT_MASK) == APIC_DELSTAT_IDLE)
+49:664 return (1);
+50:665 ia32_pause();
+51:666 }
+52:667 return (0);
+53:(kgdb) backtrace
+54:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240
+55:#1 0xc055fd9b in boot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:372
+56:#2 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550
+57:#3 0xc0567ef5 in mi_switch () at /usr/src/sys/kern/kern_synch.c:470
+58:#4 0xc055fa87 in boot (howto=256) at /usr/src/sys/kern/kern_shutdown.c:312
+59:#5 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550
+60:#6 0xc0720c66 in trap_fatal (frame=0xdc1d0b30, eva=0)
+61: at /usr/src/sys/i386/i386/trap.c:821
+62:#7 0xc07202b3 in trap (frame=
+63: {tf_fs = -1065484264, tf_es = -1065484272, tf_ds = -1065484272, tf_edi = 1, tf_esi = 0, tf_ebp = -602076292, tf_isp = -602076324, tf_ebx = 0, tf_edx = 0, tf_ecx = 1000000, tf_eax = 243, tf_trapno = 12, tf_err = 0, tf_eip = -1066321824, tf_cs = 8, tf_eflags = 65671, tf_esp = 243, tf_ss = 0})
+64: at /usr/src/sys/i386/i386/trap.c:250
+65:#8 0xc070c9f8 in calltrap () at {standard input}:94
+66:#9 0xc07139f3 in lapic_ipi_vectored (vector=0, dest=0)
+67: at /usr/src/sys/i386/i386/local_apic.c:733
+68:#10 0xc0718b23 in ipi_selected (cpus=1, ipi=1)
+69: at /usr/src/sys/i386/i386/mp_machdep.c:1115
+70:#11 0xc057473e in kseq_notify (ke=0xcc05e360, cpu=0)
+71: at /usr/src/sys/kern/sched_ule.c:520
+72:#12 0xc0575cad in sched_add (td=0xcbcf5c80)
+73: at /usr/src/sys/kern/sched_ule.c:1366
+74:#13 0xc05666c6 in setrunqueue (td=0xcc05e360)
+75: at /usr/src/sys/kern/kern_switch.c:422
+76:#14 0xc05752f4 in sched_wakeup (td=0xcbcf5c80)
+77: at /usr/src/sys/kern/sched_ule.c:999
+78:#15 0xc056816c in setrunnable (td=0xcbcf5c80)
+79: at /usr/src/sys/kern/kern_synch.c:570
+80:#16 0xc0567d53 in wakeup (ident=0xcbcf5c80)
+81: at /usr/src/sys/kern/kern_synch.c:411
+82:#17 0xc05490a8 in exit1 (td=0xcbcf5b40, rv=0)
+83: at /usr/src/sys/kern/kern_exit.c:509
+84:#18 0xc0548011 in sys_exit () at /usr/src/sys/kern/kern_exit.c:102
+85:#19 0xc0720fd0 in syscall (frame=
+86: {tf_fs = 47, tf_es = 47, tf_ds = 47, tf_edi = 0, tf_esi = -1, tf_ebp = -1077940712, tf_isp = -602075788, tf_ebx = 672411944, tf_edx = 10, tf_ecx = 672411600, tf_eax = 1, tf_trapno = 12, tf_err = 2, tf_eip = 671899563, tf_cs = 31, tf_eflags = 642, tf_esp = -1077940740, tf_ss = 47})
+87: at /usr/src/sys/i386/i386/trap.c:1010
+88:#20 0xc070ca4d in Xint0x80_syscall () at {standard input}:136
+89:---Can't read userspace from dump, or kernel process---
+90:(kgdb) quit
+....
+
+Diese nächste Ablaufverfolgung ist ein älterer Speicherauszug aus FreeBSD 2-Zeiten, aber ist komplizierter und zeigt mehr der `gdb`-Funktionen. Lange Zeilen wurden gefaltet, um die Lesbarkeit zu verbessern, und die Zeilen wurden zur Verweisung nummeriert. Trotzdem ist es eine reale Fehlerverfolgung (Error-Trace), die während der Entwicklung des pcvt-Konsolentreibers entstanden ist.
+
+[source,bash]
+....
+ 1:Script started on Fri Dec 30 23:15:22 1994
+ 2:# cd /sys/compile/URIAH
+ 3:# gdb -k kernel /var/crash/vmcore.1
+ 4:Reading symbol data from /usr/src/sys/compile/URIAH/kernel
+...done.
+ 5:IdlePTD 1f3000
+ 6:panic: because you said to!
+ 7:current pcb at 1e3f70
+ 8:Reading in symbols for ../../i386/i386/machdep.c...done.
+ 9:(kgdb) backtrace
+10:#0 boot (arghowto=256) (../../i386/i386/machdep.c line 767)
+11:#1 0xf0115159 in panic ()
+12:#2 0xf01955bd in diediedie () (../../i386/i386/machdep.c line 698)
+13:#3 0xf010185e in db_fncall ()
+14:#4 0xf0101586 in db_command (-266509132, -266509516, -267381073)
+15:#5 0xf0101711 in db_command_loop ()
+16:#6 0xf01040a0 in db_trap ()
+17:#7 0xf0192976 in kdb_trap (12, 0, -272630436, -266743723)
+18:#8 0xf019d2eb in trap_fatal (...)
+19:#9 0xf019ce60 in trap_pfault (...)
+20:#10 0xf019cb2f in trap (...)
+21:#11 0xf01932a1 in exception:calltrap ()
+22:#12 0xf0191503 in cnopen (...)
+23:#13 0xf0132c34 in spec_open ()
+24:#14 0xf012d014 in vn_open ()
+25:#15 0xf012a183 in open ()
+26:#16 0xf019d4eb in syscall (...)
+27:(kgdb) up 10
+28:Reading in symbols for ../../i386/i386/trap.c...done.
+29:#10 0xf019cb2f in trap (frame={tf_es = -260440048, tf_ds = 16, tf_\
+30:edi = 3072, tf_esi = -266445372, tf_ebp = -272630356, tf_isp = -27\
+31:2630396, tf_ebx = -266427884, tf_edx = 12, tf_ecx = -266427884, tf\
+32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26\
+33:6672343, tf_cs = -266469368, tf_eflags = 66066, tf_esp = 3072, tf_\
+34:ss = -266427884}) (../../i386/i386/trap.c line 283)
+35:283 (void) trap_pfault(&frame, FALSE);
+36:(kgdb) frame frame->tf_ebp frame->tf_eip
+37:Reading in symbols for ../../i386/isa/pcvt/pcvt_drv.c...done.
+38:#0 0xf01ae729 in pcopen (dev=3072, flag=3, mode=8192, p=(struct p\
+39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c line 403)
+40:403 return ((*linesw[tp->t_line].l_open)(dev, tp));
+41:(kgdb) list
+42:398
+43:399 tp->t_state |= TS_CARR_ON;
+44:400 tp->t_cflag |= CLOCAL; /* cannot be a modem (:-) */
+45:401
+46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200)
+47:403 return ((*linesw[tp->t_line].l_open)(dev, tp));
+48:404 #else
+49:405 return ((*linesw[tp->t_line].l_open)(dev, tp, flag));
+50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */
+51:407 }
+52:(kgdb) print tp
+53:Reading in symbols for ../../i386/i386/cons.c...done.
+54:$1 = (struct tty *) 0x1bae
+55:(kgdb) print tp->t_line
+56:$2 = 1767990816
+57:(kgdb) up
+58:#1 0xf0191503 in cnopen (dev=0x00000000, flag=3, mode=8192, p=(st\
+59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c line 126)
+60: return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
+61:(kgdb) up
+62:#2 0xf0132c34 in spec_open ()
+63:(kgdb) up
+64:#3 0xf012d014 in vn_open ()
+65:(kgdb) up
+66:#4 0xf012a183 in open ()
+67:(kgdb) up
+68:#5 0xf019d4eb in syscall (frame={tf_es = 39, tf_ds = 39, tf_edi =\
+69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_isp = -272629788, tf\
+70:_ebx = 7086, tf_edx = 1, tf_ecx = 0, tf_eax = 5, tf_trapno = 582, \
+71:tf_err = 582, tf_eip = 75749, tf_cs = 31, tf_eflags = 582, tf_esp \
+72:= -272638456, tf_ss = 39}) (../../i386/i386/trap.c line 673)
+73:673 error = (*callp->sy_call)(p, args, rval);
+74:(kgdb) up
+75:Initial frame selected; you cannot go up.
+76:(kgdb) quit
+....
+
+Kommentare zum Skript oben:
+
+Zeile 6:::
+Dies ist ein Speicherauszug, der innerhalb von DDB genommen wurde (siehe unten), deswegen der Kommentar zur Panic "because you said to!" und die eher lange Stack-Ablaufverfolgung (Stack-Trace); der anfängliche Grund für das Starten von DDB war jedoch ein Seitenfehler-Trap (Page-Fault-Trap).
+
+Zeile 20:::
+Dies ist die Position der Funktion `trap()` in der Stack-Ablaufverfolgung.
+
+Zeile 36:::
+Erzwingt die Benutzung eines neuen Stack-Frames; dies ist nicht mehr notwendig. Die Stack-Frames sollen jetzt an die richtige Stelle im Speicher zeigen, selbst im Falle eines Traps. Nach einem Blick auf den Code in Zeile 403 ergibt sich mit hoher Wahrscheinlichkeit, dass entweder der Zeigerzugriff auf "tp" fehlerbehaftet oder der Array-Zugriff unerlaubt war.
+
+Zeile 52:::
+Der Zeiger scheint verdächtig, aber besitzt zufällig eine gültige Adresse.
+
+Zeile 56:::
+Jedoch zeigt er offensichtlich auf nichts und so haben wir unseren Fehler gefunden! (Für diejenigen, die nichts mit diesem speziellen Stück Code anfangen können: `tp->t_line` verweist hier auf das Zeilenverhalten (Line-Discipline) des Konsolen-Geräts, was eine ziemlich kleine Ganzzahl (Integer) sein muss.)
+
+[TIP]
+====
+
+Falls Ihr System regelmäßig abstürzt und und Sie bald keinen freien Speicherplatz mehr zur Verfügung haben, könnte das Löschen alter [.filename]#vmcore#-Dateien in [.filename]#/var/core# einen beträchtlichen Betrag an Speicherplatz einsparen.
+====
+
+[[kerneldebug-ddd]]
+== Fehlersuche in einem Speicherauszug nach einem Absturz mit DDD
+
+Die Untersuchung eines Speicherauszugs nach einem Kernel-Absturz mit einem grafischen Debugger wie `ddd` ist auch möglich (Sie müssen den package:devel/ddd[]-Port installieren, um den `ddd`-Debugger benutzen zu können). Nehmen Sie die `-k` mit in die `ddd`-Kommandozeile auf, die Sie normalerweise benutzen würden. Zum Beispiel:
+
+[source,bash]
+....
+# ddd --debugger kgdb kernel.debug /var/crash/vmcore.0
+....
+
+Sie sollten nun in der Lage sein, die Untersuchung des Speicherauszugs nach dem Absturz unter Benutzung der grafischen Schnittstelle von `ddd` anzugehen.
+
+[[kerneldebug-online-ddb]]
+== Online-Kernel-Fehlersuche mit DDB
+
+Während `kgdb` als Offline-Debugger eine Benutzerschnittstelle auf höchster Ebene bietet, gibt es einige Dinge, die es nicht kann. Die wichtigsten sind das Setzen von Breakpoints und das Abarbeiten des Kernel-Codes in Einzelschritten (Single-Stepping).
+
+Falls Sie eine systemnahe Fehlersuche an Ihrem Kernel vorhaben, steht Ihnen ein Online-Debugger mit dem Namen DDB zur Verfügung. Er erlaubt Ihnen das Setzen von Breakpoints, die Abarbeitung von Kernel-Funktionen in Einzelschritten, das Untersuchen und Verändern von Kernel-Variablen usw. Jedoch hat er keinen Zugriff auf Kernel-Quelldateien, sondern kann nur, im Gegensatz zu `gdb`, welches auf die ganzen Informationen zur Fehlersuche zurückgreifen kann, auf globale und statische Symbole zugreifen.
+
+Um DDB in Ihren Kernel einzubinden, fügen Sie die Optionen
+[.programlisting]
+....
+options KDB
+....
+
+[.programlisting]
+....
+options DDB
+....
+
+Ihrer Konfigurationsdatei hinzu und bauen Sie den Kernel neu. (Details zur Konfiguration des FreeBSD-Kernels finden Sie im link:{handbook}[FreeBSD-Handbuch]).
+
+[NOTE]
+====
+Falls Sie eine ältere Version des Boot-Blocks haben, könnte es sein, dass Ihre Symbole zur Fehlersuche noch nicht einmal geladen werden. Aktualisieren Sie den Boot-Block; aktuelle Versionen laden die DDB-Symbole automatisch.
+====
+
+Sobald Ihr Kernel mit DDB startet, gibt es mehrere Wege, um in DDB zu gelangen. Der erste und früheste Weg ist, das Boot-Flag `-d` gleich an der Boot-Eingabeaufforderung einzugeben. Der Kernel startet dann in den Debug-Modus und betritt DDB noch vor jedweder Gerätesuche. Somit können Sie Funktionen zur Gerätesuche/-bereitstellung auf Fehler untersuchen. FreeBSD-CURRENT-Benutzer müssen die sechste Option im Boot-Menü auswählen, um an eine Eingabeaufforderung zu gelangen.
+
+Das zweite Szenario ist der Gang in den Debugger, sobald das System schon gestartet ist. Es gibt zwei einfache Wege dies zu erreichen. Falls Sie von der Eingabeaufforderung aus in den Debugger gelangen möchten, geben Sie einfach folgenden Befehl ab:
+
+[source,bash]
+....
+# sysctl debug.kdb.enter=1
+....
+
+[NOTE]
+====
+Um eine schnelle Panic zu erzwingen, geben Sie das folgende Kommando ein:
+
+[source,bash]
+....
+# sysctl debug.kdb.panic=1
+....
+
+====
+
+Anderenfalls können Sie ein Tastenkürzel auf der Tastatur benutzen, wenn Sie an der Systemkonsole sind. Die Voreinstellung für die break-to-debugger-Sequenz ist kbd:[Ctrl+Alt+ESC]. In syscons kann diese Sequenz auf eine andere Tastenkombination gelegt werden (remap) und manche der verfügbaren Tastaturlayouts tun dies, stellen Sie also sicher, dass Sie die richtige Sequenz kennen, die benutzt werden soll. Für serielle Konsolen ist eine Option vorhanden, die die Benutzung einer Unterbrechung der seriellen Verbindung (BREAK) auf der Kommandozeile erlaubt, um in DDB zu gelangen (`options BREAK_TO_DEBUGGER` in der Kernel-Konfigurationsdatei). Dies ist jedoch nicht der Standard, da viele serielle Adapter in Verwendung sind, die grundlos eine BREAK-Bedingung erzeugen, zum Beispiel bei Ziehen des Kabels.
+
+Die dritte Möglichkeit ist, dass jede Panic-Bedingung in DDB springt, falls der Kernel hierfür konfiguriert ist. Aus diesem Grund ist es nicht sinnvoll einen Kernel mit DDB für ein unbeaufsichtigtes System zu konfigurieren.
+
+Um die unbeaufsichtigte Funktionsweise zu erreichen fügen Sie:
+
+[.programlisting]
+....
+options KDB_UNATTENDED
+....
+
+der Kernel-Konfigurationsdatei hinzu und bauen/installieren Sie den Kernel neu.
+
+Die DDB-Befehle ähneln grob einigen `gdb`-Befehlen. Das Erste, das Sie vermutlich tun müssen, ist einen Breakpoint zu setzen:
+
+[source,bash]
+....
+ break function-name address
+....
+
+Zahlen werden standardmäßig hexadezimal angegeben, aber um sie von Symbolnamen zu unterscheiden, muss Zahlen, die mit den Buchstaben `a-f` beginnen, `0x` vorangehen (dies ist für andere Zahlen beliebig). Einfache Ausdrücke sind erlaubt, zum Beispiel: `function-name + 0x103`.
+
+Um den Debugger zu verlassen und mit der Abarbeitung fortzufahren, geben Sie ein:
+
+[source,bash]
+....
+ continue
+....
+
+Um eine Stack-Ablaufverfolgung zu erhalten, benutzen Sie:
+
+[source,bash]
+....
+ trace
+....
+
+[NOTE]
+====
+Beachten Sie, dass wenn Sie DDB mittels einer Schnelltaste betreten, der Kernel zurzeit einen Interrupt bereitstellt, sodass die Stack-Ablaufverfolgung Ihnen nicht viel nützen könnte.
+====
+
+Falls Sie einen Breakpoint entfernen möchten, benutzen Sie
+
+[source,bash]
+....
+ del
+ del address-expression
+....
+
+Die erste Form wird direkt, nachdem ein Breakpoint anschlug, angenommen und entfernt den aktuellen Breakpoint. Die zweite kann jeden Breakpoint löschen, aber Sie müssen die genaue Adresse angeben; diese kann bezogen werden durch:
+
+[source,bash]
+....
+ show b
+....
+
+oder:
+
+[source,bash]
+....
+ show break
+....
+
+Um den Kernel in Einzelschritten auszuführen, probieren Sie:
+
+[source,bash]
+....
+ s
+....
+
+Dies springt in Funktionen, aber Sie können DDB veranlassen, diese schrittweise zu verfolgen, bis die passende Rückkehranweisung (Return-Statement) erreicht ist. Nutzen Sie hierzu:
+
+[source,bash]
+....
+ n
+....
+
+[NOTE]
+====
+Dies ist nicht das gleiche wie die ``next``-Anweisung von ``gdb``; es ist wie ``gdb``s ``finish``. Mehrmaliges Drücken von kbd:[n] führt zu einer Fortsetzung.
+====
+
+Um Daten aus dem Speicher zu untersuchen, benutzen Sie (zum Beispiel):
+
+[source,bash]
+....
+x/wx 0xf0133fe0,40
+x/hd db_symtab_space
+x/bc termbuf,10
+x/s stringbuf
+....
+
+für Word/Halfword/Byte-Zugriff und Hexadezimal/Dezimal/Character/String-Ausgabe. Die Zahl nach dem Komma ist der Objektzähler. Um die nächsten 0x10 Objekte anzuzeigen benutzen Sie einfach:
+
+[source,bash]
+....
+ x ,10
+....
+
+Gleichermaßen benutzen Sie
+
+[source,bash]
+....
+ x/ia foofunc,10
+....
+
+um die ersten 0x10 Anweisungen aus `foofunc` zu zerlegen (disassemble) und Sie zusammen mit ihrem Adressabstand (Offset) vom Anfang von `foofunc` auszugeben.
+
+Um Speicher zu verändern benutzen Sie den Schreibbefehl:
+
+[source,bash]
+....
+ w/b termbuf 0xa 0xb 0
+ w/w 0xf0010030 0 0
+....
+
+Die Befehlsoption (`b`/`h`/`w`) legt die Größe der Daten fest, die geschrieben werden sollen, der erste Ausdruck danach ist die Adresse, wohin geschrieben werden soll, und der Rest wird als Daten verarbeitet, die in aufeinander folgende Speicherstellen geschrieben werden.
+
+Falls Sie die aktuellen Register wissen möchten, benutzen Sie:
+
+[source,bash]
+....
+ show reg
+....
+
+Alternativ können Sie den Inhalt eines einzelnen Registers ausgeben mit z.B.
+
+[source,bash]
+....
+ p $eax
+....
+
+und ihn bearbeiten mit:
+
+[source,bash]
+....
+ set $eax new-value
+....
+
+Sollten Sie irgendeine Kernel-Funktion aus DDB heraus aufrufen wollen, geben Sie einfach ein:
+
+[source,bash]
+....
+ call func(arg1, arg2, ...)
+....
+
+Der Rückgabewert wird ausgegeben.
+
+Für eine Zusammenfassung aller laufenden Prozesse im Stil von man:ps[1] benutzen Sie:
+
+[source,bash]
+....
+ ps
+....
+
+Nun haben Sie herausgefunden, warum Ihr Kernel fehlschlägt, und möchten neu starten. Denken Sie daran, dass, abhängig von der Schwere vorhergehender Störungen, nicht alle Teile des Kernels wie gewohnt funktionieren könnten. Führen Sie eine der folgenden Aktionen durch, um Ihr System herunterzufahren und neu zu starten:
+
+[source,bash]
+....
+ panic
+....
+
+Dies wird Ihren Kernel dazu veranlassen abzustürzen, einen Speicherauszug abzulegen und neu zu starten, sodass Sie den Kernspeicherauszug später auf höherer Ebene mit `gdb` auswerten können. Diesem Befehl muss normalerweise eine weitere `continue`-Anweisung folgen.
+
+[source,bash]
+....
+ call boot(0)
+....
+
+Dürfte ein guter Weg sein, um das laufende System sauber herunterzufahren, alle Festplatten mittels `sync()` zu schreiben und schließlich, in manchen Fällen, neu zu starten. Solange die Festplatten- und Dateisystemschnittstellen des Kernels nicht beschädigt sind, könnte dies ein guter Weg für ein beinahe sauberes Abschalten sein.
+
+[source,bash]
+....
+ call cpu_reset()
+....
+
+Dies ist der letzte Ausweg aus der Katastrophe und kommt beinahe dem Drücken des Ausschaltknopfes gleich.
+
+Falls Sie eine kurze Zusammenfassung aller Befehle benötigen, geben Sie einfach ein:
+
+[source,bash]
+....
+ help
+....
+
+Es ist strengstens empfohlen, eine ausgedruckte Version der man:ddb[4]-Manualpage während der Fehlersuche neben sich liegen zu haben. Denken Sie daran, dass es schwer ist, die Online-Hilfe zu lesen, während der Ausführung des Kernels in Einzelschritten.
+
+[[kerneldebug-online-gdb]]
+== Online-Kernel-Fehlersuche mit GDB auf einem entfernten System
+
+Diese Funktion wird seit FreeBSD 2.2 unterstützt und ist wirklich sehr geschickt.
+
+GDB unterstützt _die Fehlersuche von einem entfernten System aus_ bereits einige Zeit. Dies geschieht unter Benutzung eines sehr einfachen Protokolls über eine serielle Verbindung. Anders als bei den anderen, oben beschriebenen, Vorgehensweisen werden hier zwei Systeme benötigt. Das eine ist das Hostsystem, welches die Umgebung zur Fehlersuche, einschließlich aller Quellen und einer Kopie der Kernel-Binärdatei mit allen Symbolen bereitstellt, und das andere das Zielsystem, welches einfach nur eine Kopie desselben Kernels ausführt (ohne die Informationen zur Fehlersuche).
+
+Sie sollten den Kernel im Zweifelsfall mit `config -g` konfigurieren, `DDB` in die Konfiguration aufnehmen und den Kernel, wie sonst auch, kompilieren. Dies ergibt, aufgrund der zusätzlichen Informationen zur Fehlersuche, eine umfangreiche Binärdatei. Kopieren Sie diesen Kernel auf das Zielsystem, entfernen Sie die Symbole zur Fehlersuche mit `strip -x` und starten Sie ihn mit der `-d`-Boot-Option. Stellen Sie die serielle Verbindung zwischen dem Zielsystem, welches "flags 80" für dessen sio-Gerät gesetzt hat, und dem Hostsystem, welches die Fehlersuche übernimmt, her. Nun wechseln Sie auf dem Hostsystem in das Bauverzeichnis des Ziel-Kernels und starten `gdb`:
+
+[source,bash]
+....
+% kgdb kernel
+GDB is free software and you are welcome to distribute copies of it
+ under certain conditions; type "show copying" to see the conditions.
+There is absolutely no warranty for GDB; type "show warranty" for details.
+GDB 4.16 (i386-unknown-freebsd),
+Copyright 1996 Free Software Foundation, Inc...
+(kgdb)
+....
+
+Stellen Sie die entfernte Sitzung zur Fehlersuche ein mit (angenommen, der erste serielle Port ist in Verwendung):
+
+[source,bash]
+....
+(kgdb) target remote /dev/cuaa0
+....
+
+Jetzt geben Sie auf dem Zielsystem, welches noch vor Beginn der Gerätesuche in DDB gelangt ist, ein:
+
+[source,bash]
+....
+Debugger("Boot flags requested debugger")
+Stopped at Debugger+0x35: movb $0, edata+0x51bc
+db> gdb
+....
+
+DDB antwortet dann mit:
+
+[source,bash]
+....
+Next trap will enter GDB remote protocol mode
+....
+
+Jedesmal wenn Sie `gdb` eingeben, wird zwischen dem lokalen DDB und entfernten GDB umgeschaltet. Um einen nächsten Trap sofort zu erzwingen, geben Sie einfach `s` (step) ein. Ihr GDB auf dem Hostsystem erhält nun die Kontrolle über den Ziel-Kernel:
+
+[source,bash]
+....
+Remote debugging using /dev/cuaa0
+Debugger (msg=0xf01b0383 "Boot flags requested debugger")
+ at ../../i386/i386/db_interface.c:257
+(kgdb)
+....
+
+Sie können mit dieser Sitzung wie mit jeder anderen GDB-Sitzung umgehen, einschließlich vollem Zugriff auf die Quellen, Starten im gud-Modus innerhalb eines Emacs-Fensters (was Ihnen automatische Quelltext-Ausgabe in einem weiteren Emacs-Fenster bietet), usw.
+
+[[kerneldebug-console]]
+== Fehlersuche bei einem Konsolen-Treiber
+
+Da Sie nunmal einen Konsolen-Treiber benötigen, um DDB zu starten, ist alles ein wenig komplizierter, sobald der Konsolen-Treiber selbst versagt. Sie erinnern sich vielleicht an die Benutzung einer seriellen Konsole (entweder durch Verändern des Boot-Blocks oder Eingabe von `-h` an der `Boot:`-Eingabeaufforderung) und das Anschließen eines Standard-Terminals an Ihren ersten seriellen Port. DDB funktioniert auf jedem konfigurierten Konsolen-Treiber, auch auf einer seriellen Konsole.
+
+[[kerneldebug-deadlocks]]
+== Fehlersuche bei Deadlocks
+
+Sie erleben vielleicht mal sogenannte Deadlocks, wobei ein System aufhört, nützliche Arbeit zu machen. Um in einer solchen Situation einen hilfreichen Fehlerbericht zu liefern, benutzen Sie man:ddb[4], wie oben beschrieben. Hängen Sie die Ausgabe von `ps` und `trace` für verdächtige Prozesse an den Bericht an.
+
+Falls möglich, versuchen Sie, weitere Untersuchungen anzustellen. Der Empfang der Ausgaben unten ist besonders dann nützlich, wenn Sie den Auslöser für die Blockade des Systems auf VFS-Ebene vermuten. Fügen Sie die folgenden Optionen
+[.programlisting]
+....
+makeoptions DEBUG=-g
+ options INVARIANTS
+ options INVARIANT_SUPPORT
+ options WITNESS
+ options DEBUG_LOCKS
+ options DEBUG_VFS_LOCKS
+ options DIAGNOSTIC
+....
+
+der Kernel-Konfigurationsdatei hinzu. Wenn die Blockade ausgelöst wird, stellen Sie, zusätzlich der Ausgabe vom `ps`-Befehl, die Informationen aus `show pcpu`, `show allpcpu`, `show locks`, `show alllocks`, `show lockedvnods` und `alltrace` bereit.
+
+Um aussagekräftige Zurückverfolgungen von in Threads aufgeteilten Prozesse zu erhalten, benutzen Sie `thread thread-id`, um zum Thread-Stack zu wechseln und eine Zurückverfolgung mit `where` anzustellen.
+
+[[kerneldebug-options]]
+== Glossar der Kernel-Optionen zur Fehlersuche
+
+Dieser Abschnitt bietet ein kurzes Glossar der zur Kompilierzeit verfügbaren Kernel-Optionen, die die Fehlersuche unterstützen:
+
+* `options KDB`: Kompiliert das Kernel-Debugger-Framework ein. Wird von `options DDB` und `options GDB` benötigt. Kein oder nur geringer Leistungs-Overhead. Standardmäßig wird bei einer Panic der Debugger gestartet, anstatt automatisch neu zu starten.
+* `options KDB_UNATTENDED`: Setzt den Standard des `debug.debugger_on_panic`-sysctl-Werts auf 0, welcher regelt, ob der Debugger bei einer Panic gestartet wird. Solange `options KDB` nicht in den Kernel einkompiliert ist, wird bei einer Panic automatisch neu gestartet; sobald es in den Kernel einkompiliert ist, wird standardmäßig der Debugger gestartet, solange `options KDB_UNATTENDED` nicht einkompiliert ist. Falls Sie den Kernel-Debugger in den Kernel einkompiliert lassen wollen, aber möchten, dass das System neu startet, wenn Sie nicht zur Stelle sind, um den Debugger zur Diagnose zu benutzen, wählen Sie diese Option.
+* `options KDB_TRACE`: Setzt den Standard des `debug.trace_on_panic`-sysctl-Werts auf 1, welcher regelt, ob der Debugger bei einer Panic automatisch eine Stack-Ablaufverfolgung ausgibt. Besonders wenn der Kernel mit `KDB_UNATTENDED` läuft, kann dies hilfreich sein, um grundlegende Informationen zur Fehlersuche auf der seriellen oder Firewire-Konsole zu erhalten, während immer noch zur Wiederherstellung neu gestartet wird.
+* `options DDB`: Kompiliert die Unterstützung für den Konsolen-Debugger DDB ein. Dieser interaktive Debugger läuft auf was auch immer die aktive Konsole des Systems auf niedrigster Ebene ist, dazu gehören die Video-, serielle und Firewire-Konsole. Er bietet grundlegende, eingebaute Möglichkeiten zur Fehlersuche wie zum Beispiel das Erstellen von Stack-Ablaufverfolgungen, das Auflisten von Prozessen und Threads, das Ablegen des Lock-, VM- und Dateisystemstatus und die Verwaltung des Kernel-Speichers. DDB benötigt keine Software, die auf einem zweiten System läuft, oder die Fähigkeit, einen Kernspeicherauszug oder Kernel-Symbole zur vollen Fehlersuche zu erzeugen und bietet detaillierte Fehlerdiagnose des Kernels zur Laufzeit. Viele Fehler können allein unter Benutzung der DDB-Ausgabe untersucht werden. Diese Option hängt von `options KDB` ab.
+* `options GDB`: Kompiliert die Unterstützung für den Debugger GDB ein, welcher von einem entfernten System aus über ein serielles Kabel oder Firewire agieren kann. Wenn der Debugger gestartet ist, kann GDB dazu verwendet werden, um Struktur-Inhalte einzusehen, Stack-Ablaufverfolgungen zu erzeugen, usw. Bei manchem Kernel-Status ist der Zugriff ungeschickter als mit DDB, welcher dazu in der Lage ist, nützliche Zusammenfassungen des Kernel-Status automatisch zu erstellen wie zum Beispiel das automatische Abgehen der Lock-Fehlersuche oder der Strukturen zur Kernel-Speicher-Verwaltung, und es wird ein zweites System benötigt. Auf der anderen Seite verbindet GDB Informationen aus den Kernel-Quellen mit vollständigen Symbolen zur Fehlersuche, erkennt komplette Datenstrukturdefinitionen, lokale Variablen und ist in Skripten einsetzbar. Diese Option hängt von `options KDB` ab, ist aber nicht zur Benutzung von GDB auf einem Kernel-Kernspeicherauszug nötig.
+* `options BREAK_TO_DEBUGGER`, `options ALT_BREAK_TO_DEBUGGER`: Erlaubt ein Abbruch- oder Alternativ-Signal auf der Konsole, um in den Debugger zu gelangen. Falls sich das System ohne eine Panic aufhängt, ist dies ein nützlicher Weg, um den Debugger zu erreichen. Aufgrund der aktuellen Verriegelung durch den Kernel ist ein Abbruch-Signal, das auf einer seriellen Konsole erzeugt wurde, deutlich vertrauenswürdiger beim Gelangen in den Debugger und wird allgemein empfohlen. Diese Option hat kaum oder keine Auswirkung auf den Durchsatz.
+* `options INVARIANTS`: Kompiliert eine große Anzahl an Aussageprüfungen und -tests (Assertion-Checks und -Tests) ein, welche ständig die Intaktheit der Kernel-Datenstrukturen und die Invarianten der Kernel-Algorithmen prüfen. Diese Tests können aufwendig sein und sind deswegen nicht von Anfang an einkompiliert, aber helfen nützliches "fail stop"-Verhalten, wobei bestimmte Gruppen nicht erwünschten Verhaltens den Debugger öffnen, bevor Beschädigungen an Kernel-Daten auftreten, bereitzustellen, welches es einfacher macht, diese auf Fehler hin zu untersuchen. Die Tests beinhalten Säubern von Speicher und use-after-free-Prüfungen, was eine der bedeutenderen Quellen von Overhead ist. Diese Option hängt von `options INVARIANT_SUPPORT` ab.
+* `options INVARIANT_SUPPORT`: Viele der in `options INVARIANTS` vorhandenen Tests benötigen veränderte Datenstrukturen und zusätzliche Kernel-Symbole, die festgelegt werden müssen.
+* `options WITNESS`: Diese Option aktiviert Verfolgung und Prüfung von Lock-Anforderungen zur Laufzeit und ist als Werkzeug für die Deadlock-Diagnose von unschätzbarem Wert. WITNESS pflegt ein Diagramm mit erworbenen Lock-Anträgen nach Typ geordnet und prüft bei jedem Erwerb nach Zyklen (implizit oder explizit). Falls ein Zyklus entdeckt wird, werden eine Warnung und eine Stack-Ablaufverfolgung erzeugt und als Hinweis, dass ein möglicher Deadlock gefunden wurde, auf der Konsole ausgegeben. WITNESS wird benötigt, um die DDB-Befehle `show locks`, `show witness` und `show alllocks` benutzen zu können. Diese Debug-Option hat einen bedeutenden Leistung-Overhead, welcher ein ein wenig durch Benutzung von `options WITNESS_SKIPSPIN` gemildert werden kann. Detaillierte Dokumentation kann in man:witness[4] gefunden werden.
+* `options WITNESS_SKIPSPIN`: Deaktiviert die Prüfung von Spinlock-Lock-Anforderungen mit WITNESS zur Laufzeit. Da Spinlocks am häufigsten im Scheduler angefordert werden und Scheduler-Ereignisse oft auftreten, kann diese Option Systeme, die mit WITNESS laufen, merklich beschleunigen. Diese Option hängt von `options WITNESS` ab.
+* `options WITNESS_KDB`: Setzt den Standard des `debug.witness.kdb`-sysctl-Werts auf 1, was bewirkt, dass WITNESS den Debugger aufruft, sobald eine Lock-Anforderungsverletzung vorliegt, anstatt einfach nur eine Warnung auszugeben. Diese Option hängt von `options WITNESS` ab.
+* `options SOCKBUF_DEBUG`: Führt umfassende Beschaffenheitsprüfungen in Socket-Puffern durch, was nützlich zur Fehlersuche bei Socket-Fehlern und Anzeichen für Ressourceblockaden (Race) in Protokollen und Gerätetreibern, die mit Sockets arbeiten, sein kann. Diese Option hat bedeutende Auswirkung auf die Netzwerkleistung und kann die Zeitverhältnisse bei gegenseitiger Ressourceblockade in Gerätetreibern ändern.
+* `options DEBUG_VFS_LOCKS`: Verfolgt Lock-Anforderungs-Einzelheiten bei lockmgr/vnode-Locks, was die Menge der Informationen, die von `show lockdevnods` in DDB angezeigt werden, vergrößert. Diese Option hat messbare Auswirkung auf die Leistung.
+* `options DEBUG_MEMGUARD`: Ein Ersatz für die Kernel-Speicher-Zuweisung durch man:malloc[9], die das VM-System benutzt, um Lese- und Schreibzugriffe auf zugewiesenen Speicher nach der Freigabe zu entdecken. Details können in man:memguard[9] gefunden werden. Diese Option hat bedeutende Auswirkung auf die Leistung, aber kann sehr nützlich bei der Fehlersuche sein, wenn Kernel-Speicher-Beschädigungen durch Fehler verursacht werden.
+* `options DIAGNOSTIC`: Aktiviert zusätzliche, aufwendigere Diagnosetests analog zu `options INVARIANTS`.
diff --git a/documentation/content/de/books/developers-handbook/l10n/chapter.adoc b/documentation/content/de/books/developers-handbook/l10n/chapter.adoc
new file mode 100644
index 0000000000..a52e6fd360
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/l10n/chapter.adoc
@@ -0,0 +1,210 @@
+---
+title: Kapitel 4. Lokalisierung und Internationalisierung - L10N und I18N
+prev: books/developers-handbook/secure
+next: books/developers-handbook/policies
+---
+
+[[l10n]]
+= Lokalisierung und Internationalisierung - L10N und I18N
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 4
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[l10n-programming]]
+== I18N-konforme Anwendungen programmieren
+
+Um Ihre Anwendung verwendbarer für andere Sprachen zu machen, hoffen wir, dass Sie I18N-konform programmieren. Der GNU gcc-Compiler und Bibliotheken für grafische Benutzeroberflächen wie QT und GTK unterstützen I18N durch eine spezielle Verarbeitung von Zeichenketten. Das Erstellen eines I18N-konformen Programms ist sehr einfach und erlaubt anderen Mitwirkenden, Ihre Programme leichter in andere Sprachen zu übersetzen. Lesen Sie die Bibliothek-spezifischen I18N-Dokumentationen für weitere Details.
+
+Im Gegensatz zur allgemeinen Meinung ist I18N-konformer Code einfach zu programmieren. Üblicherweise umfasst dies nur das Einbetten Ihrer Zeichenketten in Bibliothek-spezifische Funktionen. Stellen Sie außerdem bitte sicher, dass Sie Unterstützung für Unicode- und Multibyte-Zeichen vorsehen.
+
+=== Ein Aufruf, die I18N-Bemühungen zu vereinheitlichen
+
+Wir sind darauf aufmerksam geworden, dass die einzelnen I18N-/L10N-Bemühungen für jedes Land wiederholt wurden. Viele von uns haben somit unproduktiverweise das Rad immer wieder neu erfunden. Wir hoffen, dass die verschiedenen großen Gruppen für I18N Ihre Bemühungen in einer Gruppe vereinen können, ähnlich der Zuständigkeit des Core-Teams.
+
+Derzeit hoffen wir, dass wenn Sie I18N-konforme Programme schreiben oder portieren, diese an die betreffenden FreeBSD-Mailinglisten jedes Landes schicken, um sie testen zu lassen. Wir hoffen in Zukunft, Anwendungen zu entwickeln, die in allen Sprachen direkt und ohne unsaubere Änderungen funktionieren.
+
+Die {freebsd-i18n}-Mailingliste ist eingerichtet worden. Wenn Sie I18N-/L10N-Entwickler sind, schicken Sie bitte Ihre Kommentare, Ideen, Fragen und alles, das Sie mit dem Thema in Verbindung bringen, dorthin.
+
+=== Perl und Python
+
+Perl und Python bieten Bibliotheken für I18N und zur Behandlung von Unicode-Zeichen. Bitte nutzen Sie diese für I18N-Konformität.
+
+[[posix-nls]]
+== Lokalisierte Nachrichten mit POSIX.1 Native Language Support (NLS)
+
+Über die Basisfunktionen von I18N hinaus, wie das Bereitstellen von verschiedenen Eingabecodierungen oder die diversen nationalen Konventionen, zum Beispiel die verschiedenen Dezimalpunkte, ist es auf einem höheren Level von I18N möglich, die Ausgabe von Programmen zu lokalisieren. Ein Weg dies zu tun besteht in der Nutzung der POSIX.1 NLS-Funktionen von FreeBSD.
+
+[[nls-catalogs]]
+=== Organisation von lokalisierten Mitteilungen in Katalog Dateien
+
+POSIX.1 NLS basiert auf Katalogdateien, welche die lokalisierten Mitteilungen in der entsprechenden Codierung enthalten. Die Mitteilungen sind in Sets organisiert und jede Mitteilung ist durch eine eindeutige Zahl in dem jeweiligen Set identifiziert. Die Katalogdateien werden nach der Lokale, von den jeweiligen lokalisierten Mitteilungen, die sie enthalten, gefolgt von der `.msg` Endung benannt. Zum Beispiel werden die ungarischen Mitteilungen für das ISO8859-2 Encoding in einer Datei mit dem Dateinamen [.filename]#hu_HU.ISO8859-2# gespeichert.
+
+Diese Katalogdateien sind normale Textdateien, welche die nummerierten Mitteilungen enthalten. Es ist möglich Kommentare in die Dateien zu schreiben, indem Sie ein `$`-Zeichen an den Anfang der Zeile setzen. Das Setzen von Grenzen wird ebenfalls durch spezielle Kommentare möglich wobei das Schlüsselwort `set` direkt nach dem `$`-Zeichen folgen muss. Dem Schlüsselwort `set` folgt dann die Set-Nummer. Ein Beispiel:
+
+[.programlisting]
+....
+$set 1
+....
+
+Der aktuelle Mitteilungseintrag startet mit der Mitteilungsnummer gefolgt von der lokalisierten Nachricht. Die bekannten Modifikatoren von man:printf[3] werden akzeptiert:
+
+[.programlisting]
+....
+15 "File not found: %s\n"
+....
+
+Die Katalogdateien müssen in binärer Form vorliegen, bevor sie von einem Programm benutzt werden können. Dies wird mit dem man:gencat[1] Tool durchgeführt. Das erste Argument ist der Dateiname des kompilierten Katalogs und die weiteren Argumente sind die Eingabekataloge. Die lokalisierten Mitteilungen können auf mehrere Katalogdateien aufgeteilt sein. Danach werden dann alle auf einmal mit dem man:gencat[1] Tool kompiliert.
+
+[[nls-using]]
+=== Nutzung der Katalogdateien im Quellcode
+
+Das Benutzen der Katalogdateien ist einfach. Um die relevante Funktion zu nutzen, muss [.filename]#nl_types.h# in die Quelldatei eingefügt werden. Bevor ein Katalog benutzt werden kann, muss er mit man:catopen[3] geöffnet werden. Die Funktion hat 2 Argumente. Der erste Parameter ist der Name des installierten und kompilierten Katalogs. Normalerweise wird der Name des Programmes, zum Beispiel grep, genutzt. Dieser Name wird zum Suchen der kompilierten Katalogdatei benutzt. Der Aufruf von man:catopen[3] sucht nach dieser Datei in [.filename]#/usr/shared/nls/locale/catname# und in [.filename]#/usr/local/shared/nls/locale/catname#, wobei `locale` die gesetzte Lokale und `catname` der Katalogname ist. Der zweite Parameter ist eine Konstante, die zwei Werte haben kann:
+
+* `NL_CAT_LOCALE`, hat die Bedeutung, dass die benutzte Katalogdatei auf `LC_MESSAGES` basiert.
+* `0`, hat die Bedeutung, dass `LANG` benutzt wird, um die Katalogdatei zu öffnen.
+
+Der man:catopen[3] Aufruf gibt einen Katalogidentifizierer vom Type `nl_catd` zurück. Sehen Sie in der Manualpage nach, um eine Liste mit möglichen Fehlercodes zu erhalten.
+
+Nach dem Öffnen eines Katalogs, kann man:catgets[3] benutzt werden, um Mitteilungen zu erhalten. Der erste Parameter ist der Katalogidentifizierer, der von man:catopen[3] zurück gegeben wurde, das zweite ist die Nummer des Sets, das dritte die Nummer der Mitteilung und das vierte ist eine Fallbackmitteilung, die angezeigt wird, falls die gewünschte Mitteilung in der Katalogdatei nicht verfügbar ist.
+
+Nach der Nutzung der Katalogdatei, muss sie mit dem Kommando man:catclose[3], geschlossen werden. Es besitzt ein Argument, die Katalog ID.
+
+[[nls-example]]
+=== Ein Beispiel aus der Praxis
+
+Das folgende Beispiel zeigt einen einfachen Weg wie man NLS-Kataloge flexibel nutzen kann.
+
+Die nachfolgenden Zeilen müssen in eine allgemeine Headerdatei, die in allen Quelldateien vorhanden ist, die lokalisierte Mitteilungen benutzen, eingefügt werden:
+
+[.programlisting]
+....
+#ifdef WITHOUT_NLS
+#define getstr(n) nlsstr[n]
+#else
+#include <nl_types.h>
+
+extern nl_catd catalog;
+#define getstr(n) catgets(catalog, 1, n, nlsstr[n])
+#endif
+
+extern char *nlsstr[];
+....
+
+Als nächstes fügen Sie die folgenden Zeilen in den globalen Deklarationsteil der Hauptquelldatei ein:
+
+[.programlisting]
+....
+#ifndef WITHOUT_NLS
+#include <nl_types.h>
+nl_catd catalog;
+#endif
+
+/*
+* Default messages to use when NLS is disabled or no catalog
+* is found.
+*/
+char *nlsstr[] = {
+ "",
+/* 1*/ "some random message",
+/* 2*/ "some other message"
+};
+....
+
+Als nächstes kommt der Code der den Katalog öffnet, liest und schließt:
+
+[.programlisting]
+....
+#ifndef WITHOUT_NLS
+ catalog = catopen("myapp", NL_CAT_LOCALE);
+#endif
+
+...
+
+printf(getstr(1));
+
+...
+
+#ifndef WITHOUT_NLS
+ catclose(catalog);
+#endif
+....
+
+==== Reduzierung von zu lokalisierenden Zeichenketten
+
+Es gibt einen guten Weg, Zeichenketten die lokaliesert werden müssen, durch den Einsatz von libc-Fehlermeldungen zu reduzieren. Dadurch vermeidet man Duplikate und erstellt gleiche Meldungen für häufige Fehlermeldungen, die bei vielen Programmen auftreten können.
+
+Als erstes ist hier ein Beispiel, dass keine libc-Fehlermeldungen benutzt:
+
+[.programlisting]
+....
+#include <err.h>
+...
+if (!S_ISDIR(st.st_mode))
+ err(1, "argument is not a directory");
+....
+
+Dies kann so abgeändert werden, dass eine Fehlermeldung durch Auslesen der Variabel `errno` ausgegeben wird. Die Fehlermeldung wird entsprechend dem Beispiel ausgegeben:
+
+[.programlisting]
+....
+#include <err.h>
+#include <errno.h>
+...
+if (!S_ISDIR(st.st_mode)) {
+ errno = ENOTDIR;
+ err(1, NULL);
+}
+....
+
+In diesem Beispiel wurde die benutzerdefinierte Zeichenkette entfernt. Übersetzer haben weniger Arbeit, wenn sie ein Programm lokalisieren und die Benutzer sehen die übliche "";Not a directory";" Fehlermeldung, wenn dieser Fehler auftritt. Diese Meldung wird ihnen wahrscheinlich vertraut erscheinen. Bitte beachten Sie, dass es notwendig ist, [.filename]#errno.h# hinzuzufügen um einen direkten Zugriff auf `errno` zu haben.
+
+Es lohnt sich darauf hinzuweisen, dass es Fälle gibt, in denen `errno` automatisch aufgerufen wird, so dass es nicht notwendig ist, es explizit zu tun:
+
+[.programlisting]
+....
+#include <err.h>
+...
+if ((p = malloc(size)) == NULL)
+ err(1, NULL);
+....
+
+[[nls-mk]]
+=== Benutzung von [.filename]#bsd.nls.mk#
+
+Das Benutzen von Katalogdateien setzt einige sich wiederholende Schritte, wie das kompilieren und installieren der Kataloge, voraus. Um diese Schritte zu vereinfachen, stellt [.filename]#bsd.nls.mk# einige Makros zur Verfügung. Es ist nicht notwendig [.filename]#bsd.nls.mk# explizit hinein zu kopieren, es wird automatisch aus den allgemeinen Makefiles wie [.filename]#bsd.prog.mk# oder [.filename]#bsd.lib.mk# gezogen.
+
+Normalerweise reicht es, `NLSNAME` zu definieren, die den Namen des Kataloges als erstes Argument von man:catopen[3] enthalten sollte und die Katalogdateien in `NLS` ohne ihre Endung `.msg` auflistet. Hier ist ein Beispiel, das es ermöglicht, NLS mit dem obigen Code zu deaktivieren. Die `WITHOUT_NLS` Variable von man:make[1] muss so definiert werden, dass das Programm ohne NLS-Unterstützung gebaut wird.
+
+[.programlisting]
+....
+.if !defined(WITHOUT_NLS)
+NLS= es_ES.ISO8859-1
+NLS+= hu_HU.ISO8859-2
+NLS+= pt_BR.ISO8859-1
+.else
+CFLAGS+= -DWITHOUT_NLS
+.endif
+....
+
+Normalerweise werden die Katalogdateien in dem [.filename]#nls#-Unterverzeichnis abgelegt. Dies ist der Standard von [.filename]#bsd.nls.mk#. Es ist möglich, mit der `NLSSRCDIR`-Variablen von man:make[1] diese zu überschreiben. Der Standardname der vorkompilierten Katalogdateien folgt den Namenskonventionen, wie oben beschrieben. Er kann durch die `NLSNAME`-Variablen überschrieben werden. Es gibt noch weitere Optionen, um eine Feinabstimmung zur Verarbeitung der Katalogdateien zu erreichen. Da sie nicht notwendig sind, werden sie hier nicht weiter beschrieben. Weitere Informationen über [.filename]#bsd.nls.mk# finden Sie in der Datei selbst. Der Text ist kurz und leicht zu verstehen.
diff --git a/documentation/content/de/books/developers-handbook/policies/chapter.adoc b/documentation/content/de/books/developers-handbook/policies/chapter.adoc
new file mode 100644
index 0000000000..c013720887
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/policies/chapter.adoc
@@ -0,0 +1,366 @@
+---
+title: Kapitel 5. Vorgaben und Richtlinien für das Quelltextverzeichnis
+authors:
+ - author: Poul-Henning Kamp
+ - author: Giorgos Keramidas
+prev: books/developers-handbook/l10n
+next: books/developers-handbook/testing
+---
+
+[[policies]]
+= Vorgaben und Richtlinien für das Quelltextverzeichnis
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 5
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+Dieses Kapitel dokumentiert verschiedene Vorgaben und Richtlinien für das FreeBSD-Quelltextverzeichnis.
+
+[[policies-style]]
+== Stil-Richtlinien
+
+Ein konsistenter Code-Stil ist extrem wichtig, besonders in einem so grossen Projekt wie FreeBSD. Der Code sollte dem FreeBSD Code-Stil entsprechen, welcher in man:style[9] und man:style.Makefile[5] genauer beschrieben ist.
+
+[[policies-maintainer]]
+== `MAINTAINER` eines Makefiles
+
+Wenn ein bestimmter Bereich der FreeBSD [.filename]#src/#-Distribution von einer Person oder Gruppe gepflegt wird, kann dies durch einen Eintrag in die Datei [.filename]#src/MAINTAINERS# der Öffentlichkeit mitgeteilt werden. Maintainer eines Ports in der Ports-Sammlung können ihre Verantwortung über den Port durch einen Eintrag in die `MAINTAINER`-Zeile im [.filename]#Makefile# des Ports der Welt mitteilen.
+
+[.programlisting]
+....
+MAINTAINER= email-addresses
+....
+
+[TIP]
+====
+
+Für andere Teile des Repositories oder andere Abschnitte, die noch keinen Maintainer aufweisen, oder falls Sie sich nicht sicher sind, wer der Maintainer ist, sehen Sie sich die Commit-Historie des betreffenden Ports an. Es ist recht häufig der Fall, dass ein Maintainer nicht explizit aufgeführt ist, aber trotzdem diejenigen Personen, die den Port seit den letzten paar Jahren aktiv betreuen, daran interessiert sind, Änderungen zu begutachten. Selbst wenn dies nicht explizit in der Dokumentation oder im Quellcode erwähnt ist, wird es trotzdem als höfliche Geste angesehen, wenn man nach einer Überprüfung der eigenen Änderungen fragt.
+====
+
+Die Rolle eines Maintainers ist die folgende:
+
+* Der Maintainer ist verantwortlich für diesen Code. Er oder sie muss einerseits für die Behebung von Fehlern und das Beantworten von Problemberichten für diesen Code die Verantwortung tragen und andererseits, falls es sich um beigesteuerte Software handelt, neue Versionen verfolgen und bereitstellen.
+* Änderungen an Verzeichnissen, die ein Maintainer definiert hat, sollten an den Maintainer für eine Überprüfung gesendet werden, bevor diese committet werden. Nur wenn der Maintainer in einer inakzeptablen Zeitspanne auf mehrere E-Mails nicht antwortet, können die Änderungen, die mit dem Commit in Kraft treten, auch ohne Überprüfung durch den Maintainer vollzogen werden. Dennoch wird empfohlen, dass die Änderungen, falls möglich, von jemand anderem überprüft werden.
+* Es ist natürlich nicht akzeptabel, einer Person oder Gruppe den Status eines Maintainers zu geben, so lange sie nicht zustimmt, diese Pflicht auf sich zu nehmen. Andererseits muss es kein einzelner Mensch sein. Eine Gruppe von Menschen ist genauso in Ordnung.
+
+[[policies-contributed]]
+== Beigesteuerte Software
+
+Einige Teile der FreeBSD-Distribution enthalten Software, die aktiv außerhalb des FreeBSD-Projektes gepflegt wird. Aus historischen Gründen nennen wir dies _contributed_ Software. Beispiele dafür sind sendmail, gcc und patch.
+
+Über die Jahre wurden verschiedene Methoden genutzt, um solche Software zu verwalten, und jede hat Vor- wie auch Nachteile. So hat sich kein eindeutiger Gewinner herauskristallisiert.
+
+Es wurde viel über diesen Umstand diskutiert und eine Methode als die "offizielle" vorgestellt, um in Zukunft diese Art der Software zu importieren. Ferner wird dringend geraten, dass sich existierende, beigesteuerte Software diesem Modell annähert, da es signifikante Vorteile gegenüber der alten Methode gibt. Dazu gehört auch, dass jeder einfach Diffs bezüglich der "offiziellen" Quelltext-Versionen erzeugen kann (auch ohne direkten Repository-Zugang). Dies wird es deutlich vereinfachen, Änderungen an die Hauptentwickler zurückfließen zu lassen.
+
+Letztendlich kommt es jedoch auf die Menschen an, welche die Arbeit leisten. Wenn die Durchführung dieses Modells bei einem Paket mal nicht möglich ist, können Ausnahmen dieser Regeln nur mit Genehmigung des Core-Teams und der Übereinstimmung der anderen Entwickler gewährt werden. Die Fähigkeit, dieses Paket auch in Zukunft pflegen zu können, ist eine der Schlüsselfragen bei dieser Entscheidung.
+
+[NOTE]
+====
+Durch einige bedauernswerte Einschränkungen des RCS-Dateiformats und die Handhabung von Herstellerzweigen ist von unwesentlichen, trivialen und/oder kosmetischen Änderungen an Dateien _dringend abzuraten_, die dem Herstellerzweig folgen. "Grammatikalische oder sprachliche Fehlerbehebungen" sind explizit unter der "Kosmetik"-Kategorie einzuordnen und sollten vermieden werden. Das Repository kann sich durch Änderungen einzelner Zeichen dramatisch aufblähen.
+====
+
+[[vendor-imports-cvs]]
+=== Herstellerimports mit CVS
+
+Das file-Werkzeug soll als Beispiel dienen, wie dieses Modell funktioniert:
+
+[.filename]#src/contrib/file# enthält den Quelltext so, wie vom Maintainer dieses Pakets bereitgestellt. Teile, die unter FreeBSD gänzlich unnutzbar sind, können entfernt werden. Im Fall von man:file[1] wurde u.a. das Unterverzeichnis [.filename]#python# und Dateien mit dem Präfix [.filename]#lt# vor dem Import entfernt.
+
+[.filename]#src/lib/libmagic# enthält ein [.filename]#Makefile# im bmake-Stil, das die Regeln des Standard-Makefiles [.filename]#bsd.lib.mk# nutzt, um die Bibliothek zu erstellen und die Dokumentation zu installieren.
+
+[.filename]#src/usr.bin/file# enthält ein [.filename]#Makefile# im bmake-Stil, welches das `file`-Programm erstellt und installiert, ebenso die dazugehörigen Manualpages, welche die Regeln von [.filename]#bsd.prog.mk# nutzen.
+
+Das Entscheidende ist hier das [.filename]#src/contrib/file#-Verzeichnis, welches nach den folgenden Regeln erstellt wird: Es muss den Quelltext aus dem Original enthalten (ohne RCS-Schlüsselworte und im korrekten Herstellerzweig) mit so wenig FreeBSD-spezifischen Änderungen wie möglich. Sollte es Zweifel geben, wie hier zu verfahren ist, unbedingt zuerst nachfragen und nicht auf gut Glück etwas probieren in der vagen Hoffnung, dass es "irgendwie funktioniert".
+
+Aufgrund der eingangs schon erwähnten Einschränkungen bei Herstellerzweigen ist es erforderlich, dass "offizielle" Fehlerbehebungen vom Hersteller in die Originalquellen der Distribution einfließen und als Resultat wieder in den Herstellerzweig importiert werden. Offizielle Fehlerbehebungen sollten nie direkt in FreeBSD eingepflegt und "committet" werden, da dies den Herstellerzweig zerstören würde und der Import von zukünftigen Versionen wäre um ein Vielfaches schwerer, da es zu Konflikten kommen würde.
+
+Da einige Pakete Dateien enthalten, die zur Kompatibilität mit anderen Architekturen und Umgebungen als FreeBSD gedacht sind, ist es zulässig, diese Teile zu löschen, wenn sie für FreeBSD nicht von Interesse sind, und so Speicherplatz zu sparen. Dateien, die ein Copyright und Release-artige Informationen zu den vorhandenen Dateien enthalten, sollten _nicht_ gelöscht werden.
+
+Falls es einfacher erscheint, können die `bmake`-[.filename]##Makefile##s vom Verzeichnisbaum durch einige Dienstprogramme automatisch erstellt werden, was es hoffentlich sogar noch einfacher macht, eine Version zu aktualisieren. Ist dies geschehen, so stellen Sie bitte sicher, diese Werkzeuge in das Verzeichnis [.filename]##src/tools## gleich mit dem Port an sich einzuchecken, sodass es für zukünftige Maintainer verfügbar ist.
+
+Im Verzeichnis [.filename]#src/contrib/file# sollte eine Datei mit dem Namen [.filename]#FREEBSD-upgrade# hinzugefügt werden und sie sollte den Stand wie folgt anzeigen:
+
+* Welche Dateien ausgelassen wurden.
+* Von wo die Original-Distribution stammt und/oder wo die offizielle Hauptseite zu finden ist.
+* Wohin Fehlerbehebungen an den Originalautor gesendet werden können.
+* Möglicherweise eine Übersicht, welche FreeBSD-spezifischen Änderungen vorgenommen wurden.
+
+Ein Beispielinhalt von [.filename]#src/contrib/groff/FREEBSD-upgrade# ist hier aufgelistet:
+
+[.programlisting]
+....
+$FreeBSD: src/contrib/groff/FREEBSD-upgrade,v 1.5.12.1 2005/11/15 22:06:18 ru Exp $
+
+This directory contains virgin sources of the original distribution files
+on a "vendor" branch. Do not, under any circumstances, attempt to upgrade
+the files in this directory via patches and a cvs commit.
+
+To upgrade to a newer version of groff, when it is available:
+ 1. Unpack the new version into an empty directory.
+ [Do not make ANY changes to the files.]
+
+ 2. Use the command:
+ cvs import -m 'Virgin import of FSF groff v<version>' \
+ src/contrib/groff FSF v<version>
+
+ For example, to do the import of version 1.19.2, I typed:
+ cvs import -m 'Virgin import of FSF groff v1.19.2' \
+ src/contrib/groff FSF v1_19_2
+
+ 3. Follow the instructions printed out in step 2 to resolve any
+ conflicts between local FreeBSD changes and the newer version.
+
+Do not, under any circumstances, deviate from this procedure.
+
+To make local changes to groff, simply patch and commit to the main
+branch (aka HEAD). Never make local changes on the FSF branch.
+
+All local changes should be submitted to Werner Lemberg <wl@gnu.org> or
+Ted Harding <ted.harding@nessie.mcc.ac.uk> for inclusion in the next
+vendor release.
+
+ru@FreeBSD.org - 20 October 2005
+....
+
+Eine weitere Möglichkeit ist es, eine Liste von Dateien, die nicht enthalten sein sollen zu pflegen, was besonders dann sehr hilfreich sein kann, wenn die Liste ziemlich gross oder kompliziert ist bzw. Imports sehr häufig stattfinden. Durch erstellen einer Datei namens [.filename]#FREEBSD-Xlist# im gleichen Verzeichnis, in welches das Herstellerverzeichnis importiert werden soll, die eine Liste von auszuschliessenden Dateinamen-Mustern pro Zeile enthält, können zukünftige Imports folgendermassen durchgeführt werden:
+
+[source,bash]
+....
+% tar -X FREEBSD-Xlist -xzf vendor-source.tgz
+....
+
+Als Beispiel einer [.filename]#FREEBSD-Xlist#-Datei wird hier diejenige von [.filename]#src/contrib/tcsh# gezeigt:
+
+[.programlisting]
+....
+*/BUGS
+*/config/a*
+*/config/bs2000
+*/config/bsd
+*/config/bsdreno
+*/config/[c-z]*
+*/tests
+*/win32
+....
+
+[NOTE]
+====
+Bitte importieren Sie weder [.filename]#FREEBSD-upgrade# noch [.filename]#FREEBSD-Xlist# mit den beigesteuerten Quellen. Stattdessen sollten Sie diese Dateien nach dem initialen Import hinzufügen.
+====
+
+[[vendor-import-svn]]
+=== Herstellerimports mit SVN
+
+Dieser Abschnitt beschreibt die Prozedur für Herstellerimports mit Subversion im Detail.
+
+[.procedure]
+====
+. Vorbereiten des Quellbaums
++
+Wenn dies Ihr erster Import nach dem Wechsel zu SVN ist, sollen Sie den Herstellerbaum aufräumen, verflachen und die Merge-Historie in den Hauptzweig vorbereiten. Falls das nicht Ihr erster Import ist, können Sie diesen Schritt ohne Probleme überspringen.
++
+Während der Konvertierung von CVS zu SVN wurden Herstellerzweige mit der gleichen Struktur wie der Hauptzweig importiert. Beispielsweise wurden die foo Herstellerquellen in [.filename]#vendor/foo/dist/contrib/foo# abgelegt, jedoch ist dies unpraktisch und zwecklos. Was wir wirklich wollen, ist dass die Herstellerquellen direkt in [.filename]#vendor/foo/dist# liegen, beispielsweise so:
++
+[source,bash]
+....
+% cd vendor/foo/dist/contrib/foo
+% svn move $(svn list) ../..
+% cd ../..
+% svn remove contrib
+% svn propdel -R svn:mergeinfo
+% svn commit
+....
++
+Beachten Sie, dass das `propdel`-Bit notwendig ist, da mit Subversion 1.5 automatisch `svn:mergeinfo` zu jedem Verzeichnis hinzugefügt wird, das Sie kopieren oder verschieben. In diesem Fall brauchen Sie diese Informationen nicht, da Sie nichts in den Zweig mergen werden, den Sie gelöscht haben.
++
+[NOTE]
+======
+Sie werden wahrscheinlich die Tags genauso verflachen wollen. Die Prozedur dafür ist die selbe. Wenn Sie dies tun, sollten Sie den Commit bis zum Schluss aufschieben.
+======
++
+Prüfen Sie den [.filename]#dist#-Baum und führen Sie alle nötigen Aufräumarbeiten durch, die Sie für sinnvoll erachten. Sie werden möglicherweise die Erweiterung von Schlüsselwörtern deaktivieren wollen, da dies auf unmodifizierten Quellen keinen Sinn ergibt. In machen Fällen kann dies sogar schädlich sein.
++
+[source,bash]
+....
+% svn propdel svn:keywords -R .
+% svn commit
+....
++
+Bootstrappen der `svn:mergeinfo` auf dem Zielverzeichnis (des Hauptzweiges) auf die Revision die mit der letzten Änderung, die im Herstellerzweig vor dem Import der neuen Quellen durchgeführt wurde, korrespondiert, wird ebenso benötigt:
++
+[source,bash]
+....
+% cd head/contrib/foo
+% svn merge --record-only svn_base/vendor/foo/dist@12345678 .
+% svn commit
+....
++
+Dabei entspricht _svn_base_ dem Basisverzeichnis Ihres SVN-Repositories, z.B. `svn+ssh://svn.FreeBSD.org/base`.
++
+. Neue Quellen importieren
++
+Bereiten Sie einen kompletten, sauberen Baum mit Herstellerquellen vor. Mit SVN können wir eine komplette Distribution in dem Herstellerzweig aufbewahren, ohne den Hauptzweig aufzublähen. Importieren Sie alles, aber mergen Sie nur das, was wirklich benötigt wird.
++
+Beachten Sie, dass Sie alle Dateien, die seit dem letzten Herstellerimport hinzugefügt wurden, auch einbeziehen und diejenigen, welche entfernt wurden, auch löschen müssen. Um dies zu bewerkstelligen, sollten Sie sortierte Listen der Bestandteile des Herstellerbaums und von den Quellen, Sie die vorhaben zu importieren, vorbereiten:
++
+[source,bash]
+....
+% cd vendor/foo/dist
+% svn list -R | grep -v '/$' | sort > ../old
+% cd ../foo-9.9
+% find . -type f | cut -c 3- | sort > ../new
+....
++
+Mit diesen beiden Dateien, wird Ihnen das folgende Kommando alle Dateien auflisten, die entfernt wurden (nur die Dateien in [.filename]#old#):
++
+[source,bash]
+....
+% comm -23 ../old ../new
+....
++
+Der folgende Befehl wird die hinzugefügten Dateien auflisten (nur diejenigen Dateien in [.filename]#new#):
++
+[source,bash]
+....
+% comm -13 ../old ../new
+....
++
+Wir führen dies nun zusammen:
++
+[source,bash]
+....
+% cd vendor/foo/foo-9.9
+% tar cf - . | tar xf - -C ../dist
+% cd ../dist
+% comm -23 ../old ../new | xargs svn remove
+% comm -13 ../old ../new | xargs svn add
+....
++
+[WARNING]
+======
+
+Wenn in der neuen Version neue Verzeichnisse hinzugekommen sind, wird dieser letzte Befehl fehlschlagen. Sie müssen diese Verzeichnisse hinzufügen und anschliessend den Befehl erneut ausführen. Genauso müssen Sie Verzeichnisse, die entfernt wurden, händisch löschen.
+======
++
+Prüfen Sie die Eigenschaften jeder neuen Datei:
++
+** Alle Textdateien sollten `svn:eol-style` auf den Wert `native` gesetzt haben.
+** Alle Binärdateien sollten `svn:mime-type` auf `application/octet-stream` gesetzt haben, ausser es existiert ein passenderer Medientyp.
+** Ausführbare Dateien sollten `svn:executable` auf `*` gesetzt haben.
+** Es sollten keine anderen Eigenschaften auf den Dateien im Baum gesetzt sein.
++
+[NOTE]
+======
+Sie sind bereit, zu committen, jedoch sollten Sie zuerst die Ausgabe von `svn stat` und `svn diff` überprüfen, um sicher zu gehen, dass alles in Ordnung ist.
+======
++
+Sobald Sie den die neue Release-Version des Herstellers committed haben, sollten Sie Ihn für zukünftige Referenzen taggen. Die beste und schnellste Methode ist, dies direkt im Repository zu tun:
++
+[source,bash]
+....
+% svn copy svn_base/vendor/foo/dist svn_base/vendor/foo/9.9
+....
++
+Um den neuen Tag zu bekommen, brauchen Sie nur ihre Arbeitskopie von [.filename]#vendor/foo# zu aktualisieren.
++
+[NOTE]
+======
+Wenn Sie lieber die Kopie in der ausgecheckten Kopie durchführen wollen, vergessen Sie nicht, die generierte `svn:mergeinfo` wie oben beschrieben zu entfernen.
+======
++
+. Mit _-HEAD_ mergen
++
+Nachdem Sie Ihren Import vorbereitet haben, wird es Zeit zu mergen. Die Option `--accept=postpone` weist SVN an, noch keine merge-Konflikte aufzulösen, weil wir uns um diese manuell kümmern werden:
++
+[source,bash]
+....
+% cd head/contrib/foo
+% svn update
+% svn merge --accept=postpone svn_base/vendor/foo/dist
+....
++
+Lösen Sie die Konflikte und stellen Sie sicher, dass alle Dateien, die im Herstellerzweig hinzugefügt oder entfernt wurden, auch sauber im Hauptzweig hinzugefügt bzw. gelöscht wurden. Es ist immer ratsam, diese Unterschiede gegen den Herstellerbaum zu prüfen:
++
+[source,bash]
+....
+% svn diff --no-diff-deleted --old=svn_base/vendor/foo/dist --new=.
+....
++
+Die Option `--no-diff-deleted` weist SVN an, keine Dateien zu prüfen, die sich zwar im Herstellerbaum, aber nicht im Hauptzweig befinden.
++
+[NOTE]
+======
+Bei SVN gibt es das Konzept von innerhalb und ausserhalb des Herstellerbaums nicht. Wenn eine Datei, die zuvor eine lokale Änderung hatte, aber nun keine mehr besitzt, entfernen Sie einfach das was übrig ist, wie FreeBSD Versionstags, damit diese nicht länger in den diffs gegen den Herstellerbaum erscheinen.
+======
++
+Wenn irgendwelche Änderungen notwendig sind, um die Welt mit den neuen Quellen zu bauen, machen Sie diese jetzt und testen Sie diese bis Sie sicher sind, dass alles korrekt gebaut wird und richtig funktionert.
++
+. Commit
++
+Nun sind Sie bereit für den Commit. Stellen Sie sicher, dass Sie alles in einem einzigen Schritt durchführen. Idealerweise sollten Sie alle diese Schritte in einem sauberen Baum durchgeführt haben. Falls dies der Fall ist, können Sie einfach aus dem obersten Verzeichnis dieses Baums committen. Dies ist der beste Weg, um Überraschungen zu vermeiden. Wenn Sie dies korrekt durchführen, wird der Baum atomar von einem konsistenten Zustand mit dem alten Code in einen neuen konsistenten Zustand mit dem neuen Code überführt.
+====
+
+[[policies-encumbered]]
+== Belastende Dateien
+
+Es kann gelegentlich notwendig sein, belastende Dateien in den FreeBSD-Quelltextbaum zu integrieren. Braucht ein Gerät zum Beispiel ein Stück binären Code, der zuerst geladen werden muss, bevor das Gerät funktioniert, und wir haben keine Quellen zu diesem Code, dann wird die binäre Datei als belastend bezeichnet. Die folgenden Richtlinien sind beim Aufnehmen von belastenden Dateien in den FreeBSD-Quelltextbaum zu beachten.
+
+. Jede Datei, die durch die System-CPU(s) ausgeführt wird und nicht als Quelltext vorliegt, ist belastend.
+. Jede Datei, deren Lizenz restriktiver ist als die BSD- oder GNU-Lizenz, ist belastend.
+. Eine Datei, die herunterladbare Binär-Daten enthält, ist nur belastend, wenn (1) oder (2) zutreffen. Sie muss in einem ASCII-Format gespeichert werden, das Architektur-neutral ist (file2c oder uuencoding wird empfohlen).
+. Jede belastende Datei braucht eine spezielle Genehmigung vom link:https://www.FreeBSD.org/administration/#t-core[Core-Team], bevor diese in das Repository aufgenommen werden darf.
+. Belastende Dateien liegen unter [.filename]#src/contrib# oder [.filename]#src/sys/contrib#.
+. Das komplette Modul sollte auch am Stück aufbewahrt werden. Es gibt keinen Grund, dieses zu teilen, außer es gibt einen Code-Austausch mit Quelltext, der nicht belastend ist.
+. Objekt-Dateien werden wie folgt benannt: [.filename]#arch/filename.o.uu>#.
+. Kernel-Dateien:
+.. Sollten immer nach [.filename]#conf/files.*# verweisen (um den Bau einfach zu halten).
+.. Sollten sich immer in [.filename]#LINT# befinden, jedoch entscheidet das link:https://www.FreeBSD.org/administration/#t-core[Core-Team] je nach Fall, ob es auskommentiert wird oder nicht. Das link:https://www.FreeBSD.org/administration/#t-core[Core-Team] kann sich zu einem späteren Zeitpunkt immer noch anders entscheiden.
+.. Der _Release-Engineer_ entscheidet, ob es in ein Release aufgenommen wird oder nicht.
+
+. Userland-Dateien:
+.. Das link:https://www.FreeBSD.org/administration/#t-core[Core-Team] entscheidet, ob der Code von `make world` gebaut wird oder nicht.
+.. Der link:https://www.FreeBSD.org/administration/#t-re[Release-Engineer] entscheidet, ob es in das Release aufgenommen wird oder nicht.
+
+[[policies-shlib]]
+== Shared-Libraries
+
+Sollten Sie die Unterstützung für Shared-Libraries bei einem Port oder einem Stück Software, das dies nicht hat, hinzufügen, sollten die Versionsnummern dessen Regeln folgen. Im Allgemeinen hat die sich daraus resultierende Nummer nichts mit der Release-Version der Software zu tun.
+
+Die drei Grundsätze zum Erstellen von Shared-Libraries sind:
+
+* Sie beginnen mit `1.0`.
+* Gibt es eine Änderung, die abwärtskompatibel ist, so springen Sie zur nächsten Minor-Version (beachten Sie, dass ELF-Systeme die Minor-Version ignorieren).
+* Gibt es eine inkompatible Änderung, so springen Sie bitte zur nächsten Major-Version.
+
+Zum Beispiel wird beim Hinzufügen von Funktionen und oder Fehlerbehebungen zur nächsten Minor-Version gesprungen, beim Löschen einer Funktion, Ändern von Funktionsaufrufen usw. ändert sich die Major-Version.
+
+Bleiben Sie bei Versionsnummern in der Form major.minor (_x_._y_). Unser dynamischer Linker a.out kann mit Versionsnummern in der Form _x_._y_._z_ nicht gut umgehen. Jede Versionsnummer nach dem _y_ (die dritte Zahl) wird völlig ignoriert, wenn Versionsnummern der Shared-Libraries verglichen werden, um zu bestimmen, mit welcher Bibliothek eine Anwendung verlinkt wird. Sind zwei Shared-Libraries vorhanden, die sich nur in der "micro"-Revision unterscheiden, so wird `ld.so` zu der höheren verlinken. Dies bedeutet, dass wenn Sie mit [.filename]#libfoo.so.3.3.3# verlinken, der Linker nur `3.3` in den Header aufnimmt und alles linkt, was mit _libfoo.so.3_ ._(irgendetwas >= 3)_._(höchste verfügbare Nummer)_ beginnt.
+
+[NOTE]
+====
+`ld.so` wird immer die höchste "Minor"-Revision benutzen. Beispielsweise wird es die [.filename]#libc.so.2.2# bevorzugen gegenüber der [.filename]#libc.so.2.0#, auch dann, wenn das Programm ursprünglich mit [.filename]#libc.so.2.0# verlinkt war.
+====
+
+Unser dynamischer ELF-Linker kann keine Minor-Versionen handhaben. Dennoch sollten die Major- und Minor-Versionen genutzt werden, da unsere [.filename]##Makefile##s "das Richtige machen" bezogen auf den Systemtyp.
+
+Für nicht-Port-Bibliotheken lautet die Richtlinie, die Shared-Library-Versionsnummer nur einmal zwischen den Releases zu ändern. Weiterhin ist es vorgeschrieben, die Major-Version der Shared-Libraries nur bei Major-OS-Releases zu ändern (beispielsweise von 6.0 auf 7.0). Wenn Sie also eine Änderung an einer Systembibliothek vornehmen, die eine neue Versionsnummer benötigt, überprüfen Sie die Commit-Logs des [.filename]##Makefile##s. Es liegt in der Verantwortung des Committers, dass sich eine erste solche Änderung seit dem letzten Release in der aktualisierten Versionsnummer der Shared-Library im [.filename]##Makefile## äußert, folgende Änderungen werden nicht berücksichtigt.
diff --git a/documentation/content/de/books/developers-handbook/secure/chapter.adoc b/documentation/content/de/books/developers-handbook/secure/chapter.adoc
new file mode 100644
index 0000000000..1c03b73282
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/secure/chapter.adoc
@@ -0,0 +1,212 @@
+---
+title: Kapitel 3. Sicheres Programmieren
+authors:
+ - author: Murray Stokely
+prev: books/developers-handbook/tools
+next: books/developers-handbook/l10n
+---
+
+[[secure]]
+= Sicheres Programmieren
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 3
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[secure-synopsis]]
+== Zusammenfassung
+
+Dieses Kapitel beschreibt einige Sicherheitsprobleme, die UNIX(R)-Programmierer seit Jahrzehnten quälen, und inzwischen verfügbare Werkzeuge, die Programmierern helfen, Sicherheitslücken in ihrem Quelltext zu vermeiden.
+
+[[secure-philosophy]]
+== Methoden des sicheren Entwurfs
+
+Sichere Anwendungen zu schreiben erfordert eine sehr skeptische und pessimistische Lebenseinstellung. Anwendungen sollten nach dem Prinzip der "geringsten Privilegien" ausgeführt werden, sodass kein Prozess mit mehr als dem absoluten Minimum an Zugriffsrechten arbeitet, die er zum Erfüllen seiner Aufgabe benötigt. Wo es möglich ist, sollte Quelltext, der bereits überprüft wurde, wiederverwendet werden, um häufige Fehler, die andere schon korrigiert haben, zu vermeiden.
+
+Eine der Stolperfallen der UNIX(R)-Umgebung ist, dass es sehr einfach ist Annahmen über die Konsistenz der Umgebung zu machen. Anwendungen sollten Nutzereingaben (in allen Formen) niemals trauen, genauso wenig wie den System-Ressourcen, der Inter-Prozess-Kommunikation oder dem zeitlichen Ablauf von Ereignissen. UNIX(R)-Prozesse arbeiten nicht synchron. Daher sind logische Operationen selten atomar.
+
+[[secure-bufferov]]
+== Puffer-Überläufe
+
+Puffer-Überläufe gibt es schon seit den Anfängen der Von-Neuman-Architektur <<COD>>. Sie erlangten zum ersten Mal durch den Internetwurm Morris im Jahre 1988 öffentliche Bekanntheit. Unglücklicherweise funktioniert der gleiche grundlegende Angriff noch heute. Die bei weitem häufigste Form eines Puffer-Überlauf-Angriffs basiert darauf, den Stack zu korrumpieren.
+
+Die meisten modernen Computer-Systeme verwenden einen Stack, um Argumente an Prozeduren zu übergeben und lokale Variablen zu speichern. Ein Stack ist ein last-in-first-out-Puffer (LIFO) im hohen Speicherbereich eines Prozesses. Wenn ein Programm eine Funktion aufruft wird ein neuer "Stackframe" erzeugt. Dieser besteht aus den Argumenten, die der Funktion übergeben wurden und einem variabel grossem Bereich für lokale Variablen. Der "Stack-Pointer" ist ein Register, dass die aktuelle Adresse der Stack-Spitze enthält. Da sich dieser Wert oft ändert, wenn neue Werte auf dem Stack abgelegt werden, bieten viele Implementierungen einen "Frame-Pointer", der nahe am Anfang des Stack-Frames liegt und es so leichter macht lokale Variablen relativ zum aktuellen Stackframe zu adressieren. <<COD>> Die Rücksprungadresse der Funktionen werden ebenfalls auf dem Stack gespeichert und das ist der Grund für Stack-Überlauf-Exploits. Denn ein böswilliger Nutzer kann die Rücksprungadresse der Funktion überschreiben indem er eine lokale Variable in der Funktion überlaufen lässt, wodurch es ihm möglich ist beliebigen Code auszuführen.
+
+Obwohl Stack-basierte Angriffe bei weitem die Häufigsten sind, ist es auch möglich den Stack mit einem Heap-basierten (malloc/free) Angriff zu überschreiben.
+
+Die C-Programmiersprache führt keine automatischen Bereichsüberprüfungen bei Feldern oder Zeigern durch, wie viele andere Sprachen das tun. Außerdem enthält die C-Standardbibliothek eine Handvoll sehr gefährlicher Funktionen.
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|`strcpy`(char *dest, const char *src)
+|
+
+Kann den Puffer dest überlaufen lassen
+
+|`strcat`(char *dest, const char *src)
+|
+
+Kann den Puffer dest überlaufen lassen
+
+|`getwd`(char *buf)
+|
+
+Kann den Puffer buf überlaufen lassen
+
+|`gets`(char *s)
+|
+
+Kann den Puffer s überlaufen lassen
+
+|`[vf]scanf`(const char *format, ...)
+|
+
+Kann sein Argument überlaufen lassen
+
+|`realpath`(char *path, char resolved_path[])
+|
+
+Kann den Puffer path überlaufen lassen
+
+|`[v]sprintf`(char *str, const char *format, ...)
+|
+
+Kann den Puffer str überlaufen lassen
+|===
+
+=== Puffer-Überlauf Beispiel
+
+Das folgende Quellcode-Beispiel enthält einen Puffer-Überlauf, der darauf ausgelegt ist die Rücksprungadresse zu überschreiben und die Anweisung direkt nach dem Funktionsaufruf zu überspringen. (Inspiriert durch <<Phrack>>)
+
+[.programlisting]
+....
+#include stdio.h
+
+void manipulate(char *buffer) {
+char newbuffer[80];
+strcpy(newbuffer,buffer);
+}
+
+int main() {
+char ch,buffer[4096];
+int i=0;
+
+while ((buffer[i++] = getchar()) != '\n') {};
+
+i=1;
+manipulate(buffer);
+i=2;
+printf("The value of i is : %d\n",i);
+return 0;
+}
+....
+
+Betrachten wir nun, wie das Speicherabbild dieses Prozesses aussehen würde, wenn wir 160 Leerzeichen in unser kleines Programm eingeben, bevor wir Enter drücken.
+
+[XXX figure here!]
+
+Offensichtlich kann man durch böswilligere Eingaben bereits kompilierten Programmtext ausführen (wie z.B. exec(/bin/sh)).
+
+=== Puffer-Überläufe vermeiden
+
+Die direkteste Lösung, um Stack-Überläufe zu vermeiden, ist immer grössenbegrenzten Speicher und String-Copy-Funktionen zu verwenden. `strncpy` und `strncat` sind Teil der C-Standardbibliothek. Diese Funktionen akzeptieren einen Längen-Parameter. Dieser Wert sollte nicht größer sein als die Länge des Zielpuffers. Die Funktionen kopieren dann bis zu `length` Bytes von der Quelle zum Ziel. Allerdings gibt es einige Probleme. Keine der Funktionen garantiert, dass die Zeichenkette NUL-terminiert ist, wenn die Größe des Eingabepuffers so groß ist wie das Ziel. Außerdem wird der Parameter length zwischen strncpy und strncat inkonsistent definiert, weshalb Programmierer leicht bezüglich der korrekten Verwendung durcheinander kommen können. Weiterhin gibt es einen spürbaren Leistungsverlust im Vergleich zu `strcpy`, wenn eine kurze Zeichenkette in einen großen Puffer kopiert wird. Denn `strncpy` fült den Puffer bis zur angegebenen Länge mit NUL auf.
+
+In OpenBSD wurde eine weitere Möglichkeit zum kopieren von Speicherbereichen implementiert, die dieses Problem umgeht. Die Funktionen `strlcpy` und `strlcat` garantieren, dass das Ziel immer NUL-terminiert wird, wenn das Argument length ungleich null ist. Für weitere Informationen über diese Funktionen lesen Sie bitte <<OpenBSD>>. Die OpenBSD-Funktionen `strlcpy` und `strlcat` sind seit Version 3.3 auch in FreeBSD verfügbar.
+
+==== Compiler-basierte Laufzeitüberprüfung von Grenzen
+
+Unglücklicherweise gibt es immer noch sehr viel Quelltext, der allgemein verwendet wird und blind Speicher umherkopiert, ohne eine der gerade besprochenen Funktionen, die Begrenzungen unterstützen, zu verwenden. Glücklicherweise gibt es einen Weg, um solche Angriffe zu verhindern - Überprüfung der Grenzen zur Laufzeit, die in verschiedenen C/C++ Compilern eingebaut ist.
+
+ProPolice ist eine solche Compiler-Eigenschaft und ist in den man:gcc[1] Versionen 4.1 und höher integriert. Es ersetzt und erweitert die man:gcc[1] StackGuard-Erweiterung von früher.
+
+ProPolice schützt gegen stackbasierte Pufferüberläufe und andere Angriffe durch das Ablegen von Pseudo-Zufallszahlen in Schlüsselbereichen des Stacks bevor es irgendwelche Funktionen aufruft. Wenn eine Funktion beendet wird, werden diese "Kanarienvögel" überprüft und wenn festgestellt wird, dass diese verändert wurden wird das Programm sofort abgebrochen. Dadurch wird jeglicher Versuch, die Rücksprungadresse oder andere Variablen, die auf dem Stack gespeichert werden, durch die Ausführung von Schadcode zu manipulieren, nicht funktionieren, da der Angreifer auch die Pseudo-Zufallszahlen unberührt lassen müsste.
+
+Ihre Anwendungen mit ProPolice neu zu kompilieren ist eine effektive Maßnahme, um sie vor den meisten Puffer-Überlauf-Angriffen zu schützen, aber die Programme können noch immer kompromittiert werden.
+
+==== Bibliotheks-basierte Laufzeitüberprüfung von Grenzen
+
+Compiler-basierte Mechanismen sind bei Software, die nur im Binärformat vertrieben wird, und die somit nicht neu kompiliert werden kann völlig nutzlos. Für diesen Fall gibt es einige Bibliotheken, welche die unsicheren Funktionen der C-Bibliothek (`strcpy`, `fscanf`, `getwd`, etc..) neu implementieren und sicherstellen, dass nicht hinter den Stack-Pointer geschrieben werden kann.
+
+* libsafe
+* libverify
+* libparanoia
+
+Leider haben diese Bibliotheks-basierten Verteidigungen mehrere Schwächen. Diese Bibliotheken schützen nur vor einer kleinen Gruppe von Sicherheitslücken und sie können das eigentliche Problem nicht lösen. Diese Maßnahmen können versagen, wenn die Anwendung mit -fomit-frame-pointer kompiliert wurde. Außerdem kann der Nutzer die Umgebungsvariablen LD_PRELOAD und LD_LIBRARY_PATH überschreiben oder löschen.
+
+[[secure-setuid]]
+== SetUID-Themen
+
+Es gibt zu jedem Prozess mindestens sechs verschiedene IDs, die diesem zugeordnet sind. Deshalb müssen Sie sehr vorsichtig mit den Zugriffsrechten sein, die Ihr Prozess zu jedem Zeitpunkt besitzt. Konkret bedeutet dass, das alle seteuid-Anwendungen ihre Privilegien abgeben sollten, sobald sie diese nicht mehr benötigen.
+
+Die reale Benutzer-ID kann nur von einem Superuser-Prozess geändert werden. Das Programm login setzt sie, wenn sich ein Benutzer am System anmeldet, und sie wird nur selten geändert.
+
+Die effektive Benutzer-ID wird von der Funktion `exec()` gesetzt, wenn ein Programm das seteuid-Bit gesetzt hat. Eine Anwendung kann `seteuid()` jederzeit aufrufen, um die effektive Benutzer-ID entweder auf die reale Benutzer-ID oder die gespeicherte set-user-ID zu setzen. Wenn eine der `exec()`-Funktionen die effektive Benutzer-ID setzt, wird der vorherige Wert als gespeicherte set-user-ID abgelegt.
+
+[[secure-chroot]]
+== Die Umgebung ihrer Programme einschränken
+
+Die herkömmliche Methode, um einen Prozess einzuschränken, besteht in dem Systemaufruf `chroot()`. Dieser Aufruf ändert das Wurzelverzeichnis, auf das sich alle Pfadangaben des Prozesses und jegliche Kind-Prozesse beziehen. Damit dieser Systemaufruf gelingt, muss der Prozess Ausführungsrechte (Durchsuchungsrechte) für das Verzeichnis haben, auf das er sich bezieht. Die neue Umgebung wird erst wirksam, wenn Sie mittels `chdir()` in Ihre neue Umgebung wechseln. Es sollte erwähnt werden, dass ein Prozess recht einfach aus der chroot-Umgebung ausbrechen kann, wenn er root-Rechte besitzt. Das kann man erreichen, indem man Gerätedateien anlegt, um Kernel-Speicher zu lesen, oder indem man einen Debugger mit einem Prozess außerhalb seiner man:chroot[8]-Umgebung verbindet, oder auf viele andere kreative Wege.
+
+Das Verhalten des Systemaufrufs `chroot()` kann durch die kern.chroot.allow_open_directories `sysctl`-Variable beeinflusst werden. Wenn diese auf 0 gesetzt ist, wird `chroot()` mit EPERM fehlschlagen, wenn irgendwelche Verzeichnisse geöffnet sind. Wenn die Variable auf den Standardwert 1 gesetzt ist, wird `chroot()` mit EPERM fehlschlagen, wenn irgendwelche Verzeichnisse geöffnet sind und sich der Prozess bereits in einer `chroot()`-Umgebung befindet. Bei jedem anderen Wert wird die Überprüfung auf geöffnete Verzeichnisse komplett umgangen.
+
+=== Die Jail-Funktionalität in FreeBSD
+
+Das Konzept einer Jail (Gefängnis) erweitert `chroot()`, indem es die Macht des Superusers einschränkt, um einen echten 'virtuellen Server' zu erzeugen. Wenn ein solches Gefängnis einmal eingerichtet ist, muss die gesamte Netzwerkkommunikation über eine bestimmte IP-Adresse erfolgen und die "root-Privilegien" innerhalb der Jail sind sehr stark eingeschränkt.
+
+Solange Sie sich in einer Jail befinden, werden alle Tests auf Superuser-Rechte durch den Aufruf von `suser()` fehlschlagen. Allerdings wurden einige Aufrufe von `suser()` abgeändert, um die neue `suser_xxx()`-Schnittstelle zu implementieren. Diese Funktion ist dafür verantwortlich, festzustellen, ob bestimmte Superuser-Rechte einem eingesperrten Prozess zur Verfügung stehen.
+
+Ein Superuser-Prozess innerhalb einer Jail darf folgendes:
+
+* Berechtigungen verändern mittels: `setuid`, `seteuid`, `setgid`, `setegid`, `setgroups`, `setreuid`, `setregid`, `setlogin`
+* Ressourcenbegrenzungen setzen mittels `setrlimit`
+* Einige sysctl-Variablen (kern.hostname) verändern
+* `chroot()`
+* Ein Flag einer vnode setzen: `chflags`, `fchflags`
+* Attribute einer vnode setzen wie Dateiberechtigungen, Eigentümer, Gruppe, Größe, Zugriffszeit und Modifikationszeit
+* Binden eines Prozesses an einen öffentlichen privilegierten Port (ports 1024)
+
+``Jail``s sind ein mächtiges Werkzeug, um Anwendungen in einer sicheren Umgebung auszuführen, aber sie haben auch ihre Nachteile. Derzeit wurden die IPC-Mechanismen noch nicht an `suser_xxx` angepasst, so dass Anwendungen wie MySQL nicht innerhalb einer Jail ausgeführt werden können. Der Superuser-Zugriff hat in einer Jail nur eine sehr eingeschränkte Bedeutung, aber es gibt keine Möglichkeit zu definieren was "sehr eingeschränkt" heißt.
+
+=== POSIX(R).1e Prozess Capabilities
+
+POSIX(R) hat einen funktionalen Entwurf (Working Draft) herausgegeben, der Ereignisüberprüfung, Zugriffskontrolllisten, feiner einstellbare Privilegien, Informationsmarkierung und verbindliche Zugriffskontrolle enthält.
+
+Dies ist im Moment in Arbeit und das Hauptziel des http://www.trustedbsd.org/[TrustedBSD]-Projekts. Ein Teil der bisherigen Arbeit wurde in FreeBSD-CURRENT übernommen (cap_set_proc(3)).
+
+[[secure-trust]]
+== Vertrauen
+
+Eine Anwendung sollte niemals davon ausgehen, dass irgendetwas in der Nutzerumgebung vernünftig ist. Das beinhaltet (ist aber sicher nicht darauf beschränkt): Nutzereingaben, Signale, Umgebungsvariablen, Ressourcen, IPC, mmaps, das Arbeitsverzeichnis im Dateisystem, Dateideskriptoren, die Anzahl geöffneter Dateien, etc..
+
+Sie sollten niemals annehmen, dass Sie jede Art von inkorrekten Eingaben abfangen können, die ein Nutzer machen kann. Stattdessen sollte Ihre Anwendung positive Filterung verwenden, um nur eine bestimmte Teilmenge an Eingaben zuzulassen, die Sie für sicher halten. Ungeeignete Datenüberprüfung ist die Ursache vieler Exploits, besonders für CGI-Skripte im Internet. Bei Dateinamen müssen Sie besonders vorsichtig sein, wenn es sich um Pfade ("../", "/"), symbolische Verknüpfungen und Shell-Escape-Sequenzen handelt.
+
+Perl bietet eine wirklich coole Funktion, den sogenannten "Taint"-Modus, der verwendet werden kann, um zu verhindern, dass Skripte Daten, die von außerhalb des Programmes stammen, auf unsichere Art und Weise verwenden. Dieser Modus überprüft Kommandozeilenargumente, Umgebungsvariablen, Lokalisierungsinformationen, die Ergebnisse von Systemaufrufen (`readdir()`, `readlink()`, `getpwxxx()`) und alle Dateieingaben.
+
+[[secure-race-conditions]]
+== Race-Conditions
+
+Eine Race-Condition ist ein unnormales Verhalten, das von einer unerwarteten Abhängigkeit beim Timing von Ereignissen verursacht wird. Mit anderen Worten heißt das, ein Programmierer nimmt irrtümlicher Weise an, dass ein bestimmtes Ereignis immer vor einem anderen stattfindet.
+
+Einige der häufigsten Ursachen für Race-Conditions sind Signale, Zugriffsprüfungen und das Öffnen von Dateien. Signale sind von Natur aus asynchrone Ereignisse, deshalb ist besondere Vorsicht im Umgang damit geboten. Das Prüfen des Zugriffs mittels der Aufrufe `access(2)` gefolgt von `open(2)` ist offensichtlich nicht atomar. Benutzer können zwischen den beiden Aufrufen Dateien verschieben. Stattdessen sollten privilegierte Anwendungen `seteuid()` direkt gefolgt von `open()` aufrufen. Auf die gleiche Art sollte eine Anwendung immer eine korrekte Umask vor dem Aufruf von `open()` setzen, um störende Aufrufe von `chmod()` zu umgehen.
diff --git a/documentation/content/de/books/developers-handbook/sockets/chapter.adoc b/documentation/content/de/books/developers-handbook/sockets/chapter.adoc
new file mode 100644
index 0000000000..a9dcf1abd0
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/sockets/chapter.adoc
@@ -0,0 +1,36 @@
+---
+title: Kapitel 7. Sockets
+authors:
+ - author: G. Adam Stanislav
+prev: books/developers-handbook/testing
+next: books/developers-handbook/ipv6
+---
+
+[[sockets]]
+= Sockets
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 7
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+Dieses Kapitel ist noch nicht übersetzt. Lesen Sie bitte <<sockets,das Original in englischer Sprache>>. Wenn Sie helfen wollen, dieses Kapitel zu übersetzen, senden Sie bitte eine E-Mail an die Mailingliste {de-doc}.
diff --git a/documentation/content/de/books/developers-handbook/testing/chapter.adoc b/documentation/content/de/books/developers-handbook/testing/chapter.adoc
new file mode 100644
index 0000000000..8e22611fde
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/testing/chapter.adoc
@@ -0,0 +1,71 @@
+---
+title: Kapitel 6. Regressions- und Performance-Tests
+prev: books/developers-handbook/policies
+next: books/developers-handbook/sockets
+---
+
+[[testing]]
+= Regressions- und Performance-Tests
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 6
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+Regressions-Tests werden durchgeführt, um zu überprüfen, ob ein bestimmter Teil des Systems wie erwartet funktioniert, und um sicherzustellen, dass bereits beseitigte Fehler nicht wieder eingebaut werden.
+
+Die FreeBSD-Regressions-Testwerkzeuge finden Sie im FreeBSD-Quelltextbaum unter [.filename]#src/tools/regression#.
+
+[[testing-micro-benchmark]]
+== Mikro-Benchmark-Checkliste
+
+Dieser Abschnitt enthält Tipps, wie ordnungsgemäße Mikro-Benchmarks unter FreeBSD oder für FreeBSD selbst erstellt werden.
+
+Es ist nicht möglich, immer alle der folgenden Vorschläge zu berücksichtigen, aber je mehr davon, desto besser wird der Benchmark kleine Unterschiede nachweisen können.
+
+* Schalten Sie APM und alles andere, das den Systemtakt beeinflusst, ab (ACPI?).
+* Starten Sie in den Single-User-Modus. man:cron[8] und andere Systemdienste verursachen nur Störungen. Genauso der man:sshd[8]-Systemdienst. Falls während des Tests SSH-Zugriff benötigt wird, schalten Sie entweder die Neuerstellung des SSHv1-Schlüssels ab oder beenden Sie den `sshd`-Elternprozess während der Tests.
+* Beenden Sie man:ntpd[8].
+* Falls man:syslog[3]-Ereignisse erzeugt werden, starten Sie man:syslogd[8] mit leerer [.filename]#/etc/syslogd.conf# oder beenden Sie es.
+* Sorgen Sie für möglichst wenig Disk-I/O; vermeiden Sie es ganz wenn möglich.
+* Hängen Sie keine Dateisysteme ein, die Sie nicht benötigen.
+* Hängen Sie [.filename]#/#, [.filename]#/usr# und die anderen Dateisysteme nur lesbar ein wenn möglich. Dies verhindert, dass atime-Aktualisierungen auf der Festplatte (usw.) das Ergebnis verfälschen.
+* Initialisieren Sie das beschreibbare Test-Dateisystem mit man:newfs[8] neu und füllen Sie es aus einer man:tar[1]- oder man:dump[8]-Datei vor jedem Lauf. Hängen Sie es aus und wieder ein, bevor Sie den Test starten. Dies sorgt für einen konsistenten Dateisystemaufbau. Bei einem "worldstone"-Test bezieht sich dies auf [.filename]#/usr/obj# (Initialisieren Sie es einfach mit `newfs` neu und hängen Sie es ein). Um absolut reproduzierbare Ergebnisse zu bekommen, füllen Sie das Dateisystem aus einer man:dd[1]-Datei (d.h. `dd if=myimage of=/dev/ad0s1h bs=1m`).
+* Benutzen Sie malloc-gestützte oder vorbelastete man:md[4]-Partitionen.
+* Starten Sie zwischen den einzelnen Durchläufen neu, dies sichert einen konsistenteren Zustand.
+* Entfernen Sie alle nicht unbedingt benötigten Gerätetreiber aus dem Kernel. Wenn z.B. USB für den Test nicht benötigt wird, entfernen Sie es aus dem Kernel. Gerätetreiber, die sich Hardware zuteilen, haben oft "tickende" Timeouts.
+* Konfigurieren Sie nicht Hardware, die nicht benutzt wird. Entfernen Sie Festplatten mit man:atacontrol[8] und man:camcontrol[8], wenn diese für den Test nicht gebraucht werden.
+* Konfigurieren Sie nicht das Netzwerk, es sei denn es wird getestet, oder warten Sie, bis der Test fertig ist, wenn Sie das Ergebnis auf einen anderen Rechner übertragen wollen.
++
+Falls das System an ein öffentliches Netzwerk angeschlossen sein muss, achten Sie auf Spitzen im Broadcast-Verkehr. Obwohl dieser kaum auffällt, wird er CPU-Zyklen brauchen. Ähnliches gilt für Multicast.
+* Legen Sie jedes Dateisystem auf eine eigene Festplatte. Dies minimiert Jitter durch Optimierungen von Lesekopfbewegungen.
+* Minimieren Sie Ausgaben auf serielle oder VGA-Konsolen. Ausgabenumleitung in Dateien ergibt weniger Jitter (serielle Konsolen werden leicht zum Flaschenhals). Benutzen Sie die Tastatur nicht, während der Test läuft, sogar kbd:[space] oder kbd:[back-space] wirken sich auf die Ergebnisse aus.
+* Stellen Sie sicher, dass der Test lang genug läuft, aber nicht zu lange. Wenn er zu kurz ist, sind Zeitstempel ein Problem. Wenn er zu lang ist, werden Temperaturänderungen und Drift die Frequenz von Quarzkristallen im Rechner beeinflussen. Daumenregel: mehr als eine Minute, weniger als eine Stunde.
+* Versuchen Sie, die Temperatur in der Umgebung des Rechners so stabil wie möglich zu halten. Diese beeinflusst sowohl Quarzkristalle als auch Festplatten-Algorithmen. Um einen wirklich stabilen Takt zu erhalten, wäre es auch möglich, einen stabilisierten Takt anzuschließen. D.h. besorgen Sie sich einen OCXO + PLL und koppeln Sie das Ausgangssignal mit den Taktgeberschaltkreisen anstelle des Quarzkristalls der Hauptplatine. Wenden Sie sich an {phk}, wenn Sie mehr Informationen hierüber benötigen.
+* Lassen Sie den Test mindestens drei Mal laufen, besser mehr als 20 Mal, sowohl für "vor" als auch für "nach" dem Code. Versuchen Sie abzuwechseln (d.h. nicht erst 20 Mal "vorher" und dann 20 Mal "nachher"), dies ermöglicht, umgebungsbedingte Effekte zu erkennen. Wechseln Sie nicht 1:1 ab, sondern 3:3; dies erlaubt, Wechselwirkungseffekte zu erkennen.
++
+Ein gutes Muster ist: `bababa{bbbaaa}*`. Dies gibt Hinweise nach den ersten 1+1-Läufen (sodass Sie den Test stoppen können, falls er völlig daneben geht), Sie können die Standardabweichung nach den ersten 3+3-Läufen überprüfen (zeigt an, ob sich ein längerer Lauf lohnt), später Trends und Wechselwirkungen.
+* Benutzen Sie man:ministat[1], um festzustellen, ob Ihre Ergebnisse signifikant sind. Überlegen Sie sich, das Buch "Cartoon guide to statistics" ISBN: 0062731025 zu kaufen. Es ist sehr empfehlenswert, falls Sie Dinge wie Standardabweichung und Studentsche t-Verteilung vergessen oder nie gelernt haben.
+* Benutzen Sie keinen Hintergrund-man:fsck[8], wenn Sie ihn nicht selbst testen wollen. Schalten Sie auch ``background_fsck`` in [.filename]#/etc/rc.conf# aus, es sei denn der Benchmark wird nicht mindestens 60+"Laufzeit von ``fsck``" Sekunden nach Systemstart gestartet, da man:rc[8] startet und prüft, ob ``fsck`` auf irgendeinem der Dateisysteme laufen muss, wenn Hintergrund-``fsck`` eingeschaltet ist. Stellen Sie ebenfalls sicher, dass keine Snapshots herumliegen, falls der Benchmark nicht ein Test mit Snapshots ist.
+* Falls der Benchmark unerwartet schlechte Performance zeigt, überprüfen Sie Dinge wie große Mengen Interrupts von unerwarteten Quellen. Es gibt Berichte, dass einige ACPI-Versionen sich "daneben benehmen" und ein Übermaß an Interrupts erzeugen. Um zu helfen, ungewöhnliche Testergebnisse zu diagnostizieren, machen Sie ein paar Momentaufnahmen von `vmstat -i` und suchen Sie nach Ungewöhnlichem.
+* Gehen Sie mit Parametern zur Optimierung von Kernel, Userland und Fehlersuche vorsichtig um. Es passiert schnell, irgendetwas durchrutschen zu lassen und dann später festzustellen, dass der Test nicht das gleiche verglichen hat.
+* Erstellen Sie nie Benchmarks unter Verwendung der Kernel-Optionen `WITNESS` und `INVARIANTS`, wenn der Test nicht diese Merkmale selbst untersuchen soll. `WITNESS` kann zu 400% und mehr Performance-Abnahme führen. Ähnliches gilt für Userland-man:malloc[3]-Parameter, Voreinstellungen hierbei unterscheiden sich bei -CURRENT von denen bei Production-Releases.
diff --git a/documentation/content/de/books/developers-handbook/tools/chapter.adoc b/documentation/content/de/books/developers-handbook/tools/chapter.adoc
new file mode 100644
index 0000000000..9175b8f6c2
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/tools/chapter.adoc
@@ -0,0 +1,1228 @@
+---
+title: Kapitel 2. Werkzeuge zur Programmierung
+authors:
+ - author: James Raynard
+ - author: Murray Stokely
+prev: books/developers-handbook/introduction
+next: books/developers-handbook/secure
+---
+
+[[tools]]
+= Werkzeuge zur Programmierung
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:c-plus-plus-command: c++
+:clang-plus-plus-command: clang++
+:gcc-plus-plus: g++
+:lg-plus-plus: -lg++
+:lstdc-plus-plus: -lstdc++
+:sectnumoffset: 2
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[tools-synopsis]]
+== Überblick
+
+Dieses Kapitel ist eine Einführung in die Benutzung einiger der Werkzeuge zur Programmierung die mit FreeBSD ausgeliefert werden. Trotzdem ist vieles auch auf verschiedene andere Versionen von UNIX(R) übertragbar. Dieses Kapitel soll _kein_ Versuch sein Programmierung detailliert zu beschreiben. Der größte Teil dieses Kapitels setzt wenige oder gar keine Programmierkenntnisse voraus, dennoch sollten die meisten Programmierer etwas Sinnvolles darin finden.
+
+[[tools-intro]]
+== Zusammenfassung
+
+FreeBSD bietet eine exzellente Entwicklungsumgebung. Compiler für C und C++, sowie ein Assembler sind im Basissystem enthalten. Natürlich finden sich auch klassische UNIX(R)-Werkzeuge wie `sed` und `awk`. Sollte das nicht genug sein, finden sich zahlreiche weitere Compiler und Interpreter in der Ports-Sammlung. Der folgende Abschnitt, <<tools-programming,Einführung in die Programmierung>>, zählt ein paar der verfügbaren Optionen auf. FreeBSD ist kompatibel zu vielen Standards wie POSIX(R) und ANSI C, sowie zu seinem eigenen BSD Erbe. So ist es möglich Anwendungen zu schreiben, welche ohne oder zumindest ohne wesentliche Änderungen auf einer großen Zahl an Plattformen kompilieren und laufen werden.
+
+Allerdings können all diese Möglichkeiten anfangs etwas überwältigend sein, wenn Sie vorher nie Programme auf einem UNIX(R)-System geschrieben haben. Dieses Dokument hat die Zielsetzung ihnen beim Einstieg zu helfen ohne allzu weit in fortgeschrittene Themen vorzudringen. Die Intention ist, daß dieses Dokument ihnen ausreichend Basiswissen vermittelt und die weitergehende Dokumentation sinnvoll nutzen zu können.
+
+Der größte Teil dieses Dokuments erfordert wenige oder gar keine Kenntnisse in der Programmierung, es werden trotzdem Basiswissen im Umgang mit UNIX(R) und die Bereitschaft zu lernen vorausgesetzt!
+
+[[tools-programming]]
+== Einführung in die Programmierung
+
+Ein Programm ist eine Zusammenstellung von Anweisungen, die den Computer auffordern verschiedenste Dinge zu tun. Dieser Abschnitt gibt ihnen einen Überblick über die beiden wesentlichen Methoden diese Anweisungen oder "Befehle", wie man diese Anweisungen üblicherweise nennt, zu geben. Die eine Methode nutzt einen _Interpreter_, die andere einen _Compiler_. Da menschliche Sprachen für einen Computer nicht unmissverständlich sind, werden diese Befehle in einer Sprache geschrieben die speziell für diesen Zweck gedacht ist.
+
+=== Interpreter
+
+Mit einem Interpreter ist die Sprache vielmehr eine Umgebung, in der Sie ein Kommando an der Kommandozeile eingeben welches dann von der Umgebung ausgeführt wird. Für kompliziertere Programme können Sie die Befehle in eine Datei schreiben und den Interpreter dazu bringen diese Datei zu laden und die enthaltenen Befehle auszuführen. Falls etwas schief geht werden viele Interpreter Sie an einen Debugger weiterleiten.
+
+Der Vorteil hierbei ist, das Sie das Ergebnis ihres Befehls direkt sehen und Fehler sofort korrigiert werden können. Der größte Nachteil bei dieser Methode entsteht, wenn Sie ihr Programm mit jemandem teilen wollen. Diese Person muss den selben Interpreter nutzen wie Sie es tun und Sie muss wissen wie dieser zu bedienen ist. Zudem werden Benutzer es nicht begrüßen sich in einem Debugger wiederzufinden, wenn Sie einmal die falsche Taste drücken! Bei einem Blick auf die Leistungsfähigkeit brauchen Interpreter oftmals viel Speicher und erzeugen den Code nicht so effizient wie Compiler.
+
+Meiner Meinung nach sind interpretierte Sprachen der beste Anfang, wenn Sie bisher noch nicht programmiert haben. Diese Art von Umgebung findet man typischerweise bei Sprachen wie Lisp, Smalltalk, Perl und Basic. Man könnte auch sagen, dass die UNIX(R) Shell (`sh`, `csh`) für sich bereits einen Interpreter darstellt und viele Leute schreiben tatsächlich Shell "Scripten" um sich bei einigen "Haushaltsaufgaben" auf ihren Maschinen helfen zu lassen. Tatsächlich war es ein wesentlicher Teil der originalen UNIX(R) Philosophie eine große Zahl an kleinen Hilfsprogrammen zur Verfügung zu stellen, welche mittels eines Shellskripts miteinander kombiniert werden um bestimmte Aufgaben zu übernehmen.
+
+=== Für FreeBSD verfügbare Interpreter
+
+Im folgenden eine Liste der über die FreeBSD Ports-Sammlung verfügbaren Interpreter einschließlich einer kurzen Erörterung der populären interpretierten Sprachen.
+
+Anleitungen wie man Anwendungen aus der Ports-Sammlung erhält und installiert können Sie dem Kapitel link:{handbook}#ports-using/[Benutzen der Ports-Sammlung] aus dem FreeBSD Handbuch entnehmen.
+
+BASIC::
+Kurz für Beginner's All-purpose Symbolic Instruction Code. Entwickelt in den 50er Jahren um Studenten in Programmierung zu unterrichten, wurde BASIC in den 80er Jahren mit jedem anständigen Personal Computer ausgeliefert und war für viele Programmierer die erste Programmiersprache. BASIC ist auch die Grundlage für Visual Basic.
++
+Der Bywater Basic Interpreter findet sich in der Ports-Sammlung unter package:lang/bwbasic[] und Phil Cockroft's Basic Interpreter (auch bekannt als Rabbit Basic) findet sich unter package:lang/pbasic[].
+
+Lisp::
+Diese Sprache wurde in den späten 50er Jahren als Alternative zu den, zu dieser Zeit populären, "zahlenverarbeitenden" Sprachen entwickelt. Anstelle auf Zahlen basiert Lisp auf Listen; tatsächlich ist der Name Lisp eine Kurzform für "List Processing" (Listen abarbeiten). Sehr populär fü AI (Artificial Intelligence/ künstliche Intelligez) (Fach-) Kreisen.
++
+Lisp ist eine extrem kraftvolle und durchdachte Sprache, kann aber auch recht groß und unhandlich sein.
++
+Zahlreiche Ausformungen von Lisp, die auf UNIX(R) Systemen laufen sind über die Ports-Sammlung verfügbar. GNU Common Lisp befindet sich in package:lang/gcl[]. CLISP von Bruno Haible und Michael Stoll ist in package:lang/clisp[] zu finden. Für CMUCL, welches auch einen hoch-optimierten Compiler enthält, oder einfachere Ausformungen wie SLisp, das die meisten gängigen Lisp Konstrukte in wenigen hundert Zeilen C Code enthält sind in package:lang/cmucl[] und package:lang/slisp[] ebenfalls enthalten.
+
+Perl::
+Unter Systemadministratoren zum Schreiben von Skripten sehr beliebt; wird häufig auch auf World Wide Web Servern verwendet, um CGI-Skripte zu schreiben.
++
+Perl ist in der Ports-Sammlung unter package:lang/perl5.8[] für alle FreeBSD-Versionen verfügbar, und wird im Basissystem von 4.x als `/usr/bin/perl` installiert.
+
+Scheme::
+Ein Dialekt von Lisp, der kompakter und sauberer als Common Lisp ist. Dieser Dialekt ist an Universitäten sehr beliebt, da er zum einen für den Unterricht im Grundstudium einfach genug ist, und zum anderen ein ausreichend hohes Abstraktionsniveau für den Einsatz in der Forschung bietet.
++
+Scheme ist in der Ports-Sammlung in Form des Elk Scheme Interpreters als package:lang/elk[] verfügbar. Den MIT Scheme Interpreter findet man unter package:lang/mit-scheme[], und den SCM Scheme Interpreter unter package:lang/scm[].
+
+Icon::
+Icon ist eine Hochsprache mit ausgereiften Möglichkeiten zur Verarbeitung von Zeichenketten und Strukturen. Die unter FreeBSD verfügbare Version von Icon steht in der Ports-Sammlung unter package:lang/icon[] zur Verfügung.
+
+Logo::
+Logo ist eine leicht zu erlernende Programmiersprache, welche in vielen Kursen als einführende Programmiersprache gewählt wird. Sie ist ein ideales Arbeitswerkzeug beim Unterricht mit jungen Menschen, da mit ihr die Erstellung komplizierter geometrischer Oberflächen selbst für kleine Kinder einfach ist.
++
+Die für FreeBSD aktuellste, verfügbare Version findet man in der Ports-Sammlung unter package:lang/logo[].
+
+Python::
+Python ist eine objektorientierte, interpretierte Programmiersprache. Die Verfechter von Python argumentieren, daß sie eine der besten Programmiersprachen für Programmieranfänger sei, da sie einfach zu erlernen ist, und anderen populären interpretierten Programmiersprachen, welche zur Entwicklung großer und komplexer Anwendungen verwendet werden, in nichts nachsteht (Perl und Tcl sind zwei solcher bekannten Programmiersprachen).
++
+Die aktuellste Version von Python ist in der Ports-Sammlung unter package:lang/python[] verfügbar.
+
+Ruby::
+Ruby ist eine interpretierte und rein objektorientierte Programmiersprache. Sie wurde wegen ihrer leicht verständlichen Syntax, ihrer Flexibilität und der Möglichkeit, große und komplexe Programme einfach zu entwickeln und zu pflegen, populär.
++
+Ruby ist in der Ports-Sammlung unter package:lang/ruby18[] verfügbar.
+
+Tcl und Tk::
+Tcl ist eine einbettbare, interpretierte Programmiersprache, welche aufgrund ihrer Portierbarkeit auf viele unterschiedliche Plattformen eine weite Verbreitung erfahren hat. Sie kann sowohl für die schnelle Entwicklung kleinerer Prototypen, als auch (in Verbindung mit Tk, einem GUI Toolkit) vollwertiger, ausgereifter Programme verwendet werden.
++
+Es sind mehrere Versionen von Tcl als Ports für FreeBSD verfügbar. Die aktuellste Version, Tcl 8.5, ist unter package:lang/tcl85[] verfügbar.
+
+=== Compiler
+
+Compiler sind eher anders. Zuerst schreibt man seinen Code unter Verwendung eines Editors in eine Datei (oder mehrere Dateien). Anschließend ruft man den Compiler auf um zu sehen, ob dieser das Programm annimmt. Wenn das Programm nicht kompiliert werden konnte, muß man die Zähne zusammenbeissen und wieder zum Editor zurückkehren; falls das Programm kompiliert und eine ausführbare Anwendung erzeugt wurde, kann man diese über eine Eingabeaufforderung oder über einen Debugger aufrufen um zu sehen, ob sie auch funktioniert.
+
+Offensichtlich ist diese Art der Programmierung nicht so direkt wie die Verwendung eines Interpreters. Jedoch sind auf diese Weise viele Dinge möglich, die mit einem Interpreter nur sehr schwer oder überhaupt nicht realisierbar wären, wie z.B. das Schreiben von Code, der sehr eng mit dem Betriebsystem zusammen arbeitet-oder das Schreiben eines eigenen Betriebsystems selbst! Des weiteren ist so das Erzeugen von sehr effizientem Code möglich, da sich der Compiler für die Optimierung Zeit nehmen kann, was bei einem Interpreter inakzeptabel wäre. Ferner ist das Verbreiten von Programmen, welche für einen Compiler geschrieben wurden, einfacher als welche, die für einen Interpreter geschrieben wurden-man muss in ersterem Fall nur die ausführbare Datei verbreiten, vorausgesetzt, daß das gleiche Betriebssystem verwendet wird.
+
+Programmiersprachen, die kompiliert werden, sind unter anderem Pascal, C und C++. C und C++ sind eher unbarmherzige Programmiersprachen und daher eher für erfahrene Programmierer gedacht; Pascal auf der anderen Seite wurde zu Ausbildungszwecken entworfen, und stellt daher eine einsteigerfreundliche Programmiersprache dar. FreeBSD beinhaltet im Basissystem keine Unterstützung für Pascal, stellt jedoch über die Ports-Sammlung den Free Pascal Compiler unter package:lang/fpc[] zur Verfügung.
+
+Da der editier-kompilier-ausführ-debug-Kreislauf unter Verwendung mehrerer Programme eher mühsam ist haben viele Hersteller von Compilern integrierte Entwicklungsumgebungen (Integrated Development Environment; auch kurz IDE) entwickelt. FreeBSD bietet zwar im Basissystem keine IDE an, stellt jedoch über die Ports-Sammlung IDEs wie package:devel/kdevelop[] oder Emacs zur Verfügung, wobei letztere weit verbreitet ist. Die Verwendung von Emacs als IDE wird unter <<emacs>> diskutiert.
+
+[[tools-compiling]]
+== Kompilieren mit dem `cc`
+
+Dieser Abschnitt behandelt ausschließlich den GNU Compiler für C und C++, da dieser bereits im Basissystem von FreeBSD enthalten ist. Er kann mittels ``cc`` oder `gcc` aufgerufen werden. Die Details zur Erstellung einer Anwendung mit einem Interpreter variieren zwischen verschiedenen Interpretern mehr oder weniger stark, und werden meist ausführlich in der zugehörigen Dokumentation oder Online-Hilfe beschrieben.
+
+Sobald Sie Ihr Meisterwerk fertig geschrieben haben besteht der nächste Schritt darin, dieses (hoffentlich!) unter FreeBSD zum Laufen zu bekommen. Dies beinhaltet üblicherweise mehrere Schritte, wobei jeder einzelne Schritt von einem separaten Programm durchgeführt wird.
+
+[.procedure]
+====
+. Aufbereiten Ihres Quelltextes durch Entfernen von Kommentaren, sowie weiteren Tricks wie das Ersetzen von Macros in C.
+. Überprüfen der Syntax Ihres Quelltextes, um die Einhaltung der Sprachregeln sicherzustellen. Wenn Sie diese verletzt haben werden entsprechende Fehlermeldungen Ihnen dies mitteilen!
+. Übersetzen des Quelltextes in Assemblersprache -diese ist dem eigentlichen Maschinencode schon sehr nahe, jedoch immer noch für Menschen lesbar. Angeblich.
+. Übersetzen der Assemblersprache in Maschinencode-genau, wir sprechen hier von Bits und Bytes, Einsen und Nullen.
+. Überprüfen, ob Sie Dinge wie Funktionen und globale Variablen in einheitlicher Weise verwendet haben. Wenn Sie z.B. eine nicht existierende Funktion aufgerufen haben, wird eine entsprechende Fehlermeldung Ihnen dies mitteilen.
+. Wenn aus mehreren Quelltextdateien eine ausführbare Datei erstellt werden soll wird herausgefunden, wie die einzelnen Codeteile zusammengefügt werden müssen.
+. Ausarbeiten, wie das Programm aussehen muss, damit der Lader zur Laufzeit des Systems dieses in den Speicher laden und ausführen kann.
+. Endgültiges Schreiben der ausführbaren Datei in das Dateisystem.
+====
+
+Das Wort _kompilieren_ wird häufig für die Schritte 1 bis 4 verwendet-die anderen werden mit dem Wort _verlinken_ zusammengefasst. Manchmal wird Schritt 1 auch als _Pre-Processing_ und die Schritte 3-4 als _assemblieren_ bezeichnet.
+
+Glücklicherweise werden alle diese Details vor Ihnen verborgen, da `cc` ein Frontend ist, welches sich um die Ausführung all dieser Programme mit den richtigen Argumenten für Sie kümmert; einfaches eingeben von
+
+[source,bash]
+....
+% cc foobar.c
+....
+
+führt zur Übersetzung von [.filename]#foobar.c# durch alle bereits erwähnten Schritte. Wenn Sie mehr als eine Datei übersetzen wollen müssen Sie etwas wie folgt eingeben
+
+[source,bash]
+....
+% cc foo.c bar.c
+....
+
+Beachten Sie, daß die Überprüfung der Syntax genau dies tut-das reine Überprüfen der Syntax. Es findet keine Überprüfung bzgl. logischer Fehler statt, die Sie vielleicht gemacht haben, wie z.B. das Programm in eine Endlosschleife zu versetzen, oder Bubble Sort zu verwenden, wenn Sie eigentlich Binary Sort benutzen wollten.
+
+Es gibt haufenweise Optionen für `cc`, die alle in der zugehörigen Manualpage beschrieben werden. Im Folgenden werden ein paar der wichtigsten Optionen mit Beispielen ihrer Anwendung gezeigt.
+
+`-o _filename_`::
+Die Name der Ausgabedatei. Wenn Sie diese Option nicht verwenden erstellt `cc` eine Datei mit dem Namen [.filename]#a.out#.
++
+[source,bash]
+....
+% cc foobar.c executable is a.out
+% cc -o foobar foobar.c executable is foobar
+....
+
+`-c`::
+Dies kompiliert die Datei nur, verlinkt sie jedoch nicht. Nützlich für Spielereien, um die Syntax auf Korrektheit zu überprüfen, oder falls Sie ein [.filename]#Makefile# verwenden.
++
+[source,bash]
+....
+% cc -c foobar.c
+....
++
+Dieser Befehl erzeugt eine _Objektdatei_ (nicht ausführbar) mit den Namen [.filename]#foobar.o#. Diese kann mit anderen Objektdateien zusammen zu einer ausführbaren Datei verlinkt werden.
+
+`-g`::
+Diese Option erzeugt die Debug-Version einer ausführbaren Datei. Dabei fügt der Compiler zusätzliche Informationen darüber, welcher Funktionsaufruf zu welcher Zeile im Quelltext gehört, der ausführbaren Datei hinzu. Ein Debugger kann Ihnen mit Hilfe dieser Information den zugehörigen Quelltext anzeigen, während Sie den Programmverlauf schrittweise verfolgen, was _sehr_ hilfreich sein kann; der Nachteil dabei ist, daß durch die zusätzlichen Informationen das Programm viel größer wird. Normalerweise verwendet man die Option `-g` während der Entwicklung eines Programms, und für die "Release-Version", wenn man von der Korrektheit des Programms überzeugt ist, kompiliert man das Programm dann ohne diese Option.
++
+[source,bash]
+....
+% cc -g foobar.c
+....
++
+Mit diesem Befehl wird eine Debug-Version des Programms erzeugt.
+
+`-O`::
+Diese Option erzeugt eine optimierte Version der ausführbaren Datei. Der Compiler verwendet einige clevere Tricks, um das erzeugte Programm schneller zu machen. Sie können hinter der Option `-O` eine Zahl angeben, um eine höheres Level der Optimierung festzulegen. Dadurch wird jedoch häufig eine fehlerhafte Optimierung seitens des Compilers aufgedeckt. Zum Beispiel erzeugte die Version des `cc`, welche mit dem FreeBSD Release 2.1.0 mitgeliefert wurde, bei Verwendung der Option `-O2` unter bestimmten Umständen falschen Code.
++
+Optimierungen werden normalerweise nur beim Kompilieren von Release-Versionen aktiviert.
++
+[source,bash]
+....
+% cc -O -o foobar foobar.c
+....
++
+Durch diesen Befehl wird eine optimierte Version von [.filename]#foobar# erzeugt.
+
+Die folgenden drei Flags zwingen den `cc` dazu, Ihren Code auf die Einhaltung der internationalen Standards hin zu überprüfen, welche häufig als ANSI Standards bezeichnet werden, obwohl sie streng genommen zum ISO Standard gehören.
+
+`-Wall`::
+Aktivieren aller Warnmeldungen, die die Autoren des `cc` für wichtig halten. Trotz des Namens dieser Option werden dadurch nicht sämtliche Warnungen ausgegeben, die der `cc` ausgeben könnte.
+
+`-ansi`::
+Deaktivieren der meisten, jedoch nicht aller, nicht-ANSI C Eigenschaften, die der `cc` bietet. Trotz des Namens ist durch diese Option nicht sichergestellt, daß Ihr Code diese Standards auch vollständig einhält.
+
+`-pedantic`::
+Deaktivieren _aller_ Eigenschaften des `cc`, welche nicht konform zu ANSI C sind.
+
+Ohne diese Flags wird Ihnen der `cc` die Verwendung eigener Erweiterungen des Standards erlauben. Einige dieser Erweiterungen sind zwar sehr nützlich, werden jedoch nicht von anderen Compilern unterstützt-eigentlich ist eines der Hauptziele des Standards, das Leute Code so schreiben können, daß dieser mit jedem Compiler auf beliebigen Systemen funktioniert. Dies wird häufig als _portabler Code_ bezeichnet.
+
+Im Allgemeinen sollten Sie versuchen, Ihren Code so portabel wie möglich zu schreiben, da Sie ansonsten eventuell das gesamte Programm noch einmal neu schreiben müssen, falls dieser in einer anderen Umgebung laufen soll-und wer weiß schon was er in ein paar Jahren verwenden wird?
+
+[source,bash]
+....
+% cc -Wall -ansi -pedantic -o foobar foobar.c
+....
+
+Durch diesen Befehl wird eine ausführbare Datei namens [.filename]#foobar# erzeugt, nachdem [.filename]#foobar.c# auf die Einhaltung der Standards überprüft wurde.
+
+`-l _library_`::
+Mit dieser Option kann eine Bibliothek mit Funktionen angegeben werden, die während des Verlinkens verwendet wird.
++
+Das am häufigsten auftretende Beispiel dieser Option ist die Übersetzung eines Programmes, welches einige der mathematischen Funktionen in C verwendet. Im Gegensatz zu den meisten anderen Plattformen befinden sich diese Funktionen in einer separaten Bibliothek, deren Verwendung Sie dem Compiler explizit mitteilen müssen.
++
+Angenommen eine Bibliothek heißt [.filename]#libirgendwas.a#, dann müssen Sie dem `cc` als Argument `-l _irgendwas_` übergeben. Zum Beispiel heißt die Mathematik-Bibliothek [.filename]#libm.a#, und daher müssen Sie dem `cc` als Argument `-lm` übergeben. Ein typisches "Manko" der Mathematik-Bibliothek ist, daß diese immer die letzte Bibliothek auf der Kommandozeile sein muß.
++
+[source,bash]
+....
+% cc -o foobar foobar.c -lm
+....
++
+Durch diesen Befehl werden die Funktionen aus der Mathematik-Bibliothek in [.filename]#foobar# gelinkt.
++
+Wenn Sie {c-plus-plus-command} -Code kompilieren wollen, müssen Sie {lg-plus-plus}, bzw. {lstdc-plus-plus} falls Sie FreeBSD 2.2 oder neuer verwenden, zu Ihrer Kommandozeile hinzufügen, um Ihr Programm gegen die Funktionen der C++ Bibliothek zu linken. Alternativ können Sie anstatt cc auch {c-plus-plus-command} aufrufen, welcher dies für Sie erledigt. C++ kann unter FreeBSD auch als {gcc-plus-plus} aufgerufen werden.
++
+[source,bash]
+....
+% cc -o foobar foobar.cc -lg++ Bei FreeBSD 2.1.6 oder älter
+% cc -o foobar foobar.cc -lstdc++ Bei FreeBSD 2.2 und neuer
+% c++ -o foobar foobar.cc
+....
++
+Beide Varianten erzeugen eine ausführbare [.filename]##foobar## aus der {c-plus-plus-command} Quelltextdatei [.filename]##foobar.cc##. Beachten Sie bitte, daß auf UNIX(R) Systemen {c-plus-plus-command} Quelltextdateien üblicherweise auf [.filename]##.C##, [.filename]##.cxx## oder [.filename]##.cc## enden, und nicht wie bei MS-DOS(R) auf [.filename]##.cpp## (welche schon anderweitig benutzt wurde). Der `gcc` hat normalerweise anhand dieser Information entschieden, welcher Compiler für die Quelltextdatei zum Einsatz kommen soll; allerdings gilt diese Einschränkung jetzt nicht mehr, und Sie können Ihre {c-plus-plus-command}-Dateien ungestraft auf [.filename]##.cpp## enden lassen!
+
+=== Häufig auftretende `cc`-Fragen und -Probleme
+
+==== Ich versuche ein Programm zu schreiben, welches die Funktion sin() verwendet, erhalte jedoch eine Fehlermeldung. Was bedeutet diese?
+
+Wenn Sie mathematische Funktionen wie `sin()` verwenden wollen, müssen Sie den `cc` anweisen, die Mathematik-Bibliothek wie folgt zu verlinken:
+
+[source,bash]
+....
+% cc -o foobar foobar.c -lm
+....
+
+==== So, ich habe jetzt dieses einfache Programm als Übung für -lm geschrieben. Alles was es macht ist, 2.1 hoch 6 zu berechnen.
+
+Wenn der Compiler Ihren Funktionsaufruf sieht, überprüft er, ob er schon einmal einen Prototypen für diese gesehen hat. Wenn nicht nimmt er als Rückgabewert den Typ [type]#int# an, was sicherlich nicht das ist, was Sie an dieser Stelle wollen.
+
+==== Wie kann ich das korrigieren?
+
+Die Prototypen der mathematischen Funktionen befinden sich in der Datei [.filename]#math.h#. Wenn Sie diese Datei in Ihrem Quelltext includen ist der Compiler in der Lage, den Prototypen zu finden, und wird aufhören, seltsame Dinge mit Ihrer Berechnung zu machen!
+
+[.programlisting]
+....
+#include <math.h>
+#include <stdio.h>
+
+int main() {
+...
+....
+
+Nach erneutem Compilieren sollte das Folgende bei der Ausführung ausgegeben werden:
+
+[source,bash]
+....
+% ./a.out
+2.1 ^ 6 = 85.766121
+....
+
+Wenn Sie irgendwelche mathematischen Funktionen verwenden sollten Sie _immer_ die Datei [.filename]#math.h# includen und nicht vergessen, Ihr Programm gegen die Mathematik-Bibliothek zu verlinken.
+
+==== Ich habe eine Datei mit dem Namen foobar.c kompiliert, kann jedoch nirgends eine ausführbare Datei namens foobar finden. Wo befindet sich diese?
+
+Denken Sie daran, daß der `cc` die ausführbare Datei [.filename]#a.out# nennt, wenn Sie nicht explizit einen Namen angeben. Verwenden Sie in solch einem Fall die Option `-o _filename_`:
+
+[source,bash]
+....
+% cc -o foobar foobar.c
+....
+
+==== OK, ich habe eine ausführbare Datei namens foobar, ich kann sie sehen, wenn ich ls aufrufe. Gebe ich jedoch foobar in die Kommandozeile ein wird mir gesagt, daß eine Datei mit diesem Namen nicht existiert. Warum kann die Datei nicht gefunden werden?
+
+Im Gegensatz zu MS-DOS(R) sucht UNIX(R) nicht im aktuellen Verzeichnis nach einem ausführbaren Programm, das Sie versuchen auszuführen, solange Sie dies nicht explizit mit angeben. Sie können entweder `./foobar` eingeben, was soviel bedeutet wie "führe eine Datei namens [.filename]#foobar# im aktuellen Verzeichnis aus", oder Sie können Ihre Umgebungsvariable `PATH` so erweitern, daß sie ähnlich wie folgt aussieht
+
+[source,bash]
+....
+bin:/usr/bin:/usr/local/bin:.
+....
+
+Der Punkt am Ende bedeutet "siehe im aktuellen Verzeichnis nach, wenn es in keinem der anderen zu finden war".
+
+==== Ich habe meine ausführbare Datei test genannt, allerdings passiert nichts wenn ich diese aufrufe. Was ist hier los?
+
+Bei den meisten UNIX(R)-Systeme existiert bereits ein Programm mit dem Namen `test` im Verzeichnis [.filename]#/usr/bin#, und die Shell nimmt dieses, bevor sie im aktuellen Verzeichnis nachsieht. Sie können entweder den folgenden Befehl eingeben:
+
+[source,bash]
+....
+% ./test
+....
+
+oder Sie können einen geeigneteren Namen für Ihr Programm wählen!
+
+==== Ich habe mein Programm kompiliert und bei dessen Aufruf sah zuerst alles gut aus. Jedoch gab es dann eine Fehlermeldung, welche irgendetwas mit core dumped lautete. Was bedeutet das?
+
+Der Name _core dump_ stammt noch aus sehr frühen Zeiten von UNIX(R), als die Maschinen noch Kernspeicher zum Speichern von Daten verwendeten. Einfach ausgedrückt, wenn bei einem Programm unter bestimmen Bedingungen ein Fehler auftrat, hat das System den Inhalt des Kernspeichers auf der Festplatte in eine Datei namens [.filename]#core# geschrieben, welche der Programmierer dann näher untersuchen konnte, um die Ursache des Fehlers herauszufinden.
+
+==== Faszinierendes Zeugs, aber was soll ich jetzt machen?
+
+Verwenden Sie den `gdb`, um das Speicherabbild zu untersuchen (siehe <<debugging>>).
+
+==== Als mein Programm den core dump erzeugt hat, sagte es etwas von einem segmentation fault. Was ist das?
+
+Diese Meldung heißt im Prinzip, daß Ihr Programm eine illegale Operation mit dem Speicher durchführen wollte; UNIX(R) wurde so entworfen, daß es das andere Programme und das Betriebssystem selbst vor wildgewordenen Programmen schützt.
+
+Häufige Ursachen hierfür sind:
+
+* Der Versuch, einen NULL-Zeiger zu beschreiben, z.B.
++
+[.programlisting]
+....
+char *foo = NULL;
+strcpy(foo, "bang!");
+....
++
+* Einen Zeiger zu verwenden, welcher noch nicht initialisiert wurde, z.B.
++
+[.programlisting]
+....
+char *foo;
+strcpy(foo, "bang!");
+....
++
+Der Zeiger hat einen zufälligen Wert, welcher mit etwas Glück in einen Bereich des Speichers zeigt, der für Ihr Programm nicht verfügbar ist, und der Kernel bricht Ihr Programm ab, bevor es irgendwelchen Schaden anrichten kann. Wenn Sie Pech haben zeigt der Zeiger irgendwo mitten in Ihr eigenes Programm, und verändert dort ihre eigenen Datenstrukturen, was zu sehr seltsamen Fehlern Ihres Programmes führt.
+* Der Versuch, auf Daten außerhalb eines Arrays zuzugreifen, z.B.
++
+[.programlisting]
+....
+int bar[20];
+bar[27] = 6;
+....
++
+* Der Versuch, Daten in eine Speicherbereich zu schreiben, der nur lesbar ist, z.B.
++
+[.programlisting]
+....
+char *foo = "My string";
+strcpy(foo, "bang!");
+....
++
+UNIX(R)-Compiler speichern häufig feste Zeichenketten wie `"My string"` in nur lesbaren Speicherbereichen ab.
+* Wenn man unerlaubte Operationen mit `malloc()` und `free()` ausführt, z.B.
++
+[.programlisting]
+....
+char bar[80];
+free(bar);
+....
++
+oder
++
+[.programlisting]
+....
+char *foo = malloc(27);
+free(foo);
+free(foo);
+....
+
+Einzelne solcher Fehler führen zwar nicht immer zu einem Fehlverhalten des Programms, stellen jedoch immer eine falsche Verwendung dar. Manche Systeme und Compiler sind toleranter als andere, weshalb Programme auf dem einen System einwandfrei laufen, auf dem anderen System jedoch abstürzen.
+
+==== Wenn ich einen core dump erhalte erscheint manchmal die Meldung bus error. In meinem UNIX(R)-Buch steht, daß die Ursache ein Hardwareproblem sei. Der Computer scheint aber weiterhin zu funktionieren. Ist dies wahr?
+
+Nein, glücklicherweise nicht (es sei denn Sie haben wirklich ein Hardwareproblem...). Üblicherweise ist dies ein Weg Ihnen mitzuteilen, daß Sie auf Speicher in einer Weise zugegriffen haben, in der Sie dies nicht tun sollten.
+
+==== Diese Sache mit den core dumps hört sich sehr nützlich an, wenn ich so etwas selber an beliebiger Stelle bewirken könnte. Kann ich das tun, oder muß ich warten bis ein Fehler auftritt?
+
+Ja, nehmen sie einfach eine andere Konsole oder XTerm und führen Sie
+
+[source,bash]
+....
+% ps
+....
+
+aus, um die Prozess-ID Ihres Programms herauszufinden. Führen Sie anschließend
+
+[source,bash]
+....
+% kill -ABRT pid
+....
+
+aus, wobei [parameter]#_pid_# die Prozess-ID ist, die Sie vorher ermittelt haben.
+
+Dies ist nützlich, wenn sich Ihr Programm z.B. in einer Endlosschleife verfangen hat. Sollte Ihr Programm das Signal SIGABRT abfangen, gibt es noch andere Möglichkeiten, die denselben Effekt haben.
+
+Alternativ können Sie einen core dump aus Ihrem Programm heraus erstellen, indem Sie die Funktion `abort()` aufrufen. Weitere Informationen darüber können Sie in der Manualpage man:abort[3] nachlesen.
+
+Wenn Sie einen core dump von außerhalb Ihres Programms erzeugen wollen, ohne dabei den Prozess abzubrechen, können Sie das Programm `gcore` verwenden. Weitere Informationen dazu finden Sie in der zugehörigen Manualpage man:gcore[1].
+
+[[tools-make]]
+== Make
+
+=== Was ist `make`?
+
+Wenn Sie an einem einfachen Programm mit nur einer oder zwei Quelltextdateien arbeiten, ist die Eingabe von
+
+[source,bash]
+....
+% cc file1.c file2.c
+....
+
+zwar nicht aufwendig, wird aber mit zunehmender Anzahl der Quelltextdateien sehr lästig-und auch das Kompilieren kann eine Weile dauern.
+
+Eine Möglichkeit dies zu umgehen besteht in der Verwendung von Objektdateien, wobei man nur die Quelltextdateien neu kompiliert, die verändert wurden. So könnten wir etwa folgendes erhalten:
+
+[source,bash]
+....
+% cc file1.o file2.o … file37.c …
+....
+
+falls wir seit dem letzten Kompiliervorgang nur die Datei [.filename]#file37.c# verändert haben. Dadurch könnte der Kompiliervorgang um einiges beschleunigt werden, es muß jedoch immer noch alles von Hand eingegeben werden.
+
+Oder wir könnten uns ein Shell Skript schreiben. Dieses würde jedoch alles immer wieder neu kompilieren, was bei einem großen Projekt sehr ineffizient wäre.
+
+Was ist, wenn wir hunderte von Quelltextdateien hätten? Was ist, wenn wir in einem Team mit anderen Leuten arbeiten würden, die vergessen uns Bescheid zu sagen, falls sie eine der Quelltextdateien verändert haben, die wir ebenfalls benutzen?
+
+Vielleicht könnten wir beide Lösungen kombinieren und etwas wie ein Shell Skript schreiben, welches eine Art magische Regel enthalten würde, die feststellt, welche Quelltextdateien neu kompiliert werden müssten. Alles was wir bräuchten wäre ein Programm, das diese Regeln verstehen könnte, da diese Aufgabe etwas zu kompliziert für eine Shell ist.
+
+Dieses Programm heißt `make`. Es liest eine Datei namens _makefile_, welche ihm sagt, wie unterschiedliche Dateien voneinander abhängen, und berechnet, welche Dateien neu kompiliert werden müssen und welche nicht. Zum Beispiel könnte eine Regel etwas sagen wie "wenn [.filename]#fromboz.o# älter als [.filename]#fromboz.c# ist, bedeutet dies, daß jemand die Datei [.filename]#fromboz.c# verändert haben muß, und diese daher neu kompiliert werden muß." Das makefile enthält außerdem Regeln die make sagen, _wie_ die Quelltextdatei neu kompiliert werden muß, was dieses Tool noch sehr viel mächtiger macht.
+
+Makefiles werden normalerweise im selben Verzeichnis wie die Quelltextdateien abgelegt, zu denen sie gehören, und kann [.filename]#makefile#, [.filename]#Makefile# oder [.filename]#MAKEFILE# heißen. Die meisten Programmierer verwenden den Namen [.filename]#Makefile#, da diese Schreibweise dafür sorgt, daß die Datei gut lesbar ganz oben in der Verzeichnisliste aufgeführt wird.
+
+=== Beispielhafte Verwendung von `make`
+
+Hier ist eine sehr einfache make Datei:
+
+[.programlisting]
+....
+foo: foo.c
+ cc -o foo foo.c
+....
+
+Sie besteht aus zwei Zeilen, einer Abhängigkeitszeile und einer Erzeugungszeile.
+
+Die Abhängigkeitszeile hier besteht aus dem Namen des Programms (auch _Ziel_ genannt), gefolgt von einem Doppelpunkt und einem Leerzeichen, und anschließend dem Namen der Quelltextdatei. Wenn `make` diese Zeile liest überprüft es die Existenz von [.filename]#foo#; falls diese Datei existiert vergleicht es das Datum der letzten Änderung von [.filename]#foo# mit der von [.filename]#foo.c#. Falls [.filename]#foo# nicht existiert, oder älter als [.filename]#foo.c# ist, liest es die Erzeugungszeile um herauszufinden, was zu tun ist. Mit anderen Worten, dies ist die Regel die festlegt, wann [.filename]#foo.c# neu kompiliert werden muß.
+
+Die Erzeugungszeile beginnt mit einem tab (drücken Sie dazu die kbd:[tab]-Taste) gefolgt von dem Befehl, mit dem Sie [.filename]#foo# manuell erzeugen würden. Wenn [.filename]#foo# veraltet ist, oder nicht existiert, führt `make` diesen Befehl aus, um die Datei zu erzeugen. Mit anderen Worten, dies ist die Regel die make sagt, wie [.filename]#foo.c# kompiliert werden muß.
+
+Wenn Sie also `make` eingeben wird dieses sicherstellen, daß [.filename]#foo# bzgl. Ihrer letzten Änderungen an [.filename]#foo.c# auf dem neuesten Stand ist. Dieses Prinzip kann auf [.filename]##Makefile##s mit hunderten von Zielen-es ist bei FreeBSD praktisch möglich, das gesamte Betriebssystem zu kompilieren, indem man nur `make world` im richtigen Verzeichnis eingibt!
+
+Eine weitere nützliche Eigenschaft der makefiles ist, daß die Ziele keine Programme sein müssen. Wir könnten zum Beispiel eine make Datei haben, die wie folgt aussieht:
+
+[.programlisting]
+....
+foo: foo.c
+ cc -o foo foo.c
+
+install:
+ cp foo /home/me
+....
+
+Wir können make sagen welches Ziel wir erzeugt haben wollen, indem wir etwas wie folgt eingeben:
+
+[source,bash]
+....
+% make target
+....
+
+`make` wird dann nur dieses Ziel beachten und alle anderen ignorieren. Wenn wir zum Beispiel `make foo` mit dem obigen makefile eingeben, dann wird make das Ziel `install` ignorieren.
+
+Wenn wir nur `make` eingeben wird make immer nur nach dem ersten Ziel suchen und danach mit dem Suchen aufhören. Wenn wir hier also nur `make` eingegeben hätten, würde es nur zu dem Ziel `foo` gehen, gegebenenfalls [.filename]#foo# neu kompilieren, und danach einfach aufhören, ohne das Ziel `install` zu beachten.
+
+Beachten Sie, daß das `install`-Ziel von nichts anderem abhängt! Dies bedeutet, daß der Befehl in der nachfolgenden Zeile immer ausgeführt wird, wenn wir dieses Ziel mittels `make install` aufrufen. In diesem Fall wird die Datei [.filename]#foo# in das Heimatverzeichnis des Benutzers kopiert. Diese Vorgehensweise wird häufig bei makefiles von Anwendungen benutzt, damit die Anwendung nach erfolgreicher Kompilierung in das richtige Verzeichnis installiert werden kann.
+
+Dieser Teil ist etwas schwierig zu erklären. Wenn Sie immer noch nicht so richtig verstanden haben, wie `make` funktioniert, wäre es das Beste, sie erstellen sich selber ein einfaches Programm wie "hello world" und eine make Datei wie die weiter oben angegebene, und experimentieren damit selber ein bißchen herum. Als nächstes könnten Sie mehrere Quelltextdateien verwenden, oder in Ihrer Quelltextdatei eine Header-Datei includen. Der Befehl `touch` ist an dieser Stelle ganz hilfreich-er verändert das Datum einer Datei, ohne das Sie diese extra editieren müssen.
+
+=== Make und include-Dateien
+
+C-Code beginnt häufig mit einer Liste von Dateien, die included werden sollen, zum Beispiel stdio.h. Manche dieser Dateien sind include-Dateien des Systems, andere gehören zum aktuellen Projekt, an dem Sie gerade arbeiten:
+
+[.programlisting]
+....
+#include <stdio.h>
+#include "foo.h"
+
+int main(....
+....
+
+Um sicherzustellen, daß diese Datei neu kompiliert wird, wenn [.filename]#foo.h# verändert wurde, müssen Sie diese Datei Ihrem [.filename]#Makefile# hinzufügen:
+
+[.programlisting]
+....
+foo: foo.c foo.h
+....
+
+Sobald Ihr Projekt größer wird und Sie mehr und mehr eigene include-Dateien verwalten müssen wird es nur noch sehr schwer möglich sein, die Übersicht über alle include-Dateien und Dateien, die von diesen abhängen, beizubehalten. Falls Sie eine include-Datei verändern, jedoch das erneute Kompilieren aller Dateien, die von dieser Datei abhängen, vergessen, werden die Folgen verheerend sein. Der `gcc` besitzt eine Option, bei der er Ihre Dateien analysiert und eine Liste aller include-Dateien und deren Abhängigkeiten erstellt: `-MM`.
+
+Wenn Sie das Folgende zu Ihrem Makefile hinzufügen:
+
+[.programlisting]
+....
+depend:
+ gcc -E -MM *.c > .depend
+....
+
+und `make depend` ausführen, wird die Datei [.filename]#.depend# mit einer Liste von Objekt-Dateien, C-Dateien und den include-Dateien auftauchen:
+
+[.programlisting]
+....
+foo.o: foo.c foo.h
+....
+
+Falls Sie [.filename]#foo.h# verändern werden beim nächsten Aufruf von `make` alle Dateien, die von [.filename]#foo.h# abhängen, neu kompiliert.
+
+Vergessen Sie nicht jedes mal `make depend` aufzurufen, wenn Sie eine include-Datei zu einer Ihrer Dateien hinzugefügt haben.
+
+=== FreeBSD Makefiles
+
+Makefiles können eher schwierig zu schreiben sein. Glücklicherweise kommen BSD-basierende Systeme wie FreeBSD mit einigen sehr mächtigen solcher Dateien als Teil des Systems daher. Ein sehr gutes Beispiel dafür ist das FreeBSD Portssystem. Hier ist der grundlegende Teil eines typischen [.filename]##Makefile##s des Portssystems:
+
+[.programlisting]
+....
+MASTER_SITES= ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/
+DISTFILES= scheme-microcode+dist-7.3-freebsd.tgz
+
+.include <bsd.port.mk>
+....
+
+Wenn wir jetzt in das Verzeichnis dieses Ports wechseln und `make` aufrufen, passiert das Folgende:
+
+[.procedure]
+====
+. Es wird überprüft, ob sich der Quelltext für diesen Port bereits auf Ihrem System befindet.
+. Falls dies nicht der Fall ist wird eine FTP-Verbindung zu der URL in MASTER_SITES aufgebaut und der Quelltext heruntergeladen.
+. Die Checksumme für den Quelltext wird berechnet und mit der schon bekannten und für sicher und gut empfundenen verglichen. Damit wird sichergestellt, daß der Quelltext bei der Übertragung nicht beschädigt wurde.
+. Sämtliche Anpassungen, die nötig sind, damit der Quelltext unter FreeBSD funktioniert, werden vorgenommen-dieser Vorgang wird auch _patchen_ genannt.
+. Alle speziellen Konfigurationen, die am Quelltext nötig sind, werden vorgenommen. (Viele UNIX(R) Programmdistributionen versuchen herauszufinden, auf welcher UNIX(R)-Version sie kompiliert werden sollen und welche optionalen UNIX(R)-Features vorhanden sind-an dieser Stelle erhalten sie die Informationen im FreeBSD Ports Szenario).
+. Der Quelltext für das Programm wird kompiliert. Im Endeffekt wechseln wir in das Verzeichnis, in das der Quelltext entpackt wurde, und rufen `make` auf-die eigene make-Datei des Programms besitzt die nötigen Informationen um dieses zu bauen.
+. Wir haben jetzt eine kompilierte Version des Programmes. Wenn wir wollen können wir dieses jetzt testen; wenn wir überzeugt vom Programm sind, können wir `make install` eingeben. Dadurch werden das Programm sowie alle zugehörigen Dateien an die richtige Stelle kopiert; es wird auch ein Eintrag in der `Paketdatenbank` erzeugt, sodaß der Port sehr einfach wieder deinstalliert werden kann, falls wir unsere Meinung über dieses geändert haben.
+====
+
+Ich glaube jetzt werden Sie mit mir übereinstimmen, daß dies ziemlich eindrucksvoll für ein Skript mit vier Zeilen ist!
+
+Das Geheimnis liegt in der letzten Zeile, die `make` anweist, in das makefile des Systems mit dem Namen [.filename]#bsd.port.mk# zu sehen. Man kann diese Zeile zwar leicht übersehen, aber hierher kommt all das klevere Zeugs-jemand hat ein makefile geschrieben, welches `make` anweist, alle weiter oben beschriebenen Schritte durchzuführen (neben vielen weiteren Dingen, die ich nicht angesprochen habe, einschließlich der Behandlung sämtlicher Fehler, die auftreten könnten) und jeder kann darauf zurückgreifen, indem er eine einzige Zeile in seine eigene make-Datei einfügt!
+
+Falls Sie einen Blick in die makefiles des Systems werfen möchten, finden Sie diese in [.filename]#/usr/shared/mk#. Es ist aber wahrscheinlich besser, wenn Sie damit noch warten, bis Sie ein bißchen mehr Praxiserfahrung mit makefiles gesammelt haben, da die dortigen makefiles sehr kompliziert sind (und wenn Sie sich diese ansehen sollten Sie besser eine Kanne starken Kaffee griffbereit haben!)
+
+=== Fortgeschrittene Verwendung von `make`
+
+`Make` ist ein sehr mächtiges Werkzeug und kann noch sehr viel mehr als die gezeigten einfachen Beispiele weiter oben. Bedauerlicherweise gibt es mehrere verschiedene Versionen von `make`, und sie alle unterscheiden sich beträchtlich voneinander. Der beste Weg herauszufinden was sie können ist wahrscheinlich deren Dokumentation zu lesen-hoffentlich hat diese Einführung Ihnen genügend Grundkenntnisse vermitteln können, damit Sie dies tun können.
+
+Die Version von make, die in FreeBSD enthalten ist, ist Berkeley make; es gibt eine Anleitung dazu in [.filename]#/usr/shared/doc/psd/12.make#. Um sich diese anzusehen, müssen Sie
+
+[source,bash]
+....
+% zmore paper.ascii.gz
+....
+
+in diesem Verzeichnis ausführen.
+
+Viele Anwendungen in den Ports verwenden GNU make, welches einen sehr guten Satz an "info"-Seiten mitbringt. Falls Sie irgendeinen dieser Ports installiert haben wurde GNU make automatisch als `gmake` mit installiert. Es ist auch als eigenständiger Port und Paket verfügbar.
+
+Um sich die Info-Seiten für GNU make anzusehen müssen Sie die Datei [.filename]#dir# in [.filename]#/usr/local/info# um einen entsprechenden Eintrag erweitern. Dies beinhaltet das Einfügen einer Zeile wie
+
+[.programlisting]
+....
+ * Make: (make). The GNU Make utility.
+....
+
+in die Datei. Nachdem Sie dies getan haben können Sie `info` eingeben und dann den Menüeintrag [.guimenuitem]#make# auswählen (oder Sie können in Emacs die Tastenkombination `C-h i` verwenden).
+
+[[debugging]]
+== Debuggen
+
+=== Der Debugger
+
+Der Debugger bei FreeBSD heißt `gdb` (GNU debugger). Sie können Ihn durch die Eingabe von
+
+[source,bash]
+....
+% gdb progname
+....
+
+starten, wobei viele Leute ihn vorzugsweise innerhalb von Emacs aufrufen. Sie erreichen dies durch die Eingabe von:
+
+[source,bash]
+....
+ M-x gdb RET progname RET
+....
+
+Die Verwendung eines Debuggers erlaubt Ihnen Ihr Programm unter kontrollierteren Bedingungen ausführen zu können. Typischerweise können Sie so Zeile für Zeile durch Ihr Programm gehen, die Werte von Variablen untersuchen, diese verändern, dem Debugger sagen er soll das Programm bis zu einem bestimmten Punkt ausführen und dann anhalten, und so weiter und so fort. Sie können damit sogar ein schon laufendes Programm untersuchen, oder eine Datei mit einem Kernspeicherabbild laden um herauszufinden, warum das Programm abgestürzt ist. Es ist sogar möglich damit den Kernel zu debuggen, wobei dies etwas trickreicher als bei den Benutzeranwendungen ist, welche wir in diesem Abschnitt behandeln werden.
+
+Der `gdb` besitzt eine recht gute Online-Hilfe, sowie einen Satz von Info-Seiten, weshalb sich dieser Abschnitt auf ein paar grundlegende Befehle beschränken wird.
+
+Falls Sie den textbasierten Kommandozeilen-Stil abstoßend finden gibt es ein graphisches Front-End dafür (package:devel/xxgdb[]) in der Ports-Sammlung.
+
+Dieser Abschnitt ist als Einführung in die Verwendung des `gdb` gedacht und beinhaltet nicht spezielle Themen wie das Debuggen des Kernels.
+
+=== Ein Programm im Debugger ausführen
+
+Sie müssen das Programm mit der Option `-g` kompiliert haben um den `gdb` effektiv einsetzen zu können. Es geht auch ohne diese Option, allerdings werden Sie dann nur den Namen der Funktion sehen, in der Sie sich gerade befinden, anstatt direkt den zugehörigen Quelltext. Falls Sie eine Meldung wie die folgende sehen:
+
+[source,bash]
+....
+… (no debugging symbols found) …
+....
+
+wenn der `gdb` gestartet wird, dann wissen Sie, daß das Programm nicht mit der Option `-g` kompiliert wurde.
+
+Geben Sie in der Eingabeaufforderung des `gdb break main` ein. Dies weist den Debugger an, dass Sie nicht daran interessiert sind, den einleitenden Schritten beim Programmstart zuzusehen und dass am Anfang Ihres Codes die Ausführung beginnen soll. Geben Sie nun `run` ein, um das Programm zu starten - es wird starten und beim Aufruf von `main()` vom Debugger angehalten werden. (Falls Sie sich jemals gewundert haben von welcher Stelle `main()` aufgerufen wird, dann wissen Sie es jetzt!).
+
+Sie können nun Schritt für Schritt durch Ihr Programm gehen, indem Sie `n` drücken. Wenn Sie zu einem Funktionsaufruf kommen können Sie diese Funktion durch drücken von `s` betreten. Sobald Sie sich in einem Funktionsaufruf befinden können Sie diesen durch drücken von `f` wieder verlassen. Sie können auch `up` und `down` verwenden, um sich schnell den Aufrufer einer Funktion anzusehen.
+
+Hier ist ein einfaches Beispiel, wie man mit Hilfe des `gdb` einen Fehler in einem Programm findet. Dies ist unser eigenes Programm (mit einem absichtlich eingebauten Fehler):
+
+[.programlisting]
+....
+#include <stdio.h>
+
+int bazz(int anint);
+
+main() {
+ int i;
+
+ printf("This is my program\n");
+ bazz(i);
+ return 0;
+}
+
+int bazz(int anint) {
+ printf("You gave me %d\n", anint);
+ return anint;
+}
+....
+
+Dieses Programm setzt i auf den Wert `5` und übergibt dies einer Funktion `bazz()`, welche den Wert ausgibt, den Sie von uns erhalten hat.
+
+Wenn wir das Programm kompilieren und ausführen erhalten wir
+
+[source,bash]
+....
+% cc -g -o temp temp.c
+% ./temp
+This is my program
+anint = 4231
+....
+
+Das ist nicht was wir erwartet hatten! Es ist Zeit, daß wir sehen was hier passiert!
+
+[source,bash]
+....
+% gdb temp
+GDB is free software and you are welcome to distribute copies of it
+ under certain conditions; type "show copying" to see the conditions.
+There is absolutely no warranty for GDB; type "show warranty" for details.
+GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
+(gdb) break main Skip the set-up code
+Breakpoint 1 at 0x160f: file temp.c, line 9. gdb puts breakpoint at main()
+(gdb) run Run as far as main()
+Starting program: /home/james/tmp/temp Program starts running
+
+Breakpoint 1, main () at temp.c:9 gdb stops at main()
+(gdb) n Go to next line
+This is my program Program prints out
+(gdb) s step into bazz()
+bazz (anint=4231) at temp.c:17 gdb displays stack frame
+(gdb)
+....
+
+Halt mal! Wieso hat denn anint den Wert `4231`? Haben wir dieser Variablen nicht in `main()` den Wert `5` zugewiesen? Gehen wir mal zurück zu `main()` und schauen dort nach.
+
+[source,bash]
+....
+(gdb) up Move up call stack
+#1 0x1625 in main () at temp.c:11 gdb displays stack frame
+(gdb) p i Show us the value of i
+$1 = 4231 gdb displays 4231
+....
+
+Oh! Anscheinend haben wir vergessen i zu initialisieren. Wir wollten eigentlich
+
+[.programlisting]
+....
+...
+main() {
+ int i;
+
+ i = 5;
+ printf("This is my program\n");
+...
+....
+
+schreiben, haben aber die Zeile mit `i=5;` vergessen. Da wir i nicht initialisiert haben hatte diese Variable gerade den Wert, der in dem ihr zugewiesenen Speicherbereich stand als wir das Programm gestartet haben, welcher in diesem Fall `4231` war.
+
+[NOTE]
+====
+Der `gdb` zeigt jedes mal, wenn wir eine Funktion betreten oder verlassen, den Inhalt des Stack-Rahmens an, selbst wenn wir uns mit `up` und `down` im Aufruf-Stack umher bewegen. Dabei wird der Name der Funktion sowie der übergebenen Argumente angezeigt, was uns dabei hilft, die Übersicht zu behalten. (Der Stack ist ein Speicherbereich, in dem ein Programm Informationen über die an eine Funktion übergebenen Argumente ablegt, sowie die Rücksprungadresse eines Funktionsaufrufes).
+====
+
+=== Eine Kernspeicherdatei untersuchen
+
+Eine Kernspeicherdatei ist im Prinzip eine Datei, die den vollständigen Zustand eines Prozesses enthält, als dieses abgestürzt ist. In "den guten alten Zeiten" mußten Programmierer hexadezimale Listen der Kernspeicherdatei ausdrucken und über Maschinencodehandbüchern schwitzen, aber heutzutage ist das Leben etwas einfacher geworden. Zufälligerweise wird die Kernspeicherdatei unter FreeBSD und anderen 4.4BSD-Systemen [.filename]#progname.core# anstatt einfach nur [.filename]#core# genannt, um deutlich zu machen, zu welchem Programm eine Kernspeicherdatei gehört.
+
+Um eine Kernspeicherdatei zu untersuchen müssen Sie den `gdb` wie gewohnt starten. An Stelle von `break` oder `run` müssen Sie das Folgende eingeben
+
+[source,bash]
+....
+(gdb) core progname.core
+....
+
+Wenn Sie sich nicht in demselben Verzeichnis befinden wie die Kernspeicherdatei müssen Sie zuerst `dir /path/to/core/file` eingeben.
+
+Sie sollten dann etwas wie folgt sehen:
+
+[source,bash]
+....
+% gdb a.out
+GDB is free software and you are welcome to distribute copies of it
+ under certain conditions; type "show copying" to see the conditions.
+There is absolutely no warranty for GDB; type "show warranty" for details.
+GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
+(gdb) core a.out.core
+Core was generated by `a.out'.
+Program terminated with signal 11, Segmentation fault.
+Cannot access memory at address 0x7020796d.
+#0 0x164a in bazz (anint=0x5) at temp.c:17
+(gdb)
+....
+
+In diesem Fall hieß das Programm [.filename]#a.out#, weshalb die Kernspeicherdatei den Namen [.filename]#a.out.core# trägt. Wie wir sehen können stürzte das Programm in einer Funktion namens `bazz` ab, als es versuchte auf einen Speicherbereich zuzugreifen, der dem Programm nicht zur Verfügung stand.
+
+Manchmal ist es ganz nützlich zu sehen, wie eine Funktion aufgerufen wurde, da bei komplexen Programmen das eigentliche Problem schon sehr viel weiter oben auf dem Aufruf-Stack aufgetreten sein könnte. Der Befehl `bt` veranlaßt den `gdb` dazu, einen Backtrace des Aufruf-Stacks auszugeben:
+
+[source,bash]
+....
+(gdb) bt
+#0 0x164a in bazz (anint=0x5) at temp.c:17
+#1 0xefbfd888 in end ()
+#2 0x162c in main () at temp.c:11
+(gdb)
+....
+
+Die Funktion `end()` wird aufgerufen, wenn ein Programm abstürzt; in diesem Fall wurde die Funktion `bazz()` aus der `main()`-Funktion heraus aufgerufen.
+
+=== Ein bereits laufendes Programm untersuchen
+
+Eine der tollsten Features des `gdb` ist die Möglichkeit, damit bereits laufende Programme zu untersuchen. Dies bedeutet natürlich, daß Sie die erforderlichen Rechte dafür besitzen. Ein häufig auftretendes Problem ist das Untersuchen eines Programmes, welches sich selber forkt. Vielleicht will man den Kindprozess untersuchen, aber der Debugger erlaubt einem nur den Zugriff auf den Elternprozess.
+
+Was Sie an solch einer Stelle machen ist, Sie starten einen weiteren `gdb`, ermitteln mit Hilfe von `ps` die Prozess-ID des Kindprozesses, und geben
+
+[source,bash]
+....
+(gdb) attach pid
+....
+
+im `gdb` ein, und können dann wie üblich mit der Fehlersuche fortfahren.
+
+"Das ist zwar alles sehr schön," werden Sie jetzt vielleicht denken, "aber in der Zeit, in der ich diese Schritte durchführe, ist der Kindprozess schon längst über alle Berge". Fürchtet euch nicht, edler Leser, denn Ihr müßt wie folgt vorgehen (freundlicherweise zur Verfügung gestellt von den Info-Seite des `gdb`):
+
+[source,bash]
+....
+…
+if ((pid = fork()) < 0) /* _Always_ check this */
+ error();
+else if (pid == 0) { /* child */
+ int PauseMode = 1;
+
+ while (PauseMode)
+ sleep(10); /* Wait until someone attaches to us */
+ …
+} else { /* parent */
+ …
+....
+
+Alles was Sie jetzt noch tun müssen ist, sich an den Kindprozess ranzuhängen, PauseMode auf `0` zu setzen und auf den `sleep()` Funktionsaufruf zu warten, um zurückzukehren!
+
+[[emacs]]
+== Emacs als Entwicklungsumgebung verwenden
+
+=== Emacs
+
+Leider werden UNIX(R)-Systeme nicht mit einem alles-was-du-jemals-brauchst-und-vieles-mehr-megapaket an integrierten Entwicklungsumgebungen ausgestattet, die bei anderen Systemen dabei sind. Trotzdem ist es möglich, seine eigene Entwicklungsumgebung aufzusetzen. Diese wird vielleicht nicht so hübsch und integriert sein, aber dafür können Sie sie Ihren eigenen Wünschen anpassen. Und sie ist frei. Und Sie haben die Quelltexte davon.
+
+Der Schlüssel zu all dem ist Emacs. Es gibt zwar ein paar Leute die ihn hassen, es gibt jedoch auch viele die ihn lieben. Falls Sie zu ersteren gehören befürchte ich, daß dieser Abschnitt Ihnen wenig interessantes zu bieten hat. Des weiteren benötigen Sie eine angemessene Menge an freiem Speicher, um ihn zu benutzen-ich würde 8MB für den Textmodus und 16MB unter X als absolutes Minimum empfehlen, um eine halbwegs brauchbare Performance zu erhalten.
+
+Emacs ist im Prinzip ein extrem anpassbarer Editor- in der Tat ist er so stark veränderbar, daß er eher einem Betriebssystem als einem Editor gleicht! Viele Entwickler und Systemadministratoren erledigen praktisch ihre gesamte Arbeit aus Emacs heraus und beenden ihn nur, um sich komplett auszuloggen.
+
+Es ist nicht einmal möglich alles hier zusammenzufassen, was man mit dem Emacs machen kann. Im Folgenden werden einige Features aufgelistet, die für einen Entwickler interessant sein könnten:
+
+* Sehr mächtiger Editor, der suchen-und-ersetzen mit Zeichenfolgen und regulären Ausdrücken (Pattern) sowie das direkte Anspringen von Anfang/Ende von Blockausdrücken erlaubt, etc, etc.
+* Pull-Down Menüs und eine Online-Hilfe.
+* Sprachunabhängige Syntaxhervorhebung und automatische Einrückung.
+* Vollständig konfigurierbar.
+* Sie können Programme im Emacs kompilieren und debuggen.
+* Bei Kompilationsfehlern können Sie direkt zu der entsprechenden Zeile im Quelltext springen.
+* Benutzerfreundliches Front-End für das `info`-Programm, um die GNU Hypertext Dokumentation inklusive der Dokumentation des Emacs selber.
+* Benutzerfreundliches Front-End für den `gdb` um sich beim Verfolgen der Programmanweisungen den zugehörigen Quelltext anzeigen zu lassen.
+* Sie können E-Mails und News im Usenet lesen, während ihr Programm kompiliert wird.
+
+Und zweifelsfrei viele weitere Punkte, die ich übersehen habe.
+
+Emacs kann unter FreeBSD über den package:editors/emacs[] Port installiert werden.
+
+Sobald er installiert ist starten Sie ihn, und geben dann `C-h t` ein, um die Einführung in Emacs zu lesen-d.h. Sie sollen bei gedrückter kbd:[Strg]-Taste die kbd:[h]-Taste drücken, beide wieder loslassen und anschließend kbd:[t] drücken. (Alternativ können Sie mit der Maus den Eintrag [.guimenuitem]#Emacs Tutorial# aus dem menu:Hilfe[]-Menü auswählen).
+
+Obwohl der Emacs Menüs besitzt ist das Erlernen der Tastaturkombinationen lohnenswert, da man beim Editieren sehr viel schneller Tastenkombinationen eingeben kann, als die Maus zu finden und mit dieser dann an der richtigen Stelle zu klicken. Und wenn Sie sich mit erfahrenen Emacs-Benutzern unterhalten werden Sie feststellen, daß diese häufig nebenbei Ausdrücke wie "`M-x replace-s RET foo RET bar RET`" verwenden, weshalb das Erlernen dieser sehr nützlich ist. Und Emacs hat auf jeden Fall weit mehr nützliche Funktionen als das diese in der Menüleiste unterzubringen wären.
+
+Zum Glück ist es sehr einfach die jeweiligen Tastaturkombinationen herauszubekommen, da diese direkt neben den Menüeinträgen stehen. Meine Empfehlung wäre, den Menüeintrag für, sagen wir, das Öffnen einer Datei zu verwenden, bis Sie die Funktionsweise verstanden haben und sie mit dieser vertraut sind, und es dann mit C-x C-f versuchen. Wenn Sie damit zufrieden sind, gehen Sie zum nächsten Menüeintrag.
+
+Falls Sie sich nicht daran erinnern können, was eine bestimmte Tastenkombination macht, wählen Sie [.guimenuitem]#Describe Key# aus dem menu:Hilfe[]-Menü aus und geben Sie die Tastenkombination ein-Emacs sagt Ihnen dann was diese macht. Sie können ebenfalls den Menüeintrag [.guimenuitem]#Command Apropos# verwenden, um alle Befehle, die ein bestimmtes Wort enthalten, mit den zugehörigen Tastenkombinationen aufgelistet zu bekommen.
+
+Übrigends bedeutet der Ausdruck weiter oben, bei gedrückter kbd:[Meta]-Taste kbd:[x] zu drücken, beide wieder loszulassen, `replace-s` einzugeben (Kurzversion für `replace-string`-ein weiteres Feature des Emacs ist, daß Sie Befehle abkürzen können), anschließend die kbd:[return]-Taste zu drücken, dann `foo` einzugeben (die Zeichenkette, die Sie ersetzen möchten), dann wieder kbd:[return], dann die Leertaste zu drücken (die Zeichenkette, mit der Sie `foo` ersetzen möchten) und anschließend erneut kbd:[return] zu drücken. Emacs wird dann die gewünschte suchen-und-ersetzen-Operation ausführen.
+
+Wenn Sie sich fragen was in aller Welt die kbd:[Meta]-Taste ist, das ist eine spezielle Taste die viele UNIX(R)-Workstations besitzen. Bedauerlicherweise haben PCs keine solche Taste, und daher ist es üblicherweise die kbd:[alt]-Taste (oder falls Sie Pech haben die kbd:[Esc]-Taste).
+
+Oh, und um den Emacs zu verlassen müssen sie `C-x C-c` (das bedeutet, Sie müssen bei gedrückter kbd:[Strg]-Taste zuerst kbd:[x] und dann kbd:[c] drücken) eingeben. Falls Sie noch irgendwelche ungespeicherten Dateien offen haben wird Emacs Sie fragen ob Sie diese speichern wollen. (Ignorieren Sie bitte die Stelle der Dokumentation, an der gesagt wird, daß `C-z` der übliche Weg ist, Emacs zu verlassen-dadurch wird der Emacs in den Hintergrund geschaltet, was nur nützlich ist, wenn Sie an einem System ohne virtuelle Terminals arbeiten).
+
+=== Emacs konfigurieren
+
+Emacs kann viele wundervolle Dinge; manche dieser Dinge sind schon eingebaut, andere müssen erst konfiguriert werden.
+
+Anstelle einer proprietären Macrosprache verwendet der Emacs für die Konfiguration eine speziell für Editoren angepaßte Version von Lisp, auch bekannt als Emacs Lisp. Das Arbeiten mit Emacs Lisp kann sehr hilfreich sein, wenn Sie darauf aufbauend etwas wie Common Lisp lernen möchten. Emacs Lisp hat viele Features von Common Lisp obwohl es beträchtlich kleiner ist (und daher auch einfacher zu beherrschen).
+
+Der beste Weg um Emacs Lisp zu erlernen besteht darin, sich das link:ftp://ftp.gnu.org/old-gnu/emacs/elisp-manual-19-2.4.tar.gz[Emacs Tutorial] herunterzuladen.
+
+Es ist jedoch keine Kenntnis von Lisp erforderlich, um mit der Konfiguration von Emacs zu beginnen, da ich eine beispielhafte [.filename]#.emacs#-Datei hier eingefügt habe, die für den Anfang ausreichen sollte. Kopieren Sie diese einfach in Ihr Heimverzeichnis und starten Sie den Emacs neu, falls dieser bereits läuft; er wird die Befehle aus der Datei lesen und Ihnen (hoffentlich) eine brauchbare Grundeinstellung bieten.
+
+=== Eine beispielhafte [.filename]#.emacs#-Datei
+
+Bedauerlicherweise gibt es hier viel zu viel, um es im Detail zu erklären; es gibt jedoch ein oder zwei Punkte, die besonders erwähnenswert sind.
+
+* Alles was mit einem `;` anfängt ist ein Kommentar und wird von Emacs ignoriert.
+* In der ersten Zeile mit `-*- Emacs-Lisp -*-` sorgt dafür, daß wir die Datei [.filename]#.emacs# in Emacs selber editieren können und uns damit alle tollen Features zum Editieren von Emacs Lisp zur Verfügung stehen. Emacs versucht dies normalerweise anhand des Dateinamens auszumachen, was vielleicht bei [.filename]#.emacs# nicht funktionieren könnte.
+* Die kbd:[Tab]-Taste ist in manchen Modi an die Einrückungsfunktion gebunden, so daß beim drücken dieser Taste die aktuelle Zeile eingerückt wird. Wenn Sie ein tab-Zeichen in einen Text, welchen auch immer Sie dabei schreiben, einfügen wollen, müssen Sie bei gedrückter kbd:[Strg]-Taste die kbd:[Tab]-Taste drücken.
+* Diese Datei unterstützt Syntax Highlighting für C, C++, Perl, Lisp und Scheme, indem die Sprache anhand des Dateinamens erraten wird.
+* Emacs hat bereits eine vordefinierte Funktion mit dem Namen `next-error`. Diese erlaubt es einem, in einem Fenster mit der Kompilierungsausgabe mittels `M-n` von einem zum nächsten Kompilierungsfehler zu springen; wir definieren eine komplementäre Funktion `previous-error`, die es uns erlaubt, mittels `M-p` von einem zum vorherigen Kompilierungsfehler zu springen. Das schönste Feature von allen ist, daß mittels `C-c C-c` die Quelltextdatei, in der der Fehler aufgetreten ist, geöffnet und die betreffende Zeile direkt angesprungen wird.
+* Wir aktivieren die Möglichkeit von Emacs als Server zu agieren, so daß wenn Sie etwas außerhalb von Emacs machen und eine Datei editieren möchten, Sie einfach das folgende eingeben können
++
+[source,bash]
+....
+% emacsclient filename
+....
++
+und dann die Datei in Ihrem Emacs editieren können!
+
+.Eine einfache [.filename]#.emacs#-Datei
+[example]
+====
+[.programlisting]
+....
+;; -*-Emacs-Lisp-*-
+
+;; This file is designed to be re-evaled; use the variable first-time
+;; to avoid any problems with this.
+(defvar first-time t
+ "Flag signifying this is the first time that .emacs has been evaled")
+
+;; Meta
+(global-set-key "\M- " 'set-mark-command)
+(global-set-key "\M-\C-h" 'backward-kill-word)
+(global-set-key "\M-\C-r" 'query-replace)
+(global-set-key "\M-r" 'replace-string)
+(global-set-key "\M-g" 'goto-line)
+(global-set-key "\M-h" 'help-command)
+
+;; Function keys
+(global-set-key [f1] 'manual-entry)
+(global-set-key [f2] 'info)
+(global-set-key [f3] 'repeat-complex-command)
+(global-set-key [f4] 'advertised-undo)
+(global-set-key [f5] 'eval-current-buffer)
+(global-set-key [f6] 'buffer-menu)
+(global-set-key [f7] 'other-window)
+(global-set-key [f8] 'find-file)
+(global-set-key [f9] 'save-buffer)
+(global-set-key [f10] 'next-error)
+(global-set-key [f11] 'compile)
+(global-set-key [f12] 'grep)
+(global-set-key [C-f1] 'compile)
+(global-set-key [C-f2] 'grep)
+(global-set-key [C-f3] 'next-error)
+(global-set-key [C-f4] 'previous-error)
+(global-set-key [C-f5] 'display-faces)
+(global-set-key [C-f8] 'dired)
+(global-set-key [C-f10] 'kill-compilation)
+
+;; Keypad bindings
+(global-set-key [up] "\C-p")
+(global-set-key [down] "\C-n")
+(global-set-key [left] "\C-b")
+(global-set-key [right] "\C-f")
+(global-set-key [home] "\C-a")
+(global-set-key [end] "\C-e")
+(global-set-key [prior] "\M-v")
+(global-set-key [next] "\C-v")
+(global-set-key [C-up] "\M-\C-b")
+(global-set-key [C-down] "\M-\C-f")
+(global-set-key [C-left] "\M-b")
+(global-set-key [C-right] "\M-f")
+(global-set-key [C-home] "\M-<")
+(global-set-key [C-end] "\M->")
+(global-set-key [C-prior] "\M-<")
+(global-set-key [C-next] "\M->")
+
+;; Mouse
+(global-set-key [mouse-3] 'imenu)
+
+;; Misc
+(global-set-key [C-tab] "\C-q\t") ; Control tab quotes a tab.
+(setq backup-by-copying-when-mismatch t)
+
+;; Treat 'y' or <CR> as yes, 'n' as no.
+(fset 'yes-or-no-p 'y-or-n-p)
+(define-key query-replace-map [return] 'act)
+(define-key query-replace-map [?\C-m] 'act)
+
+;; Load packages
+(require 'desktop)
+(require 'tar-mode)
+
+;; Pretty diff mode
+(autoload 'ediff-buffers "ediff" "Intelligent Emacs interface to diff" t)
+(autoload 'ediff-files "ediff" "Intelligent Emacs interface to diff" t)
+(autoload 'ediff-files-remote "ediff"
+ "Intelligent Emacs interface to diff")
+
+(if first-time
+ (setq auto-mode-alist
+ (append '(("\\.cpp$" . c++-mode)
+ ("\\.hpp$" . c++-mode)
+ ("\\.lsp$" . lisp-mode)
+ ("\\.scm$" . scheme-mode)
+ ("\\.pl$" . perl-mode)
+ ) auto-mode-alist)))
+
+;; Auto font lock mode
+(defvar font-lock-auto-mode-list
+ (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)
+ "List of modes to always start in font-lock-mode")
+
+(defvar font-lock-mode-keyword-alist
+ '((c++-c-mode . c-font-lock-keywords)
+ (perl-mode . perl-font-lock-keywords))
+ "Associations between modes and keywords")
+
+(defun font-lock-auto-mode-select ()
+ "Automatically select font-lock-mode if the current major mode is in font-lock-auto-mode-list"
+ (if (memq major-mode font-lock-auto-mode-list)
+ (progn
+ (font-lock-mode t))
+ )
+ )
+
+(global-set-key [M-f1] 'font-lock-fontify-buffer)
+
+;; New dabbrev stuff
+;(require 'new-dabbrev)
+(setq dabbrev-always-check-other-buffers t)
+(setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_")
+(add-hook 'emacs-lisp-mode-hook
+ '(lambda ()
+ (set (make-local-variable 'dabbrev-case-fold-search) nil)
+ (set (make-local-variable 'dabbrev-case-replace) nil)))
+(add-hook 'c-mode-hook
+ '(lambda ()
+ (set (make-local-variable 'dabbrev-case-fold-search) nil)
+ (set (make-local-variable 'dabbrev-case-replace) nil)))
+(add-hook 'text-mode-hook
+ '(lambda ()
+ (set (make-local-variable 'dabbrev-case-fold-search) t)
+ (set (make-local-variable 'dabbrev-case-replace) t)))
+
+;; C++ and C mode...
+(defun my-c++-mode-hook ()
+ (setq tab-width 4)
+ (define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
+ (define-key c++-mode-map "\C-ce" 'c-comment-edit)
+ (setq c++-auto-hungry-initial-state 'none)
+ (setq c++-delete-function 'backward-delete-char)
+ (setq c++-tab-always-indent t)
+ (setq c-indent-level 4)
+ (setq c-continued-statement-offset 4)
+ (setq c++-empty-arglist-indent 4))
+
+(defun my-c-mode-hook ()
+ (setq tab-width 4)
+ (define-key c-mode-map "\C-m" 'reindent-then-newline-and-indent)
+ (define-key c-mode-map "\C-ce" 'c-comment-edit)
+ (setq c-auto-hungry-initial-state 'none)
+ (setq c-delete-function 'backward-delete-char)
+ (setq c-tab-always-indent t)
+;; BSD-ish indentation style
+ (setq c-indent-level 4)
+ (setq c-continued-statement-offset 4)
+ (setq c-brace-offset -4)
+ (setq c-argdecl-indent 0)
+ (setq c-label-offset -4))
+
+;; Perl mode
+(defun my-perl-mode-hook ()
+ (setq tab-width 4)
+ (define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
+ (setq perl-indent-level 4)
+ (setq perl-continued-statement-offset 4))
+
+;; Scheme mode...
+(defun my-scheme-mode-hook ()
+ (define-key scheme-mode-map "\C-m" 'reindent-then-newline-and-indent))
+
+;; Emacs-Lisp mode...
+(defun my-lisp-mode-hook ()
+ (define-key lisp-mode-map "\C-m" 'reindent-then-newline-and-indent)
+ (define-key lisp-mode-map "\C-i" 'lisp-indent-line)
+ (define-key lisp-mode-map "\C-j" 'eval-print-last-sexp))
+
+;; Add all of the hooks...
+(add-hook 'c++-mode-hook 'my-c++-mode-hook)
+(add-hook 'c-mode-hook 'my-c-mode-hook)
+(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)
+(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)
+(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)
+(add-hook 'perl-mode-hook 'my-perl-mode-hook)
+
+;; Complement to next-error
+(defun previous-error (n)
+ "Visit previous compilation error message and corresponding source code."
+ (interactive "p")
+ (next-error (- n)))
+
+;; Misc...
+(transient-mark-mode 1)
+(setq mark-even-if-inactive t)
+(setq visible-bell nil)
+(setq next-line-add-newlines nil)
+(setq compile-command "make")
+(setq suggest-key-bindings nil)
+(put 'eval-expression 'disabled nil)
+(put 'narrow-to-region 'disabled nil)
+(put 'set-goal-column 'disabled nil)
+(if (>= emacs-major-version 21)
+ (setq show-trailing-whitespace t))
+
+;; Elisp archive searching
+(autoload 'format-lisp-code-directory "lispdir" nil t)
+(autoload 'lisp-dir-apropos "lispdir" nil t)
+(autoload 'lisp-dir-retrieve "lispdir" nil t)
+(autoload 'lisp-dir-verify "lispdir" nil t)
+
+;; Font lock mode
+(defun my-make-face (face color &optional bold)
+ "Create a face from a color and optionally make it bold"
+ (make-face face)
+ (copy-face 'default face)
+ (set-face-foreground face color)
+ (if bold (make-face-bold face))
+ )
+
+(if (eq window-system 'x)
+ (progn
+ (my-make-face 'blue "blue")
+ (my-make-face 'red "red")
+ (my-make-face 'green "dark green")
+ (setq font-lock-comment-face 'blue)
+ (setq font-lock-string-face 'bold)
+ (setq font-lock-type-face 'bold)
+ (setq font-lock-keyword-face 'bold)
+ (setq font-lock-function-name-face 'red)
+ (setq font-lock-doc-string-face 'green)
+ (add-hook 'find-file-hooks 'font-lock-auto-mode-select)
+
+ (setq baud-rate 1000000)
+ (global-set-key "\C-cmm" 'menu-bar-mode)
+ (global-set-key "\C-cms" 'scroll-bar-mode)
+ (global-set-key [backspace] 'backward-delete-char)
+ ; (global-set-key [delete] 'delete-char)
+ (standard-display-european t)
+ (load-library "iso-transl")))
+
+;; X11 or PC using direct screen writes
+(if window-system
+ (progn
+ ;; (global-set-key [M-f1] 'hilit-repaint-command)
+ ;; (global-set-key [M-f2] [?\C-u M-f1])
+ (setq hilit-mode-enable-list
+ '(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode
+ scheme-mode)
+ hilit-auto-highlight nil
+ hilit-auto-rehighlight 'visible
+ hilit-inhibit-hooks nil
+ hilit-inhibit-rebinding t)
+ (require 'hilit19)
+ (require 'paren))
+ (setq baud-rate 2400) ; For slow serial connections
+ )
+
+;; TTY type terminal
+(if (and (not window-system)
+ (not (equal system-type 'ms-dos)))
+ (progn
+ (if first-time
+ (progn
+ (keyboard-translate ?\C-h ?\C-?)
+ (keyboard-translate ?\C-? ?\C-h)))))
+
+;; Under UNIX
+(if (not (equal system-type 'ms-dos))
+ (progn
+ (if first-time
+ (server-start))))
+
+;; Add any face changes here
+(add-hook 'term-setup-hook 'my-term-setup-hook)
+(defun my-term-setup-hook ()
+ (if (eq window-system 'pc)
+ (progn
+;; (set-face-background 'default "red")
+ )))
+
+;; Restore the "desktop" - do this as late as possible
+(if first-time
+ (progn
+ (desktop-load-default)
+ (desktop-read)))
+
+;; Indicate that this file has been read at least once
+(setq first-time nil)
+
+;; No need to debug anything now
+
+(setq debug-on-error nil)
+
+;; All done
+(message "All done, %s%s" (user-login-name) ".")
+....
+
+====
+
+=== Erweitern des von Emacs unterstützten Sprachbereichs
+
+Das ist jetzt alles sehr schön wenn Sie ausschließlich in einer der Sprachen programmieren wollen, um die wir uns bereits in der [.filename]#.emacs#-Datei gekümmert haben (C, C++, Perl, Lisp und Scheme), aber was passiert wenn eine neue Sprache namens "whizbang" herauskommt, mit jeder Menge neuen tollen Features?
+
+Als erstes muß festgestellt werden, ob whizbang mit irgendwelchen Dateien daherkommt, die Emacs etwas über die Sprache sagen. Diese enden üblicherweise auf [.filename]#.el#, der Kurzform für "Emacs Lisp". Falls whizbang zum Beispiel ein FreeBSD Port ist, könnten wir diese Dateien mittels
+
+[source,bash]
+....
+% find /usr/ports/lang/whizbang -name "*.el" -print
+....
+
+finden und durch Kopieren in das Emacs-seitige Lisp-Verzeichnis installieren. Unter FreeBSD ist dies [.filename]#/usr/local/shared/emacs/site-lisp#.
+
+Wenn zum Beispiel die Ausgabe des find-Befehls wie folgt war
+
+[source,bash]
+....
+/usr/ports/lang/whizbang/work/misc/whizbang.el
+....
+
+könnten wir das folgende tun
+
+[source,bash]
+....
+# cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/shared/emacs/site-lisp
+....
+
+Als nächstes müssen wir festlegen, welche Dateiendung Quelltextdateien für whizbang haben. Lassen Sie uns um der Argumente Willen annehmen, die Dateiendung sei [.filename]#.wiz#. Wir müssen dann einen Eintrag unserer [.filename]#.emacs#-Datei hinzufügen um sicherzustellen, daß Emacs die Informationen in [.filename]#whizbang.el# auch verwenden kann.
+
+Suchen Sie den auto-mode-alist Eintrag in der [.filename]#.emacs#-Datei und fügen Sie an dieser Stelle eine Zeile wie folgt für whizbang hinzu:
+
+[.programlisting]
+....
+...
+("\\.lsp$" . lisp-mode)
+("\\.wiz$" . whizbang-mode)
+("\\.scm$" . scheme-mode)
+...
+....
+
+Dies bedeutet das Emacs automatisch in den `whizbang-mode` wechseln wird, wenn Sie eine Datei mit der Dateiendung [.filename]#.wiz# editieren.
+
+Direkt darunter werden Sie den Eintrag font-lock-auto-mode-list finden. Erweitern Sie den `whizbang-mode` um diesen wie folgt:
+
+[.programlisting]
+....
+;; Auto font lock mode
+(defvar font-lock-auto-mode-list
+ (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)
+ "List of modes to always start in font-lock-mode")
+....
+
+Dies bedeutet das Emacs immer `font-lock-mode` (z.B. Syntax Highlighting) aktiviert, wenn Sie eine [.filename]#.wiz#-Datei editieren.
+
+Und das ist alles was benötigt wird. Falls es weitere Dinge gibt, die automatisch beim Öffnen einer [.filename]#.wiz#-Datei ausgeführt werden sollen, können Sie einen `whizbang-mode hook`-Eintrag hinzufügen (für ein einfaches Beispiel, welches `auto-indent` hinzufügt, sehen Sie sich bitte `my-scheme-mode-hook` an).
+
+[[tools-reading]]
+== Weiterführende Literatur
+
+Für Informationen zum Aufsetzen einer Entwicklungsumgebung, um Fehlerbehebungen an FreeBSD selber beizusteuern sehen Sie sich bitte man:development[7] an.
+
+* Brian Harvey and Matthew Wright _Simply Scheme_ MIT 1994. ISBN 0-262-08226-8
+* Randall Schwartz _Learning Perl_ O'Reilly 1993 ISBN 1-56592-042-2
+* Patrick Henry Winston and Berthold Klaus Paul Horn _Lisp (3rd Edition)_ Addison-Wesley 1989 ISBN 0-201-08319-1
+* Brian W. Kernighan and Rob Pike _The Unix Programming Environment_ Prentice-Hall 1984 ISBN 0-13-937681-X
+* Brian W. Kernighan and Dennis M. Ritchie _The C Programming Language (2nd Edition)_ Prentice-Hall 1988 ISBN 0-13-110362-8
+* Bjarne Stroustrup _The C++ Programming Language_ Addison-Wesley 1991 ISBN 0-201-53992-6
+* W. Richard Stevens _Advanced Programming in the Unix Environment_ Addison-Wesley 1992 ISBN 0-201-56317-7
+* W. Richard Stevens _Unix Network Programming_ Prentice-Hall 1990 ISBN 0-13-949876-1
diff --git a/documentation/content/de/books/developers-handbook/x86/chapter.adoc b/documentation/content/de/books/developers-handbook/x86/chapter.adoc
new file mode 100644
index 0000000000..99e318beaa
--- /dev/null
+++ b/documentation/content/de/books/developers-handbook/x86/chapter.adoc
@@ -0,0 +1,3879 @@
+---
+title: Kapitel 11. x86-Assembler-Programmierung
+prev: books/developers-handbook/kerneldebug
+next: books/developers-handbook/bibliography
+---
+
+[[x86]]
+= x86-Assembler-Programmierung
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 11
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+_Dieses Kapitel wurde geschrieben von {stanislav}._
+
+[[x86-intro]]
+== Synopsis
+
+Assembler-Programmierung unter UNIX(R) ist höchst undokumentiert. Es wird allgemein angenommen, dass niemand sie jemals benutzen will, da UNIX(R)-Systeme auf verschiedenen Mikroprozessoren laufen, und man deshalb aus Gründen der Portabilität alles in C schreiben sollte.
+
+In Wirklichkeit ist die Portabilität von C größtenteils ein Mythos. Auch C-Programme müssen angepasst werden, wenn man sie von einem UNIX(R) auf ein anderes portiert, egal auf welchem Prozessor jedes davon läuft. Typischerweise ist ein solches Programm voller Bedingungen, die unterscheiden für welches System es kompiliert wird.
+
+Sogar wenn wir glauben, dass jede UNIX(R)-Software in C, oder einer anderen High-Level-Sprache geschrieben werden sollte, brauchen wir dennoch Assembler-Programmierer: Wer sonst sollte den Abschnitt der C-Bibliothek schreiben, die auf den Kernel zugreift?
+
+In diesem Kapitel möchte ich versuchen zu zeigen, wie man Assembler-Sprache verwenden kann, um UNIX(R)-Programme, besonders unter FreeBSD, zu schreiben.
+
+Dieses Kapitel erklärt nicht die Grundlagen der Assembler-Sprache. Zu diesem Thema gibt es bereits genug Quellen (einen vollständigen Online-Kurs finden Sie in Randall Hydes http://webster.cs.ucr.edu/[Art of Assembly Language]; oder falls Sie ein gedrucktes Buch bevorzugen, können Sie einen Blick auf Jeff Duntemanns http://www.int80h.org/cgi-bin/isbn?isbn=0471375233[Assembly Language Step-by-Step] werfen). Jedenfalls sollte jeder Assembler-Programmierer nach diesem Kapitel schnell und effizient Programme für FreeBSD schreiben können.
+
+Copyright (R) 2000-2001 G. Adam Stanislav. All rights reserved.
+
+[[x86-the-tools]]
+== Die Werkzeuge
+
+[[x86-the-assembler]]
+=== Der Assembler
+
+Das wichtigste Werkzeug der Assembler-Programmierung ist der Assembler, diese Software übersetzt Assembler-Sprache in Maschinencode.
+
+Für FreeBSD stehen zwei verschiedene Assembler zur Verfügung. Der erste ist man:as[1], der die traditionelle UNIX(R)-Assembler-Sprache verwendet. Dieser ist Teil des Systems.
+
+Der andere ist /usr/ports/devel/nasm. Dieser benutzt die Intel-Syntax und sein Vorteil ist, dass es Code fü viele Vetriebssysteme übersetzen kann. Er muss gesondert installiert werden, aber ist völlig frei.
+
+In diesem Kapitel wird die nasm-Syntax verwendet. Einerseits weil es die meisten Assembler-Programmierer, die von anderen Systemen zu FreeBSD kommen, leichter verstehen werden. Und offen gesagt, weil es das ist, was ich gewohnt bin.
+
+[[x86-the-linker]]
+=== Der Linker
+
+Die Ausgabe des Assemblers muss, genau wie der Code jedes Compilers, gebunden werden, um eine ausführbare Datei zu bilden.
+
+Der Linker man:ld[1] ist der Standard und Teil von FreeBSD. Er funktioniert mit dem Code beider Assembler.
+
+[[x86-system-calls]]
+== Systemaufrufe
+
+[[x86-default-calling-convention]]
+=== Standard-Aufrufkonvention
+
+Standardmäßig benutzt der FreeBSD-Kernel die C-Aufrufkonvention. Weiterhin wird, obwohl auf den Kernel durch `int 80h` zugegriffen wird, angenommen, dass das Programm eine Funktion aufruft, die `int 80h` verwendet, anstatt `int 80h` direkt aufzurufen.
+
+Diese Konvention ist sehr praktisch und der Microsoft(R)-Konvention von MS-DOS(R) überlegen. Warum? Weil es die UNIX(R)-Konvention jedem Programm, egal in welcher Sprache es geschrieben ist, erlaubt auf den Kernel zuzugreifen.
+
+Ein Assembler-Programm kann das ebenfalls. Beispielsweise könnten wir eine Datei öffnen:
+
+[.programlisting]
+....
+kernel:
+ int 80h ; Call kernel
+ ret
+
+open:
+ push dword mode
+ push dword flags
+ push dword path
+ mov eax, 5
+ call kernel
+ add esp, byte 12
+ ret
+....
+
+Das ist ein sehr sauberer und portabler Programmierstil. Wenn Sie das Programm auf ein anderes UNIX(R) portieren, das einen anderen Interrupt oder eie andere Art der Parameterübergabe verwendet, müssen sie nur die Prozedur kernel ändern.
+
+Aber Assembler-Programmierer lieben es Taktzyklen zu schinden. Das obige Beispiel benötigt eine `call/ret`-Kombination. Das können wir entfernen, indem wir einen weiteren Parameter mit `push` übergeben:
+
+[.programlisting]
+....
+open:
+ push dword mode
+ push dword flags
+ push dword path
+ mov eax, 5
+ push eax ; Or any other dword
+ int 80h
+ add esp, byte 16
+....
+
+Die Konstante [constant]#5#, die wir in `EAX` ablegen, identifiziert die Kernel-Funktion, die wir aufrufen. In diesem Fall ist das `open`.
+
+[[x86-alternate-calling-convention]]
+=== Alternative Aufruf-Konvention
+
+FreeBSD ist ein extrem flexibles System. Es bietet noch andere Wege, um den Kernel aufzurufen. Damit diese funktionieren muss allerdings die Linux-Emulation installiert sein.
+
+Linux ist ein UNIX(R)-artiges System. Allerdings verwendet dessen Kernel die gleiche Systemaufruf-Konvention, bei der Parameter in Registern abgelegt werden, wie MS-DOS(R). Genau wie bei der UNIX(R)-Konvention wird die Nummer der Funktion in `EAX` abgelegt. Allerdings werden die Parameter nicht auf den Stack gelegt, sondern in die Register `EBX, ECX, EDX, ESI, EDI, EBP`:
+
+[.programlisting]
+....
+open:
+ mov eax, 5
+ mov ebx, path
+ mov ecx, flags
+ mov edx, mode
+ int 80h
+....
+
+Diese Konvention hat einen großen Nachteil gegenüber der von UNIX(R), was die Assembler-Programmierung angeht: Jedesmal, wenn Sie einen Kernel-Aufruf machen, müssen Sie die Register ``push``en und sie später ``pop``en. Das macht Ihren Code unförmiger und langsamer. Dennoch lässt FreeBSD ihnen die Wahl.
+
+Wenn Sie sich für die Linux-Konvention entscheiden, müssen Sie es das System wissen lassen. Nachdem ihr Programm übersetzt und gebunden wurde, müssen Sie die ausführbare Datei kennzeichnen:
+
+[source,bash]
+....
+%
+ brandelf -t Linux
+ filename
+....
+
+[[x86-use-geneva]]
+=== Welche Konvention Sie verwenden sollten
+
+Wenn Sie speziell für FreeBSD programmieren, sollten Sie die UNIX(R)-Konvention verwenden: Diese ist schneller, Sie können globale Variablen in Registern ablegen, Sie müssen die ausführbare Datei nicht kennzeichnen und Sie erzwingen nicht die Installation der Linux-Emulation auf dem Zielsystem.
+
+Wenn Sie portablen Programmcode erzeugen wollen, der auch unter Linux funktioniert, wollen Sie den FreeBSD-Nutzern vielleicht dennoch den effizientesten Programmcode bieten, der möglich ist. Ich werde Ihnen zeigen, wie Sie das erreichen können, nachdem ich die Grundlagen erklärt habe.
+
+[[x86-call-numbers]]
+=== Aufruf-Nummern
+
+Um dem Kernel mitzuteilen welchen Dienst Sie aufrufen, legen Sie dessen Nummer in `EAX` ab. Natürlich müssen Sie dazu wissen welche Nummer die Richtige ist.
+
+[[x86-the-syscalls-file]]
+==== Die Datei [.filename]#syscalls#
+
+Die Nummer der Funktionen sind in der Datei [.filename]#syscalls# aufgeführt. Mittels `locate syscalls` finden Sie diese in verschiedenen Formaten, die alle auf die gleiche Weise aus [.filename]#syscalls.master# erzeugt werden.
+
+Die Master-Datei für die UNIX(R)-Standard-Aufrufkonvention finden sie unter [.filename]#/usr/src/sys/kern/syscalls.master#. Falls Sie die andere Konvention, die im Linux-Emulations-Modus implementiert ist, verwenden möchten, lesen Sie bitte [.filename]#/usr/src/sys/i386/linux/syscalls.master#.
+
+[NOTE]
+====
+FreeBSD und Linux unterscheiden sich nicht nur in den Aufrufkonventionen, sie haben teilweise auch verschiedene Nummern für die gleiche Funktion.
+====
+
+[.filename]#syscalls.master# beschreibt, wie der Aufruf gemacht werden muss:
+
+[.programlisting]
+....
+0 STD NOHIDE { int nosys(void); } syscall nosys_args int
+1 STD NOHIDE { void exit(int rval); } exit rexit_args void
+2 STD POSIX { int fork(void); }
+3 STD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
+4 STD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
+5 STD POSIX { int open(char *path, int flags, int mode); }
+6 STD POSIX { int close(int fd); }
+etc...
+....
+
+In der ersten Spalte steht die Nummer, die in `EAX` abgelegt werden muss.
+
+Die Spalte ganz rechts sagt uns welche Parameter wir ``push``en müssen. Die Reihenfolge ist dabei _von rechts nach links_.
+
+[example]
+====
+Um beispielsweise eine Datei mittels `open` zu öffnen, müssen wir zuerst den `mode` auf den Stack ``push``en, danach die `flags`, dann die Adresse an der der `path` gespeichert ist.
+====
+
+[[x86-return-values]]
+== Rückgabewerte
+
+Ein Systemaufruf wäre meistens nicht sehr nützlich, wenn er nicht irgendeinen Wert zurückgibt: Beispielsweise den Dateideskriptor einer geöffneten Datei, die Anzahl an Bytes die in einen Puffer gelesen wurde, die Systemzeit, etc.
+
+Außerdem muss Sie das System informieren, falls ein Fehler auftritt: Wenn eine Datei nicht existiert, die Systemressourcen erschöpft sind, wir ein ungültiges Argument übergeben haben, etc.
+
+[[x86-man-pages]]
+=== Manualpages
+
+Der herkömmliche Ort, um nach Informationen über verschiedene Systemaufrufe unter UNIX(R)-Systemen zu suchen, sind die Manualpages. FreeBSD beschreibt seine Systemaufrufe in Abschnitt 2, manchmal auch Abschnitt 3.
+
+In man:open[2] steht beispielsweise:
+
+[.blockquote]
+Falls erfolgreich, gibt `open()` einen nicht negativen Integerwert, als Dateideskriptor bezeichnet, zurück. Es gibt `-1` im Fehlerfall zurück und setzt `errno` um den Fehler anzuzeigen.
+
+Ein Assembler-Programmierer, der neu bei UNIX(R) und FreeBSD ist, wird sich sofort fragen: Wo finde ich `errno` und wie erreiche ich es?
+
+[NOTE]
+====
+Die Information der Manualpage bezieht sich auf C-Programme. Der Assembler-Programmierer benötigt zusätzliche Informationen.
+====
+
+[[x86-where-return-values]]
+=== Wo sind die Rückgabewerde?
+
+Leider gilt: Es kommt darauf an... Für die meisten Systemaufrufe liegt er in `EAX`, aber nicht für alle. Eine gute Daumenregel, wenn man zum ersten Mal mit einem Systemaufruf arbeitet, ist in `EAX` nach dem Rückgabewert zu suchen. Wenn er nicht dort ist, sind weitere Untersuchungen nötig.
+
+[NOTE]
+====
+Mir ist ein Systemaufruf bekannt, der den Rückgabewert in `EDX` ablegt: `SYS_fork` Alle anderen mit denen ich bisher gearbeitet habe verwenden `EAX`. Allerdings habe ich noch nicht mit allen gearbeitet.
+====
+
+[TIP]
+====
+
+Wenn Sie die Antwort weder hier, noch irgendwo anders finden, studieren Sie den Quelltext von libc und sehen sich an, wie es mit dem Kernel zusammenarbeitet.
+====
+
+[[x86-where-errno]]
+=== Wo ist `errno`?
+
+Tatsächlich, nirgendwo...
+
+`errno` ist ein Teil der Sprache C, nicht des UNIX(R)-Kernels. Wenn man direkt auf Kernel-Dienste zugreift, wird der Fehlercode in `EAX` zurückgegeben, das selbe Register in dem der Rückgabewert, bei einem erfolgreichen Aufruf landet.
+
+Das macht auch Sinn. Wenn kein Fehler auftritt, gibt es keinen Fehlercode. Wenn ein Fehler auftritt, gibt es keinen Rückgabewert. Ein einziges Register kann also beides enthalten.
+
+[[x86-how-to-know-error]]
+=== Feststellen, dass ein Fehler aufgetreten ist
+
+Wenn Sie die Standard FreeBSD-Aufrufkonvention verwenden wird das `carry flag` gelöscht wenn der Aufruf erfolgreich ist und gesetzt wenn ein Fehler auftritt.
+
+Wenn Sie den Linux-Emulationsmodus verwenden ist der vorzeichenbehaftete Wert in `EAX` nicht negativ, bei einem erfolgreichen Aufruf. Wenn ein Fehler auftritt ist der Wert negativ, also `-errno`.
+
+[[x86-portable-code]]
+== Portablen Code erzeugen
+
+Portabilität ist im Allgemeinen keine Stärke der Assembler-Programmierung. Dennoch ist es, besonders mit nasm, möglich Assembler-Programme für verschiedene Plattformen zu schreiben. Ich selbst habe bereits Assembler-Bibliotheken geschrieben die auf so unterschiedlichen Systemen wie Windows(R) und FreeBSD übersetzt werden können.
+
+Das ist um so besser möglich, wenn Ihr Code auf zwei Plattformen laufen soll , die, obwohl sie verschieden sind, auf ähnlichen Architekturen basieren.
+
+Beispielsweise ist FreeBSD ein UNIX(R), während Linux UNIX(R)-artig ist. Ich habe bisher nur drei Unterschiede zwischen beiden (aus Sicht eines Assembler-Programmierers) erwähnt: Die Aufruf-Konvention, die Funktionsnummern und die Art der Übergabe von Rückgabewerten.
+
+[[x86-deal-with-function-numbers]]
+=== Mit Funktionsnummern umgehen
+
+In vielen Fällen sind die Funktionsnummern die selben. Allerdings kann man auch wenn sie es nicht sind leicht mit diesem Problem umgehen: Anstatt die Nummern in Ihrem Code zu verwenden, benutzen Sie Konstanten, die Sie abhängig von der Zielarchitektur unterschiedlich definieren:
+
+[.programlisting]
+....
+%ifdef LINUX
+%define SYS_execve 11
+%else
+%define SYS_execve 59
+%endif
+....
+
+[[x86-deal-with-geneva]]
+=== Umgang mit Konventionen
+
+Sowohl die Aufrufkonvention, als auch die Rückgabewerte (das `errno` Problem) kann man mit Hilfe von Makros lösen:
+
+[.programlisting]
+....
+%ifdef LINUX
+
+%macro system 0
+ call kernel
+%endmacro
+
+align 4
+kernel:
+ push ebx
+ push ecx
+ push edx
+ push esi
+ push edi
+ push ebp
+
+ mov ebx, [esp+32]
+ mov ecx, [esp+36]
+ mov edx, [esp+40]
+ mov esi, [esp+44]
+ mov ebp, [esp+48]
+ int 80h
+
+ pop ebp
+ pop edi
+ pop esi
+ pop edx
+ pop ecx
+ pop ebx
+
+ or eax, eax
+ js .errno
+ clc
+ ret
+
+.errno:
+ neg eax
+ stc
+ ret
+
+%else
+
+%macro system 0
+ int 80h
+%endmacro
+
+%endif
+....
+
+[[x86-deal-with-other-portability]]
+=== Umgang mit anderen Portabilitätsangelegenheiten
+
+Die oben genannte Lösung funktioniert in den meisten Fällen, wenn man Code schreibt, der zwischen FreeBSD und Linux portierbar sein soll. Allerdings sind die Unterschiede bei einigen Kernel-Diensten tiefgreifender.
+
+In diesem Fällen müssen Sie zwei verschiedene Handler für diese Systemaufrufe schreiben und bedingte Assemblierung benutzen, um diese zu übersetzen. Glücklicherweise wird der größte Teil Ihres Codes nicht den Kernel aufrufen und Sie werden deshalb nur wenige solcher bedingten Abschnitte benötigen.
+
+[[x86-portable-library]]
+=== Eine Bibliothek benutzen
+
+Sie können Portabilitätsprobleme im Hauptteil ihres Codes komplett vermeiden, indem Sie eine Bibliothek für Systemaufrufe schreiben. Erstellen Sie eine Bibliothek für FreeBSD, eine für Linux und weitere für andere Betriebssysteme.
+
+Schreiben Sie in ihrer Bibliothek eine gesonderte Funktion (oder Prozedur, falls Sie die traditionelle Assembler-Terminologie bevorzugen) für jeden Systemaufruf. Verwenden Sie dabei die C-Aufrufkonvention um Parameter zu übergeben, aber verwenden Sie weiterhin `EAX`, für die Aufrufnummer. In diesem Fall kann ihre FreeBSD-Bibliothek sehr einfach sein, da viele scheinbar unterschiedliche Funktionen als Label für denselben Code implementiert sein können:
+
+[.programlisting]
+....
+sys.open:
+sys.close:
+[etc...]
+ int 80h
+ ret
+....
+
+Ihre Linux-Bibliothek wird mehr verschiedene Funktionen benötigen, aber auch hier können Sie Systemaufrufe, welche die Anzahl an Parametern akzeptieren zusammenfassen:
+
+[.programlisting]
+....
+sys.exit:
+sys.close:
+[etc... one-parameter functions]
+ push ebx
+ mov ebx, [esp+12]
+ int 80h
+ pop ebx
+ jmp sys.return
+
+...
+
+sys.return:
+ or eax, eax
+ js sys.err
+ clc
+ ret
+
+sys.err:
+ neg eax
+ stc
+ ret
+....
+
+Der Bibliotheks-Ansatz mag auf den ersten Blick unbequem aussehen, weil Sie eine weitere Datei erzeugen müssen von der Ihr Code abhängt. Aber er hat viele Vorteile: Zum einen müssen Sie die Bibliothek nur einmal schreiben und können sie dann in allen Ihren Programmen verwenden. Sie können sie sogar von anderen Assembler-Programmierern verwenden lassen, oder eine die von jemand anderem geschrieben wurde verwenden. Aber der vielleicht größte Vorteil ist, dass Ihr Code sogar von anderen Programmierer auf andere Systeme portiert werden kann, einfach indem man eine neue Bibliothek schreibt, völlig ohne Änderungen an Ihrem Code.
+
+Falls Ihnen der Gedanke eine Bibliothek zu nutzen nicht gefällt, können Sie zumindest all ihre Systemaufrufe in einer gesonderten Assembler-Datei ablegen und diese mit Ihrem Hauptprogramm zusammen binden. Auch hier müssen alle, die ihr Programm portieren, nur eine neue Objekt-Datei erzeugen und an Ihr Hauptprogramm binden.
+
+[[x86-portable-include]]
+=== Eine Include-Datei verwenden
+
+Wenn Sie ihre Software als (oder mit dem) Quelltext ausliefern, können Sie Makros definieren und in einer getrennten Datei ablegen, die Sie ihrem Code beilegen.
+
+Porter Ihrer Software schreiben dann einfach eine neue Include-Datei. Es ist keine Bibliothek oder eine externe Objekt-Datei nötig und Ihr Code ist portabel, ohne dass man ihn editieren muss.
+
+[NOTE]
+====
+Das ist der Ansatz den wir in diesem Kapitel verwenden werden. Wir werden unsere Include-Datei [.filename]#system.inc# nennen und jedesmal, wenn wir einen neuen Systemaufruf verwenden, den entsprechenden Code dort einfügen.
+====
+
+Wir können unsere [.filename]#system.inc# beginnen indem wir die Standard-Dateideskriptoren deklarieren:
+
+[.programlisting]
+....
+%define stdin 0
+%define stdout 1
+%define stderr 2
+....
+
+Als Nächstes erzeugen wir einen symbolischen Namen für jeden Systemaufruf:
+
+[.programlisting]
+....
+%define SYS_nosys 0
+%define SYS_exit 1
+%define SYS_fork 2
+%define SYS_read 3
+%define SYS_write 4
+; [etc...]
+....
+
+Wir fügen eine kleine, nicht globale Prozedur mit langem Namen ein, damit wir den Namen nicht aus Versehen in unserem Code wiederverwenden:
+
+[.programlisting]
+....
+section .text
+align 4
+access.the.bsd.kernel:
+ int 80h
+ ret
+....
+
+Wir erzeugen ein Makro, das ein Argument erwartet, die Systemaufruf-Nummer:
+
+[.programlisting]
+....
+%macro system 1
+ mov eax, %1
+ call access.the.bsd.kernel
+%endmacro
+....
+
+Letztlich erzeugen wir Makros für jeden Systemaufruf. Diese Argumente erwarten keine Argumente.
+
+[.programlisting]
+....
+%macro sys.exit 0
+ system SYS_exit
+%endmacro
+
+%macro sys.fork 0
+ system SYS_fork
+%endmacro
+
+%macro sys.read 0
+ system SYS_read
+%endmacro
+
+%macro sys.write 0
+ system SYS_write
+%endmacro
+
+; [etc...]
+....
+
+Fahren Sie fort, geben das in Ihren Editor ein und speichern es als [.filename]#system.inc#. Wenn wir Systemaufrufe besprechen, werden wir noch Ergänzungen in dieser Datei vornehmen.
+
+[[x86-first-program]]
+== Unser erstes Programm
+
+Jetzt sind wir bereit für unser erstes Programm, das übliche Hello, World!
+
+[.programlisting]
+....
+ 1: %include 'system.inc'
+ 2:
+ 3: section .data
+ 4: hello db 'Hello, World!', 0Ah
+ 5: hbytes equ $-hello
+ 6:
+ 7: section .text
+ 8: global _start
+ 9: _start:
+10: push dword hbytes
+11: push dword hello
+12: push dword stdout
+13: sys.write
+14:
+15: push dword 0
+16: sys.exit
+....
+
+Hier folgt die Erklärung des Programms: Zeile 1 fügt die Definitionen ein, die Makros und den Code aus [.filename]#system.inc#.
+
+Die Zeilen 3 bis 5 enthalten die Daten: Zeile 3 beginnt den Datenabschnitt/das Datensegment. Zeile 4 enthält die Zeichenkette "Hello, World!", gefolgt von einem Zeilenumbruch ([constant]#0Ah#). Zeile 5 erstellt eine Konstante, die die Länge der Zeichenkette aus Zeile 4 in Bytes enthält.
+
+Die Zeilen 7 bis 16 enthalten den Code. Beachten Sie bitte, dass FreeBSD das Dateiformat _elf_ für diese ausführbare Datei verwendet, bei dem jedes Programm mit dem Label `_start` beginnt (oder, um genau zu sein, wird dies vom Linker erwartet). Diese Label muss global sein.
+
+Die Zeilen 10 bis 13 weisen das System an `hbytes` Bytes der Zeichenkette `hello` nach `stdout` zu schreiben.
+
+Die Zeilen 15 und 16 weisen das System an das Programm mit dem Rückgabewert [constant]#0# zu beenden. Der Systemaufruf `SYS_exit` kehrt niemals zurück, somit endet das Programm hier.
+
+[NOTE]
+====
+Wenn Sie von MS-DOS(R)-Assembler zu UNIX(R) gekommen sind, sind Sie es vielleicht gewohnt direktauf die Video-Hardware zu schreiben. Unter FreeBSD müssen Sie sich darum keine Gedanken machen, ebenso bei jeder anderen Art von UNIX(R). Soweit es Sie betrifft schreiben Sie in eine Datei namens [.filename]#stdout#. Das kann der Bildschirm, oder ein telnet-Terminal, eine wirkliche Datei, oder die Eingabe eines anderen Programms sein. Es liegt beim System herauszufinden, welches davon es tatsächlich ist.
+====
+
+[[x86-assemble-1]]
+=== Den Code assemblieren
+
+Geben Sie den Code (außer den Zeilennummern) in einen Editor ein und speichern Sie ihn in einer Datei namens [.filename]#hello.asm#. Um es zu assemblieren benötigen Sie nasm.
+
+[[x86-get-nasm]]
+==== nasm installieren
+
+Wenn Sie nasm noch nicht installiert haben geben Sie folgendes ein:
+
+[source,bash]
+....
+% su
+Password:your root password
+# cd /usr/ports/devel/nasm
+# make install
+# exit
+%
+....
+
+Sie können auch `make install clean` anstatt `make install` eingeben, wenn Sie den Quelltext von nasm nicht behalten möchten.
+
+Auf jeden Fall wird FreeBSD nasm automatisch aus dem Internet herunterladen, es kompilieren und auf Ihrem System installieren.
+
+[NOTE]
+====
+Wenn es sich bei Ihrem System nicht um FreeBSD handelt, müssen Sie nasm von dessen https://sourceforge.net/projects/nasm[Homepage] herunterladen. Sie können es aber dennoch verwenden um FreeBSD code zu assemblieren.
+====
+
+Nun können Sie den Code assemblieren, binden und ausführen:
+
+[source,bash]
+....
+% nasm -f elf hello.asm
+% ld -s -o hello hello.o
+% ./hello
+Hello, World!
+%
+....
+
+[[x86-unix-filters]]
+== UNIX(R)-Filter schreiben
+
+Ein häufiger Typ von UNIX(R)-Anwendungen ist ein Filter - ein Programm, das Eingaben von [.filename]#stdin# liest, sie verarbeitet und das Ergebnis nach [.filename]#stdout# schreibt.
+
+In diesem Kapitel möchten wir einen einfachen Filter entwickeln und lernen, wie wir von [.filename]#stdin# lesen und nach [.filename]#stdout# schreiben. Dieser Filter soll jedes Byte seiner Eingabe in eine hexadezimale Zahl gefolgt von einem Leerzeichen umwandeln.
+
+[.programlisting]
+....
+%include 'system.inc'
+
+section .data
+hex db '0123456789ABCDEF'
+buffer db 0, 0, ' '
+
+section .text
+global _start
+_start:
+ ; read a byte from stdin
+ push dword 1
+ push dword buffer
+ push dword stdin
+ sys.read
+ add esp, byte 12
+ or eax, eax
+ je .done
+
+ ; convert it to hex
+ movzx eax, byte [buffer]
+ mov edx, eax
+ shr dl, 4
+ mov dl, [hex+edx]
+ mov [buffer], dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ mov [buffer+1], al
+
+ ; print it
+ push dword 3
+ push dword buffer
+ push dword stdout
+ sys.write
+ add esp, byte 12
+ jmp short _start
+
+.done:
+ push dword 0
+ sys.exit
+....
+
+Im Datenabschnitt erzeugen wir ein Array mit Namen `hex`. Es enthält die 16 hexadezimalen Ziffern in aufsteigender Reihenfolge. Diesem Array folgt ein Puffer, den wir sowohl für die Ein- als auch für die Ausgabe verwenden. Die ersten beiden Bytes dieses Puffers werden am Anfang auf [constant]#0# gesetzt. Dorthin schreiben wir die beiden hexadezimalen Ziffern (das erste Byte ist auch die Stelle an die wir die Eingabe lesen). Das dritte Byte ist ein Leerzeichen.
+
+Der Code-Abschnitt besteht aus vier Teilen: Das Byte lesen, es in eine hexadezimale Zahl umwandeln, das Ergebnis schreiben und letztendlich das Programm verlassen.
+
+Um das Byte zu lesen, bitten wir das System ein Byte von [.filename]#stdin# zu lesen und speichern es im ersten Byte von `buffer`. Das System gibt die Anzahl an Bytes, die gelesen wurden, in `EAX` zurück. Diese wird [constant]#1# sein, wenn eine Eingabe empfangen wird und [constant]#0#, wenn keine Eingabedaten mehr verfügbar sind. Deshalb überprüfen wir den Wert von `EAX`. Wenn dieser [constant]#0# ist, springen wir zu `.done`, ansonsten fahren wir fort.
+
+[NOTE]
+====
+Zu Gunsten der Einfachheit ignorieren wir hier die Möglichkeit eines Fehlers.
+====
+
+Die Umwandlungsroutine in eine Hexadezimalzahl liest das Byte aus `buffer` in `EAX`, oder genaugenommen nur in `AL`, wobei die übrigen Bits von `EAX` auf null gesetzt werden. Außerdem kopieren wir das Byte nach `EDX`, da wir die oberen vier Bits (Nibble) getrennt von den unteren vier Bits umwandeln müssen. Das Ergebnis speichern wir in den ersten beiden Bytes des Puffers.
+
+Als Nächstes bitten wir das System die drei Bytes in den Puffer zu schreiben, also die zwei hexadezimalen Ziffern und das Leerzeichen nach [.filename]#stdout#. Danach springen wir wieder an den Anfang des Programms und verarbeiten das nächste Byte.
+
+Wenn die gesamte Eingabe verarbeitet ist, bitten wie das System unser Programm zu beenden und null zurückzuliefern, welches traditionell die Bedeutung hat, dass unser Programm erfolgreich war.
+
+Fahren Sie fort und speichern Sie den Code in eine Datei namens [.filename]#hex.asm#. Geben Sie danach folgendes ein (`^D` bedeutet, dass Sie die Steuerungstaste drücken und dann `D` eingeben, während Sie Steuerung gedrückt halten):
+
+[source,bash]
+....
+% nasm -f elf hex.asm
+% ld -s -o hex hex.o
+% ./hex
+Hello, World!
+48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come!
+48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D %
+....
+
+[NOTE]
+====
+Wenn Sie von MS-DOS(R) zu UNIX(R) wechseln, wundern Sie sich vielleicht, warum jede Zeile mit [constant]#0A# an Stelle von [constant]#0D 0A# endet. Das liegt daran, dass UNIX(R) nicht die CR/LF-Konvention, sondern die "new line"-Konvention verwendet, welches hexadezimal als [constant]#0A# dargestellt wird.
+====
+
+Können wir das Programm verbessern? Nun, einerseits ist es etwas verwirrend, dass die Eingabe, nachdem wir eine Zeile verarbeitet haben, nicht wieder am Anfang der Zeile beginnt. Deshalb können wir unser Programm anpassen um einen Zeilenumbruch an Stelle eines Leerzeichens nach jedem [constant]#0A# auszugeben:
+
+[.programlisting]
+....
+%include 'system.inc'
+
+section .data
+hex db '0123456789ABCDEF'
+buffer db 0, 0, ' '
+
+section .text
+global _start
+_start:
+ mov cl, ' '
+
+.loop:
+ ; read a byte from stdin
+ push dword 1
+ push dword buffer
+ push dword stdin
+ sys.read
+ add esp, byte 12
+ or eax, eax
+ je .done
+
+ ; convert it to hex
+ movzx eax, byte [buffer]
+ mov [buffer+2], cl
+ cmp al, 0Ah
+ jne .hex
+ mov [buffer+2], al
+
+.hex:
+ mov edx, eax
+ shr dl, 4
+ mov dl, [hex+edx]
+ mov [buffer], dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ mov [buffer+1], al
+
+ ; print it
+ push dword 3
+ push dword buffer
+ push dword stdout
+ sys.write
+ add esp, byte 12
+ jmp short .loop
+
+.done:
+ push dword 0
+ sys.exit
+....
+
+Wir haben das Leerzeichen im Register `CL` abgelegt. Das können wir bedenkenlos tun, da UNIX(R)-Systemaufrufe im Gegensatz zu denen von Microsoft(R) Windows(R) keine Werte von Registern ändern in denen sie keine Werte zurückliefern.
+
+Das bedeutet, dass wir `CL` nur einmal setzen müssen. Dafür haben wir ein neues Label `.loop` eingefügt, zu dem wir an Stelle von `_start` springen, um das nächste Byte einzulesen. Außerdem haben wir das Label `.hex` eingefügt, somit können wir wahlweise ein Leerzeichen oder einen Zeilenumbruch im dritten Byte von `buffer` ablegen.
+
+Nachdem Sie [.filename]#hex.asm# entsprechend der Neuerungen geändert haben, geben Sie Folgendes ein:
+
+[source,bash]
+....
+% nasm -f elf hex.asm
+% ld -s -o hex hex.o
+% ./hex
+Hello, World!
+48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
+Here I come!
+48 65 72 65 20 49 20 63 6F 6D 65 21 0A
+^D %
+....
+
+Das sieht doch schon besser aus. Aber der Code ist ziemlich ineffizient! Wir führen für jeden einzelne Byte zweimal einen Systemaufruf aus (einen zum Lesen und einen um es in die Ausgabe zu schreiben).
+
+[[x86-buffered-io]]
+== Gepufferte Eingabe und Ausgabe
+
+Wir können die Effizienz unseres Codes erhöhen, indem wir die Ein- und Ausgabe puffern. Wir erzeugen einen Eingabepuffer und lesen dann eine Folge von Bytes auf einmal. Danach holen wir sie Byte für Byte aus dem Puffer.
+
+Wir erzeugen ebenfalls einen Ausgabepuffer. Darin speichern wir unsere Ausgabe bis er voll ist. Dann bitten wir den Kernel den Inhalt des Puffers nach [.filename]#stdout# zu schreiben.
+
+Diese Programm endet, wenn es keine weitere Eingaben gibt. Aber wir müssen den Kernel immernoch bitten den Inhalt des Ausgabepuffers ein letztes Mal nach [.filename]#stdout# zu schreiben, denn sonst würde ein Teil der Ausgabe zwar im Ausgabepuffer landen, aber niemals ausgegeben werden. Bitte vergessen Sie das nicht, sonst fragen Sie sich später warum ein Teil Ihrer Ausgabe verschwunden ist.
+
+[.programlisting]
+....
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+hex db '0123456789ABCDEF'
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+
+section .text
+global _start
+_start:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ mov edi, obuffer
+
+.loop:
+ ; read a byte from stdin
+ call getchar
+
+ ; convert it to hex
+ mov dl, al
+ shr al, 4
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, ' '
+ cmp dl, 0Ah
+ jne .put
+ mov al, dl
+
+.put:
+ call putchar
+ jmp short .loop
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ ret
+
+read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword stdin
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .done
+ sub eax, eax
+ ret
+
+align 4
+.done:
+ call write ; flush output buffer
+ push dword 0
+ sys.exit
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword stdout
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+ ret
+....
+
+Als dritten Abschnitt im Quelltext haben wir `.bss`. Dieser Abschnitt wird nicht in unsere ausführbare Datei eingebunden und kann daher nicht initialisiert werden. Wir verwenden `resb` anstelle von `db`. Dieses reserviert einfach die angeforderte Menge an uninitialisiertem Speicher zu unserer Verwendung.
+
+Wir nutzen, die Tatsache, dass das System die Register nicht verändert: Wir benutzen Register, wo wir anderenfalls globale Variablen im Abschnitt `.data` verwenden müssten. Das ist auch der Grund, warum die UNIX(R)-Konvention, Parameter auf dem Stack zu übergeben, der von Microsoft, hierfür Register zu verwenden, überlegen ist: Wir können Register für unsere eigenen Zwecke verwenden.
+
+Wir verwenden `EDI` und `ESI` als Zeiger auf das nächste zu lesende oder schreibende Byte. Wir verwenden `EBX` und `ECX`, um die Anzahl der Bytes in den beiden Puffern zu zählen, damit wir wissen, wann wir die Ausgabe an das System übergeben, oder neue Eingabe vom System entgegen nehmen müssen.
+
+Lassen Sie uns sehen, wie es funktioniert:
+
+[source,bash]
+....
+% nasm -f elf hex.asm
+% ld -s -o hex hex.o
+% ./hex
+Hello, World!
+Here I come!
+48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
+48 65 72 65 20 49 20 63 6F 6D 65 21 0A
+^D %
+....
+
+Nicht was Sie erwartet haben? Das Programm hat die Ausgabe nicht auf dem Bildschirm ausgegeben bis sie `^D` gedrückt haben. Das kann man leicht zu beheben indem man drei Zeilen Code einfügt, welche die Ausgabe jedesmal schreiben, wenn wir einen Zeilenumbruch in [constant]#0A# umgewandelt haben. Ich habe die betreffenden Zeilen mit > markiert (kopieren Sie die > bitte nicht mit in Ihre [.filename]#hex.asm#).
+
+[.programlisting]
+....
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+hex db '0123456789ABCDEF'
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+
+section .text
+global _start
+_start:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ mov edi, obuffer
+
+.loop:
+ ; read a byte from stdin
+ call getchar
+
+ ; convert it to hex
+ mov dl, al
+ shr al, 4
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, ' '
+ cmp dl, 0Ah
+ jne .put
+ mov al, dl
+
+.put:
+ call putchar
+> cmp al, 0Ah
+> jne .loop
+> call write
+ jmp short .loop
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ ret
+
+read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword stdin
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .done
+ sub eax, eax
+ ret
+
+align 4
+.done:
+ call write ; flush output buffer
+ push dword 0
+ sys.exit
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword stdout
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+ ret
+....
+
+Lassen Sie uns jetzt einen Blick darauf werfen, wie es funktioniert.
+
+[source,bash]
+....
+% nasm -f elf hex.asm
+% ld -s -o hex hex.o
+% ./hex
+Hello, World!
+48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
+Here I come!
+48 65 72 65 20 49 20 63 6F 6D 65 21 0A
+^D %
+....
+
+Nicht schlecht für eine 644 Byte große Binärdatei, oder?
+
+[NOTE]
+====
+Dieser Ansatz für gepufferte Ein- und Ausgabe enthält eine Gefahr, auf die ich im Abschnitt <<x86-buffered-dark-side,Die dunkle Seite des Buffering>> eingehen werde.
+====
+
+[[x86-ungetc]]
+=== Ein Zeichen ungelesen machen
+
+[WARNING]
+====
+
+Das ist vielleicht ein etwas fortgeschrittenes Thema, das vor allem für Programmierer interessant ist, die mit der Theorie von Compilern vertraut sind. Wenn Sie wollen, können Sie <<x86-command-line,zum nächsten Abschnitt springen>> und das hier vielleicht später lesen.
+====
+
+Unser Beispielprogramm benötigt es zwar nicht, aber etwas anspruchsvollere Filter müssen häufig vorausschauen. Mit anderen Worten, sie müssen wissen was das nächste Zeichen ist (oder sogar mehrere Zeichen). Wenn das nächste Zeichen einen bestimmten Wert hat, ist es Teil des aktuellen Tokens, ansonsten nicht.
+
+Zum Beispiel könnten Sie den Eingabestrom für eine Text-Zeichenfolge parsen (z.B. wenn Sie einen Compiler einer Sprache implementieren): Wenn einem Buchstaben ein anderer Buchstabe oder vielleicht eine Ziffer folgt, ist er ein Teil des Tokens, das Sie verarbeiten. Wenn ihm ein Leerzeichen folgt, oder ein anderer Wert, ist er nicht Teil des aktuellen Tokens.
+
+Das führt uns zu einem interessanten Problem: Wie kann man ein Zeichen zurück in den Eingabestrom geben, damit es später noch einmal gelesen werden kann?
+
+Eine mögliche Lösung ist, das Zeichen in einer Variable zu speichern und ein Flag zu setzen. Wir können `getchar` so anpassen, dass es das Flag überprüft und, wenn es gesetzt ist, das Byte aus der Variable anstatt dem Eingabepuffer liest und das Flag zurück setzt. Aber natürlich macht uns das langsamer.
+
+Die Sprache C hat eine Funktion `ungetc()` für genau diesen Zweck. Gibt es einen schnellen Weg, diese in unserem Code zu implementieren? Ich möchte Sie bitten nach oben zu scrollen und sich die Prozedur `getchar` anzusehen und zu versuchen eine schöne und schnelle Lösung zu finden, bevor Sie den nächsten Absatz lesen. Kommen Sie danach hierher zurück und schauen sich meine Lösung an.
+
+Der Schlüssel dazu ein Zeichen an den Eingabestrom zurückzugeben, liegt darin, wie wir das Zeichen bekommen:
+
+Als erstes überprüfen wir, ob der Puffer leer ist, indem wir den Wert von `EBX` testen. Wenn er null ist, rufen wir die Prozedur `read` auf.
+
+Wenn ein Zeichen bereit ist verwenden wir `lodsb`, dann verringern wir den Wert von `EBX`. Die Anweisung `lodsb` ist letztendlich identisch mit:
+
+[.programlisting]
+....
+ mov al, [esi]
+ inc esi
+....
+
+Das Byte, welches wir abgerufen haben, verbleibt im Puffer bis `read` zum nächsten Mal aufgerufen wird. Wir wissen nicht wann das passiert, aber wir wissen, dass es nicht vor dem nächsten Aufruf von `getchar` passiert. Daher ist alles was wir tun müssen um das Byte in den Strom "zurückzugeben" ist den Wert von `ESI` zu verringern und den von `EBX` zu erhöhen:
+
+[.programlisting]
+....
+ungetc:
+ dec esi
+ inc ebx
+ ret
+....
+
+Aber seien Sie vorsichtig! Wir sind auf der sicheren Seite, solange wir immer nur ein Zeichen im Voraus lesen. Wenn wir mehrere kommende Zeichen betrachten und `ungetc` mehrmals hintereinander aufrufen, wird es meistens funktionieren, aber nicht immer (und es wird ein schwieriger Debug). Warum?
+
+Solange `getchar``read` nicht aufrufen muss, befinden sich alle im Voraus gelesenen Bytes noch im Puffer und `ungetc` arbeitet fehlerfrei. Aber sobald `getchar``read` aufruft verändert sich der Inhalt des Puffers.
+
+Wir können uns immer darauf verlassen, dass `ungetc` auf dem zuletzt mit `getchar` gelesenen Zeichen korrekt arbeitet, aber nicht auf irgendetwas, das davor gelesen wurde.
+
+Wenn Ihr Programm mehr als ein Byte im Voraus lesen soll, haben Sie mindestens zwei Möglichkeiten:
+
+Die einfachste Lösung ist, Ihr Programm so zu ändern, dass es immer nur ein Byte im Voraus liest, wenn das möglich ist.
+
+Wenn Sie diese Möglichkeit nicht haben, bestimmen Sie zuerst die maximale Anzahl an Zeichen, die Ihr Programm auf einmal an den Eingabestrom zurückgeben muss. Erhöhen Sie diesen Wert leicht, nur um sicherzugehen, vorzugsweise auf ein Vielfaches von 16-damit er sich schön ausrichtet. Dann passen Sie den `.bss` Abschnitt Ihres Codes an und erzeugen einen kleinen Reserver-Puffer, direkt vor ihrem Eingabepuffer, in etwa so:
+
+[.programlisting]
+....
+section .bss
+ resb 16 ; or whatever the value you came up with
+ ibuffer resb BUFSIZE
+ obuffer resb BUFSIZE
+....
+
+Außerdem müssen Sie `ungetc` anpassen, sodass es den Wert des Bytes, das zurückgegeben werden soll, in `AL` übergibt:
+
+[.programlisting]
+....
+ungetc:
+ dec esi
+ inc ebx
+ mov [esi], al
+ ret
+....
+
+Mit dieser Änderung können Sie sicher `ungetc` bis zu 17 Mal hintereinander gqapaufrufen (der erste Aufruf erfolgt noch im Puffer, die anderen 16 entweder im Puffer oder in der Reserve).
+
+[[x86-command-line]]
+== Kommandozeilenparameter
+
+Unser hex-Programm wird nützlicher, wenn es die Dateinamen der Ein- und Ausgabedatei über die Kommandozeile einlesen kann, d.h., wenn es Kommandozeilenparameter verarbeiten kann. Aber... Wo sind die?
+
+Bevor ein UNIX(R)-System ein Programm ausführt, legt es einige Daten auf dem Stack ab (`push`) und springt dann an das `_start`-Label des Programms. Ja, ich sagte springen, nicht aufrufen. Das bedeutet, dass auf die Daten zugegriffen werden kann, indem `[esp+offset]` ausgelesen wird oder die Daten einfach vom Stack genommen werden (`pop`).
+
+Der Wert ganz oben auf dem Stack enthält die Zahl der Kommandozeilenparameter. Er wird traditionell `argc` wie "argument count" genannt.
+
+Die Kommandozeilenparameter folgen einander, alle `argc`. Von diesen wird üblicherweise als `argv` wie "argument value(s)" gesprochen. So erhalten wir `argv[0]`, `argv[1]`, `...` und `argv[argc-1]`. Dies sind nicht die eigentlichen Parameter, sondern Zeiger (Pointer) auf diese, d.h., Speicheradressen der tatsächlichen Parameter. Die Parameter selbst sind durch NULL beendete Zeichenketten.
+
+Der `argv`-Liste folgt ein NULL-Zeiger, was einfach eine [constant]#0# ist. Es gibt noch mehr, aber dies ist erst einmal genug für unsere Zwecke.
+
+[NOTE]
+====
+Falls Sie von der MS-DOS(R)-Programmierumgebung kommen, ist der größte Unterschied die Tatsache, dass jeder Parameter eine separate Zeichenkette ist. Der zweite Unterschied ist, dass es praktisch keine Grenze gibt, wie viele Parameter vorhanden sein können.
+====
+
+Ausgerüstet mit diesen Kenntnissen, sind wir beinahe bereit für eine weitere Version von [.filename]#hex.asm#. Zuerst müssen wir jedoch noch ein paar Zeilen zu [.filename]#system.inc# hinzufügen:
+
+Erstens benötigen wir zwei neue Einträge in unserer Liste mit den Systemaufrufnummern:
+
+[.programlisting]
+....
+%define SYS_open 5
+%define SYS_close 6
+....
+
+Zweitens fügen wir zwei neue Makros am Ende der Datei ein:
+
+[.programlisting]
+....
+%macro sys.open 0
+ system SYS_open
+%endmacro
+
+%macro sys.close 0
+ system SYS_close
+%endmacro
+....
+
+Und hier ist schließlich unser veränderter Quelltext:
+
+[.programlisting]
+....
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+fd.in dd stdin
+fd.out dd stdout
+hex db '0123456789ABCDEF'
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+
+section .text
+align 4
+err:
+ push dword 1 ; return failure
+ sys.exit
+
+align 4
+global _start
+_start:
+ add esp, byte 8 ; discard argc and argv[0]
+
+ pop ecx
+ jecxz .init ; no more arguments
+
+ ; ECX contains the path to input file
+ push dword 0 ; O_RDONLY
+ push ecx
+ sys.open
+ jc err ; open failed
+
+ add esp, byte 8
+ mov [fd.in], eax
+
+ pop ecx
+ jecxz .init ; no more arguments
+
+ ; ECX contains the path to output file
+ push dword 420 ; file mode (644 octal)
+ push dword 0200h | 0400h | 01h
+ ; O_CREAT | O_TRUNC | O_WRONLY
+ push ecx
+ sys.open
+ jc err
+
+ add esp, byte 12
+ mov [fd.out], eax
+
+.init:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ mov edi, obuffer
+
+.loop:
+ ; read a byte from input file or stdin
+ call getchar
+
+ ; convert it to hex
+ mov dl, al
+ shr al, 4
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, ' '
+ cmp dl, 0Ah
+ jne .put
+ mov al, dl
+
+.put:
+ call putchar
+ cmp al, dl
+ jne .loop
+ call write
+ jmp short .loop
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ ret
+
+read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword [fd.in]
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .done
+ sub eax, eax
+ ret
+
+align 4
+.done:
+ call write ; flush output buffer
+
+ ; close files
+ push dword [fd.in]
+ sys.close
+
+ push dword [fd.out]
+ sys.close
+
+ ; return success
+ push dword 0
+ sys.exit
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword [fd.out]
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+ ret
+....
+
+In unserem `.data`-Abschnitt befinden sich nun die zwei neuen Variablen `fd.in` und `fd.out`. Hier legen wir die Dateideskriptoren der Ein- und Ausgabedatei ab.
+
+Im `.text`-Abschnitt haben wir die Verweise auf `stdin` und `stdout` durch `[fd.in]` und `[fd.out]` ersetzt.
+
+Der `.text`-Abschnitt beginnt nun mit einer einfachen Fehlerbehandlung, welche nur das Programm mit einem Rückgabewert von [constant]#1# beendet. Die Fehlerbehandlung befindet sich vor `_start`, sodass wir in geringer Entfernung von der Stelle sind, an der der Fehler auftritt.
+
+Selbstverständlich beginnt die Programmausführung immer noch bei `_start`. Zuerst entfernen wir `argc` und `argv[0]` vom Stack: Sie sind für uns nicht von Interesse (sprich, in diesem Programm).
+
+Wir nehmen `argv[1]` vom Stack und legen es in `ECX` ab. Dieses Register ist besonders für Zeiger geeignet, da wir mit `jecxz` NULL-Zeiger verarbeiten können. Falls `argv[1]` nicht NULL ist, versuchen wir, die Datei zu öffnen, die der erste Parameter festlegt. Andernfalls fahren wir mit dem Programm fort wie vorher: Lesen von `stdin` und Schreiben nach `stdout`. Falls wir die Eingabedatei nicht öffnen können (z.B. sie ist nicht vorhanden), springen wir zur Fehlerbehandlung und beenden das Programm.
+
+Falls es keine Probleme gibt, sehen wir nun nach dem zweiten Parameter. Falls er vorhanden ist, öffnen wir die Ausgabedatei. Andernfalls schreiben wir die Ausgabe nach `stdout`. Falls wir die Ausgabedatei nicht öffnen können (z.B. sie ist zwar vorhanden, aber wir haben keine Schreibberechtigung), springen wir auch wieder in die Fehlerbehandlung.
+
+Der Rest des Codes ist derselbe wie vorher, außer dem Schließen der Ein- und Ausgabedatei vor dem Verlassen des Programms und, wie bereits erwähnt, die Benutzung von `[fd.in]` und `[fd.out]`.
+
+Unsere Binärdatei ist nun kolossale 768 Bytes groß.
+
+Können wir das Programm immer noch verbessern? Natürlich! Jedes Programm kann verbessert werden. Hier finden sich einige Ideen, was wir tun könnten:
+
+* Die Fehlerbehandlung eine Warnung auf `stderr` ausgeben lassen.
+* Den `Lese`- und ``Schreib``funkionen eine Fehlerbehandlung hinzufügen.
+* Schließen von `stdin`, sobald wir eine Eingabedatei öffnen, von `stdout`, sobald wir eine Ausgabedatei öffnen.
+* Hinzufügen von Kommandozeilenschaltern wie zum Beispiel [parameter]#-i# und [parameter]#-o#, sodass wir die Ein- und Ausgabedatei in irgendeiner Reihenfolge angeben oder vielleicht von `stdin` lesen und in eine Datei schreiben können.
+* Ausgeben einer Gebrauchsanweisung, falls die Kommandozeilenparameter fehlerhaft sind.
+
+Ich beabsichtige, diese Verbesserungen dem Leser als Übung zu hinterlassen: Sie wissen bereits alles, das Sie wissen müssen, um die Verbesserungen durchzuführen.
+
+[[x86-environment]]
+== Die UNIX(R)-Umgebung
+
+Ein entscheidendes Konzept hinter UNIX(R) ist die Umgebung, die durch _Umgebungsvariablen_ festgelegt wird. Manche werden vom System gesetzt, andere von Ihnen und wieder andere von der shell oder irgendeinem Programm, das ein anderes lädt.
+
+[[x86-find-environment]]
+=== Umgebungsvariablen herausfinden
+
+Ich sagte vorher, dass wenn ein Programm mit der Ausführung beginnt, der Stack `argc` gefolgt vom durch NULL beendeten `argv`-Array und etwas Anderem enthält. Das "etwas Andere" ist die _Umgebung_ oder, um genauer zu sein, ein durch NULL beendetes Array von Zeigern auf _Umgebungsvariablen_. Davon wird oft als `env` gesprochen.
+
+Der Aufbau von `env` entspricht dem von `argv`, eine Liste von Speicheradressen gefolgt von NULL ([constant]#0#). In diesem Fall gibt es kein `"envc"`-wir finden das Ende heraus, indem wir nach dem letzten NULL suchen.
+
+Die Variablen liegen normalerweise in der Form `name=value` vor, aber manchmal kann der `=value`-Teil fehlen. Wir müssen diese Möglichkeit in Betracht ziehen.
+
+[[x86-webvar]]
+=== webvars
+
+Ich könnte Ihnen einfach etwas Code zeigen, der die Umgebung in der Art vom UNIX(R)-Befehl env ausgibt. Aber ich dachte, dass es interessanter sei, ein einfaches CGI-Werkzeug in Assembler zu schreiben.
+
+[[x86-cgi]]
+==== CGI: Ein kurzer Überblick
+
+Ich habe eine http://www.whizkidtech.redprince.net/cgi-bin/tutorial[detaillierte CGI-Anleitung] auf meiner Webseite, aber hier ist ein sehr kurzer Überblick über CGI:
+
+* Der Webserver kommuniziert mit dem CGI-Programm, indem er _Umgebungsvariablen_ setzt.
+* Das CGI-Programm schreibt seine Ausgabe auf [.filename]#stdout#. Der Webserver liest von da.
+* Die Ausgabe muss mit einem HTTP-Kopfteil gefolgt von zwei Leerzeilen beginnen.
+* Das Programm gibt dann den HTML-Code oder was für einen Datentyp es auch immer verarbeitet aus.
+*
+[NOTE]
+====
+Während bestimmte _Umgebungsvariablen_ Standardnamen benutzen, unterscheiden sich andere, abhängig vom Webserver. Dies macht webvars zu einem recht nützlichen Werkzeug.
+====
+
+[[x86-webvars-the-code]]
+==== Der Code
+
+Unser webvars-Programm muss also den HTTP-Kopfteil gefolgt von etwas HTML-Auszeichnung versenden. Dann muss es die _Umgebungsvariablen_ eine nach der anderen auslesen und sie als Teil der HTML-Seite versenden.
+
+Nun der Code. Ich habe Kommentare und Erklärungen direkt in den Code eingefügt:
+
+[.programlisting]
+....
+
+;;;;;;; webvars.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Copyright (c) 2000 G. Adam Stanislav
+; All rights reserved.
+;
+; Redistribution and use in source and binary forms, with or without
+; modification, are permitted provided that the following conditions
+; are met:
+; 1. Redistributions of source code must retain the above copyright
+; notice, this list of conditions and the following disclaimer.
+; 2. Redistributions in binary form must reproduce the above copyright
+; notice, this list of conditions and the following disclaimer in the
+; documentation and/or other materials provided with the distribution.
+;
+; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+; SUCH DAMAGE.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Version 1.0
+;
+; Started: 8-Dec-2000
+; Updated: 8-Dec-2000
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+%include 'system.inc'
+
+section .data
+http db 'Content-type: text/html', 0Ah, 0Ah
+ db '<?xml version="1.0" encoding="utf-8"?>', 0Ah
+ db '<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML Strict//EN" '
+ db '"DTD/xhtml1-strict.dtd">', 0Ah
+ db '<html xmlns="http://www.w3.org/1999/xhtml" '
+ db 'xml.lang="en" lang="en">', 0Ah
+ db '<head>', 0Ah
+ db '<title>Web Environment</title>', 0Ah
+ db '<meta name="author" content="G. Adam Stanislav" />', 0Ah
+ db '</head>', 0Ah, 0Ah
+ db '<body bgcolor="#ffffff" text="#000000" link="#0000ff" '
+ db 'vlink="#840084" alink="#0000ff">', 0Ah
+ db '<div class="webvars">', 0Ah
+ db '<h1>Web Environment</h1>', 0Ah
+ db '<p>The following <b>environment variables</b> are defined '
+ db 'on this web server:</p>', 0Ah, 0Ah
+ db '<table align="center" width="80" border="0" cellpadding="10" '
+ db 'cellspacing="0" class="webvars">', 0Ah
+httplen equ $-http
+left db '<tr>', 0Ah
+ db '<td class="name"><tt>'
+leftlen equ $-left
+middle db '</tt></td>', 0Ah
+ db '<td class="value"><tt><b>'
+midlen equ $-middle
+undef db '<i>(undefined)</i>'
+undeflen equ $-undef
+right db '</b></tt></td>', 0Ah
+ db '</tr>', 0Ah
+rightlen equ $-right
+wrap db '</table>', 0Ah
+ db '</div>', 0Ah
+ db '</body>', 0Ah
+ db '</html>', 0Ah, 0Ah
+wraplen equ $-wrap
+
+section .text
+global _start
+_start:
+ ; First, send out all the http and xhtml stuff that is
+ ; needed before we start showing the environment
+ push dword httplen
+ push dword http
+ push dword stdout
+ sys.write
+
+ ; Now find how far on the stack the environment pointers
+ ; are. We have 12 bytes we have pushed before "argc"
+ mov eax, [esp+12]
+
+ ; We need to remove the following from the stack:
+ ;
+ ; The 12 bytes we pushed for sys.write
+ ; The 4 bytes of argc
+ ; The EAX*4 bytes of argv
+ ; The 4 bytes of the NULL after argv
+ ;
+ ; Total:
+ ; 20 + eax * 4
+ ;
+ ; Because stack grows down, we need to ADD that many bytes
+ ; to ESP.
+ lea esp, [esp+20+eax*4]
+ cld ; This should already be the case, but let's be sure.
+
+ ; Loop through the environment, printing it out
+.loop:
+ pop edi
+ or edi, edi ; Done yet?
+ je near .wrap
+
+ ; Print the left part of HTML
+ push dword leftlen
+ push dword left
+ push dword stdout
+ sys.write
+
+ ; It may be tempting to search for the '=' in the env string next.
+ ; But it is possible there is no '=', so we search for the
+ ; terminating NUL first.
+ mov esi, edi ; Save start of string
+ sub ecx, ecx
+ not ecx ; ECX = FFFFFFFF
+ sub eax, eax
+repne scasb
+ not ecx ; ECX = string length + 1
+ mov ebx, ecx ; Save it in EBX
+
+ ; Now is the time to find '='
+ mov edi, esi ; Start of string
+ mov al, '='
+repne scasb
+ not ecx
+ add ecx, ebx ; Length of name
+
+ push ecx
+ push esi
+ push dword stdout
+ sys.write
+
+ ; Print the middle part of HTML table code
+ push dword midlen
+ push dword middle
+ push dword stdout
+ sys.write
+
+ ; Find the length of the value
+ not ecx
+ lea ebx, [ebx+ecx-1]
+
+ ; Print "undefined" if 0
+ or ebx, ebx
+ jne .value
+
+ mov ebx, undeflen
+ mov edi, undef
+
+.value:
+ push ebx
+ push edi
+ push dword stdout
+ sys.write
+
+ ; Print the right part of the table row
+ push dword rightlen
+ push dword right
+ push dword stdout
+ sys.write
+
+ ; Get rid of the 60 bytes we have pushed
+ add esp, byte 60
+
+ ; Get the next variable
+ jmp .loop
+
+.wrap:
+ ; Print the rest of HTML
+ push dword wraplen
+ push dword wrap
+ push dword stdout
+ sys.write
+
+ ; Return success
+ push dword 0
+ sys.exit
+....
+
+Dieser Code erzeugt eine 1.396-Byte große Binärdatei. Das meiste davon sind Daten, d.h., die HTML-Auszeichnung, die wir versenden müssen.
+
+Assemblieren Sie es wie immer:
+
+[source,bash]
+....
+% nasm -f elf webvars.asm
+% ld -s -o webvars webvars.o
+....
+
+Um es zu benutzen, müssen Sie [.filename]#webvars# auf Ihren Webserver hochladen. Abhängig von Ihrer Webserver-Konfiguration, müssen Sie es vielleicht in einem speziellen [.filename]#cgi-bin#-Verzeichnis ablegen oder es mit einer [.filename]#.cgi#-Dateierweiterung versehen.
+
+Schließlich benötigen Sie Ihren Webbrowser, um sich die Ausgabe anzusehen. Um die Ausgabe auf meinem Webserver zu sehen, gehen Sie bitte auf http://www.int80h.org/webvars/[http://www.int80h.org/webvars/]. Falls Sie neugierig sind, welche zusätzlichen Variablen in einem passwortgeschützten Webverzeichnis vorhanden sind, gehen Sie auf http://www.int80h.org/private/[http://www.int80h.org/private/] unter Benutzung des Benutzernamens `asm` und des Passworts `programmer`.
+
+[[x86-files]]
+== Arbeiten mit Dateien
+
+Wir haben bereits einfache Arbeiten mit Dateien gemacht: Wir wissen wie wir sie öffnen und schliessen, oder wie man sie mit Hilfe von Buffern liest und schreibt. Aber UNIX(R) bietet viel mehr Funktionalität wenn es um Dateien geht. Wir werden einige von ihnen in dieser Sektion untersuchen und dann mit einem netten Datei Konvertierungs Werkzeug abschliessen.
+
+In der Tat, Lasst uns am Ende beginnen, also mit dem Datei Konvertierungs Werkzeug. Es macht Programmieren immer einfacher, wenn wir bereits am Anfang wissen was das End Produkt bezwecken soll.
+
+Eines der ersten Programme die ich für UNIX(R) schrieb war link:ftp://ftp.int80h.org/unix/tuc/[ tuc], ein Text-Zu-UNIX(R) Datei Konvertierer. Es konvertiert eine Text Datei von einem anderen Betriebssystem zu einer UNIX(R) Text Datei. Mit anderen Worten, es ändert die verschiedenen Arten von Zeilen Begrenzungen zu der Zeilen Begrenzungs Konvention von UNIX(R). Es speichert die Ausgabe in einer anderen Datei. Optional konvertiert es eine UNIX(R) Text Datei zu einer DOS Text Datei.
+
+Ich habe tuc sehr oft benutzt, aber nur von irgendeinem anderen OS nach UNIX(R) zu konvertieren, niemals anders herum. Ich habe mir immer gewünscht das die Datei einfach überschrieben wird anstatt das ich die Ausgabe in eine andere Datei senden muss. Meistens, habe ich diesen Befehl verwendet:
+
+[source,bash]
+....
+% tuc myfile tempfile
+% mv tempfile myfile
+....
+
+Es wäre schö ein ftuc zu haben, also, _fast tuc_, und es so zu benutzen:
+
+[source,bash]
+....
+% ftuc myfile
+....
+
+In diesem Kapitel werden wir dann, ftuc in Assembler schreiben (das Original tuc ist in C), und verschiedene Datei-Orientierte Kernel Dienste in dem Prozess studieren.
+
+Auf erste Sicht, ist so eine Datei Konvertierung sehr simpel: Alles was du zu tun hast, ist die Wagenrückläufe zu entfernen, richtig?
+
+Wenn du mit ja geantwortet hast, denk nochmal darüber nach: Dieses Vorgehen wird die meiste Zeit funktionieren (zumindest mit MSDOS Text Dateien), aber gelegentlich fehlschlagen.
+
+Das Problem ist das nicht alle UNIX(R) Text Dateien ihre Zeilen mit einer Wagen Rücklauf / Zeilenvorschub Sequenz beenden. Manche benutzen Wagenrücklauf ohne Zeilenvorschub. Andere kombinieren mehrere leere Zeilen in einen einzigen Wagenrücklauf gefolgt von mehreren Zeilenvorschüben. Und so weiter.
+
+Ein Text Datei Konvertierer muss dann also in der Lage sein mit allen möglichen Zeilenenden umzugehen:
+
+* Wagenrücklauf / Zeilenvorschub
+* Wagenrücklauf
+* Zeilenvorschub / Wagenrücklauf
+* Zeilenvorschub
+
+Es sollte außerdem in der Lage sein mit Dateien umzugehen die irgendeine Art von Kombination der oben stehenden Möglichkeiten verwendet. (z.B., Wagenrücklauf gefolgt von mehreren Zeilenvorschüben).
+
+[[x86-finite-state-machine]]
+=== Endlicher Zustandsautomat
+
+Das Problem wird einfach gelöst in dem man eine Technik benutzt die sich _Endlicher Zustandsautomat_ nennt, ursprünglich wurde sie von den Designern digitaler elektronischer Schaltkreise entwickelt. Eine _Endlicher Zustandsautomat_ ist ein digitaler Schaltkreis dessen Ausgabe nicht nur von der Eingabe abhängig ist sondern auch von der vorherigen Eingabe, d.h., von seinem Status. Der Mikroprozessor ist ein Beispiel für einen _Endlichen Zustandsautomaten_: Unser Assembler Sprach Code wird zu Maschinensprache übersetzt in der manche Assembler Sprach Codes ein einzelnes Byte produzieren, während andere mehrere Bytes produzieren. Da der Microprozessor die Bytes einzeln aus dem Speicher liest, ändern manche nur seinen Status anstatt eine Ausgabe zu produzieren. Wenn alle Bytes eines OP Codes gelesen wurden, produziert der Mikroprozessor eine Ausgabe, oder ändert den Wert eines Registers, etc.
+
+Aus diesem Grund, ist jede Software eigentlich nur eine Sequenz von Status Anweisungen für den Mikroprozessor. Dennoch, ist das Konzept eines _Endlichen Zustandsautomaten_ auch im Software Design sehr hilfreich.
+
+Unser Text Datei Konvertierer kann als _Endlicher Zustandsautomat_ mit 3 möglichen Stati desgined werden. Wir könnten diese von 0-2 benennen, aber es wird uns das Leben leichter machen wenn wir ihnen symbolische Namen geben:
+
+* ordinary
+* cr
+* lf
+
+Unser Programm wird in dem ordinary Status starten. Während dieses Status, hängt die Aktion des Programms von seiner Eingabe wie folgt ab:
+
+* Wenn die Eingabe etwas anderes als ein Wagenrücklauf oder einem Zeilenvorschub ist, wird die Eingabe einfach nur an die Ausgabe geschickt. Der Status bleibt unverändert.
+* Wenn die Eingabe ein Wagenrücklauf ist, wird der Status auf cr gesetzt. Die Eingabe wird dann verworfen, d.h., es entsteht keine Ausgabe.
+* Wenn die Eingabe ein Zeilenvorschub ist, wird der Status auf lf gesetzt. Die Eingabe wird dann verworfen.
+
+Wann immer wir in dem cr Status sind, ist das weil die letzte Eingabe ein Wagenrücklauf war, welcher nicht verarbeitet wurde. Was unsere Software in diesem Status macht hängt von der aktuellen Eingabe ab:
+
+* Wenn die Eingabe irgendetwas anderes als ein Wagenrücklauf oder ein Zeilenvorschub ist, dann gib einen Zeilenvorschub aus, dann gib die Eingabe aus und dann ändere den Status zu ordinary.
+* Wenn die Eingabe ein Wagenrücklauf ist, haben wir zwei (oder mehr) Wagenrückläufe in einer Reihe. Wir verwerfen die Eingabe, wir geben einen Zeilenvorschub aus und lassen den Status unverändert.
+* Wenn die Eingabe ein Zeilenvorschub ist, geben wir den Zeilenvorschub aus und ändern den Status zu ordinary. Achte darauf, dass das nicht das gleiche wie in dem Fall oben drüber ist - würden wir versuchen beide zu kombinieren, würden wir zwei Zeilenvorschübe anstatt einen ausgeben.
+
+Letztendlich, sind wir in dem lf Status nachdem wir einen Zeilenvorschub empfangen haben der nicht nach einem Wagenrücklauf kam. Das wird passieren wenn unsere Datei bereits im UNIX(R) Format ist, oder jedesmal wenn mehrere Zeilen in einer Reihe durch einen einzigen Wagenrücklauf gefolgt von mehreren Zeilenvorschüben ausgedrückt wird, oder wenn die Zeile mit einer Zeilenvorschub / Wagenrücklauf Sequenz endet. Wir sollten mit unserer Eingabe in diesem Status folgendermaßen umgehen:
+
+* Wenn die Eingabe irgendetwas anderes als ein Wagenrücklauf oder ein Zeilenvorschub ist, geben wir einen Zeilenvorschub aus, geben dann die Eingabe aus und ändern dann den Status zu ordinary. Das ist exakt die gleiche Aktion wie in dem cr Status nach dem Empfangen der selben Eingabe.
+* Wenn die Eingabe ein Wagenrücklauf ist, verwerfen wir die Eingabe, geben einen Zeilenvorschub aus und ändern dann den Status zu ordinary.
+* Wenn die Eingabe ein Zeilenvorschub ist, geben wir den Zeilenvorschub aus und lassen den Status unverändert.
+
+[[x86-final-state]]
+==== Der Endgültige Status
+
+Der obige _Endliche Zustandsautomat_ funktioniert für die gesamte Datei, aber lässt die Möglichkeit das die letzte Zeile ignoriert wird. Das wird jedesmal passieren wenn die Datei mit einem einzigen Wagenrücklauf oder einem einzigen Zeilenvorschub endet. Daran habe ich nicht gedacht als ich tuc schrieb, nur um festzustellen, daß das letzte Zeilenende gelegentlich weggelassen wird.
+
+Das Problem wird einfach dadurch gelöst, indem man den Status überprüft nachdem die gesamte Datei verarbeitet wurde. Wenn der Status nicht ordinary ist, müssen wir nur den letzten Zeilenvorschub ausgeben.
+
+[NOTE]
+====
+Nachdem wir unseren Algorithmus nun als einen _Endlichen Zustandsautomaten_ formuliert haben, könnten wir einfach einen festgeschalteten digitalen elektronischen Schaltkreis (einen "Chip") designen, der die Umwandlung für uns übernimmt. Natürlich wäre das sehr viel teurer, als ein Assembler Programm zu schreiben.
+====
+
+[[x86-tuc-counter]]
+==== Der Ausgabe Zähler
+
+Weil unser Datei Konvertierungs Programm möglicherweise zwei Zeichen zu einem kombiniert, müssen wir einen Ausgabe Zähler verwenden. Wir initialisieren den Zähler zu [constant]#0# und erhöhen ihn jedes mal wenn wir ein Zeichen an die Ausgabe schicken. Am Ende des Programms, wird der Zähler uns sagen auf welche Grösse wir die Datei setzen müssen.
+
+[[x86-software-fsm]]
+=== Implementieren von EZ als Software
+
+Der schwerste Teil beim arbeiten mit einer _Endlichen Zustandsmaschine_ ist das analysieren des Problems und dem ausdrücken als eine _Endliche Zustandsmaschine_. That geschafft, schreibt sich die Software fast wie von selbst.
+
+In eine höheren Sprache, wie etwa C, gibt es mehrere Hauptansätze. Einer wäre ein `switch` Angabe zu verwenden die auswählt welche Funktion genutzt werden soll. Zum Beispiel,
+
+[.programlisting]
+....
+
+ switch (state) {
+ default:
+ case REGULAR:
+ regular(inputchar);
+ break;
+ case CR:
+ cr(inputchar);
+ break;
+ case LF:
+ lf(inputchar);
+ break;
+ }
+....
+
+Ein anderer Ansatz ist es ein Array von Funktions Zeigern zu benutzen, etwa wie folgt:
+
+[.programlisting]
+....
+
+ (output[state])(inputchar);
+....
+
+Noch ein anderer ist es aus `state` einen Funktions Zeiger zu machen und ihn zu der entsprechenden Funktion zeigen zu lassen:
+
+[.programlisting]
+....
+
+ (*state)(inputchar);
+....
+
+Das ist der Ansatz den wir in unserem Programm verwenden werden, weil es in Assembler sehr einfach und schnell geht. Wir werden einfach die Adresse der Prozedur in `EBX` speichern und dann einfach das ausgeben:
+
+[.programlisting]
+....
+
+ call ebx
+....
+
+Das ist wahrscheinlich schneller als die Adresse im Code zu hardcoden weil der Mikroprozessor die Adresse nicht aus dem Speicher lesen muss-es ist bereits in einer der Register gespeichert. Ich sagte _wahrscheinlich_ weil durch das Cachen neuerer Mikroprozessoren beide Varianten in etwa gleich schnell sind.
+
+[[memory-mapped-files]]
+=== Speicher abgebildete Dateien
+
+Weil unser Programm nur mit einzelnen Dateien funktioniert, können wir nicht den Ansatz verwedenden der zuvor funktioniert hat, d.h., von einer Eingabe Datei zu lesen und in eine Ausgabe Datei zu schreiben.
+
+UNIX(R) erlaubt es uns eine Datei, oder einen Bereich einer Datei, in den Speicher abzubilden. Um das zu tun, müssen wir zuerst eine Datei mit den entsprechenden Lese/Schreib Flags öffnen. Dann benutzen wir den `mmap` system call um sie in den Speicher abzubilden. Ein Vorteil von `mmap` ist, das es automatisch mit virtuellem Speicher arbeitet: Wir können mehr von der Datei im Speicher abbilden als wir überhaupt physikalischen Speicher zur Verfügung haben, noch immer haben wir aber durch normale OP Codes wie `mov`, `lods`, und `stos` Zugriff darauf. Egal welche Änderungen wir an dem Speicherabbild der Datei vornehmen, sie werden vom System in die Datei geschrieben. Wir müssen die Datei nicht offen lassen: So lange sie abgebildet bleibt, können wir von ihr lesen und in sie schreiben.
+
+Ein 32-bit Intel Mikroprozessor kann auf bis zu vier Gigabyte Speicher zugreifen - physisch oder virtuell. Das FreeBSD System erlaubt es uns bis zu der Hälfte für die Datei Abbildung zu verwenden.
+
+Zur Vereinfachung, werden wir in diesem Tutorial nur Dateien konvertieren die in ihrere Gesamtheit im Speicher abgebildet werden können. Es gibt wahrscheinlich nicht all zu viele Text Dateien die eine Grösse von zwei Gigabyte überschreiben. Falls unser Programm doch auf eine trifft, wird es einfach eine Meldung anzeigen mit dem Vorschlag das originale tuc statt dessen zu verwenden.
+
+Wenn du deine Kopie von [.filename]#syscalls.master# überprüfst, wirst du zwei verschiedene Systemaufrufe finden die sich `mmap` nennen. Das kommt von der Entwicklung von UNIX(R): Es gab das traditionelle BSD``mmap``, Systemaufruf 71. Dieses wurde durch das POSIX(R) `mmap` ersetzt, Systemaufruf 197. Das FreeBSD System unterstützt beide, weil ältere Programme mit der originalen BSD Version geschrieben wurden. Da neue Software die POSIX(R) Version nutzt, werden wir diese auch verwenden.
+
+Die [.filename]#syscalls.master# Datei zeigt die POSIX(R) Version wie folgt:
+
+[.programlisting]
+....
+
+197 STD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \
+ int flags, int fd, long pad, off_t pos); }
+....
+
+Das weicht etwas von dem ab was man:mmap[2] sagt. Das ist weil man:mmap[2] die C Version beschreibt.
+
+Der Unterschiede liegt in dem `long pad` Argument, welches in der C Version nicht vorhanden ist. Wie auch immer, der FreeBSD Systemaufruf fügt einen 32-bit Block ein nachdem es ein 64-Bit Argument auf den Stack ge``push``t hat. In diesem Fall, ist `off_t` ein 64-Bit Wert.
+
+Wenn wir fertig sind mit dem Arbeiten einer im Speicher abgebildeten Datei, entfernen wir das Speicherabbild mit dem `munmap` Systemaufruf:
+
+[TIP]
+====
+
+Für eine detailliert Behandlung von `mmap`, sieh in W. Richard Stevens' http://www.int80h.org/cgi-bin/isbn?isbn=0130810819[ Unix Network Programming, Volume 2, Chapter 12] nach.
+====
+
+[[x86-file-size]]
+=== Feststellen der Datei Grösse
+
+Weil wir `mmap` sagen müssen wie viele Bytes von Datei wir im Speicher abbilden wollen und wir außerdem die gesamte Datei abbilden wollen, müssen wir die Grösse der Datei feststellen.
+
+Wir können den `fstat` Systemaufruf verwenden um alle Informationen über eine geöffnete Datei zu erhalten die uns das System geben kann. Das beinhaltet die Datei Grösse.
+
+Und wieder, zeigt uns [.filename]#syscalls.master# zwei Versionen von `fstat`, eine traditionelle (Systemaufruf 62), und eine POSIX(R) (Systemaufruf 189) Variante. Natürlich, verwenden wir die POSIX(R) Version:
+
+[.programlisting]
+....
+
+189 STD POSIX { int fstat(int fd, struct stat *sb); }
+....
+
+Das ist ein sehr unkomplizierter Aufruf: Wir übergeben ihm die Adresse einer `stat` Structure und den Deskriptor einer geöffneten Datei. Es wird den Inhalt der `stat` Struktur ausfüllen.
+
+Ich muss allerdings sagen, das ich versucht habe die `stat` Struktur in dem `.bss` Bereich zu deklarieren, und `fstat` mochte es nicht: Es setzte das Carry Flag welches einen Fehler anzeigt. Nachdem ich den Code veränderte so dass er die Struktur auf dem Stack anlegt, hat alles gut funktioniert.
+
+[[x86-ftruncate]]
+=== Ändern der Dateigrösse
+
+Dadurch das unser Programm Wagenrücklauf/Zeilenvorschub-Sequenzen in einfache Zeilenvorschübe zusammenfassen könnte, könnte unsere Ausgabe kleiner sein als unsere Eingabe. Und da wir die Ausgabe in dieselbe Datei um, aus der wir unsere Eingabe erhalten, müssen wir eventuell die Dateigrösse anpassen.
+
+Der Systemaufruf `ftruncate` erlaubt uns, dies zu tun. Abgesehen von dem etwas unglücklich gewählten Namen `ftruncate` können wir mit dieser Funktion eine Datei vergrössern, oder verkleinern.
+
+Und ja, wir werden zwei Versionen von `ftruncate` in [.filename]#syscalls.master# finden, eine ältere (130) und eine neuere (201). Wir werden die neuere Version verwenden:
+
+[.programlisting]
+....
+
+201 STD BSD { int ftruncate(int fd, int pad, off_t length); }
+....
+
+Beachten Sie bitte, dass hier wieder `int pad` verwendet wird.
+
+[[x86-ftuc]]
+=== ftuc
+
+Wir wissen jetzt alles nötige, um ftuc zu schreiben. Wir beginnen, indem wir ein paar neue Zeilen der Datei [.filename]#system.inc# hinzufügen. Als erstes definieren wir irgendwo am Anfang der Datei einige Konstanten und Strukturen:
+
+[.programlisting]
+....
+
+;;;;;;; open flags
+%define O_RDONLY 0
+%define O_WRONLY 1
+%define O_RDWR 2
+
+;;;;;;; mmap flags
+%define PROT_NONE 0
+%define PROT_READ 1
+%define PROT_WRITE 2
+%define PROT_EXEC 4
+;;
+%define MAP_SHARED 0001h
+%define MAP_PRIVATE 0002h
+
+;;;;;;; stat structure
+struc stat
+st_dev resd 1 ; = 0
+st_ino resd 1 ; = 4
+st_mode resw 1 ; = 8, size is 16 bits
+st_nlink resw 1 ; = 10, ditto
+st_uid resd 1 ; = 12
+st_gid resd 1 ; = 16
+st_rdev resd 1 ; = 20
+st_atime resd 1 ; = 24
+st_atimensec resd 1 ; = 28
+st_mtime resd 1 ; = 32
+st_mtimensec resd 1 ; = 36
+st_ctime resd 1 ; = 40
+st_ctimensec resd 1 ; = 44
+st_size resd 2 ; = 48, size is 64 bits
+st_blocks resd 2 ; = 56, ditto
+st_blksize resd 1 ; = 64
+st_flags resd 1 ; = 68
+st_gen resd 1 ; = 72
+st_lspare resd 1 ; = 76
+st_qspare resd 4 ; = 80
+endstruc
+....
+
+Wir definieren die neuen Systemaufrufe:
+
+[.programlisting]
+....
+
+%define SYS_mmap 197
+%define SYS_munmap 73
+%define SYS_fstat 189
+%define SYS_ftruncate 201
+....
+
+Wir fügen die Makros hinzu:
+
+[.programlisting]
+....
+
+%macro sys.mmap 0
+ system SYS_mmap
+%endmacro
+
+%macro sys.munmap 0
+ system SYS_munmap
+%endmacro
+
+%macro sys.ftruncate 0
+ system SYS_ftruncate
+%endmacro
+
+%macro sys.fstat 0
+ system SYS_fstat
+%endmacro
+....
+
+Und hier ist unser Code:
+
+[.programlisting]
+....
+
+;;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Started: 21-Dec-2000
+;; Updated: 22-Dec-2000
+;;
+;; Copyright 2000 G. Adam Stanislav.
+;; All rights reserved.
+;;
+;;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+%include 'system.inc'
+
+section .data
+ db 'Copyright 2000 G. Adam Stanislav.', 0Ah
+ db 'All rights reserved.', 0Ah
+usg db 'Usage: ftuc filename', 0Ah
+usglen equ $-usg
+co db "ftuc: Can't open file.", 0Ah
+colen equ $-co
+fae db 'ftuc: File access error.', 0Ah
+faelen equ $-fae
+ftl db 'ftuc: File too long, use regular tuc instead.', 0Ah
+ftllen equ $-ftl
+mae db 'ftuc: Memory allocation error.', 0Ah
+maelen equ $-mae
+
+section .text
+
+align 4
+memerr:
+ push dword maelen
+ push dword mae
+ jmp short error
+
+align 4
+toolong:
+ push dword ftllen
+ push dword ftl
+ jmp short error
+
+align 4
+facerr:
+ push dword faelen
+ push dword fae
+ jmp short error
+
+align 4
+cantopen:
+ push dword colen
+ push dword co
+ jmp short error
+
+align 4
+usage:
+ push dword usglen
+ push dword usg
+
+error:
+ push dword stderr
+ sys.write
+
+ push dword 1
+ sys.exit
+
+align 4
+global _start
+_start:
+ pop eax ; argc
+ pop eax ; program name
+ pop ecx ; file to convert
+ jecxz usage
+
+ pop eax
+ or eax, eax ; Too many arguments?
+ jne usage
+
+ ; Open the file
+ push dword O_RDWR
+ push ecx
+ sys.open
+ jc cantopen
+
+ mov ebp, eax ; Save fd
+
+ sub esp, byte stat_size
+ mov ebx, esp
+
+ ; Find file size
+ push ebx
+ push ebp ; fd
+ sys.fstat
+ jc facerr
+
+ mov edx, [ebx + st_size + 4]
+
+ ; File is too long if EDX != 0 ...
+ or edx, edx
+ jne near toolong
+ mov ecx, [ebx + st_size]
+ ; ... or if it is above 2 GB
+ or ecx, ecx
+ js near toolong
+
+ ; Do nothing if the file is 0 bytes in size
+ jecxz .quit
+
+ ; Map the entire file in memory
+ push edx
+ push edx ; starting at offset 0
+ push edx ; pad
+ push ebp ; fd
+ push dword MAP_SHARED
+ push dword PROT_READ | PROT_WRITE
+ push ecx ; entire file size
+ push edx ; let system decide on the address
+ sys.mmap
+ jc near memerr
+
+ mov edi, eax
+ mov esi, eax
+ push ecx ; for SYS_munmap
+ push edi
+
+ ; Use EBX for state machine
+ mov ebx, ordinary
+ mov ah, 0Ah
+ cld
+
+.loop:
+ lodsb
+ call ebx
+ loop .loop
+
+ cmp ebx, ordinary
+ je .filesize
+
+ ; Output final lf
+ mov al, ah
+ stosb
+ inc edx
+
+.filesize:
+ ; truncate file to new size
+ push dword 0 ; high dword
+ push edx ; low dword
+ push eax ; pad
+ push ebp
+ sys.ftruncate
+
+ ; close it (ebp still pushed)
+ sys.close
+
+ add esp, byte 16
+ sys.munmap
+
+.quit:
+ push dword 0
+ sys.exit
+
+align 4
+ordinary:
+ cmp al, 0Dh
+ je .cr
+
+ cmp al, ah
+ je .lf
+
+ stosb
+ inc edx
+ ret
+
+align 4
+.cr:
+ mov ebx, cr
+ ret
+
+align 4
+.lf:
+ mov ebx, lf
+ ret
+
+align 4
+cr:
+ cmp al, 0Dh
+ je .cr
+
+ cmp al, ah
+ je .lf
+
+ xchg al, ah
+ stosb
+ inc edx
+
+ xchg al, ah
+ ; fall through
+
+.lf:
+ stosb
+ inc edx
+ mov ebx, ordinary
+ ret
+
+align 4
+.cr:
+ mov al, ah
+ stosb
+ inc edx
+ ret
+
+align 4
+lf:
+ cmp al, ah
+ je .lf
+
+ cmp al, 0Dh
+ je .cr
+
+ xchg al, ah
+ stosb
+ inc edx
+
+ xchg al, ah
+ stosb
+ inc edx
+ mov ebx, ordinary
+ ret
+
+align 4
+.cr:
+ mov ebx, ordinary
+ mov al, ah
+ ; fall through
+
+.lf:
+ stosb
+ inc edx
+ ret
+....
+
+[WARNING]
+====
+
+Verwenden Sie dieses Programm nicht mit Dateien, die sich auf Datenträgern befinden, welche mit MS-DOS(R) oder Windows(R) formatiert wurden. Anscheinend gibt es im Code von FreeBSD einen subtilen Bug, wenn `mmap` auf solchen Datenträgern verwendet wird: Wenn die Datei eine bestimmte Grösse überschreitet, füllt `mmap` den Speicher mit lauter Nullen, und überschreibt damit anschliessend den Dateiinhalt.
+====
+
+[[x86-one-pointed-mind]]
+== One-Pointed Mind
+
+Als ein Zen-Schüler liebe ich die Idee eines fokussierten Bewußtseins: Tu nur ein Ding zur gleichen Zeit, aber mache es richtig.
+
+Das ist ziemlich genau die gleiche Idee, welche UNIX(R) richtig funktionieren lässt. Während eine typische Windows(R)-Applikation versucht alles Vorstellbare zu tun (und daher mit Fehler durchsetzt ist), versucht eine UNIX(R)-Applikation nur eine Funktion zu erfüllen und das gut.
+
+Der typische UNIX(R)-Nutzer stellt sich sein eigenes System durch Shell-Skripte zusammen, die er selbst schreibt, und welche die Vorteile bestehender Applikationen dadurch kombinieren, indem sie die Ausgabe eines Programmes als Eingabe in ein anderes Programm durch eine Pipe übergeben.
+
+Wenn Sie ihre eigene UNIX(R)-Software schreiben, ist es generell eine gute Idee zu betrachten, welcher Teil der Problemlösung durch bestehende Programme bewerkstelligt werden kann. Man schreibt nur die Programme selbst, für die keine vorhandene Lösung existiert.
+
+[[x86-csv]]
+=== CSV
+
+Ich will dieses Prinzip an einem besonderen Beispiel aus der realen Welt demonstrieren, mit dem ich kürzlich konfrontiert wurde:
+
+Ich mußte jeweils das elfte Feld von jedem Datensatz aus einer Datenbank extrahieren, die ich von einer Webseite heruntergeladen hatte. Die Datenbank war eine CSV-Datei, d.h. eine Liste von _Komma-getrennten Werten_. Dies ist ein ziemlich gewöhnliches Format für den Code-Austausch zwischen Menschen, die eine unterschiedliche Datenbank-Software nutzen.
+
+Die erste Zeile der Datei enthält eine Liste der Felder durch Kommata getrennt. Der Rest der Datei enthält die einzelnen Datensätze mit durch Kommata getrennten Werten in jeder Zeile.
+
+Ich versuchte awk unter Nutzung des Kommas als Trenner. Da aber einige Zeilen durch in Bindestriche gesetzte Kommata getrennt waren, extrahierte awk das falsche Feld aus diesen Zeilen.
+
+Daher mußte ich meine eigene Software schreiben, um das elfte Feld aus der CSV-Datei auszulesen. Aber durch Anwendung der UNIX(R)-Philosophie mußte ich nur einen einfachen Filter schreiben, das Folgende tat:
+
+* Entferne die erste Zeile aus der Datei.
+* Ändere alle Kommata ohne Anführungszeichen in einen anderen Buchstaben.
+* Entferne alle Anführungszeichen.
+
+Streng genommen könnte ich sed benutzen, um die erste Zeile der Datei zu entfernen, aber das zu Bewerkstelligen war in meinem Programm sehr einfach, also entschloss ich mich dazu und reduzierte dadurch die Größe der Pipeline.
+
+Unter Berücksichtigung aller Faktoren kostete mich das Schreiben dieses Programmes ca. 20 Minuten. Das Schreiben eines Programmes, welches jeweils das elfte Feld aus einer CSV-Datei extrahiert hätte wesentlich länger gedauert und ich hätte es nicht wiederverwenden können, um ein anderes Feld aus irgendeiner anderen Datenbank zu extrahieren.
+
+Diesmal entschied ich mich dazu, etwas mehr Arbeit zu investieren, als man normalerweise für ein typisches Tutorial verwenden würde:
+
+* Es parst die Kommandozeilen nach Optionen.
+* Es zeigt die richtige Nutzung an, falls es ein falsches Argument findet.
+* Es gibt vernünftige Fehlermeldungen aus.
+
+Hier ist ein Beispiel für seine Nutzung:
+
+[source,bash]
+....
+Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]
+....
+
+Alle Parameter sind optional und können in beliebiger Reihenfolge auftauchen.
+
+Der [parameter]#-t#-Parameter legt fest, was zu die Kommata zu ersetzen sind. Der [constant]#tab# ist die Vorgabe hierfür. Zum Beispiel wird [parameter]#-t;# alle unquotierten Kommata mit Semikolon ersetzen.
+
+Ich brauche die [parameter]#-c#-Option nicht, aber sie könnte zukünftig nützlich sein. Sie ermöglicht mir festzulegen, daß ich einen anderen Buchstaben als das Kommata mit etwas anderem ersetzen möchte. Zum Beispiel wird der Parameter [parameter]#-c@# alle @-Zeichen ersetzen (nützlich, falls man eine Liste von Email-Adressen in Nutzername und Domain aufsplitten will).
+
+Die [parameter]#-p#-Option erhält die erste Zeile, d.h. die erste Zeile der Datei wird nicht gelöscht. Als Vorgabe löschen wir die erste Zeile, weil die CSV-Datei in der ersten Zeile keine Daten, sondern Feldbeschreibungen enthält.
+
+Die Parameter [parameter]#-i#- und [parameter]#-o#-Optionen erlauben es mir, die Ausgabe- und Eingabedateien festzulegen. Vorgabe sind [.filename]#stdin# und [.filename]#stdout#, also ist es ein regulärer UNIX(R)-Filter.
+
+Ich habe sichergestellt, daß sowohl [parameter]#-i filename# und [parameter]#-ifilename# akzeptiert werden. Genauso habe ich dafür Sorge getragen, daß sowohl Eingabe- als auch Ausgabedateien festgelegt werden können.
+
+Um das elfte Feld jeden Datensatzes zu erhalten kann ich nun folgendes eingeben:
+
+[source,bash]
+....
+% csv '-t;' data.csv | awk '-F;' '{print $11}'
+....
+
+Der Code speichert die Optionen (bis auf die Dateideskriptoren) in `EDX`: Das Kommata in `DH`, den neuen Feldtrenner in `DL` und das Flag für die [parameter]#-p#-Option in dem höchsten Bit von `EDX`. Ein kurzer Abgleich des Zeichens wird uns also eine schnelle Entscheidung darüber erlauben, was zu tun ist.
+
+Hier ist der Code:
+
+[.programlisting]
+....
+
+;;;;;;; csv.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Convert a comma-separated file to a something-else separated file.
+;
+; Started: 31-May-2001
+; Updated: 1-Jun-2001
+;
+; Copyright (c) 2001 G. Adam Stanislav
+; All rights reserved.
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+fd.in dd stdin
+fd.out dd stdout
+usg db 'Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]', 0Ah
+usglen equ $-usg
+iemsg db "csv: Can't open input file", 0Ah
+iemlen equ $-iemsg
+oemsg db "csv: Can't create output file", 0Ah
+oemlen equ $-oemsg
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+
+section .text
+align 4
+ierr:
+ push dword iemlen
+ push dword iemsg
+ push dword stderr
+ sys.write
+ push dword 1 ; return failure
+ sys.exit
+
+align 4
+oerr:
+ push dword oemlen
+ push dword oemsg
+ push dword stderr
+ sys.write
+ push dword 2
+ sys.exit
+
+align 4
+usage:
+ push dword usglen
+ push dword usg
+ push dword stderr
+ sys.write
+ push dword 3
+ sys.exit
+
+align 4
+global _start
+_start:
+ add esp, byte 8 ; discard argc and argv[0]
+ mov edx, (',' << 8) | 9
+
+.arg:
+ pop ecx
+ or ecx, ecx
+ je near .init ; no more arguments
+
+ ; ECX contains the pointer to an argument
+ cmp byte [ecx], '-'
+ jne usage
+
+ inc ecx
+ mov ax, [ecx]
+
+.o:
+ cmp al, 'o'
+ jne .i
+
+ ; Make sure we are not asked for the output file twice
+ cmp dword [fd.out], stdout
+ jne usage
+
+ ; Find the path to output file - it is either at [ECX+1],
+ ; i.e., -ofile --
+ ; or in the next argument,
+ ; i.e., -o file
+
+ inc ecx
+ or ah, ah
+ jne .openoutput
+ pop ecx
+ jecxz usage
+
+.openoutput:
+ push dword 420 ; file mode (644 octal)
+ push dword 0200h | 0400h | 01h
+ ; O_CREAT | O_TRUNC | O_WRONLY
+ push ecx
+ sys.open
+ jc near oerr
+
+ add esp, byte 12
+ mov [fd.out], eax
+ jmp short .arg
+
+.i:
+ cmp al, 'i'
+ jne .p
+
+ ; Make sure we are not asked twice
+ cmp dword [fd.in], stdin
+ jne near usage
+
+ ; Find the path to the input file
+ inc ecx
+ or ah, ah
+ jne .openinput
+ pop ecx
+ or ecx, ecx
+ je near usage
+
+.openinput:
+ push dword 0 ; O_RDONLY
+ push ecx
+ sys.open
+ jc near ierr ; open failed
+
+ add esp, byte 8
+ mov [fd.in], eax
+ jmp .arg
+
+.p:
+ cmp al, 'p'
+ jne .t
+ or ah, ah
+ jne near usage
+ or edx, 1 << 31
+ jmp .arg
+
+.t:
+ cmp al, 't' ; redefine output delimiter
+ jne .c
+ or ah, ah
+ je near usage
+ mov dl, ah
+ jmp .arg
+
+.c:
+ cmp al, 'c'
+ jne near usage
+ or ah, ah
+ je near usage
+ mov dh, ah
+ jmp .arg
+
+align 4
+.init:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ mov edi, obuffer
+
+ ; See if we are to preserve the first line
+ or edx, edx
+ js .loop
+
+.firstline:
+ ; get rid of the first line
+ call getchar
+ cmp al, 0Ah
+ jne .firstline
+
+.loop:
+ ; read a byte from stdin
+ call getchar
+
+ ; is it a comma (or whatever the user asked for)?
+ cmp al, dh
+ jne .quote
+
+ ; Replace the comma with a tab (or whatever the user wants)
+ mov al, dl
+
+.put:
+ call putchar
+ jmp short .loop
+
+.quote:
+ cmp al, '"'
+ jne .put
+
+ ; Print everything until you get another quote or EOL. If it
+ ; is a quote, skip it. If it is EOL, print it.
+.qloop:
+ call getchar
+ cmp al, '"'
+ je .loop
+
+ cmp al, 0Ah
+ je .put
+
+ call putchar
+ jmp short .qloop
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ ret
+
+read:
+ jecxz .read
+ call write
+
+.read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword [fd.in]
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .done
+ sub eax, eax
+ ret
+
+align 4
+.done:
+ call write ; flush output buffer
+
+ ; close files
+ push dword [fd.in]
+ sys.close
+
+ push dword [fd.out]
+ sys.close
+
+ ; return success
+ push dword 0
+ sys.exit
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ jecxz .ret ; nothing to write
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword [fd.out]
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+.ret:
+ ret
+....
+
+Vieles daraus ist aus [.filename]#hex.asm# entnommen worden. Aber es gibt einen wichtigen Unterschied: Ich rufe nicht länger `write` auf, wann immer ich eine Zeilenvorschub ausgebe. Nun kann der Code sogar interaktiv genutzt werden.
+
+Ich habe eine bessere Lösung gefunden für das Interaktivitätsproblem seit ich mit dem Schreiben dieses Kapitels begonnen habe. Ich wollte sichergehen, daß jede Zeile einzeln ausgegeben werden kann, falls erforderlich. Aber schlussendlich gibt es keinen Bedarf jede Zeile einzeln auszugeben, falls nicht-interaktiv genutzt.
+
+Die neue Lösung besteht darin, die Funktion `write` jedesmal aufzurufen, wenn ich den Eingabepuffer leer vorfinde. Auf diesem Wege liest das Programm im interaktiven Modus eine Zeile aus der Tastatur des Nutzers, verarbeitet sie und stellt fest, ob deren Eingabepuffer leer ist, dann leert es seine Ausgabe und liest die nächste Zeile.
+
+[[x86-buffered-dark-side]]
+==== Die dunkle Seite des Buffering
+
+Diese Änderung verhindert einen mysteriösen Aufhänger in einem speziellen Fall. Ich bezeichne dies als die _dunkle Seite des Buffering_, hauptsächlich, weil es eine nicht offensichtliche Gefahr darstellt.
+
+Es ist unwahrscheinlich, daß dies mit dem csv-Programm oben geschieht aber lassen Sie uns einen weiteren Filter betrachten: Nehmen wir an ihre Eingabe sind rohe Daten, die Farbwerte darstellen, wie z.B. die Intensität eines Pixel mit den Farben _rot_, _grün_ und _blau_. Unsere Ausgabe wird der negative Wert unserer Eingabe sein.
+
+Solch ein Filter würde sehr einfach zu schreiben sein. Der größte Teil davon würde so aussehen wie all die anderen Filter, die wir bisher geschrieben haben, daher beziehe ich mich nur auf den Kern der Prozedur:
+
+[.programlisting]
+....
+.loop:
+ call getchar
+ not al ; Create a negative
+ call putchar
+ jmp short .loop
+....
+
+Da dieser Filter mit rohen Daten arbeitet ist es unwahrscheinlich, daß er interaktiv genutzt werden wird.
+
+Aber das Programm könnte als Bildbearbeitungssoftware tituliert werden. Wenn es nicht `write` vor jedem Aufruf von `read` durchführt, ist die Möglichkeit gegeben, das es sich aufhängt.
+
+Dies könnte passieren:
+
+[.procedure]
+====
+. Der Bildeditor wird unseren Filter laden mittels der C-Funktion `popen()`.
+. Er wird die erste Zeile von Pixeln laden aus einer Bitmap oder Pixmap.
+. Er wird die erste Zeile von Pixeln geschrieben in die _Pipe_, welche zur Variable `fd.in` unseres Filters führt.
+. Unser Filter wird jeden Pixel auslesen von der Eingabe, in in seinen negativen Wert umkehren und ihn in den Ausgabepuffer schreiben.
+. Unser Filter wird die Funktion `getchar` aufrufen, um das nächste Pixel abzurufen.
+. Die Funktion `getchar` wird einen leeren Eingabepuffer vorfinden und daher die Funktion `read` aufrufen.
+. `read` wird den Systemaufruf `SYS_read` starten.
+. Der _Kernel_ wird unseren Filter unterbrechen, bis der Bildeditor mehr Daten zur Pipe sendet.
+. Der Bildedior wird aus der anderen Pipe lesen, welche verbunden ist mit `fd.out` unseres Filters, damit er die erste Zeile des auszugebenden Bildes setzen kann _bevor_ er uns die zweite Zeile der Eingabe einliest.
+. Der _Kernel_ unterbricht den Bildeditor, bis er eine Ausgabe unseres Filters erhält, um ihn an den Bildeditor weiterzureichen.
+====
+
+An diesem Punkt wartet unser Filter auf den Bildeditor, daß er ihm mehr Daten zur Verarbeitung schicken möge. Gleichzeitig wartet der Bildeditor darauf, daß unser Filter das Resultat der Berechnung ersten Zeile sendet. Aber das Ergebnis sitzt in unserem Ausgabepuffer.
+
+Der Filter und der Bildeditor werden fortfahren bis in die Ewigkeit aufeinander zu warten (oder zumindest bis sie per kill entsorgt werden). Unsere Software hat den eine <<secure-race-conditions,Race Condition>> erreicht.
+
+Das Problem tritt nicht auf, wenn unser Filter seinen Ausgabepuffer leert _bevor_ er vom _Kernel_ mehr Eingabedaten anfordert.
+
+[[x86-fpu]]
+== Die FPU verwenden
+
+Seltsamerweise erwähnt die meiste Literatur zu Assemblersprachen nicht einmal die Existenz der FPU, oder _floating point unit_ (Fließkomma-Recheneinheit), geschweige denn, daß auf die Programmierung mit dieser eingegangen wird.
+
+Dabei kann die Assemblerprogrammierung gerade bei hoch optimiertem FPU-Code, der _nur_ mit einer Assemblersprache realisiert werden kann, ihre große Stärke ausspielen.
+
+[[x86-fpu-organization]]
+=== Organisation der FPU
+
+Die FPU besteht aus 8 80-bit Fließkomma-Registern. Diese sind in Form eines Stacks organisiert-Sie können einen Wert durch den Befehl `push` auf dem TOS (_top of stack_) ablegen, oder durch `pop` von diesem holen.
+
+Da also die Befehle `push` und `pop` schon verwendet werden, kann es keine op-Codes in Assemblersprache mit diesen Namen geben.
+
+Sie können mit einen Wert auf dem TOS ablegen, indem Sie `fld`, `fild`, und `fbld` verwenden. Mit weiteren op-Codes lassen sich _Konstanten_-wie z.B. _Pi_-auf dem TOS ablegen.
+
+Analog dazu können Sie einen Wert holen, indem Sie `fst`, `fstp`, `fist`, `fistp`, und `fbstp` verwenden. Eigentlich holen (`pop`) nur die op-Codes, die auf _p_ enden, einen Wert, während die anderen den Wert irgendwo speichern (`store`) ohne ihn vom TOS zu entfernen.
+
+Daten können zwischen dem TOS und dem Hauptspeicher als 32-bit, 64-bit oder 80-bit _real_, oder als 16-bit, 32-bit oder 64-bit _Integer_, oder als 80-bit _packed decimal_ übertragen werden.
+
+Das 80-bit _packed decimal_-Format ist ein Spezialfall des _binary coded decimal_-Formates, welches üblicherweise bei der Konvertierung zwischen der ASCII- und FPU-Darstellung von Daten verwendet wird. Dieses erlaubt die Verwendung von 18 signifikanten Stellen.
+
+Unabhängig davon, wie Daten im Speicher dargestellt werden, speichert die FPU ihre Daten immer im 80-bit _real_-Format in den Registern.
+
+Ihre interne Genauigkeit beträgt mindestens 19 Dezimalstellen. Selbst wenn wir also Ergebnisse im ASCII-Format mit voller 18-stelliger Genauigkeit darstellen lassen, werden immer noch korrekte Werte angezeigt.
+
+Des weiteren können mathematische Operationen auf dem TOS ausgeführt werden: Wir können dessen _Sinus_ berechnen, wir können ihn _skalieren_ (z.B. können wir ihn mit dem Faktor 2 Multiplizieren oder Dividieren), wir können dessen _Logarithmus_ zur Basis 2 nehmen, und viele weitere Dinge.
+
+Wir können auch FPU-Register _multiplizieren_, _dividieren_, _addieren_ und _subtrahieren_, sogar einzelne Register mit sich selbst.
+
+Der offizielle Intel op-Code für den TOS ist `st` und für die _Register_ `st(0)`- `st(7)`. `st` und `st(0)` beziehen sich dabei auf das gleiche Register.
+
+Aus welchen Gründen auch immer hat sich der Originalautor von nasm dafür entschieden, andere op-Codes zu verwenden, nämlich `st0`- `st7`. Mit anderen Worten, es gibt keine Klammern, und der TOS ist immer `st0`, niemals einfach nur `st`.
+
+[[x86-fpu-packed-decimal]]
+==== Das Packed Decimal-Format
+
+Das _packed decimal_-Format verwendet 10 Bytes (80 Bits) zur Darstellung von 18 Ziffern. Die so dargestellte Zahl ist immer ein _Integer_.
+
+[TIP]
+====
+
+Sie können durch Multiplikation des TOS mit Potenzen von 10 die einzelnen Dezimalstellen verschieben.
+====
+
+Das höchste Bit des höchsten Bytes (Byte 9) ist das _Vorzeichenbit_: Wenn es gesetzt ist, ist die Zahl _negativ_, ansonsten _positiv_. Die restlichen Bits dieses Bytes werden nicht verwendet bzw. ignoriert.
+
+Die restlichen 9 Bytes enthalten die 18 Ziffern der gespeicherten Zahl: 2 Ziffern pro Byte.
+
+Die _signifikantere Ziffer_ wird in der _oberen Hälfte_ (4 Bits) eines Bytes gespeichert, die andere in der _unteren Hälfte_.
+
+Vielleicht würden Sie jetzt annehmen, das [constant]#-1234567# auf die folgende Art im Speicher abgelegt wird (in hexadezimaler Notation):
+
+[.programlisting]
+....
+80 00 00 00 00 00 01 23 45 67
+....
+
+Dem ist aber nicht so! Bei Intel werden alle Daten im _little-endian_-Format gespeichert, auch das _packed decimal_-Format.
+
+Dies bedeutet, daß [constant]#-1234567# wie folgt gespeichert wird:
+
+[.programlisting]
+....
+67 45 23 01 00 00 00 00 00 80
+....
+
+Erinnern Sie sich an diesen Umstand, bevor Sie sich aus lauter Verzweiflung die Haare ausreißen.
+
+[NOTE]
+====
+Das lesenswerte Buch-falls Sie es finden können-ist Richard Startz' http://www.int80h.org/cgi-bin/isbn?isbn=013246604X[ 8087/80287/80387 for the IBM PC & Compatibles]. Obwohl es anscheinend die Speicherung der _packed decimal_ im little-endian-Format für gegeben annimmt. Ich mache keine Witze über meine Verzweiflung, als ich den Fehler im unten stehenden Filter gesucht habe, _bevor_ mir einfiel, daß ich einfach mal versuchen sollte, das little-endian-Format, selbst für diesen Typ von Daten, anzuwenden.
+====
+
+[[x86-pinhole-photography]]
+=== Ausflug in die Lochblendenphotographie
+
+Um sinnvolle Programme zu schreiben, müssen wir nicht nur unsere Programmierwerkzeuge beherrschen, sondern auch das Umfeld, für das die Programme gedacht sind.
+
+Unser nächster Filter wird uns dabei helfen, wann immer wir wollen, eine _Lochkamera_ zu bauen. Wir brauchen also etwas Hintergrundwissen über die _Lochblendenphotographie_, bevor wir weiter machen können.
+
+[[x86-camera]]
+==== Die Kamera
+
+Die einfachste Form, eine Kamera zu beschreiben, ist die eines abgeschlossenen, lichtundurchlässigen Raumes, in dessen Abdeckung sich ein kleines Loch befindet.
+
+Die Abdeckung ist normalerweise fest (z.B. eine Schachtel), manchmal jedoch auch flexibel (z.B. ein Balgen). Innerhalb der Kamera ist es sehr dunkel. Nur durch ein kleines Loch kann Licht von einem einzigen Punkt aus in den Raum eindringen (in manchen Fällen sind es mehrere Löcher). Diese Lichtstrahlen kommen von einem Bild, einer Darstellung von dem was sich außerhalb der Kamera, vor dem kleinen Loch, befindet.
+
+Wenn ein lichtempfindliches Material (wie z.B. ein Film) in der Kamera angebracht wird, so kann dieses das Bild einfangen.
+
+Das Loch enthält häufig eine _Linse_, oder etwas linsenartiges, häufig auch einfach _Objektiv_ genannt.
+
+[[x86-the-pinhole]]
+==== Die Lochblende
+
+Streng genommen ist die Linse nicht notwendig: Die ursprünglichen Kameras verwendeten keine Linse, sondern eine _Lochblende_. Selbst heutzutage werden noch _Lochblenden_ verwendet, zum einen, um die Funktionsweise einer Kamera zu erlernen, und zum anderen, um eine spezielle Art von Bildern zu erzeugen.
+
+Das Bild, das von einer _Lochblende_ erzeugt wird, ist überall scharf. Oder unscharf. Es gibt eine ideale Größe für eine Lochblende: Wenn sie größer oder kleiner ist, verliert das Bild seine Schärfe.
+
+[[x86-focal-length]]
+==== Brennweite
+
+Dieser ideale Lochblendendurchmesser ist eine Funktion der Quadratwurzel der _Brennweite_, welche dem Abstand der Lochblende von dem Film entspricht.
+
+[.programlisting]
+....
+ D = PC * sqrt(FL)
+....
+
+Hier ist `D` der ideale Durchmesser der Lochblende, `FL` die Brennweite und [constant]#PC# eine Konstante der Brennweite. Nach Jay Bender hat die Konstante den Wert [constant]#0.04#, nach Kenneth Connors [constant]#0.037#. Andere Leute haben andere Werte vorgeschlagen. Des weiteren gelten diese Werte nur für Tageslicht: Andere Arten von Licht benötigen andere konstante Werte, welche nur durch Experimente bestimmt werden können.
+
+[[x86-f-number]]
+==== Der f-Wert
+
+Der f-Wert ist eine sehr nützliche Größe, die angibt, wieviel Licht den Film erreicht. Ein Belichtungsmesser kann dies messen, um z.B. für einen Film mit einer Empfindlichkeit von f5.6 eine Belichtungsdauer von 1/1000 Sekunden auszurechnen.
+
+Es spielt keine Rolle, ob es eine 35-mm- oder eine 6x9cm-Kamera ist, usw. Solange wir den f-Wert kennen, können wir die benötigte Belichtungszeit berechnen.
+
+Der f-Wert läßt sich einfach wie folgt berechnen:
+
+[.programlisting]
+....
+ F = FL / D
+....
+
+Mit anderen Worten, der f-Wert ergibt sich aus der Brennweite (FL), dividiert durch den Durchmesser (D) der Lochblende. Ein großer f-Wert impliziert also entweder eine kleine Lochblende, oder eine große Brennweite, oder beides. Je größer also der f-Wert ist, um so länger muß die Belichtungszeit sein.
+
+Des weiteren sind der Lochblendendurchmesser und die Brennweite eindimensionale Meßgrößen, während der Film und die Lochblende an sich zweidimensionale Objekte darstellen. Das bedeutet, wenn man für einen f-Wert `A` eine Belichtungsdauer `t` bestimmt hat, dann ergibt sich daraus für einen f-Wert `B` eine Belichtungszeit von:
+
+[.programlisting]
+....
+ t * (B / A)²
+....
+
+[[x86-normalized-f-number]]
+==== Normalisierte f-Werte
+
+Während heutige moderne Kameras den Durchmesser der Lochblende, und damit deren f-Wert, weich und schrittweise verändern können, war dies früher nicht der Fall.
+
+Um unterschiedliche f-Werte einstellen zu können, besaßen Kameras typischerweise eine Metallplatte mit Löchern unterschiedlichen Durchmessers als Lochblende.
+
+Die Durchmesser wurden entsprechend obiger Formel gewählt, daß der resultierende f-Wert ein fester Standardwert war, der für alle Kameras verwendet wurde. Z.B. hat eine sehr alte Kodak Duaflex IV Kamera in meinem Besitz drei solche Löcher für die f-Werte 8, 11 und 16.
+
+Eine neuere Kamera könnte f-Werte wie 2.8, 4, 5.6, 8, 11, 16, 22, und 32 (und weitere) besitzen. Diese Werte wurden nicht zufällig ausgewählt: Sie sind alle vielfache der Quadratwurzel aus 2, wobei manche Werte gerundet wurden.
+
+[[x86-f-stop]]
+==== Der f-Stopp
+
+Eine typische Kamera ist so konzipiert, daß die Nummernscheibe bei den normalisierten f-Werten einrastet. Die Nummernscheibe _stoppt_ an diesen Positionen. Daher werden diese Positionen auch f-Stopps genannt.
+
+Da die f-Werte bei jedem Stopp vielfache der Quadratwurzel aus 2 sind, verdoppelt die Drehung der Nummernscheibe um einen Stopp die für die gleiche Belichtung benötigte Lichtmenge. Eine Drehung um 2 Stopps vervierfacht die benötigte Belichtungszeit. Eine Drehung um 3 Stopps verachtfacht sie, etc.
+
+[[x86-pinhole-software]]
+=== Entwurf der Lochblenden-Software
+
+Wir können jetzt festlegen, was genau unsere Lochblenden-Software tun soll.
+
+[[xpinhole-processing-input]]
+==== Verarbeitung der Programmeingaben
+
+Da der Hauptzweck des Programms darin besteht, uns beim Entwurf einer funktionierenden Lochkamera zu helfen, wird die _Brennweite_ die Programmeingabe sein. Dies ist etwas, das wir ohne zusätzliche Programme feststellen können: Die geeignete Brennweite ergibt sich aus der Größe des Films und der Art des Fotos, ob dieses ein "normales" Bild, ein Weitwinkelbild oder ein Telebild sein soll.
+
+Die meisten bisher geschriebenen Programme arbeiteten mit einzelnen Zeichen, oder Bytes, als Eingabe: Das hex-Programm konvertierte einzelne Bytes in hexadezimale Werte, das csv-Programm ließ entweder einzelne Zeichen unverändert, löschte oder veränderte sie, etc.
+
+Das Programm ftuc verwendete einen Zustandsautomaten, um höchstens zwei gleichzeitig eingegebene Bytes zu verarbeiten.
+
+Das pinhole-Programm dagegen kann nicht nur mit einzelnen Zeichen arbeiten, sondern muß mit größeren syntaktischen Einheiten zurrecht kommen.
+
+Wenn wir z.B. möchten, daß unser Programm den Lochblendendurchmesser (und weitere Werte, die wir später noch diskutieren werden) für die Brennweiten [constant]#100 mm#, [constant]#150 mm# und [constant]#210 mm# berechnet, wollen wir etwa folgendes eingeben:
+
+[source,bash]
+....
+ 100, 150, 210
+....
+
+Unser Programm muß mit der gleichzeitigen Eingabe von mehr als nur einem einzelnen Byte zurecht kommen. Wenn es eine [constant]#1# erkennt, muß es wissen, daß dies die erste Stelle einer dezimalen Zahl ist. Wenn es eine [constant]#0#, gefolgt von einer weiteren [constant]#0# sieht, muß es wissen, daß dies zwei unterschiedliche Stellen mit der gleichen Zahl sind.
+
+Wenn es auf das erste Komma trifft, muß es wissen, daß die folgenden Stellen nicht mehr zur ersten Zahl gehören. Es muß die Stellen der ersten Zahl in den Wert [constant]#100# konvertieren können. Und die Stellen der zweiten Zahl müssen in den Wert [constant]#150# konvertiert werden. Und die Stellen der dritten Zahl müssen in den Wert [constant]#210# konvertiert werden.
+
+Wir müssen festlegen, welche Trennsymbole zulässig sind: Sollen die Eingabewerte durch Kommas voneinander getrennt werden? Wenn ja, wie sollen zwei Zahlen behandelt werden, die durch ein anderes Zeichen getrennt sind?
+
+Ich persönlich mag es einfach. Entweder etwas ist eine Zahl, dann wird es verarbeitet, oder es ist keine Zahl, dann wird es verworfen. Ich mag es nicht, wenn sich der Computer bei der _offensichtlichen_ Eingabe eines zusätzlichen Zeichens beschwert. Duh!
+
+Zusätzlich erlaubt es mir, die Monotonie des Tippens zu durchbrechen, und eine Anfrage anstelle einer simplen Zahl zu stellen:
+
+[source,bash]
+....
+ Was ist der beste Lochblendendurchmesser
+ bei einer Brennweite von 150?
+....
+
+Es gibt keinen Grund dafür, die Ausgabe mehrerer Fehlermeldungen aufzuteilen:
+
+[source,bash]
+....
+Syntax error: Was
+Syntax error: ist
+Syntax error: der
+Syntax error: beste
+....
+
+Et cetera, et cetera, et cetera.
+
+Zweitens mag ich das [constant]###-Zeichen, um Kommentare zu markieren, die ab dem Zeichen bis zum Ende der jeweiligen Zeile gehen. Dies verlangt nicht viel Programmieraufwand, und ermöglicht es mir, Eingabedateien für meine Programme als ausführbare Skripte zu handhaben.
+
+In unserem Fall müssen wir auch entscheiden, in welchen Einheiten die Dateneingabe erfolgen soll: Wir wählen _Millimeter_, da die meisten Photographen die Brennweite in dieser Einheit messen.
+
+Letztendlich müssen wir noch entscheiden, ob wir die Verwendung des dezimalen Punktes erlauben (in diesem Fall müssen wir berücksichtigen, daß in vielen Ländern der Welt das dezimale _Komma_ verwendet wird).
+
+In unserem Fall würde das Zulassen eines dezimalen Punktes/Kommas zu einer fälschlicherweise angenommenen, höheren Genauigkeit führen: Der Unterschied zwischen den Brennweiten [constant]#50# und [constant]#51# ist fast nicht wahrnehmbar. Die Zulassung von Eingaben wie [constant]#50.5# ist also keine gute Idee. Beachten Sie bitte, das dies meine Meinung ist. In diesem Fall bin ich der Autor des Programmes. Bei Ihren eigenen Programmen müssen Sie selbst solche Entscheidungen treffen.
+
+[[x86-pinhole-options]]
+==== Optionen anbieten
+
+Das wichtigste, was wir zum Bau einer Lochkamera wissen müssen, ist der Durchmesser der Lochblende. Da wir scharfe Bilder schießen wollen, werden wir obige Formel für die Berechnung des korrekten Durchmessers zu gegebener Brennweite verwenden. Da Experten mehrere Werte für die [constant]#PC#-Konstante anbieten, müssen wir uns hier für einen Wert entscheiden.
+
+In der Programmierung unter UNIX(R) ist es üblich, zwei Hauptvarianten anzubieten, um Parameter an Programme zu übergeben, und des weiteren eine Standardeinstellung für den Fall zu haben, das der Benutzer gar keine Parameter angibt.
+
+Warum zwei Varianten, Parameter anzugeben?
+
+Ein Grund ist, eine (relativ) _feste_ Einstellung anzubieten, die automatisch bei jedem Programmaufruf verwendet wird, ohne das wir diese Einstellung immer und immer wieder mit angeben müssen.
+
+Die feste Einstellung kann in einer Konfigurationsdatei gespeichert sein, typischerweise im Heimatverzeichnis des Benutzers. Die Datei hat üblicherweise denselben Namen wie das zugehörige Programm, beginnt jedoch mit einem Punkt. Häufig wird _"rc"_ dem Dateinamen hinzugefügt. Unsere Konfigurationsdatei könnte also [.filename]#~/.pinhole# oder [.filename]#~/.pinholerc# heißen. (Die Zeichenfolge [.filename]#~/# steht für das Heimatverzeichnis des aktuellen Benutzers.)
+
+Konfigurationsdateien werden häufig von Programmen verwendet, die viele konfigurierbare Parameter besitzen. Programme, die nur eine (oder wenige) Parameter anbieten, verwenden häufig eine andere Methode: Sie erwarten die Parameter in einer _Umgebungsvariablen_. In unserem Fall könnten wir eine Umgebungsvariable mit dem Namen `PINHOLE` benutzen.
+
+Normalerweise verwendet ein Programm entweder die eine, oder die andere der beiden obigen Methoden. Ansonsten könnte ein Programm verwirrt werden, wenn eine Konfigurationsdatei das eine sagt, die Umgebungsvariable jedoch etwas anderes.
+
+Da wir nur _einen_ Parameter unterstützen müssen, verwenden wir die zweite Methode, und benutzen eine Umgebungsvariable mit dem Namen `PINHOLE`.
+
+Der andere Weg erlaubt uns, _ad hoc_ Entscheidungen zu treffen: _"Obwohl ich normalerweise einen Wert von 0.039 verwende, will ich dieses eine Mal einen Wert von 0.03872 anwenden."_ Mit anderen Worten, dies erlaubt uns, die Standardeinstellung außer Kraft zu setzen.
+
+Diese Art der Auswahl wird häufig über Kommandozeilenparameter gemacht.
+
+Schließlich braucht ein Programm _immer_ eine _Standardeinstellung_. Der Benutzer könnte keine Parameter angeben. Vielleicht weiß er auch gar nicht, was er einstellen sollte. Vielleicht will er es "einfach nur ausprobieren". Vorzugsweise wird die Standardeinstellung eine sein, die die meisten Benutzer sowieso wählen würden. Somit müssen diese keine zusätzlichen Parameter angeben, bzw. können die Standardeinstellung ohne zusätzlichen Aufwand benutzen.
+
+Bei diesem System könnte das Programm widersprüchliche Optionen vorfinden, und auf die folgende Weise reagieren:
+
+[.procedure]
+====
+. Wenn es eine _ad hoc_-Einstellung vorfindet (z.B. ein Kommandozeilenparameter), dann sollte es diese Einstellung annehmen. Es muß alle vorher festgelegten sowie die standardmäßige Einstellung ignorieren.
+. _Andererseits_, wenn es eine festgelegte Option (z.B. eine Umgebungsvariable) vorfindet, dann sollte es diese akzeptieren und die Standardeinstellung ignorieren.
+. _Ansonsten_ sollte es die Standardeinstellung verwenden.
+====
+
+Wir müssen auch entscheiden, welches _Format_ unsere [constant]#PC#-Option haben soll.
+
+Auf den ersten Blick scheint es einleuchtend, das Format `PINHOLE=0.04` für die Umgebungsvariable, und [parameter]#-p0.04# für die Kommandozeile zu verwenden.
+
+Dies zuzulassen wäre eigentlich eine Sicherheitslücke. Die [constant]#PC#-Konstante ist eine sehr kleine Zahl. Daher würden wir unsere Anwendung mit verschiedenen, kleinen Werten für [constant]#PC# testen. Aber was würde passieren, wenn jemand das Programm mit einem sehr großen Wert aufrufen würde?
+
+Es könnte abstürzen, weil wir das Programm nicht für den Umgang mit großen Werten entworfen haben.
+
+Oder wir investieren noch weiter Zeit in das Programm, so daß dieses dann auch mit großen Zahlen umgehen kann. Wir könnten dies machen, wenn wir kommerzielle Software für computertechnisch unerfahrene Benutzer schreiben würden.
+
+Oder wir könnten auch sagen _"Pech gehabt! Der Benutzer sollte es besser wissen."_
+
+Oder wir könnten es für den Benutzer unmöglich machen, große Zahlen einzugeben. Dies ist die Variante, die wir verwenden werden: Wir nehmen einen _impliziten 0._-Präfix an.
+
+Mit anderen Worten, wenn der Benutzer den Wert [constant]#0.04# angeben will, so muß er entweder [parameter]#-p04# als Parameter angeben, oder `PINHOLE=04` als Variable in seiner Umgebung definieren. Falls der Benutzer [parameter]#-p9999999# angibt, so wird dies als [constant]#0.9999999# interpretiert-zwar immer noch sinnlos, aber zumindest sicher.
+
+Zweitens werden viele Benutzer einfach die Konstanten von Bender oder Connors benutzen wollen. Um es diesen Benutzern einfacher zu machen, werden wir [parameter]#-b# als [parameter]#-p04#, und [parameter]#-c# als [parameter]#-p037# interpretieren.
+
+[[x86-pinhole-output]]
+==== Die Ausgabe
+
+Wir müssen festlegen, was und in welchem Format unsere Anwendung Daten ausgeben soll.
+
+Da wir als Eingabe beliebig viele Brennweiten erlauben, macht es Sinn, die Ergebnisse in Form einer traditionellen Datenbank-Ausgabe darzustellen, bei der zeilenweise zu jeder Brennweite der zugehörige berechnete Wert, getrennt durch ein [constant]#tab#-Zeichen, ausgegeben wird.
+
+Optional sollten wir dem Benutzer die Möglichkeit geben, die Ausgabe in dem schon beschriebenen CSV-Format festzulegen. In diesem Fall werden wir zu Beginn der Ausgabe eine Zeile einfügen, in der die Beschreibungen der einzelnen Felder, durch Kommas getrennt, aufgelistet werden, gefolgt von der Ausgabe der Daten wie schon beschrieben, wobei das [constant]#tab#-Zeichen durch ein [constant]#Komma# ersetzt wird.
+
+Wir brauchen eine Kommandozeilenoption für das CSV-Format. Wir können nicht [parameter]#-c# verwenden, da diese Option bereits für _verwende Connors Konstante_ steht. Aus irgendeinem seltsamen Grund bezeichnen viele Webseiten CSV-Dateien als _"Excel Kalkulationstabelle"_ (obwohl das CSV-Format älter ist als Excel). Wir werden daher [parameter]#-e# als Schalter für die Ausgabe im CSV-Format verwenden.
+
+Jede Zeile der Ausgabe wird mit einer Brennweite beginnen. Dies mag auf den ersten Blick überflüssig erscheinen, besonders im interaktiven Modus: Der Benutzer gibt einen Wert für die Brennweite ein, und das Programm wiederholt diesen.
+
+Der Benutzer kann jedoch auch mehrere Brennweiten in einer Zeile angeben. Die Eingabe kann auch aus einer Datei, oder aus der Ausgabe eines anderen Programmes, kommen. In diesen Fällen sieht der Benutzer die Eingabewerte überhaupt nicht.
+
+Ebenso kann die Ausgabe in eine Datei umgelenkt werden, was wir später noch untersuchen werden, oder sie könnte an einen Drucker geschickt werden, oder auch als Eingabe für ein weiteres Programm dienen.
+
+Es macht also wohl Sinn, jede Zeile mit einer durch den Benutzer eingegebenen Brennweite beginnen zu lassen.
+
+Halt! Nicht, wie der Benutzer die Daten eingegeben hat. Was passiert, wenn der Benutzer etwas wie folgt eingibt:
+
+[source,bash]
+....
+ 00000000150
+....
+
+Offensichtlich müssen wir die führenden Nullen vorher abschneiden.
+
+Wir müssen also die Eingabe des Benutzers sorgfältig prüfen, diese dann in der FPU in die binäre Form konvertieren, und dann von dort aus ausgeben.
+
+Aber...
+
+Was ist, wenn der Benutzer etwas wie folgt eingibt:
+
+[source,bash]
+....
+ 17459765723452353453534535353530530534563507309676764423
+....
+
+Ha! Das packed decimal-Format der FPU erlaubt uns die Eingabe einer 18-stelligen Zahl. Aber der Benutzer hat mehr als 18 Stellen eingegeben. Wie gehen wir damit um?
+
+Wir _könnten_ unser Programm so modifizieren, daß es die ersten 18 Stellen liest, der FPU übergibt, dann weitere 18 Stellen liest, den Inhalt des TOS mit einem Vielfachen von 10, entsprechend der Anzahl der zusätzlichen Stellen multipliziert, und dann beide Werte mittels `add` zusammen addiert.
+
+Ja, wir könnten das machen. Aber in _diesem_ Programm wäre es unnötig (in einem anderen wäre es vielleicht der richtige Weg): Selbst der Erdumfang in Millimetern ergibt nur eine Zahl mit 11 Stellen. Offensichtlich können wir keine Kamera dieser Größe bauen (jedenfalls jetzt noch nicht).
+
+Wenn der Benutzer also eine so große Zahl eingibt, ist er entweder gelangweilt, oder er testet uns, oder er versucht, in das System einzudringen, oder er spielt- indem er irgendetwas anderes macht als eine Lochkamera zu entwerfen.
+
+Was werden wir tun?
+
+Wir werden ihn ohrfeigen, gewissermaßen:
+
+[source,bash]
+....
+17459765723452353453534535353530530534563507309676764423 ??? ??? ??? ??? ???
+....
+
+Um dies zu erreichen, werden wir einfach alle führenden Nullen ignorieren. Sobald wir eine Ziffer gefunden haben, die nicht Null ist, initialisieren wir einen Zähler mit [constant]#0# und beginnen mit drei Schritten:
+
+[.procedure]
+====
+. Sende die Ziffer an die Ausgabe.
+. Füge die Ziffer einem Puffer hinzu, welchen wir später benutzen werden, um den packed decimal-Wert zu erzeugen, den wir an die FPU schicken können.
+. Erhöhe den Zähler um eins.
+====
+
+Während wir diese drei Schritte wiederholen, müssen wir auf zwei Bedingungen achten:
+
+* Wenn der Zähler den Wert 18 übersteigt, hören wir auf, Ziffern dem Puffer hinzuzufügen. Wir lesen weiterhin Ziffern und senden sie an die Ausgabe.
+* Wenn, bzw. _falls_, das nächste Eingabezeichen keine Zahl ist, sind wir mit der Bearbeitung der Eingabe erst einmal fertig.
++
+Übrigends können wir einfach Zeichen, die keine Ziffern sind, verwerfen, solange sie kein [constant]###-Zeichen sind, welches wir an den Eingabestrom zurückgeben müssen. Dieses Zeichen markiert den Beginn eines Kommentars. An dieser Stelle muß die Erzeugung der Ausgabe fertig sein, und wir müssen mit der Suche nach weiteren Eingabedaten fortfahren.
+
+Es bleibt immer noch eine Möglichkeit unberücksichtigt: Wenn der Benutzer eine Null (oder mehrere) eingibt, werden wir niemals eine von Null verschiedene Zahl vorfinden.
+
+Wir können solch einen Fall immer anhand des Zählerstandes feststellen, welcher dann immer bei [constant]#0# bleibt. In diesem Fall müssen wir einfach eine [constant]#0# an die Ausgabe senden, und anschließend dem Benutzer erneut eine "Ohrfeige" verpassen:
+
+[source,bash]
+....
+0 ??? ??? ??? ??? ???
+....
+
+Sobald wir die Brennweite ausgegeben, und die Gültigkeit dieser Eingabe verifiziert haben, (größer als [constant]#0# und kleiner als 18 Zahlen) können wir den Durchmesser der Lochblende berechnen.
+
+Es ist kein Zufall, daß _Lochblende_ das Wort _Loch_ enthält. In der Tat ist eine Lochblende buchstäblich eine _Loch Blende_, also eine Blende, in die mit einer Nadel vorsichtig ein kleines Loch gestochen wird.
+
+Daher ist eine typische Lochblende sehr klein. Unsere Formel liefert uns das Ergebnis in Millimetern. Wir werden dieses mit [constant]#1000# multiplizieren, so daß die Ausgabe in [constant]#Mikrometern# erfolgt.
+
+An dieser Stelle müssen wir auf eine weitere Falle achten: _Zu hohe Genauigkeit._
+
+Ja, die FPU wurde für mathematische Berechnungen mit hoher Genauigkeit entworfen. Unsere Berechnungen hier erfordern jedoch keine solche mathematische Genauigkeit. Wir haben es hier mit Physik zu tun (Optik, um genau zu sein).
+
+Angenommen, wir wollten aus eine Lastkraftwagen eine Lochkamera bauen (wir wären dabei nicht die ersten, die das versuchen würden!). Angenommen, die Länge des Laderaumes beträgt [constant]#12# Meter lang, so daß wir eine Brennweite von [constant]#12000# hätten. Verwenden wir Benders Konstante, so erhalten wir durch Multiplizieren von [constant]#0.04# mit der Quadratwurzel aus [constant]#12000# einen Wert von [constant]#4.381780460# Millimetern, oder [constant]#4381.780460# Micrometern.
+
+So oder so ist das Rechenergebnis absurd präzise. Unser Lastkraftwagen ist nicht _genau_[constant]#12000# Millimeter lang. Wir haben diese Länge nicht mit einer so hohen Genauigkeit gemessen, weswegen es falsch wäre zu behaupten, unser Lochblendendurchmesser müsse exakt [constant]#4.381780460# Millimeter sein. Es reicht vollkommen aus, wenn der Durchmesser [constant]#4.4# Millimeter beträgt.
+
+[NOTE]
+====
+Ich habe in obigem Beispiel das Rechenergebnis "nur" auf 10 Stellen genau angegeben. Stellen Sie sich vor, wie absurd es wäre, die vollen uns zur Verfügung stehenden, 18 Stellen anzugeben!
+====
+
+Wir müssen also die Anzahl der signifikanten Stellen beschränken. Eine Möglichkeit wäre, die Mikrometer durch eine ganze Zahl darzustellen. Unser Lastkraftwaren würde dann eine Lochblende mit einem Durchmesser von [constant]#4382# Mikrometern benötigen. Betrachten wir diesen Wert, dann stellen wir fest, das [constant]#4400# Mikrometer, oder [constant]#4.4# Millimeter, immer noch genau genug ist.
+
+Zusätzlich können wir noch, unabhängig von der Größe eines Rechenergebnisses, festlegen, daß wir nur vier signifikante Stellen anzeigen wollen (oder weniger). Leider bietet uns die FPU nicht die Möglichkeit, das Ergebnis automatisch bis auf eine bestimmte Stelle zu runden (sie sieht die Daten ja nicht als Zahlen, sondern als binäre Daten an).
+
+Wir müssen also selber einen Algorithmus entwerfen, um die Anzahl der signifikanten Stellen zu reduzieren.
+
+Hier ist meiner (ich denke er ist peinlich-wenn Ihnen ein besserer Algorithmus einfällt, verraten sie ihn mir _bitte_):
+
+[.procedure]
+====
+. Initialisiere einen Zähler mit [constant]#0#.
+. Solange die Zahl größer oder gleich [constant]#10000# ist, dividiere die Zahl durch [constant]#10#, und erhöhe den Zähler um eins.
+. Gebe das Ergebnis aus.
+. Solange der Zähler größer als [constant]#0# ist, gebe eine [constant]#0# aus, und reduziere den Zähler um eins.
+====
+
+[NOTE]
+====
+Der Wert [constant]#10000# ist nur für den Fall, daß Sie _vier_ signifikante Stellen haben wollen. Für eine andere Anzahl signifikanter Stellen müssen Sie den Wert [constant]#10000# mit [constant]#10#, hoch der Anzahl der gewünschten signifikanten Stellen, ersetzen.
+====
+
+Wir können so den Lochblendendurchmesser, auf vier signifikante Stellen gerundet, ausgeben.
+
+An dieser Stellen kennen wir nun die _Brennweite_ und den _Lochblendendurchmesser_. Wir haben also jetzt genug Informationen, um den _f-Wert_ zu bestimmen.
+
+Wir werden den f-Wert, auf vier signifikante Stellen gerundet, ausgeben. Es könnte passieren, daß diese vier Stellen recht wenig aussagen. Um die Aussagekraft des f-Wertes zu erhöhen, könnten wir den nächstliegenden, _normalisierten f-Wert_ bestimmen, also z.B. das nächstliegende Vielfache der Quadratwurzel aus 2.
+
+Wir erreichen dies, indem wir den aktuellen f-Wert mit sich selbst multiplizieren, so daß wir dessen Quadrat (`square`) erhalten. Anschließend berechnen wir den Logarithmus zur Basis 2 von dieser Zahl. Dies ist sehr viel einfacher, als direkt den Logarithmus zur Basis der Quadratwurzel aus 2 zu berechnen! Wir runden dann das Ergebnis auf die nächstliegende ganze Zahl. Genau genommen können wir mit Hilfe der FPU diese Berechnung beschleunigen: Wir können den op-Code `fscale` verwenden, um eine Zahl um 1 zu "skalieren", was dasselbe ist, wie eine Zahl mittels `shift` um eine Stelle nach links zu verschieben. Am Ende berechnen wir noch die Quadratwurzel aus allem, und erhalten dann den nächstliegenden, normalisierten f-Wert.
+
+Wenn das alles jetzt viel zu kompliziert wirkt-oder viel zu aufwendig-wird es vielleicht klarer, wenn man den Code selber betrachtet. Wir benötigen insgesamt 9 op-Codes:
+
+[.programlisting]
+....
+fmul st0, st0
+ fld1
+ fld st1
+ fyl2x
+ frndint
+ fld1
+ fscale
+ fsqrt
+ fstp st1
+....
+
+Die erste Zeile, `fmul st0, st0`, quadriert den Inhalt des TOS (Top Of Stack, was dasselbe ist wie `st`, von nasm auch `st0` genannt). Die Funktion `fld1` fügt eine [constant]#1# dem TOS hinzu.
+
+Die nächste Zeile, `fld st1`, legt das Quadrat auf dem TOS ab. An diesem Punkt befindet sich das Quadrat sowohl in `st` als auch in `st(2)` (es wird sich gleich zeigen, warum wir eine zweite Kopie auf dem Stack lassen.) `st(1)` enthält die [constant]#1#.
+
+Im nächsten Schritt, `fyl2x`, wird der Logarithmus von `st` zur Basis 2 berechnet, und anschließend mit `st(1)` multipliziert. Deshalb haben wir vorher die [constant]#1# in `st(1)` abgelegt.
+
+An dieser Stelle enthält `st` den gerade berechneten Logarithmus, und `st(1)` das Quadrat des aktuellen f-Wertes, den wir für später gespeichert haben.
+
+`frndint` rundet den TOS zur nächstliegenden ganzen Zahl. `fld1` legt eine [constant]#1# auf dem Stack ab. `fscale` shiftet die [constant]#1# auf dem TOS um `st(1)` Stellen, wodurch im Endeffekt eine 2 in `st(1)` steht.
+
+Schließlich berechnet `fsqrt` die Quadratwurzel des Rechenergebnisses, also des nächstliegenden, normalisierten f-Wertes.
+
+Wir haben nun den nächstliegenden, normalisierten f-Wert auf dem TOS liegen, den auf den Logarithmus zur Basis 2 gerundeten, nächstliegenden ganzzahligen Wert in `st(1)`, und das Quadrat des aktuellen f-Wertes in `st(2)`. Wir speichern den Wert für eine spätere Verwendung in `st(2)`.
+
+Aber wir brauchen den Inhalt von `st(1)` gar nicht mehr. Die letzte Zeile, `fstp st1`, platziert den Inhalt von `st` in `st(1)`, und erniedrigt den Stackpointer um eins. Dadurch ist der Inhalt von `st(1)` jetzt `st`, der Inhalt von `st(2)` jetzt `st(1)` usw. Der neue `st` speichert jetzt den normalisierten f-Wert. Der neue `st(1)` speichert das Quadrat des aktuellen f-Wertes für die Nachwelt.
+
+Jetzt können wir den normalisierten f-Wert ausgeben. Da er normalisiert ist, werden wir ihn nicht auf vier signifikante Stellen runden, sondern stattdessen mit voller Genauigkeit ausgeben.
+
+Der normalisierte f-Wert ist nützlich, solange er so klein ist, daß wir ihn auf einem Photometer wiederfinden können. Ansonsten brauchen wir eine andere Methode, um die benötigten Belichtungsdaten zu bestimmen.
+
+Wir haben weiter oben eine Formel aufgestellt, über die wir einen f-Wert mit Hilfe eines anderen f-Wertes und den zugehörigen Belichtungsdaten bestimmen können.
+
+Jedes Photometer, das ich jemals gesehen habe, konnte die benötigte Belichtungszeit für f5.6 berechnen. Wir werden daher einen _"f5.6 Multiplizierer"_ berechnen, der uns den Faktor angibt, mit dem wir die bei f5.6 gemessene Belichtungszeit für unsere Lochkamera multiplizieren müssen.
+
+Durch die Formel wissen wir, daß dieser Faktor durch Dividieren unseres f-Wertes (der aktuelle Wert, nicht der normalisierte) durch [constant]#5.6# und anschließendes Quadrieren, berechnen können.
+
+Mathematisch äquivalent dazu wäre, wenn wir das Quadrat unseres f-Wertes durch das Quadrat von [constant]#5.6# dividieren würden.
+
+Numerisch betrachtet wollen wir nicht zwei Zahlen quadrieren, wenn es möglich ist, nur eine Zahl zu quadrieren. Daher wirkt die erste Variante auf den ersten Blick besser.
+
+Aber...
+
+[constant]#5.6# ist eine _Konstante_. Wir müssen nicht wertvolle Rechenzeit der FPU verschwenden. Es reicht aus, daß wir die Quadrate der einzelnen f-Werte durch den konstanten Wert [constant]#5.6²# dividieren. Oder wir können den jeweiligen f-Wert durch [constant]#5.6# dividieren, und dann das Ergebnis quadrieren. Zwei Möglichkeiten, die gleich erscheinen.
+
+Aber das sind sie nicht!
+
+Erinnern wir uns an die Grundlagen der Photographie weiter oben, dann wissen wir, daß sich die Konstante [constant]#5.6# aus dem 5-fachen der Quadratwurzel aus 2 ergibt. Eine _irrationale_ Zahl. Das Quadrat dieser Zahl ist _exakt_[constant]#32#.
+
+[constant]#32# ist nicht nur eine ganze Zahl, sondern auch ein Vielfaches von 2. Wir brauchen also gar nicht das Quadrat eines f-Wertes durch [constant]#32# zu teilen. Wir müssen lediglich mittels `fscale` den f-Wert um fünf Stellen nach rechts shiften. Aus Sicht der FPU müssen wir also `fscale` mit `st(1)`, welcher gleich [constant]#-5# ist, auf den f-Wert anwenden. Dies ist _sehr viel schneller_ als die Division.
+
+Jetzt wird es auch klar, warum wir das Quadrat des f-Wertes ganz oben auf dem Stack der FPU gespeichert haben. Die Berechnung des f5.6 Multiplizierers ist die einfachste Berechnung des gesamten Programmes! Wir werden das Ergebnis auf vier signifikante Stellen gerundet ausgeben.
+
+Es gibt noch eine weitere nützliche Zahl, die wir berechnen können: Die Anzahl der Stopps, die unser f-Wert von f5.6 entfernt ist. Dies könnte hilfreich sein, wenn unser f-Wert außerhalb des Meßbereiches unseres Photometers liegt, wir aber eine Blende haben, bei der wir unterschiedliche Geschwindigkeiten einstellen können, und diese Blende Stopps benutzt.
+
+Angenommen, unser f-Wert ist 5 Stopps von f5.6 entfernt, und unser Photometer sagt uns, daß wir eine Belichtungszeit von 1/1000 Sek. einstellen sollen. Dann können wir unsere Blende auf die Geschwindigkeit 1/1000 einstellen, und unsere Skala um 5 Stopps verschieben.
+
+Diese Rechnung ist ebenfalls sehr einfach. Alles, was wir tun müssen, ist, den Logarithmus des f5.6 Multiplizierers, den wir schon berechnet haben (wobei wir dessen Wert vor der Rundung nehmen müssen) zur Basis 2 zu nehmen. Wir runden dann das Ergebnis zur nächsten ganzen Zahl hin, und geben dies aus. Wir müssen uns nicht darum kümmern, ob wir mehr als vier signifikante Stellen haben: Das Ergebnis besteht höchstwahrscheinlich nur aus einer oder zwei Stellen.
+
+[[x86-fpu-optimizations]]
+=== FPU Optimierungen
+
+In Assemblersprache können wir den Code für die FPU besser optimieren, als in einer der Hochsprachen, inklusive C.
+
+Sobald eine C-Funktion die Berechnung einer Fließkommazahl durchführen will, lädt sie erst einmal alle benötigten Variablen und Konstanten in die Register der FPU. Dann werden die Berechnungen durchgeführt, um das korrekte Ergebnis zu erhalten. Gute C-Compiler können diesen Teil des Codes sehr gut optimieren.
+
+Das Ergebnis wird "zurückgegeben", indem dieses auf dem TOS abgelegt wird. Vorher wird aufgeräumt. Sämtliche Variablen und Konstanten, die während der Berechnung verwendet wurden, werden dabei aus der FPU entfernt.
+
+Was wir im vorherigen Abschnitt selber getan haben, kann so nicht durchgeführt werden: Wir haben das Quadrat des f-Wertes berechnet, und das Ergebnis für eine weitere Berechnung mit einer anderen Funktion auf dem Stack behalten.
+
+Wir _wußten_, daß wir diesen Wert später noch einmal brauchen würden. Wir wußten auch, daß auf dem Stack genügend Platz war (welcher nur Platz für 8 Zahlen bietet), um den Wert dort zu speichern.
+
+Ein C-Compiler kann nicht wissen, ob ein Wert auf dem Stack in naher Zukunft noch einmal gebraucht wird.
+
+Natürlich könnte der C-Programmierer dies wissen. Aber die einzige Möglichkeit, die er hat, ist, den Wert im verfügbaren Speicher zu halten.
+
+Das bedeutet zum einen, daß der Wert mit der FPU-internen, 80-stelligen Genauigkeit in einer normalen C-Variable vom Typ _double_ (64 Bit) oder vom Typ _single_ (32 Bit) gespeichert wird.
+
+Dies bedeutet außerdem, daß der Wert aus dem TOS in den Speicher verschoben werden muß, und später wieder zurück. Von allen Operationen mit der FPU ist der Zugriff auf den Speicher die langsamste.
+
+Wann immer also mit der FPU in einer Assemblersprache programmiert wird, sollte nach Möglichkeiten gesucht werden, Zwischenergebnisse auf dem Stack der FPU zu lassen.
+
+Wir können mit dieser Idee noch einen Schritt weiter gehen! In unserem Programm verwenden wir eine _Konstante_ (die wir [constant]#PC# genannt haben).
+
+Es ist unwichtig, wieviele Lochblendendurchmesser wir berechnen: 1, 10, 20, 1000, wir verwenden immer dieselbe Konstante. Daher können wir unser Programm so optimieren, daß diese Konstante immer auf dem Stack belassen wird.
+
+Am Anfang unseres Programmes berechnen wir die oben erwähnte Konstante. Wir müssen die Eingabe für jede Dezimalstelle der Konstanten durch [constant]#10# dividieren.
+
+Multiplizieren geht sehr viel schneller als Dividieren. Wir teilen also zu Beginn unseres Programmes [constant]#1# durch [constant]#10#, um [constant]#0.1# zu erhalten, was wir auf dem Stack speichern: Anstatt daß wir nun für jede einzelne Dezimalstelle die Eingabe wieder durch [constant]#10# teilen, multiplizieren wir sie stattdessen mit [constant]#0.1#.
+
+Auf diese Weise geben wir [constant]#0.1# nicht direkt ein, obwohl wir dies könnten. Dies hat einen Grund: Während [constant]#0.1# durch nur eine einzige Dezimalstelle dargestellt werden kann, wissen wir nicht, wieviele _binäre_ Stellen benötigt werden. Wir überlassen die Berechnung des binären Wertes daher der FPU, mit dessen eigener, hoher Genauigkeit.
+
+Wir verwenden noch weitere Konstanten: Wir multiplizieren den Lochblendendurchmesser mit [constant]#1000#, um den Wert von Millimeter in Micrometer zu konvertieren. Wir vergleichen Werte mit [constant]#10000#, wenn wir diese auf vier signifikante Stellen runden wollen. Wir behalten also beide Konstanten, [constant]#1000# und [constant]#10000#, auf dem Stack. Und selbstverständlich verwenden wir erneut die gespeicherte [constant]#0.1#, um Werte auf vier signifikante Stellen zu runden.
+
+Zu guter letzt behalten wir [constant]#-5# noch auf dem Stack. Wir brauchen diesen Wert, um das Quadrat des f-Wertes zu skalieren, anstatt diesen durch [constant]#32# zu teilen. Es ist kein Zufall, daß wir diese Konstante als letztes laden. Dadurch wird diese Zahl die oberste Konstante auf dem Stack. Wenn später das Quadrat des f-Wertes skaliert werden muß, befindet sich die [constant]#-5# in `st(1)`, also genau da, wo die Funktion `fscale` diesen Wert erwartet.
+
+Es ist üblich, einige Konstanten per Hand zu erzeugen, anstatt sie aus dem Speicher zu laden. Genau das machen wir mit der [constant]#-5#:
+
+[.programlisting]
+....
+
+ fld1 ; TOS = 1
+ fadd st0, st0 ; TOS = 2
+ fadd st0, st0 ; TOS = 4
+ fld1 ; TOS = 1
+ faddp st1, st0 ; TOS = 5
+ fchs ; TOS = -5
+....
+
+Wir können all diese Optimierungen in einer Regel zusammenfassen: _Behalte wiederverwendbare Werte auf dem Stack!_
+
+[TIP]
+====
+
+_PostScript(R)_ ist eine Stack-orientierte Programmiersprache. Es gibt weit mehr Bücher über PostScript(R), als über die Assemblersprache der FPU: Werden Sie in PostScript(R) besser, dann werden Sie auch automatisch in der Programmierung der FPU besser.
+====
+
+[[x86-pinhole-the-code]]
+=== pinhole-Der Code
+
+[.programlisting]
+....
+
+;;;;;;; pinhole.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Find various parameters of a pinhole camera construction and use
+;
+; Started: 9-Jun-2001
+; Updated: 10-Jun-2001
+;
+; Copyright (c) 2001 G. Adam Stanislav
+; All rights reserved.
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+align 4
+ten dd 10
+thousand dd 1000
+tthou dd 10000
+fd.in dd stdin
+fd.out dd stdout
+envar db 'PINHOLE=' ; Exactly 8 bytes, or 2 dwords long
+pinhole db '04,', ; Bender's constant (0.04)
+connors db '037', 0Ah ; Connors' constant
+usg db 'Usage: pinhole [-b] [-c] [-e] [-p <value>] [-o <outfile>] [-i <infile>]', 0Ah
+usglen equ $-usg
+iemsg db "pinhole: Can't open input file", 0Ah
+iemlen equ $-iemsg
+oemsg db "pinhole: Can't create output file", 0Ah
+oemlen equ $-oemsg
+pinmsg db "pinhole: The PINHOLE constant must not be 0", 0Ah
+pinlen equ $-pinmsg
+toobig db "pinhole: The PINHOLE constant may not exceed 18 decimal places", 0Ah
+biglen equ $-toobig
+huhmsg db 9, '???'
+separ db 9, '???'
+sep2 db 9, '???'
+sep3 db 9, '???'
+sep4 db 9, '???', 0Ah
+huhlen equ $-huhmsg
+header db 'focal length in millimeters,pinhole diameter in microns,'
+ db 'F-number,normalized F-number,F-5.6 multiplier,stops '
+ db 'from F-5.6', 0Ah
+headlen equ $-header
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+dbuffer resb 20 ; decimal input buffer
+bbuffer resb 10 ; BCD buffer
+
+section .text
+align 4
+huh:
+ call write
+ push dword huhlen
+ push dword huhmsg
+ push dword [fd.out]
+ sys.write
+ add esp, byte 12
+ ret
+
+align 4
+perr:
+ push dword pinlen
+ push dword pinmsg
+ push dword stderr
+ sys.write
+ push dword 4 ; return failure
+ sys.exit
+
+align 4
+consttoobig:
+ push dword biglen
+ push dword toobig
+ push dword stderr
+ sys.write
+ push dword 5 ; return failure
+ sys.exit
+
+align 4
+ierr:
+ push dword iemlen
+ push dword iemsg
+ push dword stderr
+ sys.write
+ push dword 1 ; return failure
+ sys.exit
+
+align 4
+oerr:
+ push dword oemlen
+ push dword oemsg
+ push dword stderr
+ sys.write
+ push dword 2
+ sys.exit
+
+align 4
+usage:
+ push dword usglen
+ push dword usg
+ push dword stderr
+ sys.write
+ push dword 3
+ sys.exit
+
+align 4
+global _start
+_start:
+ add esp, byte 8 ; discard argc and argv[0]
+ sub esi, esi
+
+.arg:
+ pop ecx
+ or ecx, ecx
+ je near .getenv ; no more arguments
+
+ ; ECX contains the pointer to an argument
+ cmp byte [ecx], '-'
+ jne usage
+
+ inc ecx
+ mov ax, [ecx]
+ inc ecx
+
+.o:
+ cmp al, 'o'
+ jne .i
+
+ ; Make sure we are not asked for the output file twice
+ cmp dword [fd.out], stdout
+ jne usage
+
+ ; Find the path to output file - it is either at [ECX+1],
+ ; i.e., -ofile --
+ ; or in the next argument,
+ ; i.e., -o file
+
+ or ah, ah
+ jne .openoutput
+ pop ecx
+ jecxz usage
+
+.openoutput:
+ push dword 420 ; file mode (644 octal)
+ push dword 0200h | 0400h | 01h
+ ; O_CREAT | O_TRUNC | O_WRONLY
+ push ecx
+ sys.open
+ jc near oerr
+
+ add esp, byte 12
+ mov [fd.out], eax
+ jmp short .arg
+
+.i:
+ cmp al, 'i'
+ jne .p
+
+ ; Make sure we are not asked twice
+ cmp dword [fd.in], stdin
+ jne near usage
+
+ ; Find the path to the input file
+ or ah, ah
+ jne .openinput
+ pop ecx
+ or ecx, ecx
+ je near usage
+
+.openinput:
+ push dword 0 ; O_RDONLY
+ push ecx
+ sys.open
+ jc near ierr ; open failed
+
+ add esp, byte 8
+ mov [fd.in], eax
+ jmp .arg
+
+.p:
+ cmp al, 'p'
+ jne .c
+ or ah, ah
+ jne .pcheck
+
+ pop ecx
+ or ecx, ecx
+ je near usage
+
+ mov ah, [ecx]
+
+.pcheck:
+ cmp ah, '0'
+ jl near usage
+ cmp ah, '9'
+ ja near usage
+ mov esi, ecx
+ jmp .arg
+
+.c:
+ cmp al, 'c'
+ jne .b
+ or ah, ah
+ jne near usage
+ mov esi, connors
+ jmp .arg
+
+.b:
+ cmp al, 'b'
+ jne .e
+ or ah, ah
+ jne near usage
+ mov esi, pinhole
+ jmp .arg
+
+.e:
+ cmp al, 'e'
+ jne near usage
+ or ah, ah
+ jne near usage
+ mov al, ','
+ mov [huhmsg], al
+ mov [separ], al
+ mov [sep2], al
+ mov [sep3], al
+ mov [sep4], al
+ jmp .arg
+
+align 4
+.getenv:
+ ; If ESI = 0, we did not have a -p argument,
+ ; and need to check the environment for "PINHOLE="
+ or esi, esi
+ jne .init
+
+ sub ecx, ecx
+
+.nextenv:
+ pop esi
+ or esi, esi
+ je .default ; no PINHOLE envar found
+
+ ; check if this envar starts with 'PINHOLE='
+ mov edi, envar
+ mov cl, 2 ; 'PINHOLE=' is 2 dwords long
+rep cmpsd
+ jne .nextenv
+
+ ; Check if it is followed by a digit
+ mov al, [esi]
+ cmp al, '0'
+ jl .default
+ cmp al, '9'
+ jbe .init
+ ; fall through
+
+align 4
+.default:
+ ; We got here because we had no -p argument,
+ ; and did not find the PINHOLE envar.
+ mov esi, pinhole
+ ; fall through
+
+align 4
+.init:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ sub edx, edx
+ mov edi, dbuffer+1
+ mov byte [dbuffer], '0'
+
+ ; Convert the pinhole constant to real
+.constloop:
+ lodsb
+ cmp al, '9'
+ ja .setconst
+ cmp al, '0'
+ je .processconst
+ jb .setconst
+
+ inc dl
+
+.processconst:
+ inc cl
+ cmp cl, 18
+ ja near consttoobig
+ stosb
+ jmp short .constloop
+
+align 4
+.setconst:
+ or dl, dl
+ je near perr
+
+ finit
+ fild dword [tthou]
+
+ fld1
+ fild dword [ten]
+ fdivp st1, st0
+
+ fild dword [thousand]
+ mov edi, obuffer
+
+ mov ebp, ecx
+ call bcdload
+
+.constdiv:
+ fmul st0, st2
+ loop .constdiv
+
+ fld1
+ fadd st0, st0
+ fadd st0, st0
+ fld1
+ faddp st1, st0
+ fchs
+
+ ; If we are creating a CSV file,
+ ; print header
+ cmp byte [separ], ','
+ jne .bigloop
+
+ push dword headlen
+ push dword header
+ push dword [fd.out]
+ sys.write
+
+.bigloop:
+ call getchar
+ jc near done
+
+ ; Skip to the end of the line if you got '#'
+ cmp al, '#'
+ jne .num
+ call skiptoeol
+ jmp short .bigloop
+
+.num:
+ ; See if you got a number
+ cmp al, '0'
+ jl .bigloop
+ cmp al, '9'
+ ja .bigloop
+
+ ; Yes, we have a number
+ sub ebp, ebp
+ sub edx, edx
+
+.number:
+ cmp al, '0'
+ je .number0
+ mov dl, 1
+
+.number0:
+ or dl, dl ; Skip leading 0's
+ je .nextnumber
+ push eax
+ call putchar
+ pop eax
+ inc ebp
+ cmp ebp, 19
+ jae .nextnumber
+ mov [dbuffer+ebp], al
+
+.nextnumber:
+ call getchar
+ jc .work
+ cmp al, '#'
+ je .ungetc
+ cmp al, '0'
+ jl .work
+ cmp al, '9'
+ ja .work
+ jmp short .number
+
+.ungetc:
+ dec esi
+ inc ebx
+
+.work:
+ ; Now, do all the work
+ or dl, dl
+ je near .work0
+
+ cmp ebp, 19
+ jae near .toobig
+
+ call bcdload
+
+ ; Calculate pinhole diameter
+
+ fld st0 ; save it
+ fsqrt
+ fmul st0, st3
+ fld st0
+ fmul st5
+ sub ebp, ebp
+
+ ; Round off to 4 significant digits
+.diameter:
+ fcom st0, st7
+ fstsw ax
+ sahf
+ jb .printdiameter
+ fmul st0, st6
+ inc ebp
+ jmp short .diameter
+
+.printdiameter:
+ call printnumber ; pinhole diameter
+
+ ; Calculate F-number
+
+ fdivp st1, st0
+ fld st0
+
+ sub ebp, ebp
+
+.fnumber:
+ fcom st0, st6
+ fstsw ax
+ sahf
+ jb .printfnumber
+ fmul st0, st5
+ inc ebp
+ jmp short .fnumber
+
+.printfnumber:
+ call printnumber ; F number
+
+ ; Calculate normalized F-number
+ fmul st0, st0
+ fld1
+ fld st1
+ fyl2x
+ frndint
+ fld1
+ fscale
+ fsqrt
+ fstp st1
+
+ sub ebp, ebp
+ call printnumber
+
+ ; Calculate time multiplier from F-5.6
+
+ fscale
+ fld st0
+
+ ; Round off to 4 significant digits
+.fmul:
+ fcom st0, st6
+ fstsw ax
+ sahf
+
+ jb .printfmul
+ inc ebp
+ fmul st0, st5
+ jmp short .fmul
+
+.printfmul:
+ call printnumber ; F multiplier
+
+ ; Calculate F-stops from 5.6
+
+ fld1
+ fxch st1
+ fyl2x
+
+ sub ebp, ebp
+ call printnumber
+
+ mov al, 0Ah
+ call putchar
+ jmp .bigloop
+
+.work0:
+ mov al, '0'
+ call putchar
+
+align 4
+.toobig:
+ call huh
+ jmp .bigloop
+
+align 4
+done:
+ call write ; flush output buffer
+
+ ; close files
+ push dword [fd.in]
+ sys.close
+
+ push dword [fd.out]
+ sys.close
+
+ finit
+
+ ; return success
+ push dword 0
+ sys.exit
+
+align 4
+skiptoeol:
+ ; Keep reading until you come to cr, lf, or eof
+ call getchar
+ jc done
+ cmp al, 0Ah
+ jne .cr
+ ret
+
+.cr:
+ cmp al, 0Dh
+ jne skiptoeol
+ ret
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ clc
+ ret
+
+read:
+ jecxz .read
+ call write
+
+.read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword [fd.in]
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .empty
+ sub eax, eax
+ ret
+
+align 4
+.empty:
+ add esp, byte 4
+ stc
+ ret
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ jecxz .ret ; nothing to write
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword [fd.out]
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+.ret:
+ ret
+
+align 4
+bcdload:
+ ; EBP contains the number of chars in dbuffer
+ push ecx
+ push esi
+ push edi
+
+ lea ecx, [ebp+1]
+ lea esi, [dbuffer+ebp-1]
+ shr ecx, 1
+
+ std
+
+ mov edi, bbuffer
+ sub eax, eax
+ mov [edi], eax
+ mov [edi+4], eax
+ mov [edi+2], ax
+
+.loop:
+ lodsw
+ sub ax, 3030h
+ shl al, 4
+ or al, ah
+ mov [edi], al
+ inc edi
+ loop .loop
+
+ fbld [bbuffer]
+
+ cld
+ pop edi
+ pop esi
+ pop ecx
+ sub eax, eax
+ ret
+
+align 4
+printnumber:
+ push ebp
+ mov al, [separ]
+ call putchar
+
+ ; Print the integer at the TOS
+ mov ebp, bbuffer+9
+ fbstp [bbuffer]
+
+ ; Check the sign
+ mov al, [ebp]
+ dec ebp
+ or al, al
+ jns .leading
+
+ ; We got a negative number (should never happen)
+ mov al, '-'
+ call putchar
+
+.leading:
+ ; Skip leading zeros
+ mov al, [ebp]
+ dec ebp
+ or al, al
+ jne .first
+ cmp ebp, bbuffer
+ jae .leading
+
+ ; We are here because the result was 0.
+ ; Print '0' and return
+ mov al, '0'
+ jmp putchar
+
+.first:
+ ; We have found the first non-zero.
+ ; But it is still packed
+ test al, 0F0h
+ jz .second
+ push eax
+ shr al, 4
+ add al, '0'
+ call putchar
+ pop eax
+ and al, 0Fh
+
+.second:
+ add al, '0'
+ call putchar
+
+.next:
+ cmp ebp, bbuffer
+ jb .done
+
+ mov al, [ebp]
+ push eax
+ shr al, 4
+ add al, '0'
+ call putchar
+ pop eax
+ and al, 0Fh
+ add al, '0'
+ call putchar
+
+ dec ebp
+ jmp short .next
+
+.done:
+ pop ebp
+ or ebp, ebp
+ je .ret
+
+.zeros:
+ mov al, '0'
+ call putchar
+ dec ebp
+ jne .zeros
+
+.ret:
+ ret
+....
+
+Der Code folgt demselben Aufbau wie alle anderen Filter, die wir bisher gesehen haben, bis auf eine Kleinigkeit:
+
+Wir nehmen nun nicht mehr an, daß das Ende der Eingabe auch das Ende der nötigen Arbeit bedeutet, etwas, das wir für _zeichenbasierte_ Filter automatisch angenommen haben.
+
+Dieser Filter verarbeitet keine Zeichen. Er verarbeitet eine _Sprache_ (obgleich eine sehr einfache, die nur aus Zahlen besteht).
+
+Wenn keine weiteren Eingaben vorliegen, kann das zwei Ursachen haben:
+
+* Wir sind fertig und können aufhören. Dies ist dasselbe wie vorher.
+* Das Zeichen, das wir eingelesen haben, war eine Zahl. Wir haben diese am Ende unseres ASCII -zu-float Kovertierungspuffers gespeichert. Wir müssen nun den gesamten Pufferinhalt in eine Zahl konvertieren, und die letzte Zeile unserer Ausgabe ausgeben.
+
+Aus diesem Grund haben wir unsere `getchar`- und ``read``-Routinen so angepaßt, daß sie das `carry flag` _clear_ immer dann zurückgeben, wenn wir ein weiteres Zeichen aus der Eingabe lesen, und das `carry flag` _set_ immer dann zurückgeben, wenn es keine weiteren Eingabedaten gibt.
+
+Selbstverständlich verwenden wir auch hier die Magie der Assemblersprache! Schauen Sie sich `getchar` näher an. Dieses gibt _immer_ das `carry flag` _clear_ zurück.
+
+Dennoch basiert der Hauptteil unseres Programmes auf dem `carry flag`, um diesem eine Beendigung mitzuteilen-und es funktioniert.
+
+Die Magie passiert in `read`. Wann immer weitere Eingaben durch das System zur Verfügung stehen, ruft diese Funktion `getchar` auf, welche ein weiteres Zeichen aus dem Eingabepuffer einliest, und anschließend das `carry flag` __clear__t.
+
+Wenn aber `read` keine weiteren Eingaben von dem System bekommt, ruft dieses _nicht_ `getchar` auf. Stattdessen addiert der op-Code `add esp, byte 4` 4 zu `ESP` hinzu, _setzt_ das `carry flag`, und springt zurück.
+
+Wo springt diese Funktion hin? Wann immer ein Programm den op-Code `call` verwendet, ``push``t der Mikroprozessor die Rücksprungandresse, d.h. er speichert diese ganz oben auf dem Stack (nicht auf dem Stack der FPU, sondern auf dem Systemstack, der sich im Hauptspeicher befindet). Wenn ein Programm den op-Code `ret` verwendet, ``pop``t der Mikroprozessor den Rückgabewert von dem Stack, und springt zu der Adresse, die dort gespeichert wurde.
+
+Da wir aber 4 zu `ESP` hinzuaddiert haben (welches das Register der Stackzeiger ist), haben wir effektiv dem Mikroprzessor eine kleine _Amnesie_ verpaßt: Dieser erinnert sich nun nicht mehr daran, daß `getchar` durch `read` aufgerufen wurde.
+
+Und da `getchar` nichts vor dem Aufruf von `read` auf dem Stack abgelegt hat, enthält der Anfang des Stacks nun die Rücksprungadresse von der Funktion, die `getchar` aufgerufen hat. Soweit es den Aufrufer betrifft, hat dieser `getchar` ge``call``t, welche mit einem gesetzten ``carry flag ret``urned.
+
+Des weiteren wird die Routine `bcdload` bei einem klitzekleinen Problem zwischen der Big-Endian- und Little-Endian-Codierung aufgerufen.
+
+Diese konvertiert die Textrepräsentation einer Zahl in eine andere Textrepräsentation: Der Text wird in der Big-Endian-Codierung gespeichert, die _packed decimal_-Darstellung jedoch in der Little-Endian-Codierung.
+
+Um dieses Problem zu lösen haben wir vorher den op-Code `std` verwendet. Wir machen diesen Aufruf später mittels `cld` wieder rückgängig: Es ist sehr wichtig, daß wir keine Funktion mittels `call` aufrufen, die von einer Standardeinstellung des _Richtungsflags_ abhängig ist, während `std` ausgeführt wird.
+
+Alles weitere in dem Programm sollte leicht zu verstehen sein, vorausgesetzt, daß Sie das gesamte vorherige Kapitel gelesen haben.
+
+Es ist ein klassisches Beispiel für das Sprichwort, daß das Programmieren eine Menge Denkarbeit, und nur ein wenig Programmcode benötigt. Sobald wir uns über jedes Detail im klaren sind, steht der Code fast schon da.
+
+[[x86-pinhole-using]]
+=== Das Programm pinhole verwenden
+
+Da wir uns bei dem Programm dafür entschieden haben, alle Eingaben, die keine Zahlen sind, zu ignorieren (selbst die in Kommentaren), können wir jegliche _textbasierten Eingaben_ verarbeiten. Wir _müssen_ dies nicht tun, wir _könnten_ aber.
+
+Meiner bescheidenen Meinung nach wird ein Programm durch die Möglichkeit, anstatt einer strikten Eingabesyntax textbasierte Anfragen stellen zu können, sehr viel benutzerfreundlicher.
+
+Angenommen, wir wollten eine Lochkamera für einen 4x5 Zoll Film bauen. Die standardmäßige Brennweite für diesen Film ist ungefähr 150mm. Wir wollen diesen Wert _optimieren_, so daß der Lochblendendurchmesser eine möglichst runde Zahl ergibt. Lassen Sie uns weiter annehmen, daß wir zwar sehr gut mit Kameras umgehen können, dafür aber nicht so gut mit Computern. Anstatt das wir nun eine Reihe von Zahlen eingeben, wollen wir lieber ein paar _Fragen_ stellen.
+
+Unsere Sitzung könnte wie folgt aussehen:
+
+[source,bash]
+....
+% pinhole
+
+Computer,
+
+Wie groß müßte meine Lochblende bei einer Brennweite
+von 150 sein?
+150 490 306 362 2930 12
+Hmmm... Und bei 160?
+160 506 316 362 3125 12
+Laß uns bitte 155 nehmen.
+155 498 311 362 3027 12
+Ah, laß uns 157 probieren...
+157 501 313 362 3066 12
+156?
+156 500 312 362 3047 12
+Das ist es! Perfekt! Vielen Dank!
+^D
+....
+
+Wir haben herausgefunden, daß der Lochblendendurchmesser bei einer Brennweite von 150 mm 490 Mikrometer, oder 0.49 mm ergeben würde. Bei einer fast identischen Brennweite von 156 mm würden wir einen Durchmesser von genau einem halben Millimeter bekommen.
+
+[[x86-pinhole-scripting]]
+=== Skripte schreiben
+
+Da wir uns dafür entschieden haben, das Zeichen [constant]### als den Anfang eines Kommentares zu interpretieren, können wir unser pinhole-Programm auch als _Skriptsprache_ verwenden.
+
+Sie haben vielleicht schon einmal shell _-Skripte_ gesehen, die mit folgenden Zeichen begonnen haben:
+
+[.programlisting]
+....
+#! /bin/sh
+....
+
+oder
+
+[.programlisting]
+....
+#!/bin/sh
+....
+
+... da das Leerzeichen hinter dem `#!` optional ist.
+
+Wann immer UNIX(R) eine Datei ausführen soll, die mit einem `#!` beginnt, wird angenommen, das die Datei ein Skript ist. Es fügt den Befehl an das Ende der ersten Zeile an, und versucht dann, dieses auszuführen.
+
+Angenommen, wir haben unser Programm pinhole unter /usr/local/bin/ installiert, dann können wir nun Skripte schreiben, um unterschiedliche Lochblendendurchmesser für mehrere Brennweiten zu berechnen, die normalerweise mit 120er Filmen verwendet werden.
+
+Das Skript könnte wie folgt aussehen:
+
+[.programlisting]
+....
+#! /usr/local/bin/pinhole -b -i
+# Find the best pinhole diameter
+# for the 120 film
+
+### Standard
+80
+
+### Wide angle
+30, 40, 50, 60, 70
+
+### Telephoto
+100, 120, 140
+....
+
+Da ein 120er Film ein Film mittlerer Größe ist, könnten wir die Datei medium nennen.
+
+Wir können die Datei ausführbar machen und dann aufrufen, als wäre es ein Programm:
+
+[source,bash]
+....
+% chmod 755 medium
+% ./medium
+....
+
+UNIX(R) wird den letzten Befehl wie folgt interpretieren:
+
+[source,bash]
+....
+% /usr/local/bin/pinhole -b -i ./medium
+....
+
+Es wird den Befehl ausführen und folgendes ausgeben:
+
+[source,bash]
+....
+80 358 224 256 1562 11
+30 219 137 128 586 9
+40 253 158 181 781 10
+50 283 177 181 977 10
+60 310 194 181 1172 10
+70 335 209 181 1367 10
+100 400 250 256 1953 11
+120 438 274 256 2344 11
+140 473 296 256 2734 11
+....
+
+Lassen Sie uns nun das folgende eingeben:
+
+[source,bash]
+....
+% ./medium -c
+....
+
+UNIX(R) wird dieses wie folgt behandeln:
+
+[source,bash]
+....
+% /usr/local/bin/pinhole -b -i ./medium -c
+....
+
+Dadurch erhält das Programm zwei widersprüchliche Optionen: [parameter]#-b# und [parameter]#-c# (Verwende Benders Konstante und verwende Connors Konstante). Wir haben unser Programm so geschrieben, daß später eingelesene Optionen die vorheringen überschreiben-unser Programm wird also Connors Konstante für die Berechnungen verwenden:
+
+[source,bash]
+....
+80 331 242 256 1826 11
+30 203 148 128 685 9
+40 234 171 181 913 10
+50 262 191 181 1141 10
+60 287 209 181 1370 10
+70 310 226 256 1598 11
+100 370 270 256 2283 11
+120 405 296 256 2739 11
+140 438 320 362 3196 12
+....
+
+Wir entscheiden uns am Ende doch für Benders Konstante. Wir wollen die Ergebnisse im CSV-Format in einer Datei speichern:
+
+[source,bash]
+....
+% ./medium -b -e > bender
+% cat bender
+focal length in millimeters,pinhole diameter in microns,F-number,normalized F-number,F-5.6 multiplier,stops from F-5.6
+80,358,224,256,1562,11
+30,219,137,128,586,9
+40,253,158,181,781,10
+50,283,177,181,977,10
+60,310,194,181,1172,10
+70,335,209,181,1367,10
+100,400,250,256,1953,11
+120,438,274,256,2344,11
+140,473,296,256,2734,11
+%
+....
+
+[[x86-caveats]]
+== Vorsichtsmassnahmen
+
+Assembler-Programmierer, die aufwuchsen mit MS-DOS(R) und windows Windows(R) neigen oft dazu Shotcuts zu verwenden. Das Lesen der Tastatur-Scancodes und das direkte Schreiben in den Grafikspeicher sind zwei klassische Beispiele von Gewohnheiten, die unter MS-DOS(R) nicht verpönt sind, aber nicht als richtig angesehen werden.
+
+Warum dies? Sowohl das PC-BIOS als auch MS-DOS(R) sind notorisch langsam bei der Ausführung dieser Operationen.
+
+Sie mögen versucht sein ähnliche Angewohnheiten in der UNIX(R)-Umgebung fortzuführen. Zum Beispiel habe ich eine Webseite gesehen, welche erklärt, wie man auf einem beliebten UNIX(R)-Ableger die Tastatur-Scancodes verwendet.
+
+Das ist generell eine _sehr schlechte Idee_ in einer UNIX(R)-Umgebung! Lassen Sie mich erklären warum.
+
+[[x86-protected]]
+=== UNIX(R) ist geschützt
+
+Zum Einen mag es schlicht nicht möglich sein. UNIX(R) läuft im Protected Mode. Nur der Kernel und Gerätetreiber dürfen direkt auf die Hardware zugreifen. Unter Umständen erlaubt es Ihnen ein bestimmter UNIX(R)-Ableger Tastatur-Scancodes auszulesen, aber ein wirkliches UNIX(R)-Betriebssystem wird dies zu verhindern wissen. Und falls eine Version es Ihnen erlaubt wird es eine andere nicht tun, daher kann eine sorgfältig erstellte Software über Nacht zu einem überkommenen Dinosaurier werden.
+
+[[x86-abstraction]]
+=== UNIX(R) ist eine Abstraktion
+
+Aber es gibt einen viel wichtigeren Grund, weshalb Sie nicht versuchen sollten, die Hardware direkt anzusprechen (natürlich nicht, wenn Sie einen Gerätetreiber schreiben), selbst auf den UNIX(R)-ähnlichen Systemen, die es Ihnen erlauben:
+
+_UNIX(R) ist eine Abstraktion!_
+
+Es gibt einen wichtigen Unterschied in der Design-Philosophie zwischen MS-DOS(R) und UNIX(R). MS-DOS(R) wurde entworfen als Einzelnutzer-System. Es läuft auf einem Rechner mit einer direkt angeschlossenen Tastatur und einem direkt angeschlossenem Bildschirm. Die Eingaben des Nutzers kommen nahezu immer von dieser Tastatur. Die Ausgabe Ihres Programmes erscheint fast immer auf diesem Bildschirm.
+
+Dies ist NIEMALS garantiert unter UNIX(R). Es ist sehr verbreitet für ein UNIX(R), daß der Nutzer seine Aus- und Eingaben kanalisiert und umleitet:
+
+[source,bash]
+....
+% program1 | program2 | program3 > file1
+....
+
+Falls Sie eine Anwendung program2 geschrieben haben, kommt ihre Eingabe nicht von der Tastatur, sondern von der Ausgabe von program1. Gleichermassen geht Ihre Ausgabe nicht auf den Bildschirm, sondern wird zur Eingabe für program3, dessen Ausgabe wiederum in [.filename]#file1# endet.
+
+Aber es gibt noch mehr! Selbst wenn Sie sichergestellt haben, daß Ihre Eingabe und Ausgabe zum Terminal kommt bzw. gelangt, dann ist immer noch nicht garantiert, daß ihr Terminal ein PC ist: Es mag seinen Grafikspeicher nicht dort haben, wo Sie ihn erwarten, oder die Tastatur könnte keine PC-ähnlichen Scancodes erzeugen können. Es mag ein Macintosh(R) oder irgendein anderer Rechner sein.
+
+Sie mögen nun den Kopf schütteln: Mein Programm ist in PC-Assembler geschrieben, wie kann es auf einem Macintosh(R) laufen? Aber ich habe nicht gesagt, daß Ihr Programm auf Macintosh(R) läuft, nur sein Terminal mag ein Macintosh(R) sein.
+
+Unter UNIX(R) muß der Terminal nicht direkt am Rechner angeschlossen sein, auf dem die Software läuft, er kann sogar auf einem anderen Kontinent sein oder sogar auf einem anderen Planeten. Es ist nicht ungewöhnlich, daß ein Macintosh(R)-Nutzer in Australien sich auf ein UNIX(R)-System in Nordamerika (oder sonstwo) mittels telnet verbindet. Die Software läuft auf einem Rechner während das Terminal sich auf einem anderen Rechner befindet: Falls Sie versuchen sollten die Scancodes auszulesen werden Sie die falschen Eingaben erhalten!
+
+Das Gleiche gilt für jede andere Hardware: Eine Datei, welche Sie einlesen, mag auf einem Laufwerk sein, auf das Sie keinen direkten Zugriff haben. Eine Kamera, deren Bilder Sie auslesen, befindet sich möglicherweise in einem Space Shuttle, durch Satelliten mit Ihnen verbunden.
+
+Das sind die Gründe, weshalb Sie niemals unter UNIX(R) Annahmen treffen dürfen, woher Ihre Daten kommen oder gehen. Lassen Sie immer das System den physischen Zugriff auf die Hardware regeln.
+
+[NOTE]
+====
+Das sind Vorsichtsmassnahmen, keine absoluten Regeln. Ausnahmen sind möglich. Wenn zum Beispiel ein Texteditor bestimmt hat, daß er auf einer lokalen Maschine läuft, dann mag er die Tastatur-Scancodes direkt auslesen, um eine bessere Kontrolle zu gewährleisten. Ich erwähne diese Vorsichtsmassnahmen nicht, um Ihnen zu sagen, was sie tun oder lassen sollen, ich will Ihnen nur bewusst machen, daß es bestimmte Fallstricke gibt, die Sie erwarten, wenn Sie soeben ihn UNIX(R) von MS-DOS(R) angelangt sind. Kreative Menschen brechen oft Regeln und das ist in Ordnung, solange sie wissen welche Regeln und warum.
+====
+
+[[x86-acknowledgements]]
+== Danksagungen
+
+Dieses Handbuch wäre niemals möglich gewesen ohne die Hilfe vieler erfahrener FreeBSD-Programmierer aus {freebsd-hackers}. Viele dieser Personen haben geduldig meine Fragen beantwortet und mich in die richtige Richtung gewiesen bei meinem Versuch, die tieferen liegenden Mechanismen der UNIX(R)-Systemprogrammierung zu erforschen im Allgemeinen und bei FreeBSD im Besonderen.
+
+Thomas M. Sommers öffnete die Türen für mich. Seine http://www.codebreakers-journal.com/content/view/262/27/[Wie schreibe ich "Hallo Welt" in FreeBSD-Assembler?] Webseite war mein erster Kontakt mit Assembler-Programmierung unter FreeBSD.
+
+Jake Burkholder hat die Tür offen gehalten durch das bereitwillige Beantworten all meiner Fragen und das Zurverfügungstellen von Assembler-Codebeispielen.
+
+Copyright (R) 2000-2001 G. Adam Stanislav. Alle Rechte vorbehalten.
diff --git a/documentation/content/de/books/faq/_index.adoc b/documentation/content/de/books/faq/_index.adoc
new file mode 100644
index 0000000000..d5317ce836
--- /dev/null
+++ b/documentation/content/de/books/faq/_index.adoc
@@ -0,0 +1,3057 @@
+---
+title: Häufig gestellte Fragen zu FreeBSD 11.X und 12.X
+authors:
+ - author: The FreeBSD Documentation Project
+copyright: 1995-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "ibm", "ieee", "adobe", "intel", "linux", "microsoft", "opengroup", "sun", "netbsd", "general"]
+---
+
+= Häufig gestellte Fragen zu FreeBSD {rel2-relx} und {rel-relx}
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Inhaltsverzeichnis
+:part-signifier: Teil
+:chapter-signifier: Kapitel
+:appendix-caption: Anhang
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:rel-numbranch: 3
+:rel-head: 13-CURRENT
+:rel-head-relx: 13.X
+:rel-head-releng: head/
+:rel-relx: 12.X
+:rel-stable: 12-STABLE
+:rel-releng: stable/12/
+:rel-relengdate: December 2018
+:rel2-relx: 11.X
+:rel2-stable: 11-STABLE
+:rel2-releng: stable/11/
+:rel2-relengdate: October 2016
+
+ifeval::["{backend}" == "html5"]
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/de/mailing-lists.adoc[]
+include::../../../../shared/de/teams.adoc[]
+include::../../../../shared/de/urls.adoc[]
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/de/mailing-lists.adoc[]
+include::../../../../shared/de/teams.adoc[]
+include::../../../../shared/de/urls.adoc[]
+endif::[]
+
+[.abstract-title]
+Zusammenfassung
+
+Dies ist die FAQ für die FreeBSD-Versionen {rel-relx} und {rel2-relx}. Es wurden große Anstrengungen unternommen, diese FAQ so informativ wie möglich zu gestalten. Wenn Sie Vorschläge haben, wie dieses Dokument verbessert werden kann, senden Sie eine Mail an die Mailingliste http://lists.FreeBSD.org/mailman/listinfo/freebsd-doc['FreeBSD Documentation Project].
+
+Die neueste Version dieses Dokuments ist immer auf der link:.[FreeBSD Webseite] verfügbar. Diese FAQ kann ebenfalls über HTTP als große link:.[HTML]-Datei, oder in verschiedenen anderen Formaten vom link:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/de/[FreeBSD FTP Server] heruntergeladen werden.
+
+'''
+
+toc::[]
+
+== Übersicht
+
+=== Was ist FreeBSD
+
+FreeBSD ist ein modernes Betriebssystem für Server, Desktops und eingebettete Systeme, das auf zahlreichen http://www.FreeBSD.org/de/platforms/[Plattformen] läuft.
+
+Es basiert auf dem "4.4BSD-Lite"-Release der U.C. Berkeley, mit einigen Erweiterungen aus "4.4BSD-Lite2". Es basiert außerdem indirekt auf der von William Jolitz unter dem Namen "386BSD" herausgebrachten Portierung des "Net/2"-Releases für i386(TM) der U.C. Berkeley. Allerdings ist nur sehr wenig vom ursprünglichen 386BSD Code übrig geblieben.
+
+Unternehmen, Internet Service Provider, Forscher, Computerfachleute, Studenten und Privatnutzer auf der ganzen Welt benutzen FreeBSD für die Arbeit, die Ausbildung oder in der Freizeit.
+
+Ausführlichere Informationen zu FreeBSD, finden Sie im link:{handbook}[FreeBSD Handbuch].
+
+[[FreeBSD-goals]]
+=== Welches Ziel hat das FreeBSD Project?
+
+Das Ziel des FreeBSD Projects ist es, ein stabiles und schnelles Betriebssystem zur Verfügung zu stellen, das Sie für jeden Zweck verwenden können, ohne dabei irgendwelche Bedingungen in Kauf nehmen zu müssen.
+
+=== Beinhaltet die FreeBSD-Lizenz irgendwelche Einschränkungen?
+
+Ja. Diese Einschränkungen regeln aber nicht, wie Sie mit dem Quellcode umgehen, sondern betreffen nur den Umgang mit dem FreeBSD Project an sich. Die Lizenz ist unter http://www.FreeBSD.org/copyright/freebsd-license/[http://www.FreeBSD.org/copyright/freebsd-license/] verfübar und lässt sich wie folgt zusammenfassen:
+
+* Behaupten Sie nicht, Sie hätten es geschrieben.
+* Verklagen Sie uns nicht, wenn etwas nicht funktioniert.
+* Sie dürfen die Lizenz nicht entfernen oder verändern.
+
+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 insbesondere 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 http://www.FreeBSD.org/copyright/COPYING[GNU General Public License (GPL)] oder der http://www.FreeBSD.org/copyright/COPYING.LIB[GNU Library General Public License (LGPL)] unterliegt, ist mit zusätzlichen 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 http://www.FreeBSD.org/copyright/freebsd-license/[FreeBSD Lizenz] unterliegt, zu ersetzen.
+
+=== 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 wurde entworfen, Anwendungen eine stabile und funktionsreiche Umgebung zu bieten. Es unterstützt viele unterschiedliche Web-Browser, Büroanwendungen, E-Mail-Programme, Grafik-Programme, Entwicklungsumgebungen, Netzwerk-Server, und vieles mehr. Die meisten dieser Anwendungen sind in der http://www.FreeBSD.org/de/ports/[Ports-Sammlung] verfügbar.
+
+Wenn Sie eine 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 von einem anderen UNIX(TM) System zu FreeBSD wechseln, dürfte Ihnen vieles bekannt vorkommen. Wenn Ihr Hintergrund ein Betriebssystem wie Windows(TM) oder MacOS(TM)ist, sind Sie vielleicht an https://www.trueos.org/[TrueOS] interessiert, eine auf FreeBSD basierende Desktop-Distribution. Wenn Sie vorher noch nicht mit UNIX(TM) gearbeitet haben, werden Sie zusätzliche Zeit investieren müssen, um den UNIX(TM) Stil zu verstehen. Diese FAQ und das link:{handbook}[FreeBSD Handbuch] sind die besten Startpunkte.
+
+=== Warum heißt es FreeBSD?
+
+* Es darf kostenlos genutzt werden - sogar von kommerziellen Nutzern.
+* 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, genannt http://www.freebsdworld.gr/freebsd/bsd-family-tree.html[The BSD Family Tree,], beschreibt sehr gut die Geschichte und die Unterschiede der BSD-Varianten.
+
+Die meisten der BSDs teilen auch heute noch Patches und Code. Außerdem haben alle BSDs eine gemeinsame Herkunft.
+
+Die Ziele von FreeBSD sind in <<FreeBSD-goals>> beschrieben. Die Ziele der anderen bekannten BSDs können wie folgt zusammengefasst werden:
+
+* OpenBSD strebt eine hohe Sicherheit des Betriebssystems an. Das OpenBSD-Team hat auch man:ssh[1] und man:pf[4] entwickelt, welche ebenfalls nach FreeBSD portiert wurden.
+* NetBSD soll leicht auf andere Plattformen portierbar sein.
+* DragonFlyBSD ist eine Abspaltung von FreeBSD 4.8 und hat seither viele interessante Funktionen entwickelt, einschließlich des HAMMER-Dateisystems und Unterstützung für User-Mode "vkernels".
+
+=== Welches ist die aktuelle FreeBSD-Version?
+
+Momentan gibt es zwei Entwicklungszweige, die für die Erstellung von Releases verwendet werden. Die 10._X_-RELEASEs werden auf dem _10-STABLE_-Zweig erstellt, die 9._X_-RELEASEs auf dem _9-STABLE_-Zweig.
+
+Bis zur Veröffentlichung von FreeBSD 9.0 galt die 9._X_-Serie als _-STABLE_. Seit FreeBSD 11._X_ gibt es für den Zweig 9._X_ nur mehr eine "erweiterte Unterstützung" in der Form von Korrekturen von größeren Problemen, wie neu entdeckten Sicherheitsheitslücken.
+
+Version link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/i386/10.3-RELEASE/[10.3] ist das aktuelle Release des _10-STABLE_-Zweigs und ist im April 2016 erschienen. Version link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/9.3-RELEASE/[9.3] ist das aktuelle Release aus dem _9-STABLE_-Zweig und ist im Juli 2014 erschienen.
+
+Releases werden <<release-freq,nur alle paar Monate>> erstellt. Viele Leute halten ihre Systeme aktueller (lesen Sie die Fragen zu <<current,FreeBSD-CURRENT>> und <<stable,FreeBSD-STABLE>>), aber das erfordert ein erhöhtes Engagement, da der Quellcode sich ständig verändern.
+
+Weitere Informationen über FreeBSD-Releases finden Sie auf der http://www.FreeBSD.org/releng/#release-build[Release Engineering Seite] und in man:release[7].
+
+=== Was ist FreeBSD-CURRENT?
+
+link:{handbook}#current[FreeBSD-CURRENT] ist die Entwicklungsversion des Betriebssystems, aus der zu gegebener Zeit der FreeBSD-STABLE-Zweig entstehen 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 link:{handbook}#current[entsprechenden Abschnitt] des link:{handbook}[Handbuchs].
+
+Falls Sie mit FreeBSD nicht vertraut sind, sollten Sie FreeBSD-CURRENT nicht verwenden. Dieser Zweig entwickelt sich manchmal sehr schnell weiter und kann gelegentlich nicht installierbar sein. Von Personen, die FreeBSD-CURRENT verwenden, wird erwartet, dass Sie dazu in der Lage sind, Probleme zu erkennen, zu analysieren und diese an das Projekt zurückzumelden.
+
+Jeden Monat wird der aktuelle Entwicklungsstand in den Zweigen -CURRENT und -STABLE in einer https://www.FreeBSD.org/snapshots/[Snapshot] Release festgehalten. Die Ziele dieser Snapshot Releases sind:
+
+* Die aktuelle Version der Installationssoftware zu testen.
+* 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 Subversion verhindern sollte, dass solche Situationen entstehen.
+* Sicherzustellen, dass alle neuen Merkmale und Fehlerbehebungen zu möglichst vielen potentiellen Testern gelangen.
+
+Von keinem _-CURRENT_ Snapshot kann "Produktionsqualität" für beliebige Zwecke erwartet werden. Wenn Sie eine stabile und ausgetestete Version benötigen, sollten Sie ein vollständiges Release verwenden.
+
+Snapshot-Releases sind auf der https://www.FreeBSD.org/snapshots/[Snapshots-Seite] verfügbar.
+
+Offizielle Snapshots werden in regelmäßigen Abständen für jeden aktiven Zweig erstellt.
+
+=== 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 link:{handbook}#stable[-STABLE], der andere link:{handbook}#current[-CURRENT] genannt. _FreeBSD-STABLE_ ist der Entwicklungszweig aus dem die Hauptversionen erstellt werden. In diesem Zweig gehen nur Änderungen ein, wenn sie zuvor sorgfältig in FreeBSD-CURRENT getestet wurden. Gelegentlich können die Quellen für FreeBSD-STABLE möglicherweise nicht für den allgemeinen Gebrauch geeignet sein, da es Fehler enthalten können, die noch nicht in FreeBSD-CURRENT gefunden wurden. Benutzer, die nicht über genügend Ressourcen verfügen um zu testen, sollten stattdessen die aktuelle Version von FreeBSD verwenden. _FreeBSD-CURRENT_ ist eine ununterbrochene Linie seitdem die Version 2.0 herausgegeben worden ist. Sie führt zu 11.0-RELEASE (und darüber hinaus). Weitere Informationen zu diesen Zweigen finden Sie unter "link:{releng}#rel-branch[FreeBSD Release Engineering: Creating the Release Branch]", der Status der Zweige und der Zeitplan zur anstehenden Veröffentlichung kann auf der Seite http://www.FreeBSD.org/releng[Release Engineering Information] gefunden werden.
+
+11.0-STABLE ist der Zweig, auf den sich die Entwicklung von _-STABLE_ zur Zeit konzentriert. Das neueste Release aus dem 11.0-STABLE-Zweig ist 11.0-RELEASE und ist im Oktober 2016 erschienen.
+
+Aus dem _11-CURRENT_-Zweig ist der aktiv entwickelte _CURRENT_-Zweig, aus dem die nächste FreeBSD-Generation entsteht. Weitere Informationen über diesen Zweig finden Sie unter <<current,Was ist FreeBSD-CURRENT?>>.
+
+=== Wann werden FreeBSD-Releases erstellt?
+
+In der Regel gibt das Release Engineering Team mailto:re@FreeBSD.org[re@FreeBSD.org] alle 18 Monate eine neue Hauptversion und etwa alle 8 Monate eine Unterversion frei. Das Erscheinungsdatum einer Version wird frühzeitig bekanntgegeben, damit die am System arbeitenden Personen wissen, bis wann ihre Projekte abgeschlossen und getestet werden 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 Funktionen zu warten.
+
+Weitere Informationen über die Entwicklung von Releases, sowie eine Übersicht über kommende Releases, erhalten Sie auf den http://www.FreeBSD.org/releng/[Release Engineering] Seiten der FreeBSD Webseite.
+
+Für diejenigen, die ein wenig mehr Spannung 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 https://www.FreeBSD.org/administration/#t-core[Core Teams] von 9 Personen geführt. Es gibt ein weitaus größeres Team von über 350 link:{contributors}#staff-committers[Committern], die dazu autorisiert sind, Änderungen am FreeBSD Quellbaum durchzuführen.
+
+Jedoch werden die meisten nicht-trivialen Änderungen zuvor in den <<mailing,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 link:ftp://ftp.FreeBSD.org/pub/FreeBSD/[FreeBSD FTP Server] erhältlich:
+
+* Das aktuelle _10-STABLE_-Release, 10.3-RELEASE, finden Sie im link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/i386/10.3-RELEASE/[Verzeichnis 10.3-RELEASE].
+* https://www.FreeBSD.org/snapshots/[Snapshot]-Releases werden monatlich aus dem <<current,-CURRENT>>-Zweig sowie aus dem <<stable,-STABLE>>-Zweig erzeugt. Sie sollten aber nur von Entwicklern und sehr erfahrenen Testern verwendet werden.
+* Das aktuelle _10-STABLE_-Release, 10.3-RELEASE, finden Sie im link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/i386/10.3-RELEASE/[Verzeichnis 10.3-RELEASE].
+
+Wo und wie Sie FreeBSD auf CD, DVD, und anderen Medien beziehen können, erfahren Sie im link:{handbook}#mirrors[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 https://bugs.FreeBSD.org/search/[PR-Abfrage-Schnittstelle] abgefragt werden.
+
+Über die https://www.FreeBSD.org/support/bugreports/[webbasierte PR-Schnittstelle] können Sie Problemberichte über einen Webbrowser einreichen.
+
+Bevor Sie einen Fehler melden, sollten Sie zuerst link:{problem-reports}[Writing FreeBSD Problem Reports] lesen, damit Sie wissen, wie Sie eine gute Fehlermeldung verfassen.
+
+== Dokumentation und Unterstützung
+
+=== 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: http://www.FreeBSD.org/docs/[http://www.FreeBSD.org/de/docs/]. Zusätzlich enthält <<bibliography,die Bibliographie>> am Ende dieser FAQ und link:{handbook}#bibliography[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 link:ftp://ftp.de.FreeBSD.org/pub/FreeBSD/doc/[/pub/FreeBSD/doc/] auf dem FreeBSD FTP-Server. Dort finden Sie Dokumentation in vielen verschiedenen Formaten.
+
+Die Dokumentation wurde nach verschiedenen Kriterien sortiert. Die Kriterien sind:
+
+* Der Name des Dokumentes, z.B. `faq` oder `handbook`.
+* Die Sprache und der Zeichensatz, die in dem Dokument verwendet werden. Diese entsprechen den Anpassungen, die Sie auf einem FreeBSD-System unter [.filename]#/usr/shared/locale# finden. Zurzeit werden die folgenden Sprachen und Zeichensätze benutzt:
++
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Name
+| Bedeutung
+
+|`en_US.ISO8859-1`
+|Englisch (Vereinigte Staaten)
+
+|`bn_BD.ISO10646-1`
+|Bengalisch oder Bangla (Bangladesh)
+
+|`da_DK.ISO8859-1`
+|Dänisch (Dänemark)
+
+|`de_DE.ISO8859-1`
+|Deutsch (Deutschland)
+
+|`el_GR.ISO8859-7`
+|Griechisch (Griechenland)
+
+|`es_ES.ISO8859-1`
+|Spanisch (Spanien)
+
+|`fr_FR.ISO8859-1`
+|Französisch (Frankreich)
+
+|`hu_HU.ISO8859-2`
+|Ungarisch (Ungarn)
+
+|`it_IT.ISO8859-15`
+|Italienisch (Italien)
+
+|`ja_JP.eucJP`
+|Japanisch (Japan, EUC-kodiert)
+
+|`mn_MN.UTF-8`
+|Mongolisch (Mongolei, UTF-8-kodiert)
+
+|`nl_NL.ISO8859-1`
+|Niederländisch (Holland)
+
+|`no_NO.ISO8859-1`
+|Norwegisch (Norwegen)
+
+|`pl_PL.ISO8859-2`
+|Polnisch (Polen)
+
+|`pt_BR.ISO8859-1`
+|Brasilianisches Portugiesisch (Brasilien)
+
+|`ru_RU.KOI8-R`
+|Russisch (Russland, KOI8-R-kodiert)
+
+|`sr_YU.ISO8859-2`
+|Serbisch (Serbien)
+
+|`tr_TR.ISO8859-9`
+|Türkisch (Türkei)
+
+|`zh_CN.UTF-8`
+|Vereinfachtes Chinesisch (China, UTF-8-kodiert)
+
+|`zh_TW.UTF-8`
+|Chinesisch (Taiwan, UTF-8-kodiert)
+|===
++
+[NOTE]
+====
+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:
++
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Format
+| Bedeutung
+
+|`html-split`
+|Viele kleine HTML-Dateien, die sich gegenseitig referenzieren.
+
+|`html`
+|Eine große HTML-Datei, die das komplette Dokument enthält.
+
+|`pdf`
+|Adobe's Portable Document Format
+
+|`ps`
+|PostScript(TM)
+
+|`rtf`
+|Microsoft(TM)'s Rich Text Format
+
+|`txt`
+|Normaler Text
+|===
++
+[NOTE]
+====
+Die Seitennummern werden nicht automatisch aktualisiert, wenn Sie das Rich Text Format in Word laden. Wenn Sie das Dokument geladen haben, müssen Sie kbd:[Ctrl+A], kbd:[Ctrl+End], kbd:[F9] eingeben, um die Seitennummern aktualisieren zu lassen.
+====
+
+* Das zur Komprimierung verwendete Programm.
+.. Wenn die Dokumentation im Format `html-split` vorliegt, werden die Dateien mit man:tar[1] zusammengefasst. Die so entstandene [.filename]#.tar# Datei wird dann mit einer der unten genannten Methoden komprimiert.
+.. Bei allen anderen Formaten existiert nur eine Datei mit dem Namen, z.B. [.filename]#article.pdf#, [.filename]#book.html#, und so weiter.
++
+Diese Dateien werden entweder mit `zip` oder `bz2` komprimiert. Mit man:tar[1] können die Dateien wieder entpackt werden.
++
+Die mit `bzip2` gepackte Version des Handbuchs im PostScript(TM)-Format hat den Namen [.filename]#book.ps.bz2# und ist im Verzeichnis [.filename]#handbook/# zu finden.
+
+Nachdem Sie das Format und das Kompressionsverfahren ausgewählt haben, müssen Sie die komprimierten Dateien herunterladen, entpacken und an die richtigen Stellen kopieren.
+
+Zum Beispiel finden Sie die mit man:bzip2[1] gepackte `split-html` Version der englischen FAQ in [.filename]#doc/en_US.ISO8859-1/books/faq/book.html-split.tar.bz2#. Um diese Datei herunterzuladen und auszupacken, sind die folgenden Schritte notwendig:
+
+[source,bash]
+....
+# fetch ftp://ftp.de.FreeBSD.org/pub/FreeBSD/doc/en_US.ISO8859-1/books/faq/book.html-split.tar.bz2
+# tar xvf book.html-split.tar.bz2
+....
+
+Wenn die Datei komprimiert ist, wird tar automatisch das entsprechende Format erkennen und die Datei korrekt dekomprimieren. Danach haben Sie eine Sammlung vieler kleiner [.filename]#.html# Dateien. Die wichtigste Datei hat Namen [.filename]#index.html# und enthält das Inhaltsverzeichnis, eine Einleitung und Verweise auf die anderen Teile des Dokumentes.
+
+=== Woher bekomme ich Informationen zu den FreeBSD Mailinglisten? Welche Newsgruppen existieren zu FreeBSD?
+
+Lesen Sie den link:{handbook}#eresources-mail[Handbucheintrag über Mailinglisten] und den link:{handbook}#eresources-news/[Handbucheintrag zu Newsgruppen].
+
+=== Gibt es FreeBSD IRC (Internet Relay Chat) Kanäle?
+
+Ja, die meisten großen IRC Netze bieten einen FreeBSD Chat-Channel:
+
+* Der Channel `#FreeBSDhelp` im http://www.efnet.org/index.php[EFNet] bietet Hilfe für FreeBSD Benutzer.
+* Der Channel `#FreeBSD` auf http://freenode.net/[Freenode] bietet allgemeine Hilfe zu FreeBSD-Themen. Es sind immer viele 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 die Diskussionen auf Englisch geführt. Wollen Sie die Diskussion in Ihrer Sprache führen, sollten Sie Ihre Frage trotzdem auf Englisch stellen und danach gegebenenfalls einen neuen Channel in der Form `##freebsd-Ihre_Sprache` eröffnen.
+* Der Channel `#FreeBSD` im http://www.dal.net/[DALNET] ist in den USA unter `irc.dal.net` und in Europa unter `irc.eu.dal.net verfügbar`.
+* Der Channel `#FreeBSD` im http://www.undernet.org/[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 http://www.rusnet.org.ru/[RUSNET] ist ein russischsprachiger Channel, der sich der Unterstützung von FreeBSD-Anwendern verschrieben hat. Er ist auch ein guter Startpunkt für nichttechnische Diskussionen.
+* Der Channel `#bsdchat` auf http://freenode.net/[Freenode] (Sprache: traditionelles Chinesisch, UTF-8-kodiert) hat sich der Unterstützung von FreeBSD-Anwendern verschrieben. Er ist auch ein guter Startpunkt für nichttechnische Diskussionen.
+
+Das FreeBSD Wiki enthält eine http://wiki.freebsd.org/IrcChannels[Liste] mit IRC Kanälen.
+
+Alle diese Kanäle unterscheiden sich voneinander und sind nicht miteinander verbunden. Ebenso unterscheiden sich die jeweiligen 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.
+
+=== Gibt es irgendwelche webbasierten Foren, in denen FreeBSD diskutiert wird?
+
+Die offiziellen FreeBSD Foren befinden sich unter https://forums.FreeBSD.org/[https://forums.FreeBSD.org/].
+
+=== Gibt es Firmen, die Training und Support für FreeBSD anbieten?
+
+http://www.ixsystems.com[iXsystems, Inc.], die Muttergesellschaft der http://www.freebsdmall.com/[FreeBSD Mall], bietet kommerziellen http://www.ixsystems.com/support[Support] für FreeBSD und TrueOS sowie FreeBSD-spezifische Softwareentwicklung und Hilfe bei Optimierung Ihrer vorhandenen Installationen.
+
+Die BSD Certification Group, Inc. bietet Zertifizierungen zur Systemadministration für DragonFly BSD, FreeBSD, NetBSD und OpenBSD. Besuchen Sie http://www.BSDCertification.org[deren Webseite] für weitere Informationen.
+
+Wenn Ihre Firma oder Organisation ebenfalls Training und Support anbietet und hier genannt werden möchte, wenden Sie sich bitte an das FreeBSD Project.
+
+== Installation
+
+=== Welche Plattform soll ich herunterladen? Ich habe eine 64-Bit-fähige Intel CPU, aber ich sehe nur amd64.
+
+Unter FreeBSD wird der Begriff amd64 für 64-Bit-kompatibel x86-Architekturen verwendet (auch als "x86-64" oder "x64" bekannt). Die meisten modernen Rechner sollten amd64 verwenden. Ältere Hardware sollte i386 verwenden. Wenn Sie FreeBSD auf einer nicht-x86-kompatible Architektur installieren, wählen Sie die Plattform, die am besten mit der verwendeten Hardware übereinstimmt.
+
+=== Welche Datei muss ich herunterladen, um FreeBSD zu bekommen?
+
+Auf der Seite http://www.freebsd.org/de/where/[Download FreeBSD] können Sie das `[iso]` für die entsprechende Hardware wählen.
+
+Sie können eine der folgenden Dateien wählen:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Datei
+| Beschreibung
+
+|[.filename]#disc1.iso#
+|Enthält die FreeBSD Installation und einen minimalen Satz an Paketen.
+
+|[.filename]#dvd1.iso#
+|Ähnlich wie [.filename]#disc1.iso#, aber mit zusätzlichen Paketen.
+
+|[.filename]#memstick.img#
+|Enthält ein bootfähiges Image, das Sie auf einem USB-Stick speichern können.
+
+|[.filename]#bootonly.iso#
+|Ein minimales Image, das für die Installation von FreeBSD Netzwerkzugriff benötigt.
+|===
+
+pc98-Benutzer benötigen drei Floppy-Images: [.filename]#floppies/boot.flp#, [.filename]#floppies/kern1.flp#, [.filename]#floppies/kern2.flp#, und [.filename]#floppies/mfsroot1.flp#. Diese Images müssen mit Hilfe von Werkzeugen wie man:dd[1] auf Disketten kopiert werden.
+
+Eine vollständige Anleitung für dieses Vorgehen und weitere Informationen zur Installation finden Sie im link:{handbook}#bsdinstall[Handbucheintrag zur Installation von FreeBSD].
+
+=== Was mache ich, wenn das Image nicht bootet?
+
+Stellen Sie sicher, dass Sie das Image im _binary_-Modus herunterladen, wenn Sie FTP verwenden.
+
+Einige FTP-Clients benutzen als Voreinstellung den _ascii_-Modus und versuchen, alle Zeilenendezeichen an das Zielsystem anzupassen. Dadurch wird das Boot-Image fast immer unbrauchbar. Überprüfen Sie daher die SHA-256 Prüfsumme des heruntergeladenen Boot-Images: wenn diese nicht _genau_ mit der Prüfsumme auf dem Server übereinstimmt, sollten Sie das Image verwerfen und den Download erneut versuchen.
+
+Wenn Sie einen FTP-Client für die Kommandozeile benutzen, geben Sie am FTP-Prompt _binary_ ein, nachdem Sie sich mit dem Server verbunden haben und bevor Sie das Image herunterladen.
+
+=== Wo befinden sich die Anweisungen zur Installation von FreeBSD?
+
+Installationsanleitungen finden Sie im link:{handbook}#bsdinstall/[Handbucheintrag zur Installation von FreeBSD].
+
+=== Was sind die Mindestanforderungen zum Betrieb von FreeBSD?
+
+Der Betrieb von FreeBSD erfordert mindestens einen 486er Prozessor, 64 MB RAM sowie mindestens 1.1 GB an Festplattenspeicher.
+
+=== Wie kann ich ein angepasstes Installationsmedium erstellen?
+
+Individuelle FreeBSD Installationsmedien können über den Bau eines Releases erzeugt werden. Folgen Sie den Anweisungen im Artikel link:{releng}[Release Engineering].
+
+=== Kann Windows neben FreeBSD existieren?
+
+Ja, vorausgesetzt Sie installieren zuerst Windows(TM). Der Bootmanager von FreeBSD kann dann entweder Windows(TM) oder FreeBSD booten. Falls Sie Windows(TM) nach FreeBSD installieren, wird es, ohne zu fragen, den Bootmanager überschreiben. Lesen Sie den nächsten Abschnitt, falls das passieren sollte.
+
+=== Ein anderes Betriebssystem hat meinen Bootmanager zerstört! Wie stelle ich ihn wieder her?
+
+Das hängt vom Bootmanager ab. Der FreeBSD Bootmanager kann mit man:boot0cfg[8] neu installiert werden. Benutzen Sie bspw. folgendes Kommando, um den auf der Platte _ada0_ wiederherzustellen:
+
+[source,bash]
+....
+# boot0cfg -B ada0
+....
+
+Der MBR Bootloader kann mit man:gpart[8] installiert werden:
+
+[source,bash]
+....
+# gpart bootcode -b /boot/mbr ada0
+....
+
+Für anspruchsvollere Situationen, u. a. mit GPT partitionierte Platten, lesen Sie man:gpart[8].
+
+=== Ich habe zur Installation von CD gebootet, aber das Installationsprogramm sagt mir, dass es kein CD-ROM gefunden hat. Wo ist es hin?
+
+Dieses Problem wird üblicherweise durch ein falsch konfiguriertes CD-ROM verursacht. Bei vielen PCs ist das CD-ROM der Slave am zweiten IDE-Controller, ein Master ist nicht vorhanden. Laut ATAPI-Spezifikation ist diese Konfiguration ungültig, aber Windows(TM) verletzt die Spezifikation und das BIOS ignoriert sie, wenn es von einem CD-ROM booten soll. Daher konnten Sie zwar vom CD-ROM booten, während FreeBSD es nicht für die Installation benutzen kann.
+
+Um dieses Problem zu lösen, müssen Sie entweder das CD-ROM als Master an den IDE-Controller anschließen oder dafür sorgen, dass an dem vom CD-ROM genutzten IDE-Controller das CD-ROM als Slave und ein anderes Gerät als Master angeschlossen ist.
+
+=== Muss ich den vollständigen Quellcode installieren?
+
+Im allgemeinen nicht. Es gibt keine Komponenten im Betriebssystem, welche das Vorhandensein des Quellcodes erfordern. Einge Ports, wie package:sysutils/lsof[], werden aber nicht bauen solange der Quellcode nicht installiert ist. Insbesondere dann, wenn der Port ein Kernel-Modul erzeugt oder direkt mit den Strukturen des Kernels arbeitet, müssen die Quellen installiert werden.
+
+=== Muss ich einen Kernel erstellen?
+
+Normalerweise nicht. Der `GENERIC`-Kernel enthält bereits die Treiber, die ein gewöhnlicher Rechner benötigt. man:freebsd-update[8], das Werkzeug zur binären Aktualisierung von FreeBSD, ist jedoch nicht in der Lage angepasste Kernel zu aktualisieren. Dies ist ein weiterer Grund, wenn möglich, den `GENERIC`-Kernel einzusetzen. Für Rechner mit wenig RAM, bspw. eingebettete Systeme, kann es sich lohnen einen kleinen, angepassten Kernel zu erstellen, der nur die erforderlichen Treiber enthält.
+
+=== Soll ich DES, Blowfish oder MD5 zur Verschlüsselung der Passwörter benutzen?
+
+FreeBSD 9 und neuere Versionen verwenden voreingestellt _SHA512_. Für die Abwärtskompatibilität mit älteren Betriebssystemen werden auch noch die weniger sicheren DES Passwörter unterstützt. FreeBSD unterstützt auch noch die Passwort-Formate Blowfish und MD5. Welches Format für neue Benutzer verwendet wird, wird mit `passwd_format` in [.filename]#/etc/login.conf# gesteuert. Mögliche Werte sind `des`, `blf` (falls verfügbar), oder `md5`. Weitere Informationen finden Sie in der Manualpage man:login.conf[5].
+
+=== Wo liegen die Grenzen für FFS-Dateisysteme?
+
+Für FFS Dateisysteme ist die Größe des Dateisystems durch den Arbeitsspeicher abhängig, der benötigt wird um das Dateisystem mit man:fsck[8] zu prüfen. man:fsck[8] benötigt pro Fragment ein Bit, was bei einer Fragmentgröße von 4 KB bis 32 MB Arbeitsspeicher pro Terrabyte Plattenspeicher entspricht. Das bedeutet, dass auf Architekturen, die Userland-Prozesse auf 2 GB beschränken (zum Beispiel bei i386(TM)), man:fsck[8] ein Dateisystem von ~ 60 TB prüfen kann.
+
+Wenn es kein man:fsck[8] Limit gäbe, würde die maximale Größe eines Dateisystems 2 ^ 64 (Blöcke) * 32 KB => 16 Exa * 32 KB => 512 ZettaBytes betragen.
+
+Die maximale Größer einer einzelnen FFS-Datei würde mit einer Standard-Blockgröße von 32 KB in etwa 2 Petabyte betragen. Jeder 32 KB-Block kann auf bis zu 4096 Blöcke verweisen. Mit dreifacher Indirektion ist die Berechnung 32 KB * 12 + 32 KB * 4096 + 32 KB * 4096 ^ 2 + 32 KB * 4096 ^ 3. Eine Erhöhung der Blockgröße auf 64 KB wird die maximale Dateigröße um den Faktor 16 erhöhen.
+
+=== Wieso erhalte ich die Fehlermeldung readin.failed, nachdem ich einen neuen Kernel erstellt und gebootet habe?
+
+Das System und der Kernel sind nicht synchron. Dies wird nicht unterstützt. Stellen Sie sicher, dass Sie `make buildworld` und `make buildkernel` zum Aktualisieren des Kernels benutzen.
+
+Starten Sie das System und wählen Sie den Kernel während der zweiten Bootphase aus. Drücken Sie dazu eine beliebige Taste, wenn das Zeichen `|` erscheint und bevor der Loader gestartet wird.
+
+=== Gibt es ein Programm, mit dem ich nach der Installation weitere Konfigurationen ausführen kann?
+
+Ja. bsdconfig bietet eine einfache Oberfläche zur Konfiguration von FreeBSD.
+
+== Hardware-Kompatibilität
+
+[[compatibility-general]]
+== Allgemeines
+
+=== Ich will mir neue Hardware für mein FreeBSD-System zulegen. Welches Modell/Hersteller/Typ ist das Beste?
+
+Diese Frage wird ständig auf den FreeBSD-Mailinglisten diskutiert. Da sich die Hardware ständig ändert, ist das allerdings keine Überraschung. Lesen Sie die Hardware-Informationen für FreeBSD http://www.FreeBSD.org/releases/11.0r/hardware/[11.0] oder http://www.FreeBSD.org/releases/10.3r/hardware/[10.3] und durchsuchen Sie die Mailinglisten-link:http://www.FreeBSD.org/search/#mailinglists[Archive], bevor Sie nach der neuesten/besten Hardware fragen. Oft gab es kurz zuvor eine Diskussion über genau die Hardware, die Sie sich zulegen wollen.
+
+Befor Sie sich einen Laptop zulegen, sollten Sie einen Blick in das Archiv der http://lists.FreeBSD.org/mailman/listinfo/freebsd-mobile[Mailingliste FreeBSD laptop computer] werfen. Ansonsten empfiehlt sich ein Blick in das Archiv von http://lists.FreeBSD.org/mailman/listinfo/freebsd-questions[FreeBSD general questions] oder auch einer spezialisierte Mailingliste für diese Art von Hardware.
+
+=== Was sind die Grenzen für Arbeitsspeicher? Unterstützt FreeBSD mehr als 4 GB RAM? Mehr als 16 GB? Mehr als 48 GB?
+
+Generell unterstützt FreeBSD als Betriebssystem so viel physischen Speicher (RAM), wie die Plattform auf der es läuft. Beachten Sie, dass verschiedene Plattformen unterschiedliche Speichergrenzen besitzen. So wird z.B. i386(TM) ohne PAE höchstens 4 GB Speicher (normalerweise weniger als das wegen des PCI-Adressraums), dagegen wird i386(TM) mit PAE höchstens 64 GB Speicher bereitstellen. Seit FreeBSD 10 können AMD64 Plattformen bis zu 4 TB physischen Speicher ansprechen.
+
+=== Warum zeigt FreeBSD weniger als 4 GB Speicher an, wenn es auf einer i386 Maschine installiert wird?
+
+Der Gesamtadressraum beträgt auf i386(TM) Maschinen 32-Bit, was bedeutet, dass maximal 4 GB Speicher adressiert (verwaltet) werden kann. Weiterhin sind viele Adressen in diesem Bereich von der Hardware für bestimmte Aufgaben reserviert, um z.B. PCI-Geräte zu benutzen und zu steuern, auf Videospeicher zuzugreifen und so weiter. Aus diesem Grund ist die Gesamtmenge an Speicher, die vom Betriebssystem für den Kernel und Anwendungen verwendet werden kann, auf wesentlich weniger als 4 GB begrenzt. Normalerweise sind 3.2 GB bis 3.7 GB das Maximum an verfügbarem Speicher in dieser Konfiguration.
+
+Um auf mehr als 3.2 GB bis 3.7 GB des installierten Speichers (was bis zu 4 GB, aber aber auch mehr als 4 GB bedeuten kann) zuzugreifen, muss eine spezielle Manipulation, genannt PAE, benutzt werden. PAE steht für Physical Address Extension und ist eine Möglichkeit für 32-Bit x86-CPUs mehr als 4 GB Speicher zu addressieren. Es organisiert den Speicher, der andererseits wegen Adressreservierungen für Hardwaregeräte oberhalb der 4 GB Grenze liegt, um und benutzt diesen als zusätzlichen physischen Speicher (lesen Sie dazu man:pae[4]). Der Einsatz von PAE ist mit ein paar Nachteilen verbunden: diese Speicherzugriffsmethode ist ein bisschen langsamer als die normale Methode (ohne PAE) und ladbare Module (siehe man:kld[4]) werden nicht unterstützt. Das bedeutet, dass alle Treiber in den Kernel eingebaut sein müssen.
+
+Die am häufigsten verwendete Vorgehensweise, PAE zu aktivieren ist die, einen neuen Kernel mit der speziell dafür vorgesehenen Kernelkonfigurationsdatei, [.filename]#PAE# genannt, zu bauen, die bereits so eingestellt ist, dass ein funktionierender Kernel erstellt wird. Beachten Sie, dass manche Einträge in dieser Kernelkonfigurationsdatei zu konservativ eingestellt sind und dass manche Treiber, die nicht für den Einsatz mit PAE vorgesehen sind, trotzdem funktionieren. Als Faustregel kann man sagen, dass wenn der Treiber auf 64-Bit Architekturen (like AMD64) läuft, er auch mit PAE lauffähig ist. Wenn Sie einen angepassten Kernel erstellen, können Sie PAE aktivieren, indem Sie die folgende Zeile in die Konfiguration hinzufügen:
+
+[.programlisting]
+....
+options PAE
+....
+
+PAE wird heutzutage nicht sehr häufig verwendet, da die Mehrzahl an neuer x86-Hardware auch den Betrieb im 64-Bit Modus erlaubt, auch als AMD64 oder Intel(TM) 64 bekannt. Es hat viel mehr Adressraum und benötigt solche Manipulationen nicht. FreeBSD unterstützt AMD64 und es wird empfohlen, diese FreeBSD Version anstatt der i386(TM) Version einzusetzen, wenn 4 GB oder mehr Speicher gebraucht werden.
+
+[[compatibility-processors]]
+== Architekturen und Prozessoren
+
+=== Unterstützt FreeBSD neben x86 auch andere Architekturen?
+
+Ja. FreeBSD teilt die Unterstützung in sogenannte Tiers auf. Tier-1 Architekturen, wie i386 oder amd64 werden vollständig unterstützt. Tier-2 und Tier-3 werden auf der "Best-Effort Basis" unterstützt. Eine vollständige Erklärung dieser Aufteilung finden Sie im link:{committers-guide}#archs[Committer's Guide].
+
+Eine vollständige Liste der unterstützten Architekturen finden Sie auf der Seite http://www.FreeBSD.org/de/platforms/[Unterstützte Plattformen].
+
+=== Unterstützt FreeBSD Symmetric-Multiproccessing (SMP)?
+
+FreeBSD unterstützt Symmetric-Multiproccessing(SMP) auf allen nicht-Embedded-Plattformen (z.B. i386, amd64, etc.). SMP wird auch in ARM- und MIPS-Kernel unterstützt, obwohl einige CPUs dies vielleicht nicht unterstützen. FreeBSDs SMP-Implementierung verwendet präzises Locking und die Leistung skaliert nahezu linear mit der Anzahl der CPUs.
+
+man:smp[4] enthält weitere Informationen.
+
+=== Was ist Mikrocode ? Wie kann ich Intel CPU Microcode Updates installieren?
+
+Mikrocode ist eine Methode um Anweisungen auf Hardware-Ebene programmatisch zu implementieren. Dies ermöglicht es, CPU-Fehler ohne Austausch des Chips zu beheben.
+
+Installieren Sie package:sysutils/devcpu-data[] und fügen Sie:
+
+[.programlisting]
+....
+microcode_update_enable="YES"
+....
+
+in [.filename]#/etc/rc.conf# ein.
+
+[[compatibility-drives]]
+== 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 ESDI-Controller benutzen proprietäre Schnittstellen und laufen eventuell nicht: 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 FreeBSD http://www.FreeBSD.org/releases/11.0r/hardware/[11.0] oder http://www.FreeBSD.org/releases/9.3r/hardware/[9.3].
+
+=== Welche Arten von Bandlaufwerken werden unterstützt?
+
+FreeBSD unterstützt alle gängigen SCSI-Bandlaufwerke
+
+=== Unterstützt FreeBSD Bandwechsler?
+
+FreeBSD unterstützt SCSI-Bandwechsler über das Gerät man:ch[4] und das Kommando man:chio[1]. Details zum Betrieb des Wechslers finden Sie in 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 CD-ROM-Laufwerke werden von FreeBSD unterstützt?
+
+Jedes an einem unterstützten Controller angeschlossene SCSI-Laufwerk wird unterstützt. Zudem werden die meisten ATAPI kompatiblen IDE CD-ROMs unterstützt.
+
+FreeBSD unterstützt jedes ATAPI kompatible IDE CD-R- oder CD-RW-Laufwerk. Weitere Details finden Sie in der Manualpage man:burncd[8].
+
+FreeBSD unterstützt zudem jedes SCSI CD-R- oder CD-RW-Laufwerk. Installieren Sie den Port oder das Paket package:sysutils/cdrtools[] und benutzen Sie dann `cdrecord`.
+
+[[compatibility-kbd-mice]]
+== Tastaturen und Mäuse
+
+[[moused]]
+=== Kann die Maus außerhalb des X Window Systems benutzt werden?
+
+Falls Sie den Konsolentreiber man:syscons[4] benutzen, können Sie den Mauszeiger auf Textkonsolen zum Kopieren und Einfügen von Text verwenden. Starten Sie den Mausdaemon man:moused[8] und schalten Sie den Mauszeiger auf der virtuellen Konsole ein:
+
+[source,bash]
+....
+# moused -p /dev/xxxx -t yyyy
+# vidcontrol -m on
+....
+
+_xxxx_ ist der Gerätename der Maus und _yyyy_ ist das Protokoll. Der Mausdaemon 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, fügen Sie `moused_enable="YES"` in [.filename]#/etc/rc.conf# ein. Falls Sie den Mausdaemon auf allen virtuellen Bildschirmen anstatt nur auf der Konsole benutzen wollen, tragen Sie außerdem `allscreens_flags="-m on"` in [.filename]#/etc/rc.conf# ein.
+
+Während der Mausdaemon läuft, muss der Zugriff auf die Maus zwischen dem Mausdaemon und anderen Programmen, wie X Windows, koordiniert werden. Die FAQ<<x-and-moused,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?
+
+Sobald der Mausdaemon ausgeführt, wie in der <<moused,vorherigen Frage>> beschrieben, ausgeführt wird, können Sie die linke Maustaste benutzen um Text zu kopieren. Drücken Sie dann die mittlere Maustaste, um den Text an der Cursorposition einzufügen. Mit der rechten Maustaste kann der markierte Bereich "erweitert" werden.
+
+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 Manualpage 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 <<x-and-wheel,passenden Abschnitt>> der FAQ erfahren.
+
+=== Wie kann ich die Delete-Taste in der sh und csh einsetzen?
+
+Für die Bourne Shell fügen Sie die folgende Zeile in [.filename]#.shrc# ein. Lesen Sie dazu auch die Manualpages man:sh[1] und man:editrc[5].
+
+[.programlisting]
+....
+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 [.filename]#.cshrc#. Lesen Sie dazu auch die Manualpage man:csh[1].
+
+[.programlisting]
+....
+bindkey ^? delete-char # for console
+bindkey ^[[3~ delete-char # for xterm
+....
+
+Weitere Informationen zu diesem Thema finden Sie auf http://www.ibb.net/\~anne/keyboard.html[dieser Seite].
+
+[[compatibility-other]]
+== Sonstige Hardware
+
+=== Abhilfe für fehlenden Sound bei Verwendung des pcm4-Treibers?
+
+Einige Soundkarten setzen die Lautstärke bei jedem Systemstart auf 0. In diesem Fall müssen Sie nach jedem Bootvorgang den folgenden Befehl ausführen:
+
+[source,bash]
+....
+# mixer pcm 100 vol 100 cd 100
+....
+
+=== Unterstützt FreeBSD Power-Management auf meinem Laptop?
+
+FreeBSD unterstützt die ACPI-Funktionen moderner Hardware. Weitere Informationen dazu finden Sie in man:acpi[4].
+
+== Fehlerbehebung
+
+=== Warum zeigt FreeBSD eine falsche Speichergröße auf i386 Hardware an?
+
+Das liegt sehr wahrscheinlich an den Unterschieden zwischen physikalischen und virtuellen Speicheradressen.
+
+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 verwendet, um auf PCI-Hardware zuzugreifen. Dadurch kann in diesem Speicherbereich kein physikalischer Speicher verwaltet werden.
+
+Was mit dem in diesen Bereich gehörenden physikalischen Speicher passiert, hängt von der eingesetzten Hardware ab. Unglücklicherweise gibt es noch immer Hardware, die hier gar nichts macht. In diesem Fall ist das System nicht in der Lage, auf diese 500 MB des RAMs zuzugreifen.
+
+Ein Großteil der 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 verwirrenden Meldungen während des Systemstarts kommen.
+
+Unter 32-Bit-Versionen von FreeBSD 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. In diesem Fall müssen Sie die PAE-Unterstützung in den Kernel kompilieren. Lesen Sie dazu auch die entsprechenden Einträge über Speicherbegrenzungen und unterschiedliche Speicherbegrenzungen auf verschiedenen Plattformen.
+
+Verwenden Sie hingegen eine 64-Bit-Version von FreeBSD oder einen 32-Bit-Kernel mit aktivierter PAE-Unterstützung, ist FreeBSD in der Lage, diesen Speicherbereich korrekt zu erkennen und umzulenken, damit Sie weiterhin darauf zugreifen können. Allerdings wird, aufgrund der beschriebenen Umbelegung, in diesem Fall beim Systemstart mehr Speicher angezeigt, als tatsächlich auf dem System vorhanden ist. Dies ist aber normal und wird nach dem Ende des Systemstarts automatisch korrigiert.
+
+=== 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 das scheinbar zufällig immer wieder passiert, sollten Sie der Sache auf den Grund gehen.
+
+Das Problem hat in der Regel eine der folgenden Ursachen:
+
+. Wenn das Problem nur in einer bestimmten Anwendung auftritt, dann ist es wahrscheinlich ein Fehler im Quellcode.
+. 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 diese Teile des Codes benutzen können (dafür gibt es schließlich -CURRENT).
+
+Wenn der Fehler auftritt, wenn Sie ein Programm kompilieren 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 Kompilierung von [.filename]#ls.c# in [.filename]#ls.o# abbricht. Wenn Sie nochmal `make buildworld` ausführen und die Kompilierung an der gleichen Stelle abbricht, handelt es sich um einen Fehler im Quellcode. Aktualisieren Sie den Code und versuchen Sie es noch einmal. Wenn der Fehler jedoch an einer anderen Stelle auftritt, liegt das Problem mit an Sicherheit grenzender Wahrscheinlichkeit bei der Hardware.
+
+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 der Hardware verursacht wird.
+
+Typische Ursachen dafür sind:
+
+. Es könnte sein, dass die Festplatten zu warm werden: Überprüfen Sie, ob die Lüfter noch funktionieren, damit Festplatten und andere Hardware nicht heißlaufen.
+. Der Prozessor überhitzt, weil er übertaktet wurde oder der CPU-Kühler ausgefallen ist. Sie müssen sicherstellen, dass Sie die Hardware unter den Bedingungen betreiben, für die sie spezifiziert ist, 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. Zudem hat die Community wenig Mitgefühl bei Problemen mit übertakteten Systemen.
+. Unzuverlässiger Speicher: Wenn im Rechner mehr als ein SIMM/DIMM installiert ist, 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 den Einstellungen des BIOS und mit den Jumpern auf dem Mainboard können Sie diverse Timings ändern. In den meisten Fällen reichen die Voreinstellungen 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 Voreinstellungen des BIOS zu laden. Hierbei ist es sinnvoll, vorher die aktuellen Einstellungen zu notieren
+. Schlechte oder fehlerhafte Stromversorgung des Mainboards: Wenn Sie unbenutzte Steckkarten, Platten oder CD-ROMs in Ihrem System haben, sollten Sie sie testweise ausbauen oder die Stromversorgung abziehen. Dadurch können Sie prüfen, ob das 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 250 W-Netzteil benutzen, sollten Sie testweise ein 300 W-Netzteil einbauen.
+
+Lesen Sie den Abschnitt <<signal11,Signal 11>> für weitere Erklärungen. Es existiert eine ausführliche FAQ hierzu unter http://www.bitwizard.nl/sig11/[the SIG11 problem FAQ].
+
+Wenn alle diese Schritte nicht helfen, ist es möglich, dass Sie einen Fehler in FreeBSD gefunden haben. Folgen Sie einfach <<access-pr,diesen Anweisungen>> für die Erstellung eines Problem Reports.
+
+=== 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 nur die Fehlermeldung. Kopieren Sie die kompletten Meldungen und lesen Sie anschließend den FAQ-Abschnitt über <<kernel-panic-troubleshooting,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.
+
+=== Was bedeutet die Fehlermeldung maxproc limit exceeded by uid %i, please see tuning(7) and login.conf(5)?
+
+Der FreeBSD-Kernel beschränkt die Anzahl der gleichzeitig laufenden Prozesse. Die Anzahl errechnet sich aus dem Wert der `kern.maxusers` man:sysctl[8]-Variable. Auch andere Einstellungen wie die Anzahl der Puffer für Netzwerkoperationen werden durch `kern.maxusers` beeinflusst. Wenn das System stark belastet ist, sollten Sie den Wert von `kern.maxusers` erhöhen. Dadurch werden diverse Einstellungen des Systems angepasst und die maximale Anzahl gleichzeitig laufender Prozesse erhöht.
+
+Um den Wert von `kern.maxusers` anzupassen, folgen Sie den Anweisungen im Abschnitt link:{handbook}#kern-maxfiles[Datei und Prozeß Limits] des Handbuchs. Dieser Abschnitt spricht zwar nur von Dateien, für Prozesse gelten aber die gleichen Beschränkungen.
+
+Wenn das 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 [.filename]#/boot/loader.conf# anpassen. Um die Änderung zu aktivieren, müssen Sie das System neu starten. Wollen Sie das System zusätzlich optimieren, sollten Sie man:loader.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`, weil ein Systemprogramm, man:init[8], immer ausgeführt werden muss.
+
+=== Wieso funktionieren bildschirmorientierte Anwendungen beim Zugriff über ein Netzwerk nicht richtig?
+
+Die entfernte Maschine scheint den Terminaltyp auf etwas anderes als den Typ `xterm`, der von FreeBSD verlangt wird, zu setzen. Vielleicht hat aber auch der Kernel falsche Werte für die Breite und Höhe des Terminals.
+
+Überprüfen Sie, ob der Wert der `TERM`-Umgebungsvariable `xterm` ist. Wenn das entfernte Gerät dies nicht unterstützt, versuchen Sie `vt100`.
+
+Führen Sie `stty -a` aus, um zu überprüfen, was der Kernel für Terminalaußmaße eingestellt hat. Wenn diese Werte falsch sind, können sie mit `stty rows _RR_ cols _CC_` geändert werden.
+
+Falls package:x11/xterm[] installiert ist, können Sie alternativ auch `resize` ausführen, um die richtigen Einstellungen für das Terminal zu setzen.
+
+=== Wieso dauert es so lange, bis eine Verbindung über ssh oder telnet aufgebaut wird?
+
+Das Symptom: Nach dem Aufbau des TCP-Verbindung vergeht einige Zeit, bis endlich die Abfrage des Passwortes (bzw. der Login-Prompt bei man:telnet[1]) erscheint.
+
+Das Problem: In den meisten Fällen versucht der Server 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 in eine Protokolldatei zu schreiben.
+
+Die Lösung: wenn das Problem bei jedem Server auftritt, den Sie von dem Computer (dem Client) ansprechen, dann wird das Problem vom Client verursacht. Wenn das Problem aber nur auftritt, wenn jemand den Rechner (den Server) anspricht, dann liegt die Ursache beim Server.
+
+Wenn das Problem vom Client verursacht wird, müssen Sie die Einträge im DNS korrigieren, damit der Server die IP-Adresse übersetzen kann. Wenn das Problem im lokalen Netzwerk auftritt, sollten Sie es als Problem des Servers behandeln und weiterlesen; wenn es allerdings im Internet auftritt, sollten Sie Ihren ISP kontaktieren.
+
+Wenn das Problem vom Server im lokalen Netzwerk verursacht wird, dann müssen Sie den Server so konfigurieren, dass er die lokal genutzten IP-Adressen in Rechnernamen übersetzen kann. Weitere Informationen finden Sie in 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, ist das System nicht richtig konfiguriert.
+
+Haben Sie FreeBSD gerade erst installiert, kann es auch sein, dass die Domänen- und Nameserverinformationen noch nicht in [.filename]#/etc/resolv.conf# vorhanden sind. Dadurch kommt es häufig zu Verzögerungen beim Einsatz von SSH, weil die Option `UseDNS` in [.filename]#/etc/ssh/sshd_config# in der Voreinstellung auf `yes` gesetzt ist. Wenn dies der Fall, müssen Sie entweder die fehlenden Informationen in [.filename]#/etc/resolv.conf# eintragen oder als temporäre Maßnahme `UseDNS` auf `no` setzen.
+
+=== Warum sehe ich in der Ausgabe von dmesg8 häufig die Meldung file: table is full?
+
+Diese Fehlermeldung besagt, dass die zur Verfügung stehenden Datei-Deskriptoren des Systems aufgebraucht sind. Was das genau bedeutet und wie Sie dieses Problem lösen können, steht im Abschnitt link:{handbook}#kern-maxfiles[kern.maxfiles] im Kapitel link:{handbook}#configtuning-kernel-limits/[Einstellungen von Kernel Limits] des Handbuchs.
+
+=== Warum ist die Uhrzeit auf meinem Rechner immer falsch?
+
+Der Rechner 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 findet sich in der Zeile mit dem höchsten quality-Wert.
+
+[source,bash]
+....
+# dmesg | grep Timecounter
+Timecounter "i8254" frequency 1193182 Hz quality 0
+Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
+Timecounter "TSC" frequency 2998570050 Hz quality 800
+Timecounters tick every 1.000 msec
+....
+
+Sie können das überprüfen, indem Sie den Wert der man:sysctl[3]-Variablen `kern.timecounter.hardware` abfragen.
+
+[source,bash]
+....
+# sysctl kern.timecounter.hardware
+kern.timecounter.hardware: ACPI-fast
+....
+
+Es kann sich um einen defekten ACPI-Timer handeln. Die einfachste Lösung besteht darin, den ACPI-Timer in [.filename]#/boot/loader.conf# zu deaktivieren:
+
+[.programlisting]
+....
+debug.acpi.disabled="timer"
+....
+
+Es ist aber auch 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 man:sysctl[3]-Variable `kern.timecounter.hardware` geschrieben werden.
+
+[source,bash]
+....
+# sysctl kern.timecounter.hardware=i8254
+kern.timecounter.hardware: TSC -> i8254
+....
+
+Die Uhrzeit des Rechners sollte nun genauer funktionieren.
+
+Damit diese Änderung automatisch beim Start des Systems durchgeführt wird, müssen Sie die folgende Zeile in [.filename]#/etc/sysctl.conf# eintragen:
+
+[.programlisting]
+....
+kern.timecounter.hardware=i8254
+....
+
+=== Was bedeutet die Meldung swap_pager: indefinite wait buffer:?
+
+Ein Prozess wollte Speicher auf der 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 ist, sollten Sie entsprechende Meldungen in [.filename]#/var/log/messages# und der Ausgabe von `dmesg` finden. Andernfalls sollten Sie die Kabel und Verbindungen überprüfen.
+
+=== Was ist ein lock order reversal?
+
+Der FreeBSD-Kernel benutzt eine Reihe von Ressource-Locks, um den Zugriff auf Ressourcen zu regeln. Wenn verschiedene Kernel-Threads versuchen mehrere Ressource-Locks zu bekommen, besteht immer die Gefahr eines Deadlocks. Hierbei haben zwei Threads einen der Resource-Locks erhalten und blockieren sich nun gegenseitig, weil sie darauf warten, dass der jeweils andere Thread den Resource-Lock wieder freigibt. Diese Art von Locking-Problem kann vermieden werden, indem alle Threads die Locks in der gleichen Reihenfolge erhalten.
+
+In FreeBSD-CURRENT (nicht in STABLE- oder RELEASE-Zweigen) befindet sich das Diagnose-System man:witness[4], das potentielle Deadlocks in verschiedenen Teilen des Kernels zur Laufzeit erkennt. Das man:witness[4]-System versucht die Probleme zu erkennen und gibt die Meldung `lock order reversal` (auch bekannt als LOR) auf der Konsole aus.
+
+Weil man:witness[4] sehr konservativ vorgeht, ist es ist möglich, ein False Positive (Fehlalarm) zu erhalten. Eine Meldung bedeutet nicht zwangsläufig, dass das System einen Deadlock hat; Stattdessen sollte es als Warnung verstanden werden, dass hier ein Deadlock passiert sein könnte.
+
+[NOTE]
+====
+Problematische LORs werden schnell behoben. Prüfen Sie daher http://lists.FreeBSD.org/mailman/listinfo/freebsd-current[FreeBSD-CURRENT mailing list] bevor Sie diese Mailingliste kontaktieren.
+====
+
+=== Was hat die Fehlermeldung Called ... with the following non-sleepable locks held zu bedeuten?
+
+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 der 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.
+
+Weitere Informationen zum Locking unter FreeBSD finden Sie in man:locking[9].
+
+=== Warum bricht buildworld/installworld mit der Meldung touch: not found ab?
+
+Dieser Fehler bedeutet nicht, dass man:touch[1] nicht auf dem System vorhanden ist. Vielmehr sind Dateien die Ursache, deren Erzeugungsdatum in der Zukunft liegt. Wenn die CMOS-Uhr auf die lokale Zeit eingestellt ist, müssen Sie `adjkerntz -i` verwenden, um die Kerneluhr anzupassen, wenn Sie in den Single-User-Modus booten.
+
+== Anwendungen
+
+=== Wo finde ich die ganzen Anwendungen?
+
+Informationen zu auf FreeBSD portierten Anwendungen finden Sie auf der https://www.FreeBSD.org/ports/[Ports-Seite]. Die Liste enthält circa 24.000 Pakete und es werden ständig mehr. Sie sollten diese Liste daher im Auge behalten, oder die http://lists.FreeBSD.org/mailman/listinfo/freebsd-announce[FreeBSD announcements Mailingliste] abonnieren und regelmäßig auf neue Einträge prüfen.
+
+Die meisten Ports sollten auf allen unterstützten FreeBSD Versionen lauffähig sein. Nicht funktionierende Ports sind als solche gekennzeichnet. Jedes mal, wenn ein FreeBSD Release erstellt wird, wird ein Snapshot der Ports-Sammlung in [.filename]#ports/# mitgeliefert.
+
+FreeBSD unterstützt für die Installation komprimierte Binärpakete und Ports. Benutzen Sie man:pkg[7] um die Installation von Paketen zu steuern.
+
+=== Wie lade ich die Ports-Sammlung herunter? Soll ich dafür SVN benutzen?
+
+Die folgenden Methoden können verwendet werden:
+
+* In den meisten Situationen sollten Sie portsnap benutzen. Der Abschnitt link:{handbook}#ports-using/[Benutzen der Ports-Sammlung] beschreibt die Verwendung dieses Werkzeugs.
+* Verwenden Sie SVN, wenn Sie bestimmte Patches für den Portsbaum benötigen. Lesen Sie link:{handbook}#svn/[Benutzen von Subversion] für weitere Informationen.
+
+=== Unterstützt FreeBSD Java?
+
+Ja. Lesen Sie https://www.FreeBSD.org/java/[http://www.FreeBSD.org/java/] für weitere Informationen.
+
+=== Warum kann ich manche Ports auf meiner 9.X oder 10.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 zunächst die Ports-Sammlung aktualisieren müssen. Lesen Sie dazu link:{handbook}#ports-using/[Benutzen der Ports-Sammlung]. Ist die 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 https://bugs.FreeBSD.org/submit/[Fehlerbericht]. 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 die Ports-Sammlung aktuell ist. Fehler, die einen Bau von [.filename]#INDEX# aus einer aktuellen Ports-Sammlung verhindern, sind sofort sichtbar und werden daher fast immer umgehend behoben.
+
+Es gibt seltene Fälle, in denen [.filename]#INDEX# nicht gebaut werden kann, wenn bestimmte `WITH__*_` oder `WITHOUT__*_` Variablen in [.filename]#make.conf# gesetzt sind. Wenn Sie dieses Problem haben, sollten Sie diese make-Variablen deaktivieren und [.filename]#INDEX# erneut bauen, bevor Sie das Problem an die http://lists.FreeBSD.org/mailman/listinfo/freebsd-ports[FreeBSD Ports Mailingliste] melden.
+
+=== Ich habe die Quellen 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. Lesen Sie das Kapitel link:{handbook}#ports-using/[Benutzen der Ports-Sammlung] im FreeBSD Handbuch.
+
+=== Muss ich nach der Aktualisierung einer FreeBSD-Hauptversion jedes Mal alle Ports neu erstellen?
+
+Ja! Obwohl ein aktuelles System mit Software für eine ältere Version funktionieren wird, werden Sie mit zufälligen Abstürzen und nicht funktionierenden Ports zurückbleiben, sobald Sie anfangen, andere Ports zu installieren oder diejenigen, die Sie bereits haben, aktualisieren möchten.
+
+Wenn das System aktualisiert wird, werden verschiedene Shared-Libraries, ladbare Module und andere Systembestandteile durch neuere Versionen ersetzt. Anwendungen, die gegen die älteren Versionen gelinkt sind, werden nicht starten oder in anderen Fällen nicht korrekt funktionieren.
+
+Für weitere Informationen lesen Sie den Abschnitt link:{handbook}#freebsdupdate-upgrade[FreeBSD-Update] im FreeBSD Handbuch.
+
+=== Muss ich nach der Aktualisierung einer FreeBSD-Unterversion jedes Mal alle Ports neu erstellen?
+
+Generell nicht. Die FreeBSD-Entwickler tun ihr möglichstes, um die Binärkompatibilität über alle Veröffentlichungen mit der gleichen Hauptversionsnummer zu garantieren. Ausnahmen werden in den Release Notes dokumentiert und die darin enthaltenen Hinweise sollten befolgt werden.
+
+=== Warum ist /bin/sh so spartanisch? Warum benutzt FreeBSD nicht die bash oder eine andere Shell?
+
+Viele Leute müssen Shell-Programme schreiben, die auf vielen verschiedenen Systemen nutzbar sein müssen. Aus diesem Grund enthält der POSIX(TM)-Standard eine sehr detaillierte Definition der Shell und der Hilfsprogramme. Die meisten Programme werden für die Bourne Shell (man:sh[1]) geschrieben; außerdem nutzen mehrere wichtige Schnittstellen (man:make[1], man:system[3], man:popen[3] und höhere 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 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 stehen die luxuriöseren Shells wie `bash`, `scsh`, man:tcsh[1] und `zsh` zur Verfügung. Vergleichen Sie den Speicherverbrauch der verschiedenen Shells, indem Sie `ps -u` aufrufen und sich die Angaben in den Spalten "VSZ" und "RSS" ansehen.
+
+=== Wie erzeuge ich Audio-CDs aus MIDI-Dateien?
+
+Installieren Sie zuerst den Port package:audio/timidity[]. Danach müssen Sie manuell die GUS-Patche von Eric A. Welsh von http://alleg.sourceforge.net/digmid.html[http://alleg.sourceforge.net/digmid.html]. installieren. Wenn TiMidity++ richtig installiert wurde, können Sie mit dem folgenden Kommando MIDI-Dateien in das WAV-Format konvertieren:
+
+[source,bash]
+....
+% 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 link:{handbook}#creating-cds/[FreeBSD Handbuch]. beschrieben) auf Audio-CDs gebrannt werden.
+
+== Kernelkonfiguration
+
+[[make-kernel]]
+=== Ich möchte meinen Kernel anpassen. Ist das schwierig?
+
+Überhaupt nicht! Lesen Sie den link:{handbook}#kernelconfig/[Abschnitt zur Kernelkonfiguration im Handbuch].
+
+[NOTE]
+====
+Der neue [.filename]#kernel# wird zusammen mit seinen Modulen im Verzeichnis [.filename]#/boot/kernel# installiert werden. Der alte Kernel und dessen Module wird in das Verzeichnis [.filename]#/boot/kernel.old# verschoben, damit Sie, wenn Sie einen Fehler in Ihrer Konfiguration haben, die vorherige Version des Kernels starten können.
+====
+
+=== Warum ist mein Kernel so groß?
+
+FreeBSDs `GENERIC`-Kernels werden im _Debug-Modus_ erstellt. Ein Debug-Kernel enthält viele zusätzliche Informationen für die Fehlersuche. In FreeBSD 11.0 und neueren Versionen werden diese Debug-Dateien in [.filename]#/usr/lib/debug/boot/kernel# gespeichert. Ältere Versionen von FreeBSD speichern diese Dateien im selben Verzeichnis wie den Kernel, [.filename]#/boot/kernel#. 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, gibt es verschiedene Möglichkeiten die Größe von [.filename]#/boot/kernel/# und [.filename]#/usr/lib/debug/# zu reduzieren.
+
+Um die Kernel-Symbole nicht zu installieren, nehmen Sie folgende Zeile in [.filename]#/etc/src.conf# auf:
+
+[.programlisting]
+....
+WITHOUT_KERNEL_SYMBOLS=yes
+....
+
+Weitere Informationen finden Sie in man:src.conf[5].
+
+Wenn Sie überhaupt keine Debug-Dateien erzeugen möchten, müssen Sie folgendes sicherstellen:
+
+* Die folgende Zeile darf nicht in der Kernelkonfigurationsdatei enthalten sein:
++
+[.programlisting]
+....
+makeoptions DEBUG=-g
+....
+
+* Rufen Sie nicht man:config[8] mit `-g` auf.
+
+Jede der oben genannten Einstellungen bewirkt, dass der Kernel im Debug-Modus erstellt wird.
+
+Um nur die angegebenen Module zu erstellen und zu installieren, nehmen Sie diese in [.filename]#/etc/make.conf# auf:
+
+[.programlisting]
+....
+MODULES_OVERRIDE= accf_http ipfw
+....
+
+Ersetzen Sie _accf_httpd ipfw_ durch die gewünschten Module. Nur aufgelistete Module werden gebaut. Dies reduziert die Größe des Kernel-Verzeichnisses sowie die benötigte Zeit, um den Kernel zu übersetzen.
+
+Um die Größe des Kernels weiter zu reduzieren, können nicht benötigte Geräte aus dem Kernel entfernt werden. <<make-kernel>> enthält weitere Informationen.
+
+Um eine dieser Optionen in Kraft zu setzen, folgen Sie den Anweisungen zum link:{handbook}#kernelconfig-building/[Erstellen und Installieren] eines neuen Kernels.
+
+Der FreeBSD 11 amd64 Kernel ([.filename]#/boot/kernel/kernel#) ist circa 25 MB groß.
+
+=== Wieso kann ich nicht einmal den Standard-Kernel (GENERIC) bauen?
+
+Es gibt eine Reihe von möglichen Ursachen für dieses Problem:
+
+* Der Quellbaum unterscheidet sich von dem, der verwendet wird, um das aktuell laufende System zu erstellen. Wenn Sie ein Upgrade durchführen, lesen Sie [.filename]#/usr/src/UPDATING# und achten Sie besonders auf den Abschnitt "COMMON ITEMS" am Ende.
+* Beim Kommando `make buildworld` sind Fehler aufgetreten. Um seine Arbeit erledigen zu können, benötigt `make buildkernel` Dateien, die von `make buildworld` erzeugt werden.
+* Auch wenn Sie <<stable,FreeBSD-STABLE>> verwenden, ist es durchaus möglich, dass Sie die Quellen genau zum falschen Zeitpunkt aktualisiert haben: Während Sie gerade modifiziert wurden oder kurzzeitig fehlerhaft waren. Eine Garantie, dass Sie die Quellen übersetzen können, gibt es nur für die Releases, bei <<stable,FreeBSD-STABLE>> ist das nicht immer so. Versuchen Sie, die Quellen nochmals zu aktualisieren. Es ist denkbar, dass der von Ihnen genutzte Server zurzeit Probleme hat, benutzen Sie daher auch einmal einen anderen Server.
+
+=== Wie kann ich prüfen, welchen Scheduler das System benutzt?
+
+Der Name des aktuell verwendeten Schedulers steht in der sysctl-Variablen `kern.sched.name`:
+
+[source,bash]
+....
+sysctl`kern.sched.name`
+kern.sched.name: ULE
+....
+
+=== Was bedeutet kern.sched.quantum?
+
+`kern.sched.quantum` ist die maximale Anzahl Ticks, die ein Prozess im 4BSD-Scheduler ununterbrochen laufen kann.
+
+== Festplatten, Dateisysteme und Boot Loader
+
+=== Wie kann ich meine neue Festplatte in mein FreeBSD-System einbinden?
+
+Lesen Sie den Abschnitt link:{handbook}#disks-adding/[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 zu installieren und danach die Daten zu verschieben. Diese Methode ist sehr empfehlenswert, wenn Sie _-STABLE_ über ein Release hinaus genutzt haben oder ein Release aktualisiert haben. Sie können man:boot0cfg[8] auf beiden Platten 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.
+
+Alternativ können Sie die neue Platte entweder mit man:sade[8] oder man:gpart[8] partitionieren und labeln. Wenn die Festplatten mit MBR formatiert sind, kann booteasy auf beiden Festplatten mit man:boot0cfg[8] installiert werden, damit der Rechner nach dem Kopieren das alte oder neue System booten kann.
+
+Sobald die neue Festplatte eingerichtet ist, können die Daten nicht einfach kopiert werden. Verwenden Sie stattdessen Werkzeuge, die Gerätedateien und Dateiattribute verstehen, z. B. man:dump[8]. Obwohl empfohlen wird, die Daten im Einzelbenutzermodus zu verschieben, ist dies nicht zwingend erforderlich.
+
+Wenn die Festplatten mit UFS formatiert sind, verwenden Sie ausschließlich man:dump[8] und man:restore[8], um das Root-Dateisystem zu verschieben. Diese Befehle sollten auch beim Verschieben einer einzelnen Partition in eine andere, leere Partition verwendet werden. Um die Daten einer UFS-Partition auf eine andere Partition zu verschieben, müssen Sie die folgenden Schritte ausführen:
+
+[.procedure]
+====
+. Richten Sie in der neuen Partition mit `newfs` ein Dateisystem ein.
+. `mount` en 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 das Root-Dateisystem auf [.filename]#/dev/ad1s1a# verschieben wollen und diese derzeit auf [.filename]#/mnt# gemountet ist, geben Sie folgendes ein:
+
+[source,bash]
+....
+# newfs /dev/ada1s1a
+# mount /dev/ada1s1a /mnt
+# cd /mnt
+# dump 0af - / | restore rf -
+....
+
+Wenn Sie Partitionen mit `dump` umorganisieren wollen, bedeutet dies etwas mehr Arbeit. Wenn Sie eine Partition wie [.filename]#/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:
+
+[source,bash]
+....
+# newfs /dev/ada1s1a
+# mount /dev/ada1s1a /mnt
+# cd /mnt
+# dump 0af - / | restore rf -
+# cd var
+# dump 0af - /var | restore rf -
+....
+
+Wenn Sie ein Verzeichnis aus einer Partition herauslösen wollen, also z.B. [.filename]#/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:
+
+[source,bash]
+....
+# newfs /dev/ada1s1a
+# newfs /dev/ada1s1d
+# mount /dev/ada1s1a /mnt
+# mkdir /mnt/var
+# mount /dev/ada1s1d /mnt/var
+# cd /mnt
+# dump 0af - / | restore rf -
+....
+
+Zum Verschieben von Benutzerdaten stehen Werkzeuge wie man:cpio[1] und man:pax[1] zur Verfügung. Allerdings sind diese Programme dafür bekannt, dass sie die erweiterten Dateiattribute nicht verstehen, daher sollten Sie bei ihrem Einsatz aufpassen.
+
+=== Auf welchen Partitionen kann ich gefahrlos Soft Updates einsetzen? Ich habe gehört, dass der Einsatz von Soft Updates auf / Probleme verursachen kann. Was ist mit Journaled Soft Updates?
+
+Die schnelle Antwort: Sie können Soft Updates bedenkenlos auf alle Partitionen benutzen.
+
+Die ausführliche Antwort: Soft Updates besitzen zwei Eigenschaften, die auf bestimmten Partitionen unerwünscht sein können. 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 die Daten sind verloren. 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 gerade eben ausreichend Platz freigegeben haben. Ein paar Sekunden später funktioniert die Erstellung der Datei wie erwartet.
+
+Wenn der Kernel ein Datenpaket annimmt und das System abstürzt, bevor die Daten auf die Platte geschrieben wurden, kann es zum Verlust oder zur Zerstörung von Daten kommen. Dieses Risiko ist nur sehr gering und normalerweise überschaubar.
+
+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. 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.
+
+[.filename]#/# war schon immer eine der kleinsten Partitionen. Wenn [.filename]#/tmp# direkt auf [.filename]#/# liegt, kann es zeitweise zu den oben beschriebenen Platzproblemen kommen. Um das Problem zu lösen, sollten sie einen symbolischen Link von [.filename]#/tmp# nach [.filename]#/var/tmp# legen.
+
+Zudem sei noch angemerkt, dass man:dump[8] nicht im Live-Modus (-L) auf einem Dateisystem mit Journaled Soft Updates (SU+J) funktioniert.
+
+=== Kann ich andere fremde Dateisysteme unter FreeBSD mounten?
+
+FreeBSD unterstützt verschiedene fremde Dateisysteme:
+
+UFS::
+UFS-CD-ROMs 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.
+
+ext2/ext3::
+FreeBSD unterstützt `ext2fs` und `ext3fs`-Partitionen. Unter man:ext2fs[5] finden Sie weitere Informationen.
+
+NTFS::
+FUSE basierte NTFS-Unterstützung ist über einen Port verfügbar (package:sysutils/fuse-ntfs[]). Weitere Informationen finden Sie unter http://www.tuxera.com/community/ntfs-3g-manual/[ntfs-3g].
+
+FAT::
+FreeBSD enthält ein FAT-Treiber, der Lese- und Schreibzugriffe ermöglicht. Weitere Informationen finden Sie in man:mount_msdosfs[8].
+
+ZFS::
+FreeBSD enthält eine Portierung von Sun(TM)s ZFS Treiber. Die aktuelle Empfehlung ist, es nur auf amd64 Plattformen mit ausreichend Hauptspeicher zu verwenden. Mehr Informationen finden Sie in man:zfs[8].
+
+FreeBSD unterstützt auch das Netzwerk-Dateisystem NFS. Die FreeBSD Ports-Sammlung bietet zudem einige FUSE-Anwendungen um weitere Dateisysteme zu unterstützen.
+
+=== 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 einem zweiten SCSI-Laufwerk befindet, wird eine Gerätedatei für `Slice 5` in [.filename]#/dev# erstellt. Um diese zu mounten:
+
+[source,bash]
+....
+# mount -t msdosfs /dev/da1s5 /dos/e
+....
+
+=== Gibt es ein verschlüsselndes Dateisystem für FreeBSD?
+
+Ja. man:gbde[8] und man:geli[8]. Lesen Sie dazu auch den Abschnitt link:{handbook}#disks-encrypting/[Partitionen verschlüsseln] im FreeBSD Handbuch.
+
+=== Wie boote ich FreeBSD und Linux mit GRUB?
+
+Um FreeBSD mit GRUB zu booten, müssen Sie die folgenden Zeilen in Abhängigkeit der verwendeten Linux(TM)-Distribution in [.filename]#/boot/grub/menu.lst# oder [.filename]#/boot/grub/grub.conf# aufnehmen.
+
+[.programlisting]
+....
+title FreeBSD 9.1
+ root (hd0,a)
+ kernel /boot/loader
+....
+
+Dabei steht _hd0,a_ für die Root-Partition der ersten Festplatte. Benötigen Sie auch die Slice-Nummer, so verwenden Sie einen Eintrag 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.
+
+=== Wie boote ich FreeBSD und Linux mit BootEasy?
+
+Installieren Sie LILO am Anfang der Linux(TM)-Bootpartition, anstatt im Master Boot Record. Sie können LILO dann von BootEasy aus booten.
+
+Wenn Sie Windows(TM) und Linux(TM) benutzen, wird dies ohnehin empfohlen, um es einfacher zu machen, Linux(TM) wieder zu booten, wenn es nötig werden sollte, dass Sie Windows(TM) neu installieren.
+
+=== Wie kann ich das ??? des Boot-Managers durch etwas Sinnvolles ersetzen?
+
+Ohne den Boot-Manager neu zu schreiben, gar nicht. Allerdings gibt es in der Kategorie [.filename]#sysutils# der Ports-Sammlung diverse Boot-Manager, die diese Funktionalität bieten.
+
+=== Wie verwende ich einen neuen Wechseldatenträger?
+
+Wenn auf dem Laufwerk bereits ein Dateisystem existiert, können Sie folgendes Kommando benutzen:
+
+[source,bash]
+....
+# mount -t msdosfs /dev/da0s1 /mnt
+....
+
+Wenn das Laufwerk nur mit FreeBSD-Systemen verwendet wird, partitionieren Sie es mit UFS oder ZFS. Dies bietet Unterstützung für lange Dateinamen, eine verbesserte Leistung und Stabilität. Wenn das Laufwerk von anderen Betriebssystemen verwendet wird, ist bspw. msdosfs die bessere Wahl.
+
+[source,bash]
+....
+# dd if=/dev/zero of=/dev/da0 count=2
+# gpart create -s GPT /dev/da0
+# gpart add -t freebsd-ufs /dev/da0
+....
+
+Anschließend erstellen Sie ein neues Dateisystem:
+
+[source,bash]
+....
+# newfs /dev/da0p1
+....
+
+und mounten es:
+
+[source,bash]
+....
+# mount /dev/da0s1 /mnt
+....
+
+Es ist eine gute Idee einen Eintrag in [.filename]#/etc/fstab# hinzuzufügen (siehe man:fstab[5]), sodass Sie in Zukunft einfach nur `mount /mnt` eingeben müssen:
+
+[.programlisting]
+....
+/dev/da0p1 /mnt ufs rw,noauto 0 0
+....
+
+=== Wieso erhalte ich die Meldung Incorrect super block beim Mounten einer CD?
+
+Sie müssen man:mount[8] mitteilen, was für ein Gerät Sie mounten wollen. Genauere Informationen dazu finden Sie im Abschnitt link:{handbook}#mounting-cd[Einhängen von Daten-CDs] des Handbuchs.
+
+=== Wieso erhalte ich die Meldung Device not configured, wenn ich eine CD mounte?
+
+Das bedeutet im allgemeinen, dass sich keine CD im Laufwerk befindet, oder dass das Laufwerk auf dem Bus nicht sichtbar ist. Dieses Problem wird im Kapitel link:{handbook}#mounting-cd[Einhängen 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 CD-ROM die "Joliet" Erweiterungen für die Speicherung von Datei- und Verzeichnisnamen benutzt. Werfen Sie einen Blick in das Kapitel link:{handbook}#mounting-cd[Einhängen von Daten-CDs] im Handbuch.
+
+=== Ich habe eine CD mit FreeBSD gebrannt und kann sie nicht mit anderen Betriebssystemen lesen. Warum?
+
+Sie haben wahrscheinlich eine Datei direkt auf CD geschrieben, statt ein ISO 9660-Dateisystem erzeugt zu haben. Werfen Sie einen Blick in das Kapitel link:{handbook}#mounting-cd[Einhängen von Daten-CDs] im Handbuch.
+
+=== Wie kann ich ein Image einer Daten-CD erzeugen?
+
+Diese Information finden Sie im Abschnitt link:{handbook}#mkisofs[Daten auf ein ISO-Dateisystem schreiben] des Handbuchs. Weitere Informationen über die Arbeit mit CD-ROMs finden Sie im Abschnitt link:{handbook}#creating-cds/[Erstellen und Verwenden von CDs] im Kapitel Speichermedien des Handbuchs.
+
+=== Wieso kommt mount nicht mit einer Audio-CD zurecht?
+
+Wenn Sie versuchen eine Audio-CD zu mounten, erhalten Sie die Meldung `cd9660: /dev/acd0c: Invalid argument`. Der Grund dafür ist, dass `mount` nur mit Dateisystemen arbeitet. Audio-CDs haben kein Dateisystem, sondern nur Daten. Wenn Sie eine Audio-CD auslesen wollen, brauchen Sie ein entsprechendes Programm wie z.B. den Port oder das Paket package:audio/xmcd[].
+
+=== Wie mounte ich 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 `-s` definieren. Weitere Informationen und Beispiele finden Sie in man:mount_cd9660[8].
+
+=== Wie lasse ich normale Benutzer Disketten, CD-ROMs und andere Wechseldatenträger mounten?
+
+Setzen Sie als `root` die sysctl-Variable `vfs.usermount` auf `1`:
+
+[source,bash]
+....
+# sysctl vfs.usermount=1
+....
+
+Fügen Sie den Eintrag `vfs.usermount=1` in [.filename]#/etc/sysctl.conf# hinzu, damit die Einstellung beim nächsten Systemstart erneut gesetzt wird.
+
+Benutzer dürfen nur Geräte mounten, auf die sie Leserechte haben. Um es Benutzern zu gestatten Geräte zu mounten, müssen die entsprechenden Berechtigungen in [.filename]#/etc/sysctl.conf# gesetzt werden.
+
+Wenn Sie zum Beispiel den Benutzern den Zugriff auf das erste USB-Laufwerk zu erlauben wollen:
+
+[.programlisting]
+....
+# Allow all users to mount a USB drive.
+ own /dev/da0 root:operator
+ perm /dev/da0 0666
+....
+
+Alle Benutzer können nun Geräte, die sie lesen können, in ein Verzeichnis einbinden, das sie besitzen:
+
+[source,bash]
+....
+% mkdir ~/my-mount-point
+% mount -t msdosfs /dev/da0 ~/my-mount-point
+....
+
+Das Aushängen eines Gerätes ist einfach:
+
+[source,bash]
+....
+% umount ~/my-mount-point
+....
+
+Die Aktivierung von `vfs.usermount` hat jedoch negative Auswirkungen auf Sicherheitsaspekte. Ein besserer Weg, um auf MS-DOS(TM)-formatierte Datenträger zuzugreifen, ist die Benutzung des Pakets oder Ports package:emulators/mtools[].
+
+[NOTE]
+====
+Der Gerätename in diesen Beispielen muss an die Konfiguration angepasst werden.
+====
+
+=== Wieso geben die Befehle du und df unterschiedliche Werte für den freien Plattenplatz aus?
+
+Der Grund liegt in der unterschiedlichen Funktionsweise der beiden Befehle. `du` durchläuft 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 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.
+
+Die oben beschriebene Situation tritt sehr häufig auf Webservern auf. Viele Anwender installieren einen FreeBSD Webserver und vergessen die Rotation der Logdateien, bis irgendwann die Partition [.filename]#/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 Webserver beendet und neu gestartet wird; dadurch kann das System den Plattenplatz freigeben. Um dies zu verhindern, sollten Sie man:newsyslog[8] einsetzen.
+
+Bitte beachten Sie, dass die Freigabe des Plattenplatzes durch Soft Updates um bis zu 30 Sekunden verzögert werden kann.
+
+=== Wie kann ich den Swap-Bereich vergrößern?
+
+Der Abschnitt link:{handbook}#adding-swap-space/[Hinzufügen von Swap-Bereichen] im Handbuch enthält hierzu eine Schritt-für-Schritt Anleitung.
+
+=== Warum ist meine Festplatte unter FreeBSD kleiner, als sie laut Hersteller sein soll?
+
+Festplattenhersteller definieren ein Gigabyte als eine Milliarde Bytes, für FreeBSD 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 FreeBSD (in der Voreinstellung) 8 % des Plattenplatzes für sich <<disk-more-than-full,reserviert>>.
+
+=== Warum kann eine Partition zu mehr als 100% gefüllt sein?
+
+Ein Teil jeder UFS Partition (8% in der Voreinstellung) ist für das Betriebssystem und den Benutzer `root` reserviert. man:df[1] rechnet diesen Teil bei der Ausgabe der Spalte `Capacity` nicht ein, so dass dort Werte über 100% angezeigt werden können. Die Anzahl der Blöcke in der Spalte `Blocks` 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 `-m` von man:tunefs[8] einstellen.
+
+=== Warum pausiert FreeBSD beim Booten so lange, wenn das System große Mengen RAM hat?
+
+FreeBSD 10.1 und ältere Versionen führen zu Beginn des Bootens einen Speichertest aus. Wenn das System wenig Arbeitsspeicher hat, dauert dieser Test nur wenige Sekunden. Systeme mit zehn oder hunderten von Gigabytes Arbeitsspeicher benötigen mehrere Minuten. Durch Hinzufügen von `hw.memtest.tests=0` in [.filename]#/boot/loader.conf# können Sie diesen Test deaktivieren.
+
+Für weitere Informationen, lesen Sie man:loader.conf[5].
+
+== ZFS
+
+=== Wieviel RAM wird mindestens benötigt, wenn ich ZFS einsetzen möchte?
+
+Für eine komfortable Nutzung werden mindestens 4 GB RAM empfohlen. Dies ist jedoch auch von der individuellen Auslastung abhängig.
+
+=== Was ist das ZIL und für was wird es benutzt?
+
+Das ZIL (ZFS intent log) ist ein Schreib-Cache, der verwendet wird, um posix verpflichtende Schreib-Semantiken über Abstürze hinweg zu implementieren. Normalerweise werden Schreiboperationen in Transaktionsgruppen zusammengefasst und auf den Datenträger geschrieben ("Transaction Group Commit"). Systemaufrufe wie man:fsync[2] benötigen jedoch eine Bestätigung, dass die Daten auf den Datenträger geschrieben wurden, bevor sie weitermachen. Das ZIL wird für Schreibvorgänge verwendet, welche zwar als gespeichert bestätigt, jedoch noch nicht als Teil einer Transaktion auf die Festplatte geschrieben wurden. Im Fall eines Systemabsturzes wird der letzte gültige Zeitstempel ermittelt und die fehlenden Daten werden aus dem ZIL zusammengesetzt.
+
+=== Benötige ich für den Einsatz von ZIL eine SSD?
+
+In der Voreinstellung speichert ZFS das ZIL zusammen mit den anderen Daten innerhalb des Pools. Wenn eine Anwendung viele Schreiboperationen erzeugt, kann es die Gesamtleistung verbessern, wenn das ZIL auf einem separaten Gerät gespeichert wird, welches eine hohe Leistung bei synchronen, sequentiellen Schreibvorgängen erzielt. Bei geringerer Last bieten SSDs kaum eine Verbesserung.
+
+=== Was ist der L2ARC?
+
+Der L2ARC ist ein Lese-Cache, der auf einem schnellen Gerät, bspw. einer SSD, gespeichert wird. Die Daten in diesem Cache gehen bei einem Neustart verloren. Beachten Sie, dass primär RAM als Cache verwendet wird, und dass der L2ARC nur dann benötigt wird, wenn nicht genügend RAM verfügbar ist.
+
+L2ARC benötigt Platz im ARC, um es zu indizieren. Ein Arbeitsbereich, der perfekt in den ARC passt, passt nicht mehr, wenn ein L2ARC verwendet wird, da ein Teil des ARC den L2ARC-Index beinhaltet und einen Teil des Arbeitsbereichs in den L2ARC schreibt, der langsamer als der RAM ist.
+
+=== Ist es ratsam, Deduplizierung zu aktivieren?
+
+Im Allgemeinen nicht.
+
+Deduplizierung benötigt sehr viel RAM und kann die Lese- und Schreibzugriffe auf die Festplatte verringern. Wenn Sie keine Daten speichern, die sehr stark dupliziert sind, bspw. Abbilder von virtuellen Maschinen oder Backups von Benutzern, dann ist es eher wahrscheinlich, dass Deplizierung mehr Schaden als Nutzen bringt. Zudem ist es nicht möglich, den Status der Deduplizierung umzukehren. Wenn Daten bei aktivierter Deduplizierung geschrieben werden, werden diese nach einer Deaktivierung der Deduplizierung erst wieder repliziert, nachdem die nächste Änderung stattfindet.
+
+Deduplizierung kann auch zu einigen unerwarteten Situationen führen. Insbesondere kann das Löschen von Dateien viel langsamer sein.
+
+=== Ich kann in meinem ZFS Pool keine Dateien erstellen oder löschen. Wie kann ich das ändern?
+
+Die könnte passieren, wenn der Pool zu 100% belegt ist. ZFS benötigt Platz auf der Festplatte, um Transaktionsmetadaten zu speichern. Um den Pool wieder benutzbar zu machen, kürzen Sie einfach die zu löschende Datei:
+
+[source,bash]
+....
+% truncate -s 0 unimportant-file
+....
+
+Dies funktioniert, weil keine neue Transaktion gestartet wird, stattdessen werden neue Ersatzblöcke erzeugt.
+
+[NOTE]
+====
+Auf Systemen mit zusätzlichen ZFS Optimierungen, wie Deduplizierung, steht der Speicherplatz vielleicht nicht sofort zur Verfügung.
+====
+
+=== Enthält ZFS TRIM-Unterstützung für Solid State Drives?
+
+ZFS TRIM-Unterstützung wurde in FreeBSD 10-CURRENT mit Revision rlink:https://svnweb.freebsd.org/changeset/base/240868[r240868] hinzugefügt. In die FreeBSD-STABLE Zweige wurde die Unterstützung mit rlink:https://svnweb.freebsd.org/changeset/base/252162[r252162] und link:https://svnweb.freebsd.org/changeset/base/251419[r251419] hinzugefügt.
+
+ZFS TRIM ist in der Voreinstellung aktiviert, kann aber mit dem folgenden Eintrag in [.filename]#/etc/sysctl.conf# deaktiviert werden:
+
+[.programlisting]
+....
+vfs.zfs.trim_disable=1
+....
+
+[NOTE]
+====
+ZFS TRIM funktioniert möglicherweise nicht in allen Konfigurationen, beispielsweise mit einem ZFS-Dateisystem auf einer mit GELI verschlüsselten Festplatte.
+====
+
+== Systemadministration
+
+=== Wo befinden sich die Konfigurationsdateien für den Systemstart?
+
+[.filename]#/etc/defaults/rc.conf# (siehe man:rc.conf[5]) ist die primäre Konfigurationsdatei. Die Startskripten des Systems, wie [.filename]#/etc/rc# und [.filename]#/etc/rc.d# (siehe man:rc[8]) inkludieren diese Datei. _Ändern Sie diese Datei nicht!_ Wenn Sie den Wert einer der in [.filename]#/etc/defaults/rc.conf# gesetzten Variablen ändern wollen, kopieren Sie die entsprechende Zeile nach [.filename]#/etc/rc.conf# und ändern die Zeile dort.
+
+Wenn Sie zum Beispiel den mitgelieferten DNS-Server man:named[8] aktivieren wollen, können Sie das folgende Kommando eingeben:
+
+[source,bash]
+....
+# echo 'named_enable="YES"' >> /etc/rc.conf
+....
+
+Wenn Sie lokale Server starten wollen, müssen Sie die Shellskripten im Verzeichnis [.filename]#/usr/local/etc/rc.d/# ablegen. Die Dateien sollten als ausführbar markiert sein und die Dateiberechtigungen `555` besitzen.
+
+=== 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].
+
+Um einen Benutzer wieder zu löschen, können Sie den Befehl man:rmuser[8] benutzen. Sie können, wenn nötig, auch man:pw[8] benutzen.
+
+=== Warum erhalte ich Meldungen wie root: not found, nachdem ich /etc/crontab geändert habe?
+
+Dies geschieht in der Regel, wenn sie die crontab des Systems verändern. Das ist aber nicht der richtige Weg, weil die crontab des Systems ein anderes Format hat, als die crontabs der Benutzer. Die crontab des Systems enthält ein zusätzliches Feld für den Benutzer, welcher das Kommando ausführt. man:cron[8] geht davon aus, das der Benutzername das auszuführenden Kommando ist. Da ein solches Kommando jedoch nicht existiert, wird diese Meldung angezeigt.
+
+Geben Sie das folgende ein um die zusätzliche, fehlerhafte crontab zu löschen:
+
+[source,bash]
+....
+# crontab -r
+....
+
+=== Wieso erhalte ich die Meldung you are not in the correct group to su root, wenn ich mit su zu root wechseln will?
+
+Das ist ein Sicherheitsmerkmal Wenn Sie mit `su` zu `root` oder jedem anderen Account mit Super-User-Privilegien wechseln wollen, müssen Sie Mitglied der Gruppe `wheel` sein. Wenn es dieses Merkmal 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.
+
+Um einem Benutzer zu erlauben, mit `su root` zu werden, müssen Sie ihn mit `pw` zur Gruppe `wheel` hinzufügen:
+
+[source,bash]
+....
+# pw groupmod wheel -m lisa
+....
+
+Das obige Beispiel würde den Benutzer `lisa` zur Gruppe `wheel` hinzufügen.
+
+=== 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?
+
+Starten Sie das System mittels `boot -s` an der Loader-Eingabeaufforderung neu, um in den Single-User-Modus zu gelangen. Wenn Sie aufgefordert werden, den Pfadnamen der Shell einzugeben, drücken Sie einfach Enter. Geben Sie danach `mount -urw /` 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=xterm` ausführen müssen, damit diese Editoren die richtigen Einstellungen aus der Datenbank man:termcap[5] übernehmen.
+
+Sobald Sie diese Schritte ausgeführt haben, können Sie den Fehler in [.filename]#/etc/rc.conf# ganz normal beheben. Die Fehlermeldungen, die unmittelbar nach den Startmeldungen des Kernels angezeigt wurden, sollten die Nummer der Zeile mit dem Fehler melden.
+
+=== Wieso habe ich habe Probleme, meinen Drucker einzurichten?
+
+Lesen Sie zur Problembehandlung das Kapitel link:{handbook}#printing/[Drucken] im Handbuch.
+
+=== Wie kann ich die Tastaturbelegung meines Systems korrigieren?
+
+Informationen dazu finden Sie im Kapitel link:{handbook}#using-localization/[Lokalisierung] des Handbuchs, insbesondere im Abschnitt link:{handbook}#setting-console[Einrichten der Konsole].
+
+=== Wieso funktionieren die Benutzer-Quotas nicht richtig?
+
+. Es kann sein, dass der Kernel nicht für den Einsatz von Quotas konfiguriert ist. In diesem Fall müssen Sie folgende Zeile in die Kernelkonfigurationsdatei aufnehmen und den Kernel neu bauen:
++
+[.programlisting]
+....
+options QUOTA
+....
+
++
+Weitere Informationen zum Einsatz von Quotas finden Sie im Abschnitt link:{handbook}#quotas/[Disk Quotas] des Handbuchs.
+. Benutzen Sie keine Quotas für [.filename]#/#.
+. Erstellen Sie die Quotas-Datei in dem Dateisystem, für das die Quotas gelten sollen:
++
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Dateisystem
+| Quotas-Datei
+
+|[.filename]#/usr#
+|[.filename]#/usr/admin/quotas#
+
+|[.filename]#/home#
+|[.filename]#/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 [.filename]#GENERIC#-Kernel. Wenn Sie einen angepassten Kernel verwenden, können Sie die für Unterstützung die Kernelmodule [.filename]#sysvshm.ko#, [.filename]#sysvsem.ko# und [.filename]#sysvmsg.ko# laden. Alternativ können Sie die folgenden Zeilen in die Kernelkonfigurationsdatei aufnehmen:
+
+[.programlisting]
+....
+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?
+
+Der http://www.sendmail.org/[Sendmail] Server ist der voreingestellte Mail-Server unter FreeBSD. Sie können ihn aber problemlos durch einen anderen MTA aus der Ports-Sammlung ersetzen, z.B. package:mail/exim[], package:mail/postfix[], oder package:mail/qmail[]. Diskussionen über die Vor- und Nachteile der einzelnen MTAs finden Sie auf den Mailinglisten.
+
+=== Was kann ich machen, wenn ich das Passwort für root vergessen habe?
+
+Keine Panik! Starten Sie das System neu und geben Sie `boot -s` an der Eingabeaufforderung `Boot:` ein, um in den Single-User-Modus zu gelangen. Bei der Frage, welche Shell benutzt werden soll, drücken Sie einfach kbd:[Enter]. Nun erscheint die Eingabeaufforderung `#`. Geben Sie `mount -urw /` ein, um das Root-Dateisystem für Lese- und Schreibzugriffe zu mounten und dann `mount -a` um alle Dateisysteme zu mounten. Mit `passwd root` können Sie das Passwort für `root` ändern und mit man:exit[1] können Sie mit dem Booten fortfahren.
+
+[NOTE]
+====
+Wenn Sie immer noch dazu aufgefordert werden, das Passwort für `root` beim Betreten des Single-User-Modus einzugeben, bedeutet das, dass die Konsole in [.filename]#/etc/ttys# als `insecure` markiert wurde. In diesem Fall ist es notwendig, von einem FreeBSD Installationsmedium zu booten, die Option [.guimenuitem]#Live CD# oder [.guimenuitem]#Shell# auszuwählen und die oben beschriebenen Befehle einzugeben. Mounten Sie die entsprechende Partition und wechseln Sie mit `chroot` in die Partition. Ersetzen Sie bspw. `mount -urw /` durch `mount /dev/ada0p1 /mnt; chroot /mnt` falls eine solche Partition auf dem System existiert.
+====
+
+[NOTE]
+====
+Wenn Sie die Root-Partition im Single-User-Modus nicht mounten können, liegt es möglicherweise daran, dass die Partitionen verschlüsselt sind und es damit unmöglich ist, sie ohne die dazugehörigen Schlüssel zu mounten. Für weitere Informationen lesen Sie den Abschnitt über verschlüsselte Partitionen im FreeBSD link:{handbook}#disks-encrypting/[Handbuch].
+====
+
+=== Wie verhindere ich, dass das System mit StrgAltEntf rebootet werden kann?
+
+Falls Sie man:syscons[4] (der Standard-Treiber für die Konsole) benutzen, fügen Sie folgende Zeile in die Kernelkonfigurationsdatei ein und bauen und installieren Sie einen neuen Kernel:
+
+[.programlisting]
+....
+options SC_DISABLE_REBOOT
+....
+
+Alternativ kann die folgende man:sysctl[8]-Variable gesetzt werden, ohne dass Sie das System dazu neu starten oder einen angepassten Kernel erstellen müssen:
+
+[source,bash]
+....
+# sysctl hw.syscons.kbd_reboot=0
+....
+
+[NOTE]
+====
+Die beiden oben genannten Methoden schließen sich gegenseitig aus: Diese man:sysctl[8]-Variable existiert nicht, wenn Sie einen Kernel mit der Option `SC_DISABLE_REBOOT` bauen.
+====
+
+=== Wie kann ich DOS-Textdateien unter UNIX verwenden?
+
+Benutzen Sie diesen man:perl[1]-Befehl:
+
+[source,bash]
+....
+% perl -i.bak -npe 's/\r\n/\n/g' file(s)
+....
+
+Wobei _file(s)_ eine oder mehrere zu verarbeitende(n) Datei(en) ist/sind. Die Änderungen erfolgen in der Originaldatei, die zuvor mit der Erweiterung [.filename]#.bak# gesichert wird.
+
+Alternativ können Sie den Befehl man:tr[1] benutzen:
+
+[source,bash]
+....
+% 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`.
+
+Die Verwendung von package:converters/dosunix[] aus der Ports-Sammlung stellt eine weitere Möglichkeit dar, DOS-Textdateien neu zu formatieren. Konsultieren Sie die Dokumentation für weitere Informationen.
+
+=== Wie lade ich /etc/rc.conf und starte /etc/rc neu, ohne zu rebooten?
+
+Gehen Sie in den Single-User-Modus und dann zurück in den Multi-User-Modus:
+
+[source,bash]
+....
+# shutdown now
+# return
+# exit
+....
+
+=== Ich wollte auf das aktuelle -STABLE aktualisieren, und plötzlich läuft auf dem System 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 ein neues Release bevorsteht. PRERELEASE bedeutet bei FreeBSD, dass der Quellcode zur Vorbereitung auf ein Release "ingefroren" wurde (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 9.0-RELEASE werden aus dem aktuellen Stand des Hauptzweiges der Entwicklung (besser bekannt als <<current,-CURRENT>>) erzeugt. Minor Releases wie 6.3-RELEASE oder 5.2-RELEASE stammen aus dem aktiven <<stable,-STABLE>> Zweig. Seit 4.3-RELEASE gibt 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 (normalerweise nur Sicherheitsaktualisierungen).
+
+Bevor in einem Zweig ein 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 ein Release erfolgen wird. Wenn der Zweig zum Beispiel 6.2-STABLE genannt wurde, wird der Name in 6.3-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 Quellcode noch korrigiert werden. Wenn der Quellcode so weit "gereift" ist, dass ein Release erstellt werden kann, wird der Name in 6.3-RC geändert, um genau dies anzuzeigen. In dieser Phase können nur noch extrem wichtige Korrekturen aufgenommen werden. Sobald das Release (in diesem Beispiel 6.3-RELEASE) erfolgt ist, wird der Zweig in 6.3-STABLE umbenannt.
+
+Weitere Informationen über Versionsnummern und die verschiedenen Entwicklungszweige enthält der Artikel link:{releng}[Release Engineering].
+
+=== Als ich versucht habe, einen neuen Kernel zu installieren, ist chflags1 fehlgeschlagen. Was mache ich jetzt?
+
+Kurze Antwort: die Sicherheitseinstellung (der securelevel) ist größer als 0. Sie müssen das System im Single-User-Modus starten, um den Kernel zu installieren.
+
+Ausführliche Antwort: Wenn die Sicherheitseinstellung größer als 0 ist, erlaubt es FreeBSD nicht, die Systemeinstellungen zu ändern. Um den aktuellen Securelevel zu ermitteln, können Sie das folgende Kommando benutzen:
+
+[source,bash]
+....
+# sysctl kern.securelevel
+....
+
+Sie können die Sicherheitseinstellung im Mehrbenutzer-Modus nicht verringern. Sie müssen das System im Single-User-Modus starten, um den Kernel zu installieren oder den Securelevel in [.filename]#/etc/rc.conf# zu ändern und anschließend das System neu starten. Lesen Sie Manualpage von man:init[8] für weitere Details zu `securelevel`. Zusätzliche Informationen zu [.filename]#/etc/rc.conf# finden Sie in [.filename]#/etc/defaults/rc.conf# und der Manualpage man:rc.conf[5].
+
+=== Ich kann die Systemzeit nicht um mehr als eine Sekunde verstellen. Was mache ich jetzt?
+
+Kurze Antwort: Die Sicherheitseinstellung (der securelevel) ist 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 es FreeBSD nicht, die Systemzeit zu ändern. Um den aktuellen Securelevel zu ermitteln, können Sie das folgende Kommando benutzen:
+
+[source,bash]
+....
+# sysctl kern.securelevel
+....
+
+Sie können die Sicherheitseinstellung im Mehrbenutzer-Modus nicht verringern. Sie müssen das System im Single-User-Modus starten, um die Systemzeit oder den Securelevel in [.filename]#/etc/rc.conf# zu ändern und anschließend das System neu starten. Lesen Sie Manualpage von man:init[8] für weitere Details zu `securelevel`. Zusätzliche Informationen zu [.filename]#/etc/rc.conf# finden Sie in [.filename]#/etc/defaults/rc.conf# und der Manualpage man:rc.conf[5].
+
+=== Warum braucht rpc.statd 256 MB Speicher?
+
+Nein, das Programm hat kein Speicherleck und es verbraucht auch nicht 256 MB 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 [.filename]#/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 Quellcode sehen: Die Längenangabe beim Aufruf von man:mmap[2] ist `0x10000000`, ein sechzehntel des Adressraums bei IA32, oder genau 256 MB.
+
+=== Warum kann ich das Dateiattribut schg nicht löschen?
+
+Sie betreiben das System mit einer erhöhten Sicherheitsstufe. Senken Sie die Sicherheitsstufe und versuchen Sie es dann noch einmal. Weitere Informationen erhalten Sie im <<securelevel,FAQ Eintrag über Sicherheitsstufen>> und in der Manualpage man:init[8].
+
+=== Was ist vnlru?
+
+`vnlru` schreibt vnodes auf Platte und gibt sie wieder frei, falls das System den 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?
+
+* `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 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. Dies ist ungefähr die kumulierte Größe von `Inactive` und `Free`. 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.
+
+=== Was ist /var/empty?
+
+Das Verzeichnis [.filename]#/var/empty# wird von man:sshd[8] benötigt, wenn es mit "Privilege Separation" ausgeführt wird. Das Verzeichnis [.filename]#/var/empty# ist leer, gehört `root` und ist durch das Dateiattribut `schg` geschützt.
+
+=== Ich habe eben /etc/newsyslog.conf geändert. Wie kann ich das Ergebnis überprüfen?
+
+Um zu sehen wie man:newsyslog[8] reagiert, verwenden Sie das folgende Kommando:
+
+[source,bash]
+....
+% newsyslog -nrvv
+....
+
+=== Meine Systemuhr geht falsch. Wie kann ich die Zeitzone ändern?
+
+Benutzen Sie man:tzsetup[8].
+
+== 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(TM)- und UNIX(TM)-ähnliche Systeme, zu denen auch FreeBSD gehört. Der http://en.wikipedia.org/wiki/X_Window_System_core_protocol[X Protokollstandard] wird von der http://www.x.org/wiki/[X.Org Foundation] definiert und liegt aktuell in Version 11 Release 7.7 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.
+
+=== Ich möchte Xorg benutzen, was muss ich tun?
+
+Sie können Xorg wie folgt installieren:
+
+Benutzen Sie den Meta-Port package:x11/xorg[], der sämtliche Xorg Komponenten installiert.
+
+Benutzen Sie package:x11/xorg-minimal[], der nur die benötigten Komponenten installiert.
+
+Sie können Xorg auch als Paket installieren:
+
+[source,bash]
+....
+ # pkg install xorg
+....
+
+Lesen Sie nach erfolgreicher Installation von Xorg den Abschnitt link:{handbook}#x-config/[X11 konfigurieren] im FreeBSD Handbuch.
+
+=== Ich habe versucht, X zu starten, aber wenn ich startx eingebe, erhalte ich die Fehlermeldung No devices detected.. Was soll ich jetzt machen?
+
+Das System läuft wahrscheinlich auf einer erhöhten Sicherheitsstufe (`securelevel`). X kann auf einer erhöhten Sicherheitsstufe nicht gestartet werden, weil X dazu Schreibzugriff auf man:io[4] benötigt. Lesen Sie dazu auch die Manualpage man:init[8].
+
+Es gibt zwei Lösungen für dieses Problem: Setzen Sie die Sicherheitsstufe wieder zurück auf `0` oder starten Sie man:xdm[1] (oder einen alternativen Display Manager) während des Bootens, bevor die Sicherheitsstufe erhöht wird.
+
+Der Abschnitt <<xdm-boot>> enthält Informationen darüber, wie Sie man:xdm[1] beim Systemstart aktivieren können.
+
+=== Warum funktioniert meine Maus unter X nicht?
+
+Wenn Sie den Standard-Konsolentreiber man:syscons[4] 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 man:syscons[4] ein virtuelles Gerät namens [.filename]#/dev/sysmouse#. Alle Mausbewegungen und Mausklicks werden über man:moused[8] in das man:sysmouse[4] Gerät. Falls Sie die Maus auf einer oder mehreren virtuellen Konsolen _und_ unter X benutzen wollen, sollten Sie zunächst <<moused>> lesen und man:moused[8] konfigurieren.
+
+Stellen Sie anschließend sicher, dass die folgenden Einträge in [.filename]#etc/X11/xorg.conf# enthalten sind:
+
+[.programlisting]
+....
+Section "InputDevice"
+ Option "Protocol" "SysMouse"
+ Option "Device" "/dev/sysmouse"
+.....
+....
+
+Beginnend mit Xorg 7.4 werden Angaben im Abschnitt `InputDevice` von [.filename]#xorg.conf# ignoriert. Stattdessen wird auf die automatisch ermittelten Werte zurückgegriffen. Um das alte Verhalten zu reaktivieren, fügen Sie die folgende Zeile entweder in den Abschnitt `ServerLayout` oder `ServerFlags` ein:
+
+[.programlisting]
+....
+Option "AutoAddDevices" "false"
+....
+
+Einige Leute ziehen es vor, unter X [.filename]#/dev/mouse# zu benutzen. Hierzu sollte [.filename]#/dev/mouse# nach [.filename]#/dev/sysmouse# (siehe man:sysmouse[4]) gelinkt werden, indem Sie die folgende Zeile in [.filename]#/etc/devfs.conf# (siehe man:devfs.conf[5]) hinzufügen:
+
+[.programlisting]
+....
+link sysmouse mouse
+....
+
+Die Verknüpfung kann durch Neustart von man:devfs[5] über das folgende Kommando (als `root`) erzeugt werden:
+
+[source,bash]
+....
+# service devfs restart
+....
+
+=== Kann ich meine Rad-Maus auch unter X benutzen?
+
+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" von [.filename]#/etc/X11/xorg.conf# ein. Das Beispiel zeigt, wie ein solcher Abschnitt aussehen könnte.
+
+[.programlisting]
+....
+Section "InputDevice"
+ Identifier "Mouse1"
+ Driver "mouse"
+ Option "Protocol" "auto"
+ Option "Device" "/dev/sysmouse"
+ Option "Buttons" "5"
+ Option "ZAxisMapping" "4 5"
+EndSection
+....
+
+Wenn Sie die Maus in Emacs benutzen wollen, fügen Sie auch die folgenden Zeilen in [.filename]#~/.emacs# ein:
+
+[.programlisting]
+....
+;; wheel mouse
+(global-set-key [mouse-4] 'scroll-down)
+(global-set-key [mouse-5] 'scroll-up)
+....
+
+=== Mein Laptop hat ein Synaptics Touchpad. Kann ich das unter X benutzen?
+
+Ja, aber damit es funktioniert, müssen Sie ein paar Dinge konfigurieren.
+
+Damit Sie den Xorg synaptics Treiber benutzen können, müssen Sie zuerst `moused_enable` aus [.filename]#/etc/rc.conf# entfernen.
+
+Um synaptics zu aktivieren, fügen Sie die folgende Zeile in [.filename]#/boot/loader.conf# ein:
+
+[.programlisting]
+....
+hw.psm.synaptics_support="1"
+....
+
+Fügen Sie die folgende Zeile in [.filename]#/etc/X11/xorg.conf# ein:
+
+[.programlisting]
+....
+Section "InputDevice"
+Identifier "Touchpad0"
+Driver "synaptics"
+Option "Protocol" "psm"
+Option "Device" "/dev/psm0"
+EndSection
+....
+
+Und fügen Sie die folgende Zeile in den Abschnitt "ServerLayout" hinzu:
+
+[.programlisting]
+....
+InputDevice "Touchpad0" "SendCoreEvents"
+....
+
+=== Wie verwende ich entfernte X-Displays?
+
+Aus Sicherheitsgründen verbietet der X-Server in der Voreinstellung Verbindungen von entfernten Systemen.
+
+Starten Sie den X mit der Option `-listen_tcp`, wenn Sie Verbindungen von entfernten Systemen erlauben wollen:
+
+[source,bash]
+....
+% startx -listen_tcp
+....
+
+=== Was ist eine virtuelle Konsole und wie erstelle ich mehr davon?
+
+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.
+
+Um eine weitere Sitzung zu starten, 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 kbd:[Alt]kbd:[F2] und Sie gelangen zur Anmelde-Aufforderung auf der zweiten virtuellen Konsole. Wenn Sie zurück zur ersten Sitzung möchten, drücken Sie kbd:[Alt+F1].
+
+Die Standardinstallation von FreeBSD bietet acht aktivierte virtuelle Konsolen. Mit kbd:[Alt+F1], kbd:[Alt+F2], kbd:[Alt+F3] und so weiter wechseln Sie zwischen diesen virtuellen Konsolen.
+
+Um weitere virtuelle Konsolen zu aktivieren, editieren Sie [.filename]#/etc/ttys# (man:ttys[5]) und fügen Einträge für [.filename]#ttyv8# bis zu [.filename]#ttyvc# nach dem Kommentar zu "Virtual terminals" ein:
+
+[.programlisting]
+....
+# Edit the existing entry for ttyv8 in /etc/ttys and change
+# "off" to "on".
+ttyv8 "/usr/libexec/getty Pc" xterm on secure
+ttyv9 "/usr/libexec/getty Pc" xterm on secure
+ttyva "/usr/libexec/getty Pc" xterm on secure
+ttyvb "/usr/libexec/getty Pc" xterm on secure
+....
+
+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 8 MB RAM oder weniger besitzen. Sie können auch `secure` in `insecure` ändern.
+
+[NOTE]
+====
+FreeBSD 9.0 und ältere Versionen verwenden den Terminaltyp "cons25" und nicht "xterm". Benutzen Sie beim Hinzufügen von neuen Einträgen in [.filename]#/etc/ttys# das Format der bereits bestehenden Einträge.
+====
+
+[IMPORTANT]
+====
+Wenn Sie einen X-Server benutzen möchten, müssen Sie mindestens ein virtuelles Terminal ausgeschaltet (`off`) lassen damit der Server es benutzen kann. Das heißt, dass Ihnen nur 11 Alt-Funktionstasten für virtuelle Konsolen zur Verfügung stehen, die letzte ist für den X-Server bestimmt.
+====
+
+Um beispielsweise X und elf virtuelle Konsolen auszuführen, sollte die Einstellung für das virtuelle Terminal 12 wie folgt sein:
+
+[.programlisting]
+....
+ttyvb "/usr/libexec/getty Pc" xterm off secure
+....
+
+Sie können das System neu starten, um die virtuellen Konsolen zu aktivieren.
+
+=== Wie greife ich von X aus auf virtuelle Konsolen zu?
+
+Benutzen Sie kbd:[Strg+Alt+Fn] um auf eine virtuelle Konsole umzuschalten. Mit kbd:[Strg+Alt+F1] schalten Sie zur ersten virtuellen Konsole.
+
+Sobald Sie auf eine virtuelle Konsole umgeschaltet haben, können Sie kbd:[Alt+Fn] benutzen, um zwischen den einzelnen virtuellen Konsolen umzuschalten.
+
+Um zur X-Sitzung zurückzukehren, müssen Sie auf die virtuelle Konsole umschalten, auf der X läuft. Wenn Sie X über der Eingabeaufforderung mit `startx` gestartet haben, benutzt X die nächste freie virtuelle Konsole und nicht die Konsole, von der es gestartet wurde. Wenn Sie acht aktive virtuelle Konsolen haben, dann wird X die neunte benutzen und Sie können mit kbd:[Alt+F9] umschalten.
+
+[[xdm-boot]]
+=== 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 [.filename]#/etc/ttys# (siehe man:ttys[5]) gestartet, während beim zweiten Ansatz [.filename]#rc.local# (siehe man:rc[8]) oder das Skript [.filename]#X# aus [.filename]#/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 man:ttys[5]-Methode hat den Vorteil, dass dokumentiert ist, auf welchem vty X gestartet wird und der Neustart des X-Servers beim Abmelden an man:init[8] übergeben wird. Die man:rc[8]-Methode erleichtert den Aufruf von `kill xdm`, falls Probleme beim Start des X-Servers auftreten sollten.
+
+Beim Laden von man:rc[8], sollte `xdm` ohne irgendwelche Argumente (das heißt als Daemon) gestartet werden. `xdm` muss gestartet werden _nachdem_man:getty[8] 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 [.filename]#/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 [.filename]#/usr/local/lib/X11/xdm/Xservers# eintragen:
+
+[.programlisting]
+....
+:0 local /usr/local/bin/X vt4
+....
+
+Diese Zeile führt dazu, dass der X Server [.filename]#/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 starte?
+
+Wenn X mit `startx` gestartet wird, werden die Zugriffsrechte für [.filename]#/dev/console#_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 in der Datei [.filename]#/etc/fbtab# (siehe man:fbtab[5]) eine nicht auskommentierte Zeile der folgenden Art befindet:
+
+[.programlisting]
+....
+/dev/ttyv0 0600 /dev/console
+....
+
+Das sorgt dafür, dass wer auch immer sich auf [.filename]#/dev/ttyv0# anmeldet, auch die Konsole besitzt.
+
+=== Warum funktioniert meine PS/2-Maus nicht richtig?
+
+Ihre Maus und der Maustreiber sind vielleicht aus der Synchronisation geraten. In seltenen Fällen kann auch der Treiber irrtümlicherweise Synchronisationsprobleme melden:
+
+[.programlisting]
+....
+psmintr: out of sync (xxxx != yyyy)
+....
+
+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. Dazu fügen Sie einfach `hint.psm.0.flags="0x100"` in [.filename]#/boot/loader.conf# ein und starten das System anschließend neu.
+
+=== Wie vertausche ich die Maustasten?
+
+Geben Sie `xmodmap -e "pointer = 3 2 1"` ein. Fügen Sie dieses Kommando in [.filename]#~/.xinitrc# oder [.filename]#~/.xsession# hinzu, damit dies automatisch geschieht.
+
+=== Wie installiere ich einen Splash-Screen und wo finde ich sie?
+
+Die detaillierte Antwort auf diese Frage finden Sie im Abschnitt link:{handbook}#boot-splash/[Willkommensbildschirme während des Bootvorgangs konfigurieren] des FreeBSD Handbuchs.
+
+=== 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 wie folgt:
+
+* 115 - kbd:[Windows]-Taste zwischen den kbd:[Strg]- und kbd:[Alt]-Tasten auf der linken Seite
+* 116 - kbd:[Windows]-Taste rechts von der kbd:[AltGr]-Taste
+* 117 - kbd:[Menü]-Taste, links von der rechten kbd:[Strg]-Taste
+
+Nach der folgenden Anweisung erzeugt die linke kbd:[Windows]-Taste ein Komma.
+
+[source,bash]
+....
+# xmodmap -e "keycode 115 = comma"
+....
+
+Um die neue Belegung der Windows-Tasten automatisch bei jedem Start von X zu erhalten, könnten entsprechende `xmodmap` Anweisungen in [.filename]#~/.xinitrc# einfügt werden. Die bevorzugte Variante ist aber, eine Datei mit dem Namen [.filename]#~/.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 [.filename]#~/.xinitrc# die folgende Zeile einfügen:
+
+[.programlisting]
+....
+xmodmap $HOME/.xmodmaprc
+....
+
+Sie könnten die drei Tasten zum Beispiel mit den Funktionen kbd:[F13], kbd:[F14], und kbd:[F15] belegen. Dadurch ist es sehr einfach, diese Tasten mit nützlichen Funktionen eines Programmes oder Desktops zu verknüpfen.
+
+Um dies zu tun, fügen Sie die folgenden Zeilen in [.filename]#~/.xmodmaprc# ein.
+
+[.programlisting]
+....
+keycode 115 = F13
+keycode 116 = F14
+keycode 117 = F15
+....
+
+Falls Sie zum Beispiel package:x11-wm/fvwm2[] benutzen, können Sie ihn so einstellen, dass kbd:[F13] das Fenster unter dem Mauszeiger minimiert bzw. maximiert. kbd:[F14] holt das Fenster unter dem Mauszeiger in den Vordergrund bzw. ganz nach hinten, wenn es bereits im Vordergrund ist. kbd:[F15] öffnet das Arbeitsplatz-Menü, auch wenn der Cursor nicht auf den Hintergrund zeigt. Dies ist extrem praktisch, wenn der gesamte Bildschirm von Fenster belegt wird.
+
+Dieses Verhalten erhält man mit den folgenden Einträgen in [.filename]#~/.fvwmrc#:
+
+[.programlisting]
+....
+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 Xorg und welche Grafikkarte Sie verwenden. Wenn Sie eine Karte mit nVidia-Chipsatz besitzen, benutzen Sie die binären Treiber für FreeBSD, indem Sie einen der folgenden Ports installieren:
+
+Die aktuelle Version von nVidia-Karten wird durch den Port package:x11/nvidia-driver[] unterstützt.
+
+Unterstützung für ältere Treiber finden Sie in package:x11/nvidia-driver-###[]
+
+nVidia liefert detaillierte Informationen darüber, welche Karte von welchem Treiber unterstützt wird. Diese Information finden Sie auf der Website http://www.nvidia.com/object/IO_32667.html[http://www.nvidia.com/object/IO_32667.html].
+
+Für Matrox G200/400 können Sie den Port package:x11-servers/mga_hal[] benutzen.
+
+Bei ATI Rage 128 und Radeon lesen Sie man:ati[4], man:r128[4] und man:radeon[4].
+
+== 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 link:{handbook}#network-diskless/[Handbucheintrag über den plattenlosen Betrieb].
+
+=== Kann eine FreeBSD-Maschine als Netzwerkrouter genutzt werden?
+
+Ja. Genaue Informationen zu diesem Thema finden Sie im Abschnitt link:{handbook}#network-routing/[Gateways und Routen] des Handbuchkapitels link:{handbook}#advanced-networking/[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(TM)-Variante. Die Idee ist, die FreeBSD-Maschine an das Internet anzubinden, um in der Lage zu sein, von der Windows(TM)-Maschine über die FreeBSD-Maschine auf das Internet zuzugreifen. Das ist tatsächlich nur ein Spezialfall der vorherigen Frage.
+
+Wenn Sie eine Einwahlverbindung benutzen, müssen Sie `ppp` mit der Option `-nat` verwenden und in [.filename]#/etc/rc.conf# die Variable `gateway_enable` auf _YES_ setzen. Weitere Informationen erhalten Sie in man:ppp[8] oder im Abschnitt link:{handbook}#userppp/[User-PPP des Handbuchs].
+
+Wenn die Verbindung zum Internet über Ethernet erstellt wurde, müssen Sie man:natd[8] benutzen. Weitere Informationen dazu finden Sie im Abschnitt link:{handbook}#network-natd[natd] des Handbuchs.
+
+=== Unterstützt FreeBSD und PPP?
+
+Ja. man:ppp[8] bietet Unterstützung für eingehende und ausgehende Verbindungen.
+
+Weitere Informationen finden Sie im link:{handbook}#ppp-and-slip/[Kapitel PPP im Handbuch].
+
+=== Unterstützt FreeBSD NAT oder Masquerading?
+
+Ja. Wenn Sie NAT über eine User-PPP-Verbindung einsetzen wollen, lesen Sie den link:{handbook}#userppp/[Abschnitt PPP des Handbuchs]. Wollen Sie NAT über eine andere Verbindung einsetzen, lesen Sie bitte den Abschnitt link:{handbook}#network-natd/[NAT Konfiguration] im Handbuch.
+
+=== Wie kann ich Ethernet-Aliase einrichten?
+
+Wenn sich die zweite Adresse im gleichen Subnetz befindet wie eine der Adressen, die bereits auf der Schnittstelle konfiguriert sind, benutzen Sie `netmask 0xffffffff` wie in diesem Beispiel:
+
+[source,bash]
+....
+# ifconfig ed0 alias 192.0.2.2 netmask 0xffffffff
+....
+
+Andernfalls geben sie die Adresse und die Netzmaske wie gewohnt an:
+
+[source,bash]
+....
+# ifconfig ed0 alias 172.16.141.5 netmask 0xffffff00
+....
+
+Weitere Informationen finden Sie im FreeBSD link:{handbook}#configtuning-virtual-hosts/[Handbuch].
+
+=== Warum kann ich per NFS nicht von einer Linux-Maschine mounten?
+
+Einige Versionen des Linux(TM) NFS-Codes akzeptieren Mount-Anfragen nur von einem privilegierten Port. Versuchen Sie den folgenden Befehl:
+
+[source,bash]
+....
+# mount -o -P linuxbox:/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 [.filename]#/etc/exports# nicht richtig verstanden haben. Lesen Sie man:exports[5] und das Kapitel link:{handbook}#network-nfs/[NFS] im Handbuch, speziell den Abschnitt link:{handbook}#configuring-nfs[Konfiguration von NFS].
+
+=== Wie aktiviere ich die Unterstützung für IP-Multicast?
+
+Installieren Sie das Paket oder den Port package:net/mrouted[] und fügen Sie `mrouted_enable="YES"` in [.filename]#/etc/rc.conf# hinzu, um den Dienst beim Booten zu starten.
+
+=== Warum muss ich für Hosts auf meiner Site den FQDN benutzen?
+
+Die Antwort hierzu finden Sie im FreeBSD link:{handbook}#mail-trouble[Handbuch].
+
+=== Wieso erhalte ich bei allen Netzwerkoperationen die Meldung Permission denied?
+
+Wenn der Kernel mit der Option `IPFIREWALL` kompiliert wurde, müssen Sie beachten, dass die Standardrichtlinie alle Pakete, die nicht explizit zulässig sind, verweigert.
+
+Wenn die Firewall unabsichtlich falsch konfiguriert wurde, stellen Sie die Netzwerkfunktionalität wieder her, indem Sie Folgendes als `root` eingeben:
+
+[source,bash]
+....
+# ipfw add 65534 allow all from any to any
+....
+
+Sie können in [.filename]#/etc/rc.conf# auch `firewall_type="open"` setzen.
+
+Weitere Informationen über die Konfiguration dieser Firewall finden Sie im Kapitel link:{handbook}#firewalls-ipfw/[IPFW] des Handbuchs.
+
+=== Warum kann ich mit ipfw einen Dienst nicht mit fwd auf eine andere Maschine umlenken?
+
+Wahrscheinlich benötigen Sie Network Address Translation (NAT) und nicht die einfache Weiterleitung von Paketen. Die "fwd"-Regel leitet lediglich Pakete weiter; die Daten in den Paketen werden aber nicht verändert. Ein Beispiel:
+
+[source,bash]
+....
+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 die <<service-redirect,FAQ über die Umleitung von Diensten>> und die Manualpage man:natd[8] lesen. Auch in der https://www.FreeBSD.org/ports/[Ports Sammlung] sind diverse Hilfsprogramme für diesen Zweck enthalten.
+
+=== Wie kann ich Service-Anfragen von einer Maschine auf eine andere umleiten?
+
+Sie können für FTP und andere Dienste mit dem Paket oder Port package:sysutils/socket[] umleiten. Ersetzen sie die Befehlszeile für den Dienst in [.filename]#/etc/inetd.conf# einfach so, dass stattdessen `socket` aufgerufen wird, wie in diesem Beispiel für ftpd zu sehen ist:
+
+[.programlisting]
+....
+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. http://www.sonycsl.co.jp/person/kjc/programs.html[ALTQ] ist in FreeBSD Bestandteil von man:pf[4]. Beim Bandbreiten-Manager von http://www.etinc.com/[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 Programm genutzt werden kann. Fügen Sie folgendes zur Kernelkonfigurationsdatei hinzu und erstellen Sie einen neuen Kernel:
+
+[.programlisting]
+....
+device bpf # Berkeley Packet Filter
+....
+
+=== Habe ich, analog zum smbmount von Linux, eine Möglichkeit, auf ein freigegebenes Laufwerk einer Windows-Maschine in meinem Netzwerk zuzugreifen?
+
+Benutzen Sie die Programme aus dem Paket SMBFS. Es enthält einige Kernel-Erweiterungen und Benutzerprogramme. Die Programme und weitergehende Informationen sind unter man:mount_smbfs[8] im Basissystem verfügbar.
+
+=== Was bedeutet die Meldung Limiting icmp/open port/closed port response in meinen Logdateien?
+
+Diese Kernelmeldung deutet darauf hin, dass irgend jemand versucht, die Generierung von sehr 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:
+
+* Brute-force Denial of Service (DoS) Angriffe (im Gegensatz zu Angriffen mit einzelnen Paketen, welche gezielt eine Schwachstelle des Systems ausnutzen).
+* 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 der sysctl-Variable `net.inet.icmp.icmplim` einstellen. Im Beispiel wird das Limit auf `300` Pakete pro Sekunde gesetzt:
+
+[source,bash]
+....
+# sysctl net.inet.icmp.icmplim=300
+....
+
+Wenn Sie zwar die Begrenzung benutzen möchten, aber die Meldungen nicht in den Logdateien sehen möchten, können Sie die Meldungen mit der sysctl-Variable `net.inet.icmp.icmplim_output` abschalten:
+
+[source,bash]
+....
+# sysctl 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 Leistung des Systems nicht negativ beeinflussen.
+
+=== Warum sehe ich ständig Nachrichten wie: 192.168.0.10 is on fxp1 but got reply from 00:15:17:67:cf:82 on rl0, und wie stelle ich das ab?
+
+Weil ein Paket unerwartet von außerhalb des Netzwerks empfangen wurde. Um die Nachrichten abzustellen, ändern Sie `net.link.ether.inet.log_arp_wrong_iface` auf `0`.
+
+== 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.
++
+Der Prozess kann innerhalb der Wände laufen, 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 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 Manualpages man:security[7] und man:named[8] benutzt wird.
++
+Nehmen Sie zum Beispiel den Dienst `ntalk` (siehe man:inetd[8]). 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 [.filename]#/# dieses Verzeichnis und nicht das echte [.filename]#/# 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 Prozesse 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.
+
+UNIX(TM) implementiert zwei Arten von Sandkästen - eine auf Prozessebene und die andere auf der Ebene der Benutzerkennung.
+
+Jeder Prozess unter UNIX(TM) ist komplett von allen anderen Prozessen abgeschirmt. Ein Prozess kann den Adressraum eines anderen Prozesses nicht modifizieren.
+
+Ein UNIX(TM) 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 (securelevel)?
+
+Sicherheitsstufen (`securelevel`) sind ein Sicherheitsmechanismus, der im Kernel implementiert ist. Wenn die Sicherheitsstufe einen positiven Wert hat, verhindert der Kernel die Ausführung bestimmter Tätigkeiten; nicht einmal der Super-User (`root`) darf sie durchführen. Zurzeit können über die Sicherheitsstufen unter anderem die folgenden Tätigkeiten geblockt werden:
+
+* Zurücksetzen bestimmter Dateiattribute, wie zum Beispiel `schg` (das "system immutable" Attribut).
+* Schreibender Zugriff auf die Speicherbereiche des Kernels mittels [.filename]#/dev/mem# und [.filename]#/dev/kmem#.
+* Laden von Kernel-Modulen.
+* Änderungen an den Firewall-Regeln.
+
+Das folgende Kommando kann benutzt werden, um die eingestellte Sicherheitsstufe eines aktiven Systems abzufragen:
+
+[source,bash]
+....
+# sysctl -n kern.securelevel
+....
+
+Die Ausgabe enthält den aktuellen Wert der Sicherheitsstufe. Wenn die Zahl positiv (größer als Null) ist, sind zumindest einige der Schutzmaßnahmen aktiviert.
+
+Die Sicherheitsstufe eines laufenden Systems kann nicht verringert werden, da dies den Mechanismus nutzlos machen würde. Wenn Sie eine Tätigkeit ausführen müssen, bei der die Sicherheitsstufe nicht-positiv sein muss, dann müssen Sie die Variablen `kern_securelevel` und `kern_securelevel_enable` in [.filename]#/etc/rc.conf# ändern und das System neustarten.
+
+Weitere Informationen über die Sicherheitsstufen und was die Einstellungen bewirken, können Sie man:init[8] entnehmen.
+
+[WARNING]
+====
+
+Die Sicherheitsstufen sind kein magischer Zauberstab; es gibt viele bekannte Probleme. Und in der Mehrzahl der Fälle vermitteln sie ein falsches Gefühl von 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 http://lists.FreeBSD.org/mailman/listinfo/freebsd-security[Mailingliste FreeBSD security]. Das verfügbare https://www.FreeBSD.org/search/[Archiv] enthält ausgiebige Diskussionen. Einige Benutzer sind guter Hoffnung, dass das System der Sicherheitsstufen bald durch ein besser konfigurierbares System ersetzt wird.
+====
+
+=== Wieso wartet BIND (named) auf hohen Ports auf Anfragen?
+
+BIND benutzt einen Port mit einer hohen, zufälligen Nummer für den Versand von Anfragen. Aktuelle Versionen wählen einen neuen, zufälligen UDP-Port für jede Anfrage. Das kann für manche Netzwerkkonfigurationen Probleme verursachen, besonders wenn eine Firewall eingehende UDP-Pakete auf bestimmten Ports blockiert. Wenn Sie durch eine solche Firewall wollen, können Sie die Optionen `avoid-v4-udp-ports` und `avoid-v6-udp-ports` ausprobieren, um ein zufälliges Auswählen von Portnummern innerhalb eines blockierten Bereiches zu verhindern.
+
+[WARNING]
+====
+
+Wenn eine Portnummer (wie 53) über die Optionen `query-source` oder `query-source-v6` in [.filename]#/etc/namedb/named.conf# spezifiziert ist, wird zufällige Portauswahl nicht verwendet. Es wird dringend empfohlen, dass diese Optionen nicht für die Spezifikation von festen Portnummern verwendet wird.
+====
+
+Es ist eine sehr gute Angewohnheit, die Ausgaben von man:sockstat[1] durchzusehen und auf merkwürdige Dinge zu achten.
+
+=== Wieso wartet der Sendmail-Dienst sowohl auf Port 587 als auch auf dem Standard-Port 25 auf Anfragen?
+
+Aktuelle Versionen von Sendmail unterstützen eine 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). 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 Basissystem von FreeBSD gehört, zum Beispiel aus einem Port oder einem Paket. Diese Shells werden in der Regel in [.filename]#/usr/local/bin# installiert und dieses Verzeichnis liegt standardmäßig auf einem anderen Dateisystem. Wenn die Shell von `root` in [.filename]#/usr/local/bin# liegt und das Dateisystem, auf dem [.filename]#/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.
+
+== PPP
+
+=== Ich bekomme ppp8 nicht zum Laufen. Was mache ich falsch?
+
+Lesen Sie zuerst man:ppp[8] und den link:{handbook}#userppp[Abschnitt zu PPP im Handbuch]. Aktivieren Sie zur Fehlersuche die Protokollierung mit folgendem Befehl:
+
+[.programlisting]
+....
+set log Phase Chat Connect Carrier lcp ipcp ccp command
+....
+
+Dieser Befehl kann an der Eingabeaufforderung von man:ppp[8] eingegeben, oder in den Abschnitt `default` der Konfigurationsdatei [.filename]#/etc/ppp/ppp.conf# eingetragen werden. Stellen Sie sicher, dass die Datei [.filename]#/etc/syslog.conf# die folgenden Zeilen enthält und die Datei [.filename]#/var/log/ppp.log# existiert:
+
+[.programlisting]
+....
+!ppp
+*.* /var/log/ppp.log
+....
+
+Sie können nun in der Protokolldatei eine Menge darüber herausfinden, was geschieht. Es macht nichts, wenn die Einträge 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 ppp8 auf, wenn ich es benutze?
+
+Das liegt meistens daran, dass der Rechnername nicht aufgelöst werden kann. Um dieses Problem zu lösen, müssen Sie sicherstellen, dass [.filename]#/etc/hosts# vom Resolver zuerst genutzt wird. Dazu muss in [.filename]#/etc/host.conf# der Eintrag `hosts` an die erste Stelle gesetzt werden. Erstellen Sie dann für den lokalen Rechner einen Eintrag in [.filename]#/etc/hosts#. Falls es kein lokales Netzwerk gibt, ändern Sie die `localhost`-Zeile:
+
+[.programlisting]
+....
+127.0.0.1 foo.example.com foo localhost
+....
+
+Andernfalls fügen Sie einfach einen weiteren Eintrag für den lokalen Rechner hinzu. Weitere Informationen finden Sie in den entsprechenden 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 eine Standardroute existiert. Das folgende Kommando sollte zwei Einträge anzeigen:
+
+[.programlisting]
+....
+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
+....
+
+Wenn die Standardroute nicht erscheint, stellen Sie sicher, dass die Zeile `HISADDR` in [.filename]#/etc/ppp/ppp.conf# hinzugefügt wurde.
+
+Ein weiterer Grund dafür, dass die Zeile für die Standardroute fehlt, könnte der sein, dass Sie eine Standardroute in [.filename]#/etc/rc.conf# eingetragen und die folgende Zeile in [.filename]#/etc/ppp/ppp.conf# ausgelassen haben:
+
+[.programlisting]
+....
+delete ALL
+....
+
+Lesen Sie in diesem Fall den Abschnitt link:{handbook}#userppp-final[Abschließende Systemkonfiguration] des Handbuchs.
+
+=== Was bedeutet No route to host?
+
+Dieser Fehler beruht für gewöhnlich auf einem fehlenden Abschnitt in [.filename]#/etc/ppp/ppp.linkup#:
+
+[.programlisting]
+....
+MYADDR:
+ delete ALL
+ add 0 0 HISADDR
+....
+
+Er ist nur notwendig, wenn Sie eine dynamische IP-Adresse besitzen oder die Adresse des Gateways nicht bekannt ist. 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):
+
+[.programlisting]
+....
+delete ALL
+add 0 0 HISADDR
+....
+
+Weitere Informationen finden Sie im Abschnitt link:{handbook}#userppp-dynamicip[PPP und Dynamische IP-Adressen] des Handbuchs.
+
+=== Wieso werden meine Verbindungen nach ca. drei Minuten beendet?
+
+Der Standardtimeout für PPP beträgt drei Minuten. Er kann durch die folgende Zeile eingestellt werden:
+
+[.programlisting]
+....
+set timeout NNN
+....
+
+_NNN_ gibt die Inaktivität in Sekunden an, bevor die Verbindung geschlossen wird. Falls _NNN_ Null ist, wird die Verbindung niemals aufgrund eines Timeouts geschlossen. Es ist möglich, diesen Befehl in [.filename]#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 Informationen finden Sie in der Manualpage man:ppp[8].
+
+=== Wieso bricht meine Verbindung bei hoher Auslastung ab?
+
+Falls Link-Quality-Reporting (LQR) konfiguriert wurde, ist es möglich, dass zu viele LQR-Pakete zwischen dem FreeBSD-System und dem verbundenen Rechner verloren gehen. man:ppp[8] folgert daraus, dass die Verbindung nicht in Ordnung ist und schließt sie. LQR ist standardmäßig deaktiviert und kann mit der folgenden Zeile aktiviert werden:
+
+[.programlisting]
+....
+enable lqr
+....
+
+=== Warum bricht die Verbindung nach unbestimmter Zeit zusammen?
+
+Wenn die Qualität der Telefonleitung zu schlecht oder beim Anschluss die Option Anklopfen aktiviert ist, kann es manchmal vorkommen, dass das 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. Lesen Sie die Dokumentation des Modems für weitere Informationen.
+
+=== Warum hängt meine Verbindung nach einer unbestimmten Zeit?
+
+Viele Leute machen Erfahrungen mit hängenden Verbindungen ohne erkennbaren Grund. Als erstes muss festgestellt werden, auf welcher Seite die Verbindung hängt.
+
+Wenn Sie ein externes Modem benutzen, können Sie versuchen, man:ping[8] zu benutzen, um zu sehen, ob die TD-Anzeige aufleuchtet, wenn Daten übertragen werden. 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 [.filename]#ppp.conf# benutzen. Stellen Sie über man:pppctl[8] eine Verbindung zu man:ppp[8] her, wenn die Verbindung hängt. Falls die 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, 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 bei <<ppp-remote-not-responding>> weiter.
+* Handelt es sich um ein lokales Problem, lesen Sie bitte <<ppp-hung>>.
+
+[[ppp-remote-not-responding]]
+=== 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(TM) benutzen. Sie können `enable lqr` in [.filename]#/etc/ppp/ppp.conf# angeben, wodurch man:ppp[8] ermöglicht wird, ein externes Versagen zu erkennen und aufzulegen. Jedoch ist diese Erkennung relativ langsam und deshalb nicht besonders nützlich.
+
+Versuchen Sie zunächst, jegliche Datenkompression auszuschalten, indem Sie folgendes zur Konfiguration hinzufügen:
+
+[.programlisting]
+....
+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 dem ISP. Andererseits wird hierdurch offensichtlich, dass Sie kein Microsoft(TM)-System benutzen.
+
+Aktivieren Sie asynchrones Logging und warten Sie, bis die Verbindung wieder hängt, bevor Sie sich an den 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 der 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.
+
+[[ppp-hung]]
+=== Was kann ich tun, wenn sich man:ppp[8] aufhängt?
+
+In diesem Fall erstellen Sie am besten man:ppp[8] mit Debugging-Informationen neu und benutzen dann man:gdb[1], um von dem hängenden ppp-Prozess eine Aufzeichnung des Stacks zu erstellen. Um die ppp-Anwendung mit Debugging-Informationen zu übersetzen, geben Sie folgendes ein:
+
+[source,bash]
+....
+# cd /usr/src/usr.sbin/ppp
+# env DEBUG_FLAGS='-g' make clean
+# env DEBUG_FLAGS='-g' make install
+....
+
+Anschließend starten Sie ppp neu und warten darauf, dass es wieder hängt. Wenn die Debug-Version von ppp hängt, starten Sie gdb für den steckengebliebenen Prozess, indem Sie folgendes eingeben:
+
+[source,bash]
+....
+# gdb ppp `pgrep ppp`
+....
+
+An der Eingabeaufforderung von gdb können Sie die Befehle `bt` oder `where` benutzen, um eine Aufzeichnung des Stacks zu erhalten. Speichern Sie die Ausgabe der gdb-Sitzung und "trennen" Sie den laufenden Prozess mit `quit`.
+
+=== 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 Implementierungen 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 man:getty[8] auf dem Port ausgeführt und man:ppp[8] nach dem Einloggen von einem Login-Skript oder einem Programm aus gestartet wird. Es wurde auch schon berichtet, dass dies bei der Benutzung von slirp regelmäßig auftritt. Der Grund hierfür ist, dass das man:ppp[8] auf der Client-Seite in der Zeit, die benötigt wird, man:getty[8] zu beenden und man:ppp[8] 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 [.filename]#ppp.conf# erlaubt wird, mit der Verhandlung zu beginnen:
+
+[.programlisting]
+....
+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:
+
+[.programlisting]
+....
+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 derzeit eine Fehlfunktion in der Implementierung von man:ppp[8], die darin besteht, dass LCP-, CCP- und 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 zwei Implementierungen `A` und `B` vor. `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 lange 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 folgenden Befehl geschehen:
+
+[.programlisting]
+....
+set openmode passive
+....
+
+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:
+
+[.programlisting]
+....
+set stopped N
+....
+
+Alternativ kann der folgende Befehl (wobei _N_ die Wartezeit in Sekunden vor Beginn der Verhandlungen angibt) benutzt werden:
+
+[.programlisting]
+....
+set openmode active N
+....
+
+Weitere Informationen finden Sie in der Manualpage.
+
+=== Warum reagiert ppp8 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). Das Programm ppp 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 ppp8 niemals beendet, wenn es über ein Nullmodem-Kabel benutzt wird?
+
+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 mit der folgenden Zeile aktiviert werden:
+
+[.programlisting]
+....
+enable lqr
+....
+
+LQR wird standardmäßig akzeptiert, wenn es vom Partner ausgehandelt wird.
+
+=== Warum wählt ppp8 im Modus -auto ohne Grund?
+
+Falls man:ppp[8] unerwartet 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:
+
+[.programlisting]
+....
+set log +tcp/ip
+....
+
+Dadurch wird jeglicher Verkehr über die Verbindung protokolliert. Wenn das nächste mal unerwartet eine Verbindung hergestellt wird, wird der Grund zusammen mit einer hilfreichen Zeitangabe in der Logdatei gespeichert.
+
+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:
+
+[.programlisting]
+....
+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 die 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 Sendmail. Sie sollten sicherstellen, dass Sie Sendmail in der Konfigurationsdatei sagen, dass es keine DNS-Anfragen durchführen soll. Weitere Details enthält der Abschnitt link:{handbook}#smtp-dialup/[E-Mail über Einwahl-Verbindungen] des Handbuchs. Sie könnten z.B. die folgende Zeile in die [.filename]#.mc#-Datei einfügen:
+
+[.programlisting]
+....
+define(`confDELIVERY_MODE', `d')dnl
+....
+
+Das veranlasst Sendmail dazu, alles in eine Warteschlange einzureihen, bis die Warteschlange verarbeitet wird (normalerweise alle 30 Minuten) oder wenn `sendmail -q` ausgeführt wird (z.B. aus [.filename]#/etc/ppp/ppp.linkup# heraus).
+
+=== Was bedeuten diese CCP-Fehler?
+
+Ich sehe ständig folgende Fehler in meiner Logdatei:
+
+[.programlisting]
+....
+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 auch lokal ausschalten:
+
+[.programlisting]
+....
+disable pred1
+....
+
+=== Warum protokolliert ppp8 die Geschwindigkeit meiner Verbindung nicht?
+
+Um alle Zeilen der Modemkonversation zu protokollieren, müssen Sie folgendes einstellen:
+
+[.programlisting]
+....
+set log +connect
+....
+
+Dies veranlasst man:ppp[8] dazu, alles bis zur letzten angeforderten "expect"-Zeile zu protokollieren.
+
+Falls Sie die Geschwindigkeit der Verbindung erfahren möchten und PAP oder CHAP nutzen, müssen Sie sicherstellen, dass Sie man:ppp[8] so konfigurieren, die gesamte CONNECT-Zeile zu erwarten, etwa so:
+
+[.programlisting]
+....
+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 ppp8 das Zeichen \ in meinem Chat-Skript?
+
+Das Programm ppp analysiert jede Zeile seiner Konfigurationsdatei, damit es Zeichenketten wie z.B. `set phone "123 456 789"` korrekt interpretieren und zudem erkennen kann, 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` 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 `\` senden möchten, benutzen Sie etwas wie:
+
+[.programlisting]
+....
+set dial "\"\" ATZ OK-ATZ-OK AT\\\\X OK"
+....
+
+Woraus sich folgende Zeichen ergeben:
+
+[.programlisting]
+....
+ATZ
+OK
+AT\X
+OK
+....
+
+Oder:
+
+[.programlisting]
+....
+set phone 1234567
+set dial "\"\" ATZ OK ATDT\\T"
+....
+
+Woraus sich folgende Zeichen ergeben:
+
+[.programlisting]
+....
+ATZ
+OK
+ATDT1234567
+....
+
+=== 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 die Leitung schlecht ist, oder falls der serielle Treiber Pakete verwirft, werden gelegentliche FCS-Fehler generiert. Normalerweise lohnt es sich nicht, sich hierüber Gedanken zu machen, obwohl das Kompressionsprotokoll hierdurch wesentlich langsamer wird.
+
+Falls die Leitung einfriert, sobald die Verbindung steht, und viele FCS-Fehler auftreten, müssen Sie sicherstellen, dass das Modem keinen Software-Flow-Control (XON/XOFF) verwendet. Falls die 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` gefolgt von `term` zu benutzen, um man:ppp[8] zu beenden, ohne die Verbindung zu beenden und Sie wieder mit der Shell auf dem entfernten Rechner verbinden.
+
+Falls nichts in der Logdatei darauf hindeutet, warum die Verbindung beendet wurde, sollten Sie den Administrator oder ISP des externen Rechners fragen, warum die Sitzung beendet worden ist.
+
+=== 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 von `netstat -rn` (vor und nach Aufbau der Verbindung) an die http://lists.FreeBSD.org/mailman/listinfo/freebsd-questions[FreeBSD general questions mailing list].
+
+== Serielle Verbindungen
+
+Dieses Kapitel beantwortet häufig gestellte Fragen zu seriellen Verbindungen mit FreeBSD. PPP wird im Abschnitt <<networking,Netzwerke>> behandelt.
+
+=== Welche seriellen Multi-Port-Karten werden von FreeBSD unterstützt?
+
+Es existiert eine Liste der unterstützten Karten im Abschnitt link:{handbook}#serial/[Serielle Datenübertragung] des Handbuchs.
+
+Die meisten auf den 16550 basierten PCI Multi-Port-Karten werden mühelos unterstützt.
+
+Von einigen NoName-Nachbauten ist ebenfalls bekannt, dass sie funktionieren, speziell von den AST-kompatiblen.
+
+In man:uart[4] und man:sio[4] finden Sie weitere Informationen zur Konfiguration solcher Karten.
+
+=== Wie kann ich den boot:-Prompt auf einer seriellen Konsole anzeigen lassen?
+
+Lesen Sie link:{handbook}#serialconsole-setup/[diesen Abschnitt] des Handbuchs.
+
+=== Wie kann ich feststellen, ob FreeBSD meine seriellen Schnittstellen oder Modemkarten gefunden hat?
+
+Wenn der FreeBSD Kernel bootet, testet er die seriellen Schnittstellen, für die er konfiguriert wurde. Sie können entweder aufmerksam die Bootmeldungen verfolgen, oder Sie führen den folgenden Befehl aus, nachdem das System hochgefahren ist und läuft:
+
+[source,bash]
+....
+% dmesg | grep -E "^sio[0-9]"
+sio0: <16550A-compatible COM port> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
+sio0: type 16550A
+sio1: <16550A-compatible COM port> port 0x2f8-0x2ff irq 3 on acpi0
+sio1: type 16550A
+....
+
+Dieses Beispiel zeigt zwei serielle Schnittstellen. Die erste verwendet Port-Adresse `0x3f8`, IRQ4 und hat einen 16550A UART Chip. Die zweite benutzt ebenfalls einen 16550A UART, jedoch Port-Adresse `0x2f8` und IRQ3. Modemkarten werden wie serielle Schnittstellen behandelt. Der einzige Unterschied ist, dass an diesen Schnittstellen immer ein Modem angeschlossen ist.
+
+Der [.filename]#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 das System sind, Sie Modemkarten hinzugefügt oder mehr serielle Schnittstellen haben als die Kernelkonfiguration zulässt, konfigurieren Sie den Kernel einfach neu. In dem Kapitel über die <<make-kernel,Kernelkonfiguration>> finden Sie mehr Details.
+
+=== Wie kann ich unter FreeBSD auf die seriellen Schnittstellen zugreifen?
+
+Die dritte serielle Schnittstelle, [.filename]#sio2# ([.filename]#COM3#), ist [.filename]#/dev/cuad2# für Geräte mit abgehenden Verbindungen und [.filename]#/dev/ttyd2# für Geräte mit eingehenden Verbindungen. Was ist der Unterschied zwischen den beiden Geräteklassen?
+
+Wird [.filename]#/dev/ttydX# im blockierenden Modus geöffnet, wartet ein Prozess darauf, dass das entsprechende [.filename]#cuadX# Gerät inaktiv und der Empfangssignalpegel aktiv ist. Wird das [.filename]#cuadX# Gerät geöffnet, vergewissert es sich, dass die serielle Schnittstelle nicht bereits von dem [.filename]#ttydX# Gerät in Gebrauch ist. Sollte die Schnittstelle verfügbar sein, "stiehlt" es sie von dem [.filename]#ttydX# Gerät. Das [.filename]#cuadX# 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?
+
+Der Abschnitt über die Kernelkonfiguration bietet Informationen darüber, wie Sie den 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 Datei man:device.hints[5]. Aber achten Sie darauf, den IRQ nur in einem der 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 folgende Option in der Kernelkonfigurationsdatei:
+
+[.programlisting]
+....
+options COM_MULTIPORT
+....
+
+Das folgende [.filename]#/boot/device.hints# Beispiel ist geeignet für eine AST Karte mit 4 seriellen Schnittstellen, die IRQ 12 benutzt:
+
+[.programlisting]
+....
+hint.sio.4.at="isa"
+hint.sio.4.port="0x2a0"
+hint.sio.4.flags="0x701"
+hint.sio.5.at="isa"
+hint.sio.5.port="0x2a8"
+hint.sio.5.flags="0x701"
+hint.sio.6.at="isa"
+hint.sio.6.port="0x2b0"
+hint.sio.6.flags="0x701"
+hint.sio.7.at="isa"
+hint.sio.7.port="0x2b8"
+hint.sio.7.flags="0x701"
+hint.sio.7.irq="12"
+....
+
+Die Flags zeigen an, dass die Master-Schnittstelle die Minor-Nummer `7` (`0x700`) hat und dass sich alle Schnittstellen einen IRQ (`0x001`) teilen.
+
+=== Kann ich die vorgegebenen seriellen Parameter für eine Schnittstelle einstellen?
+
+See the link:{handbook}#serial-hw-config[Serial Communications] section in the FreeBSD Handbook.
+
+=== Wie kann ich Einwahl-Logins über mein Modem aktivieren?
+
+Lesen Sie dazu den Abschnitt über link:{handbook}#dialup/[Einwählverbindungen] im FreeBSD Handbuch.
+
+=== Wie kann ich ein Hardware-Terminal mit meiner FreeBSD Box verbinden?
+
+Diese Information finden Sie im Abschnitt link:{handbook}#term/[Terminals] im FreeBSD Handbuch.
+
+=== Warum kann ich tip oder cu nicht laufen lassen?
+
+Die Programme man:tip[1] und man:cu[1] können auf das Verzeichnis [.filename]#/var/spool/lock# nur über den Benutzer `uucp` und die Gruppe `dialer` zugreifen. Benutzen Sie die Gruppe `dialer` um zu kontrollieren, wer Zugriff auf das Modem oder entfernte Systeme hat. Fügen Sie diese Benutzerkonten einfach selbst zur Gruppe `dialer` hinzu.
+
+Alternativ können Sie jeden Benutzer auf dem System man:tip[1] und man:cu[1] verwenden lassen, dazu müssen Sie folgendes eingeben:
+
+[source,bash]
+....
+# chmod 4511 /usr/bin/cu
+# chmod 4511 /usr/bin/tip
+....
+
+== Verschiedene Fragen
+
+=== Wieso benutzt FreeBSD so viel Swap-Speicher, obwohl noch freier Hauptspeicher verfügbar ist?
+
+FreeBSD lagert vorbeugend vollkommen untätige, unbenutzte Seiten aus dem Hauptspeicher in den Swap-Bereich aus, um mehr Hauptspeicher für die aktive Nutzung zur Verfügung zu stellen. 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. Sie können feststellen, dass nicht alle Seiten des Systems ausgelagert wurden, nachdem das System eine Nacht lang nicht benutzt worden ist.
+
+=== Warum zeigt mir top 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.
+
+=== 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, wenn möglich; die Zugriffsrechte für die Datei, auf die der symbolische Link zeigt, werden also verändert. Wenn Sie eine Datei mit dem Namen [.filename]#foo# und einen auf diese Datei zeigenden symbolischen Link mit dem Namen [.filename]#bar# haben, wird das folgende Kommando niemals einen Fehler melden.
+
+[source,bash]
+....
+% chmod g-w bar
+....
+
+Trotzdem werden die Zugriffsrechte für [.filename]#bar# nicht geändert.
+
+Wenn Sie die Zugriffsrechte in der Dateihierarchie an der Wurzeldatei anstatt der Datei selbst ändern möchten, müssen Sie entweder `-H` oder `-L` zusammen mit der Option `-R` benutzen. Lesen Sie man:chmod[1] und man:symlink[7] für weitere Informationen.
+
+[WARNING]
+====
+
+Die Option `-R` 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 ([.filename]#/#). Wenn bspw. [.filename]#foo# ein symbolischer Link zum Verzeichnis [.filename]#bar# ist und Sie die Zugriffsrechte von [.filename]#foo# (tatsächlich [.filename]#bar#) ändern möchten, dann benutzen Sie etwas ähnliches wie:
+
+[source,bash]
+....
+% chmod 555 foo/
+....
+
+Durch den abschließenden Schrägstrich folgt man:chmod[1] dem symbolischen Link [.filename]#foo#, um die Zugriffsrechte für das Verzeichnis [.filename]#bar# zu ändern.
+====
+
+=== Kann ich DOS-Programme unter FreeBSD ausführen?
+
+Ja. Sie können package:emulators/doscmd[] verwenden, das über die FreeBSD Ports-Sammlung verfügbar ist.
+
+Falls doscmd nicht ausreicht, können Sie den Port package: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.
+
+Die Ports-Sammlung enthält auch package:emulators/dosbox[]. Das Hauptaugenmerk liegt bei dieser Anwendung auf der Emulation alter DOS Spiele, deren Dateien sich im lokalen Dateisystem befinden.
+
+=== Was muss ich tun, um die FreeBSD-Dokumentation in meine Muttersprache zu übersetzen?
+
+Lesen Sie die link:{fdp-primer}#translations/[Translation FAQ] im FreeBSD Documentation Project Primer.
+
+=== 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. Es gibt einige spezielle Anforderungen:
+
+* Die IP-Adresse des SMTP-Clients muss symbolisch in einen Hostnamen aufgelöst werden können.
+* Der vollqualifizierte Rechnername, der im EHLO/HELO Teil der SMTP Kommunikation übergeben wird, muss zu einer IP-Adresse aufgelöst werden können.
+
+Damit die Mail auch ihr Ziel erreicht, hier ein paar weitere Ratschläge:
+
+* Mail sollte im Klartext gesendet werden. Nachrichten an eine Mailingliste sollten die Größe von 200KB nicht überschreiten.
+* Vermeiden Sie übermäßiges Crossposting. Wählen Sie _eine_ für das Problem relevante Mailingliste und senden Sie die Mail dorthin.
+
+Falls Sie immer noch Probleme mit der E-Mail-Infratruktur von `FreeBSD.org` haben, schicken Sie eine Nachricht mit den Details an mailto:postmaster@freebsd.org[postmaster@freebsd.org]. Fügen Sie Datum/Uhrzeit ein, damit die Logdateien überprüft werden können. Beachten Sie jedoch, dass die Mail-Logs nur eine Woche gespeichert werden. Vergewissern Sich sich auch, die Zeitzone oder einen Offset in UTC anzugeben.
+
+=== 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(TM) Systeme. Die Kosten variieren und es kann sein, dass nicht alle Dienste zur Verfügung stehen.
+
+http://www.arbornet.org/[Arbornet, Inc], auch als _M-Net_ bekannt, bietet seit 1983 uneingeschränkten Zugang zu UNIX(TM) 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.
+
+=== Wie heißt das niedliche rote Kerlchen?
+
+Er ist namenlos, es ist einfach "der BSD Daemon". Wenn Sie ihm unbedingt einen Namen geben wollen, nennen Sie ihn "beastie". Beachten Sie aber, dass "beastie" wie "BSD" ausgesprochen wird.
+
+Weitere Informationen über den BSD daemon finden Sie auf seiner http://www.mckusick.com/beastie/index.html[Homepage].
+
+=== Kann ich das Bild des BSD Daemon verwenden?
+
+Eventuell. Der BSD Daemon unterliegt dem Copyright von Marshall Kirk McKusick. Lesen Sie sein http://www.mckusick.com/beastie/mainpage/copyright.html[Statement on the Use of the BSD Daemon Figure], wenn Sie genaue Informationen über die Einschränkungen bei der Nutzung brauchen.
+
+Kurz gesagt, können Sie den BSD Daemon benutzen, solange es für einen privaten Zweck ist und die Nutzung geschmackvoll bleibt. Bevor Sie das Logo kommerziell nutzen, bitten Sie Kirk McKusick mailto:mckusick@FreeBSD.org[mckusick@FreeBSD.org] um Erlaubnis. Weitere Informationen erhalten Sie auf http://www.mckusick.com/beastie/index.html[BSD Daemon's home page]
+
+=== Gibt es Bilder des BSD Daemon, die ich benutzen kann?
+
+Einige Bilder in den Formaten Xfig und eps sind unter [.filename]#/usr/shared/examples/BSD_daemon/# verfügbar.
+
+=== 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 im link:{handbook}#freebsd-glossary[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 Poul-Henning Kamp mailto:phk@FreeBSD.org[phk@FreeBSD.org] nach einen langen Diskussion über das Thema "Soll man:sleep[1] Sekundenbruchteile als Parameter akzeptieren?" eine lange Mail mit dem Titel "link:http://www.bikeshed.com[A bike shed (any color will do) on greener grass...]" schrieb. Die einschlägigen Teile der Nachricht lauteten:
+
+Poul-Henning Kamp mailto:phk@FreeBSD.org[phk@FreeBSD.org] in http://lists.FreeBSD.org/mailman/listinfo/freebsd-hackers[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 wird dieses Verhalten "Seine Fingerabdrücke hinterlassen" genannt. 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. Denken Sie einfach mal an Fußabdrücke in feuchtem Zement.
+
+== Nicht ganz ernstgemeinte Fragen
+
+=== Wie cool ist FreeBSD?
+
+[qanda]
+Hat irgend jemand Temperaturmessungen durchgeführt, während FreeBSD läuft? Ich weiß, dass Linux(TM) cooler läuft als DOS, habe aber niemals gesehen, dass FreeBSD erwähnt wurde. Es scheint sehr heiß zu laufen.::
+
+Nein, aber wir haben zahlreiche Geschmackstests mit Freiwilligen mit verbundenen Augen durchgeführt, denen außerdem zuvor 250 Mikrogramm LSD-25 verabreicht wurden. 35% der Freiwilligen sagte, dass FreeBSD nach Orange schmeckte, Linux(TM) hingegen schmecke wie Purple Haze. 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 benutzt die Instruktion HLT (halt), wenn das System untätig ist, wodurch der Energieverbrauch und dadurch die produzierte Wärme reduziert wird. Falls Sie auch ACPI (Advanced Configuration and Power Interface) konfiguriert haben, kann FreeBSD die CPU auch in einen Low-Power-Modus bringen.
+
+=== Wer kratzt in meinen Speicherbänken??
+
+[qanda]
+Gibt es irgend etwas "seltsames", das FreeBSD tut, wenn der Kernel kompiliert wird, 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.::
+
+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` aus DOS 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(TM) 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 die Aktualisierung 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.
+
+_Nik Clayton_ mailto:nik@FreeBSD.org[nik@FreeBSD.org] 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 :-)_
+
+_Thomas Abthorpe_ mailto:tabthorpe@FreeBSD.org[tabthorpe@FreeBSD.org] sagt: "Keine, _echte_ FreeBSD Hacker fürchten sich nicht vor der Dunkelheit!"
+
+=== 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 [.filename]#/dev/null#, was zur Überhitzung der CPU führt. Wenn Sie [.filename]#/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 [.filename]#/dev/random# lesen und in die Weite des Netzwerkes schicken; allerdings besteht hier die Gefahr der Überhitzung von Netzwerk und [.filename]#/#. 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.
+
+_Paul Robinson fügt hinzu:_
+
+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.
+
+=== Mein Kollege hängt zu viel vor dem Rechner, wie kann ich ihm einen Streich spielen?
+
+Installieren Sie auf dem Rechner Ihres Kollegen package:games/sl[] und warten Sie, bis Ihr Kollege unbeabsichtigt `sl` für `ls` eingibt.
+
+== Weiterführende Themen
+
+=== Wie kann ich mehr über die Interna von FreeBSD erfahren?
+
+Lesen Sie das link:{arch-handbook}[FreeBSD Architecture Handbook].
+
+Allgemeines Wissen über UNIX(TM) kann allerdings in den meisten Fällen auf FreeBSD angewendet werden.
+
+=== Wie kann ich bei der Entwicklung von FreeBSD mithelfen?
+
+Genauere Informationen finden Sie im Artikel link:{contributing}[FreeBSD unterstützen]. Wir können Hilfe immer gut gebrauchen!
+
+=== Was sind Snapshots und Releases?
+
+Derzeit existieren drei aktive/halbaktive Zweige im FreeBSD http://svnweb.FreeBSD.org/base/[Subversion Repository]. In früheren Zweigen ändert sich wenig, daher gibt es nur drei aktive Entwicklungszweige:
+
+* stable/9/ bzw. _9-STABLE_
+* stable/10/ bzw. _10-STABLE_
+* head/ bzw. _-CURRENT_ oder auch _11-CURRENT_
+
+`HEAD` ist keine wirkliche Bezeichnung für einen Zweig. 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 11._X_-Entwicklungsstrom. Der _10-STABLE_-Zweig (stable/10) wurde von _-CURRENT_ im Januar 2014 und der _9-STABLE_-Zweig (stable/9) im September 2011 von _-CURRENT_ abgespalten.
+
+=== Ich habe eine Kernelerweiterung geschrieben. An wen sende ich sie?
+
+Lesen Sie den Artikel link:{contributing}[FreeBSD unterstützen].
+
+Und Danke, dass Sie darüber nachdenken!
+
+=== Wie kann ich optimalen Nutzen aus einer kernel panic ziehen?
+
+Hier ist eine typische Kernel-Panic:
+
+[.programlisting]
+....
+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
+....
+
+Bei Meldungen wie dieser, reicht es nicht, sie einfach zu reproduzieren und sie einzusenden. Der Wert des Instruktionszeigers 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 [.filename]#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:
+
+[.procedure]
+====
+. 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:
++
+[source,bash]
+....
+% 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 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 noch einmal, z.B.:
++
+[source,bash]
+....
+% 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.
+====
+
+Wie dem auch sei, der beste Weg, den Grund für eine Panik herauszufinden, ist der, einen Crash-Dump festzuhalten und dann man:kgdb[1] zu benutzen, um den Stack im Crash-Dump zurückzuverfolgen.
+
+Jedenfalls funktioniert die Methode wie folgt:
+
+[.procedure]
+====
+. Sorgen Sie dafür, dass die folgende Zeile in der Kernelkonfigurationsdatei enthalten ist:
++
+[.programlisting]
+....
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+....
++
+. Wechseln Sie in das Verzeichnis [.filename]#/usr/src#:
++
+[source,bash]
+....
+# cd /usr/src
+....
++
+. Erstellen Sie den Kernel:
++
+[source,bash]
+....
+# make buildkernel KERNCONF=MYKERNEL
+....
++
+. Warten Sie, bis man:make[1] den Kernel fertig kompiliert hat.
++
+[source,bash]
+....
+# make installkernel KERNCONF=MYKERNEL
+....
++
+. Starten Sie das System neu.
+====
+
+[NOTE]
+====
+Falls Sie `KERNCONF` nicht verwenden, wird ein [.filename]#GENERIC# Kernel gebaut und installiert.
+====
+
+Der man:make[1]-Prozess wird zwei Kernel erstellen: [.filename]#/usr/obj/usr/src/sys/MYKERNEL/kernel# und [.filename]#/usr/obj/usr/src/sys/MYKERNEL/kernel.debug#. [.filename]#kernel# wurde als [.filename]#/boot/kernel# installiert, während [.filename]#kernel.debug# als Quelle für Debuggersymbole für man:kgdb[1] benutzt werden kann.
+
+Damit ein Crash-Dump erhalten bleibt, müssen Sie [.filename]#/etc/rc.config# editieren und `dumpdev` so setzen, dass es entweder auf die Swap-Partition, oder auf `AUTO` zeigt. Das bewirkt, dass die man:rc[8]-Skripte den Befehl man:dumpon[8] benutzen, um Crash-Dumps zu ermöglichen. Sie können den Befehl auch manuell ausführen. Nach einer Panik kann der Crash-Dump mit man:savecore[8] wiederhergestellt werden; wenn `dumpdev` in [.filename]#/etc/rc.conf# gesetzt ist, werden die man:rc[8]-Skripte man:savecore[8] automatisch ausführen und den Crash-Dump unter [.filename]#/var/crash# ablegen.
+
+[NOTE]
+====
+FreeBSD Crash-Dumps sind für gewöhnlich genauso groß wie der physikalische Hauptspeicher des Rechners. Deshalb müssen Sie dafür sorgen, dass genügend Speicherplatz in [.filename]#/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 mit mehr Platz wiederherstellen Es ist möglich, die Größe des Crash-Dumps zu begrenzen, indem `options MAXMEM=N`, wobei _N_ die Größe des verwendeten Kernelspeichers in KBs ist. Wenn Sie z.B. 1 GB RAM haben, können Sie die Speicherbenutzung des Kernels damit auf 128 MB begrenzen, so dass die Größe des Crash-Dumps 128 MB anstatt 1 GB betragen wird.
+====
+
+Sobald der Crash-Dump wiederhergestellt wurde, können Sie den Stack zurückverfolgen:
+
+[source,bash]
+....
+% kgdb /usr/obj/usr/src/sys/MYKERNEL/kernel.debug /var/crash/vmcore.0
+(kgdb) backtrace
+....
+
+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-Quellcodes 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:kgdb[1] auch zum Ausdrucken der Inhalte verschiedener Variablen oder Strukturen benutzen, um den Systemstatus zum Zeitpunkt des Absturzes zu untersuchen.
+
+[TIP]
+====
+
+Wenn Sie einen zweiten Rechner haben, können Sie man:kgdb[1] auch für entferntes Debugging konfigurieren, einschließlich dem Setzen von Haltepunkten und dem Bewegen in Einzelschritten durch den Kernelcode.
+====
+
+[NOTE]
+====
+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.
+====
+
+=== 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 `--export-dynamic` von man:ld[1] linken.
+
+=== Wie kann ich den Adressraum des Kernels auf i386 vergrössern oder verkleinern?
+
+Standardmäßig beträgt der Adressraum des Kernels 1 GB (2 GB für PAE) auf i386. Wenn Sie einen netzwerkintensiven Server oder ZFS verwenden möchten, kann es sein, dass dies nicht ausreichend ist.
+
+Fügen Sie die folgende Zeile zur Kernelkonfigurationsdatei hinzu, um den verfügbaren Speicher zu erhöhen und erstellen Sie dann einen neuen Kernel:
+
+[.programlisting]
+....
+options KVA_PAGES=N
+....
+
+Um den richtigen Wert von _N_ zu bestimmen, teilen Sie den gewünschte Größe des Adressraumes (in Megabyte) durch vier (z.B. beträgt er `512` für 2 GB).
+
+== Danksagung
+
+Dieses kleine unschuldige Dokument mit Häufig gestellten Fragen wurde die letzten Jahrzehnte 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, link:{contributing}[dieser Gruppe beizutreten], um diese FAQ noch besser zu machen.
+
+[bibliography]
+[[bibliography]]
+== Bibliographie
+
+[biblio-unleashed] FreeBSD Unleashed. Michael Urban und Brian Tiemann. Sams. Erste Ausgabe. 992 Seiten. Oktober 2001. ISBN 0-67232-206-4.
+
+[biblio-44sysman] 4.4BSD System Manager's Manual. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 804 Seiten. ISBN 1-56592-080-5.
+
+[biblio-44userman] 4.4BSD User's Reference Manual. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 905 Seiten. ISBN 1-56592-075-9.
+
+[biblio-44suppman] 4.4BSD User's Supplementary Documents. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 712 Seiten. ISBN 1-56592-076-7.
+
+[biblio-44progman] 4.4BSD Programmer's Reference Manual. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 866 Seiten. ISBN 1-56592-078-3.
+
+[biblio-44progsupp] 4.4BSD Programmer's Supplementary Documents. Computer Systems Research Group, University of California, Berkeley. O'Reilly and Associates. Erste Ausgabe. Juni 1994. 596 Seiten. ISBN 1-56592-079-1.
+
+[biblio-44kernel] The Design and Implementation of the 4.4BSD Operating System. M. K. McKusick, Kirk Marshall, Keith Bostic, Michael J Karels und John Quarterman. Addison-Wesley. Reading MA . 1996. ISBN 0-201-54979-4.
+
+[biblio-freebsdkernel] The Design and Implementation of the FreeBSD Operating System. M. K. McKusick und George V. Neville-Neil. Addison-Wesley. Boston MA . 2004. ISBN 0-201-70245-2.
+
+[biblio-nemeth3rd] Unix System Administration Handbook. Evi Nemeth, Garth Snyder, Scott Seebass, Trent R. Hein und John Quarterman. Prentice-Hall. Dritte Ausgabe. 2000. ISBN 0-13-020601-6.
+
+[lehey3rd] The Complete FreeBSD. Greg Lehey. Walnut Creek. Dritte Ausgabe. Juni 1999. 773 Seiten. ISBN 1-57176-246-9.
+
+[McKusick et al, 1994] Berkeley Software Architecture Manual, 4.4BSD Edition. M. K. McKusick, M. J. Karels, S. J. Leffler, W. N. Joy und R. S. Faber. 5:1-42.
+
+[biblio-ja-fbsdpc98] FreeBSD for PC 98'ers (in Japanisch). SHUWA System Co, LTD.. ISBN 4-87966-468-5 C3055 P2900E.
+
+[biblio-ja-fbsd] FreeBSD (in Japanisch). CUTT. ISBN 4-906391-22-2.
+
+[biblio-ja-compintro] Complete Introduction to FreeBSD (in Japanisch). Shoeisha Co., Ltd. ISBN 4-88135-473-6 P3600E.
+
+[biblio-ja-unixstarterkit] Personal UNIX Starter Kit FreeBSD (in Japanisch). ASCII. ISBN 4-7561-1733-3 P3000E.
+
+[biblio-ja-fbsdhb] FreeBSD Handbook (Japanische Übersetzung). ASCII. ISBN 4-7561-1580-2 P3800E.
+
+[biblio-ge-fbsdmitmeth] FreeBSD mit Methode (in Deutsch). Computer und Literature Verlag/Vertrieb Hanser. 1998. ISBN 3-932311-31-0.
+
+[biblio-ja-fbsdinstandutil] FreeBSD install and Utilization Manual (in Japanisch). Mainichi Communications Inc..
+
+[biblio-indo-intserv] Building Internet Server with FreeBSD (in Indonesisch). Elex Media Komputindo. Onno W Purbo, Dodi Maryanto, Syahrial Hubbany und Widjil Widodo.
+
+[biblio-fbsdcorpnetguide] The FreeBSD Corporate Networker's Guide. Addison-Wesley.
+
+[biblio-unixnutshell] UNIX in a Nutshell. O'Reilly & Associates, Inc.. 1990. ISBN 093717520X.
+
+[biblio-cantfindadmin] What You Need To Know When You Can't Find Your Unix System Administrator. O'Reilly & Associates, Inc.. 1995. Linda Mui. ISBN 1-56592-104-6.
+
+[biblio-ja-fbsdusrrefman] FreeBSD User's Reference Manual (Japanische Übersetzung). Mainichi Communications Inc.. Jpman Project, Japan FreeBSD Users Group. 1998. ISBN 4-8399-0088-4 P3800E.
+
+[biblio-newcomeunix] http://unixhelp.ed.ac.uk/[Online Guide for newcomers to the UNIX environment]“. http://www.ed.ac.uk/[Edinburgh University].
+
+[biblio-dnsandbind] DNS and BIND. O'Reilly & Associates, Inc. ISBN 1-56592-512-2. Paul Albitz Albitz und Cricket Liu. 1998. Dritte Ausgabe.
+
+[biblio-sendmail] Sendmail. O'Reilly & Associates, Inc. 1997. Zweite Auflage. Brian Costales. ISBN 1-56592-222-0.
+
+[biblio-esssysadmin] Essential System Administration. Æleen Frisch. Zweite Auflage. O'Reilly & Associates. 1995. ISBN 1-56592-127-5.
+
+[biblio-tcpipnetworkadministration] TCP/IP Network Administration. Craig Hunt. Zweite Auflage. O'Reilly & Associates, Inc. 1997. ISBN 1-56592-322-7.
+
+[biblio-managingnfsandnis] Managing NFS and NIS. Hal Stern. O'Reilly & Associates, Inc. 1991. ISBN 0-937175-75-7.
+
+[biblio-jpmanprojectjfug] http://www.pc.mycom.co.jp/FreeBSD/sam.html[FreeBSD System Administration's Manual]. http://www.jp.freebsd.org/[Jpman Project, Japan FreeBSD Users Group]. http://www.pc.mycom.co.jp/[Mainichi Communications Inc.]. 1998. ISBN 4-8399-0109-0 P3300E.
+
+[biblio-xwinsystoolkit] X Window System Toolkit. Digital Press. Paul Asente. ISBN 1-55558-051-3.
+
+[biblio-carefman] C: A Reference Manual. Prentice Hall. 1995. Vierte Auflage. Samuel P. Harbison und Guy L. Jr. Steele. ISBN 0-13-326224-3.
+
+[biblio-thecproglang] The C Programming Language. Prentice Hall. 1998. Brian Kernighan und Dennis Ritchie. ISBN 0-13-110362-9.
+
+[biblio-portingunixsoft] Porting UNIX Software. Greg Lehey. O'Reilly & Associates, Inc.. 1995. ISBN 1-56592-126-7.
+
+[biblio-thestandardclibrary] The Standard C Library. Prentice Hall. 1992. P. J. Plauger. ISBN 0-13-131509-9.
+
+[biblio-advprogintheunixenv] Advanced Programming in the UNIX Environment. Addison-Wesley. 1992. W. Richard Stevens. ISBN 0-201-56317-7.
+
+[biblio-unixnetprog] UNIX Network Programming. W. Richard Stevens. Prentice Hall. 1998. Zweite Auflage. ISBN 0-13-490012-X.
+
+[biblio-writeserialdriverforunix] Writing Serial Drivers for UNIX. Bill Wells. Dezember 1994. Dr. Dobb's Journal. pp68-71, pp97-99.
+
+[biblio-unixsysarch] UNIX System Architecture. Prentice-Hall, Inc. 1990. Prabhat K. Andleigh. ISBN 0-13-949843-5.
+
+[biblio-portingunixtothe386] Porting UNIX to the 386. William Jolitz. Dr. Dobb's Journal. Januar 1991 - Juli 1992.
+
+[biblio-tcpipillv1theprotocols] TCP/IP Illustrated, Volume 1: The Protocols. W. Richard Stevens. Addison-Wesley. 1996. ISBN 0-201-63346-9.
+
+[biblio-unixsysformodrnarch] Unix Systems for Modern Architectures. Addison-Wesley. Curt Schimmel. 1994. ISBN 0-201-63338-8.
+
+[biblio-tcpipillvol3] TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP and the UNIX Domain Protocols. Addison-Wesley. 1996. W. Richard Stevens. ISBN 0-201-63495-3.
+
+[biblio-unixinternthenewfrontiers] UNIX Internals -- The New Frontiers. Uresh Vahalia. Prentice Hall. 1996. ISBN 0-13-101908-2.
+
+[biblio-tcpipillvol2theimplementation] TCP/IP Illustrated, Volume 2: The Implementation. Gary R. Wright und W. Richard Stevens. 1995. Addison-Wesley. ISBN 0-201-63354-X.
+
+[biblio-firewallsandinternetsecurity] Firewalls and Internet Security: Repelling the Wily Hacker. William R. CHeswick und Steven M. Bellovin. Addison-Wesley. 1995. ISBN 0-201-63357-4.
+
+[biblio-practicalunixsecurity] Practical UNIX Security. Simson Garfinkel und Gene Spafford. 1996. Zweite Auflage. O'Reilly & Associates, Inc. ISBN 1-56592-148-8.
+
+[biblio-pgpprettygoodprivacy] PGP Pretty Good Privacy. Simson Garfinkel. O'Reilly & Associates, Inc. 1995. ISBN 1-56592-098-8.
+
+[biblio-pentiumprocarch] Pentium Processor System Architecture. Don Anderson und Tom Shanley. Addison-Wesley. 1995. Zweite Auflage. ISBN 0-201-40992-5.
+
+[biblio-progguidetothesvgacards] Programmer's Guide to the EGA, VGA, and Super VGA Cards. Richard F. Ferraro. Dritte Ausgabe. Addison-Wesley. 1995. ISBN 0-201-62490-7.
+
+[biblio-80486] 80486 System Architecture. Tom Shanley. Addison-Wesley. 1995. Dritte Ausgabe. ISBN 0-201-40994-1.
+
+[biblio-isasysarch] ISA System Architecture. Tom Shanley. Addison-Wesley. Dritte Ausgabe. 1995. ISBN 0-201-40996-8.
+
+[biblio-pcisysarch] PCI System Architecture. Tom Shanley. Addison-Wesley. 1995. Dritte Ausgabe. ISBN 0-201-40993-3.
+
+[biblio-theundocumentedpc] The Undocumented PC. Frank Van Gilluwe. Addison-Wesley. 1994. ISBN 0-201-62277-7.
+
+[biblio-bellsystemtechnicaljournal] Bell System Technical Journal, Unix Time-Sharing System. American Telephone & Telegraph Company. Juli - August 1978. Vol 57, No 6, Part 2. ISSN0005-8580.
+
+[biblio-commentaryonunix] Lion's Commentary on UNIX. John Lion. ITP Media Group. 1996. Sechste Ausgabe. ISBN 1573980137.
+
+[biblio-newhackerdict] The New Hacker's Dictionary. Eric S. Raymond. MIT Press. 1996. Dritte Ausgabe. ISBN 0-262-68092-0.
+
+[biblio-aqtrcentofunix] A quarter century of UNIX. Peter H. Salus. Addison-Wesley. 1994. ISBN 0-201-54777-5.
+
+[biblio-unixhatershandbook] The UNIX-HATERS Handbook. Steven Strassman, Daniel Weise und Simon Garfinkel. IDG Books Worldwide, Inc. 1994. ISBN 1-56884-203-1.
+
+[biblio-lifewithunix] Life with UNIX - special edition. Don Libes und Sandy Ressler. Prentice-Hall. 1989. ISBN 0-13-536657-7.
+
+[biblio-bsdfamilytree] https://svnweb.freebsd.org/base/head/shared/misc/bsd-family-tree?view=co[The BSD Family Tree]. 1997.
+
+[absolutebsd] Absolute BSD. Michael Lucas. No Starch Press. Juni 2002. ISBN 1-886411-74-3.
+
+[biblio-ccppusersjournal] The C/C++ Users Journal. R&D Publications Inc.. ISSN 1075-2838.
+
+[biblio-sysadminthejournalforunixsysadmins] Sys Admin - The Journal for UNIX System Administrators. Miller Freeman, Inc. ISSN 1061-2688.
diff --git a/documentation/content/de/books/faq/chapters-order.adoc b/documentation/content/de/books/faq/chapters-order.adoc
new file mode 100644
index 0000000000..bb86b134ce
--- /dev/null
+++ b/documentation/content/de/books/faq/chapters-order.adoc
@@ -0,0 +1 @@
+_index.adoc
diff --git a/documentation/content/de/books/handbook/_index.adoc b/documentation/content/de/books/handbook/_index.adoc
new file mode 100644
index 0000000000..b367738d7f
--- /dev/null
+++ b/documentation/content/de/books/handbook/_index.adoc
@@ -0,0 +1,53 @@
+---
+title: FreeBSD Handbuch
+authors:
+ - author: The FreeBSD Documentation Project
+copyright: 1995-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "ibm", "ieee", "redhat", "3com", "adobe", "apple", "intel", "linux", "microsoft", "opengroup", "sun", "realnetworks", "oracle", "3ware", "arm", "adaptec", "google", "heidelberger", "intuit", "lsilogic", "themathworks", "thomson", "vmware", "wolframresearch", "xiph", "xfree86", "general"]
+next: books/handbook/preface
+---
+
+= FreeBSD Handbuch
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Inhaltsverzeichnis
+:part-signifier: Teil
+:chapter-signifier: Kapitel
+:appendix-caption: Anhang
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+
+[.abstract-title]
+Zusammenfassung
+
+Willkommen bei FreeBSD! Dieses Handbuch beschreibt die Installation und den täglichen Umgang mit _FreeBSD {rel121-current}-RELEASE_, _FreeBSD {rel113-current}-RELEASE_. Das Handbuch ist das Ergebnis einer fortlaufenden Arbeit vieler Einzelpersonen. Dies kann dazu führen, dass einige Abschnitte nicht aktuell sind. Bei Unklarheiten empfiehlt es sich daher stets, die link:{handbook}[englische Originalversion] des Handbuchs zu lesen.
+
+Wenn Sie bei der Übersetzung des Handbuchs mithelfen möchten, senden Sie bitte eine E-Mail an die Mailingliste {de-doc}.
+
+Die aktuelle Version des Handbuchs ist immer auf dem https://www.FreeBSD.org/[FreeBSD-Webserver] verfügbar und kann in verschiedenen Formaten und in komprimierter Form vom https://download.freebsd.org/ftp/doc[FreeBSD FTP-Server] oder einem der vielen <<mirrors-ftp,Spiegel>> herunter geladen werden (ältere Versionen finden Sie hingegen unter https://docs.FreeBSD.org/doc/[https://docs.FreeBSD.org/doc/]). Gedruckte Kopien können bei https://www.freebsdmall.com/[FreeBSD Mall] erworben werden. Vielleicht möchten Sie das Handbuch oder andere Dokumente auch link:https://www.FreeBSD.org/search/[durchsuchen].
+
+'''
+
+include::content/de/books/handbook/toc.adoc[]
+
+include::content/de/books/handbook/toc-figures.adoc[]
+
+include::content/de/books/handbook/toc-tables.adoc[]
+
+include::content/de/books/handbook/toc-examples.adoc[]
diff --git a/documentation/content/de/books/handbook/advanced-networking/_index.adoc b/documentation/content/de/books/handbook/advanced-networking/_index.adoc
new file mode 100644
index 0000000000..6a58b85f11
--- /dev/null
+++ b/documentation/content/de/books/handbook/advanced-networking/_index.adoc
@@ -0,0 +1,2831 @@
+---
+title: Kapitel 31. Weiterführende Netzwerkthemen
+part: Teil IV. Netzwerke
+prev: books/handbook/firewalls
+next: books/handbook/partv
+---
+
+[[advanced-networking]]
+= Weiterführende Netzwerkthemen
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 31
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/advanced-networking/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/advanced-networking/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/advanced-networking/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[advanced-networking-synopsis]]
+== Übersicht
+
+Dieses Kapitel beschreibt verschiedene weiterführende Netzwerkthemen.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie
+
+* Die Grundlagen von Gateways und Routen kennen.
+* Wissen, wie man USB Tethering einrichtet.
+* Bluetooth(R)- sowie drahtlose, der Norm IEEE(R) 802.11 entsprechende, Geräte mit FreeBSD verwenden können.
+* Eine Bridge unter FreeBSD einrichten können.
+* Wissen, wie man mithilfe von PXE über ein Netzwerk von einem NFS Root-Dateisystem bootet.
+* IPv6 auf einem FreeBSD-Rechner einrichten können.
+* Das Common Address Redundancy Protocol (CARP) unter FreeBSD einsetzen können.
+* Wissen, wie VLANs unter FreeBSD konfiguriert werden.
+* Wissen, wie Bluetooth-Kopfhörer konfiguriert werden.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie
+
+* Die Grundlagen der [.filename]#/etc/rc#-Skripte verstanden haben.
+* Mit der grundlegenden Netzwerkterminologie vertraut sein.
+* Einen neuen FreeBSD-Kernel konfigurieren und installieren können (crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels]).
+* Wissen, wie man zusätzliche Software von Drittherstellern installiert (crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports]).
+
+[[network-routing]]
+== Gateways und Routen
+
+Der Mechanismus mit dem ein Rechner einen Rechner über ein Netzwerk finden kann, wird als _Routing_ bezeichnet. Eine "Route" besteht aus einem definierten Adresspaar: Einem "Ziel" und einem "Gateway". Die Route zeigt an, dass Pakete über das _Gateway_ zum _Ziel_ gelangen können. Es gibt drei Arten von Zielen: Einzelne Rechner (Hosts), Subnetze und das "Standard"ziel. Die "Standardroute" wird verwendet, wenn keine andere Route zutrifft. Außerdem gibt es drei Arten von Gateways: Einzelne Rechner (Hosts), Schnittstellen (Interfaces, auch als "Links" bezeichnet), sowie Ethernet Hardware-Adressen (MAC). Bekannte Adressen werden in einer Routingtabelle gespeichert.
+
+Dieser Abschnitt bietet einen Überblick über die Grundlagen des Routings. Er demonstriert, wie ein FreeBSD-System als Router konfiguriert werden kann und bietet einige Tipps zur Fehlerbehebung.
+
+[[network-routing-default]]
+=== Grundlagen des Routings
+
+man:netstat[1] zeigt die Routingtabellen eines FreeBSD-Systems an:
+
+[source,bash]
+....
+% netstat -r
+Routing tables
+
+Internet:
+Destination Gateway Flags Refs Use Netif Expire
+default outside-gw UGS 37 418 em0
+localhost localhost UH 0 181 lo0
+test0 0:e0:b5:36:cf:4f UHLW 5 63288 re0 77
+10.20.30.255 link#1 UHLW 1 2421
+example.com link#1 UC 0 0
+host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0
+host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 =>
+host2.example.com link#1 UC 0 0
+224 link#1 UC 0 0
+....
+
+Die Einträge in diesem Beispiel sind wie folgt:
+
+default::
+Die erste Route in der Ausgabe gibt die Standardroute (`default`) an. Wenn sich der lokale Rechner mit einem entfernten Rechner verbinden will, wird die Routingtabelle überprüft, um festzustellen, ob bereits ein bekannter Pfad vorhanden ist. Wird für den entfernten Rechner ein Eintrag in der Routingtabelle gefunden, so prüft das System ob es sich über die angegebene Schnittstelle verbinden kann.
++
+Wenn das Zielsystem mit keinem Eintrag übereinstimmt, oder wenn alle bekannten Routen fehlschlagen, verwendet das System die Standardroute. Für die Rechner im lokalen Netzwerk ist das Feld `Gateway` auf das System gesetzt, welches direkt mit dem Internet verbunden ist. `UG` in der Spalte `Flags` zeigt an, dass das Gateway einsatzbereit ist.
++
+Die Standardroute für einen Rechner, der selbst als Gateway zur Außenwelt fungiert, ist der Gateway-Rechner des Internetanbieters (ISP).
+
+localhost::
+Die zweite Route zeigt die `localhost` Route. Die festgelegte Schnittstelle in der `Netif`-Spalte für `localhost` ist `lo0`, das auch als loopback-Gerät bekannt ist. Das bedeutet, dass der gesamte Datenverkehr für dieses Ziel intern bleibt, anstatt ihn über ein Netzwerk zu versenden.
+
+MAC-Adresse::
+Bei den mit `0:e0:` beginnenden Adressen handelt es sich um MAC-Adressen. FreeBSD identifiziert Rechner im lokalen Netz, im Beispiel `test0`, automatisch und fügt eine direkte Route über die Ethernet-Schnittstelle [.filename]#re0# zu diesem Rechner hinzu. Außerdem existiert in der Spalte `Expire` ein Timeout, der verwendet wird, wenn dieser Rechner in einem definierten Zeitraum nicht reagiert. Wenn dies passiert, wird die Route zu diesem Rechner automatisch gelöscht. Rechner im lokalen Netz werden über das Routing Information Protocol (RIP) identifiziert, welches den kürzesten Weg zu den jeweiligen Rechnern berechnet.
+
+Subnetz::
+FreeBSD wird automatisch Subnetzrouten für das lokale Subnetz hinzufügen. In diesem Beispiel ist `10.20.30.255` die Broadcast-Adresse für das Subnetz `10.20.30`, und `example.com` ist der zu diesem Subnetz gehörige Domainname. Das Ziel `link#1` bezieht sich auf die erste Ethernet-Karte im Rechner.
++
+Routen für Rechner im lokalen Netz und lokale Subnetze werden automatisch durch den man:routed[8] Daemon konfiguriert. Ist dieser nicht gestartet, existieren nur statische Routen, die vom Administrator definiert werden.
+
+Host::
+Die Zeile `host1` bezieht sich auf den Rechner, der durch seine Ethernetadresse bekannt ist. Da es sich um den sendenden Rechner handelt, verwendet FreeBSD automatisch das Loopback-Gerät ([.filename]#lo0#), anstatt den Datenverkehr über die Ethernet-Schnittstelle zu senden.
++
+Die zwei `host2` Zeilen repräsentieren Aliase, die mit man:ifconfig[8] erstellt wurden. Das Symbol `=>` nach der [.filename]#lo0#-Schnittstelle sagt aus, dass zusätzlich zur Loopback-Adresse auch ein Alias eingestellt ist. Solche Routen sind nur auf Rechnern vorhanden, die den Alias bereitstellen. Alle anderen Rechner im lokalen Netz haben für solche Routen nur eine `link#1` Zeile.
+
+224::
+Die letzte Zeile (Zielsubnetz `224`) behandelt Multicasting.
+
+Schließlich gibt es für Routen noch verschiedene Attribute, die sich in der Spalte `Flags` befinden. <<routeflags>> fasst einige dieser Flags und deren Bedeutung zusammen:
+
+[[routeflags]]
+.Allgemeine Attribute in Routingtabellen
+[cols="1,1", frame="none", options="header"]
+|===
+| Attribut
+| Bedeutung
+
+|U
+|Die Route ist aktiv (up).
+
+|H
+|Das Ziel der Route ist ein einzelner Rechner (Host).
+
+|G
+|Alle Daten, die an dieses Ziel gesendet werden, werden von dem Gateway an ihr jeweiliges Ziel weitergeleitet.
+
+|S
+|Diese Route wurde statisch konfiguriert.
+
+|C
+|Erzeugt eine neue Route, basierend auf der Route für den Rechner, mit dem wir uns verbinden. Diese Routenart wird normalerweise für lokale Netzwerke verwendet.
+
+|W
+|Eine Route, die automatisch konfiguriert wurde. Sie basiert auf einer lokalen Netzwerkroute (Clone).
+
+|L
+|Die Route beinhaltet einen Verweis auf eine Ethernetkarte (Link).
+|===
+
+In FreeBSD kann die Standardroute durch die Angabe der IP-Adresse des Standard-Gateways in [.filename]#/etc/rc.conf# definiert werden:
+
+[.programlisting]
+....
+defaultrouter="10.20.30.1"
+....
+
+Die Standardroute kann mit `route` auch manuell gesetzt werden:
+
+[source,bash]
+....
+# route add default 10.20.30.1
+....
+
+Beachten Sie, dass manuell hinzugefügte Routen bei einem Neustart des Systems verloren gehen. Weitere Informationen zum Bearbeiten von Netzwerk-Routingtabellen finden Sie in man:route[8].
+
+[[network-static-routes]]
+=== Statische Routen einrichten
+
+Ein FreeBSD-System kann als Standard-Gateway bzw. Router für ein Netzwerk konfiguriert werden, wenn es sich um einen Dual-Homed-Host handelt. Ein Dual-Homed-Host ist ein Rechner, der sich in mindestens zwei verschiedenen Netzwerken befindet. Typischerweise ist jedes Netzwerk über eine separate Netzwerkschnittstelle verbunden. Mit IP Aliasing können mehrere Adressen, die jeweils zu einem andren Subnetz gehören, an eine physikalische Schnittstelle gebunden werden.
+
+Damit Pakete zwischen den Schnittstellen weitergeleitet werden können, muss das FreeBSD-System als Router konfiguriert werden. Internetstandards und gute Ingenieurspraxis sorgten dafür, dass diese Funktion in FreeBSD in der Voreinstellung deaktiviert ist. Sie kann jedoch aktiviert werden, indem folgende Zeile in [.filename]#/etc/rc.conf# hinzugefügt wird:
+
+[.programlisting]
+....
+gateway_enable="YES" # Auf YES setzen, wenn der Rechner als Gateway arbeiten soll
+....
+
+Um das Routing zu aktivieren, setzen Sie die man:sysctl[8]-Variable `net.inet.ip.forwarding` auf `1`. Um das Routing zu stoppen, muss die Variable wieder auf `0` gesetzt werden.
+
+Die Routingtabelle eines Routers benötigt zusätzliche Routen, damit er weiß, wie er andere Netzwerke erreichen kann. Die Routen können entweder manuell als statische Routen hinzugefügt werden, oder aber der Router lernt automatisch die Routen anhand des Routing-Protokolls. Statische Routen eignen sich für kleine Netzwerke und dieser Abschnitt beschreibt, wie Sie eine statische Route für ein kleines Netzwerk hinzufügen.
+
+[NOTE]
+====
+In großen Netzwerken sind statische Routen schlecht skalierbar. FreeBSD beinhaltet den BSD-Routing-Daemon man:routed[8], der die Protokolle RIP (Version 1 und Version 2) sowie IRDP unterstützt. Die Routing-Protokolle BGP und OSPF können über den Port oder das Paket package:net/zebra[] installiert werden.
+====
+
+Nehmen wir an, dass wir über folgendes Netzwerk verfügen:
+
+image::static-routes.png[]
+
+`RouterA`, ein FreeBSD-Rechner, dient als Router für den Zugriff auf das Internet. Die Standardroute ist auf `10.0.0.1` gesetzt, damit ein Zugriff auf das Internet möglich wird. `RouterB` ist bereits konfiguriert, da er `192.168.1.1` als Standard-Gateway benutzt.
+
+Bevor die statischen Routen hinzugefügt werden, sieht die Routingtabelle auf `RouterA` in etwa so aus:
+
+[source,bash]
+....
+% netstat -nr
+Routing tables
+
+Internet:
+Destination Gateway Flags Refs Use Netif Expire
+default 10.0.0.1 UGS 0 49378 xl0
+127.0.0.1 127.0.0.1 UH 0 6 lo0
+10.0.0/24 link#1 UC 0 0 xl0
+192.168.1/24 link#2 UC 0 0 xl1
+....
+
+Mit dieser Routingtabelle hat `RouterA` keine Route zum Netzwerk `192.168.2.0/24`. Der folgende Befehl wird das interne Netz 2 in die Routingtabelle von `RouterA` aufnehmen und dabei `192.168.1.2` als nächsten Zwischenschritt (Hop) verwenden:
+
+[source,bash]
+....
+# route add -net 192.168.2.0/24 192.168.1.2
+....
+
+Ab sofort kann `RouterA` alle Rechner des Netzwerks `192.168.2.0/24` erreichen. Allerdings gehen die Routing-Informationen verloren, wenn das FreeBSD-System neu gestartet wird. Um statische Routen dauerhaft einzurichten, müssen diese in [.filename]#/etc/rc.conf# eingetragen werden:
+
+[.programlisting]
+....
+# Add Internal Net 2 as a persistent static route
+static_routes="internalnet2"
+route_internalnet2="-net 192.168.2.0/24 192.168.1.2"
+....
+
+Die Variable `static_routes` enthält eine Reihe von Strings, die durch Leerzeichen getrennt sind. Jeder String bezieht sich auf den Namen einer Route. Die Variable `route__internalnet2_` enthält die statische Route.
+
+Wird mit der Variablen `static_routes` mehr als eine Variable angegeben, so werden auch mehrere Routen angelegt. Im folgenden Beispiel werden statische Routen zu den Netzwerken `192.168.0.0/24` und `192.168.1.0/24` angelegt.
+
+[.programlisting]
+....
+static_routes="net1 net2"
+route_net1="-net 192.168.0.0/24 192.168.0.1"
+route_net2="-net 192.168.1.0/24 192.168.1.1"
+....
+
+[[network-routing-troubleshooting]]
+=== Problembehandlung
+
+Wenn ein Adressraum einem Netzwerk zugeordnet wird, konfiguriert der Dienstanbieter seine Routing-Tabellen, so dass der gesamte Verkehr für das Netzwerk über die Verbindung zu der Seite gesendet wird. Aber woher wissen externe Webseiten, dass sie die Daten an das Netzwerk des ISP senden sollen?
+
+Es gibt ein System, das alle zugewiesenen Adressräume verwaltet und die Verbindung zum Internet-Backbone definiert. Der "Backbone" ist das Netz aus Hauptverbindungen, die den Internetverkehr in der ganzen Welt transportieren und verteilen. Jeder Backbone-Rechner verfügt über eine Kopie von Master-Tabellen, die den Verkehr für ein bestimmtes Netzwerk hierarchisch vom Backbone über eine Kette von Dienstanbietern bis hin zu einem bestimmten Netzwerk leiten.
+
+Es ist die Aufgabe des Dienstanbieters, den Backbone-Seiten mitzuteilen, dass sie mit einer Seite verbunden wurden. Dieser Vorgang wird als _Bekanntmachung von Routen_ (routing propagation) bezeichnet.
+
+Manchmal kommt es zu Problemen bei der Bekanntmachung von Routen, und einige Seiten sind nicht in der Lage, sich zu verbinden. Der vielleicht nützlichste Befehl, um festzustellen wo das Routing nicht funktioniert, ist `traceroute`. Das Programm ist nützlich, falls `ping` fehlschlägt.
+
+Rufen Sie `traceroute` mit dem Namen des entfernten Rechners auf, mit dem eine Verbindung aufgebaut werden soll. Die Ausgabe zeigt die Gateway-Rechner entlang des Verbindungspfades an. Schließlich wird der Zielrechner erreicht oder es kommt zu einem Verbindungsabbruch. Weitere Informationen finden Sie in man:traceroute[8].
+
+[[network-routing-multicast]]
+=== Multicast-Routing
+
+FreeBSD unterstützt sowohl Multicast-Anwendungen als auch Multicast-Routing. Multicast-Anwendungen benötigen keine spezielle Konfiguration, um auf FreeBSD lauffähig zu sein. Damit Multicast-Routing unterstützt wird, muss die folgende Option in der Kernelkonfiguration aktiviert werden:
+
+[.programlisting]
+....
+options MROUTING
+....
+
+Der Multicast-Routing-Daemon mrouted kann als Port oder Paket package:net/mroute[] installiert werden. Dieser Daemon implementiert das DVMRP Multicast-Routing-Protokoll. Um die Tunnel und DVMRP einzurichten, muss [.filename]#/usr/local/etc/mrouted.conf# bearbeitet werden. Bei der Installation von mrouted wird auch map-mbone und mrinfo sowie die zugehörigen Manualpages installiert, in denen Sie auch Konfigurationsbeispiele finden können.
+
+[NOTE]
+====
+DVMRP wurde in vielen Multicast-Installationen weitgehend durch das PIM-Protokoll ersetzt. Weitere Informationen finden Sie in man:pim[4].
+====
+
+[[network-wireless]]
+== Drahtlose Netzwerke
+
+=== Grundlagen
+
+Die meisten drahtlosen Netzwerke basieren auf dem Standard IEEE(R) 802.11. Ein einfaches drahtloses Netzwerk besteht aus Stationen, die im 2,4 GHz- oder im 5 GHz-Band miteinander kommunizieren. Es ist aber auch möglich, dass regional andere Frequenzen, beispielsweise im 2,3 GHz- oder 4,9 GHz-Band, verwendet werden.
+
+802.11-Netzwerke können auf zwei verschiedene Arten aufgebaut sein: Im _Infrastruktur-Modus_ agiert eine Station als Master, mit dem sich alle anderen Stationen verbinden. Die Summe aller Stationen wird als Basic Service Set (BSS), die Master-Station hingegen als Access Point (AP) bezeichnet. In einem BSS läuft jedwede Kommunikation über den Access Point. Die zweite Form drahtloser Netzwerke sind die sogenannten _Ad-hoc-Netzwerke_ (auch als IBSS bezeichnet), in denen es keinen Access Point gibt und in denen die Stationen direkt miteinander kommunizieren.
+
+Die ersten 802.11-Netzwerke arbeiteten im 2,4 GHz-Band und nutzten dazu Protokolle der IEEE(R)-Standards 802.11 sowie 802.11b. Diese Standards legen unter anderem Betriebsfrequenzen sowie Merkmale des MAC-Layers (wie Frames und Transmissionsraten) fest. Später kam der Standard 802.11a hinzu, der im 5 GHz-Band, im Gegensatz zu den ersten beiden Standards aber mit unterschiedlichen Signalmechanismen und höheren Transmissionsraten arbeitet. Der neueste Standard 802.11g implementiert die Signal- und Transmissionsmechanismen von 802.11a im 2,4 GHz-Band, ist dabei aber abwärtskompatibel zu 802.11b-Netzwerken.
+
+Unabhängig von den zugrundeliegenden Transportmechanismen verfügen 802.11-Netzwerke über diverse Sicherheitsmechanismen. Der ursprüngliche 802.11-Standard definierte lediglich ein einfaches Sicherheitsprotokoll namens WEP. Dieses Protokoll verwendet einen fixen, gemeinsam verwendeten Schlüssel sowie die RC4-Kryptografie-Chiffre, um Daten verschlüsselt über das drahtlose Netzwerk zu senden. Alle Stationen des Netzwerks müssen sich auf den gleichen fixen Schlüssel einigen, um miteinander kommunizieren zu können. Dieses Schema ist sehr leicht zu knacken und wird deshalb heute kaum mehr eingesetzt. Aktuelle Sicherheitsmechanismen bauen auf dem Standard IEEE(R) 802.11i auf, der neue kryptographische Schlüssel (Chiffren), ein neues Protokoll für die Anmeldung von Stationen an einem Access Point, sowie Mechanismen zum Austausch von Schlüsseln als Vorbereitung der Kommunikation zwischen verschiedenen Geräten festlegt. Kryptografische Schlüssel werden in regelmäßigen Abständen aktualisiert. Außerdem gibt es Mechanismen zur Feststellung und Prävention von Einbruchsversuchen. Ein weiteres häufig verwendetes Sicherheitsprotokoll ist WPA. Dabei handelt es sich um einen Vorläufer von 802.11i, der von einem Industriekonsortium als Zwischenlösung bis zur endgültigen Verabschiedung von 802.11i entwickelt wurde. WPA definiert eine Untergruppe der Anforderungen des 802.11i-Standards und ist für den Einsatz in älterer Hardware vorgesehen. WPA benötigt nur den TKIP-Chiffre, welcher auf dem ursprünglichen WEP-Code basiert. 802.11i erlaubt zwar auch die Verwendung von TKIP, benötigt aber zusätzlich eine stärkere Chiffre (AES-CCM) für die Datenverschlüsselung. AES war für WPA nicht vorgesehen, weil man es als zu rechenintensiv für den Einsatz in älteren Geräten ansah.
+
+Ein weiterer zu beachtender Standard ist 802.11e. Dieser definiert Protokolle zur Übertragung von Multimedia-Anwendungen, wie das Streaming von Videodateien oder Voice-over-IP (VoIP) in einem 802.11-Netzwerk. Analog zu 802.11i verfügt auch 802.11e über eine vorläufige Spezifikation namens WMM (ursprünglich WME), die von einem Industriekonsortium als Untergruppe von 802.11e spezifiziert wurde, um Multimedia-Anwendungen bereits vor der endgültigen Verabschiedung des 802.11e-Standards implementieren zu können. 802.11e sowie WME/WMM erlauben eine Prioritätenvergabe beim Datentransfer in einem drahtlosen Netzwerk. Möglich wird dies durch den Einsatz von Quality of Service-Protokollen (QoS) und erweiterten Medienzugriffsprotokollen. Werden diese Protokolle korrekt implementiert, erlauben sie hohe Datenübertragungsraten und einen priorisierten Datenfluss.
+
+FreeBSD unterstützt die Standards 802.11a, 802.11b und 802.11g. Ebenfalls unterstützt werden WPA sowie die Sicherheitsprotokolle gemäß 802.11i (sowohl für 11a, 11b als auch 11g). QoS und Verkehrspriorisierung, die von den WME/WMM-Protokollen benötigt werden, werden für einen begrenzten Satz von drahtlosen Geräten unterstützt.
+
+[[network-wireless-quick-start]]
+=== Schnellstartanleitung
+
+Häufig soll ein Computer an ein vorhandenes Drahtlosnetzwerk angeschlossen werden. Diese Prozedur zeigt die dazu erforderlichen Schritte.
+
+[.procedure]
+. Besorgen Sie sich vom Netzwerkadministrator die SSID (Service Set Identifier) und den PSK (Pre Shared Key) für das Drahtlosnetzwerk.
+. Ermitteln Sie den drahtlosen Adapter. Der [.filename]#GENERIC#-Kernel von FreeBSD enthält Treiber für viele gängige Adapter. Wenn der drahtlose Adapter eines dieser Modelle ist, wird das in der Ausgabe von man:ifconfig[8] angezeigt:
++
+
+[source,bash]
+....
+% ifconfig | grep -B3 -i wireless
+....
+
++
+In FreeBSD 11 und neueren Versionen verwenden Sie stattdessen diesen Befehl:
++
+
+[source,bash]
+....
+% sysctl net.wlan.devices
+....
+
++
+Wenn der drahtlose Adapter nicht aufgeführt wird, könnte ein zusätzliches Kernelmodul erforderlich sein. Es besteht jedoch auch die Möglichkeit, dass der Adapter von FreeBSD nicht unterstützt wird.
++
+Dieses Beispiel verwendet einen drahtlosen Atheros-Adapter `ath0`.
+. Fügen Sie in [.filename]#/etc/wpa_supplicant.conf# einen Eintrag für das Netzwerk hinzu. Wenn die Datei nicht existiert, müssen Sie diese erstellen. Ersetzen Sie _myssid_ und _psk_ durch die SSID und den PSK. Diese Informationen werden vom Netzwerkadministrator zur Verfügung gestellt.
++
+[.programlisting]
+....
+network={
+ ssid="myssid"
+ psk="mypsk"
+}
+....
+
+. Fügen Sie die entsprechenden Einträge in [.filename]#/etc/rc.conf# ein, um das Netzwerk beim Start zu konfigurieren:
++
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="WPA SYNCDHCP"
+....
+
+. Starten Sie den Computer oder den Netzwerkdienst neu, um sich mit dem Netzwerk zu verbinden:
++
+
+[source,bash]
+....
+# service netif restart
+....
+
+[[network-wireless-basic]]
+=== Basiskonfiguration
+
+==== Kernelkonfiguration
+
+Um ein drahtloses Netzwerk zu nutzen, wird eine drahtlose Netzwerkkarte benötigt und ein Kernel, der drahtlose Netzwerke unterstützt. Der Kernel unterstützt den Einsatz von Kernelmodulen. Daher muss nur die Unterstützung für die verwendeten Geräte aktiviert werden.
+
+Die meisten drahtlosen Geräte verwenden Bauteile von Atheros und werden deshalb vom man:ath[4]-Treiber unterstützt. Um diesen Treiber zu verwenden, muss die folgende Zeile in [.filename]#/boot/loader.conf# hinzugefügt werden:
+
+[.programlisting]
+....
+if_ath_load="YES"
+....
+
+Der Atheros-Treiber besteht aus drei Teilen: dem Treiber selbst (man:ath[4]), dem Hardware-Support-Layer für die chip-spezifischen Funktionen (man:ath_hal[4]) sowie einem Algorithmus zur Auswahl der Frame-Übertragungsrate (ath_rate_sample). Wenn diese Unterstützung als Kernelmodul geladen wird, kümmert sich das Modul automatisch um Abhängigkeiten. Um die Unterstützung für ein anderes drahtloses Gerät zu laden, geben Sie das entsprechende Modul für dieses Gerät an. Dieses Beispiel zeigt die Verwendung von Geräten, die auf Bauteilen von Intersil Prism basieren und den Treiber man:wi[4] benötigen:
+
+[.programlisting]
+....
+if_wi_load="YES"
+....
+
+[NOTE]
+====
+Die Beispiele in diesem Abschnitt verwenden den man:ath[4]-Treiber. Verwenden Sie ein anderes Gerät, muss der Gerätename an die Konfiguration angepasst werden. Eine Liste aller verfügbaren Treiber und unterstützten drahtlosen Geräte finden sich in den FreeBSD Hardware Notes unter https://www.FreeBSD.org/releases/[Release Information] der FreeBSD Homepage. Gibt es keinen nativen FreeBSD-Treiber für das drahtlose Gerät, kann möglicherweise mit crossref:config[config-network-ndis,NDIS] ein Windows(R)-Treiber verwendet werden.
+====
+
+Zusätzlich müssen die Module zur Verschlüsselung des drahtlosen Netzwerks geladen werden. Diese werden normalerweise dynamisch vom man:wlan[4]-Modul geladen. Im folgenden Beispiel erfolgt allerdings eine manuelle Konfiguration. Folgende Module sind verfügbar: man:wlan_wep[4], man:wlan_ccmp[4] und man:wlan_tkip[4]. Sowohl man:wlan_ccmp[4] als auch man:wlan_tkip[4] werden nur benötigt, wenn WPA und/oder die Sicherheitsprotokolle von 802.11i verwendet werden. Wenn das Netzwerk keine Verschlüsselung verwendet, wird die man:wlan_wep[4]-Unterstützung nicht benötigt. Um diese Module beim Systemstart zu laden, fügen Sie folgende Zeilen in [.filename]#/boot/loader.conf# ein:
+
+[.programlisting]
+....
+wlan_wep_load="YES"
+wlan_ccmp_load="YES"
+wlan_tkip_load="YES"
+....
+
+Sobald diese Einträge in [.filename]#/boot/loader.conf# vorhanden sind, muss das FreeBSD-System neu gestartet werden. Alternativ können die Kernelmodule auch manuell mit man:kldload[8] geladen werden.
+
+[NOTE]
+====
+Benutzer, die keine Kernelmodule verwenden wollen, können die benötigten Treiber auch in den Kernel kompilieren. Dazu müssen die folgenden Zeilen in die Kernelkonfigurationsdatei aufgenommen werden:
+
+[.programlisting]
+....
+device wlan # 802.11 support
+device wlan_wep # 802.11 WEP support
+device wlan_ccmp # 802.11 CCMP support
+device wlan_tkip # 802.11 TKIP support
+device wlan_amrr # AMRR transmit rate control algorithm
+device ath # Atheros pci/cardbus NIC's
+device ath_hal # pci/cardbus chip support
+options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors
+device ath_rate_sample # SampleRate tx rate control for ath
+....
+
+Mit diesen Informationen in der Kernelkonfigurationsdatei kann der Kernel neu gebaut, und das FreeBSD-System anschließend neu gestartet werden.
+====
+
+Informationen über das drahtlose Gerät sollten in den Boot-Meldungen folgendermaßen angezeigt werden:
+
+[source,bash]
+....
+ath0: <Atheros 5212> mem 0x88000000-0x8800ffff irq 11 at device 0.0 on cardbus1
+ath0: [ITHREAD]
+ath0: AR2413 mac 7.9 RF2413 phy 4.5
+....
+
+==== Konfiguration der entsprechenden Region
+
+Da die rechtliche Situation in verschiedenen Teilen der Welt unterschiedlich ist, ist es notwendig, die für Ihre Region geltenden Domänen korrekt einzustellen, um die richtigen Informationen darüber zu erhalten, welche Kanäle benutzt werden können.
+
+Die verfügbaren Definitionen der Regionen finden Sie in [.filename]#/etc/regdomain.xml#. Um die Daten zur Laufzeit einzustellen, benutzen Sie `ifconfig`:
+
+[source,bash]
+....
+# ifconfig wlan0 regdomain ETSI country AT
+....
+
+Um die Einstellungen beizubehalten, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzu:
+
+[source,bash]
+....
+# sysrc create_args_wlan0="country AT regdomain ETSI"
+....
+
+=== Infrastruktur-Modus
+
+Drahtlose Netzwerke werden in der Regel im Infrastruktur-Modus (BSS) betrieben. Dazu werden mehrere drahtlose Access Points zu einem gemeinsamen drahtlosen Netzwerk verbunden. Jedes dieser drahtlosen Netzwerke hat einen eigenen Namen, der als >SSID> bezeichnet wird. Alle Clients eines drahtlosen Netzwerks verbinden sich in diesem Modus mit einem Access Point.
+
+==== FreeBSD-Clients
+
+===== Einen Access Point finden
+
+Um nach verfügbaren drahtlosen Netzwerken zu suchen verwenden Sie man:ifconfig[8]. Dieser Scanvorgang kann einen Moment dauern, da jede verfügbare Frequenz auf verfügbare Access Points hin überprüft werden muss. Nur der Super-User kann einen Scanvorgang starten:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev ath0
+# ifconfig wlan0 up scan
+SSID/MESH ID BSSID CHAN RATE S:N INT CAPS
+dlinkap 00:13:46:49:41:76 11 54M -90:96 100 EPS WPA WME
+freebsdap 00:11:95:c3:0d:ac 1 54M -83:96 100 EPS WPA
+....
+
+[NOTE]
+====
+Die Netzwerkkarte muss in den Status `up` versetzt werden, bevor der erste Scanvorgang gestartet werden kann. Für spätere Scans ist dies aber nicht mehr erforderlich.
+====
+
+Als Ergebnis erhalten Sie eine Liste mit allen gefundenen BSS/IBSS-Netzwerken. Zusätzlich zum Namen des Netzwerks, der `SSID`, wird auch die `BSSID` ausgegeben. Dabei handelt es sich um die MAC-Adresse des Access Points. Das Feld `CAPS` gibt den Typ des Netzwerks sowie die Fähigkeiten der Stationen innerhalb des Netzwerks an:
+
+.Station Capability Codes
+[cols="1,1", frame="none", options="header"]
+|===
+| Capability Code
+| Bedeutung
+
+|`E`
+|Extended Service Set (ESS). Zeigt an, dass die Station Teil eines Infrastruktur-Netzwerks ist, und nicht eines IBSS/Ad-hoc-Netzwerks.
+
+|`I`
+|IBSS/Ad-hoc-Netzwerk. Die Station ist Teil eines Ad-hoc-Netzwerks und nicht eines ESS-Netzwerks.
+
+|`P`
+|Privacy. Alle Datenframes, die innerhalb des BSS ausgetauscht werden, sind verschlüsselt. Dieses BSS verwendet dazu kryptographische Verfahren wie WEP, TKIP oder AES-CCMP.
+
+|`S`
+|Short Preamble. Das Netzwerk verwendet eine kurze Präambel (definiert in 802.11b High Rate/DSSS PHY). Eine kurze Präambel verwendet ein 56 Bit langes Sync-Feld, im Gegensatz zu einer langen Präambel, die ein 128 Bit langes Sync-Feld verwendet.
+
+|`s`
+|Short slot time. Das 802.11g-Netzwerk verwendet eine kurze Slotzeit, da es in diesem Netzwerk keine veralteten (802.11b) Geräte gibt.
+|===
+
+Um eine Liste der bekannten Netzwerke auszugeben, verwenden Sie den folgenden Befehl:
+
+[source,bash]
+....
+# ifconfig wlan0 list scan
+....
+
+Diese Liste kann entweder automatisch durch das drahtlose Gerät oder manuell durch eine `scan`-Aufforderung aktualisiert werden. Veraltete Informationen werden dabei automatisch entfernt.
+
+===== Basiseinstellungen
+
+Dieser Abschnitt beschreibt, wie Sie eine drahtlose Netzwerkkarte ohne Verschlüsselung unter FreeBSD einrichten. Nachdem Sie sich mit den Informationen dieses Abschnitts vertraut gemacht haben, sollten Sie das drahtlose Netzwerk mit <<network-wireless-wpa,WPA>> verschlüsseln.
+
+Das Einrichten eines drahtlosen Netzwerks erfolgt in drei Schritten: Der Auswahl eines Access Points, die Anmeldung der Station sowie der Konfiguration der IP-Adresse.
+
+====== Einen Access Point auswählen
+
+Im Normalfall wird sich die Station automatisch mit einem der zur Verfügung stehenden Access Points verbinden. Dazu muss lediglich das drahtlose Gerät aktiviert, oder in [.filename]#/etc/rc.conf# eingetragen sein:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="DHCP"
+....
+
+Stehen mehrere Access Points zur Verfügung, kann ein spezifischer durch Angabe der SSID gewählt werden:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="ssid Ihre_SSID DHCP"
+....
+
+Gibt es in einem Netzwerk mehrere Access Points mit der gleichen SSID, was das Routing vereinfacht, kann es notwendig sein, dass ein bestimmtes Gerät verbunden werden muss. Dazu muss lediglich die BSSID des Access Points angeben werden. Die Angabe der SSID ist hierbei nicht zwingend notwendig:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="ssid Ihre_SSID bssid xx:xx:xx:xx:xx:xx DHCP"
+....
+
+Es gibt noch weitere Möglichkeiten, den Zugriff auf bestimmte Access Point zu beschränken, beispielsweise durch die Begrenzung der Frequenzen, auf denen eine Station nach einem Access Point sucht. Sinnvoll ist ein solches Vorgehen beispielsweise, wenn das drahtlose Gerät in verschiedenen Frequenzbereichen arbeiten kann, da in diesem Fall das Prüfen aller Frequenzen sehr zeitintensiv sein kann. Um nur innerhalb eines bestimmten Frequenzbereichs nach einem Access Point zu suchen, verwenden Sie die Option `mode`:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="mode 11g ssid Ihre_SSID DHCP"
+....
+
+In diesem Beispiel sucht das drahtlose Gerät nur im 2,4 GHz-Band (802.11g), aber nicht innerhalb des 5 GHz-Bandes nach einem Access Point. Mit der Option `channel` kann eine bestimmte Frequenz vorgegeben werden, auf der gesucht werden soll. Die Option `chanlist` erlaubt die Angabe mehrerer erlaubter Frequenzen. Eine umfassende Beschreibung dieser Optionen finden Sie in man:ifconfig[8].
+
+====== Authentifizierung
+
+Sobald ein Access Point gefunden wurde, muss sich die Station am Access Point authentifizieren, bevor Daten übertragen werden können. Dazu gibt es verschiedene Möglichkeiten. Am häufigsten wird die sogenannte _offene Authentifizierung_ verwendet. Dabei wird es jeder Station erlaubt, sich mit einem Netzwerk zu verbinden und Daten zu übertragen. Aus Sicherheitsgründen sollte diese Methode allerdings nur zu Testzwecken bei der erstmaligen Einrichtung eines drahtlosen Netzwerks verwendet werden. Andere Authentifizierungsmechanismen erfordern den Austausch kryptographischer Informationen, bevor sie die Übertragung von Daten erlauben. Dazu gehören der Austausch fixer (vorher vereinbarter) Schlüssel oder Kennwörter, sowie der Einsatz komplexerer Verfahren mit Backend-Diensten wie RADIUS. Die offene Authentifizierung ist die Voreinstellung. Am zweithäufigsten kommt das im <<network-wireless-wpa-wpa-psk>> beschriebene WPA-PSK zum Einsatz, welches auch als WPA Personal bezeichnet wird.
+
+[NOTE]
+====
+Kommt eine Apple(R) AirPort(R) Extreme-Basisstation als Access Point zum Einsatz, muss sowohl die Shared-Key-Authentifizierung als auch ein WEP-Schlüssel konfiguriert werden. Die entsprechende Konfiguration erfolgt entweder in [.filename]#/etc/rc.conf# oder über das Programm man:wpa_supplicant[8]. Für eine einzelne AirPort(R)-Basisstation kann der Zugriff wie folgt konfiguriert werden:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="authmode shared wepmode on weptxkey 1 wepkey 01234567 DHCP"
+....
+
+Normalerweise sollte Shared-Key-Authentifizierung nicht verwendet werden, da diese die Sicherheit des WEP-Schlüssel noch weiter verringert. Wenn WEP für Kompatibilität mit älteren Geräten verwendet werden muss, ist es besser, WEP mit offener Authentifizierung zu verwenden. Weitere Informationen zu WEP finden Sie im <<network-wireless-wep>>.
+====
+
+====== Eine IP-Adresse über DHCP beziehen
+
+Sobald ein Access Point ausgewählt ist und die Authentifizierungsparameter festgelegt sind, wird eine IP-Adresse benötigt. In der Regel wird die IP-Adresse über DHCP bezogen. Um dies zu erreichen, bearbeiten Sie [.filename]#/etc/rc.conf# und fügen Sie `DHCP` für das drahtlose Gerät in die Konfiguration hinzu:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="DHCP"
+....
+
+Das drahtlose Gerät kann nun gestartet werden:
+
+[source,bash]
+....
+# service netif start
+....
+
+Nachdem das Gerät aktiviert wurde, kann mit man:ifconfig[8] der Status des Geräts [.filename]#ath0# abgefragt werden:
+
+[source,bash]
+....
+# ifconfig wlan0
+wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:11:95:d5:43:62
+ inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255
+ media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g
+ status: associated
+ ssid dlinkap channel 11 (2462 Mhz 11g) bssid 00:13:46:49:41:76
+ country US ecm authmode OPEN privacy OFF txpower 21.5 bmiss 7
+ scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7
+ roam:rate 5 protmode CTS wme burst
+....
+
+`status: associated` besagt, dass sich das Gerät mit dem drahtlosen Netzwerk verbunden hat. `bssid 00:13:46:49:41:76` ist die MAC-Adresse des Access Points und `authmode OPEN` zeigt an, dass die Kommunikation nicht verschlüsselt wird.
+
+====== Statische IP-Adressen
+
+Wenn eine IP-Adresse nicht von einem DHCP-Server bezogen werden kann, vergeben Sie eine statische IP-Adresse. Ersetzten Sie dazu das oben gezeigte Schlüsselwort `DHCP` durch die entsprechende IP-Adresse. Beachten Sie dabei, dass Sie die anderen Konfigurationsparameter nicht versehentlich verändern:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="inet 192.168.1.100 netmask 255.255.255.0 ssid your_ssid_here"
+....
+
+[[network-wireless-wpa]]
+===== WPA
+
+Wi-Fi Protected Access (WPA) ist ein Sicherheitsprotokoll, das in 802.11-Netzwerken verwendet wird, um die fehlende Authentifizierung und Schwächen von WEP zu vermeiden. WPA stellt das aktuelle 802.1X-Authentifizierungsprotokoll dar und verwendet eine von mehreren Chiffren, um die Datensicherheit zu gewährleisten. Die einzige Chiffre, die von WPA verlangt wird, ist Temporary Key Integrity Protocol (TKIP). TKIP ist eine Chiffre, die die von WEP verwendete RC4-Chiffre um Funktionen zur Prüfung der Datenintegrität und zur Erkennung und Bekämpfung von Einbruchsversuchen erweitert. TKIP ist durch Softwaremodifikationen auch unter veralteter Hardware lauffähig. Im Vergleich zu WEP ist WPA zwar sehr viel sicherer, es ist aber dennoch nicht völlig immun gegen Angriffe. WPA definiert mit AES-CCMP noch eine weitere Chiffre als Alternative zu TKIP. AES-CCMP, welches häufig als WPA2 oder RSN bezeichnet wird, sollte bevorzugt eingesetzt werden.
+
+WPA definiert Authentifizierungs- und Verschlüsselungsprotokolle. Die Authentifizierung erfolgt in der Regel über eine der folgenden Techniken: 802.1X gemeinsam mit einem Backend-Authentifizierungsdienst wie RADIUS, oder durch einen Minimal-Handshake zwischen der Station und dem Access Point mit einem vorher vereinbarten gemeinsamen Schlüssel. Die erste Technik wird als WPA Enterprise, die zweite hingegen als WPA Personal bezeichnet. Da sich der Aufwand für das Aufsetzen eines RADIUS-Backend-Servers für die meisten drahtlosen Netzwerke nicht lohnt, wird WPA in der Regel als WPA-PSK konfiguriert.
+
+Die Kontrolle der drahtlosen Verbindung sowie das Aushandeln des Schlüssel, oder die Authentifizierung mit einem Server, erfolgt über man:wpa_supplicant[8]. Dieses Programm benötigt eine Konfigurationsdatei, [.filename]#/etc/wpa_supplicant.conf#. Weitere Informationen finden Sie in man:wpa_supplicant.conf[5].
+
+[[network-wireless-wpa-wpa-psk]]
+====== WPA-PSK
+
+WPA-PSK, das auch als WPA-Personal bekannt ist, basiert auf einem gemeinsamen, vorher vereinbarten Schlüssel (PSK), der aus einem Passwort generiert und danach als Master-Key des drahtlosen Netzwerks verwendet wird. Jeder Benutzer des drahtlosen Netzwerks verwendet daher _den gleichen_ Schlüssel. WPA-PSK sollte nur in kleinen Netzwerken eingesetzt werden, in denen die Konfiguration eines Authentifizierungsservers nicht möglich oder erwünscht ist.
+
+[WARNING]
+====
+
+Achten Sie darauf, immer starke Passwörter zu verwenden, die ausreichend lang sind und auch Sonderzeichen enthalten, damit diese nicht leicht erraten oder umgangen werden können.
+====
+
+Der erste Schritt zum Einsatz von WPA-PSK ist die Konfiguration der SSID und des gemeinsamen Schlüssels des Netzwerks in [.filename]#/etc/wpa_supplicant.conf#:
+
+[.programlisting]
+....
+network={
+ ssid="freebsdap"
+ psk="freebsdmall"
+}
+....
+
+Danach wird in [.filename]#/etc/rc.conf# definiert, dass WPA zur Verschlüsselung eingesetzt werden soll und dass die IP-Adresse über DHCP bezogen wird:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="WPA DHCP"
+....
+
+Nun kann das drahtlose Gerät aktiviert werden:
+
+[source,bash]
+....
+# service netif start
+Starting wpa_supplicant.
+DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 5
+DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 6
+DHCPOFFER from 192.168.0.1
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67
+DHCPACK from 192.168.0.1
+bound to 192.168.0.254 -- renewal in 300 seconds.
+wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:11:95:d5:43:62
+ inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11g
+ status: associated
+ ssid freebsdap channel 1 (2412 MHz 11g) bssid 00:11:95:c3:0d:ac
+ country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF
+ AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan
+ bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS
+ wme burst roaming MANUAL
+....
+
+Alternativ kann das drahtlose Gerät manuell, mit Hilfe der Informationen aus [.filename]#/etc/wpa_supplicant.conf# konfiguriert werden:
+
+[source,bash]
+....
+# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf
+Trying to associate with 00:11:95:c3:0d:ac (SSID='freebsdap' freq=2412 MHz)
+Associated with 00:11:95:c3:0d:ac
+WPA: Key negotiation completed with 00:11:95:c3:0d:ac [PTK=CCMP GTK=CCMP]
+CTRL-EVENT-CONNECTED - Connection to 00:11:95:c3:0d:ac completed (auth) [id=0 id_str=]
+....
+
+Im zweiten Schritt starten Sie nun man:dhclient[8], um eine IP-Adresse vom DHCP-Server zu beziehen:
+
+[source,bash]
+....
+# dhclient wlan0
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67
+DHCPACK from 192.168.0.1
+bound to 192.168.0.254 -- renewal in 300 seconds.
+# ifconfig wlan0
+wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:11:95:d5:43:62
+ inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11g
+ status: associated
+ ssid freebsdap channel 1 (2412 MHz 11g) bssid 00:11:95:c3:0d:ac
+ country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF
+ AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan
+ bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS
+ wme burst roaming MANUAL
+....
+
+[NOTE]
+====
+Enthält [.filename]#/etc/rc.conf# bereits die Zeile `ifconfig_wlan0="DHCP"`, wird man:dhclient[8] automatisch gestartet, nachdem man:wpa_supplicant[8] sich mit dem Access Point verbunden hat.
+====
+
+Sollte der Einsatz von DHCP nicht möglich oder nicht gewünscht sein, konfigurieren Sie eine statische IP-Adresse, nachdem man:wpa_supplicant[8] die Station authentifiziert hat:
+
+[source,bash]
+....
+# ifconfig wlan0 inet 192.168.0.100 netmask 255.255.255.0
+# ifconfig wlan0
+wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:11:95:d5:43:62
+ inet 192.168.0.100 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11g
+ status: associated
+ ssid freebsdap channel 1 (2412 MHz 11g) bssid 00:11:95:c3:0d:ac
+ country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF
+ AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan
+ bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS
+ wme burst roaming MANUAL
+....
+
+Falls DHCP nicht verwendet wird, müssen zusätzlich noch das Standard-Gateway sowie der Nameserver manuell festgelegt werden:
+
+[source,bash]
+....
+# route add default your_default_router
+# echo "nameserver your_DNS_server" >> /etc/resolv.conf
+....
+
+[[network-wireless-wpa-eap-tls]]
+====== WPA und EAP-TLS
+
+Die zweite Möglichkeit, WPA einzusetzen, ist die Verwendung eines 802.1X-Backend-Authentifizierungsservers. Diese Variante wird als WPA-Enterprise bezeichnet, um sie vom weniger sicheren WPA-Personal abzugrenzen. Die bei WPA-Enterprise verwendete Authentifizierung basiert auf dem Extensible Authentication Protocol (EAP).
+
+EAP selbst bietet keine Verschlüsselung, sondern operiert in einem verschlüsselten Tunnel. Es gibt verschiedene auf EAP basierende Authentifizierungsmethoden, darunter EAP-TLS, EAP-TTLS und EAP-PEAP.
+
+EAP mit Transport Layers Security (EAP-TLS) ist ein sehr gut unterstütztes Authentifizierungsprotokoll, da es sich dabei um die erste EAP-Methode handelt, die von der http://www.wi-fi.org/[ Wi-Fi Alliance] zertifiziert wurde. EAP-TLS erfordert drei Zertifikate: Das auf allen Rechnern installierte CA-Zertifikat, das Server-Zertifikat des Authentifizierungsservers, sowie ein Client-Zertifikat für jeden drahtlosen Client. Sowohl der Authentifizierungsservers als auch die drahtlosen Clients authentifizieren sich gegenseitig über Zertifikate, wobei sie überprüfen, ob diese Zertifikate auch von der Zertifizierungs-Authorität (CA) des jeweiligen Unternehmens signiert wurden.
+
+Die Konfiguration erfolgt (analog zu WPA-PSK) über [.filename]#/etc/wpa_supplicant.conf#:
+
+[.programlisting]
+....
+network={
+ ssid="freebsdap" <.>
+ proto=RSN <.>
+ key_mgmt=WPA-EAP <.>
+ eap=TLS <.>
+ identity="loader" <.>
+ ca_cert="/etc/certs/cacert.pem" <.>
+ client_cert="/etc/certs/clientcert.pem" <.>
+ private_key="/etc/certs/clientkey.pem" <.>
+ private_key_passwd="freebsdmallclient" <.>
+}
+....
+
+<.> Der Name des Netzwerks (SSID).
+
+<.> Das als WPA2 bekannte RSN IEEE(R) 802.11i Protokoll wird verwendet.
+
+<.> Die `key_mgmt`-Zeile bezieht sich auf das verwendete Key-Management-Protokoll. In diesem Beispiel wird WPA gemeinsam mit der EAP-Authentifizierung verwendet.
+
+<.> Die für die Verbindung verwendete EAP-Methode.
+
+<.> Das `identity`-Feld enthält den von EAP verwendeten Identifizierungsstring.
+
+<.> Das Feld `ca_cert` gibt den Pfad zum CA-Zertifikat an. Diese Datei wird zur Verifizierung des Server-Zertifikats benötigt.
+
+<.> Die `client_cert`-Zeile gibt den Pfad zum Client-Zertifikat an. Jeder Client hat ein eigenes, innerhalb des Netzwerks eindeutiges, Zertifikat.
+
+<.> Das Feld `private_key` gibt den Pfad zum privaten Schlüssel des Client-Zertifikat an.
+
+<.> Das Feld `private_key_passwd` enthält die Passphrase für den privaten Schlüssel.
+
+Danach fügen Sie die folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="WPA DHCP"
+....
+
+Nun können Sie das drahtlose Gerät aktivieren:
+
+[source,bash]
+....
+# service netif start
+Starting wpa_supplicant.
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 7
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 15
+DHCPACK from 192.168.0.20
+bound to 192.168.0.254 -- renewal in 300 seconds.
+wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:11:95:d5:43:62
+ inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet DS/11Mbps mode 11g
+ status: associated
+ ssid freebsdap channel 1 (2412 MHz 11g) bssid 00:11:95:c3:0d:ac
+ country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF
+ AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan
+ bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS
+ wme burst roaming MANUAL
+....
+
+Alternativ kann das drahtlose Gerät manuell mit man:wpa_supplicant[8] und man:ifconfig[8] aktiviert werden.
+
+[[network-wireless-wpa-eap-ttls]]
+====== WPA mit EAP-TTLS
+
+Bei EAP-TLS müssen sowohl der Authentifizierungsserver als auch die Clients jeweils ein eigenes Zertifikat aufweisen. Bei EAP-TTLS ist das Client-Zertifikat optional. EAP-TTLS geht dabei vor wie ein Webserver, der einen sicheren SSL-Tunnel erzeugen kann, ohne dass der Besucher dabei über ein clientseitiges Zertifikat verfügen muss. EAP-TTLS verwendet einen verschlüsselten TLS-Tunnel zum sicheren Transport der Authentifizierungsdaten.
+
+Die erforderliche Konfiguration erfolgt in [.filename]#/etc/wpa_supplicant.conf#:
+
+[.programlisting]
+....
+network={
+ ssid="freebsdap"
+ proto=RSN
+ key_mgmt=WPA-EAP
+ eap=TTLS <.>
+ identity="test" <.>
+ password="test" <.>
+ ca_cert="/etc/certs/cacert.pem" <.>
+ phase2="auth=MD5" <.>
+}
+....
+
+<.> Die für die Verbindung verwendete EAP-Methode.
+
+<.> Das `identity`-Feld enthält den Identifizierungsstring für die EAP-Authentifizierung innerhalb des verschlüsselten TLS-Tunnels.
+
+<.> Das `password`-Feld enthält die Passphrase für die EAP-Authentifizierung.
+
+<.> Das Feld `ca_cert` gibt den Pfad zum CA-Zertifikat an. Diese Datei wird zur Verifizierung des Server-Zertifikats benötigt.
+
+<.> Die innerhalb des verschlüsselten TLS-Tunnels verwendete Authentifizierungsmethode. In Fall von PEAP ist dies `auth=MSCHAPV2`.
+
+Folgende Zeilen müssen in [.filename]#/etc/rc.conf# aufgenommen werden:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+ifconfig_wlan0="WPA DHCP"
+....
+
+Nun kann das drahtlose Gerät aktiviert werden:
+
+[source,bash]
+....
+# service netif start
+Starting wpa_supplicant.
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 7
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 15
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 21
+DHCPACK from 192.168.0.20
+bound to 192.168.0.254 -- renewal in 300 seconds.
+wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:11:95:d5:43:62
+ inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet DS/11Mbps mode 11g
+ status: associated
+ ssid freebsdap channel 1 (2412 MHz 11g) bssid 00:11:95:c3:0d:ac
+ country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF
+ AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan
+ bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS
+ wme burst roaming MANUAL
+....
+
+[[network-wireless-wpa-eap-peap]]
+====== WPA mit EAP-PEAP
+
+[NOTE]
+====
+PEAPv0/EAP-MSCHAPv2 ist die gängigste PEAP-Methode. In diesem Kapitel wird der Begriff PEAP stellvertretend für diese Methode verwendet.
+====
+
+Protected EAP (PEAP) wurde als Alternative zu EAP-TTLS entwickelt und ist nach EAP-TLS der meist genutzte EAP-Standard. In einem Netzwerk mit verschiedenen Betriebssystemen sollte PEAP das am besten unterstützte Standard nach EAP-TLS sein.
+
+PEAP arbeitet ähnlich wie EAP-TTLS. Es verwendet ein serverseitiges Zertifikat, um einen verschlüsselten TLS-Tunnel, über den die sichere Authentifizierung zwischen den Clients und dem Authentifizierungsserver erfolgt. In Sachen Sicherheit unterscheiden sich EAP-TTLS und PEAP allerdings: PEAP überträgt den Benutzernamen im Klartext und verschlüsselt nur das Passwort, während EAP-TTLS sowohl den Benutzernamen, als auch das Passwort über den TLS-Tunnel überträgt.
+
+Um EAP-PEAP zu konfigurieren, fügen Sie die folgenden Zeilen in [.filename]#/etc/wpa_supplicant.conf# ein:
+
+[.programlisting]
+....
+network={
+ ssid="freebsdap"
+ proto=RSN
+ key_mgmt=WPA-EAP
+ eap=PEAP <.>
+ identity="test" <.>
+ password="test" <.>
+ ca_cert="/etc/certs/cacert.pem" <.>
+ phase1="peaplabel=0" <.>
+ phase2="auth=MSCHAPV2" <.>
+}
+....
+
+<.> Die für die Verbindung verwendete EAP-Methode.
+
+<.> Das `identity`-Feld enthält den Identifizierungsstring für die innerhalb des verschlüsselten TLS-Tunnels erfolgende EAP-Authentifizierung.
+
+<.> Das Feld `password` enthält die Passphrase für die EAP-Authentifizierung.
+
+<.> Das Feld `ca_cert` gibt den Pfad zum CA-Zertifikat an. Diese Datei wird zur Verifizierung des Server-Zertifikats benötigt.
+
+<.> Dieses Feld enthält die Parameter für die erste Phase der Authentifizierung, den TLS-Tunnel. Je nachdem, welcher Authentifizierungsserver benutzt wird, kann
+ein spezifisches Label für die Authentifizierung verwendet werden. Meistens lautet das Label "client EAP encryption", dass durch `peaplabel=0` gesetzt wird. Weitere Informationen finden Sie in man:wpa_supplicant.conf[5].
+
+<.> Das innerhalb des verschlüsselten TLS-Tunnels verwendete Authentifizierungsprotokoll. In unserem Beispiel handelt es sich dabei um `auth=MSCHAPV2`.
+
+Danach fügen Sie die folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+ifconfig_ath0="WPA DHCP"
+....
+
+Nun kann das drahtlose Gerät aktiviert werden.
+
+[source,bash]
+....
+# service netif start
+Starting wpa_supplicant.
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 7
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 15
+DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 21
+DHCPACK from 192.168.0.20
+bound to 192.168.0.254 -- renewal in 300 seconds.
+wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:11:95:d5:43:62
+ inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet DS/11Mbps mode 11g
+ status: associated
+ ssid freebsdap channel 1 (2412 MHz 11g) bssid 00:11:95:c3:0d:ac
+ country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF
+ AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan
+ bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS
+ wme burst roaming MANUAL
+....
+
+[[network-wireless-wep]]
+===== WEP
+
+Wired Equivalent Privacy (WEP) ist Teil des ursprünglichen 802.11-Standards. Es enthält keinen Authentifzierungsmechanismus und verfügt lediglich über eine schwache Zugriffskontrolle, die sehr leicht umgangen werden kann.
+
+WEP kann über man:ifconfig[8] aktiviert werden:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev ath0
+# ifconfig wlan0 inet 192.168.1.100 netmask 255.255.255.0 \
+ ssid my_net wepmode on weptxkey 3 wepkey 3:0x3456789012
+....
+
+* `weptxkey` definiert den WEP-Schlüssel, der für die Datenübertragung verwendet wird. Dieses Beispiel verwendet den dritten Schlüssel. Der gleiche Schlüssel muss auch am Access Point eingestellt sein. Kennen Sie den vom Access Point verwendeten Schlüssel nicht, sollten Sie zuerst den Wert `1` (den ersten Schlüssel) für diese Variable verwenden.
+* `wepkey` legt den zu verwendenden WEP-Schlüssel in der Form _Nummer:Schlüssel_ fest. Schlüssel `1` wird standardmäßig verwendet. Die "Nummer" muss nur angegeben werden, wenn ein anderer als der erste Schlüssel verwendet werden soll.
++
+[NOTE]
+====
+Ersetzen Sie `0x3456789012` durch den am Access Point konfigurierten Schlüssel.
+====
+
+Weitere Informationen finden Sie in man:ifconfig[8].
+
+Das Programm man:wpa_supplicant[8] eignet sich ebenfalls dazu, WEP für drahtlose Geräte zu aktivieren. Obige Konfiguration lässt sich dabei durch die Aufnahme der folgenden Zeilen in [.filename]#/etc/wpa_supplicant.conf# realisieren:
+
+[.programlisting]
+....
+network={
+ ssid="my_net"
+ key_mgmt=NONE
+ wep_key3=3456789012
+ wep_tx_keyidx=3
+}
+....
+
+Danach müssen Sie das Programm noch aufrufen:
+
+[source,bash]
+....
+# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf
+Trying to associate with 00:13:46:49:41:76 (SSID='dlinkap' freq=2437 MHz)
+Associated with 00:13:46:49:41:76
+....
+
+=== Ad-hoc-Modus
+
+Der IBSS-Modus, der auch als Ad-hoc-Modus bezeichnet wird, ist für Punkt-zu-Punkt-Verbindungen vorgesehen. Um beispielsweise eine Ad-hoc-Verbindung zwischen den Rechnern `A` und `B` aufzubauen, werden lediglich zwei IP-Adressen und eine SSID benötigt.
+
+Auf Rechner `A`:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev ath0 wlanmode adhoc
+# ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap
+# ifconfig wlan0
+ wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether 00:11:95:c3:0d:ac
+ inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <adhoc>
+ status: running
+ ssid freebsdap channel 2 (2417 Mhz 11g) bssid 02:11:95:c3:0d:ac
+ country US ecm authmode OPEN privacy OFF txpower 21.5 scanvalid 60
+ protmode CTS wme burst
+....
+
+Der `adhoc`-Parameter zeigt an, dass die Schnittstelle im IBSS-Modus läuft.
+
+Rechner `B` sollte nun in der Lage sein, Rechner `A` zu finden:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev ath0 wlanmode adhoc
+# ifconfig wlan0 up scan
+ SSID/MESH ID BSSID CHAN RATE S:N INT CAPS
+ freebsdap 02:11:95:c3:0d:ac 2 54M -64:-96 100 IS WME
+....
+
+Der Wert `I` (Spalte CAPS) in dieser Ausgabe bestätigt, dass sich Rechner `A` im Ad-hoc-Modus befindet. Nun müssen Sie noch Rechner `B` eine andere IP-Adresse zuweisen:
+
+[source,bash]
+....
+# ifconfig wlan0 inet 192.168.0.2 netmask 255.255.255.0 ssid freebsdap
+# ifconfig wlan0
+ wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether 00:11:95:d5:43:62
+ inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <adhoc>
+ status: running
+ ssid freebsdap channel 2 (2417 Mhz 11g) bssid 02:11:95:c3:0d:ac
+ country US ecm authmode OPEN privacy OFF txpower 21.5 scanvalid 60
+ protmode CTS wme burst
+....
+
+Damit sind die Rechner `A` und `B` bereit und können untereinander Daten austauschen.
+
+[[network-wireless-ap]]
+=== FreeBSD Host Access Points
+
+FreeBSD kann als Access Point (AP) agieren. Dies verhindert, dass man sich einen Hardware AP kaufen oder ein Ad-hoc Netzwerk laufen lassen muss. Dies kann sinnvoll sein, falls der FreeBSD-Computer als Gateway zu einem anderen Netzwerk, wie dem Internet, fungiert.
+
+[[network-wireless-ap-basic]]
+==== Grundeinstellungen
+
+Bevor Sie einen FreeBSD-Computer als AP konfigurieren, muss der Kernel mit der entsprechenden Netzwerkunterstützung für die drahtlose Karte, sowie die Sicherheitsprotokolle konfiguriert werden. Weitere Informationen finden Sie im <<network-wireless-basic>>.
+
+[NOTE]
+====
+Die Verwendung der NDIS Treiber für Windows(R) erlauben zur Zeit keinen AP-Modus. Nur die nativen FreeBSD-Wireless-Treiber unterstützen den AP-Modus.
+====
+
+Nachdem die Netzwerkunterstützung geladen ist, überprüfen Sie, ob das Wireless-Gerät den hostbasierenden Access-Point Modus, der auch als hostap-Modus bekannt ist, unterstützt:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev ath0
+# ifconfig wlan0 list caps
+drivercaps=6f85edc1<STA,FF,TURBOP,IBSS,HOSTAP,AHDEMO,TXPMGT,SHSLOT,SHPREAMBLE,MONITOR,MBSS,WPA1,WPA2,BURST,WME,WDS,BGSCAN,TXFRAG>
+cryptocaps=1f<WEP,TKIP,AES,AES_CCM,TKIPMIC>
+....
+
+Diese Ausgabe zeigt die Eigenschaften der Karte. Das Wort `HOSTAP` bestätigt, dass diese Wireless-Karte als AP agieren kann. Die verschiedenen unterstützten Algorithmen werden ebenfalls angezeigt: WEP, TKIP und AES. Diese Informationen zeigen an, welche Sicherheitsprotokolle auf dem AP nutzbar sind.
+
+Das Wireless-Gerät kann nur während der Erzeugung des Pseudo-Geräts in den hostap-Modus gesetzt werden. Zuvor erstellte Pseudo-Geräte müssen also vorher zerstört werden:
+
+[source,bash]
+....
+# ifconfig wlan0 destroy
+....
+
+Danach muss das Gerät erneut erstellt werden, bevor die restlichen Netzwerkparameter konfiguriert werden können:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev ath0 wlanmode hostap
+# ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap mode 11g channel 1
+....
+
+Benutzen Sie danach erneut man:ifconfig[8], um den Status der [.filename]#wlan0#-Schnittstelle abzufragen:
+
+[source,bash]
+....
+# ifconfig wlan0
+ wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether 00:11:95:c3:0d:ac
+ inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
+ status: running
+ ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac
+ country US ecm authmode OPEN privacy OFF txpower 21.5 scanvalid 60
+ protmode CTS wme burst dtimperiod 1 -dfs
+....
+
+Die `hostap`-Parameter geben die Schnittstelle an, die im hostbasierenden Access Point Modus läuft.
+
+Die Konfiguration der Schnittstelle kann durch Hinzufügen der folgenden Zeilen in die Datei [.filename]#/etc/rc.conf# automatisch während des Bootvorganges erfolgen:
+
+[.programlisting]
+....
+wlans_ath0="wlan0"
+create_args_wlan0="wlanmode hostap"
+ifconfig_wlan0="inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap mode 11g channel 1"
+....
+
+==== Hostbasierender Access Point ohne Authentifizierung oder Verschlüsselung
+
+Obwohl es nicht empfohlen wird, einen AP ohne jegliche Authentifizierung oder Verschlüsselung laufen zu lassen, ist es eine einfache Art zu testen, ob der AP funktioniert. Diese Konfiguration ist auch wichtig für die Fehlersuche bei Client-Problemen.
+
+Nachdem der AP konfiguriert wurde, ist es möglich von einem anderen drahtlosen Computer eine Suche nach dem AP zu starten:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev ath0
+# ifconfig wlan0 up scan
+SSID/MESH ID BSSID CHAN RATE S:N INT CAPS
+freebsdap 00:11:95:c3:0d:ac 1 54M -66:-96 100 ES WME
+....
+
+Der Client-Rechner hat den AP gefunden und kann nun eine Verbindung aufbauen:
+
+[source,bash]
+....
+# ifconfig wlan0 inet 192.168.0.2 netmask 255.255.255.0 ssid freebsdap
+# ifconfig wlan0
+ wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether 00:11:95:d5:43:62
+ inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g
+ status: associated
+ ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac
+ country US ecm authmode OPEN privacy OFF txpower 21.5 bmiss 7
+ scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7
+ roam:rate 5 protmode CTS wme burst
+....
+
+[[network-wireless-ap-wpa]]
+==== WPA2-hostbasierter Access Point
+
+Dieser Abschnitt beschäftigt sich mit der Konfiguration eines FreeBSD Access Point mit dem WPA2-Sicherheitsprotokoll. Weitere Einzelheiten zu WPA und der Konfiguration von Clients mit WPA finden Sie im <<network-wireless-wpa>>.
+
+Der man:hostapd[8]-Dienst wird genutzt, um die Client-Authentifizierung und das Schlüsselmanagement auf dem AP mit aktiviertem WPA2 zu nutzen.
+
+Die folgende Konfiguration wird auf dem FreeBSD-Computer ausgeführt, der als AP agiert. Nachdem der AP korrekt arbeitet, sollte man:hostapd[8] automatisch beim Booten durch folgende Zeile in [.filename]#/etc/rc.conf# aktiviert werden:
+
+[.programlisting]
+....
+hostapd_enable="YES"
+....
+
+Bevor Sie versuchen man:hostapd[8] zu konfigurieren, konfigurieren Sie zunächst die Grundeinstellungen, wie im <<network-wireless-ap-basic>> beschrieben.
+
+===== WPA2-PSK
+
+WPA2-PSK ist für kleine Netzwerke gedacht, in denen die Verwendung eines Authentifizierungs-Backend-Server nicht möglich oder nicht erwünscht ist.
+
+Die Konfiguration wird in [.filename]#/etc/hostapd.conf# durchgeführt:
+
+[.programlisting]
+....
+interface=wlan0 <.>
+debug=1 <.>
+ctrl_interface=/var/run/hostapd <.>
+ctrl_interface_group=wheel <.>
+ssid=freebsdap <.>
+wpa=2 <.>
+wpa_passphrase=freebsdmall <.>
+wpa_key_mgmt=WPA-PSK <.>
+wpa_pairwise=CCMP <.>
+....
+
+<.> Die Wireless-Schnittstelle, die für den Access Point verwendet wird an.
+
+<.> Der debuglevel von man:hostapd[8] während der Ausführung. Ein Wert von `1` ist der kleinste zulässige Wert.
+
+<.> Der Pfadname des Verzeichnisses, der von man:hostapd[8] genutzt wird, um die Domain-Socket-Dateien zu speichern, die für die Kommunikation mit externen Programmen, wie z.B. man:hostapd_cli[8], benutzt werden. In diesem Beispiel wird der Standardwert verwendet.
+
+<.> Die Gruppe die Zugriff auf die Schnittstellendateien hat.
+
+<.> Der Name des drahtlosen Netzwerks (SSID).
+
+<.> Aktiviert WPA und gibt an welches WPA-Authentifizierungprotokoll benötigt wird. Ein Wert von `2` konfiguriert den AP mit WPA2. Setzen Sie den Wert nur auf `1`, wenn Sie das veraltete WPA benötigen.
+
+<.> Das ASCII-Passwort für die WPA-Authentifizierung.
+
+<.> Das verwendete Schlüsselmanagement-Protokoll. Dieses Beispiel nutzt WPA-PSK.
+
+<.> Die zulässigen Verschlüsselungsverfahren des Access-Points. In diesem Beispiel wird nur CCMP (AES) akzeptiert. CCMP ist eine Alternative zu TKIP und sollte wenn möglich eingesetzt werden. TKIP sollte nur da eingesetzt werden, wo kein CCMP möglich ist.
+
+Als nächstes wird hostapd gestartet:
+
+[source,bash]
+....
+# service hostapd forcestart
+....
+
+[source,bash]
+....
+# ifconfig wlan0
+wlan0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether 04:f0:21:16:8e:10
+ inet6 fe80::6f0:21ff:fe16:8e10%wlan0 prefixlen 64 scopeid 0x9
+ nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
+ media: IEEE 802.11 Wireless Ethernet autoselect mode 11na <hostap>
+ status: running
+ ssid No5ignal channel 36 (5180 MHz 11a ht/40+) bssid 04:f0:21:16:8e:10
+ country US ecm authmode WPA2/802.11i privacy MIXED deftxkey 2
+ AES-CCM 2:128-bit AES-CCM 3:128-bit txpower 17 mcastrate 6 mgmtrate 6
+ scanvalid 60 ampdulimit 64k ampdudensity 8 shortgi wme burst
+ dtimperiod 1 -dfs
+ groups: wlan
+....
+
+Sobald der AP läuft, können sich die Clients mit ihm verbinden. Weitere Informationen finden Sie im <<network-wireless-wpa>>. Es ist möglich zu sehen, welche Stationen mit dem AP verbunden sind. Geben Sie dazu `ifconfig _wlan0_ list sta` ein.
+
+==== WEP-hostbasierter Access Point
+
+Es ist nicht empfehlenswert, einen AP mit WEP zu konfigurieren, da es keine Authentifikationsmechanismen gibt und WEP leicht zu knacken ist. Einige ältere drahtlose Karten unterstützen nur WEP als Sicherheitsprotokoll. Diese Karten können nur mit einem AP ohne Authentifikation oder Verschlüsselung genutzt werden.
+
+Das Wireless-Gerät kann nun in den hostap-Modus versetzt werden und mit der korrekten SSID und IP-Adresse konfiguriert werden:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev ath0 wlanmode hostap
+# ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 \
+ ssid freebsdap wepmode on weptxkey 3 wepkey 3:0x3456789012 mode 11g
+....
+
+* Der `weptxkey` zeigt an, welcher WEP-Schlüssel bei der Übertragung benutzt wird. In diesem Beispiel wird der dritte Schlüssel benutzt, da die Nummerierung bei `1` beginnt. Dieser Parameter muss angegeben werden, damit die Daten verschlüsselt werden.
+* Der `wepkey` gibt den gewählten WEP-Schlüssel an. Er sollte im folgenden Format _index:key_ vorliegen. Wenn kein Index vorhanden ist, wird der Schlüssel `1` benutzt. Ansonsten muss der Index manuell festgelegt werden.
+
+Benutzen Sie man:ifconfig[8] um den Status der [.filename]#wlan0#-Schnittstelle erneut anzuzeigen:
+
+[source,bash]
+....
+# ifconfig wlan0
+ wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether 00:11:95:c3:0d:ac
+ inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
+ media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
+ status: running
+ ssid freebsdap channel 4 (2427 Mhz 11g) bssid 00:11:95:c3:0d:ac
+ country US ecm authmode OPEN privacy ON deftxkey 3 wepkey 3:40-bit
+ txpower 21.5 scanvalid 60 protmode CTS wme burst dtimperiod 1 -dfs
+....
+
+Es ist möglich, von einem anderen drahtlosen Computer eine Suche nach dem AP zu starten:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev ath0
+# ifconfig wlan0 up scan
+SSID BSSID CHAN RATE S:N INT CAPS
+freebsdap 00:11:95:c3:0d:ac 1 54M 22:1 100 EPS
+....
+
+Der Client-Rechner hat den AP gefunden und kann nun eine Verbindung aufbauen. Weitere Informationen finden Sie im <<network-wireless-wep>>.
+
+=== Benutzung von drahtgebundenen und drahtlosen Verbindungen
+
+Eine Verbindung per Kabel bietet eine bessere Leistung und eine höhere Zuverlässigkeit, während die Wireless-Verbindung eine höhere Flexibilität und Mobilität bietet. Benutzer von Laptops wollen normalerweise beides nutzen und zwischen beiden Verbindungen hin und her schalten.
+
+Unter FreeBSD ist es möglich zwei oder mehr Netzwerkschnittstellen in einem "failover"-Mode zu kombinieren. Diese Konfiguration nutzt die beste verfügbare Verbindung aus einer Gruppe von Netzwerkverbindungen. Sobald sich der Linkstatus ändert, wechselt das Betriebssystem automatisch auf eine andere Verbindung.
+
+Link-Aggregation und Failover werden im <<network-aggregation>> behandelt. Ein Beispiel für die Verwendung von kabelgebundenen und drahtlosen Verbindungen gibt es im <<networking-lagg-wired-and-wireless>>.
+
+=== Problembehandlung
+
+Dieser Abschnitt beschreibt eine Reihe von Maßnahmen zur Behebung von alltäglichen Problemen mit Drahtlosnetzwerken.
+
+* Wird der Access Point bei der Suche nicht gefunden, überprüfen Sie, dass die Konfiguration des drahtlosen Geräts nicht die Anzahl der Kanäle beschränkt.
+* Wenn sich das Gerät nicht mit dem Access Point verbinden kann, überprüfen Sie, ob die Konfiguration der Station auch der des Access Points entspricht. Dazu gehören auch die Authentifzierungsmethode und die Sicherheitsprotokolle. Halten Sie die Konfiguration so einfach wie möglich. Wenn Sie ein Sicherheitsprotokoll wie WPA oder WEP verwenden, können Sie testweise den Access Point auf _offene Authentifizierung_ und _keine Sicherheit_ einstellen.
++
+Für die Fehlersuche steht man:wpa_supplicant[8] zur Verfügung. Starten Sie das Programm manuell mit der Option `-dd` und durchsuchen Sie anschließend die Systemprotokolle nach eventuellen Fehlermeldungen.
+* Sobald sich das Gerät mit dem Access Point verbinden kann, prüfen Sie die Netzwerkkonfiguration mit einfachen Werkzeugen wie man:ping[8].
+* Zusätzlich gibt es auch zahlreiche Low-Level-Debugging-Werkzeuge. Die Ausgabe von Debugging-Informationen des 802.11 Protocol Support Layers lassen sich mit dem Programm man:wlandebug[8] aktivieren. Um beispielsweise während der Suche nach Access Points und des Aufbaus von 802.11-Verbindungen (Handshake) auftretende Systemmeldungen auf die Konsole auszugeben, verwenden Sie den folgenden Befehl:
++
+[source,bash]
+....
+# wlandebug -i wlan0 +scan+auth+debug+assoc
+ net.wlan.0.debug: 0 => 0xc80000<assoc,auth,scan>
+....
++
+Der 802.11-Layer liefert umfangreiche Statistiken, die mit dem Werkzeug `wlanstats`, das sich in [.filename]#/usr/src/tools/tools/net80211# befindet, abgerufen werden können. Diese Statistiken sollten alle Fehler identifizieren, die im 802.11-Layer auftreten. Beachten Sie aber, dass einige Fehler bereits im darunterliegenden Gerätetreiber auftreten und daher in diesen Statistiken nicht enthalten sind. Wie Sie Probleme des Gerätetreibers identifizieren, entnehmen Sie bitte der Dokumentation des Gerätetreibers.
+
+Wenn die oben genannten Informationen nicht helfen das Problem zu klären, erstellen Sie einen Problembericht, der die Ausgabe der weiter oben genannten Werkzeuge beinhaltet.
+
+[[network-usb-tethering]]
+== USB Tethering
+
+Viele Mobiltelefone bieten die Möglichkeit, ihre Datenverbindung über USB (oft "Tethering" genannt) zu teilen. Diese Funktion verwendet entweder das RNDIS-, CDC- oder ein Apple(R) iPhone(R)/iPad(R)-Protokoll.
+
+* Android(TM)-Geräte benutzen in der Regel den man:urndis[4]-Treiber.
+* Apple(R)-Geräte benutzen den man:ipheth[4]-Treiber.
+* Ältere Geräte benutzen oft den man:cdce[4]-Treiber.
+
+Bevor Sie ein Gerät anschließen, laden Sie den entsprechenden Treiber in den Kernel:
+
+[source,bash]
+....
+# kldload if_urndis
+# kldload if_cdce
+# kldload if_ipheth
+....
+
+Sobald das Gerät angeschlossen ist, steht es unter ``ue``__0__ wie ein normales Netzwerkgerät zur Verfügung. Stellen Sie sicher, dass die Option "USB Tethering" auf dem Gerät aktiviert ist.
+
+Um diese Änderungen dauerhaft zu speichern und den Treiber beim Booten als Modul zu laden, müssen die entsprechenden Zeilen in [.filename]#/boot/loader.conf# konfiguriert werden:
+
+[.programlisting]
+....
+if_urndis_load="YES"
+if_cdce_load="YES"
+if_ipteth_load="YES"
+....
+
+[[network-bluetooth]]
+== Bluetooth
+
+Bluetooth ermöglicht die Bildung von persönlichen Netzwerken über drahtlose Verbindungen bei einer maximalen Reichweite von 10 Metern und operiert im unlizensierten 2,4-GHz-Band. Solche Netzwerke werden normalerweise spontan gebildet, wenn sich mobile Geräte, wie Mobiltelefone, Handhelds oder Notebooks miteinander verbinden. Im Gegensatz zu Wireless LAN ermöglicht Bluetooth auch höherwertige Dienste, wie FTP-ähnliche Dateiserver, Filepushing, Sprachübertragung, Emulation von seriellen Verbindungen und mehr.
+
+Dieses Kapitel beschreibt die Verwendung von USB-Bluetooth-Adaptern in FreeBSD. Weiterhin werden verschiedene Bluetooth-Protokolle und Programme vorgestellt.
+
+=== Die Bluetooth-Unterstützung aktivieren
+
+Der Bluetooth-Stack von FreeBSD verwendet das man:netgraph[4]-Framework. Viele Bluetooth-USB-Adapter werden durch den man:ng_ubt[4]-Treiber unterstützt. Auf dem Chip BCM2033 von Broadcom basierende Bluetooth-Geräte werden von den Treibern man:ubtbcmfw[4] sowie man:ng_ubt[4] unterstützt. Die Bluetooth-PC-Card 3CRWB60-A von 3Com verwendet den man:ng_bt3c[4]-Treiber. Serielle sowie auf UART basierende Bluetooth-Geräte werden von man:sio[4], man:ng_h4[4] sowie man:hcseriald[8] unterstützt.
+
+Bevor ein Gerät angeschlossen wird, muss der entsprechende Treiber in den Kernel geladen werden. Hier verwendet das Gerät den man:ng_ubt[4]-Treiber:
+
+[source,bash]
+....
+# kldload ng_ubt
+....
+
+Ist das Bluetooth-Gerät beim Systemstart angeschlossen, kann das entsprechende Modul bei Booten geladen werden, indem der entsprechende Treiber in [.filename]#/boot/loader.conf# hinzugefügt wird:
+
+[.programlisting]
+....
+ng_ubt_load="YES"
+....
+
+Sobald der Treiber geladen ist, schließen Sie den USB-Adapter an. Eine Meldung ähnlich der folgenden wird auf der Konsole und in [.filename]#/var/log/messages# erscheinen:
+
+[source,bash]
+....
+ubt0: vendor 0x0a12 product 0x0001, rev 1.10/5.25, addr 2
+ubt0: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk-out=0x2
+ubt0: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc-out=0x3,
+ wMaxPacketSize=49, nframes=6, buffer size=294
+....
+
+Verwenden Sie das Startskript zum Starten und Beenden des Bluetooth-Stacks. Es ist empfehlenswert, den Bluetooth-Stack zu beenden, bevor Sie den Adapter entfernen. Das Starten des Bluetooth-Stacks kann das Starten von man:hcsecd[8] erfordern. Wenn Sie den Bluetooth-Stack starten, erhalten Sie eine Meldung ähnlich der folgenden:
+
+[source,bash]
+....
+# service bluetooth start ubt0
+BD_ADDR: 00:02:72:00:d4:1a
+Features: 0xff 0xff 0xf 00 00 00 00 00
+<3-Slot> <5-Slot> <Encryption> <Slot offset>
+<Timing accuracy> <Switch> <Hold mode> <Sniff mode>
+<Park mode> <RSSI> <Channel quality> <SCO link>
+<HV2 packets> <HV3 packets> <u-law log> <A-law log> <CVSD>
+<Paging scheme> <Power control> <Transparent SCO data>
+Max. ACL packet size: 192 bytes
+Number of ACL packets: 8
+Max. SCO packet size: 64 bytes
+Number of SCO packets: 8
+....
+
+=== Suche nach anderen Bluetooth-Geräten
+
+Das Host Controller Interface (HCI) bietet eine einheitliche Methode für den Zugriff auf Bluetooth-Basisband-Funktionen. In FreeBSD wird ein netgraph HCI-Knoten für jedes Bluetooth-Gerät erstellt. Weitere Einzelheiten finden Sie in man:ng_hci[4].
+
+Eine der wichtigsten Aufgaben ist das Auffinden von sich in Reichweite befindenden Bluetooth-Geräten. Diese Funktion wird als _inquiry_ bezeichnet. Inquiry sowie andere mit HCI in Verbindung stehende Funktionen werden von man:hccontrol[8] zur Verfügung gestellt. Das folgende Beispiel zeigt, wie man herausfindet, welche Bluetooth-Geräte sich in Reichweite befinden. Eine solche Abfrage dauert nur wenige Sekunden. Beachten Sie, dass ein Gerät nur dann antwortet, wenn es sich im Modus _discoverable_ befindet.
+
+[source,bash]
+....
+% hccontrol -n ubt0hci inquiry
+Inquiry result, num_responses=1
+Inquiry result #0
+ BD_ADDR: 00:80:37:29:19:a4
+ Page Scan Rep. Mode: 0x1
+ Page Scan Period Mode: 00
+ Page Scan Mode: 00
+ Class: 52:02:04
+ Clock offset: 0x78ef
+Inquiry complete. Status: No error [00]
+....
+
+`BD_ADDR` stellt, ähnlich der MAC-Adresse einer Netzwerkkarte, die eindeutige Adresse eines Bluetooth-Gerätes dar. Diese Adresse ist für die Kommunikation mit dem Gerät nötig. Es ist aber auch möglich, `BD_ADDR` einen Klartextnamen zuzuweisen. [.filename]#/etc/bluetooth/hosts# enthält Informationen über die bekannten Bluetooth-Rechner. Das folgende Beispiel zeigt, wie man den Klartextnamen eines entfernten Geräts in Erfahrung bringen kann:
+
+[source,bash]
+....
+% hccontrol -n ubt0hci remote_name_request 00:80:37:29:19:a4
+BD_ADDR: 00:80:37:29:19:a4
+Name: Pav's T39
+....
+
+Wenn Sie ein entferntes Bluetooth-Gerät abfragen, wird dieses den Rechner unter dem Namen "your.host.name (ubt0)" finden. Dieser Name kann aber jederzeit geändert werden.
+
+Entfernten Geräten können Aliase in [.filename]#/etc/bluetooth/hosts# zugewiesen werden. Weitere Informationen zu [.filename]#/etc/bluetooth/hosts# finden Sie in man:bluetooth.hosts[5].
+
+Bluetooth ermöglicht Punkt-zu-Punkt-Verbindungen an denen nur zwei Bluetooth-Geräte beteiligt sind, aber auch Punkt-zu-Multipunkt-Verbindungen, bei denen eine Verbindung von mehreren Bluetooth-Geräten gemeinsam genutzt wird. Das folgende Beispiel zeigt, wie man eine Verbindung zu einem entferntem Gerät aufbauen kann:
+
+[source,bash]
+....
+% hccontrol -n ubt0hci create_connection BT_ADDR
+....
+
+`create_connection` aktzeptiert `BT_ADDR` oder auch einen Alias aus [.filename]#/etc/bluetooth/hosts#.
+
+Das folgende Beispiel zeigt, wie man die aktiven Basisbandverbindungen des lokalen Gerätes anzeigen kann:
+
+[source,bash]
+....
+% hccontrol -n ubt0hci read_connection_list
+Remote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State
+00:80:37:29:19:a4 41 ACL 0 MAST NONE 0 0 OPEN
+....
+
+Ein _connection handle_ ist für die Beendigung einer Basisbandverbindung nützlich. Im Normalfall werden inaktive Verbindungen aber automatisch vom Bluetooth-Stack getrennt.
+
+[source,bash]
+....
+# hccontrol -n ubt0hci disconnect 41
+Connection handle: 41
+Reason: Connection terminated by local host [0x16]
+....
+
+Rufen Sie `hccontrol help` auf, wenn Sie eine komplette Liste aller verfügbaren HCI-Befehle benötigen. Die meisten dieser Befehle müssen nicht als `root` ausgeführt werden.
+
+=== Erstmaliger Verbindungsaufbau zwischen zwei Bluetooth-Geräten (Pairing)
+
+In der Voreinstellung nutzt Bluetooth keine Authentifizierung, daher kann sich jedes Bluetoothgerät mit jedem anderen Gerät verbinden. Ein Bluetoothgerät, wie beispielsweise ein Mobiltelefon, kann jedoch für einen bestimmten Dienst, etwa eine Einwählverbindung, eine Authentifizierung anfordern. Bluetooth verwendet zu diesem Zweck _PIN-Codes_. Ein PIN-Code ist ein maximal 16 Zeichen langer ASCII-String. Damit eine Verbindung zustande kommt, muss auf beiden Geräten der gleiche PIN-Code verwendet werden. Nachdem der Code eingegeben wurde, erzeugen beide Geräte einen _link key_, der auf den Geräten gespeichert wird. Beim nächsten Verbindungsaufbau wird der zuvor erzeugte Link Key verwendet. Diesen Vorgang bezeichnet man als Pairing. Geht der Link Key auf einem Gerät verloren, muss das Pairing wiederholt werden.
+
+Der man:hcsecd[8]-Daemon verarbeitet Bluetooth-Authentifzierungsanforderungen und wird über die Datei [.filename]#/etc/bluetooth/hcsecd.conf# konfiguriert. Der folgende Ausschnitt dieser Datei zeigt die Konfiguration für ein Mobiltelefon, das den PIN-Code "1234" verwendet:
+
+[.programlisting]
+....
+device {
+ bdaddr 00:80:37:29:19:a4;
+ name "Pav's T39";
+ key nokey;
+ pin "1234";
+ }
+....
+
+Von der Länge abgesehen, unterliegen PIN-Codes keinen Einschränkungen. Einige Geräte, beispielsweise Bluetooth-Headsets, haben einen festen PIN-Code eingebaut. Die Option `-d` sorgt dafür, dass der man:hcsecd[8]-Daemon im Vordergrund läuft. Dadurch kann der Ablauf einfach verfolgt werden. Stellen Sie das entfernte Gerät auf receive pairing und initiieren Sie die Bluetoothverbindung auf dem entfernten Gerät. Sie erhalten die Meldung, dass Pairing akzeptiert wurde und der PIN-Code benötigt wird. Geben Sie den gleichen PIN-Code ein, den Sie in [.filename]#hcsecd.conf# festgelegt haben. Der Computer und das entfernte Gerät sind nun miteinander verbunden. Alternativ können Sie das Pairing auch auf dem entfernten Gerät initiieren.
+
+man:hcsecd[8] kann durch das Einfügen der folgenden Zeile in [.filename]#/etc/rc.conf# beim Systemstart automatisch aktiviert werden:
+
+[.programlisting]
+....
+hcsecd_enable="YES"
+....
+
+Es folgt nun eine beispielhafte Ausgabe des man:hcsecd[8]-Daemons:
+
+[.programlisting]
+....
+hcsecd[16484]: Got Link_Key_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4
+hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', link key doesn't exist
+hcsecd[16484]: Sending Link_Key_Negative_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4
+hcsecd[16484]: Got PIN_Code_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4
+hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', PIN code exists
+hcsecd[16484]: Sending PIN_Code_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4
+....
+
+=== Einwahlverbindungen und Netzwerkverbindungen mit PPP-Profilen einrichten
+
+Ein Dial-Up Networking-Profil (DUN) kann dazu benutzt werden, ein Mobiltelefon als drahtloses Modem zu nutzen, um sich über einen Einwahlprovider mit dem Internet zu verbinden. Es kann auch dazu genutzt werden, einen Computer so zu konfigurieren, dass dieser Datenabfragen empfängt.
+
+Der Zugriff auf ein Netzwerk über ein PPP-Profil kann einen Zugriff auf das LAN für ein oder mehrere Bluetooth-Geräte bieten. Eine PC-zu-PC-Verbindung unter Verwendung einer PPP-Verbindung über eine serielle Verbindung ist ebenfalls möglich.
+
+Diese Profile werden unter FreeBSD durch man:ppp[8] sowie man:rfcomm_pppd[8] implementiert - einem Wrapper, der Bluetooth-Verbindungen unter PPP nutzbar macht. Bevor ein Profil verwendet werden kann, muss ein neuer PPP-Abschnitt in [.filename]#/etc/ppp/ppp.conf# erzeugt werden. Beispielkonfigurationen zu diesem Thema finden Sie in man:rfcomm_pppd[8].
+
+Dieses Beispiel verwendet man:rfcomm_pppd[8], um eine Verbindung zu einem entfernten Gerät mit der `BD_ADDR 00:80:37:29:19:a4` auf dem RFCOMM-Kanal `DUN` aufzubauen:
+
+[source,bash]
+....
+# rfcomm_pppd -a 00:80:37:29:19:a4 -c -C dun -l rfcomm-dialup
+....
+
+Die aktuelle Kanalnummer des entfernten Geräts erhalten Sie über das SDP-Protokoll. Es ist auch möglich, manuell einen RFCOMM-Kanal festzulegen. In diesem Fall führt man:rfcomm_pppd[8] keine SDP-Abfrage durch. Verwenden Sie man:sdpcontrol[8], um die RFCOMM-Kanäle des entfernten Geräts herauszufinden.
+
+Der man:sdpd[8]-Server muss laufen, damit ein Netzzugriff mit dem PPPLAN-Profil möglich ist. Außerdem muss für den LAN-Client ein neuer Eintrag in [.filename]#/etc/ppp/ppp.conf# erzeugt werden. Beispielkonfigurationen zu diesem Thema finden Sie in man:rfcomm_pppd[8]. Danach starten Sie den RFCOMMPPP-Server über eine gültige RFCOMM-Kanalnummer. Der RFCOMMPPP-Server bindet dadurch den Bluetooth-LAN-Dienst an den lokalen SDP-Daemon. Das folgende Beispiel zeigt, wie man den RFCOMMPPP-Server startet.
+
+[source,bash]
+....
+# rfcomm_pppd -s -C 7 -l rfcomm-server
+....
+
+=== Bluetooth-Protokolle
+
+Dieser Abschnitt gibt einen Überblick über die verschiedenen Bluetooth-Protokolle, ihre Funktionen sowie weitere Programme.
+
+==== Das Logical Link Control and Adaptation Protocol (L2CAP)
+
+Das Logical Link Control and Adaptation Protocol (L2CAP) bietet höherwertigen Protokollen verbindungsorientierte und verbindungslose Datendienste an. L2CAP erlaubt höherwertigen Protokollen und Programmen den Versand und Empfang von L2CAP-Datenpaketen mit einer Länge von bis zu 64 Kilobytes.
+
+L2CAP arbeitet _kanal_basiert. Ein Kanal ist eine logische Verbindung innerhalb einer Basisbandverbindung. Jeder Kanal ist dabei an ein einziges Protokoll gebunden. Mehrere Geräte können an das gleiche Protokoll gebunden sein, es ist aber nicht möglich, einen Kanal an mehrere Protokolle zu binden. Jedes über einen Kanal ankommende L2CAP-Paket wird an das entsprechende höherwertige Protokoll weitergeleitet. Mehrere Kanäle können sich die gleiche Basisbandverbindung teilen.
+
+Unter FreeBSD wird eine netgraph-Gerätedatei vom Typ _l2cap_ für jedes einzelne Bluetooth-Gerät erzeugt. Diese Gerätedatei ist normalerweise mit der Bluetooth-HCI-Gerätedatei (downstream) sowie der Bluetooth-Socket-Gerätedatei (upstream) verbunden. Der Standardname für die L2CAP-Gerätedatei lautet "devicel2cap". Weitere Details finden Sie in man:ng_l2cap[4].
+
+Ein nützlicher Befehl zum Anpingen von anderen Geräten ist man:l2ping[8]. Einige Bluetooth-Geräte senden allerdings nicht alle erhaltenen Daten zurück. Die Ausgabe `0 bytes` im folgenden Beispiel ist also kein Fehler:
+
+[source,bash]
+....
+# l2ping -a 00:80:37:29:19:a4
+0 bytes from 0:80:37:29:19:a4 seq_no=0 time=48.633 ms result=0
+0 bytes from 0:80:37:29:19:a4 seq_no=1 time=37.551 ms result=0
+0 bytes from 0:80:37:29:19:a4 seq_no=2 time=28.324 ms result=0
+0 bytes from 0:80:37:29:19:a4 seq_no=3 time=46.150 ms result=0
+....
+
+Das Programm man:l2control[8] liefert Informationen über L2CAP-Dateien. Das folgende Beispiel zeigt, wie man die Liste der logischen Verbindungen (Kanäle) sowie die Liste der Basisbandverbindungen abfragen kann:
+
+[source,bash]
+....
+% l2control -a 00:02:72:00:d4:1a read_channel_list
+L2CAP channels:
+Remote BD_ADDR SCID/ DCID PSM IMTU/ OMTU State
+00:07:e0:00:0b:ca 66/ 64 3 132/ 672 OPEN
+% l2control -a 00:02:72:00:d4:1a read_connection_list
+L2CAP connections:
+Remote BD_ADDR Handle Flags Pending State
+00:07:e0:00:0b:ca 41 O 0 OPEN
+....
+
+man:btsockstat[1] ist ein weiteres Diagnoseprogramm. Es funktioniert ähnlich wie man:netstat[1], arbeitet aber mit Bluetooth-Datenstrukturen. Das folgende Beispiel zeigt die gleiche Liste der logischen Verbindungen wie man:l2control[8] im vorherigen Beispiel.
+
+[source,bash]
+....
+% btsockstat
+Active L2CAP sockets
+PCB Recv-Q Send-Q Local address/PSM Foreign address CID State
+c2afe900 0 0 00:02:72:00:d4:1a/3 00:07:e0:00:0b:ca 66 OPEN
+Active RFCOMM sessions
+L2PCB PCB Flag MTU Out-Q DLCs State
+c2afe900 c2b53380 1 127 0 Yes OPEN
+Active RFCOMM sockets
+PCB Recv-Q Send-Q Local address Foreign address Chan DLCI State
+c2e8bc80 0 250 00:02:72:00:d4:1a 00:07:e0:00:0b:ca 3 6 OPEN
+....
+
+==== Radio Frequency Communication (RFCOMM)
+
+Das RFCOMM-Protokoll emuliert serielle Verbindungen über das L2CAP-Protokoll. Bei RFCOMM handelt es sich um ein einfaches Transportprotokoll, das um Funktionen zur Emulation der 9poligen Schaltkreise von mit RS-232 (EIATIA-232-E) kompatiblen seriellen Ports ergänzt wurde. Es erlaubt bis zu 60 simultane Verbindungen (RFCOMM-Kanäle) zwischen zwei Bluetooth-Geräten.
+
+Eine RFCOMM-Kommunikation besteht aus zwei Anwendungen (den Kommunikationsendpunkten), die über das Kommunikationssegment miteinander verbunden sind. RFCOMM unterstützt Anwendungen, die auf serielle Ports angewiesen sind. Das Kommunikationssegment entspricht der direkten Bluetooth-Verbindung zwischen den beiden Geräten.
+
+RFCOMM kümmert sich um die direkte Verbindung von zwei Geräten, oder um die Verbindung zwischen einem Gerät und einem Modem über eine Netzwerkverbindung. RFCOMM unterstützt auch andere Konfigurationen. Ein Beispiel dafür sind Module, die drahtlose Bluetooth-Geräte mit einer verkabelten Schnittstelle verbinden können.
+
+Unter FreeBSD ist das RFCOMM-Protokoll im Bluetooth Socket-Layer implementiert.
+
+==== Das Service Discovery Protocol (SDP)
+
+Das Service Discovery Protocol (SDP) erlaubt es Clientanwendungen, von Serveranwendungen angebotene Dienste sowie deren Eigenschaften abzufragen. Zu diesen Eigenschaften gehören die Art oder die Klasse der angebotenen Dienste sowie der Mechanismus oder das Protokoll, die zur Nutzung des Dienstes notwendig sind.
+
+SDP ermöglicht Verbindungen zwischen einem SDP-Server und einem SDP-Client. Der Server enthält eine Liste mit den Eigenschaften der vom Server angebotenen Dienste. Jeder Eintrag beschreibt jeweils einen einzigen Serverdienst. Ein Client kann diese Informationen durch eine SDP-Anforderung vom SDP-Server beziehen. Wenn der Client oder eine Anwendung des Clients einen Dienst nutzen will, muss eine separate Verbindung mit dem Dienstanbieter aufgebaut werden. SDP bietet einen Mechanismus zum Auffinden von Diensten und deren Eigenschaften an, es bietet aber keine Mechanismen zur Verwendung dieser Dienste.
+
+Normalerweise sucht ein SDP-Client nur nach Diensten, die bestimmte geforderte Eigenschaften erfüllen. Es ist aber auch möglich, anhand der Dienstbeschreibungen eine allgemeine Suche nach den von einem SDP-Server angebotenen Diensten durchzuführen. Diesen Vorgang bezeichnet man als Browsing.
+
+Der Bluetooth-SDP-Server man:sdpd[8] und der Kommandozeilenclient man:sdpcontrol[8] sind bereits in der Standardinstallation von FreeBSD enthalten. Das folgende Beispiel zeigt, wie eine SDP-Abfrage durchgeführt wird:
+
+[source,bash]
+....
+% sdpcontrol -a 00:01:03:fc:6e:ec browse
+Record Handle: 00000000
+Service Class ID List:
+ Service Discovery Server (0x1000)
+Protocol Descriptor List:
+ L2CAP (0x0100)
+ Protocol specific parameter #1: u/int/uuid16 1
+ Protocol specific parameter #2: u/int/uuid16 1
+
+Record Handle: 0x00000001
+Service Class ID List:
+ Browse Group Descriptor (0x1001)
+
+Record Handle: 0x00000002
+Service Class ID List:
+ LAN Access Using PPP (0x1102)
+Protocol Descriptor List:
+ L2CAP (0x0100)
+ RFCOMM (0x0003)
+ Protocol specific parameter #1: u/int8/bool 1
+Bluetooth Profile Descriptor List:
+ LAN Access Using PPP (0x1102) ver. 1.0
+....
+
+Beachten Sie, dass jeder Dienst eine Liste seiner Eigenschaften, wie etwa den RFCOMM-Kanal, zurückgibt. Je nachdem, welche Dienste der Benutzer benötigt, sollten einige dieser Eigenschaften notiert werden. Einige Bluetooth-Implementationen unterstützen kein Service Browsing und geben daher eine leere Liste zurück. Ist dies der Fall, ist es dennoch möglich, nach einem bestimmten Dienst zu suchen. Das folgende Beispiel demonstriert die Suche nach dem OBEX Object Push (OPUSH) Dienst:
+
+[source,bash]
+....
+% sdpcontrol -a 00:01:03:fc:6e:ec search OPUSH
+....
+
+Unter FreeBSD ist es die Aufgabe des man:sdpd[8]-Servers, Bluetooth-Clients verschiedene Dienste anzubieten. Sie können diesen Server durch das Einfügen der folgenden Zeile in [.filename]#/etc/rc.conf# aktivieren:
+
+[.programlisting]
+....
+sdpd_enable="YES"
+....
+
+Nun kann der man:sdpd[8]-Daemon durch folgende Eingabe gestartet werden:
+
+[source,bash]
+....
+# service sdpd start
+....
+
+Der lokale Server, der den entfernten Clients Bluetooth-Dienste anbieten soll, bindet diese Dienste an den lokalen SDP-Daemon. Ein Beispiel für eine solche Anwendung ist man:rfcomm_pppd[8]. Einmal gestartet, wird der Bluetooth-LAN-Dienst an den lokalen SDP-Daemon gebunden.
+
+Die Liste der vorhandenen Dienste, die am lokalen SDP-Server registriert sind, lässt sich durch eine SDP-Abfrage über einen lokalen Kontrollkanal abfragen:
+
+[source,bash]
+....
+# sdpcontrol -l browse
+....
+
+==== OBEX Object-Push (OPUSH)
+
+OBEX ist ein häufig verwendetes Protokoll für den Dateitransfer zwischen Mobilgeräten. Sein Hauptzweck ist die Kommunikation über die Infrarotschnittstelle. Es dient daher zum Datentransfer zwischen Notebooks oder PDAs sowie zum Austausch von Visitenkarten oder Kalendereinträgen zwischen Mobiltelefonen und anderen Geräten mit PIM-Funktionen.
+
+Server und Client von OBEX werden durch obexapp bereitgestellt, das als Paket oder Port package:comms/obexapp[] installiert werden kann.
+
+Mit dem OBEX-Client werden Objekte zum OBEX-Server geschickt oder angefordert. Ein Objekt kann etwa eine Visitenkarte oder ein Termin sein. Der OBEX-Client fordert über SDP die Nummer des RFCOMM-Kanals vom entfernten Gerät an. Dies kann auch durch die Verwendung des Servicenamens anstelle der RFCOMM-Kanalnummer erfolgen. Folgende Dienste werden unterstützt: `IrMC`, `FTRN` und `OPUSH`. Es ist möglich, den RFCOMM-Kanal als Nummer anzugeben. Es folgt ein Beispiel für eine OBEX-Sitzung, bei der ein Informationsobjekt vom Mobiltelefon angefordert und ein neues Objekt (hier eine Visitenkarte) an das Telefonbuch des Mobiltelefons geschickt wird:
+
+[source,bash]
+....
+% obexapp -a 00:80:37:29:19:a4 -C IrMC
+obex> get telecom/devinfo.txt
+Success, response: OK, Success (0x20)
+obex> put new.vcf
+Success, response: OK, Success (0x20)
+obex> di
+Success, response: OK, Success (0x20)
+....
+
+Um OBEX-Push-Dienste anbieten zu können, muss der sdpd-Server gestartet sein. Ein Wurzelverzeichnis, in dem alle ankommenden Objekte gespeichert werden, muss zusätzlich angelegt werden. In der Voreinstellung ist dies [.filename]#/var/spool/obex#. Starten Sie den OBEX-Server mit einer gültigen Kanalnummer. Der OBEX-Server registriert nun den OBEX-Push-Dienst mit dem lokalen SDP-Daemon. Das folgende Beispiel zeigt, wie der OBEX-Server gestartet wird:
+
+[source,bash]
+....
+# obexapp -s -C 10
+....
+
+==== Das Serial-Port Profil (SPP)
+
+Das Serial Port Profile (SSP) ermöglicht es Bluetooth-Geräten eine serielle Kabelverbindung zu emulieren. Anwendungen sind dadurch in der Lage, über eine virtuelle serielle Verbindung Bluetooth als Ersatz für eine Kabelverbindung zu nutzen.
+
+man:rfcomm_sppd[1] implementiert unter FreeBSD SSP und ein Pseudo-tty, das als virtuelle serielle Verbindung verwendet wird. Das folgende Beispiel zeigt, wie man eine Verbindung mit einem entfernten Serial-Port-Dienst herstellt. Ein RFCOMM-Kanal muss dabei nicht angegeben werden, da man:rfcomm_sppd[1] den Kanal über SDP abfragen kann. Um dies zu umgehen, geben Sie einen RFCOMM-Kanal auf der Kommandozeile an.
+
+[source,bash]
+....
+# rfcomm_sppd -a 00:07:E0:00:0B:CA -t
+rfcomm_sppd[94692]: Starting on /dev/pts/6...
+/dev/pts/6
+....
+
+Sobald die Verbindung hergestellt ist, kann pseudo-tty als serieller Port verwenden werden.
+
+[source,bash]
+....
+# cu -l /dev/pts/6
+....
+
+Das pseudo-tty wird auf der Standardausgabe ausgegeben und kann von Wrapper-Skripten gelesen werden:
+
+[.programlisting]
+....
+PTS=`rfcomm_sppd -a 00:07:E0:00:0B:CA -t`
+cu -l $PTS
+....
+
+=== Problembehandlung
+
+Wenn FreeBSD eine neue Verbindung akzeptiert, versucht es, die Rolle zu tauschen, um zum Master zu werden. Einige ältere Geräte, die dies nicht unterstützen, können keine Verbindung aufbauen. Da der Rollentausch ausgeführt wird sobald eine neue Verbindung aufgebaut wird, ist es nicht möglich, das entfernte Gerät zu fragen ob es den Rollentausch unterstützt. Es gibt jedoch eine HCI-Option, die dieses Verhalten deaktiviert:
+
+[source,bash]
+....
+# hccontrol -n ubt0hci write_node_role_switch 0
+....
+
+Verwenden Sie hcidump, das als Paket Port package:comms/hcidump[] installiert werden kann, um Bluetooth-Pakete anzuzeigen. Dieses Programm hat Ähnlichkeiten mit man:tcpdump[1] und kann zur Anzeige der Bluetooth-Pakete in einem Terminal, oder zur Speicherung von Paketen in einer Datei (Dump) verwendet werden.
+
+[[network-bridging]]
+== LAN-Kopplung mit einer Bridge
+
+Manchmal ist es nützlich, ein Netzwerk, wie ein Ethernetsegment, in separate Netzwerke aufzuteilen, ohne gleich IP-Subnetze zu erzeugen, die über einen Router miteinander verbunden sind. Ein Gerät, das zwei Netze auf diese Weise verbindet, wird als "Bridge" bezeichnet.
+
+Eine Bridge arbeitet, indem sie die MAC-Adressen der Geräte in ihren Netzwerksegmenten lernt. Der Verkehr wird nur dann zwischen zwei Segmenten weitergeleitet, wenn sich Sender und Empfänger in verschiedenen Netzwerksegmenten befinden. Jedes FreeBSD-System mit zwei Netzwerkkarten kann als Bridge fungieren.
+
+Bridging kann in den folgenden Situationen sinnvoll sein:
+
+Verbinden von Netzwerken::
+Die Hauptaufgabe einer Bridge ist die Verbindung von zwei oder mehreren Netzwerksegmenten. Es gibt viele Gründe, eine hostbasierte Bridge einzusetzen, anstelle von Netzwerkkomponenten, wie beispielsweise Kabelverbindungen oder Firewalls. Eine Bridge kann außerdem ein drahtloses Gerät mit einem Kabelnetzwerk verbinden. Diese Fähigkeit der Bridge wird als HostAP-Modus bezeichnet. Die Bridge agiert in diesem Fall als Access Point für das drahtlose Gerät.
+
+Filtering / Traffic Shaping Firewall::
+Eine Bridge kann eingesetzt werden, wenn Firewallfunktionen benötigt werden, ohne dabei Routing oder Network Adress Translation (NAT) zu verwenden.
++
+Ein Beispiel dafür wäre ein kleines Unternehmen, das über DSL oder ISDN an einen ISP angebunden ist. Es verfügt über 13 erreichbare IP-Adressen und das Netzwerk besteht aus 10 Rechnern. In dieser Situation ist der Einsatz von Subnetzen sowie einer routerbasierten Firewall aufgrund der IP-Adressierung schwierig. Eine Bridge-basierte Firewall kann hingegen ohne Probleme konfiguriert werden.
+
+Netzwerküberwachung::
+Eine Bridge kann zwei Netzwerksegmente miteinander verbinden und danach alle Ethernet-Rahmen überprüfen, die zwischen den beiden Netzwerksegmenten ausgetauscht werden. Dazu verwendet man entweder man:bpf[4] und man:tcpdump[1] auf dem Netzgerät der Bridge oder schickt Kopien aller Rahmen an ein zusätzliches Netzgerät, das als Span Port bekannt ist.
+
+Layer 2 VPN::
+Zwei Ethernetnetzwerke können über einen IP-Link miteinander verbunden werden, indem die beiden Netzwerke über einen EtherIP-Tunnel gekoppelt werden, oder eine man:tap[4]-basierte Lösung wie OpenVPN eingesetzt wird.
+
+Layer 2 Redundanz::
+Die Systeme eines Netzwerks können über das Spanning Tree Protocol (STP) redundant miteinander verbunden sein, um redundante Pfade zu blockieren.
+
+Dieser Abschnitt beschreibt, wie ein FreeBSD-System mit Hilfe von man:if_bridge[4] als Bridge konfiguriert wird. Ein netgraph-Bridge-Treiber ist ebenfalls verfügbar und wird in man:ng_bridge[4] beschrieben.
+
+[NOTE]
+====
+Paketfilter können mit allen Firewallpaketen verwendet werden, die das man:pfil[9]-Framework benutzen. Eine Bridge kann auch als Traffic Shaper verwendet werden, wenn Sie man:altq[4] oder man:dummynet[4] einsetzen.
+====
+
+=== Die Bridge aktivieren
+
+In FreeBSD handelt es sich bei man:if_bridge[4] um ein Kernelmodul, das von man:ifconfig[8] automatisch geladen wird, wenn eine Bridge-Schnittstelle erzeugt wird. Es ist auch möglich, die Unterstützung für den Treiber in den Kernel zu kompilieren, indem die Zeile `device if_bridge` in die Kernelkonfigurationsdatei hinzugefügt wird.
+
+Eine Bridge wird durch das Klonen von Schnittstellen erzeugt. Um eine Bridge zu erzeugen, verwenden Sie:
+
+[source,bash]
+....
+# ifconfig bridge create
+bridge0
+# ifconfig bridge0
+bridge0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether 96:3d:4b:f1:79:7a
+ id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
+ maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
+ root id 00:00:00:00:00:00 priority 0 ifcost 0 port 0
+....
+
+Wenn eine Bridge erzeugt wird, erhält sie automatisch eine zufällig generierte Ethernet-Adresse. Die Parameter `maxaddr` sowie `timeout` legen fest, wie viele MAC-Adressen die Bridge in ihrer Forward-Tabelle halten kann und wie viele Sekunden jeder Eintrag erhalten bleiben soll, nachdem er zuletzt verwendet wurde. Die restlichen Parameter sind für die Konfiguration von STP notwendig.
+
+Im nächsten Schritt werden die Schnittstellen, die die Bridge verbinden soll, zugewiesen. Damit die Bridge Datenpakete weiterleiten kann, müssen sowohl die Bridge als auch die Schnittstellen der zu verbindenden Netzwerksegmente aktiviert sein:
+
+[source,bash]
+....
+# ifconfig bridge0 addm fxp0 addm fxp1 up
+# ifconfig fxp0 up
+# ifconfig fxp1 up
+....
+
+Jetzt ist die Bridge in der Lage, Ethernet-Rahmen zwischen den Schnittstellen [.filename]#fxp0# und [.filename]#fxp1# weiterzuleiten. Um diese Konfiguration beim Systemstart automatisch zu aktivieren, müssen die folgenden Zeilen in [.filename]#/etc/rc.conf# hinzugefügt werden:
+
+[.programlisting]
+....
+cloned_interfaces="bridge0"
+ifconfig_bridge0="addm fxp0 addm fxp1 up"
+ifconfig_fxp0="up"
+ifconfig_fxp1="up"
+....
+
+Wenn die Bridge eine IP-Adresse benötigt, muss diese der Schnittstelle der Bridge zugewiesen werden und nicht der Schnittstelle der gekoppelten Netzwerksegmente. Die IP-Adresse kann manuell gesetzt, oder über DHCP bezogen werden. Dieses Beispiel verwendet eine statische IP-Adresse:
+
+[source,bash]
+....
+# ifconfig bridge0 inet 192.168.0.1/24
+....
+
+Es ist auch möglich der Bridge-Schnittstelle eine IPv6-Adresse zuzuweisen. Um die Änderungen dauerhaft zu speichern, fügen Sie die Adressinformationen in [.filename]#/etc/rc.conf# ein.
+
+[NOTE]
+====
+Nachdem ein Paketfilter aktiviert wurde, können Datenpakete, die von den Schnittstellen der gekoppelten Netzwerksegmente gesendet und empfangen werden, über die Bridge weitergeleitet oder nach bestimmten Regeln gefiltert oder auch komplett geblockt werden. Ist die Richtung des Paketflusses wichtig, ist es am besten, eine Firewall auf den Schnittstellen der einzelnen Netzwerksegmente einzurichten und nicht auf der Bridge selbst.
+
+Eine Bridge verfügt über verschiedene Optionen zur Weiterleitung von Nicht-IP- und IP-Paketen, sowie Paketfilterung auf Layer 2 mittels man:ipfw[8]. Weitere Informationen finden Sie in man:if_bridge[4].
+====
+
+=== Spanning Tree aktivieren
+
+Damit ein Ethernet-Netzwerk richtig funktioniert, kann nur ein aktiver Pfad zwischen zwei Geräten existieren. Das STP-Protokoll erkennt Schleifen in einer Netzwerktopologie und setzt redundante Pfade in einen blockierten Zustand. Sollte eine der aktiven Verbindungen ausfallen, berechnet STP einen anderen Baum und ermöglicht es dann einem blockierten Pfad, alle Netzwerkverbindungen wiederherzustellen.
+
+Das Rapid Spanning Tree Protocol (RSTP oder 802.1w), ist abwärtskompatibel zum veralteten STP. RSTP arbeitet schneller und tauscht Informationen mit benachbarten Switchen aus, um Pakete korrekt weiterzuleiten und eine Schleifenbildung zu verhindern. FreeBSD unterstützt die Betriebsmodi RSTP und STP, wobei RSTP als Standardmodus voreingestellt ist.
+
+STP kann auf den Schnittstellen der durch die Bridge verbundenen Netzwerksegmente mittels man:ifconfig[8] aktiviert werden. Für eine Bridge, die die Schnittstellen [.filename]#fxp0# und [.filename]#fxp1# verbindet, aktivieren Sie STP wie folgt:
+
+[source,bash]
+....
+# ifconfig bridge0 stp fxp0 stp fxp1
+bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether d6:cf:d5:a0:94:6d
+ id 00:01:02:4b:d4:50 priority 32768 hellotime 2 fwddelay 15
+ maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
+ root id 00:01:02:4b:d4:50 priority 32768 ifcost 0 port 0
+ member: fxp0 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP>
+ port 3 priority 128 path cost 200000 proto rstp
+ role designated state forwarding
+ member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP>
+ port 4 priority 128 path cost 200000 proto rstp
+ role designated state forwarding
+....
+
+Diese Bridge hat die Spanning-Tree-ID `00:01:02:4b:d4:50` und die Priorität `32768`. Da diese ID mit der `Root-ID` identisch ist, handelt es sich um die Root-Bridge dieses Netzwerks.
+
+Auf einer anderen Bridge des Netzwerks ist STP ebenfalls aktiviert:
+
+[source,bash]
+....
+bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether 96:3d:4b:f1:79:7a
+ id 00:13:d4:9a:06:7a priority 32768 hellotime 2 fwddelay 15
+ maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
+ root id 00:01:02:4b:d4:50 priority 32768 ifcost 400000 port 4
+ member: fxp0 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP>
+ port 4 priority 128 path cost 200000 proto rstp
+ role root state forwarding
+ member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP>
+ port 5 priority 128 path cost 200000 proto rstp
+ role designated state forwarding
+....
+
+Die Zeile `root id 00:01:02:4b:d4:50 priority 32768 ifcost 400000 port 4` zeigt an, dass die Root-Bridge die ID `00:01:02:4b:d4:50` hat. Die Pfadkosten hin zur Root-Bridge betragen `400000`, wobei der Pfad zur Root-Bridge über `port 4` geht, der wiederum der Schnittstelle [.filename]#fxp0# entspricht.
+
+=== Parameter der Bridge-Schnittstelle
+
+Einige Parameter von `ifconfig` dienen ausschließlich der Konfiguration von Bridge-Schnittstellen. Dieser Abschnitt fasst die Verwendung dieser Parameter zusammen. Die vollständige Liste der verfügbaren Parameter wird in man:ifconfig[8] beschrieben.
+
+private::
+Eine private Schnittstelle leitet keine Daten an einen Port weiter, bei dem es sich ebenfalls um eine private Schnittstelle handelt. Der Datenverkehr wird dabei komplett blockiert, auch Ethernet-Rahmen und ARP-Pakete werden nicht weitergeleitet. Wollen Sie hingegen nur spezifische Datenpakete blockieren, sollten Sie eine Firewall einsetzen.
+
+span::
+Ein Span Port übertragt eine Kopie jedes Ethernet-Rahmens, der an der Bridge ankommt. Auf einer Bridge können beliebig viele Span Ports festgelegt werden. Wird eine Schnittstelle als Span Port konfiguriert, kann sie nicht mehr als normaler Bridge-Port verwendet werden. Eine derartige Konfiguration ist beispielsweise sinnvoll, um den Datenverkehr, der in einem Netzwerk über die Bridge läuft, auf einen Rechner zu übertragen, der mit einem Span Port der Bridge verbunden ist. Um beispielsweise eine Kopie aller Ethernet-Rahmen über die Schnittstelle [.filename]#fxp0# zu übertragen:
++
+[source,bash]
+....
+# ifconfig bridge0 span fxp4
+....
+
+sticky::
+Wenn die Schnittstelle eines über eine Bridge verbundenen Netzwerksegments als sticky gekennzeichnet wird, werden alle dynamisch gelernten Adressen als statische Adressen behandelt, sobald sie in den Forward-Cache der Bridge aufgenommen wurden. Sticky-Einträge werden niemals aus dem Cache entfernt oder ersetzt. Selbst dann nicht, wenn die Adresse von einer anderen Schnittstelle verwendet wird. Sie können dadurch die Vorteile statischer Adresseinträge nutzen, ohne die Forward-Tabelle vor dem Einsatz der Bridge mit statischen Einträgen füllen zu müssen. Clients, die sich in einem bestimmten von der Bridge verwalteten Segmente befinden, können dabei nicht in ein anderes Segment wechseln.
++
+Ein Beispiel für den Einsatz von Sticky-Adressen ist die Kombination einer Bridge mit mehreren VLANs, um einen Router zu konfigurieren, der einzelne Kundennetzwerke voneinander trennt, ohne dabei IP-Adressbereiche zu verschwenden. Für das folgende Beispiel nehmen wir an, dass sich der Client `CustomerA` im VLAN `vlan100` und der Client `CustomerB` im VLAN `vlan101` befinden. Die Bridge hat die IP-Adresse `192.168.0.1`:
++
+[source,bash]
+....
+# ifconfig bridge0 addm vlan100 sticky vlan100 addm vlan101 sticky vlan101
+# ifconfig bridge0 inet 192.168.0.1/24
+....
++
+In diesem Beispiel sehen beide Clients `192.168.0.1` als das Default-Gateway. Da der Brücken-Cache _sticky_ ist, sind Sie nicht dazu in der Lage, die MAC-Adresse des anderen Kunden zu spoofen und dessen Datenverkehr abzufangen.
++
+Sie können die Kommunikation zwischen den VLANs vollständig unterbinden, wenn Sie private Schnittstellen oder eine Firewall einsetzen:
++
+[source,bash]
+....
+# ifconfig bridge0 private vlan100 private vlan101
+....
++
+Die Kunden sind nun komplett voneinander isoliert und der komplette `/24`-Adressbereich kann zugewiesen werden, ohne dass Subnetze eingesetzt werden.
++
+Die maximale mögliche Anzahl an eindeutigen MAC-Adressen hinter einer Schnittstelle kann festgelegt werden. Sobald das Limit erreicht ist, werden Pakete mit einer unbekannten Quell-Adresse solange verworfen, bis ein existierender Eintrag gelöscht wird oder abläuft.
++
+Das folgende Beispiel setzt die maximale Anzahl von Netzgeräten für `CustomerA` für das VLAN `vlan100` auf 10.
++
+[source,bash]
+....
+# ifconfig bridge0 ifmaxaddr vlan100 10
+....
+
+Die Bridge unterstützt auch den Monitormodus. Dabei werden alle Pakete verworfen, nachdem sie von man:bpf[4] verarbeitet wurden. In diesem Modus erfolgt keine weitere Bearbeitung und auch keine Weiterleitung von Datenpaketen. Es ist daher möglich, die Eingabe von zwei oder mehr Netzwerkschnittstellen in einen einzigen gemeinsamen man:bpf[4]-Stream zu vereinen. Ein solcher Datenstrom ist beispielsweise nützlich, um den Datenverkehr für "network taps" zu rekonstruieren, die ihre RX/TX-Signale über verschiedene Schnittstellen senden. Um beispielsweise die Eingabe von vier Netzwerkschnittstellen in einzigen gemeinsamen Datenstrom zu vereinen:
+
+[source,bash]
+....
+# ifconfig bridge0 addm fxp0 addm fxp1 addm fxp2 addm fxp3 monitor up
+# tcpdump -i bridge0
+....
+
+=== SNMP-Monitoring
+
+Die Schnittstelle der Bridge sowie die STP-Parameter können durch den im Basissystem enthaltenen man:bsnmpd[1] überwacht werden. Die exportierten Bridge-MIBs entsprechen den IETF-Standards, daher kann ein beliebiger SNMP-Client oder ein beliebiges Monitoring-Werkzeug eingesetzt werden, um die benötigten Daten zu erhalten.
+
+Um das Monitoring auf der Bridge zu aktivieren, kommentieren Sie diese Zeile in [.filename]#/etc/snmpd.config# aus, indem Sie das Zeichen `#` entfernen:
+
+[.programlisting]
+....
+begemotSnmpdModulePath."bridge" = "/usr/lib/snmp_bridge.so"
+....
+
+Weitere Konfigurationsparameter wie Community-Namen und Zugriffslisten müssen ebenfalls in dieser Datei angepasst werden. Weitere Informationen finden Sie in man:bsnmpd[1] und man:snmp_bridge[3]. Nachdem die Änderungen gespeichert wurden, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+bsnmpd_enable="YES"
+....
+
+Danach starten Sie man:bsnmpd[1]:
+
+[source,bash]
+....
+# service bsnmpd start
+....
+
+Die folgenden Beispiele verwenden das Softwarepaket Net-SNMP (package:net-mgmt/net-snmp[]), um die Bridge vom Client aus abzufragen. Alternativ kann auch der Port package:net-mgmt/bsnmptools[] benutzt werden. Auf dem SNMP-Client müssen danach die folgenden Zeilen in [.filename]#$HOME/.snmp/snmp.conf# hinzugefügt werden, um die MIB-Definitionen der Bridge in Net-SNMP zu importieren:
+
+[.programlisting]
+....
+mibdirs +/usr/shared/snmp/mibs
+mibs +BRIDGE-MIB:RSTP-MIB:BEGEMOT-MIB:BEGEMOT-BRIDGE-MIB
+....
+
+Um eine einzelne Bridge über den IETF BRIDGE-MIB (RFC4188) zu überwachen:
+
+[source,bash]
+....
+% snmpwalk -v 2c -c public bridge1.example.com mib-2.dot1dBridge
+BRIDGE-MIB::dot1dBaseBridgeAddress.0 = STRING: 66:fb:9b:6e:5c:44
+BRIDGE-MIB::dot1dBaseNumPorts.0 = INTEGER: 1 ports
+BRIDGE-MIB::dot1dStpTimeSinceTopologyChange.0 = Timeticks: (189959) 0:31:39.59 centi-seconds
+BRIDGE-MIB::dot1dStpTopChanges.0 = Counter32: 2
+BRIDGE-MIB::dot1dStpDesignatedRoot.0 = Hex-STRING: 80 00 00 01 02 4B D4 50
+...
+BRIDGE-MIB::dot1dStpPortState.3 = INTEGER: forwarding(5)
+BRIDGE-MIB::dot1dStpPortEnable.3 = INTEGER: enabled(1)
+BRIDGE-MIB::dot1dStpPortPathCost.3 = INTEGER: 200000
+BRIDGE-MIB::dot1dStpPortDesignatedRoot.3 = Hex-STRING: 80 00 00 01 02 4B D4 50
+BRIDGE-MIB::dot1dStpPortDesignatedCost.3 = INTEGER: 0
+BRIDGE-MIB::dot1dStpPortDesignatedBridge.3 = Hex-STRING: 80 00 00 01 02 4B D4 50
+BRIDGE-MIB::dot1dStpPortDesignatedPort.3 = Hex-STRING: 03 80
+BRIDGE-MIB::dot1dStpPortForwardTransitions.3 = Counter32: 1
+RSTP-MIB::dot1dStpVersion.0 = INTEGER: rstp(2)
+....
+
+Der Wert der Variable `dot1dStpTopChanges.0` ist hier 2, die STP-Topologie der Bridge wurde also bereits zweimal geändert. Unter einer Änderung versteht man die Anpassung eines oder mehrerer Links und die Kalkulation eines neuen Baums. Der Wert der Variable `dot1dStpTimeSinceTopologyChange.0` gibt an, wann dies zuletzt geschah.
+
+Um mehrere Bridge-Schnittstellen zu überwachen, kann der private BEGEMOT-BRIDGE-MIB eingesetzt werden:
+
+[source,bash]
+....
+% snmpwalk -v 2c -c public bridge1.example.com
+enterprises.fokus.begemot.begemotBridge
+BEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge0" = STRING: bridge0
+BEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge2" = STRING: bridge2
+BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge0" = STRING: e:ce:3b:5a:9e:13
+BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge2" = STRING: 12:5e:4d:74:d:fc
+BEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge0" = INTEGER: 1
+BEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge2" = INTEGER: 1
+...
+BEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge0" = Timeticks: (116927) 0:19:29.27 centi-seconds
+BEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge2" = Timeticks: (82773) 0:13:47.73 centi-seconds
+BEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge0" = Counter32: 1
+BEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge2" = Counter32: 1
+BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge0" = Hex-STRING: 80 00 00 40 95 30 5E 31
+BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge2" = Hex-STRING: 80 00 00 50 8B B8 C6 A9
+....
+
+Um die über den `mib-2.dot1dBridge`-Subtree überwachte Bridge-Schnittstelle zu ändern:
+
+[source,bash]
+....
+% snmpset -v 2c -c private bridge1.example.com
+BEGEMOT-BRIDGE-MIB::begemotBridgeDefaultBridgeIf.0 s bridge2
+....
+
+[[network-aggregation]]
+== Link-Aggregation und Failover
+
+Die von FreeBSD unterstützte man:lagg[4]-Schnittstelle erlaubt die Gruppierung von mehreren Netzwerkadaptern als eine virtuelle Schnittstelle, mit dem Ziel, Ausfallsicherheit (Failover) und Link Aggregation bereitzustellen. Bei Failover kann der Verkehr auch dann weiter fließen, wenn nur eine Schnittstelle verfügbar ist. Link Aggregation funktioniert am besten mit Switches, die LCAP unterstützen, da dieses Protokoll den Datenverkehr bidirektional verteilt, während es auch auf den Ausfall einzelner Verbindungen reagiert.
+
+Die von der lagg-Schnittstelle unterstützten Protokolle bestimmen, welche Ports für den ausgehenden Datenverkehr benutzt werden, und ob ein bestimmter Port eingehenden Datenverkehr akzeptiert. Die folgenden Protokolle werden von man:lagg[4] unterstützt:
+
+Failover (Ausfallsicherheit)::
+Dieser Modus sendet und empfängt Datenverkehr nur auf dem Masterport. Sollte der Masterport nicht zur Verfügung stehen, wird der nächste aktive Port verwendet. Der zuerst hinzugefügte Adapter der virtuellen Schnittstelle wird zum Masterport, jeder weitere Adapter dient als Gerät zur Ausfallsicherheit. Wenn ein Failover auf einem Nicht-Master Port stattfindet, wird der ursprüngliche Port wieder zum Master-Port, sobald er wieder verfügbar ist.
+
+fec / loadbalance (Lastverteilung)::
+Cisco(R) Fast EtherChannel(R) (FEC) findet sich auf älteren Cisco(R) Switches. Es bietet eine statische Konfiguration und handelt weder Aggregation mit der Gegenstelle aus, noch werden Frames zur Überwachung der Verbindung ausgetauscht. Wenn der Switch LACP unterstützt, sollte diese Option auch verwendet werden.
+
+lacp::
+Das IEEE(R) 802.3ad Link-Aggregation Control Protokoll (LACP). Mit LACP wird eine Menge von aggregierbaren Verbindungen mit der Gegenstelle in einer oder mehreren Link Aggregated Groups (LAG) ausgehandelt. Jede LAG besteht aus Ports der gleichen Geschwindigkeit, eingestellt auf Voll-Duplex-Betrieb. Der Verkehr wird über die Ports in der LAG mit der größten Gesamtgeschwindigkeit balanciert. Typischerweise gibt es nur eine LAG, die alle Ports enthält. Im Falle von Änderungen in der physischen Anbindung wird LACP schnell zu einer neuen Konfiguration konvergieren.
++
+LACP balanciert ausgehenden Verkehr über die aktiven Ports basierend auf der gehashten Protokollheaderinformation und akzeptiert eingehenden Verkehr auf jedem aktiven Port. Der Hash beinhaltet die Ethernet-Quell- und Zieladresse, und, soweit verfügbar, den VLAN-Tag, sowie die IPv4 oder IPv6 Quell- und Zieladresse.
+
+roundrobin::
+Dieser Modus verteilt ausgehenden Verkehr mittels einer Round-Robin-Zuteilung über alle aktiven Ports und akzeptiert eingehenden Verkehr auf jedem aktiven Port. Da dieser Modus die Reihenfolge von Ethernet-Rahmen verletzt, sollte er mit Vorsicht eingesetzt werden.
+
+=== Beispiele
+
+Dieser Abschnitt zeigt, wie man einen Cisco(R) Switch und ein FreeBSD-System für LACP Load Balancing konfiguriert. Weiterhin wird gezeigt, wie man zwei Ethernet-Schnittstellen, sowie eine Ethernet- und eine Drahtlos-Schnittstelle für den Failover-Modus konfigurieren kann.
+
+[[networking-lacp-aggregation-cisco]]
+.LACP Aggregation mit einem Cisco(R) Switch
+[example]
+====
+Dieses Beispiel verbindet zwei man:fxp[4] Ethernet-Schnittstellen einer FreeBSD-Maschine zu den ersten zwei Ethernet-Ports auf einem Cisco(R) Switch als eine einzelne, lastverteilte und ausfallsichere Verbindung. Weitere Adapter können hinzugefügt werden, um den Durchsatz zu erhöhen und die Ausfallsicherheit zu steigern. Ersetzen Sie die Namen der Cisco(R)-Ports, Ethernet-Geräte, channel-group Nummern und IP-Adressen im Beispiel durch Namen, die mit Ihrer lokalen Konfiguration übereinstimmen.
+
+Da die Reihenfolge der Frames bei Ethernet zwingend eingehalten werden muss, fließt auch jeglicher Verkehr zwischen zwei Stationen über den gleichen physischen Kanal, was die maximale Geschwindigkeit der Verbindung auf die eines einzelnen Adapters beschränkt. Der Übertragungsalgorithmus versucht, so viele Informationen wie möglich zu verwenden, um die verschiedenen Verkehrsflüsse zu unterscheiden und balanciert diese über die verfügbaren Adapter.
+
+Fügen Sie auf dem Cisco(R)-Switch die Adapter _FastEthernet0/1_ und _FastEthernet0/2_ zu der channel-group _1_ hinzu:
+
+[source,bash]
+....
+interface FastEthernet0/1
+ channel-group 1 mode active
+ channel-protocol lacp
+!
+interface FastEthernet0/2
+ channel-group 1 mode active
+ channel-protocol lacp
+....
+
+Erstellen Sie auf der FreeBSD Maschine die man:lagg[4]-Schnittstelle unter Verwendung von _fxp0_ und _fxp1_ und starten Sie die Schnittstelle mit der IP-Adresse _10.0.0.3/24_:
+
+[source,bash]
+....
+# ifconfig fxp0 up
+# ifconfig fxp1 up
+# ifconfig lagg0 create
+# ifconfig lagg0 up laggproto lacp laggport fxp0 laggport fxp1 10.0.0.3/24
+....
+
+Überprüfen Sie den Status der virtuellen Schnittstelle:
+
+[source,bash]
+....
+# ifconfig lagg0
+lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ options=8<VLAN_MTU>
+ ether 00:05:5d:71:8d:b8
+ inet 10.0.0.3 netmask 0xffffff00 broadcast 10.0.0.255
+ media: Ethernet autoselect
+ status: active
+ laggproto lacp
+ laggport: fxp1 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
+ laggport: fxp0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
+....
+
+Ports, die als _ACTIVE_ markiert sind, sind Teil der aktiven Aggregations-Gruppe, die mit dem Switch ausgehandelt wurde. Der Verkehr wird über diese Gruppe übertragen und empfangen. Benutzen Sie man:ifconfig[8] mit `-v`, um sich die LAG-Bezeichner anzeigen zu lassen.
+
+Um den Status der Ports auf dem Switch anzuzeigen, benutzen Sie `show lacp neighbor`:
+
+[source,bash]
+....
+switch# show lacp neighbor
+Flags: S - Device is requesting Slow LACPDUs
+ F - Device is requesting Fast LACPDUs
+ A - Device is in Active mode P - Device is in Passive mode
+
+Channel group 1 neighbors
+
+Partner's information:
+
+ LACP port Oper Port Port
+Port Flags Priority Dev ID Age Key Number State
+Fa0/1 SA 32768 0005.5d71.8db8 29s 0x146 0x3 0x3D
+Fa0/2 SA 32768 0005.5d71.8db8 29s 0x146 0x4 0x3D
+....
+
+Benutzen Sie `show lacp neighbor detail`, um weitere Informationen zu erhalten.
+
+Damit diese Konfiguration auch nach einem Neustart erhalten bleibt, fügen Sie auf dem FreeBSD-System folgende Einträge in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+ifconfig_fxp0="up"
+ifconfig_fxp1="up"
+cloned_interfaces="lagg0
+ifconfig_lagg0="laggproto lacp laggport fxp0 laggport fxp1 10.0.0.3/24"
+....
+
+====
+
+[[networking-lagg-failover]]
+.Ausfallsicherer Modus
+[example]
+====
+Der ausfallsichere Modus kann verwendet werden, um zu einer zweiten Schnittstelle zu wechseln, sollte die Verbindung mit der Master-Schnittstelle ausfallen. Um den ausfallsicheren Modus zu konfigurieren, aktivieren Sie zunächst die zugrunde liegenden physikalischen Schnittstellen. Erstellen Sie dann die man:lagg[4]-Schnittstelle mit _fxp0_ als Master-Schnittstelle und _fxp1_ als sekundäre Schnittstelle. Der virtuellen Schnittstelle wird die IP-Adresse _10.0.0.15/24_ zugewiesen:
+
+[source,bash]
+....
+# ifconfig fxp0 up
+# ifconfig fxp1 up
+# ifconfig lagg0 create
+# ifconfig lagg0 up laggproto failover laggport fxp0 laggport fxp1 10.0.0.15/24
+....
+
+Die virtuelle Schnittstelle sollte in etwa so aussehen:
+
+[source,bash]
+....
+# ifconfig lagg0
+lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ options=8<VLAN_MTU>
+ ether 00:05:5d:71:8d:b8
+ inet 10.0.0.15 netmask 0xffffff00 broadcast 10.0.0.255
+ media: Ethernet autoselect
+ status: active
+ laggproto failover
+ laggport: fxp1 flags=0<>
+ laggport: fxp0 flags=5<MASTER,ACTIVE>
+....
+
+Der Verkehr wird auf _fxp0_ übertragen und empfangen. Wenn die Verbindung auf _fxp0_ abbricht, wird _fxp1_ die Verbindung übernehmen. Sobald die Verbindung auf der Master-Schnittstelle wiederhergestellt ist, wird diese wieder als aktive Schnittstelle genutzt.
+
+Damit diese Konfiguration auch nach einem Neustart erhalten bleibt, fügen Sie folgende Einträge in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+ifconfig_fxp0="up"
+ifconfig_fxp1="up"
+cloned_interfaces="lagg0
+ifconfig_lagg0="laggproto failover laggport fxp0 laggport fxp1 10.0.0.15/24"
+....
+
+====
+
+[[networking-lagg-wired-and-wireless]]
+.Failover Modus zwischen Ethernet- und drahtlosen Schnittstellen
+[example]
+====
+Für Laptop-Benutzer ist es normalerweise wünschenswert, "wireless" als sekundäre Schnittstelle einzurichten, die verwendet wird, wenn die Ethernet-Verbindung nicht verfügbar ist. Mit man:lagg[4] ist es möglich, ein Failover mit einer IP-Adresse zu konfigurieren, welches die Ethernet-Verbindung aus Performance- und Sicherheitsgründen bevorzugt, während es gleichzeitig möglich bleibt, Daten über die drahtlose Verbindung zu übertragen.
+
+Dies wird erreicht, indem die MAC-Adresse der Ethernet-Schnittstelle mit der MAC Adresse der drahtlosen Schnittstelle überschrieben wird.
+
+[NOTE]
+****
+Theoretisch kann die Ethernet- oder die drahtlose MAC-Adresse so geändert werden, dass sie mit der jeweils anderen Adresse übereinstimmt. Bei einigen drahtlosen Schnittstellen fehlt jedoch die Unterstützung für das Überschreiben der MAC-Adresse. Daher wird empfohlen, die MAC-Adresse der Ethernet-Schnittstelle für diesen Zweck zu überschreiben.
+****
+
+[NOTE]
+****
+Wenn der Treiber für die drahtlose Schnittstelle nicht im `GENERIC`-Kernel oder in einem angepassten Kernel enthalten ist, kann unter FreeBSD {rel121-current} mit `_driver__load="YES"` die entsprechende [.filename]#.ko#-Datei in [.filename]#/boot/loader.conf# geladen werden. Dann muss das System neu gestartet werden. Ein anderer, besserer Weg ist es, den Treiber über [.filename]#/etc/rc.conf# zu laden, indem Sie ihn zu `kld_list` (siehe man:rc.conf[5]) hinzufügen und dann das System neu starten. Dies ist notwendig, da sonst der Treiber zum Zeitpunkt der Konfiguration der man:lagg[4]-Schnittstelle noch nicht geladen ist.
+****
+
+In diesem Beispiel ist die Ethernet-Schnittstelle _re0_ der Master und die drahtlose Schnittstelle _wlan0_ der Failover. Die Schnittstelle _wlan0_ wurde aus der physischen Schnittstelle _ath0_ erstellt, und die Ethernet-Schnittstelle wird mit der MAC-Adresse der drahtlosen Schnittstelle konfiguriert. Im ersten Schritt wird die MAC-Adresse der drahtlosen Schnittstelle ermittelt:
+
+[source,bash]
+....
+# ifconfig wlan0
+wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ ether b8:ee:65:5b:32:59
+ groups: wlan
+ ssid Bbox-A3BD2403 channel 6 (2437 MHz 11g ht/20) bssid 00:37:b7:56:4b:60
+ regdomain ETSI country FR indoor ecm authmode WPA2/802.11i privacy ON
+ deftxkey UNDEF AES-CCM 2:128-bit txpower 30 bmiss 7 scanvalid 60
+ protmode CTS ampdulimit 64k ampdudensity 8 shortgi -stbctx stbcrx
+ -ldpc wme burst roaming MANUAL
+ media: IEEE 802.11 Wireless Ethernet MCS mode 11ng
+ status: associated
+ nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
+....
+
+Ersetzen Sie _ath0_ durch den Namen der drahtlosen Schnittstelle. Die `ether`-Zeile wird die MAC-Adresse der angegebenen Schnittstelle enthalten. Ändern Sie nun die MAC-Adresse der zugrunde liegenden Ethernet-Schnittstelle:
+
+[source,bash]
+....
+# ifconfig re0 ether b8:ee:65:5b:32:59
+....
+
+Starten Sie die drahtlose Schnittstelle, aber ohne eine IP-Adresse zu setzen. Ersetzen Sie _FR_ durch den entsprechenden Ländercode:
+
+[source,bash]
+....
+# ifconfig wlan0 create wlandev iwn0 country FR ssid my_router up
+....
+
+Stellen Sie sicher, dass die _re0_-Schnittstelle aktiv ist. Erstellen Sie die man:lagg[4]-Schnittstelle mit _re0_ als Master und _wlan0_ als Failover:
+
+[source,bash]
+....
+# ifconfig re0 up
+# ifconfig lagg0 create
+# ifconfig lagg0 up laggproto failover laggport re0 laggport wlan0
+....
+
+Die virtuelle Schnittstelle sollte in etwa so aussehen:
+
+[source,bash]
+....
+# ifconfig lagg0
+lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ options=8<VLAN_MTU>
+ ether b8:ee:65:5b:32:59
+ laggproto failover lagghash l2,l3,l4
+ laggport: re0 flags=5<MASTER,ACTIVE>
+ laggport: wlan0 flags=0<>
+ groups: lagg
+ media: Ethernet autoselect
+ status: active
+....
+
+Starten Sie dann den DHCP-Client, um eine IP-Adresse zu erhalten:
+
+[source,bash]
+....
+# dhclient lagg0
+....
+
+Damit diese Konfiguration auch nach einem Neustart erhalten bleibt, fügen Sie folgende Einträge in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+ifconfig_re0="ether b8:ee:65:5b:32:59"
+wlans_ath0="wlan0"
+ifconfig_wlan0="WPA"
+create_args_wlan0="country FR"
+cloned_interfaces="lagg0"
+ifconfig_lagg0="up laggproto failover laggport re0 laggport wlan0 DHCP"
+....
+
+====
+
+[[network-diskless]]
+== Plattenloser Betrieb mit PXE
+
+Das Intel(R) Preboot eXecution Environment (PXE) erlaubt es dem Betriebssystem über das Netzwerk zu starten. Zum Beispiel kann ein FreeBSD-System, ohne lokale Festplatte, über das Netzwerk gestartet und betrieben werden. Die Dateisysteme werden dabei über einen NFS-Server eingehangen. PXE-Unterstützung steht in der Regel im BIOS zur Verfügung. Um PXE beim Systemstart zu verwenden, müssen Sie im BIOS des Rechners die Option `Über das Netzwerk starten` aktivieren. Alternativ können Sie während der PC-Initialisierung auch eine Funktionstaste drücken.
+
+Um die notwendigen Dateien für ein Betriebssystem für den Start über das Netzwerk bereitzustellen, benötigt ein PXE-Setup einen richtig konfigurierten DHCP-, TFTP- und NFS-Server, wobei:
+
+* Die initialen Parameter, wie IP-Adresse, Dateiname und Speicherort der ausführbaren Bootdateien, Servername sowie Root-Pfad vom DHCP-Server bezogen werden.
+* Der Loader für das Betriebssystem über TFTP gestartet wird.
+* Die Dateisysteme über NFS geladen werden.
+
+Sobald das Gastsystem über PXE startet, erhält es vom DHCP-Server Informationen, wo der initiale Bootloader per TFTP zu bekommen ist. Nachdem das Gastsystem diese Informationen erhalten hat, lädt es den Bootloader über TFTP herunter und führt diesen anschließend aus. In FreeBSD ist [.filename]#/boot/pxeboot# der Bootloader. Nachdem [.filename]#/boot/pxeboot# ausgeführt und der FreeBSD-Kernel geladen wurde, wird mit dem Rest der FreeBSD-Bootsequenz, wie in crossref:boot[boot,FreeBSDs Bootvorgang] beschrieben, fortgefahren.
+
+Dieser Abschnitt beschreibt, wie Sie diese Dienste auf einem FreeBSD-System so konfigurieren, sodass andere Systeme FreeBSD über PXE starten können. Weitere Informationen finden Sie in man:diskless[8].
+
+[CAUTION]
+====
+
+Wie beschrieben, ist das System, welches diese Dienste bereitstellt, unsicher. Daher sollte es in einem geschützten Bereich des Netzwerks aufgestellt und von anderen Hosts als nicht vertrauenswürdig eingestuft werden.
+====
+
+[[network-pxe-nfs]]
+=== Konfiguration der PXE-Umgebung
+
+Die in diesem Abschnitt dargestellten Schritte konfigurieren die in FreeBSD enthaltenen NFS- und TFTP-Server. Der folgende Abschnitt beschreibt die Installation und Konfiguration des DHCP-Servers. In diesem Beispiel verwenden wir [.filename]#/b/tftpboot/FreeBSD/install#, welches die Dateien für PXE-Benutzer enthält. Es ist wichtig, dass dieses Verzeichnis existiert und das der gleiche Verzeichnisname ebenfalls in [.filename]#/etc/inetd.conf# und [.filename]#/usr/local/etc/dhcpd.conf# gesetzt wird.
+
+[.procedure]
+. Erstellen Sie das Root-Verzeichnis, welches eine FreeBSD-Installation enthält und über NFS eingehangen werden kann:
++
+[source,bash]
+....
+# export NFSROOTDIR=/b/tftpboot/FreeBSD/install
+# mkdir -p ${NFSROOTDIR}
+....
+
+. Aktivieren Sie den NFS-Server, indem Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzufügen:
++
+[.programlisting]
+....
+nfs_server_enable="YES"
+....
++
+Exportieren Sie das Root-Verzeichnis über NFS, indem Sie folgende Zeile in [.filename]#/etc/exports# hinzufügen:
++
+[.programlisting]
+....
+/b -ro -alldirs -maproot=root
+....
+
+. Starten Sie den NFS-Server:
++
+[source,bash]
+....
+# service nfsd start
+....
+
+. Aktivieren Sie man:inetd[8], indem Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzufügen:
++
+[.programlisting]
+....
+inetd_enable="YES"
+....
+
+. Kommentieren Sie die folgende Zeile in [.filename]#/etc/inetd.conf# aus, indem Sie sicherstellen, dass die Zeile nicht mit einem `#`-Zeichen beginnt:
++
+[.programlisting]
+....
+tftp dgram udp wait root /usr/libexec/tftp tftp -l -s /b/tftpboot
+....
++
+[NOTE]
+====
+Einige PXE-Versionen benötigen die TCP-Version von TFTP. In diesem Fall können Sie die zweite `tftp`-Zeile, welche `stream tcp` enthält, auskommentieren.
+====
+
+. Starten Sie man:inetd[8]:
++
+[source,bash]
+....
+# service inetd start
+....
+
+. Installieren Sie das Basissystem nach [.filename]#${NFSROOTDIR}#, indem Sie die offiziellen Archive entpacken, oder ein neues Basissystem und einen FreeBSD-Kernel erstellen. Detaillierte Anweisungen hierzu finden Sie im crossref:cutting-edge[makeworld,“FreeBSD aus den Quellen aktualisieren”]. Vergessen Sie jedoch nicht `DESTDIR=_${NFSROOTDIR}_` hinzuzufügen, wenn Sie die Kommandos `make installkernel` und `make installworld` ausführen.
+. Testen Sie den TFTP-Server und vergewissern Sie sich, dass Sie den Bootloader herunterladen können, der über PXE bereitgestellt wird:
++
+[source,bash]
+....
+# tftp localhost
+tftp> get FreeBSD/install/boot/pxeboot
+Received 264951 bytes in 0.1 seconds
+....
+
+. Bearbeiten Sie [.filename]#${NFSROOTDIR}/etc/fstab# und erstellen Sie einen Eintrag, um das Root-Dateisystem über NFS einzuhängen:
++
+[.programlisting]
+....
+# Device Mountpoint FSType Options Dump Pass$
+ myhost.example.com:/b/tftpboot/FreeBSD/install / nfs ro 0 0
+....
++
+Ersetzen Sie _myhost.example.com_ durch den Hostnamen oder die IP-Adresse des NFS-Servers. In diesem Beispiel wird das Root-Dateisystem schreibgeschützt eingehangen, um ein potenzielles Löschen des Inhalts durch die NFS-Clients zu verhindern.
+. Setzen Sie das root-Passwort in der PXE-Umgebung für Client-Maschinen, die über PXE starten:
++
+[source,bash]
+....
+# chroot ${NFSROOTDIR}
+# passwd
+....
+
+. Falls erforderlich, aktivieren Sie man:ssh[1] root-Logins für Client-Maschinen, die über PXE starten, indem Sie die Option `PermitRootLogin` in [.filename]#${NFSROOTDIR}/etc/ssh/sshd_config# aktivieren. Dies ist in man:sshd_config[5] dokumentiert.
+. Führen Sie alle weiteren Anpassungen der PXE-Umgebung in [.filename]#${NFSROOTDIR}# durch, wie zum Beispiel die Installation weiterer Pakete, oder dass Bearbeiten der Passwortdatei mit man:vipw[8].
+
+Booten Sie von einem NFS-Root-Volume, so erkennt [.filename]#/etc/rc# dies und startet daraufhin das [.filename]#/etc/rc.initdiskless# Skript. Lesen Sie die Kommentare in diesem Skript um zu verstehen, was dort vor sich geht. Weil das NFS-Root-Verzeichnis schreibgeschützt ist, wir aber Schreibzugriff für [.filename]#/etc# und [.filename]#/var# benötigen, müssen wir diese Verzeichnisse über Speicher-Dateisysteme (memory backed file system) einbinden.
+
+[source,bash]
+....
+# chroot ${NFSROOTDIR}
+# mkdir -p conf/base
+# tar -c -v -f conf/base/etc.cpio.gz --format cpio --gzip etc
+# tar -c -v -f conf/base/var.cpio.gz --format cpio --gzip var
+....
+
+Wenn das System bootet, werden Speicher-Dateisysteme für [.filename]#/etc# und [.filename]#/var# erstellt und eingehangen. Anschließend wird der Inhalt der [.filename]#cpio.gz#-Dateien in diese Dateisysteme kopiert. Standardmäßig haben diese Dateisysteme eine maximale Kapazität von 5 Megabyte. Wenn die Archive nicht passen, was für gewöhnlich bei [.filename]#/var# der Fall ist, erhöhen Sie die Kapazität indem Sie die Anzahl der benötigten 512 Byte Sektoren (5 Megabyte sind 10240 Sektoren) in [.filename]#${NFSROOTDIR}/conf/base/etc/md_size# und [.filename]#${NFSROOTDIR}/conf/base/var/md_size# für die Dateisysteme [.filename]#/etc# und [.filename]#/var# eintragen.
+
+[[network-pxe-setting-up-dhcp]]
+=== Konfiguration des DHCP-Servers
+
+Der DHCP-Server muss nicht auf derselben Maschine laufen wie der TFTP- und NFS-Server, aber er muss über das Netzwerk erreichbar sein.
+
+DHCP ist nicht Bestandteil des FreeBSD Basissystems, kann jedoch über den Port package:net/isc-dhcp43-server[] oder als Paket nachinstalliert werden.
+
+Einmal installiert, bearbeiten Sie die Konfigurationsdatei [.filename]#/usr/local/etc/dhcpd.conf#. Konfigurieren Sie die `next-server`, `filename` und `root-path` Einstellungen, wie in diesem Beispiel zu sehen ist:
+
+[.programlisting]
+....
+subnet 192.168.0.0 netmask 255.255.255.0 {
+range 192.168.0.2 192.168.0.3;
+option subnet-mask 255.255.255.0;
+option routers 192.168.0.1;
+option broadcast-address 192.168.0.255;
+option domain-name-servers 192.168.35.35, 192.168.35.36;
+option domain-name "example.com";
+
+# IP address of TFTP server
+next-server 192.168.0.1;
+
+# path of boot loader obtained via tftp
+filename "FreeBSD/install/boot/pxeboot";
+
+# pxeboot boot loader will try to NFS mount this directory for root FS
+option root-path "192.168.0.1:/b/tftpboot/FreeBSD/install/";
+}
+....
+
+Die Anweisung `next-server` wird benutzt, um die IP-Adresse des TFTP-Servers anzugeben.
+
+Die Anweisung `filename` definiert den Pfad zu [.filename]#/boot/pxeboot#. Da hier der relative Dateiname verwendet wird, bedeutet das, dass [.filename]#/b/tftpboot# nicht im Pfad enthalten ist.
+
+Die Option `root-path` bestimmt den Pfad zum NFS root-Dateisystem.
+
+Sobald die Änderungen gespeichert werden, aktivieren Sie DHCP beim Systemstart, indem Sie die folgende Zeile in [.filename]#/etc/rc.conf# hinzufügen:
+
+[.programlisting]
+....
+dhcpd_enable="YES"
+....
+
+Starten Sie anschließend den DHCP-Dienst:
+
+[source,bash]
+....
+# service isc-dhcpd start
+....
+
+=== Fehlersuche bei PXE Problemen
+
+Sobald alle Dienste konfiguriert und gestartet wurden, sollten PXE-Clients in der Lage sein, FreeBSD automatisch über das Netzwerk zu starten. Wenn ein bestimmter Client beim hochfahren keine Verbindung herstellen kann, sehen Sie im BIOS nach, ob die Option für den Start über das Netzwerk konfiguriert ist.
+
+Dieser Abschnitt gibt einige Tipps zu Fehlerbehebung und zeigt, wie Sie Konfigurationsprobleme eingrezen können für den Fall, dass PXE-Clients nicht in der Lage sind über das Netzwerk zu starten.
+
+[.procedure]
+. Benutzen Sie den package:net/wireshark[] Port um Fehler im Netzwerkverkehr während des Bootvorgangs von PXE zu finden. Der Bootvorgang wird im folgenden Diagramm schematisch dargestellt.
++
+.PXE-Bootvorgang mit NFS Root Mount
+image::pxe-nfs.png[]
+
+. Schauen Sie in [.filename]#/var/log/xferlog# auf dem TFTP-Server und vergewissern Sie sich, dass die [.filename]#pxeboot#-Datei von der richtigen Adresse heruntergeladen wurde. Um die obige Konfiguration von [.filename]#/usr/local/etc/dhcpd.conf# zu testen, geben Sie folgendes ein:
++
+[source,bash]
+....
+# tftp 192.168.0.1
+tftp> get FreeBSD/install/boot/pxeboot
+Received 264951 bytes in 0.1 seconds
+....
++
+Weitere Informationen finden Sie in man:tftpd[8] und man:tftp[1]. Die `BUGS`-Sektionen dieser Seiten dokumentieren einige Einschränkungen von TFTP.
+. Achten Sie darauf, dass Sie das Root-Dateisystem über NFS einhängen können. Auch hier können Sie Ihre Einstellungen aus [.filename]#/usr/local/etc/dhcpd.conf# wie folgt testen:
++
+[source,bash]
+....
+# mount -t nfs 192.168.0.1:/b/tftpboot/FreeBSD/install /mnt
+....
+
+[[network-ipv6]]
+== IPv6
+
+IPv6 ist die neueste Version des bekannten IP-Protokolls, das auch als IPv4 bezeichnet wird. IPv6 bietet gegenüber IPv4 mehrere Vorteile sowie viele neue Funktionen:
+
+* IPv6 hat einen 128 Bit großen Adressraum, der 340.282.366.920.938.463.463.374.607.431.768.211.456 Adressen erlaubt. Dies behebt das Problem der immer knapper werdenden IPv4-Adressen und einer eventuellen Erschöpfung des IPv4-Adressraums.
+* Router speichern nur noch Netzwerk-Aggregationsadressen in ihren Routingtabellen. Dadurch reduziert sich die durchschnittliche Größe einer Routingtabelle auf 8192 Einträge. Dies ist mit den Problemen bei der Skalierbarkeit von IPv4 verbunden, da jeder zugeordnete Block von IPv4-Adressen erfordert, dass Routing-Informationen zwischen vielen Routern im Internet ausgetauscht werden müssen. Die Routing-Tabellen wurden mit der Zeit so groß, dass ein effizientes Routing jetzt kaum noch möglich ist.
+
+* Die automatische Konfiguration von Adressen, die im http://www.ietf.org/rfc/rfc2462.txt[ RFC2462] beschrieben wird.
+* Verpflichtende Multicast-Adressen.
+* Integriertes IPsec (IP-Security).
+* Eine vereinfachte Headerstruktur.
+* Unterstützung für mobile IP-Adressen.
+* Die Umwandlung von IPv4- in IPv6-Adressen.
+
+FreeBSD enthält die IPv6-Referenzimplementation von link:http//www.kame.net/[KAME] und erfüllt damit bereits alle für die Nutzung von IPv6 nötigen Voraussetzungen. Dieser Abschnitt konzentriert sich auf die Konfiguration und den Betrieb von IPv6.
+
+=== Hintergrundinformationen zu IPv6-Adressen
+
+Es gibt verschiedene Arten von IPv6-Adressen:
+
+Unicast::
+Ein Paket, das an eine Unicast-Adresse gesendet wird, kommt nur an der Schnittstelle an, die dieser Adresse zugeordnet ist.
+
+Anycast::
+Anycast-Adressen unterscheiden sich in ihrer Syntax nicht von Unicast-Adressen, sie wählen allerdings aus mehreren Schnittstellen eine Schnittstelle aus. Ein für eine Anycast-Adresse bestimmtes Paket kommt an der nächstgelegenen (entsprechend der Router-Metrik) Schnittstelle an. Anycast-Adressen werden nur von Routern verwendet.
+
+Mulitcast::
+Multicast-Adressen bestimmen Gruppen, denen mehrere Schnittstellen angehören. Ein Paket, das an eine Multicast-Adresse geschickt wird, kommt an allen Schnittstellen an, die zur Multicast-Gruppe gehören. Die von IPv4 bekannte Broadcast-Adresse (normalerweise `xxx.xxx.xxx.255`) wird bei IPv6 durch Multicast-Adressen verwirklicht.
+
+Die kanonische Form einer IPv6-Adresse lautet `x:x:x:x:x:x:x:x`, wobei jedes "x" für einen 16-Bit-Hexadezimalwert steht. Ein Beispiel für eine IPv6-Adresse wäre etwa `FEBC:A574:382B:23C1:AA49:4592:4EFE:9982`.
+
+Eine IPv6-Adresse enthält oft Teilzeichenfolgen aus lauter Nullen. Eine solche Zeichenfolge kann zu "::" verkürzt werden. Bis zu drei führende Nullen eines Hexquads können ebenfalls weggelassen werden. `fe80::1` entspricht also der Adresse `fe80:0000:0000:0000:0000:0000:0000:0001`.
+
+Eine weitere Möglichkeit ist die Darstellung der letzten 32 Bit in der bekannten IPv4-Notation. `2002::10.0.0.1` ist also eine andere Schreibweise für die (hexadezimale) kanonische Form `2002:0000:0000:0000:0000:0000:0a00:0001`, die wiederum der Adresse `2002::a00:1` entspricht.
+
+Benutzen Sie man:ifconfig[8], um die IPv6-Adresse eines FreeBSD-Systems anzuzeigen:
+
+[source,bash]
+....
+# ifconfig
+rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
+ inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255
+ inet6 fe80::200:21ff:fe03:8e1%rl0 prefixlen 64 scopeid 0x1
+ ether 00:00:21:03:08:e1
+ media: Ethernet autoselect (100baseTX )
+ status: active
+....
+
+Bei `fe80::200:21ff:fe03:8e1%rl0` handelt es sich um eine automatisch konfigurierte link-local-Adresse. Sie wird im Rahmen der automatischen Konfiguration aus der MAC-Adresse erzeugt.
+
+Einige IPv6-Adressen sind reserviert. Eine Zusammenfassung dieser Adressen finden Sie in <<reservedip6>>:
+
+[[reservedip6]]
+.Reservierte IPv6-Adressen
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| IPv6-Adresse
+| Präfixlänge
+| Beschreibung
+| Anmerkungen
+
+|`::`
+|128 Bit
+|nicht festgelegt
+|entspricht `0.0.0.0` bei IPv4.
+
+|`::1`
+|128 Bit
+|Loopback-Adresse
+|entspricht `127.0.0.1` bei IPv4.
+
+|`::00:xx:xx:xx:xx`
+|96 Bit
+|Eingebettete IPv4-Adresse
+|Die niedrigen 32 Bit sind die kompatiblen IPv4-Adressen.
+
+|`::ff:xx:xx:xx:xx`
+|96 Bit
+|Eine auf IPv6 abgebildete IPv4-Adresse.
+|Die niedrigen 32 Bit sind IPv4-Adressen für Hosts, die kein IPv6 unterstützen.
+
+|`fe80::/10`
+|10 Bit
+|link-local
+|Entspricht 196.254.0.0/16 bei IPv4.
+
+|`fc00::/7`
+|7 Bit
+|unique-local
+|Diese einzigartigen Adressen sind für die lokale Kommunikation bestimmt und werden nur innerhalb von abgegrenzten Standorten (Sites) weitergeleitet.
+
+|`ff00::`
+|8 Bit
+|Multicast
+|
+
+|`2000::-3fff::`
+|3 Bit
+|Globaler Unicast
+|Alle globalen Unicast-Adressen stammen aus diesem Pool. Die ersten 3 Bit lauten `001`.
+|===
+
+Weitere Informationen zum Aufbau von IPv6-Adressen finden Sie im http://www.ietf.org/rfc/rfc3513.txt[ RFC3513].
+
+=== IPv6 konfigurieren
+
+Um ein FreeBSD-System als IPv6-Client zu konfigurieren, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+ifconfig_rl0_ipv6="inet6 accept_rtadv"
+rtsold_enable="YES"
+....
+
+Die erste Zeile ermöglicht der angegebenen Schnittstelle, Router-Advertisement-Nachrichten zu empfangen. Die zweite Zeile aktiviert den Router-Solicitation-Daemon man:rtsold[8].
+
+Falls die Schnittstelle eine statisch zugewiesene IPv6-Adresse benötigt, fügen Sie einen Eintrag mit der statischen Adresse und dem zugehörigen Präfix für das Subnetz hinzu:
+
+[.programlisting]
+....
+ifconfig_rl0_ipv6="inet6 2001:db8:4672:6565:2026:5043:2d42:5344 prefixlen 64"
+....
+
+Um einen Standardrouter festzulegen, fügen Sie die Adresse hinzu:
+
+[.programlisting]
+....
+ipv6_defaultrouter="2001:db8:4672:6565::1"
+....
+
+=== Verbindung zu einem Provider aufbauen
+
+Um sich mit anderen IPv6-Netzwerken zu verbinden, benötigen Sie einen Provider oder einen Tunnel, der IPv6 unterstützt:
+
+* Fragen Sie einen Internetprovider, ob er IPv6 anbietet.
+* http://www.tunnelbroker.net[Hurricane Electric] bietet weltweit IPv6-Tunnelverbindungen an.
+
+[NOTE]
+====
+Die Verwendung des Ports [.filename]#/usr/ports/net/freenet6# für Einwahlverbindungen.
+====
+
+Dieser Abschnitt beschreibt, wie Sie die Anweisungen eines Tunnel-Providers dauerhaft in [.filename]#/etc/rc.conf# einrichten.
+
+Der erste Eintrag in [.filename]#/etc/rc.conf# erzeugt die generische Tunnelschnittstelle [.filename]#gif0#:
+
+[.programlisting]
+....
+cloned_interfaces="gif0"
+....
+
+Als nächstes konfigurieren Sie die IPv4-Adressen der lokalen und entfernten Endpunkte. Ersetzen Sie _MY_IPv4_ADDR_ und _REMOTE_IPv4_ADDR_ durch die tatsächlichen IPv4-Adressen:
+
+[.programlisting]
+....
+cloned_interfaces_gif0="MY_IPv4_ADDR REMOTE_IPv4_ADDR"
+....
+
+Um die zugewiesene IPv6-Adresse als Endpunkt für den IPv6-Tunnel zu verwenden, fügen Sie folgende Zeile für FreeBSD 9._x_ (und neuer) ein:
+
+[.programlisting]
+....
+ifconfig_gif0_ipv6="inet6 MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR"
+....
+
+Legen Sie dann die Standardroute für das andere Ende des IPv6-Tunnels fest. Ersetzen Sie _MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR_ mit der Adresse des Standard-Gateways des Providers:
+
+[.programlisting]
+....
+ipv6_defaultrouter="MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR"
+....
+
+Wenn das FreeBSD-System IPv6-Verkehr zwischen dem Netzwerk und der Außenwelt routen muss, aktivieren Sie das Gateway mit dieser Zeile:
+
+[.programlisting]
+....
+ipv6_gateway_enable="YES"
+....
+
+=== Bekanntmachung von Routen und automatische Rechnerkonfiguration
+
+Dieser Abschnitt beschreibt die Einrichtung von man:rtadvd[8], das Sie bei der Bekanntmachung der IPv6-Standardroute unterstützt.
+
+Um man:rtadvd[8] zu aktivieren, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+rtadvd_enable="YES"
+....
+
+Es ist wichtig, die Schnittstelle anzugeben, über die IPv6-Routen bekanntgemacht werden sollen. Soll man:rtadvd[8] [.filename]#rl0# verwenden, ist folgender Eintrag nötig:
+
+[.programlisting]
+....
+rtadvd_interfaces="rl0"
+....
+
+Danach erzeugen Sie die Konfigurationsdatei [.filename]#/etc/rtadvd.conf#. Dazu ein Beispiel:
+
+[.programlisting]
+....
+rl0:\
+ :addrs#1:addr="2001:db8:1f11:246::":prefixlen#64:tc=ether:
+....
+
+Ersetzen Sie dabei [.filename]#fxp0# durch die zu verwendende Schnittstelle, und `2001:db8:1f11:246::` durch das entsprechend zugewiesene Präfix.
+
+Bei einem `/64`-Subnetz müssen keine weiteren Anpassungen vorgenommen werden. Anderenfalls muss `prefixlen#` auf den korrekten Wert gesetzt werden.
+
+=== IPv6 und Abbildung von IPv6-Adressen
+
+Wenn IPv6 auf einem Server aktiviert ist, kann es für die Kommunikation erforderlich sein, IPv4-Adressen auf IPv6-Adressen abzubilden. Diese Kompatibilität erlaubt es, das IPv4-Adressen als IPv6-Adressen dargestellt werden. Die Kommunikation von IPv6-Anwendungen mit IPv4 und umgekehrt kann jedoch ein Sicherheitsrisiko darstellen.
+
+Diese Option dient nur der Kompatibilität und wird in den meisten Fällen nicht erforderlich sein. Die Option ermöglicht es IPv6-Anwendungen zusammen mit IPv4 in einer Dual-Stack-Umgebung zu funktionieren. Dies ist besonders nützlich für Anwendungen von Drittanbietern, die evtl. keine IPv6-Umgebungen unterstützen. Um diese Funktion zu aktivieren, fügen Sie folgendes in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+ipv6_ip4mapping="YES"
+....
+
+Für einige Administratoren können die Informationen im RFC 3493 (Sektion 3.6 und 3.7) und RFC 4038 (Sektion 4.2) hilfreich sein.
+
+[[carp]]
+== Common Address Redundancy Protocol (CARP)
+
+Das Common Address Redundancy Protocol (CARP) erlaubt es, mehreren Rechnern die gleiche IP-Adresse und Virtual Host ID (VHID) zuzuweisen und _Hochverfügbarkeit_ bereitzustellen. Das bedeutet, dass ein oder mehrere Rechner ausfallen können und die anderen Rechner transparent einspringen, ohne dass die Benutzer etwas von einem Ausfall mitbekommen.
+
+Neben der gemeinsamen IP-Adresse, haben die jeweiligen Rechner auch eine eindeutige IP-Adresse zur Verwaltung und Konfiguration. Alle Maschinen, die sich eine IP-Adresse teilen, verwenden die gleiche VHID. Die VHID für jede einzelne IP-Adresse muss, entsprechend der Broadcast-Domäne der Netzwerkschnittstelle, eindeutig sein.
+
+Hochverfügbarkeit mit CARP ist in FreeBSD enthalten, jedoch unterscheidet sich die Konfiguration von der eingesetzten FreeBSD-Version. Dieser Abschnitt enthält die gleichen Konfigurationsdateien für verschiedene Versionen von FreeBSD.
+
+Dieses Beispiel konfiguriert eine Failover-Unterstützung mit drei Servern (mit jeweils eigener, eindeutiger IP-Adresse), die alle den gleichen Web-Inhalt anbieten. Es werden zwei verschiedene Master namens `hosta.example.org` und `hostb.example.org` benutzt, mit einem gemeinsamen Backup namens `hostc.example.org`.
+
+Die Lastverteilung dieser Maschinen wird dabei über Round RobinDNS konfiguriert. Mit Ausnahme des Hostnamens und der IP-Management-Adresse sind Master- und Backup-Maschinen identisch konfiguriert. Die Server müssen die gleiche Konfiguration und die gleichen Dienste aktiviert haben. Tritt ein Failover auf, können Anfragen an den Dienst mit der gemeinsam genutzten IP-Adresse nur dann richtig beantwortet werden, wenn der Backup-Server Zugriff auf denselben Inhalt hat. Die Backup-Maschine verfügt über zwei zusätzliche CARP-Schnittstellen, eine für jede IP-Adresse des Master-Content-Servers. Sobald ein Fehler auftritt, übernimmt der Backup-Server die IP-Adresse des ausgefallenen Master-Servers.
+
+[[carp-10x]]
+=== CARP mit FreeBSD 10 (und neuer) benutzen
+
+Unterstützung für CARP erhalten Sie durch das Laden des Kernelmoduls [.filename]#carp.ko# in [.filename]#/boot/loader.conf#:
+
+[.programlisting]
+....
+carp_load="YES"
+....
+
+So laden Sie das Modul ohne Neustart:
+
+[source,bash]
+....
+# kldload carp
+....
+
+Benutzer, die einen angepassten Kernel verwenden möchten, müssen die folgende Zeile in die Konfigurationsdatei aufnehmen. Anschließend muss der Kernel, wie in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] beschrieben, neu gebaut werden:
+
+[.programlisting]
+....
+device carp
+....
+
+Hostname, IP-Management-Adresse, Subnetzmaske, gemeinsame IP-Adresse und VHID werden durch Einträge in [.filename]#/etc/rc.conf# gesetzt. Dieses Beispiel ist für `hosta.example.org`:
+
+[.programlisting]
+....
+hostname="hosta.example.org"
+ifconfig_em0="inet 192.168.1.3 netmask 255.255.255.0"
+ifconfig_em0_alias0="inet vhid 1 pass testpass alias 192.168.1.50/32"
+....
+
+Die nächsten Einträge sind für `hostb.example.org`. Da der Rechner einen zweiten Master darstellt, verwendet er eine andere gemeinsame IP-Adresse und VHID. Die mittels `pass` angegebenen Passwörter müssen jedoch identisch sein, da CARP nur mit Systemen kommuniziert, die über das richtige Passwort verfügen.
+
+[.programlisting]
+....
+hostname="hostb.example.org"
+ifconfig_em0="inet 192.168.1.4 netmask 255.255.255.0"
+ifconfig_em0_alias0="inet vhid 2 pass testpass alias 192.168.1.51/32"
+....
+
+Die dritte Maschine, `hostc.example.org` ist so konfiguriert, das sie aktiviert wird, wenn einer der beiden Masterserver ausfällt. Diese Maschine ist mit zwei CARPVHIDs konfiguriert, eine für jede virtuelle IP-Adresse der beiden Master-Server. Die CARP advertising skew, `advskew` wird gesetzt, um sicherzustellen, dass sich der Backup-Server später ankündigt wie der Master-Server, da `advskew` die Rangfolge steuert für den Fall, dass mehrere Backup-Server zur Verfügung stehen.
+
+[.programlisting]
+....
+hostname="hostc.example.org"
+ifconfig_em0="inet 192.168.1.5 netmask 255.255.255.0"
+ifconfig_em0_alias0="inet vhid 1 advskew 100 pass testpass alias 192.168.1.50/32"
+ifconfig_em0_alias1="inet vhid 2 advskew 100 pass testpass alias 192.168.1.51/32"
+....
+
+Durch die beiden konfigurierten CARPVHIDs ist `hostc.example.org` in der Lage festzustellen, wenn einer der Master-Server nicht mehr reagiert. Wenn der Master-Server sich später ankündigt als der Backup-Server, übernimmt der Backup-Server die gemeinsame IP-Adresse, bis der Master-Server erneut verfügbar ist.
+
+[NOTE]
+====
+Auch wenn der ursprüngliche Master-Server wieder verfügbar wird, gibt `hostc.example.org` die virtuelle IP-Adresse nicht automatisch wieder frei. Dazu muss Preemption aktiviert werden. Preemption ist standardmäßig deaktiviert und wird über die man:sysctl[8]-Variable `net.inet.carp.preempt` gesteuert. Der Administrator kann den Backup-Server zwingen, die IP-Adresse an den Master zurückzugeben:
+
+[source,bash]
+....
+# ifconfig em0 vhid 1 state backup
+....
+
+====
+
+Sobald die Konfiguration abgeschlossen ist, muss das Netzwerk oder die Maschine neu gestartet werden. Hochverfügbarkeit ist nun aktiviert.
+
+Die Funktionalität von CARP kann, wie in der Manualpage man:carp[4] beschrieben, über verschiedene man:sysctl[8] Parameter kontrolliert werden. Mit dem Einsatz von man:devd[8] können weitere Aktionen zu CARP-Ereignissen ausgelöst werden.
+
+[[carp-9x]]
+=== CARP mit FreeBSD 9 (und älter) benutzen
+
+Die Konfiguration für diese Versionen von FreeBSD ist ähnlich wie im vorhergehenden Abschnitt beschrieben, mit der Ausnahme, dass zuerst ein CARP-Gerät in der Konfiguration erstellt und bezeichnet werden muss.
+
+Unterstützung für CARP erhalten Sie durch das Laden des Kernelmoduls [.filename]#carp.ko# in [.filename]#/boot/loader.conf#:
+
+[.programlisting]
+....
+if_carp_load="YES"
+....
+
+So laden Sie das Modul ohne Neustart:
+
+[source,bash]
+....
+# kldload carp
+....
+
+Benutzer, die einen angepassten Kernel verwenden möchten, müssen die folgende Zeile in die Konfigurationsdatei aufnehmen. Anschließend muss der Kernel, wie in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] beschrieben, neu gebaut werden:
+
+[.programlisting]
+....
+device carp
+....
+
+Als nächstes erstellen Sie auf jedem Rechner eine CARP-Schnittstelle:
+
+[source,bash]
+....
+# ifconfig carp0 create
+....
+
+Konfigurieren Sie Hostnamen, IP-Management-Adresse, die gemeinsam genutzte IP-Adresse und die VHID, indem Sie die erforderlichen Zeilen in [.filename]#/etc/rc.conf# hinzufügen. Da anstelle eines Alias eine virtuelles CARP-Gerät verwendet wird, wird die tatsächliche Subnetzmaske `/24` anstatt `/32` benutzt. Hier sind die Einträge für `hosta.example.org`:
+
+[.programlisting]
+....
+hostname="hosta.example.org"
+ifconfig_fxp0="inet 192.168.1.3 netmask 255.255.255.0"
+cloned_interfaces="carp0"
+ifconfig_carp0="vhid 1 pass testpass 192.168.1.50/24"
+....
+
+Beispiel für `hostb.example.org`:
+
+[.programlisting]
+....
+hostname="hostb.example.org"
+ifconfig_fxp0="inet 192.168.1.4 netmask 255.255.255.0"
+cloned_interfaces="carp0"
+ifconfig_carp0="vhid 2 pass testpass 192.168.1.51/24"
+....
+
+Die dritte Maschine, `hostc.example.org` ist so konfiguriert, das sie aktiviert wird, wenn einer der beiden Masterserver ausfällt:
+
+[.programlisting]
+....
+hostname="hostc.example.org"
+ifconfig_fxp0="inet 192.168.1.5 netmask 255.255.255.0"
+cloned_interfaces="carp0 carp1"
+ifconfig_carp0="vhid 1 advskew 100 pass testpass 192.168.1.50/24"
+ifconfig_carp1="vhid 2 advskew 100 pass testpass 192.168.1.51/24"
+....
+
+[NOTE]
+====
+Preemption ist im [.filename]#GENERIC#-Kernel deaktiviert. Haben Sie jedoch Preemption in einem angepassten Kernel aktiviert, dass `hostc.example.org` die virtuelle IP-Adresse nicht wieder an den Master-Server zurückgibt. Der Administrator kann jedoch den Backup-Server dazu zwingen, die übernommene IP-Adresse wieder an den Master-Server zurückzugeben:
+
+[source,bash]
+....
+# ifconfig carp0 down && ifconfig carp0 up
+....
+
+Dieser Befehl muss auf dem [.filename]#carp#-Gerät ausgeführt werden, dass dem betroffenen System zugeordnet ist.
+====
+
+Sobald die Konfiguration abgeschlossen ist, muss das Netzwerk oder die Maschine neu gestartet werden. Hochverfügbarkeit ist nun aktiviert.
+
+[[network-vlan]]
+== VLANs
+
+VLANs sind eine Möglichkeit ein Netzwerk virtuell in viele Subnetze zu unterteilen. Man spricht hier auch von Segmentierung. Jedes Subnetz hat seine eigene Broadcast-Domäne und ist von anderen VLANs isoliert.
+
+Unter FreeBSD müssen VLANs vom Treiber der Netzwerkkarte unterstützt werden. man:vlan[4] enthält eine Liste von Treibern mit integrierter VLAN-Unterstützung.
+
+Für die Konfiguration eines VLAN werden zwei Informationen benötigt: die verwendete Netzwerkschnittstelle und das VLAN-Tag.
+
+Das folgende Kommando konfiguriert ein VLAN mit der Netzwerkschnittstelle `em0` und dem VLAN-Tag `5`:
+
+[source,bash]
+....
+# ifconfig em0.5 create vlan 5 vlandev em0 inet 192.168.20.20/24
+....
+
+[NOTE]
+====
+In diesem Beispiel fällt auf, dass der Name der Schnittstelle den Treibernamen und das VLAN-Tag enthält, getrennt durch einen Punkt. Diese Methode hat sich bewährt, da sie die Konfiguration von Systemen mit mehreren VLANs deutlich erleichtert.
+====
+
+Um VLANs beim Booten zu konfigurieren, muss [.filename]#/etc/rc.conf# angepasst werden. Für das obige Beispiel müssten folgende Zeilen in die Konfiguration aufgenommen werden:
+
+[.programlisting]
+....
+vlans_em0="5"
+ifconfig_em0_5="inet 192.168.20.20/24"
+....
+
+Das gleiche Schema kann benutzt werden, um weitere VLANs hinzuzufügen.
+
+Es ist sinnvoll, einer Schnittstelle einen symbolischen Namen zuzuweisen, so dass bei einem Wechsel der zugehörigen Hardware nur wenige Konfigurationsvariablen aktualisiert werden müssen. Nehmen wir beispielsweise an, dass Überwachungskameras im VLAN1 auf `em0` betrieben werden. Wenn später die Karte `em0` durch eine Karte ersetzt wird, die den man:ixgb[4] Treiber verwendet, müssen nicht alle Referenzen auf `em0.1` durch `ixgb0.1` ersetzt werden.
+
+Der folgende Befehl konfiguriert VLAN `5` auf der Netzwerkkarte `em0`. Die Schnittstelle bekommt den Namen `cameras` und eine IP-Adresse `_192.168.20.20_` mit einem `24`-Bit Präfix.
+
+[source,bash]
+....
+# ifconfig em0.5 create vlan 5 vlandev em0 name cameras inet 192.168.20.20/24
+....
+
+Dieser Befehl konfiguriert die Schnittstelle mit dem Namen `video`:
+
+[source,bash]
+....
+# ifconfig video.5 create vlan 5 vlandev video name cameras inet 192.168.20.20/24
+....
+
+Um die Änderungen beim Booten anzuwenden, fügen Sie folgenden Zeilen in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+vlans_video="cameras"
+create_args_cameras="vlan 5"
+ifconfig_cameras="inet 192.168.20.20/24"
+....
diff --git a/documentation/content/de/books/handbook/audit/_index.adoc b/documentation/content/de/books/handbook/audit/_index.adoc
new file mode 100644
index 0000000000..eda461cb5f
--- /dev/null
+++ b/documentation/content/de/books/handbook/audit/_index.adoc
@@ -0,0 +1,404 @@
+---
+title: Kapitel 16. Security Event Auditing
+part: Teil III. Systemadministration
+prev: books/handbook/mac
+next: books/handbook/disks
+---
+
+[[audit]]
+= Security Event Auditing
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 16
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/audit/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/audit/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/audit/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[audit-synopsis]]
+== Einleitung
+
+FreeBSD bietet Unterstützung für Sicherheits-Auditing. Ereignis-Auditing bietet zuverlässige, feingranulierte und konfigurierbare Aufzeichnung einer Vielzahl von sicherheitsrelevanten Systemereignissen einschließlich Benutzereingaben, Konfigurationsänderungen sowie Datei- und Netzwerkzugriffen. Diese Log-Datensätze können unschätzbar wertvoll sein für direkte Systemüberwachung, Einbruchserkennung und Post-Mortem-Analyse. FreeBSD implementiert Sun(TM)s öffentlich zugängliches Basic Security Module (BSM) Application Programming Interface (API) und Dateiformat, und kann mit den Audit-Implementierungen von Sun(TM) Solaris(TM) und Apple(R) Mac OS(R) X zusammenarbeiten.
+
+Dieses Kapitel konzentriert sich auf die Installation und Konfiguration des Ereignis-Auditings. Es erklärt Audit-Richtlinien und stellt ein Beispiel einer Audit-Konfiguration vor.
+
+Nach dem Lesen dieses Kapitels werden Sie Folgendes wissen:
+
+* Was Ereignis-Auditing ist und wie es funktioniert.
+* Wie man Ereignis-Auditing in FreeBSD für Benutzer und Prozesse konfiguriert.
+* Wie man den Audit-Pfad mittels Audit-Reduktion und Revisionswerkzeugen überprüft.
+
+Vor dem Lesen dieses Kapitels sollten Sie:
+
+* Sowohl UNIX(R) als auch FreeBSD-Basismechanismen beherrschen (crossref:basics[basics,Grundlagen des FreeBSD Betriebssystems]).
+* Mit den grundlegenden Mechanismen der Kernel-Konfiguration und -Kompilierung vertraut sein (crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels]).
+* Mit den Maßnahmen zur Sicherung von FreeBSD vertraut sein (crossref:security[security,Sicherheit]).
+
+[WARNING]
+====
+
+Die Audit-Funktionalität in FreeBSD hat einige bekannte Einschränkungen. Nicht alle sicherheitsrelevanten System-Ereignisse sind auditierbar, und einige Anmelde-Mechanismen, wie beispielsweise Xorg-basierte Bildschirm-Manager und Dienste von Drittanbietern, konfigurieren das Auditing für Benutzeranmeldungen nicht korrekt.
+
+Das Sicherheits-Auditing ist in der Lage, sehr detaillierte Log-Dateien von Systemaktivitäten zu erzeugen. Auf einem ausgelasteten System kann die Pfad-Datei sehr groß werden, wenn sie für hohe Auflösung konfiguriert ist, und im Extremfall pro Woche um mehrere Gigabyte anwachsen. Administratoren sollten daher den benötigten Plattenplatz in Verbindung mit umfangreichen Audit-Konfigurationen berücksichtigen. So kann es wünschenswert sein, ein eigenes Dateisystem für [.filename]#/var/audit# einzusetzen, damit andere Dateisysteme nicht betroffen sind, wenn das Dateisystem des Audit voll läuft.
+====
+
+[[audit-inline-glossary]]
+== Schlüsselbegriffe
+
+Die folgenden Begriffe stehen im Zusammenhang mit Ereignis-Auditing:
+
+* _event_: ein auditierbares Ereignis ist jedes Ereignis, das mit dem Audit-Subsystem aufgezeichnet werden kann. Beispiele für sicherheitsrelevante Systemereignisse sind etwa das Anlegen von Dateien, das Erstellen einer Netzwerkverbindung oder eine Benutzeranmeldung. Ereignisse sind entweder "attributierbar", können also zu einen authentifizierten Benutzer zurückverfolgt werden, oder sind "nicht-attributierbar". Nicht-attributierbare Ereignisse erfolgen daher vor der Authentifizierung im Anmeldeprozess (beispielsweise die Eingabe eines falschen Passworts).
+* _class_: benannte Zusammenstellungen von zusammengehörenden Ereignissen, die in Auswahl-Ausdrücken benutzt werden. Häufig genutzte Klassen von Ereignissen schließen "file creation" (fc, Anlegen von Dateien), "exec" (ex, Ausführung) und "login_logout" (lo, Anmeldung-Abmeldung) ein.
+* _record_: ein Audit-Logeintrag, der ein Sicherheitsereignis enthält. Jeder Datensatz enthält einen Ereignistyp, Informationen über den Gegenstand (Benutzer), welcher die Aktion durchführt, Datums- und Zeitinformationen, Informationen über jedes Objekt oder Argument sowie den Zustand hinsichtlich Erfolg oder Scheitern der Operation.
+* _trail_: eine Log-Datei bestehend aus einer Reihe von Audit-Datensätzen, die Sicherheitsereignisse beschreiben. Pfade sind in grober zeitlicher Reihenfolge bezüglich des Zeitpunktes, an welchem ein Ereignis beendet wurde. Nur autorisierte Prozesse dürfen Datensätze zum Audit-Pfad hinzufügen.
+* _selection expression_: eine Zeichenkette, welche eine Liste von Präfixen und Audit-Ereignisklassennamen enthält, um Ereignisse abzugleichen.
+* _preselection_: der Prozess, durch den das System erkennt, welche Ereignisse von Interesse für den Administrator sind, um die Erzeugung von Datensätze zu verhindern, welche nicht von Belang sind. Die Konfiguration der Vorauswahl benutzt eine Reihe von Auswahl-Ausdrücken, um zu erkennen, welche Klassen von Ereignissen für welche Benutzer aufgezeichnet werden sollen sowie globale Einstellungen, welche sowohl auf autorisierte als auch unautorisierte Prozesse angewendet werden.
+* _reduction_: Die Reduzierung ist der Prozess, durch den Datensätze von bestehenden Audit-Pfaden ausgewählt werden für Speicherung, Ausdruck oder Analyse. Ebenso der Prozess, durch den unerwünschte Datensätze aus dem Audit-Pfad entfernt werden. Mittels Reduzierung können Administratoren Richtlinien für die Speicherung von Audit-Daten vorgeben. Zum Beispiel können ausführliche Audit-Pfade für einen Monat gespeichert werden, um danach den Pfad für archivarische Zwecke auf die Anmeldeinformationen zu reduzieren.
+
+[[audit-config]]
+== Audit Konfiguration
+
+Userspace-Unterstützung für Ereignis-Auditing ist Bestandteil des FreeBSD-Betriebssystems. Kernel-Unterstützung ist in der Voreinstellung im [.filename]#GENERIC#-Kernel enthalten und man:auditd[8] kann durch Hinzufügen der folgenden Zeile in [.filename]#/etc/rc.conf# aktiviert werden:
+
+[.programlisting]
+....
+auditd_enable="YES"
+....
+
+Starten Sie anschließend den Audit-Daemon:
+
+[source,bash]
+....
+# service auditd start
+....
+
+Benutzer, die es bevorzugen einen angepassten Kernel zu kompilieren, müssen folgende Zeile in die Kernelkonfigurationsdatei aufnehmen:
+
+[.programlisting]
+....
+options AUDIT
+....
+
+=== Ereignis-Auswahlausdrücke
+
+Auswahlausdrücke werden an einigen Stellen der Audit-Konfiguration benützt, um zu bestimmen, welche Ereignisse auditiert werden sollen. Die Ausdrücke enthalten eine Liste der Ereignisklassen, welche verglichen werden sollen. Auswahlausdrücke werden von links nach rechts ausgewertet und zwei Ausdrücke werden durch Aneinanderhängen miteinander kombiniert.
+
+<<event-selection>> fasst die Audit-Ereignisklassen zusammen:
+
+[[event-selection]]
+.Audit-Ereignisklassen
+[cols="20%,20%,60%", frame="none", options="header"]
+|===
+| Name der Klasse
+| Beschreibung
+| Aktion
+
+|all
+|all
+|Vergleicht alle Ereigsnisklassen.
+
+|aa
+|authentication and authorization
+|
+
+|ad
+|administrative
+|Administrative Aktionen, ausgeführt auf dem System als Ganzes.
+
+|ap
+|application
+|Aktionen definiert für Applikationen.
+
+|cl
+|file close
+|Audit-Aufrufe für den Systemaufruf `close`.
+
+|ex
+|exec
+|Ausführung des Audit-Programms. Auditierung von Befehlszeilen-Argumenten und Umgebungsvariablen wird gesteuert durch man:audit_control[5] mittels der `argv` und `envv`-Parameter gemäß der `Richtlinien`-Einstellungen.
+
+|fa
+|file attribute access
+|Auditierung des Zugriffs auf Objektattribute wie man:stat[1] und man:pathconf[2].
+
+|fc
+|file create
+|Audit-Ereignisse, bei denen eine Datei als Ergebnis angelegt wird.
+
+|fd
+|file delete
+|Audit-Ereignisse, bei denen Dateilöschungen vorkommen.
+
+|fm
+|file attribute modify
+|Audit-Ereignisse, bei denen Dateiattribute geändert werden, wie man:chown[8], man:chflags[1] und man:flock[2].
+
+|fr
+|file read
+|Audit-Ereignisse, bei denen Daten gelesen oder Dateien zum lesen geöffnet werden.
+
+|fw
+|file write
+|Audit-Ereignisse, bei denen Daten geschrieben oder Dateien geschrieben oder verändert werden.
+
+|io
+|ioctl
+|Nutzung des Systemaufrufes `ioctl` durch Audit.
+
+|ip
+|ipc
+|Auditierung verschiedener Formen von Inter-Prozess-Kommunikation einschließlich POSIX-Pipes und System V IPC-Operationen.
+
+|lo
+|login_logout
+|Audit-Ereignisse von man:login[1] und man:logout[1].
+
+|na
+|non attributable
+|Auditierung nicht-attributierbarer Ereignisse.
+
+|no
+|invalid class
+|Kein Abgleich von Audit-Ereignissen.
+
+|nt
+|network
+|Audit-Ereignisse in Zusammenhang mit Netzwerkaktivitäten wie man:connect[2] und man:accept[2]
+
+|ot
+|other
+|Auditierung verschiedener Ereignisse.
+
+|pc
+|process
+|Auditierung von Prozess-Operationen wie man:exec[3] und man:exit[3].
+|===
+
+Diese Ereignisklassen können angepasst werden durch Modifizierung der Konfigurationsdateien [.filename]#audit_class# und [.filename]#audit_event#.
+
+Jede Audit-Klasse kann mit einem Präfix kombiniert werden, welches anzeigt, ob erfolgreiche/gescheiterte Operationen abgebildet werden, und ob der Eintrag den Abgleich hinzufügt oder entfernt für die Klasse und den Typ. <<event-prefixes>> fasst die verfügbaren Präfixe zusammen.
+
+[[event-prefixes]]
+.Präfixe für Audit-Ereignisklassen
+[cols="20%,80%", frame="none", options="header"]
+|===
+| Präfix
+| Aktion
+
+|+
+|Auditiert erfolgreiche Ereignisse in dieser Klasse.
+
+|-
+|Auditiert fehlgeschlagene Ereignisse in dieser Klasse.
+
+|^
+|Auditiert weder erfolgreiche noch fehlgeschlagene Ereignisse.
+
+|^+
+|Auditiert keine erfolgreichen Ereignisse in dieser Klasse.
+
+|^-
+|Auditiert keine fehlgeschlagenen Ereignisse in dieser Klasse.
+|===
+
+Wenn kein Präfix vorhanden ist, werden sowohl erfolgreiche als auch fehlgeschlagene Ereignisse auditiert.
+
+Das folgende Beispiel einer Auswahl-Zeichenkette wählt erfolgreiche und gescheiterte Anmelde/Abmelde-Ereignisse aus, aber nur erfolgreich beendete Ausführungs-Ereignisse:
+
+[.programlisting]
+....
+lo,+ex
+....
+
+=== Konfigurationsdateien
+
+Die folgenden Konfigurationsdateien für Sicherheits-Auditing befinden sich in [.filename]#/etc/security#.
+
+* [.filename]#audit_class#: enthält die Definitionen der Audit-Klassen.
+* [.filename]#audit_control#: steuert die Eigenschaften des Audit-Subsystems, wie Standard-Audit-Klassen, Mindestfestplattenspeicher auf dem Audit-Log-Volume und die maximale Größe des Audit-Trails.
+* [.filename]#audit_event#: Namen und Beschreibungen der Audit-Ereignisse, und eine Liste von Klassen mit den dazugehörigen Ereignissen.
+* [.filename]#audit_user#: benutzerspezifische Audit-Anforderungen, kombinierbar mit den globalen Standardeinstellungen bei der Anmeldung.
+* [.filename]#audit_warn#: ein anpassbares Skript, das von man:auditd[8] verwendet wird, um in bestimmten Situationen Warnmeldungen zu generieren, z.B. wenn der Platz für Audit-Protokolle knapp wird, oder wenn die Datei des Audit-Trails rotiert wurde.
+
+[WARNING]
+====
+
+Konfigurationsdateien von Audit sollten sorgfältig bearbeitet und gepflegt werden, da Fehler in der Konfiguration zu einer fehlerhaften Protokollierung der Ereignisse führen können.
+====
+
+In den meisten Fällen wird der Administrator nur [.filename]#audit_control# und [.filename]#audit_user# anpassen müssen. Die erste Datei steuert systemweite Audit-Eigenschaften, sowie Richtlinien. Die zweite Datei kann für die Feinabstimmung bei der Auditierung von Benutzern verwendet werden.
+
+[[audit-auditcontrol]]
+==== Die [.filename]#audit_control#-Datei
+
+Die [.filename]#audit_control#-Datei legt eine Anzahl Vorgabewerte fest:
+
+[.programlisting]
+....
+dir:/var/audit
+dist:off
+flags:lo,aa
+minfree:5
+naflags:lo,aa
+policy:cnt,argv
+filesz:2M
+expire-after:10M
+....
+
+Die Option `dir` wird genutzt, um eines oder mehrere Verzeichnisse festzulegen, in welchen Audit-Protokolle gespeichert werden. Gibt es mehrere Verzeichniseinträge, werden diese in der angegebenen Reihenfolge genutzt, bis sie jeweils gefüllt sind. Es ist üblich, Audit so zu konfigurieren, dass die Audit-Logs auf einem dedizierten Dateisystem abgelegt werden, um Wechselwirkungen zwischen dem Audit-Subsystem und anderen Subsystemen zu verhindern, falls das Dateisystem voll läuft.
+
+Ist die Option `dist` auf `on` oder `yes` gesetzt, wird ein Link der Dateien des Audit-Trails in [.filename]#/var/audit/dist# erstellt.
+
+Das `flags`-Feld legt die systemweite Standard-Vorauswahl-Maske für attributierbare (direkt einem Benutzer zuordenbare) Ereignisse fest. Im obigen Beispiel werden alle gescheiterten und erfolgreichen Anmelde- und Abmelde-Ereignisse für alle Benutzer aufgezeichnet.
+
+Die Option `minfree` definiert den minimalen Prozentsatz an freiem Plattenplatz für das Dateisystem, in welchem der Audit-Pfad abgespeichert wird. Wenn diese Schwelle überschritten ist, wird ein Warnhinweis erzeugt.
+
+Die `naflags`-Option bestimmt diejenigen Audit-Klassen, für die nicht-attributierbare Ereignisse aufgezeichnet werden sollen, wie beispielsweise Anmeldeprozesse, Authentifizierung und Autorisierung.
+
+Die Option `policy` legt eine durch Kommata getrennte Liste von policy-Flags fest, welche verschiedene Aspekte des Audit-Verhaltens steuern. Der Flag `cnt` zeigt an, dass das System trotz eines Audit-Fehlers weiterlaufen soll (dieses Flag wird dringend empfohlen). Ein anderes, häufig genutztes Flag ist `argv`, welches dazu führt, dass Befehlszeilen-Argumente für den Systemaufruf man:execve[2] als Teil der Befehlsausführung aufgezeichnet werden.
+
+Die `filesz`-Option spezifiziert die maximale Größe der Audit-Datei, bevor sie automatisch beendet und rotiert wird. Der Wert `0` setzt die automatische Log-Rotation außer Kraft. Falls die angeforderte Dateigröße unterhalb des Minimums von 512K ist, dann wird die Angabe verworfen und ein Log-Hinweis wird erzeugt.
+
+Die Option `expire-after` legt fest, wann die Audit-Dateien verfallen und entfernt werden.
+
+[[audit-audituser]]
+==== Die Datei [.filename]#audit_user#
+
+Die [.filename]#audit_user#-Datei erlaubt es dem Administrator, weitere Audit-Erfordernisse für bestimmte Benutzer festzulegen. Jede Zeile konfiguriert das Auditing für einen Benutzer über zwei Felder: `alwaysaudit` gibt eine Ansammlung von Ereignissen vor, welche immer für diesen Benutzer aufgezeichnet werden. `neveraudit` legt Ereignisse fest, die niemals für diesen Benutzer auditiert werden sollen.
+
+Das folgende Beispiel einer [.filename]#audit_user#-Datei zeichnet Anmelde/Abmelde-Ereignisse, erfolgreiche Befehlsausführungen für den Benutzer `root`, Anlegen von Dateien und erfolgreiche Befehlsausführungen für den Benutzer `www` auf. Falls die voreingestellte [.filename]#audit_control# benutzt wird, dann ist der Eintrag `lo` für `root` überflüssig und Anmelde/Abmelde-Ereignisse werden für `www` ebenfalls aufgezeichnet.
+
+[.programlisting]
+....
+root:lo,+ex:no
+www:fc,+ex:no
+....
+
+[[audit-administration]]
+== Audit-Trails
+
+Weil Audit-Trails werden im binären BSM-Format gespeichert werden, gibt es verschiedene Werkzeuge, um derartige Dateien zu ändern oder sie in Textdateien zu konvertieren. Der Befehl `praudit` wandelt alle Pfad-Dateien in ein einfaches Textformat um. Der Befehl `auditreduce` kann genutzt werden, um die Pfad-Dateien für Analyse, Ausdruck, Archivierung oder andere Zwecke zu reduzieren. Eine Reihe von Auswahl-Parametern werden von man:auditreduce[1] unterstützt, einschließlich Ereignistyp, Ereignisklasse, Benutzer, Datum und Uhrzeit des Ereignisses und den Dateipfad oder das Objekt, mit dem gearbeitet wurde.
+
+Der folgende Befehl schreibt den gesamten Inhalt einer angegebenen Audit-Protokolldatei in eine Textdatei:
+
+[source,bash]
+....
+# praudit /var/audit/AUDITFILE
+....
+
+_AUDITFILE_ ist hier die zu schreibende Protokolldatei.
+
+Audit-Pfade bestehen aus einer Reihe von Datensätzen, die wiederum aus Kürzeln (token) gebildet werden, die von man:praudit[1] fortlaufend zeilenweise ausgegeben werden. Jedes Kürzel ist von einem bestimmten Typ, z.B. enthält `header` einen audit-Datensatz-Header oder `path` enthält einen Dateipfad von einer Suche. Hier ein Beispiel eines `execve`-Ereignisses:
+
+[.programlisting]
+....
+header,133,10,execve(2),0,Mon Sep 25 15:58:03 2006, + 384 msec
+exec arg,finger,doug
+path,/usr/bin/finger
+attribute,555,root,wheel,90,24918,104944
+subject,robert,root,wheel,root,wheel,38439,38032,42086,128.232.9.100
+return,success,0
+trailer,133
+....
+
+Dieser Audit stellt einen erfolgreichen `execve`-Aufruf dar, in welchem der Befehl `finger doug` ausgeführt wurde. `exec arg` enthält die Befehlszeile, welche die Shell an den Kernel weiterleitet. Das Kürzel `path` enthält den Pfad zur ausführbaren Datei (wie vom Kernel wahrgenommen). Das Kürzel `attribute` beschreibt die Binärdatei und enthält den Datei-Modus, der genutzt werden kann, um zu bestimmen, ob setuid auf die Applikation angewendet wurde. Das Kürzel `subject` speichert die Audit-Benutzer-ID, effektive Benutzer-ID und Gruppen-ID, wirkliche Benutzer-ID und Gruppen-ID, Prozess-ID, Session- ID, Port-ID und Anmelde-Adresse. Beachten Sie, dass Audit-Benutzer-ID und wirkliche Benutzer-ID abweichen, da der Benutzer `robert` zum Benutzer `root` wurde, bevor er diesen Befehl ausführte, aber er wird auditiert mit dem ursprünglich authentifizierten Benutzer. Das Kürzel `return` zeigt die erfolgreiche Ausführung an und `trailer` schließt den Datensatz ab.
+
+Die Ausgabe im XML-Format wird ebenfalls unterstützt und kann über die Option `-x` ausgewählt werden.
+
+Da Audit-Protokolldateien sehr groß sein können, kann mit Hilfe von `auditreduce` auch nur eine Teilmenge der Datensätze ausgewählt werden. Dieses Beispiel selektiert alle Datensätze des Benutzers `trhodes` aus der Datei [.filename]#AUDITFILE#:
+
+[source,bash]
+....
+# auditreduce -u trhodes /var/audit/AUDITFILE | praudit
+....
+
+Mitglieder der Gruppe `audit` sind berechtigt, Audit-Pfade in [.filename]#/var/audit# zu lesen. In der Voreinstellung ist diese Gruppe leer, daher kann nur der Benutzer `root` die Audit-Pfade lesen. Benutzer können der Gruppe `audit` hinzugefügt werden, um Rechte für Audit-Reviews zu gewähren. Da die Fähigkeit, Inhalte von Audit-Protokolldateien zu verfolgen, tiefgreifende Einblicke in das Verhalten von Benutzern und Prozessen erlaubt, wird empfohlen, dass die Gewährung von Rechten für Audit-Reviews mit Bedacht erfolgt.
+
+=== Aktive Überwachung mittels Audit-Pipes
+
+Audit-Pipes sind nachgebildete (geklonte) Pseudo-Geräte, welche es Applikationen erlauben, die laufenden Audit-Datensätze anzuzapfen. Dies ist vorrangig für Autoren von Intrusion Detection Software und Systemüberwachungsprogrammen von Bedeutung. Allerdings ist das Audit-Pipe-Gerät ein angenehmer Weg für den Administrator, aktive Überwachung zu gestatten, ohne Gefahr von Problemen durch Besitzerrechte der Audit-Pfad-Datei oder Unterbrechung des Stroms von Ereignissen durch Log-Rotation. Um den laufenden Audit-Ereignisstrom zu verfolgen, geben Sie folgendes ein:
+
+[source,bash]
+....
+# praudit /dev/auditpipe
+....
+
+In der Voreinstellung kann nur der Benutzer `root` auf die Audit-Pipe-Geräte-Knotenpunkte zugreifen. Um sie allen Mitgliedern der Gruppe `audit` zugänglich zu machen, fügen Sie eine `devfs`-Regel in [.filename]#/etc/devfs.rules# hinzu:
+
+[.programlisting]
+....
+add path 'auditpipe*' mode 0440 group audit
+....
+
+Lesen Sie man:devfs.rules[5] für weitere Informationen, wie das devfs-Dateisystem konfiguriert wird.
+
+[WARNING]
+====
+
+Es ist sehr leicht, Rückmeldungszyklen von Audit-Ereignissen hervorzurufen, in welcher das Betrachten des Resultates eines Audit-Ereignisses in die Erzeugung von mehr Audit-Ereignissen mündet. Wenn zum Beispiel der gesamte Netzwerk-I/O auditiert wird, während `praudit` in einer SSH-Sitzung gestartet wurde, dann wird ein kontinuierlicher, mächtiger Strom von Audit-Ereignissen erzeugt, da jedes ausgegebene Ereignis wiederum neue Ereignisse erzeugt. Daher ist anzuraten, `praudit` an einem Audit-Pipe-Gerät nur von Sitzungen anzuwenden (ohne feingranuliertes I/O-Auditing), um dies zu vermeiden.
+====
+
+=== Rotation und Komprimierung von Audit-Pfad-Dateien
+
+Audit-Pfade werden vom Kernel geschrieben und vom Audit-Daemon man:auditd[8] verwaltet. Administratoren sollten nicht versuchen, man:newsyslog.conf[5] oder andere Werkzeuge zu benutzen, um Audit-Protokolldateien direkt zu rotieren. Stattdessen sollte `audit` benutzt werden, um die Auditierung zu beenden, das Audit-System neu zu konfigurieren und eine Log-Rotation durchzuführen. Der folgende Befehl veranlasst den Audit-Daemon, eine neue Protokolldatei anzulegen und dem Kernel zu signalisieren, die neue Datei zu nutzen. Die alte Datei wird beendet und umbenannt. Ab diesem Zeitpunkt kann sie vom Administrator bearbeitet werden:
+
+[source,bash]
+....
+# audit -n
+....
+
+Falls der man:auditd[8]-Daemon gegenwärtig nicht läuft, wird dieser Befehl scheitern und eine Fehlermeldung wird ausgegeben.
+
+Durch das Hinzufügen der folgenden Zeile in [.filename]#/etc/crontab# wird die Log-Rotation alle zwölf Stunden durchgeführt:
+
+[.programlisting]
+....
+0 */12 * * * root /usr/sbin/audit -n
+....
+
+Die Änderung wird wirksam, sobald [.filename]#/etc/crontab# gespeichert wird.
+
+Die automatische Rotation der Audit-Pfad-Datei in Abhängigkeit von der Dateigröße ist möglich durch die Angabe der Option `filesz` in [.filename]#audit_control#. Dieser Vorgang ist in <<audit-auditcontrol>> beschrieben.
+
+Da Audit-Pfad-Dateien sehr groß werden können, ist es oft wünschenswert, Pfade zu komprimieren oder anderweitig zu archivieren, sobald sie vom Audit-Daemon geschlossen wurden. Das Skript [.filename]#audit_warn# kann genutzt werden, um angepasste Aktionen für eine Vielzahl von audit-bezogenen Ereignissen auszuführen, einschließlich der sauberen Beendigung von Audit-Pfaden, wenn diese geschlossen werden. Zum Beispiel kann man die folgenden Zeilen in [.filename]#/etc/security/audit_warn# aufnehmen, um Audit-Pfade beim Beenden zu komprimieren:
+
+[.programlisting]
+....
+#
+# Compress audit trail files on close.
+#
+if [ "$1" = closefile ]; then
+ gzip -9 $2
+fi
+....
+
+Andere Archivierungsaktivitäten können das Kopieren zu einem zentralen Server, die Löschung der alten Pfad-Dateien oder die Reduzierung des alten Audit-Pfades durch Entfernung nicht benötigter Datensätze einschließen. Dieses Skript wird nur dann ausgeführt, wenn die Audit-Pfad-Dateien sauber beendet wurden, daher wird es nicht auf Pfaden laufen, welche durch ein unsauberes Herunterfahren des Systems nicht beendet wurden.
diff --git a/documentation/content/de/books/handbook/basics/_index.adoc b/documentation/content/de/books/handbook/basics/_index.adoc
new file mode 100644
index 0000000000..792d30fc39
--- /dev/null
+++ b/documentation/content/de/books/handbook/basics/_index.adoc
@@ -0,0 +1,1577 @@
+---
+title: Kapitel 3. Grundlagen des FreeBSD Betriebssystems
+part: Teil I. Erste Schritte
+prev: books/handbook/bsdinstall
+next: books/handbook/ports
+---
+
+[[basics]]
+= Grundlagen des FreeBSD Betriebssystems
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 3
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/basics/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/basics/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/basics/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[basics-synopsis]]
+== Übersicht
+
+Dieses Kapitel umfasst die grundlegenden Kommandos und Funktionsweisen des FreeBSD-Betriebssystems. Viel von diesem Material gilt auch für jedes andere UNIX(R)-artige System. Neue Benutzer von FreeBSD sollten dieses Kapitel aufmerksam lesen.
+
+Dieser Abschnitt behandelt die folgenden Themen:
+
+* virtuelle Konsolen,
+* Erstellung und Verwaltung von Benutzern und Gruppen in FreeBSD,
+* Zugriffsrechte unter UNIX(R) sowie Datei-Flags unter FreeBSD,
+* Zugriffskontrolllisten für Dateisysteme,
+* die Verzeichnisstruktur von FreeBSD,
+* Organisation von Dateisystemen unter FreeBSD,
+* Ein- und Abhängen von Dateisystemen,
+* Prozesse, Dämonen und Signale,
+* Shells und die Login-Umgebung,
+* Texteditoren,
+* Geräte und Gerätedateien,
+* wie Sie in den Manualpages nach weiteren Informationen suchen können.
+
+[[consoles]]
+== Virtuelle Konsolen und Terminals
+
+Wenn das FreeBSD-System so konfiguriert wurde, dass es ohne eine grafische Benutzeroberfläche startet, wird das System nach dem Start einen Anmeldeprompt ausgeben, wie in diesem Beispiel zu sehen:
+
+[source,bash]
+....
+FreeBSD/amd64 (pc3.example.org) (ttyv0)
+
+login:
+....
+
+Die erste Zeile enthält einige Informationen über das System. `amd64` zeigt an, dass auf dem System in diesem Beispiel eine 64-Bit Version von FreeBSD läuft. Der Hostname ist `pc3.example.org` und [.filename]#ttyv0# gibt an, dass dies die "Systemkonsole" ist. Die zweite Zeile zeigt den Anmeldeprompt.
+
+Da FreeBSD ein Mehrbenutzersystem ist, muss es die verschiedenen Benutzer voneinander unterscheiden können. Dies wird dadurch erreicht, dass sich jeder Benutzer zuerst am System anmelden muss, um Zugriff auf die Programme zu bekommen. Jeder Benutzer hat einen eindeutigen "Benutzernamen" und ein persönliches "Kennwort".
+
+Um sich auf der Systemkonsole anzumelden, geben Sie den Benutzernamen ein, der während der Systeminstallation, wie in crossref:bsdinstall[bsdinstall-addusers,Benutzer hinzufügen] beschrieben, konfiguriert wurde und drücken Sie kbd:[Enter]. Geben Sie dann das zum Benutzernamen zugeordnete Passwort ein und drücken kbd:[Enter]. Das Passwort wird aus Sicherheitsgründen _nicht angezeigt_.
+
+Sobald das richtige Passwort eingegeben wird, wird die Nachricht des Tages (MOTD) gefolgt von einer Eingabeaufforderung ausgegeben. In Abhängigkeit der verwendeten Shell des Benutzers wird der Prompt mit dem Zeichen `#`, `$` oder `%` dargestellt. Der Prompt zeigt an, dass der Benutzer jetzt an der FreeBSD Systemkonsole angemeldet ist und nun alle verfügbaren Befehle probieren kann.
+
+[[consoles-virtual]]
+=== Virtuelle Konsolen
+
+Obwohl die Systemkonsole dazu verwendet werden kann, um mit dem System zu interagieren, wird sich ein Benutzer in der Regel an einer virtuellen Konsole im FreeBSD-System anmelden. Das liegt daran, dass die Systemmeldungen standardmäßig auf der Systemkonsole angezeigt werden und somit die Meldungen des Befehls oder einer Datei, die der Benutzer gerade bearbeitet, überschrieben werden.
+
+In der Voreinstellung ist FreeBSD so konfiguriert, dass viele virtuelle Konsolen zur Eingabe von Befehlen zur Verfügung stehen. Jede virtuelle Konsole verfügt über einen eigenen Anmeldeprompt und eine Shell. Sie können ganz einfach zwischen den virtuellen Konsolen umschalten. Dies ist vergleichbar mit mehreren geöffneten Fenstern in einer graphischen Umgebung.
+
+Die Tastenkombinationen kbd:[Alt+F1] bis kbd:[Alt+F8] sind in FreeBSD zum Umschalten zwischen virtuellen Konsolen reserviert. Verwenden Sie kbd:[Alt+F1] um auf die Systemkonsole ([.filename]#ttyv0#) zu wechseln, kbd:[Alt+F2] für die erste virtuelle Konsole ([.filename]#ttyv1#, kbd:[Alt+F3] für die zweite virtuelle Konsole ([.filename]#ttyv2#, und so weiter. Wenn Sie Xorg als graphische Oberfläche benutzen, können Sie mit kbd:[Strg]kbd:[Alt]kbd:[F1] zur virtuellen Konsole zurückkehren.
+
+Beim Wechsel von einer Konsole zur nächsten wird die Bildschirmausgabe von FreeBSD verwaltet. Dies erzeugt die Illusion mehrerer Bildschirme und Tastaturen, an denen Kommandos abgesetzt werden können. Die Programme, die in einer virtuellen Konsole gestartet werden, laufen auch dann weiter, wenn der Benutzer auf eine andere virtuelle Konsole wechselt.
+
+Lesen Sie man:kbdcontrol[1], man:vidcontrol[1], man:atkbd:[4], man:syscons[4] sowie man:vt[4] für eine recht technische Beschreibung der FreeBSD-Konsole und der Tastatur-Treiber.
+
+In FreeBSD wird die Anzahl der verfügbaren virtuellen Konsolen in diesem Abschnitt von [.filename]#/etc/ttys# konfiguriert:
+
+[.programlisting]
+....
+# name getty type status comments
+#
+ttyv0 "/usr/libexec/getty Pc" xterm on secure
+# Virtual terminals
+ttyv1 "/usr/libexec/getty Pc" xterm on secure
+ttyv2 "/usr/libexec/getty Pc" xterm on secure
+ttyv3 "/usr/libexec/getty Pc" xterm on secure
+ttyv4 "/usr/libexec/getty Pc" xterm on secure
+ttyv5 "/usr/libexec/getty Pc" xterm on secure
+ttyv6 "/usr/libexec/getty Pc" xterm on secure
+ttyv7 "/usr/libexec/getty Pc" xterm on secure
+ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure
+....
+
+Um eine virtuelle Konsole zu deaktivieren, setzen Sie ein Kommentarzeichen (`#` an den Anfang der Zeile für die entsprechende Konsole. Um bspw. die Anzahl der verfügbaren virtuellen Konsolen von acht auf vier zu reduzieren, setzen Sie ein `#` an den Anfang der letzten vier Zeilen, den virtuellen Konsolen [.filename]#ttyv5# bis [.filename]#ttyv8#. Kommentieren Sie nicht die Zeile für die Systemkonsole [.filename]#ttyv0# aus! Beachten Sie, dass die letzte virtuelle Konsole ([.filename]#ttyv8#) zum Wechsel auf die graphische Oberfläche gedacht ist, wenn Xorg wie im crossref:x11[x11,Das X-Window-System] installiert und konfiguriert ist.
+
+man:ttys[5] enthält eine ausführliche Beschreibung der Spalten dieser Datei und der verfügbaren Optionen für virtuelle Konsolen.
+
+[[consoles-singleuser]]
+=== Single-User-Modus
+
+Das FreeBSD Boot-Menü verfügt über eine Option "Boot Single User". Wird diese Option gewählt, bootet das System in einen speziellen Modus, der als "Single-User-Modus" bekannt ist. Dieser Modus wird normalerweise zur Reparatur des Systems verwendet, bspw. wenn das System nicht mehr startet, oder das `root`-Passwort zurückgesetzt werden muss. Im Single-User-Modus haben Sie keinen Zugriff auf das Netzwerk und es stehen Ihnen keine weiteren virtuellen Konsolen zur Verfügung. Allerdings haben Sie vollen Zugriff auf das System und in der Voreinstellung wird das `root`-Passwort nicht benötigt. Aus diesem Grund wird ein physischer Zugriff auf die Tastatur benötigt, um in diesem Modus zu booten. Zur Absicherung eines FreeBSD-Systems sollte ermittelt werden, welche Personen physischen Zugriff auf die Tastatur bekommen sollen.
+
+Die Einstellungen für den Single-User-Modus befinden sich diesem Abschnitt von [.filename]#/etc/ttys#:
+
+[.programlisting]
+....
+# name getty type status comments
+#
+# If console is marked "insecure", then init will ask for the root password
+# when going to single-user mode.
+console none unknown off secure
+....
+
+In der Voreinstellung ist der Status auf `secure` eingestellt. Das setzt voraus, dass der physische Zugriff auf die Tastatur entweder unwichtig ist, oder über eine Sicherheitsrichtlinie geregelt wird. Wenn der Status auf `insecure` eingestellt wird, wird davon ausgegangen, dass die Umgebung selbst unsicher ist, da jeder Zugriff auf die Tastatur hat. FreeBSD wird dann nach dem `root`-Passwort fragen, wenn ein Benutzer versucht in den Single-User-Modus zu booten.
+
+[NOTE]
+====
+__Setzen Sie `insecure` nicht leichtfertig ein__! Wenn das `root`-Passwort vergessen wird, wird es schwierig in den Single-User-Modus zu gelangen, wenn man den Bootprozess von FreeBSD nicht genau versteht.
+====
+
+[[consoles-vidcontrol]]
+=== Den Videomodus der Konsole anpassen
+
+Der Standard-Videomodus der FreeBSD-Konsole kann auf jeden Modus eingestellt werden, der von der Grafikkarte und dem Monitor unterstützt wird (beispielsweise 1024x768 oder 1280x1024). Um eine andere Einstellung zu verwenden, muss das `VESA`-Modul geladen werden:
+
+[source,bash]
+....
+# kldload vesa
+....
+
+Um festzustellen, welche Video-Modi von der Hardware unterstützt werden, nutzen Sie man:vidcontrol[1]. Um eine Liste aller unterstützten Modi zu sehen, verwenden Sie diesen Befehl:
+
+[source,bash]
+....
+# vidcontrol -i mode
+....
+
+Die Ausgabe dieses Befehls listet alle Videomodi, die von der Hardware unterstützt werden. Um einen neuen Video-Modi zu wählen, wird der entsprechende Modus als `root`-Benutzer an man:vidcontrol[1] übergeben:
+
+[source,bash]
+....
+# vidcontrol MODE_279
+....
+
+Um diese Einstellung dauerhaft zu speichern, muss folgende Zeile in [.filename]#/etc/rc.conf# hinzugefügt werden:
+
+[.programlisting]
+....
+allscreens_flags="MODE_279"
+....
+
+[[users-synopsis]]
+== Benutzer und grundlegende Account-Verwaltung
+
+FreeBSD ermöglicht es mehreren Benutzern, den Computer zur selben Zeit zu benutzen. Es kann immer nur ein Benutzer vor der Konsole sitzen, aber es können sich beliebig viele Benutzer über das Netzwerk am System anmelden. Jeder Benutzer muss einen Account haben, um das System benutzen zu können.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie
+
+* die verschiedenen Account-Typen von FreeBSD kennen,
+* wissen, wie Sie Accounts angelegen, verändern oder löschen,
+* wissen, wie Sie Limits für einen Benutzer oder eine Gruppe setzen, um beispielsweise Ressourcen, wie Speicher oder CPU-Zeit einzuschränken,
+* wissen, wie Sie Gruppen erstellen und Benutzer zu diesen Gruppen hinzufügen.
+
+[[users-introduction]]
+=== Account-Typen
+
+Jeder Zugriff auf das FreeBSD-System geschieht über Accounts und alle Prozesse werden von Benutzern gestartet, also sind Benutzer- und Account-Verwaltung von wesentlicher Bedeutung.
+
+Es gibt drei Haupttypen von Accounts: Systembenutzer, Benutzer-Accounts und der Superuser-Account.
+
+[[users-system]]
+==== Systembenutzer
+
+Systembenutzer starten Dienste wie DNS, Mail-Server und Web-Server. Der Grund dafür ist die Sicherheit; wenn die Programme von dem Superuser gestartet werden, können Sie ohne Einschränkungen handeln.
+
+Beispiele von Systembenutzern sind `daemon`, `operator`, `bind`, `news` und `www`.
+
+[WARNING]
+====
+
+Bei der Verwendung der Gruppe `operator` ist Vorsicht geboten, da dem Benutzer unbeabsichtigt Privilegien gewährt werden könnten, beispielsweise zum Herunterfahren oder Neustarten des Systems, oder der Zugriff auf alle Geräte in [.filename]#/dev#.
+====
+
+`nobody` ist der generische unprivilegierte Systembenutzer. Bedenken Sie aber, dass je mehr Dienste `nobody` benutzen, desto mehr Dateien und Prozesse diesem Benutzer gehören und dieser Benutzer damit umso privilegierter wird.
+
+[[users-user]]
+==== Benutzer-Accounts
+
+Benutzer-Accounts sind realen Personen zugeordnet und sind das primäre Mittel des Zugriffs das System. Jede Person, die Zugriff auf das System bekommt, sollte einen eindeutigen Benutzer-Account besitzen. Dies erlaubt es dem Administrator herauszufinden, wer was macht. Gleichzeitig werden die Benutzer daran gehindert, die Einstellungen anderer Benutzer zu zerstören.
+
+Jeder Benutzer kann die eigene Umgebung anpassen, bspw. seine voreingestellte Shell, Editor, Tastenbelegungen und Spracheinstellungen.
+
+Mit jedem Account eines FreeBSD-Systems sind bestimmte Informationen verknüpft:
+
+Loginnamen::
+Der Loginname wird am `login:` Prompt eingegeben. Jeder Benutzer muss einen eindeutigen Benutzernamen haben. Es gibt eine Reihe von Regeln für die Erstellung von gültigen Loginnamen, die in man:passwd[5] dokumentiert sind. Es wird aus Kompatibilitätsgründen empfohlen, Benutzernamen zu verwenden, die aus Kleinbuchstaben bestehen und bis zu acht Zeichen lang sind.
+
+Passwort::
+Jeder Account ist mit einem Passwort verknüpft.
+
+User ID (UID)::
+Die User ID (UID) ist eine Zahl, die verwendet wird, um die Benutzer auf dem FreeBSD-System eindeutig zu identifizieren. Programme, die einen Loginnamen akzeptieren, wandeln diesen zuerst in eine UID um. Es wird empfohlen, nur UIDs kleiner 65535 zu verwenden, da höhere Werte Kompatibilitätsprobleme mit einigen Anwendungen verursachen können.
+
+Group ID (GID)::
+Die Group ID (GID) ist eine Zahl, die verwendet wird, um die primäre Gruppe eines Benutzers eindeutig zu identifizieren. Gruppen sind ein Mechanismus zur Steuerung des Zugriffs auf Ressourcen über die GID eines Benutzers anstelle der UID. Dies kann die Größe einiger Konfigurationsdateien signifikant reduzieren und ermöglicht es Benutzern, Mitglied mehreren Gruppen zu sein. Es wird empfohlen, GIDs kleiner 65535 zu verwenden, da höhere Werte bei einigen Anwendungen große Probleme verursachen können.
+
+Login-Klasse::
+Login-Klassen erweitern das Gruppenkonzept. Sie erhöhen die Flexibilität des Systems in der Handhabung der verschiedenen Accounts. Login-Klassen werden auch im crossref:security[users-limiting,Login-Klassen konfigurieren] diskutiert.
+
+Gültigkeit von Passwörtern::
+In der Voreinstellung verfallen Passwörter nicht. Allerdings können Passwortwechsel nach einer gewissen Zeit auf Basis einzelner Accounts erzwungen werden.
+
+Verfallszeit eines Accounts::
+In der Voreinstellung verfallen unter FreeBSD keine Accounts. Wenn Sie Accounts einrichten, die nur für eine bestimmte Zeit gültig sein sollen, beispielsweise Accounts für Teilnehmer eines Praktikums, können Sie mit man:pw[8] die Gültigkeitsdauer des Accounts angeben. Nachdem die angegebene Zeitspanne verstrichen ist, kann dieser Account nicht mehr zum Anmelden verwendet werden, obwohl alle Verzeichnisse und Dateien, die diesem Account gehören, noch vorhanden sind.
+
+vollständiger Benutzername::
+FreeBSD identifiziert einen Account eindeutig über den Loginnamen, der aber keine Ähnlichkeit mit dem richtigen Namen des Benutzers haben muss. Ähnlich wie bei einem Kommentar, kann diese Information Leerzeichen, Großbuchstaben und mehr als 8 Zeichen enthalten.
+
+Heimatverzeichnis::
+Das Heimatverzeichnis gibt den vollständigen Pfad zu dem Verzeichnis an, in dem sich der Benutzer nach erfolgreicher Anmeldung befindet. Es ist üblich, alle Heimatverzeichnisse unter [.filename]#/home/Loginname# oder [.filename]#/usr/home/Loginname# anzulegen. Im Heimatverzeichnis oder in dort angelegten Verzeichnissen werden die Dateien eines Benutzers gespeichert.
+
+Login-Shell::
+Grundsätzlich ist die Shell, von denen es viele unterschiedliche gibt, eine Schnittstelle zum System. Die bevorzugte Shell eines Benutzers kann seinem Account zugeordnet werden.
+
+[[users-superuser]]
+==== Der Superuser-Account
+
+Der Superuser-Account, normalerweise `root` genannt, ist vorkonfiguriert und erleichtert die Systemverwaltung, sollte aber nicht für alltägliche Aufgaben wie das Verschicken und Empfangen von Mails, Erforschen des Systems oder Programmierung benutzt werden.
+
+Der Superuser kann, im Gegensatz zu normalen Benutzer-Accounts, ohne Beschränkungen operieren und die falsche Anwendung des Superuser-Accounts kann in spektakulären Katastrophen resultieren. Benutzer-Accounts sind nicht in der Lage, das System versehentlich zu zerstören, deswegen wird empfohlen, normale Benutzer-Accounts zu verwenden, solange nicht zusätzliche Privilegien benötigt werden.
+
+Kommandos, die Sie als Superuser eingeben, sollten Sie immer doppelt und dreifach überprüfen, da ein zusätzliches Leerzeichen oder ein fehlender Buchstabe irreparablen Datenverlust bedeuten kann.
+
+Es gibt mehrere Möglichkeiten Superuser-Rechte zu bekommen. Obwohl man sich direkt als `root` anmelden kann, wird von dieser Methode dringend abgeraten.
+
+Verwenden Sie stattdessen man:su[1] um zum Superuser zu werden. Wenn Sie noch ein `-` eingeben, wird der Benutzer auch die Umgebung des Root-Benutzers erben. Der Benutzer, der diesen Befehl ausführt muss Mitglied der Gruppe `wheel` sein, oder der Befehl schlägt fehl. Zudem muss der Benutzer das Kennwort für den Benutzer-Account `root` kennen.
+
+In diesem Beispiel wird der Benutzer nur zum Superuser, um `make install` auszuführen, da dieser Befehl Superuser-Rechte erfordert. Nachdem der Befehl ausgeführt wurde, kann der Benutzer `exit` eingeben, um den Superuser-Account zu verlassen und zu den Privilegien des Benutzer-Accounts zurückkehren.
+
+.Ein Programm als Superuser installieren
+[example]
+====
+
+[source,bash]
+....
+% configure
+% make
+% su -
+Password:
+# make install
+# exit
+%
+....
+
+====
+
+Das in FreeBSD enthaltene man:su[1] funktioniert gut für einzelne Systeme oder in kleineren Netzwerken, mit nur einem Administrator. Eine Alternative ist es, das Paket oder den Port package:security/sudo[] zu installieren. Diese Software bietet eine Protokollierung von Aktivitäten und ermöglicht es dem Administrator zu bestimmen, welche Benutzer welche Befehle als Superuser ausführen dürfen.
+
+[[users-modifying]]
+=== Accounts verändern
+
+FreeBSD stellt eine Vielzahl an Programmen bereit, um Accounts zu verändern. Die gebräuchlichsten Kommandos sind in <<users-modifying-utilities>> gefolgt von einer detaillierten Beschreibung, zusammengefasst. Weitere Informationen und Anwendungsbeispiele finden Sie in der Manualpage des jeweiligen Programms.
+
+[[users-modifying-utilities]]
+.Programme zur Verwaltung von Benutzer-Accounts
+[cols="10%,90%", frame="none", options="header"]
+|===
+| Programm
+| Zusammenfassung
+
+|man:adduser[8]
+|Das empfohlene Werkzeug, um neue Accounts zu erstellen.
+
+|man:rmuser[8]
+|Das empfohlene Werkzeug, um Accounts zu löschen.
+
+|man:chpass[1]
+|Ein flexibles Werkzeug, um Informationen in der Account-Datenbank zu verändern.
+
+|man:passwd[1]
+|Ein Werkzeug, um Passwörter von Accounts zu ändern.
+
+|man:pw[8]
+|Ein mächtiges und flexibles Werkzeug um alle Informationen über Accounts zu ändern.
+|===
+
+[[users-adduser]]
+==== `adduser`
+
+Das empfohlene Programm zum Hinzufügen neuer Benutzer ist man:adduser[8]. Wenn ein neuer Benutzer hinzugefügt wird, aktualisiert das Programm automatisch [.filename]#/etc/passwd# und [.filename]#/etc/group#. Es erstellt auch das Heimatverzeichnis für den Benutzer, kopiert die Standardkonfigurationsdateien aus [.filename]#/usr/shared/skel# und kann optional eine ,,Willkommen``-Nachricht an den neuen Benutzer versenden. Das Programm muss als Superuser ausgeführt werden.
+
+Das Werkzeug man:adduser[8] arbeitet interaktiv und führt durch die einzelnen Schritte, wenn ein neues Benutzerkonto erstellt wird. Wie in <<users-modifying-adduser>> zu sehen ist, müssen Sie entweder die benötigte Information eingeben oder kbd:[Return] drücken, um den Vorgabewert in eckigen Klammern zu akzeptieren. In diesem Beispiel wird der Benutzer in die Gruppe `wheel` aufgenommen, was es ihm erlaubt mit man:su[1] zum Superuser zu werden. Wenn Sie fertig sind, können Sie entweder einen weiteren Benutzer erstellen oder das Programm beenden.
+
+[[users-modifying-adduser]]
+.Einen Benutzer unter FreeBSD anlegen
+[example]
+====
+
+[source,bash]
+....
+# adduser
+Username: jru
+Full name: J. Random User
+Uid (Leave empty for default):
+Login group [jru]:
+Login group is jru. Invite jru into other groups? []: wheel
+Login class [default]:
+Shell (sh csh tcsh zsh nologin) [sh]: zsh
+Home directory [/home/jru]:
+Home directory permissions (Leave empty for default):
+Use password-based authentication? [yes]:
+Use an empty password? (yes/no) [no]:
+Use a random password? (yes/no) [no]:
+Enter password:
+Enter password again:
+Lock out the account after creation? [no]:
+Username : jru
+Password : ****
+Full Name : J. Random User
+Uid : 1001
+Class :
+Groups : jru wheel
+Home : /home/jru
+Shell : /usr/local/bin/zsh
+Locked : no
+OK? (yes/no): yes
+adduser: INFO: Successfully added (jru) to the user database.
+Add another user? (yes/no): no
+Goodbye!
+#
+....
+
+====
+
+[NOTE]
+====
+Wenn Sie das Passwort eingeben, werden weder Passwort noch Sternchen angezeigt. Passen Sie auf, dass Sie das Passwort korrekt eingeben.
+====
+
+[[users-rmuser]]
+==== `rmuser`
+
+Benutzen Sie man:rmuser[8] als Superuser, um einen Account vollständig aus dem System zu entfernen. Dieses Programm führt die folgenden Schritte durch:
+
+[.procedure]
+. Entfernt den man:crontab[1] Eintrag des Benutzers, wenn dieser existiert.
+. Entfernt alle man:at[1] jobs, die dem Benutzer gehören.
+. Schließt alle Prozesse des Benutzers.
+. Entfernt den Benutzer aus der lokalen Passwort-Datei des Systems.
+. Entfernt optional das Heimatverzeichnis des Benutzers, falls es dem Benutzer gehört.
+. Entfernt eingegangene E-Mails des Benutzers aus [.filename]#/var/mail#.
+. Entfernt alle Dateien des Benutzers aus temporären Dateispeicherbereichen wie [.filename]#/tmp#.
+. Entfernt den Loginnamen von allen Gruppen, zu denen er gehört, aus [.filename]#/etc/group#. Wenn eine Gruppe leer wird und der Gruppenname mit dem Loginnamen identisch ist, wird die Gruppe entfernt. Das ergänzt sich mit den einzelnen Benutzer-Gruppen, die von man:adduser[8] für jeden neuen Benutzer erstellt werden.
+
+Der Superuser-Account kann nicht mit man:rmuser[8] entfernt werden, da dies in den meisten Fällen das System unbrauchbar macht.
+
+Als Vorgabe wird ein interaktiver Modus benutzt.
+
+.Interaktives Löschen von Accounts mit `rmuser`
+[example]
+====
+
+[source,bash]
+....
+# rmuser jru
+Matching password entry:
+jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
+Is this the entry you wish to remove? y
+Remove user's home directory (/home/jru)? y
+Removing user (jru): mailspool home passwd.
+#
+....
+
+====
+
+[[users-chpass]]
+==== `chpass`
+
+Jeder Benutzer kann man:chpass[1] verwenden, um die Shell und persönliche Informationen des Benutzerkontos zu verändern. Der Superuser kann dieses Werkzeug benutzen, um zusätzliche Kontoinformationen für alle Benutzer zu ändern.
+
+Werden neben dem optionalen Loginnamen keine weiteren Optionen angegeben, zeigt man:chpass[1] einen Editor mit Account-Informationen an. Wenn der Benutzer den Editor verlässt, wird die Account-Datenbank mit den neuen Informationen aktualisiert.
+
+[NOTE]
+====
+Dieses Programm fragt nach dem Verlassen des Editors nach dem Passwort, es sei denn, man ist als Superuser angemeldet.
+====
+
+In <<users-modifying-chpass-su>> hat der Superuser `chpass jru` eingegeben. Es werden die Felder ausgegeben, die für diesen Benutzer geändert werden können. Wenn stattdessen `jru` diesen Befehl aufruft, werden nur die letzten sechs Felder ausgegeben. Dies ist in <<users-modifying-chpass-ru>> zu sehen.
+
+[[users-modifying-chpass-su]]
+.`chpass` als Superuser verwenden
+[example]
+====
+
+[source,bash]
+....
+#Changing user database information for jru.
+Login: jru
+Password: *
+Uid [#]: 1001
+Gid [# or name]: 1001
+Change [month day year]:
+Expire [month day year]:
+Class:
+Home directory: /home/jru
+Shell: /usr/local/bin/zsh
+Full Name: J. Random User
+Office Location:
+Office Phone:
+Home Phone:
+Other information:
+....
+
+====
+
+[[users-modifying-chpass-ru]]
+.`chpass` als normaler Benutzer verwenden
+[example]
+====
+
+[source,bash]
+....
+#Changing user database information for jru.
+Shell: /usr/local/bin/tcsh
+Full Name: J. Random User
+Office Location:
+Office Phone:
+Home Phone:
+Other information:
+....
+
+====
+
+[NOTE]
+====
+Die Kommandos man:chfn[1] und man:chsh[1] sind nur Verweise auf man:chpass[1], genauso wie man:ypchpass[1], man:ypchfn[1] und man:ypchsh[1]. Da NIS automatisch unterstützt wird, ist es nicht notwendig das `yp` vor dem Kommando einzugeben. NIS wird später im crossref:network-servers[network-servers,Netzwerkserver] besprochen.
+====
+
+[[users-passwd]]
+==== passwd
+
+Jeder Benutzer kann mit man:passwd[1] einfach sein Passwort ändern. Um eine versehentliche oder unbefugte Änderung zu verhindern, muss bei einem Passwortwechsel zunächst das ursprüngliche Passwort eingegeben werden, bevor das neue Passwort festgelegt werden kann.
+
+.Das eigene Passwort wechseln
+[example]
+====
+
+[source,bash]
+....
+% passwd
+Changing local password for jru.
+Old password:
+New password:
+Retype new password:
+passwd: updating the database...
+passwd: done
+....
+
+====
+
+Der Superuser kann jedes beliebige Passwort ändern, indem er den Benutzernamen an man:passwd[1] übergibt. Das Programm fordert den Superuser nicht dazu auf, das aktuelle Passwort des Benutzers einzugeben. Dadurch kann das Passwort geändert werden, falls der Benutzer sein ursprüngliches Passwort vergessen hat.
+
+.Als Superuser das Passwort eines anderen Accounts verändern
+[example]
+====
+
+[source,bash]
+....
+# passwd jru
+Changing local password for jru.
+New password:
+Retype new password:
+passwd: updating the database...
+passwd: done
+....
+
+====
+
+[NOTE]
+====
+Wie bei man:chpass[1] ist man:yppasswd[1] nur ein Verweis auf man:passwd[1]. NIS wird von jedem dieser Kommandos unterstützt.
+====
+
+[[users-pw]]
+==== `pw`
+
+Mit dem Werkzeug man:pw[8] können Accounts und Gruppen erstellt, entfernt, verändert und angezeigt werden. Dieses Kommando dient als Schnittstelle zu den Benutzer- und Gruppendateien des Systems. man:pw[8] besitzt eine Reihe mächtiger Kommandozeilenschalter, die es für die Benutzung in Shell-Skripten geeignet machen, doch finden neue Benutzer die Bedienung des Kommandos komplizierter, als die der anderen hier vorgestellten Kommandos.
+
+[[users-groups]]
+=== Gruppen
+
+Eine Gruppe ist einfach eine Zusammenfassung von Accounts. Gruppen werden durch den Gruppennamen und die GID identifiziert. Der Kernel von FreeBSD entscheidet anhand der UID und der Gruppenmitgliedschaft eines Prozesses, ob er dem Prozess etwas erlaubt oder nicht. Wenn jemand von der GID eines Benutzers oder Prozesses spricht, meint er damit meistens die erste Gruppe der Gruppenliste.
+
+Die Zuordnung von Gruppennamen zur GID steht in [.filename]#/etc/group#, einer Textdatei mit vier durch Doppelpunkte getrennten Feldern. Im ersten Feld steht der Gruppenname, das zweite enthält ein verschlüsseltes Passwort, das dritte gibt die GID an und das vierte besteht aus einer Komma separierten Liste der Mitglieder der Gruppe. Eine ausführliche Beschreibung der Syntax dieser Datei finden Sie in man:group[5].
+
+Wenn Sie [.filename]#/etc/group# nicht von Hand editieren möchten, können Sie man:pw[8] zum Editieren benutzen. Das folgende Beispiel zeigt das Hinzufügen einer Gruppe mit dem Namen `teamtwo`:
+
+.Setzen der Mitgliederliste einer Gruppe mit man:pw[8]
+[example]
+====
+
+[source,bash]
+....
+# pw groupadd teamtwo
+# pw groupshow teamtwo
+teamtwo:*:1100:
+....
+
+====
+
+`1100` ist die GID der Gruppe `teamtwo`. Momentan hat `teamtwo` noch keine Mitglieder. Mit dem folgenden Kommando wird der Benutzer `jru` in die Gruppe `teamtwo` aufgenommen.
+
+.Ein Gruppenmitglied mit man:pw[8] hinzufügen
+[example]
+====
+
+[source,bash]
+....
+# pw groupmod teamtwo -M jru
+# pw groupshow teamtwo
+teamtwo:*:1100:jru
+....
+
+====
+
+Als Argument von `-M` geben Sie eine Komma separierte Liste von Mitgliedern an, die in die Gruppe aufgenommen werden sollen. Aus den vorherigen Abschnitten ist bekannt, dass die Passwort-Datei ebenfalls eine Gruppe für jeden Benutzer enthält. Das System teilt dem Benutzer automatisch eine Gruppe zu, die aber vom `groupshow` Kommando von man:pw[8] nicht angezeigt wird. Diese Information wird allerdings von man:id[1] und ähnlichen Werkzeugen angezeigt. Das heißt, dass man:pw[8] nur [.filename]#/etc/group# manipuliert, es wird nicht versuchen, zusätzliche Informationen aus [.filename]#/etc/passwd# zu lesen.
+
+.Hinzufügen eines neuen Gruppenmitglieds mittels man:pw[8]
+[example]
+====
+
+[source,bash]
+....
+# pw groupmod teamtwo -m db
+# pw groupshow teamtwo
+teamtwo:*:1100:jru,db
+....
+
+====
+
+Die Argumente zur Option `-m` ist eine durch Komma getrennte Liste von Benutzern, die der Gruppe hinzugefügt werden sollen. Anders als im vorherigen Beispiel werden diese Benutzer in die Gruppe aufgenommen und ersetzen nicht die bestehenden Benutzer in der Gruppe.
+
+.Mit `id` die Gruppenzugehörigkeit bestimmen
+[example]
+====
+
+[source,bash]
+....
+% id jru
+uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)
+....
+
+====
+
+In diesem Beispiel ist `jru` Mitglied von `jru` und `teamtwo`.
+
+Weitere Informationen zu diesem Befehl und dem Format von [.filename]#/etc/group# finden Sie in man:pw[8] und man:group[5].
+
+[[permissions]]
+== Zugriffsrechte
+
+In FreeBSD besitzt jede Datei und jedes Verzeichnis einen Satz von Zugriffsrechten. Es stehen mehrere Programme zum Anzeigen und Bearbeiten dieser Rechte zur Verfügung. Ein Verständnis für die Funktionsweise von Zugriffsrechten ist notwendig, um sicherzustellen, dass Benutzer nur auf die von ihnen benötigten Dateien zugreifen können und nicht auf die Dateien des Betriebssystems oder von anderen Benutzern.
+
+In diesem Abschnitt werden die traditionellen Zugriffsrechte von UNIX(R) beschrieben. Informationen zu feingranularen Zugriffsrechten für Dateisysteme finden Sie im crossref:security[fs-acl,Zugriffskontrolllisten für Dateisysteme (ACL)].
+
+In UNIX(R) werden die grundlegenden Zugriffsrechte in drei Typen unterteilt: Lesen, Schreiben und Ausführen. Diese Zugriffstypen werden verwendet, um den Dateizugriff für den Besitzer der Datei, die Gruppe und alle anderen zu bestimmen. Die Lese-, Schreib- und Ausführungsberechtigungen werden mit den Buchstaben `r`, `w` und `x` dargestellt. Alternativ können die Berechtigungen als binäre Zahlen dargestellt werden, da jede Berechtigung entweder aktiviert oder deaktiviert (`0`) ist. Wenn die Berechtigung als Zahl dargestellt wird, ist die Reihenfolge immer als `rwx` zu lesen, wobei `r` den Wert `4` hat, `w` den Wert `2` und `x` den Wert `1`.
+
+In Tabelle 4.1 sind die einzelnen nummerischen und alphabetischen Möglichkeiten zusammengefasst. Das Zeichen `-` in der Spalte "Auflistung im Verzeichnis" besagt, dass eine Berechtigung deaktiviert ist.
+
+.UNIX(R) Zugriffsrechte
+[cols="10%,50%,40%", frame="none", options="header"]
+|===
+| Wert
+| Zugriffsrechte
+| Auflistung im Verzeichnis
+
+|0
+|Kein Lesen, Kein Schreiben, Kein Ausführen
+|`---`
+
+|1
+|Kein Lesen, Kein Schreiben, Ausführen
+|`--x`
+
+|2
+|Kein Lesen, Schreiben, Kein Ausführen
+|`-w-`
+
+|3
+|Kein Lesen, Schreiben, Ausführen
+|`-wx`
+
+|4
+|Lesen, Kein Schreiben, Kein Ausführen
+|`r--`
+
+|5
+|Lesen, Kein Schreiben, Ausführen
+|`r-x`
+
+|6
+|Lesen, Schreiben, Kein Ausführen
+|`rw-`
+
+|7
+|Lesen, Schreiben, Ausführen
+|`rwx`
+|===
+
+Benutzen Sie das Argument `-l` mit man:ls[1], um eine ausführliche Verzeichnisauflistung zu sehen, die in einer Spalte die Zugriffsrechte für den Besitzer, die Gruppe und alle anderen enthält. Die Ausgabe von `ls -l` könnte wie folgt aussehen:
+
+[source,bash]
+....
+% ls -l
+total 530
+-rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile
+-rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile
+-rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt
+....
+
+Das erste Zeichen (ganz links) der ersten Spalte zeigt an, ob es sich um eine normale Datei, ein Verzeichnis, ein zeichenorientiertes Gerät, ein Socket oder irgendeine andere Pseudo-Datei handelt. In diesem Beispiel zeigt `-` eine normale Datei an. Die nächsten drei Zeichen, dargestellt als `rw-`, ergeben die Rechte für den Datei-Besitzer. Die drei Zeichen danach `r--` die Rechte der Gruppe, zu der die Datei gehört. Die letzten drei Zeichen, `r--`, geben die Rechte für den Rest der Welt an. Ein Minus bedeutet, dass das Recht nicht gegeben ist. In diesem Beispiel sind die Zugriffsrechte also: der Eigentümer kann die Datei lesen und schreiben, die Gruppe kann lesen und alle anderen können auch nur lesen. Entsprechend obiger Tabelle wären die Zugriffsrechte für diese Datei `644`, worin jede Ziffer die drei Teile der Zugriffsrechte dieser Datei verkörpert.
+
+Wie kontrolliert das System die Rechte von Hardware-Geräten? FreeBSD behandelt die meisten Hardware-Geräte als Dateien, welche Programme öffnen, lesen und mit Daten beschreiben können. Diese speziellen Gerätedateien sind in [.filename]#/dev# gespeichert.
+
+Verzeichnisse werden ebenfalls wie Dateien behandelt. Sie haben Lese-, Schreib- und Ausführ-Rechte. Das Ausführungs-Bit hat eine etwas andere Bedeutung für ein Verzeichnis als für eine Datei. Die Ausführbarkeit eines Verzeichnisses bedeutet, dass in das Verzeichnis, zum Beispiel mit man:cd[1], gewechselt werden kann. Das bedeutet auch, dass in dem Verzeichnis auf Dateien, deren Namen bekannt sind, zugegriffen werden kann, vorausgesetzt die Zugriffsrechte der Dateien lassen dies zu.
+
+Das Leserecht auf einem Verzeichnis erlaubt es, sich den Inhalt des Verzeichnisses anzeigen zu lassen. Um eine Datei mit bekanntem Namen in einem Verzeichnis zu löschen, müssen auf dem Verzeichnis Schreib- _und_ Ausführ-Rechte gesetzt sein.
+
+Es gibt noch mehr Rechte, aber die werden vor allem in speziellen Umständen benutzt, wie zum Beispiel bei SetUID-Binaries und Verzeichnissen mit gesetztem Sticky-Bit. Mehr über Zugriffsrechte von Dateien und wie sie gesetzt werden, finden Sie in man:chmod[1].
+
+=== Symbolische Zugriffsrechte
+
+Symbolische Zugriffsrechte verwenden Zeichen anstelle von oktalen Werten, um die Berechtigungen für Dateien oder Verzeichnisse festzulegen. Zugriffsrechte verwenden die Syntax _Wer_, _Aktion_ und _Berechtigung_. Die folgenden Werte stehen zur Auswahl:
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Option
+| Symbol
+| Bedeutung
+
+|_Wer_
+|u
+|Benutzer (user)
+
+|_Wer_
+|g
+|Gruppe (group)
+
+|_Wer_
+|o
+|Andere (other)
+
+|_Wer_
+|a
+|Alle
+
+|_Aktion_
+|+
+|Berechtigungen hinzufügen
+
+|_Aktion_
+|-
+|Berechtigungen entziehen
+
+|_Aktion_
+|=
+|Berechtigungen explizit setzen
+
+|_Berechtigung_
+|r
+|lesen (read)
+
+|_Berechtigung_
+|w
+|schreiben (write)
+
+|_Berechtigung_
+|x
+|ausführen (execute)
+
+|_Berechtigung_
+|t
+|Sticky-Bit
+
+|_Berechtigung_
+|s
+|Set-UID oder Set-GID
+|===
+
+Diese symbolischen Werte werden zusammen mit man:chmod[1] verwendet. Beispielsweise würde der folgende Befehl den Zugriff auf _FILE_ für alle anderen Benutzer verbieten:
+
+[source,bash]
+....
+% chmod go= FILE
+....
+
+Wenn Sie mehr als eine Änderung der Rechte einer Datei vornehmen wollen, können Sie eine durch Kommata getrennte Liste der Rechte angeben. Das folgende Beispiel entzieht der Gruppe und der Welt die Schreibberechtigung auf _FILE_ und fügt für jeden Ausführungsrechte hinzu:
+
+[source,bash]
+....
+% chmod go-w,a+x FILE
+....
+
+=== FreeBSD Datei-Flags
+
+Zusätzlich zu den Zugriffsrechten unterstützt FreeBSD auch die Nutzung von "Datei-Flags". Diese erhöhen die Sicherheit des Systems, indem sie eine verbesserte Kontrolle von Dateien erlauben. Verzeichnisse werden allerdings nicht unterstützt. Mit dem Einsatz von Datei-Flags kann sogar `root` daran gehindert werden, Dateien zu löschen oder zu verändern.
+
+Datei-Flags werden mit man:chflags[1] verändert. Um beispielsweise auf der Datei [.filename]#file1# das "unlöschbar"-Flag zu aktivieren, geben Sie folgenden Befehl ein:
+
+[source,bash]
+....
+# chflags sunlink file1
+....
+
+Um dieses Flag zu deaktivieren, setzen Sie ein "no" vor `sunlink`:
+
+[source,bash]
+....
+# chflags nosunlink file1
+....
+
+Um die Flags einer Datei anzuzeigen, verwenden Sie man:ls[1] zusammen mit `-lo`:
+
+[source,bash]
+....
+# ls -lo file1
+....
+
+[.programlisting]
+....
+-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1
+....
+
+Einige Datei-Flags können nur vom `root`-Benutzer gesetzt oder gelöscht werden. Andere wiederum können auch vom Eigentümer der Datei gesetzt werden. Weitere Informationen hierzu finden sich in man:chflags[1] und man:chflags[2].
+
+=== Die Berechtigungen `setuid`, `setgid`, und `sticky`
+
+Anders als die Berechtigungen, die bereits angesprochen wurden, existieren drei weitere Einstellungen, über die alle Administratoren Bescheid wissen sollten. Dies sind die Berechtigungen `setuid`, `setgid` und `sticky`.
+
+Diese Einstellungen sind wichtig für manche UNIX(R)-Operationen, da sie Funktionalitäten zur Verfügung stellen, die normalerweise nicht an gewöhnliche Anwender vergeben wird. Um diese zu verstehen, muss der Unterschied zwischen der realen und der effektiven Benutzer-ID erwähnt werden.
+
+Die reale Benutzer-ID ist die UID, welche den Prozess besitzt oder gestartet hat. Die effektive UID ist diejenige, als die der Prozess läuft. Beispielsweise wird man:passwd[1] mit der realen ID des Benutzers ausgeführt, der sein Passwort ändert. Um jedoch die Passwortdatenbank zu bearbeiten, wird es effektiv als `root`-Benutzer ausgeführt. Das ermöglicht es normalen Benutzern, ihr Passwort zu ändern, ohne einen `Permission Denied`-Fehler angezeigt zu bekommen.
+
+Die setuid-Berechtigung kann durch das Voranstellen bei einer Berechtigungsgruppe mit der Nummer Vier (4) gesetzt werden, wie im folgenden Beispiel gezeigt wird:
+
+[source,bash]
+....
+# chmod 4755 suidexample.sh
+....
+
+Die Berechtigungen auf [.filename]#suidexample.sh# sehen jetzt wie folgt aus:
+
+[.programlisting]
+....
+-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh
+....
+
+Beachten Sie, dass ein `s` jetzt Teil der Berechtigungen des Dateibesitzers geworden ist, welches das Ausführen-Bit ersetzt. Dies ermöglicht es Werkzeugen mit erhöhten Berechtigungen zu laufen, wie beispielsweise `passwd`.
+
+[NOTE]
+====
+Die `nosuid` man:mount[8]-Option bewirkt, dass solche Anwendungen stillschweigend scheitern, ohne den Anwender darüber zu informieren. Diese Option ist nicht völlig zuverlässig, da ein `nosuid`-Wrapper in der Lage wäre, dies zu umgehen.
+====
+
+Um dies in Echtzeit zu beobachten, öffnen Sie zwei Terminals. Starten Sie auf einem `passwd` als normaler Benutzer. Während es auf die Passworteingabe wartet, überprüfen Sie die Prozesstabelle und sehen Sie sich die Informationen für man:passwd[1] an:
+
+Im Terminal A:
+
+[source,bash]
+....
+Changing local password for trhodes
+Old Password:
+....
+
+Im Terminal B:
+
+[source,bash]
+....
+# ps aux | grep passwd
+....
+
+[source,bash]
+....
+trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd
+root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd
+....
+
+Obwohl man:passwd[1] als normaler Benutzer ausgeführt wird, benutzt es die effektive UID von `root`.
+
+Die `setgid`-Berechtigung führt die gleiche Aktion wie die `setuid`-Berechtigung durch, allerdings verändert sie die Gruppenberechtigungen. Wenn eine Anwendung oder ein Werkzeug mit dieser Berechtigung ausgeführt wird, erhält es die Berechtigungen basierend auf der Gruppe, welche die Datei besitzt und nicht die des Benutzers, der den Prozess gestartet hat.
+
+Um die `setgid`-Berechtigung auf einer Datei zu setzen, geben Sie man:chmod[1] eine führende Zwei (2) mit:
+
+[source,bash]
+....
+# chmod 2755 sgidexample.sh
+....
+
+Beachten Sie in der folgenden Auflistung, dass das `s` sich jetzt in dem Feld befindet, das für die Berechtigungen der Gruppe bestimmt ist:
+
+[source,bash]
+....
+-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidexample.sh
+....
+
+[NOTE]
+====
+Obwohl es sich bei dem in diesen Beispielen gezeigten Shellskript um eine ausführbare Datei handelt, wird es nicht mit einer anderen EUID oder effektiven Benutzer-ID ausgeführt. Das ist so, weil Shellskripte keinen Zugriff auf man:setuid[2]-Systemaufrufe erhalten.
+====
+
+Die `setuid` und `setgid` Berechtigungs-Bits können die Systemsicherheit verringern, da sie erhöhte Rechte ermöglichen. Das dritte Berechtigungs-Bit, das `sticky bit` kann die Sicherheit eines Systems erhöhen.
+
+Wenn das `sticky bit` auf einem Verzeichnis angewendet wird, erlaubt es das Löschen von Dateien nur durch den Besitzer der Datei. Dies ist nützlich, um die Löschung von Dateien in öffentlichen Verzeichnissen wie [.filename]#/tmp#, durch Benutzer denen diese Dateien nicht gehören, zu verhindern. Um diese Berechtigung anzuwenden, stellen Sie der Berechtigung eine Eins (1) voran:
+
+[source,bash]
+....
+# chmod 1777 /tmp
+....
+
+Das `sticky bit` kann anhand des `t` ganz am Ende der Berechtigungen abgelesen werden.
+
+[source,bash]
+....
+# ls -al / | grep tmp
+....
+
+[source,bash]
+....
+drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp
+....
+
+[[dirstructure]]
+== Verzeichnis-Strukturen
+
+Die FreeBSD-Verzeichnishierarchie ist die Grundlage, um ein umfassendes Verständnis des Systems zu erlangen. Das wichtigste Verzeichnis ist das Root-Verzeichnis "/". Dieses Verzeichnis ist das erste, das während des Bootens eingehangen wird. Es enthält das notwendige Basissystem, um das Betriebssystem in den Mehrbenutzerbetrieb zu bringen. Das Root-Verzeichnis enthält auch die Mountpunkte für Dateisysteme, die beim Wechsel in den Multiuser-Modus eingehängt werden.
+
+Ein Mountpunkt ist ein Verzeichnis, in das zusätzliche Dateisysteme (in der Regel unterhalb des Wurzelverzeichnisses) eingehängt werden können. Dieser Vorgang wird in <<disk-organization>> ausführlich beschrieben. Standard-Mountpunkte sind [.filename]#/usr#, [.filename]#/var#, [.filename]#/tmp#, [.filename]#/mnt# sowie [.filename]#/cdrom#. Auf diese Verzeichnisse verweisen üblicherweise Einträge in [.filename]#/etc/fstab#. Diese Datei ist eine Tabelle mit verschiedenen Dateisystemen und Mountpunkten, vom System gelesen werden. Die meisten der Dateisysteme in [.filename]#/etc/fstab# werden beim Booten automatisch durch das Skript man:rc[8] gemountet, wenn die zugehörigen Einträge nicht mit `noauto` versehen sind. Weitere Informationen zu diesem Thema finden Sie im <<disks-fstab>>.
+
+Eine vollständige Beschreibung der Dateisystem-Hierarchie finden Sie in man:hier[7]. Die folgende Aufstellung gibt einen kurzen Überblick über die am häufigsten verwendeten Verzeichnisse:
+
+[.informaltable]
+[cols="20%,80%", frame="none", options="header"]
+|===
+| Verzeichnis
+| Beschreibung
+
+|[.filename]#/#
+|Wurzelverzeichnis des Dateisystems.
+
+|[.filename]#/bin/#
+|Grundlegende Werkzeuge für den Single-User-Modus sowie den Mehrbenutzerbetrieb.
+
+|[.filename]#/boot/#
+|Programme und Konfigurationsdateien, die während des Bootens benutzt werden.
+
+|[.filename]#/boot/defaults/#
+|Vorgaben für die Boot-Konfiguration. Weitere Details finden Sie in man:loader.conf[5].
+
+|[.filename]#/dev/#
+|Gerätedateien. Weitere Details finden Sie in man:intro[4].
+
+|[.filename]#/etc/#
+|Konfigurationsdateien und Skripten des Systems.
+
+|[.filename]#/etc/defaults/#
+|Vorgaben für die System Konfigurationsdateien. Weitere Details finden Sie in man:rc[8].
+
+|[.filename]#/etc/mail/#
+|Konfigurationsdateien von MTAs wie man:sendmail[8].
+
+|[.filename]#/etc/periodic/#
+|Täglich, wöchentlich oder monatlich laufende Skripte, die von man:cron[8] gestartet werden. Weitere Details finden Sie in man:periodic[8].
+
+|[.filename]#/etc/ppp/#
+|Konfigurationsdateien von man:ppp[8].
+
+|[.filename]#/mnt/#
+|Ein leeres Verzeichnis, das von Systemadministratoren häufig als temporärer Mountpunkt genutzt wird.
+
+|[.filename]#/proc/#
+|Prozess Dateisystem. Weitere Details finden Sie in man:procfs[5] und man:mount_procfs[8].
+
+|[.filename]#/rescue/#
+|Statisch gelinkte Programme zur Wiederherstellung des Systems, wie in man:rescue[8] beschrieben.
+
+|[.filename]#/root/#
+|Home Verzeichnis von `root`.
+
+|[.filename]#/sbin/#
+|Systemprogramme und administrative Werkzeuge, die grundlegend für den Single-User-Modus und den Mehrbenutzerbetrieb sind.
+
+|[.filename]#/tmp/#
+|Temporäre Dateien, die für gewöhnlich bei einem Neustart des Systems verloren gehen. Häufig wird ein speicherbasiertes Dateisystem unter [.filename]#/tmp# eingehängt. Dieser Vorgang kann automatisiert werden, wenn tmpmfs-bezogene Variablen von man:rc.conf[5] verwendet werden, oder ein entsprechender Eintrag in [.filename]#/etc/fstab# existiert. Weitere Informationen finden Sie in man:mdmfs[8].
+
+|[.filename]#/usr/#
+|Der Großteil der Benutzerprogramme und Anwendungen.
+
+|[.filename]#/usr/bin/#
+|Gebräuchliche Werkzeuge, Programmierhilfen und Anwendungen.
+
+|[.filename]#/usr/include/#
+|Standard C include-Dateien.
+
+|[.filename]#/usr/lib/#
+|Bibliotheken.
+
+|[.filename]#/usr/libdata/#
+|Daten verschiedener Werkzeuge.
+
+|[.filename]#/usr/libexec/#
+|System-Dämonen und System-Werkzeuge, die von anderen Programmen ausgeführt werden.
+
+|[.filename]#/usr/local/#
+|Lokale Programme und Bibliotheken. Die Ports-Sammlung von FreeBSD benutzt dieses Verzeichnis als Zielverzeichnis für Anwendungen. Innerhalb von [.filename]#/usr/local# sollte das von man:hier[7] beschriebene Layout für [.filename]#/usr# benutzt werden. Das [.filename]#man# Verzeichnis wird direkt unter [.filename]#/usr/local# anstelle unter [.filename]#/usr/local/share# angelegt. Die Dokumentation der Ports findet sich in [.filename]#share/doc/port#.
+
+|[.filename]#/usr/obj/#
+|Von der Architektur abhängiger Verzeichnisbaum, der durch das Bauen von [.filename]#/usr/src# entsteht.
+
+|[.filename]#/usr/ports/#
+|Die FreeBSD-Ports-Sammlung (optional).
+
+|[.filename]#/usr/sbin/#
+|System-Dämonen und System-Werkzeuge, die von Benutzern ausgeführt werden.
+
+|[.filename]#/usr/shared/#
+|Von der Architektur unabhängige Dateien.
+
+|[.filename]#/usr/src/#
+|Quelldateien von BSD und/oder lokalen Ergänzungen.
+
+|[.filename]#/var/#
+|Wird für mehrere Zwecke genutzt und enthält Logdateien, temporäre Daten und Spooldateien. Manchmal wird ein speicherbasiertes Dateisystem unter [.filename]#/var# eingehängt. Dieser Vorgang kann automatisiert werden, wenn die varmfs-bezogenen Variablen von man:rc.conf[5] verwendet werden, oder ein entsprechender Eintrag in [.filename]#/etc/fstab# existiert. Weitere Informationen finden Sie in man:mdmfs[8].
+
+|[.filename]#/var/log/#
+|Verschiedene Logdateien des Systems.
+
+|[.filename]#/var/mail/#
+|Postfächer der Benutzer.
+
+|[.filename]#/var/spool/#
+|Verschiedene Spool-Verzeichnisse der Drucker- und Mailsysteme.
+
+|[.filename]#/var/tmp/#
+|Temporäre Dateien, die in der Regel auch bei einem Neustart des Systems erhalten bleiben, es sei denn, bei [.filename]#/var# handelt es sich um ein speicherbasiertes Dateisystem.
+
+|[.filename]#/var/yp/#
+|NIS maps.
+|===
+
+[[disk-organization]]
+== Festplatten, Slices und Partitionen
+
+FreeBSD identifiziert Dateien anhand eines Dateinamens. In Dateinamen wird zwischen Groß- und Kleinschreibung unterschieden: [.filename]#readme.txt# und [.filename]#README.TXT# bezeichnen daher zwei verschiedene Dateien. FreeBSD benutzt keine Dateiendungen, um den Typ der Datei zu bestimmen, egal ob es sich um ein Programm, ein Dokument oder um andere Daten handelt.
+
+Dateien werden in Verzeichnissen gespeichert. In einem Verzeichnis können sich keine oder hunderte Dateien befinden. Ein Verzeichnis kann auch andere Verzeichnisse enthalten und so eine Hierarchie von Verzeichnissen aufbauen, die die Ablage von Daten erleichtert.
+
+In Dateinamen werden Verzeichnisse durch einen Schrägstrich (`/`, Slash) getrennt. Wenn z.B. das Verzeichnis [.filename]#foo# ein Verzeichnis [.filename]#bar# enthält, in dem sich die Datei [.filename]#readme.txt# befindet, lautet der vollständige Name der Datei (oder der _Pfad_ zur Datei) [.filename]#foo/bar/readme.txt#. Beachten Sie, dass sich dies von Windows(R) unterscheidet, wo der `\` (Backslash für die Trennung von Datei- und Verzeichnisnamen verwendet wird. FreeBSD benutzt keine Laufwerkbuchstaben oder Laufwerknamen im Pfad. Beispielsweise würde man unter FreeBSD nicht [.filename]#c:\foo\bar\readme.txt# eingeben.
+
+Verzeichnisse und Dateien werden in einem Dateisystem gespeichert. Jedes Dateisystem besitzt genau ein _Wurzelverzeichnis_, das so genannte Root-Directory. Dieses Wurzelverzeichnis kann weitere Verzeichnisse enthalten. Ein Dateisystem wird als Wurzeldateisystem festgelegt, und jedes weitere Dateisystem wird unter dem Wurzeldateisystem _eingehangen_. Daher scheint jedes Verzeichnis, unabhängig von der Anzahl der Platten, auf derselben Platte zu liegen.
+
+Betrachten wir die drei Dateisysteme `A`, `B` und `C`. Jedes Dateisystem besitzt ein eigenes Wurzelverzeichnis, das zwei andere Verzeichnisse enthält: [.filename]#A1#, [.filename]#A2#, [.filename]#B1#, [.filename]#B2#, [.filename]#C1# und [.filename]#C2#.
+
+Das Wurzeldateisystem soll `A` sein. man:ls[1] zeigt darin die beiden Verzeichnisse [.filename]#A1# und [.filename]#A2# an. Der Verzeichnisbaum sieht wie folgt aus:
+
+image::../../../images/handbook/basics/example-dir1.png[]
+
+Ein Dateisystem wird in einem Verzeichnis eines anderen Dateisystems eingehangen. Wir hängen nun das Dateisystem `B` in das Verzeichnis [.filename]#A1# ein. Das Wurzelverzeichnis von `B` ersetzt nun das Verzeichnis [.filename]#A1# und die Verzeichnisse des Dateisystems `B` werden sichtbar:
+
+image::../../../images/handbook/basics/example-dir2.png[]
+
+Jede Datei in den Verzeichnissen [.filename]#B1# oder [.filename]#B2# kann über den Pfad [.filename]#/A1/B1# oder [.filename]#/A1/B2# erreicht werden. Dateien aus dem Verzeichnis [.filename]#/A1# sind jetzt verborgen. Wenn das Dateisystem `B` wieder _abgehangen_ wird (umount), erscheinen die verborgenen Dateien wieder.
+
+Wenn das Dateisystem `B` unter dem Verzeichnis [.filename]#A2# eingehangen würde, sähe der Verzeichnisbaum so aus:
+
+image::../../../images/handbook/basics/example-dir3.png[]
+
+Die Dateien des Dateisystems `B` wären unter den Pfaden [.filename]#/A2/B1# und [.filename]#/A2/B2# erreichbar.
+
+Dateisysteme können übereinander eingehangen werden. Der folgende Baum entsteht, wenn im letzten Beispiel das Dateisystem `C` in das Verzeichnis [.filename]#B1# des Dateisystems `B` eingehangen wird:
+
+image::../../../images/handbook/basics/example-dir4.png[]
+
+`C` könnte auch im Verzeichnis [.filename]#A1# eingehangen werden:
+
+image::../../../images/handbook/basics/example-dir5.png[]
+
+Sie können sogar mit nur einem großen Dateisystem auskommen. Dies hat mehrere Nachteile und einen Vorteil.
+
+.Vorteile mehrerer Dateisysteme
+* Die Dateisysteme können mit unterschiedlichen Optionen (mount options) eingehangen werden. Beispielsweise kann das Wurzeldateisystem schreibgeschützt eingehangen werden, sodass es für Benutzer nicht möglich ist, versehentlich kritische Dateien zu editieren oder zu löschen. Von Benutzern beschreibbare Dateisysteme wie [.filename]#/home# können mit der Option _nosuid_ eingehangen werden, wenn sie von anderen Dateisystemen getrennt sind. Die _SUID_- und _GUID_-Bits verlieren auf solchen Dateisystemen ihre Wirkung und die Sicherheit des Systems kann dadurch erhöht werden.
+* Die Lage von Dateien im Dateisystem wird, abhängig vom Gebrauch des Dateisystems, automatisch von FreeBSD optimiert. Ein Dateisystem mit vielen kleinen Dateien, die häufig geschrieben werden, wird anders behandelt als ein Dateisystem mit wenigen großen Dateien. Mit nur einem Dateisystem ist diese Optimierung unmöglich.
+* In der Regel übersteht ein FreeBSD-Dateisystem auch einen Stromausfall. Allerdings kann ein Stromausfall zu einem kritischen Zeitpunkt das Dateisystem beschädigen. Wenn die Daten über mehrere Dateisysteme verteilt sind, lässt sich das System mit hoher Wahrscheinlichkeit noch starten. Dies erleichtert das Zurückspielen von Datensicherungen.
+
+.Vorteil eines einzelnen Dateisystems
+* Dateisysteme haben eine festgelegte Größe. Es kann passieren, dass Sie eine Partition vergrößern müssen. Dies ist nicht leicht: Sie müssen die Daten sichern, das Dateisystem vergrößert anlegen und die gesicherten Daten zurückspielen.
++
+[IMPORTANT]
+====
+FreeBSD kennt den Befehl man:growfs[8], mit dem man Dateisysteme im laufenden Betrieb vergrößern kann.
+====
+
+Dateisysteme befinden sich in Partitionen (damit sind nicht die normalen MS-DOS(R)-Partitionen gemeint). Jede Partition wird mit einem Buchstaben von `a` bis `h` bezeichnet und kann nur ein Dateisystem enthalten. Dateisysteme können daher über ihren Mount-Point, den Punkt an dem sie eingehangen sind, oder den Buchstaben der Partition, in der sie liegen, identifiziert werden.
+
+FreeBSD benutzt einen Teil der Platte für den _Swap-Bereich_, um _virtuellen Speicher_ zur Verfügung zu stellen. Dadurch kann der Rechner Anwendungen mehr Speicher zur Verfügung stellen als tatsächlich eingebaut ist. Wenn der Speicher knapp wird, kann FreeBSD nicht benutzte Daten in den Swap-Bereich auslagern. Die ausgelagerten Daten können später wieder in den Speicher geholt werden (dafür werden dann andere Daten ausgelagert).
+
+Für einige Partitionen gelten besondere Konventionen:
+
+[.informaltable]
+[cols="30%,70%", frame="none", options="header"]
+|===
+| Partition
+| Konvention
+
+|`a`
+|Enthält normalerweise das Wurzeldateisystem.
+
+|`b`
+|Enthält normalerweise den Swap-Bereich.
+
+|`c`
+|Ist normalerweise genauso groß wie die Slice in der die Partition liegt. Werkzeuge, die auf der kompletten Slice arbeiten, wie ein Bad-Block-Scanner, können so die `c`-Partition benutzen. Für gewöhnlich wird in dieser Partition kein Dateisystem angelegt.
+
+|`d`
+|Früher hatte die `d`-Partition eine besondere Bedeutung. Heute ist dies nicht mehr der Fall und die Partition `d` kann wie jede andere Partition auch verwendet werden.
+|===
+
+In FreeBSD werden Festplatten in Slices, welche in Windows(R) als Partitionen bekannt sind, aufgeteilt und von 1 bis 4 durchnummeriert. Diese werden dann in Partitionen unterteilt, welche wiederum Dateisysteme enthalten und mit Buchstaben benannt werden.
+
+Die Slice-Nummern werden mit vorgestelltem `s` hinter den Gerätenamen gestellt: "da0__s1__" ist die erste Slice auf dem ersten SCSI-Laufwerk. Auf einer Festplatte gibt es höchstens vier Slices. In einer Slice des passenden Typs kann es weitere logische Slices geben. Diese erweiterten Slices werden ab fünf durchnummeriert: "ada0__s5__" ist die erste erweiterte Slice auf einer SATA-Platte. Diese Geräte werden von Dateisystemen benutzt, die sich in einer kompletten Slice befinden müssen.
+
+Slices, "dangerously dedicated"-Festplatten und andere Platten enthalten Partitionen, die mit Buchstaben von `a` bis `h` bezeichnet werden. Der Buchstabe wird an den Gerätenamen gehangen: "da0__a__" ist die `a`-Partition des ersten `da`-Laufwerks. Dieses Laufwerk ist "dangerously dedicated". "ada1s3__e__" ist die fünfte Partition in der dritten Slice der zweiten SATA-Platte.
+
+Schließlich wird noch jede Festplatte des Systems eindeutig bezeichnet. Der Name einer Festplatte beginnt mit einem Code, der den Typ der Platte bezeichnet. Es folgt eine Nummer, die angibt, um welche Festplatte es sich handelt. Anders als bei Slices werden Festplatten von Null beginnend durchnummeriert. Gängige Festplatten-Namen sind in <<disks-naming>> aufgeführt.
+
+Wenn Sie eine Partition angeben, beinhaltet das den Plattennamen, `s`, die Slice-Nummer und den Buchstaben der Partition. Einige Beispiele finden Sie in <<basics-disk-slice-part>>.
+
+Der Aufbau einer Festplatte wird in <<basics-concept-disk-model>> dargestellt.
+
+Bei der Installation von FreeBSD legen Sie Slices auf der Festplatte an, erstellen Partitionen für FreeBSD innerhalb der Slice, erstellen ein Dateisystem oder Auslagerungsbereiche und entscheiden, welche Dateisysteme wo eingehangen werden.
+
+[[disks-naming]]
+.Laufwerk-Codes
+[cols="1,1", frame="none", options="header"]
+|===
+| Laufwerkstyp
+| Gerätename
+
+|SATA- und IDE-Festplatten
+|`ada` oder `ad`
+
+|SCSI-Festplatten und USB-Speichermedien
+|`da`
+
+|SATA- und IDE-CD-ROM-Laufwerke
+|`cd` oder `acd`
+
+|SCSI-CD-ROM-Laufwerke
+|`cd`
+
+|Diskettenlaufwerke
+|`fd`
+
+|Verschiedene proprietäre CD-ROM-Laufwerke
+|`mcd` für Mitsumi CD-ROM und `scd` für Sony CD-ROM
+
+|SCSI-Bandlaufwerke
+|`sa`
+
+|IDE-Bandlaufwerke
+|`ast`
+
+|RAID-Laufwerke
+|Beispiele sind `aacd` für Adaptec(R) AdvancedRAID, `mlxd` für Mylex(R), `amrd` für AMI MegaRAID(R), `idad` für Compaq Smart RAID, `twed` für 3ware(R) RAID.
+|===
+
+[[basics-disk-slice-part]]
+.Namen von Platten, Slices und Partitionen
+[example]
+====
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Name
+| Bedeutung
+
+|[.filename]#ada0s1a#
+|Die erste Partition (`a`) in der ersten Slice (`s1`) der ersten SATA-Festplatte (`ada0`).
+
+|[.filename]#da1s2e#
+|Die fünfte Partition (`e`) der zweiten Slice (`s2`) auf der zweiten SCSI-Festplatte (`da1`).
+|===
+====
+
+[[basics-concept-disk-model]]
+.Aufteilung einer Festplatte
+[example]
+====
+
+Das folgende Diagramm zeigt die Sicht von FreeBSD auf die erste SATA-Festplatte des Systems. Die Platte soll 250 GB groß sein und eine 80 GB große Slice (MS-DOS(R)-Partitionen) sowie eine 170 GB große Slice enthalten. Die erste Slice enthält ein Windows(R) NTFS-Dateisystem ([.filename]#C:#), die zweite Slice enthält eine FreeBSD-Installation. Die FreeBSD-Installation in diesem Beispiel verwendet vier Datenpartitionen und einen Auslagerungsbereich.
+
+Jede der vier Partitionen enthält ein Dateisystem. Das Wurzeldateisystem ist die `a`-Partition. In der `d`-Partition befindet sich [.filename]#/var# und in der `f`-Partition befindet sich [.filename]#/usr#. Die `c`-Partition bezieht sich auf die gesamte Slice und wird nicht für gewöhnliche Partitionen verwendet.
+
+image::../../../images/handbook/basics/disk-layout.png[]
+
+====
+
+[[mount-unmount]]
+== Anhängen und Abhängen von Dateisystemen
+
+Ein Dateisystem wird am besten als ein Baum mit der Wurzel [.filename]#/# veranschaulicht. [.filename]#/dev#, [.filename]#/usr#, und die anderen Verzeichnisse im Rootverzeichnis sind Zweige, die wiederum eigene Zweige wie [.filename]#/usr/local# haben können.
+
+Es gibt verschiedene Gründe, bestimmte dieser Verzeichnisse auf eigenen Dateisystemen anzulegen. [.filename]#/var# enthält [.filename]#log/#, [.filename]#spool/# sowie verschiedene andere temporäre Dateien und kann sich daher schnell füllen. Es empfiehlt sich, [.filename]#/var# von [.filename]#/# zu trennen, da es schlecht ist, wenn das Root-Dateisystem voll läuft.
+
+Ein weiterer Grund bestimmte Verzeichnisbäume auf andere Dateisysteme zu legen, ist gegeben, wenn sich die Verzeichnisbäume auf gesonderten physikalischen oder virtuellen Platten, wie crossref:network-servers[network-nfs,Network File System] oder CD-ROM-Laufwerken, befinden.
+
+[[disks-fstab]]
+=== Die [.filename]#fstab# Datei
+
+Während des Boot-Prozesses (crossref:boot[boot,FreeBSDs Bootvorgang]) werden in [.filename]#/etc/fstab# aufgeführte Verzeichnisse, sofern sie nicht mit der Option `noauto` versehen sind, automatisch angehangen. Diese Datei enthält Einträge in folgendem Format:
+
+[.programlisting]
+....
+device /mount-point fstype options dumpfreq passno
+....
+
+`device`::
+Ein existierender Gerätename wie in <<disks-naming>> beschrieben.
+
+`mount-point`::
+Ein existierendes Verzeichnis, auf dem das Dateisystem gemountet wird.
+
+`fstype`::
+Der Typ des Dateisystems, der an man:mount[8] weitergegeben wird. FreeBSDs Standarddateisystem ist `ufs`.
+
+`options`::
+Entweder `rw` für beschreibbare Dateisysteme oder `ro` für schreibgeschützte Dateisysteme, gefolgt von weiteren benötigten Optionen. Eine häufig verwendete Option ist `noauto` für Dateisysteme, die während der normalen Bootsequenz nicht angehangen werden sollen. Weitere Optionen finden sich in man:mount[8].
+
+`dumpfreq`::
+Wird von man:dump[8] benutzt, um bestimmen zu können, welche Dateisysteme gesichert werden müssen. Fehlt der Wert, wird `0` angenommen.
+
+`passno`::
+Bestimmt die Reihenfolge, in der die Dateisysteme überprüft werden sollen. Für Dateisysteme, die übersprungen werden sollen, ist `passno` auf `0` zu setzen. Für das Root-Dateisystem, das vor allen anderen überprüft werden muss, sollte der Wert von `passno``1` betragen. Allen anderen Dateisystemen sollten Werte größer `1` zugewiesen werden. Wenn mehrere Dateisysteme den gleichen Wert besitzen, wird man:fsck[8] versuchen, diese parallel zu überprüfen.
+
+Lesen Sie man:fstab[5] für weitere Informationen über das Format von [.filename]#/etc/fstab# und dessen Optionen.
+
+[[disks-mount]]
+=== Verwendung von man:mount[8]
+
+Dateisysteme werden mit man:mount[8] eingehängt. In der grundlegenden Form wird es wie folgt benutzt:
+
+[example]
+====
+
+[source,bash]
+....
+# mount device mountpoint
+....
+
+====
+
+Dieser Befehl bietet viele Optionen, die in man:mount[8] beschrieben werden. Die am häufigsten verwendeten Optionen sind:
+
+.Optionen von `mount`
+`-a`::
+Hängt alle Dateisysteme aus [.filename]#/etc/fstab# an. Davon ausgenommen sind Dateisysteme, die mit "noauto" markiert sind, die mit der Option `-t` ausgeschlossen wurden und Dateisysteme, die schon angehangen sind.
+
+`-d`::
+Führt alles bis auf den `mount`-Systemaufruf aus. Nützlich ist diese Option in Verbindung mit `-v`. Damit wird angezeigt, was man:mount[8] tatsächlich versuchen würde, um das Dateisystem anzuhängen.
+
+`-f`::
+Erzwingt das Anhängen eines unsauberen Dateisystems (riskant) oder die Rücknahme des Schreibzugriffs, wenn der Status des Dateisystems von beschreibbar auf schreibgeschützt geändert wird.
+
+`-r`::
+Hängt das Dateisystem schreibgeschützt ein. Dies kann auch durch Angabe von `-o ro` erreicht werden.
+
+`-t`_fstype_::
+Hängt das Dateisystem mit dem angegebenen Typ an, oder hängt nur Dateisysteme mit dem angegebenen Typ an, wenn `-a` angegeben wurde. "ufs" ist das Standarddateisystem.
+
+`-u`::
+Aktualisiert die Mountoptionen des Dateisystems.
+
+`-v`::
+Geschwätzig sein.
+
+`-w`::
+Hängt das Dateisystem beschreibbar an.
+
+Die folgenden Optionen können durch eine Kommata separierte Liste an `-o` übergeben werden:
+
+nosuid::
+SetUID und SetGID Bits werden auf dem Dateisystem nicht beachtet. Dies ist eine nützliche Sicherheitsfunktion.
+
+[[disks-umount]]
+=== Verwendung von man:umount[8]
+
+man:umount[8] hängt ein Dateisystem ab. Dieser Befehl akzeptiert als Parameter entweder einen Mountpoint, einen Gerätenamen, `-a` oder `-A`.
+
+Jede Form akzeptiert `-f`, um das Abhängen zu erzwingen, und `-v`, um etwas geschwätziger zu sein. Seien Sie bitte vorsichtig mit `-f`, da der Computer abstürzen kann oder es können Daten auf dem Dateisystem beschädigt werden.
+
+Um alle Dateisysteme abzuhängen, oder nur diejenigen, die mit `-t` gelistet werden, wird `-a` oder `-A` benutzt. Beachten Sie, dass `-a` das Root-Dateisystem nicht aushängt.
+
+[[basics-processes]]
+== Prozesse und Dämonen
+
+FreeBSD ist ein Multitasking-Betriebssystem. Jedes Programm, das zu irgendeiner Zeit läuft wird als _Prozess_ bezeichnet. Jedes laufende Kommando startet mindestens einen neuen Prozess. Dazu gibt es eine Reihe von Systemprozessen, die von FreeBSD ausgeführt werden.
+
+Jeder Prozess wird durch eine eindeutige Nummer identifiziert, die _Prozess-ID_ (_PID_) genannt wird. Prozesse haben ebenso wie Dateien einen Besitzer und eine Gruppe, die festlegen, welche Dateien und Geräte der Prozess benutzen kann. Die meisten Prozesse haben auch einen Elternprozess, der sie gestartet hat. Beispielsweise ist die Shell ein Prozess. Jedes in Shell gestartete Kommando ist dann ein neuer Prozess, der die Shell als Elternprozess besitzt. Die Ausnahme hiervon ist ein spezieller Prozess namens man:init[8], der beim booten immer als erstes gestartet wird und der immer die PID`1` hat.
+
+Manche Programme erwarten keine Eingaben vom Benutzer und lösen sich bei erster Gelegenheit von ihrem Terminal. Ein Webserver zum Beispiel antwortet auf Web-Anfragen und nicht auf Benutzereingaben. Mail-Server sind ein weiteres Beispiel für diesen Typ von Anwendungen. Diese Programme sind als _Dämonen_ bekannt. Der Begriff Dämon stammt aus der griechischen Mythologie und bezeichnet ein Wesen, das weder gut noch böse ist und welches unsichtbar nützliche Aufgaben verrichtet. Deshalb ist das BSD Maskottchen dieser fröhlich aussehende Dämon mit Turnschuhen und Dreizack.
+
+Programme, die als Dämon laufen, werden entsprechend einer Konvention mit einem "d" am Ende benannt. BIND steht beispielsweise für Berkeley Internet Name Domain, das tatsächlich laufende Programm heißt aber `named`. Der Apache Webserver wird `httpd` genannt und der Druckerspool-Dämon heißt man:lpd[8]. Dies ist allerdings nur eine Konvention. Der Dämon der Anwendung Sendmail heißt beispielsweise `sendmail` und nicht `maild`.
+
+=== Prozesse beobachten
+
+Um die Prozesse auf dem System zu sehen, benutzen Sie man:ps[1] und man:top[1]. Eine statische Liste der laufenden Prozesse, deren PIDs, Speicherverbrauch und die Kommandozeile, mit der sie gestartet wurden, erhalten Sie mit man:ps[1]. Um alle laufenden Prozesse in einer Anzeige zu sehen, die alle paar Sekunden aktualisiert wird, so dass Sie interaktiv sehen können was der Computer macht, benutzen Sie man:top[1].
+
+In der Voreinstellung zeigt man:ps[1] nur die laufenden Prozesse, die dem Benutzer gehören. Zum Beispiel:
+
+[source,bash]
+....
+% ps
+ PID TT STAT TIME COMMAND
+8203 0 Ss 0:00.59 /bin/csh
+8895 0 R+ 0:00.00 ps
+....
+
+Die Ausgabe von man:ps[1] ist in einer Anzahl von Spalten organisiert. Die `PID` Spalte zeigt die Prozess-ID. PIDs werden von 1 beginnend bis 99999 zugewiesen und fangen wieder von vorne an. Ist eine PID bereits vergeben, wird diese allerdings nicht erneut vergeben. Die Spalte `TT` zeigt den Terminal, auf dem das Programm läuft. `STAT` zeigt den Status des Programms und `TIME` gibt die Zeit an, die das Programm auf der CPU gelaufen ist. Dies ist nicht unbedingt die Zeit, die seit dem Start des Programms vergangen ist, da die meisten Programme hauptsächlich auf bestimmte Dinge warten, bevor sie wirklich CPU-Zeit verbrauchen. Unter der Spalte `COMMAND` findet sich schließlich die Kommandozeile, mit der das Programm gestartet wurde.
+
+man:ps[1] besitzt viele Optionen, um die angezeigten Informationen zu beeinflussen. Eine nützliche Kombination ist `auxww`. `a` zeigt Information über alle laufenden Prozesse aller Benutzer. Der Name des Besitzers des Prozesses, sowie Informationen über den Speicherverbrauch werden mit `u` angezeigt. `x` zeigt auch Dämonen-Prozesse an, und `ww` veranlasst man:ps[1] die komplette Kommandozeile für jeden Befehl anzuzeigen, anstatt sie abzuschneiden, wenn sie zu lang für die Bildschirmausgabe wird.
+
+Die Ausgabe von man:top[1] sieht in etwa so aus:
+
+[source,bash]
+....
+% top
+last pid: 9609; load averages: 0.56, 0.45, 0.36 up 0+00:20:03 10:21:46
+107 processes: 2 running, 104 sleeping, 1 zombie
+CPU: 6.2% user, 0.1% nice, 8.2% system, 0.4% interrupt, 85.1% idle
+Mem: 541M Active, 450M Inact, 1333M Wired, 4064K Cache, 1498M Free
+ARC: 992M Total, 377M MFU, 589M MRU, 250K Anon, 5280K Header, 21M Other
+Swap: 2048M Total, 2048M Free
+
+ PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
+ 557 root 1 -21 r31 136M 42296K select 0 2:20 9.96% Xorg
+ 8198 dru 2 52 0 449M 82736K select 3 0:08 5.96% kdeinit4
+ 8311 dru 27 30 0 1150M 187M uwait 1 1:37 0.98% firefox
+ 431 root 1 20 0 14268K 1728K select 0 0:06 0.98% moused
+ 9551 dru 1 21 0 16600K 2660K CPU3 3 0:01 0.98% top
+ 2357 dru 4 37 0 718M 141M select 0 0:21 0.00% kdeinit4
+ 8705 dru 4 35 0 480M 98M select 2 0:20 0.00% kdeinit4
+ 8076 dru 6 20 0 552M 113M uwait 0 0:12 0.00% soffice.bin
+ 2623 root 1 30 10 12088K 1636K select 3 0:09 0.00% powerd
+ 2338 dru 1 20 0 440M 84532K select 1 0:06 0.00% kwin
+ 1427 dru 5 22 0 605M 86412K select 1 0:05 0.00% kdeinit4
+....
+
+Die Ausgabe ist in zwei Abschnitte geteilt. In den ersten fünf Kopfzeilen finden sich die zuletzt zugeteilte PID, die Systemauslastung (engl. load average), die Systemlaufzeit (die Zeit seit dem letzten Reboot) und die momentane Zeit. Die weiteren Zahlen im Kopf beschreiben wie viele Prozesse momentan laufen, wie viel Speicher und Swap verbraucht wurde und wie viel Zeit das System in den verschiedenen CPU-Modi verbringt. Wenn das ZFS-Kernelmodul geladen ist, dann zeigt die Zeile `ARC`, wie viele Daten aus dem Cache gelesen wurden.
+
+Darunter befinden sich einige Spalten mit ähnlichen Informationen wie in der Ausgabe von man:ps[1], beispielsweise die PID, den Besitzer, die verbrauchte CPU-Zeit und das Kommando, das den Prozess gestartet hat. man:top[1] zeigt in zwei Spalten den Speicherverbrauch des Prozesses an. Die erste Spalte gibt den gesamten Speicherverbrauch des Prozesses an, in der zweiten Spalte wird der aktuelle Verbrauch angegeben.
+
+Die Anzeige wird von man:top[1] automatisch alle zwei Sekunden aktualisiert. Ein anderer Intervall kann mit `-s` spezifiziert werden.
+
+[[basics-daemons]]
+=== Stoppen von Prozessen
+
+Eine Möglichkeit mit einem laufenden Prozess zu kommunizieren, ist über das Versenden von _Signalen_ mittels man:kill[1]. Es gibt eine Reihe von verschiedenen Signalen. Manche haben eine feste Bedeutung, während andere in der Dokumentation der Anwendung beschrieben sind. Ein Benutzer kann ein Signal nur an einen Prozess senden, welcher ihm gehört. Wird versucht ein Signal an einen Prozess eines anderen Benutzers zu senden, resultiert dies in einem Zugriffsfehler mangels fehlender Berechtigungen. Die Ausnahme ist der `root`-Benutzer, welcher jedem Prozess Signale senden kann.
+
+FreeBSD kann auch ein Signal an einen Prozess senden. Wenn eine Anwendung schlecht geschrieben ist und auf Speicher zugreift, auf den sie nicht zugreifen soll, so sendet FreeBSD dem Prozess das _Segmentation Violation_ Signal (`SIGSEGV`). Wenn eine Anwendung programmiert wurde, den man:alarm[3] Systemaufruf zu benutzen, um nach einiger Zeit benachrichtigt zu werden, bekommt sie das "Alarm"-Signal (`SIGALRM`) gesendet.
+
+Zwei Signale können benutzt werden, um einen Prozess zu stoppen: `SIGTERM` und `SIGKILL`. `SIGTERM` fordert den Prozess höflich zum Beenden auf. Der Prozess kann das Signal abfangen und hat dann Gelegenheit Logdateien zu schließen und die Aktion, die er durchführte, abzuschließen. In manchen Situationen kann der Prozess `SIGTERM` ignorieren, wenn er eine Aktion durchführt, die nicht unterbrochen werden darf.
+
+`SIGKILL` kann von keinem Prozess ignoriert werden. Wird einem Prozess `SIGKILL` geschickt, dann wird FreeBSD diesen sofort beenden.
+
+Andere häufig verwendete Signale sind `SIGHUP`, `SIGUSR1` und `SIGUSR2`. Da diese Signale für allgemeine Zwecke vorgesehen sind, werden verschiedene Anwendungen unterschiedlich auf diese Signale reagieren.
+
+Ändern Sie beispielsweise die Konfiguration eines Webservers, so muss dieser angewiesen werden, seine Konfiguration neu zu lesen. Ein Neustart von `httpd` würde dazu führen, dass der Server für kurze Zeit nicht erreichbar ist. Senden Sie dem Dämon stattdessen das `SIGHUP`-Signal. Es sei erwähnt, dass verschiedene Dämonen sich anders verhalten. Lesen Sie die Dokumentation des entsprechenden Dämonen um zu überprüfen, ob der Dämon bei einem `SIGHUP` die gewünschten Ergebnisse erzielt.
+
+[.procedure]
+****
+.Procedure: Verschicken von Signalen
+
+Das folgende Beispiel zeigt, wie Sie man:inetd[8] ein Signal schicken. Die Konfigurationsdatei von man:inetd[8] ist [.filename]#/etc/inetd.conf#. Diese Konfigurationsdatei liest man:inetd[8] ein, wenn er `SIGHUP` empfängt.
+
+. Suchen Sie mit man:pgrep[1] die PID des Prozesses, dem Sie ein Signal schicken wollen. In diesem Beispiel ist die PID von man:inetd[8] 198:
++
+[source,bash]
+....
+% pgrep -l inetd
+198 inetd -wW
+....
+
+. Benutzen Sie man:kill[1], um ein Signal zu senden. Da man:inetd[8] dem Benutzer `root` gehört, müssen Sie zuerst mit man:su[1] `root` werden:
++
+[source,bash]
+....
+% su
+Password:
+# /bin/kill -s HUP 198
+....
++
+man:kill[1] wird, wie andere UNIX(R) Kommandos auch, keine Ausgabe erzeugen, wenn das Kommando erfolgreich war. Wird versucht, einem Prozess der nicht dem Benutzer gehört, ein Signal zu senden, dann wird die Meldung `kill: _PID_: Operation not permitted` ausgegeben. Ein Tippfehler bei der Eingabe der PID führt dazu, dass das Signal an einen falschen Prozess gesendet wird, was zu negativen Ergebnissen führen kann, oder das Signal wird an eine PID gesendet die derzeit nicht in Gebrauch ist, was zu dem Fehler `kill: _PID_: No such process` führt.
+
+[NOTE]
+.Warum sollte man `/bin/kill` benutzen?
+====
+Viele Shells stellen `kill` als internes Kommando zur Verfügung, das heißt die Shell sendet das Signal direkt, anstatt [.filename]#/bin/kill# zu starten. Beachten Sie, dass die unterschiedlichen Shells eine andere Syntax benutzen, um die Namen der Signale anzugeben. Anstatt jede Syntax zu lernen, kann es einfacher sein, `/bin/kill` direkt aufzurufen.
+====
+****
+
+Beim Versenden von anderen Signalen, ersetzen Sie `TERM` oder `KILL` in der Kommandozeile mit dem Namen des Signals.
+
+[IMPORTANT]
+====
+Das zufällige Beenden eines Prozesses kann gravierende Auswirkungen haben. Insbesondere man:init[8], mit der PID 1, ist ein Spezialfall. `/bin/kill -s KILL 1` ist ein schneller, jedoch nicht empfohlener Weg, das System herunterzufahren. Überprüfen Sie die Argumente von man:kill[1] _immer_ zweimal _bevor_ Sie kbd:[Return] drücken.
+====
+
+[[shells]]
+== Shells
+
+Eine _Shell_ stellt eine Kommandozeilen-Schnittstelle zur Interaktion mit dem Betriebssystem zur Verfügung. Sie empfängt Befehle von einem Eingabekanal und führt diese aus. Viele Shells bieten eingebaute Funktionen, die die tägliche Arbeit erleichtern, beispielsweise eine Dateiverwaltung, die Vervollständigung von Dateinamen (Globbing), Kommandozeilen-Editor, sowie Makros und Umgebungsvariablen. FreeBSD enthält einige Shells, darunter die Bourne Shell (man:sh[1]) und die verbesserte C-Shell (man:tcsh[1]). Weitere Shells, wie `zsh` oder `bash`, befinden sich in der Ports-Sammlung.
+
+Die verwendete Shell ist letztlich eine Frage des Geschmacks. Ein C-Programmierer, findet vielleicht eine C-artige Shell wie man:tcsh[1] angenehmer. Ein Linux(R)-Benutzer bevorzugt vielleicht `bash`. Jede Shell hat ihre speziellen Eigenschaften, die mit der bevorzugten Arbeitsumgebung des Benutzers harmonieren kann oder nicht. Deshalb stehen mehrere Shells zur Auswahl.
+
+Ein verbreitetes Merkmal in Shells ist die Dateinamen-Vervollständigung. Nachdem der Benutzer einige Buchstaben eines Kommandos oder eines Dateinamen eingeben hat, vervollständigt die Shell den Rest durch drücken der kbd:[Tab]-Taste. Angenommen, Sie haben zwei Dateien [.filename]#foobar# und [.filename]#football#. Um [.filename]#foobar# zu löschen, kann der Benutzer `rm foo` eingeben und kbd:[Tab] drücken um den Dateinamen zu vervollständigen.
+
+Die Shell wird lediglich `rm foo` anzeigen. Sie konnte den Dateinamen nicht vervollständigen, da sowohl [.filename]#foobar# als auch [.filename]#football# mit `foo` anfangen. Einige Shells geben einen Signalton aus, oder zeigen alle Möglichkeiten an, wenn mehr als ein Name mit dem gegebenen Muster übereinstimmt. Der Benutzer muss dann weitere Zeichen eingeben, damit die Shell den gewünschten Dateinamen bestimmen kann. Durch Eingabe von `t` und erneutes Drücken von kbd:[Tab] ist die Shell in der Lage, den gewünschten Dateinamen zu vervollständigen.
+
+Ein weiteres Merkmal der Shell ist der Gebrauch von Umgebungsvariablen. Dies sind veränderbare Schlüsselpaare im Umgebungsraum der Shell, die jedes von der Shell aufgerufene Programm lesen kann. Daher enthält der Umgebungsraum viele Konfigurationsdaten für Programme. <<shell-env-vars>> zeigt verbreitete Umgebungsvariablen und deren Bedeutung. Beachten Sie, dass die Namen der Umgebungsvariablen immer in Großbuchstaben geschrieben sind:
+
+[[shell-env-vars]]
+.Gebräuchliche Umgebungsvariablen
+[cols="1,1", frame="none", options="header"]
+|===
+| Variable
+| Beschreibung
+
+|`USER`
+|Name des angemeldeten Benutzers.
+
+|`PATH`
+|Liste mit Verzeichnissen (getrennt durch Doppelpunkt) zum Suchen nach Programmen.
+
+|`DISPLAY`
+|Der Name des Xorg-Bildschirms, auf dem Ausgaben erfolgen sollen.
+
+|`SHELL`
+|Die aktuelle Shell.
+
+|`TERM`
+|Name des Terminaltyps des Benutzers. Benutzt, um die Fähigkeiten des Terminals zu bestimmen.
+
+|`TERMCAP`
+|Datenbankeintrag der Terminal Escape Codes, benötigt um verschieden Terminalfunktionen auszuführen.
+
+|`OSTYPE`
+|Typ des Betriebssystems.
+
+|`MACHTYPE`
+|Die CPU-Architektur des Systems.
+
+|`EDITOR`
+|Vom Benutzer bevorzugter Text-Editor.
+
+|`PAGER`
+|Vom Benutzer bevorzugter Text-Betrachter.
+
+|`MANPATH`
+|Liste mit Verzeichnissen (getrennt durch Doppelpunkt) zum Suchen nach Manualpages.
+|===
+
+Das Setzen von Umgebungsvariablen unterscheidet sich von Shell zu Shell. In man:tcsh[1] und man:csh[1] wird dazu `setenv` benutzt. man:sh[1] und `bash` benutzen `export` um Umgebungsvariablen zu setzen. Dieses Beispiel für die man:tcsh[1]-Shell setzt die Variable `EDITOR` auf [.filename]#/usr/local/bin/emacs#:
+
+[source,bash]
+....
+% setenv EDITOR /usr/local/bin/emacs
+....
+
+Der entsprechende Befehl für `bash` wäre:
+
+[source,bash]
+....
+% export EDITOR="/usr/local/bin/emacs"
+....
+
+Um eine Umgebungsvariable zu expandieren, geben Sie in der Kommandozeile das Zeichen `$` vor dessen Namen ein. Zum Beispiel gibt `echo $TERM` den aktuellen Wert von`$TERM` aus.
+
+Shells behandeln Spezialzeichen, so genannte Metazeichen, als besondere Darstellungen für Daten. Das häufigste Zeichen ist `\*`, das eine beliebige Anzahl Zeichen in einem Dateinamen repräsentiert. Metazeichen können zur Vervollständigung von Dateinamen (Globbing) benutzt werden. Beispielsweise liefert `echo *` nahezu das gleiche wie `ls`, da die Shell alle Dateinamen die mit `*` übereinstimmen, an `echo` weitergibt.
+
+Um zu verhindern, dass die Shell ein Sonderzeichen interpretiert, schützt man es, indem man einen Backslash (`\`) voranstellt. Zum Beispiel zeigt `echo $TERM` die Einstellung des Terminals an, wohingegen `echo \$TERM` einfach die Zeichenfolge `$TERM` ausgibt.
+
+[[changing-shells]]
+=== Ändern der Shell
+
+Der einfachste Weg die Standard Shell zu ändern, ist `chsh` zu benutzen. `chsh` startet den Editor, welcher durch die Umgebungsvariable `EDITOR` gesetzt ist. Standardmäßig ist dies man:vi[1]. Tragen Sie in die Zeile die mit `Shell:` beginnt, den absoluten Pfad der neuen Shell ein.
+
+Alternativ setzt `chsh -s` die Shell, ohne dabei einen Editor aufzurufen. Um die Shell zum Beispiel auf `bash` zu ändern, geben Sie folgenden Befehl ein:
+
+[source,bash]
+....
+% chsh -s /usr/local/bin/bash
+....
+
+[NOTE]
+====
+Die neue Shell _muss_ in [.filename]#/etc/shells# aufgeführt sein. Wurde die Shell aus der FreeBSD Ports-Sammlung installiert, so wie in crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports] beschrieben, sollte sie automatisch zu dieser Datei hinzugefügt worden sein. Wenn der Eintrag fehlt, nutzen Sie folgenden Befehl, und ersetzen Sie den Pfad mit dem Pfad zur gewünschten Shell:
+
+[source,bash]
+....
+# echo /usr/local/bin/bash >> /etc/shells
+....
+
+Danach kann man:chsh[1] erneut aufgerufen werden.
+====
+
+=== Fortgeschrittene Shell Techniken
+
+Die UNIX(R)-Shell ist nicht nur ein Kommandozeileninterpreter, sie ist ein leistungsfähiges Werkzeug, das Benutzern die Ausführung von Befehlen ermöglicht. Es kann die Ein- und Ausgabe umleiten und Befehle miteinander verketten, um die finale Ausgabe zu verbessern. Diese Funktionalität, gepaart mit den eingebauten Befehlen, bietet dem Benutzer eine Umgebung, welche die Effizienz erheblich steigern kann.
+
+Als Redirection bezeichnet man die Umleitung der Ein- oder Ausgabe in einen anderen Befehl oder Datei. Um beispielsweise die Ausgabe des Befehls man:ls[1] in eine Datei zu schreiben, muss die Ausgabe umgeleitet werden:
+
+[source,bash]
+....
+% ls > Verzeichnis_Ausgabe.txt
+....
+
+Die Datei [.filename]#Verzeichnis_Ausgabe.txt# enthält nun den Verzeichnisinhalt. Einige Befehle, wie beispielsweise man:sort[1], können verwendet werden um von der Eingabe zu lesen. Wenn Sie die Ausgabe sortieren möchten, müssen Sie die Eingabe umleiten:
+
+[source,bash]
+....
+% sort < Verzeichnis_Ausgabe.txt
+....
+
+Die Eingabe wird sortiert und auf dem Bildschirm ausgegeben. Um diese Ausgabe wiederum in eine Datei umzuleiten, kann die Ausgabe von man:sort[1] umgeleitet werden:
+
+[source,bash]
+....
+% sort < Verzeichnis_Ausgabe.txt > Sortierte_Ausgabe.txt
+....
+
+In den bisherigen Beispielen wurden für die Umleitung Dateideskriptoren verwendet. Jedes UNIX(R)-System verfügt über drei Dateideskriptoren: Standardeingabe (stdin), Standardausgabe (stdout) und Stardardfehlerausgabe (stderr). Jeder Deskriptor hat einen bestimmten Zweck. Die Eingabe könnte von einer Tastatur, einer Maus oder einem anderen Eingabegerät stammen. Die Ausgabe könnte der Bildschirm oder ein Drucker sein. Die Standardfehlerausgabe wird zur Diagnose und für Fehlermeldungen verwendet. Alle drei Deskriptoren arbeiten I/O basiert und werden häufig als Streams bezeichnet.
+
+Die Verwendung von Deskriptoren erlaubt es der Shell, die Ein- und Ausgabe von verschiedenen Kommandos umzuleiten und zu teilen. Eine weitere Möglichkeit zur Umleitung bietet der Pipe-Operator.
+
+Der UNIX(R) Pipe-Operator "|" wird verwendet, um die Ausgabe eines Kommandos an ein anderes Programm zu übergeben. Grundsätzlich bedeutet dies, dass die Standardausgabe eines Programms als Standardeingabe für ein weiteres Programm verwendet wird. Ein Beispiel:
+
+[source,bash]
+....
+% cat Verzeichnis_Auflistung.txt | sort | less
+....
+
+In diesem Beispiel wird der Inhalt von [.filename]#Verzeichnis_Auflistung.txt# sortiert und die Ausgabe an man:less[1] übergeben. Dies erlaubt es dem Benutzer, die Ausgabe Schritt für Schritt und im eigenen Tempo zu betrachten.
+
+[[editors]]
+== Text-Editoren
+
+Die meiste Konfiguration unter FreeBSD wird durch das Editieren von Textdateien erledigt. Deshalb ist es eine gute Idee, mit einem Texteditor vertraut zu werden. FreeBSD hat ein paar davon im Basissystem und sehr viel mehr in der Ports-Sammlung.
+
+Ein einfach zu erlernender Editor ist man:ee[1], was für easy editor steht. Um diesen Editor zu starten, gibt man in der Kommandozeile `ee _filename_` ein, wobei _filename_ den Namen der zu editierenden Datei darstellt. Einmal im Editor, finden sich alle Editor-Funktionen oben im Display aufgelistet. Das Einschaltungszeichen (`^`) steht für die kbd:[Ctrl] (oder kbd:[Strg]) Taste, mit `^e` ist also die Tastenkombination kbd:[Ctrl+e] gemeint. Um man:ee[1] zu verlassen, drücken Sie kbd:[Esc] und wählen dann im Hauptmenü `leave editor` aus. Der Editor fragt nach, ob Sie speichern möchten, wenn die Datei verändert wurde.
+
+FreeBSD verfügt über leistungsfähigere Editoren wie man:vi[1] als Teil des Basissystems. Andere Editoren wie package:editors/emacs[] und package:editors/vim[] sind Teil der Ports-Sammlung. Diese Editoren bieten höhere Funktionalität, jedoch auf Kosten einer etwas schwierigeren Erlernbarkeit. Das Erlernen eines leistungsfähigeren Editors, wie vim oder Emacs, kann auf lange Sicht Zeit einsparen.
+
+Viele Anwendungen, die Dateien verändern oder Texteingabe erwarten, werden automatisch einen Texteditor öffnen. Um den Standardeditor zu ändern, wird die Umgebungsvariable `EDITOR` gesetzt, wie im Abschnitt <<shells>> beschrieben.
+
+[[basics-devices]]
+== Geräte und Gerätedateien
+
+Der Begriff Gerät wird meist in Verbindung mit Hardware wie Laufwerken, Druckern, Grafikkarten oder Tastaturen gebraucht. Der Großteil der Meldungen, die beim Booten von FreeBSD angezeigt werden, beziehen sich auf gefundene Geräte. Eine Kopie dieser Bootmeldungen wird in [.filename]#/var/run/dmesg.boot# gespeichert.
+
+Jedes Gerät verfügt über einen Gerätenamen und Gerätenummer. Zum Beispiel steht [.filename]#ada0# für die erste SATA Festplatte, während [.filename]#kbd0# die Tastatur repräsentiert.
+
+Auf die meisten Geräte wird unter FreeBSD über spezielle Gerätedateien im [.filename]#/dev# Verzeichnis zugegriffen.
+
+[[basics-more-information]]
+== Manualpages
+
+[[basics-man]]
+=== Manualpages
+
+Die umfassendste Dokumentation rund um FreeBSD gibt es in Form von Manualpages. Annähernd jedes Programm im System bringt eine kurze Referenzdokumentation mit, die die grundsätzliche Funktion und verschiedene Parameter erklärt. Diese Manuals können mit `man` eingesehen werden:
+
+[source,bash]
+....
+% man Kommando
+....
+
+_Kommando_ ist der Name des Kommandos, über das man etwas erfahren will. Um beispielsweise mehr über das Kommando man:ls[1] zu erfahren, geben Sie ein:
+
+[source,bash]
+....
+% man ls
+....
+
+Die Manualpages sind in nummerierte Sektionen unterteilt, die jeweils ein Thema darstellen. In FreeBSD sind die folgenden Sektionen verfügbar:
+
+. Benutzerkommandos.
+. Systemaufrufe und Fehlernummern.
+. Funktionen der C Bibliothek.
+. Gerätetreiber.
+. Dateiformate.
+. Spiele und andere Unterhaltung.
+. Verschiedene Informationen.
+. Systemverwaltung und -Kommandos.
+. Kernel Schnittstellen.
+
+In einigen Fällen kann dasselbe Thema in mehreren Sektionen auftauchen. Es gibt zum Beispiel ein `chmod` Benutzerkommando und einen `chmod()` Systemaufruf. Um man:man[1] mitzuteilen, aus welcher Sektion die Information angezeigt werden soll, kann die Sektionsnummer mit angeben werden:
+
+[source,bash]
+....
+% man 1 chmod
+....
+
+Dies wird Ihnen die Manualpage für das Benutzerkommando man:chmod[1] zeigen. Verweise auf eine Sektion der Manualpages werden traditionell in Klammern gesetzt. So bezieht sich man:chmod[1] auf das Benutzerkommando und man:chmod[2] auf den Systemaufruf.
+
+Wenn das Kommando nicht bekannt ist, kann `man -k` benutzt werden, um nach Schlüsselbegriffen in den Kommandobeschreibungen zu suchen:
+
+[source,bash]
+....
+% man -k mail
+....
+
+Dieser Befehl zeigt eine Liste von Kommandos, deren Beschreibung das Schlüsselwort "mail" enthält. Die gleiche Funktionalität erhalten Sie auch, wenn Sie man:apropos[1] benutzen.
+
+Um die Beschreibungen der Kommandos in [.filename]#/usr/bin# zu lesen, geben Sie ein:
+
+[source,bash]
+....
+% cd /usr/bin
+% man -f * | more
+....
+
+Dasselbe erreichen Sie durch Eingabe von:
+
+[source,bash]
+....
+% cd /usr/bin
+% whatis * | more
+....
+
+[[basics-info]]
+=== GNU Info Dateien
+
+FreeBSD enthält verschiedene Anwendungen und Utilities der Free Software Foundation (FSF). Zusätzlich zu den Manualpages können diese Programme Hypertext-Dokumente enthalten, die `info`-Seiten genannt werden. Diese Dokumente können mit man:info[1] ansehen kann. Wenn package:editors/emacs[] installiert ist, kann auch der info-Modus von emacs benutzt werden.
+
+Um man:info[1] zu benutzen, geben Sie ein:
+
+[source,bash]
+....
+% info
+....
+
+Eine kurze Einführung gibt es mit `h`; eine Befehlsreferenz erhalten Sie durch Eingabe von: `?`.
diff --git a/documentation/content/de/books/handbook/bibliography/_index.adoc b/documentation/content/de/books/handbook/bibliography/_index.adoc
new file mode 100644
index 0000000000..6a5b5e937e
--- /dev/null
+++ b/documentation/content/de/books/handbook/bibliography/_index.adoc
@@ -0,0 +1,152 @@
+---
+title: Anhang B. Bibliografie
+part: Teil V. Anhang
+prev: books/handbook/mirrors
+next: books/handbook/eresources
+---
+
+[appendix]
+[[bibliography]]
+= Bibliografie
+:doctype: book
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: B
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/en/mailing-lists.adoc[]
+include::shared/en/teams.adoc[]
+include::shared/en/urls.adoc[]
+
+Während die Manualpages eine definitive Referenz über bestimmte Teile des FreeBSD-Betriebssystems bieten, so können sie jedoch selten veranschaulichen, wie man die einzelnen Teile zusammenfügt, um ein vollständig laufendes Betriebssystem herzustellen. Daher gibt es keinen Ersatz für ein gutes Buch oder Benutzerhandbuch über die Administration von UNIX(R)-Systemen.
+
+In der Regel handelt es sich im folgenden Kapitel um englische Ausgaben der genannten Werke. Übersetzungen oder Ausgaben in anderen Sprachen sind mit entsprechenden Hinweisen versehen.
+
+[[bibliography-freebsd]]
+== Bücher speziell für FreeBSD
+
+_Internationale Bücher:_
+
+* http://jdli.tw.FreeBSD.org/publication/book/freebsd2/index.htm[ Using FreeBSD], herausgegeben von http://www.drmaster.com.tw/[Drmaster], 1997 (in traditionellem Chinesisch). ISBN 9-578-39435-7.
+* FreeBSD Unleashed (in vereinfachtem Chinesisch), herausgegeben von http://www.hzbook.com/[China Press]. ISBN 7-111-10201-0.
+* FreeBSD From Scratch Second Edition (in vereinfachtem Chinesisch), herausgegeben von http://www.hzbook.com/[China Press]. ISBN 7-111-10286-X.
+* FreeBSD Handbook Second Edition (in vereinfachtem Chinesisch), herausgegeben von http://www.ptpress.com.cn/[Posts & Telecom Press]. ISBN 7-115-10541-3.
+* FreeBSD & Windows (in vereinfachtem Chinesisch), herausgegeben von http://www.tdpress.com/[China Railway Publishing House]. ISBN 7-113-03845-X.
+* FreeBSD Internet Services HOWTO (in vereinfachtem Chinesisch), herausgegeben von China Railway Publishing House. ISBN 7-113-03423-3.
+* FreeBSD (in japanischer Sprache), herausgegeben von CUTT. ISBN 4-906391-22-2 C3055 P2400E.
+* http://www.shoeisha.com/book/Detail.asp?bid=650[Complete Introduction to FreeBSD] (in Japanese), published by http://www.shoeisha.co.jp/[Shoeisha Co., Ltd]. ISBN 4-88135-473-6 P3600E.
+* http://www.ascii.co.jp/pb/book1/shinkan/detail/1322785.html[ Personal UNIX Starter Kit FreeBSD] (in japanischer Sprache), herausgegeben von http://www.ascii.co.jp/[ASCII]. ISBN 4-7561-1733-3 P3000E.
+* FreeBSD Handbook (japanische Übersetzung), herausgegeben von http://www.ascii.co.jp/[ASCII]. ISBN 4-7561-1580-2 P3800E.
+* FreeBSD mit Methode (in deutscher Sprache), herausgegeben von http://www.cul.de[Computer und Literatur Verlag] /Vertrieb Hanser, 1998. ISBN 3-932311-31-0.
+* http://www.mitp.de/vmi/mitp/detail/pWert/1343/[FreeBSD de Luxe] (in German), published by http://www.mitp.de[Verlag Modere Industrie], 2003. ISBN 3-8266-1343-0.
+* http://www.pc.mycom.co.jp/FreeBSD/install-manual.html[ FreeBSD Install and Utilization Manual] (in japanischer Sprache), herausgegeben von http://www.pc.mycom.co.jp/[ Mainichi Communications Inc.], 1998. ISBN 4-8399-0112-0.
+* Onno W Purbo, Dodi Maryanto, Syahrial Hubbany, Widjil Widodo _http://maxwell.itb.ac.id/[ Building Internet Server with FreeBSD]_ (in indonesischer Sprache), herausgegeben von http://www.elexmedia.co.id/[Elex Media Komputindo].
+* Absolute BSD: The Ultimate Guide to FreeBSD (in traditionellem Chinesisch), herausgegeben von http://www.grandtech.com.tw/[GrandTech Press], 2003. ISBN 986-7944-92-5.
+* http://www.twbsd.org/cht/book/[The FreeBSD 6.0 Book] (in traditionellem Chinesisch, herausgegeben von Drmaster, 2006. ISBN 9-575-27878-X.
+
+_Englischsprachige Bücher:_
+
+* http://www.absoluteFreeBSD.com/[Absolute FreeBSD, 2nd Edition: The Complete Guide to FreeBSD], herausgegeben von http://www.nostarch.com/[No Starch Press], 2007. ISBN: 978-1-59327-151-0
+
+* http://www.freebsdmall.com/cgi-bin/fm/bsdcomp[ The Complete FreeBSD], herausgegeben von http://www.oreilly.com/[O'Reilly], 2003. ISBN: 0596005164
+* http://www.freebsd-corp-net-guide.com/[The FreeBSD Corporate Networker's Guide], herausgegeben von http://www.awl.com/aw/[Addison-Wesley], 2002. ISBN: 0201704811
+* http://andrsn.stanford.edu/FreeBSD/introbook/[ FreeBSD: An Open-Source Operating System for Your Personal Computer], herausgegeben von The Bit Tree Press, 2001. ISBN: 0971204500
+* Teach Yourself FreeBSD in 24 Hours, herausgegeben von http://www.samspublishing.com/[Sams], 2002. ISBN: 0672324245
+* FreeBSD6 Unleashed, herausgegeben von http://www.samspublishing.com/[Sams], 2006. ISBN: 0672328755
+* FreeBSD: The Complete Reference, herausgegeben von http://books.mcgraw-hill.com[McGrawHill], 2003. ISBN: 0072224096
+
+[[bibliography-userguides]]
+== Handbücher
+
+* Die Ohio State University hat ein http://www.cs.duke.edu/csl/docs/unix_course/[UNIX Introductory Course] veröffentlicht, welcher auch online im HTML- und PostScriptformat verfügbar ist.
++
+Eine https://www.FreeBSD.org/doc/it_IT.ISO8859-15/books/unix-introduction/index.html[italienische Übersetzung] ist Teil des FreeBSD Italian Documentation Projects.
+* http://www.ed.ac.uk/[Edinburgh University] hat einen http://www.ed.ac.uk/information-services/help-consultancy/is-skills/catalogue/program-op-sys-catalogue/unix1[Online Guide] für Anfänger in Sachen UNIX geschrieben.
+
+[[bibliography-adminguides]]
+== Administrations-Anleitungen
+
+* http://www.jp.FreeBSD.org/[Jpman Project, Japan FreeBSD Users Group]. http://www.pc.mycom.co.jp/FreeBSD/sam.html[FreeBSD System Administrator's Manual] (japanische Übersetzung). http://www.pc.mycom.co.jp/[Mainichi Communications Inc.], 1998. ISBN4-8399-0109-0 P3300E.
+* Dreyfus, Emmanuel. http://www.eyrolles.com/Informatique/Livre/9782212114638/[Cahiers de l'Admin: BSD] 2nd Ed. (in French), Eyrolles, 2004. ISBN 2-212-11463-X.
+
+[[bibliography-programmers]]
+== Programmierhandbücher
+
+* Computer Systems Research Group, UC Berkeley. _4.4BSD Programmer's Reference Manual_. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-078-3
+* Computer Systems Research Group, UC Berkeley. _4.4BSD Programmer's Supplementary Documents_. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-079-1
+* Harbison, Samuel P. and Steele, Guy L. Jr. _C: A Reference Manual_. 4th Ed. Prentice Hall, 1995. ISBN 0-13-326224-3
+* Kernighan, Brian and Dennis M. Ritchie. _The C Programming Language_. 2nd Ed., PTR Prentice Hall, 1988. ISBN 0-13-110362-9
+* Lehey, Greg. _Porting UNIX Software_. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-126-7
+* Plauger, P. J. _The Standard C Library_. Prentice Hall, 1992. ISBN 0-13-131509-9
+* Spinellis, Diomidis. http://www.spinellis.gr/codereading/[Code Reading: The Open Source Perspective]. Addison-Wesley, 2003. ISBN 0-201-79940-5
+* Spinellis, Diomidis. http://www.spinellis.gr/codequality/[Code Quality: The Open Source Perspective]. Addison-Wesley, 2006. ISBN 0-321-16607-8
+* Stevens, W. Richard and Stephen A. Rago. _Advanced Programming in the UNIX Environment_. 2nd Ed. Reading, Mass. : Addison-Wesley, 2005. ISBN 0-201-43307-9
+* Stevens, W. Richard. _UNIX Network Programming_. 2nd Ed, PTR Prentice Hall, 1998. ISBN 0-13-490012-X
+
+[[bibliography-osinternals]]
+== Betriebssystem-Interna
+
+* Andleigh, Prabhat K. _UNIX System Architecture_. Prentice-Hall, Inc., 1990. ISBN 0-13-949843-5
+* Jolitz, William. "Porting UNIX to the 386". _Dr. Dobb's Journal_. January 1991-July 1992.
+* Leffler, Samuel J., Marshall Kirk McKusick, Michael J Karels and John Quarterman _The Design and Implementation of the 4.3BSD UNIX Operating System_. Reading, Mass. : Addison-Wesley, 1989. ISBN 0-201-06196-1
++
+Kapitel 2 dieses Buchs ist Teil des FreeBSD Documentation Projects und link:{design-44bsd}[online] erhältlich.
+* Leffler, Samuel J., Marshall Kirk McKusick, _The Design and Implementation of the 4.3BSD UNIX Operating System: Answer Book_. Reading, Mass. : Addison-Wesley, 1991. ISBN 0-201-54629-9
+* McKusick, Marshall Kirk, Keith Bostic, Michael J Karels, and John Quarterman. _The Design and Implementation of the 4.4BSD Operating System_. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-54979-4
+* Marshall Kirk McKusick, George V. Neville-Neil. _The Design and Implementation of the FreeBSD Operating System_. Boston, Mass. : Addison-Wesley, 2004. ISBN 0-201-70245-2
+* Marshall Kirk McKusick, George V. Neville-Neil, Robert N. M. Watson _The Design and Implementation of the FreeBSD Operating System, 2nd Ed._. Westford, Mass: Pearson Education, Ind., 2014. ISBN 0-321-96897-2
+* Stevens, W. Richard. _TCP/IP Illustrated, Volume 1: The Protocols_. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-63346-9
+* Schimmel, Curt. _Unix Systems for Modern Architectures_. Reading, Mass. : Addison-Wesley, 1994. ISBN 0-201-63338-8
+* Stevens, W. Richard. _TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP and the UNIX Domain Protocols_. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-63495-3
+* Vahalia, Uresh. _UNIX Internals -- The New Frontiers_. Prentice Hall, 1996. ISBN 0-13-101908-2
+* Wright, Gary R. and W. Richard Stevens. _TCP/IP Illustrated, Volume 2: The Implementation_. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-63354-X
+
+[[bibliography-security]]
+== Sicherheits-Anleitung
+
+* Cheswick, William R. and Steven M. Bellovin. _Firewalls and Internet Security: Repelling the Wily Hacker_. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-63357-4
+* Garfinkel, Simson. _PGP Pretty Good Privacy_ O'Reilly & Associates, Inc., 1995. ISBN 1-56592-098-8
+
+[[bibliography-hardware]]
+== Hardware-Anleitung
+
+* Anderson, Don and Tom Shanley. _Pentium Processor System Architecture_. 2nd Ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40992-5
+* Ferraro, Richard F. _Programmer's Guide to the EGA, VGA, and Super VGA Cards_. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-62490-7
+* Die Intel Corporation veröffentlicht Dokumentationen Ihrer CPUs, Chipsets und Standards auf ihrer http://developer.intel.com/[developer web site], normalerweise als PDF-Dateien.
+* Shanley, Tom. _80486 System Architecture_. 3rd Ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40994-1
+* Shanley, Tom. _ISA System Architecture_. 3rd Ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40996-8
+* Shanley, Tom. _PCI System Architecture_. 4th Ed. Reading, Mass. : Addison-Wesley, 1999. ISBN 0-201-30974-2
+* Van Gilluwe, Frank. _The Undocumented PC_, 2nd Ed. Reading, Mass: Addison-Wesley Pub. Co., 1996. ISBN 0-201-47950-8
+* Messmer, Hans-Peter. _The Indispensable PC Hardware Book_, 4th Ed. Reading, Mass: Addison-Wesley Pub. Co., 2002. ISBN 0-201-59616-4
+
+[[bibliography-history]]
+== UNIX(R) Geschichte
+
+* Lion, John _Lion's Commentary on UNIX, 6th Ed. With Source Code_. ITP Media Group, 1996. ISBN 1573980137
+* Raymond, Eric S. _The New Hacker's Dictionary, 3rd edition_. MIT Press, 1996. ISBN 0-262-68092-0. Auch bekannt als das http://www.catb.org/~esr/jargon/html/index.html[Jargon File]
+* Salus, Peter H. _A quarter century of UNIX_. Addison-Wesley Publishing Company, Inc., 1994. ISBN 0-201-54777-5
+* Simon Garfinkel, Daniel Weise, Steven Strassmann. _The UNIX-HATERS Handbook_. IDG Books Worldwide, Inc., 1994. ISBN 1-56884-203-1. http://www.simson.net/ref/ugh.pdf[Online] verfügbar.
+* Don Libes, Sandy Ressler _Life with UNIX_ - special edition. Prentice-Hall, Inc., 1989. ISBN 0-13-536657-7
+* _The BSD family tree_. https://svnweb.freebsd.org/base/head/shared/misc/bsd-family-tree?view=co[https://svnweb.freebsd.org/base/head/shared/misc/bsd-family-tree=view=co] oder unter link:file://localhost/usr/shared/misc/bsd-family-tree[/usr/shared/misc/bsd-family-tree] auf einem FreeBSD-System.
+* _Networked Computer Science Technical Reports Library_.
+* _Old BSD releases from the Computer Systems Research group (CSRG)_. http://www.mckusick.com/csrg/[http://www.mckusick.com/csrg/]: Das Paket mit 4 CD-ROMs enthält alle BSD-Versionen von 1BSD bis 4.4BSD und 4.4BSD-Lite2 (nicht aber 2.11BSD). Die letzte CD beinhaltet auch die finalen Sourcen inklusive den SCCS Dateien.
+
+[[bibliography-journals]]
+== Zeitschriften, Magazine und Journale
+
+* http://www.admin-magazin.de/[Admin Magazin] (in deutscher Sprache), herausgegeben von Medialinx AG. ISSN: 2190-1066
+* http://www.bsdmag.org/[BSD Magazine], herausgegeben von Software Press Sp. z o.o. SK. ISSN: 1898-9144
+* http://www.bsdnow.tv/[BSD Now - Video Podcast], herausgegeben von Jupiter Broadcasting LLC
+* http://bsdtalk.blogspot.com/[BSD Talk Podcast], von Will Backman
+* http://freebsdjournal.com/[FreeBSD Journal], herausgegeben von S&W Publishing, gefördert durch The FreeBSD Foundation. ISBN: 978-0-615-88479-0
diff --git a/documentation/content/de/books/handbook/book.adoc b/documentation/content/de/books/handbook/book.adoc
new file mode 100644
index 0000000000..ebeac83241
--- /dev/null
+++ b/documentation/content/de/books/handbook/book.adoc
@@ -0,0 +1,172 @@
+---
+title: FreeBSD Handbuch
+authors:
+ - author: The FreeBSD Documentation Project
+copyright: 1995-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "ibm", "ieee", "redhat", "3com", "adobe", "apple", "intel", "linux", "microsoft", "opengroup", "sun", "realnetworks", "oracle", "3ware", "arm", "adaptec", "google", "heidelberger", "intuit", "lsilogic", "themathworks", "thomson", "vmware", "wolframresearch", "xiph", "xfree86", "general"]
+---
+
+= FreeBSD Handbuch
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:toc-title: Inhaltsverzeichnis
+:part-signifier: Teil
+:chapter-signifier: Kapitel
+:appendix-caption: Anhang
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:book: true
+:pdf: false
+:pgpkeys-path: ../../../../../
+
+ifeval::["{backend}" == "html5"]
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+:chapters-path: content/de/books/handbook/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/de/mailing-lists.adoc[]
+include::../../../../shared/de/teams.adoc[]
+include::../../../../shared/de/urls.adoc[]
+:chapters-path:
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/de/mailing-lists.adoc[]
+include::../../../../shared/de/teams.adoc[]
+include::../../../../shared/de/urls.adoc[]
+:chapters-path:
+endif::[]
+
+[.abstract-title]
+[abstract]
+Zusammenfassung
+
+Willkommen bei FreeBSD! Dieses Handbuch beschreibt die Installation und den täglichen Umgang mit _FreeBSD {rel121-current}-RELEASE_, _FreeBSD {rel113-current}-RELEASE_. Das Handbuch ist das Ergebnis einer fortlaufenden Arbeit vieler Einzelpersonen. Dies kann dazu führen, dass einige Abschnitte nicht aktuell sind. Bei Unklarheiten empfiehlt es sich daher stets, die link:{handbook}[englische Originalversion] des Handbuchs zu lesen.
+
+Wenn Sie bei der Übersetzung des Handbuchs mithelfen möchten, senden Sie bitte eine E-Mail an die Mailingliste {de-doc}.
+
+Die aktuelle Version des Handbuchs ist immer auf dem https://www.FreeBSD.org/[FreeBSD-Webserver] verfügbar und kann in verschiedenen Formaten und in komprimierter Form vom https://download.freebsd.org/ftp/doc[FreeBSD FTP-Server] oder einem der vielen <<mirrors-ftp,Spiegel>> herunter geladen werden (ältere Versionen finden Sie hingegen unter https://docs.FreeBSD.org/doc/[https://docs.FreeBSD.org/doc/]). Gedruckte Kopien können bei https://www.freebsdmall.com/[FreeBSD Mall] erworben werden. Vielleicht möchten Sie das Handbuch oder andere Dokumente auch link:https://www.FreeBSD.org/search/[durchsuchen].
+
+'''
+
+toc::[]
+
+:sectnums!:
+
+include::{chapters-path}preface/_index.adoc[leveloffset=+1, lines=7..-1]
+
+:sectnums:
+
+// Section one
+include::{chapters-path}parti.adoc[lines=8..18]
+
+include::{chapters-path}introduction/_index.adoc[leveloffset=+1, lines=8..24;35..-1]
+
+include::{chapters-path}bsdinstall/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}basics/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}ports/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}x11/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+// Section two
+include::{chapters-path}partii.adoc[lines=8..18]
+
+include::{chapters-path}desktop/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}multimedia/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}kernelconfig/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}printing/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}linuxemu/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+// Section three
+include::{chapters-path}partiii.adoc[lines=8..12]
+
+include::{chapters-path}config/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}boot/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}security/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}jails/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}mac/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}audit/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}disks/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}geom/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}zfs/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}filesystems/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}virtualization/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}l10n/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}cutting-edge/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}dtrace/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}usb-device-mode/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+// Section four
+include::{chapters-path}partiv.adoc[lines=8..19]
+
+include::{chapters-path}serialcomms/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}ppp-and-slip/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}mail/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}network-servers/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}firewalls/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+include::{chapters-path}advanced-networking/_index.adoc[leveloffset=+1, lines=8..37;47..-1]
+
+// Section five
+include::{chapters-path}partv.adoc[lines=7..8]
+
+:sectnums!:
+
+include::{chapters-path}mirrors/_index.adoc[leveloffset=+1, lines=8..24;33..-1]
+
+include::{chapters-path}bibliography/_index.adoc[leveloffset=+1, lines=8..24;32..-1]
+
+include::{chapters-path}eresources/_index.adoc[leveloffset=+1, lines=8..24;33..-1]
+
+include::{chapters-path}pgpkeys/_index.adoc[leveloffset=+1, lines=8..24;34..-1]
+
+:sectnums:
diff --git a/documentation/content/de/books/handbook/boot/_index.adoc b/documentation/content/de/books/handbook/boot/_index.adoc
new file mode 100644
index 0000000000..ce53d5e9e1
--- /dev/null
+++ b/documentation/content/de/books/handbook/boot/_index.adoc
@@ -0,0 +1,419 @@
+---
+title: Kapitel 12. FreeBSDs Bootvorgang
+part: Teil III. Systemadministration
+prev: books/handbook/config
+next: books/handbook/security
+---
+
+[[boot]]
+= FreeBSDs Bootvorgang
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 12
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/boot/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/boot/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/boot/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[boot-synopsis]]
+== Übersicht
+
+Das Starten des Computers und das Laden des Betriebssystems wird im Allgemeinen als "Bootstrap-Vorgang", oder als "Booten" bezeichnet. FreeBSDs Bootvorgang ermöglicht große Flexibilität, was das Anpassen dessen anbelangt, was passiert, wenn das System gestartet wird. Es kann zwischen verschiedenen Betriebssystemen, die auf demselben Computer installiert sind oder verschiedenen Versionen desselben Betriebssystems oder installierten Kernels gewählt werden.
+
+Dieses Kapitel zeigt die zur Verfügung stehenden Konfigurationsmöglichkeiten und wie man den Bootvorgang anpasst. Dies schließt alles ein, bis der Kernel gestartet worden ist, der dann alle Geräte gefunden hat und man:init[8] gestartet hat. Dies passiert, wenn die Farbe des Textes während des Bootvorgangs von weiß zu grau wechselt.
+
+Dieses Kapitel informiert über folgende Punkte:
+
+* Die Komponenten des FreeBSD-Bootvorgangs und deren Interaktion.
+* Die Optionen, mit denen der FreeBSD-Bootvorgang gesteuert werden kann.
+* Wie ein angepasster Willkommensbildschirm beim Booten konfiguriert wird.
+* Wie Geräte mit man:device.hints[5] konfiguriert werden.
+* Wie das System in den Single-User-Modus und in den Mehrbenutzer-Modus gestartet wird und wie ein FreeBSD-System ordnungsgemäß heruntergefahren wird.
+
+[NOTE]
+====
+Dieses Kapitel erklärt den Bootvorgang von FreeBSD auf Intel x86- und amd64-Plattformen.
+====
+
+[[boot-introduction]]
+== FreeBSDs Bootvorgang
+
+Wenn der Computer eingeschaltet wird und das Betriebssystem gestartet werden soll, entsteht ein interessantes Dilemma, denn der Computer weiß per Definition nicht, wie er irgendetwas tut, bis das Betriebssystem gestartet wurde. Das schließt das Starten von Programmen, die sich auf der Festplatte befinden, ein. Wenn der Computer kein Programm von der Festplatte starten kann, sich das Betriebssystem aber genau dort befindet, wie wird es dann gestartet?
+
+Dieses Problem ähnelt einer Geschichte des Barons von Münchhausen. Dort war eine Person in einen Sumpf gefallen und hat sich selbst an den Riemen seiner Stiefel (engl. bootstrap) herausgezogen. In den jungen Jahren des Computerzeitalters wurde mit dem Begriff Bootstrap dann die Technik das Betriebssystem zu laden bezeichnet. Seither wurde es mit "booten" abgekürzt.
+
+Auf x86-Plattformen ist das Basic Input/Output System (BIOS) dafür verantwortlich, das Betriebssystem zu laden. Das BIOS liest den Master Boot Record (MBR) aus, der sich an einer bestimmten Stelle auf der Festplatte befinden muss. Das BIOS kann den MBR selbstständig laden und ausführen und geht davon aus, dass dieser die restlichen Dinge, die für das Laden des Betriebssystems notwendig sind, selbst oder mit Hilfe des BIOS erledigen kann.
+
+[NOTE]
+====
+FreeBSD ermöglicht das Booten sowohl über den alten MBR-Standard, als auch über die neuere GUID-Partitionstabelle (GPT). GPT-Partitionen finden sich häufig auf Systemen mit dem _Unified Extensible Firmware Interface_ (UEFI). FreeBSD kann allerdings mit Hilfe von man:gptboot[8] auch GPT-Partitionen über das alte BIOS booten. An der Unterstützung für ein direktes Booten über UEFI wird derzeit gearbeitet.
+====
+
+Der Code innerhalb des MBRs wird für gewöhnlich als _Boot-Manager_ bezeichnet, insbesondere, wenn eine Interaktion mit dem Anwender stattfindet. Der Boot-Manager verwaltet zusätzlichen Code im ersten _Track_ der Platte oder des Dateisystems. Zu den bekanntesten Boot-Managern gehören boot0, der auch als Boot Easy bekannte Standard-Boot-Manager von FreeBSD, sowie Grub, welches in vielen Linux(R)-Distributionen verwendet wird.
+
+Falls nur ein Betriebssystem installiert ist, sucht der MBR nach dem ersten bootbaren Slice (das dabei als _active_ gekennzeichnet ist) auf dem Laufwerk und führt den dort vorhandenen Code aus, um das restliche Betriebssystem zu laden. Wenn mehrere Betriebssysteme installiert sind, kann ein anderer Boot-Manager installiert werden, der eine Liste der verfügbaren Betriebssysteme anzeigt, so dass der Benutzer wählen kann, welches Betriebssystem er booten möchte.
+
+Das restliche FreeBSD-Bootstrap-System ist in drei Phasen unterteilt. Die erste Phase besitzt gerade genug Funktionalität um den Computer in einen bestimmten Status zu verhelfen und die zweite Phase zu starten. Die zweite Phase führt ein wenig mehr Operationen durch und startet schließlich die dritte Phase, die das Laden des Betriebssystems abschließt. Der ganze Prozess wird in drei Phasen durchgeführt, weil der MBR die Größe der Programme, die in Phase eins und zwei ausgeführt werden, limitiert. Das Verketten der durchzuführenden Aufgaben ermöglicht es FreeBSD, ein sehr flexibles Ladeprogramm zu besitzen.
+
+Als nächstes wird der Kernel gestartet, der zunächst nach Geräten sucht und sie für den Gebrauch initialisiert. Nach dem Booten des Kernels übergibt dieser die Kontrolle an den Benutzer Prozess man:init[8], der erst sicherstellt, dass alle Laufwerke benutzbar sind und die Ressourcen Konfiguration auf Benutzer Ebene startet. Diese wiederum mountet Dateisysteme, macht die Netzwerkkarten für die Kommunikation mit dem Netzwerk bereit und startet alle Prozesse, die konfiguriert wurden, um beim Hochfahren gestartet zu werden.
+
+Dieser Abschnitt beschreibt die einzelnen Phasen und wie sie mit dem FreeBSD-Bootvorgang interagieren.
+
+[[boot-boot0]]
+=== Der Boot-Manager
+
+Der Boot-Manager Code im MBR wird manchmal auch als _stage zero_ des Boot-Prozesses bezeichnet. In der Voreinstellung verwendet FreeBSD den boot0 Boot-Manager.
+
+Der vom FreeBSD-Installationsprogramm in der Voreinstelung installierte MBR basiert auf [.filename]#/boot/boot0#. Die Größe und Leistungsfähigkeit von boot0 ist auf 446 Bytes beschränkt, weil der restliche Platz für die Partitionstabelle sowie den `0x55AA`-Identifier am Ende des MBRs benötigt wird. Wenn boot0 und mehrere Betriebssysteme installiert sind, wird beim Starten des Computers eine Anzeige ähnlich der folgenden zu sehen sein:
+
+[[boot-boot0-example]]
+.[.filename]#boot0#-Screenshot
+[example]
+====
+
+[source,bash]
+....
+F1 Win
+F2 FreeBSD
+
+Default: F2
+....
+
+====
+
+Diverse Betriebssysteme überschreiben den existierenden MBR, wenn sie nach FreeBSD installiert werden. Falls dies passiert, kann mit folgendem Kommando der momentane MBR durch den FreeBSD-MBR ersetzt werden:
+
+[source,bash]
+....
+# fdisk -B -b /boot/boot0 Gerät
+....
+
+Bei _Gerät_ handelt es sich um das Gerät, von dem gebootet wird, also beispielsweise [.filename]#ad0# für die erste IDE-Festplatte, [.filename]#ad2# für die erste IDE-Festplatte am zweiten IDE-Controller, [.filename]#da0# für die erste SCSI-Festplatte. Um eine angepasste Konfiguration des MBR zu erstellen, lesen Sie man:boot0cfg[8].
+
+[[boot-boot1]]
+=== Phase Eins und Phase Zwei
+
+Im Prinzip sind die erste und die zweite Phase Teile desselben Programms, im selben Bereich auf der Festplatte. Aufgrund von Speicherplatz-Beschränkungen wurden sie in zwei Teile aufgeteilt, welche jedoch immer zusammen installiert werden. Beide werden entweder vom FreeBSD-Installationsprogramm oder `bsdlabel` aus der kombinierten [.filename]#/boot/boot# kopiert.
+
+Beide Phasen befinden sich außerhalb des Dateisystems im Bootsektor des Boot-Slices, wo boot0 oder ein anderer Boot-Manager ein Programm erwarten, das den weiteren Bootvorgang durchführen kann.
+
+Die erste Phase, [.filename]#boot1#, ist ein sehr einfaches Programm, da es nur 512 Bytes groß sein darf. Es besitzt gerade genug Funktionalität, um FreeBSDs _bsdlabel_, das Informationen über den Slice enthält, auszulesen, und um [.filename]#boot2# zu finden und auszuführen.
+
+Die zweite Phase, [.filename]#boot2#, ist schon ein wenig umfangreicher und besitzt genügend Funktionalität, um Dateien in FreeBSDs Dateisystem zu finden. Es kann eine einfache Schnittstelle bereitstellen, die es ermöglicht, den zu ladenden Kernel oder Loader auszuwählen. Es lädt den loader, der einen weitaus größeren Funktionsumfang bietet und eine Konfigurationsdatei zur Verfügung stellt. Wenn der Boot-Prozess während der zweiten Phase unterbrochen wird, erscheint der folgende Bildschrim:
+
+[[boot-boot2-example]]
+.[.filename]#boot2#-Screenshot
+[example]
+====
+
+[source,bash]
+....
+>> FreeBSD/i386 BOOT
+Default: 0:ad(0,a)/boot/loader
+boot:
+....
+
+====
+
+Um das installierte [.filename]#boot1# und [.filename]#boot2# zu ersetzen, benutzen Sie `bsdlabel`, wobei _diskslice_ das Laufwerk und die Slice darstellt, von dem gebootet wird, beispielsweise [.filename]#ad0s1# für die erste Slice auf der ersten IDE-Festplatte:
+
+[source,bash]
+....
+# bsdlabel -B diskslice
+....
+
+[WARNING]
+====
+
+Wenn man nur den Festplatten-Namen benutzt, beispielsweise [.filename]#ad0#, wird `bsdlabel` eine "dangerously dedicated disk" erstellen, ohne Slices. Das ist ein Zustand, den man meistens nicht hervorrufen möchte. Aus diesem Grund sollte man das _diskslice_ noch einmal prüfen, bevor kbd:[Return] gedrückt wird.
+====
+
+[[boot-loader]]
+=== Phase Drei
+
+Der loader ist der letzte von drei Schritten im Bootstrap-Prozess. Er kann im Dateisystem normalerweise als [.filename]#/boot/loader# gefunden werden.
+
+Der loader soll eine interaktive Konfigurations-Schnittstelle mit eingebauten Befehlssatz sein, ergänzt durch einen umfangreichen Interpreter mit einem komplexeren Befehlssatz.
+
+Der loader sucht während seiner Initialisierung nach Konsolen und Laufwerken, findet heraus, von welchem Laufwerk er gerade bootet, und setzt dementsprechend bestimmte Variablen. Dann wird ein Interpreter gestartet, der Befehle interaktiv oder von einem Skript empfangen kann.
+
+Danach liest der loader [.filename]#/boot/loader.rc#, welche ihn standardmäßig anweist [.filename]#/boot/defaults/loader.conf# zu lesen, wo sinnvolle Standardeinstellungen für diverse Variablen festgelegt werden und wiederum [.filename]#/boot/loader.conf# für lokale Änderungen an diesen Variablen ausgelesen wird. Anschließend arbeitet dann [.filename]#loader.rc# entsprechend dieser Variablen und lädt die ausgewählten Module und den gewünschten Kernel.
+
+In der Voreinstellung wartet der loader 10 Sekunden lang auf eine Tastatureingabe und bootet den Kernel, falls keine Taste betätigt wurde. Falls doch eine Taste betätigt wurde wird dem Benutzer eine Eingabeaufforderung angezeigt. Sie nimmt einen Befehlssatz entgegen, der es dem Benutzer erlaubt, Änderungen an Variablen vorzunehmen, Module zu laden, alle Module zu entladen oder schließlich zu booten oder neu zu booten.
+
+[[boot-loader-commands]]
+.Die eingebauten Befehle des Loaders
+[cols="20%,80%", frame="none", options="header"]
+|===
+| Variable
+| Beschreibung
+
+|autoboot `_Sekunden_`
+|Es wird mit dem Booten des Kernels fortgefahren, falls keine Taste in der gegebenen Zeitspanne betätigt wurde. In der gegebenen Zeitspanne, Vorgabe sind 10 Sekunden, wird ein Countdown angezeigt.
+
+|boot [`-Optionen`] [`Kernelname`]
+|Bewirkt das sofortige Booten des Kernels mit allen gegebenen Optionen, oder dem angegebenen Kernelnamen. Das übergeben eines Kernelnamens ist nur nach einem `unload` anwendbar, andernfalls wird der zuvor verwendete Kernel benutzt. Wenn nicht der vollständige Pfad für _Kernelname_ angegeben wird, dann sucht der Loader den Kernel unter [.filename]#/boot/kernel# und [.filename]#/boot/modules#.
+
+|boot-conf
+|Bewirkt die automatische Konfiguration der Module, abhängig von den entsprechenden Variablen (üblicherweise `kernel`). Dies nur dann sinnvoll, wenn zuvor `unload` benutzt wurde.
+
+|help [`_Thema_`]
+|Zeigt die Hilfe an, die zuvor aus der Datei [.filename]#/boot/loader.help# gelesen wird. Falls `index` als Thema angegeben wird, wird die Liste der zur Verfügung stehenden Hilfe-Themen angezeigt.
+
+|include `_Dateiname_` ...
+|Das Einlesen und Interpretieren der angegebenen Datei geschieht Zeile für Zeile und wird im Falle eines Fehlers umgehend unterbrochen.
+
+|load [`-t _Typ_`] _Dateiname_
+|Lädt den Kernel, das Kernel-Modul, oder die Datei des angegebenen Typs. Argumente, die auf _Dateiname_ folgen, werden der Datei übergeben. Wenn nicht der vollständige Pfad für _Dateiname_ angegeben wird, dann sucht der Loader die Datei unter [.filename]#/boot/kernel# und [.filename]#/boot/modules#.
+
+|ls [`-l`] [`_Pfad_`]
+|Listet die Dateien im angegebenen Pfad auf, oder das Root-Verzeichnis, falls kein Pfad angegeben wurde. Die Option `-l` bewirkt, dass die Dateigrößen ebenfalls angezeigt werden.
+
+|lsdev [`-v`]
+|Listet alle Geräte auf, für die Module geladen werden können. Die Option `-v` bewirkt eine ausführliche Ausgabe.
+
+|lsmod [`-v`]
+|Listet alle geladenen Module auf. Die Option `-v` bewirkt eine ausführliche Ausgabe.
+
+|more `_Dateiname_`
+|Zeigt den Dateinhalt der angegebenen Datei an, wobei eine Pause alle `LINES` Zeilen gemacht wird.
+
+|reboot
+|Bewirkt einen umgehenden Neustart des Systems.
+
+|set `_Variable_`, set `_Variable=Wert_`
+|Setzt die angegebenen Umgebungsvariablen.
+
+|unload
+|Entlädt sämtliche geladenen Module.
+|===
+
+Hier ein paar praktische Beispiele für die Bedienung des Loaders. Um den gewöhnlichen Kernel im Single-User Modus zu starten:
+
+[source,bash]
+....
+ boot -s
+....
+
+Um alle gewöhnlichen Kernelmodule zu entladen und dann den alten, oder einen anderen Kernel zu laden:
+
+[source,bash]
+....
+unload
+/pfad/zur/kerneldatei
+....
+
+Verwenden Sie [.filename]#/boot/GENERIC/kernel#, um auf den allgemeinen Kernel zu verweisen, der bei jeder Installation dabei ist. [.filename]#/boot/kernel.old/kernel# hingegen bezeichnet den Kernel, der vor dem System-Upgrade installiert war.
+
+Der folgende Befehl lädt die gewöhnlichen Module mit einem anderen Kernel:
+
+[source,bash]
+....
+unload
+set kernel="meinkernel"
+boot-conf
+....
+
+Um ein automatisiertes Kernelkonfigurations-Skript zu laden, geben Sie ein:
+
+[source,bash]
+....
+ load -t userconfig_script /boot/kernel.conf
+....
+
+[[boot-init]]
+=== Die letzte Phase
+
+Sobald der Kernel einmal geladen ist, entweder durch den loader oder durch boot2, welches den Loader umgeht, dann überprüft er vorhandene Boot-Flags und passt sein Verhalten nach Bedarf an. In <<boot-kernel>> sind die gebräuchlichsten Boot-Flags aufgelistet. Informationen zu den anderen Boot-Flags finden Sie in man:boot[8].
+
+[[boot-kernel]]
+.Interaktion mit dem Kernel während des Bootens
+[cols="20%,80%", frame="none", options="header"]
+|===
+| Option
+| Beschreibung
+
+|`-a`
+|Bewirkt, dass während der Kernel-Initialisierung gefragt wird, welches Gerät als Root-Dateisystem eingehängt werden soll.
+
+|`-C`
+|Das Root-Dateisystem wird von CD-ROM gebootet.
+
+|`-s`
+|Bootet in den Single-User Modus
+
+|`-v`
+|Zeigt mehr Informationen während des Starten des Kernels an.
+|===
+
+Nachdem der Kernel den Bootprozess abgeschlossen hat, übergibt er die Kontrolle an den Benutzer-Prozess man:init[8]. Dieses Programm befindet sich in [.filename]#/sbin/init#, oder dem Pfad, der durch die Variable `init_path` im `loader` spezifiziert wird.
+
+Der automatische Reboot-Vorgang stellt sicher, dass alle Dateisysteme des Systems konsistent sind. Falls dies nicht der Fall ist und die Inkonsistenz des UFS-Dateisystems nicht durch `fsck` behebbar ist, schaltet `init` das System in den Single-User-Modus, damit der Systemadministrator sich des Problems annehmen kann. Andernfalls startet das System in den Mehrbenutzermodus.
+
+[[boot-singleuser]]
+==== Der Single-User Modus
+
+Der Wechsel in den Single-User Modus kann beim Booten durch die Option `-s`, oder das Setzen der Variable `boot_single` in loader erreicht werden. Zudem kann er auch im Mehrbenutzermodus über den Befehl `shutdown now` erreicht werden. Der Single-User Modus beginnt mit dieser Meldung:
+
+[.programlisting]
+....
+Enter full path of shell or RETURN for /bin/sh:
+....
+
+Wenn Sie die Eingabetaste drücken, wird das System die Bourne Shell starten. Falls Sie eine andere Shell starten möchten, geben Sie den vollständigen Pfad zur Shell ein.
+
+Der Single-User Modus wird normalerweise zur Reparatur verwendet, beispielsweise wenn das System aufgrund eines inkonsistenten Dateisystems oder einem Fehler in einer Konfigurationsdatei nicht bootet. Der Modus wird auch verwendet, um das Passwort von `root` zurückzusetzen, falls dieses nicht mehr bekannt ist. Dies alles ist möglich, da der Single-User Modus vollen Zugriff auf das lokale System und die Konfigurationsdateien gewährt. Einen Zugang zum Netzwerk bietet dieser Modus allerdings nicht.
+
+Obwohl der Single-User Modus für Reparaturen am System sehr nützlich ist, stellt es ein Sicherheitsrisiko dar, wenn sich das System an einem physisch unsicheren Standort befindet. In der Voreinstellung hat jeder Benutzer, der physischen Zugriff auf ein System erlangen kann, volle Kontrolle über das System, nachdem in den Single-User Modus gebootet wurde.
+
+Falls die System-Konsole (`console`) in [.filename]#/etc/ttys# auf `insecure` (dt.: unsicher) gesetzt ist, fordert das System zur Eingabe des `root` Passworts auf, bevor es den Single-User Modus aktiviert. Dadurch gewinnen Sie zwar ein gewisses Maß an Sicherheit, aber Sie können dann nicht mehr das Passwort von `root` zurücksetzen, falls es nicht bekannt ist.
+
+[[boot-insecure-console]]
+.Auf insecure gesetzte Konsole in [.filename]#/etc/ttys#
+[example]
+====
+[.programlisting]
+....
+# name getty type status comments
+#
+# If console is marked "insecure", then init will ask for the root password
+# when going to single-user mode.
+console none unknown off insecure
+....
+
+====
+
+Eine Konsole sollte auf `insecure` gesetzt sein, wenn die physikalische Sicherheit der Konsole nicht gegeben ist und sichergestellt werden soll, dass nur Personen, die das Passwort von `root` kennen, den Single-User Modus benutzen können.
+
+[[boot-multiuser]]
+==== Mehrbenutzermodus
+
+Stellt init fest, dass das Dateisystem in Ordnung ist, oder der Benutzer den Single-User-Modus mit `exit` beendet, schaltet das System in den Mehrbenutzermodus, in dem dann die Ressourcen Konfiguration des Systems gestartet wird.
+
+Das Ressourcen Konfigurationssystem (engl. resource configuration, rc) liest seine Standardkonfiguration von [.filename]#/etc/defaults/rc.conf# und System-spezifische Details von [.filename]#/etc/rc.conf#. Dann mountet es die Dateisysteme gemäß [.filename]#/etc/fstab#, startet die Netzwerkdienste, diverse System Daemons und führt schließlich die Start-Skripten der lokal installierten Anwendungen aus.
+
+Lesen Sie man:rc[8] und ebenso die Skripte in [.filename]#/etc/rc.d#, um mehr über das Ressourcen Konfigurationssystem zu erfahren.
+
+[[boot-splash]]
+== Willkommensbildschirme während des Bootvorgangs konfigurieren
+
+Wenn ein FreeBSD-System startet, gibt es normalerweise eine Reihe von Meldungen auf der Konsole aus. Ein Willkommensbildschirm erzeugt einen alternativen Boot-Bildschirm, der alle Bootmeldungen und Meldungen über startende Dienste versteckt. Ein paar Meldungen des Bootloaders, einschließlich das Menü mit den Bootoptionen und dem Warte-Countdown werden dennoch zur Bootzeit angezeigt, auch wenn der Willkommensbildschirm aktiviert ist. Der Willkommensbildschirm kann während des Bootvorgangs mit einem beliebigen Tastendruck ausgeschaltet werden.
+
+Es existieren zwei grundlegende Umgebungen in FreeBSD. Die erste ist die altbekannte, auf virtuellen Konsolen basierte Kommandozeile. Nachdem das System den Bootvorgang abgeschlossen hat, wird ein Anmeldebildschirm auf der Konsole anzeigt. Die zweite Umgebung ist eine konfigurierte, graphische Umgebung. crossref:x11[x11,Das X-Window-System] enthält weitere Informationen zur Installation und Konfiguration eines graphischen Display-Managers und Login-Managers.
+
+Der Willkommensbildschirm ist standardmäßig so eingestellt, dass er als Bildschirmschoner verwendet wird. Nach einer bestimmten Zeit der Untätigkeit wird der Willkommensbildschirm angezeigt und wechselt durch verschiedene Stufen der Intensität von hell zu einem sehr dunklen Bild und wieder zurück. Das Verhalten des Willkommensbildschirms kann durch hinzufügen einer `saver=`-Zeile in [.filename]#/etc/rc.conf# geändert werden. Es gibt mehrere eingebaute Bildschirmschoner, die in man:splash[4] beschrieben werden. Die `saver=`-Option bezieht sich nur auf virtuelle Konsolen und hat keinen Effekt bei grafischen Display-Managern.
+
+Durch die Installation des Ports oder Pakets package:sysutils/bsd-splash-changer[] werden Willkommensbildschirme von einer zufällig ausgewählten Sammlung von Bildern bei jedem Neustart angezeigt. Die Willkommensbildschirm-Funktionalität unterstützt 256-Farben in den Formaten Bitmap ([.filename]#.bmp#), ZSoft PCX ([.filename]#.pcx#) oder TheDraw ([.filename]#.bin#). Die Willkommensbildschirm-Datei [.filename]#.bmp#, [.filename]#.pcx# oder [.filename]#.bin# muss in der Root-Partition, beispielsweise unterhalb von [.filename]#/boot# abgelegt werden. Willkommensbildschirm-Dateien dürfen eine Auflösung von 320 mal 200 Pixeln oder weniger besitzen, damit Standard-VGA Geräte damit arbeiten können. Für eine Standard-Auflösung von 256-Farben, 320 mal 200 Pixel oder weniger, fügen Sie folgende Zeilen in [.filename]#/boot/loader.conf# ein und ersetzen Sie _splash.bmp_ mit dem Namen der Bitmap-Datei:
+
+[.programlisting]
+....
+splash_bmp_load="YES"
+bitmap_load="YES"
+bitmap_name="/boot/splash.bmp"
+....
+
+Wenn Sie anstelle der Bitmap-Datei eine PCX-Datei verwenden:
+
+[.programlisting]
+....
+splash_pcx_load="YES"
+bitmap_load="YES"
+bitmap_name="/boot/splash.pcx"
+....
+
+Für ASCII-Art im https://en.wikipedia.org/wiki/TheDraw[TheDraw]-Format schreiben Sie:
+
+[.programlisting]
+....
+splash_txt="YES"
+bitmap_load="YES"
+bitmap_name="/boot/splash.bin"
+....
+
+Weitere interessante Optionen für [.filename]#loader.conf# sind:
+
+`beastie_disable="YES"`::
+Diese Option verhindert die Anzeige des Menüs mit den Bootoptionen, aber der Countdown ist immer noch aktiv. Selbst wenn das Bootmenü deaktiviert ist, kann während des Countdowns eine der korrespondierenden Optionen ausgewählt werden.
+
+`loader_logo="beastie"`::
+Dies ersetzt die Standardanzeige des Wortes "FreeBSD". Stattdessen wird auf der rechten Seite des Bootmenüs das bunte Beastie-Logo angezeigt.
+
+Weitere Informationen finden Sie in man:splash[4], man:loader.conf[5] und man:vga[4].
+
+[[device-hints]]
+== Konfiguration von Geräten
+
+Der Boot-Loader liest während des Systemstarts die Datei man:device.hints[5], die Variablen, auch "device hints" genannt, zur Konfiguration von Geräten enthält.
+
+Die Variablen können auch mit Kommandos in Phase 3 des Boot-Loaders, wie in <<boot-loader>> beschrieben, bearbeitet werden. Neue Variablen werden mit `set` gesetzt, `unset` löscht schon definierte Variablen und `show` zeigt Variablen an. Variablen aus [.filename]#/boot/device.hints# können zu diesem Zeitpunkt überschrieben werden. Die hier durchgeführten Änderungen sind nicht permanent und beim nächsten Systemstart nicht mehr gültig.
+
+Nach dem Systemstart können alle Variablen mit man:kenv[1] angezeigt werden.
+
+Pro Zeile enthält [.filename]#/boot/device.hints# eine Variable. Kommentare werden durch `#` eingeleitet. Die verwendete Syntax lautet:
+
+[source,bash]
+....
+ hint.driver.unit.keyword="value"
+....
+
+Der Boot-Loader verwendet die nachstehende Syntax:
+
+[source,bash]
+....
+ set hint.driver.unit.keyword=value
+....
+
+Der Gerätetreiber wird mit `driver`, die Nummer des Geräts mit `unit` angegeben. `keyword` ist eine Option aus der folgenden Liste:
+
+* `at`: Gibt den Bus, auf dem sich das Gerät befindet, an.
+* `port`: Die Startadresse des I/O-Bereichs.
+* `irq`: Gibt die zu verwendende Unterbrechungsanforderung (IRQ) an.
+* `drq`: Die Nummer des DMA Kanals.
+* `maddr`: Die physikalische Speicheradresse des Geräts.
+* `flags`: Setzt verschiedene gerätespezifische Optionen.
+* `disabled`: Deaktiviert das Gerät, wenn der Wert auf `1` gesetzt wird.
+
+Ein Gerätetreiber kann mehr Optionen, als die hier beschriebenen, besitzen oder benötigen. Es wird empfohlen, die Optionen in der Manualpage des Treibers nachzuschlagen. Weitere Informationen finden Sie in man:device.hints[5], man:kenv[1], man:loader.conf[5] und man:loader[8].
+
+[[boot-shutdown]]
+== Der Shutdown-Vorgang
+
+Im Falle eines regulären Herunterfahrens durch man:shutdown[8] führt man:init[8] [.filename]#/etc/rc.shutdown# aus, sendet dann sämtlichen Prozessen ein `TERM` Signal und schließlich ein `KILL` Signal an alle Prozesse, die sich nicht rechtzeitig beendet haben.
+
+FreeBSD-Systeme, die Energieverwaltungsfunktionen unterstützen, können mit `shutdown -p now` ausgeschaltet werden. Zum Neustart des Systems wird `shutdown -r now` benutzt. Das Kommando man:shutdown[8] kann nur von `root` oder Mitgliedern der Gruppe `operator` benutzt werden. Man kann auch man:halt[8] und man:reboot[8] verwenden. Weitere Informationen finden Sie in den Hilfeseiten der drei Kommandos.
+
+Das Ändern der Gruppenmitgliedschaft wird in crossref:basics[users-synopsis,“Benutzer und grundlegende Account-Verwaltung”] beschrieben.
+
+[NOTE]
+====
+Die Energieverwaltungsfunktionen erfordern, dass die Unterstützung für man:acpi[4] als Modul geladen, oder statisch in einen angepassten Kernel kompiliert wird.
+====
diff --git a/documentation/content/de/books/handbook/bsdinstall/_index.adoc b/documentation/content/de/books/handbook/bsdinstall/_index.adoc
new file mode 100644
index 0000000000..bfdf27f03a
--- /dev/null
+++ b/documentation/content/de/books/handbook/bsdinstall/_index.adoc
@@ -0,0 +1,1062 @@
+---
+title: Kapitel 2. FreeBSD installieren
+part: Teil I. Erste Schritte
+prev: books/handbook/introduction
+next: books/handbook/basics
+---
+
+[[bsdinstall]]
+= FreeBSD installieren
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 2
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/bsdinstall/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/bsdinstall/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/bsdinstall/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[bsdinstall-synopsis]]
+== Übersicht
+
+Es gibt verschiedene Möglichkeiten, FreeBSD zu installieren, abhängig von der Einsatzumgebung. Dazu gehören:
+
+* Abbilder von virtuellen Maschinen, die Sie herunterladen und in einer virtuellen Umgebung einsetzen können. Diese Abbilder können von der https://www.freebsd.org/where.html[FreeBSD Downloadseite] heruntergeladen werden. Es gibt Abbilder für KVM ("qcow2"), VMWare ("vmdk"), Hyper-V ("vhd"), sowie Raw-Device Abbilder, die durchgängig unterstützt werden. Dies sind keine Installationsabbilder, sondern vorkonfigurierte ("bereits installierte") Instanzen, die sofort gestartet und konfiguriert werden können.
+* Abbilder von virtuellen Maschinen, die auf Amazon's https://aws.amazon.com/marketplace/pp/B07L6QV354[AWS Marketplace], https://azuremarketplace.microsoft.com/en-us/marketplace/apps?search=freebsd&page=1[Microsoft Azure Marketplace] und https://console.cloud.google.com/launcher/details/freebsd-cloud/freebsd-12[Google Cloud Platform] verfügbar sind, um auf den jeweiligen Hosting-Diensten ausgeführt zu werden. Weitere Informationen zur Bereitstellung von FreeBSD auf Azure finden Sie im entsprechenden Kapitel der https://docs.microsoft.com/en-us/azure/virtual-machines/linux/freebsd-intro-on-azure[ Azure Dokumentation].
+* SD-Karten Abbilder für eingebettete Systeme wie den Raspberry Pi oder BeagleBone Black. Diese Abbilder können von der https://www.freebsd.org/where.html[ FreeBSD Downloadseite] heruntergeladen werden. Die Dateien müssen unkomprimiert und als Raw-Image auf eine SD-Karte geschrieben werden, von der das System dann booten wird.
+* Installationsabbilder, um FreeBSD auf einer Festplatte für die üblichen Desktop-, Laptop- oder Serversysteme zu installieren.
+
+Der Rest dieses Kapitels beschreibt den vierten Fall und erklärt, wie man FreeBSD mit dem textbasierten Installationsprogramm bsdinstall installiert.
+
+Die Installationsanweisungen in diesem Kapitel gelten für die i386(TM)- und AMD64-Architekturen. Gegebenenfalls werden spezifische Anweisungen für andere Plattformen erwähnt. Möglicherweise gibt es auch geringfügige Unterschiede zwischen dem Installationsprogramm und dem, was hier gezeigt wird. Sie sollten dieses Kapitel daher als eine Art Wegweiser und nicht als exakte Anleitung betrachten.
+
+[NOTE]
+====
+Benutzer, die es vorziehen, FreeBSD mit einem graphischen Installationsprogramm zu installieren, sind vielleicht an https://www.furybsd.org[FuryBSD], https://ghostbsd.org[GhostBSD] oder https://www.midnightbsd.org[MidnightBSD] interessiert.
+====
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie wissen:
+
+* welche Mindestanforderungen an die Hardware gestellt werden und welche Architekturen FreeBSD unterstützt.
+* wie man FreeBSD Installationsmedien erstellt.
+* wie man bsdinstall startet.
+* welche Fragen bsdinstall stellt, was sie bedeuten und wie man diese beantwortet.
+* wie Sie Fehler bei der Installation beheben.
+* wie Sie eine Live-Version von FreeBSD ausprobieren können, bevor Sie die Installation starten.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie:
+
+* Die Liste von unterstützter Hardware lesen, die mit der zu installierenden Version von FreeBSD ausgeliefert wird, um sicherzustellen, dass die Hardware auch unterstützt wird.
+
+[[bsdinstall-hardware]]
+== Minimale Hardwareanforderungen
+
+Die Hardwareanforderungen zur Installation von FreeBSD variieren mit der Architektur. Hardwarearchitekturen und von FreeBSD unterstützte Geräte sind auf der Seite link:https://www.FreeBSD.org/releases/[FreeBSD Release Informationen] aufgelistet. Die link:https://www.FreeBSD.org/where/[FreeBSD Download Seite] enthält Informationen zur Auswahl des richtigen Abbilds für verschiedene Architekturen.
+
+Für die Installation von FreeBSD sind mindestens 96 MB RAM und 1.5 GB freier Festplattenspeicher erforderlich. Allerdings ist eine solch geringe Menge an Arbeitsspeicher und Speicherplatz nur für spezifische Anwendungen ausreichend, beispielsweise für Embedded-Geräte. Desktop-Systeme benötigen weitaus mehr Ressourcen. 2-4 GB RAM und mindestens 8 GB Speicherplatz sind ein guter Anfang.
+
+Dies sind die Anforderungen an den Prozessor für jede Architektur:
+
+amd64::
+Dies ist die gängigste Art von Prozessor für Desktop- und Laptop-Systeme. Andere Anbieter nennen diese Architektur auch x86-64.
++
+Beispiele für amd64-kompatible Prozessoren umfassen: AMD Athlon(TM)64, AMD Opteron(TM), multi-core Intel(R) Xeon(TM) und Intel(R) Core(TM) 2 sowie neuere Prozessoren.
+
+i386::
+Ältere Desktop- und Laptop-Systeme verwenden oft die 32-Bit x86-Architektur.
++
+Fast alle i386-kompatiblen Prozessoren mit einer Floating-Point-Einheit werden unterstützt. Alle Intel(R)-Prozessoren 486 oder neuer werden unterstützt.
++
+FreeBSD nutzt die Physical Adress Extensions (PAE), falls die CPU diese Funktion unterstützt. Wenn PAE im Kernel aktiviert ist, wird Speicher über 4 GB vom Kernel erkannt und kann von System verwendet werden. PAE schränkt allerdings auch die Gerätetreiber und anderen Komponenten von FreeBSD ein.
+
+powerpc::
+Alle New Word ROM Apple(R) Mac(R)-Systeme mit integriertem USB werden unterstützt. SMP wird auf Maschinen mit mehreren CPUs unterstützt.
++
+Ein 32-Bit Kernel kann jedoch nur die ersten 2 GB RAM verwenden.
+
+sparc64::
+Systeme, die von FreeBSD/sparc64 unterstützt werden, sind auf der link:https://www.FreeBSD.org/platforms/sparc/[FreeBSD/sparc64-Projektseite] aufgelistet.
++
+SMP wird auf allen Systemen mit mehr als einem Prozessor unterstützt. Eine dedizierte Platte wird benötigt, da es nicht möglich ist, eine Platte mit einem anderen Betriebssystem zur gleichen Zeit zu teilen.
+
+[[bsdinstall-pre]]
+== Vor der Installation
+
+Wenn das System die Mindestanforderungen für die Installation von FreeBSD erfüllt, sollte die Installationsdatei heruntergeladen und die Installationsmedien vorbereitet werden. Bevor Sie dies tun, prüfen Sie mit Hilfe dieser Checkliste, ob das System für die Installation bereit ist:
+
+[.procedure]
+. *Sichern Sie wichtige Daten*
++
+Erstellen Sie _immer_ eine Sicherung aller wichtigen Daten, _bevor_ Sie ein Betriebssystem installieren. Speichern Sie die Daten jedoch nicht auf dem System, auf dem das Betriebssystem installiert wird, sondern nutzen Sie einen Wechseldatenträger, wie beispielsweise ein USB-Laufwerk, oder sichern Sie auf einem anderen System im Netzwerk, oder nutzen einen Online-Backup-Dienst. Überprüfen Sie die Sicherungen, bevor Sie mit der Installation beginnen. Sobald das Installationsprogramm die Festplatte des Systems formatiert, gehen alle gespeicherten Daten unwiderruflich verloren.
+. *Den Installationsort von FreeBSD festlegen*
++
+Falls FreeBSD das einzige installierte Betriebssystem sein wird, kann dieser Schritt übersprungen werden. Sollte FreeBSD allerdings die Platte mit anderen Betriebssystemen teilen, müssen Sie entscheiden, welche Platte oder Partition für FreeBSD verwendet werden soll.
++
+Für die Architekturen i386 und amd64 können die Platten in mehrere Partitionen aufgeteilt werden. Dazu stehen Ihnen zwei Partitionsschemas zur Verfügung. Traditionell enthält ein _Master Boot Record_ (MBR) eine Partitionstabelle, welche bis zu vier _primäre Partitionen_ aufnehmen kann. Aus historischen Gründen werden diese primären Partitionen in FreeBSD _slices_ genannt. Eine Begrenzung von nur vier Partitionen ist für große Platten sehr beschränkt, so dass eine dieser primären Partitionen als _erweiterte Partition_ eingesetzt wird. Mehrere _logische Partitionen_ können dann innerhalb der erweiterten Partition angelegt werden. Die _GUID-Partitionstabelle_ (GPT) ist eine neuere und einfachere Methode zur Partition einer Festplatte. Geläufige GPT-Implementierungen erlauben bis zu 128 Partitionen pro Platte, was die Notwendigkeit von logischen Partitionen eliminiert.
++
+FreeBSDs Standard-Bootloader benötigt entweder eine primäre oder eine GPT-Partition. Wenn alle primären oder GPT-Partitionen bereits in Verwendung sind, muss eine davon für FreeBSD zur Verfügung gestellt werden. Benutzen Sie ein Werkzeug zur Veränderung der Partitionsgrößen, wenn Sie eine Partition erstellen möchten, ohne dabei vorhandene Daten zu löschen. Den freigegebenen Platz können Sie dann für die Installation verwenden.
++
+Eine Vielzahl freier und kommerzieller Werkzeuge zur Veränderung der Partitionsgrößen finden Sie unter http://en.wikipedia.org/wiki/List_of_disk_partitioning_software[ http://en.wikipedia.org/wiki/List_of_disk_partitioning_software]. GParted Live (http://gparted.sourceforge.net/livecd.php[http://gparted.sourceforge.net/livecd.php]) ist eine freie Live-CD, die den GParted-Partitionseditor enthält. GParted ist auch in einer Vielzahl von anderen Linux Live-CD Distributionen enthalten.
++
+[WARNING]
+====
+
+Bei richtiger Anwendung können Werkzeuge zur Veränderung von Partitionsgrößen auf sichere Art und Weise Platz für eine neue Partition schaffen. Erstellen Sie trotzdem eine Vollsicherung und überprüfen Sie deren Integrität bevor Sie die Partitionen auf der Platte verändern.
+====
++
+Festplattenpartitionen, die unterschiedliche Betriebssysteme enthalten, ermöglichen es, jeweils eines dieser Systeme zu verwenden. Eine alternative Möglichkeit, mehrere Betriebssysteme gleichzeitig einzusetzen, ohne dabei Partitionen ändern zu müssen, wird im crossref:virtualization[virtualization,Virtualisierung] behandelt.
+. *Netzwerkparameter ermitteln*
++
+Manche FreeBSD Installationsarten benötigen eine Netzwerkverbindung, um Installationsdateien herunter zu laden. Nach jeder Installation bietet das Installationsprogramm die Möglichkeit, die Netzwerkschnittstellen des Systems zu konfigurieren.
++
+Steht im Netzwerk ein DHCP-Server zur Verfügung, wird dieser im Allgemeinen verwendet, um automatisch Netzwerkeinstellungen vorzunehmen. Falls DHCP nicht verfügbar ist, müssen die folgenden Netzwerkeinstellungen beim lokalen Netzwerkadministrator oder Provider erfragt werden:
+[[bsdinstall-collect-network-information]]
+.. IP-Adresse
+.. Subnetz-Maske
+.. IP-Adresse des Default-Gateway
+.. Domänenname des Netzwerks
+.. IP-Adressen der DNS-Server im Netzwerk
+
+. *Lesen Sie die FreeBSD-Errata*
++
+Obwohl das FreeBSD Projekt sich bemüht, jede veröffentlichte Version von FreeBSD so stabil wie möglich zu machen, können sich doch gelegentlich Fehler in den Veröffentlichungsprozess einschleichen. In sehr seltenen Fällen betreffen diese Fehler den Installationsvorgang. Wenn diese Probleme entdeckt und behoben sind, werden dazu Hinweise in der FreeBSD Errata (link:https://www.FreeBSD.org/releases/{rel121-current}r/errata/[https://www.freebsd.org/releases/{rel121-current}r/errata/]) auf der FreeBSD Webseite veröffentlicht. Prüfen Sie die Errata vor der Installation, um sicherzustellen, dass es keine Probleme gibt, welche die Installation betreffen.
++
+Informationen und Errata für all diese Veröffentlichungen finden Sie unter den Release Informationen auf der FreeBSD Webseite (link:https://www.FreeBSD.org/releases/[https://www.freebsd.org/releases/]).
+
+[[bsdinstall-installation-media]]
+=== Die Installationsmedien vorbereiten
+
+Das FreeBSD-Installationsprogramm ist keine Anwendung, das aus einem anderen Betriebssystem heraus gestartet werden kann. Laden Sie stattdessen eine Installationsdatei für FreeBSD herunter und brennen Sie den Dateityp auf einen entsprechenden Datenträger (CD, DVD, oder USB). Starten Sie dann das System mit diesem Datenträger.
+
+Die FreeBSD-Installationsmedien sind unter link:https://www.FreeBSD.org/where/#download[www.freebsd.org/where/] verfügbar. Der Name der Installationsdatei enthält die Version von FreeBSD, die Architektur sowie den Dateityp. Wenn Sie beispielsweise FreeBSD 12.1 auf einem amd64-System von DVD installieren wollen, laden Sie [.filename]#FreeBSD-12.1-RELEASE-amd64-dvd1.iso# und brennen Sie die Datei auf eine DVD. Starten Sie dann das System mit dieser DVD.
+
+Die Installationsdateien stehen in verschiedenen Formaten zur Verfügung und variieren je nach Rechnerarchitektur und Medientyp.
+
+[[bsdinstall-installation-media-uefi]]
+Für Rechner, die mit UEFI (Unified Extensible Firmware Interface) booten, stehen zusätzliche Installationsdateien zur Verfügung. Die Namen dieser Dateien enthalten die Zeichenkette [.filename]#uefi#.
+
+Dateitypen:
+
+* `-bootonly.iso`: Dies ist die kleinste Installation, die lediglich das Installationsprogramm enthält. Hierzu ist während der Installation eine funktionierende Internetverbindung erforderlich, da das Installationsprogramm die benötigen Dateien für die FreeBSD-Installation herunter laden muss. Diese Datei sollte mit einem CD-Brennprogramm auf CD gebrannt werden.
+* `-disc1.iso`: Diese Datei enthält alle benötigten Dateien für eine FreeBSD-Installation, den Quellcode und die Ports-Sammlung. Die Datei sollte mit einem CD-Brennprogramm auf CD gebrannt werden.
+* `-dvd1.iso`: Diese Datei enthält alle benötigen Dateien für eine FreeBSD-Installation, den Quellcode und die Ports-Sammlung. Darüber hinaus enthält sie eine Reihe von beliebten Binärpaketen zur Installation eines Window-Managers, sodass Sie ein komplettes System installieren können, ohne dass Sie eine Verbindung zum Internet benötigen. Die Datei sollte mit einem DVD-Brennprogramm auf eine DVD gebrannt werden.
+* `-memstick.img`: Diese Datei enthält alle benötigten Dateien für eine FreeBSD-Installation, den Quellcode und die Ports-Sammlung. Die Datei sollte mit den nachstehenden Anweisungen auf einen USB-Stick geschrieben werden.
+* `-mini-memstick.img`: Diese Datei enthält, wie `-bootonly.iso`, keine Installationsdateien, sondern lädt diese bei Bedarf nach. Während der Installation wird eine funktionierende Internetverbindung benötigt. Schreiben Sie die Datei, wie in <<bsdinstall-usb>> beschrieben, auf einen USB-Stick.
+
+Nachdem Sie die Datei heruntergeladen haben, laden Sie [.filename]#CHECKSUM.SHA256# aus dem gleichen Verzeichnis herunter. Berechnen Sie dann die _Prüfsumme_ für die Datei. FreeBSD bietet hierfür man:sha256[1], das Sie als `sha256 _Dateiname_` aufrufen können. Andere Betriebssysteme haben ähnliche Programme.
+
+Vergleichen Sie die berechnete Prüfsumme mit der in [.filename]#CHECKSUM.SHA256#. Die beiden Prüfsummen müssen übereinstimmen, ansonsten ist die Datei beschädigt und muss erneut heruntergeladen werden.
+
+[[bsdinstall-usb]]
+==== Eine Installationsdatei auf einen USB-Stick schreiben
+
+Die [.filename]#\*.img#-Datei ist ein komplettes _Abbild_ (engl. Image) des späteren USB-Sticks. Die Datei kann _nicht_ auf das Zielgerät kopiert werden. Es existieren jedoch mehrere Programme, mit denen die [.filename]#*.img#-Datei auf einen USB-Stick geschrieben werden kann. In diesem Abschnitt werden zwei dieser Programme vorgestellt.
+
+[IMPORTANT]
+====
+Bevor Sie fortfahren, machen Sie Sicherungskopien der Daten auf dem USB-Stick. Diese Prozedur wird alle Daten auf dem Stick löschen.
+====
+
+[[bsdinstall-usb-dd]]
+[.procedure]
+****
+*Procedure: Das Image mit `dd` auf einen USB-Stick schreiben*
+
+[WARNING]
+====
+
+Dieses Beispiel verwendet [.filename]#/dev/da0# als das Zielgerät, auf welches das Image geschrieben werden soll. Seien Sie _sehr vorsichtig_, dass das richtige Gerät benutzt wird, da das Kommando alle vorhandenen Daten auf dem Zielgerät zerstört.
+====
+. Das Werkzeug man:dd[1] steht unter BSD, Linux(R) und Mac OS(R)-Systemen zur Verfügung. Um das Image zu brennen, verbinden Sie den USB-Stick mit dem System und bestimmen Sie dessen Gerätenamen. Geben Sie dann den Namen der Installationsdatei und den Gerätenamen des USB-Sticks an. Dieses Beispiel schreibt die Installation für amd64 auf das erste USB-Gerät im FreeBSD-System.
++
+[source,bash]
+....
+# dd if=FreeBSD-12.1-RELEASE-amd64-memstick.img of=/dev/da0 bs=1M conv=sync
+....
++
+Wenn dieser Befehl fehlschlägt, stellen Sie sicher, dass der USB-Stick nicht eingehangen ist und prüfen Sie den Gerätenamen. Auf einigen Systemen muss der Befehl vielleicht mit Hilfe von man:sudo[8] ausgeführt werden. Die Syntax von man:dd[1] variiert leicht zwischen verschiedenen Plattformen. Zum Beispiel erfordert Mac OS(R) ein kleingeschriebenes `bs=1m`. Einige Systeme wie Linux(R) verwenden vielleicht einen Puffer. Verwenden Sie dann man:sync[8], um die Daten zu schreiben.
+****
+
+[.procedure]
+****
+*Procedure: Das Image unter Windows(R) schreiben*
+
+[WARNING]
+====
+
+Versichern Sie sich, dass Sie den korrekten Laufwerksbuchstaben angeben, da die bestehenden Daten des Laufwerks überschrieben und zerstört werden.
+====
+. Image Writer für Windows(R) herunterladen
++
+Image Writer für Windows(R) ist eine frei verfügbare Anwendung, welche eine Imagedatei korrekt auf einen USB-Stick schreiben kann. Laden Sie diese von https://sourceforge.net/projects/win32diskimager/[ https://sourceforge.net/projects/win32diskimager/] herunter und entpacken Sie sie in ein Verzeichnis.
+. Das Image mit Image Writer auf den USB-Stick schreiben
++
+Klicken Sie doppelt auf das Win32DiskImager-Icon, um das Programm zu starten. Prüfen Sie dabei, dass der Laufwerksbuchstabe unter `Device` dem Gerät entspricht, in dem sich der USB-Stick befindet. Klicken Sie auf das Ordnersymbol und wählen Sie das Image aus, welches auf den USB-Stick geschrieben werden soll. Um den Image-Dateinamen zu akzeptieren, klicken Sie auf btn:[Save]. Überprüfen Sie erneut, ob alles stimmt und dass keine Ordner auf dem USB-Stick in anderen Fenstern geöffnet sind. Sobald alles bereit ist, klicken Sie auf btn:[Write], um die Imagedatei auf den USB-Stick zu schreiben.
+****
+
+Sie sind jetzt dazu bereit, mit der Installation von FreeBSD zu beginnen.
+
+[[bsdinstall-start]]
+== Die Installation starten
+
+[IMPORTANT]
+====
+Es werden bei Installation so lange keine Änderungen an den Festplatten durchgeführt, bis die folgende Meldung erscheint:
+
+[.programlisting]
+....
+Your changes will now be written to disk. If you
+have chosen to overwrite existing data, it will
+be PERMANENTLY ERASED. Are you sure you want to
+commit your changes?
+....
+
+Die Installation kann vor dieser Warnung zu jeder Zeit abgebrochen werden. Falls Zweifel bestehen, dass etwas falsch konfiguriert wurde, schalten Sie einfach den Computer vor diesem Punkt aus und es werden keine Änderungen an der Festplatte vorgenommen.
+====
+
+Dieser Abschnitt beschreibt, wie das System vom Installationsmedium, das nach den Anweisungen in <<bsdinstall-installation-media>> erstellt wurde, gebootet wird. Wenn Sie einen bootfähigen USB-Stick einsetzen, verbinden Sie diesen mit dem System, bevor Sie den Computer einschalten. Falls die Installation von einer CD startet, müssen Sie den Computer einschalten und die CD so bald wie möglich einlegen. Wie das System konfiguriert werden muss, um von dem verwendeten Installationsmedium zu booten, hängt von der Architektur ab.
+
+[[bsdinstall-starting-i386]]
+=== Systemstart von i386(TM) und amd64
+
+Diese Architekturen beinhalten ein BIOS-Menü zur Auswahl des Boot-Gerätes. Abhängig von dem verwendeten Installationsmedium können Sie CD/DVD oder USB als erstes Boot-Gerät auswählen. Die meisten Systeme erlauben es auch, das Boot-Gerät während des Startvorgangs zu wählen, typischerweise durch drücken von kbd:[F10], kbd:[F11], kbd:[F12] oder kbd:[Esc].
+
+Falls der Computer wie normal startet und das bestehende Betriebssystem lädt, befolgen Sie einen der hier aufgeführten Schritte:
+
+. Das Installationsmedium wurde während des Startvorgangs nicht früh genug eingelegt. Lassen Sie das Medium eingelegt und versuchen Sie, den Rechner neu zu starten.
+. Die Änderungen am BIOS waren nicht richtig oder wurden nicht gespeichert. Überprüfen Sie, dass das richtige Boot-Gerät als erstes Boot-Gerät ausgewählt ist.
+. Das verwendete System ist zu alt und unterstützt das starten vom gewählten Medium nicht. In diesem Fall kann der Plop Boot Manager (http://www.plop.at/de/bootmanagers.html[]) verwendet werden, um ältere Computer von CD oder USB-Medien zu starten.
+
+=== Systemstart beim PowerPC(R)
+
+Auf den meisten Maschinen können Sie kbd:[C] auf der Tastatur gedrückt halten, um von der CD zu starten. Andernfalls, halten Sie kbd:[Command+Option+O+F], oder kbd:[Windows+Alt+O+F] auf nicht-Apple(R) Tastaturen gedrückt. Geben Sie an der `0 >`-Eingabeaufforderung folgendes ein:
+
+[source,bash]
+....
+ boot cd:,\ppc\loader cd:0
+....
+
+[[bsdinstall-view-probe]]
+=== FreeBSD Bootmenü
+
+Wenn das System vom Installationsmedium gestartet wird, erscheint folgendes Menü auf dem Bildschirm:
+
+[[bsdinstall-newboot-loader-menu]]
+.FreeBSD Boot Loader Menü
+image::bsdinstall-newboot-loader-menu.png[]
+
+In der Voreinstellung wird das Menü zehn Sekunden auf Benutzereingaben warten, bevor das Installationsprogramm gestartet wird. Drücken Sie die Leertaste, um den Timer anzuhalten. Um eine Option auszuwählen, drücken Sie die entsprechende Nummer bzw. Buchstaben. Die folgenden Optionen stehen zur Verfügung.
+
+* `Boot Multi User`: Dies wird den Boot-Prozess von FreeBSD fortsetzen. Wenn der Timer angehalten wurde, drücken Sie entweder die kbd:[1], kbd:[B], oder kbd:[Enter].
+* `Boot Single User`: Dieser Modus kann verwendet werden, um eine bestehende FreeBSD-Installation zu reparieren. Dies wird in crossref:boot[boot-singleuser,“Der Single-User Modus”] beschrieben. Drücken Sie die kbd:[2] oder kbd:[S] um in diesen Modus zu gelangen.
+* `Escape to loader prompt`: Dieser Modus startet einen Prompt, welcher nur eine begrenzte Anzahl an Low-Level-Befehlen enthält. Dies wird in crossref:boot[boot-loader,“Phase Drei”] beschrieben. Drücken Sie die kbd:[3] oder kbd:[Esc] um in diesen Modus zu gelangen.
+* `Reboot`: Startet das System neu.
+* `Kernel`: Lädt einen anderen Kernel.
+* `Configure Boot Options`: Öffnet das Menü, welches in <<bsdinstall-boot-options-menu>> beschrieben ist.
+
+[[bsdinstall-boot-options-menu]]
+.FreeBSD Boot-Optionen Menü
+image::bsdinstall-boot-options-menu.png[]
+
+Das Boot-Optionen Menü ist in zwei Abschnitte unterteilt. Der erste Abschnitt wird verwendet, um zurück zum Hauptmenü zu gelangen, oder um Optionen zurück auf die Standardwerte zu setzen.
+
+Im zweiten Abschnitt können verschiedene Optionen auf `On` oder `Off` gesetzt werden. Das System wird bei einem Neustart immer mit den Einstellungen für diese Optionen booten:
+
+* `ACPI Support`: Wenn das System während des Bootens hängt, setzen Sie diese Option auf `Off`.
+* `Safe Mode`: Wenn das System trotz deaktiviertem `ACPI Support` immer noch hängt, setzen Sie diese Option auf `On`.
+* `Single User`: Setzen Sie die Option auf `On`, um eine bestehende FreeBSD-Installation zu reparieren. Dieser Prozess wird in crossref:boot[boot-singleuser,“Der Single-User Modus”] beschrieben. Sobald das Problem behoben ist, setzen Sie die Option wieder auf `Off`.
+* `Verbose`: Wenn Sie während des Bootens ausführliche Meldungen sehen möchten, zum Beispiel für die Fehlersuche bei Hardwareproblemen, setzen Sie diese Option auf `On`.
+
+Nachdem Sie die benötigten Auswahlen getroffen haben, drücken Sie die kbd:[1] oder die Rücktaste, um zum Hauptmenü zurückzukehren. Drücken Sie dann kbd:[Enter] um den FreeBSD Bootprozess fortzusetzen. Eine Reihe von Boot-Meldungen werden nun im Rahmen der Geräteerkennung von FreeBSD angezeigt. Sobald dieser Prozess abgeschlossen ist, erscheint das Menü aus <<bsdinstall-choose-mode>>.
+
+[[bsdinstall-choose-mode]]
+.Willkommen-Menü
+image::bsdinstall-choose-mode.png[]
+
+Wählen Sie hier btn:[Install] und drücken Sie kbd:[Enter], um in das Installationsprogramm zu gelangen. Der Rest dieses Kapitels beschreibt das Installationsprogramm. Andernfalls verwenden Sie die Pfeiltasten um einen anderen Menüpunkt auszuwählen. btn:[Shell] kann verwendet werden, um eine Shell zu starten und Zugriff auf die Kommandozeilenprogramme zu erhalten, damit beispielsweise die Platten vor der Installation vorbereitet werden können. btn:[Live CD] kann verwendet werden um FreeBSD vor der Installation auszuprobieren. Die Live-Version wird in <<using-live-cd>> beschrieben.
+
+[TIP]
+====
+
+Um sich die Boot-Meldungen und die Ergebnisse der Geräteerkennung erneut anzeigen zu lassen, drücken Sie kbd:[S] gefolgt von kbd:[Enter]. Dadurch wird eine Shell gestartet, in der Sie die Ereignisse seitenweise mit `more /var/run/dmesg.boot` lesen können. Geben Sie `exit` ein, um zum Willkommen-Menü zurückzukehren.
+====
+
+[[using-bsdinstall]]
+== Verwendung von bsdinstall
+
+Dieser Abschnitt zeigt die Reihenfolge der Menüs von bsdinstall sowie die Informationen, die während der Installation abgefragt werden. Benutzen Sie die Pfeiltasten zur Navigation und die Leertaste, um einen Menüpunkt zu aktivieren oder zu deaktivieren. Wenn Sie fertig sind, drücken Sie kbd:[Enter], um die Auswahl zu speichern und zum nächsten Bildschirm zu gelangen.
+
+[[bsdinstall-keymap]]
+=== Die Tastaturbelegung auswählen
+
+Bevor die Installation gestartet wird, lädt bsdinstall die Tastaturbelegung, wie in <<bsdinstall-keymap-loading>> gezeigt.
+
+[[bsdinstall-keymap-loading]]
+.Laden der Tastaturbelegung
+image::bsdinstall-keymap-loading.png[]
+
+Nachdem die Tastaturbelegung geladen wurde, zeigt bsdinstall das Menü aus <<bsdinstall-keymap-10>> an. Wählen Sie die Tastenbelegung, die der am System angeschlossenen Tastatur am nächsten kommt, indem Sie die Pfeiltasten Hoch/Runter verwenden und anschließend kbd:[Enter] drücken.
+
+[[bsdinstall-keymap-10]]
+.Bildschirm zur Auswahl der Tastaturbelegung
+image::bsdinstall-keymap-10.png[]
+
+[NOTE]
+====
+Durch drücken von kbd:[Esc] wird das Menü verlassen und die Standardbelegung eingestellt. [.guimenuitem]#United States of America ISO-8859-1# ist eine sichere Option, falls Sie sich unsicher sind, welche Auswahl Sie treffen sollen.
+====
+
+[[bsdinstall-keymap-testing]]
+.Bildschirm zum Testen der Tastaturbelegung
+image::bsdinstall-keymap-testing.png[]
+
+[[bsdinstall-hostname]]
+=== Den Rechnernamen festlegen
+
+Das nächste bsdinstall-Menü konfiguriert den Rechnernamen, der für das neu zu installierende System verwendet werden soll.
+
+[[bsdinstall-config-hostname]]
+.Festlegen des Rechnernamens
+image::bsdinstall-config-hostname.png[]
+
+Geben Sie einen für das Netzwerk eindeutigen Rechnernamen an. Der eingegebene Rechnername sollte ein voll-qualifizierter Rechnername sein, so wie z.B. `machine3.example.com`.
+
+[[bsdinstall-components]]
+=== Auswahl der zu installierenden Komponenten
+
+Im nächsten Schritt fragt Sie bsdinstall, die optionalen Komponenten für die Installation auszuwählen.
+
+[[bsdinstall-config-components]]
+.Komponenten für die Installation auswählen
+image::bsdinstall-config-components.png[]
+
+Die Entscheidung, welche Komponenten auszuwählen sind, hängt größtenteils davon ab, für was das System künftig eingesetzt werden soll und der zur Verfügung stehende Plattenplatz. Der FreeBSD-Kernel und die Systemprogramme (zusammengenommen auch als _Basissystem_ bezeichnet) werden immer installiert. Abhängig vom Typ der Installation, werden manche dieser Komponenten nicht erscheinen.
+
+* `base-dbg` - Basiswerkzeuge wie cat, ls und vielte weitere mit aktiviertem Debugging.
+* `kernel-dbg` - Kernel und Module mit aktiviertem Debugging.
+* `lib32-dbg` - Kompatibilitäts-Bibliotheken mit aktiviertem Debugging, für die Ausführung von 32-bit-Anwendungen auf einer 64-bit-Version von FreeBSD.
+* `lib32` - Kompatibilitäts-Bibliotheken, um 32-bit-Anwendungen auf der 64-bit Version von FreeBSD laufen zu lassen.
+* `ports` - Die FreeBSD Ports-Sammlung ist eine Sammlung von Dateien, die das herunterladen, erstellen und installieren von Drittanbietersoftware automatisiert. crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports] behandelt die Verwendung der Ports-Sammlung.
++
+[WARNING]
+====
+
+Das Installationsprogramm prüft nicht, ob genügend Plattenplatz zur Verfügung steht. Wählen Sie diese Option nur, wenn die Festplatte über ausreichend Speicher verfügt. Die Ports-Sammlung nimmt etwa {ports-size} Plattenplatz ein.
+====
+
+* `src` - Der vollständige FreeBSD Quellcode für den Kernel und die Systemprogramme. Obwohl dies für die meisten Anwendungen nicht benötigt wird, kann es doch für manche Gerätetreiber, Kernelmodule und einigen Anwendungen aus der Ports-Sammlung erforderlich sein. Der Quellcode wird auch benötigt um an FreeBSD selbst mitzuentwickeln. Der komplette Quellcodebaum benötigt 1 GB Plattenplatz und um das gesamte Betriebssystem neu zu erstellen, werden zusätzliche 5 GB Platz benötigt.
+* `tests` - FreeBSD Test-Suite.
+
+[[bsdinstall-netinstall]]
+=== Installation aus dem Netzwerk
+
+Das Menü in <<bsdinstall-netinstall-notify>> erscheint nur bei der Installation von einer [.filename]#-bootonly.iso#-CD, da dieses Installationsmedium keine Kopien der Installationsdateien enthält. Da die Installationsdateien über eine Netzwerkverbindung abgerufen werden müssen, weist dieses Menü darauf hin, dass zunächst die Netzwerkschnittstelle konfiguriert werden muss. Falls dieses Menü während der Installation angezeigt wird, befolgen Sie die Anweisungen in <<bsdinstall-config-network-dev>>.
+
+[[bsdinstall-netinstall-notify]]
+.Installation über das Netzwerk
+image::bsdinstall-netinstall-files.png[]
+
+[[bsdinstall-partitioning]]
+== Plattenplatz bereitstellen
+
+Im nächsten Menü wird die Methode bestimmt, um den Plattenplatz zuzuweisen.
+
+[[bsdinstall-zfs-partmenu]]
+.Partitionierung unter FreeBSD
+image::bsdinstall-zfs-partmenu.png[]
+
+bsdinstall bietet dem Benutzer vier Methoden zur Zuweisung von Plattenplatz:
+
+* `Auto (UFS)` richtet die Partitionen automatisch mit dem `UFS`-Dateisystems ein.
+* `Manual` ermöglicht es fortgeschrittenen Benutzern, angepasste Partitionen über Menüoptionen zu erstellen.
+* `Shell` öffnet eine Eingabeaufforderung, in der fortgeschrittene Benutzer angepasste Partitionen mit Werkzeugen wie man:gpart[8], man:fdisk[8] und man:bsdlabel[8] erstellen können.
+* `Auto (ZFS)` erzeugt ein root-on-ZFS-System mit optionaler GELI-Verschlüsselung für Boot Environments.
+
+Dieser Abschnitt beschreibt, was bei der Partitionierung der Platten zu beachten ist und wie die einzelnen Methoden zur Partitionierung angewendet werden.
+
+[[configtuning-initial]]
+=== Ein Partitionslayout entwerfen
+
+Wenn Sie Dateisysteme anlegen, sollten Sie beachten, dass Festplatten auf Daten in den äußeren Spuren schneller zugreifen können als auf Daten in den inneren Spuren. Daher sollten die kleineren und oft benutzten Dateisysteme an den äußeren Rand der Platte gelegt werden. Die größeren Partitionen wie [.filename]#/usr# sollten in die inneren Bereiche gelegt werden. Es empfiehlt sich, die Partitionen in folgender Reihenfolge anzulegen: [.filename]#/#, swap, [.filename]#/var# und [.filename]#/usr#.
+
+Die Größe der [.filename]#/var#-Partition ist abhängig vom Zweck der Maschine. Diese Partition enthält hauptsächlich Postfächer, Logdateien und Druckwarteschlangen. Abhängig von der Anzahl an Systembenutzern und der Aufbewahrungszeit für Logdateien, können Postfächer und Logdateien unerwartete Größen annehmen. Die meisten Benutzer benötigen nur selten mehr als ein Gigabyte für [.filename]#/var#.
+
+[NOTE]
+====
+Ein paar Mal wird es vorkommen, dass viel Festplattenspeicher in [.filename]#/var/tmp# benötigt wird. Wenn neue Software mit man:pkg_add[1] installiert wird, extrahieren die Paketwerkzeuge eine vorübergehende Kopie der Pakete unter [.filename]#/var/tmp#. Die Installation großer Softwarepakete wie Firefox oder LibreOffice kann sich wegen zu wenig Speicherplatz in [.filename]#/var/tmp# als trickreich herausstellen.
+====
+
+Die [.filename]#/usr# Partition enthält viele der Hauptbestandteile des Systems, einschließlich der FreeBSD Ports-Sammlung und den Quellcode des Systems. Für diese Partition werden mindestens zwei Gigabyte empfohlen.
+
+Behalten Sie bei der Auswahl der Partitionsgrößen den Platzbedarf im Auge. Wenn Sie den Platz auf einer Partition vollständig aufgebraucht haben, eine andere Partition aber kaum benutzen, kann die Handhabung des Systems schwierig werden.
+
+Als Daumenregel sollten Sie doppelt soviel Speicher für die Swap-Partition vorsehen, als Sie Hauptspeicher haben, da die VM-Paging-Algorithmen im Kernel so eingestellt sind, dass sie am besten laufen, wenn die Swap-Partition mindestens doppelt so groß wie der Hauptspeicher ist. Zu wenig Swap kann zu einer Leistungsverminderung im VM page scanning Code führen, sowie Probleme verursachen, wenn später mehr Speicher in die Maschine eingebaut wird.
+
+Auf größeren Systemen mit mehreren SCSI-, oder IDE-Laufwerken an unterschiedlichen Controllern, wird empfohlen, Swap-Bereiche auf bis zu vier Laufwerken einzurichten. Diese Swap-Partitionen sollten ungefähr dieselbe Größe haben. Der Kernel kann zwar mit beliebigen Größen umgehen, aber die internen Datenstrukturen skalieren bis zur vierfachen Größe der größten Partition. Ungefähr gleich große Swap-Partitionen erlauben es dem Kernel, den Swap-Bereich optimal über die Laufwerke zu verteilen. Große Swap-Bereiche, auch wenn sie nicht oft gebraucht werden, sind nützlich, da sich ein speicherfressendes Programm unter Umständen auch ohne einen Neustart des Systems beenden lässt.
+
+Indem Sie ein System richtig partitionieren, verhindern Sie, dass eine Fragmentierung in den häufig beschriebenen Partitionen auf die meist nur gelesenen Partitionen übergreift. Wenn Sie die häufig beschriebenen Partitionen an den Rand der Platte legen, dann wird die I/O-Leistung dieser Partitionen steigen. Die I/O-Leistung ist natürlich auch für große Partitionen wichtig, doch erzielen Sie eine größere Leistungssteigerung, wenn Sie [.filename]#/var# an den Rand der Platte legen.
+
+[[bsdinstall-part-guided]]
+=== Geführte Partitionierung für UFS
+
+Bei dieser Methode wird ein Menü die verfügbaren Platten anzeigen. Sollten mehrere Platten angeschlossen sein, wählen Sie diejenige aus, auf der FreeBSD installiert werden soll.
+
+[[bsdinstall-part-guided-disk]]
+.Aus mehreren Platten eine auswählen
+image::bsdinstall-part-guided-disk.png[]
+
+Nachdem Sie die Platte ausgewählt haben, fordert das nächste Menü dazu auf, entweder die gesamte Festplatte für die Installation zu nutzen oder eine Partition aus unbenutzten Speicherplatz zu erstellen. Ein allgemeines Partitionslayout, das die gesamte Platte einnimmt wird erstellt, wenn btn:[Entire Disk] ausgewählt wird. Durch die Wahl von btn:[Partition] wird ein Partitionslayout aus dem unbenutzten Speicherplatz der Platte erstellt.
+
+[[bsdinstall-part-entire-part]]
+.Auswahl der gesamten Platte oder einer Partition
+image::bsdinstall-part-entire-part.png[]
+
+Wenn btn:[Entire Disk] gewählt wurde, weist bsdinstall darauf hin, dass die Festplatte gelöscht wird.
+
+[[bsdinstall-ufs-warning]]
+.Bestätigung
+image::bsdinstall-ufs-warning.png[]
+
+Das nächste Menü zeigt eine Liste der verfügbaren Partitionsschemas. GPT ist ist normalerweise die geeignetste Wahl für amd64-Rechner. Ältere Rechner, die nicht mit GPT kompatibel sind, sollten MBR benutzen. Die anderen Partitionsschemas werden im Allgemeinen für ungewöhnliche oder ältere Rechner benutzt. Weitere Informationen finden Sie in <<partition-schemes>>.
+
+[[bsdinstall-ufs-scheme]]
+image::bsdinstall-part-manual-partscheme.png[]
+
+Nachdem das Partitionslayout nun erstellt wurde, sollten Sie es überprüfen, um sicherzustellen, dass es die Bedürfnisse der Installation erfüllt. Durch die Auswahl von btn:[Revert] können die Partitionen wieder auf den ursprünglichen Wert zurückgesetzt werden und durch btn:[Auto] werden die automatischen FreeBSD Partitionen wiederhergestellt. Partitionen können auch manuell erstellt, geändert oder gelöscht werden. Sollte die Partitionierung richtig sein, wählen Sie btn:[Finish] aus, um mit der Installation fortzufahren.
+
+[[bsdinstall-part-review]]
+.Überprüfen der erstellten Partitionen
+image::bsdinstall-part-review.png[]
+
+Sobald die Festplatten konfiguriert sind, bietet das nächste Menü die letzte Möglichkeit, Änderungen vorzunehmen, bevor die ausgewählten Laufwerke formatiert werden. Wenn Änderungen vorgenommen werden müssen, wählen Sie btn:[Back], um zum Hauptmenü zurückzukehren. Mit btn:[Revert & Exit] wird das Installationsprogramm beendet, ohne Änderungen am Laufwerk vorzunehmen. Wählen Sie btn:[Commit], um die Installation zu starten.
+
+[[bsdinstall-ufs-final-confirmation]]
+.Abschließende Konfiguration
+image::bsdinstall-final-confirmation.png[]
+
+Um mit der Installation fortzufahren, gehen Sie zu <<bsdinstall-fetching-distribution>>.
+
+[[bsdinstall-part-manual]]
+=== Manuelle Partitionierung
+
+Diese Methode öffnet den Partitionseditor:
+
+[[bsdinstall-part-manual-create]]
+.Partitionen manuell erstellen
+image::bsdinstall-part-manual-create.png[]
+
+Durch hervorheben einer Platte (in diesem Fall [.filename]#ada0#) und die Auswahl von btn:[Create], wird ein Menü mit den verfügbaren Partitionierungsschemas angezeigt.
+
+[[bsdinstall-part-manual-partscheme]]
+.Partitionen manuell anlegen
+image::bsdinstall-part-manual-partscheme.png[]
+
+GPT ist normalerweise die beste Wahl für amd64-Computer. Ältere Computer, die nicht mit GPT kompatibel sind, sollten MBR verwenden. Die anderen Partitionsschemas werden für gewöhnlich für ältere Computersysteme benutzt.
+
+[[partition-schemes]]
+.Partitionierungsschemas
+[cols="1,1", frame="none", options="header"]
+|===
+<| Abkürzung
+<| Beschreibung
+
+|APM
+|Apple Partition Map, verwendet von PowerPC(R).
+
+|BSD
+|BSD-Labels ohne einen MBR, manchmal auch "dangerously dedicated mode" genannt, da nicht-BSD Festplatten-Werkzeuge dies vielleicht nicht erkennen können.
+
+|GPT
+|GUID Partition Table (http://de.wikipedia.org/wiki/GUID_Partition_Table[http://en.wikipedia.org/wiki/GUID_Partition_Table]).
+
+|MBR
+|Master Boot Record (http://de.wikipedia.org/wiki/Master_Boot_Record[http://en.wikipedia.org/wiki/Master_boot_record]).
+
+|VTOC8
+|Volume Table Of Contents, von Sun SPARC64 und UltraSPARC Computern verwendet.
+|===
+
+Nachdem das Partitionierungsschema ausgewählt und erstellt wurde, werden durch erneute Auswahl von btn:[Create] die Partitionen erzeugt. Mit der kbd:[Tab]-Taste können Sie den Cursor zwischen den Feldern bewegen.
+
+[[bsdinstall-part-manual-addpart]]
+.Partitionen manuell erzeugen
+image::bsdinstall-part-manual-addpart.png[]
+
+Eine FreeBSD-Standardinstallation mit GPT legt mindestens die folgenden drei Partitionen an:
+
+* `freebsd-boot` - Enthält den FreeBSD-Bootcode.
+* `freebsd-ufs` - Ein FreeBSD UFS-Dateisystem.
+* `freebsd-zfs` - Ein FreeBSD ZFS-Dateisystem. Weitere Informationen finden Sie in crossref:zfs[zfs,Das Z-Dateisystem (ZFS)].
+* `freebsd-swap` - FreeBSD Auslagerungsbereich (swap space).
+
+Die einzelnen GPT-Partitionstypen sind in man:gpart[8] dokumentiert.
+
+Es können mehrere Dateisystempartitionen erzeugt werden und manche Leute ziehen es vor, ein traditionelles Layout mit getrennten Partitionen für die Dateisysteme [.filename]#/#, [.filename]#/var#, [.filename]#/tmp# und [.filename]#/usr# zu erstellen. Lesen Sie dazu <<bsdinstall-part-manual-splitfs>>, um ein Beispiel zu erhalten.
+
+Größenangaben (`Size`) können mit gängigen Abkürzungen eingegeben werden: _K_ für Kilobytes, _M_ für Megabytes oder _G_ für Gigabytes.
+
+[TIP]
+====
+
+Korrekte Sektorausrichtung ermöglicht größtmögliche Geschwindigkeit und das Anlegen von Partitionsgrößen als vielfaches von 4K-Bytes hilft, die passende Ausrichtung auf Platten mit entweder 512-Bytes oder 4K-Bytes Sektorgrößen, festzulegen. Generell sollte die Verwendung von Partitionsgrößen, die sogar vielfache von 1M oder 1G sind, den einfachsten Weg darstellen, um sicher zu stellen, dass jede Partition an einem vielfachen von 4K beginnt. Eine Ausnahme gibt es: momentan sollte die _freebsd-boot_-Partition aufgrund von Beschränkungen im Bootcode nicht größer sein als 512K.
+====
+
+Ein Einhägepunkt (`Mountpoint`) wird benötigt, falls diese Partition ein Dateisystem enthält. Falls nur eine einzelne UFS-Partition erstellt wird, sollte der Einhängepunkt [.filename]#/# lauten.
+
+Ein `label` ist ein Name, durch den diese Partition angesprochen wird. Festplattennamen oder -nummern können sich ändern, falls die Platte einmal an einem anderen Controller oder Port angeschlossen sein sollte, doch das Partitionslabel ändert sich dadurch nicht. Anstatt auf Plattennamen und Partitionsnummern in Dateien wie [.filename]#/etc/fstab# zu verweisen, sorgen Labels dafür, dass das System Hardwareänderungen eher toleriert. GPT-Labels erscheinen in [.filename]#/dev/gpt/#, wenn eine Platte angeschlossen wird. Andere Partitionierungsschemas besitzen unterschiedliche Fähigkeiten, Labels zu verwenden und diese erscheinen in anderen [.filename]#/dev/#-Verzeichnissen.
+
+[TIP]
+====
+
+Vergeben Sie ein einzigartiges Label für jede Partition, um Konflikte mit identischen Labels zu verhindern. Ein paar Buchstaben des Computernamens, dessen Verwendungszweck oder Ortes kann dem Label hinzugefügt werden. Beispielsweise `labroot` oder `rootfslab` für die UFS Root-Partition auf einem Laborrechner namens `lab`.
+====
+
+[[bsdinstall-part-manual-splitfs]]
+.Ein traditionelles, partitioniertes Dateisystem erstellen
+[example]
+====
+
+Für ein traditionelles Partitionslayout, in dem sich [.filename]#/#, [.filename]#/var#, [.filename]#/tmp# und [.filename]#/usr# in getrennten Partitionen befinden sollen, erstellen Sie ein GPT-Partitionsschema und anschließend die Partitionen selbst. Die gezeigten Partitionsgrößen sind typisch für eine Festplatte von 20 G. Falls mehr Platz verfügbar ist, sind größere Swap oder [.filename]#/var#-Partitionen nützlich. Den hier gezeigten Beschreibungen sind `bsp` für "Beispiel" vorangestellt, jedoch sollten Sie andere, einzigartige Beschreibungen verwenden, wie oben beschrieben.
+
+Standardmäßig erwartet FreeBSDs [.filename]#gptboot#, dass die erste UFS-Partition die [.filename]#/#-Partition ist.
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Partitionstyp
+| Grösse
+| Eingehängt als
+| Beschreibung
+
+|`freebsd-boot`
+|`512K`
+
+|`freebsd-ufs`
+|`2G`
+|[.filename]#/#
+|`bsprootfs`
+
+|`freebsd-swap`
+|`4G`
+|`bspswap`
+
+|`freebsd-ufs`
+|`2G`
+|[.filename]#/var#
+|`bspvarfs`
+
+|`freebsd-ufs`
+|`1G`
+|[.filename]#/tmp#
+|`bsptmpfs`
+
+|`freebsd-ufs`
+|Akzeptieren Sie die Standardeinstellungen (Rest der Platte)
+|[.filename]#/usr#
+|`bspusrfs`
+|===
+====
+
+Nachdem die Partitionen erzeugt wurden, wählen Sie btn:[Finish], um die Installation mit <<bsdinstall-fetching-distribution>> fortzusetzen.
+
+[[bsdinstall-part-zfs]]
+=== Geführte Partitionierung mit Root-on-ZFS
+
+Dieser Modus funktioniert nur mit ganzen Laufwerken und wird alle vorhandenen Daten auf der Platte löschen. Das Konfigurationsmenü für ZFS bietet einige Optionen, um die Erstellung des Pools zu beeinflussen.
+
+[[bsdinstall-zfs-menu]]
+.ZFS Konfigurationsmenü
+image::bsdinstall-zfs-menu.png[]
+
+Hier eine Zusammenfassung der Optionen, die in diesem Menü benutzt werden können:
+
+* `Install` - Setzt die Installation mit den ausgewählten Optionen fort.
+* `Pool Type/Disks` - Erlaubt die Konfiguration des `Pool Type` und der Festplatte(n), die den Pool bilden werden. Das ZFS-Installationsprogramm unterstützt derzeit nur die Erstellung eines einzelnen Top-Level-Vdev, außer im Stripe-Modus. Um komplexere Pools zu erstellen, folgen Sie den Anweisungen in <<bsdinstall-part-shell>>, um den Pool zu erstellen.
+* `Rescan Devices` - Aktualisiert die Liste der verfügbaren Festplatten.
+* `Disk Info` - Dieses Menü wird verwendet, um Datenträger zu inspizieren, einschließlich ihrer Partitionstabelle und weitere Informationen wie die Modell- und Seriennummer des Geräts.
+* `Pool Name` - Legt den Namen des Pools fest. Der Standard ist _zroot_.
+* `Force 4K Sectors?` - Erzwingt die Verwendung von 4K-Sektoren. Im Standard erstellt die Installation automatisch Partitionen, die an 4K-Grenzen ausgerichtet sind. Bei ZFS wird die Verwendung von 4K-Sektoren erzwungen. Dies ist selbst bei Festplatten mit 512-Byte-Sektoren sicher und hat den zusätzlichen Vorteil, dass Pools, die auf solchen Festplatten mit erstellt werden, auch in Zukunft 4K-Sektoren haben können, entweder als zusätzlicher Speicherplatz oder als Ersatz für ausgefallene Platten. Drücken Sie kbd:[Enter], um die Verwendung von 4K-Sektoren zu konfigurieren.
+* `Encrypt Disks?` - Das Verschlüsseln der Datenträger mit GELI. Weitere Informationen zur Datenträgerverschlüsselung finden Sie in crossref:disks[disks-encrypting-geli,“Plattenverschlüsselung mit geli”]. Drücken Sie kbd:[Enter] um eine Auswahl zu treffen.
+* `Partition Scheme` - Erlaubt die Auswahl des Partitionsschemas. GPT ist die empfohlene Option. Drücken Sie kbd:[Enter], um zwischen den verschiedenen Optionen zu wählen.
+* `Swap Size` - Legt die Größe des Swap-Speichers fest.
+* `Mirror Swap?` - Erlaubt es, den Swap-Speicher zwischen den Platten zu spiegeln. Beachten Sie jedoch, dass die Aktivierung dazu führt, dass Crash Dumps nicht mehr funktionieren. Drücken Sie kbd:[Enter], um diese Option zu aktivieren/deaktivieren.
+* `Encrypt Swap?` - Erlaubt es, den Swap-Speicher zu verschlüsseln. Der Swap-Speicher wird bei jedem Systemstart mit einem temporären Schlüssel verschlüsselt, der bei einem Neustart des Systems verworfen wird. Drücken Sie kbd:[Enter], diese Option zu aktivieren/deaktivieren. Weitere Informationen zur Verschlüsselung des Swap-Speichers finden Sie in crossref:disks[swap-encrypting,“Den Auslagerungsspeicher verschlüsseln”].
+
+Wählen Sie kbd:[T] um den Pool Typ und die Festplatte(n) zu konfigurieren, die den Pool bilden werden.
+
+[[bsdinstall-zfs-vdev_type]]
+.ZFS Pool Typen
+image::bsdinstall-zfs-vdev_type.png[]
+
+Hier eine Zusammenfassung der Pool-Typen, die in diesem Menü ausgewählt werden können:
+
+* `stripe` - Striping bietet maximalen Speicherplatz für alle angeschlossenen Geräte, aber keine Redundanz. Fällt eine Platte aus, sind die Daten im Pool unwiderruflich verloren.
+* `mirror` - Bei der Spiegelung wird eine vollständige Kopie aller Daten auf jeder Platte gespeichert. Die Spiegelung bietet eine gute Leistung beim Lesen, da die Daten von allen Platten parallel gelesen werden. Die Leistung beim Schreiben ist langsamer, da die Daten auf alle Platten im Pool geschrieben werden müssen. Hiermit können alle Platten bis auf eine ausfallen. Diese Option erfordert mindestens zwei Platten.
+* `raid10` - Striped Mirrors. Bieten die beste Leistung, aber den geringsten Speicherplatz. Diese Option erfordert mindestens eine gerade Anzahl von Platten und mindestens vier Platten.
+* `raidz1` - Einzelnes redundantes RAID. Ermöglicht den Ausfall einer Platte. Für diese Option sind mindestens drei Festplatten erforderlich.
+* `raidz2` - Doppeltes redundantes RAID. Ermöglicht den Ausfall von zwei Platten. Für diese Option sind mindestens vier Festplatten erforderlich.
+* `raidz3` - Dreifaches redundantes RAID. Ermöglicht den Ausfall von drei Platten. Für diese Option sind mindestens fünf Festplatten erforderlich.
+
+Sobald ein Pool-Typ (`Pool Type`) ausgewählt wurde, wird eine Liste der verfügbaren Laufwerke angezeigt und der Benutzer wird aufgefordert, eine oder mehrere Laufwerke für die Erstellung des Pools auszuwählen. Anschließend wie die Konfiguration geprüft um zu gewährleisten, dass genug Laufwerke ausgewählt wurden. Wählen Sie btn:[<Change Selection>] um zur Auswahl der Laufwerke zurückzukehren, oder btn:[<Back>] um den `Pool Type` zu ändern.
+
+[[bsdinstall-zfs-disk_select]]
+.Auswahl der Laufwerke
+image::bsdinstall-zfs-disk_select.png[]
+
+[[bsdinstall-zfs-vdev_invalid]]
+.Ungültige Auswahl
+image::bsdinstall-zfs-vdev_invalid.png[]
+
+Wenn eine oder mehrere Platten in der Liste fehlen, oder wenn Festplatten angebunden wurden, nachdem das Installationsprogramm gestartet wurde, wählen Sie btn:[- Rescan Devices] um die Laufwerke nochmals zu suchen und anzuzeigen.
+
+[[bsdinstall-zfs-rescan-devices]]
+.Rescan Devices
+image::bsdinstall-zfs-rescan-devices.png[]
+
+Um zu vermeiden, dass versehentlich die falsche Platte gelöscht wird, können Sie das btn:[- Disk-Info]-Menü verwenden. Dieses Menü zeigt verschiedene Informationen, einschließlich der Partitionstabelle, der Modellnummer und der Seriennummer, falls verfügbar.
+
+[[bsdinstall-zfs-disk_info]]
+.Informationen zum Laufwerk
+image::bsdinstall-zfs-disk_info.png[]
+
+Wählen Sie kbd:[N], um den Pool-Namen zu konfigurieren. Geben Sie den gewünschten Namen ein und wählen Sie dann btn:[OK], um den Namen zu speichern, oder btn:[<Cancel>], um zum Hauptmenü zurückzukehren und den Standard zu belassen.
+
+[[bsdinstall-zfs-pool-name]]
+.Pool-Name
+image::bsdinstall-zfs-pool-name.png[]
+
+Wählen Sie kbd:[S], um die Größe des Swap-Speichers festzulegen. Geben Sie die gewünschte Größe ein und wählen Sie dann btn:[OK], um die Einstellung zu speichern, oder btn:[<Cancel>], um zum Hauptmenü zurückzukehren und den Standard zu belassen.
+
+[[bsdinstall-zfs-swap-amount]]
+.Größe des Swap-Speichers
+image::bsdinstall-zfs-swap-amount.png[]
+
+Wenn alle Optionen wie gewünscht konfiguriert sind, wählen Sie oben im Menü die Option btn:[>>> Install]. Das Installationsprogramm bietet dann eine letzte Chance zum Abbrechen, bevor der Inhalt der ausgewählten Laufwerke zerstört wird, um den ZFS-Pool zu erstellen.
+
+[[bsdinstall-zfs-warning]]
+.Letzte Chance!
+image::bsdinstall-zfs-warning.png[]
+
+Wenn die GELI Plattenverschlüsselung aktiviert wurde, fordert das Installationsprogramm zweimal zur Eingabe der Passphrase auf. Anschließend beginnt die Initialisierung der Verschlüsselung.
+
+[[bsdinstall-zfs-geli_password]]
+.Passwort für die Verschlüsselung der Platte
+image::bsdinstall-zfs-geli_password.png[]
+
+[[bsdinstall-zfs-init-encryption]]
+.Initialisierung der Verschlüsselung
+image::bsdinstall-zfs-init-encription.png[]
+
+Danach wird die Installation normal weitergeführt. Um mit der Installation fortzufahren, lesen Sie <<bsdinstall-fetching-distribution>>.
+
+[[bsdinstall-part-shell]]
+=== Shell Partitionierung
+
+bsdinstall bietet bei fortgeschrittenen Installationen womöglich nicht die benötigte Flexibilität. Erfahrene Benutzer können die Option btn:[Shell] im Menü auswählen, um die Laufwerke manuell zu partitionieren, Dateisysteme zu erstellen, [.filename]#/tmp/bsdinstall_etc/fstab# zu befüllen und Dateisysteme unter [.filename]#/mnt# einzuhängen. Geben Sie anschließend `exit` ein, um zu bsdinstall zurückzukehren und die Installation fortzusetzen.
+
+[[bsdinstall-fetching-distribution]]
+== Abrufen der Distributionen
+
+Die Installationsdauer hängt von den gewählten Distributionen, dem Installationsmedium und der Geschwindigkeit des Computers ab. Eine Reihe von Nachrichten werden angezeigt, um den Fortschritt darzustellen.
+
+Zunächst formatiert das Installationsprogramm die ausgewählten Platten und initialisiert die Partitionen. Bei `bootonly media` oder `mini memstick` werden als nächstes die benötigten Komponenten heruntergeladen:
+
+[[bsdinstall-distfile-fetching]]
+.Herunterladen der Distributionsdateien
+image::bsdinstall-distfile-fetching.png[]
+
+Als nächstes wird die Integrität der Distributionsdateien überprüft, um sicherzustellen, dass diese während des Ladevorgangs nicht beschädigt oder unsauber vom Installationsmedium gelesen wurden:
+
+[[bsdinstall-distfile-verify]]
+.Überprüfen der Distributionsdateien
+image::bsdinstall-distfile-verifying.png[]
+
+Zum Schluss werden die überprüften Distributionsdateien auf die Festplatte entpackt:
+
+[[bsdinstall-distfile-extract]]
+.Entpacken der Distributionsdateien
+image::bsdinstall-distfile-extracting.png[]
+
+Sobald alle benötigten Distributionsdateien entpackt wurden, wird bsdinstall das erste Menü für die Arbeiten nach der Installation anzeigen. Die zur Verfügung stehenden Konfigurationsoptionen werden im nächsten Abschnitt beschrieben.
+
+[[bsdinstall-post]]
+== Benutzerkonten, Zeitzone, Dienste und Sicherheitsoptionen
+
+[[bsdinstall-post-root]]
+=== Setzen des `root`-Passworts
+
+Zuerst muss das `root`-Passwort gesetzt werden. Die eingegebenen Zeichen werden dabei nicht auf dem Bildschirm angezeigt. Nachdem das Passwort eingegeben wurde, muss es zur Bestätigung erneut eingetippt werden. Damit werden auch Tippfehler verhindert.
+
+[[bsdinstall-post-set-root-passwd]]
+.Das `root`-Passwort setzen
+image::bsdinstall-post-root-passwd.png[]
+
+[[bsdinstall-timezone]]
+=== Setzen der Zeitzone
+
+Die nächsten Menüs werden verwendet, um die korrekte Ortszeit zu ermitteln. Dazu muss die gewünschte geographische Region, das Land und die Zeitzone ausgewählt werden. Das Setzen der Zeitzone erlaubt es dem System automatische Korrekturen vorzunehmen, beispielsweise beim Wechsel von Sommer- auf Winterzeit.
+
+Das hier gezeigte Beispiel bezieht sich auf einen Rechner in der Zeitzone des spanischen Festlands. Die Auswahl ist je nach geographischer Lage unterschiedlich.
+
+[[bsdinstall-timezone-region]]
+.Auswahl der geographischen Region
+image::bsdinstall-timezone-region.png[]
+
+[[bsdinstall-timezone-country]]
+.Das Land auswählen
+image::bsdinstall-timezone-country.png[]
+
+Wählen Sie das zutreffende Land mit den Pfeiltasten und durch anschließendes drücken von kbd:[Enter] aus.
+
+[[bsdinstall-timezone-zone]]
+.Wählen einer Zeitzone
+image::bsdinstall-timezone-zone.png[]
+
+Die passende Zeitzone wird durch die Pfeiltasten und anschließendes drücken von kbd:[Enter] ausgewählt.
+
+[[bsdinstall-timezone-confirmation]]
+.Bestätigen der Zeitzone
+image::bsdinstall-timezone-confirm.png[]
+
+Bestätigen Sie, dass die Abkürzung für die Zeitzone korrekt ist.
+
+[[bsdinstall-timezone-date]]
+.Datum auswählen
+image::bsdinstall-timezone-date.png[]
+
+Das entsprechende Datum wird mit den Pfeiltasten und das anschließende Drücken von btn:[Set Date] gewählt. Andernfalls kann die Auswahl durch Drücken von btn:[Skip] übersprungen werden.
+
+[[bsdinstall-timezone-time]]
+.Uhrzeit auswählen
+image::bsdinstall-timezone-time.png[]
+
+Die entsprechende Uhrzeit wird mit den Pfeiltasten und das anschließende Drücken von btn:[Set Time] gewählt. Andernfalls kann die Auswahl durch Drücken von btn:[Skip] übersprungen werden.
+
+[[bsdinstall-sysconf]]
+=== Dienste aktivieren
+
+Zusätzliche Systemdienste, die zur Startzeit aktiviert werden sollen, können im folgenden Menü eingeschaltet werden. All diese Dienste sind optional. Starten Sie nur die Dienste, die zur korrekten Funktion des Systems benötigt werden.
+
+[[bsdinstall-config-serv]]
+.Auswahl zusätzlicher Dienste
+image::bsdinstall-config-services.png[]
+
+Die folgenden Dienste können über dieses Menü aktiviert werden:
+
+* `local_unbound` - Aktiviert den lokalen unbound DNS-Cache. Bedenken Sie, dass dies der Unbound des Basissystems ist und nur als lokaler Cache-Forwarding-Resolver gedacht ist. Möchten Sie einen DNS-Server für das gesamte Netzwerk einrichten, installieren Sie bitte package:dns/unbound[].
+* `sshd` - Der Secure Shell (SSH)-Daemon für Fernzugriff über eine verschlüsselte Verbindung. Aktivieren Sie diesen Dienst nur dann, wenn das System für Fernzugriff zur Verfügung stehen soll.
+* `moused` - Aktivieren Sie diesen Dienst, wenn Sie Mausunterstützung auf der Systemkonsole benötigen.
+* `ntpdate` - Aktiviert die automatische Synchronisation der Uhrzeit beim booten. Diese Funktionalität ist ebenfalls im man:ntpd[8]-Daemon verfügbar. In naher Zukunft soll das Programm man:ntpdate[8] entfernt werden.
+* `ntpd` - Der Network Time Protocol (NTP)-Daemon zur automatischen Uhrzeitsynchronisation. Aktivieren Sie diesen Dienst, wenn es im Netzwerk einen Windows(R)-, Kerberos- oder LDAP-Server gibt.
+* `powerd` - Systemwerkzeug zur Leistungsregelung und für Stromsparfunktionen.
+* `dumpdev` - Aktiviert die Absturzaufzeichnung, welche sehr nützlich sein kann, um Systemfehler aufzuspüren. Daher wird Anwendern empfohlen, diese Option zu aktivieren.
+
+[[bsdinstall-hardening]]
+=== Aktivieren von Sicherheitsoptionen
+
+Im nächsten Menü können Sicherheitsoptionen aktiviert werden. Alle diese Optionen sind optional. Es wird jedoch empfohlen, sie zu aktivieren.
+
+[[bsdinstall-hardening-options]]
+.Auswahl der Sicherheitsoptionen
+image::bsdinstall-hardening.png[]
+
+Folgende Optionen können in diesem Menü aktiviert werden:
+
+* `hide_uids` - Versteckt die Prozesse von anderen Benutzern, um zu verhindern, dass unprivilegierte Benutzer laufende Prozesse von anderen Benutzern (UID) sehen können.
+* `hide_gids` - Versteckt die Prozesse anderer Gruppen, um zu verhindern, dass unprivilegierte Benutzer laufende Prozesse von anderen Gruppen (GID) sehen können.
+* `hide_jails` - Versteckt Jail-Prozesse, um zu verhindern, dass unprivilegierte Benutzer die in den Jails laufenden Prozesse sehen können.
+* `read_msgbuf` - Deaktiviert den Lesezugriff auf den Nachrichtenpuffer des Kernels für nicht privilegierte Benutzer. Dadurch wird verhindert, dass man:dmesg[8] zum Anzeigen von Nachrichten aus dem Nachrichtenpuffer des Kernels verwendet wird.
+* `proc_debug` - Die Deaktivierung von Prozess-Debugging-Funktionen für unprivilegierte Benutzer deaktiviert einige IPC-Dienste und procfs-Funktionen, ptrace() und ktrace(). Beachten Sie, dass dadurch auch die Nutzung von Werkzeugen wie man:lldb[1], man:truss[1], man:procstat[1] und einige Debugging-Funktionen von Skriptsprachen wie PHP, für unprivilegierte Benutzer unterbunden wird.
+* `random_pid` - Zufällig generierte PID für neu erstellte Prozesse.
+* `clear_tmp` - Bereinigt das Verzeichnis [.filename]#/tmp# beim Systemstart.
+* `disable_syslogd` - Diese Option verhindert, dass syslogd einen Netzwerk-Socket öffnet. In der Voreinstellung startet FreeBSD syslogd auf sichere Weise mit `-s`. Das verhindert, dass der Daemon auf Port 514 auf UDP-Anfragen lauscht. Wenn diese Option aktiviert ist, läuft syslogd mit dem Schalter `-ss`, dass syslogd daran hindert, einen Port zu öffnen. Weitere Informationen finden Sie in man:syslogd[8].
+* `disable_sendmail` - Deaktiviert den sendmail MTA.
+* `secure_console` - Wenn diese Option aktiviert ist, fragt das System im Single-User-Modus nach dem `root"`-Passwort.
+* `disable_ddtrace` - DTrace kann in einem Modus laufen, der sich tatsächlich auf den laufenden Kernel auswirkt. Destruktive Aktionen dürfen nicht benutzt werden, es sei denn, sie wurden explizit aktiviert. Um diese Option bei der Verwendung von DTrace zu aktivieren, benutzen Sie `-w`. Weitere Informationen finden Sie in man:dtrace[1].
+
+[[bsdinstall-addusers]]
+=== Benutzer hinzufügen
+
+Das nächste Menü fordert Sie dazu auf, mindestens ein Benutzerkonto zu erstellen. Es wird empfohlen, sich als normaler Benutzer am System anzumelden und nicht als `root`-Benutzer. Wenn man als `root` angemeldet ist, gibt es so gut wie keine Beschränkungen oder Schutz vor dem, was man tun kann. Die Anmeldung als normaler Benutzer ist daher sicherer und bietet mehr Schutz.
+
+Wählen Sie btn:[Yes], um neue Benutzer hinzuzufügen.
+
+[[bsdinstall-add-user1]]
+.Benutzerkonten hinzufügen
+image::bsdinstall-adduser1.png[]
+
+Folgen Sie den Anweisungen und geben Sie die angeforderten Informationen für das Benutzerkonto ein. Das Beispiel in <<bsdinstall-add-user2>> erstellt ein Konto für den Benutzer `asample`.
+
+[[bsdinstall-add-user2]]
+.Benutzerinformationen eingeben
+image::bsdinstall-adduser2.png[]
+
+Die folgenden Informationen müssen eingegeben werden:
+
+* `Username` - Der Name des Benutzers, den man zur Anmeldung eingeben muss. Es ist üblich, den ersten Buchstaben des Vornamens zusammen mit dem Nachnamen zu kombinieren. Jeder Benutzername ist möglich, solange er für das System einzigartig ist. Es wird zwischen Groß- und Kleinschreibung unterschieden und der Benutzername sollte keine Leerzeichen enthalten.
+* `Full name` - Der volle Name des Benutzers. Dieser darf auch Leerzeichen enthalten und dient als Beschreibung für das Benutzerkonto.
+* `Uid` - User ID. Normalerweise wird dieses Feld leer gelassen, so dass das System einen Wert vergibt.
+* `Login group` - Die Benutzergruppe. Normalerweise bleibt dieses Feld leer, um die Standardgruppe zu akzeptieren.
+* `Invite _user_ into other groups?` - Zusätzliche Gruppen zu denen der Benutzer als Mitglied hinzugefügt werden soll. Falls der Benutzer administrativen Zugriff benötigt, tragen Sie hier `wheel` ein.
+* `Login class` - In der Regel bleibt dieses Feld leer.
+* `Shell` - Die interaktive Shell für diesen Benutzer. Tragen Sie hier eine der aufgeführten Shells ein. Weitere Informationen über Shells finden Sie im crossref:basics[shells,“Shells”].
+* `Home directory` - Das Heimatverzeichnis des Benutzers. Die Vorgabe ist für gewöhnlich richtig.
+* `Home directory permissions` - Zugriffsrechte auf das Heimatverzeichnis des Benutzers. Die Vorgabe ist normalerweise die passende.
+* `Use password-based authentication?` - Normalerweise `yes`, damit der Benutzer bei der Anmeldung sein Passwort eingeben muss.
+* `Use an empty password?` - Normalerweise `no`, da ein leeres Passwort unsicher ist.
+* `Use a random password?` - Normalerweise `no`, damit der Benutzer sein Passwort am nächsten Prompt selber vergeben kann.
+* `Enter password` - Das Passwort für diesen Benutzer. Eingegebene Zeichen werden nicht am Bildschirm angezeigt.
+* `Enter password again` - Das Passwort muss zur Überprüfung erneut eingegeben werden.
+* `Lock out the account after creation?` - Normalerweise `no`, damit sich der Benutzer anmelden kann.
+
+Nachdem alles eingegeben wurde, wird eine Zusammenfassung angezeigt und das System fragt Sie, dies so korrekt ist. Falls ein Eingabefehler gemacht wurde, geben Sie `no` ein und versuchen es erneut. Falls alles in Ordnung ist, geben Sie `yes` ein, um den neuen Benutzer anzulegen.
+
+[[bsdinstall-add-user3]]
+.Verlassen der Benutzer- und Gruppenverwaltung
+image::bsdinstall-adduser3.png[]
+
+Falls es mehr Benutzer hinzuzufügen gibt, beantworten Sie die Frage `Add another user?` mit `yes`. Geben Sie `no` ein, wird das hinzufügen von Benutzern beendet und die Installation fortgesetzt.
+
+Für weitere Informationen zum hinzufügen von Benutzern und deren Verwaltung, lesen Sie crossref:basics[users-synopsis,“Benutzer und grundlegende Account-Verwaltung”].
+
+[[bsdinstall-final-conf]]
+=== Letzte Konfigurationsschritte
+
+Nachdem alles installiert und konfiguriert wurde, bekommen Sie noch eine letzte Chance, um Einstellungen zu verändern.
+
+[[bsdinstall-final-config]]
+.Letzte Schritte der Konfiguration
+image::bsdinstall-finalconfiguration.png[]
+
+Verwenden Sie dieses Menü, um noch letzte Änderungen oder zusätzliche Konfigurationen vor dem Abschließen der Installation zu tätigen.
+
+* `Add User` - Beschrieben in <<bsdinstall-addusers>>.
+* `Root Password` - Beschrieben in <<bsdinstall-post-root>>.
+* `Hostname` - Beschrieben in <<bsdinstall-hostname>>.
+* `Network` - Beschrieben in <<bsdinstall-config-network-dev>>.
+* `Services` - Beschrieben in <<bsdinstall-sysconf>>.
+* `Time Zone` - Beschrieben in <<bsdinstall-timezone>>.
+* `Handbook` - Herunterladen und installieren des FreeBSD Handbuchs.
+
+Nachdem die letzten Konfigurationsschritte beendet sind, wählen Sie btn:[Exit].
+
+[[bsdinstall-final-modification-shell]]
+.Manuelle Konfiguration
+image::bsdinstall-final-modification-shell.png[]
+
+bsdinstall wird nach zusätzlichen Konfigurationen, die noch zu tätigen sind, fragen, bevor in das neue System gebootet wird. Wählen Sie btn:[Yes], um in eine Shell innerhalb des neuen Systems zu wechseln oder btn:[No], um mit dem letzten Schritt der Installation zu beginnen.
+
+[[bsdinstall-final-main]]
+.Die Installation vervollständigen
+image::bsdinstall-mainexit.png[]
+
+Wenn weitere Konfigurationen oder besondere Einstellungen benötigt werden, wählen Sie btn:[Live CD], um das Installationsmedium im Live-CD Modus zu starten.
+
+Wenn die Installation vollständig ist, wählen Sie btn:[Reboot], um den Computer neu zu starten und das neu installierte FreeBSD-System zu booten. Vergessen Sie nicht, das FreeBSD Installationsmedium zu entfernen, oder der Computer wird erneut davon starten.
+
+Wenn FreeBSD startet, werden viele Informationsmeldungen ausgegeben. Nachdem das System den Startvorgang abgeschlossen hat, wird eine Anmeldeaufforderung angezeigt. Geben Sie am `login:` den Benutzernamen ein, den Sie während der Installation hinzugefügt haben. Vermeiden Sie es, sich als `root` anzumelden. Lesen Sie crossref:basics[users-superuser,“Der Superuser-Account”], wenn Sie administrativen Zugriff benötigen.
+
+Um Nachrichten, die während des Bootens angezeigt wurden, zu sehen, aktivieren Sie durch drücken von kbd:[Scroll-Lock] den _scroll-back buffer_. Die Tasten kbd:[PgUp], kbd:[PgDn] und die Pfeiltasten dienen zur Navigation durch die Nachrichten. Durch erneutes drücken von kbd:[Scroll-Lock] wird der Bildschirm wieder entsperrt und kehrt zur normalen Anzeige zurück. Mit `less /var/run/dmesg.boot` können Sie sich diese Nachrichten im laufenden Betrieb ansehen. Durch drücken von kbd:[q] kehren Sie wieder zur Kommandozeile zurück.
+
+Wenn sshd in <<bsdinstall-config-serv>> aktiviert wurde, ist der erste Start ein bisschen langsamer, weil das System die RSA- und DSA-Schlüssel erzeugen muss. Die nachfolgenden Startvorgänge werden dann wieder schneller sein. Wie in diesem Beispiel zu sehen ist, werden die Fingerabdrücke der Schlüssel am Bildschirm ausgegeben:
+
+[source,bash]
+....
+Generating public/private rsa1 key pair.
+Your identification has been saved in /etc/ssh/ssh_host_key.
+Your public key has been saved in /etc/ssh/ssh_host_key.pub.
+The key fingerprint is:
+10:a0:f5:af:93:ae:a3:1a:b2:bb:3c:35:d9:5a:b3:f3 root@machine3.example.com
+The key's randomart image is:
++--[RSA1 1024]----+
+| o.. |
+| o . . |
+| . o |
+| o |
+| o S |
+| + + o |
+|o . + * |
+|o+ ..+ . |
+|==o..o+E |
++-----------------+
+Generating public/private dsa key pair.
+Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
+Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
+The key fingerprint is:
+7e:1c:ce:dc:8a:3a:18:13:5b:34:b5:cf:d9:d1:47:b2 root@machine3.example.com
+The key's randomart image is:
++--[ DSA 1024]----+
+| .. . .|
+| o . . + |
+| . .. . E .|
+| . . o o . . |
+| + S = . |
+| + . = o |
+| + . * . |
+| . . o . |
+| .o. . |
++-----------------+
+Starting sshd.
+....
+
+Lesen Sie crossref:security[openssh,"OpenSSH"] für weitere Informationen zu Fingerabdrücken und SSH.
+
+FreeBSD installiert standardmäßig keine graphische Umgebung. crossref:x11[x11,Das X-Window-System] enthält Informationen zur Installation und Konfiguration eines graphischen Window Managers.
+
+Das korrekte herunterfahren eines FreeBSD-Computers hilft, beugt dem Datenverlust vor und schützt sogar die Hardware vor Schäden. _Schalten Sie nicht den Strom ab, bevor das System ordnungsgemäß heruntergefahren wurde!_ Wenn der Benutzer ein Mitglied der `wheel`-Gruppe ist, können Sie zum Superuser durch die Eingabe von `su` und der anschließenden Eingabe des Passworts von `root` werden. Geben Sie dann `shutdown -p now` ein. Das System wird jetzt sauber heruntergefahren und, falls die Hardware es unterstützt, den Rechner ausschalten.
+
+[[bsdinstall-network]]
+== Netzwerkschnittstellen
+
+[[bsdinstall-config-network-dev]]
+=== Die Netzwerkschnittstelle konfigurieren
+
+Als nächstes wird eine Liste der gefundenen Netzwerkschnittstellen gezeigt. Wählen Sie die Schnittstelle aus, die Sie konfigurieren möchten.
+
+[[bsdinstall-configure-net-interface]]
+.Eine zu konfigurierende Netzwerkschnittstelle auswählen
+image::bsdinstall-configure-network-interface.png[]
+
+Wenn Sie eine Ethernet-Schnittstelle ausgewählt haben, fährt das Installationsprogramm mit dem Menü aus <<bsdinstall-configure-net-ipv4>> fort. Wenn Sie eine drahtlose Netzwerkschnittstelle ausgewählt haben, wird das System nach drahtlosen Zugriffspunkten (Access Points) suchen:
+
+[[bsdinstall-wireless-scan]]
+.Nach drahtlosen Access Points scannen
+image::bsdinstall-configure-wireless-scan.png[]
+
+Drahtlose Netzwerke werden durch einen Service Set Identifier (SSID) identifiziert. Der SSID ist ein kurzer, eindeutiger Name, der für jedes Netzwerk vergeben wird. SSIDs, die während des Scans gefunden wurden, werden aufgelistet, gefolgt von einer Beschreibung der Verschlüsselungsarten, die für dieses Netzwerk verfügbar sind. Falls die gewünschte SSID nicht in der Liste auftaucht, wählen Sie btn:[Rescan], um erneut einen Scanvorgang durchzuführen. Falls dann das gewünschte Netzwerk immer noch nicht erscheint, überprüfen Sie die Antenne auf Verbindungsprobleme oder versuchen Sie, näher an den Access point zu gelangen. Scannen Sie erneut nach jeder vorgenommenen Änderung.
+
+[[bsdinstall-wireless-accesspoints]]
+.Ein drahtloses Netzwerk auswählen
+image::bsdinstall-configure-wireless-accesspoints.png[]
+
+Geben Sie nun die Verschlüsselungsinformationen ein, um sich mit dem drahtlosen Netzwerk zu verbinden. WPA2 wird als Verschlüsselung dringend empfohlen, da ältere Verschlüsselungsmethoden, wie WEP, nur wenig Sicherheit bieten. Wenn das Netzwerk WPA2 verwendet, geben Sie das Passwort (auch bekannt als Pre-Shared Key PSK) ein. Aus Sicherheitsgründen werden die in das Eingabefeld eingegeben Zeichen nur als Sternchen angezeigt.
+
+[[bsdinstall-wireless-wpa2]]
+.Verbindungsaufbau mit WPA2
+image::bsdinstall-configure-wireless-wpa2setup.png[]
+
+Wählen Sie, ob eine IPv4-Adresse auf der Ethernet-Schnittstelle oder der drahtlosen Schnittstelle konfiguriert werden soll.
+
+[[bsdinstall-configure-net-ipv4]]
+.Auswahl von IPv4
+image::bsdinstall-configure-network-interface-ipv4.png[]
+
+Es gibt zwei Arten, ein IPv4-Netzwerk zu konfigurieren. DHCP wird automatisch die Netzwerkschnittstelle richtig konfigurieren und sollte verwendet werden, wenn das Netzwerk über einen DHCP-Server verfügt. Eine _statische_ IP-Konfiguration erfordert die manuelle Eingabe von Netzwerkinformationen.
+
+[NOTE]
+====
+Geben Sie keine zufällig gewählten Netzwerkinformationen ein, da dies nicht funktionieren wird. Holen Sie sich die in <<bsdinstall-collect-network-information,Erforderliche Informationen zum Netzwerk>> gezeigten Informationen vom Netzwerkadministrator oder Serviceprovider, falls kein DHCP-Server verfügbar ist.
+====
+
+Falls ein DHCP-Server zur Verfügung steht, wählen Sie im nächsten Menü btn:[Yes], um die Netzwerkschnittstelle automatisch einrichten zu lassen. Dieser Vorgang kann einige Sekunden dauern.
+
+[[bsdinstall-net-ipv4-dhcp]]
+.Auswählen der IPv4-Konfiguration über DHCP
+image::bsdinstall-configure-network-interface-ipv4-dhcp.png[]
+
+Wenn kein DHCP-Server zur Verfügung steht, wählen Sie btn:[No] und tragen Sie die folgenden Informationen in das Menü ein:
+
+[[bsdinstall-net-ipv4-static]]
+.Statische IPv4-Konfiguration
+image::bsdinstall-configure-network-interface-ipv4-static.png[]
+
+* `IP Address` - Die IPv4-Adresse, welche diesem Computer zugewiesen werden soll. Diese Adresse muss eindeutig sein und darf nicht bereits von einem anderen Gerät im lokalen Netzwerk verwendet werden.
+* `Subnet Mask` - Die Subnetzmaske des Netzwerks.
+* `Default Router` - Die IP-Adresse des Defaultrouters im Netzwerk.
+
+Das nächste Menü fragt, ob die Schnittstelle für IPv6 konfiguriert werden soll. Falls IPv6 verfügbar ist und verwendet werden soll, wählen Sie btn:[Yes] aus.
+
+[[bsdinstall-net-ipv6]]
+.Auswahl von IPv6
+image::bsdinstall-configure-network-interface-ipv6.png[]
+
+IPv6 besitzt ebenfalls zwei Arten der Konfiguration. _StateLess Address AutoConfiguration_, (SLAAC) wird automatisch die richtigen Informationen von einem lokalen Router abfragen. Lesen Sie http://tools.ietf.org/html/rfc4862[http://tools.ietf.org/html/rfc4862] für weitere Informationen. Eine _statische_ Konfiguration verlangt die manuelle Eingabe von Netzwerkinformationen.
+
+Wenn ein IPv6-Router verfügbar ist, wählen Sie im nächsten Menü btn:[Yes], um die Netzwerkschnittstelle automatisch konfigurieren zu lassen.
+
+[[bsdinstall-net-ipv6-slaac]]
+.Auswahl der IPv6SLAAC-Konfiguration
+image::bsdinstall-configure-network-interface-slaac.png[]
+
+Wenn kein IPv6-Router zur Verfügung steht, wählen Sie btn:[No] und tragen Sie die folgenden Adressinformationen in dieses Menü ein:
+
+[[bsdinstall-net-ipv6-static]]
+.Statische IPv6-Konfiguration
+image::bsdinstall-configure-network-interface-ipv6-static.png[]
+
+* `IPv6 Address` - Die zugewiesene IPv6-Adresse, welche dem Computer zugeteilt werden soll. Diese Adresse muss eindeutig sein und nicht bereits von einer anderen Netzwerkkomponente im lokalen Netzwerk verwendet werden.
+* `Default Router` - Die IPv6-Adresse des Defaultrouters im Netzwerk.
+
+Das letzte Menü der Netzwerkkonfiguration konfiguriert den _Domain Name System_ (DNS) Resolver, welcher Hostnamen von und zu Netzwerkadressen umwandelt. Falls DHCP oder SLAAC verwendet wurde, um die Netzwerkschnittstelle zu konfigurieren, ist die Konfiguration für den Resolver möglicherweise bereits eingetragen. Andernfalls geben Sie den lokalen Netzwerkdomänennamen in das Feld `Search` ein. `DNS #1` und `DNS #2` sind die IPv4- und/oder IPv6-Adressen der lokalen DNS-Server. Zumindest ein DNS-Server wird benötigt.
+
+[[bsdinstall-net-dns-config]]
+.DNS-Konfiguration
+image::bsdinstall-configure-network-ipv4-dns.png[]
+
+Sobald die Schnittstelle konfiguriert ist, bestimmen Sie einen Spiegelserver, welcher in der gleichen Region auf der Welt beheimatet ist, wie der Computer, auf dem FreeBSD installiert wird. Dateien können so viel schneller übertragen werden, wenn der Spiegelserver sich näher am Zielcomputer befindet und die Installationszeit wird somit reduziert.
+
+[[bsdinstall-netinstall-mirror]]
+.Einen Spiegelserver wählen
+image::bsdinstall-netinstall-mirrorselect.png[]
+
+[[bsdinstall-install-trouble]]
+== Fehlerbehebung
+
+Dieser Abschnitt behandelt einfache Fehlerbehebungen für die Installation, wie beispielsweise häufig auftretende Fehler, die von Anwendern berichtet wurden.
+
+Überprüfen Sie die Hardware Notes (link:https://www.FreeBSD.org/releases/[https://www.freebsd.org/releases/]) nach der Version von FreeBSD, um sicher zu stellen, dass die Hardware auch unterstützt wird. Wenn die Hardware unterstützt wird und Sie immer noch Abstürze oder andere Probleme erleben, müssen Sie einen eigenen Kernel bauen. Diese Prozedur wird in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels ] beschrieben. Das erlaubt es, Unterstützung für Geräte, die im [.filename]#GENERIC#-Kernel nicht vorhanden sind, hinzuzufügen. Der Kernel ist mit der Annahme konfiguriert, dass die Hardwaregeräte sich in ihren Fabrikeinstellungen in Bezug auf IRQs, I/O-Adressen und DMA-Kanälen befinden. Wenn die Hardware neu konfiguriert wurde, werden Sie möglicherweise die Konfiguration des Kernels bearbeiten und diesen neu erstellen müssen, um FreeBSD mitzuteilen, wo es gewisse Dinge finden kann.
+
+[NOTE]
+====
+Manche Installationsprobleme können Aktualisierung der Firmware auf verschiedenen Hardwarekomponenten verhindert oder verringert werden, meistens am Mainboard. Mit Mainboard-Firmware ist für gewöhnlich das BIOS gemeint. Die meisten Mainboard- und Computerhersteller haben eine Webseite mit Aktualisierungen und Informationen zur Durchführung.
+
+Hersteller raten meist von einer Aktualisierung des Mainboard-BIOS ab, außer es gibt einen guten Grund dafür, wie beispielsweise eine kritische Aktualisierung. Der Aktualisierungsvorgang _kann_ schiefgehen, was das BIOS unvollständig macht und den Computer nicht mehr starten lässt.
+====
+
+Wenn das System während der Geräteerkennung beim Starten hängt oder sich während der Installation merkwürdig verhält, ist ACPI vielleicht der Übeltäter. FreeBSD macht auf i386- und amd64-Plattformen starken Gebrauch vom ACPI-Dienst, um dem System bei der Konfiguration während des Startvorgangs zu helfen. Leider existieren immer noch Fehler im ACPI-Treiber, in den Mainboards und der BIOS-Firmware. ACPI kann durch setzen der Einstellung `hint.acpi.0.disabled` im dritten Teil des Bootloaders deaktiviert werden:
+
+[source,bash]
+....
+ set hint.acpi.0.disabled="1"
+....
+
+Dies wird nach jedem Neustart des Systems wieder zurückgesetzt, also ist es notwendig, die Zeile `hint.acpi.0.disabled="1"` zu der Datei [.filename]#/boot/loader.conf# hinzuzufügen. Weitere Informationen über den Bootloader lassen sich in crossref:boot[boot-synopsis,“Übersicht”] nachlesen.
+
+[[using-live-cd]]
+== Verwendung der Live-CD
+
+Das Willkommensmenü von bsdinstall, welches in <<bsdinstall-choose-mode>> gezeigt wird, enthält eine btn:[Live CD] Option. Die Live-CD ist für Benutzer, die sich fragen, ob FreeBSD das richtige Betriebssystem für sie ist und die vor der Installation noch einige Merkmale und Eigenschaften testen wollen.
+
+Die folgenden Punkte sollten beachtet werden, bevor die btn:[Live CD] benutzt wird:
+
+* Um Zugriff auf das System zu bekommen, wird eine Authentifizierung benötigt. Der Benutzername ist `root` und das Kennwort bleibt leer.
+* Da das System direkt von dem Installationsmedium ausgeführt wird, ist die Geschwindigkeit deutlich langsamer als bei einem System, das auf einer Festplatte installiert ist.
+* Diese Option enthält nur eine Eingabeaufforderung und keine graphische Oberfläche.
diff --git a/documentation/content/de/books/handbook/chapters-order.adoc b/documentation/content/de/books/handbook/chapters-order.adoc
new file mode 100644
index 0000000000..327ed2f22d
--- /dev/null
+++ b/documentation/content/de/books/handbook/chapters-order.adoc
@@ -0,0 +1,41 @@
+preface/_index.adoc
+parti.adoc
+introduction/_index.adoc
+bsdinstall/_index.adoc
+basics/_index.adoc
+ports/_index.adoc
+x11/_index.adoc
+parti.adoc
+desktop/_index.adoc
+multimedia/_index.adoc
+kernelconfig/_index.adoc
+printing/_index.adoc
+linuxemu/_index.adoc
+partiii.adoc
+config/_index.adoc
+boot/_index.adoc
+security/_index.adoc
+jails/_index.adoc
+mac/_index.adoc
+audit/_index.adoc
+disks/_index.adoc
+geom/_index.adoc
+zfs/_index.adoc
+filesystems/_index.adoc
+virtualization/_index.adoc
+l10n/_index.adoc
+cutting-edge/_index.adoc
+dtrace/_index.adoc
+usb-device-mode/_index.adoc
+partiv.adoc
+serialcomms/_index.adoc
+ppp-and-slip/_index.adoc
+mail/_index.adoc
+network-servers/_index.adoc
+firewalls/_index.adoc
+advanced-networking/_index.adoc
+partv.adoc
+mirrors/_index.adoc
+bibliography/_index.adoc
+eresources/_index.adoc
+pgpkeys/_index.adoc
diff --git a/documentation/content/de/books/handbook/config/_index.adoc b/documentation/content/de/books/handbook/config/_index.adoc
new file mode 100644
index 0000000000..f4fbe909a0
--- /dev/null
+++ b/documentation/content/de/books/handbook/config/_index.adoc
@@ -0,0 +1,1525 @@
+---
+title: Kapitel 11. Konfiguration und Tuning
+part: Teil III. Systemadministration
+prev: books/handbook/partiii
+next: books/handbook/boot
+---
+
+[[config-tuning]]
+= Konfiguration und Tuning
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 11
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/x11/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/x11/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/x11/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[config-synopsis]]
+== Übersicht
+
+Die richtige Systemkonfiguration ist einer der wichtigsten Aspekte unter FreeBSD. Dieses Kapitel beschreibt die Konfiguration von FreeBSD sowie Maßnahmen zur Leistungssteigerung von FreeBSD-Systemen.
+
+Nachdem Sie dieses Kapitel durchgearbeitet haben, werden Sie Folgendes wissen:
+
+* Die Grundlagen der Konfiguration von [.filename]#rc.conf# und die Skripte zum Starten von Anwendungen in [.filename]#/usr/local/etc/rc.d#.
+* Wie Sie Netzwerkkarten konfigurieren und testen.
+* Wie Sie virtuelle Hosts und Netzwerkgeräte konfigurieren.
+* Wie Sie die verschiedenen Konfigurationsdateien in [.filename]#/etc# benutzen.
+* Wie Sie mit FreeBSD mit man:sysctl[8]-Variablen einstellen können.
+* Wie Sie die Platten-Performance einstellen und Kernel-Parameter modifizieren können.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie
+
+* die Grundlagen von UNIX(R) und FreeBSD (crossref:basics[basics,Grundlagen des FreeBSD Betriebssystems]) verstehen.
+* Damit vertraut sein, wie Sie einen Kernel konfigurieren und kompilieren (crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels]).
+
+[[configtuning-starting-services]]
+== Start von Diensten
+
+Viele Benutzer installieren Software Dritter auf FreeBSD mithilfe der Ports-Sammlung. Häufig soll die Software bei einem Systemstart mitgestartet werden. Beispielsweise sollen die Dienste package:mail/postfix[] oder package:www/apache22[] nach einem Systemstart laufen. Dieser Abschnitt stellt die Startprozeduren für Software Dritter vor.
+
+Unter FreeBSD werden die meisten der im System enthaltenen Dienste wie man:cron[8] mithilfe von Systemskripten gestartet.
+
+=== Dienste über das [.filename]#rc.d#-System starten
+
+Mit [.filename]#rc.d# lässt sich der Start von Anwendungen besser steuern und es sind mehr Funktionen verfügbar. Mit den in <<configtuning-rcd>> besprochenen Schlüsselwörtern können Anwendungen in einer bestimmten Reihenfolge gestartet werden und Optionen können in [.filename]#rc.conf# statt fest im Startskript der Anwendung festgelegt werden. Ein einfaches Startskript sieht wie folgt aus:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# PROVIDE: utility
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+
+. /etc/rc.subr
+
+name=utility
+rcvar=utility_enable
+
+command="/usr/local/sbin/utility"
+
+load_rc_config $name
+
+#
+# DO NOT CHANGE THESE DEFAULT VALUES HERE
+# SET THEM IN THE /etc/rc.conf FILE
+#
+utility_enable=${utility_enable-"NO"}
+pidfile=${utility_pidfile-"/var/run/utility.pid"}
+
+run_rc_command "$1"
+....
+
+Dieses Skript stellt sicher, dass `utility` nach den `DAEMON`-Pseudodiensten gestartet wird. Es stellt auch eine Methode bereit, die Prozess-ID (PID) der Anwendung in einer Datei zu speichern.
+
+In [.filename]#/etc/rc.conf# könnte für diese Anwendung die folgende Zeile stehen:
+
+[.programlisting]
+....
+utility_enable="YES"
+....
+
+Die Methode erleichtert den Umgang mit Kommandozeilenargumenten, bindet Funktionen aus [.filename]#/etc/rc.subr# ein, ist kompatibel zu man:rcorder[8] und lässt sich über [.filename]#rc.conf# leichter konfigurieren.
+
+=== Andere Arten, um Dienste zu starten
+
+Andere Dienste können über man:inetd[8] gestartet werden. Die Konfiguration von man:inetd[8] wird in crossref:network-servers[network-inetd,“Der inetd Super-Server”] ausführlich beschrieben.
+
+Systemdienste können auch mit man:cron[8] gestartet werden. Dieser Ansatz hat einige Vorteile; nicht zuletzt, weil man:cron[8] die Prozesse unter dem Eigentümer der [.filename]#crontab# startet, ist es möglich, dass Dienste von normalen Benutzern gestartet und gepflegt werden können.
+
+Für die Zeitangabe in man:cron[8] kann `@reboot` eingesetzt werden. Damit wird das Kommando gestartet, wenn man:cron[8] kurz nach dem Systemboot gestartet wird.
+
+[[configtuning-cron]]
+== man:cron[8] konfigurieren
+
+Ein sehr nützliches Werkzeug von FreeBSD ist cron. Dieses Programm läuft im Hintergrund und überprüft fortlaufend [.filename]#/etc/crontab# und [.filename]#/var/cron/tabs#. In diesen Dateien wird festgelegt, welche Programme zu welchem Zeitpunkt von cron ausgeführt werden sollen. Jede Zeile in diesen Dateien definiert eine auszuführende Aufgabe, die auch als _Cronjob_ bezeichnet wird.
+
+Das Werkzeug verwendet zwei verschiedene Konfigurationsdateien: die System-crontab, welche nicht verändert werden sollte und die Benutzer-crontabs, die nach Bedarf erstellt und geändert werden können. Das Format, dass von diesen beiden Dateien verwendet wird, ist in man:crontab[5] dokumentiert. Das Format der System-crontab in [.filename]#/etc/crontab# enthält das Feld `who`, das in der Benutzer-crontab nicht existiert. Dieses Feld gibt den Benutzer an, mit dem die Aufgabe ausgeführt wird. Die Aufgaben in den Benutzer-crontabs laufen unter dem Benutzer, der die crontab erstellt hat.
+
+Benutzer-crontabs erlauben es den Benutzern, ihre eigenen Aufgaben zu planen. Der Benutzer `root` kann auch seine eigene Benutzer-crontab haben, um Aufgaben zu planen, die nicht in der System-crontab existieren.
+
+Hier ist ein Beispieleintrag aus der System-crontab, [.filename]#/etc/crontab#:
+
+[.programlisting]
+....
+# /etc/crontab - root's crontab for FreeBSD
+#
+# $FreeBSD$
+# <.>
+SHELL=/bin/sh
+PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin <.>
+#
+#minute hour mday month wday who command <.>
+#
+*/5 * * * * root /usr/libexec/atrun <.>
+....
+
+<.> Das Zeichen `#` am Zeilenanfang leitet einen Kommentar ein. Benutzen Sie Kommentare, um die Funktion eines Eintrags zu erläutern. Kommentare müssen in einer extra Zeile stehen. Sie können nicht in derselben Zeile wie ein Kommando stehen, da sie sonst Teil des Kommandos wären. Leerzeilen in dieser Datei werden ignoriert.
+
+<.> Umgebungsvariablen werden mit dem Gleichheits-Zeichen (`=`) festgelegt. Im Beispiel werden die Variablen `SHELL`, `PATH` und `HOME` definiert. Wenn die Variable `SHELL` nicht definiert wird, benutzt cron die Bourne Shell. Wird die Variable `PATH` nicht gesetzt, müssen alle Pfadangaben absolut sein, da es keinen Vorgabewert für `PATH` gibt.
+
+<.> In dieser Zeile werden sieben Felder der System-crontab beschrieben: `minute`, `hour`, `mday`, `month`, `wday`, `who` und `command`. Das Feld `minute` legt die Minute fest in der die Aufgabe ausgeführt wird, das Feld `hour` die Stunde, das Feld `mday` den Tag des Monats. Im Feld `month` wird der Monat und im Feld `wday` der Wochentag festgelegt. Alle Felder müssen numerische Werte enthalten und die Zeitangaben sind im 24-Stunden-Format. Das Zeichen `*` repräsentiert dabei alle möglichen Werte für dieses Feld. Das Feld `who` gibt es nur in der System-crontab und gibt den Account an, unter dem das Kommando laufen soll. Im letzten Feld wird schließlich das auszuführende Kommando angegeben.
+
+<.> Diese Zeile definiert die Werte für den Cronjob. Die Zeichenfolge `\*/5` gefolgt von mehreren `*`-Zeichen bedeutet, dass `/usr/libexec/atrun` von `root` alle fünf Minuten aufgerufen wird.Bei den Kommandos können beliebig viele Optionen angegeben werden. Wenn das Kommando zu lang ist und auf der nächsten Zeile fortgesetzt werden soll, muss am Ende der Zeile das Fortsetzungszeichen (`\`) angegeben werden.
+
+[[configtuning-installcrontab]]
+=== Eine Benutzer-crontab erstellen
+
+Rufen Sie `crontab` im Editor-Modus auf, um eine Benutzer-crontab zu erstellen:
+
+[source,bash]
+....
+% crontab -e
+....
+
+Dies wird die crontab des Benutzers mit dem voreingestellten Editor öffnen. Wenn der Benutzer diesen Befehl zum ersten Mal ausführt, wird eine leere Datei geöffnet. Nachdem der Benutzer eine crontab erstellt hat, wird die Datei mit diesem Kommando zur Bearbeitung geöffnet.
+
+Es empfiehlt sich, die folgenden Zeilen an den Anfang der crontab-Datei hinzuzufügen, um die Umgebungsvariablen zu setzen und die einzelnen Felder zu beschreiben:
+
+[.programlisting]
+....
+SHELL=/bin/sh
+PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
+# Order of crontab fields
+# minute hour mday month wday command
+....
+
+Fügen Sie dann für jedes Kommando oder Skript eine Zeile hinzu, mit der Angabe wann das Kommando ausgeführt werden soll. In diesem Beispiel wird ein Bourne Shell Skript täglich um 14:00 Uhr ausgeführt. Da der Pfad zum Skript nicht in `PATH` enthalten ist, wird der vollständige Pfad zum Skript angegeben:
+
+[.programlisting]
+....
+0 14 * * * /usr/home/dru/bin/mycustomscript.sh
+....
+
+[TIP]
+====
+
+Bevor Sie ein eigenes Skript verwenden, stellen Sie sicher, dass es ausführbar ist und dass es mit den wenigen Umgebungsvariablen von cron funktioniert. Um die Umgebung nachzubilden, die der obige cron-Eintrag bei der Ausführung verwenden würde, benutzen Sie dieses Kommando:
+
+[source,bash]
+....
+% env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/home/dru LOGNAME=dru /usr/home/dru/bin/mycustomscript.sh
+....
+
+Die Umgebung von cron wird in man:crontab[5] beschrieben. Es ist wichtig, dass sichergestellt wird, dass die Skripte in der Umgebung von cron korrekt arbeiten, besonders wenn Befehle enthalten sind, welche Dateien mit Wildcards löschen.
+====
+
+Wenn Sie mit der Bearbeitung der crontab fertig sind, speichern Sie die Datei. Sie wird automatisch installiert und cron wird die darin enthalten Cronjobs zu den angegebenen Zeiten ausführen. Um die Cronjobs in einer crontab aufzulisten, verwenden Sie diesen Befehl:
+
+[source,bash]
+....
+% crontab -l
+0 14 * * * /usr/home/dru/bin/mycustomscript.sh
+....
+
+Um alle Cronjobs einer Benutzer-crontab zu löschen, verwenden Sie diesen Befehl:
+
+[source,bash]
+....
+% crontab -r
+remove crontab for dru? y
+....
+
+[[configtuning-rcd]]
+== Dienste unter FreeBSD verwalten
+
+FreeBSD verwendet die vom man:rc[8]-System bereit gestellten Startskripten beim Systemstart und für die Verwaltung von Diensten. Die Skripte sind in [.filename]#/etc/rc.d# abgelegt und bieten grundlegende Dienste an, die über die Optionen `start`, `stop` und `restart` des man:service[8] Kommandos kontrolliert werden können. Beispielsweise kann man:sshd[8] mit dem nachstehenden Kommando neu gestartet werden:
+
+[source,bash]
+....
+# service sshd restart
+....
+
+Analog können Sie andere Dienste starten und stoppen. Normalerweise werden die Dienste beim Systemstart über Einträge in der Datei man:rc.conf[5] automatisch gestartet. man:natd[8] wird zum Beispiel mit dem folgenden Eintrag in [.filename]#/etc/rc.conf# aktiviert:
+
+[.programlisting]
+....
+natd_enable="YES"
+....
+
+Wenn dort bereits die Zeile `natd_enable="NO"` existiert, ändern Sie `NO` in `YES`. Die man:rc[8]-Skripten starten, wie unten beschrieben, auch abhängige Dienste.
+
+Da das man:rc[8]-System primär zum automatischen Starten und Stoppen von Systemdiensten dient, funktionieren die Optionen `start`, `stop` und `restart` nur, wenn die entsprechenden Variablen in [.filename]#/etc/rc.conf# gesetzt sind. Beispielsweise funktioniert `sshd restart` nur dann, wenn in [.filename]#/etc/rc.conf# die Variable `sshd_enable` auf `YES` gesetzt wurde. Wenn Sie die Optionen `start`, `stop` oder `restart` unabhängig von den Einstellungen in [.filename]#/etc/rc.conf# benutzen wollen, müssen Sie den Optionen mit dem Präfix "one" verwenden. Um beispielsweise `sshd` unabhängig von den Einstellungen in [.filename]#/etc/rc.conf# neu zu starten, benutzen Sie das nachstehende Kommando:
+
+[source,bash]
+....
+# service sshd onerestart
+....
+
+Ob ein Dienst in [.filename]#/etc/rc.conf# aktiviert ist, können Sie herausfinden, indem Sie das entsprechende man:rc[8]-Skript mit der Option `rcvar` aufrufen. Dieses Beispiel prüft, ob der `sshd`-Dienst in [.filename]#/etc/rc.conf# aktiviert ist:
+
+[source,bash]
+....
+# service sshd rcvar
+# sshd
+#
+sshd_enable="YES"
+# (default: "")
+....
+
+[NOTE]
+====
+Die Zeile `# sshd` wird von dem Kommando ausgegeben; sie kennzeichnet nicht die Eingabeaufforderung von `root`.
+====
+
+Ob ein Dienst läuft, kann mit `status` abgefragt werden. Das folgende Kommando überprüft, ob `sshd` auch wirklich gestartet wurde:
+
+[source,bash]
+....
+# service sshd status
+sshd is running as pid 433.
+....
+
+Einige Dienste können über die Option `reload` neu initialisiert werden. Dazu wird dem Dienst über ein Signal mitgeteilt, dass er seine Konfigurationsdateien neu einlesen soll. Oft wird dazu das Signal `SIGHUP` verwendet. Beachten Sie aber, dass nicht alle Dienste diese Option unterstützen.
+
+Die meisten Systemdienste werden beim Systemstart vom man:rc[8]-System gestartet. Zum Beispiel aktiviert das Skript [.filename]#/etc/rc.d/bgfsck# die Prüfung von Dateisystemen im Hintergrund. Das Skript gibt die folgende Meldung aus, wenn es gestartet wird:
+
+[source,bash]
+....
+Starting background file system checks in 60 seconds.
+....
+
+Dieses Skript wird während des Systemstarts ausgeführt und führt eine Überprüfung der Dateisysteme im Hintergrund durch.
+
+Viele Systemdienste hängen von anderen Diensten ab. man:yp[8] und andere RPC-basierende Systeme hängen beispielsweise von dem `rpcbind`-Dienst ab. Im Kopf der Startskripten befinden sich die Informationen über Abhängigkeiten von anderen Diensten und weitere Metadaten. Mithilfe dieser Daten bestimmt das Programm man:rcorder[8] beim Systemstart die Startreihenfolge der Dienste.
+
+Folgende Schlüsselwörter müssen im Kopf aller Startskripten verwendet werden, da sie von man:rc.subr[8] zum "Aktivieren" des Startskripts benötigt werden:
+
+* `PROVIDE`: Gibt die Namen der Dienste an, die mit dieser Datei zur Verfügung gestellt werden.
+
+Die folgenden Schlüsselwörter können im Kopf des Startskripts angegeben werden. Sie sind zwar nicht unbedingt notwendig, sind aber hilfreich beim Umgang mit man:rcorder[8]:
+
+* `REQUIRE`: Gibt die Namen der Dienste an, von denen dieser Dienst abhängt. Ein Skript, das dieses Schlüsselwort enthält wird _nach_ den angegebenen Diensten ausgeführt.
+* `BEFORE`: Zählt Dienste auf, die auf diesen Dienst angewiesen sind. Ein Skript, dass dieses Schlüsselwort enthält wird _vor_ den angegebenen Diensten ausgeführt.
+
+Durch das Verwenden dieser Schlüsselwörter kann ein Administrator die Startreihenfolge von Systemdiensten feingranuliert steuern, ohne mit den Schwierigkeiten des "runlevel"-Systems anderer UNIX(R) Systeme kämpfen zu müssen.
+
+Weitere Informationen über das man:rc[8]-System finden Sie in man:rc[8] und man:rc.subr[8]. Wenn Sie eigene [.filename]#rc.d#-Skripte schreiben wollen, sollten Sie link:{rc-scripting}[diesen Artikel] lesen.
+
+[[configtuning-core-configuration]]
+=== Systemspezifische Konfiguration
+
+Informationen zur Systemkonfiguration sind hauptsächlich in [.filename]#/etc/rc.conf#, die meist beim Start des Systems verwendet wird, abgelegt. Sie enthält die Konfigurationen für die [.filename]#rc*# Dateien.
+
+In [.filename]#rc.conf# werden die Vorgabewerte aus [.filename]#/etc/defaults/rc.conf# überschrieben. Die Vorgabedatei sollte nicht editiert werden. Stattdessen sollten alle systemspezifischen Änderungen in [.filename]#rc.conf# vorgenommen werden.
+
+Um den administrativen Aufwand gering zu halten, existieren in geclusterten Anwendungen mehrere Strategien, globale Konfigurationen von systemspezifischen Konfigurationen zu trennen. Der empfohlene Weg hält die globale Konfiguration in einer separaten Datei z.B. [.filename]#/etc/rc.conf.local#. Zum Beispiel so:
+
+* [.filename]#/etc/rc.conf#:
++
+[.programlisting]
+....
+sshd_enable="YES"
+keyrate="fast"
+defaultrouter="10.1.1.254"
+....
+
+* [.filename]#/etc/rc.conf.local#:
++
+[.programlisting]
+....
+hostname="node1.example.org"
+ifconfig_fxp0="inet 10.1.1.1/8"
+....
+
+[.filename]#/etc/rc.conf# kann dann auf jedes System mit rsync oder puppet verteilt werden, während [.filename]#/etc/rc.conf.local# dabei systemspezifisch bleibt.
+
+Bei einem Upgrade des Systems wird [.filename]#/etc/rc.conf# nicht überschrieben, so dass die Systemkonfiguration erhalten bleibt.
+
+[TIP]
+====
+
+[.filename]#/etc/rc.conf# und [.filename]#/etc/rc.conf.local# werden von man:sh[1] gelesen. Dies erlaubt es dem Systemadministrator, komplexe Konfigurationsszenarien zu erstellen. Lesen Sie man:rc.conf[5], um weitere Informationen zu diesem Thema zu erhalten.
+====
+
+[[config-network-setup]]
+== Einrichten von Netzwerkkarten
+
+Die Konfiguration einer Netzwerkkarte gehört zu den alltäglichen Aufgaben eines FreeBSD Administrators.
+
+=== Bestimmen des richtigen Treibers
+
+Ermitteln Sie zunächst das Modell der Netzwerkkarte und den darin verwendeten Chip. FreeBSD unterstützt eine Vielzahl von Netzwerkkarten. Prüfen Sie die Hardware-Kompatibilitätsliste für das FreeBSD Release, um zu sehen ob die Karte unterstützt wird.
+
+Wenn die Karte unterstützt wird, müssen Sie den Treiber für die Karte bestimmen. [.filename]#/usr/src/sys/conf/NOTES# und [.filename]#/usr/src/sys/arch/conf/NOTES# enthalten eine Liste der verfügbaren Treiber mit Informationen zu den unterstützten Chipsätzen. Wenn Sie sich nicht sicher sind, ob Sie den richtigen Treiber ausgewählt haben, lesen Sie die Hilfeseite des Treibers. Sie enthält weitere Informationen über die unterstützten Geräte und bekannte Einschränkungen des Treibers.
+
+Die Treiber für gebräuchliche Netzwerkkarten sind schon im [.filename]#GENERIC#-Kernel enthalten, so dass die Karte während des Systemstarts erkannt werden sollte. Die Systemmeldungen können Sie sich mit `more /var/run/dmesg.boot` ansehen. Mit der Leertaste können Sie durch den Text blättern. In diesem Beispiel findet das System zwei Karten, die den man:dc[4]-Treiber benutzen:
+
+[source,bash]
+....
+dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
+000ff irq 15 at device 11.0 on pci0
+miibus0: <MII bus> on dc0
+bmtphy0: <BCM5201 10/100baseTX PHY> PHY 1 on miibus0
+bmtphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
+dc0: Ethernet address: 00:a0:cc:da:da:da
+dc0: [ITHREAD]
+dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
+000ff irq 11 at device 12.0 on pci0
+miibus1: <MII bus> on dc1
+bmtphy1: <BCM5201 10/100baseTX PHY> PHY 1 on miibus1
+bmtphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
+dc1: Ethernet address: 00:a0:cc:da:da:db
+dc1: [ITHREAD]
+....
+
+Ist der Treiber für die Netzwerkkarte nicht in [.filename]#GENERIC# enthalten, muss zunächst ein Treiber geladen werden, um die Karte konfigurieren und benutzen zu können. Dafür gibt es zwei Methoden:
+
+* Am einfachsten ist es, das Kernelmodul für die Karte mit man:kldload[8] zu laden. Um den Treiber automatisch beim Systemstart zu laden, fügen Sie die entsprechende Zeile in [.filename]#/boot/loader.conf# ein. Es gibt nicht für alle Karten Kernelmodule.
+* Alternativ kann der Treiber für die Karte fest in den Kernel eingebunden werden. Lesen Sie dazu [.filename]#/usr/src/sys/conf/NOTES#, [.filename]#/usr/src/sys/arch/conf/NOTES# und die Hilfeseite des Treibers, den Sie in den Kernel einbinden möchten, an. Die Übersetzung des Kernels wird in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] beschrieben. Wenn die Karte während des Systemstarts vom Kernel erkannt wurde, muss der Kernel nicht neu übersetzt werden.
+
+[[config-network-ndis]]
+==== Windows(R)-NDIS-Treiber einsetzen
+
+Leider stellen nach wie vor viele Unternehmen die Spezifikationen ihrer Treiber der Open Source Gemeinde nicht zur Verfügung, weil sie diese Informationen als Geschäftsgeheimnisse betrachten. Daher haben die Entwickler von FreeBSD und anderen Betriebssystemen nur zwei Möglichkeiten. Entweder versuchen sie in einem aufwändigen Prozess den Treiber durch Reverse Engineering nachzubauen, oder sie versuchen, die vorhandenen Binärtreiber der Microsoft(R) Windows(R)-Plattform zu verwenden.
+
+FreeBSD bietet "native" Unterstützung für die Network Driver Interface Specification (NDIS). man:ndisgen[8] wird benutzt, um einen Windows(R) XP-Treiber in ein Format zu konvertieren, das von FreeBSD verwendet werden kann. Da der man:ndis[4]-Treiber einen Windows(R) XP-Binärtreiber nutzt, kann er nur auf i386(TM)- und amd64-Systemen verwendet werden. Unterstützt werden PCI, CardBus, PCMCIA und USB-Geräte.
+
+Um den NDISulator zu verwenden, benötigen Sie drei Dinge:
+
+. Die FreeBSD Kernelquellen
+. Den Windows(R) XP-Binärtreiber mit der Erweiterung [.filename]#.SYS#
+. Die Konfigurationsdatei des Windows(R) XP-Treibers mit der Erweiterung [.filename]#.INF#
+
+Laden Sie die [.filename]#.SYS#- und [.filename]#.INF#-Dateien für die Karte. Diese befinden sich meistens auf einer beigelegten CD-ROM, oder können von der Internetseite des Herstellers heruntergeladen werden. In den folgenden Beispielen werden die Dateien [.filename]#W32DRIVER.SYS# und [.filename]#W32DRIVER.INF# verwendet.
+
+Die Architektur des Treibers muss zur jeweiligen Version von FreeBSD passen. Benutzen Sie einen Windows(R) 32-bit Treiber für FreeBSD/i386. Für FreeBSD/amd64 wird ein Windows(R) 64-bit Treiber benötigt.
+
+Als Nächstes kompilieren Sie den binären Treiber, um ein Kernelmodul zu erzeugen. Dazu rufen Sie als `root` man:ndisgen[8] auf:
+
+[source,bash]
+....
+# ndisgen /path/to/W32DRIVER.INF /path/to/W32DRIVER.SYS
+....
+
+Dieses Kommando arbeitet interaktiv, benötigt es weitere Informationen, so fragt es Sie danach. Das Ergebnis ist ein neu erzeugtes Kernelmodul im aktuellen Verzeichnis. Benutzen Sie man:kldload[8] um das neue Modul zu laden:
+
+[source,bash]
+....
+# kldload ./W32DRIVER.ko
+....
+
+Neben dem erzeugten Kernelmodul müssen auch die Kernelmodule [.filename]#ndis.ko# und [.filename]#if_ndis.ko# geladen werden. Dies passiert automatisch, wenn Sie ein von man:ndis[4] abhängiges Modul laden. Andernfalls können die Module mit den folgenden Kommandos manuell geladen werden:
+
+[source,bash]
+....
+# kldload ndis
+# kldload if_ndis
+....
+
+Der erste Befehl lädt den man:ndis[4]-Miniport-Treiber, der zweite das tatsächliche Netzwerkgerät.
+
+Überprüfen Sie die Ausgabe von man:dmesg[8] auf eventuelle Fehler während des Ladevorgangs. Gab es dabei keine Probleme, sollte die Ausgabe wie folgt aussehen:
+
+[source,bash]
+....
+ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
+ndis0: NDIS API version: 5.0
+ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
+ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
+ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps
+....
+
+Ab jetzt kann das Gerät [.filename]#ndis0# wie jede andere Netzwerkkarte konfiguriert werden.
+
+Um die man:ndis[4]-Module automatisch beim Systemstart zu laden, kopieren Sie das erzeugte Modul [.filename]#W32DRIVER_SYS.ko# nach [.filename]#/boot/modules#. Danach fügen Sie die folgende Zeile in [.filename]#/boot/loader.conf# ein:
+
+[.programlisting]
+....
+W32DRIVER_SYS_load="YES"
+....
+
+=== Konfiguration von Netzwerkkarten
+
+Nachdem der richtige Treiber für die Karte geladen ist, muss die Karte konfiguriert werden. Unter Umständen ist die Karte schon während der Installation mit man:bsdinstall[8] konfiguriert worden.
+
+Das nachstehende Kommando zeigt die Konfiguration der Netzwerkkarten an:
+
+[source,bash]
+....
+% ifconfig
+dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ options=80008<VLAN_MTU,LINKSTATE>
+ ether 00:a0:cc:da:da:da
+ inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
+ media: Ethernet autoselect (100baseTX <full-duplex>)
+ status: active
+dc1: flags=8802<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ options=80008<VLAN_MTU,LINKSTATE>
+ ether 00:a0:cc:da:da:db
+ inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
+ media: Ethernet 10baseT/UTP
+ status: no carrier
+lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
+ options=3<RXCSUM,TXCSUM>
+ inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
+ inet6 ::1 prefixlen 128
+ inet 127.0.0.1 netmask 0xff000000
+ nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
+....
+
+Im Beispiel werden Informationen zu den folgenden Geräten angezeigt:
+
+* [.filename]#dc0#: Der erste Ethernet-Adapter.
+* [.filename]#dc1#: Der zweite Ethernet-Adapter.
+* [.filename]#lo0#: Das Loopback-Gerät.
+
+Der Name der Netzwerkkarte wird aus dem Namen des Treibers und einer Zahl zusammengesetzt. Die Zahl gibt die Reihenfolge an, in der die Geräte beim Systemstart erkannt wurden. Die dritte Karte, die den man:sis[4] Treiber benutzt, würde beispielsweise [.filename]#sis2# heißen.
+
+Der Adapter [.filename]#dc0# aus dem Beispiel ist aktiv. Sie erkennen das an den folgenden Hinweisen:
+
+. `UP` bedeutet, dass die Karte konfiguriert und aktiv ist.
+. Der Karte wurde die Internet-Adresse (`inet`) `192.168.1.3` zugewiesen.
+. Die Subnetzmaske ist richtig (`0xffffff00` entspricht `255.255.255.0`).
+. Die Broadcast-Adresse `192.168.1.255` ist richtig.
+. Die MAC-Adresse der Karte (`ether`) lautet `00:a0:cc:da:da:da`.
+. Die automatische Medienerkennung ist aktiviert (`media: Ethernet autoselect (100baseTX <full-duplex>)`). Der Adapter [.filename]#dc1# benutzt das Medium `10baseT/UTP`. Weitere Informationen über die einstellbaren Medien entnehmen Sie der Hilfeseite des Treibers.
+. Der Verbindungsstatus (`status`) ist `active`, das heißt es wurde ein Trägersignal entdeckt. Für [.filename]#dc1# wird `status: no carrier` angezeigt. Das ist normal, wenn kein Kabel an der Karte angeschlossen ist.
+
+Wäre die Karte nicht konfiguriert, würde die Ausgabe von man:ifconfig[8] so aussehen:
+
+[source,bash]
+....
+dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
+ options=80008<VLAN_MTU,LINKSTATE>
+ ether 00:a0:cc:da:da:da
+ media: Ethernet autoselect (100baseTX <full-duplex>)
+ status: active
+....
+
+Die Karte muss als Benutzer `root` konfiguriert werden. Die Konfiguration kann auf der Kommandozeile mit man:ifconfig[8] erfolgen. Allerdings gehen diese Informationen bei einem Neustart verloren. Tragen Sie stattdessen die Konfiguration in [.filename]#/etc/rc.conf# ein. Wenn es im LAN einen DHCP-Server gibt, fügen Sie einfach folgende Zeile hinzu:
+
+[.programlisting]
+....
+ifconfig_dc0="DHCP"
+....
+
+Ersetzen Sie _>dc0_ durch die richtigen Werte für das System.
+
+Nachdem Sie die Zeile hinzugefügt haben, folgen Sie den Anweisungen in <<config-network-testing>>.
+
+[NOTE]
+====
+Wenn das Netzwerk während der Installation konfiguriert wurde, existieren vielleicht schon Einträge für die Netzwerkkarte(n). Überprüfen Sie [.filename]#/etc/rc.conf# bevor Sie weitere Zeilen hinzufügen.
+====
+
+Falls kein DHCP-Server zur Verfügung steht, müssen die Netzwerkkarten manuell konfiguriert werden. Fügen Sie für jede Karte im System eine Zeile hinzu, wie in diesem Beispiel zu sehen:
+
+[.programlisting]
+....
+ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
+ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"
+....
+
+Ersetzen Sie [.filename]#dc0# und [.filename]#dc1# und die IP-Adressen durch die richtigen Werte für das System. Die Manualpages des Treibers, man:ifconfig[8] und man:rc.conf[5] enthalten weitere Einzelheiten über verfügbare Optionen und die Syntax von [.filename]#/etc/rc.conf#.
+
+Wenn das Netzwerk kein DNS benutzt, können Sie in [.filename]#/etc/hosts# die Namen und IP-Adressen der Rechner des LANs eintragen. Weitere Informationen entnehmen Sie man:hosts[5] und [.filename]#/usr/shared/examples/etc/hosts#.
+
+[NOTE]
+====
+Falls kein DHCP-Server zur Verfügung steht, Sie aber Zugang zum Internet benötigen, müssen Sie das Standard-Gateway und die Nameserver manuell konfigurieren:
+
+[source,bash]
+....
+# echo 'defaultrouter="Ihr_Default_Gateway"' >> /etc/rc.conf
+# echo 'nameserver Ihr_DNS_Server' >> /etc/resolv.conf
+....
+
+====
+
+[[config-network-testing]]
+=== Test und Fehlersuche
+
+Nachdem die notwendigen Änderungen in [.filename]#/etc/rc.conf# gespeichert wurden, kann das System neu gestartet werden, um die Konfiguration zu testen und zu überprüfen, ob das System ohne Fehler neu gestartet wurde. Alternativ können Sie mit folgenden Befehl die Netzwerkeinstellungen neu initialisieren:
+
+[source,bash]
+....
+# service netif restart
+....
+
+[NOTE]
+====
+Falls in [.filename]#/etc/rc.conf# ein Default-Gateway definiert wurde, müssen Sie auch den folgenden Befehl ausführen:
+
+[source,bash]
+....
+# service routing restart
+....
+
+====
+
+Wenn das System gestartet ist, sollten Sie die Netzwerkkarten testen.
+
+==== Test der Ethernet-Karte
+
+Um zu prüfen, ob die Ethernet-Karte richtig konfiguriert ist, testen Sie zunächst mit man:ping[8] den Adapter selbst und sprechen Sie dann eine andere Maschine im LAN an.
+
+Zuerst, der Test des Adapters:
+
+[source,bash]
+....
+% ping -c5 192.168.1.3
+PING 192.168.1.3 (192.168.1.3): 56 data bytes
+64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
+64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
+64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
+64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
+64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms
+
+--- 192.168.1.3 ping statistics ---
+5 packets transmitted, 5 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms
+....
+
+[source,bash]
+....
+% ping -c5 192.168.1.2
+PING 192.168.1.2 (192.168.1.2): 56 data bytes
+64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
+64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
+64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
+64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
+64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms
+
+--- 192.168.1.2 ping statistics ---
+5 packets transmitted, 5 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms
+....
+
+Um die Namensauflösung zu testen, verwenden Sie den Namen der Maschine anstelle der IP-Adresse. Wenn kein DNS-Server im Netzwerk vorhanden ist, muss [.filename]#/etc/hosts# entsprechend eingerichtet sein. Fügen Sie dazu die Namen und IP-Adressen der Rechner im LAN in [.filename]#/etc/hosts# hinzu, falls sie nicht bereits vorhanden sind. Weitere Informationen finden Sie in man:hosts[5] und [.filename]#/usr/shared/examples/etc/hosts#.
+
+==== Fehlersuche
+
+Fehler zu beheben, ist immer sehr mühsam. Indem Sie die einfachen Sachen zuerst prüfen, erleichtern Sie sich die Aufgabe. Steckt das Netzwerkkabel? Sind die Netzwerkdienste richtig konfiguriert? Funktioniert die Firewall? Wird die Netzwerkkarte von FreeBSD unterstützt? Lesen Sie immer die Hardware-Informationen des Releases, bevor Sie einen Fehlerbericht einsenden. Aktualisieren Sie die FreeBSD-Version auf die neueste -STABLE Version. Suchen Sie in den Archiven der Mailinglisten und im Internet nach bekannten Lösungen.
+
+Wenn die Karte funktioniert, die Verbindungen aber zu langsam sind, sollten Sie man:tuning[7] lesen. Prüfen Sie auch die Netzwerkkonfiguration, da falsche Einstellungen die Ursache für langsame Verbindungen sein können.
+
+Wenn Sie viele `device timeout` Meldungen in den Systemprotokollen finden, prüfen Sie, dass es keinen Konflikt zwischen der Netzwerkkarte und anderen Geräten des Systems gibt. Überprüfen Sie nochmals die Verkabelung. Unter Umständen benötigen Sie eine andere Netzwerkkarte.
+
+Bei `watchdog timeout` Fehlermeldungen, kontrollieren Sie zuerst die Verkabelung. Überprüfen Sie dann, ob der PCI-Steckplatz der Karte Bus Mastering unterstützt. Auf einigen älteren Motherboards ist das nur für einen Steckplatz (meistens Steckplatz 0) der Fall. Lesen Sie in der Dokumentation der Karte und des Motherboards nach, ob das vielleicht die Ursache des Problems sein könnte.
+
+Die Meldung `No route to host` erscheint, wenn das System ein Paket nicht zustellen kann. Das kann vorkommen weil beispielsweise keine Default-Route gesetzt wurde oder das Netzwerkkabel nicht richtig steckt. Schauen Sie in der Ausgabe von `netstat -rn` nach, ob eine gültige Route zu dem Zielsystem existiert. Wenn nicht, lesen Sie crossref:advanced-networking[network-routing,“Gateways und Routen”].
+
+Die Meldung `ping: sendto: Permission denied` wird oft von einer falsch konfigurierten Firewall verursacht. Wenn keine Regeln definiert wurden, blockiert eine aktivierte Firewall alle Pakete, selbst einfache man:ping[8]-Pakete. Weitere Informationen erhalten Sie in crossref:firewalls[firewalls,Firewalls].
+
+Falls die Leistung der Karte schlecht ist, setzen Sie die Medienerkennung von `autoselect` (automatisch) auf das richtige Medium. In vielen Fällen löst diese Maßnahme Leistungsprobleme. Wenn nicht, prüfen Sie nochmal die Netzwerkeinstellungen und lesen Sie man:tuning[7].
+
+[[configtuning-virtual-hosts]]
+== Virtual Hosts
+
+Ein gebräuchlicher Zweck von FreeBSD ist das virtuelle Hosting, bei dem ein Server im Netzwerk wie mehrere Server aussieht. Dies wird dadurch erreicht, dass einem Netzwerkinterface mehrere Netzwerk-Adressen zugewiesen werden.
+
+Ein Netzwerkinterface hat eine "echte" Adresse und kann beliebig viele "alias" Adressen haben. Die Aliase werden durch entsprechende alias Einträge in [.filename]#/etc/rc.conf# festgelegt, wie in diesem Beispiel zu sehen ist:
+
+[.programlisting]
+....
+ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"
+....
+
+Beachten Sie, dass die Alias-Einträge mit `alias_0_` anfangen müssen und weiter hochgezählt werden, das heißt `alias1`, `alias2`, und so weiter. Die Konfiguration der Aliase hört bei der ersten fehlenden Zahl auf.
+
+Die Berechnung der Alias-Netzwerkmasken ist wichtig. Für jedes Interface muss es eine Adresse geben, die die Netzwerkmaske des Netzwerkes richtig beschreibt. Alle anderen Adressen in diesem Netzwerk haben dann eine Netzwerkmaske, die mit `1` gefüllt ist, also `255.255.255.255` oder hexadezimal `0xffffffff`.
+
+Als Beispiel betrachten wir den Fall, in dem [.filename]#fxp0# mit zwei Netzwerken verbunden ist: dem Netzwerk `10.1.1.0` mit der Netzwerkmaske `255.255.255.0` und dem Netzwerk `202.0.75.16` mit der Netzwerkmaske `255.255.255.240`. Das System soll die Adressen `10.1.1.1` bis `10.1.1.5` und `202.0.75.17` bis `202.0.75.20` belegen. Nur die erste Adresse in einem Netzwerk sollte die richtige Netzwerkmaske haben. Alle anderen Adressen (`10.1.1.2` bis `10.1.1.5` und `202.0.75.18` bis `202.0.75.20`) müssen die Maske `255.255.255.255` erhalten.
+
+Die folgenden Einträge in [.filename]#/etc/rc.conf# konfigurieren den Adapter entsprechend dem Beispiel:
+
+[.programlisting]
+....
+ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
+ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
+ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
+ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
+ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
+ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
+ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
+ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
+ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"
+....
+
+Dies kann mit einer durch Leerzeichen getrennten Liste von IP-Adressbereichen auch einfacher ausgedrückt werden. Die erste Adresse hat wieder die angegebene Netzwerkmaske und die zusätzlichen Adressen haben die Netzwerkmaske `255.255.255.255`.
+
+[.programlisting]
+....
+ifconfig_fxp0_aliases="inet 10.1.1.1-5/24 inet 202.0.75.17-20/28"
+....
+
+[[configtuning-syslog]]
+== Konfiguration der Systemprotokollierung
+
+Die Aufzeichnung und Kontrolle von Log-Meldungen ist ein wichtiger Aspekt der Systemadministration. Die Informationen werden nicht nur verwendet um Hard- und Softwarefehler ausfindig zu machen, auch zur Überwachung der Sicherheit und der Reaktion bei einem Zwischenfall spielen diese Aufzeichnungen eine wichtige Rolle. Die meisten Systemdienste und Anwendungen erzeugen Log-Meldungen.
+
+FreeBSD stellt mit syslogd ein Werkzeug zur Verwaltung von Protokollen bereit. In der Voreinstellung wird syslogd beim Booten automatisch gestartet. Dieses Verhalten wird über die Variable `syslogd_enable` in [.filename]#/etc/rc.conf# gesteuert. Dazu gibt es noch zahlreiche Argumente, die in der Variable `syslogd_flags` in [.filename]#/etc/rc.conf# gesetzt werden können. Lesen Sie man:syslogd[8] für weitere Informationen über die verfügbaren Argumente.
+
+Dieser Abschnitt beschreibt die Konfiguration und Verwendung des FreeBSD Protokollservers, und diskutiert auch die Log-Rotation und das Management von Logdateien.
+
+=== Konfiguration der lokalen Protokollierung
+
+Die Konfigurationsdatei [.filename]#/etc/syslog.conf# steuert, was syslogd mit Log-Meldungen macht, sobald sie empfangen werden. Es gibt verschiedene Parameter, die das Verhalten bei eingehenden Ereignissen kontrollieren. facility beschreibt das Subsystem, welches das Ereignis generiert hat. Beispielsweise der Kernel, oder ein Daemon. level hingegen beschreibt den Schweregrad des aufgetretenen Ereignisses. Dies macht es möglich, Meldungen in verschiedenen Logdateien zu protokollieren, oder Meldungen zu verwerfen, je nach Konfiguration von facility und level. Ebenfalls besteht die Möglichkeit auf Meldungen zu reagieren, die von einer bestimmten Anwendung stammen, oder von einem spezifischen Host erzeugt wurden.
+
+Die Konfigurationsdatei von man:syslogd[8] enthält für jede Aktion eine Zeile. Die Syntax besteht aus einem Auswahlfeld, gefolgt von einem Aktionsfeld. Die Syntax für das Auswahlfeld ist _facility.level_. Dies entspricht Log-Meldungen von _facility_ mit einem Level von _level_ oder höher. Um noch präziser festzulegen was protokolliert wird, kann dem Level optional ein Vergleichsflag vorangestellt werden. Mehrere Auswahlen können, durch Semikolon (`;`) getrennt, für die gleiche Aktion verwendet werden. `*` wählt dabei alles aus. Das Aktionsfeld definiert, wohin die Log-Meldungen gesendet werden, beispielsweise in eine Datei oder zu einem entfernten Log-Server. Als Beispiel dient hier [.filename]#/etc/syslog.conf# aus FreeBSD:
+
+[.programlisting]
+....
+# $FreeBSD$
+#
+# Spaces ARE valid field separators in this file. However,
+# other *nix-like systems still insist on using tabs as field
+# separators. If you are sharing this file between systems, you$
+# may want to use only tabs as field separators here.
+# Consult the syslog.conf(5) manpage.
+*.err;kern.warning;auth.notice;mail.crit /dev/console
+*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
+security.* /var/log/security
+auth.info;authpriv.info /var/log/auth.log
+mail.info /var/log/maillog
+lpr.info /var/log/lpd-errs
+ftp.info /var/log/xferlog
+cron.* /var/log/cron
+!-devd
+*.=debug /var/log/debug.log
+*.emerg *
+# uncomment this to log all writes to /dev/console to /var/log/console.log
+#console.info /var/log/console.log
+# uncomment this to enable logging of all log messages to /var/log/all.log
+# touch /var/log/all.log and chmod it to mode 600 before it will work
+#*.* /var/log/all.log
+# uncomment this to enable logging to a remote loghost named loghost
+#*.* @loghost
+# uncomment these if you're running inn
+# news.crit /var/log/news/news.crit
+# news.err /var/log/news/news.err
+# news.notice /var/log/news/news.notice
+# Uncomment this if you wish to see messages produced by devd
+# !devd
+# *.>=info
+!ppp
+*.* /var/log/ppp.log
+!*
+....
+
+In diesem Beispiel:
+
+* Zeile 8 selektiert alle Meldungen vom Level `err`, sowie `kern.warning`, `auth.notice` und `mail.crit` und schickt diese zur Konsole ([.filename]#/dev/console#).
+* Zeile 12 selektiert alle Meldungen von `mail` ab dem Level `info` oder höher und schreibt diese in [.filename]#/var/log/maillog#.
+* Zeile 17 benutzt ein Vergleichsflag (`=`), um nur Meldungen vom Level `debug` zu selektieren und schreibt diese in [.filename]#/var/log/debug.log#.
+* Zeile 33 zeigt ein Beispiel für die Nutzung einer Programmspezifikation. Die nachfolgenden Regeln sind dann nur für Programme gültig, welche der Programmspezifikation stehen. In diesem Fall werden alle Meldungen von ppp (und keinem anderen Programm) in [.filename]#/var/log/ppp.log# geschrieben.
+
+Die verfügbaren level, beginnend mit den höchst kritischen, hin zu den weniger kritischen, sind: `emerg`, `alert`, `crit`, `err`, `warning`, `notice`, `info` und `debug`.
+
+Die facilities, in beliebiger Reihenfolge, sind: `auth`, `authpriv`, `console`, `cron`, `daemon`, `ftp`, `kern`, `lpr`, `mail`, `mark`, `news`, `security`, `syslog`, `user`, `uucp`, sowie `local0` bis `local7`. Beachten Sie, dass andere Betriebssysteme hiervon abweichende facilities haben können.
+
+Um alle Meldungen vom Level `notice` und höher in [.filename]#/var/log/daemon.log# zu protokollieren, fügen Sie folgenden Eintrag hinzu:
+
+[.programlisting]
+....
+daemon.notice /var/log/daemon.log
+....
+
+Für weitere Informationen zu verschiedenen Level und faclilities, lesen Sie man:syslog[3] und man:syslogd[8]. Weitere Informationen zu [.filename]#/etc/syslog.conf#, dessen Syntax und erweiterten Anwendungsbeispielen, finden Sie in man:syslog.conf[5].
+
+=== Management und Rotation von Logdateien
+
+Logdateien können schnell wachsen und viel Speicherplatz belegen, was es schwieriger macht, nützliche Informationen zu finden. Log-Management versucht, diesen Effekt zu mildern. FreeBSD verwendet newsyslog für die Verwaltung von Logdateien. Dieses in FreeBSD integrierte Programm rotiert und komprimiert in regelmäßigen Abständen Logdateien. Optional kann es auch fehlende Logdateien erstellen und Programme benachrichtigen, wenn Logdateien verschoben wurden. Die Logdateien können von syslogd oder einem anderen Programm generiert werden. Obwohl newsyslog normalerweise von man:cron[8] aufgerufen wird, ist es kein Systemdämon. In der Standardkonfiguration wird dieser Job jede Stunde ausgeführt.
+
+Um zu wissen, welche Maßnahmen zu ergreifen sind, liest newsyslog seine Konfigurationsdatei [.filename]#/etc/newsyslog.conf#. Diese Konfigurationsdatei enthält eine Zeile für jede Datei, die von newsyslog verwaltet wird. Jede Zeile enthält Informationen über den Besitzer der Datei, die Dateiberechtigungen, wann die Datei rotiert wird, optionale Flags, welche die Log-Rotation beeinflussen (bspw. Komprimierung) und Programme, denen ein Signal geschickt wird, wenn Logdateien rotiert werden. Hier folgt die Standardkonfiguration in FreeBSD:
+
+[.programlisting]
+....
+# configuration file for newsyslog
+# $FreeBSD$
+#
+# Entries which do not specify the '/pid_file' field will cause the
+# syslogd process to be signalled when that log file is rotated. This
+# action is only appropriate for log files which are written to by the
+# syslogd process (ie, files listed in /etc/syslog.conf). If there
+# is no process which needs to be signalled when a given log file is
+# rotated, then the entry for that file should include the 'N' flag.
+#
+# The 'flags' field is one or more of the letters: BCDGJNUXZ or a '-'.
+#
+# Note: some sites will want to select more restrictive protections than the
+# defaults. In particular, it may be desirable to switch many of the 644
+# entries to 640 or 600. For example, some sites will consider the
+# contents of maillog, messages, and lpd-errs to be confidential. In the
+# future, these defaults may change to more conservative ones.
+#
+# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
+/var/log/all.log 600 7 * @T00 J
+/var/log/amd.log 644 7 100 * J
+/var/log/auth.log 600 7 100 @0101T JC
+/var/log/console.log 600 5 100 * J
+/var/log/cron 600 3 100 * JC
+/var/log/daily.log 640 7 * @T00 JN
+/var/log/debug.log 600 7 100 * JC
+/var/log/kerberos.log 600 7 100 * J
+/var/log/lpd-errs 644 7 100 * JC
+/var/log/maillog 640 7 * @T00 JC
+/var/log/messages 644 5 100 @0101T JC
+/var/log/monthly.log 640 12 * $M1D0 JN
+/var/log/pflog 600 3 100 * JB /var/run/pflogd.pid
+/var/log/ppp.log root:network 640 3 100 * JC
+/var/log/devd.log 644 3 100 * JC
+/var/log/security 600 10 100 * JC
+/var/log/sendmail.st 640 10 * 168 B
+/var/log/utx.log 644 3 * @01T05 B
+/var/log/weekly.log 640 5 1 $W6D0 JN
+/var/log/xferlog 600 7 100 * JC
+....
+
+Jede Zeile beginnt mit dem Namen der Protokolldatei, die rotiert werden soll, optional gefolgt von Besitzer und Gruppe für rotierende, als auch für neu erstellte Dateien. Das Feld `mode` definiert die Zugriffsrechte der Datei. `count` gibt an, wie viele rotierte Dateien aufbewahrt werden sollen. Anhand der `size`- und `when`-Flags erkennt newsyslog, wann die Datei rotiert werden muss. Eine Logdatei wird rotiert, wenn ihre Größe den Wert von `size` überschreitet, oder wenn die Zeit im `when`-Feld abgelaufen ist. Ein `*` bedeutet, dass dieses Feld ignoriert wird. Das _flags_-Feld gibt newsyslog weitere Instruktionen, zum Beispiel wie eine Datei zu rotieren ist, oder eine Datei zu erstellen falls diese nicht existiert. Die letzten beiden Felder sind optional und bestimmen die PID-Datei und wann die Datei rotiert wird.
+
+Weitere Informationen zu allen Feldern, gültigen Flags und wie Sie die Rotationszeit angeben können, finden Sie in man:newsyslog.conf[5]. Denken Sie daran, dass newsyslog von man:cron[8] aufgerufen wird und somit Dateien auch nur dann rotiert, wenn es von man:cron[8] aufgerufen wird, und nicht häufiger.
+
+[[network-syslogd]]
+=== Protokollierung von anderen Hosts
+
+Die Überwachung der Protokolldateien kann bei steigender Anzahl von Rechnern sehr unhandlich werden. Eine zentrale Protokollierung kann manche administrativen Belastungen bei der Verwaltung von Protokolldateien reduzieren.
+
+Die Aggregation, Zusammenführung und Rotation von Protokolldateien kann in FreeBSD mit syslogd und newsyslog konfiguriert werden. In der folgenden Beispielkonfiguration sammelt Host `A`, genannt `logserv.example.com`, Protokollinformationen für das lokale Netzwerk. Host `B`, genannt `logclient.example.com` wird seine Protokollinformationen an den Server weiterleiten.
+
+==== Konfiguration des Protokollservers
+
+Ein Protokollserver ist ein System, welches Protokollinformationen von anderen Hosts akzeptiert. Bevor Sie diesen Server konfigurieren, prüfen Sie folgendes:
+
+* Falls eine Firewall zwischen dem Protokollserver und den -Clients steht, muss das Regelwerk der Firewall UDP auf Port 514 sowohl auf Client- als auch auf Serverseite freigegeben werden.
+* Der `syslogd`-Server und alle Clientrechner müssen gültige Einträge für sowohl Vorwärts- als auch Umkehr-DNS besitzen. Falls im Netzwerk kein DNS-Server vorhanden ist, muss auf jedem System die Datei [.filename]#/etc/hosts# mit den richtigen Einträgen gepflegt werden. Eine funktionierende Namensauflösung ist zwingend erforderlich, ansonsten würde der Server die Protokollnachrichten ablehnen.
+
+Bearbeiten Sie [.filename]#/etc/syslog.conf# auf dem Server. Tragen Sie den Namen des Clients ein, den Verbindungsweg und den Namen der Protokolldatei. Dieses Beispiel verwendet den Rechnernamen `B`, alle Verbindungswege, und die Protokolle werden in [.filename]#/var/log/logclient.log# gespeichert.
+
+.Einfache Server Konfiguration
+[example]
+====
+[.programlisting]
+....
++logclient.example.com
+*.* /var/log/logclient.log
+....
+
+====
+
+Fügen Sie für jeden Client zwei Zeilen hinzu, falls Sie mehrere Clients in diese Datei aufnehmen. Weitere Informationen über die verfügbaren Verbindungswege finden Sie in man:syslog.conf[5].
+
+Konfigurieren Sie als nächstes [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+syslogd_enable="YES"
+syslogd_flags="-a logclient.example.com -v -v"
+....
+
+Der erste Eintrag startet `syslogd` während des Bootens. Der zweite Eintrag erlaubt es, Daten von dem spezifizierten Client auf diesem Server zu akzeptieren. Die Verwendung von `-v -v` erhöht die Anzahl von Protokollnachrichten. Dies ist hilfreich für die Feineinstellung der Verbindungswege, da Administratoren auf diese Weise erkennen, welche Arten von Nachrichten von welchen Verbindungswegen protokolliert werden.
+
+Mehrere `-a`-Optionen können angegeben werden, um die Protokollierung von mehreren Clients zu erlauben. IP-Adressen und ganze Netzblöcke können ebenfalls spezifiziert werden. Eine vollständige Liste der Optionen finden Sie in man:syslogd[8].
+
+Zum Schluss muss die Protokolldatei erstellt werden:
+
+[source,bash]
+....
+# touch /var/log/logclient.log
+....
+
+Zu diesem Zeitpunkt sollte `syslogd` neu gestartet und überprüft werden:
+
+[source,bash]
+....
+# service syslogd restart
+# pgrep syslog
+....
+
+Wenn eine PID zurückgegeben wird, wurde der Server erfolgreich neu gestartet und die Clientkonfiguration kann beginnen. Wenn der Server nicht neu gestartet wurde, suchen Sie in [.filename]#/var/log/messages# nach dem Fehler.
+
+==== Konfiguration des Protokollclients
+
+Ein Protokollclient sendet Protokollinformationen an einen Protokollserver. Zusätzlich behält er eine lokale Kopie seiner eigenen Protokolle.
+
+Sobald der Server konfiguriert ist, bearbeiten Sie [.filename]#/etc/rc.conf# auf dem Client:
+
+[.programlisting]
+....
+syslogd_enable="YES"
+syslogd_flags="-s -v -v"
+....
+
+Der erste Eintrag aktiviert den `syslogd`-Dienst während des Systemstarts. Der zweite Eintrag erhöht die Anzahl der Protokollnachrichten. Die Option `-s` verhindert, dass dieser Client Protokolle von anderen Hosts akzeptiert.
+
+Als nächstes muss der Protokollserver in der [.filename]#/etc/syslog.conf# des Clients eingetragen werden. In diesem Beispiel wird das `@`-Symbol benutzt, um sämtliche Protokolldaten an einen bestimmten Server zu senden:
+
+[.programlisting]
+....
+*.* @logserv.example.com
+....
+
+Nachdem die Änderungs gespeichert wurden, muss `syslogd` neu gestartet werden, damit die Änderungen wirksam werden:
+
+[source,bash]
+....
+# service syslogd restart
+....
+
+Um zu testen, ob Protokollnachrichten über das Netzwerk gesendet werden, kann man:logger[1] auf dem Client benutzt werden, um eine Nachricht an syslogd zu schicken:
+
+[source,bash]
+....
+# logger "Test message from logclient"
+....
+
+Diese Nachricht sollte jetzt sowohl in [.filename]#/var/log/messages# auf dem Client, als auch in [.filename]#/var/log/logclient.log# auf dem Server vorhanden sein.
+
+==== Fehlerbehebung beim Protokollserver
+
+Wenn der Server keine Nachrichten empfängt, ist die Ursache wahrscheinlich ein Netzwerkproblem, ein Problem bei der Namensauflösung oder ein Tippfehler in einer Konfigurationsdatei. Um die Ursache zu isolieren, müssen Sie sicherstellen, dass sich Server und Client über den in [.filename]#/etc/rc.conf# konfigurierten Hostnamen mit `ping` erreichen lässt. Falls dies nicht gelingt sollten Sie die Netzwerkverkabelung überprüfen, außerdem Firewallregeln sowie die Einträge für Hosts im DNS und [.filename]#/etc/hosts#. Überprüfen Sie diese Dinge auf dem Server und dem Client, bis der `ping` von beiden Hosts erfolgreich ist.
+
+Wenn sich die Hosts gegenseitig mit `ping` erreichen können, der Server aber immer noch keine Nachrichten empfängt, können Sie vorübergehend die Ausführlichkeit der Protokollierung erhöhen, um die Ursache für das Problem weiter einzugrenzen. In dem folgenden Beispiel ist auf dem Server die Datei [.filename]#/var/log/logclient.log# leer und in der Datei [.filename]#/var/log/messages# auf dem Client ist keine Ursache für das Problem erkennbar. Um nun die Ausführlichkeit der Protokollierung zu erhöhen, passen Sie auf dem Server den Eintrag `syslogd_flags` an. Anschließend starten Sie den Dienst neu:
+
+[.programlisting]
+....
+syslogd_flags="-d -a logclient.example.com -v -v"
+....
+
+[source,bash]
+....
+# service syslogd restart
+....
+
+Informationen wie diese werden sofort nach dem Neustart auf der Konsole erscheinen:
+
+[source,bash]
+....
+logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
+syslogd: restarted
+logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
+Logging to FILE /var/log/messages
+syslogd: kernel boot file is /boot/kernel/kernel
+cvthname(192.168.1.10)
+validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
+rejected in rule 0 due to name mismatch.
+....
+
+In diesem Beispiel werden die Nachrichten aufgrund eines fehlerhaften Namens abgewiesen. Der Hostname sollte `logclient` und nicht `logclien` sein. Beheben Sie den Tippfehler, starten Sie den Dienst neu und überprüfen Sie das Ergebnis:
+
+[source,bash]
+....
+# service syslogd restart
+logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
+syslogd: restarted
+logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
+syslogd: kernel boot file is /boot/kernel/kernel
+logmsg: pri 166, flags 17, from logserv.example.com,
+msg Dec 10 20:55:02 <syslog.err> logserv.example.com syslogd: exiting on signal 2
+cvthname(192.168.1.10)
+validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
+accepted in rule 0.
+logmsg: pri 15, flags 0, from logclient.example.com, msg Dec 11 02:01:28 trhodes: Test message 2
+Logging to FILE /var/log/logclient.log
+Logging to FILE /var/log/messages
+....
+
+Zu diesem Zeitpunkt werden die Nachrichten korrekt empfangen und in die richtige Datei geschrieben.
+
+==== Sicherheitsbedenken
+
+Wie mit jedem Netzwerkdienst, müssen Sicherheitsanforderungen in Betracht gezogen werden, bevor ein Protokollserver eingesetzt wird. Manchmal enthalten Protokolldateien sensitive Daten über aktivierte Dienste auf dem lokalen Rechner, Benutzerkonten und Konfigurationsdaten. Daten, die vom Client an den Server geschickt werden, sind weder verschlüsselt noch mit einem Passwort geschützt. Wenn ein Bedarf für Verschlüsselung besteht, ist es möglich package:security/stunnel[] zu verwenden, welches die Protokolldateien über einen verschlüsselten Tunnel versendet.
+
+Lokale Sicherheit ist ebenfalls ein Thema. Protokolldateien sind während der Verwendung oder nach ihrer Rotation nicht verschlüsselt. Lokale Benutzer versuchen vielleicht, auf diese Dateien zuzugreifen, um zusätzliche Einsichten in die Systemkonfiguration zu erlangen. Es ist absolut notwendig, die richtigen Berechtigungen auf diesen Dateien zu setzen. Das Werkzeug newsyslog unterstützt das Setzen von Berechtigungen auf gerade erstellte oder rotierte Protokolldateien. Protokolldateien mit Zugriffsmodus `600` sollten verhindern, dass lokale Benutzer darin herumschnüffeln. Zusätzliche Informationen finden Sie in man:newsyslog.conf[5].
+
+[[configtuning-configfiles]]
+== Konfigurationsdateien
+
+=== [.filename]#/etc# Layout
+
+Konfigurationsdateien finden sich in einigen Verzeichnissen unter anderem in:
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|[.filename]#/etc#
+|Enthält generelle systemspezifische Konfigurationsinformationen.
+
+|[.filename]#/etc/defaults#
+|Default Versionen der Konfigurationsdateien.
+
+|[.filename]#/etc/mail#
+|Enthält die man:sendmail[8] Konfiguration und weitere MTA Konfigurationsdateien.
+
+|[.filename]#/etc/ppp#
+|Hier findet sich die Konfiguration für die User- und Kernel-ppp Programme.
+
+|[.filename]#/usr/local/etc#
+|Installierte Anwendungen legen hier ihre Konfigurationsdateien ab. Dieses Verzeichnis kann Unterverzeichnisse für bestimmte Anwendungen enthalten.
+
+|[.filename]#/usr/local/etc/rc.d#
+|man:rc[8]-Skripten installierter Anwendungen.
+
+|[.filename]#/var/db#
+|Automatisch generierte systemspezifische Datenbanken, wie die Paket-Datenbank oder die man:locate[1]-Datenbank.
+|===
+
+=== Hostnamen
+
+==== [.filename]#/etc/resolv.conf#
+
+Wie ein FreeBSD-System auf das Internet Domain Name System (DNS) zugreift, wird in [.filename]#/etc/resolv.conf# festgelegt.
+
+Die gebräuchlichsten Einträge in [.filename]#/etc/resolv.conf# sind:
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|`nameserver`
+|Die IP-Adresse eines Nameservers, den der Resolver abfragen soll. Bis zu drei Server werden in der Reihenfolge, in der sie aufgezählt sind, abgefragt.
+
+|`search`
+|Suchliste mit Domain-Namen zum Auflösen von Hostnamen. Die Liste wird normalerweise durch den Domain-Teil des lokalen Hostnamens festgelegt.
+
+|`domain`
+|Der lokale Domain-Name.
+|===
+
+Beispiel für eine typische [.filename]#/etc/resolv.conf#:
+
+[.programlisting]
+....
+search example.com
+nameserver 147.11.1.11
+nameserver 147.11.100.30
+....
+
+[NOTE]
+====
+Nur eine der Anweisungen `search` oder `domain` sollte benutzt werden.
+====
+
+Wenn Sie DHCP benutzen, überschreibt man:dhclient[8] für gewöhnlich [.filename]#/etc/resolv.conf# mit den Informationen vom DHCP-Server.
+
+==== [.filename]#/etc/hosts#
+
+[.filename]#/etc/hosts# ist eine einfache textbasierte Datenbank. Zusammen mit DNS und NIS stellt sie eine Abbildung zwischen Namen und IP-Adressen zur Verfügung. Anstatt man:named[8] zu konfigurieren, können hier lokale Rechner, die über ein LAN verbunden sind, eingetragen werden. Lokale Einträge für gebräuchliche Internet-Adressen in [.filename]#/etc/hosts# verhindern die Abfrage eines externen Servers und beschleunigen die Namensauflösung.
+
+[.programlisting]
+....
+# $FreeBSD$
+#
+#
+# Host Database
+#
+# This file should contain the addresses and aliases for local hosts that
+# share this file. Replace 'my.domain' below with the domainname of your
+# machine.
+#
+# In the presence of the domain name service or NIS, this file may
+# not be consulted at all; see /etc/nsswitch.conf for the resolution order.
+#
+#
+::1 localhost localhost.my.domain
+127.0.0.1 localhost localhost.my.domain
+#
+# Imaginary network.
+#10.0.0.2 myname.my.domain myname
+#10.0.0.3 myfriend.my.domain myfriend
+#
+# According to RFC 1918, you can use the following IP networks for
+# private nets which will never be connected to the Internet:
+#
+# 10.0.0.0 - 10.255.255.255
+# 172.16.0.0 - 172.31.255.255
+# 192.168.0.0 - 192.168.255.255
+#
+# In case you want to be able to connect to the Internet, you need
+# real official assigned numbers. Do not try to invent your own network
+# numbers but instead get one from your network provider (if any) or
+# from your regional registry (ARIN, APNIC, LACNIC, RIPE NCC, or AfriNIC.)
+#
+....
+
+[.filename]#/etc/hosts# hat das folgende Format:
+
+[.programlisting]
+....
+[Internet Adresse] [Offizieller Hostname] [Alias1] [Alias2] ...
+....
+
+Zum Beispiel:
+
+[.programlisting]
+....
+10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2
+....
+
+Weitere Informationen entnehmen Sie bitte man:hosts[5].
+
+[[configtuning-sysctl]]
+== Einstellungen mit man:sysctl[8]
+
+Mit man:sysctl[8] können Sie Änderungen an einem laufenden FreeBSD-System vornehmen. Unter anderem können Optionen des TCP/IP-Stacks oder des virtuellen Speichermanagements verändert werden. Unter der Hand eines erfahrenen Systemadministrators kann dies die Systemperformance erheblich verbessern. Über 500 Variablen können mit man:sysctl[8] gelesen und gesetzt werden.
+
+Der Hauptzweck von man:sysctl[8] besteht darin, Systemeinstellungen zu lesen und zu verändern.
+
+Alle auslesbaren Variablen werden wie folgt angezeigt:
+
+[source,bash]
+....
+% sysctl -a
+....
+
+Um eine spezielle Variable zu lesen, geben Sie den Namen an:
+
+[source,bash]
+....
+% sysctl kern.maxproc
+kern.maxproc: 1044
+....
+
+Um eine Variable zu setzen, benutzen Sie die Syntax _Variable_= _Wert_:
+
+[source,bash]
+....
+# sysctl kern.maxfiles=5000
+kern.maxfiles: 2088 -> 5000
+....
+
+Mit sysctl können Strings, Zahlen oder Boolean-Werte gesetzt werden. Bei Boolean-Werten steht `1` für wahr und `0` für falsch.
+
+Um die Variablen automatisch während des Systemstarts zu setzen, fügen Sie sie in [.filename]#/etc/sysctl.conf# ein. Weitere Informationen finden Sie in der Hilfeseite man:sysctl.conf[5] und in <<configtuning-sysctlconf>>.
+
+[[configtuning-sysctlconf]]
+=== [.filename]#sysctl.conf#
+
+[.filename]#/etc/sysctl.conf# sieht ähnlich wie [.filename]#/etc/rc.conf# aus. Werte werden in der Form `Variable=Wert` gesetzt. Die angegebenen Werte werden gesetzt, nachdem sich das System bereits im Mehrbenutzermodus befindet. Allerdings lassen sich im Mehrbenutzermodus nicht alle Werte setzen.
+
+Um das Protokollieren von fatalen Signalen abzustellen und Benutzer daran zu hindern, von anderen Benutzern gestartete Prozesse zu sehen, können Sie in [.filename]#/etc/sysctl.conf# die folgenden Variablen setzen:
+
+[.programlisting]
+....
+# Do not log fatal signal exits (e.g. sig 11)
+kern.logsigexit=0
+
+# Prevent users from seeing information about processes that
+# are being run under another UID.
+security.bsd.see_other_uids=0
+....
+
+[[sysctl-readonly]]
+=== Schreibgeschützte Variablen
+
+Wenn schreibgeschützte man:sysctl[8]-Variablen verändert werden, ist ein Neustart des Systems erforderlich.
+
+Beispielsweise hat man:cardbus[4] auf einigen Laptops Schwierigkeiten, Speicherbereiche zu erkennen. Es treten dann Fehlermeldungen wie die folgende auf:
+
+[source,bash]
+....
+cbb0: Could not map register memory
+device_probe_and_attach: cbb0 attach returned 12
+....
+
+Um dieses Problem zu lösen, muss eine schreibgeschützte man:sysctl[8]-Variable verändert werden. Fügen Sie `hw.pci.allow_unsupported_io_range=1` in [.filename]#/boot/loader.conf# hinzu und starten Sie das System neu. Danach sollte man:cardbus[4] fehlerfrei funktionieren.
+
+[[configtuning-disk]]
+== Tuning von Laufwerken
+
+Der folgende Abschnitt beschreibt die verschiedenen Methoden zur Feinabstimmung der Laufwerke. Oft sind mechanische Teile in Laufwerken, wie SCSI-Laufwerke, verbaut. Diese können einen Flaschenhals bei der Gesamtleistung des Systems darstellen. Sie können zwar auch ein Laufwerk ohne mechanische Teile einbauen, wie z.B. ein Solid-State-Drive, aber Laufwerke mit mechanischen Teilen werden auch in naher Zukunft nicht vom Markt verschwinden. Bei der Feinabstimmung ist es ratsam, die Funktionen von man:iostat[8] zu verwenden, um verschiedene Änderungen zu testen und um nützliche IO-Informationen des Systems zu erhalten.
+
+=== Sysctl Variablen
+
+==== `vfs.vmiodirenable`
+
+Die man:sysctl[8]-Variable `vfs.vmiodirenable` besitzt in der Voreinstellung den Wert `1`. Die Variable kann auf den Wert `0` (deaktiviert) oder `1` (aktiviert) gesetzt werden. Sie steuert, wie Verzeichnisse vom System zwischengespeichert werden. Die meisten Verzeichnisse sind klein und benutzen nur ein einzelnes Fragment, typischerweise 1 kB, im Dateisystem und 512 Bytes im Buffer-Cache. Ist die Variable deaktiviert, wird der Buffer-Cache nur eine limitierte Anzahl Verzeichnisse zwischenspeichern, auch wenn das System über sehr viel Speicher verfügt. Ist die Variable aktiviert, kann der Buffer-Cache den VM-Page-Cache benutzen, um Verzeichnisse zwischenzuspeichern. Der ganze Speicher steht damit zum Zwischenspeichern von Verzeichnissen zur Verfügung. Der Nachteil bei dieser Vorgehensweise ist, dass zum Zwischenspeichern eines Verzeichnisses mindestens eine physikalische Seite im Speicher, die normalerweise 4 kB groß ist, anstelle von 512 Bytes gebraucht wird. Es wird empfohlen, diese Option aktiviert zu lassen, wenn Sie Dienste zur Verfügung stellen, die viele Dateien manipulieren. Beispiele für solche Dienste sind Web-Caches, große Mail-Systeme oder Netnews. Die aktivierte Variable vermindert, trotz des verschwendeten Speichers, in aller Regel nicht die Leistung des Systems, obwohl Sie das nachprüfen sollten.
+
+==== `vfs.write_behind`
+
+In der Voreinstellung besitzt die man:sysctl[8]-Variable `vfs.write_behind` den Wert `1` (aktiviert). Mit dieser Einstellung schreibt das Dateisystem anfallende vollständige Cluster, die besonders beim sequentiellen Schreiben großer Dateien auftreten, direkt auf das Medium aus. Dies verhindert, dass sich im Buffer-Cache veränderte Puffer (dirty buffers) ansammeln, die die I/O-Verarbeitung nicht mehr beschleunigen würden. Unter bestimmten Umständen blockiert diese Funktion allerdings Prozesse. Setzen Sie in diesem Fall die Variable `vfs.write_behind` auf den Wert `0`.
+
+==== `vfs.hirunningspace`
+
+Die man:sysctl[8]-Variable `vfs.hirunningspace` bestimmt systemweit die Menge ausstehender Schreiboperationen, die dem Platten-Controller zu jedem beliebigen Zeitpunkt übergeben werden können. Normalerweise können Sie den Vorgabewert verwenden. Auf Systemen mit vielen Platten kann der Wert aber auf 4 bis 5 _Megabyte_ erhöht werden. Ein zu hoher Wert (größer als der Schreib-Schwellwert des Buffer-Caches) kann zu Leistungsverlusten führen. Setzen Sie den Wert daher nicht zu hoch! Hohe Werte können auch Leseoperationen verzögern, die gleichzeitig mit Schreiboperationen ausgeführt werden.
+
+Es gibt weitere man:sysctl[8]-Variablen, mit denen Sie den Buffer-Cache und den VM-Page-Cache beeinflussen können. Es wird nicht empfohlen, diese Variablen zu verändern, da das VM-System den virtuellen Speicher selbst sehr gut verwaltet.
+
+==== `vm.swap_idle_enabled`
+
+Die man:sysctl[8]-Variable `vm.swap_idle_enabled` ist für große Mehrbenutzer-Systeme gedacht, auf denen sich viele Benutzer an- und abmelden und auf denen es viele Prozesse im Leerlauf (idle) gibt. Solche Systeme fragen kontinuierlich freien Speicher an. Wenn Sie die Variable `vm.swap_idle_enabled` aktivieren, können Sie die Auslagerungs-Hysterese von Seiten mit den Variablen `vm.swap_idle_threshold1` und `vm.swap_idle_threshold2` einstellen. Die Schwellwerte beider Variablen geben die Zeit in Sekunden an, in denen sich ein Prozess im Leerlauf befinden muss. Wenn die Werte so eingestellt sind, dass Seiten früher als nach dem normalen Algorithmus ausgelagert werden, verschafft das dem Auslagerungs-Prozess mehr Luft. Aktivieren Sie diese Funktion nur, wenn Sie sie wirklich benötigen: Die Speicherseiten werden eher früher als später ausgelagert. Der Platz im Swap-Bereich wird dadurch schneller verbraucht und die Plattenaktivitäten steigen an. Auf kleinen Systemen hat diese Funktion spürbare Auswirkungen. Auf großen Systemen, die sowieso schon Seiten auslagern müssen, können ganze Prozesse leichter in den Speicher geladen oder ausgelagert werden.
+
+==== `hw.ata.wc`
+
+Obwohl das Abstellen des IDE-Schreib-Zwischenspeichers die Bandbreite zum Schreiben auf die IDE-Festplatte verringert, kann es aus Gründen der Datenkonsistenz als notwendig angesehen werden. Das Problem ist, dass IDE-Platten keine zuverlässige Aussage über das Ende eines Schreibvorgangs treffen. Wenn der Schreib-Zwischenspeicher aktiviert ist, werden die Daten nicht in der Reihenfolge ihres Eintreffens geschrieben. Es kann sogar passieren, dass das Schreiben mancher Blöcke im Fall von starker Plattenaktivität auf unbefristete Zeit verzögert wird. Ein Absturz oder Stromausfall zu dieser Zeit kann die Dateisysteme erheblich beschädigen. Sie sollten den Wert der man:sysctl[8]-Variable `hw.ata.wc` auf dem System überprüfen. Wenn der Schreib-Zwischenspeicher abgestellt ist, können Sie ihn beim Systemstart aktivieren, indem Sie die Variable in [.filename]#/boot/loader.conf# auf den Wert `1` setzen.
+
+Weitere Informationen finden Sie in man:ata[4].
+
+==== `SCSI_DELAY` (`kern.cam.scsi_delay`)
+
+Mit der Kerneloption `SCSI_DELAY` kann die Dauer des Systemstarts verringert werden. Der Vorgabewert ist recht hoch und er verzögert den Systemstart um `15` oder mehr Sekunden. Normalerweise kann dieser Wert, insbesondere mit modernen Laufwerken, mit der man:sysctl[8]-Variable `kern.cam.scsi_delay` auf `5` Sekunden heruntergesetzt werden. Die Variable sowie die Kerneloption verwenden für die Zeitangabe Millisekunden und _nicht_ Sekunden.
+
+[[soft-updates]]
+=== Soft Updates
+
+Mit man:tunefs[8] lassen sich Feineinstellungen an Dateisystemen vornehmen. Das Programm hat verschiedene Optionen. Soft Updates werden wie folgt ein- und ausgeschaltet:
+
+[source,bash]
+....
+# tunefs -n enable /filesystem
+# tunefs -n disable /filesystem
+....
+
+Ein eingehängtes Dateisystem kann nicht mit man:tunefs[8] modifiziert werden. Soft Updates werden am besten im Single-User Modus aktiviert, bevor Partitionen eingehangen sind.
+
+Durch Einsatz eines Zwischenspeichers wird die Performance im Bereich der Metadaten, vorwiegend beim Anlegen und Löschen von Dateien, gesteigert. Es wird empfohlen, Soft Updates auf allen UFS-Dateisystemen zu aktivieren. Allerdings sollten Sie sich über die zwei Nachteile von Soft Updates bewusst sein: Erstens garantieren Soft Updates zwar die Konsistenz der Daten im Fall eines Absturzes, aber es kann passieren, dass das Dateisystem über mehrere Sekunden oder gar eine Minute nicht synchronisiert wurde. Nicht geschriebene Daten gehen dann vielleicht verloren. Zweitens verzögern Soft Updates die Freigabe von Datenblöcken. Eine größere Aktualisierung eines fast vollen Dateisystems, wie dem Root-Dateisystem, z.B. während eines `make installworld`, kann das Dateisystem vollaufen lassen. Dadurch würde die Aktualisierung fehlschlagen.
+
+==== Details über Soft Updates
+
+Bei einem Metadaten-Update werden die Inodes und Verzeichniseinträge aktualisiert auf die Platte zurückgeschrieben. Es gibt zwei klassische Ansätze, um die Metadaten des Dateisystems auf die Platte zu schreiben.
+
+Das historisch übliche Verfahren waren synchrone Updates der Metadaten, d. h. wenn eine Änderung an einem Verzeichnis nötig war, wurde anschließend gewartet, bis diese Änderung tatsächlich auf die Platte zurückgeschrieben worden war. Der _Inhalt_ der Dateien wurde im "Buffer Cache" zwischengespeichert und später asynchron auf die Platte geschrieben. Der Vorteil dieser Implementierung ist, dass sie sicher funktioniert. Wenn während eines Updates ein Ausfall erfolgt, haben die Metadaten immer einen konsistenten Zustand. Eine Datei ist entweder komplett angelegt oder gar nicht. Wenn die Datenblöcke einer Datei im Fall eines Absturzes noch nicht den Weg aus dem "Buffer Cache" auf die Platte gefunden haben, kann man:fsck[8] das Dateisystem reparieren, indem es die Dateilänge einfach auf `0` setzt. Außerdem ist die Implementierung einfach und überschaubar. Der Nachteil ist, dass Änderungen der Metadaten sehr langsam vor sich gehen. Ein `rm -r` beispielsweise fasst alle Dateien eines Verzeichnisses der Reihe nach an, aber jede dieser Änderungen am Verzeichnis (Löschen einer Datei) wird einzeln synchron auf die Platte geschrieben. Gleiches beim Auspacken großer Hierarchien mit `tar -x`.
+
+Der zweite Ansatz sind asynchrone Metadaten-Updates. Das ist der Standard, wenn UFS-Dateisysteme mit `mount -o async` eingehängt werden. Man schickt die Updates der Metadaten einfach auch noch über den "Buffer Cache", sie werden also zwischen die Updates der normalen Daten eingeschoben. Vorteil ist, dass man nun nicht mehr auf jeden Update warten muss, Operationen, die zahlreiche Metadaten ändern, werden also viel schneller. Auch hier ist die Implementierung sehr einfach und wenig anfällig für Fehler. Nachteil ist, dass keinerlei Konsistenz des Dateisystems mehr gesichert ist. Wenn mitten in einer Operation, die viele Metadaten ändert, ein Ausfall erfolgt (Stromausfall, drücken des Reset-Schalters), dann ist das Dateisystem anschließend in einem unbestimmten Zustand. Niemand kann genau sagen, was noch geschrieben worden ist und was nicht mehr; die Datenblöcke einer Datei können schon auf der Platte stehen, während die inode Tabelle oder das zugehörige Verzeichnis nicht mehr aktualisiert worden ist. Man kann praktisch kein man:fsck[8] mehr implementieren, das diesen Zustand wieder reparieren kann, da die dazu nötigen Informationen einfach auf der Platte fehlen. Wenn ein Dateisystem irreparabel beschädigt wurde, hat man nur noch die Möglichkeit es neu zu erzeugen und die Daten vom Backup zurückspielen.
+
+Der Ausweg aus diesem Dilemma ist ein _dirty region logging_, was auch als _Journalling_ bezeichnet wird. Man schreibt die Metadaten-Updates zwar synchron, aber nur in einen kleinen Plattenbereich, die _logging area_. Von da aus werden sie dann asynchron auf ihre eigentlichen Bereiche verteilt. Da die _logging area_ ein kleines zusammenhängendes Stückchen ist, haben die Schreibköpfe der Platte bei massiven Operationen auf Metadaten keine allzu großen Wege zurückzulegen, so dass alles ein ganzes Stück schneller geht als bei klassischen synchronen Updates. Die Komplexität der Implementierung hält sich ebenfalls in Grenzen, somit auch die Anfälligkeit für Fehler. Als Nachteil ergibt sich, dass Metadaten zweimal auf die Platte geschrieben werden müssen (einmal in die _logging area_, einmal an die richtige Stelle), so dass das im Falle regulärer Arbeit (also keine gehäuften Metadatenoperationen) eine "Pessimisierung" des Falls der synchronen Updates eintritt, es wird alles langsamer. Dafür hat man als Vorteil, dass im Falle eines Absturzes der konsistente Zustand dadurch erzielbar ist, dass die angefangenen Operationen aus dem _dirty region log_ entweder zu Ende ausgeführt oder komplett verworfen werden, wodurch das Dateisystem schnell wieder zur Verfügung steht.
+
+Die Lösung von Kirk McKusick, dem Schöpfer von Berkeley FFS, waren _Soft Updates_: die notwendigen Updates der Metadaten werden im Speicher gehalten und dann sortiert auf die Platte geschrieben ("ordered metadata updates"). Dadurch hat man den Effekt, dass im Falle massiver Metadaten-Änderungen spätere Operationen die vorhergehenden, noch nicht auf die Platte geschriebenen Updates desselben Elements im Speicher "einholen". Alle Operationen, auf ein Verzeichnis beispielsweise, werden also in der Regel noch im Speicher abgewickelt, bevor der Update überhaupt auf die Platte geschrieben wird (die dazugehörigen Datenblöcke werden natürlich auch so sortiert, dass sie nicht vor ihren Metadaten auf der Platte sind). Im Fall eines Absturzes hat man ein implizites "log rewind": alle Operationen, die noch nicht den Weg auf die Platte gefunden haben, sehen danach so aus, als hätten sie nie stattgefunden. Man hat so also den konsistenten Zustand von ca. 30 bis 60 Sekunden früher sichergestellt. Der verwendete Algorithmus garantiert dabei, dass alle tatsächlich benutzten Ressourcen auch in den entsprechenden Bitmaps (Block- und inode Tabellen) als belegt markiert sind. Der einzige Fehler, der auftreten kann, ist, dass Ressourcen noch als "belegt" markiert sind, die tatsächlich "frei" sind. man:fsck[8] erkennt dies und korrigiert diese nicht mehr belegten Ressourcen. Die Notwendigkeit eines Dateisystem-Checks darf aus diesem Grunde auch ignoriert und das Dateisystem mittels `mount -f` zwangsweise eingebunden werden. Um noch allozierte Ressourcen freizugeben muss später ein man:fsck[8] nachgeholt werden. Das ist dann auch die Idee des _background fsck_: beim Starten des Systems wird lediglich ein _Schnappschuss_ des Dateisystems gemacht, mit dem man:fsck[8] dann später arbeiten kann. Alle Dateisysteme dürfen "unsauber" eingebunden werden und das System kann sofort in den Multiuser-Modus gehen. Danach wird ein Hintergrund-man:fsck[8] für die Dateisysteme gestartet, die dies benötigen, um möglicherweise irrtümlich belegte Ressourcen freizugeben. Dateisysteme ohne _Soft Updates_ benötigen natürlich immer noch den üblichen Vordergrund-man:fsck[8], bevor sie eingebunden werden können.
+
+Der Vorteil ist, dass die Metadaten-Operationen beinahe so schnell ablaufen wie im asynchronen Fall, also auch schneller als beim _logging_, das die Metadaten immer zweimal schreiben muss. Als Nachteil stehen dem die Komplexität des Codes, ein erhöhter Speicherverbrauch und einige spezielle Eigenheiten entgegen. Nach einem Absturz ist ein etwas "älterer" Stand auf der Platte - statt einer leeren, aber bereits angelegten Datei, wie nach einem herkömmlichen man:fsck[8] Lauf, ist auf einem Dateisystem mit _Soft Updates_ keine Spur der entsprechenden Datei mehr zu sehen, da weder die Metadaten noch der Dateiinhalt je auf die Platte geschrieben wurden. Weiterhin kann der Platz nach einem man:rm[1] nicht sofort wieder als verfügbar markiert werden, sondern erst dann, wenn der Update auch auf die Platte vermittelt worden ist. Dies kann besonders dann Probleme bereiten, wenn große Datenmengen in einem Dateisystem installiert werden, das nicht genügend Platz hat, um alle Dateien zweimal unterzubringen.
+
+[[configtuning-kernel-limits]]
+== Einstellungen von Kernel Limits
+
+[[file-process-limits]]
+=== Datei und Prozeß Limits
+
+[[kern-maxfiles]]
+==== `kern.maxfiles`
+
+Abhängig von den Anforderungen an das System kann die man:sysctl[8]-Variable `kern.maxfiles` erhöht oder gesenkt werden. Die Variable legt die maximale Anzahl von Dateideskriptoren auf dem System fest. Wenn die Dateideskriptoren aufgebraucht sind, werden Sie die Meldung `file: table is full` wiederholt im Puffer für Systemmeldungen sehen. Den Inhalt des Puffers können Sie sich mit man:dmesg[8] anzeigen lassen.
+
+Jede offene Datei, jedes Socket und jede FIFO verbraucht einen Dateideskriptor. Auf "dicken" Produktionsservern können leicht Tausende Dateideskriptoren benötigt werden, abhängig von der Art und Anzahl der gleichzeitig laufenden Dienste.
+
+In älteren FreeBSD-Versionen wurde die Voreinstellung von `kern.maxfile` aus der Kernelkonfigurationsoption `maxusers` bestimmt. `kern.maxfiles` wächst proportional mit dem Wert von `maxusers`. Wenn Sie einen angepassten Kernel kompilieren, empfiehlt es sich diese Option entsprechend der maximalen Benutzerzahl des Systems einzustellen. Obwohl auf einer Produktionsmaschine vielleicht nicht 256 Benutzer gleichzeitig angemeldet sind, können die benötigten Ressourcen ähnlich hoch wie bei einem großen Webserver sein.
+
+Die nur lesbare man:sysctl[8]-Variable `kern.maxusers` wird beim Systemstart automatisch aus dem zur Verfügung stehenden Hauptspeicher bestimmt. Im laufenden Betrieb kann dieser Wert aus `kern.maxusers` ermittelt werden. Einige Systeme benötigen für diese Variable einen anderen Wert, wobei `64`, `128` und `256` gewöhnliche Werte darstellen. Es wird nicht empfohlen, die Anzahl der Dateideskriptoren auf einen Wert größer `256` zu setzen, es sei denn, Sie benötigen wirklich eine riesige Anzahl von ihnen. Viele der von `kern.maxusers` auf einen Standardwert gesetzten Parameter können beim Systemstart oder im laufenden Betrieb in [.filename]#/boot/loader.conf# angepasst werden. In man:loader.conf[5] und [.filename]#/boot/defaults/loader.conf# finden Sie weitere Details und Hinweise.
+
+Ältere FreeBSD-Versionen setzen diesen Wert selbst, wenn Sie in der Konfigurationsdatei den Wert `0` angeben. Wenn Sie den Wert selbst bestimmen wollen, sollten Sie `maxusers` mindestens auf `4` setzen. Dies gilt insbesondere dann, wenn Sie beabsichtigen, Xorg zu benutzen oder Software zu kompilieren. Der wichtigste Wert, der durch `maxusers` bestimmt wird, die maximale Anzahl an Prozessen ist, die auf `20 + 16 * maxusers` gesetzt wird. Wird `maxusers` auf `1` setzen, können gleichzeitig nur `36` Prozesse laufen, von denen ungefähr `18` schon beim Booten des Systems gestartet werden. Dazu kommen nochmals etwa `15` Prozesse beim Start von Xorg. Selbst eine einfache Aufgabe wie das Lesen einer Manualpage benötigt neun Prozesse zum Filtern, Dekomprimieren und Betrachten der Datei. Für die meisten Benutzer sollte es ausreichen, `maxusers` auf `64` zu setzen, womit `1044` gleichzeitige Prozesse zur Verfügung stehen. Wenn Sie allerdings den Fehler beim Start eines Programms oder auf einem Server mit einer großen Benutzerzahl sehen, dann sollten Sie den Wert nochmals erhöhen und den Kernel neu bauen.
+
+[NOTE]
+====
+Die Anzahl der Benutzer, die sich auf einem Rechner anmelden kann, wird durch `maxusers` _nicht_ begrenzt. Der Wert dieser Variablen legt neben der möglichen Anzahl der Prozesse eines Benutzers weitere sinnvolle Größen für bestimmte Systemtabellen fest.
+====
+
+==== `kern.ipc.soacceptqueue`
+
+Die man:sysctl[8]-Variable `kern.ipc.soacceptqueue` beschränkt die Größe der Warteschlange (Listen-Queue) für neue TCP-Verbindungen. Der Vorgabewert von `128` ist normalerweise zu klein, um neue Verbindungen auf einem stark ausgelasteten Webserver zuverlässig zu handhaben. Auf solchen Servern sollte der Wert auf `1024` oder höher gesetzt werden. Dienste wie man:sendmail[8] oder Apache können die Größe der Queue selbst einschränken. Oft gibt es die Möglichkeit, die Größe der Listen-Queue in einer Konfigurationsdatei einzustellen. Eine große Listen-Queue übersteht vielleicht auch einen Denial of Service Angriff ().
+
+[[nmbclusters]]
+=== Netzwerk Limits
+
+Die Kerneloption `NMBCLUSTERS` schreibt die Anzahl der Netzwerkpuffer (Mbufs) fest, die das System besitzt. Eine zu geringe Anzahl Mbufs auf einem Server mit viel Netzwerkverkehr verringert die Leistung von FreeBSD. Jeder Mbuf-Cluster nimmt ungefähr 2 kB Speicher in Anspruch, so dass ein Wert von `1024` insgesamt 2 Megabyte Speicher für Netzwerkpuffer im System reserviert. Wie viele Cluster benötigt werden, lässt sich durch eine einfache Berechnung herausfinden. Ein Webserver, der maximal `1000` gleichzeitige Verbindungen servieren soll, wobei jede der Verbindungen einen 6 kB großen Sendepuffer und einen 16 kB großen Empfangspuffer benötigt, braucht ungefähr 32 MB Speicher für Netzwerkpuffer. Als Daumenregel verdoppeln Sie diese Zahl, so dass sich für `NMBCLUSTERS` der Wert 2x32 MB / 2 kB= 64 MB / 2 kB= `32768` ergibt. Für Maschinen mit viel Speicher werden Werte zwischen `4096` und `32768` empfohlen. Unter keinen Umständen sollten Sie diesen Wert willkürlich erhöhen, da dies zu einem Absturz beim Systemstart führen kann. Verwenden Sie man:netstat[1] mit `-m` um den Gebrauch der Netzwerkpuffer zu kontrollieren.
+
+Die Netzwerkpuffer können beim Systemstart mit der Loader-Variablen `kern.ipc.nmbclusters` eingestellt werden. Nur auf älteren FreeBSD-Systemen müssen Sie die Kerneloption `NMBCLUSTERS` verwenden.
+
+Die Anzahl der man:sendfile[2] Puffer muss auf ausgelasteten Servern, die den Systemaufruf man:sendfile[2] oft verwenden, vielleicht erhöht werden. Dazu können Sie die Kerneloption `NSFBUFS` verwenden oder die Anzahl der Puffer in [.filename]#/boot/loader.conf# (siehe man:loader[8]) setzen. Die Puffer sollten erhöht werden, wenn Sie Prozesse im Zustand `sfbufa` sehen. Die schreibgeschützte man:sysctl[8]-Variable `kern.ipc.nsfbufs` zeigt die Anzahl eingerichteten Puffer im Kernel. Der Wert dieser Variablen wird normalerweise von `kern.maxusers` bestimmt. Manchmal muss die Pufferanzahl jedoch manuell eingestellt werden.
+
+[IMPORTANT]
+====
+Auch wenn ein Socket nicht blockierend angelegt wurde, kann der Aufruf von man:sendfile[2] blockieren, um auf freie `struct sf_buf` Puffer zu warten.
+====
+
+==== `net.inet.ip.portrange.*`
+
+Die man:sysctl[8]-Variable `net.inet.ip.portrange.*` legt die Portnummern für TCP- und UDP-Sockets fest. Es gibt drei Bereiche: den niedrigen Bereich, den normalen Bereich und den hohen Bereich. Die meisten Netzprogramme benutzen den normalen Bereich. Dieser Bereich umfasst in der Voreinstellung die Portnummern `1024` bis `5000` und wird durch die Variablen `net.inet.ip.portrange.first` und `net.inet.ip.portrange.last` festgelegt. Die festgelegten Bereiche für Portnummern werden von ausgehenden Verbindungen benutzt. Unter bestimmten Umständen, beispielsweise auf stark ausgelasteten Proxy-Servern, sind alle Portnummern für ausgehende Verbindungen belegt. Bereiche für Portnummern spielen auf Servern keine Rolle, die hauptsächlich eingehende Verbindungen verarbeiten (wie ein normaler Webserver) oder nur eine begrenzte Anzahl ausgehender Verbindungen öffnen (beispielsweise ein Mail-Relay). Wenn keine freien Portnummern mehr vorhanden sind, sollte die Variable `net.inet.ip.portrange.last` langsam erhöht werden. Ein Wert von `10000`, `20000` oder `30000` ist angemessen. Beachten Sie auch eine vorhandene Firewall, wenn Sie die Bereiche für Portnummern ändern. Einige Firewalls sperren große Bereiche (normalerweise aus den kleinen Portnummern) und erwarten, dass hohe Portnummern für ausgehende Verbindungen verwendet werden. Daher kann es erforderlich sein, den Wert von `net.inet.ip.portrange.first` zu erhöhen.
+
+==== `TCP` Bandwidth Delay Product Begrenzung
+
+Die `TCP` Bandwidth Delay Product Begrenzung wird aktiviert, indem die man:sysctl[8]-Variable `net.inet.tcp.inflight.enable` auf den Wert `1` gesetzt wird. Das System wird dadurch angewiesen, für jede Verbindung, das Produkt aus der Übertragungsrate und der Verzögerungszeit zu bestimmen. Dieses Produkt begrenzt die Datenmenge, die für einen optimalen Durchsatz zwischengespeichert werden muss.
+
+Diese Begrenzung ist nützlich, wenn Sie Daten über Verbindungen mit einem hohen Produkt aus Übertragungsrate und Verzögerungszeit wie Modems, Gigabit-Ethernet oder schnellen WANs, zur Verfügung stellen. Insbesondere wirkt sich die Begrenzung aus, wenn die Verbindung die Option Window-scaling verwendet oder große Sende-Fenster (send window) benutzt. Schalten Sie die Debug-Meldungen aus, wenn Sie die Begrenzung aktiviert haben. Dazu setzen Sie die Variable `net.inet.tcp.inflight.debug` auf `0`. Auf Produktions-Systemen sollten Sie zudem die Variable `net.inet.tcp.inflight.min` mindestens auf den Wert `6144` setzen. Allerdings kann ein zu hoher Wert, abhängig von der Verbindung, die Begrenzungsfunktion unwirksam machen. Die Begrenzung reduziert die Datenmenge in den Queues von Routern und Switches, sowie die Datenmenge in der Queue der lokalen Netzwerkkarte. Die Verzögerungszeit (Round Trip Time) für interaktive Anwendungen sinkt, da weniger Pakete zwischengespeichert werden. Dies gilt besonders für Verbindungen über langsame Modems. Die Begrenzung wirkt sich allerdings nur auf das Versenden von Daten aus (Uploads, Server). Auf den Empfang von Daten (Downloads) hat die Begrenzung keine Auswirkungen.
+
+Die Variable `net.inet.tcp.inflight.stab` sollte _nicht_ angepasst werden. Der Vorgabewert der Variablen beträgt `20`, das heißt es werden maximal zwei Pakete zu dem Produkt aus Übertragungsrate und Verzögerungszeit addiert. Dies stabilisiert den Algorithmus und verbessert die Reaktionszeit auf Veränderungen. Bei langsamen Verbindungen können sich aber die Laufzeiten der Pakete erhöhen (ohne diesen Algorithmus wären sie allerdings noch höher). In solchen Fällen können Sie versuchen, den Wert der Variablen auf `15`, `10` oder `5` herabzusetzen. Gleichzeitig müssen Sie vielleicht auch `net.inet.tcp.inflight.min` auf einen kleineren Wert (beispielsweise `3500`) setzen. Ändern Sie diese Variablen nur ab, wenn Sie keine anderen Möglichkeiten mehr haben.
+
+=== Virtueller Speicher (Virtual Memory)
+
+==== `kern.maxvnodes`
+
+Ein vnode ist die interne Darstellung einer Datei oder eines Verzeichnisses. Die Erhöhung der Anzahl der für das Betriebssystem verfügbaren vnodes verringert also die Schreib- und Lesezugriffe auf der Festplatte. vnodes werden im Normalfall vom Betriebssystem automatisch vergeben und müssen nicht manuell angepasst werden. In einigen Fällen stellt der Zugriff auf eine Platte allerdings einen Flaschenhals dar, daher sollten Sie in diesem Fall die Anzahl der möglichen vnodes erhöhen, um dieses Problem zu beheben. Beachten Sie dabei aber die Größe des inaktiven und freien Hauptspeichers.
+
+Um die Anzahl der derzeit verwendeten vnodes zu sehen, geben Sie Folgendes ein:
+
+[source,bash]
+....
+# sysctl vfs.numvnodes
+vfs.numvnodes: 91349
+....
+
+Die maximal mögliche Anzahl der vnodes erhalten Sie durch die Eingabe von:
+
+[source,bash]
+....
+# sysctl kern.maxvnodes
+kern.maxvnodes: 100000
+....
+
+Wenn sich die Anzahl der genutzten vnodes dem maximal möglichen Wert nähert, sollten Sie den Wert `kern.maxvnodes` zuerst um etwa `1000` erhöhen. Beobachten Sie danach die Anzahl der vom System genutzten `vfs.numvnodes`. Nähert sich der Wert wiederum dem definierten Maximum, müssen Sie `kern.maxvnodes` nochmals erhöhen. Sie sollten nun eine Änderung des Speicherverbrauches über man:top[1] registrieren können und über mehr aktiven Speicher verfügen.
+
+[[adding-swap-space]]
+== Hinzufügen von Swap-Bereichen
+
+Manchmal benötigt ein System mehr Swap-Bereiche. Dieser Abschnitt beschreibt zwei Methoden, um Swap-Bereiche hinzuzufügen: auf einer bestehenden Partition oder auf einem neuen Laufwerk, und das Hinzufügen einer Swap-Datei auf einer existierenden Partition.
+
+Für Informationen zur Verschlüsselung von Swap-Partitionen, zu den dabei möglichen Optionen sowie zu den Gründen für eine Verschlüsselung des Auslagerungsspeichers lesen Sie crossref:disks[swap-encrypting,“Den Auslagerungsspeicher verschlüsseln”].
+
+[[new-drive-swap]]
+=== Swap auf einer neuen Festplatte oder einer existierenden Partition
+
+Das Hinzufügen einer neuen Festplatte für den Swap-Bereich bietet eine bessere Leistung, als die Verwendung einer Partition auf einem vorhandenem Laufwerk. Die Einrichtung von Partitionen und Laufwerken wird in crossref:disks[disks-adding,“Hinzufügen von Laufwerken“] beschrieben. crossref:bsdinstall[configtuning-initial,“Ein Partitionslayout entwerfen“] diskutiert Aspekte über die Anordnung und Größe von Swap-Bereichen.
+
+Benutzen Sie `swapon` um eine Swap-Partition zum System hinzuzufügen. Zum Beispiel:
+
+[source,bash]
+....
+# swapon /dev/ada1s1b
+....
+
+[WARNING]
+====
+
+Sie können jede Partition verwenden, sofern sie nicht schon eingehangen ist. Das gilt auch dann, wenn die Partition bereits Daten enthält. Wird `swapon` auf einer Partition ausgeführt die Daten enthält, werden die vorhandenen Daten überschrieben und sind unweigerlich verloren. Stellen Sie sicher, dass die Partition, die Sie als Swap-Bereich hinzufügen möchten, wirklich die gewünschte Partition ist, bevor Sie `swapon` ausführen.
+====
+
+Um diese Swap-Partition automatisch beim Systemstart hinzuzufügen, fügen Sie einen Eintrag in [.filename]#/etc/fstab# hinzu:
+
+[.programlisting]
+....
+/dev/ada1s1b none swap sw 0 0
+....
+
+Die einzelnen Einträge von [.filename]#/etc/fstab# werden in man:fstab[5] erläutert. Weitere Informationen zu `swapon` finden Sie in man:swapon[8].
+
+[[create-swapfile]]
+=== Swap-Dateien erstellen
+
+Anstatt eine Partition zu verwenden, erstellen diese Beispiele eine 512 MB große Swap-Datei mit dem Namen [.filename]#/usr/swap0#.
+
+Die Verwendung von Swap-Dateien macht es erforderlich, dass das Modul man:md[4] entweder im Kernel vorhanden oder geladen wird, bevor Swap aktiviert ist. crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] enthält Informationen zum Bau eines angepassten Kernels.
+
+[[swapfile-10-and-later]]
+.Erstellen einer Swap-Datei
+[example]
+====
+[.procedure]
+. Erstellen Sie die Swap-Datei:
++
+[source,bash]
+....
+# dd if=/dev/zero of=/usr/swap0 bs=1024k count=512
+....
+
+. Setzen Sie die richtigen Berechtigungen für die neue Datei:
++
+[source,bash]
+....
+# chmod 0600 /usr/swap0
+....
+
+. Fügen Sie einen Eintrag in [.filename]#/etc/fstab# hinzu:
++
+[.programlisting]
+....
+md99 none swap sw,file=/usr/swap0,late 0 0
+....
++
+Das man:md[4] Gerät [.filename]#md99# wird verwendet, damit die niedrigeren Gerätenummer für die interaktive Benutzung frei bleiben.
+
+. Der Swap-Speicher wird nun automatisch beim Systemstart hinzugefügt. Benutzen Sie man:swapon[8] um den Swap-Speicher direkt zu aktivieren:
++
+[source,bash]
+....
+# swapon -aL
+....
+
+====
+
+[[acpi-overview]]
+== Energie- und Ressourcenverwaltung
+
+Es ist wichtig, Hardware effizient einzusetzen. Energie- und Ressourcenverwaltung ermöglicht es dem System auf verschiedene Ereignisse, beispielsweise einen unerwarteten Temperaturanstieg, reagieren zu können. Eine frühe Spezifikation für die Energieverwaltung war das Advanced Power Management (APM). APM steuert den Energieverbrauch eines Systems auf Basis der Systemaktivität. Ursprünglich konnten Stromverbrauch und Wärmeabgabe eines Systems nur schlecht von Betriebssystemen gesteuert werden. Die Hardware wurde vom BIOS gesteuert, was die Kontrolle der Energieverwaltung für den Anwender erschwerte. Das APM-BIOS wird von dem Hersteller des Systems zur Verfügung gestellt und ist auf die spezielle Hardware angepasst. Der APM-Treiber des Betriebssystems greift auf das _APM Software Interface_ zu, das den Energieverbrauch regelt.
+
+APM hat hauptsächlich vier Probleme. Erstens läuft die Energieverwaltung unabhängig vom Betriebssystem in einem herstellerspezifischen BIOS. Beispielsweise kann das APM-BIOS die Festplatten nach einer konfigurierbaren Zeit ohne die Zustimmung des Betriebssystems herunterfahren. Zweitens befindet sich die ganze APM-Logik im BIOS; das Betriebssystem hat gar keine APM-Komponenten. Bei Problemen mit dem APM-BIOS muss das Flash-ROM aktualisiert werden. Diese Prozedur ist gefährlich, da sie im Fehlerfall das System unbrauchbar machen kann. Zum Dritten ist APM eine Technik, die herstellerspezifisch ist und nicht koordiniert wird. Fehler im BIOS eines Herstellers werden nicht unbedingt im BIOS anderer Hersteller korrigiert. Das letzte Problem ist, dass im APM-BIOS nicht genügend Platz vorhanden ist, um eine durchdachte oder eine auf den Zweck der Maschine zugeschnittene Energieverwaltung zu implementieren.
+
+Das _Plug and Play BIOS (PNPBIOS)_ war in vielen Situationen ebenfalls unzureichend. Das PNPBIOS verwendet eine 16-Bit-Technik. Damit das Betriebssystem das PNPBIOS ansprechen kann, muss es in einer 16-Bit-Emulation laufen. FreeBSD stellt einen APM-Treiber zur Verfügung, welcher für Systeme benutzt werden sollte, die vor dem Jahr 2000 hergestellt wurden. Der Treiber wird in man:apm[4] beschrieben.
+
+Der Nachfolger von APM ist das _Advanced Configuration and Power Interface_ (ACPI). ACPI ist ein Standard verschiedener Hersteller, welcher die Verwaltung von Hardware und Energiesparfunktionen festlegt. Die ACPI-Funktionen, die mehr Kontrolle und Flexibilität bieten, können vom Betriebssystem gesteuert werden.
+
+Dieser Abschnitt zeigt die Konfiguration von ACPI unter FreeBSD. Zudem werden einige Tipps zur Fehlersuche vorgestellt und wie Sie Problemberichte einreichen können, sodass Entwickler ACPI-Probleme erfassen und beheben können.
+
+[[acpi-config]]
+=== Konfiguration des ACPI
+
+Der man:acpi[4]-Treiber wird standardmäßig beim Systemstart vom man:loader[8] geladen und sollte daher _nicht_ fest in den Kernel eingebunden werden. Der Treiber kann im laufenden Betrieb nicht entfernt werden, da er zur Kommunikation mit der Hardware verwendet wird. Falls jedoch Probleme auftreten, kann ACPI auch komplett deaktiviert werden. Dazu muss `hint.acpi.0.disabled="1"` in [.filename]#/boot/loader.conf# gesetzt und anschließend das System neu gestartet werden. Alternativ können Sie diese Variable auch am man:loader[8]-Prompt eingeben, wie in crossref:boot[boot-loader,“Phase Drei”] beschrieben.
+
+[NOTE]
+====
+ACPI und APM können nicht zusammen verwendet werden. Das zuletzt geladene Modul beendet sich, sobald es bemerkt, dass das andere Modul geladen ist.
+====
+
+Mit `acpiconf` können Sie das System in einen Ruhemodus (sleep mode) versetzen. Es gibt verschiedene Modi (von `1` bis `5`), die Sie auf der Kommandozeile mit `-s` angeben können. Für die meisten Anwender sind die Modi `1` und `3` völlig ausreichend. Der Modus `5` schaltet das System aus (Soft-off) und entspricht dem Befehl `halt -p`.
+
+Verschiedene Optionen können mit `sysctl` gesetzt werden. Lesen Sie dazu man:acpi[4] sowie man:acpiconf[8].
+
+[[ACPI-comprob]]
+=== Häufige Probleme
+
+ACPI gibt es in allen modernen Rechnern der ia32- (x86) und amd64- (AMD) Architektur. Der vollständige Standard bietet Funktionen zur Steuerung und Verwaltung der CPU-Leistung, der Stromversorgung, von Wärmebereichen, Batterien, eingebetteten Controllern und Bussen. Auf den meisten Systemen wird nicht der vollständige Standard implementiert. Arbeitsplatzrechner besitzen meist nur Funktionen zur Verwaltung der Busse, während Notebooks Funktionen zur Temperaturkontrolle und Ruhezustände besitzen.
+
+Ein ACPI konformes System besitzt verschiedene Komponenten. Die BIOS- und Chipsatz-Hersteller stellen mehrere statische Tabellen bereit, zum Beispiel die Fixed-ACPI-Description-Table (FADT). Die Tabellen enthalten beispielsweise die mit SMP-Systemen benutzte APIC-Map, Konfigurationsregister und einfache Konfigurationen. Zusätzlich gibt es die _Differentiated-System-Description-Table_ (DSDT), die Bytecode enthält. Die Tabelle ordnet Geräte und Methoden in einem baumartigen Namensraum an.
+
+Ein ACPI-Treiber muss die statischen Tabellen einlesen, einen Interpreter für den Bytecode bereitstellen und die Gerätetreiber im Kernel so modifizieren, dass sie mit dem ACPI-Subsystem kommunizieren. Für FreeBSD, Linux(R) und NetBSD hat Intel(R) den Interpreter ACPI-CA, zur Verfügung gestellt. Der Quelltext zu ACPI-CA befindet sich im Verzeichnis [.filename]#src/sys/contrib/dev/acpica#. Die Schnittstelle von ACPI-CA zu FreeBSD befindet sich unter [.filename]#src/sys/dev/acpica/Osd#. Treiber, die verschiedene ACPI-Geräte implementieren, befinden sich im Verzeichnis [.filename]#src/sys/dev/acpica#.
+
+Damit ACPI richtig funktioniert, müssen alle Teile funktionieren. Im Folgenden finden Sie eine Liste mit Problemen und möglichen Abhilfen oder Korrekturen. Die Liste ist nach der Häufigkeit, mit der die Probleme auftreten, sortiert. Wenn eine Korrektur das Problem nicht behebt, finden Sie in <<ACPI-submitdebug>> Anweisungen, wie Sie einen Problembericht einreichen können.
+
+==== Mausprobleme
+
+Es kann vorkommen, dass die Maus nicht mehr funktioniert, wenn Sie nach einem Suspend weiterarbeiten wollen. Ist dies bei Ihnen der Fall, reicht es meistens aus, den Eintrag `hint.psm.0.flags="0x3000"` in [.filename]#/boot/loader.conf# aufzunehmen.
+
+==== Suspend/Resume
+
+ACPI kennt drei Suspend-to-RAM-Zustände (STR), `S1`-`S3` sowie einen Suspend-to-Disk-Zustand (STD) `S4`. STD kann auf zwei Arten implementiert werden: ``S4``BIOS und ``S4``OS. Im ersten Fall wird der Suspend-to-Disk-Zustand durch das BIOS hergestellt im zweiten Fall alleine durch das Betriebssystem. Der Zustand `S5` wird "Soft off" genannt. In diesem Zustand befindet sich ein Rechner, wenn die Stromversorgung angeschlossen ist, der Rechner aber nicht hochgefahren ist.
+
+Benutzen Sie `sysctl hw.acpi` um die Suspend-Zustände zu ermitteln. Diese Beispielausgabe stammt von einem Thinkpad:
+
+[source,bash]
+....
+hw.acpi.supported_sleep_state: S3 S4 S5
+hw.acpi.s4bios: 0
+....
+
+Diese Ausgabe besagt, dass mit dem Befehl `acpiconf -s` die Zustände `S3`, `S4` und `S5` eingestellt werden können. Hätte `s4bios` den Wert `1`, gäbe es den Zustand ``S4``BIOS anstelle von `S4`.
+
+Wenn Sie die Suspend- und Resume-Funktionen testen, fangen Sie mit dem `S1`-Zustand an, wenn er angeboten wird. Dieser Zustand wird am ehesten funktionieren, da der Zustand wenig Treiber-Unterstützung benötigt. Der Zustand `S2` ist ähnlich wie `S1`, allerdings hat ihn noch niemand implementiert. Als nächstes sollten Sie den Zustand `S3` ausprobieren. Dies ist der tiefste STR-Schlafzustand. Dieser Zustand ist auf massive Treiber-Unterstützung angewiesen, um die Geräte wieder richtig zu initialisieren.
+
+Ein häufiges Problem mit Suspend/Resume ist, dass viele Gerätetreiber ihre Firmware, Register und Gerätespeicher nicht korrekt speichern, wiederherstellen und/oder reinitialisieren. Um dieses Problem zu lösen, sollten Sie zuerst die folgenden Befehle ausführen:
+
+[source,bash]
+....
+# sysctl debug.bootverbose=1
+# sysctl debug.acpi.suspend_bounce=1
+# acpiconf -s 3
+....
+
+Dieser Test emuliert einen Suspend/Resume-Zyklus für alle Geräte (ohne dass diese dabei wirklich in den Status `S3` wechseln). In vielen Fällen reicht dies bereits aus, um Probleme (beispielsweise verlorener Firmware-Status, Timeouts, hängende Geräte) zu entdecken. Beachten Sie dabei, dass das Gerät bei diesem Test nicht wirklich in den Status `S3` wechseln. Es kann also vorkommen, dass manche Geräte weiterhin mit Strom versorgt werden (dies wäre bei einem wirklichen Wechsel in den Status `S3` NICHT möglich. Andere Geräte werden normal weiterarbeiten, weil sie über keine Suspend/Resume-Funktionen verfügen.
+
+Schwierigere Fälle können den Einsatz zusätzlicher Hardware (beispielsweise serielle Ports/Kabel für die Verbindung über eine serielle Konsole oder Firewire-Ports/Kabel für man:dcons[4]) sowie Kenntnisse im Bereich Kerneldebugging erforderlich machen.
+
+Um das Problem einzugrenzen, entladen Sie soviele Treiber wie möglich. Wenn das funktioniert, laden Sie einen Treiber nach dem anderen, bis der Fehler wieder auftritt. Typischerweise verursachen binäre Treiber wie [.filename]#nvidia.ko#, Grafiktreiber und USB-Treiber die meisten Fehler, hingegen laufen Ethernet-Treiber für gewöhnlich sehr zuverlässig. Wenn ein Treiber zuverlässig geladen und entfernt werden kann, können Sie den Vorgang automatisieren, indem Sie die entsprechenden Kommandos in [.filename]#/etc/rc.suspend# und [.filename]#/etc/rc.resume# einfügen. In den Dateien finden Sie ein deaktiviertes Beispiel, das einen Treiber lädt und wieder entfernt. Ist die Bildschirmanzeige bei der Wiederaufnahme des Betriebs gestört, setzen Sie die Variable `hw.acpi.reset_video` auf `1`. Versuchen Sie auch, die Variable `hw.acpi.sleep_delay` auf kürzere Zeitspannen zu setzen.
+
+Die Suspend- und Resume-Funktionen können Sie auch auf einer neuen Linux(R)-Distribution mit ACPI testen. Wenn es mit Linux(R) funktioniert, liegt das Problem wahrscheinlich bei einem FreeBSD-Treiber. Es hilft uns, das Problem zu lösen, wenn Sie feststellen können, welcher Treiber das Problem verursacht. Beachten Sie bitte, dass die ACPI-Entwickler normalerweise keine anderen Treiber pflegen (beispielsweise Sound- oder ATA-Treiber). Es ist wohl das beste, die Ergebnisse der Fehlersuche an die Mailingliste {freebsd-current} und den Entwickler des Treibers zu schicken. Erfahrene Benutzer können versuchen, den Fehler in der Resume-Funktion zu finden, indem sie einige man:printf[3]-Anweisungen in den Code des fehlerhaften Treibers einfügen.
+
+Schließlich können Sie ACPI noch abschalten und stattdessen APM verwenden. Wenn die Suspend- und Resume-Funktionen mit APM funktionieren, sollten Sie besser APM verwenden (insbesondere mit alter Hardware von vor dem Jahr 2000). Die Hersteller benötigten einige Zeit, um ACPI korrekt zu implementieren, daher gibt es mit älterer Hardware oft ACPI-Probleme.
+
+==== Systemhänger
+
+Die meisten Systemhänger entstehen durch verlorene Interrupts oder einen Interrupt-Sturm. Probleme werden verursacht durch die Art, in der das BIOS Interrupts vor dem Systemstart konfiguriert, durch eine fehlerhafte APIC-Tabelle und durch die Zustellung des System-Control-Interrupts (SCI).
+
+Anhand der Ausgabe des Befehls `vmstat -i` können Sie verlorene Interrupts von einem Interrupt-Sturm unterscheiden. Untersuchen Sie die Ausgabezeile, die `acpi0` enthält. Ein Interrupt-Sturm liegt vor, wenn der Zähler öfter als ein paar Mal pro Sekunde hochgezählt wird. Wenn sich das System aufgehangen hat, versuchen Sie mit der Tastenkombination kbd:[Ctrl+Alt+Esc] in den Debugger DDB zu gelangen. Geben Sie dort den Befehl `show interrupts` ein.
+
+Wenn Sie Interrupt-Probleme haben, ist es vorerst wohl am besten, APIC zu deaktivieren. Tragen Sie dazu die Zeile `hint.apic.0.disabled="1"` in [.filename]#/boot/loader.conf# ein.
+
+==== Abstürze (Panics)
+
+Panics werden so schnell wie möglich behoben; mit ACPI kommt es aber selten dazu. Zuerst sollten Sie die Panic reproduzieren und dann versuchen einen backtrace (eine Rückverfolgung der Funktionsaufrufe) zu erstellen. Richten Sie dazu den DDB über die serielle Schnittstelle (siehe crossref:serialcomms[serialconsole-ddb,“DDB Debugger über die serielle Schnittstelle”]) oder eine gesonderte man:dump[8]-Partition ein. In DDB können Sie den backtrace mit dem Kommando `tr` erstellen. Falls Sie den backtrace vom Bildschirm abschreiben müssen, schreiben Sie bitte mindestens die fünf ersten und die fünf letzten Zeile der Ausgabe auf.
+
+Versuchen Sie anschließend, das Problem durch einen Neustart ohne ACPI zu beseitigen. Wenn das funktioniert hat, können Sie versuchen, das verantwortliche ACPI-Subsystem durch Setzen der Variablen `debug.acpi.disable` herauszufinden. Die Hilfeseite man:acpi[4] enthält dazu einige Beispiele.
+
+==== Nach einem Suspend oder einem Stopp startet das System wieder
+
+Setzen Sie zuerst `hw.acpi.disable_on_poweroff="0"` in [.filename]#/boot/loader.conf#. Damit wird verhindert, dass ACPI während des Systemabschlusses die Bearbeitung verschiedener Ereignisse deaktiviert. Auf manchen Systemen muss die Variable den Wert `1` besitzen (die Voreinstellung). Normalerweise wird der unerwünschte Neustart des Systems durch Setzen dieser Variablen behoben.
+
+[[ACPI-aslanddump]]
+==== BIOS mit fehlerhaftem Bytecode
+
+Einige BIOS-Hersteller liefern einen fehlerhaften Bytecode aus. Dies erkennen Sie an Kernelmeldungen wie diesen:
+
+[source,bash]
+....
+ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
+(Node 0xc3f6d160), AE_NOT_FOUND
+....
+
+Oft können Sie das Problem dadurch lösen, dass Sie eine aktuelle BIOS-Version einspielen. Die meisten Meldungen auf der Konsole sind harmlos, wenn aber beispielsweise der Batteriestatus falsch angezeigt wird, können Sie in den Meldungen nach Problemen suchen.
+
+=== Die voreingestellte ASL überschreiben
+
+Der BIOS-Bytecode, bekannt als ACPI Maschine Language (AML) wird aus der Sprache namens ACPI Source Language (ASL) übersetzt. Die AML ist in einer Tabelle, bekannt als Differentiated System Description Table (DSDT), abgelegt.
+
+Es ist das Ziel von FreeBSD, dass ACPI ohne Eingriffe des Benutzers läuft. Zurzeit werden allerdings noch Abhilfen für Fehler der BIOS-Hersteller entwickelt. Der Microsoft(R)-Interpreter ([.filename]#acpi.sys# und [.filename]#acpiec.sys#) prüft die ASL nicht streng gegen den Standard. Daher reparieren BIOS-Hersteller, die ACPI nur unter Windows(R) testen, ihre ASL nicht. Die FreeBSD Entwickler hoffen, dass sie das vom Standard abweichende Verhalten des Microsoft(R)-Interpreters dokumentieren und in FreeBSD replizieren können. Dadurch müssen Benutzer ihre ASL nicht selbst reparieren.
+
+Um bei der Fehlersuche zu helfen und das Problem möglicherweise zu beheben, kann eine Kopie der ASL gemacht werden. Dazu nutzen Sie `acpidump` zusammen mit `-t`, um den Inhalt der Tabelle anzuzeigen und `-d`, um die AML zu zerlegen:
+
+[source,bash]
+....
+# acpidump -td > my.asl
+....
+
+Einige AMLs gehen davon aus, dass der Anwender eine Windows(R)-Versionen benutzt. Versuchen Sie das Betriebssystem, das Sie in der ASL finden, in [.filename]#/boot/loader.conf# anzugeben: `hw.acpi.osname=_"Windows 2009"_`.
+
+Manche Abhilfen erfordern eine Anpassung von [.filename]#my.asl#. Wenn diese Datei bearbeitet wird, erstellen Sie die neue ASL mit dem folgenden Befehl. Warnung können meistens ignoriert werden, aber Fehler verhindern die ordnungsgemäße Funktion von ACPI.
+
+[source,bash]
+....
+# iasl -f my.asl
+....
+
+Die Option `-f` erzwingt das Erstellen der AML auch dann, wenn während der Übersetzung Fehler auftreten. Einige Fehler, wie fehlende Return-Anweisungen, werden automatisch vom FreeBSD Interpreter umgangen.
+
+Die voreingestellte Ausgabedatei von `iasl` ist [.filename]#DSDT.aml#. Wenn Sie diese Datei anstelle der fehlerhaften Kopie des BIOS laden wollen, editieren Sie [.filename]#/boot/loader.conf# wie folgt:
+
+[.programlisting]
+....
+acpi_dsdt_load="YES"
+acpi_dsdt_name="/boot/DSDT.aml"
+....
+
+Stellen Sie bitte sicher, dass sich [.filename]#DSDT.aml# in [.filename]#/boot# befindet und starten Sie das System neu. Wenn dadurch das Problem behoben wird, schicken Sie einen man:diff[1] der alten und der neuen ASL an {freebsd-acpi}, damit die Entwickler das Problem in [.filename]#acpica# umgehen können.
+
+[[ACPI-submitdebug]]
+=== Abrufen und Einreichen von Informationen zur Fehlersuche
+
+Der ACPI-Treiber besitzt flexible Möglichkeiten zur Fehlersuche. Sie können sowohl die zu untersuchenden Subsysteme als auch die zu erzeugenden Ausgaben festlegen. Die zu untersuchenden Subsysteme werden als "layer" angegeben und in Komponenten (`ACPI_ALL_COMPONENTS`) und ACPI-Hardware (`ACPI_ALL_DRIVERS`) aufgeteilt. Welche Meldungen ausgegeben werden, wird über "level" gesteuert. Die Level reichen von von `ACPI_LV_ERROR` (es werden nur Fehler ausgegeben) bis zu `ACPI_LV_VERBOSE` (alles wird ausgegeben). Das Level ist eine Bitmaske, sodass verschiedene Stufen auf einmal (durch Leerzeichen getrennt) angegeben werden können. Die erzeugte Ausgabemenge passt vielleicht nicht in den Konsolenpuffer. In diesem Fall sollte die Ausgabe mithilfe einer seriellen Konsole gesichert werden. Die möglichen Werte für "layers" und "level" werden in man:acpi[4] beschrieben.
+
+Die Ausgaben zur Fehlersuche sind in der Voreinstellung nicht aktiviert. Wenn ACPI im Kernel enthalten ist, fügen Sie `options ACPI_DEBUG` zur Kernelkonfigurationsdatei hinzu. Sie können die Ausgaben zur Fehlersuche global aktivieren, indem Sie in der Datei [.filename]#/etc/make.conf# die Zeile `ACPI_DEBUG=1` einfügen. Das Modul [.filename]#acpi.ko# können Sie wie folgt neu übersetzen:
+
+[source,bash]
+....
+# cd /sys/modules/acpi/acpi && make clean && make ACPI_DEBUG=1
+....
+
+Kopieren Sie anschließend [.filename]#acpi.ko# ins Verzeichnis [.filename]#/boot/kernel#. In [.filename]#/boot/loader.conf# stellen Sie "level" und "layer" ein. Das folgende Beispiel aktiviert die Ausgabe von Fehlern für alle ACPI-Komponenten und alle Hardwaretreiber:
+
+[.programlisting]
+....
+debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
+debug.acpi.level="ACPI_LV_ERROR"
+....
+
+Wenn ein Problem durch ein bestimmtes Ereignis, beispielsweise den Start nach einem Ruhezustand, hervorgerufen wird, können Sie die Einstellungen für "level" und "layer" auch mit dem Kommando `sysctl` vornehmen. In diesem Fall müssen Sie [.filename]#/boot/loader.conf# nicht editieren. Auf der Kommandozeile geben Sie über `sysctl` dieselben Variablennamen wie in [.filename]#/boot/loader.conf# an.
+
+Sobald Sie die Fehlerinformationen gesammelt haben, schicken Sie diese an {freebsd-acpi}, sodass die Betreuer des FreeBSD-ACPI-Subsystems diese Informationen zur Analyse und für die Entwicklung einer Lösung verwenden können.
+
+[NOTE]
+====
+Bevor Sie einen Fehlerbericht an diese Mailingliste einreichen, stellen Sie bitte sicher, dass das BIOS und die Firmware des Controllers aktuell sind.
+====
+
+Wenn Sie einen Fehlerbericht einsenden, fügen Sie bitte die folgenden Informationen ein:
+
+* Beschreiben Sie den Fehler und alle Umstände, unter denen der Fehler auftritt. Geben Sie ebenfalls den Typ und das Modell Ihres Systems an. Wenn Sie einen neuen Fehler entdeckt haben, versuchen Sie möglichst genau zu beschreiben, wann der Fehler das erste Mal aufgetreten ist.
+* Die Ausgabe von `dmesg` nach der Eingabe von `boot -v`. Geben Sie auch alle Fehlermeldungen an, die erscheinen, wenn Sie den Fehler provozieren.
+* Die Ausgabe von `dmesg` nach der Eingabe von `boot -v` und mit deaktiviertem ACPI, wenn das Problem ohne ACPI nicht auftritt.
+* Die Ausgabe von `sysctl hw.acpi`. Dieses Kommando zeigt die vom System unterstützten ACPI-Funktionen an.
+* Die URL, unter der die ASL liegt. Schicken Sie bitte _nicht_ die ASL an die Mailingliste, da die ASL sehr groß sein kann. Eine Kopie der ASL erstellen Sie mit dem nachstehenden Befehl:
++
+[source,bash]
+....
+# acpidump -td > name-system.asl
+....
++
+Setzen Sie für _name_ den Namen des Kontos und für _system_ den Hersteller und das Modell des Systems ein. Zum Beispiel: [.filename]#njl-FooCo6000.asl#.
+
+Obwohl die meisten Entwickler die Mailingliste {freebsd-current} lesen, sollten Sie Fehlerberichte an die Liste {freebsd-acpi} schicken. Seien Sie bitte geduldig; wir haben alle Arbeit außerhalb des Projekts. Wenn der Fehler nicht offensichtlich ist, bitten wir Sie vielleicht, einen offiziellen Fehlerbericht (PR) einzusenden. Geben Sie im Fehlerbericht bitte dieselben Informationen wie oben an. Mithilfe der PRs verfolgen und lösen wir Probleme. Senden Sie bitte keinen PR ein, ohne vorher den Fehlerbericht an die Liste {freebsd-acpi} zu senden. Es kann sein, dass der Fehler schon von jemand anderem gemeldet wurde.
+
+[[ACPI-References]]
+=== Referenzen
+
+Weitere Informationen über ACPI finden Sie hier:
+
+* Die FreeBSD ACPI Mailingliste (https://lists.freebsd.org/pipermail/freebsd-acpi/[https://lists.freebsd.org/pipermail/freebsd-acpi/])
+* Die ACPI 2.0 Spezifikation (http://acpi.info/spec.htm[http://acpi.info/spec.htm])
+* man:acpi[4], man:acpi_thermal[4], man:acpidump[8], man:iasl[8] und man:acpidb[8]
diff --git a/documentation/content/de/books/handbook/cutting-edge/_index.adoc b/documentation/content/de/books/handbook/cutting-edge/_index.adoc
new file mode 100644
index 0000000000..d8abfad222
--- /dev/null
+++ b/documentation/content/de/books/handbook/cutting-edge/_index.adoc
@@ -0,0 +1,917 @@
+---
+title: Kapitel 23. FreeBSD aktualisieren
+part: Teil III. Systemadministration
+prev: books/handbook/l10n
+next: books/handbook/dtrace
+---
+
+[[updating-upgrading]]
+= FreeBSD aktualisieren
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 23
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/cutting-edge/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/cutting-edge/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/cutting-edge/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[updating-upgrading-synopsis]]
+== Übersicht
+
+FreeBSD wird zwischen einzelnen Releases ständig weiter entwickelt. Manche Leute bevorzugen die offiziellen Release-Versionen, während andere wiederum lieber auf dem aktuellen Stand der Entwicklung bleiben möchten. Wie dem auch sei, sogar offizielle Release-Versionen werden oft mit Sicherheitsaktualisierungen und anderen kritischen Fehlerbereinigungen versorgt. Unabhängig von der eingesetzten Version bringt FreeBSD alle nötigen Werkzeuge mit, um das System aktuell zu halten und es innerhalb verschiedener Versionen zu aktualisieren. Dieses Kapitel beschreibt, wie man einem Entwicklungssystem folgen kann, sowie die grundlegenden Werkzeuge um FreeBSD zu aktualisieren.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie
+
+* wissen, wie das System mit freebsd-update oder Subversion aktualisiert wird.
+* wissen, wie man das aktuell installierte System mit einer ursprünglichen Version vergleicht.
+* wissen, wie die installierte Dokumentation mit Subversion oder Dokumentations-Ports aktualisiert wird.
+* den Unterschied zwischen den beiden Entwicklungszweigen FreeBSD-STABLE und FreeBSD-CURRENT kennen.
+* wissen, wie das komplette Basissystem neu gebaut und installiert wird.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie
+
+* das Netzwerk richtig konfiguriert haben (crossref:advanced-networking[advanced-networking,Weiterführende Netzwerkthemen]).
+* wissen, wie Software Dritter installiert wird (crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports]).
+
+[NOTE]
+====
+In diesem Kapitel wird `svnlite` benutzt, um die FreeBSD Quellen zu beziehen und zu aktualisieren. Alternativ kann auch der Port oder das Paket package:devel/subversion[] installiert werden.
+====
+
+[[updating-upgrading-freebsdupdate]]
+== FreeBSD-Update
+
+Das zeitnahe Einspielen von Sicherheitsaktualisierungen und die Aktualisierung des Betriebssystems sind wichtige Aspekte der Systemadministration. FreeBSD enthält das Werkzeug `freebsd-update`, mit dem Sie diese beiden Aufgaben erfüllen können.
+
+Dieses Werkzeug ermöglicht die Anwendung von Sicherheitsaktualisierungen im Binärformat auf das FreeBSD Basissystem, ohne dieses neu zu übersetzen und zu installieren. Die Aktualisierungen im Binärformat sind für alle Architekturen und Versionen verfügbar, welche vom FreeBSD Sicherheitsteam unterstützt werden. Eine Liste der unterstützten Versionen und der End-of-Life-Daten ist unter https://www.FreeBSD.org/security/[https://www.FreeBSD.org/security/] aufgeführt.
+
+`freebsd-update` unterstützt auch die Aktualisierung des Betriebssystems auf eine neuere Unterversion sowie eine Aktualisierung auf einen anderen Release-Zweig. Bevor Sie auf eine neue Version aktualisieren, sollten Sie die aktuellen Ankündigungen zu dem Release gelesen haben, da diese wichtige Informationen zu dem entsprechenden Release enthalten. Ankündigungen finden Sie unter https://www.FreeBSD.org/releases/[https://www.FreeBSD.org/releases/].
+
+[NOTE]
+====
+Wenn eine `crontab` existiert, welche die Eigenschaften von man:freebsd-update[8] verwendet, muss diese deaktiviert werden, bevor das Betriebssystem aktualisiert wird.
+====
+
+Dieser Abschnitt beschreibt die Verwendung der Konfigurationsdatei von `freebsd-update`. Es wird gezeigt wie Sie Sicherheitsaktualisierungen einspielen, oder wie Sie das Betriebssystem auf neuere Haupt- und Unterversionen aktualisieren können.
+
+[[freebsdupdate-config-file]]
+=== Die Konfigurationsdatei
+
+In der Regel muss die Konfigurationsdatei von `freebsd-update` nicht bearbeitet werden. Manche Benutzer möchten die Standard-Konfigurationsdatei [.filename]#/etc/freebsd-update.conf# trotzdem anpassen, um bessere Kontrolle über den gesamten Prozess zu besitzen. Die Kommentare in dieser Datei beschreiben die verfügbaren Optionen, jedoch benötigen die folgenden ein paar zusätzliche Erklärungen:
+
+[.programlisting]
+....
+# Components of the base system which should be kept updated.
+Components world kernel
+....
+
+Dieser Parameter kontrolliert, welche Teile von FreeBSD auf dem aktuellen Stand gehalten werden sollen. In der Voreinstellung wird das gesamte Basissystem sowie der Kernel aktualisiert. Es können auch einzelne Komponenten, wie `src/base` oder `src/sys`, angegeben werden. Die beste Einstellung ist, diese Option so zu belassen, da eine Änderung es bedingt, dass man als Benutzer jede Komponente auflisten muss, die aktualisiert werden soll. Dies könnte katastrophale Folgen nach sich ziehen, da der Quellcode und die Binärdateien dadurch nicht mehr synchron wären.
+
+[.programlisting]
+....
+# Paths which start with anything matching an entry in an IgnorePaths
+# statement will be ignored.
+IgnorePaths /boot/kernel/linker.hints
+....
+
+Fügen Sie Pfade wie [.filename]#/bin# oder [.filename]#/sbin# hinzu, um diese speziellen Verzeichnisse während des Aktualisierungsprozesses unberührt zu lassen. Diese Option kann verwendet werden, um zu verhindern, dass `freebsd-update` lokale Änderungen überschreibt.
+
+[.programlisting]
+....
+# Paths which start with anything matching an entry in an UpdateIfUnmodified
+# statement will only be updated if the contents of the file have not been
+# modified by the user (unless changes are merged; see below).
+UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile
+....
+
+Diese Option aktualisiert nur unmodifizierte Konfigurationsdateien in den angegebenen Verzeichnissen. Jede Änderung, die der Benutzer daran vorgenommen hat, wird die automatische Aktualisierung dieser Dateien verhindern. Es gibt eine weitere Option `KeepModifiedMetadata`, die `freebsd-update` instruiert, die Änderungen während der Zusammenführung zu speichern.
+
+[.programlisting]
+....
+# When upgrading to a new FreeBSD release, files which match MergeChanges
+# will have any local changes merged into the version from the new release.
+MergeChanges /etc/ /var/named/etc/ /boot/device.hints
+....
+
+Eine Liste von Verzeichnissen mit Konfigurationsdateien, in denen `freebsd-update` Zusammenführungen versuchen soll. Dieser Verschmelzungsprozess von Dateien ist eine Serie von man:diff[1]-Korrekturen, ähnlich wie man:mergemaster[8], aber mit weniger Optionen. Die Änderungen werden entweder akzeptiert, oder öffnen einen Editor, oder `freebsd-update` bricht ab. Im Zweifelsfall sichern Sie [.filename]#/etc# und akzeptieren einfach die Änderungen. Lesen Sie man:mergemaster[8], um Informationen über `mergemaster` zu erhalten.
+
+[.programlisting]
+....
+# Directory in which to store downloaded updates and temporary
+# files used by FreeBSD Update.
+# WorkDir /var/db/freebsd-update
+....
+
+In diesem Verzeichnis werden alle Korrekturen und temporären Dateien abgelegt. Im Falle einer Versionsaktualisierung sollte diesem Verzeichnis mindestens ein Gigabyte Festplattenspeicher zur Verfügung stehen.
+
+[.programlisting]
+....
+# When upgrading between releases, should the list of Components be
+# read strictly (StrictComponents yes) or merely as a list of components
+# which *might* be installed of which FreeBSD Update should figure out
+# which actually are installed and upgrade those (StrictComponents no)?
+# StrictComponents no
+....
+
+Wenn diese Option auf `yes` gesetzt ist, wird `freebsd-update` annehmen, dass die `Components`-Liste vollständig ist und nicht versuchen, Änderungen ausserhalb dieser Liste zu tätigen. Tatsächlich wird `freebsd-update` versuchen, jede Datei zu aktualisieren, die zu der `Components`-Liste gehört.
+
+[[freebsdupdate-security-patches]]
+=== Sicherheitskorrekturen anwenden
+
+Das Einspielen von FreeBSD Sicherheitskorrekturen wurde dahingehend vereinfacht, dass der Administrator nun das gesamte System mit `freebsd-update` auf dem aktuellen Stand halten kann. Weitere Informationen zu FreeBSD Sicherheitshinweisen finden Sie in crossref:security[security-advisories,"FreeBSD Sicherheitshinweise"].
+
+Sicherheitskorrekturen für FreeBSD können wie folgt heruntergeladen und installiert werden. Das erste Kommando prüft, ob noch ausstehende Korrekturen verfügbar sind, und wenn dass der Fall ist, zeigt es welche Dateien davon betroffen wären. Das zweite Kommando wird die Korrekturen auf das System anwenden.
+
+[source,bash]
+....
+# freebsd-update fetch
+# freebsd-update install
+....
+
+Wenn während der Aktualisierung Korrekturen am Kernel angewendet werden, muss das System neu gestartet werden, damit der korrigierte Kernel gebootet wird. Wenn die Korrekturen auf laufende Binärdateien angewendet werden, sollten die betroffenen Anwendungen neu gestartet werden, damit die korrigierte Version der Binärdatei geladen wird.
+
+[NOTE]
+====
+Im Regelfall muss der Benutzer darauf vorbereitet sein, das System neu zu starten. Um herauszufinden, ob ein Neustart durch eine Aktualisierung des Kernels erforderlich ist, führen Sie die Befehle `freebsd-version -k` und `uname -r` aus. Ist die Ausgabe dieser Befehle unterschiedlich, ist ein Neustart des Systems erforderlich.
+====
+
+Mit dem folgenden Eintrag in [.filename]#/etc/crontab# wird das System einmal täglich nach Aktualisierungen suchen:
+
+[.programlisting]
+....
+@daily root freebsd-update cron
+....
+
+Wenn Korrekturen existieren, werden diese automatisch heruntergeladen, aber nicht eingespielt. Der `root`-Benutzer bekommt eine Nachricht, damit die Korrekturen überprüft und mit `freebsd-update install` manuell installiert werden können.
+
+Wenn etwas schief geht, kann `freebsd-update` den letzten Satz von Änderungen mit folgendem Befehl rückgängig machen:
+
+[source,bash]
+....
+# freebsd-update rollback
+Uninstalling updates... done.
+....
+
+Wie bereits erwähnt, sollte das System neu gestartet werden, wenn der Kernel oder ein Kernelmodul verändert wurde. Betroffene Anwendungen sollten neu gestartet werden, wenn Binärdateien verändert wurden.
+
+Das `freebsd-update`-Werkzeug kann nur den [.filename]#GENERIC#-Kernel automatisch aktualisieren. Wenn ein angepasster Kernel verwendet wird, muss dieser neu erstellt und installiert werden, nachdem `freebsd-update` die Aktualisierungen durchgeführt hat. Der voreingestellte Kernel ist _GENERIC_. Benutzen Sie das Kommando man:uname[1] um dies zu überprüfen.
+
+[NOTE]
+====
+Behalten Sie immer eine Kopie des [.filename]#GENERIC#-Kernels in [.filename]#/boot/GENERIC#. Das wird bei der Diagnose von verschiedenen Problemen sowie bei der Durchführung von Versionsaktualisierungen eine große Hilfe sein. Im <<freebsd-update-custom-kernel-9x>> wird beschrieben, wie Sie eine Kopie des [.filename]#GENERIC#-Kernels bekommen.
+====
+
+Solange die Standardkonfiguration in [.filename]#/etc/freebsd-update.conf# nicht geändert wurde, wird `freebsd-update` die aktualisierten Quellcodedateien des Kernels zusammen mit dem Rest der Neuerungen installieren. Die erneute Übersetzung und Installation eines neuen, angepassten Kernels kann dann auf die übliche Art und Weise durchgeführt werden.
+
+Die Aktualisierungen, die über `freebsd-update` verteilt werden, betreffen nicht immer den Kernel. Es ist nicht notwendig, den angepassten Kernel neu zu erstellen, wenn die Kernelquellen nicht durch `freebsd-update install` geändert wurden. Allerdings wird `freebsd-update` immer [.filename]#/usr/src/sys/conf/newvers.sh# aktualisieren. Der aktuelle Patch-Level, der mit der `-p`-Nummer bei `uname -r` ausgegeben wird, wird aus dieser Datei ausgelesen. Die Neuinstallation des angepassten Kernels, selbst wenn sich daran nichts geändert hat, erlaubt es `uname`, den aktuellen Patch-Level des Systems korrekt wiederzugeben. Dies ist besonders hilfreich, wenn mehrere Systeme gewartet werden, da es eine schnelle Einschätzung der installierten Aktualisierungen in jedem einzelnen System ermöglicht.
+
+[[freebsdupdate-upgrade]]
+=== Aktualisierungen an Haupt- und Unterversionen
+
+Aktualisierungen einer Unterversion von FreeBSD zur nächsten Version ist beispielsweise die Aktualisierung von FreeBSD 9.0 auf FreeBSD 9.1. Die Aktualisierung einer Hauptversion ist beispielsweise von FreeBSD 9.X auf FreeBSD 10.X. Beide Arten der Aktualisierungen können durchgeführt werden, indem man `freebsd-update` eine Release-Version als Ziel übergibt.
+
+[NOTE]
+====
+Wenn auf dem System ein angepasster Kernel eingesetzt wird, stellen Sie sicher, dass eine Kopie des [.filename]#GENERIC#-Kernels in [.filename]#/boot/GENERIC# existiert. Im <<freebsd-update-custom-kernel-9x>> wird beschrieben, wie Sie eine Kopie des [.filename]#GENERIC#-Kernels bekommen.
+====
+
+Wenn Sie das folgende Kommando auf einem System mit FreeBSD 9.0 ausführen, wird das System auf FreeBSD 9.1 aktualisiert:
+
+[source,bash]
+....
+# freebsd-update -r 9.1-RELEASE upgrade
+....
+
+Nach der Eingabe des Kommandos überprüft `freebsd-update` die Konfigurationsdatei und das aktuelle System, um die nötigen Informationen für die Systemaktualisierung zu sammeln. Eine Bildschirmausgabe wird anzeigen, welche Komponenten erkannt und welche nicht erkannt wurden. Zum Beispiel:
+
+[source,bash]
+....
+Looking up update.FreeBSD.org mirrors... 1 mirrors found.
+Fetching metadata signature for 9.0-RELEASE from update1.FreeBSD.org... done.
+Fetching metadata index... done.
+Inspecting system... done.
+
+The following components of FreeBSD seem to be installed:
+kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
+src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
+src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
+world/base world/info world/lib32 world/manpages
+
+The following components of FreeBSD do not seem to be installed:
+kernel/generic world/catpages world/dict world/doc world/games
+world/proflibs
+
+Does this look reasonable (y/n)? y
+....
+
+An diesem Punkt wird `freebsd-update` versuchen, alle notwendigen Dateien für die Aktualisierung herunter zu laden. In manchen Fällen wird der Benutzer mit Fragen konfrontiert, um festzustellen, was installiert werden soll oder auf welche Art und Weise fortgesetzt werden soll.
+
+Wenn ein angepasster Kernel benutzt wird, produziert der vorherige Schritt eine Warnung ähnlich zu der folgenden:
+
+[source,bash]
+....
+WARNING: This system is running a "
+MYKERNEL" kernel, which is not a
+kernel configuration distributed as part of FreeBSD 9.0-RELEASE.
+This kernel will not be updated: you MUST update the kernel manually
+before running "/usr/sbin/freebsd-update install"
+....
+
+Diese Warnung kann an dieser Stelle problemlos ignoriert werden. Der aktualisierte [.filename]#GENERIC#-Kernel wird als ein Zwischenschritt im Aktualisierungsprozess verwendet.
+
+Nachdem alle Korrekturen auf das lokale System heruntergeladen wurden, werden diese eingespielt. Dieser Prozess kann eine gewisse Zeit in Anspruch nehmen, abhängig von der Geschwindigkeit und Auslastung der Maschine. Konfigurationsdateien werden ebenfalls zusammengefügt. Dieser Teil der Prozedur verlangt einige Benutzereingaben, da eine Datei möglicherweise von Hand zusammengefasst werden muss oder ein Editor erscheint auf dem Bildschirm zum manuellen bearbeiten. Die Ergebnisse von jeder erfolgreichen Zusammenfassung werden dem Benutzer angezeigt, während der Prozess weiter läuft. Eine fehlgeschlagene oder ignorierte Zusammenfassung wird den Prozess sofort beenden. Benutzer sollten eine Sicherung von [.filename]#/etc# anlegen und wichtige Dateien später manuell vereinen, beispielsweise [.filename]#master.passwd# oder [.filename]#group#.
+
+[NOTE]
+====
+Das System ist zu diesem Zeitpunkt noch nicht verändert worden, da alle Korrekturen und Vereinigungen in einem anderen Verzeichnis vorgenommen wurden. Wenn alle Korrekturen erfolgreich eingespielt, alle Konfigurationsdateien zusammengefügt wurden und es den Anschein hat, dass der Prozess problemlos verlaufen wird, müssen die Änderungen vom Anwender noch angewendet und auf die Platte geschrieben werden:
+
+[source,bash]
+....
+# freebsd-update install
+....
+
+====
+
+Der Kernel und die Module werden zuerst aktualisiert. Wenn das System einen angepassten Kernel verwendet, benutzen Sie man:nextboot[8], um den Kernel für den nächsten Neustart auf [.filename]#/boot/GENERIC# zu setzen:
+
+[source,bash]
+....
+# nextboot -k GENERIC
+....
+
+[WARNING]
+====
+
+Bevor das System mit dem [.filename]#GENERIC#-Kernel neu gestartet wird, vergewissern Sie sich, dass für den Neustart alle benötigten Treiber enthalten sind. Falls auf die Maschine aus der Ferne zugegriffen wird, stellen Sie sicher, dass das System ordnungsgemäß an das Netzwerk angeschlossen ist. Achten Sie besonders darauf, dass wenn der angepasste Kernel Funktionalität beinhaltet, die normalerweise von Kernelmodulen zur Verfügung gestellt werden, dass diese temporär über [.filename]#/boot/loader.conf# in den [.filename]#GENERIC#-Kernel übernommen werden. Zudem wird empfohlen, nicht benötigte Dienste, eingehängte Platten und verbundene Netzlaufwerke zu deaktivieren, bis der Aktualisierungsprozess abgeschlossen ist.
+====
+
+Die Maschine sollte nun mit dem aktualisierten Kernel neu gestartet werden:
+
+[source,bash]
+....
+# shutdown -r now
+....
+
+Sobald das System wieder hochgefahren ist, muss `freebsd-update` erneut gestartet werden. Da der Zustand des Prozesses zuvor gesichert wurde, wird `freebsd-update` nicht von vorne beginnen, sondern mit der nächsten Phase fortfahren und alle alten Bibliotheken und Objektdateien löschen.
+
+[source,bash]
+....
+# freebsd-update install
+....
+
+[NOTE]
+====
+Abhängig davon, ob irgendwelche Bibliotheksversionen erhöht wurden, kann es sein, dass nur zwei Installationsphasen anstatt drei durchlaufen werden.
+====
+
+Die Aktualisierung ist nun abgeschlossen. Wenn es sich hierbei um eine Aktualisierung auf eine neue Hauptversion handelt, müssen alle Ports und Pakete neu installiert werden. Dieser Vorgang wird in <<freebsdupdate-portsrebuild>> beschrieben.
+
+[[freebsd-update-custom-kernel-9x]]
+==== Angepasste Kernel unter FreeBSD 9.X und später
+
+Stellen Sie vor der ersten Benutzung von `freebsd-update` sicher, dass eine Kopie des [.filename]#GENERIC#-Kernels in [.filename]#/boot/GENERIC# existiert. Wenn ein angepasster Kernel erstmalig gebaut wurde, ist der Kernel in [.filename]#/boot/kernel.old# der [.filename]#GENERIC#-Kernel. Benennen Sie dieses Verzeichnis einfach in [.filename]#/boot/GENERIC# um.
+
+Wenn bereits mehrfach ein angepasster Kernel gebaut wurde, oder nicht bekannt ist wie oft ein angepasster Kernel gebaut wurde, behalten Sie besser eine Kopie des [.filename]#GENERIC#-Kernels, welcher mit der aktuellen Version des Betriebssystems übereinstimmt. Wenn ein direkter Zugriff auf die Maschine möglich ist, kann eine Kopie des [.filename]#GENERIC#-Kernels von den Installationsmedien installiert werden:
+
+[source,bash]
+....
+# mount /cdrom
+# cd /cdrom/usr/freebsd-dist
+# tar -C/ -xvf kernel.txz boot/kernel/kernel
+....
+
+Alternativ kann der [.filename]#GENERIC#-Kernel aus den Quellen neu gebaut und installiert werden:
+
+[source,bash]
+....
+# cd /usr/src
+# make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null
+....
+
+Damit dieser Kernel als [.filename]#GENERIC#-Kernel von `freebsd-update` erkannt wird, darf die [.filename]#GENERIC#-Konfigurationsdatei in keiner Weise geändert worden sein. Es wird ebenfalls empfohlen, dass dieser ohne irgendwelche speziellen Optionen erstellt wird.
+
+Der Neustart in den [.filename]#GENERIC#-Kernel ist nicht notwendig, da `freebsd-update` lediglich [.filename]#/boot/GENERIC# benötigt.
+
+[[freebsdupdate-portsrebuild]]
+==== Aktualisierung der Pakete nach einem Upgrade auf eine Hauptversion
+
+In der Regel funktionieren nach einer Aktualisierung einer Unterversion die installierten Anwendungen weiterhin problemlos. Neue Hauptversionen verwenden jedoch andere Binärschnittstellen (ABIs), was dazu führt, dass die meisten Anwendungen von Drittherstellern nicht mehr funktionieren. Nach der Aktualisierung auf eine Hauptversion, müssen alle installierten Ports und Pakete aktualisiert werden. Benutzen Sie `pkg upgrade` um Pakte zu aktualisieren. Installierte Ports können Sie mit einem Werkzeug wie package:ports-mgmt/portmaster[] aktualisiert werden.
+
+Bei einer erzwungenen Aktualisierung aller installierten Pakete, werden diese durch eine neue Version aus dem Repository ersetzt, sogar dann, wenn sich die Versionsnummer nicht erhöht hat. Dieser Schritt ist erforderlich, da sich die ABI bei einer Aktualisierung der Hauptversion von FreeBSD verändert hat. Eine erzwungene Aktualisierung aller installierten Pakete geschieht wie folgt:
+
+[source,bash]
+....
+# pkg-static upgrade -f
+....
+
+Ein Neubau der installierten Ports führen Sie mit diesem Kommando durch:
+
+[source,bash]
+....
+# portmaster -af
+....
+
+Dieser Befehl wird die Konfigurationen für jede Anwendung anzeigen, und der Benutzer hat die Möglichkeit, die Optionen anzupassen. Wenn Sie ausschließlich die voreingestellten Optionen verwenden möchten, verwenden Sie mit dem obigen Befehl den Parameter `-G`.
+
+Sobald dies abgeschlossen ist, beenden Sie den Aktualisierungsprozess mit einem letzten Aufruf von `freebsd-update`. Geben Sie den folgenden Befehl ein, um alle losen Enden des Aktualisierungsprozesses miteinander zu verknüpfen:
+
+[source,bash]
+....
+# freebsd-update install
+....
+
+Wenn der [.filename]#GENERIC#-Kernel temporär Verwendung fand, ist dies der richtige Zeitpunkt, einen neuen, angepassten Kernel nach den Anweisungen in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] zu bauen und zu installieren.
+
+Booten Sie anschließend die Maschine in die neue FreeBSD-Version. Der Aktualisierungsprozess ist damit abgeschlossen.
+
+[[freebsdupdate-system-comparison]]
+=== Vergleich des Systemzustands
+
+`freebsd-update IDS` kann verwendet werden, um den Zustand der installierten FreeBSD-Version gegenüber einer bekannten und funktionierenden Kopie zu vergleichen. Dieses Kommando vergleicht die aktuelle Version von Systemwerkzeugen, Bibliotheken sowie Konfigurationsdateien und kann als integriertes Intrusion Detection System (IDS) benutzt werden.
+
+[WARNING]
+====
+
+Dieses Programm ist kein Ersatz für ein echtes IDS-System wie package:security/snort[]. Da `freebsd-update` Daten auf der Festplatte speichert, ist die Möglichkeit von Verfälschungen offensichtlich. Obwohl diese Möglichkeit durch die Verwendung von `kern.securelevel` oder die Speicherung von Daten auf einem Nur-Lese Dateisystem eingedämmt werden kann, besteht eine bessere Lösung darin, das System gegen ein gesichertes Medium, wie eine DVD oder einen externen, separat aufbewahrten USB-Plattenspeicher, zu vergleichen. Eine alternative Methode zur Bereitstellung von IDS-Funktionaliäten wird in crossref:security[security-ids,"Überprüfung von Binärdateien"] beschrieben.
+====
+
+Beginnen Sie den Vergleich, indem Sie das Programm starten und eine Ausgabedatei festlegen:
+
+[source,bash]
+....
+# freebsd-update IDS >> outfile.ids
+....
+
+Das System wird nun überprüft. Dabei wird eine lange Liste von Dateien zusammen mit den SHA256-Hashwerten der Release-Version und den Werten des aktuell installierten Systems, in die angegebene Ausgabedatei geschrieben.
+
+Die Zeilen in der Ausgabe sind extrem lang, aber das Ausgabeformat kann einfach verarbeitet werden. Um beispielsweise eine Liste von allen Dateien zu erhalten, die sich vom aktuellen Release unterscheiden, geben Sie das folgende Kommando ein:
+
+[source,bash]
+....
+# cat outfile.ids | awk '{ print $1 }' | more
+/etc/master.passwd
+/etc/motd
+/etc/passwd
+/etc/pf.conf
+....
+
+Diese Beispielausgabe wurde abgeschnitten, da noch viele weitere Dateien vorhanden sind. Einige Dateien wurden auf natürliche Art verändert. [.filename]#/etc/passwd# wurde beispielsweise geändert, wenn Benutzer zum System hinzugefügt wurden. Kernelmodule können sich unterscheiden, wenn `freebsd-update` diese aktualisiert hat. Um bestimmte Dateien oder Verzeichnisse auszuschließen, fügen Sie diese an die `IDSIgnorePaths`-Option in [.filename]#/etc/freebsd-update.conf# an.
+
+[[updating-upgrading-documentation]]
+== Aktualisieren der Dokumentationssammlung
+
+Dokumentation ein wichtiger Bestandteil des FreeBSD Betriebssystems. Obwohl eine aktuelle Version der FreeBSD Dokumentation jederzeit auf der FreeBSD Webseite (link:https://www.FreeBSD.org/doc/[ https://www.freebsd.org/doc/]) verfügbar ist, kann es nützlich sein, eine lokale Kopie der FreeBSD Webseite, Handbücher, FAQ und Artikel zu haben.
+
+Dieser Abschnitt beschreibt, wie Sie die FreeBSD Dokumentation über die Quellen oder die FreeBSD Ports-Sammlung aktuell halten.
+
+Informationen zum Bearbeiten und Einreichen von Korrekturen finden Sie in der link:/books/fdp-primer[Fibel für neue Mitarbeiter des FreeBSD-Dokumentationsprojekts].
+
+[[updating-installed-documentation]]
+=== Die FreeBSD-Dokumentation aus den Quellen installieren
+
+Der Bau der FreeBSD Dokumentation aus den Quellen erfordert einige Werkzeuge, die nicht Teil des Basissystems sind. Die erforderlichen Werkzeuge können über den Port oder das Paket package:textproc/docproj[] installiert werden.
+
+Benutzen Sie nach der Installation svnlite, um eine saubere Kopie der Dokumentationsquellen zu holen:
+
+[source,bash]
+....
+# svnlite checkout https://svn.FreeBSD.org/doc/head /usr/doc
+....
+
+Es dauert eine Weile, bis die Quellen das allererste Mal heruntergeladen werden. Lassen Sie den Vorgang laufen, bis es fertig ist.
+
+Zukünftige Aktualisierungen der Dokumentationsquellen können wie folgt durchgeführt werden:
+
+[source,bash]
+....
+# svnlite update /usr/doc
+....
+
+Sobald ein aktueller Schnappschuss der Dokumentationsquellen nach [.filename]#/usr/doc# heruntergeladen wurde, ist alles bereit für eine Aktualisierung der bestehenden Dokumentation.
+
+Eine komplette Aktualisierung aller Sprachen kann durch folgende Eingabe erreicht werden:
+
+[source,bash]
+....
+# cd /usr/doc
+# make install clean
+....
+
+Wenn nur eine Aktualisierung einer bestimmten Sprache gewünscht wird, kann `make` in einem sprachspezifischen Unterverzeichnis von [.filename]#/usr/doc# aufgerufen werden:
+
+[source,bash]
+....
+# cd /usr/doc/en_US.ISO8859-1
+# make install clean
+....
+
+Alternativ kann der folgende Befehl in [.filename]#/usr/doc# oder einem sprachspezifischen Unterverzeichnis abgesetzt werden, um die Dokumentation zu aktualisieren:
+
+[source,bash]
+....
+# make update
+....
+
+Die zu installierenden Ausgabeformate können durch das Setzen von `FORMATS` angegeben werden:
+
+[source,bash]
+....
+# cd /usr/doc
+# make FORMATS='html html-split' install clean
+....
+
+Es existieren ein paar Optionen, welche den Prozess der Aktualisierung von Teilen der Dokumentation oder einer bestimmten Übersetzung erleichtern. Diese Optionen können entweder systemweit in [.filename]#/etc/make.conf# gesetzt, oder als Kommandozeilenoptionen an `make` übergeben werden.
+
+Zu den Optionen gehören:
+
+`DOC_LANG`::
+Eine Liste von Sprachen und Kodierungen, die gebaut und installiert werden sollen, z.B. `en_US.ISO8859-1`, um nur die englische Dokumentation zu erhalten.
+
+`FORMATS`::
+Ein einzelnes Format oder eine Liste von Ausgabeformaten, das gebaut werden soll. Momentan werden `html`, `html-split`, `txt`, `ps` und `pdf` unterstützt.
+
+`DOCDIR`::
+Wohin die Dokumentation installiert werden soll. Der Standardpfad ist [.filename]#/usr/shared/doc#.
+
+Für weitere `make`-Variablen, die als systemweite Optionen in FreeBSD unterstützt werden, lesen Sie man:make.conf[5].
+
+[[doc-ports-install-package]]
+=== Die Dokumentation aus den Ports aktualisieren
+
+Im vorherigen Abschnitt wurde eine Methode gezeigt, wie die FreeBSD-Dokumentation aus den Quellen gebaut werden kann. Dieser Abschnitt beschreibt eine alternative Methode, in der die Ports-Sammlung verwendet wird und die es ermöglicht:
+
+* vorgefertigte Schnappschüsse der Dokumentation zu installieren, ohne vorher die Werkzeugsammlung der Dokumentation installieren zu müssen.
+* die Dokumentationsquellen durch das Ports-System erstellen zu lassen, was die Schritte zum Auschecken und Erstellen etwas erleichtert.
+
+Diese Methoden der Aktualisierung der FreeBSD-Dokumentation werden durch eine Menge von Dokumentations-Ports und Paketen unterstützt, die von {doceng} monatlich aktualisiert wird. Diese sind in der FreeBSD Ports-Sammlung unter der Kategorie "docs" gelistet (http://www.freshports.org/docs/[ http://www.freshports.org/docs/]).
+
+Die Dokumentations-Ports sind wie folgt organisiert:
+
+* Das Paket oder der Port package:misc/freebsd-doc-en[] installiert die englische Dokumentation.
+* Das Paket oder der Port package:misc/freebsd-doc-all[] installiert die komplette Dokumentation in allen verfügbaren Sprachen.
+* Es gibt noch ein Paket oder einen Port für jede Übersetzung, beispielsweise package:misc/freebsd-doc-hu[] für die ungarische Dokumentation.
+
+Wenn Sie Pakete benutzen, wird die FreeBSD-Dokumentation in allen verfügbaren Formaten der jeweiligen Sprache installiert. Das folgende Beispiel wird das aktuelle Paket der ungarischen Dokumentation installieren:
+
+[source,bash]
+....
+# pkg install hu-freebsd-doc
+....
+
+[NOTE]
+====
+Pakete verwenden ein Format, welches sich von dem Namen des dazugehörigen Ports unterscheidet: `_lang_-freebsd-doc`. _lang_ entspricht hier der Kurzform des Sprachcodes, z.B. `hu` für Ungarisch, oder `zh_cn` für vereinfachtes Chinesisch.
+====
+
+Um das Format der Dokumentation zu bestimmen, muss anstelle des Pakets der Port gebaut werden. Das folgende Beispiel baut und installiert die englische Dokumentation:
+
+[source,bash]
+....
+# cd /usr/ports/misc/freebsd-doc-en
+# make install clean
+....
+
+Der Port enthält ein Konfigurationsmenü, in dem das Format ausgewählt werden kann. In der Voreinstellung sind `html-split` und `pdf` ausgewählt.
+
+Alternativ können bei der Erstellung eines Dokumentations-Ports verschiedene `make`-Optionen angegeben werden. Dazu gehören:
+
+`WITH_HTML`::
+Erstellt das HTML-Format mit einer einzigen HTML-Datei pro Dokument. Die formatierte Dokumentation wird als Datei mit dem Namen [.filename]#article.html# oder [.filename]#book.html# gespeichert.
+
+`WITH_PDF`::
+Die formatierte Dokumentation wird als Datei mit dem Namen [.filename]#article.pdf# oder [.filename]#book.pdf# gespeichert.
+
+`DOCBASE`::
+Legt den Pfad fest, wohin die Dokumentation installiert werden soll. Die Voreinstellung ist [.filename]#/usr/local/shared/doc/freebsd#.
+
+Dieses Beispiel verwendet Variablen, um die ungarische Dokumentation als PDF in ein bestimmtes Verzeichnis zu installieren:
+
+[source,bash]
+....
+# cd /usr/ports/misc/freebsd-doc-hu
+# make -DWITH_PDF DOCBASE=share/doc/freebsd/hu install clean
+....
+
+Dokumentations-Ports oder -Pakete können nach den Anweisungen in crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports ] aktualisiert werden. Beispielsweise aktualisiert das folgende Kommando die installierte ungarische Dokumentation mittels package:ports-mgmt/portmaster[] unter Verwendung von Paketen:
+
+[source,bash]
+....
+# portmaster -PP hu-freebsd-doc
+....
+
+[[current-stable]]
+== Einem Entwicklungszweig folgen
+
+FreeBSD besitzt zwei Entwicklungszweige: FreeBSD-CURRENT und FreeBSD-STABLE.
+
+Dieser Abschnitt beschreibt beide Zweige sowie deren Interessengruppen und erläutert, wie ein System auf dem aktuellen Stand eines jeweiligen Zweiges gehalten wird.
+
+[[current]]
+=== FreeBSD-CURRENT
+
+FreeBSD-CURRENT ist die allerneueste Entwicklung von FreeBSD. Benutzer von FreeBSD-CURRENT sollten über sehr gute technische Fähigkeiten verfügen. Benutzer mit weniger technischen Fähigkeiten sollten stattdessen FreeBSD-STABLE benutzen, wenn sie einem Entwicklungszweig folgen möchten.
+
+FreeBSD-CURRENT besteht aus den neuesten Quellen des FreeBSD-Systems und enthält Sachen, an denen gerade gearbeitet wird, experimentelle Änderungen und Übergangsmechanismen, die im nächsten offiziellen Release enthalten sein können oder nicht. Obwohl FreeBSD-CURRENT täglich von vielen Entwicklern gebaut wird, gibt es Zeiträume, in denen sich das System vielleicht nicht bauen lässt. Diese Probleme werden so schnell wie möglich behoben, aber ob Sie mit FreeBSD-CURRENT eine Katastrophe erleben oder neue Funktionen erhalten, kann von dem Zeitpunkt abhängen, an dem der Quelltext synchronisiert wurde.
+
+FreeBSD-CURRENT wird hauptsächlich für drei Interessengruppen zur Verfügung gestellt:
+
+. Mitglieder der FreeBSD Gemeinschaft, die aktiv an einem Teil des Quellbaums arbeiten.
+. Mitglieder der FreeBSD Gemeinschaft, die aktive Tester sind. Diese Personen sind bereit, Zeit in das Lösen von Problemen zu investieren, Vorschläge zu Änderungen oder der generellen Entwicklung von FreeBSD zu machen und Fehlerkorrekturen einzureichen.
+. Benutzer, die die Entwicklung im Auge behalten, oder die Quellen zu Referenzzwecken benutzen wollen. Diese Gruppe macht auch Vorschläge oder steuert Quellcode bei.
+
+FreeBSD-CURRENT ist _nicht_ der schnellste Weg, neue Funktionen vor dem offiziellen Release auszuprobieren. Bedenken Sie, dass neue Funktionen noch nicht im vollen Umfang getestet wurden und daher höchstwahrscheinlich Fehler enthalten. Es ist auch nicht der schnellste Weg, um an Fehlerbehebungen (engl. bug fixes) zu kommen. Jede Fehlerbehebung führt mit gleicher Wahrscheinlichkeit neue Fehler ein, mit der sie alte behebt. FreeBSD-CURRENT wird in keiner Weise "offiziell unterstützt".
+
+Um FreeBSD-CURRENT zu folgen:
+
+. Lesen Sie die Mailinglisten {freebsd-current} und {svn-src-head}. Dies ist _notwendig_, um die Kommentare über den akutellen Status des Systems und wichtige Mitteilungen zum aktuellen Zustand von FreeBSD-CURRENT zu erfahren.
++
+Die {svn-src-head} Mailingliste erfasst die Commit-Logs für jede Änderung und enthält alle relevanten Informationen zu möglichen Seiteneffekten.
++
+Um diese Listen zu abonnieren, besuchen Sie {mailman-lists-url}, klicken Sie auf die gewünschte Liste und folgen Sie den Anweisungen. Wenn Sie die Änderungen am gesamten Quellbaum verfolgen möchten, abonnieren Sie die {svn-src-all} Liste.
+. Synchronisieren Sie die Quellen für FreeBSD-CURRENT. In der Regel wird crossref:mirrors[svn,svnlite] benutzt, um die Quellen für -CURRENT aus dem Zweig `head` zu laden. Verwenden Sie dazu einen Subversion Spiegel aus crossref:mirrors[svn-mirrors,“Subversion Mirror Sites”].
+. Aufgrund der Größe des Repositories ist es empfehlenswert, nur die gewünschten Teilbäume auszuchecken. Wenn Sie die Quellen einsetzen und nicht nur darin lesen wollen, laden Sie sich die _kompletten_ Quellen von FreeBSD-CURRENT und nicht nur ausgesuchte Teile.
++
+Lesen Sie [.filename]#/usr/src/Makefile# sehr aufmerksam und folgen Sie den Anweisungen in <<makeworld>>. Lesen Sie die Mailingliste {freebsd-current} und [.filename]#/usr/src/UPDATING#, um über Änderungen im Installationsverfahren, die manchmal vor der Einführung eines neuen Releases notwendig sind, informiert zu sein.
+. Seien Sie aktiv! Benutzer von FreeBSD-CURRENT werden aufgefordert ihre Verbesserungsvorschläge oder Fehlerbehebungen einzureichen. Verbesserungsvorschläge, die Code enthalten, sind jederzeit herzlich willkommen.
+
+[[stable]]
+=== FreeBSD-STABLE
+
+FreeBSD-STABLE ist der Entwicklungszweig, auf dem Releases erstellt werden. Dieser Zweig ändert sich langsamer als FreeBSD-CURRENT und alle Änderungen sollten zuvor in FreeBSD-CURRENT ausgetestet sein. Beachten Sie, dass dies _immer noch_ ein Entwicklungszweig ist und daher zu jedem Zeitpunkt die Quellen von FreeBSD-STABLE verwendbar sein können oder eben auch nicht. FreeBSD-STABLE ist Teil des Entwicklungsprozesses und nicht für Endanwender gedacht. Benutzer, die nicht über die notwendigen Ressourcen zum Testen verfügen, sollten stattdessen ein aktuelles Release von FreeBSD benutzen.
+
+Wer daran interessiert ist den Entwicklungsprozess von FreeBSD zu verfolgen oder dazu beizutragen, insbesondere im Hinblick auf das nächste Release, der sollte es in Erwägung ziehen FreeBSD-STABLE zu benutzen.
+
+Obwohl wir versuchen sicherzustellen, dass sich FreeBSD-STABLE jederzeit übersetzen lässt und lauffähig ist, können wir dafür keine Garantie übernehmen. Auch wenn Neuentwicklungen in FreeBSD-CURRENT stattfinden, ist es jedoch so, dass mehr Leute FreeBSD-STABLE anstelle von FreeBSD-CURRENT benutzen und es daher unvermeidlich ist, dass Fehler und Grenzfälle erst in FreeBSD-STABLE auffallen. Aus diesen Gründen empfehlen wir, FreeBSD-STABLE _nicht_ blindlings zu benutzen.
+
+Um FreeBSD-STABLE zu folgen:
+
+. Lesen Sie die Mailingliste {freebsd-stable}, damit Sie über Abhängigkeiten beim Bau von FreeBSD-STABLE und Dinge, die besondere Aufmerksamkeit erfordern, informiert sind. Umstrittene Fehlerbehebungen oder Änderungen werden von den Entwicklern auf dieser Liste bekannt gegeben. Dies erlaubt es den Benutzern, Einwände gegen die vorgeschlagenen Änderungen vorzubringen.
++
+Abonnieren Sie die passende svn-Liste für den jeweiligen Zweig, den Sie verfolgen. Wenn Sie beispielsweise den Zweig 9-STABLE verfolgen, lesen Sie {svn-src-stable-9}. Diese Liste enthält zu jeder Änderung das Commit-Log, das Informationen zu möglichen Seiteneffekten enthält.
++
+Um diese Listen zu abonnieren, besuchen Sie die Seite {mailman-lists-url}. Klicken Sie auf die gewünschte Liste und folgen Sie den Anweisungen. Wenn Sie daran interessiert sind, Änderungen am gesamten Quellbaum zu verfolgen, abonnieren Sie {svn-src-all}.
+. Wenn Sie ein neues System installieren und dazu einen der monatlich aus FreeBSD-STABLE erzeugten Snapshots verwenden wollen, sollten Sie zuerst link:https://www.FreeBSD.org/snapshots[www.freebsd.org/snapshots"] auf aktuelle Informationen überprüfen. Alternativ können Sie auch das neueste FreeBSD-STABLE-Release von den crossref:mirrors[mirrors,FreeBSD Spiegeln] beziehen.
++
+Um ein bestehendes FreeBSD-System auf FreeBSD-STABLE zu aktualisieren, benutzen Sie crossref:mirrors[svn,svn] um den gewünschten Entwicklungs- oder Release-Zweig auszuchecken. Die Zweige, wie beispielsweise `stable/9`, sind unter link:https://www.FreeBSD.org/releng/[ www.freebsd.org/releng] aufgeführt.
+. Lesen Sie [.filename]#/usr/src/Makefile# sehr aufmerksam bevor Sie FreeBSD-STABLE aktualisieren und folgen Sie den Anweisungen in <<makeworld>>. Lesen Sie die Mailingliste {freebsd-stable} und [.filename]#/usr/src/UPDATING#, um über Änderungen im Installationsablauf, die manchmal vor der Einführung eines neuen Releases notwendig sind, informiert zu sein.
+
+[[makeworld]]
+== FreeBSD aus den Quellen aktualisieren
+
+Das Aktualisieren von FreeBSD aus den Quellen bietet im Vergleich zu binären Updates mehrere Vorteile. Der Quellcode kann mit Optionen gebaut werden, um die Vorteile von spezifischer Hardware zu nutzen. Teile des Basissystems können mit veränderten Einstellungen gebaut, oder falls nicht gewünscht, auch ganz ausgelassen werden. Dieser Prozess dauert zwar länger als die Aktualisierung mit binären Updates, ermöglicht aber eine vollständige Anpassung, um eine individuelle Version von FreeBSD zu erstellen.
+
+[[updating-src-quick-start]]
+=== Schnellstartanleitung
+
+Diese kurze Referenz zeigt die typischen Schritte um FreeBSD aus den Quellen zu aktualisieren. Spätere Abschnitte beschreiben die Prozedur im Detail.
+
+[.procedure]
+====
+* Aktualisierung und Bauprozess*
++
+[source,bash]
+....
+# svnlite update /usr/src <.>
+check /usr/src/UPDATING <.>
+# cd /usr/src <.>
+# make -j4 buildworld <.>
+# make -j4 kernel <.>
+# shutdown -r now <.>
+# cd /usr/src <.>
+# make installworld <.>
+# mergemaster -Ui <.>
+# shutdown -r now <.>
+....
+
+<.> Holt die neueste Version der Quellen. <<updating-src-obtaining-src>> enthält weitere Informationen zum Aktualisieren und Bauen der Quellen.
+
+<.> [.filename]#/usr/src/UPDATING# enthält Anweisungen für alle manuellen Schritte, die vor oder nach dem Bau der Quellen erforderlich sind.
+
+<.> Wechsel in das Bauverzeichnis.
+
+<.> Bau des Basissystems, mit Ausnahme des Kernels.
+
+<.> Bau und Installation des Kernels. Dieser Schritt ist gleichbedeutend mit `make buildkernel installkernel`.
+
+<.> Installation des Basissystems.
+
+<.> Aktualisierung und Zusammenführung der Konfigurationsdateien in [.filename]#/etc#.
+
+<.> Neustart des Systems mit dem neu erstellten Basissystem und Kernel.
+====
+
+[[updating-src-preparing]]
+=== Vorbereitungen zum Aktualisieren aus den Quellen
+
+Lesen Sie [.filename]#/usr/src/UPDATING#. Jeder manuelle Schritt, welcher vor oder nach der Aktualisierung erforderlich ist, wird in dieser Datei beschrieben.
+
+[[updating-src-obtaining-src]]
+=== Den Quellcode aktualisieren
+
+Der Quellcode von FreeBSD befindet sich in [.filename]#/usr/src/#. Die bevorzugte Methode zur Aktualisierung dieser Quellen ist über das Versionskontrollsystem Subversion. Sie sollten sicherstellen, dass der Quellcode unter Versionskontrolle steht:
+
+[source,bash]
+....
+# svnlite info /usr/src
+Path: /usr/src
+Working Copy Root Path: /usr/src
+...
+....
+
+Dies ist ein Hinweis darauf, dass [.filename]#/usr/src/# unter Versionskontrolle steht und mit man:svnlite[1] aktualisiert werden kann.
+
+[source,bash]
+....
+# svnlite update /usr/src
+....
+
+Dieser Vorgang kann einige Zeit in Anspruch nehmen, falls das Verzeichnis nicht zuletzt aktualisiert wurde. Nach Beendigung ist der Quellcode aktuell und der im nächsten Abschnitt beschriebene Bauprozess kann beginnen.
+
+[NOTE]
+====
+*Synchronisation der Quellen*
+
+Meldet die Ausgabe `'/usr/src' is not a working copy`, dann fehlen entweder Dateien, oder das Verzeichnis wurde mit einer anderen Methode aktualisiert. Ein erneuter Checkout der Quellen ist jetzt erforderlich.
+
+[[updating-src-obtaining-src-repopath]]
+.FreeBSD Versionen und Repository-Pfade
+[cols="10%,10%,80%", options="header"]
+|===
+| Ausgabe von uname -r
+| Repository-Pfad
+| Beschreibung
+
+|`_X.Y_-RELEASE`
+|`base/releng/__X.Y__`
+|Die Release-Version inklusive kritischer Sicherheits- und Bugfix-Patches. Dieser Zweig wird für die meisten Benutzer empfohlen.
+
+|`_X.Y_-STABLE`
+|`base/stable/__X__`
+|
+
+Die Release-Version und alle weitere Versionen auf diesem Zweig. _STABLE_ bezieht sich darauf, dass die Binärschnittstelle (ABI) sich nicht ändert, sodass Anwendungen welche auf älteren Versionen erstellt wurden weiterhin lauffähig sind. Eine Anwendung, welche für FreeBSD 10.1 übersetzt wurde, läuft auch auf FreeBSD 10-STABLE.
+
+STABLE-Zweige haben gelegentlich Fehler und Inkompatibilitäten, welche den Benutzer beeinträchtigen könnten. In der Regel werden diese Fehler aber zügig behoben.
+
+|`_X_-CURRENT`
+|`base/head/`
+|Die neueste unveröffentlichte Version von FreeBSD. Der CURRENT-Zweig kann viele Fehler und Inkompatibilitäten enthalten und wird daher nur für fortgeschrittene Benutzer empfohlen.
+|===
+
+Ermitteln Sie mit man:uname[1] die verwendete FreeBSD-Version:
+
+[source,bash]
+....
+# uname -r
+10.3-RELEASE
+....
+
+Basierend auf <<updating-src-obtaining-src-repopath>> ist `base/releng/10.3` der Repository-Pfad zur Aktualisierung von `10.3-RELEASE`. Dieser Pfad wird beim Auschecken der Quellen benutzt:
+
+[source,bash]
+....
+# mv /usr/src /usr/src.bak <.>
+# svnlite checkout https://svn.freebsd.org/base/releng/10.3 /usr/src <.>
+....
+
+<.> Verschiebt das alte Verzeichnis. Wenn es keine lokalen Änderungen in diesem Verzeichnis gibt, kann es gelöscht werden.
+
+<.> Der Pfad aus <<updating-src-obtaining-src-repopath>> wird der Repository-URL hinzugefügt. Der dritte Parameter ist das lokale Zielverzeichnis für den Quellcode.
+====
+
+[[updating-src-building]]
+=== Den Quellcode bauen
+
+Die Welt, also das gesamte Basissystem mit Ausnahme des Kernels, wird zuerst übersetzt, um aktuelle Werkzeuge zum Erstellen des Kernels bereitzustellen. Anschließend wird der Kernel gebaut:
+
+[source,bash]
+....
+# cd /usr/src
+# make buildworld
+# make buildkernel
+....
+
+Das Ergebnis wird in [.filename]#/usr/obj# abgelegt.
+
+Dies sind die grundlegenden Schritte. Weitere Optionen zur Kontrolle des Bauprozesses sind nachfolgend beschrieben.
+
+[[updating-src-building-clean-build]]
+==== Umgebung für den Bauprozess säubern
+
+Einige Versionen von FreeBSD hinterlassen bereits übersetzten Code im temporären Objektverzeichnis [.filename]#/usr/obj#. Dies kann nachfolgende Bauprozesse beschleunigen, da Code, der nicht verändert wurde, nicht neu übersetzt werden muss. Um eine saubere Umgebung für den Bauprozess zu schaffen, benutzen Sie `cleanworld` bevor Sie mit dem Bau beginnen.
+
+[source,bash]
+....
+# make cleanworld
+....
+
+[[updating-src-building-jobs]]
+==== Anzahl der Prozesse einstellen
+
+Eine höhere Anzahl an Prozessen kann die Geschwindigkeit auf Mehrprozessor-Systemen verbessern. Die Anzahl der Kerne lässt sich mit `sysctl hw.cpu` bestimmen. Prozessoren variieren ebenso, wie die verschiedenen Build-Systeme von FreeBSD. Sie müssen daher mehrere Versuche starten um zu sehen, wie die Anzahl der Prozesse die Geschwindigkeit beeinflusst. Als Ausgangspunkt können Sie die halbe bis doppelte Anzahl der Kerne als Wert probieren. Die Anzahl der Prozesse wird mit `-j` angegeben.
+
+[[updating-src-building-jobs-example]]
+.Die Anzahl der Prozesse erhöhen
+[example]
+====
+Das Basissystem und den Kernel mit vier Prozessen bauen:
+
+[source,bash]
+....
+# make -j4 buildworld buildkernel
+....
+
+====
+
+[[updating-src-building-only-kernel]]
+==== Nur den Kernel erstellen
+
+Wenn sich der Quellcode verändert hat, muss ein `buildworld` ausgeführt werden. Danach kann der Kernel mit `buildkernel` übersetzt werden. Um lediglich den Kernel zu übersetzen:
+
+[source,bash]
+....
+# cd /usr/src
+# make buildkernel
+....
+
+[[updating-src-building-custom-kernel]]
+==== Einen angepassten Kernel erstellen
+
+Der FreeBSD Standard-Kernel basiert auf einer _Konfigurationsdatei_ namens [.filename]#GENERIC#. Der [.filename]#GENERIC#-Kernel enthält die gängigsten Gerätetreiber und Optionen. Manchmal ist es aber sinnvoll oder gar notwendig, einen angepassten Kernel zu erstellen, um Gerätetreiber oder Optionen hinzuzufügen oder zu entfernen, um bestimmte Anforderungen zu erfüllen.
+
+Zum Beispiel könnte jemand, der einen kleinen eingebetteten Rechner mit eingeschränktem RAM entwickelt, nicht benötigte Gerätetreiber oder Optionen entfernen, um den Kernel etwas kleiner zu machen.
+
+Die Kernelkonfigurationsdateien befinden sich in [.filename]#/usr/src/sys/arch/conf/#, wobei _arch_ die Ausgabe von `uname -m` ist. Auf den meisten Rechnern ist dies `amd64`, demnach befinden sich die Konfigurationsdateien in [.filename]#/usr/src/sys/amd64/conf/#.
+
+[TIP]
+====
+
+[.filename]#/usr/src# kann aus Versehen gelöscht oder neu erstellt werden. Daher ist es vorzuziehen, angepasste Kernelkonfigurationsdateien in einen separaten Verzeichnis, wie bspw. [.filename]#/root# zu speichern und diese in das [.filename]#conf#-Verzeichnis zu verlinken. Wenn dieses Verzeichnis gelöscht oder überschrieben wird, kann die Kernelkonfigurationsdatei einfach neu verknüpft werden.
+====
+
+Eine benutzerdefinierte Konfigurationsdatei kann durch Kopieren der [.filename]#GENERIC#-Konfigurationsdatei erstellt werden. In diesem Beispiel ist der neue Kernel für einen Speicherserver, heißt also [.filename]#STORAGESERVER#:
+
+[source,bash]
+....
+# cp /usr/src/sys/amd64/conf/GENERIC /root/STORAGESERVER
+# cd /usr/src/sys/amd64/conf
+# ln -s /root/STORAGESERVER .
+....
+
+Jetzt kann [.filename]#/root/STORAGESERVER# bearbeitet werden. Die Manualpage man:config[5] zeigt, wie Treiber und Optionen hinzugefügt oder entfernt werden.
+
+Der angepasste Kernel wird mit der Variablen `KERNCONF`, die auf die Kernelkonfigurationsdatei verweist, übersetzt:
+
+[source,bash]
+....
+# make buildkernel KERNCONF=STORAGESERVER
+....
+
+[[updating-src-installing]]
+=== Installation des Codes
+
+Nachdem die Schritte `buildworld` und `buildkernel` abgeschlossen sind, wird der neue Kernel und die Welt installiert:
+
+[source,bash]
+....
+# cd /usr/src
+# make installkernel
+# shutdown -r now
+# cd /usr/src
+# make installworld
+# shutdown -r now
+....
+
+Wenn ein angepasster Kernel erstellt wurde, muss zusätzlich die Variable `KERNCONF` gesetzt werden:
+
+[source,bash]
+....
+# cd /usr/src
+# make installkernel KERNCONF=STORAGESERVER
+# shutdown -r now
+# cd /usr/src
+# make installworld
+# shutdown -r now
+....
+
+[[updating-src-completing]]
+=== Die Aktualisierung abschließen
+
+Ein paar abschließende Aufgaben beenden die Aktualisierung. Alle Konfigurationsdateien werden mit den neuen Versionen zusammengeführt, veraltete Bibliotheken werden entfernt, dann wird das System neu gestartet.
+
+[[updating-src-completing-merge-mergemaster]]
+==== Konfigurationsdateien mit man:mergemaster[8] zusammenführen
+
+man:mergemaster[8] bietet einen einfachen Weg, um die Konfigurationsdateien des Systems mit den neuen Versionen dieser Dateien zusammenzuführen.
+
+Mit der Option `-Ui` aktualisiert man:mergemaster[8] automatisch Dateien, welche nicht vom Benutzer verändert wurden und installiert neue Dateien, die noch nicht vorhanden sind:
+
+[source,bash]
+....
+# mergemaster -Ui
+....
+
+Wenn eine Datei manuell zusammengeführt werden muss, erlaubt eine interaktive Anzeige, zu wählen, welche Teile der Dateien beibehalten werden. Die Manualpage man:mergemaster[8] enthält weitere Informationen.
+
+[[updating-src-completing-check-old]]
+==== Veraltete Dateien und Bibliotheken entfernen
+
+Nach einer Aktualisierung können sich immer noch veraltete Dateien und Verzeichnisse im System befinden. Diese lassen sich mit folgendem Kommando auflisten:
+
+[source,bash]
+....
+# make check-old
+....
+
+und löschen:
+
+[source,bash]
+....
+# make delete-old
+....
+
+Einige veraltete Bibliotheken können ebenfalls noch vorhanden sein. Diese werden mit folgenden Kommando aufgelistet:
+
+[source,bash]
+....
+# make check-old-libs
+....
+
+und wie folgt gelöscht:
+
+[source,bash]
+....
+# make delete-old-libs
+....
+
+Programme, die diese alten Bibliotheken noch verwenden, werden nicht mehr funktionieren, wenn die Bibliothek gelöscht wurde. Diese Programme müssen nach dem Löschen der alten Bibliotheken neu gebaut oder ersetzt werden.
+
+[TIP]
+====
+
+Wenn Sie sich sicher sind, dass alle Dateien und Verzeichnisse gelöscht werden können, dann setzen Sie `BATCH_DELETE_OLD_FILES`, um nicht jede einzelne Datei mit kbd:[y] und kbd:[Enter] bestätigen zu müssen. Zum Beispiel:
+
+[source,bash]
+....
+# make BATCH_DELETE_OLD_FILES=yes delete-old-libs
+....
+
+====
+
+[[updating-src-completing-restart]]
+==== Neustart des Systems
+
+Zum Abschluss der Aktualisierung muss das System neu gestartet werden, damit alle Änderungen wirksam werden:
+
+[source,bash]
+....
+# shutdown -r now
+....
+
+[[small-lan]]
+== Installation mehrerer Maschinen
+
+Wenn Sie mehrere Maschinen auf dem gleichen Stand halten wollen, ist es eine Verschwendung von Ressourcen, die Quellen auf jeder Maschine vorzuhalten und zu übersetzen. Die Lösung dazu ist, eine Maschine den Großteil der Arbeit durchführen zu lassen und den anderen Maschinen das Ergebnis mit NFS zur Verfügung zu stellen. Dieser Abschnitt zeigt eine Methode dies zu tun. Weitere Informationen zu NFS finden Sie in crossref:network-servers[network-nfs,"Network File System (NFS)"].
+
+Stellen Sie zuerst eine Liste der Maschinen zusammen, die auf demselben Stand sein sollen. Wir nennen diese Maschinen die _Baugruppe_. Jede dieser Maschinen kann mit einem eigenen Kernel laufen, doch sind die Programme des Userlands auf allen Maschinen gleich. Wählen Sie aus der Baugruppe eine Maschine aus, auf der der Bau durchgeführt wird, den _Bau-Master_. Dies sollte eine Maschine sein, die über die nötigen CPU-Ressourcen für `make buildworld` und `make installworld` verfügt.
+
+Sie brauchen auch eine _Testmaschine_, auf der Sie die Updates testen, bevor Sie sie in Produktion installieren. Dies _muss_ eine Maschine sein, die über einen längeren Zeitraum nicht zur Verfügung stehen kann.
+
+Alle Maschinen der Baugruppe müssen [.filename]#/usr/obj# und [.filename]#/usr/src# über NFS vom Bau-Master an gleichem Ort einhängen. Wenn Sie mehrere Baugruppen haben, sollte sich [.filename]#/usr/src# auf einem Bau-Master befinden und über NFS für den Rest der Maschinen zur Verfügung gestellt werden.
+
+Stellen Sie sicher, dass [.filename]#/etc/make.conf# und [.filename]#/etc/src.conf# auf allen Maschinen einer Baugruppe mit der Datei des Bau-Masters übereinstimmt. Der Bau-Master muss jeden Teil des Systems bauen, den irgendeine Maschine der Baugruppe benötigt. Auf dem Bau-Master müssen in [.filename]#/etc/make.conf# alle zu bauenden Kernel mit der Variablen `KERNCONF` bekannt gegeben werden. Geben Sie dabei den Kernel des Bau-Masters zuerst an. Für jeden zu bauenden Kernel muss auf dem Bau-Master die entsprechende Konfigurationsdatei unter [.filename]#/usr/src/sys/arch/conf# abgelegt werden.
+
+Bauen Sie auf dem Bau-Master, wie in <<makeworld>> beschrieben, den Kernel und die Welt, installieren Sie aber nichts. Wechseln Sie auf die Testmaschine und installieren Sie den gerade gebauten Kernel. Hängen Sie auf der Testmaschine [.filename]#/usr/src# und [.filename]#/usr/obj# über NFS ein. Geben Sie dann `shutdown now` ein, um in den Single-User-Modus zu gelangen, von wo aus Sie den neuen Kernel und das System installieren. Lassen Sie anschließend `mergemaster` laufen. Wenn Sie fertig sind, booten Sie die Maschine wieder in den Mehrbenutzermodus.
+
+Nachdem Sie sichergestellt haben, dass die Testmaschine einwandfrei funktioniert, wiederholen Sie diese Prozedur für jede Maschine in der Baugruppe.
+
+Dasselbe Verfahren können Sie auch für die Ports-Sammlung anwenden. Zuerst müssen alle Maschinen einer Baugruppe [.filename]#/usr/ports# über NFS zur Verfügung gestellt bekommen. Setzen Sie ein Verzeichnis für die Quellen auf, das sich alle Maschinen teilen. Dieses Verzeichnis können Sie in [.filename]#/etc/make.conf# mit der Variablen `DISTDIR` angeben. Das Verzeichnis sollte für den Benutzer beschreibbar sein, auf den der Benutzer `root` vom NFS Subsystem abgebildet wird. Jede Maschine sollte noch `WRKDIRPREFIX` auf ein lokales Bauverzeichnis setzen. Wenn Sie vorhaben, Pakete zu bauen und zu verteilen, sollten Sie `PACKAGES` auf ein Verzeichnis mit den gleichen Eigenschaften wie `DISTDIR` setzen.
diff --git a/documentation/content/de/books/handbook/desktop/_index.adoc b/documentation/content/de/books/handbook/desktop/_index.adoc
new file mode 100644
index 0000000000..e888626549
--- /dev/null
+++ b/documentation/content/de/books/handbook/desktop/_index.adoc
@@ -0,0 +1,575 @@
+---
+title: Kapitel 6. Desktop-Anwendungen
+part: Teil II. Oft benutzte Funktionen
+prev: books/handbook/partii
+next: books/handbook/multimedia
+---
+
+[[desktop]]
+= Desktop-Anwendungen
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 6
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/desktop/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/desktop/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/desktop/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[desktop-synopsis]]
+== Übersicht
+
+Obwohl FreeBSD wegen seiner Leistung und Stabilität vor allem auf Serversystemen sehr beliebt ist, so ist es auch für den täglichen Einsatz als Desktop geeignet. Mit über {numports} Anwendungen, die als Pakete oder Ports vorliegen, ist es leicht einen individuellen Desktop zu bauen, auf dem eine Vielzahl von Desktop-Anwendungen laufen. Dieses Kapitel zeigt, wie Sie die zahlreichen Desktop-Anwendungen, wie Web-Browser, Office-Pakete, Dokumentbetrachter und Finanzsoftware, installieren können.
+
+[NOTE]
+====
+Benutzer die es vorziehen eine vorkonfigurierte Desktop-Version von FreeBSD zu installieren, anstatt das System von Grund auf zu konfigurieren, sollten sich https://www.furybsd.org[FuryBSD], https://ghostbsd.org[GhostBSD] oder https://www.midnightbsd.org[MidnightBSD] ansehen.
+====
+
+Bevor Sie dieses Kapitel lesen, sollten Sie wissen:
+
+* wie zusätzliche Anwendungen als Paket oder aus der Ports-Sammlung installiert werden. Dies wird in crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports] beschrieben.
+* wie X und ein Window-Manager installiert wird. Dies wird in crossref:x11[x11,Das X-Window-System] beschrieben.
+
+Informationen zur Konfiguration von Multimedia-Anwendungen finden Sie in crossref:multimedia[multimedia,Multimedia].
+
+[[desktop-browsers]]
+== Browser
+
+FreeBSD besitzt keinen vorinstallierten Browser, stattdessen enthält das https://www.FreeBSD.org/ports/[www]-Verzeichnis der Ports-Sammlung viele Browser, die als Paket oder aus der Ports-Sammlung installiert werden können.
+
+Die Desktop-Umgebungen KDE und GNOME verfügen über eigene HTML-Browser. Weitere Informationen zur Einrichtung dieser Umgebungen finden Sie in crossref:x11[x11-wm,“Grafische Oberflächen”].
+
+Besonders schlanke Browser sind package:www/dillo2[], package:www/links[] und package:www/w3m[].
+
+Dieser Abschnitt demonstriert, wie die folgenden gängigen Webbrowser installiert werden, sowie den Ressourcenbedarf, den Installationsaufwand beim Übersetzen des Ports, oder ob die Anwendung wichtige Abhängigkeiten benötigt.
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Anwendung
+| Ressourcenbedarf
+| Installationsaufwand aus den Ports
+| Anmerkungen
+
+|Firefox
+|mittel
+|hoch
+|FreeBSD, Linux(R) und lokalisierte Versionen sind verfügbar
+
+|Konqueror
+|mittel
+|hoch
+|Benötigt KDE-Biliotheken
+
+|Chromium
+|mittel
+|hoch
+|Benötigt Gtk+
+|===
+
+=== Firefox
+
+Firefox ist ein Open-Source Browser. Er bietet eine dem HTML-Standard konforme Anzeige, Browserfenster als Tabs, Blockierung von Pop-up-Fenstern, Erweiterungen, verbesserte Sicherheit und mehr. Firefox basiert auf der Mozilla Codebasis.
+
+Installieren Sie das Paket der aktuellen Release-Version von Firefox:
+
+[source,bash]
+....
+# pkg install firefox
+....
+
+Um stattdessen die Extended Support Release (ESR) Version zu installieren, benutzen Sie:
+
+[source,bash]
+....
+# pkg install firefox-esr
+....
+
+Alternativ kann auch die Ports-Sammlung verwendet werden, um die gewünschte Version von Firefox aus dem Quellcode zu installieren. Dieses Beispiel baut package:www/firefox[], wobei sich `firefox` durch die ESR oder die lokalisierte Version ersetzen lässt.
+
+[source,bash]
+....
+# cd /usr/ports/www/firefox
+# make install clean
+....
+
+=== Konqueror
+
+Konqueror ist mehr als nur ein Webbrowser, da es ebenfalls Dateimanager und Multimedia-Betrachter ist. Es unterstützt sowohl WebKit als auch sein eigenes KHTML. WebKit wird von vielen modernen Browsern verwendet, einschließlich Chromium.
+
+Das Konqueror-Paket wird wie folgt installiert:
+
+[source,bash]
+....
+# pkg install konqueror
+....
+
+Alternativ können Sie den Port installieren:
+
+[source,bash]
+....
+# cd /usr/ports/www/konqueror
+# make install clean
+....
+
+=== Chromium
+
+Chromium ist ein quelloffenes Browserprojekt mit dem Ziel ein sicheres, schnelleres und stabileres Surferlebnis im Web zu ermöglichen. Chromium ermöglicht surfen mit Tabs, Blockieren von Pop-Ups, Erweiterungen und vieles mehr. Chromium ist das Open Source Projekt, welches auf dem Google Chrome Webbrowser basiert.
+
+Chromium kann als Paket durch die Eingabe des folgenden Befehls installiert werden:
+
+[source,bash]
+....
+# pkg install chromium
+....
+
+Als Alternative kann Chromium aus dem Quellcode durch die Ports Collection übersetzt werden:
+
+[source,bash]
+....
+# cd /usr/ports/www/chromium
+# make install clean
+....
+
+[NOTE]
+====
+Die ausführbare Datei für Chromium ist [.filename]#/usr/local/bin/chrome# und nicht [.filename]#/usr/local/bin/chromium#.
+====
+
+[[desktop-productivity]]
+== Büroanwendungen
+
+Neue Benutzer suchen oft ein komplettes Office-Paket oder eine leicht zu bedienende Textverarbeitung. Einige crossref:x11[x11-wm,graphische Oberflächen] wie KDE enthalten zwar ein Office-Paket, diese werden unter FreeBSD jedoch nicht standardmäßig installiert. Unabhängig von der installierten graphischen Oberfläche können diverse Office-Pakete jederzeit installiert werden.
+
+Dieser Abschnitt demonstriert, wie die folgenden gängigen Büroanwendungen installiert werden, sowie den Ressourcenbedarf, den Installationsaufwand beim Übersetzen des Ports, oder ob die Anwendung wichtige Abhängigkeiten benötigt.
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Anwendung
+| Ressourcenbedarf
+| Installationsaufwand aus den Ports
+| wichtige Abhängigkeiten
+
+|Calligra
+|niedrig
+|hoch
+|KDE
+
+|AbiWord
+|niedrig
+|niedrig
+|Gtk+ oder GNOME
+
+|The Gimp
+|niedrig
+|hoch
+|Gtk+
+
+|Apache OpenOffice
+|hoch
+|enorm
+|JDK(TM) und Mozilla
+
+|LibreOffice
+|etwas hoch
+|enorm
+|Gtk+, KDE/ GNOME oder JDK(TM)
+|===
+
+=== Calligra
+
+Die KDE-Gemeinschaft stellt ein Office-Paket bereit, das auch separat von KDE eingesetzt werden kann. Calligra umfasst Standardkomponenten, die auch in anderen Office-Paketen enthalten sind. Words ist die Textverarbeitung, Sheets die Tabellenkalkulation, mit Stage werden Präsentationen erstellt und Karbon ist ein Zeichenprogramm.
+
+In FreeBSD kann package:editors/calligra[] als Paket oder Port installiert werden. Um das Paket zu installieren, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg install calligra
+....
+
+Wenn das Paket nicht verfügbar ist, benutzen Sie stattdessen die Ports-Sammlung:
+
+[source,bash]
+....
+# cd /usr/ports/editors/calligra
+# make install clean
+....
+
+=== AbiWord
+
+AbiWord ist eine freie Textverarbeitung, die dem Erscheinungsbild von Microsoft(R) Word ähnlich ist. Das Programm ist schnell, besitzt viele Funktionen und ist benutzerfreundlich.
+
+AbiWord kann viele Dateiformate importieren oder exportieren, unter anderem auch propietäre wie Microsoft(R) [.filename]#.rtf#.
+
+Das AbiWord-Paket installieren Sie wie folgt:
+
+[source,bash]
+....
+# pkg install abiword
+....
+
+Sollte das Paket nicht zur Verfügung stehen, kann es über die Ports-Sammlung installiert werden:
+
+[source,bash]
+....
+# cd /usr/ports/editors/abiword
+# make install clean
+....
+
+=== The GIMP
+
+The GIMP ist ein ausgereiftes Bildverarbeitungsprogramm mit dem Bilder erstellt oder retuschiert werden können. Es kann sowohl als einfaches Zeichenprogramm oder zum retuschieren von Fotografien benutzt werden. Das Programm besitzt eine eingebaute Skriptsprache und es existieren sehr viele Plugins. The GIMP kann zahlreiche Formate lesen und speichern und stellt Schnittstellen zu Scannern und Tablets zur Verfügung.
+
+Um das Paket zu installieren, geben Sie ein:
+
+[source,bash]
+....
+# pkg install gimp
+....
+
+Benutzen Sie alternativ die Ports-Sammlung:
+
+[source,bash]
+....
+# cd /usr/ports/graphics/gimp
+# make install clean
+....
+
+Die Kategorie _graphics_ (https://www.FreeBSD.org/ports/graphics.html[freebsd.org/ports/graphics.html]) der Ports-Sammlung enthält für The Gimp verschiedene Plugins, Hilfedateien und Handbücher.
+
+=== Apache OpenOffice
+
+Apache OpenOffice ist eine Open Source Büroanwendung, die unter Leitung der Apache Software Foundation weiterentwickelt wird. Es enthält die typischen Anwendungen eines Office-Pakets: Textverarbeitung, Tabellenkalkulation, Präsentation und ein Zeichenprogramm. Die Bedienung gleicht anderen Office-Paketen und das Programm kann zahlreiche Dateiformate importieren und exportieren. Es gibt lokalisierte Versionen mit angepassten Menüs, Rechtschreibkontrollen und Wörterbüchern.
+
+Die Textverarbeitung von Apache OpenOffice speichert Dateien im XML-Format. Dadurch wird die Verwendbarkeit der Dateien auf anderen Systemen erhöht und die Handhabung der Daten vereinfacht. Die Tabellenkalkulation besitzt eine Makrosprache und eine Schnittstelle zu Datenbanken. Apache OpenOffice läuft stabil auf Windows(R), Solaris(TM), Linux(R), FreeBSD und Mac OS(R) X. Weitere Informationen über Apache OpenOffice finden Sie auf http://www.openoffice.org/[openoffice.org]. Spezifische Informationen für FreeBSD finden Sie auf http://porting.openoffice.org/freebsd/[porting.openoffice.org/freebsd/].
+
+Apache OpenOffice installieren Sie wie folgt:
+
+[source,bash]
+....
+# pkg install apache-openoffice
+....
+
+Nachdem das Paket installiert ist, geben Sie folgenden ein, um Apache OpenOffice zu starten:
+
+[source,bash]
+....
+% openoffice-X.Y.Z
+....
+
+wobei _X.Y.Z_ die Versionsnummer von Apache OpenOffice darstellt. Nach dem ersten Start werden einige Fragen gestellt. Außerdem wird im Heimatverzeichnis des Benutzers ein Verzeichnis [.filename]#.openoffice.org# angelegt.
+
+Falls das gewünschte Apache OpenOffice-Paket nicht verfügbar ist, kann immer noch der Port übersetzt werden. Es erfordert jedoch eine Menge Plattenplatz und ziemlich viel Zeit um die Quellen zu übersetzten.
+
+[source,bash]
+....
+# cd /usr/ports/editors/openoffice-4
+# make install clean
+....
+
+[NOTE]
+====
+Um eine lokalisierte Version zu bauen, ersetzen Sie den letzten Befehl durch:
+
+[source,bash]
+....
+# make LOCALIZED_LANG=Ihre_Sprache install clean
+....
+
+Ersetzen Sie _Ihre_Sprache_ durch den korrekten ISO-Code. Eine Liste der unterstützten Codes steht in [.filename]#files/Makefile.localized#, die sich im Portsverzeichnis befindet.
+====
+
+=== LibreOffice
+
+LibreOffice ist ein frei verfügbares Office-Paket, welches von http://www.documentfoundation.org/[documentfoundation.org] entwickelt wird. Es mit anderen großen Office-Paketen kompatibel und für eine Vielzahl von Plattformen erhältlich. Es ist ein Fork von Apache OpenOffice unter neuem Namen, das alle Anwendungen in einem kompletten Office-Paket enthält: Textverarbeitung, Tabellenkalkulation, Präsentationsmanager, Zeichenprogramm, Datenbankmanagementprogramm und ein Werkzeug zum Erstellen und Bearbeiten von mathematischen Formeln. Das Programm steht in verschiedenen Sprachen zur Verfügung, und die Internationalisierung wurde auf die Oberfläche, Rechtschreibkorrektur und die Wörterbücher ausgeweitet.
+
+Das Textverarbeitungsprogramm von LibreOffice benutzt ein natives XML-Dateiformat für erhöhte Portabilität und Flexibilität. Die Tabellenkalkulation enthält eine Makrosprache und kann mit externen Datenbanken Verbindungen herstellen. LibreOffice ist stabil und läuft nativ auf Windows(R), Linux(R), FreeBSD und Mac OS(R) X. Weitere Informationen zu LibreOffice finden Sie unter http://www.libreoffice.org/[libreoffice.org].
+
+Um die englische Version von LibreOffice als Paket zu installieren, geben Sie folgenden Befehl ein:
+
+[source,bash]
+....
+# pkg install libreoffice
+....
+
+Die Kategorie _editors_ (https://www.FreeBSD.org/ports/[freebsd.org/ports/]) der Ports-Sammlung enthält viele Lokalisierungen für LibreOffice. Wenn Sie ein lokalisiertes Paket installieren, ersetzen Sie `libreoffice` durch den Namen des lokalisierten Pakets.
+
+Wenn das Paket installiert ist, geben Sie folgendes Kommando ein, um LibreOffice zu starten:
+
+[source,bash]
+....
+% libreoffice
+....
+
+Während des ersten Starts werden einige Fragen gestellt. Außerdem wird im Heimatverzeichinis des Benutzers ein Verzeichnis [.filename]#.libreoffice# angelegt.
+
+Falls das gewünschte LibreOffice-Paket nicht verfügbar ist, kann immer noch der Port übersetzt werden. Es erfordert jedoch eine Menge Plattenplatz und ziemlich viel Zeit um die Quellen zu übersetzten. Dieses Beispiel übersetzt die englische Version:
+
+[source,bash]
+....
+# cd /usr/ports/editors/libreoffice
+# make install clean
+....
+
+[NOTE]
+====
+Um eine lokalisierte Version zu bauen, wechseln Sie mit `cd` in das Portverzeichnis der gewünschten Sprache. Unterstützte Sprachen finden Sie in der Kategorie _editors_ (https://www.FreeBSD.org/ports/[ freebsd.org/ports/]) der Ports-Sammlung.
+====
+
+[[desktop-viewers]]
+== Anzeigen von Dokumenten
+
+Einige neuere Dokumentformate, die sich aktuell großer Beliebtheit erfreuen, können Sie sich mit den im Basissystem enthaltenen Programmen möglicherweise nicht ansehen. Dieser Abschnitt zeigt, wie Sie die folgenden Dokumentbetrachter installieren können:
+
+Die nachstehenden Anwendungen werden behandelt:
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Anwendung
+| Ressourcenbedarf
+| Installationsaufwand aus den Ports
+| wichtige Abhängigkeiten
+
+|Xpdf
+|niedrig
+|niedrig
+|FreeType
+
+|gv
+|niedrig
+|niedrig
+|Xaw3d
+
+|Geeqie
+|niedrig
+|niedrig
+|Gtk+ oder GNOME
+
+|ePDFView
+|niedrig
+|niedrig
+|Gtk+
+
+|Okular
+|niedrig
+|hoch
+|KDE
+|===
+
+=== Xpdf
+
+Für Benutzer, die einen schnellen PDF-Betrachter bevorzugen, bietet Xpdf eine schlanke und effiziente Alternative, die wenig Ressourcen benötigt. Da das Programm die Standard X-Zeichensätze benutzt, ist es nicht auf andere Toolkits angewiesen.
+
+Um das Xpdf-Paket zu installieren, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg install xpdf
+....
+
+Wenn das Paket nicht verfügbar ist, benutzen Sie die Ports-Sammlung:
+
+[source,bash]
+....
+# cd /usr/ports/graphics/xpdf
+# make install clean
+....
+
+Starten Sie nach der Installation `xpdf` und aktivieren Sie das Menü mit der rechten Maustaste.
+
+=== gv
+
+gv kann PostScript(R)- und PDF-Dokumente anzeigen. Es stammt von ghostview ab, hat aber wegen der Xaw3d-Bibliothek eine schönere Benutzeroberfläche. gv besitzt viele konfigurierbare Funktionen, wie z. B. Ausrichtung, Papiergröße, Skalierung und Kantenglättung (Anti-Aliasing). Fast jede Operation kann sowohl mit der Tastatur als auch mit der Maus durchgeführt werden.
+
+Installieren Sie das gv-Paket wie folgt:
+
+[source,bash]
+....
+# pkg install gv
+....
+
+Benutzen Sie die Ports-Sammlung, wenn das Paket nicht zur Verfügung steht:
+
+[source,bash]
+....
+# cd /usr/ports/print/gv
+# make install clean
+....
+
+=== Geeqie
+
+Geeqie ist ein Fork des nicht mehr betreuten GQview Projekts, mit dem Ziel die Entwicklung weiter voranzutreiben und bestehende Fehlerkorrekturen zu integrieren. Mit Geeqie lassen sich Bilder verwalten. Es kann unter anderem Bilder anzeigen, einen externen Editor starten und eine Vorschau (thumbnail) erzeugen. Zudem beherrscht Geeqie einen Diashow-Modus und einige grundlegende Dateioperationen, was die Verwaltung von Bildern und das auffinden von doppelten Dateien erleichtert. Geeqie unterstützt Vollbild-Ansicht und Internationalisierung.
+
+Um das Geeqie-Paket zu installieren, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg install geeqie
+....
+
+Wenn das Paket nicht verfügbar ist, benutzen Sie die Ports-Sammlung:
+
+[source,bash]
+....
+# cd /usr/ports/graphics/geeqie
+# make install clean
+....
+
+=== ePDFView
+
+ePDFView ist ein leichtgewichtiger PDF-Betrachter, der nur die Gtk+- und Poppler-Bibliotheken benötigt. Es befindet sich derzeit noch in Entwicklung, kann aber bereits die meisten PDF-Dateien (auch verschlüsselte) öffnen, speichern und über CUPS drucken.
+
+Um das Paket ePDFView zu installieren, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg install epdfview
+....
+
+Benutzen Sie die Ports-Sammlung, falls das Paket nicht verfügbar ist:
+
+[source,bash]
+....
+# cd /usr/ports/graphics/epdfview
+# make install clean
+....
+
+=== Okular
+
+Okular ist ein universeller Dokumentbetrachter der auf KPDF für KDE basiert. Es kann die meisten Formate öffnen, einschließlich PDF, PostScript(R), DjVu, CHM, XPS und ePub.
+
+Um das Paket Okular zu installieren, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg install okular
+....
+
+Benutzen Sie die Ports-Sammlung, falls das Paket nicht verfügbar ist:
+
+[source,bash]
+....
+# cd /usr/ports/graphics/okular
+# make install clean
+....
+
+[[desktop-finance]]
+== Finanzsoftware
+
+Zur Verwaltung der persönlichen Finanzen können einige leistungsfähige und einfach zu bedienende Anwendungen installiert werden. Einige von ihnen unterstützen verbreitete Formate, darunter Dateiformate, die von Quicken und Excel verwendet werden.
+
+Dieser Abschnitt behandelt die folgenden Anwendungen:
+
+[.informaltable]
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Anwendung
+| Ressourcenbedarf
+| Installationsaufwand aus den Ports
+| wichtige Abhängigkeiten
+
+|GnuCash
+|niedrig
+|hoch
+|GNOME
+
+|Gnumeric
+|niedrig
+|hoch
+|GNOME
+
+|KMyMoney
+|niedrig
+|hoch
+|KDE
+|===
+
+=== GnuCash
+
+GnuCash ist Teil des GNOME-Projekts, mit dem Ziel, leicht zu bedienende und leistungsfähige Anwendungen bereitzustellen. Mit GnuCash können Einnahmen und Ausgaben, Bankkonten und Wertpapiere verwaltet werden. Das Programm ist leicht zu bedienen und genügt dennoch hohen Ansprüchen.
+
+GnuCash stellt ein Register, ähnlich dem in einem Scheckheft und ein hierarchisches System von Konten zur Verfügung. Eine Transaktion kann in einzelne Teile aufgespaltet werden. GnuCash kann Quicken-Dateien (QIF) importieren und einbinden. Weiterhin unterstützt das Programm die meisten internationalen Formate für Zeitangaben und Währungen. Die Bedienung des Programms kann durch zahlreiche Tastenkombinationen und dem automatischen Vervollständigen von Eingaben beschleunigt werden.
+
+Das GnuCash-Paket installieren Sie wie folgt:
+
+[source,bash]
+....
+# pkg install gnucash
+....
+
+Wenn das Paket nicht zur Verfügung steht, benutzen Sie die Ports-Sammlung:
+
+[source,bash]
+....
+# cd /usr/ports/finance/gnucash
+# make install clean
+....
+
+=== Gnumeric
+
+Gnumeric ist eine Tabellenkalkulation, die von der GNOME-Gemeinschaft entwickelt wird. Das Programm kann Eingaben anhand des Zellenformats oder einer Folge von Eingaben vervollständigen. Dateien verbreiteter Formate, wie die von Excel, Lotus 1-2-3 oder Quattro Pro lassen sich importieren. Es besitzt viele eingebaute Funktionen und Zellenformate, darunter die üblichen wie Zahl, Währung, Datum, Zeit, und viele weitere.
+
+Installieren Sie das Gnumeric-Paket mit folgendem Kommando:
+
+[source,bash]
+....
+# pkg install gnumeric
+....
+
+Wenn das Paket nicht zur Verfügung steht, benutzen Sie die Ports-Sammlung:
+
+[source,bash]
+....
+# cd /usr/ports/math/gnumeric
+# make install clean
+....
+
+=== KMyMoney
+
+KMyMoney ist ein Programm zur Verwaltung der persönlichen Finanzen, das von der KDE-Gemeinschaft entwickelt wird. KMyMoney hat das Ziel, wichtige Funktionen zu bieten, die auch von kommerziellen Programmen zur Verwaltung der persönlichen Finanzen unterstützt werden. Zudem zählen eine einfache Bedienung sowie korrekte doppelte Buchführung zu den herausragenden Fähigkeiten dieses Programms. KMyMoney unterstützt den Import von Datendateien im Format Quicken (QIF), kann Investionen verfolgen, unterstützt verschiedene Währungen und bietet umfangreiche Reportmöglichkeiten.
+
+Um das Paket KMyMoney zu installieren, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg install kmymoney-kde4
+....
+
+Sollte das Paket nicht verfügbar sein, benutzen Sie die Ports-Sammlung:
+
+[source,bash]
+....
+# cd /usr/ports/finance/kmymoney2-kde4
+# make install clean
+....
diff --git a/documentation/content/de/books/handbook/disks/_index.adoc b/documentation/content/de/books/handbook/disks/_index.adoc
new file mode 100644
index 0000000000..d99c5bcbfd
--- /dev/null
+++ b/documentation/content/de/books/handbook/disks/_index.adoc
@@ -0,0 +1,2169 @@
+---
+title: Kapitel 17. Speichermedien
+part: Teil III. Systemadministration
+prev: books/handbook/audit
+next: books/handbook/geom
+---
+
+[[disks]]
+= Speichermedien
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 17
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/disks/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/disks/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/disks/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[disks-synopsis]]
+== Übersicht
+
+Dieses Kapitel behandelt die Benutzung von Laufwerken unter FreeBSD. Hierzu zählen SCSI- und IDE-Geräte, CD- und DVD-Medien, speicherbasierte Laufwerke und USB-Geräte.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie Folgendes wissen:
+
+* Wie Sie zusätzliche Laufwerke zu einem FreeBSD-System hinzufügen.
+* Wie Sie unter FreeBSD die Partition einer Festplatte vergrößern.
+* Wie Sie FreeBSD zur Verwendung von USB-Speichermedien konfigurieren.
+* Wie Sie CD- und DVD-Medien unter FreeBSD benutzen.
+* Wie Sie die unter FreeBSD erhältlichen Backup-Programme benutzen.
+* Wie Sie RAM-Disks einrichten.
+* Was Dateisystem-Schnappschüsse sind und wie sie effizient eingesetzt werden.
+* Wie Sie mit Quotas die Benutzung von Laufwerken einschränken.
+* Wie Sie Festplatten und Swap verschlüsseln, um Daten vor Angreifern zu schützen.
+* Wie Sie ein hochverfügbares Speichernetzwerk konfigurieren.
+
+Bevor Sie dieses Kapitel lesen,
+
+* sollten Sie wissen, wie Sie einen crossref:kernelconfig[kernelconfig,neuen FreeBSD-Kernel konfigurieren und installieren].
+
+[[disks-adding]]
+== Hinzufügen von Laufwerken
+
+Dieser Abschnitt beschreibt, wie Sie ein neues SATA-Laufwerk zu einer Maschine hinzufügen, die momentan nur ein Laufwerk hat. Dazu schalten Sie zuerst den Rechner aus und installieren das Laufwerk entsprechend der Anleitungen Ihres Rechners, Ihres Controllers und des Laufwerkherstellers. Starten Sie das System neu und melden Sie sich als Benutzer `root` an.
+
+Kontrollieren Sie [.filename]#/var/run/dmesg.boot#, um sicherzustellen, dass das neue Laufwerk gefunden wurde. In diesem Beispiel erscheint das neu hinzugefügte SATA-Laufwerk als [.filename]#ada1#.
+
+In diesem Beispiel wird eine einzige große Partition auf der Festplatte erstellt. Verwendet wird das https://de.wikipedia.org/wiki/GUID_Partition_Table[ GPT]-Partitionsschema, welches gegenüber dem älteren und weniger vielseitigen MBR-Schema bevorzug wird.
+
+[NOTE]
+====
+Wenn die hinzugefügte Festplatte nicht leer ist, können alte Partitionsinformationen mit `gpart delete` entfernt werden. Details finden Sie in man:gpart[8].
+====
+
+Zuerst wird das Partitionsschema erstellt und dann eine einzelne Partition angefügt. Zur Verbesserung der Leistung auf neueren Festplatten mit größeren Blockgrößen, wird die Partition an einer Megabyte-Grenze ausgerichtet:
+
+[source,bash]
+....
+# gpart create -s GPT ada1
+# gpart add -t freebsd-ufs -a 1M ada1
+....
+
+Je nach Anwendung kann es wünschenswert sein, mehrere kleinere Partitionen zu haben. In man:gpart[8] finden Sie Optionen zum Erstellen von kleineren Partitionen.
+
+Informationen über die Partitionen der Festplatte werden mit `gpart show` angezeigt:
+
+[source,bash]
+....
+% gpart show ada1
+=> 34 1465146988 ada1 GPT (699G)
+ 34 2014 - free - (1.0M)
+ 2048 1465143296 1 freebsd-ufs (699G)
+ 1465145344 1678 - free - (839K)
+....
+
+Ein Dateisystem wird in der neuen Partition erstellt:
+
+[source,bash]
+....
+# newfs -U /dev/ada1p1
+....
+
+Ein leeres Verzeichnis wird als Mountpunkt erstellt, also ein Speicherort für die Montage der neuen Festplatte im originalen Dateisystem:
+
+[source,bash]
+....
+# mkdir /newdisk
+....
+
+Abschließend wird ein Eintrag in [.filename]#/etc/fstab# hinzugefügt, damit die neue Festplatte automatisch beim Start eingehängt wird:
+
+[.programlisting]
+....
+/dev/ada1p1 /newdisk ufs rw 2 2
+....
+
+Die neue Festplatte kann manuell montiert werden, ohne das System neu zu starten:
+
+[source,bash]
+....
+# mount /newdisk
+....
+
+[[disks-growing]]
+== Partitionen vergrößern
+
+Die Kapazität einer Festplatte kann sich ohne Änderungen an bereits vorhandenen Daten erhöhen. Dies geschieht üblicherweise mit virtuellen Maschinen, wenn sich herausstellt, dass die virtuelle Festplatte zu klein ist und vergrößert werden soll. Zuweilen wird auch ein Abbild einer Platte auf einen USB-Stick geschrieben, ohne dabei die volle Kapazität zu nutzen. Dieser Abschnitt beschreibt, wie man Platten vergrößert, bzw. _erweitert_, um die Vorteile der erhöhten Kapazität zu nutzen.
+
+Überprüfen Sie [.filename]#/var/run/dmesg.boot#, um den Gerätenamen der Festplatte zu bestimmen, die vergrößert werden soll. In diesem Beispiel gibt es nur eine SATA-Festplatte im System, so dass die Platte als [.filename]#ada0# angezeigt wird.
+
+Um die aktuelle Konfiguration der Partitionen auf der Festplatte anzuzeigen:
+
+[source,bash]
+....
+# gpart show ada0
+=> 34 83886013 ada0 GPT (48G) [CORRUPT]
+ 34 128 1 freebsd-boot (64k)
+ 162 79691648 2 freebsd-ufs (38G)
+ 79691810 4194236 3 freebsd-swap (2G)
+ 83886046 1 - free - (512B)
+....
+
+[NOTE]
+====
+Wenn die Festplatte mit dem http://en.wikipedia.org/wiki/GUID_Partition_Table[ GPT]-Partitionsschema formatiert wurde kann es vorkommen, dass sie als "corrupted" angezeigt wird, weil sich die Sicherung der GPT-Partitionstabellen nicht mehr am Ende des Laufwerks befinden. Reparieren Sie in so einem Fall die Partitionstabelle mit `gpart`:
+
+[source,bash]
+....
+# gpart recover ada0
+ada0 recovered
+....
+
+====
+
+Nun steht der zusätzliche Speicherplatz zur Verfügung und kann verwendet werden, um eine neue Partition anzulegen oder eine bestehende Partition zu erweitern:
+
+[source,bash]
+....
+# gpart show ada0
+=> 34 102399933 ada0 GPT (48G)
+ 34 128 1 freebsd-boot (64k)
+ 162 79691648 2 freebsd-ufs (38G)
+ 79691810 4194236 3 freebsd-swap (2G)
+ 83886046 18513921 - free - (8.8G)
+....
+
+Partitionen können nur auf zusammenhängenden, freien Speicherplatz vergrößert werden. In diesem Beispiel wird die letzte Partition der Platte als Swap-Speicher genutzt, aber die zweite Partition ist die, dessen Größe verändert werden soll. Weil der Swap-Speicher nur temporäre Daten enthält, kann er gefahrlos ausgehangen, gelöscht und nachdem die zweite Partition vergrößert wurde, als dritte Partition neu erstellt werden.
+
+Deaktivieren Sie Swap-Speicher Partition:
+
+[source,bash]
+....
+# swapoff /dev/ada0p3
+....
+
+Löschen Sie die dritte Partition, angegeben mit dem Schalter `-i`, der Festplatte _ada0_:
+
+[source,bash]
+....
+# gpart delete -i 3 ada0
+ada0p3 deleted
+# gpart show ada0
+=> 34 102399933 ada0 GPT (48G)
+ 34 128 1 freebsd-boot (64k)
+ 162 79691648 2 freebsd-ufs (38G)
+ 79691810 22708157 - free - (10G)
+....
+
+[WARNING]
+====
+
+Es besteht die Gefahr von Datenverlust, wenn die Partitionstabelle eines eingehangenen Dateisystems verändert wird. Es empfiehlt sich daher, die folgenden Schritte auf einem ausgehangenen Dateisystem durchzuführen, während die Umsetzung über eine Live-CD-ROM oder von einem USB-Gerät erfolgt. Wenn es jedoch absolut notwendig ist, kann ein eingehangenes Dateisystem auch vergrößert werden, nachdem die Sicherheitsfunktionen von GEOM deaktiviert wurden:
+
+[source,bash]
+....
+# sysctl kern.geom.debugflags=16
+....
+
+====
+
+Vergrößern Sie die Partition und lassen Sie Platz, um die Swap-Partition in der gewünschten Größe neu erstellen zu können. Die zu ändernde Partition wird mit `-i` und die neue gewünschte Größe mit `-s` angegeben. Optional wird die Ausrichtung der Partition mit `-a` festgelegt. Dieser Schritt ändert nur die Größe der Partition. Das Dateisystem innerhalb der Partition wird in einem separaten Schritt erweitert.
+
+[source,bash]
+....
+# gpart resize -i 2 -s 47G -a 4k ada0
+ada0p2 resized
+# gpart show ada0
+=> 34 102399933 ada0 GPT (48G)
+ 34 128 1 freebsd-boot (64k)
+ 162 98566144 2 freebsd-ufs (47G)
+ 98566306 3833661 - free - (1.8G)
+....
+
+Erstellen Sie die Swap-Partition neu und aktivieren Sie sie:
+
+[source,bash]
+....
+# gpart add -t freebsd-swap -a 4k ada0
+ada0p3 added
+# gpart show ada0
+=> 34 102399933 ada0 GPT (48G)
+ 34 128 1 freebsd-boot (64k)
+ 162 98566144 2 freebsd-ufs (47G)
+ 98566306 3833661 3 freebsd-swap (1.8G)
+# swapon /dev/ada0p3
+....
+
+Erweitern Sie das UFS-Dateisystem, um die Kapazität der vergrößerten Partition zu nutzen:
+
+[source,bash]
+....
+# growfs /dev/ada0p2
+Device is mounted read-write; resizing will result in temporary write suspension for /.
+It's strongly recommended to make a backup before growing the file system.
+OK to grow file system on /dev/ada0p2, mounted on /, from 38GB to 47GB? [Yes/No] Yes
+super-block backups (for fsck -b #) at:
+ 80781312, 82063552, 83345792, 84628032, 85910272, 87192512, 88474752,
+ 89756992, 91039232, 92321472, 93603712, 94885952, 96168192, 97450432
+....
+
+Wenn das Dateisystem ZFS ist, wird die Größenänderung mit dem Unterkommando `online` und `-e` ausgelöst:
+
+[source,bash]
+....
+# zfs online -e zroot /dev/ada0p2
+....
+
+Sowohl die Partition als auch das Dateisystem wurden jetzt vergrößert, um den neu zur Verfügung stehenden Speicherplatz zu nutzen.
+
+[[usb-disks]]
+== USB Speichermedien
+
+Der Universal Serial Bus (USB) wird von vielen externen Speichern benutzt: Festplatten, USB-Thumbdrives sowie von CD- und DVD-Brennern. FreeBSD bietet Unterstützung für Geräte mit USB 1.x, 2.0 und 3.0.
+
+[NOTE]
+====
+Die Unterstützung für USB 3.0 ist mit einiger Hardware, einschließlich Haswell (Lynx Point) Chipsätzen, nicht kompatibel. Wenn FreeBSD beim Booten mit dem Fehler `failed with error 19` abbricht, müssen Sie xHCI/USB3 im BIOS deaktivieren.
+====
+
+Unterstützung für USB-Massenspeicher ist im [.filename]#GENERIC#-Kernel enthalten. Für einen angepassten Kernel müssen die nachstehenden Zeilen in der Kernelkonfigurationsdatei enthalten sein:
+
+[.programlisting]
+....
+device scbus # SCSI bus (required for ATA/SCSI)
+device da # Direct Access (disks)
+device pass # Passthrough device (direct ATA/SCSI access)
+device uhci # provides USB 1.x support
+device ohci # provides USB 1.x support
+device ehci # provides USB 2.0 support
+device xhci # provides USB 3.0 support
+device usb # USB Bus (required)
+device umass # Disks/Mass storage - Requires scbus and da
+device cd # needed for CD and DVD burners
+....
+
+FreeBSD benutzt den man:umass[4]-Treiber, der das SCSI-Subsystem verwendet um auf USB-Geräte zuzugreifen. Da alle USB-Geräte vom System als SCSI-Geräte erkannt werden, dürfen Sie _nicht_ `device atapicam` in die Kernelkonfigurationsdatei aufnehmen, wenn es sich bei dem Gerät um einen CD- oder DVD-Brenner handelt.
+
+Der übrige Abschnitt beschreibt, wie Sie überprüfen können ob ein USB-Gerät von FreeBSD erkannt wird und wie Sie das Gerät so konfigurieren, dass es verwendet werden kann.
+
+=== Konfiguration von Geräten
+
+Um die USB-Konfiguration zu testen, schließen Sie das USB-Gerät an. Verwenden Sie `dmesg` um zu überprüfen, ob das Gerät in den Systemmeldungen erscheint. Dies sollte in etwa so aussehen:
+
+[source,bash]
+....
+umass0: <STECH Simple Drive, class 0/0, rev 2.00/1.04, addr 3> on usbus0
+umass0: SCSI over Bulk-Only; quirks = 0x0100
+umass0:4:0:-1: Attached to scbus4
+da0 at umass-sim0 bus 0 scbus4 target 0 lun 0
+da0: <STECH Simple Drive 1.04> Fixed Direct Access SCSI-4 device
+da0: Serial Number WD-WXE508CAN263
+da0: 40.000MB/s transfers
+da0: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
+da0: quirks=0x2<NO_6_BYTE>
+....
+
+Fabrikat, Gerätedatei ([.filename]#da0#), Geschwindigkeit und Kapazität werden je nach Gerät unterschiedlich sein.
+
+Da ein USB-Gerät als SCSI-Gerät erkannt wird, kann `camcontrol` benutzt werden, um die mit dem System verbundenen USB-Massenspeicher anzuzeigen:
+
+[source,bash]
+....
+# camcontrol devlist
+<STECH Simple Drive 1.04> at scbus4 target 0 lun 0 (pass3,da0)
+....
+
+Alternativ kann `usbconfig` benutzt werden, um die Geräte aufzulisten. Weitere Informationen zu diesem Kommando finden Sie in man:usbconfig[8].
+
+[source,bash]
+....
+# usbconfig
+ugen0.3: <Simple Drive STECH> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (2mA)
+....
+
+Wenn das Gerät noch nicht formatiert ist, finden Sie in <<disks-adding>> Informationen, wie Sie USB-Laufwerke formatieren und Partitionen einrichten. Wenn das Laufwerk bereits ein Dateisystem enthält, kann es von `root` nach den Anweisungen in crossref:basics[mount-unmount,“Anhängen und Abhängen von Dateisystemen”] eingehängt werden.
+
+[WARNING]
+====
+
+Aus Sicherheitsgründen sollten Sie Benutzern, denen Sie nicht vertrauen, das Einhängen (z.B. durch die unten beschriebene Aktivierung von `vfs.usermount`) beliebiger Medien verbieten. Die meisten Dateisysteme wurden nicht entwickelt, um sich vor böswilligen Geräten zu schützen.
+====
+
+Um auch normalen Anwendern das Einhängen des Laufwerks zu gestatten, könnten Sie beispielsweise mit man:pw[8] alle potentiellen Benutzer dieser Gerätedateien in die Gruppe `operator` aufnehmen. Außerdem muss sichergestellt werden, dass `operator` Schreib- und Lesezugriff auf diese Gerätedateien haben. Hierfür werden die folgenden Zeilen in [.filename]#/etc/devfs.rules# hinzugefügt:
+
+[.programlisting]
+....
+[localrules=5]
+add path 'da*' mode 0660 group operator
+....
+
+[NOTE]
+====
+Verfügt das System über interne SCSI-Laufwerke, so verändern Sie die zweite Zeile wie folgt:
+
+[.programlisting]
+....
+add path 'da[3-9]*' mode 0660 group operator
+....
+
+Dies wird die ersten drei SCSI-Laufwerke ([.filename]#da0# bis [.filename]#da2#) davon ausschließen, in die Gruppe `operator` aufgenommen zu werden. Ersetzen Sie `3` durch die Anzahl der SCSI-Laufwerke. Weitere Informationen zu dieser Datei finden Sie in man:devfs.rules[5].
+====
+
+Aktivieren Sie nun die Regeln in [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+devfs_system_ruleset="localrules"
+....
+
+Als nächstes müssen Sie das System anweisen, auch normalen Benutzern das mounten von Dateisystemen zu erlauben, indem Sie die folgende Zeile in [.filename]#/etc/sysctl.conf# hinzufügen:
+
+[.programlisting]
+....
+vfs.usermount=1
+....
+
+Da diese Einstellung erst nach einem Neustart wirksam wird, können Sie diese Variable mit `sysctl` auch direkt setzen:
+
+[source,bash]
+....
+# sysctl vfs.usermount=1
+vfs.usermount: 0 -> 1
+....
+
+Zuletzt müssen Sie noch ein Verzeichnis anlegen, in das das USB-Laufwerk eingehängt werden soll. Dieses Verzeichnis muss dem Benutzer gehören, der das USB-Laufwerk in den Verzeichnisbaum einhängen will. Dazu legen Sie als `root` ein Unterverzeichnis [.filename]#/mnt/username# an, wobei Sie _username_ durch den Login des jeweiligen Benutzers sowie _usergroup_ durch die primäre Gruppe des Benutzers ersetzen:
+
+[source,bash]
+....
+# mkdir /mnt/username
+# chown username:usergroup /mnt/username
+....
+
+Wenn Sie nun beispielsweise einen USB-Stick anschließen, wird automatisch die Gerätedatei [.filename]#/dev/da0s1# erzeugt. Ist das Gerät mit einem FAT-Dateisystem formatiert, kann es der Benutzer mit dem folgenden Befehl in den Verzeichnisbaum einhängen:
+
+[source,bash]
+....
+% mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/username
+....
+
+Bevor das Gerät entfernt werden kann, _muss_ es abgehängt werden:
+
+[source,bash]
+....
+# umount /mnt/username
+....
+
+Nach Entfernen des Geräts stehen in den Systemmeldungen Einträge, ähnlich der folgenden:
+
+[source,bash]
+....
+umass0: at uhub3, port 2, addr 3 (disconnected)
+da0 at umass-sim0 bus 0 scbus4 target 0 lun 0
+da0: <STECH Simple Drive 1.04> s/n WD-WXE508CAN263 detached
+(da0:umass-sim0:0:0:0): Periph destroyed
+....
+
+=== Automatisches Einhängen von Wechselmedien
+
+Damit USB-Geräte automatisch eingehängt werden, muss der Kommentar für folgende Zeile in [.filename]#/etc/auto_master# entfernt werden:
+
+[source,bash]
+....
+/media -media -nosuid
+....
+
+Anschließend fügen Sie folgende Zeilen in [.filename]#/etc/devd.conf# hinzu:
+
+[source,bash]
+....
+notify 100 {
+ match "system" "GEOM";
+ match "subsystem" "DEV";
+ action "/usr/sbin/automount -c";
+};
+....
+
+Falls man:autofs[5] und man:devd[8] bereits ausgeführt werden, müssen Sie die Konfiguration neu einlesen:
+
+[source,bash]
+....
+# service automount restart
+# service devd restart
+....
+
+man:autofs[5] wird beim Booten automatisch gestartet, wenn Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzufügen:
+
+[.programlisting]
+....
+autofs_enable="YES"
+....
+
+Damit man:autofs[5] funktioniert, muss man:devd[8] aktiviert sein, was aber in der Voreinstellung der Fall ist.
+
+Starten Sie jetzt die Dienste:
+
+[source,bash]
+....
+# service automount start
+# service automountd start
+# service autounmountd start
+# service devd start
+....
+
+Jedes Dateisystem, das automatisch eingehängt werden kann, erscheint als ein Verzeichnis unterhalb von [.filename]#media#. Das Verzeichnis wird nach dem Dateisystemlabel benannt, bzw. nach dem Gerätenamen, falls kein Label existiert.
+
+Das Dateisystem wird transparent beim ersten Zugriff in den Verzeichnisbaum eingehängt und auch nach gewisser Zeit der Inaktivität wieder ausgehängt. Laufwerke können auch manuell ausgehängt werden:
+
+[source,bash]
+....
+# automount -fu
+....
+
+Diese Methode wird in der Regel bei Speicherkarten und USB-Sticks verwendet. Sie funktioniert aber mit allen Blockgeräten, einschließlich optischen Laufwerken und iSCSI-LUNs.
+
+[[creating-cds]]
+== Erstellen und Verwenden von CDs
+
+CDs besitzen einige Eigenschaften, die sie von konventionellen Laufwerken unterscheiden. Sie wurden so entworfen, dass sie ununterbrochen, ohne Verzögerungen durch Kopfbewegungen zwischen den Spuren, gelesen werden können. CDs besitzen Spuren, aber damit ist der Teil Daten gemeint, der ununterbrochen gelesen wird, und nicht eine physikalische Eigenschaft der CD. Das ISO 9660-Dateisystem wurde entworfen, um mit diesen Unterschieden umzugehen.
+
+Die FreeBSD Ports-Sammlung bietet einige Werkzeuge zum Brennen und Kopieren von Audio- und Daten-CDs. Dieses Kapitel beschreibt die Verwendung von mehreren Kommandozeilen-Werkzeugen. Wenn Sie eine graphische Oberfläche zum Brennen von CDs benutzen, können Sie package:sysutils/xcdroast[] oder package:sysutils/k3b[] installieren.
+
+[[atapicam]]
+=== Unterstützte Geräte
+
+Der [.filename]#GENERIC#-Kernel enthält Unterstützung für SCSI, USB und ATAPICD Lesegeräte und Brenner. Wird ein angepasster Kernel erstellt, unterscheiden sich die Optionen für die Kernelkonfigurationsdatei je nach Art des Geräts.
+
+Für einen SCSI-Brenner müssen folgende Optionen vorhanden sein:
+
+[.programlisting]
+....
+device scbus # SCSI bus (required for ATA/SCSI)
+device da # Direct Access (disks)
+device pass # Passthrough device (direct ATA/SCSI access)
+device cd # needed for CD and DVD burners
+....
+
+Für einen USB-Brenner müssen folgende Optionen vorhanden sein:
+
+[.programlisting]
+....
+device scbus # SCSI bus (required for ATA/SCSI)
+device da # Direct Access (disks)
+device pass # Passthrough device (direct ATA/SCSI access)
+device cd> # needed for CD and DVD burners
+device uhci # provides USB 1.x support
+device ohci # provides USB 1.x support
+device ehci # provides USB 2.0 support
+device xhci # provides USB 3.0 support
+device usb # USB Bus (required)
+device umass # Disks/Mass storage - Requires scbus and da
+....
+
+Für einen ATAPI-Brenner müssen folgende Optionen vorhanden sein:
+
+[.programlisting]
+....
+device ata # Legacy ATA/SATA controllers
+device scbus # SCSI bus (required for ATA/SCSI)
+device pass # Passthrough device (direct ATA/SCSI access)
+device cd # needed for CD and DVD burners
+....
+
+[NOTE]
+====
+Unter FreeBSD Versionen kleiner 10.x wird auch diese Option in der Kernelkonfigurationsdatei benötigt, falls der Brenner ein ATAPI-Gerät ist:
+
+[.programlisting]
+....
+device atapicam
+....
+
+Alternativ kann folgende Zeile in [.filename]#/boot/loader.conf# hinzugefügt werden, um den Treiber beim Booten automatisch zu laden:
+
+[.programlisting]
+....
+atapicam_load="YES"
+....
+
+Hierzu ist ein Neustart des Systems erforderlich, da dieser Treiber nur beim Booten geladen werden kann.
+====
+
+Mit `dmesg` können Sie prüfen, ob das Gerät von FreeBSD erkannt wurde. Unter FreeBSD Versionen kleiner 10.x lautet der Gerätename [.filename]#acd0# anstelle von [.filename]#cd0#.
+
+[source,bash]
+....
+% dmesg | grep cd
+cd0 at ahcich1 bus 0 scbus1 target 0 lun 0
+cd0: <HL-DT-ST DVDRAM GU70N LT20> Removable CD-ROM SCSI-0 device
+cd0: Serial Number M3OD3S34152
+cd0: 150.000MB/s transfers (SATA 1.x, UDMA6, ATAPI 12bytes, PIO 8192bytes)
+cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
+....
+
+[[cdrecord]]
+=== Eine CD brennen
+
+Unter FreeBSD kann `cdrecord` zum Brennen von CDs benutzt werden. Dieses Programm wird aus dem Port oder Paket package:sysutils/cdrtools[] installiert.
+
+Obwohl `cdrecord` viele Optionen besitzt, ist die grundlegende Benutzung sehr einfach. Geben Sie den Namen der zu brennenden ISO-Datei an. Wenn das System über mehrere Brenner verfügt, müssen Sie auch den Namen des Gerätes angeben:
+
+[source,bash]
+....
+# cdrecord dev=device imagefile.iso
+....
+
+Benutzen Sie `-scanbus` um den Gerätenamen des Brenners zu bestimmen. Die Ausgabe könnte wie folgt aussehen:
+
+[source,bash]
+....
+# cdrecord -scanbus
+ProDVD-ProBD-Clone 3.00 (amd64-unknown-freebsd10.0) Copyright (C) 1995-2010 Jörg Schilling
+Using libscg version 'schily-0.9'
+scsibus0:
+ 0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk
+ 0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk
+ 0,2,0 2) *
+ 0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk
+ 0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM
+ 0,5,0 5) *
+ 0,6,0 6) *
+ 0,7,0 7) *
+scsibus1:
+ 1,0,0 100) *
+ 1,1,0 101) *
+ 1,2,0 102) *
+ 1,3,0 103) *
+ 1,4,0 104) *
+ 1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM
+ 1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner
+ 1,7,0 107) *
+....
+
+Benutzen Sie die drei durch Kommas separierten Zahlen, die für den CD-Brenner angegeben sind, als Argument für `dev`. Im Beispiel ist das Yamaha-Gerät `1,5,0`, so dass die passende Eingabe `dev=1,5,0` ist. Einfachere Wege das Argument anzugeben, sowie Informationen über Audiospuren und das Einstellen der Geschwindigkeit, sind in der Manualpage von `cdrecord` beschrieben.
+
+Alternativ können Sie den folgenden Befehl ausführen, um die Geräteadresse des Brenners zu ermitteln:
+
+[source,bash]
+....
+# camcontrol devlist
+<MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (cd0,pass0)
+....
+
+Verwenden Sie die numerischen Werte für `scbus`, `target` und `lun`. Für dieses Beispiel wäre `1,0,0` als Gerätename zu verwenden.
+
+[[mkisofs]]
+=== Daten auf ISO-Dateisystem schreiben
+
+Die Datendateien müssen vorbereitet sein, bevor sie auf eine CD gebrannt werden. In FreeBSD wird `mkisofs` vom Paket oder Port package:sysutils/cdrtools[] installiert. Dieses Programm kann aus einem UNIX(R) Verzeichnisbaum ein ISO 9660-Dateisystem erzeugen. Im einfachsten Fall müssen Sie lediglich den Namen der zu erzeugenden ISO-Datei und den Pfad zu den Dateien angeben, die auf dem ISO 9660-Dateisystem platziert werden:
+
+[source,bash]
+....
+# mkisofs -o imagefile.iso /path/to/tree
+....
+
+Bei diesem Kommando werden die Dateinamen auf Namen abgebildet, die den Restriktionen des ISO 9660-Dateisystem entsprechen. Dateien, die diesem Standard nicht entsprechen bleiben unberücksichtigt.
+
+Es gibt einige Optionen, um die Beschränkungen dieses Standards zu überwinden. Die unter UNIX(R) Systemen üblichen Rock-Ridge-Erweiterungen werden durch `-R` aktiviert und `-J` aktiviert die von Microsoft(R) Systemen benutzten Joliet-Erweiterungen.
+
+Für CDs, die nur auf FreeBSD-Systemen verwendet werden sollen, kann `-U` genutzt werden, um alle Beschränkungen für Dateinamen aufzuheben. Zusammen mit `-R` wird ein Abbild des Dateisystems, identisch zu angegebenen FreeBSD-Dateibaum erstellt, selbst wenn dies den ISO 9660 Standard verletzt.
+
+Die letzte übliche Option ist `-b`. Sie wird benutzt, um den Ort eines Bootimages einer "El Torito" bootbaren CD anzugeben. Das Argument zu dieser Option ist der Pfad zu einem Bootimage ausgehend von der Wurzel des Baumes, der auf die CD geschrieben werden soll. In der Voreinstellung erzeugt `mkisofs` ein ISO-Image im "Diskettenemulations"-Modus. Dabei muss das Image genau 1200, 1440 oder 2880 KB groß sein. Einige Bootloader, darunter der auf den FreeBSD Installationsmedien verwendete, kennen keinen Emulationsmodus. Daher sollte in diesen Fällen `-no-emul-boot` verwendet werden. Wenn [.filename]#/tmp/myboot# ein bootbares FreeBSD-System enthält, dessen Bootimage sich in [.filename]#/tmp/myboot/boot/cdboot# befindet, dann würde folgendes Kommando [.filename]#/tmp/bootable.iso# erstellen:
+
+[source,bash]
+....
+# mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
+....
+
+Das resultierende ISO-Abbild kann als speicherbasiertes Laufwerk eingehängt werden:
+
+[source,bash]
+....
+# mdconfig -a -t vnode -f /tmp/bootable.iso -u 0
+# mount -t cd9660 /dev/md0 /mnt
+....
+
+Jetzt können Sie überprüfen, dass [.filename]#/mnt# und [.filename]#/tmp/myboot# identisch sind.
+
+Sie können das Verhalten von `mkisofs` mit einer Vielzahl von Optionen beeinflussen. Details dazu entnehmen Sie bitte man:mkisofs[8].
+
+[NOTE]
+====
+Es ist möglich eine Daten-CD in eine Datei zu kopieren, die einem Image entspricht, das mit `mkisofs` erstellt wurde. Verwenden Sie dazu `dd` mit dem Gerätenamen als Eingabedatei und den Namen der ISO als Ausgabedatei:
+
+[source,bash]
+....
+# dd if=/dev/cd0 of=file.iso bs=2048
+....
+
+Das resultierende Abbild kann auf eine CD gebrannt werden, wie in <<cdrecord>> beschrieben.
+====
+
+[[mounting-cd]]
+=== Einhängen von Daten-CDs
+
+Sobald ein Abbild auf eine CD gebrannt wurde, kann es durch Angabe des Dateisystemtyp, des CD-Laufwerks und des Mountpunktes eingehangen werden:
+
+[source,bash]
+....
+# mount -t cd9660 /dev/cd0 /mnt
+....
+
+Da `mount` davon ausgeht, dass ein Dateisystem vom Typ `ufs` ist, würde die Fehlermeldung `Incorrect super block` erscheinen, wenn Sie beim Einhängen einer Daten-CD auf die Angabe `-t cd9660` verzichten.
+
+Auf diese Weise können Daten-CDs von jedem Hersteller verwendet werden. Es kann allerdings zu Problemen mit CDs kommen, die verschiedene ISO 9660-Erweiterungen benutzen. So speichern Joliet-CDs alle Dateinamen unter Verwendung von zwei Byte langen Unicode-Zeichen. Tauchen statt bestimmter Zeichen nur Fragezeichen auf, so muss über die Option `-C` der benötigte Zeichensatz angegeben werden. Weitere Informationen zu diesem Problem finden Sie in man:mount_cd9660[8].
+
+[NOTE]
+====
+Damit der Kernel diese Zeichenkonvertierung (festgelegt durch die Option `-C`) erkennt, müssen Sie das Kernelmodul [.filename]#cd9660_iconv.ko# laden. Dazu fügen Sie folgende Zeile in [.filename]#loader.conf# ein:
+
+[.programlisting]
+....
+cd9660_iconv_load="YES"
+....
+
+Danach müssen Sie allerdings Ihr System neu starten. Alternativ können Sie das Kernelmodul auch direkt über `kldload` laden.
+====
+
+Manchmal werden Sie die Meldung `Device not configured` erhalten, wenn Sie versuchen, eine Daten-CD einzuhängen. Für gewöhnlich liegt das daran, dass das Laufwerk keine CD erkannt hat, oder dass das Laufwerk auf dem Bus nicht erkannt wird. Es kann einige Sekunden dauern, bevor das Laufwerk die CD erkennt. Seien Sie also geduldig.
+
+Manchmal wird ein SCSI-CD nicht erkannt, weil es keine Zeit hatte, auf das Zurücksetzen des Busses zu antworten. Um dieses Problem zu lösen, fügen Sie die folgende Zeile in die Kernelkonfiguration ein und erstellen Sie einen angepassten Kernel nach den Anweisungen in crossref:kernelconfig[kernelconfig-building,“Einen angepassten Kernel bauen und installieren”]:
+
+[.programlisting]
+....
+options SCSI_DELAY=15000
+....
+
+Die Zeile bewirkt, dass nach dem Zurücksetzen des SCSI-Busses beim Booten 15 Sekunden gewartet wird, um dem CD-Laufwerk genügend Zeit zu geben, darauf zu antworten.
+
+[NOTE]
+====
+Es ist möglich eine Datei auch direkt auf eine CD zu brennen, ohne vorher auf ihr ein ISO 9660-Dateisystem einzurichten. Man sagt auch, Daten werden roh auf die CD gebrannt. Einige Leute nutzen dies, um Datensicherungen durchzuführen.
+
+Eine auf diese Weise gefertigte Daten-CD kann nicht in das Dateisystem eingehangen werden. Um auf die Daten einer solchen CD zuzugreifen, müssen die Daten vom rohen Gerät gelesen werden. Beispielsweise würde dieser Befehl eine komprimierte tar-Datei auf dem zweiten CD-Laufwerk in das aktuelle Verzeichnis extrahieren:
+
+[source,bash]
+....
+# tar xzvf /dev/cd1
+....
+
+Um eine Daten-CD in das System einzuhängen, müssen die Daten mit `mkisofs` geschrieben werden.
+====
+
+[[duplicating-audiocds]]
+=== Kopieren von Audio-CDs
+
+Um eine Kopie einer Audio-CD zu erstellen, kopieren Sie die Stücke der CD in einzelne Dateien und brennen diese Dateien dann auf eine leere CD.
+
+<<using-cdrecord>> beschreibt, wie eine Audio-CD kopiert und gebrannt wird. Wenn die Version älter als FreeBSD 10.0 ist und ein ATAPI-Gerät verwendet wird, muss zunächst das Modul `atapicam` nach den Anweisungen in <<atapicam>> geladen werden.
+[[using-cdrecord]]
+[.procedure]
+.Procedure: Eine Audio-CD kopieren
+. Der Port oder das Paket package:sysutils/cdrtools[] installiert `cdda2wav`. Mit diesem Kommando können Audiodaten in das aktuelle Verzeichnis extrahiert werden, wobei jede Datei in eine separate WAV-Datei geschrieben wird:
++
+
+[source,bash]
+....
+% cdda2wav -vall -B -Owav
+....
+
++
+Wenn das System nur über ein CD-Laufwerk verfügt, muss der Gerätename nicht angegeben werden. Lesen Sie die Manualpage von `cdda2wav` für Anweisungen, wie ein Gerät spezifiziert wird und weitere verfügbare Optionen für dieses Kommando.
+. Die erzeugten [.filename]#.wav# Dateien schreiben Sie mit `cdrecord` auf eine leere CD:
++
+
+[source,bash]
+....
+% cdrecord -v dev=2,0 -dao -useinfo *.wav
+....
+
++
+Das Argument von `dev` gibt das verwendete Gerät an, das wie in <<cdrecord>> ermittelt werden kann.
+
+[[creating-dvds]]
+== DVDs benutzen
+
+Nach der CD ist die DVD die nächste Generation optischer Speichermedien. Auf einer DVD können mehr Daten als auf einer CD gespeichert werden. DVDs werden als Standardmedium für Videos verwendet.
+
+Für beschreibbare DVDs existieren fünf Medienformate:
+
+* DVD-R: Dies war das erste verfügbare Format. Das Format wurde vom http://www.dvdforum.org/forum.shtml[DVD-Forum] festgelegt. Die Medien sind nur einmal beschreibbar.
+* DVD-RW: Dies ist die wiederbeschreibbare Version des DVD-R Standards. Eine DVD-RW kann ungefähr 1000 Mal beschrieben werden.
+* DVD-RAM: Dies ist ein wiederbeschreibbares Format, das wie ein Wechsellaufwerk betrachtet werden kann. Allerdings sind die Medien nicht kompatibel zu den meisten DVD-ROM-Laufwerken und DVD-Video-Spielern, da das DVD-RAM-Format nur von wenigen Brennern unterstützt wird. Informationen zur Nutzung von DVD-RAM finden Sie in <<creating-dvd-ram>>.
+* DVD+RW: Ist ein wiederbeschreibbares Format, das von der https://de.wikipedia.org/wiki/DVD%2BRW_Alliance[ DVD+RW Alliance] festgelegt wurde. Eine DVD+RW kann ungefähr 1000 Mal beschrieben werden.
+* DVD+R: Dieses Format ist die nur einmal beschreibbare Variante des DVD+RW Formats.
+
+Auf einer einfach beschichteten DVD können 4.700.000.000 Bytes gespeichert werden. Das sind 4,38 GB oder 4485 MB (1 Kilobyte sind 1024 Bytes).
+
+[NOTE]
+====
+Die physischen Medien sind unabhängig von der Anwendung. Ein DVD-Video ist eine spezielle Anordnung von Dateien, die auf irgendein Medium, beispielsweise DVD-R, DVD+R oder DVD-RW geschrieben werden kann. Bevor Sie ein Medium auswählen, müssen Sie sicherstellen, dass der Brenner und der DVD-Spieler mit dem Medium umgehen können.
+====
+
+=== Konfiguration
+
+Benutzen Sie man:growisofs[1], um DVDs zu beschreiben. Das Kommando ist Bestandteil von package:sysutils/dvd+rw-tools[], und kann mit allen DVD-Medien umgehen.
+
+Diese Werkzeuge verwenden das SCSI-Subsystem, um auf die Geräte zuzugreifen. Daher muss <<atapicam,ATAPI/CAM-Unterstützung>> geladen, oder statisch in den Kernel kompiliert werden. Sollte der Brenner jedoch die USB-Schnittstelle nutzen, wird diese Unterstützung nicht benötigt. Weitere Informationen zur Konfiguration von USB-Geräten finden Sie in <<usb-disks>>.
+
+Für ATAPI-Geräte müssen ebenfalls DMA-Zugriffe aktiviert werden. Dazu wird die folgende Zeile in [.filename]#/boot/loader.conf# eingefügt:
+
+[.programlisting]
+....
+hw.ata.atapi_dma="1"
+....
+
+Bevor Sie dvd+rw-tools benutzen, lesen Sie bitte die Hardware-Informationen auf der Seite http://fy.chalmers.se/~appro/linux/DVD+RW/hcn.html[Hardware Compatibility Notes].
+
+[NOTE]
+====
+Für eine grafische Oberfläche sollten Sie sich package:sysutils/k3b[] ansehen, das eine benutzerfreundliche Schnittstelle zu man:growisofs[1] und vielen anderen Werkzeugen bietet.
+====
+
+=== Daten-DVDs brennen
+
+man:growisofs[1] erstellt mit dem Programm <<mkisofs,mkisofs>> das Dateisystem und brennt anschließend die DVD. Vor dem Brennen braucht daher kein Abbild der Daten erstellt zu werden.
+
+Wenn Sie von den Daten im Verzeichnis [.filename]#/path/to/data# eine DVD+R oder eine DVD-R brennen wollen, benutzen Sie das nachstehende Kommando:
+
+[source,bash]
+....
+# growisofs -dvd-compat -Z /dev/cd0 -J -R /path/to/data
+....
+
+In diesem Beispiel wird `-J -R` an man:mkisofs[8] durchgereicht und dient zum Erstellen des Dateisystems (hier: ein ISO-9660-Dateisystem mit Joliet- und Rock-Ridge-Erweiterungen). Weiteres entnehmen Sie bitte der Hilfeseite man:mkisofs[8].
+
+Die Option `-Z` wird für die erste Aufnahme einer Single- oder Multisession benötigt. Ersetzen Sie _/dev/cd0_ mit dem Gerätenamen des DVD-Gerätes. Die Nutzung von `-dvd-compat` schließt das Medium, weitere Daten können danach nicht mehr angehängt werden. Dies sollte auch eine bessere Kompatibilität mit anderen DVD-ROM-Laufwerken bieten.
+
+Um ein vorher erstelltes Abbild der Daten zu brennen, beispielsweise _imagefile.iso_, verwenden Sie:
+
+[source,bash]
+....
+# growisofs -dvd-compat -Z /dev/cd0=imagefile.iso
+....
+
+Die Schreibgeschwindigkeit hängt von den verwendeten Medium sowie dem verwendeten Gerät ab und sollte automatisch gesetzt werden. Um die Schreibgeschwindigkeit vorzugeben, verwenden Sie `-speed=`. Beispiele finden Sie in man:growisofs[1].
+
+[NOTE]
+====
+Um größere Dateien als 4.38GB zu unterstützen, ist es notwendig ein UDF/ISO-9660 Hybrid-Dateisystem zu erstellen. Dieses Dateisystem muss mit zusätzlichen Parametern `-udf -iso-level 3` bei man:mkisofs[8] und allen relevanten Programmen, wie beispielsweise man:growisofs[1]) erzeugt werden. Dies ist nur notwendig, wenn Sie ein ISO-Image erstellen oder direkt auf eine DVD schreiben wollen. DVDs, die in dieser Weise hergestellt worden sind, müssen als UDF-Dateisystem mit man:mount_udf[8] eingehangen werden. Sie sind nur auf Betriebssystemen, die UDF unterstützen brauchbar, ansonsten sieht es so aus, als ob sie kaputte Dateien enthalten würden.
+
+Um diese Art von ISO-Datei zu erstellen:
+
+[source,bash]
+....
+% mkisofs -R -J -udf -iso-level 3 -o imagefile.iso /path/to/data
+....
+
+Um Daten direkt auf eine DVD zu brennen, geben Sie den folgenden Befehl ein:
+
+[source,bash]
+....
+# growisofs -dvd-compat -udf -iso-level 3 -Z /dev/cd0 -J -R /path/to/data
+....
+
+Wenn ein ISO-Abbild bereits große Dateien enthält, sind keine weiteren Optionen für man:growisofs[1] notwendig, um das Abbild auf die DVD zu brennen.
+
+Achten Sie darauf, eine aktuelle Version von package:sysutils/cdrtools[] zu verwenden, welche man:mkisofs[8] enthält, da ältere Versionen keinen Support für große Dateien enthalten. Falls die neueste Version nicht funktioniert, installieren Sie package:sysutils/cdrtools-devel[] und lesen Sie man:mkisofs[8].
+====
+
+=== DVD-Videos brennen
+
+Ein DVD-Video ist eine spezielle Anordnung von Dateien, die auf den ISO-9660 und den micro-UDF (M-UDF) Spezifikationen beruht. Da DVD-Video auf eine bestimmte Datei-Hierarchie angewiesen ist, müssen DVDs mit speziellen Programmen wie package:multimedia/dvdauthor[] erstellt werden.
+
+Ist bereits ein Abbild des Dateisystems eines DVD-Videos vorhanden, kann es auf die gleiche Weise wie jedes andere Abbild gebrannt werden. Wenn `dvdauthor` verwendet wurde, um die DVD zu erstellen und die Resultate in [.filename]#/path/to/video# liegen, kann das folgende Kommando verwendet werden, um ein DVD-Video zu brennen:
+
+[source,bash]
+....
+# growisofs -Z /dev/cd0 -dvd-video /path/to/video
+....
+
+`-dvd-video` wird an man:mkisofs[8] weitergereicht, um die Datei-Hierarchie für ein DVD-Video zu erstellen. Weiterhin bewirkt diese Option, dass man:growisofs[1] mit `-dvd-compat` aufgerufen wird.
+
+=== DVD+RW-Medien benutzen
+
+Im Gegensatz zu CD-RW-Medien müssen DVD+RW-Medien erst formatiert werden, bevor sie benutzt werden können. Es wird _empfohlen_ man:growisofs[1] einzusetzen, da das Programm Medien automatisch formatiert, wenn es erforderlich ist. Es ist jedoch möglich, auch `dvd+rw-format` zu nutzen, um die DVD+RW zu formatieren:
+
+[source,bash]
+....
+# dvd+rw-format /dev/cd0
+....
+
+Dieser Vorgang muss nur einmal durchgeführt werden. Denken Sie daran, dass nur neue DVD+RWs formatiert werden müssen. Anschließend können DVD+RWs, wie gewohnt gebrannt werden.
+
+Wenn Sie auf einer DVD+RW ein neues Dateisystem erstellen wollen, brauchen Sie die DVD+RW vorher nicht zu löschen. Überschreiben Sie einfach das vorige Dateisystem indem Sie eine neue Session anlegen:
+
+[source,bash]
+....
+# growisofs -Z /dev/cd0 -J -R /path/to/newdata
+....
+
+Das DVD+RW-Format erlaubt es, Daten an eine vorherige Aufnahme anzuhängen. Dazu wird eine neue Session mit der schon bestehenden zusammengeführt. Es wird keine Multi-Session geschrieben, sondern man:growisofs[1] _vergrößert_ das ISO-9660-Dateisystem auf dem Medium.
+
+Das folgende Kommando fügt weitere Daten zu einer vorher erstellten DVD+RW hinzu:
+
+[source,bash]
+....
+# growisofs -M /dev/cd0 -J -R /path/to/nextdata
+....
+
+Wenn Sie eine DVD+RW erweitern, verwenden Sie dieselben man:mkisofs[8]-Optionen wie beim Erstellen der DVD+RW.
+
+[NOTE]
+====
+Verwenden Sie `-dvd-compat`, um bessere Kompatibilität mit DVD-ROM-Laufwerken zu gewährleisten. Zu einem DVD+RW-Medium können Sie mit dieser Option auch weiterhin Daten hinzufügen.
+====
+
+Um das Medium zu löschen, verwenden Sie:
+
+[source,bash]
+....
+# growisofs -Z /dev/cd0=/dev/zero
+....
+
+=== DVD-RW-Medien benutzen
+
+Eine DVD-RW kann mit zwei Methoden beschrieben werden: _Sequential-Recording_ oder _Restricted-Overwrite_. Voreingestellt ist Sequential-Recording.
+
+Eine neue DVD-RW kann direkt beschrieben werden; sie muss nicht vorher formatiert werden. Allerdings muss eine DVD-RW, die mit Sequential-Recording aufgenommen wurde, zuerst gelöscht werden, bevor eine neue Session aufgenommen werden kann.
+
+Der folgende Befehl löscht eine DVD-RW im Sequential-Recording-Modus:
+
+[source,bash]
+....
+# dvd+rw-format -blank=full /dev/cd0
+....
+
+[NOTE]
+====
+Das vollständige Löschen mit `-blank=full` dauert mit einem 1x Medium ungefähr eine Stunde. Wenn die DVD-RW im Disk-At-Once-Modus (DAO) aufgenommen wurde, kann sie mit `-blank` schneller gelöscht werden. Um eine DVD-RW im DAO-Modus zu brennen, benutzen Sie das folgende Kommando:
+
+[source,bash]
+....
+# growisofs -use-the-force-luke=dao -Z /dev/cd0=imagefile.iso
+....
+
+Die Option `-use-the-force-luke=dao` sollte nicht erforderlich sein, da man:growisofs[1] den DAO-Modus automatisch erkennt.
+
+Der Restricted-Overwrite-Modus sollte mit jeder DVD-RW verwendet werden, da er flexibler als der voreingestellte Sequential-Recording-Modus ist.
+====
+
+Um Daten auf eine DVD-RW im Sequential-Recording-Modus zu schreiben, benutzen Sie dasselbe Kommando wie für die anderen DVD-Formate:
+
+[source,bash]
+....
+# growisofs -Z /dev/cd0 -J -R /path/to/data
+....
+
+Um weitere Daten zu einer Aufnahme hinzuzufügen, benutzen Sie `-M` mit man:growisofs[1]. Werden die Daten im Sequential-Recording-Modus hinzugefügt, wird eine neue Session erstellt. Das Ergebnis ist ein Multi-Session-Medium.
+
+Eine DVD-RW im Restricted-Overwrite-Modus muss nicht gelöscht werden, um eine neue Session aufzunehmen. Das Medium kann einfach mit `-Z` überschrieben werden. Mit `-M` kann das ISO-9660-Dateisystem, wie mit einer DVD+RW, vergrößert werden. Die DVD enthält danach eine Session.
+
+Benutzen sie das nachstehende Kommando, um den Restricted-Overwrite-Modus einzustellen:
+
+[source,bash]
+....
+# dvd+rw-format /dev/cd0
+....
+
+Das folgende Kommando stellt den Modus wieder auf Sequential-Recording zurück:
+
+[source,bash]
+....
+# dvd+rw-format -blank=full /dev/cd0
+....
+
+=== Multi-Session
+
+Nur wenige DVD-ROM-Laufwerke unterstützen Multi-Session-DVDs und lesen meist nur die erste Session. Mehrere Sessions werden von DVD+R, DVD-R und DVD-RW im Sequential-Recording-Modus unterstützt. Im Modus Restricted-Overwrite gibt nur eine Session.
+
+Wenn das Medium noch nicht geschlossen ist, erstellt das nachstehende Kommando eine neue Session auf einer DVD+R, DVD-R oder DVD-RW im Sequential-Recording-Modus:
+
+[source,bash]
+....
+# growisofs -M /dev/cd0 -J -R /path/to/nextdata
+....
+
+Wird dieses Kommando mit DVD+RW- oder DVD-RW-Medien im Restricted-Overwrite-Modus benutzt, werden die neuen Daten mit den Daten der bestehenden Session zusammengeführt. Das Medium enthält danach eine Session. Nutzen Sie diese Methode, um neue Daten zu einer bestehenden Session hinzuzufügen.
+
+[NOTE]
+====
+Für den Anfang und das Ende einer Session wird auf dem Medium zusätzlicher Platz verbraucht. Um den Speicherplatz auf dem Medium optimal auszunutzen, sollten Sie daher Sessions mit vielen Daten hinzufügen. Auf ein DVD+R-Medium passen maximal 154 Sessions, 2000 Sessions auf ein DVD-R-Medium und 127 Sessions auf eine DVD+R Double Layer.
+====
+
+=== Weiterführendes
+
+`dvd+rw-mediainfo _/dev/cd0_` zeigt Informationen über eine im Laufwerk liegende DVD an.
+
+Weiteres zu dvd+rw-tools finden Sie in man:growisofs[1], auf der http://fy.chalmers.se/~appro/linux/DVD+RW/[ dvd+rw-tools Web-Seite] und in den Archiven der http://lists.debian.org/cdwrite/[ cdwrite-Mailingliste].
+
+[NOTE]
+====
+Wenn Sie einen Problembericht zur Nutzung der dvd+rw-tools erstellen, fügen Sie immer die Ausgabe von `dvd+rw-mediainfo` hinzu.
+====
+
+[[creating-dvd-ram]]
+=== DVD-RAM
+
+DVD-RAM-fähige Brenner nutzten die SCSI- oder ATAPI-Schnittstelle. Für ATAPI-Geräte muss der DMA-Modus aktiviert werden, indem die folgende Zeile in [.filename]#/boot/loader.conf# hinzugefügt wird:
+
+[.programlisting]
+....
+hw.ata.atapi_dma="1"
+....
+
+Eine DVD-RAM kann mit einer Wechselplatte verglichen werden. Wie diese, muss auch eine DVD-RAM vor dem ersten Einsatz formatiert werden. In diesem Beispiel wird das gesamte Medium mit dem Standard-UFS2-Dateisystem formatiert:
+
+[source,bash]
+....
+# dd if=/dev/zero of=/dev/acd0 bs=2k count=1
+# bsdlabel -Bw acd0
+# newfs /dev/acd0
+....
+
+Denken Sie dabei daran, dass Sie gegebenenfalls die Gerätedatei (hier [.filename]#acd0#) an Ihre Konfiguration anpassen müssen.
+
+Nachdem die DVD-RAM formatiert ist, kann sie wie eine normale Festplatte gemountet werden:
+
+[source,bash]
+....
+# mount /dev/acd0 /mnt
+....
+
+Danach kann schreibend und lesend auf das DVD-RAM Medium zugegriffen werden.
+
+[[floppies]]
+== Disketten benutzen
+
+Dieser Abschnitt beschreibt die Formatierung von 3,5 Zoll Disketten in FreeBSD.
+
+[.procedure]
+====
+.Procedure: Disketten formatieren
+
+Bevor eine Diskette benutzt werden kann, muss sie (low-level) formatiert werden, was normalerweise der Hersteller schon gemacht hat. Sie können die Diskette allerdings noch einmal formatieren, um das Medium zu überprüfen. Benutzen Sie man:fdformat[1], um Disketten unter FreeBSD zu formatieren. Achten Sie dabei auf Fehlermeldungen, die schlechte Speichermedien anzeigen.
+
+. Um eine Diskette zu formatieren, legen Sie eine 3,5 Zoll Diskette in das erste Diskettenlaufwerk ein und führen das folgende Kommando aus:
++
+[source,bash]
+....
+# /usr/sbin/fdformat -f 1440 /dev/fd0
+....
+
+. Nach dem Formatieren muss auf der Diskette ein Disklabel erstellt werden, um die Größe und Geometrie der Diskette zu erkennen. Eine Liste der unterstützten Geometrien finden Sie in [.filename]#/etc/disktab#.
++
+Erstellen Sie nun das Label mit man:bsdlabel[8]:
++
+[source,bash]
+....
+# /sbin/bsdlabel -B -w /dev/fd0 fd1440
+....
+
+. Auf der Diskette kann nun ein Dateisystem erstellt werden (high-level Formatierung). Das Dateisystem der Diskette kann entweder UFS oder FAT sein, wobei FAT für Disketten in der Regel die bessere Wahl ist.
++
+Um die Diskette mit FAT zu formatieren, geben Sie folgendes Kommando ein:
++
+[source,bash]
+....
+# /sbin/newfs_msdos /dev/fd0
+....
+====
+
+Die Diskette kann nun benutzt werden. Um die Diskette zu verwenden, kann sie mit man:mount_msdosfs[8] eingehängt werden. Man kann auch package:emulators/mtools[] aus der Ports-Sammlung installieren, um mit der Diskette zu arbeiten.
+
+[[backup-basics]]
+== Datensicherung
+
+Die Planung und Umsetzung einer Backup-Strategie ist unerlässlich, um Daten in bestimmten Situationen wiederherstellen zu können, zum Beispiel bei Plattendefekten, versehentlichem Löschen von Dateien, willkürlicher Korrumpierung von Dateien oder der vollständigen Zerstörung des Systems und der Backups, die am gleichen Ort aufbewahrt werden.
+
+Die Art und der Zeitplan des Backups kann variieren, abhängig von der Wichtigkeit der Daten, der benötigten Granularität zur Wiederherstellung von Dateien und der Dauer einer akzeptablen Ausfallzeit. Zu den möglichen Backup-Strategien gehören unter anderem:
+
+* Die Archivierung des kompletten Systems auf externen Datenträgern. Dieser Ansatz schützt zwar vor allen oben aufgeführten Problemen, ist aber zeitaufwändig und unbequem bei der Wiederherstellung, insbesondere für nicht privilegierte Benutzer.
+* Dateisystem-Snapshots sind nützlich bei der Wiederherstellung von gelöschten Dateien, bzw. früheren Versionen von Dateien.
+* Kopien ganzer Dateisysteme oder Festplatten, die mit einem anderen System im Netzwerk mittels package:net/rsync[] synchronisiert werden.
+* Hardware oder Software RAID, was im Falle von Plattendefekten die Ausfallzeit minimiert oder vermeidet.
+
+Üblicherweise wird eine Mischung aus verschiedenen Strategien verwendet. Es kann zum Beispiel ein Sicherungsplan erstellt und automatisiert werden, um eine wöchentliche, vollständige Systemsicherung, ergänzt mit stündlichen ZFS-Snapshots, zu erstellen. Darüber hinaus könnte man eine manuelle Sicherung einzelner Verzeichnisse oder Dateien machen, bevor diese bearbeitet oder gelöscht werden.
+
+Dieser Abschnitt beschreibt einige Programme, die zur Erstellung und Verwaltung von Sicherungen unter FreeBSD verwendet werden können.
+
+=== Sicherung von Dateisystemen
+
+Die traditionellen UNIX(R)-Programme zum Sichern und Wiederherstellen von Dateisystemen sind man:dump[8] und man:restore[8]. Diese Programme arbeiten auf der Block-Ebene der Festplatte, also unterhalb des Abstraktionslevels von Dateien, Links und Verzeichnissen, die die Grundlage des Dateisystemkonzepts bilden. Im Gegensatz zu anderen Backup-Programmen sichert `dump` ein ganzes Dateisystem und nicht nur einen Teil des Dateisystems, oder einen Verzeichnisbaum, der mehr als ein Dateisystem umfasst. Anstatt Dateien oder Verzeichnisse zu schreiben, schreibt `dump` die Blöcke, aus denen die Dateien und Verzeichnisse bestehen.
+
+[NOTE]
+====
+Wird `dump` benutzt, um das Root-Verzeichnis zu sichern, werden [.filename]#/home#, [.filename]#/usr# und viele andere Verzeichnisse nicht gesichert, da dies normalerweise Mountpunkte für andere Dateisysteme oder symbolische Links zu diesen Dateisystemen sind.
+====
+
+Wenn `restore` zum Extrahieren von Daten verwendet wird, werden temporäre Dateien standardmäßig in [.filename]#/tmp# abgelegt. Wenn Sie von einer Platte mit einem kleinen [.filename]#/tmp#-Verzeichnis zurücksichern, setzen Sie die Umgebungsvariable `TMPDIR` auf ein Verzeichnis mit mehr freiem Speicherplatz, damit die Wiederherstellung gelingt.
+
+Beachten Sie bei der Verwendung von `dump`, dass es einige Eigenarten aus den frühen Tagen der Version 6 von AT&T UNIX(R) (ca. 1975) beibehalten hat. Die Standardparameter gehen davon aus, dass auf einem 9-Spur-Band gesichert wird, und nicht auf ein anderes Medium oder auf Sicherungsbänder mit hoher Dichte. Diese Standardwerte müssen auf der Kommandozeile überschrieben werden.
+
+Es ist möglich, das Dateisystem über das Netzwerk auf einem anderen Rechner zu sichern, oder auf einem Bandlaufwerk eines anderen Rechners. Obwohl die Programme man:rdump[8] und man:rrestore[8] für diese Zwecke benutzt werden können, gelten sie als nicht sicher.
+
+Verwenden Sie stattdessen `dump` und `restore` in einer sichereren Weise über eine SSH-Verbindung. In diesem Beispiel wird eine vollständige, komprimierte Sicherung von [.filename]#/usr# erstellt, das anschließend an einen bestimmten Host über eine SSH-Verbindung gesendet wird.
+
+.`dump` mit ssh benutzen
+[example]
+====
+
+[source,bash]
+....
+# /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \
+ targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz
+....
+
+====
+
+In diesem Beispiel wird `RSH` gesetzt, um über eine SSH-Verbindung eine Sicherung auf ein Bandlaufwerk eines entfernten Systems zu schreiben:
+
+.`dump` über ssh mit gesetzter `RSH` benutzen
+[example]
+====
+
+[source,bash]
+....
+# env RSH=/usr/bin/ssh /sbin/dump -0uan -f tatargetuser@targetmachine.example.com:/dev/sa0 /usr
+....
+
+====
+
+=== Sicherung von Verzeichnissen
+
+Einige integrierte Werkzeuge stehen zur Sicherung und Wiederherstellung von bestimmten Dateien und Verzeichnissen bei Bedarf zur Verfügung.
+
+Wenn es um die Sicherung von Dateien in einem Verzeichnis geht, ist man:tar[1] eine gute Wahl. Dieses Werkzeug stammt aus Version 6 von AT&T UNIX(R) und erwartet standardmäßig eine rekursive Sicherung auf ein lokales Band. Es können jedoch Optionen angegeben werden, um den Namen einer Sicherungsdatei zu bestimmen.
+
+In diesem Beispiel wird eine komprimierte Sicherung des aktuellen Verzeichnisses nach [.filename]#/tmp/mybackup.tgz# gespeichert. Achten Sie bei der Sicherungsdatei darauf, dass sie nicht in dem Verzeichnis gespeichert wird, welches gesichert werden soll.
+
+.Das aktuelle Verzeichnis mit `tar` sichern
+[example]
+====
+
+[source,bash]
+....
+# tar czvf /tmp/mybackup.tgz .
+....
+
+====
+
+Um eine komplette Sicherung wiederherzustellen, wechseln Sie mit `cd` in das Verzeichnis, in dem Sie die Daten wiederherstellen möchten und geben Sie den Namen der Sicherungsdatei an. Beachten Sie, dass dabei alle Dateien in dem Verzeichnis überschrieben werden. Im Zweifel sichern Sie besser in einem temporären Verzeichnis, oder geben Sie den Verzeichnisnamen bei der Wiederherstellung an.
+
+.Wiederherstellung mit `tar` in das aktuelle Verzeichnis
+[example]
+====
+
+[source,bash]
+....
+# tar xzvf /tmp/mybackup.tgz
+....
+
+====
+
+Es gibt dutzende Optionen, die in man:tar[1] beschrieben werden. Das Programm unterstützt auch die Verwendung von Ausschlußmustern, um bestimmte Dateien von der Sicherung oder Wiederherstellung von Verzeichnissen auszuschließen.
+
+Um bestimmte, aufgelistete Dateien und Verzeichnisse zu sichern, ist man:cpio[1] eine gute Wahl. Im Gegensatz zu `tar` weiß `cpio` nicht wie ein Verzeichnisbaum durchlaufen wird. Daher ist es auf eine Liste von zu sichernden Dateien angewiesen.
+
+So kann beispielsweise eine Liste von Dateien mit `ls` oder `find` erzeugt werden. Dieses Beispiel erstellt eine rekursive Liste des aktuellen Verzeichnisses, die dann über eine Pipe an `cpio` übergeben wird, um eine Sicherung namens [.filename]#/tmp/mybackup.cpio# zu erstellen.
+
+.Rekursive Sicherung des aktuellen Verzeichnisses mit `ls` und `cpio`
+[example]
+====
+
+[source,bash]
+....
+# ls -R | cpio -ovF /tmp/mybackup.cpio
+....
+
+====
+
+man:pax[1] ist ein Programm, welches versucht die Funktionen von `tar` und `cpio` zu kombinieren. Über die Jahre hinweg sind die verschiedenen Versionen von `tar` und `cpio` leicht inkompatibel geworden. Daher hat POSIX(R) `pax` geschaffen, welches versucht viele der unterschiedlichen `cpio`- und `tar`-Formate zu lesen und zu schreiben, außerdem einige neue, eigene Formate.
+
+Für die vorangegangenen Beispiele wäre ein äquivalenter Aufruf von `pax`:
+
+.Das aktuelle Verzeichnis mit `pax` sichern
+[example]
+====
+
+[source,bash]
+....
+# pax -wf /tmp/mybackup.pax .
+....
+
+====
+
+[[backups-tapebackups]]
+=== Bandmedien benutzen
+
+Obwohl sich Bandmedien mit der Zeit weiterentwickelt haben, verwenden moderne Backup-Systeme in der Regel Offsite-Backups in Verbindung mit lokalen Wechseldatenträgern. FreeBSD unterstützt alle SCSI-Bandlaufwerke, wie etwa LTO und DAT. Zusätzlich gibt es begrenzte Unterstützung für SATA- und USB-Bandlaufwerke.
+
+Für SCSI-Bandlaufwerke nutzt FreeBSD den man:sa[4] Treiber, der die Schnittstellen [.filename]#/dev/sa0#, [.filename]#/dev/nsa0# und [.filename]#/dev/esa0# bereitstellt. Der Name des physikalischen Geräts ist [.filename]#/dev/sa0#. Wird [.filename]#/dev/nsa0# benutzt, dann wird die Backup-Anwendung nach dem Schreibvorgang das Band nicht zurückspulen, was es ermöglicht, mehr als eine Datei auf das Band zu schreiben. Die Verwendung von [.filename]#/dev/esa0# wirft das Band aus, nachdem das Gerät geschlossen wurde.
+
+FreeBSD nutzt `mt` für die Steuerung der Operationen des Bandlaufwerks, wie die Suche nach Dateien auf einem Band, oder um Kontrollmarkierungen auf ein Band zu schreiben. Beispielsweise können die ersten drei Dateien auf einem Band erhalten bleiben, indem sie übersprungen werden, bevor eine neue Datei auf das Band geschrieben wird
+
+[source,bash]
+....
+# mt -f /dev/nsa0 fsf 3
+....
+
+Dieses Werkzeug unterstützt viele Operationen. Weitere Einzelheiten finden Sie in man:mt[1].
+
+Um eine Datei mit `tar` auf ein Band zu schreiben, geben Sie den Namen des Bandlaufwerks und den Dateinamen an:
+
+[source,bash]
+....
+# tar cvf /dev/sa0 file
+....
+
+Wiederherstellung von Dateien aus dem `tar`-Archiv von Band in das aktuelle Verzeichnis:
+
+[source,bash]
+....
+# tar xvf /dev/sa0
+....
+
+Benutzen Sie `dump`, um ein UFS-Dateisystem zu sichern. Dieses Beispiel sichert [.filename]#/usr#, ohne danach das Band zurückzuspulen:
+
+[source,bash]
+....
+# dump -0aL -b64 -f /dev/nsa0 /usr
+....
+
+Interaktive Wiederherstellung von Dateien aus einer man:dump[8]-Datei von Band in das aktuelle Verzeichnis:
+
+[source,bash]
+....
+# restore -i -f /dev/nsa0
+....
+
+[[backups-programs-amanda]]
+=== Backup-Software von Drittanbietern
+
+Die FreeBSD Ports-Sammlung enthält viele Programme von Drittanbietern, die verwendet werden können um die zeitliche Erstellung von Sicherungen zu planen, zu vereinfachen und bequemer zu machen. Viele dieser Programme basieren auf dem Client-Server-Modell und können benutzt werden, um die Sicherung von einzelnen Systemen oder allen Rechnern in einem Netzwerk zu automatisieren.
+
+Zu den bekannten Programmen gehören Amanda, Bacula, rsync und duplicity.
+
+=== Die Wiederherstellung in einem Notfall
+
+Zusätzlich zu den regelmäßigen Sicherungen empfiehlt es sich, die folgenden Schritte im Rahmen eines Notfallplans durchzuführen.
+
+Erstellen Sie einen Ausdruck der Ausgabe der folgenden Kommandos:
+
+* `gpart show`
+* `more /etc/fstab`
+* `dmesg`
+
+Bewahren Sie diesen Ausdruck und eine Kopie des Installationsmediums an einem sicheren Ort auf. Im Falle einer Wiederherstellung im Notfall, starten Sie von dem Installationsmedium und wählen Sie `Live CD`, um eine Rettungs-Shell zu starten. Dieser Rettungsmodus kann verwendet werden, um den aktuellen Stand des Systems anzuzeigen, und wenn nötig, Festplatten zu formatieren und Daten aus den Sicherungen wiederherzustellen.
+
+[NOTE]
+====
+Das Installationsmedium für FreeBSD/i386 {rel112-current}-RELEASE enthält keine Rettungs-Shell. Laden Sie für diese Version ein Abbild der Livefs CD von link:ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/{rel112-current}/FreeBSD-{rel112-current}-RELEASE-i386-livefs.iso[ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/{rel112-current}/FreeBSD-{rel112-current}-RELEASE-i386-livefs.iso].
+====
+
+Als nächstes testen Sie die Rettungs-Shell und die Sicherungen. Dokumentieren Sie diesen Ablauf. Bewahren Sie diese Notizen zusammen mit den Medien, den Ausdrucken und den Sicherungen auf. Diese Notizen können Ihnen im Notfall helfen eine versehentliche Zerstörung der Sicherungen zu verhindern, während Sie unter Stress eine Wiederherstellung durchführen.
+
+Als zusätzliche Sicherheitsvorkehrung kann jeweils die letzte Sicherung an einem entfernten Standort aufbewahrt werden. Dieser Standort sollte räumlich von den Computern und Festplatten durch eine erhebliche Entfernung getrennt sein.
+
+[[disks-virtual]]
+== Speicherbasierte Laufwerke
+
+Neben physikalischen Laufwerken unterstützt FreeBSD auch speicherbasierte Laufwerke. Eine mögliche Verwendung für ein speicherbasiertes Laufwerk ist der Zugriff auf ein ISO-Dateisystem, jedoch ohne vorher die Daten auf eine CD oder DVD zu brennen und dann das Medium einzuhängen.
+
+FreeBSD verwendet den man:md[4] Treiber um Unterstützung für speicherbasierte Laufwerke bereitzustellen. Dieser Treiber ist bereits im [.filename]#GENERIC#-Kernel enthalten. Wenn Sie eine angepasste Kernelkonfigurationsdatei verwenden, stellen Sie sicher, dass folgende Zeile enthalten ist:
+
+[.programlisting]
+....
+device md
+....
+
+[[disks-mdconfig]]
+=== Ein- und Aushängen von bestehenden Abbildern
+
+Um ein bestehendes Abbild eines Dateisystems einzuhängen, verwenden Sie `mdconfig` zusammen mit dem Namen der ISO-Datei und einer freien Gerätenummer. Benutzen Sie dann diese Gerätenummer, um das Abbild in einen existierenden Mountpunkt einzuhängen. Sobald dies erledigt ist, erscheinen die Dateien des Abbildes unterhalb des Mountpunktes. Dieses Beispiel wird [.filename]#diskimage.iso# an das speicherbasierte Laufwerk [.filename]#/dev/md0# binden und dann in [.filename]#/mnt# einhängen:
+
+[source,bash]
+....
+# mdconfig -f diskimage.iso -u 0
+# mount -t cd9660 /dev/md0 /mnt
+....
+
+Beachten Sie, dass `-t cd9660` benutzt wurde, um ein ISO-Format einzuhängen. Wenn keine Gerätenummer mit `-u` angegeben ist, wird von man:md[4] automatisch eine ungenutzte Gerätenummer zugewiesen. Das zugewiesene Gerät wird auf der Standardausgabe ausgegeben (zum Beispiel [.filename]#md4#). Weitere Informationen zu diesem Kommando und dessen Optionen finden Sie in man:mdconfig[8].
+
+Wenn ein speicherbasiertes Laufwerk nicht mehr in Gebrauch ist, sollten seine belegten Ressourcen wieder an das System zurückgegeben werden. Hängen Sie zuerst das Dateisystem aus, dann verwenden Sie `mdconfig`, um die Platte vom System zu trennen und die Ressourcen freizugeben.
+
+[source,bash]
+....
+# umount /mnt
+# mdconfig -d -u 0
+....
+
+Um festzustellen, ob noch irgendwelche speicherbasierten Laufwerke am System angeschlossen sind, benutzen Sie `mdconfig -l`.
+
+[[disks-md-freebsd5]]
+=== Ein datei- oder speicherbasiertes Laufwerk erzeugen
+
+FreeBSD unterstützt auch speicherbasierte Laufwerke, bei denen der verwendete Speicher entweder einer Festplatte, oder einem Bereich im Arbeitsspeicher zugewiesen wird. Die erste Methode ist gemeinhin als dateibasiertes Dateisystem, die zweite als speicherbasiertes Dateisystem bekannt. Beide Typen können mit `mdconfig` erzeugt werden.
+
+Um ein speicherbasiertes Dateisystem zu erstellen, geben Sie den Typ `swap` sowie die gewünschte Größe des Laufwerks an. Dieses Beispiel erzeugt ein 5 MB großes Laufwerk an der Gerätenummer `1`. Das Laufwerk wird mit dem UFS-Dateisystem formatiert, bevor es eingehängt wird:
+
+[source,bash]
+....
+# mdconfig -a -t swap -s 5m -u 1
+# newfs -U md1
+/dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048
+ using 4 cylinder groups of 1.27MB, 81 blks, 192 inodes.
+ with soft updates
+super-block backups (for fsck -b #) at:
+ 160, 2752, 5344, 7936
+# mount /dev/md1 /mnt
+# df /mnt
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md1 4718 4 4338 0% /mnt
+....
+
+Um ein dateibasiertes Dateisystem zu erstellen, muss zunächst ein Stück Speicher auf der Festplatte reserviert werden. Dieses Beispiel erzeugt eine 5 MB große Datei namens [.filename]#newimage#:
+
+[source,bash]
+....
+# dd if=/dev/zero of=newimage bs=1k count=5k
+5120+0 records in
+5120+0 records out
+....
+
+Als nächstes muss diese Datei an ein speicherbasiertes Laufwerk gebunden, gelabelt und mit dem UFS-Dateisystem formatiert werden. Danach können Sie das Laufwerk einhängen und die Größe überprüfen:
+
+[source,bash]
+....
+# mdconfig -f newimage -u 0
+# bsdlabel -w md0 auto
+# newfs -U md0a
+/dev/md0a: 5.0MB (10224 sectors) block size 16384, fragment size 2048
+ using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes.
+super-block backups (for fsck -b #) at:
+ 160, 2720, 5280, 7840
+# mount /dev/md0a /mnt
+# df /mnt
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md0a 4710 4 4330 0% /mnt
+....
+
+Es benötigt mehrere Befehle, um ein datei- oder speicherbasiertes Dateisystem mit `mdconfig` zu erstellen. FreeBSD enthält auch `mdmfs`, das ein speicherbasiertes Laufwerk automatisch konfigurieren, formatieren und einhängen kann. Nachdem beispielsweise [.filename]#newimage# mit `dd` erstellt wurde, hätte auch der folgende Befehl benutzt werden können, anstelle der oben verwendeten Kommandos `bsdlabel`, `newfs` und `mount`:
+
+[source,bash]
+....
+# mdmfs -F newimage -s 5m md0 /mnt
+....
+
+Um hingegen ein speicherbasiertes Laufwerk mit `mdmfs` zu erstellen, wird dieser Befehl benutzt:
+
+[source,bash]
+....
+# mdmfs -s 5m md1 /mnt
+....
+
+Wenn die Gerätenummer nicht angegeben wird, wählt `mdmfs` automatisch ein ungenutztes Gerät aus. Weitere Einzelheiten über `mdmfs` finden Sie in man:mdmfs[8].
+
+[[snapshots]]
+== Schnappschüsse von Dateisystemen
+
+Zusammen mit crossref:cutting-edge[soft-updates,Soft Updates] bietet FreeBSD eine weitere Funktion: Schnappschüsse von Dateisystemen.
+
+UFS-Schnappschüsse sind Dateien, die ein Abbild eines Dateisystems enthalten und müssen auf dem jeweiligen Dateisystem erstellt werden. Pro Dateisystem darf es maximal 20 Schnappschüsse, die im Superblock vermerkt werden, geben. Schnappschüsse bleiben erhalten, wenn das Dateisystem abgehangen, neu eingehangen oder das System neu gestartet wird. Wenn ein Schnappschuss nicht mehr benötigt wird, kann er mit man:rm[1] gelöscht werden. Es ist egal, in welcher Reihenfolge Schnappschüsse gelöscht werden. Es kann allerdings vorkommen, dass nicht der gesamte Speicherplatz wieder freigegeben wird, da ein anderer Schnappschuss einen Teil der entfernten Blöcke für sich beanspruchen kann.
+
+Das unveränderliche `Snapshot`-Dateiflag wird nach der Erstellung des Snapshots von man:mksnap_ffs[8] gesetzt. Durch die Verwendung von man:unlink[1] ist es allerdings möglich, einen Schnappschuss zu löschen.
+
+Schnappschüsse werden mit man:mount[8] erstellt. Das folgende Kommando legt einen Schnappschuss von [.filename]#/var# in [.filename]#/var/snapshot/snap# ab:
+
+[source,bash]
+....
+# mount -u -o snapshot /var/snapshot/snap /var
+....
+
+Alternativ kann der Schnappschuss auch mit man:mksnap_ffs[8] erstellt werden.
+
+[source,bash]
+....
+# mksnap_ffs /var /var/snapshot/snap
+....
+
+Um Schnappschüsse auf einem Dateisystem, beispielsweise [.filename]#/var# zu finden, kann man man:find[1] verwenden:
+
+[source,bash]
+....
+# find /var -flags snapshot
+....
+
+Nachdem ein Schnappschuss erstellt wurde, können Sie ihn für verschiedene Zwecke benutzen:
+
+* Sie können den Schnappschuss für die Datensicherung benutzen und ihn auf eine CD oder ein Band schreiben.
+* Die Integrität des Schnappschusses kann mit man:fsck[8] geprüft werden. Wenn das Dateisystem zum Zeitpunkt der Erstellung des Schnappschusses in Ordnung war, sollte man:fsck[8] immer erfolgreich durchlaufen.
+* Sie können den Schnappschuss mit man:dump[8] sichern. Sie erhalten dann eine konsistente Sicherung des Dateisystems zu dem Zeitpunkt, der durch den Zeitstempel des Schnappschusses gegeben ist. Der Schalter `-L` von man:dump[8] erstellt für die Sicherung einen Schnappschuss und entfernt diesen am Ende der Sicherung wieder.
+* Sie können einen Schnappschuss in den Verzeichnisbaum einhängen und sich dann den Zustand des Dateisystems zu dem Zeitpunkt ansehen, an dem der Schnappschuss erstellt wurde. Der folgende Befehl hängt den Schnappschuss [.filename]#/var/snapshot/snap# ein:
++
+
+[source,bash]
+....
+# mdconfig -a -t vnode -o readonly -f /var/snapshot/snap -u 4
+# mount -r /dev/md4 /mnt
+....
+
+Der eingefrorene Stand des [.filename]#/var#-Dateisystems ist nun unterhalb von [.filename]#/mnt# verfügbar. Mit Ausnahme der früheren Schnappschüsse, die als leere Dateien auftauchen, wird zu Beginn alles so aussehen, wie zum Zeitpunkt der Erstellung des Schnappschusses. Der Schnappschuss kann wie folgt abgehängt werden:
+
+[source,bash]
+....
+# umount /mnt
+# mdconfig -d -u 4
+....
+
+Weitere Informationen über Soft Updates und Schnappschüsse von Dateisystemen sowie technische Artikel finden Sie auf der http://www.mckusick.com/[Webseite von Marshall Kirk McKusick].
+
+[[quotas]]
+== Disk Quotas
+
+Disk Quotas erlauben dem Administrator, den Plattenplatz und/oder die Anzahl der Dateien eines Benutzers oder der Mitglieder einer Gruppe, auf Dateisystemebene zu beschränken. Dadurch wird verhindert, dass ein Benutzer oder eine Gruppe von Benutzern den ganzen verfügbaren Plattenplatz belegt.
+
+Dieser Abschnitt beschreibt die Konfiguration von Disk Quotas für UFS-Dateisysteme. Lesen Sie crossref:zfs[zfs-zfs-quota,"Dataset-, Benutzer- und Gruppenquotas"], wenn Sie Disk Quotas auf einem ZFS-Dateisystem einrichten möchten.
+
+=== Disk Quotas aktivieren
+
+Prüfen Sie zunächst, ob der FreeBSD-Kernel Disk Quotas unterstützt:
+
+[source,bash]
+....
+% sysctl kern.features.ufs_quota
+kern.features.ufs_quota: 1
+....
+
+In diesem Beispiel zeigt die `1` an, das Quotas unterstützt werden. Falls `0` ausgegeben wird, fügen Sie folgende Zeile in die Kernelkonfigurationsdatei ein, und folgen Sie den Anweisungen in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] um den Kernel zu aktualisieren:
+
+[.programlisting]
+....
+options QUOTA
+....
+
+Als nächstes aktivieren Sie Disk Quotas in [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+quota_enable="YES"
+....
+
+Normalerweise wird beim Booten die Integrität der Quotas auf allen Dateisystemen mit man:quotacheck[8] überprüft. Dieses Programm stellt sicher, dass die Quota-Datenbank mit den Daten auf einem Dateisystem übereinstimmt. Dies ist allerdings ein zeitraubender Prozess, der die Zeit, die das System zum Booten braucht, signifikant beeinflusst. Eine Variable in [.filename]#/etc/rc.config# erlaubt es, diesen Schritt zu überspringen:
+
+[.programlisting]
+....
+check_quotas="NO"
+....
+
+Zuletzt muss noch [.filename]#/etc/fstab# bearbeitet werden, um die Plattenquotas auf Dateisystemebene zu aktivieren. Um Quotas pro Benutzer für ein Dateisystem zu aktivieren, geben Sie für dieses Dateisystem `userquota` im Feld Optionen von [.filename]#/etc/fstab# an. Zum Beispiel:
+
+[.programlisting]
+....
+/dev/da1s2g /home ufs rw,userquota 1 2
+....
+
+Um Quotas für Gruppen einzurichten, verwenden Sie `groupquota`. Um Quotas für Benutzer und Gruppen einzurichten, trennen Sie die Optionen durch Kommata:
+
+[.programlisting]
+....
+/dev/da1s2g /home ufs rw,userquota,groupquota 1 2
+....
+
+Quota-Dateien werden standardmäßig im Rootverzeichnis des Dateisystems unter [.filename]#quota.user# und [.filename]#quota.group# abgelegt. Weitere Informationen finden Sie in man:fstab[5]. Es wird nicht empfohlen, Quota-Dateien an anderen Stellen zu speichern.
+
+Sobald die Konfiguration abgeschlossen ist, starten Sie das System neu. [.filename]#/etc/rc# wird dann automatisch die richtigen Kommandos aufrufen, um die Quota-Dateien für alle in [.filename]#/etc/rc.conf# definierten Quotas anzulegen.
+
+Normalerweise brauchen die Kommandos man:quotacheck[8], man:quotaon[8] oder man:quotaoff[8] nicht von Hand aufgerufen werden, obwohl man die entsprechenden Seiten im Manual lesen sollte, um sich mit ihnen vertraut zu machen.
+
+=== Setzen von Quota-Limits
+
+Stellen Sie sicher, dass Quotas auch tatsächlich aktiviert sind:
+
+[source,bash]
+....
+# quota -v
+....
+
+Für jedes Dateisystem, auf dem Quotas aktiviert sind, sollte eine Zeile mit der Plattenauslastung und den aktuellen Quota-Limits zu sehen sein.
+
+Mit `edquota` können nun Quota-Limits zugewiesen werden.
+
+Mehrere Möglichkeiten stehen zur Verfügung, um Limits für den Plattenplatz, den ein Benutzer oder eine Gruppe verbrauchen kann, oder die Anzahl der Dateien, die angelegt werden dürfen, festzulegen. Die Limits können auf dem Plattenplatz (Block-Quotas), der Anzahl der Dateien (Inode-Quotas) oder einer Kombination von beiden basieren. Jedes Limit wird weiterhin in zwei Kategorien geteilt: Hardlimits und Softlimits.
+
+Ein Hardlimit kann nicht überschritten werden. Hat der Benutzer einmal ein Hardlimit erreicht, so kann er auf dem betreffenden Dateisystem keinen weiteren Platz mehr beanspruchen. Hat ein Benutzer beispielsweise ein Hardlimit von 500 Kilobytes auf einem Dateisystem und benutzt davon 490 Kilobyte, so kann er nur noch 10 weitere Kilobytes beanspruchen. Der Versuch, weitere 11 Kilobytes zu beanspruchen, wird fehlschlagen.
+
+Softlimits können für eine befristete Zeit überschritten werden. Diese Frist beträgt in der Grundeinstellung eine Woche. Hat der Benutzer das Softlimit über die Frist hinaus überschritten, so wird das Softlimit in ein Hardlimit umgewandelt und der Benutzer kann keinen weiteren Platz mehr beanspruchen. Wenn er einmal das Softlimit unterschreitet, wird die Frist wieder zurückgesetzt.
+
+Im folgenden Beispiel wird das Quota des Benutzerkonto `test` bearbeitet. Wenn `edquota` aufgerufen wird, wird der in `EDITOR` definierte Editor aufgerufen, um die Quota-Limts zu konfigurieren. Der Standard-Editor ist vi.
+
+[source,bash]
+....
+# edquota -u test
+
+Quotas for user test:
+
+/usr: kbytes in use: 65, limits (soft = 50, hard = 75)
+ inodes in use: 7, limits (soft = 50, hard = 60)
+/usr/var: kbytes in use: 0, limits (soft = 50, hard = 75)
+ inodes in use: 0, limits (soft = 50, hard = 60)
+....
+
+Für jedes Dateisystem, auf dem Quotas aktiv sind, sind zwei Zeilen zu sehen. Eine repräsentiert die Block-Quotas und die andere die Inode-Quotas. Um ein Limit zu modifizieren, ändern Sie einfach den angezeigten Wert. Um beispielsweise das Blocklimit von [.filename]#/usr# auf ein Softlimit von `500` und ein Hardlimit von `600` zu erhöhen, ändern Sie die Zeile wie folgt:
+
+[.programlisting]
+....
+/usr: kbytes in use: 65, limits (soft = 500, hard = 600)
+....
+
+Die neuen Limits sind wirksam, sobald der Editor verlassen wird.
+
+Manchmal ist es wünschenswert, die Limits für eine Reihe von Benutzern zu setzen. Dazu weisen Sie zunächst einem Benutzer das gewünschte Quota-Limit zu. Anschließend benutzen Sie `-p`, um das Quota auf einen bestimmten Bereich von Benutzer-IDs (UID) zu duplizieren. Der folgende Befehl dupliziert die Quota-Limits auf die UIDs `10000` bis `19999`:
+
+[source,bash]
+....
+# edquota -p test 10000-19999
+....
+
+Weitere Informationen finden Sie in man:edquota[8].
+
+=== Überprüfen von Quota-Limits und Plattennutzung
+
+Um die Limits oder die Plattennutzung individueller Benutzer und Gruppen zu überprüfen, kann man:quota[1] benutzt werden. Ein Benutzer kann nur die eigenen Quotas und die Quotas der Gruppe, der er angehört untersuchen. Nur der Superuser darf sich alle Limits ansehen. Mit man:repquota[8] erhalten Sie eine Zusammenfassung von allen Limits und der Plattenausnutzung für alle Dateisysteme, auf denen Quotas aktiv sind.
+
+In der Ausgabe von man:quota[1] werden Dateisysteme, auf denen ein Benutzer keinen Platz verbraucht, nicht angezeigt, auch wenn diesem Quotas zugewiesen wurden. Benutzen Sie `-v` um solche Dateisysteme ebenfalls anzuzeigen. Das folgende Beispiel zeigt die Ausgabe von `quota -v` für einen Benutzer, der Quota-Limits auf zwei Dateisystemen besitzt:
+
+[.programlisting]
+....
+Disk quotas for user test (uid 1002):
+ Filesystem usage quota limit grace files quota limit grace
+ /usr 65* 50 75 5days 7 50 60
+ /usr/var 0 50 75 0 50 60
+....
+
+Im Dateisystem [.filename]#/usr# liegt der Benutzer momentan 15 Kilobytes über dem Softlimit von 50 Kilobytes und hat noch 5 Tage seiner Frist übrig. Der Stern `*` zeigt an, dass der Benutzer sein Limit überschritten hat.
+
+=== Quotas über NFS
+
+Quotas werden von dem Quota-Subsystem auf dem NFS-Server erzwungen. Der man:rpc.rquotad[8] Daemon stellt `quota` die Quota Informationen auf dem NFS-Client zur Verfügung, so dass Benutzer auf diesen Systemen ihre Quotas abfragen können.
+
+Sie aktivieren `rpc.rquotad` auf dem NFS-Server, indem Sie das Zeichen `#` auf folgender Zeile in [.filename]##/etc/inetd.conf## entfernen:
+
+[.programlisting]
+....
+rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad
+....
+
+Anschließend starten Sie `inetd` neu:
+
+[source,bash]
+....
+# service inetd restart
+....
+
+[[disks-encrypting]]
+== Partitionen verschlüsseln
+
+FreeBSD bietet ausgezeichnete Möglichkeiten, Daten vor unberechtigten Zugriffen zu schützen. Wenn das Betriebssystem läuft, schützen Zugriffsrechte und vorgeschriebene Zugriffskontrollen (MAC) (siehe crossref:mac[mac,Verbindliche Zugriffskontrolle]) die Daten. Die Zugriffskontrollen des Betriebssystems schützen allerdings nicht vor einem Angreifer, der Zugriff auf den Rechner hat. Der Angreifer kann eine Festplatte in ein anderes System einbauen und dort die Daten analysieren.
+
+Die für FreeBSD verfügbaren kryptografischen Subsysteme, GEOM Based Disk Encryption (`gbde`) und `geli` sind in der Lage, Daten auf Dateisystemen auch vor hoch motivierten Angreifern zu schützen, die über erhebliche Mittel verfügen. Dieser Schutz ist unabhängig von der Art und Weise, durch die ein Angreifer Zugang zu einer Festplatte oder zu einem Rechner erlangt hat. Im Gegensatz zu anderen Verschlüsselungsmethoden, bei denen einzelne Dateien verschlüsselt werden, verschlüsseln gbde und `geli` transparent ganze Dateisysteme. Auf der Festplatte werden dabei keine Daten im Klartext gespeichert.
+
+Dieses Kapitel zeigt, wie ein verschlüsseltes Dateisystem unter FreeBSD erstellt wird. Zunächst wird der Ablauf für gbde beschrieben und anschließend das gleiche Beispiel für geli.
+
+=== Plattenverschlüsselung mit gbde
+
+Das Ziel von man:gbde[4] ist es, einen Angreifer vor eine große Herausforderung zu stellen, um an die Daten einer Festplatte zu gelangen. Falls jedoch der Rechner kompromittiert wurde, während er im Betrieb war und das Speichergerät aktiv verbunden war, oder wenn der Angreifer eine gültige Passphrase kennt, bietet dieses System keinen Schutz für die Daten der Festplatte. Daher ist es wichtig, für die physische Sicherheit zu sorgen, während das System im Betrieb ist. Außerdem muss die Passphrase für den Verschlüsselungsmechanismus geschützt werden.
+
+man:gbde[4] besitzt einige Funktionen um die Daten, die in einem Sektor gespeichert sind, zu schützen. Es benutzt 128-Bit AES im CBC-Modus, um die Daten eines Sektors zu verschlüsseln. Jeder Sektor einer Festplatte wird mit einem anderen AES-Schlüssel verschlüsselt. Weitere Informationen zum kryptographischen Design und wie die Schlüssel für einen Sektor aus der gegebenen Passphrase ermittelt werden, finden Sie in man:gbde[4].
+
+FreeBSD enthält ein Kernelmodul für gbde, das wie folgt geladen werden kann:
+
+[source,bash]
+....
+# kldload geom_bde
+....
+
+Wenn Sie einen angepassten Kernel verwenden, stellen Sie sicher, dass folgende Zeile in der Kernelkonfigurationsdatei enthalten ist:
+
+`options GEOM_BDE`
+
+Das folgende Beispiel beschreibt, wie eine Partition auf einer neuen Festplatte verschlüsselt wird. Die Partition wird in [.filename]#/private# eingehangen.
+
+[.procedure]
+.Procedure: Eine Partition mit gbde verschlüsseln
+. Installieren der Festplatte
++
+Installieren Sie die Festplatte wie in <<disks-adding>> beschrieben. Im Beispiel wird die Partition [.filename]#/dev/ad4s1c# verwendet. Die Gerätedateien [.filename]#/dev/ad0s1*# sind Standard-Partitionen des FreeBSD-Systems.
++
+[source,bash]
+....
+# ls /dev/ad*
+/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
+/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
+/dev/ad0s1a /dev/ad0s1d /dev/ad4
+....
+
+. Verzeichnis für gbde-Lock-Dateien anlegen
++
+[source,bash]
+....
+# mkdir /etc/gbde
+....
++
+Die Lock-Dateien sind für den Zugriff von gbde auf verschlüsselte Partitionen notwendig. Ohne die Lock-Dateien können die Daten nur mit erheblichem manuellen Aufwand wieder entschlüsselt werden (dies wird auch von der Software nicht unterstützt). Jede verschlüsselte Partition benötigt eine gesonderte Lock-Datei.
+. Vorbereiten der gbde-Partition
++
+Eine von gbde benutzte Partition muss einmalig initialisiert werden, bevor sie benutzt werden kann. Das Programm öffnet eine Vorlage im Standard-Editor, um verschiedene Optionen zu konfigurieren. Setzen Sie `sector_size` auf `2048`, wenn Sie UFS benutzen:
++
+[source,bash]
+....
+# gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock
+$FreeBSD: src/sbin/gbde/template.txt,v 1.1.36.1 2009/08/03 08:13:06 kensmith Exp $
+#
+# Sector size is the smallest unit of data which can be read or written.
+# Making it too small decreases performance and decreases available space.
+# Making it too large may prevent filesystems from working. 512 is the
+# minimum and always safe. For UFS, use the fragment size
+#
+sector_size = 2048
+[...]
+....
++
+Sobald die Änderungen gespeichert werden, wird der Benutzer zweimal aufgefordert, die zum Schutz der Daten verwendete Passphrase einzugeben. Die Passphrase muss beide Mal gleich eingegeben werden. Die Sicherheit der Daten hängt allein von der Qualität der gewählten Passphrase ab. Die Auswahl einer sicheren und leicht zu merkenden Passphrase wird auf der Webseite http://world.std.com/~reinhold/diceware.html[ http://world.std.com/~reinhold/diceware.html] beschrieben.
++
+Bei der Initialisierung wird eine Lock-Datei für die gbde-Partition erstellt. In diesem Beispiel [.filename]#/etc/gbde/ad4s1c.lock#. Lock-Dateien müssen die Dateiendung ".lock" aufweisen, damit sie von [.filename]#/etc/rc.d/gbde#, dem Startskript von gbde, erkannt werden.
++
+[CAUTION]
+====
+
+Lock-Dateien müssen immer zusammen mit den verschlüsselten Dateisystemen gesichert werden. Ohne die Lock-Datei können Sie allerdings nicht auf die verschlüsselten Daten zugreifen.
+====
+
+. Einbinden der verschlüsselten Partition in den Kernel
++
+[source,bash]
+....
+# gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock
+....
++
+Dieses Kommando fragt die Passphrase ab, die bei der Initialisierung der verschlüsselten Partition eingegeben wurde. Das neue verschlüsselte Gerät erscheint danach in [.filename]#/dev# als [.filename]#/dev/device_name.bde#:
++
+[source,bash]
+....
+# ls /dev/ad*
+/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
+/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
+/dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde
+....
+
+. Dateisystem auf dem verschlüsselten Gerät anlegen
++
+Nachdem die verschlüsselte Partition im Kernel eingebunden ist, kann ein Dateisystem erstellt werden. Dieses Beispiel erstellt ein UFS-Dateisystem mit aktivierten Soft Updates. Achten Sie darauf, die Partition mit der Erweiterung [.filename]#*.bde# zu benutzen:
++
+[source,bash]
+....
+# newfs -U -O2 /dev/ad4s1c.bde
+....
+
+. Einhängen der verschlüsselten Partition
++
+Legen Sie einen Mountpunkt für das verschlüsselte Dateisystem an. Hängen Sie anschließend das Dateisystem ein:
++
+[source,bash]
+....
+# mkdir /private
+# mount /dev/ad4s1c.bde /private
+....
+
+. Überprüfen des verschlüsselten Dateisystems
++
+Das verschlüsselte Dateisystem sollte jetzt erkannt und benutzt werden können:
++
+[source,bash]
+....
+% df -H
+Filesystem Size Used Avail Capacity Mounted on
+/dev/ad0s1a 1037M 72M 883M 8% /
+/devfs 1.0K 1.0K 0B 100% /dev
+/dev/ad0s1f 8.1G 55K 7.5G 0% /home
+/dev/ad0s1e 1037M 1.1M 953M 0% /tmp
+/dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr
+/dev/ad4s1c.bde 150G 4.1K 138G 0% /private
+....
+
+Nach jedem Neustart müssen verschlüsselte Dateisysteme dem Kernel wieder bekannt gemacht werden, auf Fehler überprüft werden und eingehangen werden. Für die dazu nötigen Schritte fügen Sie folgende Zeilen in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+gbde_autoattach_all="YES"
+gbde_devices="ad4s1c"
+gbde_lockdir="/etc/gbde"
+....
+
+Durch diese Argumente muss beim Systemstart auf der Konsole die Passphrase eingegeben werden. Erst nach Eingabe der korrekten Passphrase wird die verschlüsselte Partition automatisch in den Verzeichnisbaum eingehängt. Weitere Bootoptionen von gbde finden Sie in man:rc.conf[5].
+
+[NOTE]
+====
+sysinstall ist nicht kompatibel mit gbde-verschlüsselten Geräten. Bevor sysinstall gestartet wird, müssen alle [.filename]#*.bde# Geräte vom Kernel getrennt werden, da sonst der Kernel bei der ersten Suche nach Geräten abstürzt. Um das verschlüsselte Gerät aus dem Beispiel zu trennen, benutzen Sie das folgende Kommando:
+
+[source,bash]
+....
+# gbde detach /dev/ad4s1c
+....
+
+====
+
+[[disks-encrypting-geli]]
+=== Plattenverschlüsselung mit `geli`
+
+Mit `geli` steht eine alternative kryptografische GEOM-Klasse zur Verfügung. Dieses Werkzeug unterstützt unterschiedliche Fähigkeiten und verfolgt einen anderen Ansatz für die Verschlüsselung. geli bietet die folgenden Funktionen:
+
+* Die Nutzung des man:crypto[9]-Frameworks. Wenn das System über kryptografische Hardware verfügt, wird diese von `geli` automatisch verwendet.
+* Die Unterstützung verschiedener kryptografischer Algorithmen, wie AES, Blowfish, und 3DES.
+* Die Möglichkeit, die root-Partition zu verschlüsseln. Um auf die verschlüsselte root-Partition zugreifen zu können, muss beim Systemstart die Passphrase eingegeben werden.
+* Erlaubt den Einsatz von zwei voneinander unabhängigen Schlüsseln.
+* Es ist durch einfache Sektor-zu-Sektor-Verschlüsselung sehr schnell.
+* Die Möglichkeit, Master-Keys zu sichern und wiederherzustellen. Wenn ein Benutzer seinen Schlüssel zerstört, kann er über seinen zuvor gesicherten Schlüssel wieder auf seine Daten zugreifen.
+* `geli` erlaubt es, Platten mit einem zufälligen Einmal-Schlüssel einzusetzen, was für Swap-Partitionen und temporäre Dateisysteme interessant ist.
+
+Weitere Funktionen und Anwendungsbeispiele finden Sie in man:geli[8].
+
+Das folgende Beispiel beschreibt, wie eine Schlüsseldatei erzeugt wird, die als Teil des Master-Keys für den Verschlüsselungs-Provider verwendet wird, der unter [.filename]#/private# in den Verzeichnisbaum eingehängt wird. Die Schlüsseldatei liefert zufällige Daten, die für die Verschlüsselung des Master-Keys benutzt werden. Zusätzlich wird der Master-Key durch eine Passphrase geschützt. Die Sektorgröße des Providers beträgt 4 KB. Das Beispiel beschreibt, wie Sie einen `geli`-Provider aktivieren, ein vom ihm verwaltetes Dateisystem erzeugen, es mounten, mit ihm arbeiten und wie Sie es schließlich wieder unmounten und den Provider deaktivieren.
+
+[.procedure]
+.Procedure: Eine Partition mit `geli` verschlüsseln
+. Laden der `geli`-Unterstützung
++
+Die Unterstützung für `geli` wird über ein ladbares Kernelmodul zur Verfügung gestellt. Damit das Modul automatisch beim Booten geladen wird, fügen Sie folgende Zeile in [.filename]#/boot/loader.conf# ein:
++
+[.programlisting]
+....
+geom_eli_load="YES"
+....
++
+Um das Modul direkt zu laden:
++
+[source,bash]
+....
+# kldload geom_eli
+....
++
+Stellen Sie bei einer angepassten Kernelkonfigurationsdatei sicher, dass diese Zeilen enthalten sind:
++
+[.programlisting]
+....
+options GEOM_ELI
+device crypto
+....
+
+. Erzeugen des Master-Keys
++
+Die folgenden Befehle erzeugen einen Master-Key, mit dem alle Daten verschlüsselt werden. Dieser Schlüssel kann niemals geändert werden. Anstatt ihn direkt zu benutzen, wird er mit einem oder mehrere Schlüsseln verschlüsselt. Die Schlüssel bestehen aus einer optionalen Kombination von zufälligen Bytes aus einer Datei, [.filename]#/root/da2.key#, und/oder einer Passphrase. In diesem Fall ist die Datenquelle der Schlüsseldatei [.filename]#/dev/random#. Dieser Befehl konfiguriert auch die Sektorgröße des Providers ([.filename]#/dev/da2.eli#) mit 4 KB, um eine bessere Leistung zu erzielen:
++
+[source,bash]
+....
+# dd if=/dev/random of=/root/da2.key bs=64 count=1
+# geli init -K /root/da2.key -s 4096 /dev/da2
+Enter new passphrase:
+Reenter new passphrase:
+....
++
+Es ist nicht zwingend nötig, sowohl eine Passphrase als auch eine Schlüsseldatei zu verwenden. Die einzelnen Methoden können auch unabhängig voneinander eingesetzt werden.
++
+Wird für die Schlüsseldatei "-" angegeben, wird dafür die Standardeingabe verwendet. Das folgende Kommando erzeugt beispielsweise drei Schlüsseldateien:
++
+[source,bash]
+....
+# cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2
+....
+
+. Aktivieren des Providers mit dem erzeugten Schlüssel
++
+Um den Provider zu aktivieren, geben Sie die Schlüsseldatei, den Namen des Laufwerks und die Passphrase an:
++
+[source,bash]
+....
+# geli attach -k /root/da2.key /dev/da2
+Enter passphrase:
+....
++
+Dadurch wird ein neues Gerät mit der Erweiterung [.filename]#.eli# angelegt:
++
+[source,bash]
+....
+# ls /dev/da2*
+/dev/da2 /dev/da2.eli
+....
+
+. Das neue Dateisystem erzeugen
++
+Als nächstes muss das Gerät mit dem UFS-Dateisystem formatiert und an einen vorhandenen Mountpunkt eingehängt werden:
++
+[source,bash]
+....
+# dd if=/dev/random of=/dev/da2.eli bs=1m
+# newfs /dev/da2.eli
+# mount /dev/da2.eli /private
+....
++
+Das verschlüsselte Dateisystem sollte jetzt erkannt und benutzt werden können:
++
+[source,bash]
+....
+# df -H
+Filesystem Size Used Avail Capacity Mounted on
+/dev/ad0s1a 248M 89M 139M 38% /
+/devfs 1.0K 1.0K 0B 100% /dev
+/dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr
+/dev/ad0s1d 989M 1.5M 909M 0% /tmp
+/dev/ad0s1e 3.9G 1.3G 2.3G 35% /var
+/dev/da2.eli 150G 4.1K 138G 0% /private
+....
+
+Wenn Sie nicht mehr mit dem verschlüsselten Dateisystem arbeiten und die unter [.filename]#/private# eingehängte Partition daher nicht mehr benötigen, sollten Sie diese unmounten und den `geli`-Verschlüsselungs-Provider wieder deaktivieren:
+
+[source,bash]
+....
+# umount /private
+# geli detach da2.eli
+....
+
+FreeBSD verfügt über ein [.filename]#rc.d#-Skript, das dass Einhängen von verschlüsselten Geräten beim Booten deutlich vereinfacht. Für dieses Beispiel, fügen Sie folgende Zeilen in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+geli_devices="da2"
+geli_da2_flags="-p -k /root/da2.key"
+....
+
+Dies konfiguriert [.filename]#/dev/da2# als `geli`-Provider mit dem Master-Key [.filename]#/root/da2.key#. Das System wird den Provider automatisch deaktivieren, bevor es heruntergefahren wird. Während des Startvorgangs fordert das Skript die Passphrase an, bevor der Provider aktiviert wird. Vor und nach der Eingabeaufforderung für die Passphrase werden noch weitere Kernelmeldungen angezeigt. Achten Sie sorgfältig auf die Eingabeaufforderung zwischen den anderen Meldungen, falls es zu Problemen beim Startvorgang kommt. Sobald die richtige Passphrase eingegeben wurde, wird der Provider aktiviert. Anschließend werden die Dateisysteme gemäß [.filename]#/etc/fstab# eingehängt. Lesen Sie crossref:basics[mount-unmount,“Anhängen und Abhängen von Dateisystemen”] wenn Sie wissen möchten, wie Sie ein Dateisystem konfigurieren, sodass es beim booten automatisch gestartet wird.
+
+[[swap-encrypting]]
+== Den Auslagerungsspeicher verschlüsseln
+
+Wie die Verschlüsselung von Partitionen, wird auch der Auslagerungsspeicher verschlüsselt, um sensible Informationen zu schützen. Stellen Sie sich eine Anwendung vor, die mit Passwörtern umgeht. Solange sich diese Passwörter im Arbeitsspeicher befinden, werden sie nicht auf die Festplatte geschrieben und nach einem Neustart gelöscht. Falls FreeBSD jedoch damit beginnt Speicher auszulagern, um Platz für andere Anwendungen zu schaffen, können die Passwörter unverschlüsselt auf die Festplatte geschrieben werden. Die Verschlüsselung des Auslagerungsspeichers kann in solchen Situationen Abhilfe schaffen.
+
+Dieser Abschnitt zeigt die Konfiguration eines verschlüsselten Auslagerungsspeichers mittels man:gbde[8] oder man:geli[8]. In den Beispielen repräsentiert [.filename]#/dev/ada0s1b# die Swap-Partition.
+
+=== Konfiguration eines verschlüsselten Auslagerungsspeichers
+
+Swap-Partitionen werden standardmäßig nicht verschlüsselt. Sie sollten daher alle sensiblen Daten im Auslagerungsspeicher löschen, bevor Sie fortfahren. Führen Sie folgenden Befehl aus, um die Swap-Partition mit Zufallsdaten zu überschreiben:
+
+[source,bash]
+....
+# dd if=/dev/random of=/dev/ada0s1b bs=1m
+....
+
+Um den Auslagerungsspeicher mit man:gbde[8] zu verschlüsseln, fügen Sie in [.filename]#/etc/fstab# das Suffix `.bde` an den Gerätenamen der Swap-Partition hinzu:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/ada0s1b.bde none swap sw 0 0
+....
+
+Wenn Sie man:geli[8] benutzen, verwenden Sie stattdessen das Suffix `.eli`, um den Auslagerungsspeicher zu verschlüsseln:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/ada0s1b.eli none swap sw 0 0
+....
+
+In der Voreinstellung verschlüsselt man:geli[8] mit dem AES-Algorithmus und einer Schlüssellänge von 128 Bit. Diese Voreinstellungen sind in der Regel ausreichend, können jedoch im Options-Feld in [.filename]#/etc/fstab# angepasst werden. Mögliche Optionen sind:
+
+aalgo::
+Der Algorithmus für die Prüfung der Datenintegrität. Dieser wird benutzt um sicherzustellen, dass die verschlüsselten Daten nicht manipuliert wurden. Eine Liste der unterstützten Algorithmen finden Sie in man:geli[8].
+
+ealgo::
+Der Verschlüsselungsalgorithmus, der verwendet wird um die Daten zu schützen. Eine Liste der unterstützten Algorithmen finden Sie in man:geli[8].
+
+keylen::
+Die Länge des Schlüssels für den Verschlüsselungsalgorithmus. In man:geli[8] können Sie lesen, welche Schlüssellängen von welchem Algorithmus unterstützt werden.
+
+sectorsize::
+Die Größe, in der die Datenblöcke aufgeteilt werden, bevor sie verschlüsselt werden. Größere Blöcke erhöhen die Leistung auf Kosten des Speicherverbrauchs. Die empfohlene Größe beträgt 4096 Byte.
+
+Dieses Beispiel konfiguriert eine verschlüsselte Swap-Partition mit dem Blowfish-Algorithmus, einer Schlüssellänge von 128 Bit und einer Sektorgröße von 4 KB:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/ada0s1b.eli none swap sw,ealgo=blowfish,keylen=128,sectorsize=4096 0 0
+....
+
+=== Überprüfung des verschlüsselten Auslagerungsspeichers
+
+Nachdem das System neu gestartet wurde, kann die korrekte Funktion des verschlüsselten Auslagerungsspeichers mit `swapinfo` geprüft werden.
+
+Wenn Sie man:gbde[8] einsetzen, erhalten Sie eine Meldung ähnlich der folgenden:
+
+[source,bash]
+....
+% swapinfo
+Device 1K-blocks Used Avail Capacity
+/dev/ada0s1b.bde 542720 0 542720 0%
+....
+
+Wenn Sie man:geli[8] einsetzen, erhalten Sie hingegen eine Ausgabe ähnlich der folgenden:
+
+[source,bash]
+....
+% swapinfo
+Device 1K-blocks Used Avail Capacity
+/dev/ada0s1b.eli 542720 0 542720 0%
+....
+
+[[disks-hast]]
+== Highly Available Storage (HAST)
+
+Hochverfügbarkeit ist eine der Hauptanforderungen von ernsthaften Geschäftsanwendungen und hochverfügbarer Speicher ist eine Schlüsselkomponente in solchen Umgebungen. Highly Available STorage (HAST) ist ein Framework in FreeBSD, welches die transparente Speicherung der gleichen Daten über mehrere physikalisch getrennte Maschinen ermöglicht, die über ein TCP/IP-Netzwerk verbunden sind. HAST kann als ein netzbasiertes RAID1 (Spiegel) verstanden werden und ist dem DRBD(R)-Speichersystem der GNU/Linux(R)-Plattform ähnlich. In Kombination mit anderen Hochverfügbarkeitseigenschaften von FreeBSD wie CARP, ermöglicht es HAST, hochverfügbare Speichercluster zu bauen, die in der Lage sind, Hardwareausfällen zu widerstehen.
+
+Die Hauptmerkmale von HAST sind:
+
+* Es kann zur Maskierung von I/O-Fehlern auf lokalen Festplatten eingesetzt werden.
+* Dateisystem-unabhängig, was es erlaubt, jedes von FreeBSD unterstützte Dateisystem zu verwenden.
+* Effiziente und schnelle Resynchronisation: es werden nur die Blöcke synchronisiert, die während der Ausfallzeit eines Knotens geändert wurden.
+* Es kann in einer bereits bestehenden Umgebung eingesetzt werden, um zusätzliche Redundanz zu erreichen.
+* Zusammen mit CARP, Heartbeat, oder anderen Werkzeugen, ist es möglich, ein robustes und dauerhaftes Speichersystem zu bauen.
+
+Nachdem Sie diesen Abschnitt gelesen haben, werden Sie folgendes wissen:
+
+* Was HAST ist, wie es funktioniert und welche Eigenschaften es besitzt.
+* Wie man HAST unter FreeBSD aufsetzt und verwendet.
+* Wie man CARP und man:devd[8] kombiniert, um ein robustes Speichersystem zu bauen.
+
+Bevor Sie diesen Abschnitt lesen, sollten Sie:
+
+* die Grundlagen von UNIX(R) und FreeBSD verstanden haben (crossref:basics[basics,Grundlagen des FreeBSD Betriebssystems]).
+* wissen, wie man Netzwerkschnittstellen und andere Kernsysteme von FreeBSD konfiguriert (crossref:config[config-tuning,Konfiguration und Tuning]).
+* ein gutes Verständnis der FreeBSD-Netzwerkfunktionalität besitzen (crossref:partiv[network-communication,"Netzwerke"]).
+
+Das HAST-Projekt wurde von der FreeBSD Foundation mit Unterstützung der http://www.omc.net/[ OMCnet Internet Service GmbH] und http://www.transip.nl/[TransIP BV] gesponsert.
+
+=== HAST im Einsatz
+
+HAST bietet eine synchrone Replikation auf Blockebene zwischen zwei Maschinen: einem `primary`, auch bekannt als `master` Knoten, sowie dem `secondary`, oder `slave` Knoten. Diese beiden Maschinen zusammen werden als Cluster bezeichnet.
+
+Da HAST in einer primär-sekundär-Konfiguration funktioniert, ist immer nur ein Knoten des Clusters zu jeder Zeit aktiv. Der primäre Knoten, auch _active_ genannt, ist derjenige, der alle I/O-Anfragen verarbeitet, die an die HAST-Schnittstelle gesendet werden. Der sekundäre Knoten wird automatisch vom primären Knoten aus synchronisiert.
+
+Die physischen Komponenten des HAST-Systems sind die lokale Platte am Primärknoten und die entfernte Platte am Sekundärknoten.
+
+HAST arbeitet synchron auf Blockebene, was es für Dateisysteme und Anwendungen transparent macht. HAST stellt gewöhnliche GEOM-Provider in [.filename]#/dev/hast/# für die Verwendung durch andere Werkzeuge oder Anwendungen zur Verfügung. Es gibt keinen Unterschied zwischen dem Einsatz von HAST bereitgestellten Geräten und herkömmlichen Platten oder Partitionen.
+
+Jede Schreib-, Lösch- oder Entleerungsoperation wird an die lokale und über TCP/IP zu der entfernt liegenden Platte gesendet. Jede Leseoperation wird von der lokalen Platte durchgeführt, es sei denn, die lokale Platte ist nicht aktuell oder es tritt ein I/O-Fehler auf. In solchen Fällen wird die Leseoperation an den Sekundärknoten geschickt.
+
+HAST versucht, eine schnelle Fehlerbereinigung zu gewährleisten. Aus diesem Grund ist es wichtig, die Synchronisationszeit nach dem Ausfall eines Knotens zu reduzieren. Um eine schnelle Synchronisation zu ermöglichen, verwaltet HAST eine Bitmap von unsauberen Bereichen auf der Platte und synchronisiert nur diese während einer regulären Synchronisation (mit Ausnahme der initialen Synchronisation).
+
+Es gibt viele Wege, diese Synchronisation zu behandeln. HAST implementiert mehrere Replikationsarten, um unterschiedliche Methoden der Synchronisation zu realisieren:
+
+* _memsync_: Dieser Modus meldet Schreiboperationen als vollständig, wenn die lokale Schreiboperation beendet ist und der entfernt liegende Knoten die Ankunft der Daten bestätigt hat, jedoch bevor die Daten wirklich gespeichert wurden. Die Daten werden auf dem entfernt liegenden Knoten direkt nach dem Senden der Bestätigung gespeichert. Dieser Modus ist dafür gedacht, Latenzen zu verringern und zusätzlich eine gute Verlässlichkeit zu bieten. In der Voreinstellung wird dieser Modus benutzt.
+* _fullsync_: Dieser Modus meldet Schreiboperationen als vollständig, wenn sowohl die lokale, als auch die entfernte Schreiboperation abgeschlossen wurde. Dies ist der sicherste und zugleich der langsamste Replikationsmodus.
+* _async_: Dieser Modus meldet Schreiboperationen als vollständig, wenn lokale Schreibvorgänge abgeschlossen wurden. Dies ist der schnellste und gefährlichste Replikationsmodus. Er sollte nur verwendet werden, wenn die Latenz zu einem entfernten Knoten bei einer Replikation zu hoch ist für andere Modi.
+
+=== HAST-Konfiguration
+
+Das HAST-Framework besteht aus mehreren Komponenten:
+
+* Dem man:hastd[8]-Daemon, welcher für Datensynchronisation verantwortlich ist. Wenn dieser Daemon gestartet wird, wird automatisch `geom_gate.ko` geladen.
+* Dem man:hastctl[8] Management-Werkzeug.
+* Der Konfigurationsdatei man:hast.conf[5]. Diese Datei muss vorhanden sein, bevor hastd gestartet wird.
+
+Alternativ lässt sich die `GEOM_GATE`-Unterstützung in den Kernel statisch einbauen, indem folgende Zeile zur Kernelkonfigurationsdatei hinzugefügt wird. Anschließend muss der Kernel, wie in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels ] beschrieben, neu gebaut werden:
+
+[.programlisting]
+....
+options GEOM_GATE
+....
+
+Das folgende Beispiel beschreibt, wie man zwei Knoten als master-slave / primary-secondary mittels HAST konfiguriert, um Daten zwischen diesen beiden auszutauschen. Die Knoten werden als `hasta` mit der IP-Adresse `172.16.0.1` und `hastb` mit der IP-Adresse `172.16.0.2` bezeichnet. Beide Knoten besitzen eine dedizierte Festplatte [.filename]#/dev/ad6# mit der gleichen Größe für den HAST-Betrieb. Der HAST-Pool, manchmal auch Ressource genannt, oder der GEOM-Provider in [.filename]#/dev/hast/# wird als [.filename]#test# bezeichnet.
+
+Die Konfiguration von HAST wird in [.filename]#/etc/hast.conf# vorgenommen. Diese Datei sollte auf beiden Knoten gleich sein. Die einfachste Konfiguration ist folgende:
+
+[.programlisting]
+....
+resource test {
+ on hasta {
+ local /dev/ad6
+ remote 172.16.0.2
+ }
+ on hastb {
+ local /dev/ad6
+ remote 172.16.0.1
+ }
+}
+....
+
+Fortgeschrittene Konfigurationsmöglichkeiten finden Sie in man:hast.conf[5].
+
+[TIP]
+====
+
+Es ist ebenfalls möglich, den Hostnamen in den `remote`-Anweisungen zu verwenden, falls die Rechner aufgelöst werden können und in [.filename]#/etc/hosts#, oder im lokalen DNS definiert sind.
+====
+
+Sobald die Konfiguration auf beiden Rechnern vorhanden ist, kann ein HAST-Pool erstellt werden. Lassen Sie diese Kommandos auf beiden Knoten ablaufen, um die initialen Metadaten auf die lokale Platte zu schreiben und starten Sie anschließend man:hastd[8]:
+
+[source,bash]
+....
+# hastctl create test
+# service hastd onestart
+....
+
+[NOTE]
+====
+Es ist _nicht_ möglich, GEOM-Provider mit einem bereits bestehenden Dateisystem zu verwenden, um beispielsweise einen bestehenden Speicher in einen von HAST verwalteten Pool zu konvertieren. Dieses Verfahren muss einige Metadaten auf den Provider schreiben und dafür würde nicht genug freier Platz zur Verfügung stehen.
+====
+
+Die Rolle eines HAST Knotens, `primary` oder `secondary`, wird vom einem Administrator, oder einer Software wie Heartbeat, mittels man:hastctl[8] festgelegt. Auf dem primären Knoten `hasta` geben Sie diesen Befehl ein:
+
+[source,bash]
+....
+# hastctl role primary test
+....
+
+Geben Sie folgendes Kommando auf dem sekundären Knoten `hastb` ein:
+
+[source,bash]
+....
+# hastctl role secondary test
+....
+
+Überprüfen Sie das Ergebnis mit `hastctl` auf beiden Knoten:
+
+[source,bash]
+....
+# hastctl status test
+....
+
+Überprüfen Sie die `status`-Zeile. Wird hier `degraded` angezeigt, dann ist etwas mit der Konfigurationsdatei nicht in Ordnung. Auf jedem Konten sollte `complete` angezeigt werden, was bedeutet, dass die Synchronisation zwischen den beiden Knoten gestartet wurde. Die Synchronisierung ist abgeschlossen, wenn `hastctl status` meldet, dass die `dirty`-Bereiche 0 Bytes betragen.
+
+Der nächste Schritt ist, ein Dateisystem auf dem GEOM-Provider anzulegen und dieses ins System einzuhängen. Dies muss auf dem `primary`-Knoten durchgeführt werden. Die Erstellung des Dateisystems kann ein paar Minuten dauern, abhängig von der Größe der Festplatte. Dieses Beispiel erstellt ein UFS-Dateisystem auf [.filename]#/dev/hast/test#:
+
+[source,bash]
+....
+# newfs -U /dev/hast/test
+# mkdir /hast/test
+# mount /dev/hast/test /hast/test
+....
+
+Sobald das HAST-Framework richtig konfiguriert wurde, besteht der letzte Schritt nun darin, sicherzustellen, dass HAST während des Systemstarts automatisch gestartet wird. Fügen Sie diese Zeile in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+hastd_enable="YES"
+....
+
+==== Failover-Konfiguration
+
+Das Ziel dieses Beispiels ist, ein robustes Speichersystem zu bauen, welches Fehlern auf einem beliebigen Knoten widerstehen kann. Wenn der `primary`-Knoten ausfällt, ist der `secondary`-Knoten da, um nahtlos einzuspringen, das Dateisystem zu prüfen, einzuhängen und mit der Arbeit fortzufahren, ohne dass auch nur ein einzelnes Bit an Daten verloren geht.
+
+Um diese Aufgabe zu bewerkstelligen, wird das Common Address Redundancy Protocol (CARP) benutzt, welches ein automatisches Failover auf der IP-Schicht ermöglicht. CARP erlaubt es mehreren Rechnern im gleichen Netzsegment, die gleiche IP-Adresse zu verwenden. Setzen Sie CARP auf beiden Knoten des Clusters anhand der Dokumentation in crossref:advanced-networking[carp,“Common Address Redundancy Protocol (CARP)”] auf. In diesem Beispiel hat jeder Knoten seine eigene Management IP-Adresse und die geteilte IP-Adresse _172.16.0.254_. Der primäre HAST-Knoten des Clusters muss der CARP-Masterknoten sein.
+
+Der HAST-Pool, welcher im vorherigen Abschnitt erstellt wurde, ist nun bereit für den Export über das Netzwerk auf den anderen Rechner. Dies kann durch den Export über NFS oder Samba erreicht werden, indem die geteilte IP-Adresse _172.16.0.254_ verwendet wird. Das einzige ungelöste Problem ist der automatische Failover, sollte der primäre Knoten einmal ausfallen.
+
+Falls die CARP-Schnittstelle aktiviert oder deaktiviert wird, generiert das FreeBSD-Betriebssystem ein man:devd[8]-Ereignis, was es ermöglicht, Zustandsänderungen auf den CARP-Schnittstellen zu überwachen. Eine Zustandsänderung auf der CARP-Schnittstelle ist ein Indiz dafür, dass einer der Knoten gerade ausgefallen oder wieder verfügbar ist. Diese Zustandsänderungen machen es möglich, ein Skript zu starten, welches automatisch den HAST-Failover durchführt.
+
+Um Zustandsänderungen auf der CARP-Schnittstelle abzufangen, müssen diese Zeilen in [.filename]#/etc/devd.conf# auf jedem Knoten hinzugefügt werden:
+
+[.programlisting]
+....
+notify 30 {
+ match "system" "IFNET";
+ match "subsystem" "carp0";
+ match "type" "LINK_UP";
+ action "/usr/local/sbin/carp-hast-switch master";
+};
+
+notify 30 {
+ match "system" "IFNET";
+ match "subsystem" "carp0";
+ match "type" "LINK_DOWN";
+ action "/usr/local/sbin/carp-hast-switch slave";
+};
+....
+
+[NOTE]
+====
+Wenn auf dem System FreeBSD 10 oder höher eingesetzt wird, ersetzen Sie [.filename]#carp0# durch den Namen der konfigurierten Schnittstelle für CARP.
+====
+
+Starten Sie man:devd[8] auf beiden Knoten neu, um die neue Konfiguration wirksam werden zu lassen:
+
+[source,bash]
+....
+# service devd restart
+....
+
+Wenn die Schnittstelle aktiviert oder deaktiviert wird, erzeugt das System eine Meldung, was es dem man:devd[8]-Subsystem ermöglicht, ein automatisches Failover-Skript zu starten, [.filename]#/usr/local/sbin/carp-hast-switch#. Weitere Informationen zu dieser Konfiguration finden Sie in man:devd.conf[5].
+
+Es folgt ein Beispiel für ein automatisches Failover-Skript:
+
+[.programlisting]
+....
+#!/bin/sh
+
+# Original script by Freddie Cash <fjwcash@gmail.com>
+# Modified by Michael W. Lucas <mwlucas@BlackHelicopters.org>
+# and Viktor Petersson <vpetersson@wireload.net>
+
+# The names of the HAST resources, as listed in /etc/hast.conf
+resources="test"
+
+# delay in mounting HAST resource after becoming master
+# make your best guess
+delay=3
+
+# logging
+log="local0.debug"
+name="carp-hast"
+
+# end of user configurable stuff
+
+case "$1" in
+ master)
+ logger -p $log -t $name "Switching to primary provider for ${resources}."
+ sleep ${delay}
+
+ # Wait for any "hastd secondary" processes to stop
+ for disk in ${resources}; do
+ while $( pgrep -lf "hastd: ${disk} \(secondary\)" > /dev/null 2>&1 ); do
+ sleep 1
+ done
+
+ # Switch role for each disk
+ hastctl role primary ${disk}
+ if [ $? -ne 0 ]; then
+ logger -p $log -t $name "Unable to change role to primary for resource ${disk}."
+ exit 1
+ fi
+ done
+
+ # Wait for the /dev/hast/* devices to appear
+ for disk in ${resources}; do
+ for I in $( jot 60 ); do
+ [ -c "/dev/hast/${disk}" ] && break
+ sleep 0.5
+ done
+
+ if [ ! -c "/dev/hast/${disk}" ]; then
+ logger -p $log -t $name "GEOM provider /dev/hast/${disk} did not appear."
+ exit 1
+ fi
+ done
+
+ logger -p $log -t $name "Role for HAST resources ${resources} switched to primary."
+
+ logger -p $log -t $name "Mounting disks."
+ for disk in ${resources}; do
+ mkdir -p /hast/${disk}
+ fsck -p -y -t ufs /dev/hast/${disk}
+ mount /dev/hast/${disk} /hast/${disk}
+ done
+
+ ;;
+
+ slave)
+ logger -p $log -t $name "Switching to secondary provider for ${resources}."
+
+ # Switch roles for the HAST resources
+ for disk in ${resources}; do
+ if ! mount | grep -q "^/dev/hast/${disk} on "
+ then
+ else
+ umount -f /hast/${disk}
+ fi
+ sleep $delay
+ hastctl role secondary ${disk} 2>&1
+ if [ $? -ne 0 ]; then
+ logger -p $log -t $name "Unable to switch role to secondary for resource ${disk}."
+ exit 1
+ fi
+ logger -p $log -t $name "Role switched to secondary for resource ${disk}."
+ done
+ ;;
+esac
+....
+
+Im Kern führt das Skript die folgenden Aktionen durch, sobald ein Knoten zum Master wird:
+
+* Es ernennt den HAST-Pool als den primären für einen gegebenen Knoten.
+* Es prüft das Dateisystem, dass auf dem HAST-Pool erstellt wurde.
+* Es hängt den Pool ins System ein.
+
+Wenn ein Knoten zum Sekundären ernannt wird:
+
+* Hängt es den HAST-Pool aus dem Dateisystem aus.
+* Degradiert es den HAST-Pool zum sekundären.
+
+[CAUTION]
+====
+
+Dieses Skript ist nur ein Beispiel für eine mögliche Lösung. Es behandelt nicht alle möglichen Szenarien, die auftreten können und sollte erweitert bzw. abgeändert werden, so dass z.B. benötigte Dienste gestartet oder gestoppt werden.
+====
+
+[TIP]
+====
+
+Für dieses Beispiel wurde ein UFS-Dateisystem verwendet. Um die Zeit für die Wiederherstellung zu verringern, kann ein UFS mit Journal oder ein ZFS-Dateisystem benutzt werden.
+====
+
+Weitere detaillierte Informationen mit zusätzlichen Beispielen können unter http://wiki.FreeBSD.org/HAST[ http://wiki.FreeBSD.org/HAST] abgerufen werden.
+
+=== Fehlerbehebung
+
+HAST sollte generell ohne Probleme funktionieren. Jedoch kann es, wie bei jeder anderen Software auch, zu gewissen Zeiten sein, dass sie sich nicht so verhält wie angegeben. Die Quelle dieser Probleme kann unterschiedlich sein, jedoch sollte als Faustregel gewährleistet werden, dass die Zeit für alle Knoten im Cluster synchron läuft.
+
+Für die Fehlersuche bei HAST sollte die Anzahl an Debugging-Meldungen von man:hastd[8] erhöht werden. Dies kann durch das Starten von `hastd` mit `-d` erreicht werden. Diese Option kann mehrfach angegeben werden, um die Anzahl an Meldungen weiter zu erhöhen. Sie sollten ebenfalls die Verwendung von `-F` in Erwägung ziehen, was `hastd` im Vordergrund startet.
+
+[[disks-hast-sb]]
+==== Auflösung des Split-brain-Zustands
+
+`split-brain` bezeichnet eine Situation, in der beide Knoten des Clusters nicht in der Lage sind, miteinander zu kommunizieren und dadurch beide als primäre Knoten fungieren. Dies ist ein gefährlicher Zustand, weil es beiden Knoten erlaubt ist, Änderungen an den Daten vorzunehmen, die miteinander nicht in Einklang gebracht werden können. Diese Situation muss vom Systemadministrator manuell bereinigt werden.
+
+Der Administrator muss entscheiden, welcher Knoten die wichtigeren Änderungen besitzt, oder die Zusammenführung manuell durchführen. Anschließend kann HAST die volle Synchronisation mit dem Knoten durchführen, der die beschädigten Daten enthält. Um dies zu tun, geben Sie folgende Befehle auf dem Knoten ein, der neu synchronisiert werden muss:
+
+[source,bash]
+....
+# hastctl role init test
+# hastctl create test
+# hastctl role secondary test
+....
diff --git a/documentation/content/de/books/handbook/dtrace/_index.adoc b/documentation/content/de/books/handbook/dtrace/_index.adoc
new file mode 100644
index 0000000000..d66ae24ae9
--- /dev/null
+++ b/documentation/content/de/books/handbook/dtrace/_index.adoc
@@ -0,0 +1,238 @@
+---
+title: Kapitel 24. DTrace
+part: Teil III. Systemadministration
+prev: books/handbook/cutting-edge
+next: books/handbook/usb-device-mode
+---
+
+[[dtrace]]
+= DTrace
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 24
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/dtrace/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/dtrace/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/dtrace/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[dtrace-synopsis]]
+== Überblick
+
+DTrace, auch bekannt als Dynamic Tracing, wurde von Sun(TM) als ein Werkzeug zur Analyse von Performance-Problemen in Produktiv- und Entwicklungssystemen entwickelt. Zusätzlich zur Diagnose von Performance-Problemen kann DTrace auch verwendet werden, um bei der Untersuchung und Behebung von unerwartetem Verhalten im FreeBSD-Kernel und den Anwenderprogrammen zu helfen.
+
+DTrace ist ein bemerkenswertes Werkzeug zur Profilerstellung, mit einer beeindruckenden Palette von Eigenschaften zur Diagnose von Systemereignissen. Es kann auch dazu verwendet werden, bestehende Skripte ablaufen zu lassen, um einen Nutzen aus deren Möglichkeiten zu ziehen. Nutzer können mittels der Programmiersprache D von DTrace ihre eigenen Hilfsmittel schreiben, was es ermöglicht, die eigenen Profile nach Ihren Bedürfnissen anzupassen.
+
+Die DTrace-Implementierung in FreeBSD bietet experimentelle Unterstützung für DTrace im Userland. Userland DTrace erlaubt es Anwendern, function boundary tracing für Anwendungsprogramme über den `pid`-Provider hinweg vorzunehmen und um statische Sonden in Anwendungsprogramme für die spätere Aufzeichnung einzufügen. Manche Ports, wie beispielsweise package:databases/postgresql12-server[] und package:lang/php74[] besitzen eine DTrace-Option, um statische Sonden zu aktivieren.
+
+Eine offizielle Anleitung für DTrace wird vom Illumos Projekt im http://dtrace.org/guide[DTrace Guide] bereitgestellt.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie Folgendes wissen:
+
+* Was DTrace ist und welche Funktionen es zur Verfügung stellt.
+* Unterschiede zwischen der Solaris(TM) DTrace Implementierung und derjenigen, die FreeBSD bereitstellt.
+* Wie man DTrace auf FreeBSD aktiviert und verwendet.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie:
+
+* UNIX(R) und FreeBSD Grundlagen verstehen (crossref:basics[basics,Grundlagen des FreeBSD Betriebssystems]).
+* Vertraut sein mit Sicherheitsaspekten und wie diese FreeBSD betreffen (crossref:security[security,Sicherheit]).
+
+[WARNING]
+====
+
+Diese Funktion ist als experimentell anzusehen. Manche Einstellungen enthalten möglicherweise nicht alle Funktionalitäten, andere Teile könnten gar nicht laufen. Mit der Zeit, wenn diese Funktion als für den Produktivbetrieb geeignet erscheint, wird auch diese Dokumentation geändert, um diesem Umstand gerecht zu werden.
+====
+
+[[dtrace-implementation]]
+== Unterschiede in der Implementierung
+
+Obwohl DTrace in FreeBSD sehr ähnlich zu dem in Solaris(TM) ist, existieren doch Unterschiede. Der Hauptunterschied besteht darin, dass in FreeBSD DTrace als eine Menge von Kernelmodulen implementiert ist und DTrace nicht verwendet werden kann, bis diese Module geladen wurden. Um alle nötigen Module zu laden, geben Sie ein:
+
+[source,bash]
+....
+# kldload dtraceall
+....
+
+Beginnend mit FreeBSD 10.0-RELEASE werden die Module automatisch geladen, sobald `dtrace` aufgerufen wird.
+
+FreeBSD verwendet die Kerneloption `DDB_CTF`, um die Unterstützung im Kernel für das Laden von CTF-Daten aus Kernelmodulen und dem Kernel selbst zu ermöglichen. CTF ist das Compact C Type Format von Solaris(TM), welches eine reduzierte Form von Debug-Informationen kapselt, ähnlich zu DWARF und den antiken Stabs. Diese CTF-Daten werden dem Binärcode von den `ctfconvert` und `ctfmerge` Befehlen den Werkzeugen zum Bauen des Systems hinzugefügt. Das `ctfconvert`-Dienstprogramm parst die vom Compiler erstellten DWARFELF Debug-Abschnitte und `ctfmerge` vereint CTFELF-Abschnitte aus Objekten, entweder in ausführbare Dateien oder Shared-Libraries.
+
+Einige Provider in FreeBSD unterscheiden sich von der Solaris(TM)-Implementierung. Am deutlichsten wird das beim `dtmalloc`-Provider, welcher das Aufzeichnen von `malloc()` nach Typen im FreeBSD-Kernel ermöglicht. Manche der Provider in Solaris(TM) wie `cpc` und `mib` sind in FreeBSD nicht vorhanden. Diese können in zukünftigen FreeBSD-Versionen auftauchen. Weiterhin sind manche der Provider in beiden Betriebssystemen nicht zueinander kompatibel, in dem Sinne daß deren Sonden unterschiedliche Argumenttypen aufweisen. Dadurch können D-Skripte, die unter Solaris(TM) geschrieben wurden, evtl. unter FreeBSD funktionieren oder auch nicht, umgekehrt ist das genauso.
+
+In FreeBSD darf DTrace wegen unterschiedlicher Sicherheitskonzepte nur von `root` verwendet werden. Solaris(TM) besitzt ein paar Audit-Funktionen auf den unteren Ebenen, die noch nicht in FreeBSD implementiert sind. Deshalb kann nur `root` auf [.filename]#/dev/dtrace/dtrace# zugreifen.
+
+Zum Schluss muss noch erwähnt werden, dass die DTrace-Software unter die CDDL Lizenz fällt. Die `Common Development and Distribution License` wird von FreeBSD mitgeliefert, sehen Sie sich dazu [.filename]#/usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE# an, oder lesen Sie die Online-Version unter http://opensource.org/licenses/CDDL-1.0[http://opensource.org/licenses/CDDL-1.0]. Während der FreeBSD-Kernel mit den DTrace-Optionen immer noch BSD-lizenziert ist, tritt die CDDL in Kraft, wenn Module in Binärform vertrieben werden oder die Binärdateien geladen werden.
+
+[[dtrace-enable]]
+== Die DTrace Unterstützung aktivieren
+
+In FreeBSD 9.2 und 10.0 ist die Unterstützung von DTrace im [.filename]#GENERIC#-Kernel bereits eingebaut. Nutzer von früheren Versionen sollten die folgenden Zeilen in eine eigene Kernelkonfigurationsdatei einfügen und den Kernel mittels der Anleitung in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] neu übersetzen:
+
+[.programlisting]
+....
+options KDTRACE_HOOKS
+options DDB_CTF
+makeoptions DEBUG=-g
+makeoptions WITH_CTF=1
+....
+
+Besitzer der AMD64-Architektur werden wahrscheinlich noch die folgende Zeile zur Kernelkonfigurationsdatei hinzufügen:
+
+[.programlisting]
+....
+options KDTRACE_FRAME
+....
+
+Diese Option liefert die Unterstützung für die FBT-Eigenschaft. DTrace wird auch ohne diese Option funktionieren; jedoch wird dann Function Boundary Tracing nur eingeschränkt unterstützt.
+
+Sobald FreeBSD in den neuen Kernel gebootet oder die DTrace-Kernelmodule mittels `kldload dtraceall` geladen wurden, benötigt das System Unterstützung für die Korn-Shell, da DTrace mehrere Dienstprogramme enthält, die in `ksh` implementiert sind. Vergewissern Sie sich, dass das Paket oder der Port package:shells/ksh93[] installiert ist. Es ist auch möglich, diese Werkzeuge unter package:shells/pdksh[] oder package:shells/mksh[] laufen zu lassen.
+
+Zum Schluss sollten Sie noch den aktuellen DTrace-Werkzeugsatz beschaffen. Die DTrace-Werkzeugsammlung enthält gebrauchsfertige Skripte, um Systeminformationen zu sammeln. Es gibt Skripte zum Überprüfen von offenen Dateien, Speicher- und CPU-Gebrauch und noch viel mehr. FreeBSD 10 installiert ein paar dieser Skripte in [.filename]#/usr/shared/dtrace#. Für andere FreeBSD-Versionen oder um die volle DTrace-Werkzeugsammlung zu installieren, verwenden Sie den package:sysutils/DTraceToolkit[] Port oder das Paket.
+
+[NOTE]
+====
+Die Skripte in [.filename]#/usr/shared/dtrace# wurden speziell für FreeBSD portiert. Nicht alle Skripte in der DTrace-Werkzeugsammlung werden in FreeBSD unverändert funktionieren und manche Skript benötigen einigen Aufwand, damit diese auf FreeBSD funktionieren.
+====
+
+Der DTrace-Werkzeugsatz beinhaltet viele Skripte in der speziellen Sprache von DTrace. Diese Sprache wird die D-Sprache genannt und ist sehr ähnlich zu C++. Eine detaillierte Beschreibung dieser Sprache würde den Rahmen dieses Dokuments sprengen. Im http://www.dtrace.org/guide[Illumos Dynamic Tracing Guide] wird diese Sprache ausführlich beschrieben.
+
+[[dtrace-using]]
+== DTrace verwenden
+
+DTrace-Skripte bestehen aus einer Liste von einer oder mehreren _Sonden_ oder Instrumentationspunkten, an denen jede Sonde mit einer Aktion verknüpft ist. Jedesmal, wenn die Bedingung für eine Sonde zutrifft, wird die verknüpfte Aktion ausgeführt. Beispielsweise könnte eine Aktion ausgeführt werden, wenn eine Datei geöffnet, ein Prozess gestartet oder eine Codezeile ausgeführt wird. Die Aktion könnte die Protokollierung von Informationen sein oder die Änderung von Kontextvariablen. Das Lesen und Schreiben von Kontextvariablen erlaubt es den Sonden, Informationen auszutauschen und kooperativ die Korrelation bestimmter Ereignisse zu analysieren.
+
+Um alle Sonden anzuzeigen, kann der Administrator nun den folgenden Befehl eingeben:
+
+[source,bash]
+....
+# dtrace -l | more
+....
+
+Jede Sonde besitzt eine `ID`, einen `PROVIDER` (dtrace oder fbt), ein `MODULE` und einen `FUNCTION NAME`. Lesen Sie man:dtrace[1] für weitere Informationen zu diesem Kommando.
+
+Die Beispiele in diesem Abschnitt geben einen Überblick, wie man zwei dieser voll funktionsfähigen Skripte aus der DTrace-Werkzeugsammlung verwendet: die Skripte [.filename]#hotkernel# und [.filename]#procsystime#.
+
+Das [.filename]#hotkernel# Skript wurde entworfen, um zu identifizieren, welche Funktion die meiste Kernelzeit beansprucht. Es wird es Ausgaben ähnlich der Folgenden produzieren:
+
+[source,bash]
+....
+# cd /usr/local/shared/dtrace-toolkit
+# ./hotkernel
+Sampling... Hit Ctrl-C to end.
+....
+
+Verwenden Sie wie angegeben die Tastenkombination kbd:[Ctrl+C] drücken, um den Prozess zu stoppen. Nach dem Abbruch wird das Skript eine Liste von Kernelfunktionen und Zeitmessungen ausgeben, aufsteigend sortiert nach den Zeiten:
+
+[source,bash]
+....
+kernel`_thread_lock_flags 2 0.0%
+0xc1097063 2 0.0%
+kernel`sched_userret 2 0.0%
+kernel`kern_select 2 0.0%
+kernel`generic_copyin 3 0.0%
+kernel`_mtx_assert 3 0.0%
+kernel`vm_fault 3 0.0%
+kernel`sopoll_generic 3 0.0%
+kernel`fixup_filename 4 0.0%
+kernel`_isitmyx 4 0.0%
+kernel`find_instance 4 0.0%
+kernel`_mtx_unlock_flags 5 0.0%
+kernel`syscall 5 0.0%
+kernel`DELAY 5 0.0%
+0xc108a253 6 0.0%
+kernel`witness_lock 7 0.0%
+kernel`read_aux_data_no_wait 7 0.0%
+kernel`Xint0x80_syscall 7 0.0%
+kernel`witness_checkorder 7 0.0%
+kernel`sse2_pagezero 8 0.0%
+kernel`strncmp 9 0.0%
+kernel`spinlock_exit 10 0.0%
+kernel`_mtx_lock_flags 11 0.0%
+kernel`witness_unlock 15 0.0%
+kernel`sched_idletd 137 0.3%
+0xc10981a5 42139 99.3%
+....
+
+Dieses Skript funktioniert auch mit Kernelmodulen. Um diese Eigenschaft zu verwenden, starten Sie das Skript mit `-m`:
+
+[source,bash]
+....
+# ./hotkernel -m
+Sampling... Hit Ctrl-C to end.
+^C
+MODULE COUNT PCNT
+0xc107882e 1 0.0%
+0xc10e6aa4 1 0.0%
+0xc1076983 1 0.0%
+0xc109708a 1 0.0%
+0xc1075a5d 1 0.0%
+0xc1077325 1 0.0%
+0xc108a245 1 0.0%
+0xc107730d 1 0.0%
+0xc1097063 2 0.0%
+0xc108a253 73 0.0%
+kernel 874 0.4%
+0xc10981a5 213781 99.6%
+....
+
+Das [.filename]#procsystime# Skript fängt die Systemaufruf-Zeiten für eine gegebene Prozess-ID (PID) oder einen Prozessnamen ab und gibt diese aus. Im folgenden Beispiel wurde eine neue Instanz von [.filename]#/bin/csh# erzeugt. Dann wurde [.filename]#procsystime# ausgeführt und verbleibt so, während ein paar Befehle in die andere Instanz von `csh` eingegeben werden. Dies sind die Ergebnisse dieses Versuchs:
+
+[source,bash]
+....
+# ./procsystime -n csh
+Tracing... Hit Ctrl-C to end...
+^C
+
+Elapsed Times for processes csh,
+
+ SYSCALL TIME (ns)
+ getpid 6131
+ sigreturn 8121
+ close 19127
+ fcntl 19959
+ dup 26955
+ setpgid 28070
+ stat 31899
+ setitimer 40938
+ wait4 62717
+ sigaction 67372
+ sigprocmask 119091
+ gettimeofday 183710
+ write 263242
+ execve 492547
+ ioctl 770073
+ vfork 3258923
+ sigsuspend 6985124
+ read 3988049784
+....
+
+Wie aus der Ausgabe ersichtlich ist, verbraucht der `read()`-Systemaufruf die meiste Zeit in Nanosekunden, während der Systemaufruf `getpid()` hingegen am schnellsten läuft.
diff --git a/documentation/content/de/books/handbook/eresources/_index.adoc b/documentation/content/de/books/handbook/eresources/_index.adoc
new file mode 100644
index 0000000000..20e72df12c
--- /dev/null
+++ b/documentation/content/de/books/handbook/eresources/_index.adoc
@@ -0,0 +1,1126 @@
+---
+title: Anhang C. Ressourcen im Internet
+part: Teil V. Anhang
+prev: books/handbook/bibliography
+next: books/handbook/pgpkeys
+---
+
+[appendix]
+[[eresources]]
+= Ressourcen im Internet
+:doctype: book
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: C
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+Gedruckte Medien können mit der schnellen Entwicklung von FreeBSD nicht Schritt halten. Elektronische Medien sind häufig die einzige Möglichkeit, über aktuelle Entwicklungen informiert zu sein. Da FreeBSD ein Projekt von Freiwilligen ist, gibt die Benutzergemeinde selbst auch technische Unterstützung. Die Benutzergemeinde erreichen Sie am besten über E-Mail, Internetforen oder Usenet-News.
+
+Die wichtigsten Wege, auf denen Sie die FreeBSD-Benutzergemeinde erreichen können, sind unten dargestellt. Schicken Sie weitere Ressourcen, die hier fehlen, an die Mailingliste des {freebsd-doc}, damit diese hier aufgenommen werden können.
+
+[[eresources-www]]
+== Webseiten
+
+* https://forums.FreeBSD.org/[Die FreeBSD Foren] dienen als webbasiertes Diskussionsforum für Fragen und technische Diskussionen zu FreeBSD.
+* Der http://www.youtube.com/bsdconferences[BSDConferences YouTube-Kanal] beinhaltet eine Sammlung von qualitativ hochwertigen Videos von BSD Konferenzen aus der ganzen Welt. Dies ist eine ausgezeichnete Art und Weise, den Entwicklern beim Präsentieren von neuen Arbeiten an FreeBSD zuzuschauen.
+
+[[eresources-mail]]
+== Mailinglisten
+
+Die Mailinglisten sind der direkteste Weg, um Fragen an das gesamte FreeBSD Publikum zu stellen oder eine technische Diskussion zu beginnen. Es existiert eine große Vielfalt von Listen mit einer Reihe von verschiedenen FreeBSD Themen. Wenn Sie Fragen an die richtige Mailingliste richten können Sie viel eher mit einer passenden Antwort darauf rechnen.
+
+Die Chartas der verschiedenen Listen sind unten wiedergegeben. _Bevor Sie sich einer Mailingliste anschließen oder E-Mails an eine Liste senden, lesen Sie bitte die Charta der Liste._ Die meisten Mitglieder der Mailinglisten erhalten jeden Tag Hunderte E-Mails zum Thema FreeBSD. Die Chartas und Regeln, die den Gebrauch der Listen beschreiben, garantieren die hohe Qualität der Listen. Die Listen würden ihren hohen Wert für das Projekt verlieren, wenn wir weniger Regeln aufstellen würden.
+
+[NOTE]
+====
+_Um zu testen, ob Sie eine Nachricht an eine FreeBSD-Liste senden können, verwenden Sie bitte die Liste {freebsd-test}._ Schicken Sie derartige Nachrichten bitte nicht an eine der anderen Listen.
+====
+
+Wenn Sie Sich nicht sicher sind, auf welcher Liste Sie Ihre Frage stellen sollen, sollten Sie den Artikel link:{freebsd-questions-article}[ How to get best results from the FreeBSD-questions mailing list] lesen.
+
+Bevor Sie eine Nachricht an eine Mailingliste senden, sollten Sie die korrekte Nutzung der Mailinglisten erlernen. Dazu gehört auch das Vermeiden von sich häufig wiederholenden Diskussionen (lesen Sie deshalb zuerst die link:{mailing-list-faq}[ Mailing List Frequently Asked Questions]).
+
+Alle Mailinglisten werden archiviert und können auf dem link:https://www.FreeBSD.org/search/[FreeBSD World Wide Web Server] durchsucht werden. Das nach Schlüsselwörtern durchsuchbare Archiv bietet die hervorragende Möglichkeit, Antworten auf häufig gestellte Fragen zu finden. Nutzen Sie bitte diese Möglichkeit, bevor Sie Fragen auf einer Liste stellen. Beachten Sie auch, dass das zur Folge hat, dass die Nachrichten an die FreeBSD Mailinglisten für die Ewigkeit erhalten bleiben. Wenn Sie am Schutz Ihrer Privatsphäre interessiert sind, ziehen Sie die Verwendung einer Wegwerf-E-Mail-Adresse in Betracht und schreiben Sie nur solche Nachrichten, die für die Öffentlichkeit bestimmt sind.
+
+[[eresources-summary]]
+=== Beschreibung der Mailinglisten
+
+_Allgemeine Listen:_ Jeder kann die folgenden allgemeinen Listen abonnieren (und ist dazu aufgefordert):
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Mailingliste
+| Zweck
+
+|link:{freebsd-advocacy-url}[freebsd-advocacy]
+|Verbreitung von FreeBSD
+
+|{freebsd-announce}
+|Wichtige Ereignisse und Meilensteine des Projekts (moderiert)
+
+|link:{freebsd-arch-url}[freebsd-arch]
+|Architektur und Design von FreeBSD
+
+|link:{freebsd-bugbusters-url}[freebsd-bugbusters]
+|Diskussionen über die Pflege der FreeBSD Fehlerberichte-Datenbank und die dazu benutzten Werkzeuge
+
+|link:{freebsd-bugs-url}[freebsd-bugs]
+|Fehlerberichte
+
+|link:{freebsd-chat-url}[freebsd-chat]
+|Nicht technische Themen, welche die FreeBSD-Gemeinschaft betreffen
+
+|link:{freebsd-chromium-url}[freebsd-chromium]
+|Diskussionen zum Einsatz von Chromium unter FreeBSD
+
+|{freebsd-current}
+|Gebrauch von FreeBSD-CURRENT
+
+|link:{freebsd-isp-url}[freebsd-isp]
+|Für Internet-Service-Provider, die FreeBSD benutzen
+
+|link:{freebsd-jobs-url}[freebsd-jobs]
+|Anstellung und Beratung im FreeBSD-Umfeld
+
+|link:{freebsd-quarterly-calls-url}[freebsd-quarterly-calls]
+|Aufrufe für vierteljährliche Statusberichte (moderiert)
+
+|link:{freebsd-questions-url}[freebsd-questions]
+|Benutzerfragen und technische Unterstützung
+
+|{freebsd-security-notifications}
+|Ankündigungen zum Thema Sicherheit (moderiert)
+
+|{freebsd-stable}
+|Gebrauch von FreeBSD-STABLE
+
+|{freebsd-test}
+|Schicken Sie Testnachrichten an diese Liste anstelle der wirklichen Listen
+
+|link:{freebsd-women-url}[freebsd-women]
+|FreeBSD Befürwortung von Frauen
+|===
+
+_Technische Listen:_ Auf den folgenden Listen werden technische Diskussionen geführt. Bevor Sie eine der Listen abonnieren oder Nachrichten an sie schicken, lesen Sie sich die Charta der Liste durch, da der Inhalt und Zweck dieser Listen genau festgelegt ist.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Mailingliste
+| Zweck
+
+|{freebsd-acpi}
+|Entwicklung von ACPI
+
+|link:{freebsd-amd64-url}[freebsd-amd64]
+|Portierung von FreeBSD auf AMD64-Systeme (moderiert)
+
+|link:{freebsd-apache-url}[freebsd-apache]
+|Diskussion über Ports, die mit Apache zusammenhängen.
+
+|link:{freebsd-arm-url}[freebsd-arm]
+|Portierung von FreeBSD auf ARM(R)-Prozessoren
+
+|link:{freebsd-atm-url}[freebsd-atm]
+|Benutzung von ATM-Netzen mit FreeBSD
+
+|link:{freebsd-bluetooth-url}[freebsd-bluetooth]
+|Bluetooth(R) unter FreeBSD verwenden
+
+|link:{freebsd-cloud-url}[freebsd-cloud]
+|FreeBSD auf Cloud-Plattformen (EC2, GCE, Azure, etc.)
+
+|link:{freebsd-cluster-url}[freebsd-cluster]
+|Benutzung von FreeBSD in einem Cluster
+
+|link:{freebsd-database-url}[freebsd-database]
+|Diskussion über Datenbanken und Datenbankprogrammierung unter FreeBSD
+
+|link:{freebsd-desktop-url}[freebsd-desktop]
+|FreeBSD als Desktop verwenden und verbessern
+
+|link:{dev-ci-url}[dev-ci]
+|Build- und Testberichte von den Continuous Integration Servern
+
+|link:{dev-reviews-url}[dev-reviews]
+|Benachrichtigungen über das Review-System von FreeBSD
+
+|link:{freebsd-doc-url}[freebsd-doc]
+|Erstellen der FreeBSD-Dokumentation
+
+|link:{freebsd-drivers-url}[freebsd-drivers]
+|Gerätetreiber für FreeBSD schreiben
+
+|link:{freebsd-dtrace-url}[freebsd-dtrace]
+|Entwicklung und Benutzung von DTrace unter FreeBSD
+
+|link:{freebsd-eclipse-url}[freebsd-eclipse]
+|Für FreeBSD-Anwender, welche die Eclipse IDE, deren Werkzeuge, Anwendungen und Ports einsetzen
+
+|link:{freebsd-elastic-url}[freebsd-elastic]
+|Diskussion zu ElasticSearch unter FreeBSD
+
+|link:{freebsd-embedded-url}[freebsd-embedded]
+|FreeBSD in eingebetteten Anwendungen einsetzen
+
+|link:{freebsd-emulation-url}[freebsd-emulation]
+|Emulation anderer Systeme wie Linux(R), MS-DOS(R) oder Windows(R)
+
+|link:{freebsd-enlightenment-url}[freebsd-enlightenment]
+|Portierung von Enlightenment und Enlightenment-Applikationen
+
+|link:{freebsd-eol-url}[freebsd-eol]
+|Support für FreeBSD-bezogene Software, die vom FreeBSD Project offiziell nicht mehr unterstützt wird.
+
+|link:{freebsd-erlang-url}[freebsd-erlang]
+|FreeBSD-spezifische Erlang-Diskussionen
+
+|link:{freebsd-firewire-url}[freebsd-firewire]
+|Technische Diskussion über FreeBSD FireWire(R) (iLink, IEEE 1394)
+
+|link:{freebsd-fortran-url}[freebsd-fortran]
+|Fortran unter FreeBSD
+
+|link:{freebsd-fs-url}[freebsd-fs]
+|Dateisysteme
+
+|link:{freebsd-games-url}[freebsd-games]
+|Unterstützung für Spiele unter FreeBSD
+
+|link:{freebsd-gecko-url}[freebsd-gecko]
+|Angelegenheiten zur Gecko Rendering Engine
+
+|link:{freebsd-geom-url}[freebsd-geom]
+|Diskussion über GEOM
+
+|link:{freebsd-git-url}[freebsd-git]
+|Diskussionen zur Verwendung von git im FreeBSD Project
+
+|link:{freebsd-gnome-url}[freebsd-gnome]
+|Portierung von GNOME und GNOME-Anwendungen
+
+|link:{freebsd-hackers-url}[freebsd-hackers]
+|Allgemeine technische Diskussionen
+
+|link:{freebsd-haskell-url}[freebsd-haskell]
+|FreeBSD-spezifische Haskell-Themen und Diskussionen
+
+|link:{freebsd-hardware-url}[freebsd-hardware]
+|Allgemeine Diskussion über Hardware, auf der FreeBSD läuft
+
+|link:{freebsd-i18n-url}[freebsd-i18n]
+|Internationalisierung von FreeBSD
+
+|link:{freebsd-infiniband-url}[freebsd-infiniband]
+|Infiniband unter FreeBSD
+
+|link:{freebsd-ipfw-url}[freebsd-ipfw]
+|Technische Diskussion über die Neubearbeitung der IP-Firewall Quellen
+
+|link:{freebsd-isdn-url}[freebsd-isdn]
+|Für Entwickler des ISDN-Systems
+
+|link:{freebsd-java-url}[freebsd-java]
+|Für Java(TM) Entwickler und Leute, die JDK(TM)s nach FreeBSD portieren
+
+|link:{freebsd-kde-url}[freebsd-kde]
+|Portierung von KDE und KDE-Anwendungen
+
+|link:{freebsd-lfs-url}[freebsd-lfs]
+|Portierung von LFS nach FreeBSD
+
+|link:{freebsd-mips-url}[freebsd-mips]
+|Portierung von FreeBSD zu MIPS(R)
+
+|link:{freebsd-mono-url}[freebsd-mono]
+|Mono und C# Anwendungen auf FreeBSD
+
+|{freebsd-multimedia}
+|Multimedia Anwendungen
+
+|link:{freebsd-new-bus-url}[freebsd-new-bus]
+|Technische Diskussionen über die Architektur von Bussen
+
+|link:{freebsd-net-url}[freebsd-net]
+|Diskussion über Netzwerke und den TCP/IP Quellcode
+
+|link:{freebsd-numerics-url}[freebsd-numerics]
+|Diskussionen über die Implementierung hochwertiger Funktionen in libm
+
+|link:{freebsd-ocaml-url}[freebsd-ocaml]
+|FreeBSD-spezifische Diskussionen zu OCaml
+
+|link:{freebsd-office-url}[freebsd-office]
+|Office-Anwendungen für FreeBSD
+
+|link:{freebsd-performance-url}[freebsd-performance]
+|Fragen zur Optimierung der Leistung stark ausgelasteter Systeme
+
+|link:{freebsd-perl-url}[freebsd-perl]
+|Pflege der portierten Perl-Anwendungen.
+
+|link:{freebsd-pf-url}[freebsd-pf]
+|Diskussionen und Fragen zu packet filter als Firewallsystem.
+
+|link:{freebsd-pkg-url}[freebsd-pkg]
+|Diskussionen über die Verwaltung von Binärpaketen und entsprechenden Werkzeugen
+
+|link:{freebsd-pkg-fallout-url}[freebsd-pkg-fallout]
+|Protokolle von fehlgeschlagenen Paketbauvorgängen
+
+|link:{freebsd-pkgbase-url}[freebsd-pkgbase]
+|Paketierung des FreeBSD-Basissystems
+
+|link:{freebsd-platforms-url}[freebsd-platforms]
+|Portierungen von FreeBSD auf nicht-Intel(R) Architekturen
+
+|link:{freebsd-ports-url}[freebsd-ports]
+|Diskussion über die Ports-Sammlung
+
+|link:{freebsd-ports-announce-url}[freebsd-ports-announce]
+|Wichtige Neuigkeiten und Anweisungen zur Ports-Sammlung (moderiert)
+
+|link:{freebsd-ports-bugs-url}[freebsd-ports-bugs]
+|Diskussion über Fehler und PRs der Ports
+
+|link:{freebsd-ppc-url}[freebsd-ppc]
+|Portierung von FreeBSD auf den PowerPC(R)
+
+|link:{freebsd-proliant-url}[freebsd-proliant]
+|Technische Diskussionen zum Einsatz von FreeBSD auf HP ProLiant-Serverplattformen
+
+|link:{freebsd-python-url}[freebsd-python]
+|FreeBSD-spezifische Diskussionen zu Python
+
+|link:{freebsd-rc-url}[freebsd-rc]
+|Diskussion über das [.filename]#rc.d#-System sowie dessen Weiterentwicklung
+
+|link:{freebsd-realtime-url}[freebsd-realtime]
+|Entwicklung von Echtzeiterweiterungen für FreeBSD
+
+|link:{freebsd-riscv-url}[freebsd-riscv]
+|Portierung von FreeBSD auf RISC-V(R)-Systeme
+
+|link:{freebsd-ruby-url}[freebsd-ruby]
+|FreeBSD-spezifische Diskussionen zu Ruby
+
+|link:{freebsd-scsi-url}[freebsd-scsi]
+|Diskussion über das SCSI-Subsystem
+
+|{freebsd-security}
+|Sicherheitsthemen
+
+|link:{freebsd-snapshots-url}[freebsd-snapshots]
+|Ankündigungen für FreeBSD Entwickler-Snapshots
+
+|link:{freebsd-sparc64-url}[freebsd-sparc64]
+|Portierung von FreeBSD auf SPARC(R) Systeme
+
+|link:{freebsd-standards-url}[freebsd-standards]
+|Konformität von FreeBSD mit den C99- und POSIX(R)-Standards
+
+|link:{freebsd-sysinstall-url}[freebsd-sysinstall]
+|man:sysinstall[8] Entwicklung
+
+|link:{freebsd-tcltk-url}[freebsd-tcltk]
+|FreeBSD spezifische Tcl/TK Diskussionen
+
+|link:{freebsd-testing-url}[freebsd-testing]
+|Tests unter FreeBSD
+
+|link:{freebsd-tex-url}[freebsd-tex]
+|Portierung von TeX und dessen Anwendungen nach FreeBSD
+
+|link:{freebsd-threads-url}[freebsd-threads]
+|Leichtgewichtige Prozesse (Threads) in FreeBSD
+
+|link:{freebsd-tilera-url}[freebsd-tilera]
+|Diskussionen zur Portierung von FreeBSD auf die Tilera-CPU-Familie
+
+|link:{freebsd-tokenring-url}[freebsd-tokenring]
+|Token-Ring Unterstützung in FreeBSD
+
+|link:{freebsd-toolchain-url}[freebsd-toolchain]
+|Wartung der FreeBSD-Toolchain
+
+|link:{freebsd-translators-url}[freebsd-translators]
+|Übersetzung von FreeBSD-Dokumenten und Programmen.
+
+|link:{freebsd-transport-url}[freebsd-transport]
+|Diskussion über Transportprotokolle in FreeBSD
+
+|link:{freebsd-usb-url}[freebsd-usb]
+|USB-Unterstützung in FreeBSD
+
+|link:{freebsd-virtualization-url}[freebsd-virtualization]
+|Diskussion über verschiedene Virtualisierungsverfahren, die von FreeBSD unterstützt werden
+
+|link:{freebsd-vuxml-url}[freebsd-vuxml]
+|Diskussion über die Infrastruktur von VuXML
+
+|link:{freebsd-x11-url}[freebsd-x11]
+|Wartung und Unterstützung von X11 auf FreeBSD
+
+|link:{freebsd-xen-url}[freebsd-xen]
+|Diskussionen über die FreeBSD Portierung auf Xen(TM) - Implementierung und Verwendung
+
+|link:{freebsd-xfce-url}[freebsd-xfce]
+|Portierung und Wartung von XFCE
+
+|link:{freebsd-zope-url}[freebsd-zope]
+|Zope für FreeBSD - Portierung und Wartung
+|===
+
+_Eingeschränkte Listen:_ Die folgenden Listen wenden sich an Zielgruppen mit speziellen Anforderungen und sind nicht für die Öffentlichkeit gedacht. Bevor Sie eine dieser Listen abonnieren, sollten Sie einige der technischen Listen abonniert haben, um mit den Umgangsformen vertraut zu sein.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Mailingliste
+| Zweck
+
+|link:{freebsd-hubs-url}[freebsd-hubs]
+|Betrieb von FreeBSD-Spiegeln
+
+|link:{freebsd-user-groups-url}[freebsd-user-groups]
+|Koordination von Benutzergruppen
+
+|link:{freebsd-wip-status-url}[freebsd-wip-status]
+|Status von in Arbeit befindlichen FreeBSD-Tätigkeiten
+
+|link:{freebsd-wireless-url}[freebsd-wireless]
+|Diskussionen zum 802.11-Stack sowie zur Entwicklung von Tools und Gerätetreibern
+|===
+
+_Zusammenfassungen:_ Alle eben aufgezählten Listen sind auch in zusammengefasster Form (digest) erhältlich. In den Einstellungen Ihres Accounts legen Sie fest, in welcher Form Sie die Listen empfangen.
+
+_SVN Listen:_ Die folgenden Listen versenden die Log-Einträge zu Änderungen an verschiedenen Teilen des Quellbaums. Diese Listen sollen _nur gelesen_ werden, schicken Sie bitte keine Nachrichten an eine der Listen.
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Mailingliste
+| Teil des Quellbaums
+| Beschreibung
+
+|link:{svn-doc-all-url}[svn-doc-all]
+|[.filename]#/usr/doc#
+|Änderungen im doc Subversion Repository (mit Ausnahme von [.filename]#user#, [.filename]#projects# und [.filename]#translations#)
+
+|link:{svn-doc-head-url}[svn-doc-head]
+|[.filename]#/usr/doc#
+|Änderungen im "head"-Zweig des doc Subversion Repository
+
+|link:{svn-doc-projects-url}[svn-doc-projects]
+|[.filename]#/usr/doc/projects#
+|Änderungen im [.filename]#projects#-Bereich des doc Subversion Repository
+
+|link:{svn-doc-svnadmin-url}[svn-doc-svnadmin]
+|[.filename]#/usr/doc#
+|Änderungen an den administrativen Skripten, Hooks und anderen Konfigurationsdateien des doc Subversion Repository
+
+|link:{svn-ports-all-url}[svn-ports-all]
+|[.filename]#/usr/ports#
+|Alle Änderungen des ports Subverison Repository
+
+|link:{svn-ports-head-url}[svn-ports-head]
+|[.filename]#/usr/ports#
+|Änderungen im "head"-Zweig des ports Subversion Repository
+
+|link:{svn-ports-svnadmin-url}[svn-ports-svnadmin]
+|[.filename]#/usr/ports#
+|Änderungen an den administrativen Skripten, Hooks und anderen Konfigurationsdateien des ports Subversion Repository
+
+|{svn-src-all}
+|[.filename]#/usr/src#
+|Änderungen im src Subversion Repository (außer für [.filename]#user# und [.filename]#projects#)
+
+|{svn-src-head}
+|[.filename]#/usr/src#
+|Änderungen im "head" Zweig des src Subversion Repository (der FreeBSD-CURRENT Zweig)
+
+|link:{svn-src-projects-url}[svn-src-projects]
+|[.filename]#/usr/projects#
+|Änderungen im [.filename]#projects# Bereich des src Subversion Repository
+
+|link:{svn-src-release-url}[svn-src-release]
+|[.filename]#/usr/src#
+|Änderungen im [.filename]#releases# Bereich des src Subversion Repository
+
+|link:{svn-src-releng-url}[svn-src-releng]
+|[.filename]#/usr/src#
+|Änderungen im [.filename]#releng# Zweig des src Subversion Repository (der security / release engineering Zweige)
+
+|link:{svn-src-stable-url}[svn-src-stable]
+|[.filename]#/usr/src#
+|Änderungen an allen stable Zweigen des src Subversion Repository
+
+|link:{svn-src-stable-6-url}[svn-src-stable-6]
+|[.filename]#/usr/src#
+|Änderungen im [.filename]#stable/6# Zweig des src Subversion Repository
+
+|link:{svn-src-stable-7-url}[svn-src-stable-7]
+|[.filename]#/usr/src#
+|Änderungen im [.filename]#stable/7# Zweig des src Subversion Repository
+
+|link:{svn-src-stable-8-url}[svn-src-stable-8]
+|[.filename]#/usr/src#
+|Änderungen im [.filename]#stable/8# Zweig des src Subversion Repository
+
+|{svn-src-stable-9}
+|[.filename]#/usr/src#
+|Änderungen im [.filename]#stable/9# Zweig des src Subversion Repository
+
+|link:{svn-src-stable-10-url}[svn-src-stable-10]
+|[.filename]#/usr/src#
+|Änderungen im [.filename]#stable/10# Zweig des src Subversion Repository
+
+|link:{svn-src-stable-11-url}[svn-src-stable-11]
+|[.filename]#/usr/src#
+|Änderungen im [.filename]#stable/11# Zweig des src Subversion Repository
+
+|link:{svn-src-stable-12-url}[svn-src-stable-12]
+|[.filename]#/usr/src#
+|Änderungen im [.filename]#stable/12# Zweig des src Subversion Repository
+
+|link:{svn-src-stable-other-url}[svn-src-stable-other]
+|[.filename]#/usr/src#
+|Änderungen an älteren [.filename]#stable# Zweigen des src Subversion Repository
+
+|link:{svn-src-svnadmin-url}[svn-src-svnadmin]
+|[.filename]#/usr/src#
+|Änderungen an den administrativen Skripten, hooks, und anderen Daten zur Konfiguration des src Subversion Repository
+
+|link:{svn-src-user-url}[svn-src-user]
+|[.filename]#/usr/src#
+|Änderungen am experimentellen [.filename]#user# Bereich des src Subversion Repository
+
+|link:{svn-src-vendor-url}[svn-src-vendor]
+|[.filename]#/usr/src#
+|Änderungen am Herstellerbereich des src Subversion Repository
+|===
+
+[[eresources-subscribe]]
+=== Mailinglisten abonnieren
+
+Um eine Liste zu abonnieren, besuchen die Webseite {mailman-lists-url} und klicken dort auf die Liste, die Sie abonnieren wollen. Sie gelangen dann auf die Webseite der Liste, die weitere Anweisungen für diese Liste enthält.
+
+Um eine Nachricht an eine Mailingliste zu schicken, schreiben Sie einfach eine E-Mail an mailto:Liste@FreeBSD.org[Liste@FreeBSD.org]. Die E-Mail wird dann an alle Mitglieder der Mailingliste verteilt.
+
+Wenn Sie das Abonnement aufheben wollen, folgen Sie der URL, die am Ende jeder Mail der Liste angegeben ist. Sie können das Abonnement auch mit einer E-Mail an mailto:Liste-unsubscribe@FreeBSD.org[Liste-unsubscribe@FreeBSD.org] aufheben.
+
+Verwenden Sie bitte die technischen Listen ausschließlich für technische Diskussionen. Wenn Sie nur an wichtigen Ankündigungen interessiert sind, abonnieren Sie die Mailingliste {freebsd-announce}, auf der nur wenige Nachrichten versendet werden.
+
+[[eresources-charters]]
+=== Chartas der Mailinglisten
+
+_Alle_ FreeBSD-Mailinglisten besitzen Grundregeln, die von jedem beachtet werden müssen. Für die ersten beiden Male, in denen ein Absender gegen diese Regeln verstößt, erhält er jeweils eine Warnung vom FreeBSD-Postmaster mailto:postmaster@FreeBSD.org[postmaster@FreeBSD.org]. Ein dritter Verstoß gegen die Regeln führt dazu, dass der Absender in allen FreeBSD-Mailinglisten gesperrt wird und weitere Nachrichten von ihm nicht mehr angenommen werden. Wir bedauern sehr, dass wir solche Maßnahmen ergreifen müssen, aber heutzutage ist das Internet eine recht rauhe Umgebung, in der immer weniger Leute Rücksicht aufeinander nehmen.
+
+Die Regeln:
+
+* Das Thema einer Nachricht soll der Charta der Liste, an die sie gesendet wird, entsprechen. Wenn Sie eine Nachricht an eine technische Liste schicken, sollte die Nachricht auch technische Inhalte haben. Fortwährendes Geschwätz oder Streit mindern den Wert der Liste für alle Mitglieder und wird nicht toleriert. Benutzen Sie {freebsd-chat} für allgemeine Diskussionen über FreeBSD.
+* Eine Nachricht sollte an nicht mehr als zwei Mailinglisten gesendet werden. Schicken Sie eine Nachricht nur dann an zwei Listen, wenn das wirklich notwendig ist. Viele Leute haben mehrere Mailinglisten abonniert und Nachrichten sollten nur zu ungewöhnlichen Kombinationen der Listen, wie "-stable" und "-scsi", gesendet werden. Wenn Sie eine Nachricht erhalten, die im `Cc`-Feld mehrere Listen enthält, sollten Sie das Feld kürzen, bevor Sie eine Antwort darauf verschicken. _Unabhängig von dem ursprünglichen Verteiler sind Sie für Ihre eigenen Mehrfach-Sendungen selbst verantwortlich._
+* Persönliche Angriffe und Beschimpfungen sind in einer Diskussion nicht erlaubt. Dies gilt gleichermaßen für Benutzer wie Entwickler. Grobe Verletzungen der Netiquette, wie das Verschicken oder Zitieren von privater E-Mail ohne eine entsprechende Genehmigung, werden nicht gebilligt. Die Nachrichten werden aber nicht besonders auf Verletzungen der Netiquette untersucht. Es kann sein, dass eine Verletzung der Netiquette durchaus zu der Charta einer Liste passt, aber der Absender aufgrund der Verletzung eine Warnung erhält oder gesperrt wird.
+* Werbung für Produkte oder Dienstleistungen, die nichts mit FreeBSD zu tun haben, sind verboten. Ist die Werbung als Spam verschickt worden, wird der Absender sofort gesperrt.
+
+_Chartas einzelner Listen:_
+
+{freebsd-acpi}::
+Die Entwicklung von ACPI und Energieverwaltungsfunktionen.
+
+{freebsd-announce}::
+_Wichtige Ereignisse und Meilensteine_
++
+Diese Liste ist für Personen, die nur an den wenigen Ankündigungen wichtiger Ereignisse interessiert sind. Die Ankündigungen betreffen Schnappschüsse und Releases, neue Merkmale von FreeBSD und die Suche nach freiwilligen Mitarbeitern. Auf der Liste herrscht wenig Verkehr und sie wird streng moderiert.
+
+link:{freebsd-arch-url}[freebsd-arch]::
+_Architektur und Design von FreeBSD_
++
+Auf dieser technischen Liste wird die FreeBSD-Architektur diskutiert. Beispiele für angemessene Themen sind:
+
+** Wie das Bausystem zu verändern ist, damit verschiedene Läufe gleichzeitig möglich sind.
+** Was am VFS geändert werden muss, damit Heidemann Schichten eingesetzt werden können.
+** Wie die Schnittstelle der Gerätetreiber angepasst werden muss, damit derselbe Treiber auf verschiedenen Bussen und Architekturen eingesetzt werden kann.
+** Wie ein Netzwerktreiber geschrieben wird.
+
+link:{freebsd-bluetooth-url}[freebsd-bluetooth]::
+_Bluetooth(R) unter FreeBSD_
++
+Diese Liste diskutiert Probleme der Verwendung von Bluetooth(R) unter FreeBSD. Designprobleme, Implementierungsdetails, Patches, Fehler- und Statusberichte, Verbesserungsvorschläge sowie alle anderen mit Bluetooth(R) zusammenhängenden Themen werden hier behandelt.
+
+link:{freebsd-bugbusters-url}[freebsd-bugbusters]::
+_Bearbeitung der Fehlerberichte_
++
+Auf dieser Liste wird die Bearbeitung der Fehlerberichte (PR, engl. problem report) koordiniert. Sie dient dem "Bugmeister" und allen Leuten, die ein Interesse an der Datenbank der Fehlerberichte haben, als Diskussionsforum. Auf dieser Liste werden keine spezifischen Fehler, Fehlerbehebungen oder PRs diskutiert.
+
+link:{freebsd-bugs-url}[freebsd-bugs]::
+_Fehlerberichte_
++
+Auf dieser Liste werden Fehlerberichte gesammelt. Fehlerberichte sollten immer mit der https://bugs.freebsd.org/bugzilla/enter_bug.cgi[ Web-Schnittstelle] erstellt werden.
+
+link:{freebsd-chat-url}[freebsd-chat]::
+_Nicht technische Themen, welche die FreeBSD Gemeinschaft betreffen_
++
+Auf dieser Liste werden nicht-technische soziale Themen diskutiert, die nicht auf die anderen Listen passen. Hier kann diskutiert werden, ob Jordan wie ein Frettchen aus einem Zeichentrickfilm aussieht oder nicht, ob grundsätzlich in Großbuchstaben geschrieben werden soll, wer zuviel Kaffee trinkt, wo das beste Bier gebraut wird und wer Bier in seinem Keller braut. Gelegentlich können auf den technischen Listen wichtige Ereignisse wie Feste, Hochzeiten oder Geburten angekündigt werden, aber nachfolgende Nachrichten sollten auf die Liste {freebsd-chat} gesendet werden.
+
+link:{freebsd-chromium-url}[freebsd-chromium]::
+_Diskussionen zum Einsatz von Chromium unter FreeBSD_
++
+Auf dieser technischen Liste werden Fragen zur Entwicklung, zur Installation sowie zum Einsatz von Chromium unter FreeBSD diskutiert.
+
+link:{freebsd-cloud-url}[freebsd-cloud]::
+_FreeBSD auf verschiedenen Cloud-Plattformen betreiben_
++
+Diese Liste diskutiert FreeBSD auf Amazon EC2, Google Compute Engine, Microsoft Azure und weiteren Cloud-Plattformen.
+
+freebsd-core::
+_FreeBSD Core Team_
++
+Dies ist eine interne Mailingliste des FreeBSD Core Teams. Wenn in einer wichtigen Angelegenheit, die FreeBSD betrifft, entschieden werden muss oder die Angelegenheit einer genauen Prüfung unterzogen werden muss, können Nachrichten an diese Liste gesendet werden.
+
+{freebsd-current}::
+_Gebrauch von FreeBSD-CURRENT_
++
+Diese Mailingliste ist für die Benutzer von FreeBSD-CURRENT eingerichtet. Auf ihr finden sich Ankündigungen über Besonderheiten von -CURRENT, von denen Benutzer betroffen sind. Sie enthält weiterhin Anweisungen, wie man ein System auf -CURRENT hält. Jeder, der ein -CURRENT System besitzt, muss diese Liste lesen. Die Liste ist nur für technische Inhalte bestimmt.
+
+link:{freebsd-desktop-url}[freebsd-desktop]::
+_FreeBSD als Desktop verwenden und verbessern_
++
+Dies ist ein Forum für Diskussionen um FreeBSD auf dem Desktop. Es wird primär von Desktop-Portierern und Nutzern verwendet, um Probleme und Verbesserungen zu FreeBSDs Einsatz auf dem Desktop zu besprechen.
+
+link:{freebsd-doc-url}[freebsd-doc]::
+Auf dieser Mailingliste werden Themen diskutiert, die im Zusammenhang mit der Erstellung der FreeBSD Dokumentation stehen. "The FreeBSD Documentation Project" besteht aus den Mitgliedern dieser Liste. Diese Liste steht jedem offen, Sie sind herzlich eingeladen teilzunehmen und mitzuhelfen.
+
+link:{freebsd-drivers-url}[freebsd-drivers]::
+_Gerätetreiber für FreeBSD schreiben_
++
+Ein Forum für technische Diskussionen über das Schreiben von Gerätetreibern für FreeBSD. Daher werden hier vor allem Fragen behandelt, die sich um das Schreiben von Treibern, welche die APIs des Kernels nutzen, drehen.
+
+link:{freebsd-dtrace-url}[freebsd-dtrace]::
+_Entwicklung und Benutzung von DTrace unter FreeBSD_
++
+DTrace ist Bestandteil von FreeBSD und stellt Laufzeitinformationen vom Kernel und Anwendungsprogrammen zur Verfügung. Diese Liste ist für Diskussionen von Entwicklern und Benutzern.
+
+link:{freebsd-eclipse-url}[freebsd-eclipse]::
+_Für FreeBSD-Anwender, welche die Eclipse IDE deren Werkzeuge, Anwendungen und Ports einsetzen_
++
+Das Ziel dieser Liste ist es, Unterstützung für all jene zu bieten, die mit der Installation, Verwendung, Entwicklung und Wartung der Eclipse-IDE sowie deren Werkzeugen und Anwendungen unter FreeBSD zu tun haben. Außerdem wird Hilfe bei der Portierung der IDE und deren Plugins auf FreeBSD geboten.
++
+Zusätzlich soll diese Liste einen Informationsaustausch zwischen der Eclipse- und der FreeBSD-Gemeinde ermöglichen, von dem beide Seiten profitieren können.
++
+Obwohl sich diese Liste auf die Anforderungen von Anwendern konzentriert, möchte sie auch Entwickler unterstützen, die an der Entwicklung von FreeBSD-spezifischen Anwendungen unter Nutzung des Eclipse-Frameworks arbeiten.
+
+link:{freebsd-embedded-url}[freebsd-embedded]::
+_FreeBSD in eingebetteten Anwendungen einsetzen_
++
+Diese Liste diskutiert Themen im Zusammenhang mit dem Einsatz von ungewöhnlich kleinen und eingebetteten FreeBSD-Installationen. Auf dieser Liste werden ausschließlich technische Diskussionen geführt. Unter eingebetteten Systemen versteht diese Liste Systeme, bei denen es sich nicht um Desktopsysteme handelt, und die in der Regel nur einem einzigen Zweck dienen (im Gegensatz zu Desktopsystemen, die für die Bewältigung verschiedenster Aufgaben geeignet sind). In die Gruppe der eingebetteten Systeme gehören beispielsweise Telefone, Netzwerkgeräte wie Router, Switche oder PBX-Systeme, PDAs, Verkaufsautomaten und andere mehr.
+
+link:{freebsd-emulation-url}[freebsd-emulation]::
+_Emulation anderer Systeme wie Linux(R), MS-DOS(R) oder Windows(R)_
++
+Hier werden technische Diskussionen zum Einsatz von Programmen, die für andere Betriebssysteme geschrieben wurden, geführt.
+
+link:{freebsd-enlightenment-url}[freebsd-enlightenment]::
+_Enlightenment_ Desktop-Umgebung für FreeBSD-Systeme. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden.
+
+link:{freebsd-eol-url}[freebsd-eol]::
+_Support für FreeBSD-bezogene Software, die vom FreeBSD Project offiziell nicht mehr unterstützt wird._
++
+Diese Liste ist für all jene interessant, die Unterstützung für vom FreeBSD Project offiziell nicht mehr (in Form von Security Advisories oder Patches) unterstützte Programme benötigen oder anbieten wollen.
+
+link:{freebsd-firewire-url}[freebsd-firewire]::
+_FireWire(R) (iLink, IEEE 1394)_
++
+Auf dieser Liste wird das Design und die Implementierung eines FireWire(R)-Subsystems (auch IEEE 1394 oder iLink) für FreeBSD diskutiert. Relevante Themen sind die Standards, Busse und ihre Protokolle, sowie Adapter, Karten und Chipsätze. Des Weiteren die Architektur und der Quellcode, die nötig sind, diese Geräte zu unterstützen.
+
+link:{freebsd-fortran-url}[freebsd-fortran]::
+_Fortran unter FreeBSD_
++
+Diese Liste ist für Diskussionen rund um Fortran-Ports unter FreeBSD: Compiler, Bibliotheken, wissenschaftliche und technische Anwendungen von Laptops bis hin zu HPC-Clustern.
+
+link:{freebsd-fs-url}[freebsd-fs]::
+_Dateisysteme_
++
+Diskussionen über FreeBSD-Dateisysteme. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden.
+
+link:{freebsd-games-url}[freebsd-games]::
+_Spiele unter FreeBSD_
++
+Eine Liste für technische Diskussionen im Zusammenhang mit Spielen unter FreeBSD. Die Liste ist für Personen, die an Portierungen arbeiten und alternative Lösungen erörtern. Personen, die an technischen Diskussionen interessiert sind, sind ebenfalls willkommen.
+
+link:{freebsd-gecko-url}[freebsd-gecko]::
+Angelegenheiten zur _Gecko Rendering Engine_
++
+Dies ist ein Forum über Gecko-Anwendungen, die FreeBSD verwenden.
++
+Die Diskussion dreht sich um die Portierung von Gecko-Anwendungen, deren Installation, die Entwicklung sowie deren Unterstützung innerhalb von FreeBSD.
+
+link:{freebsd-geom-url}[freebsd-geom]::
+_GEOM_
++
+Diskussion über GEOM und verwandte Implementierungen. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden.
+
+link:{freebsd-git-url}[freebsd-git]::
+_Verwendung von git im FreeBSD Project_
++
+Diskussionen über die Verwendung von git in der FreeBSD Infrastruktur. Personen, die einen Spiegel aufsetzen wollen, oder allgemeine Fragen zu git unter FreeBSD haben, können hier Fragen stellen.
+
+link:{freebsd-gnome-url}[freebsd-gnome]::
+_GNOME_
++
+Diskussionen über die grafische Benutzeroberfläche GNOME. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden.
+
+link:{freebsd-infiniband-url}[freebsd-infiniband]::
+_Infiniband unter FreeBSD_
++
+Technische Liste mit Diskussionen über Infiniband, OFED und OpenSM unter FreeBSD.
+
+link:{freebsd-ipfw-url}[freebsd-ipfw]::
+_IP Firewall_
++
+Diskussionen über eine Neubearbeitung des IP-Firewall Quelltexts in FreeBSD. Dies ist eine technische Liste, in der nur technische Inhalte erwartet werden.
+
+link:{freebsd-isdn-url}[freebsd-isdn]::
+_ISDN Subsystem_
++
+Mailingliste für die Entwickler des ISDN Subsystems von FreeBSD.
+
+link:{freebsd-java-url}[freebsd-java]::
+_Java(TM) Entwicklung_
++
+Mailingliste, auf der die Entwicklung von Java(TM) Anwendungen für FreeBSD sowie die Portierung und Pflege von JDK(TM)s diskutiert wird.
+
+[[eresources-charters-jobs]]
+link:{freebsd-jobs-url}[freebsd-jobs]::
+_Stellenangebote und Stellengesuche_
++
+In diesem Forum können Sie Stellenangebote und Stellengesuche, die mit FreeBSD zu tun haben, aufgeben. Diese Mailingliste ist _nicht_ der Ort, um über allgemeine Beschäftigungsprobleme zu diskutieren; dazu gibt es anderswo geeignete Foren.
++
+Beachten Sie bitte, dass diese Liste, wie die anderen `FreeBSD.org`-Listen, weltweit gelesen wird. Geben Sie daher bitte den Arbeitsort genau an. Geben Sie bitte auch an, ob Telearbeit möglich ist und ob Hilfen für einen Umzug angeboten werden.
++
+Benutzen Sie in der E-Mail bitte nur offene Formate - vorzugsweise nur das Textformat. Andere Formate, wie PDF oder HTML, werden von den Lesern akzeptiert. Nicht offene Formate wie Microsoft(R) Word ([.filename]#.doc#) werden vom Server der Liste abgelehnt.
+
+link:{freebsd-hackers-url}[freebsd-hackers]::
+_Technische Diskussionen_
++
+Dies ist ein Forum für technische Diskussionen über FreeBSD. Leute, die aktiv an FreeBSD arbeiten, können hier Probleme und deren Lösungen diskutieren. Interessierte, die den Diskussionen folgen wollen, steht die Liste ebenfalls offen. Auf dieser Liste finden nur technische Diskussionen statt.
+
+link:{freebsd-hardware-url}[freebsd-hardware]::
+_Allgemeine Diskussionen über Hardware_
++
+Allgemeine Diskussionen über die Hardware, auf der FreeBSD läuft: Probleme und Ratschläge welche Hardware man kaufen sollte und welche nicht.
+
+link:{freebsd-hubs-url}[freebsd-hubs]::
+_FreeBSD-Spiegel_
++
+Ankündigungen und Diskussionsforum für Leute, die FreeBSD-Spiegel betreiben.
+
+link:{freebsd-isp-url}[freebsd-isp]::
+_Themen für Internet Service Provider_
++
+Diese Liste ist für Internet Service Provider (ISP), die FreeBSD benutzen. Auf dieser Liste finden nur technische Diskussionen statt.
+
+link:{freebsd-mono-url}[freebsd-mono]::
+_Mono und C# Anwendungen auf FreeBSD_
++
+Diese Liste beinhaltet Diskussionen über das Mono Entwicklungsframework auf FreeBSD. Dies ist eine technische Mailingliste. Es ist für Personen gedacht, die aktiv an der Portierung von Mono oder C# Anwendungen auf FreeBSD sind, um Probleme oder alternative Lösungen zu beratschlagen. Personen die der technischen Diskussion folgen möchten sind ebenso willkommen.
+
+link:{freebsd-ocaml-url}[freebsd-ocaml]::
+_FreeBSD-spezifische Diskussionen zu OCaml_
++
+Diskussionen im Zusammenhang mit der OCaml-Unterstützung auf FreeBSD. Dies ist eine technische Mailingliste für Benutzer, die an OCaml-Ports, Bibliotheken und Frameworks von Drittanbietern arbeiten. Auch Benutzer, die an der technischen Diskussion interessiert sind, sind willkommen.
+
+link:{freebsd-office-url}[freebsd-office]::
+_Office-Anwendungen für FreeBSD_
++
+Diskussionen über Office-Anwendungen, ihre Installation, Entwicklung und Unterstützung innerhalb von FreeBSD
+
+link:{freebsd-kde-url}[freebsd-kde]::
+_KDE_
++
+Diskussionen über KDE auf FreeBSD-Systemen. Dies ist eine technische Liste, in der nur technische Inhalte diskutiert werden.
+
+link:{freebsd-announce-url}[freebsd-announce]::
+_Projekt-Infrastruktur Ankündigungen_
++
+Diese Liste für Leute gedacht, die an Veränderungen im Zusammenhang der FreeBSD-Projekt Infrastruktur interessiert sind.
++
+Diese moderierte Liste wird ausschließlich für Ankündigungen verwendet. Sie können keine Anfragen an diese Liste stellen und erhalten somit auch keine Antworten.
+
+link:{freebsd-performance-url}[freebsd-performance]::
+_Diskussionsforum mit dem Ziel, die Leistung von FreeBSD zu verbessern._
++
+Auf dieser Liste diskutieren Hacker, Systemadministratoren und andere Interessierte die Leistung von FreeBSD. Zulässige Themen sind beispielsweise Systeme unter hoher Last, Systeme mit Leistungsproblemen oder Systeme, die Leistungsgrenzen von FreeBSD überwinden. Jeder, der mithelfen will, die Leistung von FreeBSD zu verbessern, sollte diese Liste abonnieren. Die Liste ist technisch anspruchsvoll und geeignet für erfahrene FreeBSD-Benutzer, Hacker oder Administratoren, die FreeBSD schnell, robust und skalierbar halten wollen. Auf der Liste werden Beiträge gesammelt oder Fragen nach ungelösten Problemen beantwortet. Sie ist kein Ersatz für das gründliche Studium der Dokumentation.
+
+link:{freebsd-pf-url}[freebsd-pf]::
+_Diskussionen und Fragen zu packet filter als Firewallsystem._
++
+FreeBSD-spezifische Diskussionen zur Benutzung von packet filter (pf) als Firewallsystem. Sowohl technische Diskussionen als auch Anwenderfragen sind auf dieser Liste willkommen. Fragen zum ALTQ QoS Framework können ebenfalls gestellt werden.
+
+link:{freebsd-pkg-url}[freebsd-pkg]::
+_Diskussionen über die Verwaltung von Binärpaketen und entsprechenden Werkzeugen_
++
+Diskussionen über die Verwendung von Binärpaketen, Werkzeuge zur Paketverwaltung, Entwicklung und Unterstützung innerhalb von FreeBSD, Verwaltung der Paket-Repositories und die Verwaltung von Paketen von Drittherstellern.
++
+Beachten Sie, dass diese Liste nicht geeignet ist, um Probleme über nicht gebaute Pakete zu melden. Diese Probleme werden im allgemeinen als Problem des Ports betrachtet.
+
+link:{freebsd-pkg-fallout-url}[freebsd-pkg-fallout]::
+_Protokolle von fehlgeschlagenen Paketbauvorgängen_
++
+Alle Fehlerprotokolle aus dem Paketcluster.
+
+link:{freebsd-pkgbase-url}[freebsd-pkgbase]::
+_Paketierung des FreeBSD-Basissystems_
++
+Diskussion über die Implementierung und Probleme im Bezug auf die Paketierung des FreeBSD-Basissystems.
+
+link:{freebsd-platforms-url}[freebsd-platforms]::
+_Portierung auf nicht-Intel(R) Plattformen_
++
+Plattformübergreifende Themen und Vorschläge für die Portierung auf nicht-Intel(R) Plattformen. Auf dieser Liste finden nur technische Diskussionen statt.
+
+link:{freebsd-ports-url}[freebsd-ports]::
+_Diskussion über die Ports-Sammlung_
++
+Diskussionen über die FreeBSD-Ports-Sammlung und die Infrastruktur der Sammlung. Die Liste dient auch der allgemeinen Koordination der Dinge, welche die Ports-Sammlung betreffen. Auf dieser Liste finden nur technische Diskussionen statt.
+
+link:{freebsd-ports-bugs-url}[freebsd-ports-bugs]::
+_Diskussion über Fehler in den Ports_
++
+Diskussion über Fehler in der Ports-Sammlung ([.filename]#/usr/ports#), neue Ports oder Änderungen an bestehenden Ports. Auf dieser Liste finden nur technische Diskussionen statt.
+
+link:{freebsd-proliant-url}[freebsd-proliant]::
+_Technische Diskussionen zum Einsatz von FreeBSD auf HP ProLiant-Serverplattformen_
++
+Diese Mailingliste bietet technische Diskussionen zum Einsatz von FreeBSD auf der ProLiant-Serverplattform von HP, darunter Fragen zu ProLiant-spezifischen Treibern, Konfigurationswerkzeugen sowie BIOS-Aktualisierungen. Daher ist sie die erste Anlaufstelle, um die Module hpasmd, hpasmcli, sowie hpacucli zu diskutieren.
+
+link:{freebsd-python-url}[freebsd-python]::
+_Python unter FreeBSD_
++
+Diese technische Liste dient der Verbesserung der Python-Unterstützung unter FreeBSD. Sie wird von Personen gelesen, die an der Portierung von Python, von Python-Modulen Dritter und von Zope nach FreeBSD arbeiten. Personen, die diese technischen Diskussion verfolgen wollen, sind ebenfalls willkommen.
+
+link:{freebsd-questions-url}[freebsd-questions]::
+_Benutzerfragen_
++
+Auf dieser Mailingliste können Fragen zu FreeBSD gestellt werden. Fragen Sie bitte nicht nach Anleitungen, wenn Sie nicht sicher sind, dass Ihre Frage wirklich technischer Natur ist.
+
+link:{freebsd-ruby-url}[freebsd-ruby]::
+_Ruby unter FreeBSD_
++
+Diese technische Liste dient der Verbesserung der Ruby-Unterstützung unter FreeBSD. Sie wird von Personen gelesen, die an der Portierung von Ruby, von Bibliotheken Dritter und Frameworks arbeiten. Personen, die diese technischen Diskussionen verfolgen wollen, sind ebenfalls willkommen.
+
+link:{freebsd-scsi-url}[freebsd-scsi]::
+_SCSI Subsystem_
++
+Diese Mailingliste ist für die Entwickler des SCSI Subsystems von FreeBSD. Auf dieser Liste finden nur technische Diskussionen statt.
+
+{freebsd-security}::
+_Sicherheitsthemen_
++
+Sicherheitsthemen, die FreeBSD betreffen, wie DES, Kerberos, bekannte Sicherheitslöcher und Fehlerbehebungen. Stellen Sie bitte auf dieser Liste keine allgemeinen Fragen zum Thema Sicherheit. Willkommen sind allerdings Beiträge zur FAQ, das heißt eine Frage mit der passenden Antwort. Auf dieser Liste finden nur technische Diskussionen statt.
+
+{freebsd-security-notifications}::
+_Ankündigungen zum Thema Sicherheit_
++
+Ankündigungen über Sicherheitsprobleme von FreeBSD und deren Behebungen. Diese Liste ist kein Diskussionsforum, benutzen Sie {freebsd-security}, um Sicherheitsthemen zu diskutieren.
+
+link:{freebsd-snapshots-url}[freebsd-snapshots]::
+_Ankündigungen für FreeBSD Entwickler-Snapshots_
++
+Diese Liste informiert über die Verfügbarkeit von neuen FreeBSD-Snapshots aus den Zweigen head/ und stable/.
+
+{freebsd-stable}::
+_Gebrauch von FreeBSD-STABLE._
++
+Diese Mailingliste ist für die Benutzer von FreeBSD-STABLE eingerichtet. -STABLE ist der Zweig, in dem die Entwicklung nach einen RELEASE stattfindet, einschließlich Fehlerkorrekturen und neuer Funktionen. Die ABI wird wegen Binärkompatibilitäten stabil gehalten. Auf der Liste finden sich Ankündigungen über Besonderheiten von -STABLE, von denen Benutzer betroffen sind. Sie enthält weiterhin Anweisungen, wie man ein System auf -STABLE hält. Jeder, der ein -STABLE System besitzt, muss diese Liste lesen. Die Liste ist nur für technische Inhalte bestimmt.
+
+link:{freebsd-standards-url}[freebsd-standards]::
+_Konformität von FreeBSD mit den C99- und POSIX(R) Standards_
++
+Dieses Forum ist für technische Diskussionen über die Konformität von FreeBSD mit den C99- und POSIX(R)-Standards.
+
+link:{freebsd-teaching-url}[freebsd-teaching]::
+_Unterrichten mit FreeBSD_
++
+Mailingliste, die das Unterrichten mit FreeBSD diskutiert.
+
+link:{freebsd-testing-url}[freebsd-testing]::
+_Tests unter FreeBSD_
++
+Technische Liste, auf der Tests unter FreeBSD diskutiert werden, einschließlich ATF/Kyua, der Test/Build-Infrastruktur, und Portierungen von anderen Betriebssystemen (NetBSD, ...) nach FreeBSD.
+
+link:{freebsd-tex-url}[freebsd-tex]::
+_Portierung von TeX und dessen Anwendungen nach FreeBSD_
++
+Technische Liste für Diskussionen im Zusammenhang mit TeX und dessen Anwendungen unter FreeBSD. Diese Liste ist für Menschen, die an der Portierung von TeX nach FreeBSD arbeiten. Es werden aber auch Probleme und Lösungen erörtert. Personen, die an technischen Diskussionen interessiert sind, sind ebenfalls willkommen.
+
+link:{freebsd-toolchain-url}[freebsd-toolchain]::
+_Wartung der FreeBSD-Toolchain_
++
+Auf dieser Mailingliste werden alle Themen rund um die FreeBSD-Toolchain diskutiert. Dazu gehören der Status von Clang und GCC, aber auch Fragen zu Programmen wie Assemblern, Linkern und Debuggern.
+
+link:{freebsd-translators-url}[freebsd-translators]::
+_Übersetzung von FreeBSD-Dokumenten und Programmen_
++
+Auf dieser Liste können Übersetzer von FreeBSD-Dokumenten über die Methoden und Werkzeuge für die Übersetzung diskutieren. Neue Benutzer werden gebeten sich vorzustellen und die Sprache zu erwähnen, an dessen Übersetzung sie interessiert sind.
+
+link:{freebsd-transport-url}[freebsd-transport]::
+_Diskussion über Transportprotokolle in FreeBSD_
++
+Diese Liste behandelt die Probleme und das Design von FreeBSDs Netzwerkstack, darunter auch TCP, SCTP und UDP. Andere Netzwerkthemen sollten auf der {freebsd-net} diskutiert werden.
+
+link:{freebsd-usb-url}[freebsd-usb]::
+_USB-Unterstützung in FreeBSD._
++
+Auf dieser Liste finden nur technische Diskussionen statt.
+
+link:{freebsd-user-groups-url}[freebsd-user-groups]::
+_Koordination von Benutzergruppen_
++
+Diese Liste ist für Koordinatoren lokaler Benutzergruppen und einem ausgesuchten Mitglied des Core Teams eingerichtet worden. Der Inhalt sollte Inhalte von Treffen und die Koordination von Projekten mehrerer Benutzergruppen beschränkt sein.
+
+link:{freebsd-virtualization-url}[freebsd-virtualization]::
+_Diskussion über verschiedene Virtualisierungsverfahren, die von FreeBSD unterstützt werden_
++
+Eine Liste, auf der die verschiedenen Virtualisierungsverfahren, die von FreeBSD unterstützt werden, diskutiert werden. Auf der einen Seite liegt der Fokus auf der Implementierung der zugrundeliegenden Funktionalitäten, ebenso wie das Hinzufügen neuer Eigenschaften. Auf der anderen Seite haben die Benutzer ein Forum, um Fragen bei Problemen zu stellen oder um ihre Anwendungsfälle zu besprechen.
+
+link:{freebsd-wip-status-url}[freebsd-wip-status]::
+_Status von in Arbeit befindlichen FreeBSD-Tätigkeiten_
++
+Diese Mailingliste kann dazu verwendet werden, eigene Kreationen und deren Fortschritt von FreeBSD-verwandten Tätigkeiten anzukündigen. Die Nachrichten werden moderiert. Es wird empfohlen, die Nachricht "An:" eine mehr themenverwandte FreeBSD-Liste zu senden und diese Liste nur in Blindkopie zu setzen. Auf diese Weise kann ihre in Arbeit befindliche Tätigkeit auch auf der themenverwandten Liste diskutiert werden, da auf dieser Liste keine Diskussionen erlaubt sind.
++
+Sehen Sie sich das Archiv der Liste für passende Nachrichten an.
++
+Redaktionelle Auszüge der Nachrichten an diese Liste werden eventuell alle paar Monate auf die FreeBSD Webseite als Teil der Statusberichte gestellt. Weitere Beispiele und zurückliegende Berichte können Sie auch dort finden.
+
+link:{freebsd-wireless-url}[freebsd-wireless]::
+_Diskussionen zum 802.11-Stack sowie zur Entwicklung von Tools und Gerätetreibern_
++
+Die Mailingliste freebsd-wireless diskutiert Themen rund um den 802.11-Stack (sys/net80211). Besprochen werden die Entwicklung von Tools und Gerätetreibern sowie auftretende Probleme, neue Funktionen sowie die Wartung der existierenden Werkzeuge und Treiber.
+
+link:{freebsd-xen-url}[freebsd-xen]::
+_Diskussionen über die FreeBSD Portierung auf Xen(TM) - Implementierung und Verwendung_
++
+Eine Liste, welche die FreeBSD Portierung auf Xen(TM) behandelt. Das erwartete Nachrichtenaufkommen ist klein genug, so dass es als Forum für sowohl technische Diskussionen über die Implementierung und Entwurfsdetails, als auch administrative Verteilaspekte ausgelegt ist.
+
+link:{freebsd-xfce-url}[freebsd-xfce]::
+_XFCE_
++
+Eine Liste, auf der Fragen zum Einsatz von XFCE unter FreeBSD diskutiert werden. Es handelt sich um eine technische Mailingliste, die sich primär an Entwickler richtet, die aktiv an der Portierung von XFCE nach FreeBSD arbeiten. Aber auch Nutzer, die einfach nur die technischen Diskussionen verfolgen wollen, sind willkommen. Diskutiert werden vor allem bei der Portierung auftretende Probleme und mögliche Lösungswege.
+
+link:{freebsd-zope-url}[freebsd-zope]::
+_Zope_
++
+Ein Forum für Diskussionen darüber, wie man die Zope-Umgebung auf FreeBSD portieren kann. Dies ist eine technische Mailingliste. Sie ist für Leute gedacht, die aktiv an der Portierung von Zope auf FreeBSD arbeiten, um aufkommende Probleme oder alternative Lösungsansätze zu besprechen. Personen, die der technischen Diskussion folgen möchten, sind ebenfalls willkommen.
+
+[[eresources-mailfiltering]]
+=== Filter der Mailinglisten
+
+Um die Verbreitung von Spam, Viren und anderen nicht erwünschten E-Mails zu verhindern, werden auf den FreeBSD-Mailinglisten Filter eingesetzt. Dieser Abschnitt beschreibt nur einen Teil der zum Schutz der Listen eingesetzten Filter.
+
+Auf den Mailinglisten sind nur die unten aufgeführten Anhänge erlaubt. Anhänge mit einem anderen MIME-Typ werden entfernt, bevor eine E-Mail an eine Liste verteilt wird.
+
+* application/octet-stream
+* application/pdf
+* application/pgp-signature
+* application/x-pkcs7-signature
+* message/rfc822
+* multipart/alternative
+* multipart/related
+* multipart/signed
+* text/html
+* text/plain
+* text/x-diff
+* text/x-patch
+
+[NOTE]
+====
+Einige Mailinglisten erlauben vielleicht Anhänge mit anderem MIME-Typ. Für die meisten Mailinglisten sollte die obige Aufzählung aber richtig sein.
+====
+
+Wenn eine E-Mail sowohl aus einer HTML-Version wie auch aus einer Text-Version besteht, wird die HTML-Version entfernt. Wenn eine E-Mail nur im HTML-Format versendet wurde, wird sie in reinen Text umgewandelt.
+
+[[eresources-news]]
+== Usenet-News
+
+Neben den Gruppen, die sich ausschließlich mit BSD beschäftigen, gibt es viele weitere in denen über FreeBSD diskutiert wird, oder die für FreeBSD-Benutzer wichtig sind.
+
+=== BSD spezifische Gruppen
+
+* link:news:comp.unix.bsd.freebsd.announce[ comp.unix.bsd.freebsd.announce]
+* link:news:comp.unix.bsd.freebsd.misc[ comp.unix.bsd.freebsd.misc]
+* link:news:de.comp.os.unix.bsd[ de.comp.os.unix.bsd] (deutsch)
+* link:news:fr.comp.os.bsd[ fr.comp.os.bsd] (französisch)
+
+=== Weitere UNIX Gruppen
+
+* link:news:comp.unix[comp.unix]
+* link:news:comp.unix.questions[ comp.unix.questions]
+* link:news:comp.unix.admin[ comp.unix.admin]
+* link:news:comp.unix.programmer[ comp.unix.programmer]
+* link:news:comp.unix.shell[ comp.unix.shell]
+* link:news:comp.unix.misc[ comp.unix.misc]
+* link:news:comp.unix.bsd[ comp.unix.bsd]
+
+=== X Window System
+
+* link:news:comp.windows.x[ comp.windows.x]
+
+[[eresources-web]]
+== Offizielle Spiegel
+
+<<central-mirrors, {central}>>, <<armenia-mirrors, {mirrors-armenia}>>, <<australia-mirrors, {mirrors-australia}>>, <<austria-mirrors, {mirrors-austria}>>, <<czech-republic-mirrors, {mirrors-czech}>>, <<denmark-mirrors, {mirrors-denmark}>>, <<finland-mirrors, {mirrors-finland}>>, <<france-mirrors, {mirrors-france}>>, <<germany-mirrors, {mirrors-germany}>>, <<hong-kong-mirrors, {mirrors-hongkong}>>, <<ireland-mirrors, {mirrors-ireland}>>, <<japan-mirrors, {mirrors-japan}>>, <<latvia-mirrors, {mirrors-latvia}>>, <<lithuania-mirrors, {mirrors-lithuania}>>, <<netherlands-mirrors, {mirrors-netherlands}>>, <<norway-mirrors, {mirrors-norway}>>, <<russia-mirrors, {mirrors-russia}>>, <<slovenia-mirrors, {mirrors-slovenia}>>, <<south-africa-mirrors, {mirrors-south-africa}>>, <<spain-mirrors, {mirrors-spain}>>, <<sweden-mirrors, {mirrors-sweden}>>, <<switzerland-mirrors, {mirrors-switzerland}>>, <<taiwan-mirrors, {mirrors-taiwan}>>, <<uk-mirrors, {mirrors-uk}>>, <<usa-mirrors, {mirrors-us}>>.
+
+(aktualisiert am: UTC)
+
+[[central-mirrors]]
+*{central}*
+
+* {central-www}
+
+[[armenia-mirrors]]
+*{mirrors-armenia}*
+
+* {mirrors-armenia-www-httpv6} (IPv6)
+
+[[australia-mirrors]]
+*{mirrors-australia}*
+
+* {mirrors-australia-www-http}
+* {mirrors-australia-www2-http}
+
+[[austria-mirrors]]
+*{mirrors-austria}*
+
+* {mirrors-armenia-www-httpv6} (IPv6)
+
+[[czech-republic-mirrors]]
+*{mirrors-czech}*
+
+* {mirrors-czech-www-httpv6} (IPv6)
+
+[[denmark-mirrors]]
+*{mirrors-denmark}*
+
+* {mirrors-denmark-www-httpv6} (IPv6)
+
+[[finland-mirrors]]
+*{mirrors-finland}*
+
+* {mirrors-finland-www-http}
+
+[[france-mirrors]]
+*{mirrors-france}*
+
+* {mirrors-france-www-http}
+
+[[germany-mirrors]]
+*{mirrors-germany}*
+
+* {mirrors-germany-www-http}
+
+[[hong-kong-mirrors]]
+*{mirrors-hongkong}*
+
+* {mirrors-hongkong-www}
+
+[[ireland-mirrors]]
+*{mirrors-ireland}*
+
+* {mirrors-ireland-www}
+
+[[japan-mirrors]]
+*{mirrors-japan}*
+
+* {mirrors-japan-www-httpv6} (IPv6)
+
+[[latvia-mirrors]]
+*{mirrors-latvia}*
+
+* {mirrors-latvia-www}
+
+[[lithuania-mirrors]]
+*{mirrors-lithuania}*
+
+* {mirrors-lithuania-www}
+
+[[netherlands-mirrors]]
+*{mirrors-netherlands}*
+
+* {mirrors-netherlands-www}
+
+[[norway-mirrors]]
+*{mirrors-norway}*
+
+* {mirrors-norway-www}
+
+[[russia-mirrors]]
+*{mirrors-russia}*
+
+* {mirrors-russia-www-httpv6} (IPv6)
+
+[[slovenia-mirrors]]
+*{mirrors-slovenia}*
+
+* {mirrors-slovenia-www}
+
+[[south-africa-mirrors]]
+*{mirrors-south-africa}*
+
+* {mirrors-south-africa-www}
+
+[[spain-mirrors]]
+*{mirrors-spain}*
+
+* {mirrors-spain-www}
+* {mirrors-spain-www2}
+
+[[sweden-mirrors]]
+*{mirrors-sweden}*
+
+* {mirrors-sweden-www}
+
+[[switzerland-mirrors]]
+*{mirrors-switzerland}*
+
+* {mirrors-switzerland-www-httpv6} (IPv6)
+* {mirrors-switzerland-www2-httpv6} (IPv6)
+
+[[taiwan-mirrors]]
+*{mirrors-taiwan}*
+
+* {mirrors-taiwan-www}
+* {mirrors-taiwan-www2}
+* {mirrors-taiwan-www4}
+* {mirrors-taiwan-www5-httpv6} (IPv6)
+
+[[uk-mirrors]]
+*{mirrors-uk}*
+
+* {mirrors-uk-www}
+* {mirrors-uk-www3}
+
+[[usa-mirrors]]
+*{mirrors-us}*
+
+* {mirrors-us-www5-httpv6} (IPv6)
+
+:sectnums:
+:sectnumlevels: 6
diff --git a/documentation/content/de/books/handbook/filesystems/_index.adoc b/documentation/content/de/books/handbook/filesystems/_index.adoc
new file mode 100644
index 0000000000..d2c930b3c2
--- /dev/null
+++ b/documentation/content/de/books/handbook/filesystems/_index.adoc
@@ -0,0 +1,97 @@
+---
+title: Kapitel 20. Dateisystemunterstützung
+part: Teil III. Systemadministration
+prev: books/handbook/zfs
+next: books/handbook/virtualization
+---
+
+[[filesystems]]
+= Dateisystemunterstützung
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 20
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/filesystems/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/filesystems/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/filesystems/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[filesystems-synopsis]]
+== Übersicht
+
+Dateisysteme sind ein wesentlicher Bestandteil von Betriebssystemen. Sie erlauben es Benutzern, Dateien zu laden und zu speichern, ermöglichen den Zugriff auf Daten und machen Festplatten überhaupt erst nützlich. Betriebssysteme unterscheiden sich normalerweise bei dem mitgelieferten Dateisystem. Traditionell ist dies unter FreeBSD das Unix File System UFS, welches mit UFS2 modernisiert wurde. Seit FreeBSD 7.0 steht auch das Z-Dateisystem (ZFS) als natives Dateisystem zur Verfügung. Hierzu finden Sie in crossref:zfs[zfs,Das Z-Dateisystem (ZFS)] weitere Informationen.
+
+FreeBSD unterstützt auch eine Vielzahl weiterer Dateisysteme, um auf Daten von anderen Betriebssystemen lokal zuzugreifen, beispielsweise Daten auf USB-Speichermedien, Flash-Speichern und Festplatten. Dazu gehört die Unterstützung für das Linux(R) Extended File System (EXT).
+
+Es gibt verschiedene Stufen der Unterstützung in FreeBSD für diese unterschiedlichen Dateisysteme. Manche benötigen ein geladenes Kernelmodul, andere die Installation bestimmter Werkzeuge. Einige Dateisysteme haben volle Unterstützung für Lese- und Schreibzugriffe, während auf andere nur-lesend zugegriffen werden kann.
+
+Nachdem Sie dieses Kapitel gelesen haben, wissen Sie:
+
+* Den Unterschied zwischen nativen und unterstützten Dateisystemen.
+* Welche Dateisysteme von FreeBSD unterstützt werden.
+* Wie man fremde Dateisysteme aktiviert, konfiguriert, darauf zugreift und diese verwendet.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie:
+
+* Grundlagen von UNIX(R) und FreeBSD verstehen (crossref:basics[basics,Grundlagen des FreeBSD Betriebssystems]).
+* Mit den Grundlagen der Konfiguration und dem Bauen des Kernels vertraut sein (crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels]).
+* Problemlos Software von Drittherstellern in FreeBSD installieren können (crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports]).
+* Sich ein wenig mit Festplatten, Speicher und Gerätenamen in FreeBSD auskennen (crossref:disks[disks,Speichermedien]).
+
+[[filesystems-linux]]
+== Linux(R) Dateisysteme
+
+FreeBSD bietet integrierte Unterstützung für einige Linux(R)-Dateisysteme. Dieser Abschnitt demonstriert, wie der Support aktiviert und die unterstützten Linux(R)-Dateisysteme eingehangen werden.
+
+=== ext2
+
+Seit FreeBSD 2.2 ist eine Kernel-Unterstützung für das ext2-Dateisystem vorhanden. In FreeBSD 8.x und früheren Versionen wurde der Code noch unter der GPL lizensiert. Der Code wurde neu geschrieben und steht seit FreeBSD 9.0 unter der BSD-Lizenz.
+
+Der man:ext2fs[5]-Treiber erlaubt dem FreeBSD Kernel sowohl Lese-, als auch Schreibzugriffe auf ext2-Dateisysteme.
+
+[NOTE]
+====
+Dieser Treiber kann auch für den Zugriff auf ext3 und ext4 Dateisysteme verwendet werden. Das Dateisystem man:ext2fs[5] bietet ab FreeBSD 12.0-RELEASE volle Lese- und Schreibunterstützung für ext4. Darüber hinaus werden auch erweiterte Attribute und ACLs unterstützt, jedoch kein Journaling und Verschlüsselung. Ab FreeBSD 12.1-RELEASE ist auch ein DTrace Provider verfügbar. Frühere Versionen von FreeBSD können mit package:sysutils/fusefs-ext2[] auf ext4 im Lese- und Schreibmodus zugreifen.
+====
+
+Um auf ein ext-Dateisystem zuzugreifen, muss zuerst das entsprechende Kernelmodul geladen werden:
+
+[source,bash]
+....
+# kldload ext2fs
+....
+
+Mounten Sie anschließend das ext-Volume unter Angabe des FreeBSD Partitionsnamens und eines existierenden Mountpunktes. Dieses Beispiel hängt [.filename]#/dev/ad1s1# nach [.filename]#/mnt# ein:
+
+[source,bash]
+....
+# mount -t ext2fs /dev/ad1s1 /mnt
+....
diff --git a/documentation/content/de/books/handbook/firewalls/_index.adoc b/documentation/content/de/books/handbook/firewalls/_index.adoc
new file mode 100644
index 0000000000..ee62201001
--- /dev/null
+++ b/documentation/content/de/books/handbook/firewalls/_index.adoc
@@ -0,0 +1,2230 @@
+---
+title: Kapitel 30. Firewalls
+part: Teil IV. Netzwerke
+prev: books/handbook/network-servers
+next: books/handbook/advanced-networking
+---
+
+[[firewalls]]
+= Firewalls
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 30
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/firewalls/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/firewalls/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/firewalls/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[firewalls-intro]]
+== Einführung
+
+Firewalls ermöglichen es, den ein- und ausgehenden Netzwerkverkehr eines Systems zu filtern. Dazu verwendet eine Firewall eine oder mehrere Gruppen von "Regeln", um ankommende Netzwerkpakete zu untersuchen und entweder durchzulassen oder zu blockieren. Die Regeln einer Firewall untersuchen charakteristische Eigenschaften von Datenpaketen, darunter den Protokolltyp, die Quell- und Zieladresse sowie den Quell- und Zielport.
+
+Firewalls können die Sicherheit eines Rechners oder eines Netzwerks erhöhen, indem sie folgende Aufgaben übernehmen:
+
+* Den Schutz der Anwendungen, Dienste und Rechner eines internen Netzwerks vor unerwünschtem Datenverkehr aus dem Internet.
+* Die Beschränkung des Zugriffs von Rechnern des internen Netzwerks auf Rechner oder Dienste des öffentlichen Internets.
+* Den Einsatz von Network Address Translation (NAT), welches es durch die Verwendung von privaten IP-Adressen ermöglicht, eine einzige gemeinsame Internetverbindung für mehrere Rechner zu nutzen. Dies geschieht entweder über eine einzige IP-Adresse oder über eine Gruppe von jeweils automatisch zugewiesenen öffentlichen Adressen.
+
+Das Basissystem von FreeBSD enthält drei Firewalls: PF, IPFW und IPFILTER (auch als IPF bekannt). FreeBSD enthält ebenfalls zwei Traffic-Shaper zur Kontrolle der Bandbreite: man:altq[4] und man:dummynet[4]. ALTQ ist traditionell eng an PF gebunden, während dummynet zusammen mit IPFW verwendet wird. Gemeinsam ist allen Firewalls, dass sie Regeln einsetzen, um den Transfer von ein- und ausgehenden Datenpaketen des Systems zu steuern. Unterschiedlich ist aber die Art und Weise, wie dies realisiert wird. Auch die für diese Regeln verwendete Syntax ist unterschiedlich.
+
+FreeBSD besitzt mehrere Firewalls, um den unterschiedlichen Anforderungen und Vorlieben von Benutzern gerecht zu werden. Jeder Benutzer sollte selbst beurteilen, welche Firewall seinen Bedürfnissen am besten entspricht.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie wissen:
+
+* Wie man Paketfilterregeln erstellt.
+* Was die Unterschiede zwischen den in FreeBSD eingebauten Firewalls sind.
+* Wie die PF-Firewall konfiguriert und einsetzt wird.
+* Wie die IPFW-Firewall konfiguriert und einsetzt wird.
+* Wie die IPFILTER-Firewall konfiguriert und einsetzt wird.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie:
+
+* Die grundlegenden Konzepte von FreeBSD und dem Internet verstehen.
+
+[NOTE]
+====
+Da alle Firewalls auf der Inspektion ausgewählter Kontrollfelder in Datenpaketen basieren, muss für die Erstellung von Firewallregeln ein grundlegendes Verständnis von TCP/IP vorhanden sein. Eine gute Einführung finden Sie in http://www.ipprimer.com[ Daryl's TCP/IP Primer].
+====
+
+[[firewalls-concepts]]
+== Firewallkonzepte
+
+Ein Regelsatz besteht aus einer Gruppe von Regeln, die Pakete basierend auf ihren Inhalt entweder blockieren oder durchlassen. Der bidirektionale Austausch von Paketen zwischen zwei Rechnern wird als Sitzung (Session) bezeichnet. Der Regelsatz verarbeitet sowohl ankommende Pakete aus dem Internet, als auch die vom System erzeugten Antwortpakete. Jeder TCP/IP-Dienst hat ein festgelegtes Protokoll und einen vorgegebenen Port. Pakete für einen bestimmten Dienst stammen von einer Quelladresse und einem unprivilegierten Port und gehen an einen spezifischen Port auf der Zieladresse. Alle oben genannten Parameter können als Selektionskriterien verwendet werden, um einen Regelsatz zu erstellen, der den Zugriff auf bestimmte Dienste gewährt oder blockiert.
+
+Unbekannte Portnummern können Sie in [.filename]#/etc/services# nachschlagen. Alternativ finden Sie die Portnummern und deren Verwendungszweck auf http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers[ http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers].
+
+Unter diesem Link finden Sie http://web.archive.org/web/20150803024617/http://www.sans.org/security-resources/idfaq/oddports.php[ Portnummern, die auch von Trojanern benutzt werden].
+
+FTP hat zwei Modi: Aktiv und Passiv. Unterschied liegt in der Bestimmung des Datenkanals. Der Passiv-Modus ist sicherer, da der Datenkanal vom Client bestimmt wird. Eine ausführliche Erklärung von FTP und den verschiedenen Modi finden Sie unter http://www.slacksite.com/other/ftp.html[ http://www.slacksite.com/other.ftp.html].
+
+Ein Firewall-Regelsatz kann entweder "einschließend" (inclusive firewall) oder "ausschließend" (exclusive Firewall) sein. Eine ausschließende Firewall lässt jeden Datenverkehr durch, der nicht durch eine Regel ausgeschlossen wurde. Eine einschließende Firewall macht das genaue Gegenteil. Sie lässt Datenverkehr nur dann passieren, wenn dieser einer der definierten Regeln entspricht.
+
+Eine einschließende Firewall bietet eine wesentlich bessere Kontrolle des ausgehenden Verkehrs, was sie zur besseren Wahl für Systeme macht, welche Dienste für das Internet anbieten. Sie kontrolliert auch den Verkehr aus dem öffentlichen Internet zum privaten Netzwerk. Jeder Verkehr, der keiner Regel entspricht wird geblockt und protokolliert. Einschließende Firewalls sind generell sicherer als ausschließende Firewalls, da sie das Risiko, dass unerwünschter Verkehr hindurch geht, drastisch reduzieren.
+
+[NOTE]
+====
+Wenn nicht anders vermerkt, verwenden alle Konfigurationen und Regelsätze in diesem Kapitel einschließende Firewalls.
+====
+
+Die Sicherheit kann durch den Einsatz einer "zustandsorientierten Firewall" (stateful firewall) weiter erhöht werden. Dieser Typ Firewall überwacht alle offenen Verbindungen und erlaubt nur Datenverkehr von bereits bestehenden Verbindungen oder wenn eine neue Verbindung aufgebaut wird.
+
+Eine zustandsorientierte Firewall behandelt den Verkehr als einen bidirektionalen Austausch von Paketen während einer Session. Wenn ein Zustand für eine passende Regel angegeben wird, erstellt die Firewall dynamisch interne Regeln für jedes Paket, das während dieser Session ausgetauscht wird. Die Firewall hat ausreichend Möglichkeiten, um zu bestimmen, ob ein Paket zu einer Session gehört. Alle Pakete, die nicht zu dieser Session passen, werden automatisch abgelehnt.
+
+Sobald die Session beendet ist, wird sie aus der dynamischen Zustandstabelle entfernt.
+
+Eine zustandsorientierte Filterung erlaubt es, sich auf die Sperrung bzw. Freigabe von neuen Sessions zu konzentrieren. Wenn eine neue Session genehmigt wird, werden alle nachfolgenden Pakete dieser Session automatisch erlaubt und betrügerische Pakete werden automatisch abgelehnt. Wenn eine neue Session nicht genehmigt wird, werden alle nachfolgenden Pakete dieser Session abgelehnt. Die zustandsorientierte Filterung bietet fortgeschrittene Fähigkeiten zur Abwehr von verschiedensten Angriffsmethoden, die von Angreifern eingesetzt werden.
+
+NAT steht für _Network Address Translation_. Die NAT-Funktion ermöglicht es einem privaten LAN hinter einer Firewall, sich eine einzelne vom ISP zugewiesene IP-Adresse zu teilen, auch wenn die Adresse dynamisch zugewiesen wird. NAT ermöglicht den Internetzugriff für jeden Rechner im LAN, ohne dass der ISP für mehrere Internet-Konten bezahlt wird.
+
+NAT übersetzt automatisch die private IP-Adresse auf die öffentliche IP-Adresse, sobald ein Paket für das öffentliche Internet die Firewall passiert. Zusätzlich führt es auch die Übersetzung der Anwortpakete durch.
+
+Gemäß RFC 1918 sind die folgenden IP-Adressbereiche für private Netzwerke reserviert und werden nie ins öffentliche Internet weitergeleitet. Daher sind diese Bereiche für den Einsatz mit NAT geeignet:
+
+* `10.0.0.0/8`
+* `172.16.0.0/12`
+* `192.168.0.0/16`
+
+[WARNING]
+====
+
+Seien Sie _äußerst vorsichtig_ wenn Sie mit Firewallregeln arbeiten. Durch eine falsche Konfiguration kann der Administrator den Zugriff auf den Server verlieren. Um auf der sicheren Seite zu sein, sollten Sie die anfängliche Konfiguration der Firewall von der lokalen Konsole durchführen, anstatt dass Sie dies aus der Ferne über ssh tun.
+====
+
+[[firewalls-pf]]
+== PF
+
+In FreeBSD 5.3 wurde PF von OpenBSD in das Basissystem integriert. Bei PF handelt es sich um eine komplette, voll ausgestattete Firewall, die optional auch ALTQ (Alternatives Queuing) unterstützt. ALTQ stellt Quality of Service (QoS) zur Verfügung.
+
+Das OpenBSD-Projekt pflegt die maßgebliche Referenz von PF in der http://www.openbsd.org/faq/pf[PF FAQ]. Peter Hansteen betreut ein sehr ausführliches PF-Tutorial unter http://home.nuug.no/~peter/pf/[ http://home.nuug.no/~peter/pf/].
+
+[WARNING]
+====
+
+Bedenken Sie beim Studium der http://www.openbsd.org/faq/pf/[PF FAQ], dass die PF-Version von FreeBSD im Laufe der Jahre erheblich von der Version in OpenBSD abgewichen ist. Nicht alle Eigenschaften funktionieren unter FreeBSD genauso wie unter OpenBSD und umgekehrt.
+====
+
+Die {freebsd-pf} ist ein guter Anlaufpunkt für Fragen zur Konfiguration und dem Einsatz der PF-Firewall. Überprüfen Sie aber zunächst die Archive der Mailingliste, bevor Sie eine Frage stellen. Vielleicht wurde die Frage dort schon beantwortet.
+
+Dieser Abschnitt konzentriert sich auf PF in FreeBSD. Es wird beschrieben, wie PF und ALTQ aktiviert werden. Zusätzlich wird demonstriert, wie Regelsätze auf einem FreeBSD-System erstellt werden.
+
+=== PF aktivieren
+
+Um PF zu benutzen, muss zunächst das Kernelmodul geladen werden. Dieser Abschnitt beschreibt die Einträge für [.filename]#/etc/rc.conf#, die verwendet werden können um PF zu aktivieren.
+
+Beginnen Sie damit `pf_enable=yes` in [.filename]#/etc/rc.conf# hinzuzufügen:
+
+[source,bash]
+....
+# sysrc pf_enable=yes
+....
+
+man:pfctl[8] beschreibt zusätzliche Optionen, die beim Start an PF übergeben werden können. Fügen Sie diesen Eintrag in [.filename]#/etc/rc.conf# hinzu und schreiben Sie die benötigten Optionen zwischen die Anführungszeichen:
+
+[.programlisting]
+....
+pf_flags="" # additional flags for pfctl startup
+....
+
+PF kann nicht gestartet werden, wenn es seine Konfigurationsdatei nicht findet. In der Voreinstellung existiert unter FreeBSD kein Regelsatz namens [.filename]#/etc/pf.conf#. Beispiel-Regelsätze finden Sie in [.filename]#/usr/shared/examples/pf/#. Wenn bereits ein Regelsatz an anderer Stelle gespeichert wurde, fügen Sie in [.filename]#/etc/rc.conf# einen Eintrag mit dem vollständigen Pfad zur Datei ein:
+
+[.programlisting]
+....
+pf_rules="/path/to/pf.conf"
+....
+
+Protokollierungsfunktionen für PF werden von man:pflog[4] zur Verfügung gestellt. Fügen Sie `pflog_enable=yes` in [.filename]#/etc/rc.conf# ein, um diese Funktion zu aktivieren:
+
+[source,bash]
+....
+# sysrc pflog_enable=yes
+....
+
+Die folgenden Zeilen können zusätzlich hinzugefügt werden, um den Speicherort der Protokolldatei zu bestimmen und weitere Optionen beim Start an man:pflog[4] zu übergeben:
+
+[.programlisting]
+....
+pflog_logfile="/var/log/pflog" # where pflogd should store the logfile
+pflog_flags="" # additional flags for pflogd startup
+....
+
+Falls ein LAN hinter der Firewall existiert und die Pakete an die Rechner im LAN weitergeleitet werden müssen, oder wenn NAT benötigt wird, aktivieren Sie die folgende Option:
+
+[.programlisting]
+....
+gateway_enable="YES" # Enable as LAN gateway
+....
+
+Nachdem die Änderungen gespeichert wurden, kann PF mit Unterstützung für Protokollierung gestartet werden:
+
+[source,bash]
+....
+# service pf start
+# service pflog start
+....
+
+In der Voreinstellung liest PF seine Konfiguration aus [.filename]#/etc/pf.conf# und modifiziert, verwirft oder akzeptiert Pakete anhand der Definitionen in dieser Datei. FreeBSD enthält mehrere Beispieldateien unter [.filename]#/usr/shared/examples/pf/#. Auch die http://www.openbsd.org/faq/pf/[PF FAQ] enthält sehr ausführliche Beispiele für PF-Regeln.
+
+Zur Steuerung von PF wird `pfctl` verwendet. <<pfctl>> fasst einige nützliche Optionen für diesen Befehl zusammen. Eine Beschreibung aller verfügbaren Optionen finden Sie in man:pfctl[8].
+[[pfctl]]
+.Nützliche `pfctl` Optionen
+[cols="1,1", frame="none", options="header"]
+|===
+| Kommando
+| Aufgabe
+
+|`pfctl -e`
+|PF aktivieren
+
+|`pfctl -d`
+|PF deaktivieren
+
+|`pfctl -F all -f /etc/pf.conf`
+|Alle Filterregeln zurücksetzen (NAT, Filter, Zustandstabelle) und [.filename]#/etc/pf.conf# erneut einlesen.
+
+|`pfctl -s [ rules \| nat \| states ]`
+|Zusammenfassung der Filterregeln, NAT-Regeln, oder der Zustandstabelle.
+
+|`pfctl -vnf /etc/pf.conf`
+|Überprüft [.filename]#/etc/pf.conf# auf Fehler, lädt aber die Filterregeln nicht neu.
+|===
+
+[TIP]
+====
+
+package:security/sudo[] ist nützlich um Kommandos mit erhöhten Berechtigungen auszuführen, wie beispielsweise `pfctl`. Das Programm kann aus der Ports-Sammlung installiert werden.
+====
+
+Um den ein- und ausgehenden Verkehr im Auge zu behalten, können Sie ein Werkzeug wie package:sysutils/pftop[] benutzen. Sobald das Programm installiert ist, können Sie pftop ausführen, um einen Snapshot des Datenverkehrs zu sehen. Das Format der Ausgabe ist der von man:top[1] sehr ähnlich.
+
+[[pf-tutorial]]
+=== PF Regelsätze
+
+Dieser Abschnitt beschreibt die Erstellung von angepassten Regelsätzen. Es wird mit dem einfachsten Regelsatz begonnen auf dem dann weitere aufgebaut werden, um die Konzepte und Funktionen von PF an einigen konkreten Beispielen zu verdeutlichen.
+
+Der einfachste Regelsatz gilt für einen Rechner, der keine Dienste anbietet und Zugriff auf das Internet haben soll. Für diesen minimalen Regelsatz wird [.filename]#/etc/pf.conf# wie folgt konfiguriert:
+
+[.programlisting]
+....
+block in all
+pass out all keep state
+....
+
+Die erste Regel blockiert jeglichen eingehenden Datenverkehr. Die zweite Regel erlaubt ausgehende Verbindungen von diesem Rechner, während die Zustandsinformationen dieser Verbindungen gespeichert werden. Diese Zustandsinformationen machen es möglich, den Antwortverkehr für diese Verbindungen zu erlauben. Der Regelsatz wird mit dem folgenden Befehl geladen:
+
+[source,bash]
+....
+# pfctl -e ; pfctl -f /etc/pf.conf
+....
+
+Neben den Zustandsinformationen verfügt PF über _Listen_ und _Makros_. Diese können bei der Erstellung der Regeln definiert werden. Makros können Listen enthalten und sie müssen vor ihrer ersten Benutzung definiert sein. Fügen Sie beispielsweise folgende Zeilen an den Anfang des Regelsatzes:
+
+[.programlisting]
+....
+tcp_services = "{ ssh, smtp, domain, www, pop3, auth, pop3s }"
+udp_services = "{ domain }"
+....
+
+PF versteht sowohl Portnamen als auch Portnummern, solange die Namen in [.filename]#/etc/services# aufgeführt sind. Dieses Beispiel erstellt zwei Makros. Das erste ist eine Liste mit sieben TCP-Portnamen, die zweite Liste enthält einen UDP-Portnamen. Sobald ein Makro definiert ist, kann es in den Regeln verwendet werden. In diesem Beispiel wird der gesamte Datenverkehr geblockt, mit Ausnahme der Verbindungen die von diesem Rechner initiiert wurden und sich auf einen der angegebenen TCP-Dienste oder den UDP-Dienst beziehen:
+
+[.programlisting]
+....
+tcp_services = "{ ssh, smtp, domain, www, pop3, auth, pop3s }"
+udp_services = "{ domain }"
+block all
+pass out proto tcp to any port $tcp_services keep state
+pass proto udp to any port $udp_services keep state
+....
+
+Obwohl UDP als zustandsloses Protokoll betrachtet wird, ist PF in der Lage einige Zustandsinformationen zu verfolgen. Wenn beispielsweise eine UDP-Abfrage für einen Nameserver das System verlässt, wird PF nach der Antwort Ausschau halten und das Antwortpaket durch lassen.
+
+Nachdem der Regelsatz verändert wurde, muss er neu geladen werden:
+
+[source,bash]
+....
+# pfctl -f /etc/pf.conf
+....
+
+Wenn keine Syntaxfehler festgestellt werden, wird `pfctl` keine Ausgabe erzeugen. Die Syntax kann auch getestet werden, bevor der Regelsatz geladen wird:
+
+[source,bash]
+....
+# pfctl -nf /etc/pf.conf
+....
+
+Die Option `-n` bewirkt, dass die Regeln nur interpretiert, jedoch nicht geladen werden. Dies bietet die Möglichkeit, alle Fehler zu korrigieren. Es wird immer der letzte gültige Regelsatz geladen, bis PF entweder deaktiviert, oder ein neuer Regelsatz geladen wird.
+
+[TIP]
+====
+
+Wenn Sie beim Laden oder Prüfen des Regelsatzes noch die Option `-v` hinzufügen, wird `pfctl` den komplett interpretierten Regelsatz anzeigen. Dies ist äußerst nützlich, wenn Sie versuchen Fehler im Regelsatz zu finden.
+====
+
+[[pftut-gateway]]
+==== Einfaches Gateway mit NAT
+
+Dieser Abschnitt zeigt wie ein FreeBSD-System mit PF als Gateway konfiguriert wird. Das Gateway muss über mindestens zwei Netzwerkkarten verfügen, die jeweils mit einem separaten Netzwerk verbunden sind. In diesem Beispiel ist [.filename]#xl0# mit dem Internet verbunden und [.filename]#xl1# ist mit dem internen Netzwerk verbunden.
+
+Aktivieren Sie zunächst das Gateway, damit der Rechner den Netzwerkverkehr von einer Schnittstelle zur nächsten weiterleiten kann. Diese sysctl-Einstellung sorgt dafür, dass IPv4-Pakete weitergeleitet werden:
+
+[source,bash]
+....
+# sysctl net.inet.ip.forwarding=1
+....
+
+So leiten Sie IPv6-Datenverkehr weiter:
+
+[source,bash]
+....
+# sysctl net.inet6.ip6.forwarding=1
+....
+
+Um diese Einstellungen beim Systemstart zu aktivieren, fügen Sie sie mit Hilfe von man:sysrc[8] in [.filename]#/etc/rc.conf# ein:
+
+[source,bash]
+....
+# sysrc gateway_enable=yes
+# sysrc ipv6_gateway_enable=yes
+....
+
+Prüfen Sie mit `ifconfig`, dass beide Schnittstellen vorhanden und aktiv sind.
+
+Als nächstes erstellen Sie die nötigen PF-Regeln, damit das Gateway den Datenverkehr weiterleiten kann. Die folgende Regel erlaubt den zustandsorientierten Verkehr aus dem Internet zu den Rechnern im Netzwerk:
+
+[.programlisting]
+....
+pass in on xl1 from xl1:network to xl0:network port $ports keep state
+....
+
+Diese Regel erlaubt lediglich den Datenverkehr über das Gateway auf der internen Schnittstelle. Damit die Pakete noch weiter gehen, wird eine passende Regel benötigt:
+
+[.programlisting]
+....
+pass out on xl0 from xl1:network to xl0:network port $ports keep state
+....
+
+Obwohl diese beiden Regeln funktionieren, werden sie in der Praxis so spezifisch selten benötigt. Ein lesbarer Regelsatz ist oft ein sicherer Regelsatz. Der Rest dieses Abschnitts zeigt, wie Sie die Regeln so einfach und lesbar wie möglich halten. Zum Beispiel könnten die beiden Regeln zu einer Regel zusammengefasst werden:
+
+[.programlisting]
+....
+pass from xl1:network to any port $ports keep state
+....
+
+Die Notation `interface:network` kann durch ein Makro ersetzt werden, um den Regelsatz besser lesbar zu machen. Zum Beispiel könnte für das Netzwerk an der internen Schnittstelle (`xl0:network`) ein Makro namens `$localnet` definiert werden. Alternativ könnte für die Definition von `$localnet` auch eine _IP-Adresse/Netzmaske_ Notation verwendet werden, um ein Netzwerk zu bezeichnen, beispielsweise `192.168.100.1/24` für ein privates Subnetz.
+
+Bei Bedarf kann für `$localnet` auch eine Liste von Netzwerken definiert werden. Abhängig von den Bedürfnissen kann `$localnet` auch für eine typische Regel wie folgt verwendet werden:
+
+[.programlisting]
+....
+pass from $localnet to any port $ports keep state
+....
+
+Der folgende Regelsatz erlaubt sämtlichen Verkehr, der von den Rechnern im internen Netzwerk initiiert wird. Zunächst werden zwei Makros definiert, die die externen und internen 3COM-Schnittstellen repräsentieren.
+
+[NOTE]
+====
+Bei Einwählverbindungen wird [.filename]#tun0# für die externe Schnittstelle verwendet. Bei ADSL-Verbindungen, insbesondere denen die PPP over Ethernet (PPPoE) verwenden, ist die richtige externe Schnittstelle [.filename]#tun0# und nicht die physische Ethernet-Schnittstelle.
+====
+
+[.programlisting]
+....
+ext_if = "xl0" # macro for external interface - use tun0 for PPPoE
+int_if = "xl1" # macro for internal interface
+localnet = $int_if:network
+# ext_if IP address could be dynamic, hence ($ext_if)
+nat on $ext_if from $localnet to any -> ($ext_if)
+block all
+pass from { lo0, $localnet } to any keep state
+....
+
+Dieser Regelsatz führt die NAT-Regel ein, die verwendet wird, um die Übersetzung der Netzwerkadressen von den nicht-routebaren Adressen im internen Netzwerk auf die IP-Adresse der externen Schnittstelle zu handhaben. Die Klammern im letzten Teil der NAT-Regel `($ext_if)` werden angegeben, wenn die IP-Adresse der externen Schnittstelle dynamisch zugewiesen wird. Damit wird sichergestellt, dass der Netzwerkverkehr ohne schwerwiegende Unterbrechungen weiterläuft, auch wenn sich die externe IP-Adresse ändert.
+
+Beachten Sie, dass dieser Regelsatz wahrscheinlich mehr Verkehr aus dem Netzwerk zulässt, als eigentlich nötig ist. Bei einem angemessenen Aufbau könnte folgendes Makro erstellt werden:
+
+[.programlisting]
+....
+client_out = "{ ftp-data, ftp, ssh, domain, pop3, auth, nntp, http, \
+ https, cvspserver, 2628, 5999, 8000, 8080 }"
+....
+
+Dieses Makro wird dann in der Filterregel benutzt:
+
+[.programlisting]
+....
+pass inet proto tcp from $localnet to any port $client_out \
+ flags S/SA keep state
+....
+
+Weitere `pass` Regeln werden vielleicht noch benötigt. Diese Regel aktiviert SSH auf der externen Schnittstelle:
+
+[.programlisting]
+....
+pass in inet proto tcp to $ext_if port ssh
+....
+
+Dieses Makrodefinition und Regel erlaubt DNS und NTP für interne Clients:
+
+[.programlisting]
+....
+udp_services = "{ domain, ntp }"
+pass quick inet proto { tcp, udp } to any port $udp_services keep state
+....
+
+Beachten Sie das Schlüsselwort `quick` in dieser Regel. Da der Regelsatz aus mehreren Regeln besteht, ist es wichtig, die Beziehungen zwischen den einzelnen Regeln zu verstehen. Die Regeln werden von oben nach unten ausgewertet, in der Reihenfolge wie sie geschrieben sind. Für jedes Paket oder jede Verbindung, das PF ausgewertet, wird die letzte übereinstimmende Regel im Regelsatz angewendet. Wenn jedoch ein Paket auf eine Regel passt, welche das Schlüsselwort `quick` enthält, wird das Paket entsprechend dieser Regel behandelt und die Regelverarbeitung wird gestoppt. Diese Vorgehensweise ist sehr nützlich, wenn eine Ausnahme von den allgemeinen Regeln erforderlich ist.
+
+[[pftut-ftp]]
+==== Einen FTP-Proxy einrichten
+
+Die Konfiguration einer funktionierenden Regel für FTP kann aufgrund der Beschaffenheit des FTP-Protokolls problematisch sein. FTP ist sehr viel älter als Firewalls und schon vom Design her unsicher. Die häufigsten Argumente gegen eine Verwendung von FTP sind:
+
+* Passwörter werden im Klartext übertragen.
+* Das Protokoll erfordert die Verwendung von mindestens zwei TCP-Verbindungen (Steuerung und Daten) auf separaten Ports.
+* Wenn eine Sitzung aufgebaut wird, werden die Daten auf zufällig ausgewählten Ports übermittelt.
+
+All diese Punkte stellen Herausforderungen dar, noch bevor die Client- oder Server-Software auf potenzielle Sicherheitslücken überprüft wurde. Es existieren aber auch sichere Alternativen für die Dateiübertragung, wie man:sftp[1] oder man:scp[1], wo die Authentifizierung und die Datenübertragung über eine verschlüsselte Verbindung erfolgt.
+
+Für Situationen, in denen FTP erforderlich ist, kann PF den FTP-Datenverkehr an ein kleines Proxy-Programm namens man:ftp-proxy[8] weiterleiten. Dieses Programm ist im Basissystem von FreeBSD enthalten. Die Aufgabe des Proxies ist das dynamische Einfügen und Entfernen von Regeln im Regelsatz. Dies wird durch den Einsatz von Ankern erreicht, damit der FTP-Verkehr korrekt verarbeitet werden kann.
+
+Fügen Sie folgende Zeilen in [.filename]#/etc/rc.conf# ein, um den Proxy zu aktivieren:
+
+[.programlisting]
+....
+ftpproxy_enable="YES"
+....
+
+Danach kann der Proxy mit `service ftp-proxy start` gestartet werden.
+
+Für die Grundkonfiguration müssen drei weitere Einträge in [.filename]#/etc/pf.conf# hinzugefügt werden. Zunächst werden die Anker hinzugefügt, die der Proxy für die FTP-Sitzungen verwendet:
+
+[.programlisting]
+....
+nat-anchor "ftp-proxy/*"
+rdr-anchor "ftp-proxy/*"
+....
+
+Dann wird eine `pass`-Regel benötigt, damit der FTP-Datenverkehr durch den Proxy geleitet werden kann.
+
+Die Regeln für Umleitung und NAT müssen vor den eigentlichen Filterregeln definiert werden. Fügen Sie diese `rdr`-Regel unmittelbar nach der NAT-Regel ein:
+
+[.programlisting]
+....
+rdr pass on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021
+....
+
+Zum Schluss muss der umgeleitete Verkehr die Firewall passieren dürfen:
+
+[.programlisting]
+....
+pass out proto tcp from $proxy to any port ftp
+....
+
+`$poxy` enthält die Adresse, an dem der Proxy-Daemon gebunden ist.
+
+Speichern Sie [.filename]#/etc/pf.conf# und laden Sie die Regeln neu. Prüfen Sie von einem Client, ob die FTP-Verbindungen funktionieren:
+
+[source,bash]
+....
+# pfctl -f /etc/pf.conf
+....
+
+Dieses Beispiel umfasst eine Grundkonfiguration, in der die Rechner im lokalen Netzwerk Zugriff auf entfernte FTP-Server benötigen. Diese Konfiguration sollte mit den meisten FTP-Clients und -Servern gut funktionieren. Das Verhalten von man:ftp-proxy[8] kann durch diverse Optionen in `ftpproxy_flags` beeinflusst werden. Einige Clients und Server haben bestimmte Marotten, die bei der Konfiguration berücksichtigt werden müssen. Es kann zum Beispiel notwendig sein, den FTP-Datenverkehr für den Proxy einer bestimmten Warteschlange zuzuweisen.
+
+Es besteht auch die Möglichkeit einen FTP-Server mit PF und man:ftp-proxy[8] zu schützen. Konfigurieren Sie einen separaten `ftp-proxy` mit `-R` für den Reverse-Modus auf einem separaten Port und einer eigenen Umleitungsregel.
+
+[[pftut-icmp]]
+==== ICMP verwalten
+
+Viele Werkzeuge zur Fehlerbehebung in TCP/IP-Netzwerken verlassen sich auf das Internet Control Message Protocol (ICMP), das speziell für diese Zwecke entwickelt wurde.
+
+Das ICMP-Protokoll sendet und empfängt Kontrollnachrichten zwischen Rechnern und Gateways, hauptsächlich um ungewöhnliche Bedingungen auf dem Weg zum Zielrechner zu berichten. Router verwenden ICMP um Paketgrößen und andere Übertragungsparameter zu ermitteln. Dieser Prozess ist auch als _Path MTU Discovery_ bekannt.
+
+Aus der Sicht einer Firewall sind einige ICMP-Kontrollnachrichten anfällig für bekannte Angriffsmethoden. Zwar ist die Fehlerbehebung einfacher, wenn alle ICMP-Pakete bedingungslos durch gelassen werden, aber dass macht es auch für Angreifer leichter, Informationen über das Netzwerk zu extrahieren. Aus diesen Gründen ist die folgende Regel nicht optimal:
+
+[.programlisting]
+....
+pass inet proto icmp from any to any
+....
+
+Eine Lösung besteht darin, nur den ICMP-Verkehr aus dem lokalen Netz zu akzeptieren, während ICMP-Pakete von außerhalb des Netzwerks verworfen werden:
+
+[.programlisting]
+....
+pass inet proto icmp from $localnet to any keep state
+pass inet proto icmp from any to $ext_if keep state
+....
+
+Es stehen noch weitere Optionen zur Verfügung, die die Flexibilität von PF demonstrieren. Anstatt beispielsweise alle ICMP-Nachrichten zu erlauben, kann man die Nachrichten angeben, die von man:ping[8] und man:traceroute[8] verwendet werden. Beginnen Sie damit, ein Makro für diese Art von Nachrichten zu definieren:
+
+[.programlisting]
+....
+icmp_types = "echoreq"
+....
+
+Erstellen Sie dann eine Regel, die das eben erstellte Makro benutzt:
+
+[.programlisting]
+....
+pass inet proto icmp all icmp-type $icmp_types keep state
+....
+
+Wenn weitere Arten von ICMP-Nachrichten benötigt werden, kann die Liste `icmp_types` einfach erweitert werden. Geben Sie `more /usr/src/sbin/pfctl/pfctl_parser.c` ein, um eine Liste der von PF unterstützten ICMP-Nachrichten zu sehen. Die Webseite http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml[ http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml] enthält eine Erklärung für jeden Nachrichtentyp.
+
+Da UNIX(R) `traceroute` in der Voreinstellung UDP verwendet, wird eine weitere Regel benötigt:
+
+[.programlisting]
+....
+# allow out the default range for traceroute(8):
+pass out on $ext_if inet proto udp from any to any port 33433 >< 33626 keep state
+....
+
+Da `TRACERT.EXE` unter Microsoft(R) Windows(R)-Systemen ICMP Echo Request Meldungen verwendet, ist nur die erste Regel notwendig um Traces für solche Systeme zu ermöglichen. UNIX(R) `traceroute` kann aber auch andere Protokolle verwenden, zum Beispiel ICMP Echo Request, wenn der Schalter `-I` benutzt wird. Details finden Sie in man:traceroute[8].
+
+[[pftut-pathmtudisc]]
+===== Path MTU Discovery
+
+Internet-Protokolle sind so ausgelegt, dass sie geräteunabhängig sind. Eine Folge davon ist, dass die optimale Paketgröße nicht immer zuverlässig vorhergesagt werden kann. Das größte Hindernis ist hier die _Maximum Transmission Unit_ (`MTU`), welche die Obergrenze für die Paketgröße festlegt. Die MTU für die Schnittstelle des Systems können Sie sich mit `ifconfig` anzeigen lassen.
+
+TCP/IP benutzt ein Verfahren, das als path MTU discovery bekannt ist, um die korrekte Paketgröße für eine Verbindung zu bestimmen. Dieses Verfahren sendet Pakete unterschiedlicher Größe mit dem Flag "do not fragment" und erwartet ein ICMP-Antwortpaket vom Typ "type 3, code 4", wenn die Obergrenze erreicht worden ist. Typ 3 bedeutet "Ziel nicht erreichbar" und Code 4 ist die Abkürzung für "Fragmentierung nötig, aber Do-not-Fragment Flag ist gesetzt". Um path MTU discovery zu erlauben und damit Verbindungen zu anderen MTUs zu unterstützen, fügen Sie dem Makro `icmp_types` den Typ `destination unreachable` hinzu:
+
+[.programlisting]
+....
+icmp_types = "{ echoreq, unreach }"
+....
+
+Da die `pass`-Regel bereits das Makro verwendet, braucht es nicht geändert werden um den neuen ICMP-Typ zu unterstützen:
+
+[.programlisting]
+....
+pass inet proto icmp all icmp-type $icmp_types keep state
+....
+
+PF kann alle Variationen von ICMP-Typen und Codes filtern. Eine Liste der verfügbaren Typen und Codes ist in man:icmp[4] und man:icmp6[4] dokumentiert.
+
+[[pftut-tables]]
+==== Tabellen benutzen
+
+Manchmal sind bestimmte Daten für die Filterung und Weiterleitung interessant, jedoch wäre eine Definition einer solchen Filterregel für einen Regelsatz viel zu lang. PF unterstützt die Verwendung von Tabellen. Dies sind definierte Listen, die verändert werden können, ohne den gesamten Regelsatz neu laden zu müssen. Zudem können diese Listen sehr schnell durchsucht werden. Tabellennamen sind immer in `< >` eingeschlossen und sehen wie folgt aus:
+
+[.programlisting]
+....
+table <clients> { 192.168.2.0/24, !192.168.2.5 }
+....
+
+In diesem Beispiel ist das Netzwerk `192.168.2.0/24` Teil der Tabelle. `192.168.2.5` wurde im dem Operator `!` ausgeschlossen und ist somit nicht Teil der Tabelle. Es ist auch möglich Tabellen aus Dateien zu laden, wo jeder Eintrag in einer separaten Zeile steht. Dieses Beispiel verwendet dazu die Datei [.filename]#/etc/clients#:
+
+[.programlisting]
+....
+192.168.2.0/24
+!192.168.2.5
+....
+
+Um sich auf diese Datei zu beziehen, definieren Sie die Tabelle wie folgt:
+
+[.programlisting]
+....
+table <clients> persist file "/etc/clients"
+....
+
+Sobald die Tabelle definiert ist, kann eine Filterregel Bezug darauf nehmen:
+
+[.programlisting]
+....
+pass inet proto tcp from <clients> to any port $client_out flags S/SA keep state
+....
+
+Die Inhalte einer Tabelle können mit `pfctl` direkt verändert werden. Dieses Beispiel fügt ein weiteres Netzwerk zur Tabelle hinzu:
+
+[source,bash]
+....
+# pfctl -t clients -T add 192.168.1.0/16
+....
+
+Beachten Sie, dass auf diese Weise vorgenommene Änderungen direkt übernommen werden, jedoch bei einem Neustart des Systems oder bei einem Stromausfall verloren gehen. Um die Änderungen dauerhaft zu speichern, müssen sie in der Definition der Tabelle oder in der Datei, auf die sich die Tabelle bezieht, bearbeitet werden. Mit einem man:cron[8] Job und einem Befehl wie `pfctl -t clients -T show >/etc/clients` können Sie auch eine Kopie der Tabelle auf Platte speichern und dann in regelmäßigen Abständen aktualisieren. Alternativ kann [.filename]#/etc/clients# auch mit den Tabelleneinträgen, die sich aktuell im Speicher befinden, aktualisiert werden.
+
+[source,bash]
+....
+# pfctl -t clients -T replace -f /etc/clients
+....
+
+[[pftut-overload]]
+==== Verwendung von Tabellen zum Schutz von SSH
+
+Benutzer, die SSH auf einer externen Schnittstelle ausführen, haben wahrscheinlich schon einmal ähnliche Meldungen in den Protokolldateien gesehen:
+
+[.programlisting]
+....
+Sep 26 03:12:34 skapet sshd[25771]: Failed password for root from 200.72.41.31 port 40992 ssh2
+Sep 26 03:12:34 skapet sshd[5279]: Failed password for root from 200.72.41.31 port 40992 ssh2
+Sep 26 03:12:35 skapet sshd[5279]: Received disconnect from 200.72.41.31: 11: Bye Bye
+Sep 26 03:12:44 skapet sshd[29635]: Invalid user admin from 200.72.41.31
+Sep 26 03:12:44 skapet sshd[24703]: input_userauth_request: invalid user admin
+Sep 26 03:12:44 skapet sshd[24703]: Failed password for invalid user admin from 200.72.41.31 port 41484 ssh2
+....
+
+Diese Meldungen deuten auf einen Brute-Force-Angriff hin, bei dem ein Angreifer oder ein Programm versucht, den Benutzernamen und das Passwort zu erraten, um Zugriff auf das System zu bekommen.
+
+Wenn der Zugriff über SSH für berechtigte Benutzer erforderlich ist, kann eine Änderung des Standard-Ports für SSH einen gewissen Schutz bieten. Allerdings bietet PF eine elegantere Lösung für dieses Problem. `pass`-Regeln können Einschränkungen für Dinge enthalten, die ein verbindender Rechner tun kann. Bei einem Verstoß gegen diese Einschränkungen kann dann dem betroffenen Rechner der Zugriff teilweise oder ganz entzogen werden. Es ist sogar möglich, alle bestehenden Verbindungen zu trennen, falls die Grenze überschritten wird.
+
+Um dies zu konfigurieren, erstellen Sie folgende Tabelle im Regelsatz:
+
+[.programlisting]
+....
+table <bruteforce> persist
+....
+
+Fügen Sie dann ziemlich am Anfang der Filterregeln folgende Regeln hinzu, um die Brute-Force-Angriffe zu blocken und gleichzeitig berechtigte Verbindungen zu erlauben:
+
+[.programlisting]
+....
+block quick from <bruteforce>
+pass inet proto tcp from any to $localnet port $tcp_services \
+ flags S/SA keep state \
+ (max-src-conn 100, max-src-conn-rate 15/5, \
+ overload <bruteforce> flush global)
+....
+
+Der Teil in Klammern definiert die Grenzwerte. Die Zahlen sollten an die lokalen Anforderungen angepasst werden. Die Zeilen können wie folgt interpretiert werden:
+
+`max-src-conn` definiert die maximal erlaubte Anzahl gleichzeitiger Verbindungen von einem Rechner.
+
+`max-src-conn-rate` definiert die maximal erlaubte Anzahl neuer Verbindungen eines einzelnen Rechners (_15_) pro Anzahl von Sekunden (_5_).
+
+`overload <bruteforce>` bedeutet, dass jeder Rechner, der diesen Grenzwert überschreitet, zur Tabelle `bruteforce` hinzugefügt wird. Diese Filterregel blockiert jeglichen Datenverkehr von Adressen aus der Tabelle `bruteforce`.
+
+`flush global` besagt, dass alle (`global`) Verbindungen dieses Rechners getrennt (`flush`) werden, wenn der Grenzwert erreicht wird.
+
+[NOTE]
+====
+Diese Filterregeln helfen nicht bei langsamen Brute-Force-Angriffen, wie sie in http://home.nuug.no/~peter/hailmary2013/[ http://home.nuug.no/~peter/hailmary2013/] beschrieben sind.
+====
+
+Dieser Beispielregelsatz dient lediglich als Illustration. Wenn Sie allgemein eine große Anzahl an Verbindungen erlauben wollen, aber gleichzeitig bei SSH etwas restriktiver vorgehen möchten, können Sie die obige Regel ergänzen:
+
+[.programlisting]
+....
+pass quick proto { tcp, udp } from any to any port ssh \
+ flags S/SA keep state \
+ (max-src-conn 15, max-src-conn-rate 5/3, \
+ overload <bruteforce> flush global)
+....
+
+[NOTE]
+.Es ist möglicherweise nicht notwendig, alle aggressiven Rechner zu blockieren
+====
+Es ist zu erwähnen, dass der `overlaod`-Mechanismus eine allgemeine Technik darstellt, die nicht auf SSH beschränkt ist. Außerdem ist es nicht immer optimal, Datenverkehr von aggressiven Rechnern zu blockieren.
+
+Eine `overload`-Regel kann beispielsweise benutzt werden, um einen Mail- oder Webserver zu schützen. Die `overload`-Tabelle könnte dann in einer Regel verwendet werden, um aggressive Rechner einer Warteschlange mit geringerer Bandbreite zuzuweisen, oder den Rechner auf eine bestimtme Webseite umzuleiten.
+====
+
+Im Laufe der Zeit werden die Tabellen durch die `overload`-Regeln immer größer und belegen immer mehr Speicher. Manchmal wird eine geblockte IP-Adresse einem Rechner dynamisch zugewiesen, der eigentlich berechtigt ist, mit den Rechnern im lokalen Netzwerk zu kommunizieren.
+
+Für solche Situationen bietet `pfctl` die Möglichkeit, Tabelleneinträge auslaufen zu lassen. Dieses Kommando würde beispielsweise Einträge aus der Tabelle `<bruteforce>` löschen, die seit `86400` Sekunden nicht mehr referenziert wurden:
+
+[source,bash]
+....
+# pfctl -t bruteforce -T expire 86400
+....
+
+Eine ähnliche Funktionalität bietet package:security/expiretable[], welches Einträge entfernt, die für einen bestimmten Zeitraum nicht referenziert wurden.
+
+Nach der Installation kann expiretable benutzt werden, um Einträge aus der Tabelle `<bruteforce>` nach einer bestimmten Zeit zu entfernen. Dieses Beispiel entfernt alle Einträge, die älter sind als 24 Stunden:
+
+[.programlisting]
+....
+/usr/local/sbin/expiretable -v -d -t 24h bruteforce
+....
+
+[[pftut-spamd]]
+==== Schutz vor SPAM
+
+Im Gegensatz zum spamd-Daemon von spamassassin, kann package:mail/spamd[] zusammen mit PF den SPAM direkt an der Firewall abwehren. Dieser spamd wird in PF über einen Satz von Umleitungen konfiguriert.
+
+Spammer neigen dazu, eine große Anzahl von Nachrichten zu versenden. Dabei nutzten Sie SPAM-freundliche Netzwerke und gekaperte Rechner, welche dann ziemlich schnell bei sogenannten Blacklists gemeldet werden.
+
+Wenn eine SMTP-Verbindung von einer Adresse in der Blacklist empfangen wird, präsentiert spamd einen Banner und schaltet sofort in einen Modus, in dem die Antworten auf den SMTP-Verkehr jeweils ein Byte groß sind. Diese Technik, die möglichst viel Zeit des Spammers verschwenden soll, wird Tarpitting genannt. Die spezifische Implementierung, welche ein Byte SMTP-Antworten verwendet, wird als Stuttering bezeichnet.
+
+Dieses Beispiel zeigt das grundlegende Verfahren zur Konfiguration von spamd mit automatisch aktualisierten Blacklists. Für weitere Informationen lesen die Manualpages, die zusammen mit package:mail/spamd[] installiert werden.
+
+[.procedure]
+****
+*Procedure: Konfiguration von spamd*
+
+. Installieren Sie das Paket oder den Port package:mail/spamd[]. Um spamd's Greylisting-Funktion zu nutzen, muss man:fdescfs[5] in [.filename]#/dev/fd# eingehängt werden. Fügen Sie folgende Zeile in [.filename]#/etc/fstab# ein:
++
+[.programlisting]
+....
+fdescfs /dev/fd fdescfs rw 0 0
+....
++
+Danach hängen Sie das Dateisystem ein:
++
+[source,bash]
+....
+# mount fdescfs
+....
+
+. Fügen Sie folgende Zeilen in den PF-Regelsatz ein:
++
+[.programlisting]
+....
+table <spamd> persist
+table <spamd-white> persist
+rdr pass on $ext_if inet proto tcp from <spamd> to \
+ { $ext_if, $localnet } port smtp -> 127.0.0.1 port 8025
+rdr pass on $ext_if inet proto tcp from !<spamd-white> to \
+ { $ext_if, $localnet } port smtp -> 127.0.0.1 port 8025
+....
++
+Die beiden Tabellen `<spamd>` und `<spam-white>` sind von großer Bedeutung. SMTP-Verkehr von einer Adresse, die in `<spamd>` aber nicht in `<spamd-white>` ist, wird an den spamd-Daemon auf Port 8025 umgeleitet.
+. Im nächsten Schritt wird spamd in [.filename]#/usr/local/etc/spamd.conf# konfiguriert und einige Parameter werden in [.filename]#/etc/rc.conf# hinzugefügt.
++
+Die Installation von package:mail/spamd[] enthält eine Beispielkonfiguration ([.filename]#/usr/local/etc/spamd.conf.sample#) und eine Manualpage für [.filename]#spamd.conf#. Beziehen Sie sich für zusätzliche Konfigurationsoptionen auf diese Dokumentation.
++
+Die Konfigurationsdatei enthält einen Block, in dem die `all`-Liste definiert ist, die wiederum weitere Listen spezifiziert:
++
+[.programlisting]
+....
+all:\
+ :traplist:whitelist:
+....
++
+Dieser Eintrag fügt die gewünschten Blacklists, getrennt durch einen Doppelpunkt (`:`), hinzu. Um auch eine Whitelist zu verwenden, fügen Sie den Namen unmittelbar hinter dem Namen der Blacklist ein. Zum Beispiel: `:Blacklist:Whitelist:`.
++
+Danach folgt die Definition der verwendeten Blacklist:
++
+[.programlisting]
+....
+traplist:\
+ :black:\
+ :msg="SPAM. Your address %A has sent spam within the last 24 hours":\
+ :method=http:\
+ :file=www.openbsd.org/spamd/traplist.gz
+....
++
+In der ersten Zeile steht der Name der Blacklist und die zweite Zeile gibt den Typ an. Das Feld `msg` enthält die Nachricht, die dem Absender während des SMTP-Dialogs angezeigt wird. Das Feld `mehtod` legt fest, wie spamd-setup die Listen bezieht; unterstützte Methoden sind `http`, `ftp`, `file` und ein externes Programm via `exec`. Im letzten Feld gibt `file` den Namen der Datei an, die spamd erwartet.
++
+Die Definition der Whitelist ist ähnlich. Das Feld `msg` wird jedoch nicht definiert, da eine Meldung hier nicht erforderlich ist:
++
+[.programlisting]
+....
+whitelist:\
+ :white:\
+ :method=file:\
+ :file=/var/mail/whitelist.txt
+....
+
+[TIP]
+.Wählen Sie die Datenquellen mit Sorgfalt
+====
+Bei der Verwendung von sämtlichen Blacklists aus der Beispieldatei [.filename]#spamd.conf# würden große Teile des Internets geblockt. Der Administrator muss diese Datei bearbeiten, um eine optimale Konfiguration zu erzielen. Dazu gehört auch die Auswahl von geeigneten Blacklists und, wenn nötig, die Erstellung von benutzerdefinierten Listen.
+====
+
+Als nächstes fügen Sie folgenden Eintrag in [.filename]#/etc/rc.conf# hinzu. Zusätzliche Optionen sind in der Manualpage beschrieben:
+
+[.programlisting]
+....
+spamd_flags="-v" # use "" and see spamd-setup(8) for flags
+....
+
+Wenn Sie fertig sind, starten Sie spamd durch die Eingabe von `service obspamd start`. Führen Sie die weitere Konfiguration mit `spamd-setup` durch. Erstellen Sie zum Schluss einen man:cron[8]-Job, der `spamd-setup` in regelmäßigen Abständen aufruft, um die Listen zu aktualisieren.
+****
+
+Auf einem typischen Gateway vor dem Mailserver, werden Rechner innerhalb von wenigen Minuten geblockt.
+
+PF unterstützt auch _Greylisting_, das Nachrichten von unbekannten Rechnern vorübergehend mit _45n_-Codes ablehnt. Nachrichten von diesen Rechnern werden bei einem erneuten Versuch nach einer angemessenen Zeit durchgelassen. Nachrichten von Rechnern, die nach RFC 1123 und RFC 2821 konfiguriert sind, werden sofort durchgelassen.
+
+Weitere Informationen über Greylisting finden Sie unter http://www.greylisting.org/[ greylisting.org]. Das Erstaunlichste an Greylisting ist, neben der einfachen Benutzung, dass es immer noch funktioniert. Spammer und Malware-Autoren gelingt es bislang nur schwer, diese Technik zu umgehen.
+
+Die grundsätzliche Vorgehensweise zur Konfiguration von Greylisting ist wie folgt:
+
+[.procedure]
+====
+*Procedure: Konfiguration von Greylisting*
+
+. Stellen Sie sicher, dass man:fdescfs[5] eingehängt ist. Dies wird in Schritt 1 der vorherigen Prozedur beschrieben.
+. Um spamd im Greylisting-Modus auszuführen, fügen Sie folgende Zeilen in [.filename]#/etc/rc.conf# ein:
++
+[.programlisting]
+....
+spamd_grey="YES" # use spamd greylisting if YES
+....
++
+Lesen Sie die Manualpage von spamd für Beschreibungen von zusätzlichen Parametern.
+. Starten Sie die Dienste, um die Konfiguration von Greylisting abzuschließen:
++
+[source,bash]
+....
+# service obspamd restart
+# service spamlogd start
+....
+====
+
+Hinter den Kulissen führen die spamdb-Datenbank und spamlogd wesentliche Aufgaben der Greylisting-Funktion aus. spamdb ist die Schnittstelle für den Administrator, der über den Inhalt der Datenbank [.filename]#/var/db/spamdb# Blaklists, Whitelists und Greylists verwaltet.
+
+[[pftut-hygiene]]
+==== Netzwerk-Hygiene
+
+Dieser Abschnitt beschreibt die Verwendung von `block-policy`, `scrub` und `antispoof`, mit denen das Verhalten des Regelsatzes weiter optimiert werden kann.
+
+Die Option `block-policy` kann im Teil `options` des Regelwerks konfiguriert werden, vor den Umleitungen und den eigentlichen Filterregeln. Diese Option legt fest, welche Rückmeldung PF an einen geblockten Rechner sendet. Es existieren zwei mögliche Werte: `drop` verwirft das Paket ohne Rückmeldung und `return` gibt eine Statusmeldung, wie etwa `Connection refused` zurück.
+
+Die Voreinstellung ist `drop`. Geben Sie den gewünschten Wert ein, um die `block-policy`-Richtlinie zu ändern:
+
+[.programlisting]
+....
+set block-policy return
+....
+
+`scrub` ist ein Schlüsselwort in PF, das die Paket-Normalisierung aktiviert. Dieser Prozess fügt fragmentierte Pakete wieder zusammen und blockt TCP-Pakete mit ungültigen Flag-Kombinationen. Ein aktiviertes `scrub` bietet einen gewissen Schutz gegen Angriffe, die auf die falsche Handhabung von fragmentierten Paketen aufbauen. Es stehen viele Optionen zur Verfügung, jedoch sollte die einfachste Form für die meisten Konfigurationen ausreichend sein:
+
+[.programlisting]
+....
+scrub in all
+....
+
+Einige Dienste, wie beispielsweise NFS, erfordern eine bestimmte Handhabung von fragmentierten Paketen. Weitere Informationen finden Sie unter https://home.nuug.no/\~peter/pf/en/scrub.html[https://home.nuug.no/~peter/pf/en/scrub.html].
+
+Dieses Beispiel fügt fragmentierte Pakete wieder zusammen, löscht das "do not fragment"-Bit und setzt die maximale Segmentgröße auf 1440 Bytes:
+
+[.programlisting]
+....
+scrub in all fragment reassemble no-df max-mss 1440
+....
+
+Der `antispoof`-Mechanismus bietet einen Schutz gegen gefälschte IP-Adressen. Dabei werden hauptsächlich Pakete verworfen, die auf der falschen Schnittstellen ankommen.
+
+Folgende Regeln verwerfen gefälschte Adressen, wenn sie aus dem Internet oder dem lokalen Netzwerk stammen:
+
+[.programlisting]
+....
+antispoof for $ext_if
+antispoof for $int_if
+....
+
+[[pftut-unrouteables]]
+==== Handhabung von nicht-routebaren Adressen
+
+Sogar bei einem richtig konfigurierten NAT-Gateway müssen Sie vielleicht die Fehlkonfiguration anderer Personen ausgleichen. Ein typischer Fehler besteht darin, nicht-routebare Adressen ins Internet zu lassen. Da der Verkehr von nicht-routebaren Adressen Teil eines DoS-Angriffs sein kann, sollten Sie in Betracht ziehen, diesen Verkehr explizit an der externen Schnittstelle des Netzwerks zu blockieren.
+
+In diesem Beispiel wird ein Makro erstellt, das die nicht-routebaren Adressen enthält. Datenverkehr von und zu diesen Adressen wird dann an der externen Schnittstelle des Gateways verworfen.
+
+[.programlisting]
+....
+martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
+ 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
+ 0.0.0.0/8, 240.0.0.0/4 }"
+
+block drop in quick on $ext_if from $martians to any
+block drop out quick on $ext_if from any to $martians
+....
+
+=== ALTQ aktivieren
+
+Unter FreeBSD kann ALTQ zusammen mit PF benutzt werden, um Quality of Service (QoS) bereitzustellen. Sobald ALTQ aktiviert ist, können Warteschlangen definiert werden, mit denen Sie die Priorität für ausgehende Pakete festlegen können.
+
+Bevor Sie ALTQ aktivieren, sollten Sie man:altq[4] lesen und sicherstellen, das der Treiber der Netzwerkkarte diese Funktion unterstützt.
+
+ALTQ steht nicht als ladbares Kernelmodul zur Verfügung. Wenn die Netzwerkkarte des Systems ALTQ unterstützt, erstellen Sie nach den Anweisungen in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] einen angepassten Kernel. Als erstes muss ALTQ aktiviert werden. Zudem ist mindestens eine weitere Option nötig, um den Algorithmus für die Warteschlange zu bestimmen:
+
+[.programlisting]
+....
+options ALTQ
+options ALTQ_CBQ # Class Based Queuing (CBQ)
+options ALTQ_RED # Random Early Detection (RED)
+options ALTQ_RIO # RED In/Out
+options ALTQ_HFSC # Hierarchical Packet Schedule (HFSC)
+options ALTQ_PRIQ # Priority Queuing (PRIQ)
+....
+
+Die folgenden Algorithmen stehen zur Verfügung:
+
+CBQ::
+Class Based Queuing (CBQ) erlaubt es, die Bandbreite einer Verbindung in verschiedene Klassen oder Warteschlangen zu unterteilen, um die Priorität von Datenpaketen basierend auf Filterregeln zu beeinflussen.
+
+RED::
+Random Early Detection (RED) wird eingesetzt, um eine Überlastung des Netzwerks zu vermeiden. Dazu ermittelt RED die Größe der Warteschlange und vergleicht diesen Wert mit den minimalen und maximalen Grenzwerten der Warteschlange. Ist die Warteschlange größer als das erlaubte Maximum, werden alle neuen Pakete nach dem Zufallsprinzip verworfen.
+
+RIO::
+Random Early Detection In and Out (RIO). Dieser Modus verwaltet mehrere Warteschlangen durchschnittlicher Größe mit mehreren Schwellwerten, eine für jedes QoS-Level.
+
+HFSC::
+Hierachical Fair Service Curve Packet Scheduler (HFSC) wird in http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html[ http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html] beschrieben.
+
+PRIQ::
+Priority Queuing (PRIQ) lässt den Verkehr einer Warteschlange mit höherer Priorität zuerst durch.
+
+Weitere Informationen über diese Algorithmen und Beispiele für Regelsätze finden Sie in den https://web.archive.org/web/20151109213426/http://www.openbsd.org/faq/pf/queueing.html[ OpenBSD Archiven].
+
+[[firewalls-ipfw]]
+== IPFW
+
+IPFW ist eine Stateful-Firewall für FreeBSD, die sowohl IPv4 als auch IPv6 unterstützt. Die Firewall setzt sich aus mehreren Komponenten zusammen: dem Kernel Firewall Filter-Prozessor mit integriertem Paket-Accounting, Protokollfunktionen, NAT, dem man:dummynet[4] Traffic-Shaper, sowie Weiterleitungs-, Bridge- und ipstealth-Funktionen.
+
+FreeBSD enthält mit [.filename]#/etc/rc.firewall# ein Beispielregelwerk, welches mehrere Firewall-Typen für gebräuchliche Szenarien definiert und unerfahrene Anwender dabei unterstützen soll, ein geeignetes Regelwerk zu erstellen. IPFW besitzt eine leistungsstarke Syntax, mit der erfahrene Benutzer ihre eigenen Regeln anfertigen können, um den Sicherheitsanforderungen der jeweiligen Umgebung gerecht zu werden.
+
+Diser Abschnitt beschreibt, wie IPFW aktiviert wird und bietet einen Überblick über die Regelsyntax. Zudem werden mehrere Regelsätze für gebräuchliche Konfigurationsszenarien vorgestellt.
+
+[[firewalls-ipfw-enable]]
+=== IPFW aktivieren
+
+Das FreeBSD Basissystem enthält für IPFW ein ladbares Kernelmodul, was bedeutet, dass kein angepasster Kernel benötigt wird, um IPFW zu benutzen.
+
+Wenn Sie eine statische Unterstützung für IPFW in den Kernel kompilieren wollen, lesen Sie <<firewalls-ipfw-kernelconfig>>.
+
+Um IPFW beim Systemstart zu aktivieren, fügen Sie `firewall_enable="YES"` in [.filename]#/etc/rc.conf# ein:
+
+[source,bash]
+....
+# sysrc firewall_enable="YES"
+....
+
+Wenn Sie einen der von FreeBSD zur Verfügung gestellten Firewall-Profile benutzen möchten, fügen Sie eine weitere Zeile hinzu, in der Sie das Profil bestimmen:
+
+[source,bash]
+....
+# sysrc firewall_type="open"
+....
+
+Folgende Profile stehen zur Verfügung:
+
+* `open`: gestattet jeglichen Datenverkehr.
+* `client`: schützt lediglich diesen Rechner.
+* `simple`: schützt das gesamte Netzwerk.
+* `closed`: blockiert den gesamten IP-Datenverkehr, mit Ausnahme des Verkehrs über die Loopback-Schnittstelle.
+* `workstation`: schützt lediglich diesen Rechner und verwendet zustandsorientierte Regeln.
+* `UNKNOWN`: deaktiviert das Laden von Firewallregeln.
+* [.filename]#filename#: absoluter Pfad zu einer Datei, in der die Firewallregeln definiert sind.
+
+Wenn Sie `firewall_type` auf `client` oder `simple` setzen, müssen Sie die voreingestellten Regeln in [.filename]#/etc/rc.firewall# anpassen, damit sie der Konfiguration des Systems entsprechen.
+
+Beachten Sie, dass das Profil `filename` verwendet wird, um ein benutzerdefiniertes Regelwerk zu laden.
+
+Eine alternative Möglichkeit, um ein benutzerdefiniertes Regelwerk zu laden, bietet die Variable `firewall_script`. Setzen Sie die Variable auf den absoluten Pfad eines _ausführbaren Skripts_, welches die Befehle für IPFW enthält. Die Beispiele in diesem Abschnitt gehen davon aus, dass `firewall_script` auf [.filename]#/etc/ipfw.rules# gesetzt ist.
+
+[source,bash]
+....
+# sysrc firewall_script="/etc/ipfw.rules"
+....
+
+Die Protokollierung wird mit diesem Befehl aktiviert:
+
+[source,bash]
+....
+# sysrc firewall_logging="YES"
+....
+
+[WARNING]
+====
+
+Es werden nur Firewallregeln mit der Option `log` protokolliert. Die voreingestellten Regeln enthalten diese Option nicht und müssen manuell hinzugefügt werden. Daher ist es ratsam, diese Regeln zu bearbeiten. Außerdemkann eine Rotation der Protokolle erwünscht sein, wenn die Protokolle in einer separaten Datei gespeichert werden.
+====
+
+Es existiert keine Variable für [.filename]#/etc/rc.conf#, um die Protokollierung zu begrenzen. Um die Anzahl der Protokoll-Nachrichten pro Verbindungsversuch zu begrenzen, legen Sie die Anzahl der Einträge in [.filename]#/etc/sysctl.conf# fest:
+
+[source,bash]
+....
+# echo "net.inet.ip.fw.verbose_limit=5" >> /etc/sysctl.conf
+....
+
+Um die Protokollierung über die spezielle Schnittstelle `ipfw0` zu aktivieren, fügen Sie stattdessen folgende Zeile in [.filename]#/etc/rc.conf# hinzu:
+
+[source,bash]
+....
+# sysrc firewall_logif="YES"
+....
+
+Benutzen Sie dann tcpdump, um zu sehen, was protokolliert wird:
+
+[source,bash]
+....
+# tcpdump -t -n -i ipfw0
+....
+
+[TIP]
+====
+
+Durch die Protokollierung entsteht kein Aufwand, es sei denn, tcpdump wird an die Schnittstelle angebunden.
+====
+
+Nachdem Sie die Änderungen vorgenommen haben, können Sie die Firewall starten. Um auch die Anzahl der Protokoll-Nachrichten zu konfigurieren, setzen Sie mit `sysctl` den gewünschten Wert:
+
+[source,bash]
+....
+# service firewall start
+# sysctl net.inet.ip.fw.verbose_limit=5
+....
+
+[[firewalls-ipfw-rules]]
+=== IPFW Regel-Syntax
+
+Wenn ein Paket die Firewall "betritt", also von der Firewall geprüft und verarbeitet wird, wird die erste Regel des Regelwerkes auf das Paket angewandt. Auf diese Weise wird in aufsteigender Reihenfolge der Regelnummer mit allen weiteren Regeln verfahren. Falls die Selektionsparameter einer Regel auf ein Paket zutreffen, wird das Aktionsfeld der Regel ausgeführt und die Prüfung des Pakets beendet, nachfolgende Regeln werden also nicht mehr geprüft. Diese Suchmethode wird als "erster Treffer gewinnt" bezeichnet. Falls keine Regel auf das betreffende Paket zutrifft, wird die obligatorische IPFW-Rückfallregel mit der Nummer 65535 angewendet und das Paket wird ohne Rückantwort verworfen. Wenn das Paket jedoch einer Regel mit dem Schlüsselwort `count`, `skipto` oder `tee` entspricht, wird die Prüfung des Pakets weiter fortgeführt. Weitere Details darüber, wie diese Schlüsselwörter die Regelverarbeitung beeinflussen, finden Sie in man:ipfw[8].
+
+Bei der Erstellung der IPFW-Regeln müssen die Schlüsselwörter in der folgenden Reihenfolge geschrieben werden. Einige Schlüsselwörter müssen zwingend angegeben werden, während andere optional sind. Die Wörter in Großbuchstaben repräsentieren Variablen und die Wörter in Kleinbuchstaben müssen den Variablen vorangestellt werden. Das Zeichen `#` wird benutzt, um einen Kommentar einzuleiten und kann am Ende einer Regel oder in einer eigenen Zeile stehen. Leerzeilen werden ignoriert.
+
+`_CMD RULE_NUMBER set SET_NUMBER ACTION log LOG_AMOUNT PROTO from SRC SRC_PORT to DST DST_PORT OPTIONS_`
+
+Dieser Abschnitt bietet einen Überblick über diese Schlüsselwörter und deren Optionen. Es ist keine vollständige Liste aller verfügbaren Optionen. Eine vollständige Beschreibung der Regel-Syntax, die Sie verwenden können um IPFW-Regeln zu erstellen, finden Sie in man:ipfw[8].
+
+CMD::
+Jede Regel muss mit [parameter]#ipfw add# beginnen.
+
+RULE_NUMBER::
+Jede Regel gehört zu einer Nummer zwischen `1` und `65534`. Die Nummer wird verwendet, um die Reihenfolge der Regelverarbeitung zu kennzeichnen. Es ist möglich, dass mehrere Regeln dieselbe Nummer haben. In diesem Fall werden sie entsprechend der Reihenfolge angewendet, in der sie aufgenommen wurden.
+
+SET_NUMBER::
+Jede Regel ist einer _Set_-Nummer zwischen `0` und `31` zugeordnet. Sets können einzeln aktiviert oder deaktiviert werden. Dies macht es möglich, eine Reihe von Regeln schnell hinzuzufügen oder zu löschen. Wenn `SET_NUMBER` nicht angegeben ist, wird die Regel zu Set `0` hinzugefügt.
+
+ACTION::
+Eine Regel kann mit einer der folgenden Aktionen verknüpft werden. Die festgelegte Aktion wird ausgeführt, wenn das Paket den Selektionskriterien der Regel entspricht.
++
+[parameter]#allow | accept | pass | permit#: All diese Aktionen sind gleichbedeutend und erlauben Pakete, die mit der Regel übereinstimmen.
++
+[parameter]#check-state#: Diese Aktion überprüft die Regel in der dynamischen Zustandstabelle. Bei einer Übereinstimmung wird die mit der dynamischen Regel verknüpfte Aktion ausgeführt, andernfalls wird mit der Prüfung gegen die nächste Regel fortgefahren. Die Regel `check-state` hat selbst kein Selektionskriterium. Sollte keine `check-state`-Regel im Regelwerk vorhanden sein, wird die dynamische Zustandstabelle beim ersten Vorkommen einer `keep-state`- oder `limit`-Regel überprüft.
++
+[parameter]#count#: Aktualisiert die Zähler für alle Pakete, die mit dieser Regel übereinstimmen. Die Prüfung wird mit der nächsten Regel fortgesetzt.
++
+[parameter]#deny | drop#: Diese Aktionen sind gleichbedeutend und verwerfen Pakete, die mit dieser Regel übereinstimmen.
++
+Es stehen noch weitere Aktionen zur Verfügung. Einzelheiten finden Sie in man:ipfw[8].
+
+LOG_AMOUNT::
+Erfüllt ein Paket die Selektionskriterien mit dem Schlüsselwort `log`, wird dies von man:syslogd[8] mit der Annotation `SECURITY` protokolliert. Dies erfolgt allerdings nur, wenn die Anzahl der protokollierten Pakete der betreffenden Regel die definierte `LOG_AMOUNT`-Grenze nicht übersteigt. Wenn `LOG_AMOUNT` nicht definiert ist, wird die Grenze aus dem Wert von `net.inet.ip.fw.verbose_limit` benutzt. Ein Wert von `0` bedeutet eine unbegrenzte Protokollierung. Wird eine definierte Grenze erreicht, wird die Protokollierung für diese Regel deaktiviert. Um die Protokollierung zu reaktivieren, können Sie den Protokoll- oder Paketzähler mit `ipfw resetlog` zurücksetzen.
++
+
+[NOTE]
+====
+Die Protokollierung findet statt, nachdem alle Selektionskriterien geprüft und bevor die endgültige Aktion auf das Paket angewendet wird. Der Administrator entscheidet, welche Regel protokolliert werden soll.
+====
+
+PROTO::
+Dieser optionale Wert wird verwendet, um einen beliebigen Protokollnamen oder -nummer aus [.filename]#/etc/protocols# gegen das Paket zu prüfen.
+
+SRC::
+Nach dem Schlüsslwort `from` muss die Quelladresse stehen, oder ein Schlüsselwort, das die Quelladresse darstellt. Eine Adresse wird dargestellt duch `any`, `me` (jede Adresse dieses Systems), `me6` (jede IPv6-Adresse dieses Systems), oder `table` gefolgt von der Nummer der Tabelle, welche die Adressen enthält. IP-Adressen können in CIDR-Notation geschrieben werden. Beispielsweise `1.2.3.4/25` oder `1.2.3.4:255.255.255.128`.
+
+SRC_PORT::
+Optional kann ein Quellport über eine Nummer oder einen Namen aus [.filename]#/etc/services# spezifiziert werden.
+
+DST::
+Nach dem Schlüsselwort `to` muss die Zieladresse stehen, oder ein Schlüsselwort, das die Zieladresse darstellt. Es können die gleichen Schlüsselwörter und Adressen benutzt werden, die bereits im SRC-Abschnitt beschrieben wurden.
+
+DST_PORT::
+Optional kann ein Zielport über eine Nummer oder einen Namen aus [.filename]#/etc/services# spezifiziert werden.
+
+OPTIONS::
+Nach der Quell- und Zieladresse können noch weitere Optionen angegeben werden. Wie der Name bereits sagt, sind `OPTIONS` optional. Häufig verwendete Optionen sind `in` oder `out`, mit denen die Richtug des Pakets bestimmt wird, `icmptypes` gefolgt vom Typ der ICMP-Nachricht, sowie `keep-state`.
++
+Wenn ein Paket auf eine [parameter]#keep-state#-Regel zutrifft, wird die Firewall eine dynamische Regel erstellen, die dem bidirektionalen Datenverkehr zwischen den gleichen Quell- und Zieladressen mit dem gleichen Protokoll entspricht.
++
+Dynamische Regeln sind für einen sogenannten SYN-flood-Angriff anfällig, bei dem eine riesige Anzahl an dynamischen Regeln erzeugt wird. Verwenden Sie die Option `limit`, um einen solchen Angriff entgegenzuwirken. Diese Option begrenzt die Anzahl der gleichzeitig möglichen Sitzungen. Es handelt sich dabei um einen Zähler, der die Anzahl von dynamischen Regeln in Kombination mit der Quelladresse verfolgt. Übersteigt der Zähler den durch `limit` definierten Wert, wird das Paket verworfen.
++
+Es stehen noch viele weitere Optionen zur Verfügung. man:ipfw[8] enthält eine Beschreibung der einzelnen Optionen.
+
+=== Beispiel für einen Regelsatz
+
+Dieser Abschnitt die Erstellung eines Firewall-Skripts namens [.filename]#/etc/ipfw.rules# mit zustandsorientierten (stateful Regeln. Alle Regeln in diesem Beispiel verwenden die Optionen `in` und `out`, um die Richtung des Pakets zu verdeutlichen. Zusätzlich wird `via` _interface-name_ benutzt, um die Schnittstelle für das Paket zu prüfen.
+
+[NOTE]
+====
+Bei den anfänglichen Tests mit dem Firewall-Regelsatz sollten Sie vielleicht folgende Einstellung vornehmen:
+
+[.programlisting]
+....
+net.inet.ip.fw.default_to_accept="1"
+....
+
+Dies legt die Standardregel von man:ipfw[8] etwas großzügiger fest, als das voreingestellte `default deny ip from any to any`. Dadurch sinkt die Gefahr, sich nach einem Neustart des Systems auszusperren.
+====
+
+Das Firewall-Skript beginnt mit einem Hinweis, dass es sich um ein Bourne Shell-Skript handelt. Danach werden alle vorhandenen Filterregeln gelöscht. Anschließend wird die Variable `cmd` erstellt, sodass `ipfw add` nicht jedes mal von Hand eingegeben werden muss. Die Variable `pif` repräsentiert die mit dem Internet verbundene Schnittstelle.
+
+[.programlisting]
+....
+#!/bin/sh
+# Flush out the list before we begin.
+ipfw -q -f flush
+
+# Set rules command prefix
+cmd="ipfw -q add"
+pif="dc0" # interface name of NIC attached to Internet
+....
+
+Jetzt folgen die eigentlichen Filterregeln. Diese ersten beiden Regeln erlauben den Datenverkehr aus dem internen Netzwerk und über die Loopback-Schnittstelle:
+
+[.programlisting]
+....
+# Change xl0 to LAN NIC interface name
+$cmd 00005 allow all from any to any via xl0
+
+# No restrictions on Loopback Interface
+$cmd 00010 allow all from any to any via lo0
+....
+
+Die nächste Regel erlaubt Pakete, für die ein Eintrag in der dynamischen Zustandstabelle existiert:
+
+[.programlisting]
+....
+$cmd 00101 check-state
+....
+
+Die nächsten Regeln definieren, welche internen Rechner Verbindungen zu anderen Rechnern im Internet aufbauen dürfen. Hier werden wieder zustandsorientierte Regeln verwendet:
+
+[.programlisting]
+....
+# Allow access to public DNS
+# Replace x.x.x.x with the IP address of a public DNS server
+# and repeat for each DNS server in /etc/resolv.conf
+$cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state
+$cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state
+
+# Allow access to ISP's DHCP server for cable/DSL configurations.
+# Use the first rule and check log for IP address.
+# Then, uncomment the second rule, input the IP address, and delete the first rule
+$cmd 00120 allow log udp from any to any 67 out via $pif keep-state
+#$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state
+
+# Allow outbound HTTP and HTTPS connections
+$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state
+$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state
+
+# Allow outbound email connections
+$cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state
+$cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state
+
+# Allow outbound ping
+$cmd 00250 allow icmp from any to any out via $pif keep-state
+
+# Allow outbound NTP
+$cmd 00260 allow udp from any to any 123 out via $pif keep-state
+
+# Allow outbound SSH
+$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state
+
+# deny and log all other outbound connections
+$cmd 00299 deny log all from any to any out via $pif
+....
+
+Die folgenden Regeln steuern die Verbindungen von Rechern aus dem Internet ins interne Netzwerk. Zuerst werden Pakete verworfen, die typischerweise im Zusammenhang mit Angriffen stehen. Danach werden bestimmte Arten von Verbindungen erlaubt. Alle Dienste aus dem öffentlichen Internet beinhalten die Option `limit`, um Flooding zu unterbinden.
+
+[.programlisting]
+....
+# Deny all inbound traffic from non-routable reserved address spaces
+$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP
+$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP
+$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP
+$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback
+$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback
+$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config
+$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs
+$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect
+$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast
+
+# Deny public pings$
+$cmd 00310 deny icmp from any to any in via $pif$
+$
+# Deny ident$
+$cmd 00315 deny tcp from any to any 113 in via $pif$
+$
+# Deny all Netbios services.$
+$cmd 00320 deny tcp from any to any 137 in via $pif$
+$cmd 00321 deny tcp from any to any 138 in via $pif$
+$cmd 00322 deny tcp from any to any 139 in via $pif$
+$cmd 00323 deny tcp from any to any 81 in via $pif$
+
+# Deny fragments
+$cmd 00330 deny all from any to any frag in via $pif
+
+# Deny ACK packets that did not match the dynamic rule table
+$cmd 00332 deny tcp from any to any established in via $pif
+
+# Allow traffic from ISP's DHCP server.
+# Replace x.x.x.x with the same IP address used in rule 00120.
+#$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state
+
+# Allow HTTP connections to internal web server
+$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2
+
+# Allow inbound SSH connections
+$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2
+
+# Reject and log all other incoming connections
+$cmd 00499 deny log all from any to any in via $pif
+....
+
+Die letzte Regel protokolliert alle Pakete, die mit keiner Regel im Regelsatz übereinstimmen:
+
+[.programlisting]
+....
+# Everything else is denied and logged
+$cmd 00999 deny log all from any to any
+....
+
+[[in-kernel-nat]]
+=== In-Kernel NAT
+
+Die IPFW-Firewall von FreeBSD hat zwei NAT-Implementierungen: die Userland-Implementierung man:natd[8] und die neuere, kernelinterne NAT-Implementierung. Beide arbeiten in Verbindung mit IPFW, um die Übersetzung von Netzwerkadressen zu ermöglichen. Damit kann eine Lösung zur gemeinsamen Nutzung der Internetverbindung bereitgestellt werden, so dass mehrere interne Rechner unter Verwendung einer einzigen öffentlichen IP-Adresse eine Verbindung zum Internet herstellen können.
+
+Um dies zu tun, muss der mit dem Internet verbundene FreeBSD-Rechner als Gateway eingerichtet sein. Das System muss über zwei Netzwerkschnittstellen verfügen, wobei eine Schnittstelle mit dem Internet verbunden ist und die andere mit dem internen Netzwerk. Jeder Rechner im internen Netzwerk sollte eine https://www.ietf.org/rfc/rfc1918.txt[RFC 1918] konforme Adresse zugewiesen bekommen.
+
+Es ist noch ein wenig Konfiguration nötig, um die In-Kernel NAT-Funktion von IPFW zu aktivieren. Um die In-Kernel NAT-Unterstützung beim Booten zu aktivieren, müssen folgende Einträge in [.filename]#/etc/rc.conf# vorhanden sein:
+
+[.programlisting]
+....
+gateway_enable="YES"
+firewall_enable="YES"
+firewall_nat_enable="YES"
+....
+
+[NOTE]
+====
+Wenn `firewall_nat_enable` gesetzt ist, `firewall_enable` jedoch nicht, hat dies keine Auswirkung, da die NAT-Implementierung im Kernel nur mit IPFW kompatibel ist.
+====
+
+Wenn der Regelsatz zustandsorientierte Regeln enthält, ist die Position der NAT-Regel kritisch und die `skipto`-Aktion wird benutzt. Die Aktion `skipto` benötigt eine Regelnummer, damit IPFW weiß, zu welcher Regel es springen muss. Das folgende Beispiel baut auf den im vorherigen Abschnitt gezeigten Firewall-Relgelsatz auf. Es werden einige neue Einträge hinzugefügt und bestehende Regeln modifiziert, um In-Kernel NAT zu konfigurieren. Zunächst werden einige Variablen hinzugefügt, darunter Regelnummern, die `keep-state`-Option und eine Liste mit TCP-Ports um die Anzahl der Regeln zu reduzieren:
+
+[.programlisting]
+....
+#!/bin/sh
+ipfw -q -f flush
+cmd="ipfw -q add"
+skip="skipto 1000"
+pif=dc0
+ks="keep-state"
+good_tcpo="22,25,37,53,80,443,110"
+....
+
+Bei In-Kernel NAT muss aufgrund der Architektur von man:libalias[3], einer Bibliothek, die als Kernel-Modul implementiert ist, um die In-Kernel NAT-Funktion für IPFW bereitzustellen, TCP segment offloading (TSO) deaktiviert werden. TSO kann pro Netzwerkschnittstelle mit man:ifconfig[8], oder systemweit mit man:sysctl[8] deaktiviert werden. Um TSO systemweit zu deaktivieren, muss folgende Zeile in [.filename]#/etc/sysctl.conf# enthalten sein:
+
+[.programlisting]
+....
+net.inet.tcp.tso="0"
+....
+
+Danach wird eine NAT-Instanz konfiguriert. Mit In-Kernel NAT ist es möglich, mehrere NAT-Instanzen mit jeweils eigener Konfiguration zu betreiben. In diesem Beispiel wird jedoch nur eine NAT-Instanz mit der Nummer 1 benötigt. Die Konfiguration kann ein paar Optionen enthalten, zum Beispiel: `if`, dass die öffentliche Netzwerkschnittstelle angibt, `same_ports`, das dafür sorgt, dass Alias-Ports und lokale Portnummern identisch zugeordnet werden, `unreg_only` führt dazu, dass nur unregistrierte (private) Adressräume von der NAT-Instanz verarbeitet werden, und `reset`, was dazu beiträgt, dass eine NAT-Instanz auch dann erhalten bleibt, wenn sich die öffentliche IP-Adresse des Rechners ändert. Weitere mögliche Optionen, die an einzelne NAT-Instanzen übergeben werden können, finden Sie in man:ipfw[8]. Wenn eine zustandsorientierte NAT-Firewall konfiguriert wird, ist es notwendig, dass übersetzte Pakete zur weiteren Verarbeitung in die Firewall eingespielt werden können, was durch die Deaktivierung des `one_pass`-Verhaltens beim Start des Firewall-Skripts erreicht werden kann.
+
+[.programlisting]
+....
+ipfw disable one_pass
+ipfw -q nat 1 config if $pif same_ports unreg_only reset
+....
+
+Die NAT-Regel für eingehende Pakete wird _nach_ den beiden Regeln, die das interne Netzwerk und die Loopback-Schnittstelle erlauben, und nach der Reassamble-Regel, aber _vor_ der `check-state`-Regel eingefügt. Es ist wichtig, dass die Nummer der NAT-Regel (in diesem Beispiel `100`) höher ist, als die drei vorherigen Regeln und niedriger, als die `check-state`-Regel. Darüber hinaus wird aufgrund des Verhaltens von In-Kernel NAT empfohlen, eine Reassamble-Regel kurz vor der ersten NAT-Regel, aber hinter den Regeln zu platzieren, die den Datenverkehr auf einer vertrauenswürdigen Schnittstelle erlauben. In der Regel sollte es nicht zu einer Fragmentierung kommen, aber bei getunnelten IPSEC/ESP/GRE-Verkehr kann es vorkommen, und das Zusammensetzen von Fragmenten ist notwendig, bevor das komplette Paket an das In-Kernel NAT übergeben werden kann.
+
+[NOTE]
+====
+Die Reassamble-Regel wird beim Userland man:natd[8] nicht benötigt, da die Aktion `divert` von IPFW dies bereits automatisch übernimmt, bevor das Paket an den Socket ausgeliefert wird. Dies ist auch in man:ipfw[8] dokumentiert.
+
+Beachten Sie, dass die aktuelle NAT-Instanznummer und NAT-Regelnummer in diesem Beispiel nicht mit der voreingestellten NAT-Instanznummer und Regelnummer übereinstimmt, wenn sie mit dem [.filename]#rc.firewall#-Skript von FreeBSD erstellt wurde.
+====
+
+[.programlisting]
+....
+$cmd 005 allow all from any to any via xl0 # exclude LAN traffic
+$cmd 010 allow all from any to any via lo0 # exclude loopback traffic
+$cmd 099 reass all from any to any in # reassemble inbound packets
+$cmd 100 nat 1 ip from any to any in via $pif # NAT any inbound packets
+# Allow the packet through if it has an existing entry in the dynamic rules table
+$cmd 101 check-state
+....
+
+Die Regeln für den ausgehenden Verkehr werden ebenfalls modifiziert, um Aktionen mit der `$skipto`-Variable zu erlauben und anzuzeigen, dass die Prüfung mit der Regel `1000` fortgesetzt wird. Die sieben Regeln für TCP wurden durch die Regel `125` ersetzt, da die sieben erlaubten ausgehenden Ports in der Variable `$good_tcp0` enthalten sind.
+
+[NOTE]
+====
+Beachten Sie, dass die Leistung von IPFW weitgehend von der Anzahl der im Regelsatz vorhandenen Regeln bestimmt wird.
+====
+
+[.programlisting]
+....
+# Authorized outbound packets
+$cmd 120 $skip udp from any to x.x.x.x 53 out via $pif $ks
+$cmd 121 $skip udp from any to x.x.x.x 67 out via $pif $ks
+$cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks
+$cmd 130 $skip icmp from any to any out via $pif $ks
+....
+
+Die eingehenden Regeln bleiben unverändert, mit Ausnahme der letzten Regel, in der das `via $pif` entfernt wird, um ein- und ausgehende Pakete prüfen zu können. Nach der letzten Regel für ausgehende Pakete muss die NAT-Regel folgen. Die Regel muss eine höhere Nummer als die letzte Regel haben und die Nummer muss über die `skipto`-Aktion referenziert werden. In diesem Regelsatz leitet die Regel mit der Nummer `1000` alle ausgehenden Pakete zur konfigurierten NAT-Instanz weiter. Die darauf folgende Regel lässt alle von NAT verarbeiteten Pakete passieren.
+
+[.programlisting]
+....
+$cmd 999 deny log all from any to any
+$cmd 1000 nat 1 ip from any to any out via $pif # skipto location for outbound stateful rules
+$cmd 1001 allow ip from any to any
+....
+
+In diesem Beispiel steuern die Regeln `100`, `101`, `125`, `1000` und `1001` die Adressübersetzung der ein- und ausgehende Pakete, so dass immer die private LANIP-Adresse in der dynamische Zustandstabelle registriert werden.
+
+Nehmen wir beispielsweise einen Web-Browser, der neue HTTP-Sitzungen über Port 80 aufbaut. Wenn nun das erste ausgehende Paket von der Firewall geprüft wird, trifft es nicht auf Regel `100` zu, da das Paket nach außen geleitet wird und nicht nach innen. Das Paket trifft auch nicht auf Regel `101` zu, da es das erste ist und somit noch nicht in der dynamischen Zustandstabelle enthalten ist. Das Paket entspricht schließlich Regel `125`, da es ausgehend auf einem erlaubten Port gesendet wird und von einer IP-Adresse aus dem internen LAN stammt. Für Pakete, die auf diese Regel zutreffen, werden zwei Aktionen ausgeführt. Zuerst wird durch die Aktion `keep-state` ein dynamischer Eintrag in der Statustabelle erstellt und die angegebene Aktion `skipto 1000` ausgeführt. Als nächstes durchläuft das Paket NAT und wird dann an das Internet gesendet. Nachdem dieses Paket am Webserver angekommen ist, wird dort eine Antwort erzeugt und zurückgeschickt. Dieses Paket wird wieder von oben nach unten durch das Regelwerk geprüft. Dieses Mal trifft Regel `100` auf das Paket zu und die Zieladresse wird auf die zugehörige (lokale) LAN-Adresse abgebildet. Danach wird das Paket von der Regel `check-state` verarbeitet. Die Zustandstabelle erkennt, dass eine zugehörige aktive Sitzung vorliegt und das Paket wird freigegeben und in das LAN geleitet.
+
+Für den eingehenden Datenverkehr muss der Regelsatz unerwünschte Pakete blockieren und Pakete für autorisierte Dienste durchlassen. Ein Paket, das mit einer Regel für den eingehenden Datenverkehr übereinstimmt, wird in der dynamischen Zustandstabelle eingetragen und dann an das LAN freigegeben. Das Antwortpaket wird von der Regel `check-state` als Paket einer aktiven Sitzung erkannt. Das Paket wird dann von Regel `1000` per NAT verarbeitet, bevor es über die externe Schnittstelle verschickt wird.
+
+[NOTE]
+====
+Der Wechsel vom Userland man:natd[8] zu In-Kernel NAT mag zunächst nahtlos erscheinen, aber es gibt einen kleinen Haken. Bei Verwendung des [.filename]#GENERIC#-Kernels wird IPFW das Kernelmodul [.filename]#libalias.ko# laden, wenn `firewall_nat_enable` in [.filename]#rc.conf# aktiviert ist. Das Kernelmodul [.filename]#libalias.ko# stellt nur grundlegende NAT-Funktionalität bereit, während die Userland-Implementierung man:natd[8] alle Funktionalitäten ohne zusätzliche Konfiguration zur Verfügung stellt. Die gesamte Funktionalität bezieht sich auf die folgenden Kernelmodule, die bei Bedarf zusätzlich zu [.filename]#libalias.ko# geladen werden können: [.filename]#alias_cuseeme.ko#, [.filename]#alias_ftp.ko#, [.filename]#alias_bbt.ko#, [.filename]#skinny.ko#, [.filename]#irc.ko#, [.filename]#alias_pptp.ko# und [.filename]#alias_smedia.ko# unter Verwendung der `kld_list` Direktive in [.filename]#rc.conf#. Wenn ein angepasster Kernel benutzt wird, kann die volle Funktionalität der Userland-Bibliothek im Kernel mit `options LIBALIAS` gebaut werden.
+====
+
+==== Weiterleitung von Ports
+
+Der Nachteil von NAT ist, dass die Rechner im LAN nicht aus dem Internet zugänglich sind. Diese Rechner können zwar ausgehende Verbindungen zur Außenwelt aufbauen, jedoch keine eingehenden Verbindungen empfangen. Dies stellt ein Problem dar, wenn Sie auf einem Rechner im LAN Dienste anbieten möchten, die aus dem Internet erreichbar sein sollen. In diesem Fall können Sie die Ports, welche über das Internet erreichbar sein sollen, über die NAT-Maschine an den Rechner im LAN weiterleiten.
+
+Angenommen es gibt einen IRC-Server auf Rechner `A` und einen Webserver auf Rechner `B`. Damit dies funktioniert, müssen die Verbindungen auf den Ports 6667 (IRC) und 80 (HTTP) an die jeweiligen Rechner weitergeleitet werden.
+
+Bei In-Kernel NAT wird die gesamte Konfiguration in der NAT-Instanz selbst vorgenommen. Alle Optionen, die in einer NAT-Instanz benutzt werden können, sind in man:ipfw[8] dokumentiert. Die Syntax für IPFW folgt dabei der von natd. Die Syntax für `-redirect_port` lautet:
+
+[.programlisting]
+....
+redirect_port proto targetIP:targetPORT[-targetPORT]
+ [aliasIP:]aliasPORT[-aliasPORT]
+ [remoteIP[:remotePORT[-remotePORT]]]
+....
+
+Für das obige Beispiel sollten die Argumente wie folgt aussehen:
+
+[.programlisting]
+....
+redirect_port tcp 192.168.0.2:6667 6667
+redirect_port tcp 192.168.0.3:80 80
+....
+
+Nachdem diese Argumente der Konfiguration der NAT-Instanz 1 im obigen Regelsatz hinzugefügt wurden, werden die TCP-Ports an die Rechner im LAN weitergeleitet, auf denen IRC- und HTTP-Dienste laufen.
+
+[.programlisting]
+....
+ipfw -q nat 1 config if $pif same_ports unreg_only reset \
+ redirect_port tcp 192.168.0.2:6667 6667 \
+ redirect_port tcp 192.168.0.3:80 80
+....
+
+Portbereiche können über `redirect_port` festgelegt werden. Zum Beispiel würde _tcp 192.168.0.2:2000-3000 2000-3000_ alle Verbindungen auf die Ports 2000 bis 3000 an die Ports 2000 bis 3000 an Rechner `A` weiterleiten.
+
+==== Weiterleiten von Adressen
+
+Das Weiterleiten von Adressen ist nützlich, wenn mehr als eine IP-Adresse zur Verfügung steht. Jeder Rechner im LAN kann über man:ipfw[8] seine eigene externe IP-Adresse zugewiesen bekommen. IPFW wird dann den ausgehenden Datenverkehr der Rechner aus dem LAN mit der entsprechenden externen IP-Adresse umschreiben. Auch der eingehenden Datenverkehr über die externe IP-Adresse wird an die entsprechenden Rechner im LAN weitergeleitet. Diese Methode ist auch als statisches NAT bekannt. Wenn Ihnen beispielsweise die IP-Adressen `128.1.1.1`, `128.1.1.2` und `128.1.1.3` zur Verfügung stehen, kann `128.1.1.1` als externe Adresse der man:ipfw[8]-Maschine verwendet werden, während `128.1.1.2` und `128.1.1.3` an Rechner `A` und Rechner `B` im LAN weitergeleitet werden.
+
+Die Syntax für `redirect_address` lautet wie im Folgenden, wobei `localIP` die interne IP-Adresse des Rechners im LAN, und `publicIP` die externe IP-Adresse ist, die dem Rechner im LAN entspricht.
+
+[.programlisting]
+....
+redirect_address localIP publicIP
+....
+
+Auf das Beispiel bezogen, würden die Argumente so lauten:
+
+[.programlisting]
+....
+redirect_address 192.168.0.2 128.1.1.2
+redirect_address 192.168.0.3 128.1.1.3
+....
+
+Genau wie bei `redirect_port`, werden diese Argumente in der Konfiguration der NAT-Instanz gesetzt. Bei der Weiterleitung von Adressen ist keine Portumleitung notwendig, da alle Daten, die auf einer bestimmten IP-Adresse empfangen werden, weitergeleitet werden.
+
+Die externe IP-Adresse der man:ipfw[8]-Maschine muss auf der externen Schnittstelle aktiv und mit einem Alias versehen sein. Weitere Einzelheiten sind in man:rc.conf[5]; beschrieben.
+
+==== Userland NAT
+
+Zunächst sei gesagt, dass man:natd[8], die Userland-Implementierung aufwändiger ist als In-Kernel NAT. Damit man:natd[8] Pakete übersetzen kann, müssen die Pakete vom Kernel ins Userland und zurück kopiert werden, was zusätzlichen Aufwand mit sich bringt. Dieser Aufwand entfällt bei In-Kernel NAT.
+
+Um den Userland NAT-Daemon man:natd[8] beim Systemstart zu aktivieren, ist etwas Konfiguration in [.filename]#/etc/rc.conf# nötig. `natd_interface` wird auf den Namen der mit dem Internet verbundenen Schnittstelle gesetzt. Das man:rc[8]-Skript von man:natd[8] wird selbstständig prüfen, ob eine dynamische IP-Adresse benutzt wird und sich selbst so konfigurieren, dass es damit umgehen kann.
+
+[.programlisting]
+....
+gateway_enable="YES"
+natd_enable="YES"
+natd_interface="rl0"
+....
+
+Generell kann der obige Regelsatz, wie er für In-Kernel NAT erklärt wurde, auch zusammen mit man:natd[8] benutzt werden. Die Ausnahmen sind die Konfiguration der In-Kernel NAT-Instanz `(ipfw -q nat 1 config ...)`, die nicht zusammen mit der Regel 99 benötigt wird, da die `divert`-Aktion sich um die Fragmentierung kümmert. Die Regeln 100 und 1000 müssen leicht modifiziert werden, wie unten gezeigt.
+
+[.programlisting]
+....
+$cmd 100 divert natd ip from any to any in via $pif
+$cmd 1000 divert natd ip from any to any out via $pif
+....
+
+Um eine Port- oder Adressumleitung zu konfigurieren, wird eine ähnliche Syntax wie bei In-Kernel NAT verwendet. Anstatt die Konfiguration in unserem Regelsatz-Skript wie bei In-Kernel NAT anzugeben, wird die Konfiguration von man:natd[8] am besten in einer Konfigurationsdatei vorgenommen. Dazu muss eine zusätzliche Option in [.filename]#/etc/rc.conf# übergeben werden, welche den Pfad zur Konfigurationsdatei angibt.
+
+[.programlisting]
+....
+natd_flags="-f /etc/natd.conf"
+....
+
+[NOTE]
+====
+Die Konfigurationsdatei muss eine Liste von Optionen enthalten, eine pro Zeile. Weitere Informationen über die Konfigurationsdatei und mögliche Variablen finden Sie in man:natd[8]. Hier zwei Beispieleinträge, einer pro Zeile:
+
+[.programlisting]
+....
+redirect_port tcp 192.168.0.2:6667 6667
+redirect_address 192.168.0.3 128.1.1.3
+....
+
+====
+
+[[firewalls-ipfw-cmd]]
+=== Das IPFW Kommando
+
+`ipfw` kann benutzt werden, um einzelne Regeln im laufenden Betrieb hinzuzufügen oder zu entfernen. Problematisch ist jedoch, dass diese Änderungen bei einem Neustart des Systems verloren gehen. Daher ist es empfehlenswert, eigene Regeln in einer Datei zu definieren und diese zu laden, um die Regeln der Firewall im laufenden Betrieb anzupassen.
+
+`ipfw` ist auch hilfreich, um die geladenen Regeln der auf der Konsole auszugeben. IPFW erzeugt dynamisch einen Zähler, der jedes Paket, auf das eine Regel zutrifft, zählt. Dadurch ist es möglich, die Funktion einer Regel zu überprüfen.
+
+Eine Auflistung aller geladenen Regeln erhalten Sie mit:
+
+[source,bash]
+....
+# ipfw list
+....
+
+Eine Auflistung aller Regeln inklusive des letzten Treffers erhalten Sie mit:
+
+[source,bash]
+....
+# ipfw -t list
+....
+
+Das nächste Beispiel zeigt Informationen über die Anzahl der Pakete, die von einer Regel gefiltert wurden sowie die Regel selbst. Der erste Spalte zeigt die Nummer der Regel, gefolgt von der Anzahl der gefilterten Pakete und der Anzahl der Pakete in Bytes. Zum Schluss steht die Regel selbst:
+
+[source,bash]
+....
+# ipfw -a list
+....
+
+Das folgende Kommando zeigt zusätzlich alle dynamischen Regeln an:
+
+[source,bash]
+....
+# ipfw -d list
+....
+
+Um diese Auflistung um die "abgelaufenen" Regeln zu erweitern, geben Sie folgendes Kommando ein:
+
+[source,bash]
+....
+# ipfw -d -e list
+....
+
+Hiermit werden alle Zähler auf Null zurückgesetzt:
+
+[source,bash]
+....
+# ipfw zero
+....
+
+Es ist auch möglich, einen spezifischen Zähler zurückzusetzen:
+
+[source,bash]
+....
+# ipfw zero NUM
+....
+
+==== Protokollierung von Firewall-Nachrichten
+
+Auch bei aktivierter Protokollierung wird IPFW von selbst keine Regeln protokollieren. Der Administrator muss entscheiden, welche Regeln aus dem Regelwerk protokolliert werden sollen. In diesen Regeln muss dann das Schlüsselwort `log` hinzugefügt werden. Normalerweise werden nur geblockte Pakete protokolliert. Es ist üblich, die "ipfw default deny everything"-Regel am Ende des Regelwerks mit dem Schlüsselwort `log` zu duplizieren. Dadurch ist es möglich, alle Pakete zu sehen, auf die keine Regel zutraf.
+
+Protokollierung ist allerdings ein zweischneidiges Schwert. Bei mangelnder Vorsicht oder einem DoS-Angriff wird die Festplatte mit einer enormen Flut von Protokolldaten belastet. Protokoll-Nachrichten werden nicht nur an man:syslogd[8] geschickt, sondern auch auf der Konsole angezeigt, was dann schnell lästig werden kann.
+
+Die Kerneloption `IPFIREWALL_VERBOSE_LIMIT=5` begrenzt die Anzahl identischer Nachrichten an man:syslogd[8] für eine gegebene Regel auf fünf Nachrichten. Ist diese Option im Kernel aktiviert, wird nach Erreichen den festgelegten Anzahl die Protokollierung von aufeinanderfolgenden Nachrichten auf den festgelegten Wert begrenzt, da beispielsweise die Speicherung von 200 gleichen Protokoll-Nachrichten sinnlos ist. Daher werden durch diese Option nur fünf gleichartige Nachrichten protokolliert. Alle weiteren Nachrichten werden nur gezählt und deren Gesamtzahl wird schließlich von man:syslogd[8] wie folgt ausgegeben:
+
+[.programlisting]
+....
+Last message repeated 45 times
+....
+
+Alle protokollierten Pakete werden in der Voreinstellung in [.filename]#/var/log/security# gespeichert. Dies wird in [.filename]#/etc/syslog.conf# definiert.
+
+[[firewalls-ipfw-rules-script]]
+==== Ein Firewall-Regelwerk erstellen
+
+Die meisten fortgeschrittenen IPFW-Benutzer erzeugen eine Datei, welche die Regeln für die Firewall enthält, um diese als Skript ausführen zu können. Der Vorteil einer derartigen Konfiguration besteht darin, dass dadurch mehrere Regeln gleichzeitig geändert und aktiviert werden können, ohne dass dazu das System neu gestartet werden muss. Dies ist zudem beim Testen von Regeländerungen sehr hilfreich. Weil es sich bei der Datei um ein Skript handelt, ist es auch möglich, häufig verwendete Befehle durch Aliase zu ersetzen und diese dann in mehreren Regeln zu nutzen.
+
+Die Syntax des folgenden Skripts entspricht der Syntax von man:sh[1], man:csh[1] sowie man:tcsh[1]. Felder, die symbolisch substituiert werden, haben das Präfix $ (Dollarzeichen). Symbolische Felder haben das $-Präfix nicht. Der Wert, mit dem das symbolische Feld belegt wird, muss in doppelten Anführungszeichen ("") stehen.
+
+Die Datei mit den Regeln könnte wie folgt aufgebaut sein:
+
+[.programlisting]
+....
+############### start of example ipfw rules script #############
+#
+ipfw -q -f flush # Delete all rules
+# Set defaults
+oif="tun0" # out interface
+odns="192.0.2.11" # ISP's DNS server IP address
+cmd="ipfw -q add " # build rule prefix
+ks="keep-state" # just too lazy to key this each time
+$cmd 00500 check-state
+$cmd 00502 deny all from any to any frag
+$cmd 00501 deny tcp from any to any established
+$cmd 00600 allow tcp from any to any 80 out via $oif setup $ks
+$cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks
+$cmd 00611 allow udp from any to $odns 53 out via $oif $ks
+################### End of example ipfw rules script ############
+....
+
+Die Regeln in diesem Beispiel sind nicht wichtig. Wichtig ist es, zu zeigen, wie die symbolische Substitution innerhalb der Regeln verwendet wird.
+
+Wenn dieses Beispiel in [.filename]#etc/ipfw.rules# gespeichert wurde, so könnten alle Regeln durch die Ausführung des folgenden Kommandos neu geladen werden:
+
+[source,bash]
+....
+# sh /etc/ipfw.rules
+....
+
+Anstelle von [.filename]#/etc/ipfw.rules# kann ein beliebig anderer Name oder Speicherort verwendet werden.
+
+Alternativ können die einzelnen Befehle dieses Skripts auch von Hand eingegeben werden:
+
+[source,bash]
+....
+# ipfw -q -f flush
+# ipfw -q add check-state
+# ipfw -q add deny all from any to any frag
+# ipfw -q add deny tcp from any to any established
+# ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state
+# ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state
+# ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state
+....
+
+[[firewalls-ipfw-kernelconfig]]
+=== IPFW Kerneloptionen
+
+Um die Unterstützung für IPFW statisch in den Kernel zu kompilieren, lesen Sie die Anweisungen in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels]. Die folgenden Optionen können in der Kernelkonfigurationsdatei verwendet werden:
+
+[.programlisting]
+....
+options IPFIREWALL # enables IPFW
+options IPFIREWALL_VERBOSE # enables logging for rules with log keyword to syslogd(8)
+options IPFIREWALL_VERBOSE_LIMIT=5 # limits number of logged packets per-entry
+options IPFIREWALL_DEFAULT_TO_ACCEPT # sets default policy to pass what is not explicitly denied
+options IPFIREWALL_NAT # enables basic in-kernel NAT support
+options LIBALIAS # enables full in-kernel NAT support
+options IPFIREWALL_NAT64 # enables in-kernel NAT64 support
+options IPFIREWALL_NPTV6 # enables in-kernel IPv6 NPT support
+options IPFIREWALL_PMOD # enables protocols modification module support
+options IPDIVERT # enables NAT through natd(8)
+....
+
+[NOTE]
+====
+IPFW kann auch als Kernelmodul geladen werden: Die oben genannten Optionen werden standardmäßig als Module erstellt, oder können zur Laufzeit über Parameter festgelegt werden.
+====
+
+[[firewalls-ipf]]
+== IPFILTER (IPF)
+
+IPFILTER, auch als IPF bekannt, ist eine plattformübergreifende Open Source Firewall, die auf mehrere Betriebssysteme portiert wurde, einschließlich FreeBSD, NetBSD, OpenBSD und Solaris(TM).
+
+IPFILTER basiert auf einer kernelseitigen Firewall und einem NAT-Mechanismus, der durch Anwenderprogramme gesteuert und überwacht werden kann. Firewallregeln werden mit ipf gesetzt oder gelöscht. Für die Manipulation der NAT-Regeln wird ipnat benutzt. Mit ipfstat werden Laufzeitstatistiken der kernelseitigen Anteile von IPFILTER aufgelistet. Mit ipmon können die Aktionen von IPFILTER in Protokolldateien gespeichert werden.
+
+IPF wurde ursprünglich mit der Verarbeitungslogik "die letzte passende Regel gewinnt" geschrieben und verwendete ausschließlich Regeln ohne feste Zustände. Inzwischen wurde IPF modernisiert und unterstützt nun auch die Optionen `quick` und `keep state`.
+
+Antworten auf häufige Fragen finden Sie unter http://www.phildev.net/ipf/index.html[ http://www.phildev.net/ipf/index.html]. Ein Archiv der IPFILTER Mailingliste steht unter http://marc.info/?l=ipfilter[ http://marc.info/?l=ipfilter] zur Verfügung.
+
+Dieser Abschnitt des Handbuchs konzentriert sich auf IPF unter FreeBSD. Es werden auch Firewallregeln mit den Optionen `quick` und `keep state` vorgestellt.
+
+=== IPF aktivieren
+
+IPF ist in FreeBSD als ladbares Kernelmodul enthalten. Das bedeutet, dass Sie keinen angepassten Kernel erzeugen müssen um IPF zu aktivieren.
+
+Benutzer, die IPF lieber statisch in den Kernel kompilieren, sollten den Anweisungen in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] folgen. Die folgenden Kerneloptionen stehen zur Verfügung:
+
+[.programlisting]
+....
+options IPFILTER
+options IPFILTER_LOG
+options IPFILTER_LOOKUP
+options IPFILTER_DEFAULT_BLOCK
+....
+
+`options IPFILTER` aktiviert die Unterstützung für IPFILTER. `options IPFILTER_LOG` aktiviert die Protokollierung über die Pseudo-Schnittstelle [.filename]#ipl# für Firewallrelgen, die das Schlüsselwort `log` enthalten. `IPFILTER_LOOKUP` aktiviert IP-Pools, um die Suche nach IP-Adressen zu beschleunigen. `IPFILTER_DEFAULT_BLOCK` ändert das Verhalten der Firewall dahingehend, dass jedes Paket, das nicht explizit von einer `pass`-Regel Zugang erhält, geblockt wird.
+
+Um IPF während des Bootens zu aktivieren, müssen folgende Einträge in [.filename]#/etc/rc.conf# hinzugefügt werden. Diese Einträge aktivieren ebenfalls die Protokollierung und die Regel `default pass all`. Um diese Voreinstellung zu ändern, ohne einen neuen Kernel zu übersetzen, müssen Sie am Ende der Firewallregeln eine `block all` Regel hinzufügen.
+
+[.programlisting]
+....
+ipfilter_enable="YES" # Start ipf firewall
+ipfilter_rules="/etc/ipf.rules" # loads rules definition text file
+ipv6_ipfilter_rules="/etc/ipf6.rules" # loads rules definition text file for IPv6
+ipmon_enable="YES" # Start IP monitor log
+ipmon_flags="-Ds" # D = start as daemon
+ # s = log to syslog
+ # v = log tcp window, ack, seq
+ # n = map IP & port to names
+....
+
+Wenn die NAT-Funktionalität benötigt wird, müssen auch diese Zeilen hinzugefügt werden:
+
+[.programlisting]
+....
+gateway_enable="YES" # Enable as LAN gateway
+ipnat_enable="YES" # Start ipnat function
+ipnat_rules="/etc/ipnat.rules" # rules definition file for ipnat
+....
+
+Jetzt können Sie IPF starten:
+
+[source,bash]
+....
+# service ipfilter start
+....
+
+Um die Firewallregeln zu laden, übergeben Sie den Namen des Regelwerks an `ipf`. Mit dem folgenden Kommando ersetzen Sie alle aktuell geladenen Regeln:
+
+[source,bash]
+....
+# ipf -Fa -f /etc/ipf.rules
+....
+
+`-Fa` löscht zunächst alle internen Regeln und mit `-f` wird die Datei angegeben, welche die zu ladenen Regeln enthält.
+
+Damit haben Sie die Möglichkeit, Änderungen an der laufenden Firewall zu machen, ohne dass das System neu gestartet werden muss. Da dieser Vorgang beliebig oft wiederholt werden kann, ist es ein sehr bequemer Weg neue Regeln zu testen.
+
+Diese und weitere Optionen sind in man:ipf[8] beschrieben.
+
+=== IPF Regel-Syntax
+
+Mit der hier beschriebenen Regel-Syntax können zustandsorientierte Regeln erstellt werden. Beim Erstellen von Regeln ist zu beachten, dass Regeln ohne das Schlüsselwort `quick` der Reihe nach geprüft werden und "die letzte zutreffende Regel" angewendet wird. Das bedeutet, dass selbst dann, wenn die erste zutreffende Regel eine `pass`-Regel ist, das Paket dennoch geblockt wird, falls später eine `block`-Regel zutrifft. Beispielregelsätze finden Sie in [.filename]#/usr/shared/examples/ipfilter#.
+
+Beim Erstellen von Regeln wird das Zeichen `#` verwendet, um einen Kommentar bis zum Ende der Zeile einzuleiten. Leere Zeilen werden ignoriert.
+
+Die Schlüsselwörter, die in den Regeln verwendet werden, müssen in einer bestimmten Reihenfolge geschrieben werden, von links nach rechts. Einige Schlüsselwörter sind verbindlich, andere sind optional. Einige Schlüsselwörter haben Unteroptionen, die wiederum selbst Schlüsselwörter sind und ebenfalls weitere Unteroptionen einschließen können. Die Reihenfolge der Schlüsselwörter ist wie folgt, wobei die Wörter in Großbuchstaben eine Variable darstellen und die Wörter in Kleinbuchstaben der Variable vorangestellt werden müssen:
+
+`_ACTION DIRECTION OPTIONS proto PROTO_TYPE from SRC_ADDR SRC_PORT to DST_ADDR DST_PORT TCP_FLAG|ICMP_TYPE keep state STATE_`
+
+Dieser Abschnitt beschreibt jedes dieser Schlüsselwörter und ihre Optionen. Es ist jedoch keine vollständige Liste aller möglichen Optionen. man:ipf[5] enthält eine vollständige Beschreibung der Syntax und einige Beispiele zur Erstellung von IPF-Regeln.
+
+ACTION::
+Dieses Schlüsselwort bestimmt, was mit dem Paket zu tun ist, wenn es auf eine Regel zutrifft. Jede Regel _muss_ dieses Schlüsselwort enthalten. Die folgenden Aktionen werden erkannt:
++
+`block`: Das Paket wird verworfen.
++
+`pass`: Das Paket wird durchgelassen.
++
+`log`: Das Paket wird protokolliert.
++
+`count`: Zählt die Anzahl der Pakete und die Bytes. Die kann einen Hinweis darauf geben, wie oft Pakete auf diese Regel zutreffen.
++
+`auth`: Das Paket geht in eine Warteschlange zur Weiterverarbeitung durch ein anderes Programm.
++
+`call`: Ermöglicht den Zugriff auf eingebaute IPF-Funktionen, die komplexere Aktionen ermöglichen.
++
+`decapsulate`: Entfernt alle Header, um den Inhalt des Pakets zu verarbeiten.
+
+DIRECTION::
+Als nächstes muss für jede Regel explizit die Richtung mit einem der folgenden Schlüsselwörter angegeben werden:
++
+`in`: Die Regel wird auf ein eingehendes Paket angewendet.
++
+`out`: Die Regel wird auf ein ausgehendes Paket angewendet.
++
+`all`: Die Regel gilt für beide Richtungen.
++
+Wenn das System mehrere Schnittstellen ausweist, kann die Schnittstelle zusammen mit der Richtung angegeben werden. Ein Beispiel wäre `in on fxp0`.
+
+OPTIONS::
+Optionen müssen nicht zwingend angegeben werden. Falls jedoch mehrere Optionen angegeben werden, müssen sie in der hier gezeigten Reihenfolge verwendet werden.
++
+`log`: Wenn die Firewall die angegebene Aktion durchführt, werden die Kopfdaten des Pakets auf der Pseudo-Schnittstelle man:ipl[4] protokolliert.
++
+`quick`: Wenn ein Paket mit dieser Regel übereinstimmt, wird die Aktion für diese Regel ausgeführt und die Regelprüfung stoppt an dieser Stelle.
++
+`on`: Auf dieses Schlüsselwort muss der Name der Schnittstelle folgen. Die Regel trifft nur dann zu, wenn das Paket auf der angegebenen Schnittstelle in die angegebene Richtung geht.
++
+Wenn das Schlüsselwort `log` verwendet wird, können die folgenden Ausdrücke in dieser Reihenfolge benutzt werden:
++
+`body`: die ersten 128 Bytes des Paketinhaltes werden zusätzlich zu den Kopfdaten protokolliert.
++
+`first`: trifft nur zu, wenn das Schlüsselwort `log` zusammen mit `keep-state` verwendet wird. Es bestimmt, dass nur das auslösende Paket protokolliert wird und nicht jedes weitere Paket, dass von der gespeicherten Status-Regel betroffen ist.
++
+Es stehen noch weitere Optionen zur Rückmeldung von Fehlern verfügbar. Ausführliche Details finden Sie in man:ipf[5].
+
+PROTO_TYPE::
+Der Protokolltyp ist optional. Er ist jedoch zwingend erforderlich, falls die Regel einen SRC_PORT oder DST_PORT angeben muss da es den Typ des Protokolls bestimmt. Wenn Sie das Protokoll angeben, verwenden Sie das Schlüsselwort `proto`, gefolgt von der Protokollnummer oder dem Namen aus [.filename]#/etc/protocols#. Zum Beispiel `tcp`, `udp`, oder `icmp`. Wenn PROTO_TYPE angegeben wird und SCR_PORT oder DST_PORT ausgelassen werden, stimmen alle Portnummern für dieses Protokoll mit dieser Regel überein.
+
+SRC_ADDR::
+Das Schlüsselwort `from` ist verpflichtend und darauf folgt das Schlüsselwort, das die Quelle des Pakets darstellt. Die Quelle kann ein Rechnername, eine IP-Adresse gefolgt von der CIDR-Maske, ein Adresspool oder das Schlüsselwort `all` sein. man:ipf[5] enthält einige Beispiele.
++
+IP-Bereiche können nur in der CIDR-Notation angegeben werden. Der Port oder das Paket package:net-mgmt/ipcalc[] hilft bei der Berechnung der richtigen CIDR-Maske. Weiterführende Informationen finden Sie auf der Webseite http://jodies.de/ipcalc[ http://jodies.de/ipcalc].
+
+SCR_PORT::
+Die Portnummer der Quelle ist optional. Wenn sie jedoch verwendet wird, muss in der Regel zuerst PROTO_TYPE angegeben werden. Die Portnummer muss auch auf das Schlüsselwort `proto` folgen.
++
+Es werden verschiedene Vergleichsoperatoren unterstützt: `=` (gleich), `!=` (nicht gleich), `<` (kleiner als), `>` (größer als), `<=` (kleiner als oder gleich) `>=` (größer als oder gleich).
++
+Um Portbereiche anzugeben, schreiben Sie zwei Portnummern zwischen `<>` (kleiner als und größer als), `><` (größer als und kleiner als), oder `:` (größer als oder gleich und kleiner als oder gleich).
+
+DST_ADDR::
+Das Schlüsselwort `to` ist verpflichtend und darauf folgt das Schlüsselwort, welches das Ziel des Pakets darstellt. Dieses Ziel kann ein Rechnername, eine IP-Adresse gefolgt von der CIDR-Maske, ein Adresspool oder das Schlüsselwort `all` sein.
+
+DST_PORT::
+Die Portnummer des Ziels ist optional. Wenn sie jedoch verwendet wird, muss in der Regel zuerst PROTO_TYPE angegeben werden. Die Portnummer muss auch auf das Schlüsselwort `proto` folgen.
+
+TCP_FLAG|ICMP_TYPE::
+Wenn `tcp` als PROTO_TYPE verwendet wird, können bestimmte TCP-Flags angegeben werden, die den Zustand einer Verbindung bestimmen. Mögliche Flags sind: `S` (SYN), `A` (ACK), `P` (PSH), `F` (FIN), `U` (URG), `R` (RST), `C` (CWN) und `E` (ECN).
++
+Wenn `icmp` als PROTO_TYPE verwendet wird, kann der ICMP-Typ mit angegeben werden. man:ipf[5] enthält eine Auflistung der zulässigen Typen.
+
+STATE::
+Wenn eine `pass`-Regel das Schlüsselwort `keep state` enthält, wird IPF einen Eintrag in der dynamischen Zustandstabelle hinzufügen, damit nachfolgende Pakete dieser Verbindung ebenfalls durchgelassen werden. IPF kann den Zustand für TCP, UDP und ICMP-Sitzungen verfolgen. IPF wird jedes Paket, das zu einer aktiven Sitzung gehört, durchlassen, auch wenn ein anderes Protokoll verwendet wird.
++
+Pakete, die über die Schnittstelle zum öffentlichen Internet raus gehen, werden von IPF zuerst gegen die dynamische Zustandstabelle geprüft. Wenn das nächste Paket dieser aktiven Sitzung mit dem vorherigen Paket übereinstimmt, verlässt dieses Paket die Firewall und der Status wird in der dynamischen Zustandstabelle aktualisiert. Pakete, die nicht zu einer aktiven Sitzung gehören, werden gegen ausgehende Regeln geprüft. Eingehende Pakete von der Schnittstelle zum öffentlichen Internet werden gegen die dynamische Zustandstabelle geprüft. Wenn das nächste Paket mit der aktiven Sitzung übereinstimmt, verlässt dieses Paket die Firewall und der Status wird in der dynamischen Zustandstabelle aktualisiert. Pakete, die nicht zu einer aktiven Sitzung gehören, werden gegen eingehende Regeln geprüft.
++
+Mehrere Schlüsselwörter können an `keep state` angefügt werden. Bei der Verwendung dieser Schlüsselwörter werden verschiedene Optionen gesetzt, um die zustandsorientierte Filterung zu steuern. man:ipf[5] enthält eine Liste der verfügbaren Optionen und deren Beschreibungen.
+
+=== Beispielregelsatz
+
+Dieser Abschnitt beschreibt die Erstellung eines Regelsatzes, welcher nur entsprechende Dienste erlaubt und alle anderen Verbindungen blockiert.
+
+FreeBSD verwendet die Loopback-Schnittstelle ([.filename]#lo0#) und die IP-Adresse `127.0.0.1` zur internen Kommunikation. Der Regelsatz muss Regeln enthalten, die Pakete für diesen internen Verkehr ermöglichen:
+
+[.programlisting]
+....
+# no restrictions on the loopback interface
+pass in quick on lo0 all
+pass out quick on lo0 all
+....
+
+Die mit dem Internet verbundene Schnittstelle wird für die Autorisierung und den Zugriff aller ein- und ausgehenden Verbindungen verwendet. Wenn eine oder mehrere Schnittstellen mit privaten Netzwerken verbunden sind, müssen Regeln existieren, die den Datenverkehr aus dem LAN zwischen den internen Netzwerken oder ins Internet erlauben. Der Regelsatz sollte in drei Bereiche unterteilt werden: vertrauenswürdige interne Schnittstellen, ausgehende Verbindungen über die öffentlichen Schnittstellen und eingehende Verbindungen über die öffentliche Schnittstelle.
+
+Diese beiden Regeln erlauben den gesamten Datenverkehr über eine vertrauenswürdige LAN-Schnittstelle namens [.filename]#xl0#:
+
+[.programlisting]
+....
+# no restrictions on inside LAN interface for private network
+pass out quick on xl0 all
+pass in quick on xl0 all
+....
+
+Die Regeln für den ein- und ausgehenden Verkehr der öffentlichen Schnittstelle sollten in einer bestimmten Reihenfolge geschrieben werden. Zuerst Regeln, die häufiger übereinstimmen, danach Regeln, die seltener übereinstimmen. Die letzte Regel blockiert und protokolliert alle Pakete auf der Schnittstelle.
+
+Der folgende Regelsatz definiert die ausgehenden Regeln der öffentlichen Schnittstelle [.filename]#dc0#. Die Regeln prüfen den Zustand und identifizieren bestimmte Dienste, auf die die internen Systeme zugreifen dürfen. Alle Regeln verwenden das Schlüsselwort `quick` und geben die passenden Portnummern und ggf. auch die Zieladressen an.
+
+[.programlisting]
+....
+# interface facing Internet (outbound)
+# Matches session start requests originating from or behind the
+# firewall, destined for the Internet.
+
+# Allow outbound access to public DNS servers.
+# Replace x.x.x. with address listed in /etc/resolv.conf.
+# Repeat for each DNS server.
+pass out quick on dc0 proto tcp from any to x.x.x. port = 53 flags S keep state
+pass out quick on dc0 proto udp from any to xxx port = 53 keep state
+
+# Allow access to ISP's specified DHCP server for cable or DSL networks.
+# Use the first rule, then check log for the IP address of DHCP server.
+# Then, uncomment the second rule, replace z.z.z.z with the IP address,
+# and comment out the first rule
+pass out log quick on dc0 proto udp from any to any port = 67 keep state
+#pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state
+
+# Allow HTTP and HTTPS
+pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state
+pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state
+
+# Allow email
+pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state
+pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state
+
+# Allow NTP
+pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state
+
+# Allow FTP
+pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state
+
+# Allow SSH
+pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state
+
+# Allow ping
+pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state
+
+# Block and log everything else
+block out log first quick on dc0 all
+....
+
+Die folgenden Beispielregeln für den eingehenden Verkehr auf der öffentlichen Schnittstelle blockieren zuerst alle unerwünschten Pakete. Dies reduziert die Anzahl der Pakete, die durch die letzte Regel protokolliert werden.
+
+[.programlisting]
+....
+# interface facing Internet (inbound)
+# Block all inbound traffic from non-routable or reserved address spaces
+block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 private IP
+block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 private IP
+block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 private IP
+block in quick on dc0 from 127.0.0.0/8 to any #loopback
+block in quick on dc0 from 0.0.0.0/8 to any #loopback
+block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-config
+block in quick on dc0 from 192.0.2.0/24 to any #reserved for docs
+block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect
+block in quick on dc0 from 224.0.0.0/3 to any #Class D & E multicast
+
+# Block fragments and too short tcp packets
+block in quick on dc0 all with frags
+block in quick on dc0 proto tcp all with short
+
+# block source routed packets
+block in quick on dc0 all with opt lsrr
+block in quick on dc0 all with opt ssrr
+
+# Block OS fingerprint attempts and log first occurrence
+block in log first quick on dc0 proto tcp from any to any flags FUP
+
+# Block anything with special options
+block in quick on dc0 all with ipopts
+
+# Block public pings and ident
+block in quick on dc0 proto icmp all icmp-type 8
+block in quick on dc0 proto tcp from any to any port = 113
+
+# Block incoming Netbios services
+block in log first quick on dc0 proto tcp/udp from any to any port = 137
+block in log first quick on dc0 proto tcp/udp from any to any port = 138
+block in log first quick on dc0 proto tcp/udp from any to any port = 139
+block in log first quick on dc0 proto tcp/udp from any to any port = 81
+....
+
+Wenn eine Regel mit der Option `log first` protokolliert wird, können Sie mit `ipfstat -hio` prüfen, wie viele Übereinstimmungen es für diese Regel gibt. Eine große Anzahl von Übereinstimmungen kann darauf hindeuten, dass das System angegriffen wird.
+
+Die restlichen Regeln definieren, welche Verbindungen aus dem Internet kommend hergestellt werden dürfen. Die letzte Regel blockiert alle Verbindungen, die nicht ausdrücklich von vorhergehenden Regeln erlaubt wurden.
+
+[.programlisting]
+....
+# Allow traffic in from ISP's DHCP server. Replace z.z.z.z with
+# the same IP address used in the outbound section.
+pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state
+
+# Allow public connections to specified internal web server
+pass in quick on dc0 proto tcp from any to x.x.x.x port = 80 flags S keep state
+
+# Block and log only first occurrence of all remaining traffic.
+block in log first quick on dc0 all
+....
+
+=== NAT Konfiguration
+
+Um NAT zu aktivieren, fügen Sie folgende Zeilen in [.filename]#/etc/rc.conf# hinzu. Geben Sie den Namen der Datei an, welche die NAT-Regeln enthält:
+
+[.programlisting]
+....
+gateway_enable="YES"
+ipnat_enable="YES"
+ipnat_rules="/etc/ipnat.rules"
+....
+
+NAT-Regeln sind sehr flexibel, um den Bedürfnissen von kommerziellen Anwendern und Heimanwendern gerecht zu werden. Die hier vorgestellte Regelsyntax wurde vereinfacht, um die gemeinsame Nutzung zu demonstrieren. Eine vollständige Beschreibung der Syntax finden Sie in man:ipnat[5].
+
+Die grundlegende Syntax für eine NAT-Regel ist wie folgt. `map` leitet die Regel ein und `IF` sollte durch den Namen der externen Schnittstelle ersetzt werden:
+
+[.programlisting]
+....
+map IF LAN_IP_RANGE -> PUBLIC_ADDRESS
+....
+
+`_LAN_IP_RANGE_` ist ein Bereich von IP-Adressen, der von den internen Rechnern verwendet wird. In der Regel ist dies ein privater Bereich, beispielsweise `192.168.1.0/24`. `_PUBLIC_ADDRESS_` kann entweder eine statische externe IP-Adresse sein, oder das Schlüsselwort `0/32`, welches der zugewiesenen IP-Adresse für _IF_ entspricht.
+
+Wenn ein Paket aus dem LAN mit einem öffentlichen Ziel an der IPF Firewall ankommt, werden zunächst die Regeln für den ausgehenden Verkehr geprüft. Danach wird das Paket an das NAT-Regelwerk geleitet, wo es von oben nach unten gelesen und geprüft wird, wobei die erste übereinstimmende Regel gewinnt. IPF testet jede NAT-Regel gegen die Schnittstelle und die Quell-IP-Adresse des Pakets. Wenn der Schnittstellenname des Pakets mit einer NAT-Regel übereinstimmt, wird geprüft, ob die Quell-IP-Adresse des Pakets auf den Bereich in `_LAN_IP_RANGE_` passt. Wenn dies der Fall ist, wird die Quell-IP-Adresse des Pakets mit der Adresse aus `_PUBLIC_ADDRESS_` überschrieben. IPF speichert die Einträge in seiner internen NAT-Tabelle, so dass wenn das Paket aus dem Internet zurückkehrt, es der ursprünglichen privaten IP-Adresse zugeordnet werden kann, bevor es von den weiteren Firewallregeln geprüft wird.
+
+Bei Netzwerken mit einer großen Anzahl von Systemen oder mehreren Subnetzen, steigert sich der Ressourcenverbrauch für das Umschreiben der IP-Adressen. Es existieren zwei Methoden, um dieses Problem zu umgehen.
+
+Bei der ersten Methode wird ein Portbereich definiert, der für die Quell-Ports verwendet wird. Durch das Hinzufügen des Schlüsselworts `portmap` kann NAT angewiesen werden, nur Quell-Ports aus dem angegebenen Bereich zu benutzen:
+
+[.programlisting]
+....
+map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000
+....
+
+Alternativ kann das Schlüsselwort `auto` verwendet werden. Dadurch ermittelt NAT selbstständig die zur Verfügung stehenden Ports:
+
+[.programlisting]
+....
+map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto
+....
+
+Mit der zweiten Methode wird ein Pool von öffentlichen Adressen verwendet. Dies ist nützlich, wenn es viele Systeme im Netzwerk gibt und ein Block öffentlicher IP-Adressen verfügbar ist. Aus diesem Pool kann NAT dann IP-Adressen für die ausgehenden Pakete auswählen.
+
+Der Bereich der öffentlichen IP-Adressen kann mit einer Netzmaske oder der CIDR-Notation festgelegt werden. Die folgenden Regeln sind identisch:
+
+[.programlisting]
+....
+map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0
+map dc0 192.168.1.0/24 -> 204.134.75.0/24
+....
+
+Es ist gängige Praxis, öffentlich zugängliche Web- oder Mail-Server getrennt von den internen Netzwerksegmenten zu betreiben. Der Verkehr von diesen Servern muss dennoch von NAT bearbeitet werden und die Portumleitung ist erforderlich, um den eingehenden Datenverkehr an den richtigen Server zu leiten. Verwenden Sie beispielsweise folgende Regel, um den eingehenden Verkehr auf der öffentlichen IP-Adresse `20.20.20.5` dem internen Server mit der Adresse `10.0.10.25` zuzuordnen:
+
+[.programlisting]
+....
+rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80
+....
+
+Wenn dies der einzige Webserver im Netz ist, würde auch folgende Regel funktionieren, die alle HTTP-Anfragen an `10.0.10.25` umleitet:
+
+[.programlisting]
+....
+rdr dc0 0.0.0.0/0 port 80 -> 10.0.10.25 port 80
+....
+
+IPF enthält einen FTP-Proxy, der zusammen mit NAT benutzt werden kann. Dieser Proxy überwacht den ausgehenden Datenverkehr für aktive und passive Verbindungsanfragen und erstellt dynamische Filterregeln, welche die Portnummern des jeweiligen FTP-Datenkanal enthalten. Dadurch entfällt die Notwendigkeit, viele Ports für FTP-Verbindungen zu öffnen.
+
+In diesem Beispiel verwendet die erste Regel den Proxy für ausgehende FTP-Verbindungen aus dem internen LAN. Die zweite Regel übergibt den FTP-Datenverkehr von der Firewall an das Internet und die dritte Regel handhabt den restlichen Datenverkehr aus dem internen LAN:
+
+[.programlisting]
+....
+map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp
+map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp
+map dc0 10.0.10.0/29 -> 0/32
+....
+
+FTP `map`-Regeln stehen vor den NAT-Regeln. Wenn ein Paket mit der FTP-Regel übereinstimmt, erstellt der FTP-Proxy eine temporäre Filterregel, damit die Pakete durchgelassen und von NAT verarbeitet werden können. Alle Pakte aus dem LAN, die nicht für FTP bestimmt sind, werden von NAT verarbeitet, wenn sie mit der dritten Regel übereinstimmen.
+
+Ohne den FTP-Proxy würden stattdessen folgende Regeln benötigt. Beachten Sie, dass ohne den Proxy alle Ports oberhalb von `1024` freigegeben werden müssen:
+
+[.programlisting]
+....
+# Allow out LAN PC client FTP to public Internet
+# Active and passive modes
+pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state
+
+# Allow out passive mode data channel high order port numbers
+pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state$
+# Active mode let data channel in from FTP server
+pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state
+....
+
+Nachdem die Datei mit den NAT-Regeln bearbeitet wurde, führen Sie `ipnat` mit `-CF` aus, um die aktuellen NAT-Regeln und den Inhalt der dynamischen Zuordnungstabelle zu löschen. Geben Sie `-f` zusammen mit dem NAT-Regelsatz an:
+
+[source,bash]
+....
+# ipnat -CF -f /etc/ipnat.rules
+....
+
+Statistiken zu NAT lassen sich wie folgt anzeigen:
+
+[source,bash]
+....
+# ipnat -s
+....
+
+Die aktuellen Zuordnungen der NAT-Tabelle geben Sie mit diesem Kommando aus:
+
+[source,bash]
+....
+# ipnat -l
+....
+
+Ausführliche Informationen erhalten Sie mit:
+
+[source,bash]
+....
+# ipnat -v
+....
+
+=== IPF Statistiken
+
+IPF enthält mit man:ipfstat[8] ein Werkzeug, mit dem Statistiken abgerufen und angezeigt werden können. Die Zahlen beziehen sich auf den Zeitpunkt, an dem die Firewall zuletzt gestartet wurde, beziehungsweise die Statistik mit `ipf -Z` zurückgesetzt wurde.
+
+Die Ausgabe von `ifstat` sieht in etwa wie folgt aus:
+
+[source,bash]
+....
+input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0
+output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0
+input packets logged: blocked 99286 passed 0
+output packets logged: blocked 0 passed 0
+packets logged: input 0 output 0
+log failures: input 3898 output 0
+fragment state(in): kept 0 lost 0
+fragment state(out): kept 0 lost 0
+packet state(in): kept 169364 lost 0
+packet state(out): kept 431395 lost 0
+ICMP replies: 0 TCP RSTs sent: 0
+Result cache hits(in): 1215208 (out): 1098963
+IN Pullups succeeded: 2 failed: 0
+OUT Pullups succeeded: 0 failed: 0
+Fastroute successes: 0 failures: 0
+TCP cksum fails(in): 0 (out): 0
+Packet log flags set: (0)
+....
+
+Es stehen viele Optionen zur Verfügung. Wird entweder `-i` (eingehend) oder `-o` (ausgehend) angegeben, wird der Befehl die entsprechende Liste mit den derzeit vom Kernel benutzten Filterregeln anzeigen. Um auch die Regelnummern zu sehen, muss `-n` angegeben werden. Zum Beispiel zeigt `ipfstat -on` die Tabelle für ausgehende Regeln und die Regelnummer an:
+
+[source,bash]
+....
+@1 pass out on xl0 from any to any
+@2 block out on dc0 from any to any
+@3 pass out quick on dc0 proto tcp/udp from any to any keep state
+....
+
+Wenn Sie der Regel ein `-h` voranstellen, wird der Zähler für die jeweilige Regel ausgegeben. Zum Beispiel gibt `ipfstat -oh` die ausgehenden Regeln inklusive der Zähler aus:
+
+[source,bash]
+....
+2451423 pass out on xl0 from any to any
+354727 block out on dc0 from any to any
+430918 pass out quick on dc0 proto tcp/udp from any to any keep state
+....
+
+Benutzen Sie `ipfstat -t` um die Zustandstabelle in einem man:top[1] ähnlichen Format anzuzeigen. Unterliegt die Firewall einem Angriff, bietet diese Option die Möglichkeit, die entsprechenden Pakete zu identifizieren. Mit den optionalen Flags können IP-Adressen, Ports oder Protokolle in Echtzeit überwacht werden. Lesen Sie man:ipfstat[8] für weitere Informationen.
+
+=== IPF Protokollierung
+
+IPF enthält mit `ipmon` ein Werkzeug, mit dem die Protokolle der Firewall in menschenlesbarer Form gespeichert werden können. Dies erfordert jedoch, dass `options IPFILTER_LOG` in die Kernelkonfigurationsdatei hinzugefügt wird. Folgen Sie dazu den Anweisungen in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels].
+
+Um eine kontinuierliche Protokolldatei bereitzustellen, läuft dieses Kommando normalerweise im Daemon-Modus, damit auch ältere Ereignisse nachverfolgt werden können. Da FreeBSD mit man:syslogd[8] ein Werkzeug besitzt, das automatisch Protokolldateien rotiert, wird in der Voreinstellung für `ipmon_flags -Ds` in [.filename]#rc.conf# verwendet:
+
+[.programlisting]
+....
+ipmon_flags="-Ds" # D = start as daemon
+ # s = log to syslog
+ # v = log tcp window, ack, seq
+ # n = map IP & port to names
+....
+
+Protokollierung bietet die im Nachhinein die Möglichkeit festzustellen, welche Pakete verworfen wurden, von welchen Adressen diese Pakete kamen und wohin sie gehen sollten. Diese Informationen sind hilfreich beim Aufspüren von Angreifern.
+
+Nachdem die Protokollierung in [.filename]#/etc/rc.conf# aktiviert und mit `service ipmon start` gestartet wurde, wird IPF Regeln aufzeichnen, welche das Schlüsselwort `log` enthalten. Der Firewalladministrator entscheidet, welche Regeln protokolliert werden. In der Regel werden nur geblockte Pakete protokolliert. Es ist üblich, das Schlüsselwort `log` in der letzten Regel des Regelsatzes mit aufzunehmen. Dies macht es möglich, alle Pakete zu sehen, die mit keiner Regel des Regelsatzes übereinstimmten.
+
+In der Voreinstellung verwendet `ipmon -Ds local0` als Protokoll-Facility. Die folgenden Level können verwendet werden, um die erfassten Daten weiter aufzuspalten:
+
+[source,bash]
+....
+LOG_INFO - packets logged using the "log" keyword as the action rather than pass or block.
+LOG_NOTICE - packets logged which are also passed
+LOG_WARNING - packets logged which are also blocked
+LOG_ERR - packets which have been logged and which can be considered short due to an incomplete header
+....
+
+Damit IPF alle Daten protokolliert, legen Sie zunächst eine neue Datei [.filename]#/var/log/ipfilter.log# an:
+
+[source,bash]
+....
+# touch /var/log/ipfilter.log
+....
+
+Um alle Nachrichten in der angegebenen Datei zu protokollieren, fügen Sie den folgenden Eintrag in [.filename]#/etc/syslog.conf# ein:
+
+[.programlisting]
+....
+local0.* /var/log/ipfilter.log
+....
+
+Führen Sie `service syslogd reload` aus, damit man:syslogd[8] [.filename]#/etc/syslog.conf# neu einliest, um die Änderungen zu aktivieren.
+
+Denken Sie daran, auch [.filename]#/etc/newsyslog.conf# anzupassen, damit das neue Protokoll rotiert wird.
+
+Die von `ipmon` generierten Nachrichten bestehen aus Daten, welche durch Leerzeichen getrennt sind. Alle Nachrichten enthalten die folgenden Felder:
+
+. Das Datum, an dem das Paket empfangen wurde.
+. Die Uhrzeit, wann das Paket empfangen wurde. Das Format ist HH:MM:SS.F (Stunden, Minuten, Sekunden und Sekundenbruchteile).
+. Der Name der Schnittstelle, die das Paket verarbeitet hat.
+. Die Gruppen- und Regelnummer im Format `@0:17`.
+. Die Aktion: `p` für durchgelassene Pakete, `b` für blockierte Pakete, `S` für kurze Pakete, `n` für Pakete auf die keine Regel zutraf und `L` für Pakete die protokolliert wurden.
+. Die Adressen werden in drei Felder unterteilt: die Quelladresse und der Port getrennt durch Komma, das Zeichen ->, sowie die Zieladresse und Port. Zum Beispiel `209.53.17.22,80 -> 198.72.220.17,1722`.
+. `PR`, gefolgt vom Namen oder Nummer des Protokolls. Zum Beispiel `PR tcp`.
+. `len`, gefolgt von der Größe des Headers und der Gesamtgröße des Pakets. Zum Beispiel `len 20 40`.
+
+Wenn es sich beim dem Paket um ein TCP-Paket handelt, gibt es ein zusätzliches Feld, das mit einem Bindestrich beginnt und die Buchstaben der entsprechenden Flags enthält. Eine Liste der Flags und deren Buchstaben finden Sie in man:ipf[5].
+
+Wenn es sich beim dem Paket um ein ICMP-Paket handelt, gibt es zwei zusätzliche Felder: das erste Feld ist immer "icmp" und das zweite Feld enthält die ICMP-Nachricht und den Nachrichten-Code, getrennt durch einen Schrägstrich. Beispielswiese `icmp 3/3` für die Nachricht Port unreachable.
+
+[[firewalls-blacklistd]]
+== Blacklistd
+
+Blacklistd ist ein Daemon der auf Sockets lauscht, um Benachrichtigungen von anderen Daemons über fehlgeschlagene oder erfolgreiche Verbindungsversuche zu erhalten. Dieser Daemon wird häufig verwendet, um zu viele Verbindungsversuche auf offenen Ports zu blockieren. Ein Beispiel ist SSH, das viele Anfragen von Bots oder Skripten erhält, die versuchen, Passwörter zu erraten und Zugriff zu erhalten. Mit Hilfe von blacklistd kann der Daemon die Firewall benachrichtigen, eine Filterregel zu erstellen, um übermäßige Verbindungsversuche einer einzigen Quelle nach einer Reihe von Versuchen zu blockieren. Blacklistd wurde ursprünglich auf NetBSD entwickelt und erschien dort in der Version 7. FreeBSD 11 hat blacklistd von NetBSD importiert.
+
+In diesem Kapitel wird die Einrichtung und Konfiguration von blacklistd besprochen. Sie finden aber auch Beispiele für die Verwendung von blacklistd. Sie sollten allerdings mit grundlegenden Firewall-Konzepten wie Filterregeln vertraut sein. Weitere Informationen finden Sie im Kapitel Firewalls. In diesen Beispielen wird PF benutzt, aber auch andere unter FreeBSD verfügbare Firewalls sollten in der Lage sein mit blacklistd zusammen zu arbeiten.
+
+=== Blacklistd aktivieren
+
+Die Konfiguration für blacklistd wird in man:blacklistd.conf[5] gespeichert. Um das Laufzeitverhalten von blacklistd zu beeinflussen, sind verschiedene Kommandozeilenoptionen verfügbar. Die permanente Konfiguration über Neustarts hinweg sollte in [.filename]#/etc/blacklistd.conf# gespeichert werden. Um den Daemon während des Systemstarts zu aktivieren, fügen Sie eine Zeile `blacklistd_enable` in [.filename]#/etc/rc.conf# hinzu:
+
+[source,bash]
+....
+# sysrc blacklistd_enable=yes
+....
+
+Sie können den Daemon auch manuell starten:
+
+[source,bash]
+....
+# service blacklistd start
+....
+
+=== Erstellen von Blacklistd-Regeln
+
+Die Regeln für blacklistd werden in man:blacklistd.conf[5] mit einem Eintrag pro Zeile konfiguriert. Jede Regel enthält ein Tupel, das durch Leerzeichen oder Tabulator getrennt ist. Eine Regel gilt entweder für einen lokalen oder einen entfernten Rechner.
+
+==== Lokale Regeln
+
+Ein typischer Eintrag für eine lokale Regel in [.filename]#/etc/blacklistd.conf# sieht wie folgt aus:
+
+[.programlisting]
+....
+[local]
+ssh stream * * * 3 24h
+....
+
+Alle Regeln, die dem Abschnitt `[local]` folgen, werden als lokale Regeln behandelt, die für den lokalen Rechner gelten. In einem `[remote]`-Abschnitt gelten alle Regeln für entfernte Maschinen.
+
+Die sieben Felder einer Regel werden entweder durch Tabulator oder Leerzeichen getrennt. Die ersten vier Felder identifizieren den Netzwerkverkehr, welcher geblockt werden soll. Die drei folgenden Felder definieren das Verhalten von blacklistd. Wildcards werden mit einem Sternchen (`*`) gekennzeichnet und stimmen mit allen anderen in diesem Feld überein. Das erste Feld definiert den Standort. In den lokalen Regeln sind dies die Ports. Die Syntax ist wie folgt:
+
+[.programlisting]
+....
+[address|interface][/mask][:port]
+....
+
+Adressen können als IPv4 im numerischen Format oder IPv6 in eckigen Klammern angegeben werden. Ebenfalls kann der Name der Schnittstelle wie `_em0_` verwendet werden.
+
+Im zweiten Feld wird der Socket-Typ definiert. TCP-Sockets sind vom Typ `stream`, wohingegen UDP als `dgram` bezeichnet wird. Das obige Beispiel verwendet TCP, weil SSH dieses Protokoll benutzt.
+
+Im dritten Feld kann ein Protokoll definiert werden. Die folgenden Protokolle können verwendet werden: `tcp`, `udp`, `tcp6`, `udp6` oder numerisch. Eine Wildcard, wie im Beispiel, wird typischerweise verwendet, um alle Protokolle abzubilden, es sei denn, es gibt einen Grund, den Verkehr nach einem bestimmten Protokoll zu differenzieren.
+
+Im vierten Feld wird der effektive Benutzer oder Eigentümer des Daemon-Prozesses definiert, welcher das Ereignis meldet. Hier kann der Benutzer oder die UID sowie eine Wildcard verwendet werden (siehe Beispiel oben).
+
+Der Name der Firewallregel wird im fünften Feld definiert. In der Voreinstellung setzt blacklistd alle geblockten Pakete unter einen pf-Anker namens `blacklistd` in [.filename]#pf.conf# wie folgt:
+
+[.programlisting]
+....
+anchor "blacklistd/*" in on $ext_if
+block in
+pass out
+....
+
+Für separate Blacklists kann in diesem Feld ein Ankername benutzt werden. In anderen Fällen genügt eine Wildcard. Ein Name mit vorangestelltem Bindestrich (`-`) bedeutet, das ein Anker mit dem voreingestellten Regelnamen verwendet werden sollte. Ein modifiziertes Beispiel von oben mit dem Bindestrich würde so aussehen:
+
+[.programlisting]
+....
+ssh stream * * -ssh 3 24h
+....
+
+Mit einer solchen Regel werden alle neuen Blacklistregeln zu einem Anker namens `blacklistd-ssh` hinzugefügt.
+
+Um ganze Subnetze für eine einzelne Regelverletzung zu blockieren, kann ein `/` im Regelnamen benutzt werden. Dadurch wird der verbleibende Teil des Namens als Maske interpretiert, die auf die in der Regel angegebene Adresse angewendet wird. Diese Regel würde beispielsweise jede Adresse blockieren, die an `/24` angrenzt:
+
+[.programlisting]
+....
+22 stream tcp * */24 3 24h
+....
+
+[NOTE]
+====
+Es ist wichtig, hier das richtige Protokoll anzugeben. IPv4 und IPv6 behandeln `/24` unterschiedlich, deshalb kann `*` im dritten Feld für diese Regel nicht benutzt werden.
+====
+
+Diese Regel bewirkt, dass, wenn ein Rechner in diesem Netzwerk wegen seines Verhaltens blockiert wird, auch alle anderen Rechner aus diesem Netzwerk blockiert werden.
+
+Das sechste Feld, genannt `nfail`, legt die Anzahl der Anmeldeversuche fest, die erforderlich sind, um die betreffende IP auf die Blacklist zu setzen. Eine Wildcard an dieser Stelle bedeutet, dass niemals geblockt wird. Im obigen Beispiel ist eine Anzahl von 3 definiert, was bedeutet, dass die IP nach drei fehlgeschlagenen Anmeldeversuchen über SSH gesperrt wird.
+
+Das letzte Feld in der Regel gibt an, wie lange ein Rechner auf der Blacklist steht. Die Standardeinheit ist Sekunden, aber Suffixe wie `m` (Minuten), `h` (Stunden) und `d` (Tage) können auch angegeben werden.
+
+Die Regel im Beispiel besagt, dass nach dreimaliger Authentifizierung über SSH eine neue PF-Regel für diesen Rechner angelegt wird. Beim Überprüfen der Regeln werden zuerst lokale Regeln, von sehr spezifisch bis am wenigsten spezifisch, geprüft. Wenn eine Übereinstimmung auftritt, werden die `remote`-Regeln angewendet und die Felder `name`, `nfail` und `disable` werden durch die entsprechende `remote`-Regel geändert.
+
+==== Remote-Regeln
+
+Mit Remote-Regeln wird das Verhalten von blacklistd, in Abhängigkeit vom aktuell ausgewerteten Remote-Rechner, festgelegt. Die einzelnen Felder einer Remote-Regel sind identisch mit den Feldern einer lokalen Regel. Der einzige Unterschied besteht darin, wie blacklistd sie verwendet. Zur besseren Verständlichkeit wird folgende Regel benutzt:
+
+[.programlisting]
+....
+[remote]
+203.0.113.128/25 * * * =/25 = 48h
+....
+
+Das Adressfeld kann eine IP-Adresse (entweder v4 oder v6), einen Port oder beides beinhalten. Dies ermöglicht es, wie in diesem Beispiel, spezielle Regeln für einen bestimmten entfernten Adressbereich festzulegen. Die Felder für den Socket-Typ, Protokoll und Besitzer werden genauso wie in den lokalen Regeln interpretiert.
+
+Die Felder für den Namen sind jedoch unterschiedlich. Das Gleichheitszeichen (`=`) in einer Remote-Regel weist blacklistd an, den Wert aus der entsprechenden lokalen Regel zu verwenden. Das bedeutet, dass der Eintrag der Firewall-Regel übernommen und das Präfix `/25` (eine Netzmaske von `255.255.255.128`) hinzugefügt wird. Wenn eine Verbindung aus diesem Adressbereich geblockt wird, ist das gesamte Subnetz betroffen. Ein PF-Ankername kann auch hier verwendet werden. In diesem Fall fügt blacklistd Regeln für diesen Adressbereich dem Namen des Ankers hinzu. Die Standardtabelle wird verwendet, wenn eine Wildcard angegeben wird.
+
+Für eine Adresse kann im Feld `nfail` die Anzahl von Fehlversuchen definiert werden. Dies ist nützlich für Ausnahmen, um weniger strenge Anwendungen zu ermöglichen, oder um Anmeldeversuche ein wenig nachsichtiger zu gestalten. Die Sperrung wird aufgehoben, wenn im sechsten Feld eine Wildcard benutzt wird.
+
+Remote-Regeln ermöglichen eine strengere Durchsetzung der Beschränkungen bei Anmeldeversuchen im Vergleich zu Anmeldeversuchen die aus dem lokalen Netzwerk kommen.
+
+=== Blacklistd Client Konfiguration
+
+Es gibt einige Softwarepakete in FreeBSD, die die Funktionalität von blacklistd nutzen können. Die beiden bekanntesten sind man:ftpd[8] und man:sshd[8]. Beide Programme nutzen blacklistd, um übermäßige Verbindungsversuche zu unterbinden. Um blacklistd im SSH-Daemon zu aktivieren, muss folgend Zeile in [.filename]#/etc/ssh/sshd_config# hinzugefügt werden:
+
+[.programlisting]
+....
+UseBlacklist yes
+....
+
+Damit die Änderungen wirksam werden, muss sshd im Anschluss neu gestartet werden.
+
+Für man:ftpd[8] wird blacklistd mit dem Schalter `-B` aktiviert. Entweder in [.filename]#/etc/inetd.conf# oder in [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+ftpd_flags="-B"
+....
+
+Das ist alles, was benötigt wird, damit diese Programme mit blacklist kommunizieren.
+
+=== Blacklistd Verwaltung
+
+Blacklistd stellt dem Benutzer das Verwaltungswerkzeug man:blacklistctl[8] zur Verfügung. Es zeigt blockierte Adressen und Netzwerke an, die nach den in man:blacklistd.conf[5] definierten Regeln auf der Blacklist stehen. Um die Liste der aktuell blockierten Rechner anzuzeigen, benutzen Sie `dump` zusammen mit der Option `-b`:
+
+[source,bash]
+....
+# blacklistctl dump -b
+ address/ma:port id nfail last access
+213.0.123.128/25:22 OK 6/3 2019/06/08 14:30:19
+....
+
+Dieses Beispiel zeigt, dass es sechs von drei erlaubten Anmeldeversuchen auf Port 22 aus dem Adressbereich `213.0.123.128/25` gab. Es sind mehr Versuche aufgelistet, als erlaubt sind, da SSH es einem Client erlaubt, mehrere Anmeldungen über eine einzige TCP-Verbindung zu tätigen. Eine derzeit laufende Verbindung wird nicht von blacklistd unterbunden. Der letzte Verbindungsversuch ist in der letzten Spalte der Ausgabe aufgeführt.
+
+Um die verbleibende Zeit zu sehen, die sich dieser Rechner auf der Blacklist befindet, fügen Sie `-r` zum vorherigen Befehl hinzu:
+
+[source,bash]
+....
+# blacklistctl dump -br
+ address/ma:port id nfail remaining time
+213.0.123.128/25:22 OK 6/3 36s
+....
+
+In diesem Beispiel bleiben noch 36 Sekunden, bis dieser Rechner nicht mehr blockiert wird.
+
+=== Rechner aus der Blocklist entfernen
+
+Manchmal ist es notwendig, einen Rechner aus der Blocklist zu entfernen, bevor die verbleibende Zeit abgelaufen ist. Leider bietet blacklistd keine Möglichkeit dies zu tun. Es ist jedoch möglich, die Adresse mit `pfctl` aus der PF-Tabelle zu entfernen. Für den blockierten Port gibt es einen untergeordneten Anker innerhalb des definierten blacklistd-Ankers in [.filename]#/etc/pf.conf#. Wenn es beispielsweise einen untergeordneten Anker zum Blockieren von Port 22 gibt, wird dieser als `blacklistd/22` bezeichnet. In diesem untergeordneten Anker befindet sich eine Tabelle, die die blockierten Adressen enthält. Diese Tabelle wird Port genannt, gefolgt von der Portnummer. In diesem Beispiel würde es `port22` heißen. Mit diesen Informationen und man:pfctl[8] ist es nun möglich, alle geblockten Adressen anzuzeigen:
+
+[source,bash]
+....
+# pfctl -a blacklistd/22 -t port22 -T show
+...
+213.0.123.128/25
+...
+....
+
+Nachdem Sie die entsprechende Adresse ermittelt wurde, kann sie mit folgendem Befehl aus der Liste entfernt werden:
+
+[source,bash]
+....
+# pfctl -a blacklistd/22 -t port22 -T delete 213.0.123.128/25
+....
+
+Die Adresse ist nun aus PF entfernt, erscheint aber immer noch in der Liste von `blacklistctl`, da dieser keine Kenntnis von Änderungen an PF hat. Der Eintrag in blacklist's Datenbank wird irgendwann ablaufen und dann aus der Ausgabe entfernt werden. Der Eintrag wird wieder hinzugefügt, falls der Rechner erneut gegen eine der Regeln von blacklistd verstößt.
diff --git a/documentation/content/de/books/handbook/geom/_index.adoc b/documentation/content/de/books/handbook/geom/_index.adoc
new file mode 100644
index 0000000000..0ce67d2899
--- /dev/null
+++ b/documentation/content/de/books/handbook/geom/_index.adoc
@@ -0,0 +1,1131 @@
+---
+title: "Kapitel 18. GEOM: Modulares Framework zur Plattentransformation"
+part: Teil III. Systemadministration
+prev: books/handbook/disks
+next: books/handbook/zfs
+---
+
+[[geom]]
+= GEOM: Modulares Framework zur Plattentransformation
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 18
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/geom/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/geom/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/geom/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[geom-synopsis]]
+== Übersicht
+
+GEOM erlaubt den Zugriff und die Kontrolle von Klassen, wie beispielsweise Master Boot Records und BSD-Label, durch die Nutzung von Datenträgern (Providern) oder den besonderen Dateien in [.filename]#/dev#. Verschiedene Software RAID-Konfigurationen unterstützend, gewährt GEOM transparenten Zugriff auf das Betriebssystem und die System-Dienstprogramme.
+
+Dieses Kapitel behandelt den Einsatz von Laufwerken mit dem GEOM-Framework in FreeBSD. Dies beinhaltet auch die wichtigen RAID-Überwachungswerkzeuge, welche das Framework zur Konfiguration nutzen. Dieses Kapitel ist kein ausführlicher Leitfaden für RAID-Konfigurationen. Nur die von GEOM unterstützten RAID-Klassen werden erörtert.
+
+Nach Lesen dieses Kapitels werden Sie folgendes wissen:
+
+* Welche Art von RAID-Unterstützung durch GEOM verfügbar ist.
+* Wie man die Basis-Dienstprogramme nutzt, um verschiedene RAID-Stufen zu konfigurieren, zu manipulieren und zu warten.
+* Wie man mittels GEOM spiegelt, striped, verschlüsselt und entfernte Laufwerke verbindet.
+* Wie man an Laufwerken, welche an das GEOM-Framework angeschlossen sind, Fehler behebt.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie:
+
+* Verstehen, wie FreeBSD Laufwerke behandelt (crossref:disks[disks,Speichermedien]).
+* Wissen wie man einen neuen FreeBSD-Kernel konfiguriert und installiert (crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels]).
+
+[[geom-striping]]
+== RAID0 - Striping
+
+Striping (stripe = Streifen) fasst verschiedene Laufwerke in einem einzigen Datenträger zusammen. Dies wird durch die Nutzung von Hardware-Controllern bewerkstelligt. Das GEOM-Subsystem unterstützt Software-RAID0, welches auch als Striping bekannt ist. Bei dieser Technik wird kein RAID-Controller benötigt.
+
+In einem RAID0-System werden die Daten in einzelne Blöcke aufgeteilt, welche über alle angeschlossenen Laufwerke in einem Datenfeld (Array) geschrieben werden. Anstatt darauf warten zu müssen, dass 256K auf ein einzelnes Laufwerk geschrieben werden, kann ein RAID0-System gleichzeitig 64K auf jedes von vier Laufwerken schreiben mit entsprechend besserer I/O-Leistung. Dieser Durchsatz kann durch die Verwendung mehrerer Controller noch zusätzlich gesteigert werden.
+
+image::striping.png[Disk Striping Illustration]
+
+Jedes Laufwerk in einem RAID0-Stripe muss die gleiche Größe haben, da I/O-Anforderungen für das Lesen und Schreiben abwechselnd auf mehrere Laufwerke parallel erfolgen.
+
+[NOTE]
+====
+RAID0 bietet keine Redundanz. Das bedeutet, dass wenn eine Platte im Array ausfällt, die gesamten Daten auf den Platten verloren gehen. Wenn es sich um wichtige Daten handelt, sollten Sie eine Backup-Strategie entwickeln, die regelmäßig Sicherungen auf einem entferntem System speichert.
+====
+
+Die Erstellung eines GEOM-basierten RAID0 auf einem FreeBSD-System wird im folgenden beschrieben. Nachdem das Stripe erzeugt wurde, finden Sie in man:gstripe[8] weitere Informationen zur Verwaltung der vorhandenen Stripes.
+
+[.procedure]
+****
+*Procedure: Ein Stripe aus unformatierten ATA-Platten erzeugen*
+
+. Laden Sie das [.filename]#geom_stripe.ko#-Modul:
++
+[source,bash]
+....
+# kldload geom_stripe
+....
+
+. Stellen Sie sicher, dass ein geeigneter Mountpunkt existiert. Falls dieser Datenträger eine Root-Partition werden soll, dann nutzen Sie zeitweise einen anderen Mountpunkt, beispielsweise [.filename]#/mnt#.
+. Bestimmen Sie die Gerätenamen derjenigen Platten, welche gestriped werden sollen, und erzeugen Sie ein neues Stripe-Gerät. Das folgende Beispiel verwendet zwei unbenutzte und unpartitionierte ATA-Platten, die gestriped werden sollen. Die Gerätenamen lauten [.filename]#/dev/ad2# und [.filename]#/dev/ad3#:
++
+[source,bash]
+....
+# gstripe label -v st0 /dev/ad2 /dev/ad3
+Metadata value stored on /dev/ad2.
+Metadata value stored on /dev/ad3.
+Done.
+....
+
+. Schreiben Sie einen Standard-Label (auch als Partitions-Tabelle bekannt) auf den neuen Datenträger und installieren Sie den normalen Bootstrap-Code:
++
+[source,bash]
+....
+# bsdlabel -wB /dev/stripe/st0
+....
+
+. Dieser Prozess sollte zwei weitere Geräte im Verzeichnis [.filename]#/dev/stripe# (zusätzlich zum Gerät [.filename]#st0#) erzeugt haben. Diese schliessen [.filename]#st0a# und [.filename]#st0c# ein. Nun kann mit `newfs` ein UFS-Dateisystem auf dem Gerät [.filename]#st0a# erzeugt werden:
++
+[source,bash]
+....
+# newfs -U /dev/stripe/st0a
+....
++
+Viele Zahlen rauschen nun über den Bildschirm und nach ein paar Sekunden wird der Prozess abgeschlossen sein. Der Datenträger wurde erzeugt und kann in den Verzeichnisbaum eingehängt werden.
+. Um das erzeugte Stripe manuell zu mounten:
++
+[source,bash]
+....
+# mount /dev/stripe/st0a /mnt
+....
+
+. Um das erzeugte Dateisystem automatisch während des Startvorgangs zu mounten, muss die Datenträgerinformation in [.filename]#/etc/fstab# eingetragen werden. In diesem Beispiel wird ein permanenter Mountpunkt namens [.filename]#stripe# erstellt:
++
+[source,bash]
+....
+# mkdir /stripe
+# echo "/dev/stripe/st0a /stripe ufs rw 2 2" \
+>> /etc/fstab
+....
+
+. Das [.filename]#geom_stripe.ko#-Modul muss ebenfalls automatisch beim Systemstart geladen werden (durch die Aufnahme der folgenden Zeile in die Datei [.filename]#/boot/loader.conf#):
++
+[source,bash]
+....
+# echo 'geom_stripe_load="YES"' >> /boot/loader.conf
+....
+****
+
+[[geom-mirror]]
+== RAID1 - Spiegelung
+
+Spiegelung (RAID1 / _Mirroring_) ist eine Technik, bei der identische Daten auf mehr als ein Laufwerk geschrieben werden. Spiegel werden in der Regel zum Schutz vor Datenverlust aufgrund von Festplattenausfällen verwendet. Jedes Laufwerk in einem Spiegel enthält eine identische Kopie der Daten. Wenn ein einzelnes Laufwerk ausfällt, funktioniert der Spiegel weiterhin und die Daten werden von den restlichen Festplatten bereit gestellt. Der Rechner läuft einfach weiter und der Administrator hat die Gelegentheit, das defekte Laufwerk auszutauschen.
+
+Zwei häufige Situationen werden in diesem Beispiel erläutert. Im ersten Beispiel wird ein Spiegel aus zwei neuen Laufwerken erstellt, der die existierende Platte ersetzt. Das zweite Beispiel erzeugt ein Spiegel mit einem einzigen Laufwerk, kopiert dann die Daten von der alten Platte und fügt die alte Platte zum Spiegel hinzu. Obwohl dieses Verfahren etwas komplizierter ist, wird nur ein neues Laufwerk benötigt.
+
+Traditionell sind die Laufwerke in einem Spiegel vom gleichen Modell und besitzen die gleiche Kapazität. Dies ist jedoch keine Voraussetzung für man:gmirror[8]. Hier können Spiegel mit unterschiedlichen Kapazitäten verwendet werden. Die Kapazität richtet sich dann nach dem kleinsten Laufwerk im Spiegel. Zusätzlicher Speicherplatz auf größeren Laufwerken bleibt dann ungenutzt. Werden später weitere Laufwerke zum Spiegel hinzugefügt, müssen diese mindestens so viel Kapazität haben wie das kleinste Laufwerk im Spiegel.
+
+[WARNING]
+====
+
+Die hier gezeigten Verfahren löschen keine Daten. Dennoch sollte, wie bei jeder größeren Operation, zuerst eine vollständige Sicherung erstellt werden.
+====
+
+[WARNING]
+====
+
+Obwohl in diesem Abschnitt man:dump[8] zum Kopieren der Dateisysteme verwendet wird, funktioniert es nicht auf Dateisystemen mit aktiviertem Soft-Updates Journaling. In man:tunefs[8] finden Sie Informationen, wie Sie Soft-Updates Journaling erkennen und deaktivieren.
+====
+
+[[geom-mirror-metadata]]
+=== Probleme mit Metadaten
+
+Viele Plattensysteme speichern Metadaten am Ende der Platte. Alte Metadaten sollten vor der Wiederverwendung in einem Spiegel gelöscht werden, da die meisten Probleme aus zwei Arten von übrig gebliebenen Metadaten resultieren: GPT-Partitionstabellen und alte Metadaten aus einem vorherigen Spiegel.
+
+GPT-Metadaten können mit man:gpart[8] gelöscht werden. Dieses Beispiel löscht sowohl die primären, als auch die GPT-Partitionstabelle von der Festplatte [.filename]#ada8#:
+
+[source,bash]
+....
+# gpart destroy -F ada8
+....
+
+Mit man:gmirror[8] kann eine Platte aus einem aktiven Spiegel entfernt und gleichzeitig die Metadaten gelöscht werden. In diesem Beispiel wird die Platte [.filename]#ada8# aus dem aktiven Spiegel [.filename]#gm4# entfernt:
+
+[source,bash]
+....
+# gmirror remove gm4 ada8
+....
+
+Wenn der Spiegel nicht aktiv ist, sich jedoch noch alte Metadaten auf der Festplatte befinden, benutzen Sie `gmirror clear`, um die Metadaten zu entfernen:
+
+[source,bash]
+....
+# gmirror clear ada8
+....
+
+man:gmirror[8] speichert einen Datenblock an Metadaten am Ende der Festplatte. Da das GPT-Partitionschema die Metadaten auch am Ende der Platte speichert, wird es nicht empfohlen, mit man:gmirror[8] einen Spiegel aus einem gesamten GPT-Datenträger zu erstellen. In diesen Fällen sollte eine MBR-Partitionierung benutzt werden, weil hier nur eine Partitionstabelle am Anfang der Platte gespeichert wird und somit nicht mit den Metadaten des Spiegels im Konflikt steht.
+
+[[geom-mirror-two-new-disks]]
+=== Einen Spiegel mit zwei neuen Festplatten erstellen
+
+In diesem Beispiel wurde FreeBSD bereits auf der vorhandenen Festplatte [.filename]#ada0# installiert. Zwei neue Platten, [.filename]#ada1# und [.filename]#ada2#, wurden bereits mit dem System verbunden. Ein neuer Spiegel soll mit diesen beiden Platten erzeugt und verwendet werden, um die alte vorhandene Platte zu ersetzen.
+
+Das Kernelmodul [.filename]#geom_mirror.ko# muss entweder in den Kernel eingebaut, oder zur Laufzeit geladen werden. Sie können das Modul manuell laden:
+
+[source,bash]
+....
+# gmirror load
+....
+
+Erstellen Sie den Spiegel mit den beiden neuen Festplatten:
+
+[source,bash]
+....
+# gmirror label -v gm0 /dev/ada1 /dev/ada2
+....
+
+[.filename]#gm0# ist ein vom Benutzer gewählter Name, der dem neuen Spiegel zugeordnet wird. Nachdem der Spiegel gestartet wurde, erscheint dieser Gerätename in [.filename]#/dev/mirror/#.
+
+MBR- und bsdlabel-Partitionstabellen können jetzt auf dem neuen Spiegel erzeugt werden. Dieses Beispiel verwendet das herkömmliche Dateisystem-Layout für [.filename]#/#, swap, [.filename]#/var#, [.filename]#/tmp# und [.filename]#/usr#. Eine einzelne Root- und Swap-Partition würde ebenfalls funktionieren.
+
+Die Partitionen auf dem Spiegel müssen nicht zwingend die gleiche Größe wie die auf der Festplatte haben, aber sie müssen groß genug sein, um alle Daten aufnehmen zu können, die bereits auf [.filename]#ada0# gespeichert sind.
+
+[source,bash]
+....
+# gpart create -s MBR mirror/gm0
+# gpart add -t freebsd -a 4k mirror/gm0
+# gpart show mirror/gm0
+=> 63 156301423 mirror/gm0 MBR (74G)
+ 63 63 - free - (31k)
+ 126 156301299 1 freebsd (74G)
+ 156301425 61 - free - (30k)
+....
+
+[source,bash]
+....
+# gpart create -s BSD mirror/gm0s1
+# gpart add -t freebsd-ufs -a 4k -s 2g mirror/gm0s1
+# gpart add -t freebsd-swap -a 4k -s 4g mirror/gm0s1
+# gpart add -t freebsd-ufs -a 4k -s 2g mirror/gm0s1
+# gpart add -t freebsd-ufs -a 4k -s 1g mirror/gm0s1
+# gpart add -t freebsd-ufs -a 4k mirror/gm0s1
+# gpart show mirror/gm0s1
+=> 0 156301299 mirror/gm0s1 BSD (74G)
+ 0 2 - free - (1.0k)
+ 2 4194304 1 freebsd-ufs (2.0G)
+ 4194306 8388608 2 freebsd-swap (4.0G)
+ 12582914 4194304 4 freebsd-ufs (2.0G)
+ 16777218 2097152 5 freebsd-ufs (1.0G)
+ 18874370 137426928 6 freebsd-ufs (65G)
+ 156301298 1 - free - (512B)
+....
+
+Damit von dem Spiegel gebootet werden kann, muss der Bootcode in den MBR installiert, ein bsdlabel erstellt und die aktive Partition gesetzt werden:
+
+[source,bash]
+....
+# gpart bootcode -b /boot/mbr mirror/gm0
+# gpart set -a active -i 1 mirror/gm0
+# gpart bootcode -b /boot/boot mirror/gm0s1
+....
+
+Erstellen Sie die Dateisysteme auf dem neuen Spiegel und aktivieren Sie Soft-Updates:
+
+[source,bash]
+....
+# newfs -U /dev/mirror/gm0s1a
+# newfs -U /dev/mirror/gm0s1d
+# newfs -U /dev/mirror/gm0s1e
+# newfs -U /dev/mirror/gm0s1f
+....
+
+Die Dateisysteme der vorhandenen Platte [.filename]#ada0# können jetzt mit man:dump[8] und man:restore[8] auf den Spiegel kopiert werden.
+
+[source,bash]
+....
+# mount /dev/mirror/gm0s1a /mnt
+# dump -C16 -b64 -0aL -f - / | (cd /mnt && restore -rf -)
+# mount /dev/mirror/gm0s1d /mnt/var
+# mount /dev/mirror/gm0s1e /mnt/tmp
+# mount /dev/mirror/gm0s1f /mnt/usr
+# dump -C16 -b64 -0aL -f - /var | (cd /mnt/var && restore -rf -)
+# dump -C16 -b64 -0aL -f - /tmp | (cd /mnt/tmp && restore -rf -)
+# dump -C16 -b64 -0aL -f - /usr | (cd /mnt/usr && restore -rf -)
+....
+
+Fügen Sie die Dateisysteme für den Spiegel in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/mirror/gm0s1a / ufs rw 1 1
+/dev/mirror/gm0s1b none swap sw 0 0
+/dev/mirror/gm0s1d /var ufs rw 2 2
+/dev/mirror/gm0s1e /tmp ufs rw 2 2
+/dev/mirror/gm0s1f /usr ufs rw 2 2
+....
+
+Wenn das Modul [.filename]#geom_mirror.ko# nicht im Kernel enthalten ist, können Sie [.filename]#/mnt/boot/loader.conf# bearbeiten, damit das Modul beim Systemstart geladen wird:
+
+[.programlisting]
+....
+geom_mirror_load="YES"
+....
+
+Starten Sie das System neu und überprüfen Sie, ob alle Daten erfolgreich kopiert wurden. Das BIOS wird den Spiegel vermutlich als zwei einzelne Laufwerke erkennen. Da beide Laufwerke jedoch identisch sind, spielt es keine Rolle, welches Laufwerk zum Booten ausgewählt wird.
+
+Falls es Probleme beim Booten gibt, lesen Sie den <<gmirror-troubleshooting>>. Die alte Festplatte [.filename]#ada0# kann vom System getrennt und als Offline-Sicherung aufbewahrt werden.
+
+Im laufenden Betrieb verhält sich der Spiegel genau wie ein einzelnes Laufwerk.
+
+[[geom-mirror-existing-drive]]
+=== Einen Spiegel mit einem vorhandenen Laufwerk erstellen
+
+In diesem Beispiel wurde FreeBSD bereits auf der Festplatte [.filename]#ada0# installiert und eine weitere Platte, [.filename]#ada1#, wurde an das System angeschlossen. Zunächst wird ein Spiegel mit einer Festplatte erstellt, dann das vorhandene System auf den Spiegel kopiert. Zuletzt wird die alte Festplatte in den Spiegel eingefügt. Diese etwas komplexere Vorgehensweise ist erforderlich, da `gmirror` 512 Byte an Metadaten am Ende der Festplatte speichert, und die bestehende Platte, [.filename]#ada0#, in der Regel den Platz bereits belegt hat.
+
+Laden Sie das Kernelmodul [.filename]#geom_mirror.ko#:
+
+[source,bash]
+....
+# gmirror load
+....
+
+Prüfen Sie mit `diskinfo` die Mediengröße der vorhandenen Festplatte:
+
+[source,bash]
+....
+# diskinfo -v ada0 | head -n3
+/dev/ada0
+ 512 # sectorsize
+ 1000204821504 # mediasize in bytes (931G)
+....
+
+Jetzt können Sie den Spiegel auf der neuen Festplatte erzeugen. Um sicherzustellen, dass die Kapazität nicht größer ist, als die Kapazität der vorhandenen Platte [.filename]#ada0#, benutzen Sie man:gnop[8] um eine Platte mit der exakt gleichen Größe zu imitieren. Diese Platte speichert keine Daten und wird nur verwendet, um die Größe des Spiegels zu begrenzen. man:gmirror[8] wird die Kapazität des Spiegels auf die Größe von [.filename]#gzero.nop# beschränken, auch wenn die neue Festplatte [.filename]#ada1# mehr Platz zur Verfügung hätte. Beachten Sie, dass _1000204821504_ in der zweiten Zeile der ermittelten Mediengröße von `diskinfo` entspricht.
+
+[source,bash]
+....
+# geom zero load
+# gnop create -s 1000204821504 gzero
+# gmirror label -v gm0 gzero.nop ada1
+# gmirror forget gm0
+....
+
+Da [.filename]#gzero.nop# keine Daten speichert, sieht der Spiegel sie als nicht verbunden an. Der Spiegel ist so konfiguriert, dass er nicht verbundene Komponenten einfach "vergisst". Das Ergebnis ist ein Spiegel mit nur einer einzigen Platte, [.filename]#ada1#.
+
+Sehen Sie sich nach der Erstellung von [.filename]#gm0# die Partitionstabelle von [.filename]#ada0# an. Diese Ausgabe stammt von einer 1 TB Festplatte. Falls am Ende der Platte noch freier Speicherplatz ist, kann der Inhalt von [.filename]#ada0# direkt auf den Spiegel kopiert werden.
+
+Falls jedoch der gesamte Speicherplatz auf der Platte zugeordnet ist, dann gibt es keinen Platz mehr für die 512 Byte Metadaten für den Spiegel am Ende der Platte, wie in dieser Auflistung zu sehen.
+
+[source,bash]
+....
+# gpart show ada0
+=> 63 1953525105 ada0 MBR (931G)
+ 63 1953525105 1 freebsd [active] (931G)
+....
+
+In diesem Fall muss die Partitionstabelle bearbeitet werden, um die Kapazität von [.filename]#mirror/gm0# um einen Sektor zu reduzieren. Dieses Verfahren wird später erläutert.
+
+In beiden Fällen sollte die Partitionstabelle der primären Platte mit `gpart backup` gesichert werden.
+
+[source,bash]
+....
+# gpart backup ada0 > table.ada0
+# gpart backup ada0s1 > table.ada0s1
+....
+
+Diese Kommandos erstellen zwei Dateien, [.filename]#table.ada0# und [.filename]#table.ada0s1#. Das Beispiel verwendet eine 1 TB Festplatte:
+
+[source,bash]
+....
+# cat table.ada0
+MBR 4
+1 freebsd 63 1953525105 [active]
+....
+
+[source,bash]
+....
+# cat table.ada0s1
+BSD 8
+1 freebsd-ufs 0 4194304
+2 freebsd-swap 4194304 33554432
+4 freebsd-ufs 37748736 50331648
+5 freebsd-ufs 88080384 41943040
+6 freebsd-ufs 130023424 838860800
+7 freebsd-ufs 968884224 984640881
+....
+
+Wenn am Ende der Platte kein Platz vorhanden ist, muss die Größe des Slice und der letzten Partition verringert werden. Bearbeiten Sie die beiden Dateien, und verringern Sie die Größe der Slice und der Partition jeweils um eins. Dies bezieht sich auf die letzten Zahlen in der Liste.
+
+[source,bash]
+....
+# cat table.ada0
+MBR 4
+1 freebsd 63 1953525104 [active]
+....
+
+[source,bash]
+....
+# cat table.ada0s1
+BSD 8
+1 freebsd-ufs 0 4194304
+2 freebsd-swap 4194304 33554432
+4 freebsd-ufs 37748736 50331648
+5 freebsd-ufs 88080384 41943040
+6 freebsd-ufs 130023424 838860800
+7 freebsd-ufs 968884224 984640880
+....
+
+Wenn mindestens ein Sektor der Platte nicht zugewiesen wurde, kann die Platte ohne Modifikation verwendet werden.
+
+Jetzt kann die Partitionstabelle auf [.filename]#mirror/gm0# wiederhergestellt werden:
+
+[source,bash]
+....
+# gpart restore mirror/gm0 < table.ada0
+# gpart restore mirror/gm0s1 < table.ada0s1
+....
+
+Prüfen Sie die Partitionstabellen mit `gpart show`. Dieses Beispiel nutzt [.filename]#gm0s1a# für [.filename]#/#, [.filename]#gm0s1d# für [.filename]#/var#, [.filename]#gm0s1e# für [.filename]#/usr#, [.filename]#gm0s1f# für [.filename]#/data1# und [.filename]#gm0s1g# für [.filename]#/data2#.
+
+[source,bash]
+....
+# gpart show mirror/gm0
+=> 63 1953525104 mirror/gm0 MBR (931G)
+ 63 1953525042 1 freebsd [active] (931G)
+ 1953525105 62 - free - (31k)
+
+# gpart show mirror/gm0s1
+=> 0 1953525042 mirror/gm0s1 BSD (931G)
+ 0 2097152 1 freebsd-ufs (1.0G)
+ 2097152 16777216 2 freebsd-swap (8.0G)
+ 18874368 41943040 4 freebsd-ufs (20G)
+ 60817408 20971520 5 freebsd-ufs (10G)
+ 81788928 629145600 6 freebsd-ufs (300G)
+ 710934528 1242590514 7 freebsd-ufs (592G)
+ 1953525042 63 - free - (31k)
+....
+
+Sowohl die Slice, als auch die letzte Partition, muss mindestens einen freien Block am Ende der Platte haben.
+
+Erstellen Sie Dateisysteme auf diesen neuen Partitionen:
+
+[source,bash]
+....
+# newfs -U /dev/mirror/gm0s1a
+# newfs -U /dev/mirror/gm0s1d
+# newfs -U /dev/mirror/gm0s1e
+# newfs -U /dev/mirror/gm0s1f
+# newfs -U /dev/mirror/gm0s1g
+....
+
+Damit Sie von dem Spiegel booten können, müssen Sie den Bootcode in den MBR installieren, ein bsdlabel anlegen und das aktive Slice setzen:
+
+[source,bash]
+....
+# gpart bootcode -b /boot/mbr mirror/gm0
+# gpart set -a active -i 1 mirror/gm0
+# gpart bootcode -b /boot/boot mirror/gm0s1
+....
+
+Bearbeiten Sie [.filename]#/etc/fstab#, um die neuen Partitionen auf dem Spiegel nutzen zu können. Speichern Sie zunächst eine Kopie der Datei unter [.filename]#/etc/fstab.orig#:
+
+[source,bash]
+....
+# cp /etc/fstab /etc/fstab.orig
+....
+
+Ersetzen Sie in [.filename]#/etc/fstab# [.filename]#/dev/ada0# durch [.filename]#mirror/gm0#.
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/mirror/gm0s1a / ufs rw 1 1
+/dev/mirror/gm0s1b none swap sw 0 0
+/dev/mirror/gm0s1d /var ufs rw 2 2
+/dev/mirror/gm0s1e /usr ufs rw 2 2
+/dev/mirror/gm0s1f /data1 ufs rw 2 2
+/dev/mirror/gm0s1g /data2 ufs rw 2 2
+....
+
+Wenn das Modul [.filename]#geom_mirror.ko# nicht im Kernel enthalten ist, können Sie [.filename]#/boot/loader.conf# bearbeiten, damit das Modul beim Systemstart geladen wird:
+
+[.programlisting]
+....
+geom_mirror_load="YES"
+....
+
+Die Dateisysteme der ursprünglichen Platte können jetzt mit man:dump[8] und man:restore[8] auf den Spiegel kopiert werden. Wenn Sie das Dateisystem mit `dump -L` sichern, wird zunächst ein Snapshot des Dateisystems erstellt, was einige Zeit dauern kann.
+
+[source,bash]
+....
+# mount /dev/mirror/gm0s1a /mnt
+# dump -C16 -b64 -0aL -f - / | (cd /mnt && restore -rf -)
+# mount /dev/mirror/gm0s1d /mnt/var
+# mount /dev/mirror/gm0s1e /mnt/usr
+# mount /dev/mirror/gm0s1f /mnt/data1
+# mount /dev/mirror/gm0s1g /mnt/data2
+# dump -C16 -b64 -0aL -f - /usr | (cd /mnt/usr && restore -rf -)
+# dump -C16 -b64 -0aL -f - /var | (cd /mnt/var && restore -rf -)
+# dump -C16 -b64 -0aL -f - /data1 | (cd /mnt/data1 && restore -rf -)
+# dump -C16 -b64 -0aL -f - /data2 | (cd /mnt/data2 && restore -rf -)
+....
+
+Starten Sie das System neu und booten Sie von [.filename]#ada1#. Wenn alles funktioniert, wird das System von [.filename]#mirror/gm0# booten, welches jetzt die gleichen Daten enthält wie [.filename]#ada0#. Lesen Sie <<gmirror-troubleshooting>>, falls es Probleme beim Booten gibt.
+
+An dieser Stelle besteht der Spiegel immer noch aus der einzelnen Platte [.filename]#ada1#.
+
+Nachdem erfolgreich von [.filename]#mirror/gm0# gebootet wurde, besteht der letzte Schritt darin, [.filename]#ada0# in den Spiegel einzufügen.
+
+[IMPORTANT]
+====
+Wenn Sie [.filename]#ada0# in den Spiegel einfügen, wird der Inhalt der Platte mit den Daten aus dem Spiegel überschrieben. Sie müssen sicherstellen, das [.filename]#mirror/gm0# den gleichen Inhalt wie [.filename]#ada0# hat, bevor Sie [.filename]#ada0# zum Spiegel hinzufügen. Falls der zuvor mit man:dump[8] und man:restore[8] kopierte Inhalt nicht mit dem von [.filename]#ada0# identisch ist, machen Sie die Änderungen an [.filename]#/etc/fstab# rückgängig, starten Sie das System neu und beginnen Sie die Prozedur von vorn.
+====
+
+[source,bash]
+....
+# gmirror insert gm0 ada0
+GEOM_MIRROR: Device gm0: rebuilding provider ada0
+....
+
+Die Synchronisation zwischen den beiden Platten wird direkt gestartet. Verwenden Sie `gmirror status` um den Fortschritt zu beobachten.
+
+[source,bash]
+....
+# gmirror status
+ Name Status Components
+girror/gm0 DEGRADED ada1 (ACTIVE)
+ ada0 (SYNCHRONIZING, 64%)
+....
+
+Nach einer Weile wird die Wiederherstellung abgeschlossen sein.
+
+[source,bash]
+....
+GEOM_MIRROR: Device gm0: rebuilding provider ada0 finished.
+# gmirror status
+ Name Status Components
+mirror/gm0 COMPLETE ada1 (ACTIVE)
+ ada0 (ACTIVE)
+....
+
+[.filename]#mirror/gm0# besteht nun aus den beiden Platten [.filename]#ada0# und [.filename]#ada1#. Der Inhalt der beiden Platten wird automatisch miteinander synchronisiert. Im laufenden Betrieb verhält sich [.filename]#mirror/gm0# wie eine einzelne Festplatte.
+
+[[gmirror-troubleshooting]]
+=== Fehlerbehebung
+
+Falls das System nicht mehr startet, müssen möglicherweise die BIOS-Einstellungen geändert werden, um von dem neuen gespiegelten Laufwerk zu booten. Beide Platten des Spiegels können zum Booten verwendet werden, da sie als Komponenten des Spiegels identische Daten enthalten.
+
+Wenn der Bootvorgang mit der folgenden Meldung abbricht, ist irgendwas mit dem Spiegel nicht in Ordnung:
+
+[source,bash]
+....
+Mounting from ufs:/dev/mirror/gm0s1a failed with error 19.
+
+Loader variables:
+ vfs.root.mountfrom=ufs:/dev/mirror/gm0s1a
+ vfs.root.mountfrom.options=rw
+
+Manual root filesystem specification:
+ <fstype>:<device> [options]
+ Mount <device> using filesystem <fstype>
+ and with the specified (optional) option list.
+
+ eg. ufs:/dev/da0s1a
+ zfs:tank
+ cd9660:/dev/acd0 ro
+ (which is equivalent to: mount -t cd9660 -o ro /dev/acd0 /)
+
+ ? List valid disk boot devices
+ . Yield 1 second (for background tasks)
+ <empty line> Abort manual input
+
+mountroot>
+....
+
+Dieses Problem kann durch ein nicht geladenes Kernelmodul [.filename]#geom_mirror.ko# in [.filename]#/boot/loader.conf# verursacht werden. Um das Problem zu beheben, booten Sie von einem FreeBSD-Installationsmedium und wählen Sie `Shell` an der Eingabeaufforderung. Laden Sie dann das Modul und hängen Sie den Spiegel ein:
+
+[source,bash]
+....
+# gmirror load
+# mount /dev/mirror/gm0s1a /mnt
+....
+
+Bearbeiten Sie dann [.filename]#/mnt/boot/loader.conf# und fügen Sie eine Zeile für das Kernelmodul hinzu:
+
+[.programlisting]
+....
+geom_mirror_load="YES"
+....
+
+Speichern Sie die Datei und starten Sie das System neu.
+
+Andere Probleme, die `error 19` verursachen können, sind nur mit mehr Aufwand zu beheben. Obwohl das System von [.filename]#ada0# booten sollte, wird ein weiterer Prompt erscheinen, wenn [.filename]#/etc/fstab# fehlerhaft ist. Geben Sie am Loader-Prompt `ufs:/dev/ada0s1a` ein und drücken Sie kbd:[Enter]. Machen Sie die Änderungen an [.filename]#/etc/fstab# rückgängig und hängen Sie anstelle des Spiegels die originale Festplatte ([.filename]#ada0#) ein. Starten Sie dann das System neu und versuchen Sie den Vorgang erneut.
+
+[source,bash]
+....
+Enter full pathname of shell or RETURN for /bin/sh:
+# cp /etc/fstab.orig /etc/fstab
+# reboot
+....
+
+=== Wiederherstellung des Systems nach einem Plattenausfall
+
+Der Vorteil der Plattenspiegelung ist, dass eine Platte ausfallen kann, ohne dass Sie dabei Daten verlieren. Falls [.filename]#ada0# aus dem obigen Beispiel ausfällt, steht der Spiegel weiterhin zur Verfügung und bietet die Daten von der verbleibenden Platte [.filename]#ada1# an.
+
+Um das ausgefallene Laufwerk zu ersetzen, muss das System heruntergefahren werden und das ausgefallene Laufwerk durch ein neues Laufwerk von gleicher oder größerer Kapazität ersetzt werden. Hersteller verwenden oft etwas willkürliche Werte für die Kapazität. Der einzige Weg, um wirklich sicher zu sein, ist die Gesamtzahl der Sektoren von `diskinfo -V` zu vergleichen. Ein Laufwerk mit größerer Kapazität wird funktionieren, allerdings wird der zusätzliche Platz ungenutzt bleiben.
+
+Nachdem der Rechner wieder eingeschaltet ist, wird der Spiegel im "degraded" Modus ausgeführt werden. Der Spiegel wird angewiesen, Laufwerke zu vergessen, die noch nicht verbunden sind:
+
+[source,bash]
+....
+# gmirror forget gm0
+....
+
+Alte Metadaten sollten von der Ersatzfestplatte nach den Anweisungen in <<geom-mirror-metadata>> gelöscht werden. Anschließend kann die Ersatzfestplatte, in diesem Beispiel [.filename]#ada4#, in den Spiegel eingefügt werden:
+
+[source,bash]
+....
+# gmirror insert gm0 /dev/ada4
+....
+
+Die Wiederherstellung beginnt, sobald das neue Laufwerk in den Spiegel eingesetzt wird. Das Kopieren der Daten vom Spiegel auf das neue Laufwerk kann eine Weile dauern. Die Leistung des Spiegels ist während dieser Zeit stark reduziert, deswegen sollten neue Laufwerke idealerweise dann eingefügt werden, wenn der Rechner nicht benötigt wird.
+
+Der Fortschritt der Wiederherstellung kann mit `gmirror status` überwacht werden. Während der Wiederherstellung ist der Status `DEGRADED`. Wenn der Vorgang abgeschlossen ist, wechselt der Status zu `COMPLETE`.
+
+[[geom-raid3]]
+== RAID3 - Byte-Level Striping mit dedizierter Parität
+
+RAID3 ist eine Methode, die mehrere Festplatten zu einem einzigen Volume mit einer dedizierten Paritätsfestplatte kombiniert. In einem RAID3-System werden die Daten in einzelne Bytes aufgeteilt und dann über alle Laufwerke, mit Ausnahme der Paritätsfestplatte, geschrieben. Beim Lesen von Daten in einer RAID3 Implementierung werden alle Festplatten im Array parallel genutzt. Die Leistung kann durch den Einsatz von mehreren Controllern weiter erhöht werden. Ein RAID3-Array hat eine Fehlertoleranz von 1 Laufwerk und bietet dabei eine Kapazität von 1 - 1/n der Gesamtkapazität der Laufwerke im Array, wobei n die Anzahl der Festplatten im Array darstellt. So eine Konfiguration ist meistens für die Speicherung von größeren Dateien geeignet, wie beispielsweise Multimediadateien.
+
+Mindestens 3 Festplatten sind erforderlich, um ein RAID3 zu erstellen. Jede Festplatte muss von der gleichen Größe sein, da die I/O-Anfragen für Lesen oder Schreiben auf mehreren Festplatten parallel stattfinden. Aufgrund der Beschaffenheit von RAID3, muss die Anzahl der Laufwerke 3, 5, 9, 17 bzw. 2^n + 1 sein.
+
+Dieser Abschnitt beschreibt, wie ein Software RAID3 auf einem FreeBSD-System erstellt wird.
+
+[NOTE]
+====
+Obwohl es theoretisch möglich ist FreeBSD von einem RAID3-Array zu booten, wird von solch einer ungewöhnlichen Konfiguration dringend abgeraten.
+====
+
+=== Ein dediziertes RAID3-Array erstellen
+
+In FreeBSD wird die Unterstützung für RAID3 über die GEOM-Klasse man:graid3[8] implementiert. Zum Erstellen eines dedizierten RAID3-Arrays sind folgende Schritte erforderlich.
+
+[.procedure]
+. Laden Sie zunächst das Modul [.filename]#geom_raid3.ko# mit einem der folgenden Befehle:
++
+[source,bash]
+....
+# graid3 load
+....
++
+oder:
++
+[source,bash]
+....
+# kldload geom_raid3
+....
+
+. Stellen Sie sicher, dass ein geeigneter Mountpunkt existiert. Dieser Befehl erstellt ein neues Verzeichnis, welches als Mountpunkt verwendet werden kann:
++
+[source,bash]
+....
+# mkdir /multimedia
+....
+
+. Bestimmen Sie die Gerätenamen der Festplatten, die dem Array hinzugefügt werden und erstellen Sie ein neues RAID3 Gerät. Das letzte aufgeführte Gerät wird als dediziertes Paritätslaufwerk verwendet. Dieses Beispiel verwendet drei unpartionierte ATA-Platten: [.filename]#ada1# und [.filename]#ada2# für die Daten, sowie [.filename]#ada3# für die Parität.
++
+[source,bash]
+....
+# graid3 label -v gr0 /dev/ada1 /dev/ada2 /dev/ada3
+Metadata value stored on /dev/ada1.
+Metadata value stored on /dev/ada2.
+Metadata value stored on /dev/ada3.
+Done.
+....
+
+. Partitionieren Sie das neu erstelle Gerät [.filename]#gr0# und erstellen Sie darauf ein UFS-Dateisystem:
++
+[source,bash]
+....
+# gpart create -s GPT /dev/raid3/gr0
+# gpart add -t freebsd-ufs /dev/raid3/gr0
+# newfs -j /dev/raid3/gr0p1
+....
++
+Viele Zahlen rauschen nun über den Bildschirm und nach einer gewissen Zeit ist der Vorgang abgeschlossen. Das Volume wurde erstellt und kann jetzt in den Verzeichnisbaum eingehangen werden:
++
+[source,bash]
+....
+# mount /dev/raid3/gr0p1 /multimedia/
+....
++
+Das RAID3-Array ist nun einsatzbereit.
+
+Weitere Konfigurationsschritte sind erforderlich, um die Einstellungen nach einem Systemneustart zu erhalten.
+
+[.procedure]
+. Das Modul [.filename]#geom_raid3.ko# muss geladen werden, bevor das Array eingehangen werden kann. Damit das Kernelmodul automatisch beim Systemstart geladen wird, muss die folgende Zeile in [.filename]#/boot/loader.conf# hinzugefügt werden:
++
+[.programlisting]
+....
+geom_raid3_load="YES"
+....
+. Die folgenden Informationen über das Volume müssen in [.filename]#/etc/fstab# hinzugefügt werden, um das Dateisystem des Arrays automatisch beim Systemstart zu aktivieren:
++
+[.programlisting]
+....
+/dev/raid3/gr0p1 /multimedia ufs rw 2 2
+....
+
+[[geom-graid]]
+== Software RAID
+
+Einige Motherboards und Erweiterungskarten besitzen ein ROM, das dem Rechner erlaubt von einem RAID-Array zu booten. Nach dem Booten wird der Zugriff auf das RAID-Array durch die Software auf dem Prozessor des Rechners abgewickelt. Dieses "Hardware-unterstützte Software-RAID" ist nicht abhängig von einem bestimmten Betriebssystem. Sie funktionieren bereits, noch bevor das Betriebssystem geladen wird.
+
+Abhängig von der verwendeten Hardware werden mehrere Arten von RAID unterstützt. Eine vollständige Liste finden Sie in man:graid[8].
+
+man:graid[8] benötigt das [.filename]#geom_raid.ko# Kernelmodul, welches beginnend mit FreeBSD 9.1 im [.filename]#GENERIC#-Kernel enthalten ist. Bei Bedarf kann es manuell mit `graid load` geladen werden.
+
+[[geom-raid-creating]]
+=== Ein Array erstellen
+
+Geräte mit Software-RAID haben oft ein Menü, das über eine bestimmte Tastenkombination beim Booten aufgerufen werden kann. Das Menü kann verwendet werden, um RAID-Arrays zu erstellen und zu löschen. Mit man:graid[8] können Arrays auch direkt von der Kommandozeile erstellt werden.
+
+`graid label` wird verwendet, um ein neues Array zu erstellen. Das Motherboard in diesem Beispiel besitzt einen Intel(R) Software-RAID Chipsatz, so dass das Metadatenformat von Intel(R) angegeben wird. Das neue Array bekommt den Namen (Label) [.filename]#gm0#, verhält sich als Spiegel (RAID1) und verwendet die Laufwerke [.filename]#ada0# und [.filename]#ada1#.
+
+[CAUTION]
+====
+
+Bei der Erstellung des Arrays wird etwas Platz auf den Laufwerken überschrieben. Sichern Sie zuvor alle vorhandenen Daten!
+====
+
+[source,bash]
+....
+# graid label Intel gm0 RAID1 ada0 ada1
+GEOM_RAID: Intel-a29ea104: Array Intel-a29ea104 created.
+GEOM_RAID: Intel-a29ea104: Disk ada0 state changed from NONE to ACTIVE.
+GEOM_RAID: Intel-a29ea104: Subdisk gm0:0-ada0 state changed from NONE to ACTIVE.
+GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from NONE to ACTIVE.
+GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NONE to ACTIVE.
+GEOM_RAID: Intel-a29ea104: Array started.
+GEOM_RAID: Intel-a29ea104: Volume gm0 state changed from STARTING to OPTIMAL.
+Intel-a29ea104 created$
+GEOM_RAID: Intel-a29ea104: Provider raid/r0 for volume gm0 created.
+....
+
+Eine Statusabfrage zeigt, dass der neue Spiegel einsatzbereit ist:
+
+[source,bash]
+....
+# graid status
+ Name Status Components
+raid/r0 OPTIMAL ada0 (ACTIVE (ACTIVE))
+ ada1 (ACTIVE (ACTIVE))
+....
+
+Das Array-Gerät erscheint in [.filename]#/dev/raid/#. Das erste Gerät heißt [.filename]#r0#. Falls weitere Geräte vorhanden sind heißen diese [.filename]#r1#, [.filename]#r2# und so weiter.
+
+Das BIOS-Menü einiger Geräte erstellt Arrays mit Sonderzeichen im Namen. Um Probleme mit diesen Sonderzeichen zu vermeiden, werden einfache numerische Namen wie [.filename]#r0# vergeben. Um das tatsächliche Label anzuzeigen, wie [.filename]#gm0# im obigen Beispiel, benutzen Sie man:sysctl[8]:
+
+[source,bash]
+....
+# sysctl kern.geom.raid.name_format=1
+....
+
+[[geom-graid-volumes]]
+=== Mehrere Volumes
+
+Einige Software-RAID Geräte unterstützen mehr als ein _Volume_ pro Array. Volumes funktionieren wie Festplatten, dass heißt der Platz auf den Laufwerken kann auf unterschiedliche Weise geteilt und genutzt werden. Intels Software-RAID Geräte unterstützen beispielsweise zwei Volumes. In diesem Beispiel wird ein 40 GB Spiegel verwendet um das Betriebssystem zu speichern, gefolgt von einem 20 GB RAID0 (Stripe) Volume für die schnelle Speicherung von temporären Daten.
+
+[source,bash]
+....
+# graid label -S 40G Intel gm0 RAID1 ada0 ada1
+# graid add -S 20G gm0 RAID0
+....
+
+Volumes erscheinen unter [.filename]#/dev/raid/# als zusätzliche Einträge [.filename]#rX#. Ein Array mit Volumes wird als [.filename]#r0# und [.filename]#r1#.
+
+Lesen Sie man:graid[8] um die Anzahl der Volumes zu ermitteln, die von den verschiedenen Software-RAID Geräten unterstützt wird.
+
+[[geom-graid-converting]]
+=== Ein einzelnes Laufwerk zu einem Spiegel konvertieren
+
+Unter bestimmten Umständen ist es möglich, ein bestehendes Laufwerk ohne Neuformatierung zu einem man:graid[8] Array zu konvertieren. Um Datenverlust bei der Konvertierung zu vermeiden, müssen die vorhandenen Laufwerke folgende Mindestanforderungen erfüllen:
+
+* Das Laufwerk muss mit MBR partitioniert werden. GPT oder andere Partitionierungsschemata funktionieren nicht, da durch man:graid[8] die Metadaten am Ende des Laufwerks überschieben und beschädigt werden.
+* Am Ende des Laufwerks muss genügend freier Platz zur Verfügung stehen, um die man:graid[8] Metadaten zu speichern. Die Metadaten variieren in der Größe, es werden jedoch mindestens 64 MB freier Speicherplatz empfohlen.
+
+Wenn das Laufwerk diese Anforderungen erfüllt, erstellen Sie zuerst eine vollständige Sicherung. Erzeugen Sie dann einen Spiegel mit diesem einen Laufwerk:
+
+[source,bash]
+....
+# graid label Intel gm0 RAID1 ada0 NONE
+....
+
+Die Metadaten von man:graid[8] werden in den ungenutzten Raum am Ende des Laufwerks geschrieben. Ein zweites Laufwerk kann nun in den Spiegel eingefügt werden:
+
+[source,bash]
+....
+# graid insert raid/r0 ada1
+....
+
+Die Daten von dem ersten Laufwerk werden direkt auf das zweite Laufwerk kopiert. Der Spiegel wird im eingeschränkten Zustand laufen, bis der Kopiervorgang abgeschlossen ist.
+
+[[geom-graid-inserting]]
+=== Neue Laufwerke zum Array hinzufügen
+
+Laufwerke in einem Array können für ausgefallene oder fehlende Laufwerke eingesetzt werden. Falls es keine ausgefallenen oder fehlenden Laufwerke gibt, wird das neue Laufwerk als Ersatz (Spare) verwendet.
+
+Das Array in diesem Beispiel beginnt sofort damit, die Daten auf das neu hinzugefügte Laufwerk zu kopieren. Alle vorhandenen Daten auf dem neuen Laufwerk werden überschrieben.
+
+[source,bash]
+....
+# graid insert raid/r0 ada1
+GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from NONE to ACTIVE.
+GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NONE to NEW.
+GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NEW to REBUILD.
+GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 rebuild start at 0.
+....
+
+[[geom-graid-removing]]
+=== Laufwerke aus dem Array entfernen
+
+Einzelne Laufwerke können permanent aus dem Array entfernt werden. Die Metadaten werden dabei gelöscht:
+
+[source,bash]
+....
+# graid remove raid/r0 ada1
+GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from ACTIVE to OFFLINE.
+GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-[unknown] state changed from ACTIVE to NONE.
+GEOM_RAID: Intel-a29ea104: Volume gm0 state changed from OPTIMAL to DEGRADED.
+....
+
+[[geom-graid-stopping]]
+=== Das Array anhalten
+
+Ein Array kann angehalten werden, ohne die Metadaten von den Laufwerken zu löschen. Das Array wird wieder anlaufen, wenn das System neu gestartet wird.
+
+[source,bash]
+....
+# graid stop raid/r0
+....
+
+[[geom-graid-status]]
+=== Den Status des Arrays überprüfen
+
+Der Status des Arrays kann jederzeit überprüft werden. Nachdem ein Laufwerk zum Array hinzugefügt wurde, werden die Daten vom ursprünglichen Laufwerk auf das neue Laufwerk kopiert:
+
+[source,bash]
+....
+# graid status
+ Name Status Components
+raid/r0 DEGRADED ada0 (ACTIVE (ACTIVE))
+ ada1 (ACTIVE (REBUILD 28%))
+....
+
+Andere Arten von Arrays, wie `RAID0` oder `CONCAT`, werden den Status eines fehlgeschlagenen Laufwerks vielleicht nicht anzeigen. Um diese teilweise ausgefallenen Arrays anzuzeigen, fügen Sie `-ga` hinzu:
+
+[source,bash]
+....
+# graid status -ga
+ Name Status Components
+Intel-e2d07d9a BROKEN ada6 (ACTIVE (ACTIVE))
+....
+
+[[geom-graid-deleting]]
+=== Arrays löschen
+
+Arrays werden zerstört, indem alle Volumes gelöscht werden. Wenn das letzte Volume gelöscht wird, wird das Array gestoppt und die Metadaten von den Laufwerken entfernt:
+
+[source,bash]
+....
+# graid delete raid/r0
+....
+
+[[geom-graid-unexpected]]
+=== Unerwartete Arrays löschen
+
+Laufwerke können unerwartete man:graid[8] Metadaten enthalten, entweder aus früherer Nutzung oder aus Tests des Herstellers. man:graid[8] würde diese Metadaten erkennen und daraus ein Array erstellen, was den Zugriff auf die einzelnen Laufwerke beeinträchtigen würde. Um die unerwünschten Metadaten zu entfernen:
+
+[.procedure]
+. Booten Sie das System. Im Boot-Menü wählen Sie `2` für den Loader-Prompt. Geben Sie dann folgendes ein:
++
+[source,bash]
+....
+OK set kern.geom.raid.enable=0
+OK boot
+....
++
+Das System wird nun mit deaktiviertem man:graid[8] starten.
+. Sichern Sie alle Daten auf dem betroffenen Laufwerk.
+. Zur Abhilfe kann auch die Array-Erkennung von man:graid[8] deaktiviert werden, indem
++
+[.programlisting]
+....
+kern.geom.raid.enable=0
+....
++
+in [.filename]#/boot/loader.conf# hinzugefügt wird.
++
+Um die man:graid[8] Metadaten von dem entsprechenden Laufwerk zu entfernen, booten Sie vom FreeBSD Installationsmedium und wählen Sie `Shell` aus. Benutzen Sie `status`, um den Namen des Arrays zu bestimmten, typischerweise `raid/r0`:
++
+[source,bash]
+....
+# graid status
+ Name Status Components
+raid/r0 OPTIMAL ada0 (ACTIVE (ACTIVE))
+ ada1 (ACTIVE (ACTIVE))
+....
++
+Löschen Sie das Volume:
++
+[source,bash]
+....
+# graid delete raid/r0
+....
++
+Wiederholen Sie den Vorgang für jedes Volume. Nachdem das letzte Volume gelöscht wurde, wird das Volume zerstört.
++
+Starten Sie das System neu und prüfen die Vollständigkeit der Daten. Falls erforderlich, müssen die Daten aus der Sicherung wiederhergestellt werden. Nachdem die Metadaten entfernt wurden, kann auch der Eintrag `kern.geom.raid.enable=0` aus [.filename]#/boot/loader.conf# entfernt werden.
+
+[[geom-ggate]]
+== GEOM Gate Netzwerk
+
+GEOM unterstützt einen einfachen Mechanismus für den Zugriff auf entfernte Geräte wie Festplatten, CDs und Dateien, durch die Verwendung des GEOM Gate Netzwerk Daemons, ggated. Der Server-Dameon läuft auf dem System, welches ein Gerät anbietet und bearbeitet die ggatec-Anfragen der Clients. Die Geräte sollten keine sensiblen Daten enthalten, da die Verbindung zwischen Client und Server nicht verschlüsselt ist.
+
+Ähnlich wie bei NFS, das in crossref:network-servers[network-nfs,"Network File System (NFS)"] beschrieben ist, wird für die Konfiguration von ggated eine Exportdatei verwendet. Diese Datei legt fest, welche Systeme auf die exportierten Ressourcen zugreifen können und in welchem Umfang der Zugriff gestattet wird. Um dem Client `192.168.1.5` Lese- und Schreibzugriff auf die vierte Slice der ersten SCSI-Platte zu geben, erstellen Sie [.filename]#/etc/gg.exports# mit folgender Zeile:
+
+[.programlisting]
+....
+192.168.1.5 RW /dev/da0s4d
+....
+
+Bevor das Gerät exportiert werden kann, müssen Sie sicherstellen, dass es nicht bereits gemountet ist. Anschließend starten Sie ggated.
+
+[source,bash]
+....
+# ggated
+....
+
+Es stehen mehrere Optionen bereit, mit denen zum Beispiel ein alternativer Port oder eine alternative Exportdatei festgelegt werden kann. Weitere Einzelheiten finden Sie in man:ggated[8].
+
+Damit ein Client auf das exportierte Gerät zugreifen kann, benutzten Sie ggatec zusammen mit der IP-Adresse des Servers und dem entsprechenden Gerätenamen. Wenn dies erfolgreich ist, zeigt dieser Befehl einen `ggate`-Gerätenamen. Hängen Sie dieses Gerät in einen freien Mountpunkt ein. Dieses Beispiel verbindet sich mit der Partition [.filename]#/dev/da0s4d# auf `192.168.1.1` und hängt [.filename]#/dev/ggate0# in [.filename]#/mnt# ein:
+
+[source,bash]
+....
+# ggatec create -o rw 192.168.1.1 /dev/da0s4d
+ggate0
+# mount /dev/ggate0 /mnt
+....
+
+Auf das Gerät des Servers kann jetzt über den Mountpunkt [.filename]#/mnt# des Clients zugegriffen werden. Weitere Informationen über `ggatec` und einige Anwendungsbeispiele finden Sie in man:ggatec[8].
+
+[NOTE]
+====
+Das Einhängen des Gerätes wird scheitern, falls das Gerät momentan entweder auf dem Server oder einem Client im Netzwerk gemountet ist. Wenn ein gleichzeitiger Zugriff auf die Netzwerkressourcen benötigt wird, verwenden Sie stattdessen NFS.
+====
+
+Wenn das Gerät nicht länger gebraucht wird, kann es mit man:umount[8] ausgehängt werden, so dass die Ressourcen für andere Client wieder verfügbar sind.
+
+[[geom-glabel]]
+== Das Labeln von Laufwerken
+
+Während der Initialisierung des Systems legt der FreeBSD-Kernel für jedes gefundene Gerät Knotenpunkte an. Diese Methode für die Überprüfung auf vorhandene Geräte wirft einige Fragen auf. Was passiert beispielsweise, wenn ein neues USB-Laufwerk hinzugefügt wird? Es ist sehr wahrscheinlich, dass ein Flash-Speicher-Gerät den Gerätenamen [.filename]#da0# erhält, während gleichzeitig das bisherige [.filename]#da0# zu [.filename]#da1# wird. Dies verursacht Probleme beim Einhängen von Dateisystemen, wenn diese in [.filename]#/etc/fstab# aufgeführt sind und kann dazu führen, dass das System nicht mehr startet.
+
+Eine Lösung für dieses Problem ist das Aneinanderketten der SCSI-Geräte, damit ein neues Gerät, welches der SCSI-Karte hinzugefügt wird, unbenutzte Gerätenummern erhält. Aber was geschieht, wenn ein USB-Gerät möglicherweise die primäre SCSI-Platte ersetzt? Dies kann passieren, weil USB-Geräte normalerweise vor der SCSI-Karte geprüft werden. Eine Lösung ist das Hinzufügen dieser Geräte, nachdem das System gestartet ist. Eine andere Lösung könnte sein, nur ein einzelnes ATA-Laufwerk zu nutzen und die SCSI-Geräte niemals in der [.filename]#/etc/fstab# aufzuführen.
+
+Eine bessere Lösung ist die Verwendung von `glabel`, um die Laufwerke zu mit Labeln zu versehen und diese in [.filename]#/etc/fstab# zu nutzen. Da `glabel` seine Label im letzten Sektor jedes vorhandenen Datenträgers speichert, wird das Label persistent bleiben (auch über Neustarts hinweg). Durch Nutzung dieses Labels als Gerät kann das Dateisystem immer gemountet sein, unabhängig davon, durch welchen Geräte-Knotenpunkt auf ihn zugegriffen wird.
+
+[NOTE]
+====
+`glabel` kann permanente (dauerhaft) und vorübergehende Label erstellen. Aber nur dauerhafte Label bleiben konsistent über Neustarts hinweg. Lesen Sie die man:glabel[8] für weitere Unterschiede zwischen den Label-Typen.
+====
+
+=== Label-Typen und Beispiele
+
+Permanente Label können generische Label oder Dateisystem-Label sein. Permanente Dateisystem-Label können mit man:tunefs[8] oder man:newfs[8] erzeugt werden. Dieser Typ von Label wird in einem Unterverzeichnis von [.filename]#/dev# angelegt und wird dem Dateisystem entsprechend benannt. UFS2-Dateisystem-Label werden zum Beispiel in [.filename]#/dev/ufs# angelegt. Permanente Label können außerdem durch den Befehl `glabel label` erzeugt werden. Diese Label sind nicht dateisystemspezisch und werden im Unterverzeichnis [.filename]#/dev/label# erzeugt.
+
+Temporäre Label werden beim nächsten Systemstart zerstört. Diese Label werden im Verzeichnis [.filename]#/dev/label# erzeugt und sind ideal für Testzwecke. Ein temporäres Label kann mit `glabel create` erzeugt werden.
+
+Um ein permanentes Label auf einem UFS2-Dateisystem ohne Löschung von Daten zu erzeugen, kann man folgenden Befehl verwenden:
+
+[source,bash]
+....
+# tunefs -L home /dev/da3
+....
+
+In [.filename]#/dev/ufs# sollte nun ein Label vorhanden sein, welches zu [.filename]#/etc/fstab# hinzugefügt werden kann:
+
+[.programlisting]
+....
+/dev/ufs/home /home ufs rw 2 2
+....
+
+[NOTE]
+====
+Das Dateisystem darf nicht gemountet sein beim Versuch, `tunefs` auszuführen.
+====
+
+Nun kann das Dateisystem eingehängt werden:
+
+[source,bash]
+....
+# mount /home
+....
+
+Von nun an kann der Geräte-Knotenpunkt sich ohne negative Effekte auf das System ändern, solange das Kernelmodul [.filename]#geom_label.ko# beim Systemstart mittels [.filename]#/boot/loader.conf# geladen wird oder die `GEOM_LABEL`-Kernel-Option aktiv ist.
+
+Dateisysteme können auch mit einem Standard-Label erzeugt werden (mittels des Flags `-L` in `newfs`). Lesen Sie man:newfs[8] für weitere Informationen.
+
+Der folgende Befehl kann genutzt werden, um das Label zu beseitigen:
+
+[source,bash]
+....
+# glabel destroy home
+....
+
+Das folgende Beispiel zeigt Ihnen, wie Sie Label für die Partitionen einer Bootplatte erzeugen.
+
+.Die Partitionen einer Bootplatte labeln
+[example]
+====
+Durch das Erstellen von permanenten Labeln für die Partitionen einer Bootplatte sollte das System selbst dann noch normal starten können, wenn Sie die Platte an einen anderen Controller anschließen oder in ein anderes System installieren. In diesem Beispiel nehmen wir an, dass nur eine einzige ATA-Platte verwendet wird, die das System derzeit als [.filename]#ad0# erkennt. Weiters nehmen wir an, dass Sie das Standard-Partionierungsschema von FreeBSD vewendet haben und die Platte daher die Dateisysteme [.filename]#/#, [.filename]#/var#, [.filename]#/usr# sowie [.filename]#/tmp# aufweist. Zusätzlich wurde eine Swap-Partition angelegt.
+
+Starten Sie das System neu. Am man:loader[8]-Prompt drücken Sie die Taste kbd:[4], um in den Single-User-Modus zu gelangen. Dort führen Sie die folgenden Befehle aus:
+
+[source,bash]
+....
+# glabel label rootfs /dev/ad0s1a
+GEOM_LABEL: Label for provider /dev/ad0s1a is label/rootfs
+# glabel label var /dev/ad0s1d
+GEOM_LABEL: Label for provider /dev/ad0s1d is label/var
+# glabel label usr /dev/ad0s1f
+GEOM_LABEL: Label for provider /dev/ad0s1f is label/usr
+# glabel label tmp /dev/ad0s1e
+GEOM_LABEL: Label for provider /dev/ad0s1e is label/tmp
+# glabel label swap /dev/ad0s1b
+GEOM_LABEL: Label for provider /dev/ad0s1b is label/swap
+# exit
+....
+
+Das System startet daraufhin in den Multi-User-Modus. Nachdem der Startvorgang abgeschlossen ist, editieren Sie [.filename]#/etc/fstab# und ersetzen die konventionellen Gerätedateien durch die entsprechenden Label. Die modifizierte [.filename]#/etc/fstab# sollte wie folgt aussehen:
+
+[.programlisting]
+....
+# Device Mountpoint FStype Options Dump Pass#
+/dev/label/swap none swap sw 0 0
+/dev/label/rootfs / ufs rw 1 1
+/dev/label/tmp /tmp ufs rw 2 2
+/dev/label/usr /usr ufs rw 2 2
+/dev/label/var /var ufs rw 2 2
+....
+
+Starten Sie das System neu. Treten keine Probleme auf, wird das System normal hochfahren und Sie erhalten die folgende Ausgabe, wenn Sie den Befehl `mount` ausführen:
+
+[source,bash]
+....
+# mount
+/dev/label/rootfs on / (ufs, local)
+devfs on /dev (devfs, local)
+/dev/label/tmp on /tmp (ufs, local, soft-updates)
+/dev/label/usr on /usr (ufs, local, soft-updates)
+/dev/label/var on /var (ufs, local, soft-updates)
+....
+
+====
+
+man:glabel[8] unterstützt einen Labeltyp für UFS-Dateisysteme. Dieser basiert auf der eindeutigen Dateisystem-ID `ufsid`. Derartige Label finden sich in [.filename]#/dev/ufsid# und werden während des Systemstarts automatisch erzeugt. Es ist möglich, diese `ufsid`-Label zum automatischen Einhängen von Partitionen in [.filename]#/etc/fstab# einzusetzen. Verwenden Sie `glabel status`, um eine Liste aller Dateisysteme und ihrer `ufsid`-Label zu erhalten:
+
+[source,bash]
+....
+% glabel status
+ Name Status Components
+ufsid/486b6fc38d330916 N/A ad4s1d
+ufsid/486b6fc16926168e N/A ad4s1f
+....
+
+In diesem Beispiel repräsentiert [.filename]#ad4s1d# das [.filename]#/var#-Dateisystem, während [.filename]#ad4s1f# dem [.filename]#/usr#-Dateisystem entspricht. Wenn Sie die angegebenen `ufsid`-Werte verwenden, können diese Dateisysteme durch die folgenden Einträge in der Datei [.filename]#/etc/fstab# gemountet werden:
+
+[.programlisting]
+....
+/dev/ufsid/486b6fc38d330916 /var ufs rw 2 2
+/dev/ufsid/486b6fc16926168e /usr ufs rw 2 2
+....
+
+Jede Partition, die ein `ufsid`-Label aufweist, kann auf diese Art gemountet werden. Dies hat den Vorteil, dass Sie die permanenten Label nicht manuell anlegen müssen, wobei sich die Platten nach wie vor über geräteunabhängige Namen ansprechen und einhängen lassen.
+
+[[geom-gjournal]]
+== UFS Journaling in GEOM
+
+FreeBSD unterstützt Journaling für UFS-Dateisysteme. Diese Funktion wird über das GEOM-Subsystem realisiert und kann über das Werkzeug man:gjournal[8] eingerichtet werden. Im Gegensatz zu anderen Journaling-Dateisystemen arbeitet `gjournal` blockbasiert und wurde nicht als Teil des Dateisystems implementiert, sondern als GEOM-Erweiterung.
+
+Bei Journaling wird ein Protokoll über alle Dateisystemtransaktionen angelegt, inklusive aller Veränderungen, aus denen ein kompletter Schreibvorgang besteht, bevor diese Änderungen (Metadaten sowie tatsächliche Schreibvorgänge) physisch auf der Festplatte ausgeführt werden. Dieses Protokoll kann später erneut aufgerufen werden, um diese Vorgänge zu wiederholen, damit Systeminkonsistenzen vermieden werden.
+
+Diese Technik bietet eine weitere Möglichkeit, sich vor Datenverlust und Dateisystem-Inkonsistenzen zu schützen. Im Gegensatz zu Soft Updates (die Metadaten-Aktualisierungen verfolgen und erzwingen) und Snapshots (die ein Image eines Dateisystems darstellen) wird bei Journaling ein tatsächliches Protokoll in einem speziell dafür bereitgestellten Bereich der Festplatte gespeichert. Um die Leistung zu optimieren, kann das Journal auf eine externe Platte ausgelagert werden. In einem solchen Fall geben Sie die Gerätedatei der Platte nach dem Gerät an, für das Sie Journaling aktivieren wollen.
+
+Der [.filename]#GENERIC#-Kernel bietet Unterstützung für `gjournal`. Damit das Kernelmodul [.filename]#geom_journal.ko# beim Booten automatisch geladen wird, fügen Sie folgende Zeile in [.filename]#/boot/loader.conf# hinzu:
+
+[.programlisting]
+....
+geom_journal_load="YES"
+....
+
+Wenn ein angepasster Kernel benutzt wird, stellen Sie sicher, dass folgende Zeile in der Kernelkonfigurationsdatei enthalten ist:
+
+[.programlisting]
+....
+options GEOM_JOURNAL
+....
+
+Sobald das Modul geladen ist, kann ein Journal auf einem neuen Dateisystem erstellt werden. In diesem Beispiel ist [.filename]#da4# die neue SCSI-Platte:
+
+[source,bash]
+....
+# gjournal load
+# gjournal label /dev/da4
+....
+
+Diese Befehle laden das Modul und erstellen die Gerätedatei [.filename]#/dev/da4.journal# auf [.filename]#/dev/da4#.
+
+Nun kann auf dem neuen Gerät ein UFS-Dateisystem erstellt werden, welches dann in den Verzeichnisbaum eingehängt wird:
+
+[source,bash]
+....
+# newfs -O 2 -J /dev/da4.journal
+# mount /dev/da4.journal /mnt
+....
+
+[NOTE]
+====
+Falls auf dem System mehrere Slices angelegt sind (beispielsweise [.filename]#ad4s1# sowie [.filename]#ad4s2#), wird `gjournal` für jedes Slice ein Journal anlegen (also [.filename]#ad4s1.journal# sowie [.filename]#ad4s2.journal#).
+====
+
+Mit `tunefs` ist es auch möglich, Journaling auf bereits existierenden Dateisystemen zu aktivieren. Machen Sie aber _immer_ eine Sicherung der Daten, bevor Sie versuchen, ein existierendes Dateisystem zu ändern. `gjournal` wird zwar den Vorgang abbrechen, wenn es das Journal nicht erzeugen kann, allerdings schützt dies nicht vor Datenverlust durch einen fehlerhaften Einsatz von `tunefs`. Weitere Informationen über diese beiden Werkzeuge finden Sie in man:gjournal[8] und man:tunefs[8].
+
+Es ist möglich, Journale auch für die Bootplatte eines FreeBSD-Systems zu verwenden. Der Artikel link:{gjournal-desktop}[ Implementing UFS Journaling on a Desktop PC] enthält eine ausführliche Anleitung zu diesem Thema.
diff --git a/documentation/content/de/books/handbook/introduction/_index.adoc b/documentation/content/de/books/handbook/introduction/_index.adoc
new file mode 100644
index 0000000000..b2a61abf5e
--- /dev/null
+++ b/documentation/content/de/books/handbook/introduction/_index.adoc
@@ -0,0 +1,214 @@
+---
+title: Kapitel 1. Einleitung
+part: Teil I. Erste Schritte
+prev: books/handbook/parti
+next: books/handbook/bsdinstall
+---
+
+[[introduction]]
+= Einleitung
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 1
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[introduction-synopsis]]
+== Überblick
+
+Herzlichen Dank für Ihr Interesse an FreeBSD! Das folgende Kapitel behandelt verschiedene Aspekte des FreeBSD Projekts wie dessen geschichtliche Entwicklung, seine Ziele oder das Entwicklungsmodell.
+
+Nach dem Durcharbeiten des Kapitels wissen Sie über folgende Punkte Bescheid:
+
+* Wo FreeBSD im Vergleich zu anderen Betriebssystemen steht
+* Die Geschichte des FreeBSD Projekts
+* Die Ziele des FreeBSD Projekts
+* Die Grundlagen des FreeBSD-Open-Source-Entwicklungsmodells
+* Und natürlich woher der Name "FreeBSD" kommt.
+
+[[nutshell]]
+== Willkommen zu FreeBSD!
+
+FreeBSD ist ein offenes, standardkonformes Unix-ähnliches Betriebssystem für x86 (32 und 64 Bit) ARM(R), AARch64, RISC-V(R), MIPS(R), POWER(R), PowerPC(R) und Sun UltraSPARC(R) Rechner. Es bietet alle Funktionen, die heutzutage als selbstverständlich angesehen werden, wie präemptives Multitasking, Speicherschutz, virtueller Speicher, Mehrbenutzerfunktionen, SMP-Unterstützung, Open Source Entwicklungswerkzeuge für verschiedene Sprachen und Frameworks sowie Desktop-Funktionen rund um das X Window System, KDE und GNOME. Besondere Eigenschaften sind:
+
+* _Liberale Open Source Lizenz_, die Ihnen das Recht einräumt, den Quellcode frei zu modifizieren und zu erweitern und ihn in freien oder proprietären Produkten zu integrieren, ohne dabei den für Copyleft-Lizenzen typischen Einschränkungen zu unterliegen. Ebenso sollen mögliche Inkompatibilitätsprobleme vermieden werden.
+* _Starke TCP/IP-Netzwerkfähigkeit_ - FreeBSD implementiert Industrie-Standardprotokolle mit immer höherer Leistung und Skalierbarkeit. Dies macht FreeBSD zu einer exzellenten Lösung sowohl für Server, als auch für Routing/Firewall Aufgaben. Tatsächlich nutzen viele Unternehmen und Anbieter FreeBSD zu genau diesem Zweck.
+* _Vollständig integrierte OpenZFS-Unterstützung_, einschließlich root-on-ZFS, ZFS Boot Environments, Fehlermanagement, administrative Delegation, Unterstützung für Jails, FreeBSD-spezifische Dokumentation und Unterstützung im System-Installationsprogramm.
+* _Umfangreiche Sicherheitsfunktionen_, vom System für die verbindliche Zugriffskontrolle (Mandatory Access Control, MAC), bis hin zu Capsicum und Sandbox-Mechanismen.
+* _Über 30.000 vorkonfigurierte Pakete_ für alle unterstützten Architekturen und die Ports-Sammlung, die es Benutzern einfach macht, eigene, angepasste Software zu erstellen.
+* _Dokumentation_ - Zusätzlich zu diesem Handbuch und Büchern von verschiedenen Autoren, die Themen von Systemadministration bis hin zu Kernel-Interna behandeln, gibt es auch die man:man[1] Seiten, nicht nur für Daemonen, Dienstprogramme und Konfigurationsdateien, sondern auch für Kernel-APIs (Sektion 9) und individuelle Treiber (Sektion 4).
+* _Einfache und konsistente Repository-Struktur und Build-System_ - FreeBSD benutzt ein einziges Repository für alle seine Komponenten, sowohl den Kernel als auch das Basissystem. Dies, zusammen mit einem einheitlichen und leicht anpassbaren Build-System und einem gut durchdachten Entwicklungsprozess, macht es einfach, FreeBSD in die Build-Infrastruktur für Ihr eigenes Produkt zu integrieren.
+* _Der Unix-Philosophie treu bleiben_ und Kombinierbarkeit den monolithischen "all in one"-Daemonen mit hartkodiertem Verhalten vorziehen.
+* _Binärkompatibilität_ mit Linux, die es möglich macht, viele Linux-Binärdateien ohne Virtualisierung auszuführen.
+
+FreeBSD basiert auf dem 4.4BSD-LiteRelease der Computer Systems Research Group (CSRG) der Universität von Kalifornien in Berkeley und führt die namenhafte Tradition der Entwicklung von BSD-Systemen fort. Zusätzlich zu der herausragenden Arbeit CSRG hat das FreeBSD Projekt tausende weitere Arbeitsstunden investiert, um das System zu erweitern, verfeinern und maximale Leistung und Zuverlässigkeit bei Alltagslast zu bieten. FreeBSD bietet Leistung und Zuverlässigkeit auf dem Niveau von Open Source und kommerziellen Angeboten, und kombiniert innovative Funktionen, die woanders nicht verfügbar sind.
+
+[[os-overview]]
+=== Was kann FreeBSD?
+
+Die Anwendungsmöglichkeiten von FreeBSD werden nur durch Ihre Vorstellungskraft begrenzt. Von Software-Entwicklung bis zu Produktionsautomatisierung, von Lagerverwaltung über Abweichungskorrektur bei Satelliten; Falls etwas mit kommerziellen UNIX(R) Produkten machbar ist, dann ist es höchstwahrscheinlich auch mit FreeBSD möglich. FreeBSD profitiert stark von tausenden hochwertigen Anwendungen aus wissenschaftlichen Instituten und Universitäten in aller Welt. Häufig sind diese für wenig Geld oder sogar kostenlos zu bekommen.
+
+Durch den freien Zugang zum Quellcode von FreeBSD ist es in unvergleichbarer Weise möglich, das System für spezielle Anwendungen oder Projekte anzupassen. Dies ist mit den meisten kommerziellen Betriebssystemen einfach nicht möglich. Beispiele für Anwendungen, die unter FreeBSD laufen, sind:
+
+* _Internet-Dienste:_ Die robuste TCP/IP-Implementierung in FreeBSD macht es zu einer idealen Plattform für verschiedenste Internet-Dienste, wie zum Beispiel:
+
+** Webserver
+** IPv4- und IPv6-Routing
+** Firewall NAT ("IP-Masquerading")-Gateways
+** FTP-Server
+** E-Mail-Server
+** Und mehr...
+
+* _Bildung:_ Sind Sie Informatikstudent oder Student eines verwandten Studiengangs? Die praktischen Einblicke in FreeBSD sind die beste Möglichkeit etwas über Betriebssysteme, Rechnerarchitektur und Netzwerke zu lernen. Einige frei erhältliche CAD-, mathematische und grafische Anwendungen sind sehr nützlich, gerade für diejenigen, deren Hauptinteresse in einem Computer darin besteht, _andere_ Arbeit zu erledigen!
+* _Forschung:_ Mit dem frei verfügbaren Quellcode für das gesamte System bildet FreeBSD ein exzellentes Studienobjekt in der Disziplin der Betriebssysteme, wie auch in anderen Zweigen der Informatik. Es ist beispielsweise denkbar, das räumlich getrennte Gruppen gemeinsam an einer Idee oder Entwicklung arbeiten. Das Konzept der freien Verfügbarkeit und -nutzung von FreeBSD ermöglicht so die freie Verwendung, ohne sich gross Gedanken über Lizenzbedingungen zu machen oder aufgrund von Beschränkungen evtl. in einem offenen Forum bestimmte Dinge nicht diskutieren zu dürfen.
+* _Netzwerkfähigkeit:_ Brauchen Sie einen neuen Router? Oder einen Name-Server (DNS)? Eine Firewall zum Schutze Ihres Intranets vor Fremdzugriff? FreeBSD macht aus dem in der Ecke verstaubenden 386- oder 486-PC im Handumdrehen einen leistungsfähigen Router mit anspruchsvollen Paketfilter-Funktionen.
+* _Embedded:_ FreeBSD ist eine exzellente Plattform, um auf embedded Systemen aufzubauen. Mit der Unterstützung für die ARM(R)-, MIPS(R)- und PowerPC(R)-Plattformen, verbunden mit dem robusten Netzwerkstack, aktuellen Neuerungen und der freizügigen link:{faq}#bsd-license-restrictions[BSD-Lizenz] stellt FreeBSD eine ausgezeichnete Basis für embedded Router, Firewalls und andere Geräte dar.
+* _Desktop:_ FreeBSD ist eine gute Wahl für kostengünstige X-Terminals mit dem frei verfügbaren X11-Server. FreeBSD bietet die Auswahl aus vielen Open Source Desktop Umgebungen, dazu gehören auch die GNOME und KDE GUIs. FreeBSD kann sogar "plattenlos" booten, was einzelne Workstations sogar noch günstiger macht und die Verwaltung erleichtert.
+* _Software-Entwicklung:_ Das Standard-FreeBSD-System wird mit einem kompletten Satz an Entwicklungswerkzeugen bereitgestellt, unter anderem einem vollständigen C/C++-Compiler und -Debugger. Entwicklungswerkzeugen. Viele zusätzliche Programmiersprachen für Wissenschaft und Entwicklung sind aus der Ports- und Paket-Sammlung zu haben.
+
+FreeBSD ist sowohl in Form von Quellcode als auch in Binärform auf CD-ROM, DVD und über Anonymous FTP erhältlich. Lesen Sie dazu crossref:mirrors[mirrors, Bezugsquellen für FreeBSD], um weitere Informationen erhalten.
+
+[[introduction-nutshell-users]]
+=== Wer verwendet FreeBSD?
+
+FreeBSD ist bekannt für seine Stärken als Webserver - zu den Webseiten, die unter FreeBSD laufen, gehören https://news.ycombinator.com/[Hacker News], http://www.netcraft.com/[Netcraft], http://www.163.com/[NetEase], https://signup.netflix.com/openconnect[Netflix], http://www.sina.com/[Sina], http://www.sony.co.jp/[Sony Japan], http://www.rambler.ru/[Rambler], http://www.yahoo.com/[Yahoo!], und http://www.yandex.ru/[Yandex].
+
+FreeBSDs fortgeschrittene Eigenschaften, bewährte Sicherheit und vorhersehbare Release-Zyklen, genauso wie seine tolerante Lizenz haben dazu geführt, dass es als Plattform zum Aufbau vieler kommerzieller und quelloffener Geräte und Produkte verwendet wird. Viele der weltgrössten IT-Unternehmen benutzen FreeBSD:
+
+* http://www.apache.org/[Apache]- Die Apache Software Foundation lässt den Grossteil seiner der Öffentlichkeit zugänglichen Infrastruktur, inklusive des möglicherweise grössten SVN-Repositories der Welt mit über 1,4 Millionen Commits, auf FreeBSD laufen.
+* http://www.apple.com/[Apple]- OS X verwendet viel von FreeBSDs eigenem Netzwerkstack, virtuellem Dateisystem und den Benutzerumgebungskomponenten für sein eigenes System. Apple iOS nutzt ebenso Elemente, die es von FreeBSD übernommen hat
+* http://www.cisco.com/[Cisco]- IronPort Network Sicherheits- und Anti-Spam-Appliance verwendet einen modifizierten FreeBSD-Kernel.
+* http://www.citrix.com/[Citrix]- Die NetScaler Reihe von Sicherheits-Appliances bietet auf den Schichten 4-7 Load-Balancing, Content Caching, Anwendungsfirewall, gesichertes VPN und mobilen Cloud-Netzwerkzugriff, gepaart mit der Mächtigkeit der FreeBSD-Shell.
+* https://www.emc.com/isilon[Isilon]- Isilons Unternehmens-Speicherappliances basieren auf FreeBSD. Die extrem liberale FreeBSD-Lizenz erlaubt Isilon ihr intellektuelles Eigentum durch den gesamten Kernel zu integrieren und kann sich so auf das Erstellen ihres Produktes und nicht des Betriebssystems fokussieren.
+* http://www.quest.com/KACE[Quest KACE]- Die KACE Systemmanagement-Appliances nutzen FreeBSD wegen seiner Zuverlässigkeit, Skalierbarkeit und Gemeinschaft, welche deren zukünftige Weiterentwicklung fördert.
+* http://www.ixsystems.com/[iXsystems]- Die TrueNAS-Linie von vereinheitlichten Speicherappliances beruht auf FreeBSD. Zusätzlich zu deren kommerziellen Produkten, managed iXsystems auch noch die beiden Open Source Projekte TrueOS und FreeNAS.
+* http://www.juniper.net/[Juniper]- Das JunOS Betriebssystem, welches alle Juniper Netzwerkgeräte (inklusive Router, Switche, Sicherheits- und Netzwerkappliances) antreibt, verwendet FreeBSD Juniper ist einer der vielen Hersteller, welcher das symbolische Verhältnis zwischen dem Projekt und dem Hersteller von kommerziellen Produkten darstellt. Verbesserungen, die Juniper entwickelt hat, werden ebenso in FreeBSD aufgenommen, um die Komplexität der Integration neuer Eigenschaften von FreeBSD zurück in zukünftige JunOS Versionen zu vereinfachen.
+* http://www.mcafee.com/[McAfee]- SecurOS, die Basis von McAfee Enterprise-Firewallprodukten inkl. Sidewinder basiert auf FreeBSD.
+* http://www.netapp.com/[NetApp]- Die Data ONTAP GX Reihe von Speicherappliances basieren auf FreeBSD. Zusätzlich hat NetApp viele Neuheiten beigesteuert, inklusive des neuen BSD-lizensierten Hypervisors bhyve.
+* http://www.netflix.com/[Netflix]- Die OpenConnect-Appliance, die Netflix verwendet, um Filme zu seinen Kunden zu streamen basiert auf FreeBSD. Netflix hat weitreichende Beiträge zum Quellcode von FreeBSD beigetragen und arbeitet daran, ein möglichst geringes Delta zur normalen Version beizubehalten. Netflix OpenConnect-Appliances sind für mehr als 32% vom gesamten Internetverkehr in Nordamerika verantwortlich.
+* http://www.sandvine.com/[Sandvine]- Sandvine nutzt FreeBSD as die Basis für deren Echtzeit Hochgeschwindigkeits-Netzwerkplattform, welche den Kern deren intelligenter Netzwerkpolicy-Kontrollprodukte darstellt.
+* http://www.sony.com/[Sony]- Die PlayStation 4 Spielekonsole verwendet eine modifizierte Version von FreeBSD.
+* http://www.sophos.com/[Sophos]- Das Sophos Email-Appliance Produkt basiert auf einem abgesicherten FreeBSD und scannt eingehende E-Mail auf Spam und Viren, während es gleichzeitig ausgehende Mail auf Schadsoftware und versehentlichen Versand von vertraulichen Informationen überwacht.
+* http://www.spectralogic.com/[Spectra Logic]- Die nTier Reihe von archivspeicherfähigen Appliances nutzt FreeBSD und OpenZFS.
+* https://www.stormshield.eu[Stormshield] - Stormshield Network Security Appliances basieren auf einer abgesicherten Version von FreeBSD. Die BSD-Lizenz erlaubt es ihnen, ihr geistiges Eigentum in das System zu integrieren und gleichzeitig interessante Entwicklungen an die Gemeinschaft zurückzugeben.
+* http://www.weather.com/[The Weather Channel]- Die IntelliStar Appliance, welche am Kopfende eines jeden Kabelversorgers installiert ist und für das Einspeisen von lokalen Wettervorhersagen in das Kabelfernsehprogramm verantwortlich ist, läuft auf FreeBSD.
+* http://www.verisign.com/[Verisign]- Verisign ist für den Betrieb der .com und .net Root-Domainregistries genauso verantwortlich wie für die dazugehörige DNS-Infrastruktur. Sie verlassen sich auf einen Reihe von verschiedenen Netzwerkbetriebssystemen inklusive FreeBSD, um zu gewährleisten, dass es keine gemeinsame Fehlerstelle in deren Infrastruktur gibt.
+* http://www.voxer.com/[Voxer]- Voxer verwendet ZFS auf FreeBSD für ihre mobile Voice-Messaging-Platform. Voxer wechselte von einem Solaris-Derivat zu FreeBSD, wegen der ausgezeichneten Dokumentation und wegen der größeren, aktiveren und sehr Entwickler freundlichen Gemeinschaft. Neben entscheidenen Merkmalen wie ZFS und DTrace bietet FreeBSD auch TRIM-Unterstützung für ZFS.
+* https://fudosecurity.com/en/[Fudo Security]- Die FUDO Sicherheitsappliance erlaubt es Unternehmen, Vertragspartner und Administratoren, die an ihren Systemen arbeiten durchführen, zu überwachen, zu kontrollieren, aufzuzeichnen und zu begutachten. Dies basiert auf all den besten Sicherheitseigenschaften von FreeBSD, inklusive ZFS, GELI, Capsicum, HAST und auditdistd.
+
+FreeBSD hat ebenfalls eine Reihe von verwandten Open Source Projekten hervorgebracht:
+
+* http://bsdrp.net/[BSD Router]- Einen FreeBSD-basierten Ersatz für grosse Unternehmensrouter, der entwickelt wurde, um auf Standard PC-Hardware zu laufen.
+* http://www.freenas.org/[FreeNAS]- Ein eigens dafür entworfenes FreeBSD für den Zweck als Netzwerk-Dateiserver Appliance zu fungieren. Es enthält eine Python-basierte Webschnittstelle, um das Management von sowohl UFS- als auch ZFS-Systemen zu vereinfachen. Enthalten sind NFS, SMB/CIFS, AFP, FTP und iSCSI. Ebenfalls enthalten ist ein erweiterteres Plugin-System basierend auf FreeBSD-Jails.
+* https://ghostbsd.org/[GhostBSD]- basiert auf FreeBSD und verwendet die GTK-Umgebung, um ein schönes Aussehen und eine komfortable Erfahrung auf der modernen BSD-Plattform zu liefern, die eine natürliche und native UNIX(R)-Arbeitsumgebung bietet.
+* http://mfsbsd.vx.sk/[mfsBSD]- Eine Sammlung von Werkzeugen zum Erstellen von FreeBSD-Systemimages, welches ausschliesslich im Hauptspeicher läuft.
+* http://www.nas4free.org/[NAS4Free]- Eine Dateiserverdistribution basierend auf FreeBSD mit einer von PHP-getriebenen Webschnittstelle.
+* http://www.opnsense.org/[OPNSense]- OPNSense ist eine quelloffene, einfach zu benutzende und auf FreeBSD basierende Firewall- und Router-Plattform. OPNSense enthält viele Funktionen die sonst nur in kommerziellen Firewalls enthalten sind und manchmal sogar mehr. Es kombiniert die vielfältigen Funktionen kommerzieller Angebote mit den Vorteilen von offenen und nachprüfbaren Quellen.
+* https://www.trueos.org/[TrueOS]- TrueOS basiert auf der legendären Sicherheit und Stabilität von FreeBSD. TrueOS basiert auf FreeBSD-CURRENT und bietet die aktuellsten Treiber, Sicherheitsaktualisierungen und Pakete.
+* https://www.furybsd.org[FuryBSD] - ein brandneuer, quelloffener FreeBSD Desktop. FuryBSD ist eine Hommage an die Desktop-BSD-Projekte der Vergangenheit wie PC-BSD und TrueOS mit seiner graphischen Oberfläche und beinhaltet zusätzliche Werkzeuge wie ein hybrides USB/DVD-Abbild hinzu. FuryBSD ist vollständig frei nutzbar und wird unter der BSD-Lizenz vertrieben.
+* https://www.midnightbsd.org[MidnightBSD] - ist ein auf FreeBSD basierendes Betriebssystem, das mit Blick auf Desktop-Benutzer entwickelt wurde. Es enthält die gesamte Software, die Sie für Ihre täglichen Aufgaben erwarten: Mail, Web-Browsing, Textverarbeitung, Spiele und vieles mehr.
+* http://www.pfsense.org/[pfSense]- Eine Firewalldistribution basierend auf FreeBSD mit eine grossen Menge von Fähigkeiten und ausgedehnter IPv6-Unterstützung.
+* http://zrouter.org/[ZRouter]- Eine Open Source Firmware-Alternative für eingebettete Geräte, die auf FreeBSD basiert. Entwickelt wurde sie, um die proprietäre Firmware von Standard-Routern zu ersetzen.
+
+Eine Liste von https://www.freebsdfoundation.org/about/testimonials/[Referenzen von Unternehmen, dessen Produkte und Dienstleistungen auf FreeBSD basieren], finden Sie auf der Webseite der FreeBSD Foundation. Wikipedia pflegt eine https://en.wikipedia.org/wiki/List_of_products_based_on_FreeBSD[Liste von Produkten, die auf FreeBSD basieren.]
+
+[[history]]
+== Über das FreeBSD Projekt
+
+Der folgende Abschnitt bietet einige Hintergrundinformationen zum FreeBSD Projekt, einschließlich einem kurzen geschichtlichen Abriss, den Projektzielen und dem Entwicklungsmodell.
+
+[[intro-history]]
+=== Kurzer geschichtlicher Abriss zu FreeBSD
+
+Das FreeBSD Projekt wurde Anfang 1993 ins Leben gerufen, zum Teil als Ergebnis der Arbeit der letzten drei Koordinatoren des "Unofficial 386BSD Patchkit": Nate Williams, Rod Grimes und Jordan Hubbard.
+
+Das ursprüngliche Ziel war es, einen zwischenzeitlichen Abzug von 386BSD zu erstellen, um ein paar Probleme zu beseitigen, die das Patchkit-Verfahren nicht lösen konnte. Der frühe Arbeitstitel für das Projekt war "386BSD 0.5" oder "386BSD Interim" als Referenz darauf.
+
+386BSD war das Betriebssystem von Bill Jolitz, welches bis zu diesem Zeitpunkt heftig unter fast einjähriger Vernachlässigung litt. Als das Patchkit mit jedem Tag anschwoll und unhandlicher wurde, entschied man sich, Bill Jolitz zu helfen, indem ein übergangsweise "bereinigter" Abzug zur Verfügung gestellt wurde. Diese Pläne wurden durchkreuzt, als Bill Jolitz plötzlich seine Zustimmung zu diesem Projekt zurückzog, ohne einen Hinweis darauf, was stattdessen geschehen sollte.
+
+Das Trio entschied, dass das Ziel sich weiterhin lohnen würde, selbst ohne die Unterstützung von Bill und so wurde entschieden, den Namen FreeBSD zu verwenden, der von David Greenman geprägt wurde. Die anfänglichen Ziele wurden festgelegt, nachdem man sich mit den momentanen Benutzern des Systems besprach und abzusehen war, dass das Projekt die Chance hatte, Realität zu werden, kontaktierte Jordan Walnut Creek CDROM mit dem Vorhaben, FreeBSDs Verteilung auch auf diejenigen auszuweiten, die noch keinen Internetzugang besaßen. Walnut Creek CDROM unterstützte nicht nur die Idee durch die Verbreitung von FreeBSD auf CD, sondern ging auch so weit dass es dem Projekt eine Maschine mit schneller Internetverbindung zur Verfügung stellte, um damit zu arbeiten. Ohne den von Walnut Creek bisher nie dagewesenen Grad von Vertrauen in ein, zur damaligen Zeit, komplett unbekanntes Projekt, wäre es unwahrscheinlich, dass FreeBSD so weit gekommen wäre, wie es heute ist.
+
+Die erste auf CD-ROM (und netzweit) verfügbare Veröffentlichung war FreeBSD 1.0 im Dezember 1993. Diese basierte auf dem Band der 4.3BSD-Lite ("Net/2") der Universität von Kalifornien in Berkeley. Viele Teile stammten aus 386BSD und von der Free Software Foundation. Gemessen am ersten Angebot, war das ein ziemlicher Erfolg und Sie ließen dem das extrem erfolgreiche FreeBSD 1.1 im Mai 1994 folgen.
+
+Zu dieser Zeit formierten sich unerwartete Gewitterwolken am Horizont, als Novell und die Universität von Kalifornien in Berkeley (UCB) ihren langen Rechtsstreit über den rechtlichen Status des Berkeley Net/2-Bandes mit einem Vergleich beilegten. Eine Bedingung dieser Einigung war es, dass die UCB große Teile des Net/2-Quellcodes als "belastet" zugestehen musste, und dass diese Besitz von Novell sind, welches den Code selbst einige Zeit vorher von AT&T bezogen hatte. Im Gegenzug bekam die UCB den "Segen" von Novell, dass sich das 4.4BSD-Lite-Release bei seiner endgültigen Veröffentlichung als unbelastet bezeichnen darf. Alle Net/2-Benutzer sollten auf das neue Release wechseln. Das betraf auch FreeBSD. Dem Projekt wurde eine Frist bis Ende Juli 1994 eingeräumt, das auf Net/2-basierende Produkt nicht mehr zu vertreiben. Unter den Bedingungen dieser Übereinkunft war es dem Projekt noch erlaubt ein letztes Release vor diesem festgesetzten Zeitpunkt herauszugeben. Das war FreeBSD 1.1.5.1.
+
+FreeBSD machte sich dann an die beschwerliche Aufgabe, sich Stück für Stück aus einem neuen und ziemlich unvollständigen Satz von 4.4BSD-Lite-Teilen, wieder aufzubauen. Die "Lite" -Veröffentlichungen waren deswegen leicht, weil Berkeleys CSRG große Code-Teile, die für ein start- und lauffähiges System gebraucht wurden, aufgrund diverser rechtlicher Anforderungen entfernen musste und weil die 4.4-Portierung für Intel-Rechner extrem unvollständig war. Das Projekt hat bis November 1994 gebraucht diesen Übergang zu vollziehen. Im Dezember wurde dann FreeBSD 2.0 veröffentlicht. Obwohl FreeBSD gerade die ersten Hürden genommen hatte, war dieses Release ein maßgeblicher Erfolg. Diesem folgte im Juni 1995 das robustere und einfacher zu installierende FreeBSD 2.0.5.
+
+Seit dieser Zeit hat FreeBSD eine Reihe von Releases veröffentlicht, die jedes mal die Stabilität, Geschwindigkeit und Menge an verfügbaren Eigenschaften der vorherigen Version verbessert.
+
+Momentan werden langfristige Entwicklungsprojekte im 10.X-CURRENT (Trunk)-Zweig durchgeführt, und Abzüge (Snapshots) der Releases von 10.X werden regelmässig auf den link:ftp://ftp.FreeBSD.org/pub/FreeBSD/snapshots/[Snapshot-Servern] zur Verfügung gestellt.
+
+[[goals]]
+=== Ziele des FreeBSD-Projekts
+
+Das FreeBSD Projekt stellt Software her, die ohne Einschränkungen für beliebige Zwecke eingesetzt werden kann. Viele von uns haben beträchtlich in Quellcode und das Projekt investiert und hätten sicher nichts dagegen, hin und wieder ein wenig finanziellen Ausgleich dafür zu bekommen. Aber in keinem Fall bestehen wir darauf. Wir glauben unsere erste und wichtigste "Mission" ist es, Software für jeden Interessierten und zu jedem Zweck zur Verfügung zu stellen, damit die Software größtmögliche Verbreitung erlangt und größtmöglichen Nutzen stiftet. Das ist, glaube ich, eines der grundlegenden Ziele freier Software, welche wir mit größter Begeisterung unterstützen.
+
+Der Code in unserem Quellbaum, der unter die General Public License (GPL) oder die Library General Public License (LGPL) fällt, stellt geringfügig mehr Bedingungen. Das aber vielmehr im Sinne von eingefordertem Zugriff, als das übliche Gegenteil der Beschränkungen. Aufgrund zusätzlicher Abhängigkeiten, die sich durch die Verwendung von GPL-Software bei kommerziellem Gebrauch ergeben, bevorzugen wir daher Software unter der transparenteren BSD-Lizenz, wo immer es angebracht ist.
+
+[[development]]
+=== Das FreeBSD-Entwicklungsmodell
+
+Die Entwicklung von FreeBSD ist ein offener und flexibler Prozess, der durch den Beitrag von buchstäblich tausenden Leuten rund um die Welt ermöglicht wird, wie an der link:{contributors}[Liste der Beitragenden] ersehen können. Die vielen Entwickler können aufgrund der Entwicklungs-Infrastruktur von FreeBSD über das Internet zusammenarbeiten. Wir suchen ständig nach neuen Entwicklern, Ideen und jenen, die sich in das Projekt tiefer einbringen wollen. Nehmen Sie einfach auf der Mailingliste {freebsd-hackers} Kontakt mit uns auf. Die Mailingliste {freebsd-announce} steht für wichtige Ankündigungen, die alle FreeBSD-Benutzer betreffen, zur Verfügung.
+
+Unabhängig davon ob Sie alleine oder mit anderen eng zusammen arbeiten, enthält die folgende Aufstellung nützliche Informationen über das FreeBSD Projekt und dessen Entwicklungsabläufe.
+
+Die SVN-Repositories[[development-cvs-repository]]::
+Der Hauptquellbaum von FreeBSD wurde über viele Jahre ausschließlich mit http://www.nongnu.org/cvs/[CVS] (Concurrent-Versions-System) gepflegt, einem frei erhältlichen Versionskontrollsystem. Im Juni 2008 begann das FreeBSD Project mit dem Umstieg auf http://subversion.tigris.org[SVN] (Subversion). Dieser Schritt wurde notwendig, weil durch technische Einschränkungen von CVS aufgrund des rapide wachsenden Quellcodebaumes und dem Umfang der bereits gespeichterten Revisisionsinformationen an dessen Grenzen zu stoßen begann. Die Repositories des Dokumentationsprojekts und die Ports-Sammlung wurden ebenfalls von CVS zu SVN im Mai und Juli 2012 umgezogen. Lesen Sie dazu crossref:cutting-edge[synching,Synchronisation der Quellen] für weitere Informationen zur Synchronisation des FreeBSD `src/`-Repositories und crossref:ports[ports-using,Die Ports-Sammlung verwenden] für Details zum Beziehen der FreeBSD Ports-Sammlung.
+
+Die Committer-Liste[[development-committers]]::
+Die _Committer_ sind diejenigen Leute, welche _schreibenden_ Zugriff auf den Subversion-Baum besitzen und berechtigt sind, Änderungen an den FreeBSD-Quellen (der Begriff "Committer" stammt aus dem Versionskontrollbefehl `commit` , der dazu verwendet wird, Änderungen in das Repository zu bringen). Jeder hat die Möglichkeit über die die https://bugs.FreeBSD.org/submit/[Datenbank für Problemberichte] einen Fehlerreport einzureichen. Bevor Sie einen Fehlerreport einreichen, sollten Sie auf den FreeBSD Mailinglisten, den IRC-Kanälen oder in Foren überprüfen, ob das Problem tatsächlich ein Fehler ist.
+
+The FreeBSD core team[[development-core]]::
+Die _FreeBSD core team_ ist mit dem Vorstand vergleichbar, wenn das FreeBSD Projekt ein Unternehmen wäre. Die Hauptaufgabe des Core Teams ist es sicherzustellen, dass sich das Projekt als Ganzes in einem guten Zustand befindet und sich in die richtige Richtung bewegt. Das Einladen von engagierten und verantwortungsvollen Entwicklern zu dem Zweck, sich der Gruppe von Committern anzuschliessen, ist eine der Funktionen des Core Teams, genauso wie neue Mitglieder des Core Teams zu rekrutieren, wenn andere ausscheiden. Das aktuelle Core Team wurde aus einer Menge von Kandidaten aus dem Kreis der Committer im Juni 2020 gewählt. Wahlen werden alle zwei Jahre abgehalten.
++
+[NOTE]
+====
+Wie die meisten Entwickler auch, sind die Mitglieder des Core Teams Freiwillige, wenn es um die Entwicklung von FreeBSD geht und erhalten keinerlei finanziellen Vorteil aus dem Projekt, deshalb sollte "Verpflichtung" nicht fehlverstanden werden mit "garantierter Unterstützung". Die "Vorstands"-Analogie oben ist nicht sehr akkurat und kann vielleicht besser damit umschrieben werden, dass diese Leute ihr Leben für FreeBSD gegen jedwede Vernunft geopfert haben.
+====
+
+Aussenstehende Beitragende::
+Schliesslich stellt die grösste, aber nichtsdestotrotz wichtigste Gruppe von Entwicklern die der Benutzer selbst dar, die stetig Rückmeldungen und Fehlerbehebungen liefert. Der hauptsächliche Weg mit FreeBSDs nicht-zentralisierter Entwicklung Kontakt zu halten, ist, die {freebsd-hackers} Mailingliste zu abonnieren, auf der solche Dinge diskutiert werden. Lesen Sie dazu crossref:eresources[eresources, Ressourcen im Internet] für weitere Informationen über die verschiedenen FreeBSD-Mailinglisten.
++
+link:{contributors}[Liste der Beitragenden] ist eine, die lang ist und stetig wächst, also warum nicht FreeBSD beitreten und noch heute etwas zurückgeben?
++
+Code ist nicht die einzige Art, zu dem Projekt etwas beizutragen. Für eine ausführlichere Liste von Dingen die getan werden müssen, lesen Sie auf der link:https://www.FreeBSD.org/[FreeBSD Projektwebseite].
+
+Zusammenfassend ist unser Entwicklungsmodell als eine lose Menge von konzentrischen Kreisen organisiert. Das zentralisierte Modell ist mit der Praktikabilität der _Anwender_ von FreeBSD entworfen worden, die mit der einfachen Art einhergeht, eine zentrale Basis für den Code zu haben und keine potentiellen Beiträge auszuschliessen! Unser Ansporn ist es, ein stabiles Betriebssystem mit einer grossen Menge von kohärenten crossref:ports[ports, Anwendungsprogrammen], welches die Benutzer einfach installieren und verwenden können - dieses Modell funktioniert darin sehr gut, dieses Ziel zu erreichen.
+
+Alles was wir von denen verlangen, die uns als FreeBSD-Entwickler beitreten ist, etwas von der gleichen Hingabe an den Erfolg, die seine momentanen Gemeinschaft inne hat, zu besitzen.
+
+[[third-party-programs]]
+=== Programme von Drittherstellern
+
+Zusätzlich zur Basisdistribution bietet FreeBSD eine Sammlung von portierter Software mit tausenden der am meisten nachgefragten Programme an. Als diese Zeilen geschrieben wurden, gab es über {numports} Ports! Die Liste der Ports reicht von HTTP-Servern, zu Spielen, Sprachen, Editoren und so ziemlich alles, was dazwischen liegt. Die gesamte Port-Sammlung ist geschätzt {ports-size} gross. Um einen Port zu übersetzen, wechseln Sie einfach in das Verzeichnis des Programms, das sie installieren möchten und geben `make install` ein und das System erledigt den Rest. Die gesamte Originaldistribution für jeden Port, den Sie bauen wird dynamisch heruntergeladen, so dass sie nur genügend Plattenplatz zum bauen des Ports, den sie haben möchten, zur Verfügung stellen müssen. Fast jeder Port ist auch als vorkompiliertes"Paket", das über das folgende einfache Kommando (`pkg install`) für diejenigen, die keine kompilierten Port aus den Quellen wünschen. Weitere Informationen zu Ports und Paketen finden Sie in crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports].
+
+=== Zusätzliche Dokumentation
+
+Alle unterstützten FreeBSD Versionen bieten eine Option, um zusätzliche Dokumentation unter [.filename]#/usr/local/shared/doc/freebsd# während des initialen Systemsetups zu installieren. Dokumentation kann auch zu einem späteren Zeitpunkt über Pakete installiert werden, wie es crossref:cutting-edge[doc-ports-install-package,“Die Dokumentation aus den Ports aktualisieren”] beschreibt. Sie können ebenso die lokal installierten Anleitungen mit jedem HTML-fähigen Browser lesen, indem Sie die folgende URL verwenden:
+
+Das FreeBSD Handbuch::
+link:file://localhost/usr/local/shared/doc/freebsd/handbook/index.html[/usr/local/shared/doc/freebsd/handbook/index.html]
+
+Die FreeBSD FAQ::
+link:file://localhost/usr/local/shared/doc/freebsd/faq/index.html[/usr/local/shared/doc/freebsd/faq/index.html]
+
+Genauso erhalten Sie auch die Master (und am häufigsten aktualisierten) Kopien von https://www.FreeBSD.org/[https://www.FreeBSD.org/].
diff --git a/documentation/content/de/books/handbook/jails/_index.adoc b/documentation/content/de/books/handbook/jails/_index.adoc
new file mode 100644
index 0000000000..66d1ee9a8c
--- /dev/null
+++ b/documentation/content/de/books/handbook/jails/_index.adoc
@@ -0,0 +1,1087 @@
+---
+title: Kapitel 14. Jails
+part: Teil III. Systemadministration
+prev: books/handbook/security
+next: books/handbook/mac
+---
+
+[[jails]]
+= Jails
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 14
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/jails/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/jails/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/jails/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[jails-synopsis]]
+== Übersicht
+
+Da die Systemadministration eine schwierige Aufgabe ist, wurden viele Werkzeuge entwickelt, die Administratoren bei der Installation, Konfiguration und Wartung ihrer Systeme unterstützen sollen. Eines dieser Werkzeuge, die verwendet werden können um die Sicherheit eines FreeBSD-Systems zu erhöhen, sind _Jails_. Jails sind seit FreeBSD 4.X verfügbar und werden ständig in ihrer Nützlichkeit, Leistung, Zuverlässigkeit und Sicherheit verbessert. Jails können als eine Art von Betriebssystem-Virtualisierung angesehen werden.
+
+Jails setzen auf dem man:chroot[2]-Konzept auf, das dazu verwendet wird das root-Verzeichnis einer Reihe von Prozessen zu ändern, um so eine separate, sichere Umgebung zu schaffen. Prozesse, die in einer chroot-Umgebung erstellt wurden, können nicht auf Dateien oder Ressourcen zugreifen, die sich außerhalb dieser Umgebung befinden. Dadurch ist es einem kompromittierten Dienst nicht möglich, das gesamte System zu kompromittieren. Im Laufe der Zeit wurden viele Wege gefunden, um aus einer chroot-Umgebung auszubrechen, so dass es für die Sicherung von Diensten nicht die ideale Lösung ist.
+
+Jails verbessern das traditionelle chroot-Konzept auf unterschiedlichste Art und Weise. In einer traditionellen chroot-Umgebung sind Prozesse auf den Bereich des Dateisystems beschränkt, auf den sie zugreifen können. Der Rest der Systemressourcen (wie zum Beispiel eine Reihe von Systembenutzern, die laufenden Prozesse oder das Netzwerk-Subsystem) teilen sich die chroot-Prozesse mit dem Host-System. Jails erweitern dieses Modell nicht nur auf die Virtualisierung des Zugriffs auf das Dateisystem, sondern auch auf eine Reihe von Benutzern und das Netzwerk-Subsystem. Zudem stehen weitere Möglichkeiten zur Verfügung, den Zugriff auf eine Jail-Umgebung zu kontrollieren.
+
+Eine Jail zeichnet sich durch folgende Merkmale aus:
+
+* Ein Unterverzeichnisbaum: dies ist der Ausgangspunkt der Jail. Einem Prozess, der innerhalb der Jail läuft, ist es nicht mehr möglich, aus diesem Unterverzeichnis auszubrechen.
+* Ein Hostname: dieser Name wird für die Jail verwendet.
+* Eine IP Adresse: diese Adresse wird der Jail zugewiesen. Die IP-Adresse einer Jails ist üblicherweise ein Adress-Alias auf eine existierende Netzwerkschnittstelle.
+* Ein Kommando: der Pfad einer ausführbaren Datei, die innerhalb der Jail ausgeführt werden soll. Dieser Pfad wird relativ zum root-Verzeichnis der Jail-Umgebung angegeben.
+
+Jails haben einen eigenen Satz von Benutzern und ihren eigenen `root`-Konto. Die Rechte dieser Benutzer sind nur auf die Jail-Umgebung beschränkt. Der Benutzer `root` der Jail-Umgebung ist nicht dazu berechtigt, kritische Operationen am System außerhalb der angebundenen Jail-Umgebung durchzuführen.
+
+Dieses Kapitel bietet einen Überblick über die Terminologie und die Kommandos zur Verwaltung von FreeBSD Jails. Jails sind ein sehr mächtiges Werkzeug für Administratoren und fortgeschrittene Anwender.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie
+
+* Wissen, was eine Jail ist und welche Verwendungszwecke es dafür unter FreeBSD gibt.
+* Wissen, wie man eine Jail erstellt, startet und anhält.
+* Die Grundlagen der Jail-Administration (sowohl innerhalb als auch außerhalb des Jails) kennen.
+
+[IMPORTANT]
+====
+Jails sind ein mächtiges Werkzeug, aber sie sind kein Sicherheits-"Allheilmittel". Es ist wichtig zu beachten, dass es für einen Prozess in der Jail nicht möglich ist, von selbst auszubrechen. Es gibt jedoch Möglichkeiten, in denen ein unprivilegierter Benutzer außerhalb der Jail, mit einem privilegierten Benutzer innerhalb der Jail kooperiert, und somit erhöhte Rechte in der Host-Umgebung erlangt.
+
+Den meisten dieser Angriffe kann vorgebeugt werden, indem sichergestellt wird, dass das Rootverzeichnis der Jail für unprivilegierte Benutzer der Host-Umgebung nicht zugänglich ist.
+====
+
+[[jails-terms]]
+== Jails - Definitionen
+
+Um die für den Einsatz von Jails benötigten os;-Funktionen, deren Interna sowie die Art und Weise, mit der diese mit anderen Teilen des Betriebssystems interagieren, zu erläutern, werden in diesem Kapitel folgende Definitionen verwendet:
+
+man:chroot[8] (-Befehl)::
+Ein Werkzeug, das den FreeBSD-Systemaufruf man:chroot[2] verwendet, um das Wurzelverzeichnis eines Prozesses und all seiner Nachkömmlinge zu ändern.
+
+man:chroot[2] (-Umgebung)::
+Die Umgebung eines Prozesses, der in einem "chroot" läuft. Diese beinhaltet Ressourcen, wie zum Beispiel sichtbare Abschnitte des Dateisystems, verfügbare Benutzer- und Gruppenkennungen, Netzwerkschnittstellen und weitere IPC-Mechanismen und so weiter.
+
+man:jail[8] (-Befehl)::
+Das Systemadministrationswerkzeug, welches es erlaubt, Prozesse innerhalb der Jail-Umgebung zu starten.
+
+Host (-Benutzer, -Prozess, -System)::
+Das verwaltende System einer Jail-Umgebung. Das Host-System hat Zugriff auf alle verfügbaren Hardwareressourcen und kann sowohl innerhalb als auch außerhalb der Jail-Umgebung Prozesse steuern. Einer der wichtigsten Unterschiede des Host-System einer Jails ist, dass die Einschränkungen, welche für die Superuser-Prozesse innerhalb eines Jails gelten, nicht für die Prozesse des Host-Systems gelten.
+
+Gast (-Benutzer, -Prozess, -System)::
+Ein Prozess, ein Benutzer oder eine andere Instanz, deren Zugriff durch eine FreeBSD-Jail eingeschränkt ist.
+
+[[jails-build]]
+== Einrichtung und Verwaltung von Jails
+
+Einige Administratoren unterscheiden zwei verschiedene Jail-Arten: "Komplette" Jails, die ein echtes FreeBSD darstellen und Jails für einen bestimmten "Dienst", die nur einer bestimmten Anwendung oder einem Dienst (der möglicherweise mit besonderen Privilegien laufen soll) gewidmet sind. Dies ist aber nur eine konzeptuelle Unterscheidung, die Einrichtung einer Jail bleibt davon gänzlich unberührt. Bei der Erstellung einer kompletten Jail gibt es zwei Optionen für die Quelle des Userlands: vorkompilierte Binärpakete (im Lieferumfang der Installationsmedien enthalten) oder die Kompilierung aus dem Quelltext.
+
+=== Eine Jail installieren
+
+[[jails-install-internet]]
+==== Eine Jail aus dem Internet installieren
+
+Der Werkzeug man:bsdinstall[8] kann verwendet werden, um die für eine Jail benötigten Binärdateien zu holen und zu installieren. Dies geht durch die Auswahl eines Spiegelservers, welche Distributionen in das Zielverzeichnis installiert werden sollen, sowie die grundlegende Konfiguration einer Jail:
+
+[source,bash]
+....
+# bsdinstall jail /pfad/zur/jail
+....
+
+Nachdem der Befehl ausgeführt wurde, wird der Host für den Betrieb der Jail konfiguriert.
+
+[[jails-install-iso]]
+==== Eine Jail aus einer ISO-Datei installieren
+
+Um das Basissystem von Installationsmedien zu installieren, erstellen Sie zunächst das Rootverzeichnis für die Jail. Dazu setzen Sie `DESTDIR` auf das entsprechende Verzeichnis.
+
+Starten Sie eine Shell und legen Sie `DESTDIR` fest:
+
+[source,bash]
+....
+# sh
+# export DESTDIR=/hier/ist/die/jail
+....
+
+Hängen Sie das Installationsmedium wie in man:mdconfig[8] beschrieben ein, wenn Sie von einem ISO-Abbild installieren:
+
+[source,bash]
+....
+# mount -t cd9660 /dev/`mdconfig -f cdimage.iso` /mnt
+# cd /mnt/usr/freebsd-dist/
+....
+
+Extrahieren Sie die Binärdateien aus den Archiven des Installationsmediums in das entsprechende Verzeichnis. Es wird mindestens das "base"-Set benötigt, aber Sie können auch eine komplette Installation durchführen, wenn Sie dies bevorzugen.
+
+Um lediglich das Basissystem zu installieren, führen Sie dieses Kommando aus:
+
+[source,bash]
+....
+# tar -xf base.txz -C $DESTDIR
+....
+
+Führen Sie folgendes Kommando aus, um alles außer den Kernel zu installieren:
+
+[source,bash]
+....
+# for set in base ports; do tar -xf $set.txz -C $DESTDIR ; done
+....
+
+[[jails-install-source]]
+==== Eine Jail aus den Quellen bauen und installieren
+
+Die Manualpage man:jail[8] beschreibt die Erstellung einer Jail wie folgt:
+
+[source,bash]
+....
+# setenv D /hier/ist/die/jail
+# mkdir -p $D <.>
+# cd /usr/src
+# make buildworld <.>
+# make installworld DESTDIR=$D <.>
+# make distribution DESTDIR=$D <.>
+# mount -t devfs devfs $D/dev <.>
+....
+
+<.> Das Festlegen des Installationsorts für das Jail eignet sich am besten als Startpunkt. Hier wird sich die Jail innerhalb des Host-Dateisystems befinden. Eine gute Möglichkeit wäre etwa [.filename]#/usr/jail/name_der_jail#, wobei `_name_der_jail_` den Hostname darstellt, über den die Jail identifiziert werden soll. [.filename]#/usr/# stellt normalerweise ausreichend Platz für eine Jail zur Verfügung. Bedenken Sie, dass eine "komplette" Jail ein Replikat einer jeden Datei der Standardinstallation des FreeBSD-Basissystems enthält.
+
+<.> Wenn Sie bereits ihre Systemanwendungen mittels `make world` oder `make buildworld` neu erstellt haben, können Sie diesen Schritt überspringen und die Systemanwendungen in die neue Jail installieren.
+
+<.> Dieser Befehl wird den Verzeichnisbaum mit allen notwendigen Binärdateien, Bibliotheken, Manualpages usw. erstellen.
+
+<.> Der `distribution`-Befehl lässt make alle benötigten Konfigurationsdateien installieren, es werden also alle installierbaren Dateien aus [.filename]#/usr/src/etc/# in das Verzeichnis [.filename]#/etc# der Jail installiert (also nach [.filename]#$D/etc/#).
+
+<.> Das Einhängen des man:devfs[8]-Dateisystems innerhalb der Jail ist nicht unbedingt notwendig. Allerdings benötigt fast jede Anwendung Zugriff auf wenigstens ein Gerät. Es ist daher sehr wichtig, den Zugriff auf Devices aus der Jail heraus zu kontrollieren, da unsaubere Einstellungen es einem Angreifer erlauben könnten, in das System einzudringen. Die Kontrolle über man:devfs[8] erfolgt durch die in den Manualpages man:devfs[8] und man:devfs.conf[5] beschriebenen Regeln.
+
+=== Den Host konfigurieren
+
+Ist die Jail erst einmal erstellt, kann sie durch man:jail[8] gestartet werden. man:jail[8] benötigt zwingend mindestens vier Argumente, die in <<jails-synopsis>> des Handbuchs beschrieben sind. Weitere Argumente sind möglich, um beispielsweise die Jail mit den Berechtigungen eines bestimmten Benutzers laufen zu lassen. Das Argument `_command_` hängt vom Typ der Jail ab; für ein _virtuelles System_ ist [.filename]#/etc/rc# eine gute Wahl, da dies dem Startvorgang eines echten FreeBSD-Systems entspricht. Bei einer _Service_-Jail hängt dieses von der Art des Dienstes ab, der in der Jail laufen soll.
+
+Jails werden häufig mit dem Betriebssystem gestartet, da der [.filename]#rc#-Mechanismus von FreeBSD dafür eine einfach zu realisierende Möglichkeit bietet.
+
+[.procedure]
+* Konfigurieren Sie die Jail in [.filename]#/etc/jail.conf#:
++
+[.programlisting]
+....
+www {
+ host.hostname = www.example.org; # Hostname
+ ip4.addr = 192.168.0.10; # IP address of the jail
+ path = "/usr/jail/www"; # Path to the jail
+ devfs_ruleset = "www_ruleset"; # devfs ruleset
+ mount.devfs; # Mount devfs inside the jail
+ exec.start = "/bin/sh /etc/rc"; # Start command
+ exec.stop = "/bin/sh /etc/rc.shutdown"; # Stop command
+}
+....
++
+Um die Jails mit dem Betriebssystem zu starten, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein:
++
+[.programlisting]
+....
+jail_enable="YES" # Set to NO to disable starting of any jails
+....
++
+Beim Start einer in man:jail.conf[5] konfigurierten Jail wird das [.filename]#/etc/rc#-Skript der Jail (das "annimmt", dass es sich in einem kompletten System befindet) aufgerufen. Für Service-Jails sollten die Startskripte der Jail durch das Setzen der Option `exec.start` entsprechend angepasst werden.
++
+[NOTE]
+====
+Eine vollständige Liste der Optionen findet sich in der Manualpage man:jail.conf[5].
+====
+
+man:service[8] kann zum manuellen Starten und Stoppen der Jail genutzt werden, wenn ein Eintrag in [.filename]#jail.conf# angelegt wurde:
+
+[source,bash]
+....
+# service jail start www
+# service jail stop www
+....
+
+Jails können mit man:jexec[8] heruntergefahren werden. Führen Sie zunächst man:jls[8] aus, um die `JID` der Jail ausfindig zu machen. Anschließend können Sie man:jexec[8] benutzen, um das Shutdown-Skript in der Jail auszuführen.
+
+[source,bash]
+....
+# jls
+ JID IP Address Hostname Path
+ 3 192.168.0.10 www /usr/jail/www
+# jexec 3 /etc/rc.shutdown
+....
+
+Weitere Informationen zu diesem Thema finden Sie in der Manualpage man:jail[8].
+
+[[jails-tuning]]
+== Feinabstimmung und Administration
+
+Es gibt verschiedene Optionen, die für jede Jail gesetzt werden können und verschiedene Wege, ein FreeBSD-Host-System mit Jails zu kombinieren. Dieser Abschnitt zeigt Ihnen:
+
+* Einige zur Verfügung stehende Optionen zur Abstimmung des Verhaltens und der Sicherheitseinstellungen, die mit einer Jail-Installation ausgeführt werden können.
+* Einige der Anwendungsprogramme für das Jail-Management, die über die FreeBSD Ports-Sammlung verfügbar sind und genutzt werden können, um Jail-basierte Lösungen allumfassend umzusetzen.
+
+[[jails-tuning-utilities]]
+=== Systemwerkzeuge zur Feinabstimmung von Jails in FreeBSD
+
+Die Feinabstimmung einer Jail-Konfiguration erfolgt zum Großteil durch das Setzen von man:sysctl[8]-Variablen. Es gibt einen speziellen sysctl-Zweig, der als Basis für die Organisation aller relevanten Optionen dient: Die `security.jail.*`-Hierarchie der FreeBSD-Kerneloptionen. Die folgende Liste enthält alle jail-bezogenen sysctls (inklusiver ihrer Voreinstellungen). Die Namen sollten selbsterklärend sein, für weitergehende Informationen lesen Sie bitte die Manualpages man:jail[8] und man:sysctl[8].
+
+* `security.jail.set_hostname_allowed: 1`
+* `security.jail.socket_unixiproute_only: 1`
+* `security.jail.sysvipc_allowed: 0`
+* `security.jail.enforce_statfs: 2`
+* `security.jail.allow_raw_sockets: 0`
+* `security.jail.chflags_allowed: 0`
+* `security.jail.jailed: 0`
+
+Diese Variablen können vom Administrator des _Host-Systems_ genutzt werden, um Beschränkungen hinzuzufügen oder aufzuheben, die dem Benutzer `root` als Vorgabe auferlegt sind. Beachten Sie, dass es einige Beschränkungen gibt, die nicht verändert werden können. Der Benutzer `root` darf innerhalb der man:jail[8] keine Dateisysteme mounten und unmounten. Ebenso ist es ihm untersagt, das man:devfs[8]-Regelwerk zu laden oder zu entladen. Er darf weder Firewallregeln setzen, noch administrative Aufgaben erledigen, die Modifikationen am Kernel selbst erfordern (wie beispielsweise das Setzen des `Securelevels` für den Kernel).
+
+Das FreeBSD-Basissystem enthält einen Basissatz an Werkzeugen, um Informationen über aktive Jails zu erlangen und einer Jail administrative Befehle zuzuordnen. Die Befehle man:jls[8] und man:jexec[8] sind Teil des FreeBSD-Basissystems und können für folgende Aufgaben verwendet werden:
+
+* Das Anzeigen einer Liste der aktiven Jails und ihrer zugehörigen Jail Identifier (JID), ihrer IP-Adresse, ihres Hostnames und ihres Pfades.
+* Das Herstellen einer Verbindung mit einer laufenden Jail, das Starten eines Befehls aus dem Gastsystem heraus oder das Ausführen einer administrativen Aufgabe innerhalb der Jail selbst. Dies ist insbesondere dann nützlich, wenn der Benutzer `root` die Jail sauber herunterfahren möchte. man:jexec[8] kann auch zum Starten einer Shell innerhalb der Jail genutzt werden, um administrative Aufgaben durchzuführen:
++
+[source,bash]
+....
+# jexec 1 tcsh
+....
+
+[[jails-tuning-admintools]]
+=== High-Level-Werkzeuge zur Jail-Administration in der FreeBSD Ports-Sammlung
+
+Unter den zahlreichen Werkzeugen für die Administration von Jails ist package:sysutils/ezjail[] am vollständigsten und brauchbarsten. Dabei handelt es sich um eine Sammlung von Skripten, die das man:jail[8]-Management vereinfachen. Weitere Informationen zu diesem Werkzeug finden Sie im <<jails-ezjail,Abschnitt über ezjail>>.
+
+[[jails-updating]]
+=== Jails auf dem aktuellen Stand halten
+
+Jails sollten immer vom Host-System auf dem neuesten Stand gehalten werden, da eine Aktualisierung aus einer Jail heraus wahrscheinlich fehlschlägt, da in der Voreinstellung von FreeBSD die Verwendung von man:chflags[1] in einem Jail nicht erlaubt ist und somit der Austausch einiger Dateien verhindert wird. Es ist zwar möglich, dieses Verhalten zu ändern, aber es wird empfohlen, man:freebsd-update[8] zu benutzen, um die Jails zu aktualisieren. Verwenden Sie `-b` mit dem Pfad der Jail, die Sie aktualisieren möchten.
+
+Um die Jail auf das neueste Patch-Release der bereits installierten FreeBSD-Version zu aktualisieren, führen Sie auf dem Host die folgenden Befehle aus:
+
+[source,bash]
+....
+# freebsd-update -b /hier/ist/die/jail fetch
+# freebsd-update -b /hier/ist/die/jail install
+....
+
+Um die Jail auf eine neue Haupt- oder Unterversion zu aktualisieren, wird zunächst eine Aktualisierung des Host-Systems durchgeführt, wie in crossref:cutting-edge[freebsdupdate-upgrade,“Aktualisierungen an Haupt- und Unterversionen”] beschrieben. Nachdem der Host aktualisiert und neu gestartet wurde, kann die Jail aktualisiert werden. Führen Sie folgende Befehle auf dem Host aus, um von 12.0-RELEASE auf 12.1-RELEASE zu aktualisieren:
+
+[source,bash]
+....
+# freebsd-update -b /hier/ist/die/jail --currently-running 12.0-RELEASE -r 12.1-RELEASE upgrade
+# freebsd-update -b /hier/ist/die/jail install
+# service jail restart myjail
+# freebsd-update -b /hier/ist/die/jail install
+....
+
+Wenn es sich um eine Aktualisierung einer Hauptversion handelte, installieren Sie alle installierten Pakete neu und starten Sie die Jail erneut. Dies ist notwendig, da sich die ABI-Version bei einer Aktualisierung zwischen Hauptversionen von FreeBSD ändert. Führen Sie folgende Befehle auf dem Host-System aus:
+
+[source,bash]
+....
+# pkg -j mymail upgrade -f
+# service jail restart myjail
+....
+
+[[jails-application]]
+== Mehrere Jails aktualisieren
+
+Die Verwaltung von mehreren Jails kann problematisch sein, da jede Jail bei jedem Upgrade komplett neu gebaut werden muss. Dieser Prozess kann sehr zeitaufwändig sein, wenn eine große Anzahl von Jails erstellt oder manuell aktualisiert werden müssen.
+
+Dieser Abschnitt beschreibt eine Methode zur Lösung dieses Problems, indem so viel wie möglich zwischen Jails, auf sichere Art und Weise, durch den Einsatz von man:mount_nullfs[8]-Mounts geteilt wird. Dadurch werden Aktualisierungen erleichtert und das Verteilen von verschiedenen Diensten, wie HTTP, DNS und SMTP, auf verschiedene Jails wird attraktiver. Außerdem bietet dieses Verfahren einen einfachen Weg, Jails zu erstellen, zu entfernen und zu aktualisieren.
+
+[NOTE]
+====
+Es existieren auch einfachere Lösungen, wie zum Beispiel ezjail, das einfachere Methoden zur Administration von Jails verwendet und daher nicht so anspruchsvoll ist, wie der hier beschriebene Aufbau. ezjail wird in <<jails-ezjail>> ausführlich behandelt.
+====
+
+Die Ziele des in diesem Abschnitt beschriebenen Aufbaus sind:
+
+* Das Erstellen einer einfachen und gut verständlichen Jail Struktur, die es nicht erfordert für jede Jail ein vollständiges installworld laufen lassen zu müssen.
+* Es einfach zu machen, neue Jails zu erstellen oder alte zu entfernen.
+* Es einfach zu machen, bestehende Jails zu aktualisieren.
+* Es einfach zu machen, einen angepassten FreeBSD-Zweig zu nutzen.
+* Paranoid bezüglich Sicherheit zu sein und Angriffsmöglichkeiten weitgehend zu reduzieren.
+* Soviel Platz und Inodes wie möglich einzusparen.
+
+Dieses Design ist darauf angewiesen, dass eine read-only-Hauptvorlage in jede Jail hinein gemountet wird und dass jede Jail über wenigstens ein beschreibbares Gerät verfügt. Das Gerät kann hierbei eine separate physikalische Platte oder ein vnode unterstütztes Speichergerät sein. Im folgenden Beispiel wird ein read/write nullfs-Mount genutzt.
+
+Das Layout des Dateisystems ist wie folgt:
+
+* Die Jails befinden sich unterhalb der [.filename]#/home# Partition.
+* Jede Jail wird unterhalb des [.filename]#/home/j#-Verzeichnisses gemountet.
+* [.filename]#/home/j/mroot# ist die Vorlage für jede Jail und die nur lesbare Partition für alle Jails.
+* Unterhalb von [.filename]#/home/j# wird für jede Jail ein leeres Verzeichnis angelegt.
+* Jede Jail bekommt ein [.filename]#/s#-Verzeichnis, das zum read/write-Teilbereich des Systems verlinkt wird.
+* Jede Jail bekommt ihr eigenes read/write-System, das auf [.filename]#/home/j/skel# basiert.
+* Der read/write-Teilbereich jeder Jail wird in [.filename]#/home/js# erstellt.
+
+[[jails-service-jails-template]]
+=== Erstellen der Vorlage
+
+Dieser Abschnitt beschreibt die Schritte, die zum Erstellen der Hauptvorlage notwendig sind.
+
+Es wird empfohlen, zunächst das FreeBSD Host-System nach den Anweisungen in crossref:cutting-edge[makeworld,“FreeBSD aus den Quellen aktualisieren”] auf den aktuellen -RELEASE-Zweig zu aktualisieren. Darüber hinaus verwendet diese Vorlage package:sysutils/cpdup[], sowie portsnap zum herunterladen der FreeBSD Ports-Sammlung.
+
+[.procedure]
+. Zuerst erstellen wir eine Verzeichnisstruktur für das read-only-Dateisystem, das die FreeBSD-Binärdateien für die Jails enthalten wird. Anschließend wechseln wir in den FreeBSD-Quellcodebaum und installieren das read-only-Dateisystem in die (Vorlage-)Jail.
++
+[source,bash]
+....
+# mkdir /home/j /home/j/mroot
+# cd /usr/src
+# make installworld DESTDIR=/home/j/mroot
+....
+
+. Als nächstes bereiten wir die Ports-Sammlung für die Jails vor und kopieren den FreeBSD Quellcodebaum in die Jail, da dieser für mergemaster benötigt wird:
++
+[source,bash]
+....
+# cd /home/j/mroot
+# mkdir usr/ports
+# portsnap -p /home/j/mroot/usr/ports fetch extract
+# cpdup /usr/src /home/j/mroot/usr/src
+....
+
+. Danach wird die Struktur für den read/write-Bereich des Systems erstellt:
++
+[source,bash]
+....
+# mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles
+# mv etc /home/j/skel
+# mv usr/local /home/j/skel/usr-local
+# mv tmp /home/j/skel
+# mv var /home/j/skel
+# mv root /home/j/skel
+....
+
+. Nutzen Sie mergemaster, um fehlende Konfigurationsdateien zu installieren. Anschließend werden die von mergemaster erstellten Extra-Verzeichnisse entfernt:
++
+[source,bash]
+....
+# mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i
+# cd /home/j/skel
+# rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev
+....
+
+. Nun wird das read/write-Dateisystem mit dem read-only-Dateisystem verlinkt. Vergewissern Sie sich, dass die symbolischen Links an den korrekten [.filename]#s/# Positionen erstellt werden, weil echte Verzeichnisse oder an falschen Positionen erstellte Verzeichnisse die Installation fehlschlagen lassen.
++
+[source,bash]
+....
+# cd /home/j/mroot
+# mkdir s
+# ln -s s/etc etc
+# ln -s s/home home
+# ln -s s/root root
+# ln -s s/usr-local usr/local
+# ln -s s/usr-X11R6 usr/X11R6
+# ln -s s/distfiles usr/ports/distfiles
+# ln -s s/tmp tmp
+# ln -s s/var var
+....
+
+. Zuletzt erstellen Sie eine allgemeine [.filename]#/home/j/skel/etc/make.conf# mit folgendem Inhalt:
++
+[.programlisting]
+....
+WRKDIRPREFIX?= /s/portbuild
+....
++
+Dies erlaubt es, die FreeBSD-Ports innerhalb jeder Jail zu kompilieren. Das Ports-Verzeichnis ist Teil des read-only System. Der angepasste Pfad des `WRKDIRPREFIX` macht es möglich, innerhalb des read/write-Bereichs der Jail Ports zu bauen.
+
+[[jails-service-jails-creating]]
+=== Jails erstellen
+
+Die Jailvorlage kann nun verwendet werden, um die Jails einzurichten und in [.filename]#/etc/rc.conf# zu konfigurieren. In diesem Beispiel werden drei Jails erstellt: `NS`, `MAIL` und `WWW`.
+
+[.procedure]
+. Fügen Sie die folgenden Zeilen in [.filename]#/etc/fstab# ein, damit die read-only-Vorlage und der read/write-Bereich für alle Jails verfügbar sind:
++
+[.programlisting]
+....
+/home/j/mroot /home/j/ns nullfs ro 0 0
+/home/j/mroot /home/j/mail nullfs ro 0 0
+/home/j/mroot /home/j/www nullfs ro 0 0
+/home/js/ns /home/j/ns/s nullfs rw 0 0
+/home/js/mail /home/j/mail/s nullfs rw 0 0
+/home/js/www /home/j/www/s nullfs rw 0 0
+....
++
+Um zu verhindern, dass fsck die nullfs-Mounts während des Bootens überprüft oder dass dump die Mounts sichert, müssen die letzten beiden Spalten auf `0` gesetzt werden.
+. Konfigurieren Sie die Jails in [.filename]#/etc/rc.conf#:
++
+[.programlisting]
+....
+jail_enable="YES"
+jail_set_hostname_allow="NO"
+jail_list="ns mail www"
+jail_ns_hostname="ns.example.org"
+jail_ns_ip="192.168.3.17"
+jail_ns_rootdir="/usr/home/j/ns"
+jail_ns_devfs_enable="YES"
+jail_mail_hostname="mail.example.org"
+jail_mail_ip="192.168.3.18"
+jail_mail_rootdir="/usr/home/j/mail"
+jail_mail_devfs_enable="YES"
+jail_www_hostname="www.example.org"
+jail_www_ip="62.123.43.14"
+jail_www_rootdir="/usr/home/j/www"
+jail_www_devfs_enable="YES"
+....
++
+Die Variable `jail__name__rootdir` zeigt nach [.filename]#/usr/home# statt nach [.filename]#/home#, da der physikalische Pfad von [.filename]#/home# unter FreeBSD [.filename]#/usr/home# lautet. Die Variable `jail__name__rootdir` darf im Pfad aber _keinen symbolischen Link_ enthalten, weil die Jail ansonsten nicht gestartet werden kann.
+. Erstellen Sie die notwendigen Mountpunkte für die nur lesbaren Bereiche jeder Jail:
++
+[source,bash]
+....
+# mkdir /home/j/ns /home/j/mail /home/j/www
+....
+
+. Installieren Sie mit package:sysutils/cpdup[] die read/write-Vorlage in jede Jail:
++
+[source,bash]
+....
+# mkdir /home/js
+# cpdup /home/j/skel /home/js/ns
+# cpdup /home/j/skel /home/js/mail
+# cpdup /home/j/skel /home/js/www
+....
+
+. An dieser Stelle werden die Jails erstellt und für den Betrieb vorbereitet. Mounten Sie zuerst die notwendigen Dateisysteme für jede Jail. Danach starten Sie die Jails:
++
+[source,bash]
+....
+# mount -a
+# service jail start
+....
+
+Die Jails sollten nun laufen. Um zu prüfen, ob sie korrekt gestartet wurden, verwenden Sie `jls`. Die Ausgabe sollte ähnlich der folgenden sein:
+
+[source,bash]
+....
+# jls
+ JID IP Address Hostname Path
+ 3 192.168.3.17 ns.example.org /home/j/ns
+ 2 192.168.3.18 mail.example.org /home/j/mail
+ 1 62.123.43.14 www.example.org /home/j/www
+....
+
+An diesem Punkt sollte es möglich sein, sich an jeder Jail anzumelden, Benutzer anzulegen und Dienste zu konfigurieren. Die Spalte `JID` gibt die Jail-Identifikationsnummer jeder laufenden Jail an. Nutzen Sie den folgenden Befehl, um administrative Aufgaben in der Jail mit der `JID``3` durchzuführen:
+
+[source,bash]
+....
+# jexec 3 tcsh
+....
+
+[[jails-service-jails-upgrading]]
+=== Jails aktualisieren
+
+Das Design dieses Aufbaus bietet einen einfachen Weg, bestehende Jails zu aktualisieren, während die Ausfallzeiten minimiert werden. Außerdem bietet es die Möglichkeit, zu älteren Versionen zurückzukehren, falls irgendwelche Probleme auftreten.
+
+[.procedure]
+. Im ersten Schritt wird das Host-System aktualisiert. Anschließend wird eine temporäre neue read-only Vorlage [.filename]#/home/j/mroot2# erstellt.
++
+[source,bash]
+....
+# mkdir /home/j/mroot2
+# cd /usr/src
+# make installworld DESTDIR=/home/j/mroot2
+# cd /home/j/mroot2
+# cpdup /usr/src usr/src
+# mkdir s
+....
++
+`installworld` erzeugt einige unnötige Verzeichnisse, die nun entfernt werden sollten:
++
+[source,bash]
+....
+# chflags -R 0 var
+# rm -R etc var root usr/local tmp
+....
+
+. Erzeugen Sie neue symbolische Links für das Hauptdateisystem:
++
+[source,bash]
+....
+# ln -s s/etc etc
+# ln -s s/root root
+# ln -s s/home home
+# ln -s ../s/usr-local usr/local
+# ln -s ../s/usr-X11R6 usr/X11R6
+# ln -s s/tmp tmp
+# ln -s s/var var
+....
+
+. Nun können die Jails gestoppt werden:
++
+[source,bash]
+....
+# service jail stop
+....
+
+. Hängen Sie die originalen Dateisysteme aus, da die read/write-Systeme an das read-only System ([.filename]#/s#) angeschlossen sind:
++
+[source,bash]
+....
+# umount /home/j/ns/s
+# umount /home/j/ns
+# umount /home/j/mail/s
+# umount /home/j/mail
+# umount /home/j/www/s
+# umount /home/j/www
+....
+
+. Verschieben Sie das alte read-only-Dateisystem und ersetzen Sie es durch das neue Dateisystem. Das alte Dateisystem kann so als Backup dienen, falls etwas schief geht. Die Namensgebung entspricht hier derjenigen bei der Erstellung eines neuen read-only-Dateisystems. Verschieben Sie die originale FreeBSD Ports-Sammlung in das neue Dateisystem, um Platz und Inodes zu sparen:
++
+[source,bash]
+....
+# cd /home/j
+# mv mroot mroot.20060601
+# mv mroot2 mroot
+# mv mroot.20060601/usr/ports mroot/usr
+....
+
+. Nun ist die neue read-only-Vorlage fertig. Sie müssen daher nur noch die Dateisysteme erneut mounten und die Jails starten:
++
+[source,bash]
+....
+# mount -a
+# service jail start
+....
+
+Nutzen Sie `jls` um zu prüfen, ob die Jails korrekt gestartet wurden. Führen Sie innerhalb jeder Jail `mergemaster` aus, damit die Konfigurationsdateien aktualisiert werden.
+
+[[jails-ezjail]]
+== Verwaltung von Jails mit ezjail
+
+Das Erstellen und Verwalten von mehreren Jails kann schnell zeitaufwändig und fehleranfällig werden. Dirk Engling's ezjail automatisiert und vereinfacht viele dieser Aufgaben. Als Vorlage wird ein _Basejail_ erzeugt. Zusätzliche Jails nutzen man:mount_nullfs[8] um viele Verzeichnisse aus der Basejail zu teilen, ohne dabei zusätzlichen Speicherplatz zu belegen. Jedes weitere Jail benötigt daher nur wenige Megabyte an Speicherplatz, bevor die Anwendungen installiert werden.
+
+Weitere Vorteile und Merkmale werden im Detail auf der Webseite von ezjail beschrieben: https://erdgeist.org/arts/software/ezjail/[].
+
+[[jails-ezjail-install]]
+=== ezjail installieren
+
+Für die Installation von ezjail wird zunächst eine Loopback-Schnittstelle für die Jails benötigt. Anschließend kann ezjail installiert und der dazugehörige Dienst aktiviert werden.
+[[jails-ezjail-install-procedure]]
+[.procedure]
+. Damit der Verkehr auf der Loopback-Schnittstelle des Jails vom Host-System separiert ist, wird eine zweite Loopback-Schnittstelle in [.filename]#/etc/rc.conf# erstellt:
++
+[.programlisting]
+....
+cloned_interfaces="lo1"
+....
++
+Die zusätzliche Schnittstelle `lo1` wird erstellt, wenn das System neu gestartet wird. Die Schnittstelle kann auch ohne Neustart manuell erstellt werden:
++
+[source,bash]
+....
+# service netif cloneup
+Created clone interfaces: lo1.
+....
++
+Jails können die Aliase dieser sekundären Schnittstelle verwenden, ohne dabei das Host-System zu stören.
++
+Der Zugang zur Loopback-Adresse `127.0.0.1` wird an die erste IP-Adresse umgeleitet, die dem Jail zugewiesen ist. Damit die Loopback-Schnittstelle des Jails der neuen `lo1`-Schnittstelle zugeordnet werden kann, muss beim Erstellen der Jail diese Schnittstelle als erstes in der Liste der IP-Adressen angegeben werden.
++
+Teilen Sie jedem Jail eine Loopback-Adresse aus dem Netzblock `127.0.0.0``/8` zu.
+. Installieren Sie package:sysutils/ezjail[]:
++
+[source,bash]
+....
+# cd /usr/ports/sysutils/ezjail
+# make install clean
+....
+
+. Aktivieren Sie ezjail, indem Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzufügen:
++
+[.programlisting]
+....
+ezjail_enable="YES"
+....
+
+. Der Dienst wird automatisch gestartet, wenn das System bootet. Er kann auch direkt für die aktuelle Sitzung gestartet werden:
++
+[source,bash]
+....
+# service ezjail start
+....
+
+[[jails-ezjail-initialsetup]]
+=== Einrichtung
+
+Nach erfolgreicher Installation von ezjail kann die Verzeichnisstruktur für die Basejail erstellt und befüllt werden. Dieser Schritt wird einmalig auf dem Host-System ausgeführt.
+
+In diesen beiden Beispielen wird `-p` verwendet, um die Ports-Sammlung mit man:portsnap[8] in die Basejail herunterzuladen. Diese Kopie kann dann von allen Jails gemeinsam genutzt werden. Eine separate Kopie der Ports-Sammlung für die Jails ermöglicht die Isolierung der Ports vom Host-System. Die FAQ von ezjail erklärt dies im Detail: https://erdgeist.org/arts/software/ezjail/#FAQ[].
+
+[[jails-ezjail-initialsetup-procedure]]
+[.procedure]
+
+. Die Jail mit FreeBSD-RELEASE installieren
++
+Benutzen Sie `install`, wenn das FreeBSD-RELEASE für die Jail der Version auf dem Host-System entspricht. Wenn beispielsweise auf dem Host-System FreeBSD 10-STABLE installiert ist, wird in der Jail das neueste RELEASE von FreeBSD-10 installiert:
++
+[source,bash]
+....
+# ezjail-admin install -p
+....
+
+. Die Jail mit `installworld` installieren
++
+Mit `ezjail-admin update` kann die Basejail mit den Binärdateien aus dem Host-System befüllt werden. Diese Dateien wurden auf dem Host-System mittels `buildworld` erzeugt.
++
+In diesem Beispiel wird FreeBSD 10-STABLE aus den Quellen gebaut. Die Verzeichnisse für die Jail wurden bereits erstellt. Anschließend wird `installworld` ausgeführt, das [.filename]#/usr/obj# aus dem Host-System in die Basejail installiert.
++
+[source,bash]
+....
+# ezjail-admin update -i -p
+....
++
+In der Voreinstellung wird [.filename]#/usr/src# des Host-Systems verwendet. Ein anderes Quellverzeichnis kann durch die Angabe von `-s`, oder durch Setzen der Variable `ezjail_sourcetree` in [.filename]#/usr/local/etc/ezjail.conf# definiert werden.
+
+[TIP]
+====
+
+Die Ports-Sammlung der Basejail wird mit den anderen Jails geteilt, jedoch werden die heruntergeladenen Distfiles im jeweiligen Jail gespeichert. In der Voreinstellung werden diese Dateien in [.filename]#/var/ports/distfiles# der Jail gespeichert. Wenn die Ports gebaut werden, wird [.filename]#/var/ports# im Jail als Arbeitsverzeichnis genutzt.
+====
+
+[TIP]
+====
+
+Zum herunterladen der Pakete, für die Installation in der Basejail, wird in der Voreinstellung das FTP-Protokoll verwendet. Firewalls und Proxies können jedoch bei der FTP-Übertragung Probleme verursachen. Das HTTP-Protokoll arbeitet anderes und vermeidet diese Probleme. Sie können eine URL für einen bestimmten Spiegel in [.filename]#/usr/local/etc/ezjail.conf# eintragen:
+
+[.programlisting]
+....
+ezjail_ftphost=http://ftp.FreeBSD.org
+....
+
+Im crossref:mirrors[mirrors-ftp,“FTP-Server”] finden Sie eine Liste mit Spiegeln.
+====
+
+[[jails-ezjail-create]]
+=== Eine neue Jail erstellen und starten
+
+Neue Jails werden mit `ezjail-admin create` erstellt. In diesen Beispielen wird die `lo1` Loopback-Schnittstelle, wie oben beschrieben, verwendet.
+
+[[jails-ezjail-create-steps]]
+[.procedure]
+.Procedure: Eine neue Jail erstellen und starten
+. Geben Sie bei der Erstellung der Jail einen Namen und die verwendeten Loopback- und Netzwerk-Schnittstellen mit den IP-Adressen an. In diesem Beispiel trägt die Jail den Namen `dnsjail`.
++
+[source,bash]
+....
+# ezjail-admin create dnsjail 'lo1|127.0.1.1,em0|192.168.1.50'
+....
++
+[TIP]
+====
+
+Die meisten Netzwerkdienste laufen problemlos in einer Jail. Ein paar wenige Netzwerkdienste, vor allem man:ping[8] verwenden Netzwerk-Sockets. Aus Sicherheitsgründen werden Netzwerk-Sockets innerhalb der Jails deaktiviert, so dass Dienste, die diese Sockets benötigten, nicht funktionieren werden. Gelegentlich benötigt ein Jail jedoch den Zugriff auf Raw-Sockets. Beispielsweise verwenden Netzwerk-Monitoring-Anwendungen man:ping[8], um die Verfügbarkeit von anderen Rechnern zu überprüfen. Sollten diese Sockets tatsächlich benötigt werden, können sie durch einen Eintrag in der Konfigurationsdatei von ezjail, [.filename]#/usr/local/etc/jailname#, für einzelne Jails aktiviert werden. Bearbeiten Sie den Eintrag `parameters`:
+
+[.programlisting]
+....
+export jail_jailname_parameters="allow.raw_sockets=1"
+....
+
+Aktivieren Sie keine Netzwerk-Sockets, solange die Dienste im Jail sie nicht tatsächlich benötigen.
+====
+
+. Starten Sie die Jail:
++
+[source,bash]
+....
+# ezjail-admin start dnsjail
+....
+
+. Starten Sie eine Konsole in der Jail:
++
+[source,bash]
+....
+# ezjail-admin console dnsjail
+....
+
+Die Jail ist jetzt in Betrieb und die zusätzliche Konfiguration kann nun abgeschlossen werden. Typische Einstellungen an dieser Stelle sind:
+
+[.procedure]
+. Das `root`-Passwort setzen
++
+Verbinden Sie sich mit der Jail und setzen Sie das Passwort für den Benutzer `root`:
++
+[source,bash]
+....
+# ezjail-admin console dnsjail
+# passwd
+Changing local password for root
+New Password:
+Retype New Password:
+....
+
+. Konfiguration der Zeitzone
++
+Die Zeitzone kann innerhalb der Jail mit man:tzsetup[8] gesetzt werden. Um störende Fehlermeldungen zu vermeiden, kann der Eintrag man:adjkerntz[8] in [.filename]#/etc/crontab# auskommentiert werden. Dieser Job versucht die Uhr des Rechners zu aktualisieren, was jedoch in einem Jail fehlschlägt, da die Jail nicht auf diese Hardware zugreifen darf.
+. DNS-Server
++
+Tragen Sie die Zeilen für die Nameserver der Domäne in [.filename]#/etc/resolv.conf# ein, damit die Namensauflösung in der Jail funktioniert.
+. [.filename]#/etc/hosts# anpassen
++
+Ändern Sie die Adresse und fügen Sie den Namen der Jail zu den `localhost`-Einträgen in [.filename]#/etc/hosts# hinzu.
+. [.filename]#/etc/rc.conf# konfigurieren
++
+Tragen Sie Konfigurationseinstellungen in [.filename]#/etc/rc.conf# ein. Der Rechnername und die IP-Adresse werden nicht eingestellt, da diese Werte bereits durch die Jail-Konfiguration zur Verfügung gestellt werden.
+
+Nach der Konfiguration der Jail können die Anwendungen, für die die Jail erstellt wurde, installiert werden.
+
+[TIP]
+====
+
+Einige Ports müssen mit speziellen Optionen gebaut werden, damit sie in der Jail verwendet werden können. Zum Beispiel haben die Netzwerk-Monitoring-Pakete package:net-mgmt/nagios-plugins[] und package:net-mgmt/monitoring-plugins[] eine Option `JAIL`, die aktiviert werden muss, damit diese Werkzeuge innerhalb einer Jail funktionieren.
+====
+
+[[jails-ezjail-update]]
+=== Jails aktualisieren
+
+[[jails-ezjail-update-os]]
+==== Das Betriebssystem aktualisieren
+
+Da das Basissystem der Basejail von den anderen Jails gemeinsam genutzt wird, werden bei einem Update der Basejail automatisch alle anderen Jails aktualisiert. Die Aktualisierung kann entweder über den Quellcode oder über binäre Updates erfolgen.
+
+Um das Basissystem auf dem Host-System zu bauen und in der Basejail zu installieren, geben Sie folgendes ein:
+
+[source,bash]
+....
+# ezjail-admin update -b
+....
+
+Wenn das Basissystem bereits auf dem Host-System gebaut wurde, kann es in der Basejail installiert werden:
+
+[source,bash]
+....
+# ezjail-admin update -i
+....
+
+Binär-Updates verwenden man:freebsd-update[8]. Das Update unterliegt dabei den gleichen Einschränkungen, als wenn man:freebsd-update[8] direkt ausgeführt würde. Vor allem stehen mit dieser Methode nur -RELEASE Versionen von FreeBSD zur Verfügung.
+
+Aktualisieren Sie die Basejail auf die neueste FreeBSD-Version des Host-Systems. Zum Beispiel von RELEASE-p1 auf RELEASE-p2.
+
+[source,bash]
+....
+# ezjail-admin update -u
+....
+
+Damit das Basejail aktualisiert werden kann, muss zunächst das Host-System, wie in crossref:cutting-edge[freebsdupdate-upgrade,“Aktualisierungen an Haupt- und Unterversionen”] beschrieben, aktualisiert werden. Sobald das Host-System aktualisiert und neu gestartet wurde, kann die Basejail aktualisiert werden. Da man:freebsd-update[8] keine Möglichkeit besitzt, die derzeit installierte Version der Basejail zu bestimmen, muss die ursprüngliche Version beim Aufruf mit angegeben werden. Benutzen Sie man:file[1] um die ursprüngliche Version der Basejail zu bestimmen:
+
+[source,bash]
+....
+# file /usr/jails/basejail/bin/sh
+/usr/jails/basejail/bin/sh: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 9.3, stripped
+....
+
+Nutzen Sie diese Information, um die Aktualisierung von `9.3-RELEASE` auf die aktuelle Version des Host-Systems durchzuführen:
+
+[source,bash]
+....
+# ezjail-admin update -U -s 9.3-RELEASE
+....
+
+Nachdem die Basejail aktualisiert ist, muss in jeder Jail man:mergemaster[8] ausgeführt werden, um die Konfigurationsdateien zu aktualisieren.
+
+Wie man:mergemaster[8] verwendet wird, hängt stark vom Zweck und Vertrauenswürdigkeit der Jail ab. Wenn die Dienste oder Benutzer nicht vertrauenswürdig sind, dann sollte man:mergemaster[8] nur innerhalb der Jail ausgeführt werden:
+
+[[jails-ezjail-update-mergemaster-untrusted]]
+.man:mergemaster[8] in einer nicht vertrauenswürdigen Jail ausführen
+[example]
+====
+Entfernen Sie die Verknüpfung von [.filename]#/usr/src# des Jails zur Basejail und erstellen Sie ein neues [.filename]#/usr/src# als Mountpunkt für die Jail. Hängen Sie [.filename]#/usr/src# vom Host-System schreibgeschützt in den Mountpunkt für die Jail ein:
+
+[source,bash]
+....
+# rm /usr/jails/jailname/usr/src
+# mkdir /usr/jails/jailname/usr/src
+# mount -t nullfs -o ro /usr/src /usr/jails/jailname/usr/src
+....
+
+Öffnen Sie eine Konsole in der Jail:
+
+[source,bash]
+....
+# ezjail-admin console jailname
+....
+
+Innerhalb der Jail führen Sie dann man:mergemaster[8] aus. Danach verlassen Sie die Konsole:
+
+[source,bash]
+....
+# cd /usr/src
+# mergemaster -U
+# exit
+....
+
+Abschließend können Sie [.filename]#/usr/src# aus der Jail aushängen:
+
+[source,bash]
+....
+# umount /usr/jails/jailname/usr/src
+....
+
+====
+
+[[jails-ezjail-update-mergemaster-trusted]]
+.man:mergemaster[8] in einer vertrauenswürdigen Jail ausführen
+[example]
+====
+Wenn den Benutzern und den Diensten in der Jail vertraut wird, kann man:mergemaster[8] auf dem Host-System ausgeführt werden:
+
+[source,bash]
+....
+# mergemaster -U -D /usr/jails/jailname
+....
+
+====
+
+[TIP]
+====
+
+Nach einem größeren Versionsupdate empfiehlt package:sysutils/ezjail[], sicherzustellen, dass `pkg` die richtige Version hat. Geben Sie dazu den folgenden Befehl ein, um auf die entsprechende Version zu aktualisieren:
+
+[source,bash]
+....
+# pkg-static upgrade -f pkg
+....
+
+====
+
+[[jails-ezjail-update-ports]]
+==== Ports aktualisieren
+
+Die Ports-Sammlung der Basejail wird von den anderen Jails gemeinsam genutzt. Somit genügt es, die Ports-Sammlung in der Basejail zu aktualisieren.
+
+Die Ports-Sammlung der Basejail wird mit man:portsnap[8] aktualisiert:
+
+[source,bash]
+....
+# ezjail-admin update -P
+....
+
+[[jails-ezjail-control]]
+=== Jails verwalten
+
+[[jail-ezjail-control-stop-start]]
+==== Jails starten und stoppen
+
+ezjail startet automatisch alle Jails, wenn das System hochfährt. Jails können auch manuell mit `stop` und `start` gestoppt und neu gestartet werden:
+
+[source,bash]
+....
+# ezjail-admin stop sambajail
+Stopping jails: sambajail
+....
+
+In der Voreinstellung werden die Jails automatisch gestartet, wenn das Host-System hochfährt. Der automatische Start kann mit `config` deaktiviert werden:
+
+[source,bash]
+....
+# ezjail-admin config -r norun seldomjail
+....
+
+Diese Einstellung wird nach einem Neustart des Host-Systems aktiviert. Eine Jail, die bereits läuft, wird hiermit nicht gestoppt.
+
+Der automatische Start kann auch aktiviert werden:
+
+[source,bash]
+....
+# ezjail-admin config -r run oftenjail
+....
+
+[[jails-ezjail-control-backup]]
+==== Jails archivieren und wiederherstellen
+
+Benutzen Sie `archive` um ein [.filename]#.tar.gz#-Archiv einer Jail zu erstellen. Der Dateiname wird aus dem Namen der Jail und dem aktuellen Datum zusammengesetzt. Archivdateien werden in [.filename]#/usr/jails/ezjail_archives# abgelegt. Ein alternatives Verzeichnis für die Ablage kann in der Variable `ezjail_archivedir` der Konfigurationsdatei definiert werden.
+
+Die Archivdatei kann an anderer Stelle als Sicherung gespeichert werden, oder eine andere Jail kann daraus mit `restore` wiederhergestellt werden. Eine neue Jail kann auch aus dem Archiv erstellt werden, was eine bequeme Möglichkeit bietet, bestehende Jails zu klonen.
+
+Die Jail `wwwserver` stoppen und archivieren:
+
+[source,bash]
+....
+# ezjail-admin stop wwwserver
+Stopping jails: wwwserver.
+# ezjail-admin archive wwwserver
+# ls /usr/jails/ezjail-archives/
+wwwserver-201407271153.13.tar.gz
+....
+
+Erstellen Sie aus dem eben erzeugten Archiv eine neue Jail namens `wwwserver-clone`. Verwenden Sie die Schnittstelle [.filename]#em1# und weisen Sie eine neue IP-Adresse zu, um einen Konflikt mit dem Original zu vermeiden:
+
+[source,bash]
+....
+# ezjail-admin create -a /usr/jails/ezjail_archives/wwwserver-201407271153.13.tar.gz wwwserver-clone 'lo1|127.0.3.1,em1|192.168.1.51'
+....
+
+[[jails-ezjail-example-bind]]
+=== Vollständiges Beispiel: BIND in einer Jail
+
+Einen BINDDNS-Server innerhalb einer Jail zu betreiben erhöht die Sicherheit, da der Dienst isoliert wird. Dieses Beispiel erstellt einen einfachen caching-only Nameserver.
+
+* Die Jail bekommt den Namen `dns1`.
+* Die Jail erhält die IP-Adresse `192.168.1.240` auf der Schnittstelle `re0` des Host-Systems.
+* Die Upstream-DNS-Server des ISPs lauten `10.0.0.62` und `10.0.0.61`.
+* Die Basejail wurde bereits erstellt und die Ports-Sammlung installiert, wie in <<jails-ezjail-initialsetup>> beschrieben.
+
+[[jails-ezjail-example-bind-steps]]
+.BIND in einer Jail laufen lassen
+[example]
+====
+Erstellen Sie eine geklonte Loopback-Schnittstelle durch einen Eintrag in [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+cloned_interfaces="lo1"
+....
+
+Erzeugen Sie jetzt die Loopback-Schnittstelle:
+
+[source,bash]
+....
+# service netif cloneup
+Created clone interface: lo1
+....
+
+Erstellen Sie die Jail:
+
+[source,bash]
+....
+# ezjail-admin create dns1 'lo1|127.0.2.1,re0|192.168.1.240'
+....
+
+Starten Sie die Jail, verbinden Sie sich mit der Konsole und führen Sie die grundlegende Konfiguration durch:
+
+[source,bash]
+....
+# ezjail-admin start dns1
+# ezjail-admin console dns1
+# passwd
+Changing local password for root
+New Password:
+Retype New Password:
+# tzsetup
+# sed -i .bak -e '/adjkerntz/ s/^/#/' /etc/crontab
+# sed -i .bak -e 's/127.0.0.1/127.0.2.1/g; s/localhost.my.domain/dns1.my.domain dns1/' /etc/hosts
+....
+
+Setzen Sie vorübergehend die Upstream-DNS-Server in [.filename]#/etc/resolv.conf#, damit die Ports-Sammlung heruntergeladen werden kann:
+
+[.programlisting]
+....
+nameserver 10.0.0.62
+nameserver 10.0.0.62
+....
+
+Immer noch in der Konsole der Jail, installieren Sie package:dns/bind99[].
+
+[source,bash]
+....
+# make -C /usr/ports/dns/bind99 install clean
+....
+
+Konfigurieren Sie den Nameserver in [.filename]#/usr/local/etc/namedb/named.conf#.
+
+Erstellen Sie eine Zugriffskontrollliste (ACL) der Adressen und Netzwerke, die DNS-Anfragen an diesen Nameserver senden dürfen. Diese Sektion wird vor der Sektion `options` hinzugefügt, die sich bereits in der Datei befindet:
+
+[.programlisting]
+....
+...
+// or cause huge amounts of useless Internet traffic.
+
+acl "trusted" {
+ 192.168.1.0/24;
+ localhost;
+ localnets;
+};
+
+options {
+...
+....
+
+Verwenden Sie die IP-Adresse der Jail in der Direktive `listen-on`, um DNS-Anfragen von anderen Rechnern aus dem Netzwerk zu akzeptieren:
+
+[.programlisting]
+....
+ listen-on { 192.168.1.240; };
+....
+
+Entfernen Sie die Kommentarzeichen `/*` und `*/`. Tragen Sie die IP-Adressen der Upstream-DNS-Server ein. Unmittelbar nach der Sektion `forwarders` fügen Sie Verweise auf die bereits definierten ACLs ein:
+
+[.programlisting]
+....
+ forwarders {
+ 10.0.0.62;
+ 10.0.0.61;
+ };
+
+ allow-query { any; };
+ allow-recursion { trusted; };
+ allow-query-cache { trusted; };
+....
+
+Aktivieren Sie den Dienst in [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+named_enable="YES"
+....
+
+Starten und testen Sie den Nameserver:
+
+[source,bash]
+....
+# service named start
+wrote key file "/usr/local/etc/namedb/rndc.key"
+Starting named.
+# /usr/local/bin/dig @192.168.1.240 freebsd.org
+....
+
+Beinhaltet die Antwort
+
+[source,bash]
+....
+;; Got answer;
+....
+
+dann funktioniert der Nameserver. Eine längere Verzögerung, gefolgt von der Antwort
+
+[source,bash]
+....
+;; connection timed out; no servers could be reached
+....
+
+weist auf ein Problem hin. Überprüfen Sie die Konfigurationseinstellungen und stellen Sie sicher, dass alle lokalen Firewalls den DNS-Zugriff auf die Upstream-DNS-Server erlauben.
+
+Wie auch jeder andere lokale Rechner, kann der DNS-Server Anfragen für Namensauflösung an sich selbst stellen. Tragen Sie die Adresse des DNS-Servers in die [.filename]#/etc/resolv.conf# der Client-Rechner:
+
+[.programlisting]
+....
+nameserver 192.168.1.240
+....
+
+Ein lokaler DHCP-Server kann die Adresse eines lokalen DNS-Servers automatisch für alle DHCP-Clients zur Verfügung stellen.
+====
diff --git a/documentation/content/de/books/handbook/kernelconfig/_index.adoc b/documentation/content/de/books/handbook/kernelconfig/_index.adoc
new file mode 100644
index 0000000000..e1763c4def
--- /dev/null
+++ b/documentation/content/de/books/handbook/kernelconfig/_index.adoc
@@ -0,0 +1,294 @@
+---
+title: Kapitel 8. Konfiguration des FreeBSD-Kernels
+part: Teil II. Oft benutzte Funktionen
+prev: books/handbook/multimedia
+next: books/handbook/printing
+---
+
+[[kernelconfig]]
+= Konfiguration des FreeBSD-Kernels
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 8
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/kernelconfig/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/kernelconfig/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/kernelconfig/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[kernelconfig-synopsis]]
+== Übersicht
+
+Der Kernel ist das Herz des FreeBSD-Betriebssystems. Er ist verantwortlich für die Speicherverwaltung, das Durchsetzen von Sicherheitsdirektiven, Netzwerkfähigkeit, Festplattenzugriffen und vieles mehr. Obwohl FreeBSD es ermöglicht, dynamisch konfiguriert zu werden, ist es ab und an notwendig, einen angepassten Kernel zu konfigurieren und zu kompilieren.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie Folgendes wissen:
+
+* Wann Sie einen angepassten Kernel kompilieren sollten.
+* Wie Sie eine Hardware-Inventur durchführen.
+* Wie Sie eine Kernelkonfigurationsdatei verändern.
+* Wie Sie mit der Konfigurationsdatei einen neuen Kernel kompilieren.
+* Wie Sie den neuen Kernel installieren.
+* Was zu tun ist, falls etwas schiefgeht.
+
+Alle Kommandos, aus den Beispielen dieses Kapitels, müssen mit `root`-Rechten ausgeführt werden.
+
+[[kernelconfig-custom-kernel]]
+== Wieso einen eigenen Kernel bauen?
+
+Traditionell besaß FreeBSD einen monolithischen Kernel. Der Kernel war ein einziges großes Programm, das eine bestimmte Auswahl an Hardware unterstützte. Um das Kernelverhalten zu ändern, musste man einen neuen Kernel kompilieren und dann den neuen Kernel booten.
+
+Heutzutage befinden sich die meisten Funktionen des FreeBSD-Kernels in Modulen, die je nach Bedarf dynamisch geladen und entladen werden können. Dies erlaubt es, einen laufenden Kernel anzupassen, um sofort neue Hardware und neue Funktionen zu unterstützen. Dies ist als modularer Kernel bekannt.
+
+Gelegentlich ist es noch notwendig, eine statische Kernelkonfigurationen durchzuführen. In einigen Fällen ist die Funktion zu systemnah, um durch ein Modul realisiert zu werden. Andere Umgebungen verhindern vielleicht das Laden und Entladen von Kernelmodulen und erfordern, dass nur die benötigte Funktionalität statisch in den Kernel kompiliert wird.
+
+Das Erstellen eines angepassten Kernels ist eines der Rituale für erfahrene BSD-Benutzer. Obwohl dieser Prozess recht viel Zeit in Anspruch nimmt, kann er doch viele Vorteile für das FreeBSD-System bringen. Im Gegensatz zum [.filename]#GENERIC#-Kernel, der eine Vielzahl von Hardware unterstützen muss, kann ein angepasster Kernel so eingeschränkt werden, dass er nur noch die Hardware des Rechners unterstützt. Dies hat einige Vorteile:
+
+* Schnellerer Bootvorgang. Da der Kernel nur nach der Hardware des Systems sucht, kann sich die Zeit für einen Systemstart verkürzen.
+* Geringerer Speicherbedarf. Ein eigener Kernel benötigt in der Regel weniger Speicher als ein [.filename]#GENERIC#-Kernel durch das Entfernen von Funktionen und Gerätetreibern. Das ist vorteilhaft, denn der Kernel verweilt immer im RAM und verhindert dadurch, dass dieser Speicher von Anwendungen genutzt wird. Deshalb ist ein angepasster Kernel auf einem System mit wenig RAM sinnvoll.
+* Zusätzliche Hardwareunterstützung. Ein angepasster Kernel kann Unterstützung für Geräte bieten, die im [.filename]#GENERIC#-Kernel nicht enthalten sind.
+
+Bevor Sie einen angepassten Kernel erstellen, überlegen Sie sich bitte, warum Sie dies tun wollen. Wenn Sie lediglich eine bestimmte Hardwareunterstützung benötigen, existiert diese vielleicht schon als Kernelmodul.
+
+Kernelmodule existieren in [.filename]#/boot/kernel# und können mit man:kldload[8] dynamisch in den laufenden Kernel geladen werden. Die meisten Kerneltreiber verfügen über ein ladbares Modul und eine Manualpage. Der drahtlose Ethernet-Treiber man:ath[4] hat die folgenden Informationen in seiner Manualpage:
+
+[source,bash,subs="macros"]
+....
+Alternatively, to load the driver as a module at boot time, place the
+following line in loader.conf(5):
+
+ if_ath_load="YES"
+....
+
+Durch das Hinzufügen von `if_ath_load="YES"` in [.filename]#/boot/loader.conf# wird das Modul dynamisch beim Systemstart geladen.
+
+In manchen Fällen gibt es kein entsprechendes Modul in [.filename]#/boot/kernel#. Dies gilt insbesondere für bestimmte Subsysteme.
+
+[[kernelconfig-devices]]
+== Informationen über die vorhandene Hardware beschaffen
+
+Bevor die Kernelkonfigurationsdatei bearbeitet wird, ist es empfehlenswert eine Bestandsaufnahme der Hardware des Systems durchzuführen. Auf einem Dual-Boot-System können diese Informationen aus dem anderen Betriebssystem ermittelt werden. Microsoft(R)s Gerätemanager enthält beispielsweise Informationen über die installierte Hardware.
+
+[NOTE]
+====
+Einige Versionen von Microsoft(R) Windows(R) verfügen über ein System-Icon auf dem Desktop, über das Sie den Gerätemanager direkt aufrufen können.
+====
+
+Wenn FreeBSD das einzige installierte Betriebssystem ist, dann listet man:dmesg[8] die Hardware auf, die während des Systemstarts gefunden wurde. Die meisten FreeBSD-Gerätetreiber haben eine eigene Manualpage, die Informationen über die unterstützte Hardware enthält. Die folgenden Zeilen zeigen beispielsweise an, dass der man:psm[4]-Treiber eine angeschlossene Maus gefunden hat:
+
+[source,bash]
+....
+psm0: <PS/2 Mouse> irq 12 on atkbdc0
+psm0: [GIANT-LOCKED]
+psm0: [ITHREAD]
+psm0: model Generic PS/2 mouse, device ID 0
+....
+
+Da diese Hardware vorhanden ist, sollte dieser Treiber nicht aus einer angepassten Kernelkonfigurationsdatei entfernt werden.
+
+Wenn `dmesg` keine Informationen zur gefundenen Hardware anzeigt, können diese Informationen auch aus [.filename]#/var/run/dmesg.boot# entnommen werden.
+
+Ein weiteres Werkzeug für die Suche nach Hardware ist man:pciconf[8], das ausführliche Informationen bereitstellt. Ein Beispiel:
+
+[source,bash]
+....
+% pciconf -lv
+ath0@pci0:3:0:0: class=0x020000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00
+ vendor = 'Atheros Communications Inc.'
+ device = 'AR5212 Atheros AR5212 802.11abg wireless'
+ class = network
+ subclass = ethernet
+....
+
+Die Ausgabe zeigt, dass der Treiber [.filename]#ath# eine drahtlose Ethernetkarte gefunden hat.
+
+Die Option `-k` von man:man[1] kann verwendet werden, um nützliche Informationen zu erhalten. Um beispielsweise eine Liste von Manualpages zu erhalten, welche ein spezifisches Wort enthalten:
+
+[source,bash]
+....
+# man -k Atheros
+ath(4) - Atheros IEEE 802.11 wireless network driver
+ath_hal(4) - Atheros Hardware Access Layer (HAL)
+....
+
+Mit einer Inventarliste der Hardware können Sie dann sicherstellen, dass Sie die Treiber der installierten Hardware nicht versehentlich entfernen, wenn Sie die Kernelkonfigurationsdatei bearbeiten.
+
+[[kernelconfig-config]]
+== Die Kernelkonfigurationsdatei
+
+Bevor eine angepasste Kernelkonfigurationsdatei erstellt werden kann, muss zuerst der vollständige FreeBSD Quellcodebaum installiert werden.
+
+Falls [.filename]#/usr/src/# nicht existiert oder leer ist, sind die Kernelquellen nicht installiert. Die Quellen können mit Subversion und der Anleitung im crossref:mirrors[svn,“Benutzen von Subversion”] installiert werden.
+
+Sobald die Quellen installiert sind, können Sie sich einen Überblick über [.filename]#/usr/src/sys# verschaffen. Dieses Verzeichnis enthält eine Reihe von Unterverzeichnissen, einschließlich Verzeichnisse für die unterstützten Architekturen [.filename]#amd64#, [.filename]#i386#, [.filename]#powerpc# und [.filename]#sparc64#. Alles in diesen Verzeichnissen ist nur für die jeweilige Architektur relevant. Der Rest des Codes ist maschinenunabhängig und für alle Architekturen gleich. Jede unterstützte Architektur hat ein Unterverzeichnis [.filename]#conf#, das die [.filename]#GENERIC# Kernelkonfigurationsdatei für diese Architektur enthält.
+
+Bearbeiten Sie [.filename]#GENERIC# nicht direkt. Kopieren Sie stattdessen die Datei unter einem anderen Namen und machen dann die Änderungen an dieser Kopie. Traditionell besteht der Name des Kernels immer aus Großbuchstaben. Wenn Sie mehrere FreeBSD-Maschinen mit unterschiedlicher Hardware betreuen, ist es eine gute Idee, die Konfigurationsdatei nach den Hostnamen der Maschinen zu benennen. In diesem Beispiel wird eine Kopie der [.filename]#GENERIC# Kernelkonfigurationsdatei, namens [.filename]#MYKERNEL#, für die [.filename]#amd64#-Architektur erstellt:
+
+[source,bash]
+....
+# cd /usr/src/sys/amd64/conf
+# cp GENERIC MYKERNEL
+....
+
+[.filename]#MYKERNEL# kann jetzt mit einem Texteditor bearbeitet werden. Der Standard-Editor ist vi, jedoch steht mit ee ein weiterer, einfach zu bedienender Editor bereit.
+
+Das Format der Konfigurationsdatei ist einfach. Jede Zeile enthält ein Schlüsselwort, das ein Gerät oder ein Subsystem repräsentiert, ein Argument und eine kurze Beschreibung. Jeder Text, der hinter einem `#` steht, gilt als Kommentar und wird ignoriert. Um die Kernel-Unterstützung für ein Gerät oder Subsystem zu entfernen, muss ein `#` an den Anfang der Zeile, die dieses Gerät oder Subsystem repräsentiert, gesetzt werden. Verändern Sie keine Zeilen, die Sie nicht genau verstehen.
+
+Neben den Kurzbeschreibungen in dieser Datei, finden Sie zusätzliche Erklärungen in [.filename]#NOTES#, die sich in demselben Verzeichnis wie [.filename]#GENERIC# für die jeweilige Architektur befindet. Von der Architektur unabhängige Optionen sind in [.filename]#/usr/src/sys/conf/NOTES# aufgeführt.
+
+[TIP]
+====
+
+Wenn Sie die Kernelkonfigurationsdatei fertig bearbeitet haben, sollten Sie eine Sicherungskopie außerhalb von [.filename]#/usr/src# speichern
+
+Alternativ kann die Kernelkonfigurationsdatei an anderer Stelle gespeichert, und ein symbolischer Link auf die Datei erstellt werden:
+
+[source,bash]
+....
+# cd /usr/src/sys/amd64/conf
+# mkdir /root/kernels
+# cp GENERIC /root/kernels/MYKERNEL
+# ln -s /root/kernels/MYKERNEL
+....
+
+====
+
+Es ist möglich, eine `include`-Anweisung in die Kernelkonfigurationsdatei aufzunehmen. Diese erlaubt das lokale Einfügen von anderen Konfigurationsdateien in die aktuelle, was es einfacher macht, kleinere Änderungen an einer existierenden Datei zu vollziehen. Wenn Sie einen [.filename]#GENERIC#-Kernel mit nur einer kleinen Anzahl von zusätzlichen Optionen und Treibern benötigen, brauchen Sie mit den folgenden Zeilen nur ein kleines Delta im Vergleich zu GENERIC anpassen, wie in diesem Beispiel zu sehen:
+
+[.programlisting]
+....
+include GENERIC
+ident MYKERNEL
+
+options IPFIREWALL
+options DUMMYNET
+options IPFIREWALL_DEFAULT_TO_ACCEPT
+options IPDIVERT
+....
+
+Diese Methode zeigt die Unterschiede der lokalen Konfigurationsdatei zu einem [.filename]#GENERIC#-Kernel an. Sobald Aktualisierungen durchgeführt werden, können neue Eigenschaften, die zu [.filename]#GENERIC# hinzugefügt werden, auch dem lokalen Kernel angehängt werden, es sei denn, es wird durch `nooptions` oder `nodevice` unterbunden. Eine umfassende Liste von Konfigurationseinstellungen und deren Beschreibungen finden Sie in man:config[5].
+
+[NOTE]
+====
+Um einen Kernel mit allen möglichen Optionen zu bauen, führen Sie als `root` die folgenden Befehle aus:
+
+[source,bash]
+....
+# cd /usr/src/sys/arch/conf && make LINT
+....
+
+====
+
+[[kernelconfig-building]]
+== Einen angepassten Kernel bauen und installieren
+
+Nachdem die Änderungen an der angepassten Kernelkonfigurationsdatei gespeichert sind, kann der Quellcode für den Kernel mit den folgenden Schritten übersetzt werden:
+
+[.procedure]
+====
+*Procedure: Einen Kernel bauen*
+
+. Wechseln Sie das Verzeichnis:
++
+[source,bash]
+....
+# cd /usr/src
+....
+
+. Bauen Sie den Kernel, indem Sie den Namen der Kernelkonfigurationsdatei angeben:
++
+[source,bash]
+....
+# make buildkernel KERNCONF=MYKERNEL
+....
+
+. Installieren Sie den neuen Kernel. Dieser Befehl wird den neuen Kernel nach [.filename]#/boot/kernel/kernel# kopieren, und den alten Kernel nach [.filename]#/boot/kernel.old/kernel# speichern:
++
+[source,bash]
+....
+# make installkernel KERNCONF=MYKERNEL
+....
+
+. Fahren Sie das System herunter und starten Sie den neuen Kernel. Wenn etwas nicht funktioniert, lesen Sie <<kernelconfig-noboot,Der Kernel bootet nicht>>.
+====
+
+In der Voreinstellung werden beim Bau eines angepassten Kernels stets alle Kernelmodule neu gebaut. Um einen Kernel schneller zu bauen, oder um nur bestimmte Module zu bauen, bearbeiten Sie [.filename]#/etc/make.conf#, bevor Sie den Kernel neu bauen.
+
+In diesem Beispiel werden über eine Variable nur die Kernelmodule definiert, die auch tatsächlich gebaut werden sollen. In der Voreinstellung werden alle Module gebaut:
+
+[.programlisting]
+....
+MODULES_OVERRIDE = linux acpi
+....
+
+Alternativ kann auch eine Variable verwendet werden, die bestimmte Kernelmodule vom Bauprozess ausschließt:
+
+[.programlisting]
+....
+WITHOUT_MODULES = linux acpi sound
+....
+
+Weitere Variablen und deren Beschreibung finden Sie in man:make.conf[5].
+
+[[kernelconfig-trouble]]
+== Wenn etwas schiefgeht
+
+Es gibt vier Hauptfehlerquellen beim Erstellen eines angepassten Kernels:
+
+`config` verursacht Fehler:::
+Wenn `config` fehlschlägt, zeigt es die Nummer der Zeile an, die das Problem verursacht. Bei der folgenden Fehlermeldung sollten Sie die angegebene Zeile mit [.filename]#GENERIC# oder [.filename]#NOTES# vergleichen und sicherstellen, dass das Schlüsselwort in Zeile 17 richtig geschrieben ist:
++
+[source,bash]
+....
+config: line 17: syntax error
+....
+
+`make` verursacht Fehler:::
+Wenn `make` fehlschlägt, liegen meistens Fehler in der Konfigurationsdatei vor, die aber nicht schwerwiegend genug für `config` waren. Überprüfen Sie die Konfiguration und wenn Sie keinen Fehler entdecken können, schicken Sie eine E-Mail mit der Kernelkonfigurationsdatei an die Mailingliste {de-questions}.
+[[kernelconfig-noboot]]
+Der Kernel bootet nicht:::
+Wenn der neue Kernel nicht bootet oder die Geräte nicht erkannt werden, ist das noch kein Grund zur Panik. Glücklicherweise besitzt FreeBSD einen exzellenten Mechanismus zur Wiederherstellung nach dem Einsatz inkompatibler Kernel. Wählen Sie einfach den zu bootenden Kernel im FreeBSD Bootloader aus. Dazu wählen Sie im Bootmenü die Option "Escape to a loader prompt". Danach geben Sie am Prompt `boot _kernel.old_` oder den Namen eines anderen Kernels ein, der sauber bootet.
++
+Nun kann die Konfiguration noch einmal überprüft und der Kernel neu kompiliert werden. Dazu ist [.filename]#/var/log/messages# sehr nützlich, da hier sämtliche Kernelmeldungen von jedem erfolgreichen Bootvorgang gespeichert werden. man:dmesg[8] gibt die Kernelmeldungen vom letzten Bootvorgang aus.
++
+[NOTE]
+====
+Wenn Sie Probleme beim Kernelbau bekommen, heben Sie sich immer eine Kopie von [.filename]#GENERIC# oder einen anderen Kernel, der garantiert bootet, auf. Dies ist sehr wichtig, weil jedes Mal, wenn ein neuer Kernel installiert wird, [.filename]#kernel.old# mit dem zuletzt installierten Kernel überschrieben wird und dieser möglicherweise nicht bootfähig ist. Verschieben Sie daher den funktionierenden Kernel so schnell wie möglich, indem Sie das Verzeichnis mit dem funktionierenden Kernel umbenennen:
+
+[source,bash]
+....
+# mv /boot/kernel /boot/kernel.bad
+# mv /boot/kernel.good /boot/kernel
+....
+
+====
+
+Der Kernel funktioniert, aber `ps` nicht::
+Wenn Sie eine andere Version des Kernels installiert haben als die, mit der Ihre Systemwerkzeuge gebaut wurden, beispielsweise einen Kernel aus den -CURRENT-Quellen auf einem -RELEASE-System, werden Programme wie man:ps[1] und man:vmstat[8] nicht mehr funktionieren. Um dies zu beheben, sollten Sie das crossref:cutting-edge[makeworld,komplette System neu bauen und installieren]. Achten Sie darauf, dass die Quellen, aus denen das System gebaut wird, zum installierten Kernel passt. Man sollte niemals einen Kernel benutzen, der nicht zur Systemversion passt.
diff --git a/documentation/content/de/books/handbook/l10n/_index.adoc b/documentation/content/de/books/handbook/l10n/_index.adoc
new file mode 100644
index 0000000000..923cc67c25
--- /dev/null
+++ b/documentation/content/de/books/handbook/l10n/_index.adoc
@@ -0,0 +1,580 @@
+---
+title: Kapitel 22. Lokalisierung – I18N/L10N einrichten und benutzen
+part: Teil III. Systemadministration
+prev: books/handbook/virtualization
+next: books/handbook/cutting-edge
+---
+
+[[l10n]]
+= Localization - i18n/L10n Usage and Setup
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 22
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/l10n/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/l10n/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/l10n/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[l10n-synopsis]]
+== Übersicht
+
+FreeBSD ist ein verteiltes Projekt mit Nutzern und Mitwirkenden auf der ganzen Welt. Als solches unterstützt FreeBSD Lokalisierung für viele Sprachen, so dass Benutzer Daten in anderen Sprachen als Englisch anzeigen, eingeben und verarbeiten können. Sie können zwischen den meisten der verbreitetsten Sprachen der Welt wählen, unter anderem Chinesisch, Japanisch, Koreanisch, Französisch, Russisch, Vietnamesisch und Deutsch.
+
+Der Begriff internationalization (englisch für Internationalisierung) wurde zu I18N abgekürzt, weil sich zwischen dem ersten und letzten Buchstaben des Worts 18 Buchstaben befinden. L10N benutzt die gleiche Namensgebung und ist eine Abkürzung des Wortes localization (englisch für Lokalisierung). Mit I18N/L10N-Methoden, -Protokollen und -Anwendungen können Benutzer eine Sprache ihrer Wahl verwenden.
+
+Dieses Kapitel behandelt die Internationalisierung und Lokalisierung von FreeBSD. Nachdem Sie dieses Kapitel gelesen haben, werden Sie wissen:
+
+* wie der Name einer Locale aufgebaut ist.
+* wie die Locale einer Login-Shell gesetzt wird.
+* wie die Konsole für nicht-englische Sprachen konfiguriert wird.
+* wie Xorg mit verschiedenen Sprachen benutzt wird.
+* wie I18N-fähige Anwendungen gefunden werden können.
+* Wo Sie weitere Informationen über verschiedene Sprachen finden.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie:
+
+* Wissen, wie Sie <<ports,zusätzliche Anwendungen installieren>>.
+
+[[using-localization]]
+== Lokale Anpassungen benutzen
+
+Lokale Anpassungen werden durch die Angabe von drei Werten erreicht: dem Sprachcode, dem Ländercode und der Codierung. Die Zusammenfassung dieser Werte wird "Locale" genannt und sieht wie folgt aus:
+
+[.programlisting]
+....
+Sprachcode_Ländercode.Codierung
+....
+
+_Sprachcode_ und _Ländercode_ werden verwendet, um das Land und die spezifische Sprachvariation zu bestimmen. <<locale-lang-country>> enthält dazu einige Beispiele:
+[[locale-lang-country]]
+.Gebräuchliche Sprach- und Ländercodes
+[cols="1,1", frame="none", options="header"]
+|===
+| Sprachcode_Ländercode
+| Beschreibung
+
+|en_US
+|Englisch, Vereinigte Staaten
+
+|ru_RU
+|Russisch, Russland
+
+|zh_TW
+|Traditionelles Chinesisch, Taiwan
+|===
+
+Eine vollständige Liste der verfügbaren Lokalisierungen erhalten Sie durch die Eingabe von:
+
+[source,bash]
+....
+% locale -a | more
+....
+
+Die aktuelle Ländereinstellung erhalten Sie mit:
+
+[source,bash]
+....
+% locale
+....
+
+Sprachspezifische Zeichensätze, wie ISO8859-1, ISO8859-15, KOI8-R und CP437 werden in man:multibyte[3] beschrieben. Eine Liste der Zeichensätze finden Sie in der http://www.iana.org/assignments/character-sets[ IANA Registry].
+
+Einige Sprachen, darunter Chinesisch und Japanisch, können nicht mit ASCII-Zeichen dargestellt werden und benötigen eine erweiterte Sprachcodierung mit Wide- oder Multibyte-Zeichen. EUC und Big5 sind Beispiele für Wide- oder Multibyte-Codierungen. Ältere Anwendungen erkennen diese Zeichen nicht und halten sie fälschlicherweise für Steuerzeichen, während neure Anwendungen diese Zeichen in der Regel erkennen. Es hängt allerdings von der Implementierung ab, ob man eine Anwendung neu kompilieren muss, um lokale Zeichensätze zu bekommen, oder ob sie nur richtig konfiguriert werden muss.
+
+[NOTE]
+====
+FreeBSD verwendet Xorg-kompatible Codierungen.
+====
+
+Der Rest dieses Abschnitts beschreibt die verschiedenen Methoden zur Konfiguration von der Locale auf einem FreeBSD-System. Der folgende Abschnitt beschreibt den Bau von Anwendungen mit I18N-Unterstützung.
+
+[[setting-locale]]
+=== Einstellen der Locale für die Login-Shell
+
+Die Einstellungen für Locale werden entweder in der [.filename]#~/.login_conf# des Benutzers, oder der Startdatei der Shell ([.filename]#~/.profile#, [.filename]#~/.bashrc# oder [.filename]#~/.cshrc#) konfiguriert.
+
+Zwei Umgebungsvariablen sollten konfiguriert werden:
+
+* `LANG`, das die Locale einstellt.
+* `MM_CHARSET`, das den MIME Zeichensatz für Anwendungen einstellt.
+
+Neben der Shell-Konfiguration des Benutzers sollten diese Variablen auch für spezifische Anwendungen und Xorg-Konfigurationen eingestellt werden.
+
+Es gibt zwei Methoden, die Locale zu setzen: die erste und empfohlene Methode ist, die Umgebungsvariablen in der <<login-class,Login-Klasse>> zu setzen, die zweite Methode ist, sie in den <<startup-file,Startdateien>> der Shell zu setzen. In den nächsten Abschnitten werden beide Methoden vorgestellt.
+
+[[login-class]]
+==== Lokalisierung in der Login-Klasse
+
+Die erste Methode wird empfohlen, da sie die Umgebungsvariablen für die Login-Klasse und den MIME Zeichensatz für alle Shells zuweist. Die Lokalisierung kann von einem Benutzer selbst, oder vom Superuser für alle Benutzer eingestellt werden.
+
+[.filename]#.login_conf# im Heimatverzeichnis eines Benutzers sollte mindestens die folgenden Einträge enthalten, damit beide Variablen für den Gebrauch der Latin-1 Codierung gesetzt werden:
+
+[.programlisting]
+....
+me:\
+ :charset=ISO-8859-1:\
+ :lang=de_DE.ISO8859-1:
+....
+
+Damit traditionelles Chinesisch (BIG-5 Codierung) verwendet werden kann, sind in [.filename]#~/.login_conf# des Benutzers die nachstehenden Ergänzungen vorzunehmen. Einige Programme behandeln die Lokalisierung für Chinesisch, Japanisch und Koreanisch falsch, daher müssen mehr Variablen als üblich gesetzt werden:
+
+[.programlisting]
+....
+#Users who do not wish to use monetary units or time formats
+#of Taiwan can manually change each variable
+me:\
+ :lang=zh_TW.Big5:\
+ :setenv=LC_ALL=zh_TW.Big5,LC_COLLATE=zh_TW.Big5,LC_CTYPE=zh_TW.Big5,LC_MESSAGES=zh_TW.Big5,LC_MONETARY=zh_TW.Big5,LC_NUMERIC=zh_TW.Big5,LC_TIME= zh_TW.Big5:\
+ :charset=big5:\
+ :xmodifiers="@im=gcin": #Set gcin as the XIM Input Server
+....
+
+Alternativ kann der Superuser die Lokalisierung für alle Benutzer konfigurieren. Die folgenden Variablen in [.filename]#/etc/login.conf# setzen die richtige Login-Klasse und den richtigen MIME Zeichensatz:
+
+[.programlisting]
+....
+Sprache|Account-Typ-Beschreibung:\
+ :charset=MIME_Zeichensatz:\
+ :lang=Locale:\
+ :tc=default:
+....
+
+Die für Latin-1 erforderlichen Einträge würden wie folgt aussehen:
+
+[.programlisting]
+....
+german|German Users Accounts:\
+ :charset=ISO-8859-1:\
+ :lang=de_DE.ISO8859-1:\
+ :tc=default:
+....
+
+Weitere Einzelheiten über diese Variablen finden Sie in man:login.conf[5]. Beachten Sie, dass die Datei bereits vordefinierte _russische_ Login-Klassen enthält.
+
+Jedes Mal, wenn [.filename]#/etc/login.conf# bearbeitet wurde, muss die Datenbank mit dem folgenden Kommando aktualisiert werden:
+
+[source,bash]
+....
+# cap_mkdb /etc/login.conf
+....
+
+[NOTE]
+====
+Der reguläre Benutzer muss den Befehl `cap_mkdb` auf seine [.filename]#~/.login_conf# anwenden, damit die Änderungen wirksam werden.
+====
+
+===== Werkzeuge zum Ändern der Login-Klasse
+
+Neben der manuellen Konfiguration von [.filename]#/etc/login.conf#, stehen mehrere Werkzeuge bereit, um die Login-Klasse für neue Benutzer einzustellen.
+
+Wenn Sie neue Accounts mit `vipw` anlegen, setzen Sie im Feld _Sprache_ die gewünschte Sprache ein:
+
+[.programlisting]
+....
+user:password:1111:11:Sprache:0:0:Benutzername:/home/user:/bin/sh
+....
+
+Wenn Sie mit `adduser` neue Benutzer anlegen, können Sie die voreingestellte Sprache für alle Benutzer, oder für einen einzelnen Benutzer einstellen:
+
+Falls alle Benutzer die gleiche Sprache benutzen, setzen Sie `defaultclass=_Sprache_` in [.filename]#/etc/adduser.conf#.
+
+Wenn Sie diese Einstellung beim Anlegen des Benutzers überschreiben wollen, geben Sie entweder die gewünschte Login-Klasse am Prompt ein:
+
+[source,bash]
+....
+Enter login class: default []:
+....
+
+oder übergeben Sie die Login-Klasse beim Aufruf von `adduser`:
+
+[source,bash]
+....
+# adduser -class Sprache
+....
+
+Wenn Sie neue Benutzer mit `pw` anlegen, geben Sie die Login-Klasse wie folgt an:
+
+[source,bash]
+....
+# pw useradd Benutzername -L Sprache
+....
+
+Um die Login-Klasse eines bestehenden Benutzers zu ändern, kann `chpass` verwendet werden. Rufen Sie das Kommando als Superuser auf und geben Sie als Argument den entsprechenden Benutzernamen mit:
+
+[source,bash]
+....
+# chpass Benutzername
+....
+
+[[startup-file]]
+==== Lokalisierung in den Startdateien der Shells
+
+Diese zweite Methode wird nicht empfohlen, da jede Shell unterschiedlich eingerichtet wird, eine unterschiedliche Konfigurationsdatei und Syntax verwendet. Um beispielsweise die deutsche Sprache für die `sh` zu setzen, fügen Sie für einen Benutzer die folgende Zeilen in [.filename]#~/.profile# ein. Sie können diese Zeilen auch für alle Benutzer der `sh` Shell in [.filename]#/etc/profile# oder [.filename]#/usr/shared/skel/dot.profile# hinzufügen:
+
+[.programlisting]
+....
+LANG=de_DE.ISO8859-1; export LANG
+MM_CHARSET=ISO-8859-1; export MM_CHARSET
+....
+
+Die `csh` Shell verwendet jedoch eine andere Konfigurationsdatei und eine andere Syntax. Dies sind die entsprechenden Einstellungen für [.filename]#~/.csh.login#, [.filename]#/etc/csh.login# oder [.filename]#/usr/shared/skel/dot.login#:
+
+[.programlisting]
+....
+setenv LANG de_DE.ISO8859-1
+setenv MM_CHARSET ISO-8859-1
+....
+
+Die Syntax zur Konfiguration von Xorg in [.filename]#~/.xinitrc# hängt ebenfalls von der verwendeten Shell ab. Das erste Beispiel ist für die `sh` Shell, das zweite für die `csh` Shell:
+
+[.programlisting]
+....
+LANG=de_DE.ISO8859-1; export LANG
+....
+
+[.programlisting]
+....
+setenv LANG de_DE.ISO8859-1
+....
+
+[[setting-console]]
+=== Einrichten der Konsole
+
+Für die Konsole stehen mehrere lokalisierte Sprachen zur Verfügung. Eine Liste der verfügbaren Schriften erhalten Sie mit `ls /usr/shared/syscons/fonts`. Um die Schriftart für die Konsole zu konfigurieren, setzen Sie den gewünschten _Zeichensatz_ ohne die Endung [.filename]#.fnt# in [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+font8x16=Zeichensatz
+font8x14=Zeichensatz
+font8x8=Zeichensatz
+....
+
+Die Tasten- und Bildschirmzuordnung (keymap und screenmap) kann in mit den folgenden Einträgen in [.filename]#/etc/rc.conf# gesetzt werden:
+
+[.programlisting]
+....
+scrnmap=screenmap_name
+keymap=keymap_name
+keychange="fkey_number sequence"
+....
+
+Eine Liste der verfügbaren Bildschirmzuordnungen erhalten Sie mit `ls /usr/shared/syscons/scrnmaps`. Spezifizieren Sie _screenmap_name_ ohne die Endung [.filename]#.scm#. Eine Bildschirmzuordnung und der zugehörige Zeichensatz verbreitert die Zeichenmatrix von VGA Karten von 8 Bit auf 9 Bit. Sie wird benötigt, wenn der Zeichensatz des Bildschirms 8 Bit verwendet.
+
+Eine Liste der verfügbaren Tastenzuordnungen erhalten Sie mit `ls /usr/shared/syscons/keymaps`. Spezifizieren Sie _keymap_name_ ohne die Endung [.filename]#.kbd#. Eine Tastenzuordnung können Sie ohne einen Neustart mit man:kbdmap[1] ausprobieren.
+
+Der Eintrag `keychange` programmiert die Funktionstasten so, dass sie zu dem ausgesuchten Terminal passen. Die Sequenzen der Funktionstasten können nicht in Tastenzuordnungen definiert werden.
+
+Setzen Sie als nächstes für alle Terminals den richtigen Terminaltyp in [.filename]#/etc/ttys#. <<locale-charset>> enthält eine Zusammenfassung der verfügbaren Terminaltypen.
+[[locale-charset]]
+.Terminaltypen für Zeichensätze
+[cols="1,1", frame="none", options="header"]
+|===
+| Zeichensatz
+| Terminaltyp
+
+|ISO8859-1 oder ISO8859-15
+|`cons25l1`
+
+|ISO8859-2
+|`cons25l2`
+
+|ISO8859-7
+|`cons25l7`
+
+|KOI8-R
+|`cons25r`
+
+|KOI8-U
+|`cons25u`
+
+|CP437 (VGA default)
+|`cons25`
+
+|US-ASCII
+|`cons25w`
+|===
+
+Mit Wide- oder Multibyte-Zeichensätzen müssen Sie die entsprechende Konsole aus der FreeBSD Ports-Sammlung installieren. Die verfügbaren Ports sind in <<locale-console>> zusammengefasst. Nachdem Sie einen Port installiert haben, finden Sie in der Manualpage oder der [.filename]#pkg-message# des Ports Anweisungen zur Konfiguration und Benutzung der Konsole.
+[[locale-console]]
+.Konsolen aus der Ports-Sammlung
+[cols="1,1", frame="none", options="header"]
+|===
+| Sprache
+| Port
+
+|traditionelles Chinesisch (BIG-5)
+|package:chinese/big5con[]
+
+|Chinesisch/Japanisch/Koreanisch
+|package:chinese/cce[]
+
+|Chinesisch/Japanisch/Koreanisch
+|package:chinese/zhcon[]
+
+|Japanisch
+|package:chinese/kon2[]
+
+|Japanisch
+|package:japanese/kon2-14dot[]
+
+|Japanisch
+|package:japanese/kon2-16dot[]
+|===
+
+Wenn Sie moused in [.filename]#/etc/rc.conf# aktiviert haben, ist vielleicht noch weitere Konfiguration nötig. Der Mauszeiger des man:syscons[4] Treibers belegt in der Voreinstellung den Bereich von `0xd0` bis `0xd3` des Zeichensatzes. Wenn dieser Bereich ebenfalls von der eingestellten Sprache benötigt wird, müssen Sie den Mauszeiger verschieben. Fügen Sie dazu die folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+mousechar_start=3
+....
+
+=== Einrichtung von Xorg
+
+crossref:x11[x11,Das X-Window-System] beschreibt die Installation und Konfiguration von Xorg. Wenn Xorg für die Lokalisierung eingerichtet wird, stehen zusätzliche Zeichensätze und Eingabemethoden in der FreeBSD Ports-Sammlung zur Verfügung. Anwendungsspezifische I18N-Einstellungen, wie etwa Zeichensätze und Menüs, können in [.filename]#~/.Xresouces# angepasst werden, damit in den graphischen Anwendungen des Benutzers die gewählte Sprache angezeigt wird.
+
+Das X Input Method (XIM) Protokoll ist ein Xorg-Standard für die Eingabe von nicht-englischen Zeichen. <<locale-xim>> fasst die aus der FreeBSD Ports-Sammlung verfügbaren Anwendungen für die Eingabemethoden zusammen. Zusätzliche Fcitx- und Uim-Anwendungen sind ebenfalls verfügbar.
+[[locale-xim]]
+.Verfügbare Eingabemethoden
+[cols="1,1", frame="none", options="header"]
+|===
+| Sprache
+| Eingabemethode
+
+|Chinesisch
+|package:chinese/gcin[]
+
+|Chinesisch
+|package:chinese/ibus-chewing[]
+
+|Chinesisch
+|package:chinese/ibus-pinyin[]
+
+|Chinesisch
+|package:chinese/oxim[]
+
+|Chinesisch
+|package:chinese/scim-fcitx[]
+
+|Chinesisch
+|package:chinese/scim-pinyin[]
+
+|Chinesisch
+|package:chinese/scim-tables[]
+
+|Japanisch
+|package:japanese/ibus-anthy[]
+
+|Japanisch
+|package:japanese/ibus-mozc[]
+
+|Japanisch
+|package:japanese/ibus-skk[]
+
+|Japanisch
+|package:japanese/im-ja[]
+
+|Japanisch
+|package:japanese/kinput2[]
+
+|Japanisch
+|package:japanese/scim-anthy[]
+
+|Japanisch
+|package:japanese/scim-canna[]
+
+|Japanisch
+|package:japanese/scim-honoka[]
+
+|Japanisch
+|package:japanese/scim-honoka-plugin-romkan[]
+
+|Japanisch
+|package:japanese/scim-honoka-plugin-wnn[]
+
+|Japanisch
+|package:japanese/scim-prime[]
+
+|Japanisch
+|package:japanese/scim-skk[]
+
+|Japanisch
+|package:japanese/scim-tables[]
+
+|Japanisch
+|package:japanese/scim-tomoe[]
+
+|Japanisch
+|package:japanese/scim-uim[]
+
+|Japanisch
+|package:japanese/skkinput[]
+
+|Japanisch
+|package:japanese/skkinput3[]
+
+|Japanisch
+|package:japanese/uim-anthy[]
+
+|Koreanisch
+|package:korean/ibus-hangul[]
+
+|Koreanisch
+|package:korean/imhangul[]
+
+|Koreanisch
+|package:korean/nabi[]
+
+|Koreanisch
+|package:korean/scim-hangul[]
+
+|Koreanisch
+|package:korean/scim-tables[]
+
+|Vietnamesisch
+|package:vietnamese/xvnkb[]
+
+|Vietnamesisch
+|package:vietnamese/x-unikey[]
+|===
+
+[[l10n-compiling]]
+== I18N-Programme
+
+I18N-Anwendungen werden mit Hilfe von I18N-Bibliotheken programmiert. Diese erlauben es Entwicklern, eine einfache Sprachdatei zu schreiben und Menüs und Texte an jede Sprache anzupassen.
+
+Die link:https://www.FreeBSD.org/ports/[FreeBSD Ports-Sammlung] enthält Programme mit Unterstützung für Wide- und Mulitbyte-Zeichensätze für verschiedene Sprachen. Konsultieren Sie die I18N-Dokumentation des entsprechenden Ports für Informationen, wie das Programm zu konfigurieren ist und welche Optionen beim Übersetzen anzugeben sind.
+
+Viele Anwendungen aus der FreeBSD Ports-Sammlung bieten I18N-Unterstützung. Diese enthalten, zur einfachen Identifikation, `-i18n` im Namen. Es werden jedoch nicht alle Sprachen unterstützt.
+
+Einige Anwendungen können mit einem bestimmten Zeichensatz konfiguriert werden. Dies erfolgt entweder im [.filename]#Makefile#, oder über spezielle Parameter, die an configure übergeben werden. Lesen Sie die I18N-Dokumentation des entsprechenden Ports für Informationen, wie das Programm zu konfigurieren ist und welche Optionen beim Übersetzen anzugeben sind.
+
+[[lang-setup]]
+== Lokalisierung für einzelne Sprachen
+
+Dieser Abschnitt beschreibt die Lokalisierung eines FreeBSD-Systems für die russische Sprache. Außerdem werden einige zusätzliche Ressourcen für die Lokalisierung in anderen Sprachen zur Verfügung gestellt.
+
+[[ru-localize]]
+=== Russisch (KOI8-R Codierung)
+
+Um diese Locale für die Login-Shell zu setzen, fügen Sie die folgenden Zeilen in die [.filename]#~/.login_conf# des Benutzers ein:
+
+[.programlisting]
+....
+me:My Account:\
+ :charset=KOI8-R:\
+ :lang=ru_RU.KOI8-R:
+....
+
+Fügen Sie folgende Zeile für die Konsole in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+keymap="ru.utf-8"
+scrnmap="utf-82cp866"
+font8x16="cp866b-8x16"
+font8x14="cp866-8x14"
+font8x8="cp866-8x8"
+mousechar_start=3
+....
+
+Benutzen Sie `cons25r` als Terminaltyp für jeden `ttyv` Eintrag in [.filename]#/etc/ttys#.
+
+Damit der Druck funktioniert, wird ein spezieller Filter zur Übersetzung von KOI8-R nach CP866 benötigt, da die meisten Drucker mit russischen Zeichen die Codetabelle CP866 verwenden. FreeBSD enthält im Basissystem einen Filter zu diesem Zweck. Um diesen Filter zu benutzen, fügen Sie folgenden Eintrag in [.filename]#/etc/printcap# ein:
+
+[.programlisting]
+....
+lp|Russian local line printer:\
+ :sh:of=/usr/libexec/lpr/ru/koi2alt:\
+ :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:
+....
+
+man:printcap[5] enthält eine ausführlichere Erklärung.
+
+Russische Dateinamen auf MS-DOS(R) Dateisystemen werden durch `-L` und dem Namen der Locale in [.filename]#/etc/fstab# erkannt:
+
+[.programlisting]
+....
+/dev/ad0s2 /dos/c msdos rw,-Lru_RU.KOI8-R 0 0
+....
+
+Weitere Informationen finden Sie in man:mount_msdosfs[8].
+
+Wenn Sie Xorg verwenden, installieren Sie das Paket package:x11-fonts/xorg-fonts-cyrillic[]. Im Abschnitt `"Files"` von [.filename]#/etc/X11/xorg.conf# fügen Sie dann den folgenden Eintrag _vor_ allen anderen `FontPath` Einträgen ein:
+
+[.programlisting]
+....
+FontPath "/usr/local/lib/X11/fonts/cyrillic"
+....
+
+Zusätzliche kyrillische Schriftarten finden Sie in der Ports-Sammlung.
+
+Die Unterstützung für eine russische Tastatur aktivieren Sie im Abschnitt `"Keyboard"` von [.filename]#xorg.conf#:
+
+[.programlisting]
+....
+Option "XkbLayout" "us,ru"
+Option "XkbOptions" "grp:toggle"
+....
+
+Stellen Sie zudem sicher, dass `XkbDisable` auskommentiert ist.
+
+Beim Einsatz von `grp:toggle` können Sie mit kbd:[Right Alt] (Alt Gr) zwischen dem RUS- und LAT-Modus wechseln, verwenden Sie hingegen `grp:ctrl_shift_toggle`, so erfolgt der Wechsel mit kbd:[Ctrl+Shift]. Für `grp:caps_toggle` ist zum Wechseln des RUS/LAT-Modus kbd:[CapsLock] zuständig. Die alte Funktion von kbd:[CapsLock] steht nur im LAT-Modus mit der Tastenkombination kbd:[Shift+CapsLock] zur Verfügung. `grp:caps_toggle` funktioniert aus unbekannten Gründen unter Xorg nicht.
+
+Wenn die Tastatur Windows(R)-Tasten besitzt und nicht-alphanumerische Tasten nicht funktionieren, fügen Sie die folgende Zeile in [.filename]#xorg.conf# ein:
+
+[.programlisting]
+....
+Option "XkbVariant" ",winkeys"
+....
+
+[NOTE]
+====
+Die russische XKB-Tastatur funktioniert vielleicht nicht mit nicht-lokalisierten Anwendungen. Lokalisierte Anwendungen sollten mindestens die Funktion `XtSetLanguageProc (NULL, NULL, NULL);` frühzeitig aufrufen.
+====
+
+Weitere Informationen über die Lokalisierung von Xorg-Anwendungen erhalten Sie auf der Webseite http://koi8.pp.ru/xwin.html[http://koi8.pp.ru/xwin.html]. Allgemeine Informatinen über die KOI8-R Codierung finden Sie auf http://koi8.pp.ru[http://koi8.pp.ru].
+
+=== Weitere sprachspezifische Ressourcen
+
+Dieser Abschnitt enthält einige zusätzliche Ressourcen für die Konfiguration anderer Lokalisierungen.
+
+Traditionelles Chinesisch für Taiwan::
+Das taiwanesische FreeBSD Projekt stellt ein Tutorium unter http://netlab.cse.yzu.edu.tw/~statue/freebsd/zh-tut/[ http://netlab.cse.yzu.edu.tw/~statue/freebsd/zh-tut/] zur Verfügung.
+
+Griechische Lokalisierung::
+Ein Artikel über die Unterstützung für Griechisch steht unter https://www.FreeBSD.org/doc/el/articles/greek-language-support/[http://www.freebsd.org/doc/el/articles/greek-language-support/]. Bitte beachten Sie, dass dies _nur_ für Griechisch gilt.
+
+Japanische und koreanische Lokalisierung::
+Informationen über die japanische Lokalisierung entnehmen Sie bitte http://www.jp.FreeBSD.org/[http://www.jp.FreeBSD.org/], Informationen über die koreanische Lokalisierung erhalten Sie unter http://www.kr.FreeBSD.org/[http://www.kr.FreeBSD.org/].
+
+Nicht-englische FreeBSD-Dokumentation::
+Teile der FreeBSD Dokumentation wurden von Beitragenden in andere Sprachen übersetzt. Folgen Sie den Links auf der link:https://www.FreeBSD.org/de/[FreeBSD-Webseite] oder schauen Sie in [.filename]#/usr/shared/doc# nach.
diff --git a/documentation/content/de/books/handbook/linuxemu/_index.adoc b/documentation/content/de/books/handbook/linuxemu/_index.adoc
new file mode 100644
index 0000000000..47c6e4466c
--- /dev/null
+++ b/documentation/content/de/books/handbook/linuxemu/_index.adoc
@@ -0,0 +1,254 @@
+---
+title: Kapitel 10. Linux®-Binärkompatibilität
+part: Teil II. Oft benutzte Funktionen
+prev: books/handbook/printing
+next: books/handbook/partiii
+---
+
+[[linuxemu]]
+= Linux(R)-Binärkompatibilität
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 10
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/linuxemu/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/linuxemu/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/linuxemu/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[linuxemu-synopsis]]
+== Übersicht
+
+FreeBSD bietet Binärkompatibilität zu Linux(R), so dass Benutzer Linux(R) Anwendungen auf einem FreeBSD-System installieren und ausführen können, ohne die Binärdatei ändern zu müssen. Es wurde sogar berichtet, dass in einigen Situationen Linux(R) Anwendungen auf FreeBSD besser laufen als unter Linux(R).
+
+Allerdings werden einige Linux(R)-spezifischen Merkmale nicht von FreeBSD unterstützt. Linux(R)-Anwendungen, die i386(TM)-spezifische Aufrufe, wie bspw. die Aktivierung des virtuellen 8086-Modus verwenden, werden derzeit nicht unterstützt.
+
+Die Unterstützung für 64-Bit-Binärkompatibilität für Linux(R) wurde in FreeBSD 10.3 hinzugefügt.
+
+Nach dem Lesen dieses Kapitels werden Sie wissen:
+
+* Wie Sie die Linux(R)-Binärkompatibilität aktivieren.
+* Wie zusätzliche Linux(R)-Systembibliotheken installiert werden.
+* Wie Sie Linux(R)-Anwendungen unter FreeBSD installieren.
+* Wie die Linux(R)-Binärkompatibilität unter FreeBSD implementiert ist.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie wissen:
+
+* Wie Sie crossref:ports[ports,Software von Drittanbietern installieren].
+
+[[linuxemu-lbc-install]]
+== Konfiguration der Linux(R)-Binärkompatibilität
+
+Die Linux(R)-Binärkompatibilität ist per Voreinstellung nicht aktiviert und auch Linux(R)-Bibliotheken werden nicht installiert. Linux(R)-Bibliotheken können entweder manuell, oder aus der FreeBSD Ports-Sammlung installiert werden.
+
+Bevor Sie versuchen den Port zu bauen, laden Sie das Linux(R)-Kernelmodul, da ansonsten der Bau fehlschlägt:
+
+[source,bash]
+....
+# kldload linux
+....
+
+Für 64-Bit Kompatibilität:
+
+[source,bash]
+....
+# kldload linux64
+....
+
+Prüfen Sie, ob das Modul geladen wurde:
+
+[source,bash]
+....
+% kldstat
+Id Refs Address Size Name
+ 1 2 0xc0100000 16bdb8 kernel
+ 7 1 0xc24db000 d000 linux.ko
+....
+
+Der einfachste Weg um einen Basissatz von Linux(R)-Bibliotheken und Binärdateien auf einem FreeBSD-System zu installieren, ist über den Port oder das Paket package:emulators/linux_base-c7[]. So installieren Sie das Paket:
+
+[source,bash]
+....
+# pkg install emulators/linux_base-c7
+....
+
+Wollen Sie die Linux(R)-Binärkompatibilität beim Systemstart aktivieren, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+linux_enable="YES"
+....
+
+Auf 64-Bit Maschinen wird das Modul für die 64-Bit Emulation automatisch von [.filename]#/etc/rc.d/abi# geladen.
+
+Seitdem die Linux(R)-Binärkompatibilität Unterstützung für die Ausführung von 32- und 64-Bit-Linux(R)-Binärdateien erhalten hat, ist es nicht mehr möglich, die Emulationsfähigkeit in einen angepassten Kernel zu integrieren.
+
+[[linuxemu-libs-manually]]
+=== Manuelle Installation zusätzlicher Bibliotheken
+
+Wenn sich eine Linux(R)-Anwendung über fehlende Bibliotheken beschwert nachdem die Linux(R)-Binärkompatibilität installiert wurde, finden Sie heraus welche Bibliothken die Anwendung benötigt und installieren Sie diese manuell.
+
+Mit `ldd` können Sie unter Linux(R) bestimmen, welche gemeinsam benutzten Bibliotheken eine Anwendung benötigt. Wenn Sie herausfinden wollen, welche Bibliotheken `linuxdoom` benötigt, können Sie folgenden Befehl auf einem Linux(R)-System ausführen, welches Doom installiert hat:
+
+[source,bash]
+....
+% ldd linuxdoom
+libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
+libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
+libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29
+....
+
+Kopieren Sie alle Dateien aus der letzten Spalte der Ausgabe von einem Linux(R)-System auf das FreeBSD-System in das Verzeichnis [.filename]#/compat/linux#. Nach dem Kopieren erstellen Sie symbolische Links auf die Namen in der ersten Spalte. In diesem Beispiel werden folgende Dateien auf dem FreeBSD-System installiert:
+
+[source,bash]
+....
+/compat/linux/usr/X11/lib/libXt.so.3.1.0
+/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
+/compat/linux/usr/X11/lib/libX11.so.3.1.0
+/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
+/compat/linux/lib/libc.so.4.6.29
+/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
+....
+
+Wenn Sie bereits eine Linux(R)-Bibliothek einer zur ersten Spalte passenden Hauptversionsnummer besitzen, muss sie nicht mehr kopiert werden, da die bereits vorhandene Version funktionieren sollte. Hat die Bibliothek jedoch eine neuere Versionsnummer, sollten Sie sie dennoch kopieren. Sie können die alte Version löschen, solange Sie einen symbolischen Link auf die neue Version anlegen.
+
+Folgende Bibliotheken existieren bereits auf dem FreeBSD-System:
+
+[source,bash]
+....
+/compat/linux/lib/libc.so.4.6.27$
+/compat/linux/lib/libc.so.4 -> libc.so.4.6.27
+....
+
+`ldd` zeigt an, dass eine Anwendung eine neuere Version benötigt:
+
+[source,bash]
+....
+libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
+....
+
+Wenn diese Bibliotheken sich nur um ein oder zwei Stellen in der Unterversionsnummer unterscheiden, sollte das Programm dennoch mit der älteren Version funktionieren. Wenn Sie wollen, können Sie die bestehende [.filename]#libc.so# durch die neuere Version ersetzen:
+
+[source,bash]
+....
+/compat/linux/lib/libc.so.4.6.29
+/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
+....
+
+Der Mechanismus der symbolischen Links wird nur für Linux(R)-Binärdateien benötigt. Nach einer Weile wird es eine ausreichende Menge an Linux(R)-Bibliotheken auf dem System geben, sodass Sie neu installierte Linux(R)-Anwendungen ohne zusätzlichen Aufwand auf dem System laufen lassen können.
+
+=== Linux(R) ELF-Binärdateien installieren
+
+ELF-Binärdateien benötigen manchmal eine zusätzliche "Kennzeichnung". Wenn Sie versuchen, eine nicht gekennzeichnete ELF-Binärdatei auszuführen, werden Sie eine Fehlermeldung ähnlich der folgenden erhalten:
+
+[source,bash]
+....
+% ./my-linux-elf-binary
+ELF binary type not known
+Abort
+....
+
+Damit der FreeBSD-Kernel eine Linux(R)-ELF-Datei von einer FreeBSD-ELF-Datei unterscheiden kann, gibt es das Werkzeug man:brandelf[1].
+
+[source,bash]
+....
+% brandelf -t Linux my-linux-elf-binary
+....
+
+Die GNU Werkzeuge schreiben nun automatisch die passende Kennzeichnungsinformation in die ELF-Binärdateien, so dass Sie diesen Schritt in Zukunft nur noch selten benötigen.
+
+=== Installieren einer RPM-basierten Linux(R)-Anwendung
+
+Wenn Sie eine Linux(R) RPM-basierte Anwendung installieren möchten, installieren Sie zunächst den Port oder das Paket package:archivers/rpm4[]. Anschließend kann der Superuser das folgende Kommando benutzen, um ein [.filename]#.rpm# zu installieren:
+
+[source,bash]
+....
+# cd /compat/linux
+# rpm2cpio < /pfad/zum/linux.archiv.rpm | cpio -id
+....
+
+Fall notwendig, benutzen Sie `brandelf` auf den installierten ELF-Binärdateien. Beachten Sie, dass dies eine saubere Deinstallation verhindert.
+
+=== Namensauflösung konfigurieren
+
+Wenn DNS nicht funktioniert, oder die folgende Fehlermeldung erscheint:
+
+[source,bash]
+....
+resolv+: "bind" is an invalid keyword resolv+:
+"hosts" is an invalid keyword
+....
+
+müssen Sie [.filename]#/compat/linux/etc/host.conf# wie folgt bearbeiten:
+
+[.programlisting]
+....
+order hosts, bind
+multi on
+....
+
+Diese Reihenfolge legt fest, dass zuerst [.filename]#/etc/hosts# und anschließend DNS durchsucht werden. Wenn [.filename]#/compat/linux/etc/host.conf# nicht vorhanden ist, nutzen Linux(R)-Anwendungen [.filename]#/etc/host.conf# und beschweren sich über die inkompatible FreeBSD-Syntax. Wenn Sie in [.filename]#/etc/resolv.conf# keinen Nameserver konfiguriert haben, sollten Sie den Eintrag `bind` entfernen.
+
+[[linuxemu-advanced]]
+== Weiterführende Themen
+
+Dieser Abschnitt beschreibt wie die Linux(R)-Binärkompatibilität funktioniert. Die folgenden Informationen stammen aus einer E-Mail, die von Terry Lambert (mailto:tlambert@primenet.com[tlambert@primenet.com]) an {freebsd-chat} geschrieben wurde (Message ID: `<199906020108.SAA07001@usr09.primenet.com>`).
+
+FreeBSD verfügt über eine "execution class loader" genannte Abstraktion. Dabei handelt es sich um einen Eingriff in den man:execve[2] Systemaufruf.
+
+Historisch gesehen untersuchte der einzige, auf UNIX(R)-Plattformen vorhandene Lader die "magische Zahl" (in der Regel die ersten 4 oder 8 Bytes der Datei), um festzustellen, ob der Binärtyp dem System bekannt war. War dies der Fall, wurde der Binärlader aufgerufen.
+
+Wenn es sich nicht um den zum System gehörigen Binärtyp handelte, gab man:execve[2] einen Fehler zurück, und die Shell versuchte stattdessen, die Datei als Shell-Befehl auszuführen. Dabei wurde als Standardeinstellung "was auch immer die aktuelle Shell ist" festgelegt.
+
+Später wurde ein Hack in man:sh[1] eingefügt, der die zwei ersten Zeichen untersuchte. Wenn diese `:\n` entsprachen, wurde stattdessen die man:csh[1]-Shell aufgerufen.
+
+FreeBSD verfügt über eine Liste von Ladern, anstelle eines einzigen, auf `#!` zurückgreifenden Laders, um Shell-Interpreter oder Shell-Skripte auszuführen.
+
+Für die Linux(R) ABI-Unterstützung erkennt FreeBSD die magische Zahl als ELF-Binärdatei. Der ELF-Lader sucht nach einer speziellen _Kennzeichnung_, die aus einem Kommentarabschnitt in der ELF-Datei besteht, und die in SVR4/Solaris(TM) ELF Binärdateien nicht vorhanden ist.
+
+Damit Linux(R)-Binärdateien unter FreeBSD funktionieren, müssen sie mit man:brandelf[1] als `Linux` _gekennzeichnet_ werden:
+
+[source,bash]
+....
+# brandelf -t Linux file
+....
+
+Wenn der ELF-Lader die `Linux`-Kennzeichnung sieht, wird ein Zeiger in der `proc`-Struktur ersetzt. Alle Systemaufrufe werden durch diesen Zeiger indiziert. Der Prozess wird weiterhin speziell gekennzeichnet, so dass der Trap-vector im Signal-trampoline-code eine spezielle Behandlung erfährt und das Linux(R)-Kernelmodul verschiedene kleinere Korrekturen vornehmen kann.
+
+Der Linux(R)-Systemaufrufvektor enthält neben anderen Dingen eine Liste der `sysent[]`-Einträge, deren Adressen sich im Kernelmodul befinden.
+
+Wenn ein Linux(R)-Programm einen Systemaufruf ausführt, dereferenziert die Trap-Behandlungsroutine den Zeiger für den Systemaufruf aus der `proc`-Struktur und erhält damit die Linux(R)-Eintrittspunkte für den Systemaufruf.
+
+Zusätzlich _verändert_ der Linux(R)-Modus die Systempfade dynamisch; genauso, wie dies die Option `union` beim Einbinden von Dateisystemen macht. Zuerst wird die Datei im Verzeichnis [.filename]#/compat/linux/Originalpfad# gesucht, wenn sie dort nicht gefunden wurde, wird sie im Verzeichnis [.filename]#/Originalpfad# gesucht. Dadurch wird sichergestellt, dass Binärdateien, die zur Ausführung andere Binärdateien benötigen, ausgeführt werden können (so dass alle Linux(R)-Werkzeuge unter der ABI laufen). Dies bedeutet auch, dass Linux(R)-Binärdateien FreeBSD-Binärdateien laden und ausführen können, wenn keine passenden Linux(R)-Binärdateien vorhanden sind. Ein in [.filename]#/compat/linux# plaziertes man:uname[1] kann damit Linux(R)-Programmen vorgaukeln, dass sie auf einem Linux(R)-System laufen.
+
+Im Endeffekt gibt es einen Linux(R)-Kernel innerhalb des FreeBSD-Kernels. Die Sprungtabellen für Linux(R)- beziehungsweise FreeBSD-Systemaufrufe verweisen allerdings auf dieselben Funktionen, die Kerneldienste wie Dateisystemoperationen, Operationen für den virtuellen Speicher, Signalübermittlung und System V IPC bereitstellen. Der einzige Unterschied ist, dass Binärdateien unter FreeBSD FreeBSD-_glue_-Funktionen verwendet werden. Linux(R)-Binärdateien hingegen verwenden die Linux(R)-_glue_-Funktionen. FreeBSD-_glue_-Funktionen sind statisch in den Kernel gelinkt, Linux(R)-_glue_-Funktionen sind statisch gelinkt oder können über ein ladbares Kernelmodul eingebunden werden.
+
+Technisch gesehen ist dies nicht wirklich eine Emulation, sondern eine ABI-Implementation. Es wird manchmal "Linux(R) Emulation" genannt, da es zu einer Zeit implementiert wurde, in der es kein anderes Wort gab, das beschrieb, was vor sich ging. Es war falsch zu behaupten, FreeBSD würde Linux(R)-Binärprogramme ausführen, da der Code nicht unter FreeBSD übersetzt wurde.
diff --git a/documentation/content/de/books/handbook/mac/_index.adoc b/documentation/content/de/books/handbook/mac/_index.adoc
new file mode 100644
index 0000000000..7e4b914b30
--- /dev/null
+++ b/documentation/content/de/books/handbook/mac/_index.adoc
@@ -0,0 +1,933 @@
+---
+title: Kapitel 15. Verbindliche Zugriffskontrolle
+part: Teil III. Systemadministration
+prev: books/handbook/jails
+next: books/handbook/audit
+---
+
+[[mac]]
+= Verbindliche Zugriffskontrolle
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 15
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/mac/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/mac/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/mac/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[mac-synopsis]]
+== Übersicht
+
+In FreeBSD 5.X wurden neue Sicherheits-Erweiterungen verfügbar, die aus dem TrustedBSD-Projekt übernommen wurden und auf dem Entwurf POSIX(R).1e basieren. Die beiden bedeutendsten neuen Sicherheits-Mechanismen sind Berechtigungslisten (Access Control Lists, ACL) und die verbindliche Zugriffskontrolle (Mandatory Access Control, MAC). Durch die MAC können Module geladen werden, die neue Sicherheitsrichtlinien bereitstellen. Mit Hilfe einiger Module kann beispielsweise ein eng umgrenzter Bereich des Betriebssystems gesichert werden, indem die Sicherheitsfunktionen spezieller Dienste unterstützt bzw. verstärkt werden. Andere Module wiederum betreffen in ihrer Funktion das gesamte System - alle vorhandenen Subjekte und Objekte. Das "Verbindliche" in der Namensgebung erwächst aus dem Fakt, dass die Kontrolle allein Administratoren und dem System obliegt und nicht dem Ermessen der Nutzer, wie es mit Hilfe der benutzerbestimmbaren Zugriffskontrolle (Discrectionary Access Control / DAC), dem Zugriffstandard für Dateien, gar der System V IPC in FreeBSD, normalerweise umgesetzt wird.
+
+Dieses Kapitel wird sich auf die Grundstruktur der Verbindlichen Zugriffskontrolle und eine Auswahl der Module, die verschiedenste Sicherheitsfunktionen zur Verfügung stellen, konzentrieren.
+
+Beim Durcharbeiten dieses Kapitels erfahren Sie:
+
+* Welche MAC Module für Sicherheitsrichtlinien derzeit in FreeBSD eingebettet sind und wie die entsprechenden Mechanismen funktionieren.
+* Was die einzelnen MAC Module an Funktionen realisieren und auch, was der Unterschied zwischen einer Richtlinie, die _mit_ Labels arbeitet, und einer, die _ohne_ Labels arbeitet, ist.
+* Wie Sie die MAC in ein System einbetten und effizient einrichten.
+* Wie die verschiedenen Richtlinienmodule einer MAC konfiguriert werden.
+* Wie mit einer MAC und den gezeigten Beispielen eine sicherere Umgebung erstellt werden kann.
+* Wie die Konfiguration einer MAC auf korrekte Einrichtung getestet wird.
+
+Vor dem Lesen dieses Kapitels sollten Sie bereits:
+
+* Grundzüge von UNIX(R) und FreeBSD verstanden haben. (crossref:basics[basics,Grundlagen des FreeBSD Betriebssystems]).
+* Mit den Grundzügen der Kernelkonfiguration und -kompilierung vertraut sein (crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels]).
+* Einige Vorkenntnisse über Sicherheitskonzepte im Allgemeinen und deren Umsetzung in FreeBSD im Besonderen mitbringen (crossref:security[security,Sicherheit)]).
+
+[WARNING]
+====
+
+Der unsachgemäße Gebrauch der in diesem Kapitel enthaltenen Informationen kann den Verlust des Systemzugriffs, Ärger mit Nutzern oder die Unfähigkeit, grundlegende Funktionen des X-Windows-Systems zu nutzen, verursachen. Wichtiger noch ist, dass man sich nicht allein auf die MAC verlassen sollte, um ein System zu sichern. Die MAC verbessert und ergänzt lediglich die schon existierenden Sicherheits-Richtlinien - ohne eine gründliche und fundierte Sicherheitspraxis und regelmäßige Sicherheitsprüfungen wird Ihr System nie vollständig sicher sein.
+
+Außerdem sollte angemerkt werden, dass die Beispiele in diesem Kapitel auch genau dasselbe sein sollen, nämlich Beispiele. Es wird nicht empfohlen, diese bestimmten Beispiele auf einem Arbeitssystem umzusetzen. Das Einarbeiten der verschiedenen Sicherheitsmodule erfordert eine Menge Denkarbeit und viele Tests. Jemand, der nicht versteht, wie diese Module funktionieren, kann sich schnell darin wiederfinden, dass er (oder sie) das ganze System durchforsten und viele Dateien und Verzeichnisse neu konfigurieren muß.
+====
+
+=== Was in diesem Kapitel nicht behandelt wird
+
+Dieses Kapitel behandelt einen großen Teil sicherheitsrelevanter Themen, bezogen auf die Verbindliche Zugriffskontrolle (MAC). Die gegenwärtige Entwicklung neuer MAC Module ist nicht abgedeckt. Einige weitere Module, die im MAC Framework enthalten sind, haben besondere Charakteristika, die zum Testen und Entwickeln neuer Module gedacht sind. Dies sind unter anderem man:mac_test[4], man:mac_stub[4] und man:mac_none[4]. Für weitere Informationen zu diesen Modulen und den entsprechend angebotenen Funktionen lesen Sie bitte die Manpages.
+
+[[mac-inline-glossary]]
+== Schlüsselbegriffe
+
+Bevor Sie weiterlesen, müssen noch einige Schlüsselbegriffe geklärt werden. Dadurch soll jegliche auftretende Verwirrung von vornherein beseitigt und die plötzliche Einführung neuer Begriffe und Informationen vermieden werden.
+
+* _Verbund_: Ein Verbund ist ist ein Satz von Programmen und Daten, die speziell und zusammen abgeschottet wurden, um Nutzern Zugriff auf diese ausgewiesenen Systembereiche zu gewähren. Man kann sagen, ein solcher Verbund ist eine Gruppierung, ähnlich einer Arbeitsgruppe, einer Abteilung, einem Projekt oder einem Thema. Durch die Nutzung von Verbünden (_compartments_) kann man Sicherheitsrichtlinien erstellen, die alles notwendige Wissen und alle Werkzeuge zusammenfassen.
+* _Hochwassermarkierung_: Eine solche Richtlinie erlaubt die Erhöhung der Sicherheitsstufe in Abhängigkeit der Klassifikation der gesuchten bzw. bereitzustellenden Information. Normalerweise wird nach Abschluss des Prozesses die ursprüngliche Sicherheitsstufe wieder hergestellt. Derzeit enthält die MAC Grundstruktur keine Möglichkeit, eine solche Richtlinie umzusetzen, der Vollständigkeit halber ist die Definition hier jedoch aufgeführt.
+* _Integrität_: Das Schlüsselkonzept zur Klassifizierung der Vertraulichkeit von Daten nennt man Integrität. Je weiter die Integrität erhöht wird, umso mehr kann man den entsprechenden Daten vertrauen.
+* _Label_: Ein Label ist ein Sicherheitsmerkmal, welches mit Dateien, Verzeichnissen oder anderen Elementen im System verbunden wird. Man sollte es wie einen Vertraulichkeitsstempel auffassen, der Dateien angehört wie beispielsweise die Zugriffszeit, das Erstellungsdatum oder auch der Name; sobald Dateien derart gekennzeichnet werden, bezeichnen diese Label die sicherheitsrelevanten Eigenschaften. Zugriff ist nur noch dann möglich, wenn das zugreifende Subjekt eine korrespondierende Kennzeichnung trägt. Die Bedeutung und Verarbeitung der Label-Werte ist von der Einrichtung der Richtlinie abhängig: Während einige Richtlinien das Label zum Kennzeichnen der Vertraulichkeit oder Geheimhaltungsstufe eines Objekts nutzen, können andere Richtlinien an derselben Stelle Zugriffsregeln festschreiben.
+* _Level_: Eine erhöhte oder verminderte Einstellung eines Sicherheitsmerkmals. Wenn das Level erhöht wird, wird auch die ensprechende Sicherheitsstufe angehoben.
+* _Niedrigwassermarkierung_: Eine solche Richtlinie erlaubt das Herabstufen des Sicherheitslevels, um weniger sensible Daten verfügbar zu machen. In die meisten Fällen wird das ursprüngliche Sicherheitslevel des Nutzers wiederhergestellt, sobald der Vorgang abgeschlossen ist. Das einzige Modul in FreeBSD, welches von dieser Richtlinie Gebrauch macht, ist man:mac_lomac[4].
+* _Multilabel_: Die Eigenschaft `multilabel` ist eine Dateisystemoption, die entweder im Einzelbenutzermodus mit Hilfe des Werkzeugs man:tunefs[8], während des Bootvorgangs in der Datei man:fstab[5] oder aber beim Erstellen einen neues Dateisystems aktiviert werden kann. Diese Option erlaubt einem Administrator, verschiedenen Objekten unterschiedliche Labels zuzuordnen - kann jedoch nur zusammen mit Modulen angewendet werden, die auch tatsächlich mit Labels arbeiten.
+* _Objekt_: Ein Objekt oder auch Systemobjekt ist theoretisch eine Einheit, durch welche Information fließt, und zwar unter der Lenkung eines _Subjektes_. Praktisch schliesst diese Definition Verzeichnisse, Dateien, Felder, Bildschirme, Tastaturen, Speicher, Bandlaufwerke, Drucker und jegliche anderen Datenspeicher- oder -verarbeitungsgeräte ein. Im Prinzip ist ein Objekt ein Datenkontainer oder eine Systemressource - Zugriff auf ein _Objekt_ bedeutet, auf Daten zuzugreifen.
+* _Richtlinie_: Eine Sammlung von Regeln, die definiert, wie Zielvorgaben umgesetzt werden, nennt man Richtlinie. Eine _Richtlinie_ dokumentiert normalerweise, wie mit bestimmten Elementen umgegangen wird. Dieses Kapitel faßt den Begriff in diesem Kontext als _Sicherheitsrichtlinie_ auf; als eine Sammlung von Regeln, die den Fluß von Daten und Informationen kontrolliert und die gleichzeitig definiert, wer auf diese Daten und Informationen zugreifen darf.
+* _Anfälligkeit_: Dieser Begriff wird normalerweise verwendet, wenn man über MLS (Multi Level Security) spricht. Das Anfälligkeits-Level beschreibt, wie wichtig oder geheim die Daten sein sollen. Um so höher das Anfälligkeits-Level, um so wichtiger die Geheimhaltung bzw. Vertraulichkeit der Daten.
+* _Einzel-Label_: Von einem Einzel-Label spricht man, wenn für ein ganzes Dateisystem lediglich ein einziges Label verwendet wird, um Zugriffskontrolle über den gesamten Datenfluss zu erzwingen. Sobald diese Option verwendet wird - und das ist zu jeder Zeit, wenn die Option `multilabel` nicht explizit gesetzt wurde - sind alle Dateien und Verzeichnisse mit dem gleichen Label gekennzeichnet.
+* _Subjekt_: Ein Subjekt ist jedwede Einheit, die Information in Fluss zwischen Objekten bringt: Zum Beispiel ein Nutzer, ein Nutzerprozessor, ein Systemprozeß usw. In FreeBSD handelt es sich meistens um einen Thread, der als Prozeß im Namen eines Nutzers arbeitet.
+
+[[mac-initial]]
+== Erläuterung
+
+Mit all diesen neuen Begriffen im Kopf können wir nun überlegen, wie die Möglichkeiten der verbindlichen Zugriffskontrolle (MAC) die Sicherheit eines Betriebssystems als Ganzes erweitern. Die verschiedenen Module, die durch die MAC bereitgestellt werden, können verwendet werden, um das Netzwerk oder Dateisysteme zu schützen, Nutzern den Zugang zu bestimmten Ports oder Sockets zu verbieten und vieles mehr. Die vielleicht beste Weise, die Module zu verwenden, ist, sie miteinander zu kombinieren, indem mehrere Sicherheitsrichtlinienmodule gleichzeitig eine mehrschichtige Sicherheitsumgebung schaffen. Das ist etwas anderes als singuläre Richtlinien wie zum Beispiel die Firewall, die typischerweise Elemente eines Systems stabilisiert, das nur für einen speziellen Zweck verwendet wird. Der Verwaltungsmehraufwand ist jedoch von Nachteil, zum Beispiel durch die Verwendung von mehreren Labels oder dem eigenhändigen Erlauben von Netzwerkzugriffen für jeden einzelnen Nutzer.
+
+Solche Nachteile sind allerdings gering im Vergleich zum bleibenden Effekt der erstellten Struktur. Die Möglichkeit zum Beispiel, für konkrete Anwendungen genau die passenden Richtlinien auszuwählen und einzurichten, senkt gleichzeitig die Arbeitskosten. Wenn man unnötige Richtlinien aussortiert, kann man die Gesamtleistung des Systems genauso steigern wie auch eine höhere Anpassungsfähigkeit gewährleisten. Eine gute Umsetzung der MAC beinhaltet eine Prüfung der gesamten Sicherheitsanforderungen und einen wirksamen Einsatz der verschiedenen Module.
+
+Ein System, auf dem eine MAC verwendet wird, muß zumindest garantieren, dass einem Nutzer nicht gestattet wird, Sicherheitsmerkmale nach eigenem Ermessen zu verändern; dass Arbeitswerkzeuge, Programme und Skripte, innerhalb der Beschränkungen arbeiten können, welche die Zugriffsregeln der ausgewählten Module dem System auferlegen; und dass die volle Kontrolle über die Regeln der MAC beim Administrator ist und bleibt.
+
+Es ist die einsame Pflicht des zuständigen Administrators, die richtigen Module sorgfältig auszuwählen. Einige Umgebungen könnten eine Beschränkung der Zugriffe über die Netzwerkschnittstellen benötigen - hier wären die Module man:mac_portacl[4], man:mac_ifoff[4] und sogar man:mac_biba[4] ein guter Anfang. In anderen Fällen muß man sehr strenge Vertraulichkeit von Dateisystemobjekten gewährleisten - dafür könnte man man:mac_bsdextended[4] oder man:mac_mls[4] einsetzen.
+
+Die Entscheidung, welche Richtlinien angewandt werden, kann auch anhand der Netzwerk-Konfiguration getroffen werden. Nur bestimmten Benutzern soll erlaubt werden, via man:ssh[1] auf das Netzwerk oder Internet zuzugreifen - man:mac_portacl[4] wäre eine gute Wahl. Aber für was entscheidet man sich im Falle eines Dateisystems? Soll der Zugriff auf bestimmte Verzeichnisse von spezifischen Nutzern oder Nutzergruppen separiert werden? Oder wollen wir den Zugriff durch Nutzer oder Programme auf spezielle Dateien einschränken, indem wir gewisse Objekte als geheim einstufen?
+
+Der Zugriff auf Objekte kann einigen vertraulichen Nutzern gestattet werden, anderen wiederum verwehrt. Als Beispiel sei hierzu ein großes Entwicklerteam angeführt, das in kleine Gruppen von Mitarbeitern aufgeteilt wurde. Die Entwickler von Projekt A dürfen nicht auf Objekte zugreifen, die von den Entwicklern von Projekt B geschrieben wurden. Sie müssen aber trotzdem auf Objekte zugreifen können, die von einem dritten Entwicklerteam geschaffen wurden - alles in allem eine verzwickte Situation. Wenn man die verschiedenen Module der MAC richtig verwendet, können Anwender in solche Gruppen getrennt und ihnen der Zugriff zu den gewünschten Systemobjekten gestattet werden - ohne Angst haben zu müssen, dass Informationen in die falschen Hände geraten.
+
+So hat jedes Modul, das eine Sicherheitsrichtlinie verfügbar macht, einen eigenen Weg, die Sicherheit des Systems zu verstärken. Die Auswahl der Module sollte auf einem gut durchdachten Sicherheitskonzept gründen. In vielen Fällen muß das gesamte Konzept eines Systems überarbeitet und neu eingepflegt werden. Ein guter Überblick über die Möglichkeiten der verschiedenen von der MAC angebotenen Module hilft einem Administrator, die besten Richtlinien für seine spezielle Situation auszuwählen.
+
+Im FreeBSD-Standardkernel ist die Option zur Verwendung der MAC nicht enthalten. Daher muß die Zeile
+
+[.programlisting]
+....
+options MAC
+....
+
+der Kernelkonfiguration hinzugefügt und der Kernel neu übersetzt und installiert werden.
+
+[CAUTION]
+====
+
+Verschiedenen Anleitungen für die MAC empfehlen, die einzelnen Module direkt in den Kernel einzuarbeiten. Dabei ist es jedoch möglich, das System aus dem Netzwerk auszusperren oder gar schlimmeres. Die Arbeit mit der MAC ist ähnlich der Arbeit mit einer Firewall - man muß, wenn man sich nicht selbst aus dem System aussperren will, genau aufpassen. Man sollte sich eine Möglichkeit zurechtlegen, wie man eine Implementation einer MAC rückgängig machen kann - genauso wie eine Ferninstallation über das Netzwerk nur mit äußerster Vorsicht vorgenommen werden sollte. Es wird daher empfohlen, die Module nicht in den Kernel einzubinden, sondern sie beim Systemstart via [.filename]#/boot/loader.conf# zu laden.
+====
+
+[[mac-understandlabel]]
+== MAC Labels verstehen
+
+MAC Label sind Sicherheitsmerkmale, die, wenn sie zum Einsatz kommen, allen Subjekten und Objekten im System zugeordnet werden.
+
+Wenn ein Administrator ein solches Merkmal bzw. Attribut setzen will, muß er/sie verstehen können, was da genau passiert. Die Attribute, die im speziellen Fall zu vergeben sind, hängen vom geladenen Modul und den darin jeweils implementierten Richtlinien ab. Jedes dieser Richtlinienmodule setzt die Arbeit mit seinen entsprechenden Attributen in individueller Weise um. Falls der Nutzer nicht versteht, was er da konfiguriert, oder auch, was seine Konfiguration für Begleiterscheinungen mit sich bringt, ergibt sich meist als Resultat ein unerwartetes, ja sogar unerwünschtes Verhalten des gesamten Systems.
+
+Ein Label, einem Objekt verliehen, wird verwendet, um anhand einer Richtlinie eine sicherheitsrelevante Entscheidung über Zugriffsrechte zu fällen. In einigen Richtlinien enthält bereits das Label selbst alle dafür nötigen Informationen. Andere Richtlinien verwenden diese Informationen, um zunächst ein komplexes Regelwerk abzuarbeiten.
+
+Wenn man zum Beispiel einer Datei das Attribut `biba/low` zuordnet, wird dieses durch das Biba Sicherheitsrichtlinienmodul, und zwar mit dem Wert "low", verarbeitet.
+
+Einige der Richtlinienmodule, die die Möglichkeit zum Vergeben von Labels unter FreeBSD unterstützen, bieten drei vordefinierte Labels an. Dieses nennen sich "high", "low" und "equal". Obwohl die verschiedenen Module die Zugriffskontrolle auf verschiedene Weisen regeln, kann man sich sicher sein, das das "low"-Label der untersten, unsichersten Einstellung entspricht, das "equal"-Label die Verwendung des Moduls für das jeweilige Objekt oder Subjekt deaktiviert - und das "high"-Label die höchstmögliche Einstellung erzwingt. Im Speziellen gilt diese Aussage für die Richtlinien(-module) MLS und Biba.
+
+In den meisten Umgebungen, sogenannten Single Label Environments, wird Objekten nur ein einzelnes Label zugewiesen. Dadurch wird nur ein Regelsatz für die Zugriffskontrolle auf das gesamte System verwendet - und das ist meistens auch tatsächlich ausreichend. Es gibt wenige Fälle, in denen mehrere Labels auf Dateisystemobjekte oder -subjekte verwendet werden. In einem solchen Fall muß das Dateisystem mit der man:tunefs[8]-Option `multilabel` angepaßt werden, da `single label` die Standardeinstellung ist.
+
+Bei der Verwendung von Biba oder MLS kann man numerische Labels vergeben, die genau das Level angeben, an welcher Stelle in der Hierarchie das Subjekt oder Objekt einzuordnen ist. Dieses numerische Level wird verwendet, um Informationen in verschiedene Gruppen aufzuteilen oder zu sortieren - damit zum Beispiel nur Subjekte, die zu einer gewissen Vertraulichkeitsstufe gehören, Zugang zu einer Gruppe von Objekten erhalten.
+
+In den meisten Fällen wird ein Administrator nur ein einzelnes Label für das gesamte Dateisystem verwenden.
+
+_Moment mal, dass ist doch dasselbe wie DAC! Ich dachte, MAC würde die Kontrolle strengstens an den Administrator binden!_ Diese Aussage hält immer noch stand - `root` ist derjenige, der die Kontrolle ausübt und die Richtlinie konfiguriert, so dass Nutzer in die entsprechenden, angemessenen Kategorien / Zugriffsklassen eingeordnet werden. Nunja, einige Module schränken `root` selbst ein. Die Kontrolle über Objekte wird dann einer Gruppe zugewiesen, jedoch hat `root` die Möglichkeit, die Einstellungen jederzeit zu widerrufen oder zu ändern. Dies ist das Hierarchie/Freigabe-Modell, das durch Richtlinien wie MLS oder Biba bereitgestellt wird.
+
+=== Konfigurieren der Labels
+
+Gewissermaßen alle Aspekte der Labelkonfiguration werden durch Werkzeuge das Basissystems umgesetzt. Die entsprechenden Kommandos bieten eine einfache Schnittstelle zum Konfigurieren, Manipulieren und auch Verifizieren der gekennzeichneten Objekte.
+
+Mit den beiden Kommandos man:setfmac[8] und man:setpmac[8] kann man eigentlich schon alles machen. Das Kommando `setfmac` wird verwendet, um ein MAC-Label auf einem Systemobjekt zu setzen, `setpmac` hingegen zum Setzen von Labels auf Systemsubjekte. Als Beispiel soll hier dienen:
+
+[source,bash]
+....
+# setfmac biba/high test
+....
+
+Wenn bei der Ausführung dieses Kommandos keine Fehler aufgetreten sind, gelangt man zur Eingabeaufforderung zurück. Nur wenn ein Fehler auftritt, verhalten sich diese Kommandos nicht still, ganz wie auch die Kommandos man:chmod[1] und man:chown[8]. In einigen Fällen wird dieser Fehler `Permission denied` lauten und gewöhnlich dann auftreten, wenn ein Label an einem Objekt angebracht oder verändert werden soll, das bereits (Zugriffs-)Beschränkungen unterliegt. Der Systemadministrator kann so eine Situation mit Hilfe der folgenden Kommandos überwinden:
+
+[source,bash]
+....
+# setfmac biba/high test
+Permission denied
+# setpmac biba/low setfmac biba/high test
+# getfmac test
+test: biba/high
+....
+
+Wie wir hier sehen, kann `setpmac` verwendet werden, um die vorhandene Einstellungen zu umgehen, indem dem gestarteten Prozeß ein anderes, valides Label zugeordnet wird. Das Werkzeug `getpmac` wird normalerweise auf gerade laufende Prozesse angewendet. Ähnlich sendmail: Als Argument wird statt eines Kommandos eine eine Prozeß-ID übergeben, es verbirgt sich doch dieselbe Logik dahinter. Wenn ein Nutzer versucht, eine Datei zu verändern, auf die er keinen Zugriff hat, entsprechend der Regeln eines geladenen Richtlinienmoduls, wird der Fehler `Operation not permitted` durch die Funktion `mac_set_link` angezeigt.
+
+==== Übliche Typen von Labeln
+
+Wenn man die Module man:mac_biba[4], man:mac_mls[4] und man:mac_lomac[4] verwendet, hat man die Möglichkeit, einfache Label zu vergeben. Diese nennen sich `high`, `low` und `equal`. Es folgt eine kurze Beschreibung, was diese Labels bedeuten:
+
+* Das Label `low` ist definitionsgemäß das niedrigeste Label, das einem Objekt oder Subjekt verliehen werden kann. Wird es gesetzt, kann die entsprechende Entität nicht mehr auf Entitäten zugreifen, die das Label `high` tragen.
+* Das Label `equal` wird Entitäten verliehen, die von der Richtlinie ausgenommen sein sollen.
+* Das Label `high` verleiht einer Entität die höchstmögliche Einstellung.
+
+Unter Beachtung jedes einzelnen Richtlinienmoduls moduliert und beschränkt jede dieser Einstellungen den Informationsfluß unterschiedlich. Genaue Erklärungen zu den Charakteristika der einfachen Labels in den verschiedenen Modulen finden sich im entsprechenden Unterabschnitt dieses Kapitels oder in den Manpages.
+
+===== Fortgeschrittene Label-Konfiguration
+
+Numerische klassifizierte Labels werden verwendet in der Form `Klasse:Verbund+Verbund`. Demnach ist das Label
+
+[.programlisting]
+....
+biba/10:2+3+6(5:2+3-15:2+3+4+5+6)
+....
+
+folgendermaßen zu lesen:
+
+"Biba Policy Label"/"effektive Klasse 10" :"Verbund 2,3 und 6": ("Low-Klasse 5:..."- "High-Klasse 15:...")
+
+In diesem Beispiel ist die erstgenannte Klasse als "effektive Klasse" zu bezeichnen. Ihr werden die "effektiven Verbünde" zugeordnet. Die zweite Klasse ist die "Low"-Klasse und die letzte die "high"-Klasse. Die allermeisten Konfigurationen kommen ohne die Verwendungen von solchen Klassen aus, nichtsdestotrotz kann man sie für erweiterte Konfigurationen verwenden.
+
+Sobald sie auf _Systemsubjekte_ angewendet werden, haben diese eine gegenwärtige Klasse/Verbund- Konfiguration und diese muß im definierten Rahmen gegebenenfalls angepaßt (erhöht oder gesenkt) werden. Im Gegensatz dazu haben _Systemobjekte_ alle eingestellten (effektive, High- und Low-Klasse) gleichzeitig. Dies ist notwendig, damit auf Sie von den _Systemsubjekten_ in den verschiedenen Klassen gleichzeitig zugegriffen werden kann.
+
+Die Klasse und und die Verbünde in einem Subjekt-Objekt-Paar werden zum Erstellen einer sogenannten Dominanz-Relation verwendet, in welcher entweder das Subjekt das Objekt, das Objekt das Subjekt, keines das andere dominiert oder sich beide gegenseitig dominieren. Der Fall, dass sich beide dominieren, tritt dann ein, wenn die beiden Labels gleich sind. Wegen der Natur des Informationsflusses in Biba kann man einem Nutzer Rechte für einen Reihe von Abteilungen zuordnen, die zum Beispiel mit entsprechenden Projekten korrespondieren. Genauso können aber auch Objekten mehrere Abteilungen zugeordnet sein. Die Nutzer müssen eventuell ihre gegenwärtigen Rechte mithilfe von `su` or `setpmac` anpassen um auf Objekte in einer Abteilung zuzugreifen, zu der sie laut ihrer effektiven Klasse nicht berechtigt sind.
+
+==== Nutzer- und Label-Einstellungen
+
+Nutzer selbst brauchen Labels damit ihre Dateien und Prozesse korrekt mit der Sicherheitsrichtlinie zusammenarbeitet, die für das System definiert wurde. Diese werden in der Datei [.filename]#login.conf# durch die Verwendung von Login- Klassen zugeordnet. Jedes Richtlinienmodul, das Label verwendet, arbeitet mit diesen Login-Klassen.
+
+Beispielhaft wird der folgende Eintrag, der für jede Richtlinie eine Einstellung enthält, gezeigt:
+
+[.programlisting]
+....
+default:\
+:copyright=/etc/COPYRIGHT:\
+:welcome=/etc/motd:\
+:setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
+:path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:\
+:manpath=/usr/shared/man /usr/local/man:\
+:nologin=/usr/sbin/nologin:\
+:cputime=1h30m:\
+:datasize=8M:\
+:vmemoryuse=100M:\
+:stacksize=2M:\
+:memorylocked=4M:\
+:memoryuse=8M:\
+:filesize=8M:\
+:coredumpsize=8M:\
+:openfiles=24:\
+:maxproc=32:\
+:priority=0:\
+:requirehome:\
+:passwordtime=91d:\
+:umask=022:\
+:ignoretime@:\
+:label=partition/13,mls/5,biba/10(5-15),lomac/10[2]:
+....
+
+Die Label-Option in der letzten Zeile legt fest, welches Standard-Label für einen Nutzer erzwungen wird. Nutzern darf niemals gestattet werden, diese Werte selbst zu verändern, demnach haben Nutzer in dieser Beziehung auch keine Wahlfreiheit. In einer richtigen Konfiguration jedoch wird kein Administrator alle Richtlinienmodule aktivieren wollen. Es wird an dieser Stelle ausdrücklich empfohlen, dieses Kapitel zu Ende zu lesen, bevor irgendein Teil dieser Konfiguration ausprobiert wird.
+
+[NOTE]
+====
+Nutzer können ihr eigenes Label nach dem Loginvorgang durchaus ändern. Jedoch kann diese Änderung nur unter den Auflagen der gerade gültigen Richtlinie geschehen. Im Beispiel oben wird für die Biba-Richtlinie eine minimale Prozeßintegrität von 5, eine maximale von 15 angegeben, aber die Voreinstellung des tatsächlichen Labels ist 10. Der Nutzerprozeß läuft also mit einer Integrität von 10 bis das Label verändert wird, zum Beispiel durch eine Anwendung des Kommandos `setpmac`, welches jedoch auf den Bereich eingeschränkt wird, der zum Zeitpunkt des Logins angegeben wurde, in diesem Fall von 5 bis 15.
+====
+
+Nach einer Änderung der Datei [.filename]#login.conf# muß in jedem Fall die Befähigungsdatenbank mit dem Kommando `cap_mkdb` neu erstellt werden - und das gilt für alle im weiteren Verlauf gezeigten Beispiele und Diskussionspunkte.
+
+Es ist nützlich anzumerken, dass viele Einsatzorte eine große Anzahl von Nutzern haben, die wiederum viele verschiedenen Nutzerklassen angehören sollen. Hier ist eine Menge Planungsarbeit notwendig, da die Verwaltung sehr unübersichtlich und schwierig ist.
+
+==== Netzwerkschnittstellen und die zugehörigen Label
+
+Labels können auch, wenn man sie an Netzwerkschittstellen vergibt, helfen, den Datenfluß durch das Netzwerk zu kontrollieren. Das funktioniert in allen Fällen genau so wie mit Objekten. Nutzer, die in der Biba-Richtlinie das Label `high` tragen, dürfen nicht auf Schnittstellen zugreifen, die `low` markiert sind usw.
+
+Die Option `maclabel` wird via `ifconfig` übergeben. Zum Beispiel
+
+[source,bash]
+....
+# ifconfig bge0 maclabel biba/equal
+....
+
+belegt die Schnittstelle mit dem MAC Label `biba/equal`. Wenn eine komplexe Einstellung wie `biba/high(low-high)` verwendet wird, muß das gesamte Label in Anführungszeichen geschrieben werden, da sonst eine Fehlermeldung zurückgegeben wird.
+
+Jedes Richtlinienmodul, das die Vergabe von Labels unterstützt, stellt einen Parameter bereit, mit dem das MAC Label für Netzwerkschnittstellen deaktiviert werden kann. Das Label der Netzwerkschnittstelle auf `equal` zu setzen, führt zum selben Ergebnis. Beachten Sie die Ausgabe von `sysctl`, die Manpages der verschiedenen Richtlinien oder eben die Informationen, die im weiteren Verlauf dieses Kapitels angeboten werden, um mehr zu diesen Parametern zu erfahren.
+
+=== Single- oder Multilabel?
+
+Als Standardeinstellung verwendet das System die Option `single label`. Was bedeutet das für den Administrator? Es gibt einige Unterschiede zwischen `single label` und `multilabel`. In ihrer ureigenen Weise bieten beide Vor- und Nachteile bezogen auf die Flexibilität bei der Modellierung der Systemsicherheit.
+
+Die Option `single label` gibt jedem Subjekt oder Objekt genau ein einziges Label, zum Beispiel `biba/high`. Mit dieser Option hat man einen geringeren Verwaltungsaufwand, aber die Flexibilität beim Einsatzes von Richtlinien ist ebenso gering. Viele Administratoren wählen daher auch die Option `multilabel` im Sicherheitsmodell, wenn die Umstände es erfordern.
+
+Die Option `multilabel` gestattet, jedem einzelnen Subjekt oder Objekt seine eigenen unabhängigen Label zu zuzuordnen. Die Optionen `multilabel` und `singlelabel` betreffen jedoch nur die Richtlinien, die Labels als Leistungsmerkmal verwenden, einschließlich der Richtlinien Biba, Lomac, MLS und SEBSD.
+
+Wenn Richtlinien benutzt werden sollen, die ohne Labels auskommen, wird die Option `multilabel` nicht benötigt. Dies betrifft die Richtlinien `seeotheruids`, `portacl` und `partition`.
+
+Man sollte sich dessen bewußt sein, dass die Verwendung der Option `multilabel` auf einer Partition und die Erstellung eines Sicherheitsmodells auf der Basis der FreeBSD `multilevel` Funktionalität einen hohen Verwaltungsaufwand bedeutet, da alles im Dateisystem ein Label bekommt. Jedes Verzeichnis, jede Datei und genauso jede Schnittstelle.
+
+Das folgende Kommando aktiviert `multilabel` für ein Dateisystem. Dies funktioniert nur im Einzelbenutzermodus:
+
+[source,bash]
+....
+# tunefs -l enable /
+....
+
+In einer Swap-Partition wird dies nicht benötigt.
+
+[NOTE]
+====
+Falls Sie Probleme beim Setzen der Option `multilabel` auf der Root-Partition bemerken, lesen Sie bitte <<mac-troubleshoot>> dieses Kapitels.
+====
+
+[[mac-planning]]
+== Planung eines Sicherheitsmodells
+
+Wann immer eine neue Technologie eingepflegt werden soll, ist es wichtig, vorher einen Plan zu erstellen. In den verschiedenen Etappen der Planung sollte der Administrator nie das "Große Ganze" aus den Augen verlieren und mindestens die folgenden Punkte beachten:
+
+* Die Anforderungen
+* Die Ziele
+
+Wenn Sie MAC verwenden möchten, sind das im Besonderen folgende Punkte:
+
+* Wie werden Informationen und Ressourcen auf den Zielsystemen klassifiziert?
+* Welche Arten von Informationen bzw. Ressourcen sollen im Zugang beschränkt sein und welche Art Einschränkung soll verwendet werden?
+* Welche(s) MAC Modul(e) wählt man, um sein Ziel zu erreichen?
+
+Es ist immer möglich, die Einstellungen des Systems und der Systemressourcen im Nachhinein zu "optimieren". Es ist aber wirklich lästig, das gesamte Dateisystem zu durchsuchen, um Dateien oder Benutzerkonten zu reparieren. Eine gute Planung hilft dem Administrator, sich einer sorgenfreien und effizienten Umsetzung eines Sicherheitsmodells zu versichern. Testlauf des Sicherheitsmodells _vor_ dem Einsatz in seiner richtigen Arbeitsumgebung ist auf jeden Fall empfehlenswert. Die Idee, ein System mit einer MAC einfach loslaufen zu lassen, ist wie direkt auf einen Fehlschlag hinzuarbeiten.
+
+Jede Umgebung hat ihre eigenen Anforderungen. Ein tiefgreifendes und vollständiges Sicherheitsprofil zu erstellen spart weitere Änderungen, nachdem das System in Betrieb genommen wurde. Also werden die folgenden Abschnitte die verschiedenen Module vorstellen, die den Administratoren zur Verfügung gestellt werden, die Nutzung und Konfiguration der einzelnen Module beschreiben; und in einigen Fällen Einblicke gewähren, für welche Situationen welche Module besonders geeignet sind. Zum Beispiel ein Webserver kann von der Verwendung der man:mac_biba[4] oder der man:mac_bsdextended[4] Richtlinie profitieren. In anderen Fällen, an einem Rechner mit nur wenigen lokalen Benutzern, ist die man:mac_partition[4] die Richtlinie der Wahl.
+
+[[mac-modules]]
+== Modulkonfiguration
+
+Jedes Modul, das in der MAC enthalten ist, kann entweder direkt in den Kernel eingefügt werden oder als Kernelmodul in der Laufzeit des Systems geladen werden. Empfohlen wird, den Modulnamen in der Datei [.filename]#/boot/loader.conf# anzufügen, so dass das Modul am Anfang des Bootvorgangs eingebunden wird.
+
+Die folgenden Abschnitte werden verschiedene MAC Module und ihre jeweiligen Vor- und Nachteile vorstellen. Außerdem wird erklärt, wie sie in bestimmte Umgebungen eingearbeitet werden können. Einige Module unterstützen die Verwendung von `Labels`, das heißt Zugriffskontrolle durch hinzufügen einer Kennzeichnung in der Art von "dieses ist erlaubt, jenes aber nicht". Eine Label-Konfigurationdatei kontrolliert unter anderem, wie auf Dateien zugegriffen oder wie über das Netzwerk kommuniziert werden darf. Im vorangehenden Abschnitt wurde bereits erläutert, wie die Option `multilabel` auf Dateisysteme angewendet wird, um eine Zugriffskontrolle auf einzelne Dateien oder ganze Dateisysteme zu konfigurieren.
+
+Eine `single label` Konfiguration erzwingt ein einzelnes Label für das gesamte System. Daher wird die `tunefs`-Option `multilabel` genannt.
+
+[[mac-seeotheruids]]
+== Das MAC Modul seeotheruids
+
+Modulename: [.filename]#mac_seeotheruids.ko#
+
+Parameter in der Kernelkonfiguration: `options MAC_SEEOTHERUIDS`
+
+Bootparameter: `mac_seeotheruids_load="YES"`
+
+Das Modul man:mac_seeotheruids[4] erweitert die `sysctl`-Variablen `security.bsd.see_other_uids` und `security.bsd.see_other_gids`. Diese Optionen benötigen keine im Vorhinein zu setzenden Labels und können leicht durchschaubar mit den anderen MAC-Modulen zusammenarbeiten.
+
+Nachdem das Modul geladen wurde, können die folgenden `sysctl` Variablen verwendet werden.
+
+* `security.mac.seeotheruids.enabled` dient zur Aktivierung des Moduls, zunächst mit den Standardeinstellungen. Diese verhindern, dass Nutzer Prozesse und Sockets sehen können, die ihnen nicht selbst gehöen.
+* `security.mac.seeotheruids.specificgid_enabled` kann eine spezifizierte Nutzergruppe von dieser Richtlinie ausnehmen. Die entsprechende Gruppe muß an den Parameter `security.mac.seeotheruids.specificgid=XXX` übergeben werden, wobei _XXX_ die ID der Gruppe ist, die von der Richtlinie ausgenommen werden soll.
+* `security.mac.seeotheruids.primarygroup_enabled` kann verwendet werden, um eine spezifische, _primäre_ Nutzergruppe von der Richtlinie auszuschliessen. Dieser Parameter und `security.mac.seeotheruids.specificgid_enabled` schließen einander aus.
+
+[[mac-bsdextended]]
+== Das MAC Modul bsdextended
+
+Modulname: [.filename]#mac_bsdextended.ko#
+
+Parameter in der Kernelkonfiguration: `options MAC_BSDEXTENDED`
+
+Bootparameter: `mac_bsdextended_load="YES"`
+
+Das Modul man:mac_bsdextended[4] erstellt eine Firewall für das Dateisystem und ist eine Erweiterung des sonst üblichen Rechtemodells. Es erlaubt einem Administrator einen Regelsatz zum Schutz von Dateien, Werkzeugen und Verzeichnissen in der Dateisystemhierarchie zu erstellen, der einer Firewall ähnelt. Sobald auf ein Objekt im Dateisystem zugegriffen werden soll, wird eine Liste von Regel abgearbeitet, bis eine passende Regel gefunden wird oder die Liste zu Ende ist. Das Verhalten kann durch die Änderung des man:sysctl[8] Parameters `security.mac.bsdextended.firstmatch_enabled` eingestellt werden. Ähnlich wie bei den anderen Firewallmodulen in FreeBSD wird eine Datei erstellt, welche die Zugriffsregeln enthält. Diese wird beim Systemstart durch eine Variable in man:rc.conf[5] eingebunden.
+
+Der Regelsatz kann mit dem Programm man:ugidfw[8] eingepflegt werden, welches eine Syntax bereitstellt, die der von man:ipfw[8] gleicht. Weitere Werkzeuge können auch selbst erstellt werden, indem die Funktionen der Bibliothek man:libugidfw[3] verwendet werden.
+
+Bei der Arbeit mit diesem Modul ist äußerste Vorsicht geboten - falscher Gebrauch kann den Zugriff auf Teile des Dateisystems komplett unterbinden.
+
+=== Beispiele
+
+Nachdem das Modul man:mac_bsdextended[4] erfolgreich geladen wurde, zeigt das folgende Kommando die gegenwärtig aktiven Regeln an:
+
+[source,bash]
+....
+# ugidfw list 0 slots, 0 rules
+....
+
+Wie erwartet, sind keine Regeln definiert. Das bedeutet, das auf alle Teile des Dateisystems zugegriffen werden kann. Um eine Regel zu definieren, die jeden Zugriff durch Nutzer blockiert und nur die Rechte von `root` unangetastet läßt, muß lediglich dieses Kommando ausgeführt werden:
+
+[source,bash]
+....
+# ugidfw add subject not uid root new object not uid root mode n
+....
+
+Das ist allerdings keine gute Idee, da nun allen Nutzern der Zugriff auf selbst die einfachsten Programme wie `ls` untersagt wird. Angemessener wäre etwas wie:
+
+[source,bash]
+....
+# ugidfw set 2 subject uid user1 object uid user2 mode n
+# ugidfw set 3 subject uid user1 object gid user2 mode n
+....
+
+Diese Befehle bewirken, dass `user1` keinen Zugriff mehr auf Dateien und Programme hat, die `_user2_` gehören. Dies schließt das Auslesen von Verzeichniseinträgen ein.
+
+Anstelle `uid user1` könnte auch `not uid _user2_` als Parameter übergeben werden. Dies würde diesselben Einschränkungen für alle Nutzer bewirken anstatt nur einen einzigen.
+
+[NOTE]
+====
+`root` ist von diesen Einstellungen nicht betroffen.
+====
+
+Dies sollte als Überblick ausreichen, um zu verstehen, wie das Modul man:mac_bsdextended[4] helfen kann, das Dateisystem abzuschotten. Weitere Informationen bieten die Manpages man:mac_bsdextended[4] und man:ugidfw[8].
+
+[[mac-ifoff]]
+== Das MAC Modul ifoff
+
+Modulname: [.filename]#mac_ifoff.ko#
+
+Parameter für die Kernelkonfiguration: `options MAC_IFOFF`
+
+Bootparameter: `mac_ifoff_load="YES"`
+
+Das Modul man:mac_ifoff[4] ist einzig dazu da, Netzwerkschnittstellen im laufenden Betrieb zu deaktivieren oder zu verhindern, das Netzwerkschnittstellen während der Bootphase gestartet werden. Dieses Modul benötigt für seinen Betrieb weder Labels, die auf dem System eingerichtet werden müssen, noch hat es Abhängigkeiten zu anderen MAC Modulen.
+
+Der größte Teil der Kontrolle geschieht über die im folgenden aufgelisteten `sysctl`-Parameter:
+
+* `security.mac.ifoff.lo_enabled` schaltet den gesamten Netzwerkverkehr auf der Loopback-Schnittstelle man:lo[4] an bzw. aus.
+* `security.mac.ifoff.bpfrecv_enabled` macht das Gleiche für den Berkeley Paket Filter man:bpf[4].
+* `security.mac.ifoff.other_enabled` schaltet den Verkehr für alle anderen Netzwerkschnittstellen.
+
+Die wahrscheinlich häufigste Nutzung von man:mac_ifoff[4] ist die Überwachung des Netzwerks in einer Umgebung, in der kein Netzwerkverkehr während des Bootvorgangs erlaubt werden soll. Eine andere mögliche Anwendung wäre ein Script, das mit Hilfe von package:security/aide[] automatisch alle Schnittstellen blockiert, sobald Dateien in geschützten Verzeichnissen angelegt oder verändert werden.
+
+[[mac-portacl]]
+== Das MAC Modul portacl
+
+Modulname: [.filename]#mac_portacl.ko#
+
+Parameter für die Kernelkonfiguration: `options MAC_PORTACL`
+
+Bootparameter: `mac_portacl_load="YES"`
+
+Mit Hilfe des Moduls man:mac_portacl[4] können die Anbindungen an die lokalen TCP und UDP Ports durch eine Vielzahl von `sysctl` Variablen beschränkt werden. Genauer gesagt ermöglicht man:mac_portacl[4] Nutzern ohne `root`-Rechten den Zugriff auf zu bestimmende privilegierte Ports, also denen innerhalb der ersten 1024.
+
+Sobald das Modul geladen wurde, ist die Richtlinie für alle Sockets verfügbar. Die folgenden Variablen können für die Konfiguration verwendet werden:
+
+* `security.mac.portacl.enabled` schaltet die Anwendung der Richtlinie ein oder aus.
+* `security.mac.portacl.port_high` gibt den höchsten Port an, der von der Richtlinie man:mac_portacl[4] betroffen sein soll.
+* `security.mac.portacl.suser_exempt` nimmt, wenn es einen Wert ungleich Null zugewiesen bekommt, `root` von der Richtlinie aus.
+* `security.mac.portacl.rules` enthält als Wert die eigentliche `mac_portacl` Richtlinie.
+
+Die eigentliche Konfiguration der `mac_portacl` Richtlinie wird der `sysctl`-Variablen `security.mac.portacl.rules` als Zeichenkette der Form `rule[,rule,...]` übergeben. Jede einzelne Regel hat die Form `idtype:id:protocol:port`. Der Parameter [parameter]#idtype# ist entweder `uid` oder `gid` und wird verwendet, um den Parameter [parameter]#id# als Nutzer-ID oder Gruppen-ID zu kennzeichnen. Der Parameter [parameter]#protocol# gibt an, ob die Regel ür TCP oder UDP gelten soll (indem man den Wert auf `tcp` oder `udp` setzt). Und der letzte Parameter, [parameter]#port#, enthält die Nummer des Ports, auf den der angegebene Nutzer bzw. die angegebene Gruppe Zugriff erhalten soll.
+
+[NOTE]
+====
+Da der Regelsatz direkt vom Kernel ausgewertet wird, können nur Zahlenwerte übergeben werden. Das heißt, Namen von Nutzern, Gruppen oder Dienstnamen aus der Datei [.filename]#/etc/services# funktionieren nicht.
+====
+
+Auf UNIX(R)-artigen Betriebssystemen sind die Ports kleiner 1024 privilegierten Prozessen vorbehalten, müssen also mit als/von `root` gestartet werden und weiterhin laufen. Damit man:mac_portacl[4] die Vergabe von Ports kleiner als 1024 an nicht privilegierte Prozesse übernehmen kann, muß die UNIX(R) Standardeinstellung deaktiviert werden. Dazu ändert man die man:sysctl[8] Variablen `net.inet.ip.portrange.reservedlow` und `net.inet.ip.portrange.reservedhigh` auf den Wert "0".
+
+Weiterführende Informationen entnehmen Sie bitte den unten aufgeführten Beispielen oder der Man-Page man:mac_portacl[4]!
+
+=== Beispiele
+
+Die folgenden Beispiele sollten ein wenig Licht in die obige Diskussion bringen:
+
+[source,bash]
+....
+# sysctl security.mac.portacl.port_high=1023
+# sysctl net.inet.ip.portrange.reservedlow=0 net.inet.ip.portrange.reservedhigh=0
+....
+
+Zunächst bestimmen wir, dass man:mac_portacl[4] für alle privilegierten Ports gelten soll und deaktivieren die normale UNIX(R)-Beschränkung.
+
+[source,bash]
+....
+# sysctl security.mac.portacl.suser_exempt=1
+....
+
+Da `root` von dieser Richtlinie nicht beeinträchtigt werden soll, setzen wir hier `security.mac.portacl.suser_exempt` auf einen Wert ungleich Null. Das Modul man:mac_portacl[4] ist nun so eingerichtet, wie es UNIX(R)-artige Betriebssysteme normal ebenfalls tun.
+
+[source,bash]
+....
+# sysctl security.mac.portacl.rules=uid:80:tcp:80
+....
+
+Nun erlauben wir dem Nutzer mit der UID 80, normalerweise dem Nutzer `www`, den Port 80 zu verwenden. Dadurch kann der Nutzer `www` einen Webserver betreiben, ohne dafür mit `root`-Privilegien ausgestattet zu sein.
+
+[source,bash]
+....
+# sysctl security.mac.portacl.rules=uid:1001:tcp:110,uid:1001:tcp:995
+....
+
+Hier wird dem Nutzer mit der UID 1001 erlaubt, die TCP Ports 110 ("pop3") und 995 ("pop3s") zu verwenden. Dadurch kann dieser Nutzer einen Server starten, der Verbindungen an diesen beiden Ports annehmen kann.
+
+[[mac-partition]]
+== Das MAC Modul partition
+
+Modulname: [.filename]#mac_partition.ko#
+
+Parameter für die Kernelkonfiguration: `options MAC_PARTITION`
+
+Bootparameter `mac_partition_load="YES"`
+
+Die Richtlinie man:mac_partition[4] setzt Prozesse in spezielle "Partitionen", entsprechend dem zugewiesenen MAC Label. Man kann sich das vorstellen wie eine spezielle Art man:jail[8], auch wenn das noch kein wirklich guter Vergleich ist.
+
+Es wird empfohlen, dieses Modul durch einen Eintrag in man:loader.conf[5] zu aktivieren, so dass die Richtlinie während des Bootvorganges eingebunden wird.
+
+Der Großteil der Konfiguration geschieht mit dem Kommando man:setpmac[8], wie gleich erklärt wird. Außerdem gibt es folgenden `sysctl` Parameter für diese Richtlinie.
+
+* `security.mac.partition.enabled` erzwingt die Verwendung von MAC Prozeß-Partitionen.
+
+Sobald diese Richtlinie aktiv ist, sehen Nutzer nur noch ihre eigenen Prozesse, und alle anderen Prozesse, die ebenfalls derselben Prozeß-Partition zugeordnet sind. Sie können jedoch nicht auf Prozesse oder Werkzeuge außerhalb des Anwendungsbereich dieser Partition zugreifen. Das bedeutet unter anderem, das ein Nutzer, der einer Klasse `insecure` zugeordnet ist, nicht auf das Kommando `top` zugreifen kann - wie auch auf viele anderen Befehle, die einen eigenen Prozeß erzeugen.
+
+Um einen Befehl einer Prozeß-Partition zuzuordnen, muß dieser durch das Kommando `setpmac` mit einem Label versehen werden:
+
+[source,bash]
+....
+# setpmac partition/13 top
+....
+
+Diese Zeile fügt das Kommando `top` dem Labelsatz für Nutzer der Klasse `insecure` hinzu, sofern die Partition 13 mit der Klasse `insecure` übereinstimmt. Beachten Sie, dass alle Prozesse, die von Nutzern dieser Klasse erzeugt werden, das Label `partition/13` erhalten, und dieses auch nicht durch den Nutzer geändert werden kann.
+
+=== Beispiele
+
+Der folgende Befehl listet die vergebenen Label für Prozeß-Partitionen und die laufenden Prozesse auf.
+
+[source,bash]
+....
+# ps Zax
+....
+
+Das nächste Kommando liefert das Label der Prozeß-Partition eines anderen Nutzers `trhodes` und dessen gegenwärtig laufenden Prozesse zurück.
+
+[source,bash]
+....
+# ps -ZU trhodes
+....
+
+[NOTE]
+====
+Jeder Nutzer kann die Prozesse in der Prozeß-Partition von `root` betrachten, solange nicht die Richtlinie man:mac_seeotheruids[4] geladen wurde.
+====
+
+Eine ausgefeilte Umsetzung dieser Richtlinie deaktiviert alle Dienste in [.filename]#/etc/rc.conf# und startet diese dann später durch ein Skript, das jedem Dienst das passende Label zuordnet.
+
+[NOTE]
+====
+Die folgenden Richtlinien verwenden Zahlenwerte anstatt der drei Standardlabels. Diese Optionen, und ihre Grenzen, werden in den zugehörigen Manpages genauer erklärt.
+====
+
+[[mac-mls]]
+== Das MAC Modul Multi-Level Security
+
+Modulname: [.filename]#mac_mls.ko#
+
+Parameter für die Kernelkonfiguration: `options MAC_MLS`
+
+Bootparameter: `mac_mls_load="YES"`
+
+Die Richtlinie man:mac_mls[4] kontrolliert die Zugriffe zwischen Subjekten und Objekten, indem sie den Informationsfluß strengen Regeln unterwirft.
+
+In MLS Umgebungen wird jedem Subjekt oder Objekt ein "Freigabe"-Level zugeordnet, und diese werden wiederum zu einzelnen Verbünden zusammengefaßt. Da diese Freigabe- oder Anfälligkeits-Level Zahlen größer 6000 erreichen können, ist es für jeden Systemadministrator eine undankbare Aufgabe, jede Entität von Grund auf zu konfigurieren. Zum Glück gibt es 3 "instant" Labels, die in der Richtlinie zur Anwendung bereit stehen.
+
+Diese drei Labels heißen `mls/low`, `mls/equal` und `mls/high`. Da sie in den Manpages man:mac_mls[4] ausführlich beschrieben werden, gibt es hier nur einen kurzen Abriß:
+
+* Das Label `mls/low` ist eine niedrige Einstellung, die von allen anderen dominiert werden darf. Alles, was mit `mls/low` versehen wird, hat ein niedriges Freigabe-Level und darf auf keine Informationen zugreifen, denen ein höheres Freigabe-Level zugeordnet wurde. Einem Objekt mit diesem Label kann außerdem keine Information durch ein Objekt höherer Freigabe übergeben werden, es kann also auch nicht durch solche Objekte editiert oder überschrieben werden.
+* Das Label `mls/equal` wird an Objekte vergeben, die von dieser Richtlinie ausgenommen werden sollen.
+* Das Label `mls/high` verkörpert das höchstmögliche Freigabe-Level. Objekte, denen dieses Label zugeordnet wird, dominieren alle anderen Objekte des Systems. Trotzdem können sie Objekten mit einem niedrigeren Freigabe-Level keine Informationen zuspielen.
+
+MLS bietet:
+
+* Eine hierarchische Sicherheitsschicht und Zuordnung nichthierarchischer Kategorien;
+* Feste Regeln: kein "Read-Up", kein "Write-Down" (ein Subjekt kann nur Objekte gleicher oder _niedrigerer_ Stufe lesen, und es kann nur Objekte gleicher oder _höherer_ Stufe schreiben);
+* Geheimhaltung (indem unangemessene Offenlegung von Daten verhindert wird);
+* Eine Basis zum Entwerfen von Systemen, die Daten verschiedener Vertraulichkeitsebenen gleichzeitig handhaben sollen (ohne das geheime und vertrauliche Informationen untereinander ausgetauscht werden können).
+
+Nachfolgend werden die `sysctl`-Variablen vorgestellt, die für die Einrichtung spezieller Dienste und Schnittstellen vorhanden sind.
+
+* `security.mac.mls.enabled` schaltet die Richtlinie MLS ein (oder aus).
+* `security.mac.mls.ptys_equal` sorgt dafür, dass während der Initialisierung alle man:pty[4]-Geräte als `mls/equal` gekennzeichnet werden.
+* `security.mac.mls.revocation_enabled` sorgt dafür, dass die Zugriffsrechte von Objekten wieder zurückgesetzt werden, nachdem deren Label vorübergehend auf ein niedrigeres Freigabe-Level geändert wurde.
+* `security.mac.mls.max_compartments` gibt die maximale Anzahl von Verbünden an. Im Prinzip ist es die höchste Nummer eines Verbundes auf dem System.
+
+Um die Labels der MLS Richtlinie zu bearbeiten verwendet man man:setfmac[8]. Um ein Objekt zu kennzeichnen, benutzen Sie folgendes Kommando:
+
+[source,bash]
+....
+# setfmac mls/5 test
+....
+
+Um das MLS-Label der Datei [.filename]#test# auszulesen, verwenden Sie dieses Kommando:
+
+[source,bash]
+....
+# getfmac test
+....
+
+Dies ist eine Zusammenstellung der Merkmale von [.filename]#test#. Ein anderer Ansatz ist, für diese Richtlinie eine Konfigurationsdatei in [.filename]#/etc# abzulegen, die alle Informationen enthält und mit der dann das Kommando `setfmac` gefüttert wird. Diese Vorgehensweise wird erklärt, nachdem alle Richtlinien vorgestellt wurden.
+
+=== Verbindlicher Vertraulichkeit in der Planungsphase
+
+Mit dem Richtlinienmodul `Multi-Level Security` bereitet sich ein Administrator darauf vor, den Fluß vertraulicher Informationen zu kontrollieren. Beim Starten der Richtlinie ist immer `mls/low` voreingestellt - alles kann auf alles zugreifen. Der Administrator ändert dies während der eigentlichen Konfiguration, indem er die Vertraulichkeit bestimmter Objekte erhöht.
+
+Jenseits der drei Grundeinstellungen des Labels kann der Administrator einzelne Nutzer oder Nutzergruppen nach Bedarf zusammenschließen und den Informationsaustausch zwischen diesen gestatten oder unterbinden. Es ist sicher eine Vereinfachung, die Freigabe-Level mit Begriffen wie `vertraulich`, `geheim` oder `streng geheim` zu bezeichnen. Einige Administratoren erstellen einfach verschiedene Gruppen auf der Ebene von gegenwärtigen Projekten. Ungeachtet der Herangehensweise bei der Klassifizierung muß ein gut durchdachter Plan existieren, bevor eine derart einengende Richtlinie umgesetzt wird.
+
+Exemplarisch für die Anwendung dieses Moduls bzw. dieser Richtlinie seien angeführt:
+
+* Ein E-Commerce Webserver
+* Ein Dateiserver, der vertrauliche Informationen einer Firma oder eines Konzerns speichert
+* Umgebungen in Finanzeinrichtungen
+
+Der unsinnigste Einsatzort für diese Richtlinie wäre ein Arbeitsplatzrechner mit nur zwei oder drei Benutzern.
+
+[[mac-biba]]
+== Das MAC Modul Biba
+
+Modulname: [.filename]#mac_biba.ko#
+
+Parameter für die Kernelkonfiguration: `options MAC_BIBA`
+
+Bootparameter: `mac_biba_load="YES"`
+
+Das Modul man:mac_biba[4] lädt die MAC Biba Richtlinie. Diese ähnelt stark der MLS Richtlinie, nur das die Regeln für den Informationsfluß ein wenig vertauscht sind. Es wird in diesem Fall der absteigende Fluß sicherheitskritischer Information geregelt, während die MLS Richtlinie den aufsteigenden Fluß regelt. In gewissen Sinne treffen dieses und das vorangegangene Unterkapitel also auf beide Richtlinien zu.
+
+In einer Biba-Umgebung wird jedem Subjekt und jedem Objekt ein "Integritäts"-Label zugeordnet. Diese Labels sind in hierarchischen Klassen und nicht-hierarchischen Komponenten geordnet. Je höher die Klasse, um so höher die Integrität.
+
+Die unterstützten Labels heißen `biba/low`, `biba/equal` und `biba/high`. Sie werden im Folgenden erklärt:
+
+* `biba/low` ist die niedrigste Stufe der Integrität, die einem Objekt verliehen werden kann. Wenn sie einem Objekt oder Subjekt zugeordnet wird, kann dieses auf Objekte oder Subjekte, die biba/high markiert wurden, zwar lesend zugreifen, nicht jedoch schreibend.
+* Das Label `biba/equal` ist, wie der aufmerksame Leser sicherlich schon ahnt, für die Ausnahmen dieser Richtlinie gedacht und sollte nur diesen Ausnahmen entsprechenden Objekten verliehen werden.
+* `biba/high` markierte Subjekte und Objekte können Objekte niedrigerer Stufe schreiben , nicht jedoch lesen. Es wird empfohlen, dass dieses Label an Objekte vergeben wird, die sich auf Integrität des gesamten Systems auswirken.
+
+Biba stellt bereit:
+
+* Hierarchische Integritätsstufen mit einem Satz nichthierarchischer Integritätskategorien;
+* Festgeschriebene Regeln: kein "Write-Up", kein "Read-Down" (der Gegensatz zu MLS - ein Subjekt erhält schreibenden Zugriff auf Objekte gleicher oder geringerer Stufe, aber nicht bei höherer, und lesenden Zugriff bei gleicher Stufe oder höerer, aber nicht bei niedrigerer);
+* Integrität (es wird die Echtheit der Daten gewährleistet, indem unangemessene Veränderungen verhindert werden);
+* Eine Abstufung der Gewährleistung (im Gegensatz zu MLS, bei der eine Abstufung der Vertraulichkeit vorgenommen wird).
+
+Folgende `sysctl` Parameter werden zur Nutzung der Biba-Richtlinie angeboten:
+
+* `security.mac.biba.enabled` zum Aktivieren/Deaktivieren der Richtlinie auf dem Zielsystem.
+* `security.mac.biba.ptys_equal` wird verwendet, um die Biba-Richtlinie auf der man:pty[4]-Schnittstelle zu deaktivieren.
+* `security.mac.biba.revocation_enabled` erzwingt das Zurücksetzen des Labels, falls dieses zeitweise geändert wurde um ein Subjekt zu dominieren.
+
+Um Einstellungen der Biba Richtlinie für Systemobjekte zu verändern werden die Befehle `setfmac` und `getfmac` verwendet:
+
+[source,bash]
+....
+# setfmac biba/low test
+# getfmac test
+test: biba/low
+....
+
+=== Verbindliche Integrität in der Planungsphase
+
+Integrität garantiert, im Unterschied zu Sensitivität, dass Informationen nur durch vertraute Parteien verändert werden können. Dies schließt Informationen ein, die zwischen Subjekten ausgetauscht werden, zwischen Objekt, oder auch zwischen den beiden. Durch Integrität wird gesichert, das Nutzer nur Informationen verändern, oder gar nur lesen können, die sie explizit benötigen.
+
+Das Modul man:mac_biba[4] eröffnet einem Administrator die Möglichkeit zu bestimmen, welche Dateien oder Programme ein Nutzer oder eine Nutzergruppe sehen bzw. aufrufen darf. Gleichzeitig kann er zusichern, dass dieselben Programme und Dateien frei von Bedrohungen sind und das System die Echtheit gewährleistet - für diesen Nutzer oder die Nutzergruppe.
+
+Während der anfänglichen Phase der Planung muß der Administrator vorbereitet sein, Nutzer in Klassen, Stufen und Bereiche einzuteilen. Der Zugriff auf Dateien und insbesondere auch Programme wird verhindert sowohl vor als auch nachdem sie gestartet wurden. Das System selbst erhält als Voreinstellung das Label `biba/high` sobald das Modul aktiviert wird - und es liegt allein am Administrator, die verschiedenen Klassen und Stufen für die einzelnen Nutzer zu konfigurieren. Anstatt mit Freigaben zu arbeiten, wie weiter oben gezeigt wurde, könnte man auch Überbegriffe für Projekte oder Systemkomponenten entwerfen. Zum Beispiel, ausschließlich Entwicklern den Vollzugriff auf Quellcode, Compiler und Entwicklungswerkzeuge gewähren, während man andere Nutzer in Kategorien wie Tester, Designer oder einfach nur "allgemeiner Nutzer" zusammenfaßt, die für diese Bereiche lediglich lesenden Zugriff erhalten sollen.
+
+Mit seinem ursprünglichen Sicherheits-Standpunkt ist ein Subjekt niedrigerer Integrität unfähig, ein Subjekt höherer Integrität zu verändern. Ein Subjekt höherer Integrität kann ein Subjekt niedrigerer Integrität weder beobachten noch lesen. Wenn man ein Label für die niedrigstmögliche Klasse erstellt, kann man diese allen Subjekten verwehren. Einige weitsichtig eingerichtete Umgebungen, die diese Richtlinie verwenden, sind eingeschränkte Webserver, Entwicklungs- oder Test-Rechner oder Quellcode-Sammlungen. Wenig sinnvoll ist diese Richtlinie auf einer Arbeitsstation, oder auf Rechnern die als Router oder Firewall verwendet werden.
+
+[[mac-lomac]]
+== Das MAC Modul LOMAC
+
+Modulname: [.filename]#mac_lomac.ko#
+
+Parameter für die Kernelkonfiguration: `options MAC_LOMAC`
+
+Bootparameter: `mac_lomac_load="YES"`
+
+Anders als die Biba Richtlinie erlaubt die man:mac_lomac[4] Richtlinie den Zugriff auf Objekte niedrigerer Integrität nur, nachdem das Integritätslevel gesenkt wurde. Dadurch wird eine Störung derIntegritätsregeln verhindert.
+
+Die MAC Version der "Low-Watermark" Richtlinie, die nicht mit der älteren -Implementierung verwechselt werden darf, arbeitet fast genauso wie Biba. Anders ist, dass hier "schwebende" Label verwendet werden, die ein Herunterstufen von Subjekten durch Hilfsverbünde ermöglichen. Dieser zweite Verbund wird in der Form `[auxgrade]` angegeben und sollte in etwa aussehen wie `lomac/10[2]`, wobei die Ziffer zwei (2) hier den Hilfsverbund abbildet.
+
+Die MAC Richtlinie `LOMAC` beruht auf einer durchgängigen Etikettierung aller Systemobjekte mit Integritätslabeln, die Subjekten das Lesen von Objekten niedriger Integrität gestatten und dann das Label des Subjektes herunterstufen - um zukünftige Schreibvorgänge auf Objekte hoher Integrität zu unterbinden. Dies ist die Funktion der Option `[auxgrade]`, die eben vorgestellt wurde. Durch sie erhält diese Richtlinie eine bessere Kompatibilität und die Initialisierung ist weniger aufwändig als bei der Richtlinie Biba.
+
+=== Beispiele
+
+Wie schon bei den Richtlinien Biba und MLS werden die Befehle `setfmac` und `setpmac` verwendet, um die Labels an den Systemobjekten zu setzen:
+
+[source,bash]
+....
+# setfmac /usr/home/trhodes lomac/high[low]
+# getfmac /usr/home/trhodes lomac/high[low]
+....
+
+Beachten Sie, dass hier der Hilfswert auf `low` gesetzt wurde - dieses Leistungsmerkmal ist nur in der MAC `LOMAC` Richtlinie enthalten.
+
+[[mac-implementing]]
+== Beispiel 1: Nagios in einer MAC Jail
+
+Die folgende Demonstration setzt eine sichere Umgebung mithilfe verschiedener MAC Module und sorgfältig konfigurierter Richtlinien um. Es handelt sich jedoch nur um einen Test und sollte nicht als Antwort auf jedes Problem in Fragen Sicherheit gesehen werden. Eine Richtlinie nur umzusetzen und dann einfach laufen zu lassen, funktioniert nie und kann eine echte Arbeitsumgebung in eine Katastrophe stürzen.
+
+Bevor es losgeht, muß jedes Dateisystem mit der Option `multilabel`, wie weiter oben beschrieben, markiert werden. Dies nicht zu tun, führt zu Fehlern. Außerdem müssen die Ports package:net-mngt/nagios-plugins[], package:net-mngt/nagios[] und package:www/apache22[] installiert und konfiguriert sein, so dass sie ordentlich laufen.
+
+=== Erstellen einer Nutzerklasse `insecure`
+
+Beginnen wir die Prozedur mit dem Hinzufügen einer Nutzerklasse in der Datei [.filename]#/etc/login.conf#:
+
+[.programlisting]
+....
+insecure:\
+:copyright=/etc/COPYRIGHT:\
+:welcome=/etc/motd:\
+:setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
+:path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin--
+:manpath=/usr/shared/man /usr/local/man:\
+:nologin=/usr/sbin/nologin:\
+:cputime=1h30m:\
+:datasize=8M:\
+:vmemoryuse=100M:\
+:stacksize=2M:\
+:memorylocked=4M:\
+:memoryuse=8M:\
+:filesize=8M:\
+:coredumpsize=8M:\
+:openfiles=24:\
+:maxproc=32:\
+:priority=0:\
+:requirehome:\
+:passwordtime=91d:\
+:umask=022:\
+:ignoretime@:\
+:label=biba/10(10-10):
+....
+
+Zusätzlich fügen wir beim Standardnutzer folgende Zeile hinzu:
+
+[.programlisting]
+....
+:label=biba/high:
+....
+
+Anschließend muß die Datenbank neu erstellt werden:
+
+[source,bash]
+....
+# cap_mkdb /etc/login.conf
+....
+
+=== Boot-Konfiguration
+
+Starten Sie den Rechner noch nicht neu. Fügen Sie zunächst noch die folgenden Zeilen in die Datei [.filename]#/boot/loader.conf# ein, damit die benötigten Module während des Systemstarts geladen werden:
+
+[.programlisting]
+....
+mac_biba_load="YES"
+mac_seeotheruids_load="YES"
+....
+
+=== Nutzer einrichten
+
+Ordnen Sie den Superuser `root` der Klasse `default` zu:
+
+[source,bash]
+....
+# pw usermod root -L default
+....
+
+Alle Nutzerkonten, die weder `root` noch Systemkonten sind, brauchen nun eine Loginklasse, da sie sonst keinen Zugriff auf sonst übliche Befehle erhalten, wie bspw. man:vi[1]. Das folgende `sh` Skript wird diese Aufgabe erledigen:
+
+[source,bash]
+....
+# for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \
+ /etc/passwd`; do pw usermod $x -L default; done;
+....
+
+Verschieben Sie die Nutzer `nagios` und `www` in die `insecure` Klasse:
+
+[source,bash]
+....
+# pw usermod nagios -L insecure
+....
+
+[source,bash]
+....
+# pw usermod www -L insecure
+....
+
+=== Die Kontextdatei erstellen
+
+Nun muß eine Kontextdatei erstellt werden. Die folgende Beispieldatei soll dazu in [.filename]#/etc/policy.contexts# gespeichert werden:
+
+[.programlisting]
+....
+# This is the default BIBA policy for this system.
+
+# System:
+/var/run biba/equal
+/var/run/* biba/equal
+
+/dev biba/equal
+/dev/* biba/equal
+
+/var biba/equal
+/var/spool biba/equal
+/var/spool/* biba/equal
+
+/var/log biba/equal
+/var/log/* biba/equal
+
+/tmp biba/equal
+/tmp/* biba/equal
+/var/tmp biba/equal
+/var/tmp/* biba/equal
+
+/var/spool/mqueue biba/equal
+/var/spool/clientmqueue biba/equal
+
+# For Nagios:
+/usr/local/etc/nagios
+/usr/local/etc/nagios/* biba/10
+
+/var/spool/nagios biba/10
+/var/spool/nagios/* biba/10
+
+# For apache
+/usr/local/etc/apache biba/10
+/usr/local/etc/apache/* biba/10
+....
+
+Die Richtlinie erzwingt Sicherheit, indem der Informationsfluß Einschränkungen unterworfen wird. In der vorliegenden Konfiguration kann kein Nutzer, weder `root` noch andere, auf Nagios zugreifen. Konfigurationsdateien und die Prozesse, die Teil von Nagios sind, werden durch unsere MAC vollständig abgegrenzt.
+
+Die Kontextdatei kann nun vom System eingelesen werden, indem folgender Befehl ausgeführt wird:
+
+[source,bash]
+....
+# setfmac -ef /etc/policy.contexts /
+# setfmac -ef /etc/policy.contexts /
+....
+
+[NOTE]
+====
+Das obenstehende Dateisystem-Layout kann, je nach Umgebung, sehr unterschiedlich aussehen. Außerdem muß es auf jedem einzelnen Dateisystem ausgeführt werden.
+====
+
+In die Datei [.filename]#/etc/mac.conf# müssen nun noch diese Änderungen eingetragen werden:
+
+[.programlisting]
+....
+default_labels file ?biba
+default_labels ifnet ?biba
+default_labels process ?biba
+default_labels socket ?biba
+....
+
+=== Netzwerke einbinden
+
+Tragen Sie die folgende Zeile in die Datei [.filename]#/boot/loader.conf# ein:
+
+[.programlisting]
+....
+security.mac.biba.trust_all_interfaces=1
+....
+
+Und das Folgende gehört in Datei [.filename]#rc.conf# zu den Optionen für die Netzwerkkarte. Falls die Netzwerkverbindung(-en) via DHCP konfiguriert werden, muß man dies nach jedem Systemstart eigenhändig nachtragen:
+
+[.programlisting]
+....
+maclabel biba/equal
+....
+
+=== Testen der Konfiguration
+
+Versichern Sie sich, dass der Webserver und Nagios nicht automatisch geladen werden und starten Sie den Rechner neu. Prüfen Sie nun, ob `root` wirklich keinen Zugriff auf die Dateien im Konfigurationsverzeichnis von Nagios hat. Wenn `root` den Befehl man:ls[1] auf [.filename]#/var/spool/nagios# ausführen kann, ist irgendwas schief gelaufen. Es sollte ein `permission denied` Fehler ausgegeben werden.
+
+Wenn alles gut aussieht, können Nagios, Apache und Sendmail gestartet werden - allerdings auf eine Weise, die unserer Richtlinie gerecht wird. Zum Beispiel durch die folgenden Kommandos:
+
+[source,bash]
+....
+# cd /etc/mail && make stop && \
+setpmac biba/equal make start && setpmac biba/10\(10-10\) apachectl start && \
+setpmac biba/10\(10-10\) /usr/local/etc/rc.d/nagios.sh forcestart
+....
+
+Versichern Sie sich lieber doppelt, dass alles ordentlich läuft. Wenn nicht, prüfen Sie die Logs und Fehlermeldungen. Verwenden Sie das man:sysctl[8] Werkzeug um die Sicherheitsrichtlinie man:sysctl[8] zu deaktivieren und versuchen Sie dann alles noch einmal zu starten.
+
+[NOTE]
+====
+Der Superuser kann den Vollzug der Richtlinie schalten und die Konfiguration ohne Furcht verändern. Folgender Befehl stuft eine neu gestartete Shell herunter:
+
+[source,bash]
+....
+# setpmac biba/10 csh
+....
+
+Um dies zu vermeiden, werden die Nutzer durch man:login.conf[5] eingeschränkt. Wenn man:setpmac[8] einen Befehl außerhalb der definierten Schranken ausführen soll, wird ein Fehler zurückgeliefert. In so einem Fall muß `root` auf `biba/high(high-high)` gesetzt werden.
+====
+
+[[mac-userlocked]]
+== Beispiel 2: User Lock Down
+
+Grundlage dieses Beispiels ist ein relativ kleines System zur Datenspeicherung mit weniger als 50 Benutzern. Diese haben die Möglichkeit, sich einzuloggen und dürfen nicht nur Daten speichern, sondern auch auf andere Ressourcen zugreifen.
+
+Die Richtlinien man:mac_bsdextended[4] und man:mac_seeotheruids[4] können gleichzeitig eingesetzt werden. Zusammen kann man mit ihnen nicht nur den Zugriff auf Systemobjekte einschränken, sondern auch Nutzerprozesse verstecken.
+
+Beginnen Sie, indem Sie die folgende Zeile in die Datei [.filename]#/boot/loader.conf# eintragen:
+
+[.programlisting]
+....
+mac_seeotheruids_load="YES"
+....
+
+Die Richtlinie man:mac_bsdextended[4] wird durch den anschließenden Eintrag in [.filename]#/etc/rc.conf# hinzugefügt:
+
+[.programlisting]
+....
+ugidfw_enable="YES"
+....
+
+Die Standardregeln, welche in [.filename]#/etc/rc.bsdextended# gespeichert sind, werden zum Systemstart geladen. Sie müssen aber noch angepaßt werden. Da dieser Computer nur Nutzern dienen soll und weitere Dienste gestartet werden, kann alles bis auf die beiden letzten Zeilen auskommentiert werden. Das sorgt dafür dass jeder Nutzer seine eigenen Systemobjekte erhält.
+
+Nun fügen wir alle benötigten Nutzer auf der Maschine hinzu und starten neu. Zum Testen der Einstellungen loggen Sie sich parallel zwei mal mit unterschiedlichen Nutzernamen ein und starten Sie das Kommando `ps aux`. Dort sehen Sie, dass Sie die Prozesse des anderen Nutzers nicht sehen können. Versuchen Sie, man:ls[1] auf das Heimatverzeichnis eines anderen Nutzers auszuführen. Auch dieser Versuch wird fehlschlagen.
+
+Solange nicht die speziellen `sysctl`-Variablen geändert wurden, hat der Superuser noch vollen Zugriff. Sobald auch diese Einstellungen angepaßt wurden, führen Sie ruhig auch den obigen Test als `root` aus.
+
+[NOTE]
+====
+Wenn ein neuer Benutzer hinzugefügt wird, ist für diesen zunächst keine man:mac_bsdextended[4] Regel im Regelsatz vorhanden. Schnelle Abhilfe schafft hier, einfach das Kernelmodul mit man:kldunload[8] zu entladen und mit man:kldload[8] erneut einzubinden.
+====
+
+[[mac-troubleshoot]]
+== Fehler im MAC beheben
+
+Während der Entwicklung des Frameworks haben einige Nutzer auf Probleme hingewiesen. Einige davon werden hier aufgeführt:
+
+=== Die Option `multilabel` greift nicht auf der [.filename]#/#-Partition
+
+Es scheint, dass etwa jedem fünfzigsten Nutzer dieses Problem widerfährt. Und in der Tat - auch wir kennen es aus der Entwicklung. Genauere Untersuchungen dieses "Bugs" machten uns glauben, dass es sich entweder um einen Fehler in oder eine fehlerhafte Interpretation der Dokumentation handelt. Warum auch immer dieser Fehler auftritt - er kann mit folgender Prozedur behoben werden:
+
+[.procedure]
+. Öffnen Sie die Datei [.filename]#/etc/fstab# und setzen Sie die Rootpartition auf `ro` wie "read-only".
+. Starten Sie in den Einzelnutzermodus.
+. Rufen Sie `tunefs -l enable` für [.filename]#/# auf.
+. Starten Sie in den Mehrbenutzermodus.
+. Führen Sie `mount -urw`[.filename]#/# aus und ändern Sie anschließend in der Datei [.filename]#/etc/fstab# die Option `ro` zurück in `rw`. Starten Sie das System noch einmal neu.
+. Achten Sie besonders auf die Ausgabe von `mount` um sich zu versichern, dass die `multilabel` korrekt für das root-Dateisystem gesetzt wurde.
+
+=== Mit der aktivierten MAC kann ich keinen X11 Server starten
+
+Dies kann durch die Richtlinie `partition` oder einer fehlerhaften Verwendung einer Richtlinie, die mit Labels arbeitet, auftreten. Zum debuggen versuchen Sie folgendes:
+
+[.procedure]
+. Schauen Sie sich die Fehlermeldungen genau an. Wenn der Nutzer einer `insecure` Klasse angehört, ist wahrscheinlich die Richtlinie `partition` die Ursache. Versuchen Sie, die Nutzerklasse auf `default` zu stellen und danach die Datenbank mit `cap_mkdb` zu erneuern. Wenn das Problem dadurch nicht gelöst wird, gehen Sie weiter zu Schritt 2.
+. Gehen Sie die Label-Richtlinien Schritt für Schritt nocheinmal durch. Achten Sie darauf, dass für den Nutzer, bei dem das Problem auftritt, für X11 und das Verzeichnis [.filename]#/dev# alle Einstellungen korrekt sind.
+. Falls all dies nicht helfen sollte, senden Sie die Fehlermeldung und eine Beschreibung ihrer Arbeitsumgebung an die (englisch-sprachige) TrustedBSD Diskussionsliste auf der http://www.TrustedBSD.org[TrustedBSD] Webseite oder an die {freebsd-questions} Mailingliste.
+
+=== Error: cannot stat [.filename]#.login_conf#
+
+Wenn ich versuche, von `root` zu einem anderen Nutzer des Systems zu wechseln, erhalte ich die Fehlermeldung `_secure_path: unable to state .login_conf`.
+
+Diese Meldung wird gewöhnlich ausgegeben, wenn der Nutzer ein höhere Label-Einstellung hat als der, dessen Identität man annehmen möchte. Ausführlich: Wenn ein Nutzer `joe` als `biba/low` gelabelt wurde, kann `root`, der `biba/high` als Voreinstellung trägt, das Heimatverzeichnis von `joe` nicht einsehen. Das passiert unabhänig davon, ob `root` vorher mit `su` die Identität von `joe` angenommen hat oder nicht, da das Label sich nicht ändert. Hier haben wir also einen Fall, in dem das Gewährleistungsmodell von Biba verhindert, das der Superuser Objekte einer niedrigeren Integrität betrachten kann.
+
+=== Der Nutzer `root` ist kaputt!
+
+Im normalen oder sogar im Einzelbenutzermodus wird `root` nicht anerkannt. Das Kommando `whoami` liefert 0 (null) und `su` liefert `who are you?` zurück. Was geht da vor?
+
+Das kann passieren, wenn eine Label-Richtlinie ausgeschaltet wird - entweder durch man:sysctl[8] oder wenn das Richtlinienmodul entladen wurde. Wenn eine Richtlinie deaktiviert oder auch nur vorübergehen deaktiviert wird, muß die Befähigungsdatenbank neu konfiguriert werden, d.h. die `label` Option muß entfernt werden. Überprüfen Sie, ob alle `label` Einträge aus der Datei [.filename]#/etc/login.conf# entfernt wurden und bauen Sie die Datenbank mit `cap_mkdb` neu.
+
+Dieser Fehler kann auch auftreten, wenn eine Richtlinie den Zugriff auf die Datei [.filename]#master.passwd# einschränkt. Normalerweise passiert das nur, wenn ein Administrator ein Label an diese Datei vergibt, das mit der allgemeingültigen Richtlinie, die das System verwendet, in Konflikt steht. In solchen Fällen werden die Nutzerinformationen vom System ausgelesen und jeder weitere Zugriff wird blockiert, sobald das neue Label greift. Wenn man die Richtlinie via man:sysctl[8] ausschaltet, sollte es erstmal wieder gehen.
diff --git a/documentation/content/de/books/handbook/mail/_index.adoc b/documentation/content/de/books/handbook/mail/_index.adoc
new file mode 100644
index 0000000000..4fefe36a7a
--- /dev/null
+++ b/documentation/content/de/books/handbook/mail/_index.adoc
@@ -0,0 +1,954 @@
+---
+title: Kapitel 28. Elektronische Post (E-Mail)
+part: Teil IV. Netzwerke
+prev: books/handbook/ppp-and-slip
+next: books/handbook/network-servers
+---
+
+[[mail]]
+= Elektronische Post (E-Mail)
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 28
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/mail/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/mail/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/mail/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[mail-de-term]]
+== Terminologie
+
+Das Akronym _MTA_ steht für _Mail Transfer Agent_ was übersetzt "Mailübertragungs-Agent" bedeutet.
+
+Während die Bezeichnung _Server-Dämon_ die Komponente eines MTA benennt, die für eingehende Verbindungen zuständig ist, wird mit dem Begriff _Mailer_ öfters die Komponente des MTA bezeichnet, die E-Mails versendet.
+
+[[mail-synopsis]]
+== Übersicht
+
+"Elektronische Post", besser bekannt als E-Mail, ist eine der am weit verbreitetsten Formen der Kommunikation heutzutage. Dieses Kapitel bietet eine grundlegende Einführung in das Betreiben eines E-Mail-Servers unter FreeBSD. Ebenfalls wird der Versand und Empfang von E-Mails unter FreeBSD behandelt. Eine umfassende Betrachtung zu diesem Thema finden Sie in den Büchern, die in crossref:bibliography[bibliography,Bibliografie] aufgelistet sind.
+
+Dieses Kapitel behandelt die folgenden Punkte:
+
+* Welche Software-Komponenten beim Senden und Empfangen von elektronischer Post involviert sind.
+* Wo sich grundlegende Sendmail Konfigurationsdateien in FreeBSD befinden.
+* Den Unterschied zwischen entfernten und lokalen Postfächern.
+* Wie man Versender von Spam daran hindern kann, E-Mail-Server illegalerweise als Weiterleitung zu verwenden.
+* Wie man einen alternativen MTA installiert und konfiguriert, um Sendmail zu ersetzen.
+* Wie man oft auftretende E-Mail-Server Probleme behebt.
+* Wie E-Mails über einen Relay verschickt werden.
+* Wie E-Mails über eine Einwahlverbindung gehandhabt werden.
+* Wie SMTP-Authentifizierung einrichtet wird.
+* Den Empfang und den Versand von E-Mails mithilfe von Programmen wie mutt.
+* Wie E-Mails von einem entfernten Server mit POP oder IMAP abgeholt werden.
+* Wie eingehende E-Mail automatisch gefiltert wird.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie:
+
+* Die Netzwerk-Verbindung richtig einrichten. (crossref:advanced-networking[advanced-networking,Weiterführende Netzwerkthemen]).
+* Die DNS-Information für einen E-Mail-Server einstellen (crossref:network-servers[network-servers,Netzwerkserver]).
+* Wissen, wie man zusätzliche Dritthersteller-Software installiert (crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports]).
+
+[[mail-using]]
+== E-Mail Komponenten
+
+Es gibt fünf größere Komponenten die am Austausch von E-Mails beteiligt sind: der Mail User Agent (MUA), der Mail Transfer Agent (MTA), der Mail Host, ein entferntes oder lokales Postfach, sowie DNS. Dieser Abschnitt enthält eine Übersicht über diese Komponenten.
+
+Mail User Agent (MUA)::
+Der Mail User Agent (MUA) ist das Benutzerprogramm zum Verfassen, Senden und Empfangen von E-Mails. Diese Anwendung kann ein Kommandozeilenprogramm sein, wie das in FreeBSD enthaltene Programm `mail`, oder ein Programm aus der Ports-Sammlung wie beispielsweise mutt, alpine oder elm. In der Ports-Sammlung sind auch dutzende von grafischen Programmen verfügbar, darunter ClawsMail, Evolution und Thunderbird. Einige Unternehmen bieten auch ein Web-Mail-Programm an, das über einen Webbrowser verwaltet werden kann. Weitere Informationen zur Installation und Verwendung von MUAs unter FreeBSD finden Sie im <<mail-agents>>.
+
+Mail Transfer Agent (MTA)::
+Der Mail Transfer Agent (MTA) ist ein E-Mail-Server Daemon, welcher für dem Empfang von eingehenden E-Mails und für den Versand von ausgehenden E-Mails verantwortlich ist. FreeBSD wird mit Sendmail als Standard-MTA ausgeliefert, aber es unterstützt auch weitere E-Mail-Server, darunter Exim, Postfix und qmail. Die Konfiguration von Sendmail wird im <<sendmail>> beschrieben. Wenn Sie einen anderen MTA aus der Ports-Sammlung installieren, lesen Sie die Nachrichten die nach der Installation der Anwendung ausgegeben werden, wenn Sie FreeBSD spezifische Informationen benötigen. Allgemeine Informationen zur Konfiguration finden Sie in der Regel auf der Webseite des Herstellers.
+
+Mail Host und Postfächer::
+Der Mail Host ist für die Zustellung und das Empfangen von E-Mails für den Rechner oder eines Netzwerks zuständig. Der Mail Host empfängt alle E-Mails für eine Domäne und speichert diese entweder im voreingestellten [.filename]#mbox#-Format, oder im Maildir-Format. Diese E-Mails können lokal mit einem Benutzerprogramm MUA gelesen werden. Mithilfe von Protokollen wie POP oder IMAP können die E-Mails auch von entfernten Rechnern gelesen werden. Wenn die E-Mails direkt auf dem Mail Host gelesen werden, wird kein POP- oder IMAP-Server benötigt.
++
+Um auf entfernte Postfächer zuzugreifen, wird ein Zugang zu einem POP- oder IMAP-Server benötigt. Beide Protokolle ermöglichen es Benutzern, auf ein entferntes Postfach zuzugreifen. IMAP bietet gegenüber POP einige Vorteiler. Dazu zählt die Fähigkeit eine Kopie aller Nachrichten auf einem entfernten Server zu speichern, sowie gleichzeitig ablaufende Aktualisierungen. IMAP kann auch über langsame Verbindungen nützlich sein, da nicht gleich die komplette Nachricht heruntergeladen wird. Weiterhin können E-Mails auf dem Server durchsucht werden, was den Datenverkehr zwischen Clients und dem Server minimiert.
++
+Die Ports-Sammlung enthält einige POP- und IMAP-Server, darunter package:mail/qpopper[], package:mail/imap-uw[], package:mail/courier-imap[] und package:mail/dovecot2[].
++
+[WARNING]
+====
+
+Beachten Sie, dass sowohl POP als auch IMAP Daten, wie den Benutzernamen und das Passwort, im Klartext übertragen. Um die Übermittlung von Daten über diese Protokolle zu schützen, können Sie Sitzungen über man:ssh[1] (crossref:security[security-ssh-tunneling,"SSH-Tunnel"]) tunneln oder SSL (crossref:security[openssl,"OpenSSL"]) verwenden.
+====
+
+Domain Name System (DNS)::
+Das Domain Name System (DNS) und sein Daemon `named` spielen eine große Rolle bei der Auslieferung von E-Mails. Um E-Mails auszuliefern, fragt der MTA im DNS den Rechner ab, der E-Mails für das Zielsystem entgegennimmt. Der gleiche Vorgang läuft ab, wenn eine E-Mail von einem entfernten Server zum MTA zugestellt wird.
++
+Im DNS werden Rechnernamen auf IP-Adressen abgebildet. Daneben werden spezielle Informationen für das Mail-System gespeichert, die _MX-Einträge_ (MX record) genannt werden. Der MX-Eintrag (von Mail eXchanger) gibt an, welche Rechner E-Mails für eine Domäne annehmen.
++
+Mit man:host[1] können die MX-Einträge für eine Domäne abgefragt werden:
++
+
+[source,bash]
+....
+# host -t mx FreeBSD.org
+FreeBSD.org mail is handled by 10 mx1.FreeBSD.org
+....
++
+Weitere Informationen zu DNS und dessen Konfiguration finden Sie im crossref:network-servers[network-dns,"Domain Name System (DNS)"].
+
+[[sendmail]]
+== Sendmail-Konfigurationsdateien
+
+Sendmail ist der standardmäßig in FreeBSD installierte MTA. Es nimmt E-Mails von E-Mail-Benutzerprogrammen (MUA) entgegen und liefert diese zu den entsprechenden Mail Hosts, die in der Konfigurationsdatei definiert sind. Sendmail kann auch Netzwerkverbindungen annehmen und E-Mails an lokale _Mailboxen_, oder an andere Programme ausliefern.
+
+Die Konfigurationsdateien von Sendmail befinden sich in [.filename]#/etc/mail#. In diesem Abschnitt werden diese Dateien im Detail beschrieben.
+
+[.filename]#/etc/mail/access#::
+Diese Datenbank bestimmt, welche Rechner oder IP-Adressen Zugriff auf den lokalen Mail-Server haben und welche Art von Zugriff ihnen gestattet wird. Rechner die als `OK` aufgelistet sind, was der Standard ist, sind berechtigt E-Mails zu diesem Rechner zu schicken, solange die endgültige Zieladresse der lokale Rechner ist. Rechner die als `REJECT` aufgelistet sind, werden abgelehnt. Rechner die als `RELAY` aufgelistet sind, wird es erlaubt Post für jede Zieladresse durch diesen Mail-Server zu senden. Rechner die als `ERROR` aufgelistet sind, bekommen ihre E-Mail mit einem speziellen Fehler zurück. Wenn ein Rechner als `SKIP` aufgelistet ist, wird Sendmail die aktuelle Suche abbrechen, ohne die E-Mail zu akzeptieren oder abzulehnen. E-Mails von Rechnern die als `QUARANTAINE` aufgelistet sind, werden vorerst zurückgehalten. Dem sendenden Rechner wird ein festgelegter Text als Grund für die Quarantäne zurückgeschickt.
++
+Beispiele für die Verwendung dieser Optionen für IPv4- und IPv6-Adressen finden Sie in der Beispielkonfiguration [.filename]#/etc/mail/access.sample#:
++
+[.programlisting]
+....
+# $FreeBSD$
+#
+# Mail relay access control list. Default is to reject mail unless the
+# destination is local, or listed in /etc/mail/local-host-names
+#
+## Examples (commented out for safety)
+#From:cyberspammer.com ERROR:"550 We don't accept mail from spammers"
+#From:okay.cyberspammer.com OK
+#Connect:sendmail.org RELAY
+#To:sendmail.org RELAY
+#Connect:128.32 RELAY
+#Connect:128.32.2 SKIP
+#Connect:IPv6:1:2:3:4:5:6:7 RELAY
+#Connect:suspicious.example.com QUARANTINE:Mail from suspicious host
+#Connect:[127.0.0.3] OK
+#Connect:[IPv6:1:2:3:4:5:6:7:8] OK
+....
++
+Um die Datenbank zu konfigurieren, verwenden Sie das im Beispiel gezeigte Format, um Einträge in [.filename]#/etc/mail/access# hinzuzufügen, aber setzen Sie kein Kommentarsymbol (`#`) vor die Einträge. Erstellen Sie einen Eintrag für jeden Rechner, dessen Zugriff konfiguriert werden soll. E-Mail-Versender, die mit der linken Spalte der Tabelle übereinstimmen, sind betroffen von der Aktion in der rechten Spalte.
++
+Immer wenn diese Datei verändert wurde, muss die Datenbank aktualisiert und Sendmail neu gestartet werden:
++
+[source,bash]
+....
+# makemap hash /etc/mail/access < /etc/mail/access
+# service sendmail restart
+....
+
+[.filename]#/etc/mail/aliases#::
+Diese Datenbank enthält eine Liste der virtuellen Mailboxen, die in andere Benutzer, Dateien, Programme oder andere Aliase expandiert werden. Hier sind ein paar Beispiele, die das Dateiformat verdeutlichen:
++
+[.programlisting]
+....
+root: localuser
+ftp-bugs: joe,eric,paul
+bit.bucket: /dev/null
+procmail: "|/usr/local/bin/procmail"
+....
++
+Der Name der Mailbox auf der linken Seite des Doppelpunkts wird mit den Zielen auf der rechten Seite ersetzt. Der erste Eintrag ersetzt die Mailbox `root` mit der Mailbox `localuser`, die dann in der Datenbank [.filename]#/etc/mail/aliases# gesucht wird. Wird kein passender Eintrag gefunden, wird die Nachricht zum `localuser` geliefert. Der zweite Eintrag zeigt eine E-Mail-Verteilerliste. E-Mails an `ftp-bugs` werden zu den drei lokalen Mailboxen `joe`, `eric` und `paul` gesendet. Eine entfernte Mailbox kann auch als _user@example.com_ angegeben werden. Der dritte Eintrag zeigt wie E-Mails in eine Datei geschrieben werden, in diesem Fall [.filename]#/dev/null#. Der letzte Eintrag verdeutlicht das Senden von E-Mails an ein Programm. Hier wird die Nachricht über eine UNIX(R) Pipe an [.filename]#/usr/local/bin/procmail# gesendet. Weitere Informationen zu dem Format dieser Datei finden Sie in man:aliases[5].
++
+Wenn diese Datei geändert wird, muss `newaliases` ausgeführt werden, um die Datenbank zu aktualisieren.
+
+[.filename]#/etc/mail/sendmail.cf#::
+Dies ist die Hauptkonfigurations-Datei von Sendmail. Sie kontrolliert das allgemeine Verhalten von Sendmail, einschließlich allem vom Umschreiben von E-Mail Adressen bis hin zum Übertragen von Ablehnungsnachrichten an entfernte E-Mail-Server. Dementsprechend ist die Konfigurationsdatei ziemlich komplex. Glücklicherweise muss diese Datei selten für Standard E-Mail-Server geändert werden.
++
+Die Sendmail Hauptkonfigurationsdatei kann mit man:m4[1] Makros erstellt werden, die Eigenschaften und Verhalten von Sendmail definieren. Einige der Details finden Sie in [.filename]#/usr/src/contrib/sendmail/cf/README#.
++
+Wenn Änderungen an dieser Datei vorgenommen werden, muss Sendmail neu gestartet werden, damit die Änderungen Wirkung zeigen.
+
+[.filename]#/etc/mail/virtusertable#::
+Diese Datenbank ordnet Adressen für virtuelle Domänen und Benutzern reellen Mailboxen zu. Diese Mailboxen können lokal, auf entfernten Systemen, Aliase in [.filename]#/etc/mail/aliases# oder eine Datei sein. Dadurch können mehrere virtuelle Domains auf einem Rechner gehostet werden.
++
+FreeBSD enthält eine Beispielkonfiguration in [.filename]#/etc/mail/virtusertable.sample#, die das Format genauer beschreibt. Das folgende Beispiel zeigt, wie benutzerdefinierte Einträge in diesem Format erstellt werden:
++
+[.programlisting]
+....
+root@example.com root
+postmaster@example.com postmaster@noc.example.net
+@example.com joe
+....
++
+Diese Datei wird nach dem ersten übereinstimmenden Eintrag durchsucht. Wenn eine E-Mail-Adresse mit der Adresse auf der linken Seite übereinstimmt, wird sie dem Eintrag auf der rechten Seite zugeordnet. Der erste Eintrag in diesem Beispiel ordnet eine bestimmte E-Mail-Adresse einer lokalen Mailbox zu, während der zweite Eintrag eine bestimmte E-Mail-Adresse einer entfernten Mailbox zuordnet. Zuletzt wird jede E-Mail-Adresse von `example.com`, welche nicht mit einem der vorherigen Einträge übereinstimmt, mit dem letzten Eintrag übereinstimmen und der lokalen Mailbox `joe` zugeordnet. Benutzen Sie dieses Format, wenn Sie neue Einträge in [.filename]#/etc/mail/virtusertable# hinzufügen. Jedes Mal, wenn diese Datei bearbeitet wurde, muss die Datenbank aktualisiert und Sendmail neu gestartet werden:
++
+[source,bash]
+....
+# makemap hash /etc/mail/virtusertable < /etc/mail/virusertable
+# service sendmail restart
+....
+
+[.filename]#/etc/mail/relay-domains#::
+In der standardmäßigen FreeBSD-Installation wird Sendmail nur dazu konfiguriert, E-Mails von dem Rechner, auf dem es läuft, zu senden. Wenn zum Beispiel ein POP-Server installiert ist, können Benutzer ihre E-Mails von entfernten Standorten überprüfen. Sie werden jedoch keine E-Mails von außen verschicken können. Typischerweise wird ein paar Sekunden nach dem Versuch eine E-Mail von MAILER-DAEMON mit einer `5.7 Relaying Denied` Fehlermeldung versendet werden.
++
+Die einfachste Lösung ist, wie im folgenden Beispiel gezeigt, den FQDN des Internet-Dienstanbieters und gegebenenfalls weitere Adressen in [.filename]#/etc/mail/relay-domains# einzutragen:
++
+[.programlisting]
+....
+your.isq.example.com
+other.isp.example.net
+users.isp.example.org
+www.example.org
+....
++
+Nachdem diese Datei erstellt oder editiert wurde, muss Sendmail mittels `service sendmail restart` neu gestartet werden.
++
+Ab jetzt wird jede E-Mail, die von einem in der Liste eingetragenen Rechner durch das System geschickt wird, ihr Ziel erreichen, vorausgesetzt der Benutzer hat einen Account auf dem System. Dies erlaubt es Benutzern aus der Ferne, E-Mails über das System zu versenden, ohne dem Massenversand (SPAM) die Tür zu öffnen.
+
+[[mail-changingmta]]
+== Wechseln des Mailübertragungs-Agenten
+
+FreeBSD enthält mit Sendmail bereits einen MTA, der für die ein- und ausgehenden E-Mails verantwortlich ist. Der Systemadministrator kann aber den MTA des Systems wechseln. Eine große Auswahl an alternativen MTAs ist in der Kategorie `mail` der FreeBSD Ports-Sammlung verfügbar.
+
+Sobald ein neuer MTA installiert ist, können Sie die neue Software konfigurieren und testen, bevor Sie Sendmail ersetzen. Informationen über die Konfiguration des neu gewählten MTA finden Sie in der dazugehörigen Dokumentation.
+
+Sobald der neue MTA wie gewünscht funktioniert, benutzen Sie die Anweisungen in diesem Abschnitt, um Sendmail zu deaktivieren und stattdessen den neuen MTA zu verwenden.
+
+[[mail-disable-sendmail]]
+=== Sendmail deaktivieren
+
+[WARNING]
+====
+
+Wenn der ausgehende Mail-Dienst von Sendmail deaktiviert ist, muss für den E-Mail-Versand ein alternatives System installiert werden. Andernfalls sind Systemfunktionen wie man:periodic[8] nicht mehr in der Lage, ihre Resulate und Meldungen als E-Mail zu versenden. Aber auch viele andere Teile des Systems erwarten einen funktionalen MTA. Sind Programme auf die deaktivierten Sendmail-Binärdateien angewiesen, landen deren E-Mails ansonsten in einer inaktiven Sendmail-Warteschlange und können nicht ausgeliefert werden.
+====
+
+Um Sendmail komplett zu deaktivieren, müssen folgende Zeilen in [.filename]#/etc/rc.conf# hinzugefügt oder editiert werden:
+
+[.programlisting]
+....
+sendmail_enable="NO"
+sendmail_submit_enable="NO"
+sendmail_outbound_enable="NO"
+sendmail_msp_queue_enable="NO"
+....
+
+Um lediglich die Funktion zum Empfang von E-Mails durch Sendmail zu deaktivieren, muss folgender Eintrag in [.filename]#/etc/rc.conf# gesetzt werden:
+
+[.programlisting]
+....
+sendmail_enable="NO"
+....
+
+Weitere Informationen zu den Startoptionen von Sendmail finden Sie in der Manualpage man:rc.sendmail[8].
+
+=== Den voreingestellten MTA ersetzen
+
+Wenn ein neuer MTA über die Ports-Sammlung installiert wird, werden auch die Startskripten installiert. Die Anweisungen zum starten dieser Skripte werden in den Paketnachrichten erwähnt. Bevor Sie den neuen MTA in Betrieb nehmen, stoppen Sie alle laufenden Sendmail-Prozesse. In diesem Beispiel werden alle notwendigen Dienste gestoppt und danach der Postfix Dienst gestartet:
+
+[source,bash]
+....
+# service sendmail stop
+# service postfix start
+....
+
+Damit der angegebene MTA automatisch beim Hochfahren des Systems gestartet wird, fügen Sie dessen Konfigurationszeile in [.filename]#/etc/rc.conf# hinzu. Dieser Eintrag startet den PostfixMTA:
+
+[.programlisting]
+....
+postfix_enable="YES"
+....
+
+Da Sendmail allgegenwärtig ist und manche Anwendungen einfach davon ausgehen es bereits installiert und konfiguriert, wird einige zusätzliche Konfiguration benötigt. Überprüfen Sie [.filename]#/etc/periodic.conf# und stellen Sie sicher, dass diese Werte auf `NO` gesetzt werden. Wenn die Datei nicht existiert, erstellen Sie sie mit folgenden Einträgen:
+
+[.programlisting]
+....
+daily_clean_hoststat_enable="NO"
+daily_status_mail_enable="NO"
+daily_status_include_submit_mailq="NO"
+daily_submit_queuerun="NO"
+....
+
+Viele alternative MTAs stellen ihre eigenen kompatiblen Implementierungen der Sendmail Kommandozeilen-Schnittstelle zur Verfügung, was die Verwendung als "drop-in" Ersatz für Sendmail vereinfacht. Allerdings versuchen einige MUAs Sendmails Standard-Dateien auszuführen, anstelle der Dateien des neuen MTAs. FreeBSD verwendet [.filename]#/etc/mail/mailer.conf# um die erwarteten Sendmail Dateien auf die neuen Dateien abzubilden. Weitere Informationen über diese Zuordnungen können in man:mailwrapper[8] gefunden werden.
+
+In der Voreinstellung sieht [.filename]#/etc/mail/mailer.conf# wie folgt aus:
+
+[.programlisting]
+....
+# $FreeBSD$
+#
+# Execute the "real" sendmail program, named /usr/libexec/sendmail/sendmail
+#
+sendmail /usr/libexec/sendmail/sendmail
+send-mail /usr/libexec/sendmail/sendmail
+mailq /usr/libexec/sendmail/sendmail
+newaliases /usr/libexec/sendmail/sendmail
+hoststat /usr/libexec/sendmail/sendmail
+purgestat /usr/libexec/sendmail/sendmail
+....
+
+Wenn eines der Kommandos auf der linken Seite ausgeführt werden soll, führt das System tatsächlich den damit verbundenen Befehl auf der rechten Seite aus. Mit diesem System lassen sich Programme, die für die Sendmail-Funktionen gestartet werden, leicht ändern.
+
+Einige MTAs aus der Ports-Sammlung können diese Datei aktualisieren. Zum Beispiel würde Postfix die Datei wie folgt aktualisieren:
+
+[.programlisting]
+....
+#
+# Execute the Postfix sendmail program, named /usr/local/sbin/sendmail
+#
+sendmail /usr/local/sbin/sendmail
+send-mail /usr/local/sbin/sendmail
+mailq /usr/local/sbin/sendmail
+newaliases /usr/local/sbin/sendmail
+....
+
+Falls die Installation des MTA nicht automatisch [.filename]#/etc/mail/mailer.conf# aktualisiert, bearbeiten Sie diese Datei in einem Texteditor, so dass auf die neuen Dateien verwiesen wird. Dieses Beispiel zeigt auf die Dateien, die von package:mail/ssmtp[] installiert wurden:
+
+[.programlisting]
+....
+sendmail /usr/local/sbin/ssmtp
+send-mail /usr/local/sbin/ssmtp
+mailq /usr/local/sbin/ssmtp
+newaliases /usr/local/sbin/ssmtp
+hoststat /usr/bin/true
+purgestat /usr/bin/true
+....
+
+Sobald alles konfiguriert ist, wird empfohlen, das System neu zu starten. Ein Neustart bietet auch die Möglichkeit sicherzustellen, dass das System korrekt konfiguriert wurde, um den neuen MTA automatisch beim Hochfahren zu starten.
+
+[[mail-trouble]]
+== Fehlerbehebung
+
+Hier finden sich ein paar häufig gestellte Fragen und ihre Antworten, die von der link:{faq}[FAQ] übernommen wurden.
+
+=== Warum muss ich einen FQDN (fully-qualified domain name / voll ausgeschriebenen Domänennamen) für meine Rechner verwenden?
+
+Vielleicht befindet sich der Rechner in einer anderen Domäne. Um beispielsweise von einem Rechner in `foo.bar.edu` einen Rechner namens `mumble` in der Domäne `foo.bar.edu` zu erreichen, geben Sie seinen voll ausgeschriebenen Domänennamen (FQDN) `mumble.bar.edu`, anstelle von `mumble` an.
+
+Das liegt daran, dass die aktuelle Version von BIND, die mit FreeBSD ausgeliefert wird, keine Standardabkürzungen für nicht komplett angegebene Domänennamen außerhalb der lokalen Domäne unterstützt. Daher muss ein nicht-qualifizierter Rechner, wie `mumble`, entweder als `mumble.foo.bar.edu` gefunden werden, oder er wird in der root Domäne gesucht.
+
+In älteren Versionen von BIND lief die Suche über `mumble.bar.edu` und `mumble.edu`. RFC 1535 erklärt, warum dieses Verhalten als schlechte Praxis oder sogar als Sicherheitsloch angesehen wird.
+
+Um das zu umgehen, setzen Sie die Zeile:
+
+[.programlisting]
+....
+search foo.bar.edu bar.edu
+....
+
+anstatt der vorherigen
+
+[.programlisting]
+....
+domain foo.bar.edu
+....
+
+in [.filename]#/etc/resolv.conf# ein. Stellen Sie jedoch sicher, dass die Suchordnung nicht die Begrenzung von "lokaler und öffentlicher Administration", wie RFC 1535 sie nennt, überschreitet.
+
+=== Wie kann ich einen E-Mail-Server auf einem Anwahl-PPPPPP Rechner betreiben?
+
+Sie wollen sich mit einem FreeBSD E-Mail Gateway im LAN verbinden. Die PPP-Verbindung ist keine Standleitung.
+
+Ein Weg dies zu tun ist, von einem immer mit dem Internet verbundenen Server einen sekundären MX-Dienst für die Domäne zur Verfügung gestellt zu bekommen. In diesem Beispiel heißt die Domäne `example.com`, und der Internet-Dienstanbieter hat `example.net` so eingestellt, dass er für die Domäne einen sekundären MX-Dienst zur Verfügung stellt:
+
+[.programlisting]
+....
+example.com. MX 10 bigco.com.
+ MX 20 example.net.
+....
+
+Nur ein Rechner sollte als Endempfänger angegeben sein. Sendmail fügen Sie `Cw example.com` zu [.filename]#/etc/sendmail.cf# auf `example.com` hinzu.
+
+Wenn der MTA des Versenders versucht die E-Mail zuzustellen, wird es versuchen das System `example.com` über die PPP-Verbindung zu erreichen. Es kommt zu einer Zeitüberschreitung, wenn das Zielsystem offline ist. Der MTA wird die E-Mail automatisch der sekundären MX-Seite des Internet-Providers `example.net` zustellen. Die sekundäre MX-Seite wird periodisch versuchen, eine Verbindung zur primären MX-Seite `example.com` aufzubauen.
+
+Verwenden Sie etwas wie dies als Login-Skript:
+
+[.programlisting]
+....
+#!/bin/sh
+# Put me in /usr/local/bin/pppmyisp
+( sleep 60 ; /usr/sbin/sendmail -q ) &
+/usr/sbin/ppp -direct pppmyisp
+....
+
+Wenn Sie ein separates Login-Skript für einen Benutzer erstellen, benutzen Sie stattdessen `sendmail -qRexample.com` in dem oben gezeigten Skript. Das erzwingt die sofortige Verarbeitung der E-Mails in der Warteschlange für `example.com`
+
+Eine weitere Verfeinerung der Situation kann an diesem Beispiel von {freebsd-isp} entnommen werden:
+
+[.programlisting]
+....
+> wir stellen einem Kunden den sekundären MX zur Verfügung.
+> Der Kunde verbindet sich mit unseren Diensten mehrmals am Tag
+> automatisch um die E-Mails zu seinem primären MX zu holen
+> (wir wählen uns nicht bei ihm ein, wenn E-Mails für seine
+> Domäne eintreffen). Unser sendmail sendet den Inhalt der
+> E-Mail-Warteschlange alle 30 Minuten. Momentan muss er 30 Minuten
+> eingewählt bleiben um sicher zu sein, dass alle seine E-Mails
+> beim primären MX eingetroffen sind.
+>
+> Gibt es einen Befehl, der sendmail dazu bringt, alle E-Mails sofort
+> zu senden? Der Benutzer hat natürlich keine root-Rechte auf
+> unserer Maschine.
+
+In der privacy flags Sektion von sendmail.cf befindet sich die
+Definition Opgoaway,restrictqrun
+
+Entferne restrictqrun um nicht-root Benutzern zu erlauben, die Verarbeitung
+der Nachrichten-Warteschlangen zu starten. Möglicherweise willst du
+auch die MX neu sortieren. Wir sind der primäre MX für unsere
+Kunden mit diesen Wünschen und haben definiert:
+
+# Wenn wir der beste MX für einen Rechner sind, versuche es direkt
+# anstatt einen lokalen Konfigurationsfehler zu generieren.
+OwTrue
+
+Auf diesem Weg liefern Gegenstellen direkt zu dir, ohne die Kundenverbindung
+zu versuchen. Dann sendest du zu deinem Kunden. Das funktioniert nur
+für Rechner, du musst also deinen Kunden dazu bringen,
+ihre E-Mail Maschine customer.com zu nennen, sowie
+hostname.customer.com im DNS. Setze einfach einen A-Eintrag
+in den DNS für customer.com.
+....
+
+[[mail-advanced]]
+== Weiterführende Themen
+
+Dieser Abschnitt behandelt kompliziertere Themen wie E-Mail-Konfiguration und Einrichtung von E-Mail für eine ganze Domäne.
+
+[[mail-config]]
+=== Grundlegende Konfiguration
+
+Mit der Software im Auslieferungszustand sollte es möglich sein, E-Mails an externe Rechner zu senden, vorausgesetzt [.filename]#/etc/resolv.conf# ist konfiguriert, oder das Netzwerk hat Zugriff auf einen konfigurierten DNS-Server. Um E-Mails an den MTA auf dem Rechner auszuliefern, stehen zwei Möglichkeiten zur Auswahl:
+
+* Betreiben Sie einen DNS-Server für die Domäne.
+* Lassen Sie die E-Mails direkt über den FQDN des Rechners ausliefern.
+
+Um E-Mails direkt zu einem Rechner geliefert zu bekommen, wird eine permanente statische IP-Adresse (keine dynamische IP-Adresse) benötigt. Befindet sich das System hinter einer Firewall, muss diese den SMTP-Verkehr weiterleiten. Um E-Mails direkt am Rechner zu empfangen, muss eines der folgenden Dinge konfiguriert werden:
+
+* Vergewissern Sie sich, dass der MX-Eintrag mit der kleinsten Nummer im DNS auf die statische IP-Adresse des Rechners zeigt.
+* Stellen Sie sicher, dass für den Rechner kein MX-Eintrag im DNS existiert.
+
+Jede der erwähnten Konfigurationsmöglichkeiten erlaubt es, E-Mails direkt auf dem Rechner zu empfangen.
+
+Versuchen Sie das:
+
+[source,bash]
+....
+# hostname
+example.FreeBSD.org
+
+# host example.FreeBSD.org
+example.FreeBSD.org has address 204.216.27.XX
+....
+
+In diesem Beispiel sollte es funktionieren, E-Mails direkt an mailto:yourlogin@example.FreeBSD.org[yourlogin@example.FreeBSD.org] zu senden, vorausgesetzt dass Sendmail auf `example.FreeBSD.org` korrekt läuft.
+
+In diesem Beispiel:
+
+[source,bash]
+....
+# host example.FreeBSD.org
+example.FreeBSD.org has address 204.216.27.XX
+example.FreeBSD.org mail is handled (pri=10) by devnull.FreeBSD.org
+....
+
+Hier wird jede an den Rechner `example.FreeBSD.org` gesandte E-Mail auf `hub` unter dem gleichen Benutzernamen gesammelt, anstatt diese direkt zu Ihrem Rechner zu senden.
+
+Die obige Information wird von einem DNS-Server verwaltet. Der DNS-Eintrag, der die Information zum E-Mail-Routing enthält, ist der MX-Eintrag. Existiert kein MX-Eintrag, werden E-Mails direkt über die IP-Adresse an den Rechner geliefert.
+
+Der MX-Eintrag für `freefall.FreeBSD.org` sah einmal so aus:
+
+[.programlisting]
+....
+freefall MX 30 mail.crl.net
+freefall MX 40 agora.rdrop.com
+freefall MX 10 freefall.FreeBSD.org
+freefall MX 20 who.cdrom.com
+....
+
+`freefall` hatte viele MX-Einträge. Die kleinste MX-Nummer definiert de Rechner, der die E-Mails direkt empfängt, wobei die anderen Rechner temporär E-Mails in Warteschlangen einreihen, falls `freefall` beschäftigt oder unerreichbar ist.
+
+Es ist sehr sinnvoll, dass stellvertretende MX-Seiten separate Internet-Verbindungen verwenden. Ihr ISP kann diesen Dienst zur Verfügung stellen.
+
+[[mail-domain]]
+=== E-Mails für eine Domäne
+
+Wird ein MTA für ein Netzwerk konfiguriert, dann sollte jede E-Mail die an einen Rechner in dieser Domäne geschickt wird, an den MTA umgeleitet werden, damit die Benutzer ihre E-Mails vom zentralen Mail-Server empfangen können.
+
+Am einfachsten ist es, wenn Accounts mit gleichen _Benutzernamen_ sowohl auf dem MTA, als auch auf dem System mit dem MUA existieren. Verwenden Sie man:adduser[8], um Benutzerkonten anzulegen.
+
+Der MTA muss auf jeder Workstation im Netzwerk als der zuständige Rechner für den E-Mail-Austausch gekennzeichnet werden. Dies wird in der DNS-Konfiguration über den MX-Eintrag gesteuert:
+
+[.programlisting]
+....
+example.FreeBSD.org A 204.216.27.XX ; Workstation
+ MX 10 devnull.FreeBSD.org ; Mailhost
+....
+
+Diese Einstellung wird E-Mails für die Workstations zum MTA weiterleiten, egal wo der A-Eintrag hinzeigt. Die E-Mails werden zum MX-Rechner gesendet.
+
+Diese Einstellung muss auf dem DNS-Server konfiguriert werden. Besitzt das Netzwerk keinen eigenen DNS-Server, kontaktieren Sie Ihren ISP oder DNS-Verwalter.
+
+Im Folgenden ist ein Beispiel für virtuelles E-Mail-Hosting. Nehmen wir an, dass für einen Kunden mit der Domäne `customer1.org`, alle E-Mails für `customer1.org` an `mail.myhost.com` gesendet werden sollen. Der entsprechende DNS-Eintrag sollte wie folgt aussehen:
+
+[.programlisting]
+....
+customer1.org MX 10 mail.myhost.com
+....
+
+Wenn für die Domäne nur E-Mails verarbeitet werden sollen, wird für `customer1.org` _kein_ `A`-Eintrag benötigt. Allerdings wird ein `ping` gegen `customer1.org` nur dann funktionieren, wenn ein `A`-Eintrag existiert.
+
+Teilen Sie dem MTA mit, für welche Domänen bzw. Hostnamen Post entgegengenommen werden soll. Die beiden folgenden Methoden funktionieren für Sendmail:
+
+* Fügen Sie die Rechnernamen in [.filename]#/etc/mail/local-host-names# hinzu, wenn `FEATURE(use_cw_file)` verwendet wird.
+* Fügen Sie eine Zeile `Cwyour.host.com` in [.filename]#/etc/sendmail.cf# hinzu.
+
+[[outgoing-only]]
+== Ausgehende E-Mail über einen Relay versenden
+
+In vielen Fällen möchte man E-Mail nur über einen Relay verschicken. Zum Beispiel:
+
+* Der Rechner ist ein Arbeitsplatzrechner und benutzt Programme wie man:mail[1] über ein Relay des ISP.
+* Ein Server, der E-Mails nicht selbst verarbeitet, soll alle E-Mails zu einem Relay schicken.
+
+Obwohl jeder MTA diese Aufgabe erfüllen kann, ist es oft schwierig einen vollwertigen MTA so zu konfigurieren, dass er lediglich ausgehende E-Mails weiterleitet. Es ist übertrieben, Programme wie Sendmail und Postfix nur für diesen Zweck einzusetzen.
+
+Weiterhin kann es sein, dass die Bestimmungen des Internetzugangs es verbieten, einen eigenen Mail-Server zu betreiben.
+
+Um die hier beschriebenen Anforderungen zu erfüllen, installieren Sie einfach den Port package:mail/ssmtp[]:
+
+[source,bash]
+....
+# cd /usr/ports/mail/ssmtp
+# make install replace clean
+....
+
+Nach der Installation kann package:mail/ssmtp[] über [.filename]#/usr/local/etc/ssmtp/ssmtp.conf# konfiguriert werden:
+
+[.programlisting]
+....
+root=yourrealemail@example.com
+mailhub=mail.example.com
+rewriteDomain=example.com
+hostname=_HOSTNAME_
+....
+
+Verwenden Sie eine gültige E-Mail-Adresse für `root`. Geben Sie für `mail.example.com` den Mail-Relay des ISPs an. Einige ISPs nennen den Relay "Postausgangsserver" oder "SMTP-Server".
+
+Deaktivieren Sie Sendmail, einschließlich des Services für den Postausgang. Details finden Sie in <<mail-disable-sendmail>>.
+
+package:mail/ssmtp[] verfügt über weitere Optionen. Die Beispiele in [.filename]#/usr/local/etc/ssmtp# oder die Manualpage von ssmtp enthalten weitere Informationen.
+
+Wird ssmtp wie hier beschrieben eingerichtet, können Anwendungen E-Mails von dem lokalen Rechner verschicken. Man verstößt damit auch nicht gegen Bestimmungen des ISPs und läuft nicht Gefahr, dass der Rechner zum Versenden von Spam missbraucht wird.
+
+[[SMTP-dialup]]
+== E-Mail über Einwahl-Verbindungen
+
+Wird eine feste IP-Adresse verwendet, müssen die Standardeinstellungen wahrscheinlich gar nicht geändert werden. Stellen Sie den Hostnamen auf den entsprechend zugeordneten Internetnamen ein und Sendmail übernimmt das Übrige.
+
+Bei der Verwendung einer dynamisch zugewiesenen IP-Adresse und einer PPP-Wählverbindung mit dem Internet, hat man in der Regel ein Postfach auf dem Mailserver des ISP. In diesem Beispiel ist die Domäne des ISP `example.net`, der Benutzername ist `user`, der Rechnername ist `bsd.home` und der ISP erlaubt es, `relay.example.net` als Mail-Relayhost zu benutzen.
+
+Um Mails aus der Mailbox des ISPs abzuholen, muss ein gesondertes Programm aus der Ports-Sammlung installiert werden. package:mail/fetchmail[] ist eine gute Wahl, weil es viele verschiedene Protokolle unterstützt. Für gewöhnlich stellt der ISPPOP zur Verfügung. Falls User-PPP verwendet wird, können durch folgenden Eintrag in [.filename]#/etc/ppp/ppp.linkup# E-Mails automatisch abgerufen werden, sobald eine Verbindung zum Netz aufgebaut wird:
+
+[.programlisting]
+....
+MYADDR:
+!bg su user -c fetchmail
+....
+
+Wird Sendmail benutzt, um E-Mails an nicht-lokale Benutzer zu versenden, konfigurieren Sie es so, dass die Warteschlange abgearbeitet wird, sobald eine Verbindung mit dem Internet besteht. Um dies zu erreichen, müssen folgende Zeilen nach dem `fetchmail`-Eintrag in [.filename]#/etc/ppp/ppp.linkup# hinzugefügt werden.
+
+[.programlisting]
+....
+!bg su user -c "sendmail -q"
+....
+
+In diesem Beispiel existiert auf `bsd.home` ein Benutzer `user`. Erstellen Sie auf `bsd.home` im Heimatverzeichnis von `user` die Datei [.filename]#.fetchmailrc# mit folgender Zeile:
+
+[.programlisting]
+....
+poll example.net protocol pop3 fetchall pass MySecret;
+....
+
+Diese Datei sollte für niemandem außer `user` lesbar sein, weil sie das Passwort `MySecret` enthält.
+
+Um Mails mit dem richtigen `from:`-Header zu versenden, müssen Sie Sendmail so konfigurieren, dass es mailto:user@example.net[user@example.net] und nicht mailto:user@bsd.home[user@bsd.home] benutzen soll und das alle Mails über `relay.example.net` versendet werden, um eine schnellere Übertragung von Mails zu gewährleisten.
+
+Die folgende [.filename]#.mc# sollte ausreichen:
+
+[.programlisting]
+....
+VERSIONID(`bsd.home.mc version 1.0')
+OSTYPE(bsd4.4)dnl
+FEATURE(nouucp)dnl
+MAILER(local)dnl
+MAILER(smtp)dnl
+Cwlocalhost
+Cwbsd.home
+MASQUERADE_AS(`example.net')dnl
+FEATURE(allmasquerade)dnl
+FEATURE(masquerade_envelope)dnl
+FEATURE(nocanonify)dnl
+FEATURE(nodns)dnl
+define(`SMART_HOST', `relay.example.net')
+Dmbsd.home
+define(`confDOMAIN_NAME',`bsd.home')dnl
+define(`confDELIVERY_MODE',`deferred')dnl
+....
+
+Im vorherigen Abschnitt finden Sie Details dazu, wie Sie diese Datei in das Format [.filename]#sendmail.cf# konvertieren können. Vergessen Sie nicht, Sendmail neu zu starten, nachdem [.filename]#sendmail.cf# verändert wurde.
+
+[[SMTP-Auth]]
+== SMTP-Authentifizierung
+
+Die Konfiguration von SMTP-Authentifizierung auf dem MTA bietet einige Vorteile. Die erforderliche Authentifizierung erhöht die Sicherheit von Sendmail und mobilen Benutzern, die auf entfernten Rechnern arbeiten. Diese Benutzer können denselben MTA verwenden, ohne jedes Mal das Benutzerprogramm neu konfigurieren zu müssen.
+
+[.procedure]
+. Installieren Sie package:security/cyrus-sasl2[] aus der Ports-Sammlung. Dieser Port verfügt über einige Optionen, die während der Übersetzung festgelegt werden. Für die in diesem Abschnitt beschriebene Methode zur SMTP-Authentifizierung muss die Option `LOGIN` aktiviert werden.
+. Nach der Installation von package:security/cyrus-sasl2[] editieren Sie [.filename]#/usr/local/lib/sasl2/Sendmail.conf#. Erstellen Sie die Datei, wenn sie nicht existiert und fügen Sie die folgende Zeile hinzu:
++
+[.programlisting]
+....
+pwcheck_method: saslauthd
+....
+
+. Als nächstes installieren Sie package:security/cyrus-sasl2-saslauthd[], und fügen die folgende Zeile in [.filename]#/etc/rc.conf# ein:
++
+[.programlisting]
+....
+saslauthd_enable="YES"
+....
++
+Abschließend starten Sie den saslauthd-Dämon:
++
+[source,bash]
+....
+# service saslauthd start
+....
++
+Dieser Dämon agiert als Broker zwischen Sendmail und der FreeBSD-[.filename]#passwd#-Datenbank. Dadurch müssen zum Versenden von E-Mails keine zusätzlichen Accounts und Passwörter angelegt werden. Die Benutzer verwenden dasselbe Passwort zum Anmelden wie zum Verschicken von E-Mails.
+. Fügen Sie danach in [.filename]#/etc/make.conf# die folgenden Zeilen hinzu:
++
+[.programlisting]
+....
+SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL
+SENDMAIL_LDADD=/usr/local/lib/libsasl2.so
+....
++
+Beim Übersetzen von Sendmail werden damit die package:cyrus-sasl2[]-Bibliotheken benutzt. Stellen Sie daher vor dem Übersetzen von Sendmail sicher, dass package:cyrus-sasl2[] installiert ist.
+. Übersetzen Sie Sendmail mit den nachstehenden Kommandos:
++
+[source,bash]
+....
+# cd /usr/src/lib/libsmutil
+# make cleandir && make obj && make
+# cd /usr/src/lib/libsm
+# make cleandir && make obj && make
+# cd /usr/src/usr.sbin/sendmail
+# make cleandir && make obj && make && make install
+....
++
+Die Übersetzung sollte keine Probleme bereiten, wenn [.filename]#/usr/src# nicht umfangreich verändert wurde und die benötigten Bibliotheken installiert sind.
+. Nachdem Sendmail übersetzt und installiert wurde, editieren Sie [.filename]#/etc/mail/freebsd.mc# beziehungsweise die lokale [.filename]#.mc#-Datei. Viele Administratoren verwenden die Ausgabe von man:hostname[1], um der [.filename]#.mc# einen eindeutigen Namen zu geben. Fügen Sie die folgenden Zeilen hinzu:
++
+[.programlisting]
+....
+dnl set SASL options
+TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl
+define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl
+....
++
+Diese Anweisungen konfigurieren die Methoden, die Sendmail zur Authentifizierung von Benutzern verwendet. Lesen Sie die Sendmail Dokumentation, wenn eine andere Methode als `pwcheck` verwendet werden soll.
+. Abschließend rufen Sie man:make[1] in [.filename]#/etc/mail# auf. Damit wird aus der [.filename]#.mc#-Datei eine neue [.filename]#.cf#-Datei erzeugt. Der Name ist entweder [.filename]#freebsd.cf# oder der Name der lokalen [.filename]#.mc#-Datei. `make install restart` installiert die Datei nach [.filename]#/etc/mail/sendmail.cf# und startet Sendmail neu. Weitere Informationen zu diesem Vorgang entnehmen Sie bitte [.filename]#/etc/mail/Makefile#.
+
+Um die Konfiguration zu testen, verwenden Sie einen MUA, um eine Testnachricht zu senden. Mail-Benutzerprogramm das Passwort für die Authentifizierung ein und versenden Sie zum Testen eine E-Mail. Zur Fehlersuche, setzen Sie den `LogLevel` von Sendmail auf `13` und untersuchen die Fehlermeldungen in [.filename]#/var/log/maillog#.
+
+Weitere Information finden Sie unter http://www.sendmail.org/~ca/email/auth.html[ SMTP-Authentifizierung].
+
+[[mail-agents]]
+== E-Mail-Programme
+
+Anwendungen, die E-Mails versenden und empfangen, werden als E-Mail-Programme oder Mail-User-Agents (MUA) bezeichnet. Mit der Entwicklung und Ausbreitung von E-Mail wachsen auch die E-Mail-Programme und bieten Benutzern mehr Funktionen und höhere Flexibilität. Die Kategorie `mail` der FreeBSD Ports-Sammlung enthält zahlreiche E-Mail-Programme. Dazu gehören grafische Programme, wie beispielsweise Evolution oder Balsa und Konsolen basierte Programme wie mutt oder alpine.
+
+[[mail-command]]
+=== `mail`
+
+Das standardmäßig unter FreeBSD installierte E-Mail-Programm ist man:mail[1]. Das Programm ist konsolenorientiert und enthält alle Funktionen, die zum Versand und Empfang textbasierter E-Mails erforderlich sind. Es bietet eine begrenzte Unterstützung für Anhänge und kann auf lokale Postfächer zugreifen.
+
+`mail` kann nicht direkt auf POP- oder IMAP-Server zugreifen. Entfernte Postfächer können aber mit einer Anwendung wie fetchmail in eine lokale [.filename]#mbox# geladen werden.
+
+Um E-Mails zu versenden oder zu empfangen, starten Sie einfach `mail` wie im nachstehenden Beispiel:
+
+[source,bash]
+....
+% mail
+....
+
+`mail` liest automatisch den Inhalt des Benutzer-Postfachs im Verzeichnis [.filename]#/var/mail#. Sollte das Postfach leer sein, beendet sich `mail` mit der Nachricht, dass keine E-Mails vorhanden sind. Wenn E-Mails vorhanden sind, wird die Benutzeroberfläche gestartet und eine Liste der E-Mails angezeigt. Die E-Mails werden automatisch nummeriert wie im folgenden Beispiel gezeigt:
+
+[source,bash]
+....
+Mail version 8.1 6/6/93. Type ? for help.
+"/var/mail/marcs": 3 messages 3 new
+>N 1 root@localhost Mon Mar 8 14:05 14/510 "test"
+ N 2 root@localhost Mon Mar 8 14:05 14/509 "user account"
+ N 3 root@localhost Mon Mar 8 14:05 14/509 "sample"
+....
+
+Einzelne Nachrichten können nun durch Eingabe von kbd:[t] gefolgt von der Nummer der Nachricht gelesen werden. Im nachstehenden Beispiel wird die erste E-Mail gelesen:
+
+[source,bash]
+....
+&
+ t 1
+Message 1:
+From root@localhost Mon Mar 8 14:05:52 2004
+X-Original-To: marcs@localhost
+Delivered-To: marcs@localhost
+To: marcs@localhost
+Subject: test
+Date: Mon, 8 Mar 2004 14:05:52 +0200 (SAST)
+From: root@localhost (Charlie Root)
+
+Das ist eine Test-Nachricht. Antworte bitte!
+....
+
+Wie in diesem Beispiel zu sehen ist, wird die Nachricht zusammen mit dem vollständigen Nachrichtenkopf angezeigt. Um die Liste der E-Mails erneut zu sehen, drücken Sie wieder die Taste kbd:[h].
+
+Um auf eine E-Mail zu antworten, benutzen Sie entweder kbd:[R] oder kbd:[r]. kbd:[R] weist `mail` an, dem Versender der Nachricht zu antworten, während mit kbd:[r] allen Empfängern der Nachricht geantwortet wird. Den Kommandos kann die Zahl der E-Mail, auf die geantwortet werden soll, mitgegeben werden. Nachdem die Antwort E-Mail verfasst worden ist, sollte die Eingabe mit einem einzelnen Punkt (kbd:[.]) auf einer neuen Zeile abgeschlossen werden. Hierzu ein Beispiel:
+
+[source,bash]
+....
+&
+ R 1
+To: root@localhost
+Subject: Re: test
+ Danke, ich habe deine E-Mail erhalten.
+.
+EOT
+....
+
+Neue E-Mails können mit kbd:[m], gefolgt von der E-Mail-Adresse des Empfängers verschickt werden. Mehrere Empfänger werden durch Kommata (kbd:[,]) getrennt, angegeben. Der Betreff (subject) der Nachricht kann dann, gefolgt vom Inhalt der Nachricht eingegeben werden. Die Nachricht wird dann mit einem einzelnen Punkt (kbd:[.]) auf einer neuen Zeile abgeschlossen.
+
+[source,bash]
+....
+&
+ mail root@localhost
+Subject:
+ Ich habe die E-Mails im Griff!
+
+Jetzt kann ich E-Mails versenden und empfangen ... :)
+.
+EOT
+....
+
+Die Taste kbd:[?] zeigt zu jeder Zeit einen Hilfetext an. Lesen Sie man:mail[1], wenn Sie weitere Hilfe zur Benutzung von `mail` erhalten möchten.
+
+[NOTE]
+====
+man:mail[1] wurde nicht für den Umgang mit Anhängen entworfen und kann daher sehr schlecht mit Anhängen umgehen. Neuere MUAs gehen wesentlich besser mit Anhängen um. Benutzer, die `mail` bevorzugen, werden vielleicht den Port package:converters/mpack[] zu schätzen wissen.
+====
+
+[[mutt-command]]
+=== mutt
+
+mutt ist ein leistungsfähiges E-Mail-Programm mit vielen Funktionen, darunter:
+
+* mutt kann den Verlauf einer Diskussion (threading) darstellen.
+* Unterstützung von PGP für das digitale signieren und verschlüsseln von E-Mail.
+* MIME-Unterstützung.
+* Maildir-Unterstützung.
+* mutt lässt sich im höchsten Maße an lokale Bedürfnisse anpassen.
+
+Mehr über mutt erfahren Sie auf der Seite http://www.mutt.org[ http://www.mutt.org].
+
+mutt kann über den Port package:mail/mutt[] installiert werden. Nachdem der Port installiert ist, kann mutt mit dem folgenden Befehl gestartet werden:
+
+[source,bash]
+....
+% mutt
+....
+
+mutt liest automatisch den Inhalt des Benutzer-Postfachs im Verzeichnis [.filename]#/var/mail#. Sind keine E-Mails vorhanden, wartet mutt auf Benutzereingaben. Das folgende Beispiel zeigt, wie mutt eine Nachrichten-Liste darstellt:
+
+image::mutt1.png[]
+
+Um eine E-Mail zu lesen, wählen Sie die Nachricht einfach mit den Pfeiltasten aus und drücken kbd:[Enter]. mutt zeigt E-Mails wie folgt an:
+
+image::mutt2.png[]
+
+Änlich wie man:mail[1], kann auch mutt verwendet werden, um nur dem Absender, oder auch allen anderen Empfängern zu antworten. Um nur dem Absender der E-Mail zu antworten, drücken Sie kbd:[r]. Um sowohl dem Absender, als auch allen anderen Empfängern zu antworten, drücken Sie kbd:[g].
+
+[NOTE]
+====
+Zum Erstellen oder zum Beantworten von E-Mails ruft mutt den Editor man:vi[1] auf. Jeder Benutzer kann diese Einstellung anpassen, indem die Variable `editor` in [.filename]#.muttrc# im Heimatverzeichnis gesetzt wird, oder die Umgebungsvariable `EDITOR` entsprechend angepasst wird. Weitere Informationen zur Konfiguration von mutt finden Sie unter http://www.mutt.org/[ http://www.mutt.org/].
+====
+
+Drücken Sie kbd:[m], um eine neue Nachricht zu verfassen. Nachdem der Betreff (subject) eingegeben wurde, startet mutt den man:vi[1] und die Nachricht kann verfasst werden. Wenn Sie fertig sind, speichern Sie die Nachricht und verlassen den man:vi[1]. mutt wird dann wieder aktiv und zeigt eine Zusammenfassung der zu sendenden Nachricht an. Drücken Sie kbd:[y], um die E-Mail zu versenden. Der nachstehende Bildschirmabzug zeigt die Zusammenfassung der E-Mail:
+
+image::mutt3.png[]
+
+mutt verfügt über eine umfangreiche Hilfestellung. Aus fast jedem Menü können Hilfeseiten mit kbd:[?] aufgerufen werden. In der oberen Statuszeile werden zudem die verfügbaren Tastenkombinationen angezeigt.
+
+[[alpine-command]]
+=== alpine
+
+alpine wendet sich an Anfänger bietet aber ebenfalls einige Funktionen für Profis.
+
+[WARNING]
+====
+
+In der Vergangenheit wurden in alpine mehrere Schwachstellen gefunden. Die Schwachstellen gestatteten entfernten Benutzern, durch das Versenden einer besonders verfassten E-Mail, Programme auf dem lokalen System laufen zu lassen. Alle _bekannten_ Schwachstellen sind beseitigt worden, doch wird im Quellcode von alpine ein sehr riskanter Programmierstil verwendet, sodass der FreeBSD-Security-Officer von weiteren unbekannten Schwachstellen ausgeht. Benutzer installieren alpine auf eigene Verantwortung!
+====
+
+Der Port package:mail/alpine[] enthält die aktuelle Version von alpine. Nach der Installation können Sie alpine mit dem nachstehenden Kommando starten:
+
+[source,bash]
+....
+% alpine
+....
+
+Beim ersten Start von alpine, zeigt das Programm eine Seite mit einer kurzen Einführung an. Um die alpine-Benutzer zu zählen, bitten die Entwickler auf dieser Seite um eine anonyme E-Mail. Sie können diese anonyme E-Mail senden, indem Sie kbd:[Enter] drücken oder den Begrüßungsbildschirm mit der Taste kbd:[E] verlassen, ohne die anonyme E-Mail zu senden. Der Begrüßungsbildschirm sieht wie folgt aus:
+
+image::pine1.png[]
+
+Nach dem Begrüßungsbildschirm wird das Hauptmenü dargestellt, das sich mit den Pfeiltasten bedienen lässt. Über Tastenkombinationen können aus dem Hauptmenü neue E-Mails erstellt, Postfächer angezeigt und das Adressbuch verwaltet werden. Unterhalb des Menüs werden die Tastenkombinationen für die verfügbaren Aktionen angezeigt.
+
+In der Voreinstellung öffnet alpine das Verzeichnis [.filename]#inbox#. Die Taste kbd:[I] oder der Menüpunkt [.guimenuitem]#MESSAGE INDEX# führt zu einer Nachrichten-Liste:
+
+image::pine2.png[]
+
+Die Liste zeigt die Nachrichten im Arbeitsverzeichnis. Sie können Nachrichten mit den Pfeiltasten markieren. Um eine Nachricht zu lesen, drücken Sie kbd:[Enter].
+
+image::pine3.png[]
+
+Im nächsten Bildschirmabzug sehen Sie, wie alpine eine Nachricht darstellt. Die unteren Bildschirmzeilen zeigen die verfügbaren Tastenkombinationen. Mit kbd:[r] können Sie zum Beispiel auf die gerade angezeigte Nachricht antworten.
+
+image::pine4.png[]
+
+Zum Antworten auf eine E-Mail wird in alpine der Editor pico, der mit installiert wird, benutzt. pico ist leicht zu bedienen und gerade für Anfänger besser geeignet als man:vi[1] oder man:mail[1]. Die Antwort wird mit der Tastenkombination kbd:[Ctrl+X] versendet. Vor dem Versand bittet alpine noch um eine Bestätigung.
+
+image::pine5.png[]
+
+Über den Menüpunkt [.guimenuitem]#SETUP# des Hauptmenüs können Sie alpine an Ihre Bedürfnisse anpassen. Erläuterungen dazu finden Sie auf der Seite http://www.washington.edu/pine/[http://www.washington.edu/pine/].
+
+[[mail-fetchmail]]
+== E-Mails mit fetchmail abholen
+
+fetchmail ist ein vollwertiger IMAP- und POP-Client. Mit fetchmail können Benutzer E-Mails von entfernten IMAP- und POP-Servern in leichter zugängliche lokale Postfächer laden. fetchmail wird aus dem Port package:mail/fetchmail[] installiert. Das Programm bietet unter anderem folgende Funktionen:
+
+* fetchmail beherrscht die Protokolle POP3, APOP, KPOP, IMAP, ETRN und ODMR.
+* E-Mails können mit SMTP weiterverarbeitet werden. Dadurch ist garantiert, dass Filter, Weiterleitungen und Aliase weiterhin funktionieren.
+* Das Programm kann als Dienst laufen und periodisch neue Nachrichten abrufen.
+* fetchmail kann mehrere Postfächer abfragen und je nach Konfiguration die E-Mails an verschiedene lokale Benutzer zustellen.
+
+Dieser Abschnitt erklärt einige grundlegende Funktionen von fetchmail. Das Programm benötigt eine Konfigurationsdatei [.filename]#.fetchmailrc# im Heimatverzeichnis des Benutzers. In dieser Datei werden Informationen über Server wie auch Benutzerdaten und Passwörter hinterlegt. Wegen des kritischen Inhalts dieser Datei ist es ratsam, diese nur für den Benutzer lesbar zu machen:
+
+[source,bash]
+....
+% chmod 600 .fetchmailrc
+....
+
+Die folgende [.filename]#.fetchmailrc# zeigt, wie das Postfach eines einzelnen Benutzers mit POP heruntergeladen wird. fetchmail wird angewiesen, eine Verbindung zu `example.com` herzustellen und sich dort als Benutzer `joesoap` mit dem Passwort `XXX` anzumelden. Das Beispiel setzt voraus, dass der Benutzer `joesoap` auch auf dem lokalen System existiert.
+
+[.programlisting]
+....
+poll example.com protocol pop3 username "joesoap" password "XXX"
+....
+
+Im folgenden Beispiel werden mehrere POP- und IMAP-Server benutzt. Wo notwendig, werden E-Mails auf andere lokale Konten umgeleitet:
+
+[.programlisting]
+....
+poll example.com proto pop3:
+user "joesoap", with password "XXX", is "jsoap" here;
+user "andrea", with password "XXXX";
+poll example2.net proto imap:
+user "john", with password "XXXXX", is "myth" here;
+....
+
+fetchmail kann als Dämon gestartet werden. Verwendet wird dazu die Kommandozeilenoption `-d` gefolgt von einer Zeitspanne in Sekunden, die angibt, wie oft die Server aus [.filename]#.fetchmailrc# abgefragt werden sollen. Mit dem nachstehenden Befehl fragt fetchmail die Server alle 600 Sekunden ab:
+
+[source,bash]
+....
+% fetchmail -d 600
+....
+
+Mehr über fetchmail erfahren Sie auf der Seite http://www.fetchmail.info/[ http://www.fetchmail.info/].
+
+[[mail-procmail]]
+== E-Mails mit procmail filtern
+
+procmail ist ein mächtiges Werkzeug, mit dem sich eingehende E-Mails filtern lassen. Benutzer können Regeln für eingehende E-Mails definieren, die E-Mails zu anderen Postfächern oder anderen E-Mail-Adressen umleiten. procmail befindet sich im Port package:mail/procmail[]. procmail kann leicht in die meisten MTAs integriert werden. Lesen Sie dazu bitte die Dokumentation des verwendeten MTAs. Alternativ kann procmail in das E-Mail-System eingebunden werden, indem die nachstehende Zeile in die Datei [.filename]#.forward# im Heimatverzeichnis eines Benutzers eingefügt wird:
+
+[.programlisting]
+....
+"|exec /usr/local/bin/procmail || exit 75"
+....
+
+Der folgende Abschnitt zeigt einige einfache procmail-Regeln sowie eine kurze Beschreibung dessen, was sie tun. Regeln müssen in [.filename]#.procmailrc# im Heimatverzeichnis des Benutzers eingefügt werden.
+
+Den Großteil dieser Regeln finden Sie auch in man:procmailex[5].
+
+Um E-Mails von mailto:user@example.com[user@example.com] an die externe Adresse mailto:goodmail@example2.com[goodmail@example2.com] weiterzuleiten:
+
+[.programlisting]
+....
+:0
+* ^From.*user@example.com
+! goodmail@example2.com
+....
+
+Um E-Mails, die kürzer als 1000 Bytes sind, an mailto:goodmail@example2.com[goodmail@example2.com] weiterzuleiten:
+
+[.programlisting]
+....
+:0
+* < 1000
+! goodmail@example2.com
+....
+
+Um E-Mails, die an mailto:alternate@example.com[alternate@example.com] geschickt werden, im Postfach [.filename]#alternate# zu speichern:
+
+[.programlisting]
+....
+:0
+* ^TOalternate@example.com
+alternate
+....
+
+Um E-Mails, die im Betreff `Spam` enthalten, nach [.filename]#/dev/null# zu verschieben:
+
+[.programlisting]
+....
+:0
+^Subject:.*Spam
+/dev/null
+....
+
+Zuletzt ein nützliches Rezept, das eingehende E-Mails von den `FreeBSD.org`-Mailinglisten in ein separates Postfach für jede Liste einsortiert:
+
+[.programlisting]
+....
+:0
+* ^Sender:.owner-freebsd-\/[^@]+@FreeBSD.ORG
+{
+ LISTNAME=${MATCH}
+ :0
+ * LISTNAME??^\/[^@]+
+ FreeBSD-${MATCH}
+}
+....
diff --git a/documentation/content/de/books/handbook/mirrors/_index.adoc b/documentation/content/de/books/handbook/mirrors/_index.adoc
new file mode 100644
index 0000000000..485962abd6
--- /dev/null
+++ b/documentation/content/de/books/handbook/mirrors/_index.adoc
@@ -0,0 +1,598 @@
+---
+title: Anhang A. Bezugsquellen für FreeBSD
+part: Teil V. Anhang
+prev: books/handbook/partv
+next: books/handbook/bibliography
+---
+
+[appendix]
+[[mirrors]]
+= Bezugsquellen für FreeBSD
+:doctype: book
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: A
+
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+[[mirrors-cdrom]]
+== CD and DVD Sets
+
+Die FreeBSD-CDs und -DVDs werden von verschiedenen Online-Händlern angeboten:
+
+* FreeBSD Mall, Inc. +
+2420 Sand Creek Rd C-1 #347 +
+Brentwood, CA +
+94513 +
+USA +
+Phone: +1 925 240-6652 +
+Fax: +1 925 674-0821 +
+Email: <info@freebsdmall.com> +
+WWW: https://www.freebsdmall.com
+
+* Getlinux +
+78 Rue de la Croix Rochopt +
+Épinay-sous-Sénart +
+91860 +
+France +
+Email: <contact@getlinux.fr> +
+WWW: http://www.getlinux.fr/
+
+* Dr. Hinner EDV +
+Kochelseestr. 11 +
+D-81371 München +
+Germany +
+Phone: (0177) 428 419 0 +
+Email: <infow@hinner.de> +
+WWW: http://www.hinner.de/linux/freebsd.html
+
+* Linux Center +
+Galernaya Street, 55 +
+Saint-Petersburg +
+190000 +
+Russia +
+Phone: +7-812-309-06-86 +
+Email: <info@linuxcenter.ru> +
+WWW: http://linuxcenter.ru/shop/freebsd
+
+[[mirrors-ftp]]
+== FTP-Server
+
+Die offiziellen Quellen von FreeBSD sind mit anonymous FTP über ein weltweites Netz von Spiegeln erhältlich. Die Seite link:ftp://ftp.FreeBSD.org/pub/FreeBSD/[ ftp://ftp.FreeBSD.org/pub/FreeBSD/] ist über HTTP und FTP erreichbar. Sie besteht aus mehreren Servern, die von den Cluster-Administratoren des Projekts über GeoDNS betrieben wird, um Benutzer auf den nächsten verfügbaren Spiegel umzuleiten.
+
+Sie können FreeBSD auch über anonymous FTP von den folgenden Spiegeln beziehen. Wenn Sie FreeBSD über anonymous FTP beziehen wollen, wählen Sie bitte einen Spiegel in Ihrer Nähe. Die unter "Haupt-Spiegel" aufgeführten Spiegel stellen normalerweise das komplette FreeBSD-Archiv (alle momentan erhältlichen Versionen für jede unterstützte Architektur) zur Verfügung. Wahrscheinlich geht es aber schneller, wenn Sie einen Spiegel in Ihrer Nähe benutzen. Die Länder-Spiegel stellen die neusten Versionen für die beliebtesten Architekturen bereit, sie stellen aber unter Umständen nicht das komplette FreeBSD-Archiv bereit. Auf alle Server kann mit anonymous FTP zugegriffen werden, einige Server bieten auch andere Zugriffsmethoden an. Die zur Verfügung stehenden Zugriffsmethoden sind bei jedem Server in Klammern angegeben.
+
+<<central, {central}>>, <<primary, {mirrors-primary}>>, <<armenia, {mirrors-armenia}>>, <<australia, {mirrors-australia}>>, <<austria, {mirrors-austria}>>, <<brazil, {mirrors-brazil}>>, <<czech-republic, {mirrors-czech}>>, <<denmark, {mirrors-denmark}>>, <<estonia, {mirrors-estonia}>>, <<finland, {mirrors-finland}>>, <<france, {mirrors-france}>>, <<germany, {mirrors-germany}>>, <<greece, {mirrors-greece}>>, <<hong-kong, {mirrors-hongkong}>>, <<ireland, {mirrors-ireland}>>, <<japan, {mirrors-japan}>>, <<korea, {mirrors-korea}>>, <<latvia, {mirrors-latvia}>>, <<lithuania, {mirrors-lithuania}>>, <<netherlands, {mirrors-netherlands}>>, <<new-zealand, {mirrors-new-zealand}>>, <<norway, {mirrors-norway}>>, <<poland, {mirrors-poland}>>, <<russia, {mirrors-russia}>>, <<saudi-arabia, {mirrors-saudi-arabia}>>, <<slovenia, {mirrors-slovenia}>>, <<south-africa, {mirrors-south-africa}>>, <<spain, {mirrors-spain}>>, <<sweden, {mirrors-sweden}>>, <<switzerland, {mirrors-switzerland}>>, <<taiwan, {mirrors-taiwan}>>, <<ukraine, {mirrors-ukraine}>>, <<uk, {mirrors-uk}>>, <<usa, {mirrors-us}>>.
+
+(aktualisiert am: UTC)
+
+[[central]]
+*{central}*
+
+{central-ftp} (ftp / ftpv6 / {central-http} / {central-httpv6})
+
+[[primary]]
+*{mirrors-primary}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-primary-email}>` dieser Domain.
+
+* {mirrors-primary-ftp1} (ftp)
+* {mirrors-primary-ftp2} (ftp)
+* {mirrors-primary-ftp3} (ftp)
+* {mirrors-primary-ftp4} (ftp / ftpv6 / {mirrors-primary-ftp4-http} / {mirrors-primary-ftp4-httpv6})
+* {mirrors-primary-ftp5} (ftp)
+* {mirrors-primary-ftp6} (ftp)
+* {mirrors-primary-ftp7} (ftp)
+* {mirrors-primary-ftp10} (ftp / ftpv6 / {mirrors-primary-ftp10-http} / {mirrors-primary-ftp10-httpv6})
+* {mirrors-primary-ftp11} (ftp)
+* {mirrors-primary-ftp13} (ftp)
+* {mirrors-primary-ftp14} (ftp / {mirrors-primary-ftp14-http})
+
+[[armenia]]
+*{mirrors-armenia}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-armenia-email}>` dieser Domain.
+
+* {mirrors-armenia-ftp} (ftp / {mirrors-armenia-ftp-http} / rsync)
+
+[[australia]]
+*{mirrors-australia}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-australia-email}>` dieser Domain.
+
+* {mirrors-australia-ftp} (ftp)
+* {mirrors-australia-ftp2} (ftp)
+* {mirrors-australia-ftp3} (ftp)
+
+[[austria]]
+*{mirrors-austria}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-austria-email}>` dieser Domain.
+
+* {mirrors-austria-ftp} (ftp / ftpv6 / {mirrors-austria-ftp-http} / {mirrors-austria-ftp-httpv6})
+
+[[brazil]]
+*{mirrors-brazil}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-brazil-email}>` dieser Domain.
+
+* {mirrors-brazil-ftp2} (ftp / {mirrors-brazil-ftp2-http})
+* {mirrors-brazil-ftp3} (ftp / rsync)
+* {mirrors-brazil-ftp4} (ftp)
+
+[[czech-republic]]
+*{mirrors-czech}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-czech-email}>` dieser Domain.
+
+* {mirrors-czech-ftp} (ftp / {mirrors-czech-ftpv6} / {mirrors-czech-ftp-http} / {mirrors-czech-ftp-httpv6} / rsync / rsyncv6)
+* {mirrors-czech-ftp2} (ftp / {mirrors-czech-ftp2-http})
+
+[[denmark]]
+*{mirrors-denmark}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-denmark-email}>` dieser Domain.
+
+* {mirrors-denmark-ftp} (ftp / ftpv6 / {mirrors-denmark-ftp-http} / {mirrors-denmark-ftp-httpv6})
+
+[[estonia]]
+*{mirrors-estonia}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-estonia-email}>` dieser Domain.
+
+* {mirrors-estonia-ftp} (ftp)
+
+[[finland]]
+*{mirrors-finland}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-finland-email}>` dieser Domain.
+
+* {mirrors-finland-ftp} (ftp)
+
+[[france]]
+*{mirrors-france}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-france-email}>` dieser Domain.
+
+* {mirrors-france-ftp} (ftp)
+* {mirrors-france-ftp1} (ftp / {mirrors-france-ftp1-http} / rsync)
+* {mirrors-france-ftp3} (ftp)
+* {mirrors-france-ftp5} (ftp)
+* {mirrors-france-ftp6} (ftp / rsync)
+* {mirrors-france-ftp7} (ftp)
+* {mirrors-france-ftp8} (ftp)
+
+[[germany]]
+*{mirrors-germany}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-germany-email}>` dieser Domain.
+
+* ftp://ftp.de.FreeBSD.org/pub/FreeBSD/ (ftp)
+* ftp://ftp1.de.FreeBSD.org/freebsd/ (ftp / http://www1.de.FreeBSD.org/freebsd/ / rsync://rsync3.de.FreeBSD.org/freebsd/)
+* ftp://ftp2.de.FreeBSD.org/pub/FreeBSD/ (ftp / http://ftp2.de.FreeBSD.org/pub/FreeBSD/ / rsync)
+* ftp://ftp4.de.FreeBSD.org/FreeBSD/ (ftp / http://ftp4.de.FreeBSD.org/pub/FreeBSD/)
+* ftp://ftp5.de.FreeBSD.org/pub/FreeBSD/ (ftp)
+* ftp://ftp7.de.FreeBSD.org/pub/FreeBSD/ (ftp / http://ftp7.de.FreeBSD.org/pub/FreeBSD/)
+* ftp://ftp8.de.FreeBSD.org/pub/FreeBSD/ (ftp)
+
+[[greece]]
+*{mirrors-greece}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-greece-email}>` dieser Domain.
+
+* {mirrors-greece-ftp} (ftp)
+* {mirrors-greece-ftp2} (ftp)
+
+[[hong-kong]]
+*{mirrors-hongkong}*
+
+{mirrors-hongkong-ftp} (ftp)
+
+[[ireland]]
+*{mirrors-ireland}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-ireland-email}>` dieser Domain.
+
+* {mirrors-ireland-ftp} (ftp / rsync)
+
+[[japan]]
+*{mirrors-japan}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-japan-email}>` dieser Domain.
+
+* {mirrors-japan-ftp} (ftp)
+* {mirrors-japan-ftp2} (ftp)
+* {mirrors-japan-ftp3} (ftp)
+* {mirrors-japan-ftp4} (ftp)
+* {mirrors-japan-ftp5} (ftp)
+* {mirrors-japan-ftp6} (ftp)
+* {mirrors-japan-ftp7} (ftp)
+* {mirrors-japan-ftp8} (ftp)
+* {mirrors-japan-ftp9} (ftp)
+
+[[korea]]
+*{mirrors-korea}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-korea-email}>` dieser Domain.
+
+* {mirrors-korea-ftp} (ftp / rsync)
+* {mirrors-korea-ftp2} (ftp / {mirrors-korea-ftp2-http})
+
+[[latvia]]
+*{mirrors-latvia}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-latvia-email}>` dieser Domain.
+
+* {mirrors-latvia-ftp} (ftp / {mirrors-latvia-ftp-http})
+
+[[lithuania]]
+*{mirrors-lithuania}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-lithuania-email}>` dieser Domain.
+
+* {mirrors-lithuania-ftp} (ftp / {mirrors-lithuania-ftp-http})
+
+[[netherlands]]
+*{mirrors-netherlands}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-netherlands-email}>` dieser Domain.
+
+* {mirrors-netherlands-ftp} (ftp / {mirrors-netherlands-ftp-http} / rsync)
+* {mirrors-netherlands-ftp2} (ftp)
+
+[[new-zealand]]
+*{mirrors-new-zealand}*
+
+* {mirrors-new-zealand-ftp} (ftp / {mirrors-new-zealand-ftp-http})
+
+[[norway]]
+*{mirrors-norway}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-norway-email}>` dieser Domain.
+
+* {mirrors-norway-ftp} (ftp / rsync)
+
+[[poland]]
+*{mirrors-poland}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-poland-email}>` dieser Domain.
+
+* {mirrors-poland-ftp} (ftp)
+* ftp2.pl.FreeBSD.org
+
+[[russia]]
+*{mirrors-russia}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-russia-email}>` dieser Domain.
+
+* {mirrors-russia-ftp} (ftp / {mirrors-russia-ftp-http} / rsync)
+* {mirrors-russia-ftp2} (ftp / {mirrors-russia-ftp2-http} / rsync)
+* {mirrors-russia-ftp4} (ftp)
+* {mirrors-russia-ftp5} (ftp / {mirrors-russia-ftp5-http} / rsync)
+* {mirrors-russia-ftp6} (ftp)
+
+[[saudi-arabia]]
+*{mirrors-saudi-arabia}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-saudi-arabia-email}>` dieser Domain.
+
+* {mirrors-saudi-arabia-ftp} (ftp)
+
+[[slovenia]]
+*{mirrors-slovenia}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-slovenia-email}>` dieser Domain.
+
+* {mirrors-slovenia-ftp} (ftp)
+
+[[south-africa]]
+*{mirrors-south-africa}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-south-africa-email}>` dieser Domain.
+
+* {mirrors-south-africa-ftp} (ftp)
+* {mirrors-south-africa-ftp2} (ftp)
+* {mirrors-south-africa-ftp4} (ftp)
+
+[[spain]]
+*{mirrors-spain}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-spain-email}>` dieser Domain.
+
+* {mirrors-spain-ftp} (ftp / {mirrors-spain-ftp-http})
+* {mirrors-spain-ftp3} (ftp)
+
+[[sweden]]
+*{mirrors-sweden}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-sweden-email}>` dieser Domain.
+
+* {mirrors-sweden-ftp} (ftp)
+* {mirrors-sweden-ftp2} (ftp / {mirrors-sweden-ftp2-rsync})
+* {mirrors-sweden-ftp3} (ftp)
+* {mirrors-sweden-ftp4} (ftp / {mirrors-sweden-ftp4v6} / {mirrors-sweden-ftp4-http} / {mirrors-sweden-ftp4-httpv6} / {mirrors-sweden-ftp4-rsync} / {mirrors-sweden-ftp4-rsyncv6})
+* {mirrors-sweden-ftp6} (ftp / {mirrors-sweden-ftp6-http})
+
+[[switzerland]]
+*{mirrors-switzerland}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-switzerland-email}>` dieser Domain.
+
+* {mirrors-switzerland-ftp} (ftp / {mirrors-switzerland-ftp-http})
+
+[[taiwan]]
+*{mirrors-taiwan}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-taiwan-email}>` dieser Domain.
+
+* {mirrors-taiwan-ftp} (ftp / {mirrors-taiwan-ftpv6} / rsync / rsyncv6)
+* {mirrors-taiwan-ftp2} (ftp / {mirrors-taiwan-ftp2v6} / {mirrors-taiwan-ftp2-http} / {mirrors-taiwan-ftp2-httpv6} / rsync / rsyncv6)
+* {mirrors-taiwan-ftp4} (ftp)
+* {mirrors-taiwan-ftp5} (ftp)
+* {mirrors-taiwan-ftp6} (ftp / {mirrors-taiwan-ftp6v6} / rsync)
+* {mirrors-taiwan-ftp7} (ftp)
+* {mirrors-taiwan-ftp8} (ftp)
+* {mirrors-taiwan-ftp11} (ftp / {mirrors-taiwan-ftp11-http})
+* {mirrors-taiwan-ftp12} (ftp)
+* {mirrors-taiwan-ftp13} (ftp)
+* {mirrors-taiwan-ftp14} (ftp)
+* {mirrors-taiwan-ftp15} (ftp)
+
+[[ukraine]]
+*{mirrors-ukraine}*
+
+* {mirrors-ukraine-ftp} (ftp / {mirrors-ukraine-ftp-http})
+* {mirrors-ukraine-ftp6} (ftp / {mirrors-ukraine-ftp6-http} / {mirrors-ukraine-ftp6-rsync})
+* {mirrors-ukraine-ftp7} (ftp)
+
+[[uk]]
+*{mirrors-uk}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-uk-email}>` dieser Domain.
+
+* {mirrors-uk-ftp} (ftp)
+* {mirrors-uk-ftp2} (ftp / {mirrors-uk-ftp2-rsync})
+* {mirrors-uk-ftp3} (ftp)
+* {mirrors-uk-ftp4} (ftp)
+* {mirrors-uk-ftp5} (ftp)
+
+[[usa]]
+*{mirrors-us}*
+
+Bei Problemen wenden Sie sich bitte an den Betreuer `<{mirrors-us-email}>` dieser Domain.
+
+* {mirrors-us-ftp} (ftp)
+* {mirrors-us-ftp2} (ftp)
+* {mirrors-us-ftp3} (ftp)
+* {mirrors-us-ftp4} (ftp / ftpv6 / {mirrors-us-ftp4-http} / {mirrors-us-ftp4-httpv6})
+* {mirrors-us-ftp5} (ftp)
+* {mirrors-us-ftp6} (ftp)
+* {mirrors-us-ftp8} (ftp)
+* {mirrors-us-ftp10} (ftp)
+* {mirrors-us-ftp11} (ftp)
+* {mirrors-us-ftp13} (ftp / {mirrors-us-ftp13-http} / rsync)
+* {mirrors-us-ftp14} (ftp / {mirrors-us-ftp14-http})
+* {mirrors-us-ftp15} (ftp)
+
+[[svn]]
+== Benutzen von Subversion
+
+[[svn-intro]]
+=== Einführung
+
+Seit Juli 2012 nutzt FreeBSD ausschließlich Subversion als Versionskontrollsystem zur Speicherung des gesamten FreeBSD Quellcodes, der Dokumentation und der Ports-Sammlung.
+
+[NOTE]
+====
+Subversion ist hauptsächlich ein Werkzeug für Entwickler. Die meisten Benutzer bevorzugen `freebsd-update` (crossref:cutting-edge[updating-upgrading-freebsdupdate,FreeBSD-Update]) um das FreeBSD Basissystem zu aktualisieren, und `portsnap` (crossref:ports[ports-using,Benutzen der Ports-Sammlung]) um die FreeBSD Ports-Sammlung aktuell zu halten.
+====
+
+Dieser Abschnitt zeigt, wie Subversion unter FreeBSD installiert wird und wie Sie damit eine lokale Kopie des FreeBSD Repositories erstellen. Weitere Informationen über die Benutzung von Subversion sind ebenfalls enthalten.
+
+[[svn-ssl-certificates]]
+=== SSL Root-Zertifikate
+
+Die Installation von package:security/ca_root_nss[] erlaubt es Subversion die Identität des HTTPS-Repository-Servers zu überprüfen. Die SSL Root-Zertifikate können aus der Ports-Sammlung installiert werden:
+
+[source,bash]
+....
+# cd /usr/ports/security/ca_root_nss
+# make install clean
+....
+
+Alternativ kann das Paket installiert werden:
+
+[source,bash]
+....
+# pkg install ca_root_nss
+....
+
+[[svn-svnlite]]
+=== Svnlite
+
+Mit `svnlite` enthält FreeBSD bereits eine vereinfachte Version von Subversion. Der Port oder das Paket ist nur erforderlich, wenn die Python oder Perl API benötigt wird, oder eine neuere Version von Subversion gewünscht ist.
+
+Der einzige Unterschied zum normalen Subversion ist, dass der Name des Kommandos `svnlite` lautet.
+
+[[svn-install]]
+=== Installation
+
+Falls `svnlite` nicht verfügbar ist, oder die komplette Version von Subversion benötigt wird, muss das Programm installiert werden.
+
+Subversion kann aus der Ports-Sammlung installiert werden:
+
+[source,bash]
+....
+# cd /usr/ports/devel/subversion
+# make install clean
+....
+
+Subversion kann auch als Paket installiert werden:
+
+[source,bash]
+....
+# pkg install subversion
+....
+
+[[svn-usage]]
+=== Subversion benutzen
+
+Der `svn` Befehl wird verwendet, um eine Kopie der Quellen in ein lokales Verzeichnis zu holen. Die Dateien in diesem Verzeichnis werden _lokale Arbeitskopie_ genannt.
+
+[WARNING]
+====
+
+Verschieben oder löschen Sie das Zielverzeichnis bevor Sie `checkout` benutzen.
+
+In ein bestehendes nicht-`svn` Verzeichnis auszuchecken kann zu Konflikten zwischen den vorhandenen Dateien und denen aus dem Respository führen.
+====
+
+In Subversion werden URLs in der Form von _protocol://hostname/path_ verwendet, um ein Repository zu kennzeichnen. Die erste Komponente des Pfades ist das FreeBSD Repository auf welches zugegriffen wird. Es gibt drei verschiedene Repositories. `base` für den Quellcode des FreeBSD Basissystems, `ports` für die Ports-Sammlung und `doc` für die Dokumentation. Als Beispiel spezifiziert die URL `svn://svn.FreeBSD.org/ports/head/` den Hauptzweig des Port-Repositories auf dem Mirror `svn.FreeBSD.org`, über das `svn`-Protokoll.
+
+Das Auschecken aus einem bestimmten Repository kann wie folgt durchgeführt werden:
+
+[source,bash]
+....
+# svn checkout https://svn.FreeBSD.org/repository/branch lcwdir
+....
+
+wobei:
+
+* _repository_ eines der Projekt-Repositories ist: `base`, `ports` oder `doc`.
+* _branch_ vom verwendeten Repository abhängt. `ports` und `doc` werden meist im `head` Zweig aktualisiert, während `base` die neueste Version von -CURRENT unter `head` und die jeweilige neueste Version des -STABLE Zweiges unter `stable/9` (9._x_) und `stable/10` (10._x_) verwaltet wird.
+* _lcwdir_ das Zielverzeichnis ist, in dem die Inhalte des angegebenen Zweiges platziert werden sollen. Dies ist üblicherweise [.filename]#/usr/ports# für `ports`, [.filename]#/usr/src# für `base`, und [.filename]#/usr/doc# für `doc`.
+
+Dieses Beispiel checkt die Ports-Sammlung aus dem Repositroy über das HTTPS-Protokoll aus, und speichert die Arbeitskopie unter [.filename]#/usr/ports#. Wenn [.filename]#/usr/ports# bereits vorhanden ist, aber nicht von `svn` erstellt wurde, denken Sie vor dem Auschecken daran, das Verzeichnis umzubenennen oder zu löschen.
+
+[source,bash]
+....
+# svn checkout https://svn.FreeBSD.org/ports/head /usr/ports
+....
+
+Dies kann eine Weile dauern, da beim ersten Auschecken der komplette Zweig vom entfernten Repository heruntergeladen werden muss. Bitte haben Sie Geduld.
+
+Nach dem ersten Auschecken können Sie Ihre lokale Arbeitskopie wie folgt aktualisieren:
+
+[source,bash]
+....
+# svn update lcwdir
+....
+
+Um [.filename]#/usr/ports# aus dem oben erstellten Beispiel zu aktualisieren, benutzen Sie:
+
+[source,bash]
+....
+# svn update /usr/ports
+....
+
+Das Update ist viel schneller als ein Auschecken, da nur die Dateien übertragen werden müssen, die sich auch geändert haben.
+
+Eine alternative Möglichkeit zur Aktualisierung Ihrer Arbeitskopie nach dem Auschecken ist es, das bestehende [.filename]#Makefile# in den Verzeichnissen [.filename]#/usr/ports#, [.filename]#/usr/src#, und [.filename]#/usr/doc# zu nutzen. Setzen Sie dazu `SVN_UPDATE` und benutzen Sie das `update` Ziel. Zum Beispiel, um [.filename]#/usr/src# zu aktualisieren:
+
+[source,bash]
+....
+# cd /usr/src
+# make update SVN_UPDATE=yes
+....
+
+[[svn-mirrors]]
+=== Subversion Mirror Sites
+
+Das FreeBSD Subversion Repository ist:
+
+[.programlisting]
+....
+svn.FreeBSD.org
+....
+
+Dies ist ein öffentlich zugängliches Netzwerk aus Spiegeln, das GeoDNS verwendet, um einen entsprechenden Backend-Server auszuwählen. Um das FreeBSD Subversion Repository über einen Browser anzuzeigen, verwenden Sie https://svnweb.FreeBSD.org/[ http://svnweb.FreeBSD.org/].
+
+HTTPS ist das bevorzugte Protokoll, jedoch muss das Paket package:security/ca_root_nss[] installiert werden, um Zertifikate automatisch zu validieren.
+
+=== Weiterführende Informationen
+
+Weitere Informationen über die Verwendung von Subversion finden Sie im "Subversion Buch" mit dem Namen http://svnbook.red-bean.com/[Versionskontrolle mit Subversion], oder in der http://subversion.apache.org/docs/[Subversion Dokumentation].
+
+[[mirrors-rsync]]
+== Benutzen von rsync
+
+Die folgenden Server stellen FreeBSD über das rsync-Protokoll zur Verfügung. Das Programm rsync überträgt lediglich geänderte Dateien und ist sehr nützlich, wenn Sie einen FreeBSD FTP-Spiegel betreiben. rsync ist für viele Betriebssysteme verfügbar. Für FreeBSD sehen Sie sich den Port oder das Paket package:net/rsync[] an.
+
+Großbritannien::
+rsync://rsync.mirrorservice.org/
++
+Verfügbare Sammlungen:
+
+** ftp.freebsd.org: Kompletter Spiegel des FreeBSD FTP-Servers.
+
+Niederlande::
+rsync://ftp.nl.FreeBSD.org/
++
+Verfügbare Sammlungen:
+
+** FreeBSD: Kompletter Spiegel des FreeBSD FTP-Servers.
+
+Russland::
+rsync://ftp.mtu.ru/
++
+Verfügbare Sammlungen:
+
+** FreeBSD: Kompletter Spiegel des FreeBSD FTP-Servers.
+** FreeBSD-Archive: Ein Spiegel des FreeBSD Archive-FTP-Servers.
+
+Schweden::
+rsync://ftp4.se.freebsd.org/
++
+Verfügbare Sammlungen:
+
+** FreeBSD: Kompletter Spiegel des FreeBSD FTP-Servers.
+
+Taiwan::
+rsync://ftp.tw.FreeBSD.org/
++
+rsync://ftp2.tw.FreeBSD.org/
++
+rsync://ftp6.tw.FreeBSD.org/
++
+Verfügbare Sammlungen:
+
+** FreeBSD: Kompletter Spiegel des FreeBSD FTP-Servers.
+
+Tschechische Republik::
+rsync://ftp.cz.FreeBSD.org/
++
+Verfügbare Sammlungen:
+
+** ftp: Unvollständiger Spiegel des FreeBSD FTP-Servers.
+** FreeBSD: Vollständiger Spiegel des FreeBSD FTP-Servers.
+
+USA::
+rsync://ftp-master.FreeBSD.org/
++
+Dieser Server darf nur von primären Spiegeln benutzt werden.
++
+Verfügbare Sammlungen:
+
+** FreeBSD: Das Hauptarchiv des FreeBSD FTP-Servers.
+** acl: Die primäre ACL-Liste.
++
+rsync://ftp13.FreeBSD.org/
++
+Verfügbare Sammlungen:
++
+** FreeBSD: Kompletter Spiegel des FreeBSD FTP-Servers.
diff --git a/documentation/content/de/books/handbook/multimedia/_index.adoc b/documentation/content/de/books/handbook/multimedia/_index.adoc
new file mode 100644
index 0000000000..1bf122a55e
--- /dev/null
+++ b/documentation/content/de/books/handbook/multimedia/_index.adoc
@@ -0,0 +1,1072 @@
+---
+title: Kapitel 7. Multimedia
+part: Teil II. Oft benutzte Funktionen
+prev: books/handbook/desktop
+next: books/handbook/kernelconfig
+---
+
+[[multimedia]]
+= Multimedia
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 7
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/multimedia/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/multimedia/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/multimedia/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[multimedia-synopsis]]
+== Übersicht
+
+FreeBSD unterstützt viele unterschiedliche Soundkarten, die Benutzern den Genuss von Highfidelity-Klängen auf dem Computer ermöglichen. Dazu gehört unter anderem die Möglichkeit, Tonquellen in den Formaten MPEG Audio Layer 3 (MP3), Waveform Audio File (WAV), Ogg Vorbis und vielen weiteren Formaten aufzunehmen und wiederzugeben. Darüber hinaus enthält die FreeBSD Ports-Sammlung Anwendungen, die das Bearbeiten von aufgenommenen Tonspuren, das Hinzufügen von Klangeffekten und die Kontrolle der angeschlossenen MIDI-Geräte erlauben.
+
+FreeBSD unterstützt auch die Wiedergabe von Videos und DVDs. Die FreeBSD Ports-Sammlung enthält Anwendungen, um verschiedene Video-Medien wiederzugeben, zu kodieren und zu konvertieren.
+
+Dieses Kapitel beschreibt die Einrichtung von Soundkarten, Video-Wiedergabe, TV-Tuner Karten und Scannern unter FreeBSD. Es werden auch einige Anwendungen beschrieben, die für die Verwendung dieser Geräte zur Verfügung stehen.
+
+Dieses Kapitel behandelt die folgenden Punkte:
+
+* Konfiguration einer Soundkarte in FreeBSD.
+* Fehlersuche bei Sound Einstellungen.
+* Wiedergabe und Kodierung von MP3s und anderen Audio-Formaten.
+* Vorbereitung des Systems für die Wiedergabe von Videos.
+* Wiedergabe von DVDs, [.filename]#.mpg#- und [.filename]#.avi#-Dateien.
+* Rippen von CDs und DVDs.
+* Konfiguration von TV-Karten.
+* Installation und Konfiguration von MythTV.
+* Konfiguration von Scannern
+* Konfiguration von Bluetooth-Kopfhörern
+
+Bevor Sie dieses Kapitel lesen, sollten Sie:
+
+* Wissen, wie Sie Anwendungen installieren (crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports]).
+
+[[sound-setup]]
+== Soundkarten einrichten
+
+Bevor Sie die Konfiguration beginnen, sollten Sie in Erfahrung bringen welches Soundkartenmodell und welcher Chip benutzt wird. FreeBSD unterstützt eine Reihe Soundkarten. Die link:{u-rel120-hardware}[Hardware-Notes] zählen alle unterstützten Karten und deren Treiber für FreeBSD auf.
+
+Um die Soundkarte benutzen zu können, muss der richtige Gerätetreiber geladen werden. Am einfachsten ist es, das Kernelmodul für die Soundkarte mit man:kldload[8] zu laden. Dieses Beispiel lädt den Treiber für einen integrierten Chipsatz, basierend auf der Intel Spezifikation:
+
+[source,bash]
+....
+# kldload snd_hda
+....
+
+Um den Treiber automatisch beim Systemstart zu laden, fügen Sie folgende Zeile in [.filename]#/boot/loader.conf# ein:
+
+[.programlisting]
+....
+snd_hda_load="YES"
+....
+
+Weitere ladbare Soundmodule sind in [.filename]#/boot/defaults/loader.conf# aufgeführt. Wenn Sie nicht sicher sind, welchen Gerätetreiber Sie laden müssen, laden Sie das Modul [.filename]#snd_driver#:
+
+[source,bash]
+....
+# kldload snd_driver
+....
+
+Der Treiber [.filename]#snd_driver# ist ein Meta-Treiber, der alle gebräuchlichen Treiber lädt und die Suche nach dem richtigen Treiber vereinfacht. Durch Hinzufügen des Meta-Treibers in [.filename]#/boot/loader.conf# können alternativ alle Audio-Treiber geladen werden.
+
+Um zu ermitteln, welcher Treiber für die Soundkarte vom Meta-Treiber [.filename]#snd_driver# geladen wurde, geben Sie `cat /dev/sndstat` ein.
+
+=== Soundkarten in der Kernelkonfiguration einrichten
+
+Die Unterstützung für die Soundkarte kann auch direkt in den Kernel kompiliert werden. Weitere Informationen über den Bau eines Kernels finden Sie im crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels].
+
+Bei der Verwendung eines eigenen Kernels müssen Sie sicherstellen, dass der Treiber für das Audio-Framework in der Kernelkonfigurationsdatei vorhanden ist:
+
+[.programlisting]
+....
+device sound
+....
+
+Als Nächstes muss die Unterstützung für die Soundkarte hinzugefügt werden. Um das Beispiel mit dem integrierten Intel Audio-Chipsatz aus dem vorherigen Abschnitt fortzusetzen, verwenden Sie die folgende Zeile in der Kernelkonfigurationsdatei:
+
+[.programlisting]
+....
+device snd_hda
+....
+
+Lesen Sie die Manualpage des Treibers, um den entsprechenden Gerätenamen herauszufinden.
+
+Nicht PnP-fähige ISA-Soundkarten benötigen eventuell Einstellungen, wie IRQ und I/O-Port in [.filename]#/boot/device.hints#. Während des Systemstarts liest der man:loader[8] diese Datei und reicht die Einstellungen an den Kernel weiter. Für eine alte Creative SoundBlaster(R) 16 ISA-Karte, die sowohl den man:snd_sbc[4]- als auch den `snd_sb16`-Treiber benötigt, müssen die folgenden Zeilen in die Kernelkonfigurationsdatei eingetragen werden:
+
+[.programlisting]
+....
+device snd_sbc
+device snd_sb16
+....
+
+Wenn die Karte den I/O-Port `0x220` und IRQ `5` benutzt, müssen folgende Zeilen zusätzlich in [.filename]#/boot/device.hints# hinzugefügt werden:
+
+[.programlisting]
+....
+hint.sbc.0.at="isa"
+hint.sbc.0.port="0x220"
+hint.sbc.0.irq="5"
+hint.sbc.0.drq="1"
+hint.sbc.0.flags="0x15"
+....
+
+Die Syntax für [.filename]#/boot/device.hints# wird in man:sound[4], sowie in der Manualpage des jeweiligen Treibers beschrieben.
+
+Das Beispiel verwendet die vorgegebenen Werte. Falls die Karteneinstellungen andere Werte vorgeben, müssen die Werte in der Kernelkonfiguration angepasst werden. Weitere Informationen zu dieser Soundkarte finden Sie in man:snd_sbc[4].
+
+[[sound-testing]]
+=== Die Soundkarte testen
+
+Nachdem Sie den neuen Kernel gestartet oder das erforderliche Modul geladen haben, sollte die Soundkarte erkannt werden. Führen Sie `dmesg | grep pcm` aus, um dies zu überprüfen. Diese Ausgabe stammt von einem System mit einem integrierten Conexant CX20590 Chipsatz:
+
+[source,bash]
+....
+pcm0: <NVIDIA (0x001c) (HDMI/DP 8ch)> at nid 5 on hdaa0
+pcm1: <NVIDIA (0x001c) (HDMI/DP 8ch)> at nid 6 on hdaa0
+pcm2: <Conexant CX20590 (Analog 2.0+HP/2.0)> at nid 31,25 and 35,27 on hdaa1
+....
+
+Der Status der Karte kann auch mit diesem Kommando geprüft werden:
+
+[source,bash]
+....
+# cat /dev/sndstat
+FreeBSD Audio Driver (newpcm: 64bit 2009061500/amd64)
+Installed devices:
+pcm0: <NVIDIA (0x001c) (HDMI/DP 8ch)> (play)
+pcm1: <NVIDIA (0x001c) (HDMI/DP 8ch)> (play)
+pcm2: <Conexant CX20590 (Analog 2.0+HP/2.0)> (play/rec) default
+....
+
+Die Ausgabe kann für jede Soundkarte anders aussehen. Wenn das Gerät [.filename]#pcm# nicht erscheint, prüfen Sie die Kernelkonfigurationsdatei und stellen Sie sicher, dass der richtige Treiber geladen oder in den Kernel kompiliert wurde. Im nächsten Abschnitt werden häufig auftretende Probleme sowie deren Lösungen besprochen.
+
+Jetzt sollte die Soundkarte unter FreeBSD funktionieren. Wenn ein CD- oder DVD-Laufwerk an die Soundkarte angeschlossen ist, können Sie jetzt mit man:cdcontrol[1] eine CD abspielen:
+
+[source,bash]
+....
+% cdcontrol -f /dev/acd0 play 1
+....
+
+[WARNING]
+====
+
+Audio CDs besitzen eine spezielle Kodierung. Daher sollten sie nicht mit man:mount[8] in das Dateisystem eingehangen werden.
+====
+
+Es gibt viele Anwendungen, wie package:audio/workman[], die eine bessere Benutzerschnittstelle besitzen. Zur Wiedergabe von MP3-Audiodateien kann package:audio/mpg123[] installiert werden.
+
+Eine weitere schnelle Möglichkeit die Karte zu prüfen, ist es, Daten an das Gerät [.filename]#/dev/dsp# zu senden:
+
+[source,bash]
+....
+% cat Datei > /dev/dsp
+....
+
+Für [.filename]#Datei# kann eine beliebige Datei verwendet werden. Wenn Sie einige Geräusche hören, funktioniert die Soundkarte.
+
+[NOTE]
+====
+Die Gerätedateien [.filename]#/dev/dsp*# werden automatisch erzeugt, wenn sie das erste Mal benötigt werden. Werden sie nicht verwendet, sind sie hingegen nicht vorhanden und tauchen daher auch nicht in der Ausgabe von man:ls[1] auf.
+====
+
+[[bluetooth-headset]]
+=== Konfiguration von Bluetooth-Soundgeräten
+
+Die Verbindung zu einem Bluetooth-Gerät wird in diesem Abschnitt nicht erläutert. Dazu finden Sie weitere Informationen in crossref:advanced-networking[network-bluetooth,“Bluetooth”].
+
+Damit Bluetooth zusammen mit dem Soundsystem von FreeBSD funktioniert, müssen Benutzer zuerst package:audio/virtual_oss[] installieren:
+
+[source,bash]
+....
+# pkg install virtual_oss
+....
+
+package:audio/virtual_oss[] setzt voraus, dass `cuse` in den Kernel geladen wird:
+
+[source,bash]
+....
+# kldload cuse
+....
+
+Führen Sie folgenden Befehl aus, damit `cuse` beim Systemstart automatisch geladen wird:
+
+[source,bash]
+....
+# sysrc -f /boot/loader.conf cuse_load=yes
+....
+
+Um Kopfhörer mit package:audio/virtual_oss[] zu benutzten, muss nach der Verbindung mit einem Bluetooth-Audiogerät ein virtuelles Gerät erstellt werden:
+
+[source,bash]
+....
+# virtual_oss -C 2 -c 2 -r 48000 -b 16 -s 768 -R /dev/null -P /dev/bluetooth/headphones -d dsp
+....
+
+[NOTE]
+====
+`_headphones_` ist in diesem Beispiel ein Hostname aus [.filename]#/etc/bluetooth/hosts#. Stattdessen kann auch `BT_ADDR` verwendet werden.
+====
+
+Weitere Informationen finden Sie in man:virtual_oss[8].
+
+[[troubleshooting]]
+=== Fehlerbehebung
+
+<<multimedia-sound-common-error-messages>> zeigt typische Fehlermeldungen sowie deren Lösungen:
+
+[[multimedia-sound-common-error-messages]]
+.Typische Fehlermeldungen
+[cols="30%,70%", frame="none", options="header"]
+|===
+| Fehler
+| Lösung
+
+|`sb_dspwr(XX) timed out`
+|
+
+Der I/O-Port ist nicht korrekt angegeben.
+
+|`bad irq XX`
+|
+
+Der IRQ ist falsch angegeben. Stellen Sie sicher, dass der angegebene IRQ mit dem Sound IRQ übereinstimmt.
+
+|`xxx: gus pcm not attached, out of memory`
+|
+
+Es ist nicht genug Speicher verfügbar, um das Gerät zu betreiben.
+
+|`xxx: can't open /dev/dsp!`
+|
+
+Überprüfen Sie mit `fstat | grep dsp` ob eine andere Anwendung das Gerät geöffnet hat. Häufige Störenfriede sind esound oder die Sound-Unterstützung von KDE.
+|===
+
+Moderne Grafikkarten beinhalten oft auch ihre eigenen Soundtreiber, um HDMI zu verwenden. Diese Audiogeräte werden manchmal vor der eigentlichen, separaten Soundkarte aufgeführt und dadurch nicht als das Standardgerät zum Abspielen von Tönen benutzt. Um zu prüfen, ob das der Fall ist, führen Sie dmesg aus und suchen Sie nach der Zeichenfolge `pcm`. Die Ausgabe sieht in etwa so aus:
+
+[.programlisting]
+....
+...
+hdac0: HDA Driver Revision: 20100226_0142
+hdac1: HDA Driver Revision: 20100226_0142
+hdac0: HDA Codec #0: NVidia (Unknown)
+hdac0: HDA Codec #1: NVidia (Unknown)
+hdac0: HDA Codec #2: NVidia (Unknown)
+hdac0: HDA Codec #3: NVidia (Unknown)
+pcm0: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 0 nid 1 on hdac0
+pcm1: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 1 nid 1 on hdac0
+pcm2: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 2 nid 1 on hdac0
+pcm3: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 3 nid 1 on hdac0
+hdac1: HDA Codec #2: Realtek ALC889
+pcm4: <HDA Realtek ALC889 PCM #0 Analog> at cad 2 nid 1 on hdac1
+pcm5: <HDA Realtek ALC889 PCM #1 Analog> at cad 2 nid 1 on hdac1
+pcm6: <HDA Realtek ALC889 PCM #2 Digital> at cad 2 nid 1 on hdac1
+pcm7: <HDA Realtek ALC889 PCM #3 Digital> at cad 2 nid 1 on hdac1
+...
+....
+
+In diesem Beispiel wurde die Grafikkarte (`NVidia`) vor der Soundkarte (`Realtek ALC889`) aufgeführt. Um die Soundkarte als Standardabspielgerät einzusetzen, ändern Sie `hw.snd.default_unit` auf die Einheit, welche für das Abspielen benutzt werden soll:
+
+[source,bash]
+....
+# sysctl hw.snd.default_unit=n
+....
+
+Hier repräsentiert `n` die Nummer der Soundkarte, die verwendet werden soll, in diesem Beispiel also `4`. Sie können diese Änderung dauerhaft machen, indem Sie die folgende Zeile in [.filename]#/etc/sysctl.conf# hinzufügen:
+
+[.programlisting]
+....
+hw.snd.default_unit=4
+....
+
+[[sound-multiple-sources]]
+=== Mehrere Tonquellen abspielen
+
+Oft sollen mehrere Tonquellen gleichzeitig abgespielt werden. FreeBSD verwendet dazu _virtuelle Tonkanäle_. Virtuelle Kanäle mischen die Tonquellen im Kernel, sodass mehrere Kanäle benutzt werden können, als von der Hardware unterstützt werden.
+
+Drei man:sysctl[8] Optionen stehen zur Konfiguration der virtuellen Kanäle zur Verfügung:
+
+[source,bash]
+....
+# sysctl dev.pcm.0.play.vchans=4
+# sysctl dev.pcm.0.rec.vchans=4
+# sysctl hw.snd.maxautovchans=4
+....
+
+Im Beispiel werden vier virtuelle Kanäle eingerichtet, eine im Normalfall ausreichende Anzahl. Sowohl `dev.pcm.0.play.vchans=4` und `dev.pcm.0.rec.vchans=4` sind die Anzahl der virtuellen Kanäle des Geräts [.filename]#pcm0#, die fürs Abspielen und Aufnehmen verwendet werden und sie können konfiguriert werden, sobald das Gerät existiert. Da das Modul [.filename]#pcm# unabhängig von den Hardware-Treibern geladen werden kann, gibt `hw.snd.maxautovchans` die Anzahl der virtuellen Kanäle an, die später eingerichtete Audiogeräte erhalten. Lesen Sie man:pcm[4] für weitere Informationen.
+
+[NOTE]
+====
+Die Anzahl der virtuellen Kanäle kann nicht geändert werden, solange das Gerät genutzt wird. Schließen Sie daher zuerst alle Programme wie Musikabspielprogramme oder Sound-Daemonen, die auf dieses Gerät zugreifen.
+====
+
+Die korrekte [.filename]#pcm#-Gerätedatei wird automatisch zugeteilt, wenn ein Programm das Gerät [.filename]#/dev/dsp0# anfordert.
+
+=== Den Mixer einstellen
+
+Die Voreinstellungen des Mixers sind im Treiber man:pcm[4] fest kodiert. Es gibt zwar viele Anwendungen und Dienste, die den Mixer einstellen können und die eingestellten Werte bei jedem Start wieder setzen, am einfachsten ist es allerdings, die Standardwerte für den Mixer direkt im Treiber einzustellen. Der Mixer kann mit den entsprechenden Werten in [.filename]#/boot/device.hints# eingestellt werden:
+
+[.programlisting]
+....
+hint.pcm.0.vol="50"
+....
+
+Die Zeile setzt die Lautstärke des Mixers beim Laden des Moduls man:pcm[4] auf den Wert `50`.
+
+[[sound-mp3]]
+== MP3-Audio
+
+Dieser Abschnitt beschreibt einige unter FreeBSD verfügbare MP3-Player. Zudem wird beschrieben, wie Audio-CDs gerippt und MP3s kodiert und dekodiert werden.
+
+[[mp3-players]]
+=== MP3-Player
+
+Ein beliebter graphischer MP3-Player ist Audacious, welcher WinAmp-Skins und zusätzliche Plugins unterstützt. Die Benutzerschnittstelle ist leicht zu erlernen und enthält eine Playlist, einen graphischen Equalizer und vieles mehr. Diejenigen, die bereits mit WinAmp vertraut sind, werden Audacious sehr leicht zu benutzen finden. Unter FreeBSD kann Audacious als Port oder Paket package:multimedia/audacious[] installiert werden. Audacious ist ein Ableger von XMMS.
+
+Das Paket package:audio/mpg123[] ist ein alternativer, kommandozeilenorientierter MP3-Player. Nach der Installation kann die abzuspielende MP3-Datei auf der Kommandozeile angegeben werden. Geben Sie auch das entsprechende Soundkarte an, falls das System über mehrere Audiogeräte verfügt:
+
+[source,bash]
+....
+# mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3
+High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3
+ version 1.18.1; written and copyright by Michael Hipp and others
+ free software (LGPL) without any warranty but with best wishes
+
+Playing MPEG stream from Foobar-GreatestHits.mp3 ...
+MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo
+....
+
+Weitere MP3-Player stehen in der FreeBSD Ports-Sammlung zur Verfügung.
+
+[[rip-cd]]
+=== CD-Audio Tracks rippen
+
+Bevor eine ganze CD oder einen CD-Track in das MP3-Format umgewandelt werden kann, müssen die Audiodaten von der CD auf die Festplatte gerippt werden. Dabei werden die CDDA (CD Digital Audio) Rohdaten in WAV-Dateien kopiert.
+
+Die Anwendung `cdda2wav`, die im package:sysutils/cdrtools[] Paket enthalten ist, kann zum Rippen der Audiodaten von CDs genutzt werden.
+
+Wenn die Audio CD in dem Laufwerk liegt, kann der folgende Befehl als `root` ausgeführt werden, um eine ganze CD in einzelne WAV-Dateien zu rippen:
+
+[source,bash]
+....
+# cdda2wav -D 0,1,0 -B
+....
+
+In diesem Beispiel bezieht sich der Schalter `-D _0,1,0_` auf das SCSI-Gerät [.filename]#0,1,0#, das die zu rippende CD enthält. Benutzen Sie `cdrecord -scanbus` um die richtigen Geräteparameter für das System zu bestimmen.
+
+Um einzelne Tracks zu rippen, benutzen Sie `-t` wie folgt:
+
+[source,bash]
+....
+# cdda2wav -D 0,1,0 -t 7
+....
+
+Um mehrere Tracks zu rippen, zum Beispiel die Tracks eins bis sieben, können Sie wie folgt einen Bereich angeben:
+
+[source,bash]
+....
+# cdda2wav -D 0,1,0 -t 1+7
+....
+
+Wenn Sie von einem ATAPI (IDE) CD-ROM-Laufwerk rippen, geben Sie den Gerätenamen anstelle der SCSI-Gerätenummer an. Dieses Beispiel rippt Track 7 von einem IDE-Laufwerk:
+
+[source,bash]
+....
+# cdda2wav -D /dev/acd0 -t 7
+....
+
+Alternativ können mit `dd` ebenfalls Audio-Stücke von ATAPI-Laufwerken kopiert werden. Dies wird in crossref:disks[duplicating-audiocds,“Kopieren von Audio-CDs”] erläutert.
+
+[[mp3-encoding]]
+=== MP3-Dateien kodieren und dekodieren
+
+Lame ist ein weitverbreiteter MP3-Encoder, der als Port package:audio/lame[] installiert werden kann. Wegen Patentproblemen ist kein Paket verfügbar.
+
+Der folgende Befehl konvertiert die gerippte WAV-Datei [.filename]#audio01.wav# in [.filename]#audio01.mp3# um:
+
+[source,bash]
+....
+# lame -h -b 128 --tt "Foo Liedtietel" --ta "FooBar Künstler" --tl "FooBar Album" \
+--ty "2014" --tc "Gerippt und kodiert von Foo" --tg "Musikrichtung" audio01.wav audio01.mp3
+....
+
+128 kbits ist die gewöhnliche MP3-Bitrate, wohingegen die Bitraten 160 und 192 kbits eine höhere Qualität bieten. Je höher die Bitrate ist, desto mehr Speicherplatz benötigt die resultierende MP3-Datei. Die Option `-h` verwendet den "higher quality but a little slower" (höhere Qualität, aber etwas langsamer) Modus. Die Schalter, die mit `--t` beginnen, sind ID3-Tags, die in der Regel Informationen über das Lied enthalten und in die MP3-Datei eingebettet sind. Weitere Optionen können in der Manualpage von lame nachgelesen werden.
+
+Um aus MP3-Dateien eine Audio CD zu erstellen, müssen diese zuerst in ein nicht komprimiertes Format umgewandelt werden. Verwenden Sie XMMS um die Datei im WAV-Format zu schreiben und mpg123, um die MP3-Datei in rohe PCM-Audiodaten umzuwandeln.
+
+Um [.filename]#audio01.mp3# mit mpg123 umzuwandeln, geben Sie den Namen der PCM-Datei an:
+
+[source,bash]
+....
+# mpg123 -s audio01.mp3 > audio01.pcm
+....
+
+So verwenden Sie XMMS um eine MP3-Datei in das WAV-Format zu konvertieren:
+
+[.procedure]
+*Procedure: Mit XMMS in das WAV-Format konvertieren*
+. Starten Sie XMMS.
+. Klicken Sie mit der rechten Maustaste, um das XMMS-Menu zu öffnen.
+. Wählen Sie `Preferences` im Untermenü `Options`.
+. Ändern Sie das Output-Plugin in "Disk Writer Plugin".
+. Drücken Sie `Configure`.
+. Geben Sie ein Verzeichnis ein, in das Sie die unkomprimierte Datei schreiben wollen.
+. Laden Sie die MP3-Datei wie gewohnt in XMMS mit einer Lautstärke von 100% und einem abgeschalteten EQ.
+. Drücken Sie `Play` und es wird so aussehen, als spiele XMMS die MP3-Datei ab, aber keine Musik ist zu hören. Der Player überspielt die MP3-Datei in eine Datei.
+. Vergessen Sie nicht, das Output-Plugin wieder in den Ausgangszustand zurückzusetzen um wieder MP3-Dateien anhören zu können.
+
+cdrecord kann mit beiden Formaten Audio-CDs erstellen. Der Dateikopf von WAV-Dateien erzeugt am Anfang des Stücks ein Knacken. Der Dateikopf mit dem Port oder Paket package:audio/sox[] entfernt werden:
+
+[source,bash]
+....
+% sox -t wav -r 44100 -s -w -c 2 track.wav track.raw
+....
+
+Lesen Sie crossref:disks[creating-cds,“Erstellen und Verwenden von CDs”], um mehr Informationen zur Benutzung von CD-Brennern mit FreeBSD zu erhalten.
+
+[[video-playback]]
+== Videos wiedergeben
+
+Bevor Sie beginnen, sollten Sie das Modell und den benutzten Chip der Videokarte kennen. Obwohl Xorg viele Videokarten unterstützt, können nicht alle Karten Videos schnell genug wiedergeben. Eine Liste der Erweiterungen, die der Xorg-Server für eine Videokarte unterstützt, erhalten Sie unter laufendem Xorg mit `xdpyinfo`.
+
+Halten Sie eine kurze MPEG-Datei bereit, mit der Sie Wiedergabeprogramme und deren Optionen testen können. Da einige DVD-Spieler in der Voreinstellung das DVD-Gerät mit [.filename]#/dev/dvd# ansprechen oder diesen Namen fest einkodiert haben, ist es vielleicht hilfreich symbolische Links auf die richtigen Geräte anzulegen:
+
+[source,bash]
+....
+# ln -sf /dev/acd0 /dev/dvd
+....
+
+Aufgrund der Beschaffenheit man:devfs[5] gehen gesondert angelegte Links wie diese bei einem Neustart des Systems verloren. Damit die symbolischen Links automatisch beim Neustart des Systems angelegt werden, fügen Sie die folgende Zeile in [.filename]#/etc/devfs.conf# ein:
+
+[.programlisting]
+....
+link acd0 dvd
+....
+
+Das Entschlüsseln von DVDs erfordert den Aufruf bestimmter Funktionen, sowie Schreibzugriff auf das DVD-Gerät.
+
+Xorg benutzt Shared-Memory und es wird empfohlen, die nachstehenden man:sysctl[8]-Variablen auf die gezeigten Werte zu erhöhen:
+
+[.programlisting]
+....
+kern.ipc.shmmax=67108864
+kern.ipc.shmall=32768
+....
+
+[[video-interface]]
+=== Video-Schnittstellen
+
+Es gibt einige Möglichkeiten, Videos unter Xorg abzuspielen. Welche Möglichkeit funktioniert, hängt stark von der verwendeten Hardware ab.
+
+Gebräuchliche Video-Schnittstellen sind:
+
+. Xorg: normale Ausgabe über Shared-Memory.
+. XVideo: Eine Erweiterung der Xorg-Schnittstelle, die Videos in jedem X11-Drawable anzeigen kann. Diese Erweiterung bietet auch auf leistungsschwachen Maschinen eine gute Qualität der Wiedergabe. Der nächste Abschnitt beschreibt, wie Sie feststellen, ob diese Erweiterung ausgeführt wird.
+. SDL: Simple DirectMedia Layer ist eine portable Schnittstelle für verschiedene Betriebssysteme, mit denen Anwendungen plattformunabhängig und effizient Ton und Grafik benutzen können. SDL bietet eine hardwarenahe Schnittstelle, die manchmal schneller ist als die Xorg-Schnittstelle. Unter FreeBSD kann SDL über das Paket oder den Port package:devel/sdl20[] installiert werden.
+. DGA: Direct Graphics Access ist eine Xorg-Erweiterung die es Anwendungen erlaubt, am Xorg-Server vorbei direkt in den Framebuffer zu schreiben. Da die Anwendung und der Xorg-Server auf gemeinsame Speicherbereiche zugreifen, müssen die Anwendungen unter dem Benutzer `root` laufen. Die DGA-Erweiterung kann mit man:dga[1] getestet werden. Wenn DGA ausgeführt wird, ändert sich die Farbe des Bildschrims, wenn eine Taste gedrückt wird. Drücken Sie zum Beenden kbd:[q].
+. SVGAlib: Eine Schnittstelle zur Grafikausgabe auf der Konsole.
+
+[[video-interface-xvideo]]
+==== XVideo
+
+Ob die Erweiterung läuft, entnehmen Sie der Ausgabe von `xvinfo`:
+
+[source,bash]
+....
+% xvinfo
+....
+
+XVideo wird untertsützt, wenn die Ausgabe in etwa wie folgt aussieht:
+
+[source,bash]
+....
+X-Video Extension version 2.2
+screen #0
+ Adaptor #0: "Savage Streams Engine"
+ number of ports: 1
+ port base: 43
+ operations supported: PutImage
+ supported visuals:
+ depth 16, visualID 0x22
+ depth 16, visualID 0x23
+ number of attributes: 5
+ "XV_COLORKEY" (range 0 to 16777215)
+ client settable attribute
+ client gettable attribute (current value is 2110)
+ "XV_BRIGHTNESS" (range -128 to 127)
+ client settable attribute
+ client gettable attribute (current value is 0)
+ "XV_CONTRAST" (range 0 to 255)
+ client settable attribute
+ client gettable attribute (current value is 128)
+ "XV_SATURATION" (range 0 to 255)
+ client settable attribute
+ client gettable attribute (current value is 128)
+ "XV_HUE" (range -180 to 180)
+ client settable attribute
+ client gettable attribute (current value is 0)
+ maximum XvImage size: 1024 x 1024
+ Number of image formats: 7
+ id: 0x32595559 (YUY2)
+ guid: 59555932-0000-0010-8000-00aa00389b71
+ bits per pixel: 16
+ number of planes: 1
+ type: YUV (packed)
+ id: 0x32315659 (YV12)
+ guid: 59563132-0000-0010-8000-00aa00389b71
+ bits per pixel: 12
+ number of planes: 3
+ type: YUV (planar)
+ id: 0x30323449 (I420)
+ guid: 49343230-0000-0010-8000-00aa00389b71
+ bits per pixel: 12
+ number of planes: 3
+ type: YUV (planar)
+ id: 0x36315652 (RV16)
+ guid: 52563135-0000-0000-0000-000000000000
+ bits per pixel: 16
+ number of planes: 1
+ type: RGB (packed)
+ depth: 0
+ red, green, blue masks: 0x1f, 0x3e0, 0x7c00
+ id: 0x35315652 (RV15)
+ guid: 52563136-0000-0000-0000-000000000000
+ bits per pixel: 16
+ number of planes: 1
+ type: RGB (packed)
+ depth: 0
+ red, green, blue masks: 0x1f, 0x7e0, 0xf800
+ id: 0x31313259 (Y211)
+ guid: 59323131-0000-0010-8000-00aa00389b71
+ bits per pixel: 6
+ number of planes: 3
+ type: YUV (packed)
+ id: 0x0
+ guid: 00000000-0000-0000-0000-000000000000
+ bits per pixel: 0
+ number of planes: 0
+ type: RGB (packed)
+ depth: 1
+ red, green, blue masks: 0x0, 0x0, 0x0
+....
+
+Einige der aufgeführten Formate, wie YUV2 oder YUV12 existieren in machen XVideo-Implementierungen nicht. Dies kann zu Problemen mit einigen Spielern führen.
+
+XVideo wird wahrscheinlich von der Karte nicht unterstützt, wenn die Ausgabe wie folgt aussieht:
+
+[source,bash]
+....
+X-Video Extension version 2.2
+screen #0
+no adaptors present
+....
+
+Wenn die XVideo-Erweiterung auf der Karte nicht läuft, wird es nur etwas schwieriger, die Anforderungen für die Wiedergabe von Videos zu erfüllen.
+
+[[video-ports]]
+=== Video-Anwendungen
+
+Dieser Abschnitt behandelt Anwendungen aus der FreeBSD-Ports-Sammlung, die für die Wiedergabe von Videos genutzt werden können.
+
+[[video-mplayer]]
+==== MPlayer und MEncoder
+
+MPlayer ist ein auf Geschwindigkeit und Flexibilität ausgelegter Video-Spieler für die Kommandozeile mit optionaler graphischer Oberfläche. Weitere graphische Oberflächen für MPlayer stehen in der FreeBSD Ports-Sammlung zur Verfügung.
+
+MPlayer kann als Paket oder Port package:multimedia/mplayer[] installiert werden. Der Bau von MPlayer berücksichtigt die vorhandene Hardware und es können zahlreiche Optionen ausgewählt werden. Aus diesen Gründen ziehen es manche Benutzer vor, den Port zu übersetzen, anstatt das Paket zu installieren.
+
+Die Optionen sollten beim Bau des Ports überprüft werden, um dem Umfang der Unterstützung, mit dem der Port gebaut wird, zu bestimmen. Wenn eine Option nicht ausgewählt wird, ist MPlayer nicht in der Lage, diese Art von Video-Format wiederzugeben. Mit den Pfeiltasten und der Leertaste können die erforderlichen Formate ausgewählt werden. Wenn Sie fertig sind, drücken Sie kbd:[Enter], um den Bau und die Installation fortzusetzen.
+
+In der Voreinstellung wird das Paket oder der Port das `mplayer`-Kommandozeilenprogramm und das graphische Programm `gmplayer` bauen. Um Videos zu dekodieren, installieren Sie den Port package:multimedia/mencoder[]. Aus lizenzrechtlichen Gründen steht ein Paket von MEncoder nicht zur Verfügung.
+
+MPlayer erstellt beim ersten Start [.filename]#~/.mplayer# im Heimatverzeichnis des Benutzers. Dieses Verzeichnis enthält die voreingestellten Konfigurationseinstellungen für den Benutzer.
+
+Dieser Abschnitt beschreibt nur ein paar wenige Anwendungsmöglichkeiten. Eine vollständige Beschreibung der zahlreichen Möglichkeiten finden Sie in der Manualpage von mplayer(1).
+
+Um die Datei [.filename]#testfile.avi# abzuspielen, geben Sie die Video-Schnittstelle mit `-vo` an:
+
+[source,bash]
+....
+% mplayer -vo xv testfile.avi
+....
+
+[source,bash]
+....
+% mplayer -vo sdl testfile.avi
+....
+
+[source,bash]
+....
+% mplayer -vo x11 testfile.avi
+....
+
+[source,bash]
+....
+# mplayer -vo dga testfile.avi
+....
+
+[source,bash]
+....
+# mplayer -vo 'sdl:dga' testfile.avi
+....
+
+Es lohnt sich, alle Option zu testen. Die erzielte Geschwindigkeit hängt von vielen Faktoren ab und variiert beträchtlich je nach eingesetzter Hardware.
+
+Wenn Sie eine DVD abspielen wollen, ersetzen Sie [.filename]#testfile.avi# durch `-dvd://__N Gerät__`. `_N_` ist die Nummer des Stücks, das Sie abspielen wollen und [.filename]#Gerät# gibt den Gerätenamen der DVD an. Das nachstehende Kommando spielt das dritte Stück von [.filename]#/dev/dvd#:
+
+[source,bash]
+....
+# mplayer -vo dga -dvd://3 /dev/dvd
+....
+
+[NOTE]
+====
+Das standardmäßig verwendete DVD-Laufwerk kann beim Bau des MPlayer-Ports mit der Option `WITH_DVD_DEVICE=/pfad/zum/gerät` festgelegt werden. Die Voreinstellung verwendet das Gerät [.filename]#/dev/cd0#. Weitere Details finden Sie in [.filename]#Makefile.options# des Ports.
+====
+
+Die Tastenkombinationen zum Abbrechen, Anhalten und Weiterführen der Wiedergabe entnehmen Sie der Ausgabe von `mplayer -h` oder der mplayer(1) Manualpage.
+
+Weitere nützliche Optionen für die Wiedergabe sind `-fs -zoom` zur Wiedergabe im Vollbild-Modus und `-framedrop` zur Steigerung der Geschwindigkeit.
+
+Jeder Benutzer kann häufig verwendete Optionen in seine [.filename]#~/.mplayer/config# eintragen:
+
+[.programlisting]
+....
+vo=xv
+fs=yes
+zoom=yes
+....
+
+`mplayer` kann verwendet werden, um DVD-Stücke in [.filename]#.vob#-Dateien zu rippen. Das zweite Stück einer DVD wandeln Sie wie folgt in eine Datei um:
+
+[source,bash]
+....
+# mplayer -dumpstream -dumpfile out.vob -dvd://2 /dev/dvd
+....
+
+Die Ausgabedatei [.filename]#out.vob# wird im MPEG-Format abgespeichert.
+
+Jeder Benutzer, der mehr Informationen über Video unter UNIX(R) sammeln möchte, sollte http://www.mplayerhq.hu/DOCS/[ mplayerhq.hu/DOCS] konsultieren, da es technisch sehr informativ ist. Diese Dokumentation sollte ebenfalls studiert werden, bevor Fehlerberichte eingereicht werden.
+
+Vor der Verwendung von `mencoder` ist es hilfreich, sich mit den auf http://www.mplayerhq.hu/DOCS/HTML/en/mencoder.html[mplayerhq.hu/DOCS/HTML/en/mencoder.html] beschriebenen Optionen vertraut zu machen. Es gibt unzählige Möglichkeiten die Qualität zu verbessern, die Bitrate zu verringern und Formate zu konvertieren. Einige davon haben erhebliche Auswirkungen auf die Geschwindigkeit. Falsche Kombinationen von Kommandozeilenparametern ergeben eventuell Dateien, die selbst `mplayer` nicht mehr wiedergeben kann.
+
+Hier ist ein Beispiel für eine einfache Kopie:
+
+[source,bash]
+....
+% mencoder input.avi -oac copy -ovc copy -o output.avi
+....
+
+Wenn Sie in eine Datei rippen, benutzen Sie die Option `-dumpfile` von `mplayer`.
+
+Um [.filename]#input.avi# nach MPEG4 mit MPEG3 für den Ton zu konvertieren, muss zunächst der Port package:audio/lame[] installiert werden. Aus lizenzrechtlichen Gründen ist ein Paket nicht verfügbar. Wenn der Port installiert ist, geben Sie ein:
+
+[source,bash]
+....
+% mencoder input.avi -oac mp3lame -lameopts br=192 \
+ -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi
+....
+
+Die Ausgabedatei lässt sich mit Anwendungen wie `mplayer` oder `xine` abspielen.
+
+[.filename]#input.avi# kann durch `-dvd://1 /dev/dvd` ersetzt und das Kommando als `root` ausgeführt werden, um ein DVD-Stück direkt zu konvertieren. Da vielleicht ein paar Versuche nötig sind, um das gewünschte Ergebnis zu erhalten, empfiehlt es sich das Stück zuerst in eine Datei zu schreiben und anschließend die Datei weiter zu bearbeiten.
+
+[[video-xine]]
+==== Der Video-Spieler xine
+
+xine ist ein Video-Spieler mit einer wiederverwendbaren Bibliothek und ein Programm, das durch Plugins erweitert werden kann. Es kann als Paket oder Port package:multimedia/xine[] installiert werden.
+
+Für einen reibungslosen Betrieb benötigt xine entweder eine schnelle CPU mit einer schnellen Grafikkarte, oder die XVideo-Erweiterung. Am schnellsten läuft xine mit der XVideo-Erweiterung.
+
+In der Voreinstellung startet xine eine grafische Benutzeroberfläche. Über die Menüs können dann bestimmte Dateien geöffnet werden.
+
+Alternativ kann xine auch über die Kommandozeile aufgerufen werden, um Dateien direkt wiederzugeben:
+
+[source,bash]
+....
+% xine -g -p mymovie.avi
+....
+
+Weitere Informationen und Tipps zur Fehlerbehebung finden Sie unter http://www.xine-project.org/faq[xine-project.org/faq].
+
+[[video-ports-transcode]]
+==== Die Transcode-Werkzeuge
+
+Transcode ist eine Sammlung von Werkzeugen zur Umwandlung von Video- und Audio-Dateien. Transcode mischt Video-Dateien und kann kaputte Video-Dateien reparieren. Die Werkzeuge werden als Filter verwendet, das heißt die Ein- und Ausgaben verwenden stdin/stdout.
+
+Unter FreeBSD kann Transcode als Paket oder Port package:multimedia/transcode[] installiert werden. Viele Benutzer bevorzugen es den Port zu bauen, da er ein Menü bereitstellt, wo die entsprechenden Formate für den Bau ausgewählt werden können. Mit den Pfeiltasten und der Leertaste können die erforderlichen Formate ausgewählt werden. Wenn Sie fertig sind, drücken Sie kbd:[Enter], um den Bau und die Installation fortzusetzen.
+
+Dieses Beispiel zeigt, wie eine DivX-Datei in eine PAL MPEG-1-Datei konvertiert wird:
+
+[source,bash]
+....
+% transcode -i input.avi -V --export_prof vcd-pal -o output_vcd
+% mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa
+....
+
+Die daraus resultierende MPEG-Datei, [.filename]#output_vcd.mpg#, kann beispielsweise mit MPlayer abgespielt werden. Die Datei kann auch mit einem Programm wie package:multimedia/vcdimager[] oder package:sysutils/cdrdao[] als Video-CD auf eine CD-R gebrannt werden.
+
+Zusätzlich zu der Manualpage von `transcode`, sollten Sie auch die Informationen und Beispiele im http://www.transcoding.org/cgi-bin/transcode[ transcoding.org/cgi-bin/transcode] lesen.
+
+[[tvcard]]
+== TV-Karten
+
+Mit TV-Karten können Sie mit dem Rechner über Kabel oder Antenne fernsehen. Die meisten Karten besitzen einen RCA- oder S-Video-Eingang. Einige Karten haben auch einen FM-Radio-Empfänger.
+
+Der man:bktr[4]-Treiber von FreeBSD unterstützt PCI-TV-Karten mit einem Brooktree Bt848/849/878/879 Chip. Dieser Teiber unterstützt die meisten Pinnacle PCTV Karten. Die Karte sollte einen der unterstützten Empfänger besitzen, die in man:bktr[4] aufgeführt sind.
+
+=== Den Treiber laden
+
+Um die Karte benutzen zu können, muss der man:bktr[4]-Treiber geladen werden. Damit dies beim Systemstart automatisch erfolgt, muss die folgende Zeile in [.filename]#/boot/loader.conf# hinzugefügt werden:
+
+[.programlisting]
+....
+bktr_load="YES"
+....
+
+Alternativ kann der Treiber für die TV-Karte auch fest in den Kernel kompiliert werden. In diesem Fall müssen folgende Zeilen in die Kernelkonfigurationsdatei aufgenommen werden:
+
+[.programlisting]
+....
+device bktr
+device iicbus
+device iicbb
+device smbus
+....
+
+Die zusätzlichen Treiber werden benötigt, da die Komponenten der Karte über einen I2C-Bus verbunden sind. Bauen und installieren Sie dann den neuen Kernel.
+
+Um den Treiber zu testen, muss das System neu gestartet werden. Während des Neustarts sollte die TV-Karte erkannt werden:
+
+[.programlisting]
+....
+bktr0: <BrookTree 848A> mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0
+iicbb0: <I2C bit-banging driver> on bti2c0
+iicbus0: <Philips I2C bus> on iicbb0 master-only
+iicbus1: <Philips I2C bus> on iicbb0 master-only
+smbus0: <System Management Bus> on bti2c0
+bktr0: Pinnacle/Miro TV, Philips SECAM tuner.
+....
+
+Abhängig von der verwendeten Hardware können die Meldungen natürlich anders aussehen. Die entdeckten Geräte lassen sich mit man:sysctl[8] oder in der Kernelkonfigurationsdatei überschreiben. Wenn Sie beispielsweise einen Philips-SECAM-Empfänger erzwingen wollen, fügen Sie die folgende Zeile zur Kernelkonfigurationsdatei hinzu:
+
+[.programlisting]
+....
+options OVERRIDE_TUNER=6
+....
+
+Alternativ können Sie man:sysctl[8] benutzen:
+
+[source,bash]
+....
+# sysctl hw.bt848.tuner=6
+....
+
+Weitere Informationen zu den verschiedenen Kerneloptionen und man:sysctl[8]-Parametern finden Sie in man:bktr[4].
+
+=== Nützliche Anwendungen
+
+Um die TV-Karte zu benutzen, installieren Sie eine der nachstehenden Anwendungen:
+
+* package:multimedia/fxtv[] lässt das Fernsehprogramm in einem Fenster laufen und kann Bilder, Audio und Video aufzeichnen.
+* package:multimedia/xawtv[] eine weitere TV-Anwendung mit vergleichbaren Funktionen.
+* Mit package:audio/xmradio[] lässt sich der FM-Radio-Empfänger, der sich auf TV-Karten befindet, benutzen.
+
+Weitere Anwendungen finden Sie in der FreeBSD Ports-Sammlung.
+
+=== Fehlersuche
+
+Wenn Sie Probleme mit der TV-Karte haben, prüfen Sie zuerst, ob der Video-Capture-Chip und der Empfänger vom man:bktr[4]-Treiber unterstützt werden und ob Sie die richtigen Optionen verwenden. Weitere Hilfe zu unterstützten TV-Karten finden Sie auf der Mailingliste {freebsd-multimedia}.
+
+[[mythtv]]
+== MythTV
+
+MythTV ist eine beliebte Open Source PVR-Anwendung. Dieser Abschnitt beschreibt die Installation und Konfiguration von MythTV unter FreeBSD. Weitere Informationen zur Benutzung von MythTV finden Sie unter http://www.mythtv.org/wiki/[mythtv.org/wiki].
+
+MythTV benötigt ein Frontend und ein Backend. Diese Komponenten können entweder auf dem gleichen System, oder auf unterschiedlichen Maschinen installiert werden.
+
+Das Frontend kann unter FreeBSD über den Port oder das Paket package:multimedia/mythtv-frontend[] installiert werden. Zudem muss Xorg, wie in crossref:x11[x11,Das X-Window-System] beschrieben, installiert und konfiguriert sein. Idealerweise besitzt das System auch eine Videokarte, die X-Video Motion Compensation (XvMC) unterstützt, sowie optional eine LIRC-kompatible Fernbedienung.
+
+Benutzen Sie package:multimedia/mythtv[], um sowohl das Frontend als auch das Backend zu installieren. Ein MySQL(TM) Datenbank-Server ist ebenfalls erforderlich und sollte automatisch als Abhängigkeit installiert werden. Optional sollte das System einen Empfänger und ausreichend Speicherplatz haben, um die aufgezeichneten Daten speichern zu können.
+
+=== Hardware
+
+MythTV verwendet V4L um auf Videoeingabegeräte, wie Kodierer und Empfänger zuzugreifen. Unter FreeBSD funktioniert MythTV am besten mit USB DVB-S/C/T Karten, die von package:multimedia/webcamd[] unterstützt werden, da dies eine V4L-Anwendung zur Verfügung stellt, die als Benutzerprogramm läuft. Jede DVB-Karte, die von webcamd unterstützt wird, sollte mit MythTV funktionieren, jedoch gibt es eine Liste von Karten, die unter https://wiki.freebsd.org/WebcamCompat[ wiki.freebsd.org/WebcamCompat] abgerufen werden kann. Es existieren auch Treiber für Hauppauge-Karten in den folgenden Paketen: package:multimedia/pvr250[] und package:multimedia/pvrxxx[], allerdings liefern diese nur eine Treiberschnittstelle, die nicht dem Standard entspricht und die nicht mit MythTV-Versionen grösser als 0.23 funktionieren. Aus lizenzrechtlichen Gründen ist ein Paket nicht verfügbar, sodass die beiden Ports übersetzt werden müssen.
+
+Die https://wiki.freebsd.org/HTPC[ wiki.freebsd.org/HTPC] enthält eine Liste von allen verfügbaren DVB-Treibern.
+
+=== MythTV Backend einrichten
+
+Geben Sie folgendes ein, um MythTV als Binärpaket zu installieren:
+
+[source,bash]
+....
+# pkg install mythtv
+....
+
+Alternativ können Sie den Port installieren:
+
+[source,bash]
+....
+# cd /usr/ports/multimedia/mythtv
+# make install
+....
+
+Richten Sie anschließend die MythTV-Datenbank ein:
+
+[source,bash]
+....
+# mysql -uroot -p < /usr/local/shared/mythtv/database/mc.sql
+....
+
+Konfigurieren Sie dann das Backend:
+
+[source,bash]
+....
+# mythtv-setup
+....
+
+Zum Schluss starten Sie das Backend:
+
+[source,bash]
+....
+# sysrc mythbackend_enable=yes
+# service mythbackend start
+....
+
+[[scanners]]
+== Scanner
+
+Unter FreeBSD stellt SANE (Scanner Access Now Easy) aus der Ports-Sammlung eine einheitliche Schnittstelle (API) für den Zugriff auf Scanner bereit. SANE wiederum greift auf Scanner mithilfe einiger FreeBSD-Treiber zu.
+
+FreeBSD unterstützt sowohl SCSI- als auch USB-Scanner. Abhängig von der Schnittstelle des Scanners, werden unterschiedliche Treiber benötigt. Prüfen Sie vor der Konfiguration mithilfe der http://www.sane-project.org/sane-supported-devices.html[Liste der unterstützten Geräte] ob der Scanner von SANE unterstützt wird.
+
+Dieses Kapitel beschreibt, wie Sie feststellen können, ob der Scanner von FreeBSD erkannt wurde. Zudem enthält es einen Überblick über die Konfiguration und Verwendung von SANE unter FreeBSD.
+
+[[scanners-kernel-usb]]
+=== Den Scanner überprüfen
+
+Im [.filename]#GENERIC#-Kernel sind schon alle, für einen USB-Scanner notwendigen Treiber enthalten. Benutzer mit einem angepassten Kernel sollten sicherstellen, dass die Kernelkonfiguration die nachstehenden Zeilen enthält:
+
+[.programlisting]
+....
+device usb
+device uhci
+device ohci
+device ehci
+device xhci
+....
+
+Um zu überprüfen ob der Scanner erkannt wird, schließen Sie den USB-Scanner an. Prüfen Sie dann mit man:dmesg[8], ob der Scanner in den Systemmeldungen erscheint:
+
+[source,bash]
+....
+ugen0.2: <EPSON> at usbus0
+....
+
+In diesem Beispiel wurde ein EPSON Perfection(R) 1650 USB-Scanner an [.filename]#/dev/ugen0.2# erkannt.
+
+Wenn der Scanner eine SCSI-Schnittstelle besitzt, ist die Kernelkonfiguration abhängig vom verwendeten SCSI-Controller. Der [.filename]#GENERIC#-Kernel unterstützt die gebräuchlichen SCSI-Controller. Den richtigen Treiber finden Sie in [.filename]#/usr/src/sys/conf/NOTES#. Neben dem SCSI-Treiber muss die Kernelkonfiguration noch die nachstehenden Zeilen enthalten:
+
+[.programlisting]
+....
+device scbus
+device pass
+....
+
+Nachdem Sie einen Kernel gebaut und installiert haben, sollte der Scanner beim Neustart in den Systemmeldungen erscheinen:
+
+[source,bash]
+....
+pass2 at aic0 bus 0 target 2 lun 0
+pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device
+pass2: 3.300MB/s transfers
+....
+
+Wenn der Scanner während des Systemstarts ausgeschaltet war, können Sie die Geräteerkennung erzwingen, indem Sie den SCSI-Bus erneut absuchen. Verwenden Sie dazu `camcontrol`:
+
+[source,bash]
+....
+# camcontrol rescan all
+Re-scan of bus 0 was successful
+Re-scan of bus 1 was successful
+Re-scan of bus 2 was successful
+Re-scan of bus 3 was successful
+....
+
+Der Scanner sollte jetzt in der SCSI-Geräteliste erscheinen:
+
+[source,bash]
+....
+# camcontrol devlist
+<IBM DDRS-34560 S97B> at scbus0 target 5 lun 0 (pass0,da0)
+<IBM DDRS-34560 S97B> at scbus0 target 6 lun 0 (pass1,da1)
+<AGFA SNAPSCAN 600 1.10> at scbus1 target 2 lun 0 (pass3)
+<PHILIPS CDD3610 CD-R/RW 1.00> at scbus2 target 0 lun 0 (pass2,cd0)
+....
+
+Weitere Informationen über SCSI-Geräte unter FreeBSD finden Sie in man:scsi[4] und man:camcontrol[8].
+
+=== SANE konfigurieren
+
+Das SANE-System ermöglicht den Zugriff auf den Scanner über Backends (package:graphics/sane-backends[]). Lesen Sie http://www.sane-project.org/sane-supported-devices.html[http://www.sane-project.org/sane-supported-devices.html] um herauszufinden, welches Backend welchen Scanner unterstützt. Eine graphische Oberfläche wird über Anwendungen von Drittanbietern wie Kooka (package:graphics/kooka[]) oder XSane (package:graphics/xsane[]) bereitgestellt. Die Backends von SANE reichen aus, um den Scanner zu testen.
+
+Installieren Sie die Backends als Paket:
+
+[source,bash]
+....
+# pkg install sane-backends
+....
+
+Alternativ können Sie die Backends aus der Ports-Sammlung installieren:
+
+[source,bash]
+....
+# cd /usr/ports/graphics/sane-backends
+# make install clean
+....
+
+Nachdem Sie den Port oder das Paket package:graphics/sane-backends[] installiert haben, können Sie mit dem Befehl `sane-find-scanner` prüfen, ob SANE den Scanner erkennt:
+
+[source,bash]
+....
+# sane-find-scanner -q
+found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3
+....
+
+Die Ausgabe zeigt die Schnittstelle und die verwendete Gerätedatei des Scanners. Der Hersteller und das Modell können in der Ausgabe fehlen.
+
+[NOTE]
+====
+Bei einigen USB-Scannern muss die Firmware geladen werden. Lesen Sie sane-find-scanner(1) und sane(7) für weitere Details.
+====
+
+Als nächstes müssen Sie prüfen, ob der Scanner vom Frontend erkannt wird. Die SANE-Backends werden mit dem Kommandozeilenwerkzeug `scanimage` geliefert. Mit diesem Werkzeug können Sie sich Scanner anzeigen lassen und den Scan-Prozess von der Kommandozeile starten. Die Option `-L` zeigt die Scanner an. Das erste Beispiel ist für einen SCSI-Scanner, das zweite ist für einen USB-Scanner:
+
+[source,bash]
+....
+# scanimage -L
+device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner
+# scanimage -L
+device 'epson2:libusb:000:002' is a Epson GT-8200 flatbed scanner
+....
+
+Im zweiten Beispiel ist `epson2` der Backend-Name. `libusb:000:002` bedeutet, dass [.filename]#/dev/ugen0.2# die vom Scanner verwendete Gerätedatei ist.
+
+Wenn `scanimage` den Scanner nicht erkennen kann, erscheint folgende Meldung:
+
+[source,bash]
+....
+# scanimage -L
+
+No scanners were identified. If you were expecting something different,
+check that the scanner is plugged in, turned on and detected by the
+sane-find-scanner tool (if appropriate). Please read the documentation
+which came with this software (README, FAQ, manpages).
+....
+
+Wenn das passiert, müssen Sie in der Konfigurationsdatei des Backends unterhalb von [.filename]#/usr/local/etc/sane.d/# den verwendeten Scanner eintragen. Wenn der Scanner EPSON Perfection(R) 1650, der das Backend `epson2` benutzt, nicht erkannt wurde, muss [.filename]#/usr/local/etc/sane.d/epson2.conf# angepasst werden. Fügen Sie eine Zeile mit der Schnittstelle und dem Gerätenamen in die Datei ein. In diesem Beispiel wurde die nachstehende Zeile eingefügt:
+
+[.programlisting]
+....
+usb /dev/ugen0.2
+....
+
+Speichern Sie die Änderungen und prüfen Sie, ob der Scanner mit dem richtigen Backend und Gerätenamen erkannt wird:
+
+[source,bash]
+....
+# scanimage -L
+device 'epson2:libusb:000:002' is a Epson GT-8200 flatbed scanner
+....
+
+Wenn `scanimage -L` den Scanner erkannt hat, ist der Scanner eingerichtet und bereit, zu scannen.
+
+Obwohl `scanimage` von der Kommandozeile scannen kann, ist eine graphische Anwendung zum Scannen besser geeignet. Bekannte Programme sind Koka oder XSane. Diese Frontends besitzten erweiterte Funktionen wie den Scan-Modus, Farbkorrektur und Batch-Scans. XSane lässt sich auch als GIMP-Plugin verwenden.
+
+=== Berechtigungen für den Scanner
+
+Wenn andere Benutzer den Scanner benutzen sollen, müssen sie Lese- und Schreibrechte auf die Gerätedatei des Scanners besitzen. Im vorherigen Beispiel wird die Datei [.filename]#/dev/ugen0.2# verwendet, die faktisch nur ein Symlink auf die echte Gerätedatei, [.filename]#/dev/usb/0.2.0# genannt, darstellt. Sowohl der Symlink als auch die Gerätedatei sind jeweils im Besitz der Gruppen `wheel` und `operator`. Damit ein Benutzer den Scanner benutzen kann, muss er Mitglied in einer der beiden Gruppen sein. Allerdings sollte aus Sicherheitsgründen genau überlegt werden, welche Benutzer zu welcher Gruppe hinzugefügt werden, besonders bei der Gruppe `wheel`. Eine bessere Lösung ist es, eine spezielle Gruppe für den Zugriff anzulegen und den Scanner für Mitglieder dieser Gruppe zugänglich zu machen.
+
+Dieses Beispiel erstellt eine Gruppe namens `_usb_`:
+
+[source,bash]
+....
+# pw groupadd usb
+....
+
+Anschließend muss der [.filename]#/dev/ugen0.2#-Symlink und der Gerätename [.filename]#/dev/usb/0.2.0# für die Gruppe `usb` mit den Schreibrechten `0660` oder `0664` ausgestattet werden. All dies kann durch das Hinzufügen der folgenden Zeilen in [.filename]#/etc/devfs.rules# erreicht werden:
+
+[.programlisting]
+....
+[system=5]
+add path ugen0.2 mode 0660 group usb
+add path usb/0.2.0 mode 0666 group usb
+....
+
+[NOTE]
+====
+Es kommt vor, dass sich der Gerätename mit dem Hinzufügen oder Entfernen von Geräten ändert, so dass man stattdessen vielleicht allen USB-Geräten mit diesem Regelsatz Zugriff gewähren möchte:
+
+[.programlisting]
+....
+[system=5]
+add path 'ugen*' mode 0660 group usb
+add path 'usb/*' mode 0666 group usb
+....
+
+====
+
+Weitere Informationen zu dieser Datei finden Sie in man:devfs.rules[5].
+
+Als nächstes aktivieren Sie den Regelsatz in [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+devfs_system_ruleset="system"
+....
+
+Starten Sie anschließend das man:devfs[8]-System neu:
+
+[source,bash]
+....
+# service devfs restart
+....
+
+Jetzt müssen nur noch Benutzer zur Gruppe `_usb_` hinzugefügt werden, um ihnen den Zugriff auf den Scanner zu erlauben:
+
+[source,bash]
+....
+# pw groupmod usb -m joe
+....
+
+Weitere Details finden Sie in man:pw[8].
diff --git a/documentation/content/de/books/handbook/network-servers/_index.adoc b/documentation/content/de/books/handbook/network-servers/_index.adoc
new file mode 100644
index 0000000000..a4ca903282
--- /dev/null
+++ b/documentation/content/de/books/handbook/network-servers/_index.adoc
@@ -0,0 +1,2475 @@
+---
+title: Kapitel 29. Netzwerkserver
+part: Teil IV. Netzwerke
+prev: books/handbook/mail
+next: books/handbook/firewalls
+---
+
+[[network-servers]]
+= Netzwerkserver
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 29
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/network-servers/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/network-servers/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/network-servers/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/en/mailing-lists.adoc[]
+include::shared/en/teams.adoc[]
+include::shared/en/urls.adoc[]
+
+toc::[]
+
+[[network-servers-synopsis]]
+== Übersicht
+
+Dieses Kapitel beschreibt einige der häufiger verwendeten Netzwerkdienste auf UNIX(R)-Systemen. Dazu zählen Installation und Konfiguration sowie Test und Wartung verschiedener Netzwerkdienste. Zusätzlich sind im ganzen Kapitel Beispielkonfigurationen als Referenz enthalten.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie
+
+* Den inetd-Daemon konfigurieren können.
+* Wissen, wie das Network File System (NFS) eingerichtet wird.
+* Einen Network Information Server (NIS) einrichten können, um damit Benutzerkonten im Netzwerk zu verteilen.
+* Wissen, wie Sie FreeBSD einrichten, um als LDAP-Server oder -Client zu agieren.
+* Rechner durch Nutzung von DHCP automatisch für ein Netzwerk konfigurieren können.
+* In der Lage sein, einen Domain Name Server (DNS) einzurichten.
+* Den ApacheHTTP-Server konfigurieren können.
+* Wissen, wie man einen File Transfer Protocol (FTP)-Server einrichtet.
+* Mit Samba einen Datei- und Druckserver für Windows(R)-Clients konfigurieren können.
+* Unter Nutzung des NTP-Protokolls Datum und Uhrzeit synchronisieren sowie einen Zeitserver installieren können.
+* Wissen, wie iSCSI eingerichtet wird.
+
+Dieses Kapitel setzt folgende Grundkenntnisse voraus:
+
+* [.filename]#/etc/rc#-Skripte.
+* Netzwerkterminologie
+* Installation zusätzlicher Software von Drittanbietern (crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports]).
+
+[[network-inetd]]
+== Der inetd"Super-Server"
+
+Der man:inetd[8]-Daemon wird manchmal auch als "Internet Super-Server" bezeichnet, weil er Verbindungen für viele Dienste verwaltet. Anstatt mehrere Anwendungen zu starten, muss nur der inetd-Dienst gestartet werden. Wenn eine Verbindung für einen Dienst eintrifft, der von inetd verwaltet wird, bestimmt inetd, welches Programm für die eingetroffene Verbindung zuständig ist, aktiviert den entsprechenden Prozess und reicht den Socket an ihn weiter. Der Einsatz von inetd an Stelle viele einzelner Daemonen kann auf nicht komplett ausgelasteten Servern zu einer Verringerung der Systemlast führen.
+
+inetd wird vor allem dazu verwendet, andere Daemonen zu aktivieren, einige Protokolle werden aber auch intern verwaltet. Dazu gehören chargen, auth, time, echo, discard sowie daytime.
+
+Dieser Abschnitt beschreibt die Konfiguration von inetd.
+
+[[network-inetd-conf]]
+=== Konfigurationsdatei
+
+Die Konfiguration von inetd erfolgt über [.filename]#/etc/inetd.conf# Jede Zeile dieser Datei repräsentiert eine Anwendung, die von inetd gestartet werden kann. In der Voreinstellung beginnt jede Zeile mit einem Kommentar (`#`), was bedeutet dass inetd keine Verbindungen für Anwendungen akzeptiert. Entfernen Sie den Kommentar am Anfang der Zeile, damit inetd Verbindungen für diese Anwendung entgegennimmt.
+
+Nachdem Sie die Änderungen gespeichert haben, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein, damit inetd bei Booten automatisch gestartet wird:
+
+[.programlisting]
+....
+inetd_enable="YES"
+....
+
+Starten Sie jetzt inetd, so dass er Verbindungen für die von Ihnen konfigurierten Dienste entgegennimmt:
+
+[source,bash]
+....
+# service inetd start
+....
+
+Sobald inetd gestartet ist, muss der Dienst benachrichtigt werden, wenn eine Änderung in [.filename]#/etc/inetd.conf# gemacht wird:
+
+[[network-inetd-reread]]
+.Die Konfigurationsdatei von inetd neu einlesen
+[example]
+====
+
+[source,bash]
+....
+# service inetd reload
+....
+
+====
+
+Normalerweise müssen Sie lediglich den Kommentar vor der Anwendung entfernen. In einigen Situationen kann es jedoch sinnvoll sein, den Eintrag weiter zu bearbeiten.
+
+Als Beispiel dient hier der Standardeintrag für man:ftpd[8] über IPv4:
+
+[.programlisting]
+....
+ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
+....
+
+Die sieben Spalten in diesem Eintrag haben folgende Bedeutung:
+
+[.programlisting]
+....
+service-name
+socket-type
+protocol
+{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
+user[:group][/login-class]
+server-program
+server-program-arguments
+....
+
+service-name::
+Der Dienstname eines bestimmten Daemons. Er muss einem in [.filename]#/etc/services# aufgelisteten Dienst entsprechen. Hier wird festgelegt, auf welchen Port inetd eingehende Verbindungen für diesen Dienst entgegennimmt. Wenn ein neuer Dienst benutzt wird, muss er zuerst in [.filename]#/etc/services# eingetragen werden.
+
+socket-type::
+Entweder `stream`, `dgram`, `raw`, oder `seqpacket`. Nutzen Sie `stream` für TCP-Verbindungen und `dgram` für UDP-Dienste.
+
+protocol::
+Benutzen Sie eines der folgenden Protokolle:
++
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Protokoll
+| Bedeutung
+
+|tcp oder tcp4
+|TCP (IPv4)
+
+|udp oder udp4
+|UDP (IPv4)
+
+|tcp6
+|TCP (IPv6)
+
+|udp6
+|UDP (IPv6)
+
+|tcp46
+|TCP sowohl unter IPv4 als auch unter IPv6
+
+|udp46
+|UDP sowohl unter IPv4 als auch unter IPv6
+|===
+{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]::
+In diesem Feld muss `wait` oder `nowait` angegeben werden. `max-child`, `max-connections-per-ip-per-minute` sowie `max-child-per-ip` sind optional.
++
+`wait|nowait` gibt an, ob der Dienst seinen eigenen Socket verwalten kann oder nicht. `dgram`-Sockets müssen `wait` verwenden, während Daemonen mit `stream`-Sockets, die normalerweise auch aus mehreren Threads bestehen, `nowait` verwenden sollten. `wait` gibt in der Regel mehrere Sockets an einen einzelnen Daemon weiter, während `nowait` für jeden neuen Socket einen Childdaemon erzeugt.
++
+Die maximale Anzahl an Child-Daemonen, die inetd erzeugen kann, wird durch die Option `max-child` festgelegt. Wenn ein bestimmter Daemon 10 Instanzen benötigt, wird der Wert `/10` hinter die Option `nowait` gesetzt. Der Wert `/0` gibt an, das es keine Beschränkung gibt.
++
+`max-connections-per-ip-per-minute` legt die maximale Anzahl von Verbindungsversuchen pro Minute fest, die von einer bestimmten IP-Adresse aus unternommen werden können. Sobald das Limit erreicht ist, werden weitere Verbindungen von dieser IP-Adresse geblockt, bis die Minute vorüber ist. Ein Wert von `/10` würde die maximale Anzahl der Verindungsversuche einer bestimmten IP-Adresse auf zehn Versuche in der Minute beschränken. `max-child-per-ip` legt fest, wie viele Child-Daemonen von einer bestimmten IP-Adresse aus gestartet werden können. Durch diese Optionen lassen sich Ressourcenverbrauch sowie die Auswirkungen eines `Denial of Service (DoS)`-Angriffs begrenzen.
++
+Ein Beispiel finden Sie in den Voreinstellungen für man:fingerd[8]:
++
+
+[.programlisting]
+....
+finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -k -s
+....
+
+user::
+Der Benutzername, unter dem der jeweilige Daemon laufen soll. Meistens laufen Daemonen als `root`, `daemon` oder `nobody`.
+
+server-program::
+Der vollständige Pfad des Daemons. Wird der Daemon von inetd intern bereitgestellt, verwenden Sie `internal`.
+
+server-program-arguments::
+Dieser Eintrag legt die Argumente fest, die bei der Aktivierung an den Daemon übergeben werden. Wenn es sich beim Daemon um einen internen Dienst handelt, verwenden Sie wiederum `internal`.
+
+[[network-inetd-cmdline]]
+=== Kommandozeilenoptionen
+
+Wie die meisten anderen Server-Daemonen lässt sich auch inetd über verschiedene Optionen steuern. In der Voreinstellung wird inetd mit `-wW -C 60` gestartet. Durch das Setzen dieser Werte wird das TCP-Wrapping für alle inetd-Dienste aktiviert. Zudem wird verhindert, dass eine IP-Adresse eine Dienst öfter als 60 Mal pro Minute anfordern kann.
+
+Um die Voreinstellungen für inetd zu ändern, fügen Sie einen Eintrag für `inetd_flags` in [.filename]#/etc/rc.conf# hinzu. Wenn inetd bereits ausgeführt wird, starten Sie ihn mit `service inetd restart` neu.
+
+Die verfügbaren Optionen sind:
+
+-c maximum::
+Legt die maximale Anzahl von parallelen Aufrufen eines Dienstes fest; in der Voreinstellung gibt es keine Einschränkung. Diese Einstellung kann für jeden Dienst durch Setzen des Parameters `max-child` in [.filename]#/etc/inetd.conf# festgelegt werden.
+
+-C rate::
+Legt fest, wie oft ein Dienst von einer einzelnen IP-Adresse in einer Minute aufgerufen werden kann; in der Voreinstellung gibt es keine Einschränkung. Dieser Wert kann für jeden Dienst durch das Setzen des Parameters `max-connections-per-ip-per-minute` in [.filename]#/etc/inetd.conf# festgelegt werden.
+
+-R rate::
+Legt fest, wie oft ein Dienst in der Minute aktiviert werden kann; in der Voreinstellung sind dies `256` Aktivierungen pro Minute. Ein Wert von `0` erlaubt unbegrenzt viele Aktivierungen.
+
+-s maximum::
+Legt fest, wie oft ein Dienst in der Minute von einer einzelnen IP-Adresse aus aktiviert werden kann; in der Voreinstellung gibt es hier keine Beschränkung. Diese Einstellung kann für jeden Dienst durch die Angabe von `max-child-per-ip` in [.filename]#/etc/inetd.conf# angepasst werden.
+
+Es sind noch weitere Optionen verfügbar. Eine vollständige Liste der Optionen finden Sie in man:inetd[8].
+
+[[network-inetd-security]]
+=== Sicherheitsbedenken
+
+Viele Daemonen, die von inetd verwaltet werden, sind nicht auf Sicherheit bedacht. Einige Damonen, wie beispielsweise fingerd, liefern Informationen, die für einen Angreifer nützlich sein könnten. Aktivieren Sie nur erforderliche Dienste und überwachen Sie das System auf übermäßige Verbindungsversuche. `max-connections-per-ip-per-minute`, `max-child` und `max-child-per-ip` können verwendet werden, um solche Angriffe zu begrenzen.
+
+TCP-Wrapper ist in der Voreinstellung aktiviert. Lesen Sie man:hosts_access[5], wenn Sie weitere Informationen zum Setzen von TCP-Beschränkungen für verschiedene von inetd aktivierte Daemonen benötigen.
+
+[[network-nfs]]
+== Network File System (NFS)
+
+FreeBSD unterstützt das Netzwerkdateisystem NFS, das es einem Server erlaubt, Dateien und Verzeichnisse über ein Netzwerk mit Clients zu teilen. Mit NFS können Benutzer und Programme auf Daten entfernter Systeme zugreifen, und zwar so, als ob es sich um lokal gespeicherte Daten handeln würde.
+
+Die wichtigsten Vorteile von NFS sind:
+
+* Daten, die sonst auf jeden Client dupliziert würden, können an einem zentralen Ort aufbewahrt, und von den Clients über das Netzwerk aufgerufen werden.
+* Verschiedene Clients können auf ein gemeinsames Verzeichnis [.filename]#/usr/ports/distfiles# zugreifen. Die gemeinsame Nutzung dieses Verzeichnisses ermöglicht einen schnellen Zugriff auf die Quelldateien, ohne sie auf jede Maschine zu kopieren zu müssen.
+* In größeren Netzwerken ist es praktisch, einen zentralen NFS-Server einzurichten, auf dem die Heimatverzeichnisse der Benutzer gespeichert werden. Dadurch steht den Benutzern immer das gleiche Heimatverzeichnis zur Verfügung, unabhängig davon, an welchem Client im Netzwerk sie sich anmelden.
+* Die Verwaltung der NFS-Exporte wird vereinfacht. Zum Beispiel gibt es dann nur noch ein Dateisystem, für das Sicherheits- oder Backup-Richtlinien festgelegt werden müssen.
+* Wechselmedien können von anderen Maschinen im Netzwerk verwendet werden. Dies reduziert die Anzahl von Geräten im Netzwerk und bietet einen zentralen Ort für die Verwaltung. Oft ist es einfacher, über ein zentrales Installationsmedium Software auf mehreren Computern zu installieren.
+
+NFS besteht aus einem Server und einem oder mehreren Clients. Der Client greift über das Netzwerk auf die Daten zu, die auf dem Server gespeichert sind. Damit dies korrekt funktioniert, müssen einige Prozesse konfiguriert und gestartet werden:
+
+Folgende Daemonen müssen auf dem Server ausgeführt werden:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Daemon
+| Beschreibung
+
+|nfsd
+|Der NFS-Daemon. Er bearbeitet Anfragen der NFS-Clients.
+
+|mountd
+|Der NFS-Mount-Daemon. Er bearbeitet die Anfragen von `nfsd`.
+
+|rpcbind
+|Der Portmapper-Daemon. Durch ihn erkennen die NFS-Clients, welchen Port der NFS-Server verwendet.
+|===
+
+Der Einsatz von man:nfsiod[8] ist nicht zwingend erforderlich, kann aber die Leistung auf dem Client verbessern.
+
+[[network-configuring-nfs]]
+=== Konfiguration des Servers
+
+Die Dateisysteme, die der NFS-Server exportieren soll, werden in [.filename]#/etc/exports# festgelegt. Jede Zeile in dieser Datei beschreibt ein zu exportierendes Dateisystem, Clients, die darauf Zugriff haben sowie alle Zugriffsoptionen. Die Optionen eines auf einen anderen Rechner exportierten Dateisystems müssen alle in einer Zeile stehen. Wird in einer Zeile kein Rechner festgelegt, dürfen alle Clients im Netzwerk das exportierte Dateisystem einhängen.
+
+Wie Dateisysteme exportiert werden, ist in der folgenden [.filename]#/etc/exports# zu sehen. Diese Beispiele müssen natürlich an die Arbeitsumgebung und die Netzwerkkonfiguration angepasst werden. Es existieren viele verschiedene Optionen, allerdings werden hier nur wenige von ihnen erwähnt. Eine vollständige Liste der Optionen finden Sie in man:exports[5].
+
+Dieses Beispiel exportiert [.filename]#/cdrom# für drei Clients, _alpha_, _bravo_ und _charlie_:
+
+[.programlisting]
+....
+/cdrom -ro alpha bravo charlie
+....
+
+Die Option `-ro` kennzeichnet das exportierte Dateisystem als schreibgeschützt. Dadurch sind Clients nicht in der Lage, das exportierte Dateisystem zu verändern. Dieses Beispiel geht davon aus, dass die Hostnamen entweder über DNS oder über [.filename]#/etc/hosts# aufgelöst werden können. Lesen Sie man:hosts[5] falls das Netzwerk über keinen DNS-Server verfügt.
+
+Das nächste Beispiel exportiert [.filename]#/home# auf drei durch IP-Adressen bestimmte Clients. Diese Einstellung kann für Netzwerke ohne DNS-Server und [.filename]#/etc/hosts# nützlich sein. Die Option `-alldirs` ermöglicht es, auch Unterverzeichnisse als Mountpunkte festzulegen. Dies bedeutet aber nicht, dass alle Unterverzeichnisse eingehängt werden, vielmehr wird es dem Client ermöglicht, nur diejenigen Verzeichnisse einzuhängen, die auch benötigt werden.
+
+[.programlisting]
+....
+/usr/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4
+....
+
+Das nächste Beispiel exportiert [.filename]#/a#, damit Clients von verschiedenen Domänen auf das Dateisystem zugreifen können. Die Option `-maproot=root` erlaubt es dem Benutzer `root` des Clients, als `root` auf das exportierte Dateisystem zu schreiben. Wenn diese Option nicht gesetzt ist, wird der `root`-Benutzer des Clients dem `nobody`-Konto des Servers zugeordnet und unterliegt somit den Zugriffsbeschränkungen dieses Kontos.
+
+[.programlisting]
+....
+/a -maproot=root host.example.com box.example.org
+....
+
+Ein Client kann für jedes Dateisystem nur einmal definiert werden. Wenn beispielsweise [.filename]#/usr# ein gesondertes Dateisystem ist, dann wären die folgenden Einträge falsch, da in beiden Einträgen der gleiche Rechner angegeben wird:
+
+[.programlisting]
+....
+#Nicht erlaubt, wenn /usr ein einziges Dateisystem ist
+/usr/src client
+/usr/ports client
+....
+
+Das richtige Format für eine solche Situation ist:
+
+[.programlisting]
+....
+/usr/src /usr/ports client
+....
+
+Das Folgende ist ein Beispiel für eine gültige Exportliste, in der [.filename]#/usr# und [.filename]#/exports# lokale Dateisysteme sind:
+
+[.programlisting]
+....
+# Export src and ports to client01 and client02, but only
+# client01 has root privileges on it
+/usr/src /usr/ports -maproot=root client01
+/usr/src /usr/ports client02
+# The client machines have root and can mount anywhere
+# on /exports. Anyone in the world can mount /exports/obj read-only
+/exports -alldirs -maproot=root client01 client02
+/exports/obj -ro
+....
+
+Damit die vom NFS-Server benötigen Prozesse beim Booten gestartet werden, fügen Sie folgende Optionen in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+rpcbind_enable="YES"
+nfs_server_enable="YES"
+mountd_enable="YES"
+....
+
+Der Server kann jetzt mit diesem Kommando gestartet werden:
+
+[source,bash]
+....
+# service nfsd start
+....
+
+Wenn der NFS-Server startet, wird auch mountd automatisch gestartet. Allerdings liest mountd [.filename]#/etc/exports# nur, wenn der Server gestartet wird. Um nachfolgende Änderungen an [.filename]#/etc/exports# wirksam werden zu lassen, kann mountd angewiesen werden, die Datei neu einzulesen:
+
+[source,bash]
+....
+# service mountd reload
+....
+
+=== Konfiguration des Clients
+
+Um den NFS-Client zu aktivieren, setzen Sie folgende Option in [.filename]#/etc/rc.conf# auf jedem Client:
+
+[.programlisting]
+....
+nfs_client_enable="YES"
+....
+
+Der Client ist nun in der Lage, ein entferntes Dateisystem einzuhängen. In diesen Beispielen ist der Name des Servers `server` und der Name des Clients `client`. Fügen Sie folgenden Befehl aus, um das Verzeichnis [.filename]#/home# vom `server` auf dem `client` ins Verzeichnis [.filename]#/mnt# einzuhängen:
+
+[source,bash]
+....
+# mount server:/home /mnt
+....
+
+Die Dateien und Verzeichnisse in [.filename]#/home# stehen dem Rechner `client` nun im Verzeichnis [.filename]#/mnt# zur Verfügung.
+
+Um ein entferntes Dateisystem bei jedem Systemstart automatisch einzuhängen, fügen Sie das Dateisystem in [.filename]#/etc/fstab# ein:
+
+[.programlisting]
+....
+server:/home /mnt nfs rw 0 0
+....
+
+man:fstab[5] enthält eine Beschreibung aller Optionen.
+
+=== Dateien sperren (Locking)
+
+Einige Anwendungen erfordern die Sperrung von Dateien, damit sie korrekt arbeiten. Um diese Sperre zu aktivieren, müssen diese Zeilen in [.filename]#/etc/rc.conf# sowohl auf dem Client als auch auf dem Server hinzugefügt werden:
+
+[.programlisting]
+....
+rpc_lockd_enable="YES"
+rpc_statd_enable="YES"
+....
+
+Danach starten Sie die beiden Anwendungen:
+
+[source,bash]
+....
+# service lockd start
+# service statd start
+....
+
+Wenn keine Dateisperren zwischen den NFS-Clients und dem NFS-Server benötigt werden, können Sie den NFS-Client durch die Übergabe der Option `-L` an mount zu einer lokalen Sperrung von Dateien zwingen. Weitere Details finden Sie in man:mount_nfs[8].
+
+[[network-autofs]]
+=== Automatisches Einhängen mit man:autofs[5]
+
+[NOTE]
+====
+man:autofs[5] wird seit FreeBSD 10.1-RELEASE unterstützt. Um die Funktionalität des automatischen Einhängens in älteren FreeBSD-Versionen zu benutzen, verwenden Sie stattdessen man:amd[8]. In diesem Kapitel wird nur das automatische Einhängen mit Hilfe von man:autofs[5] beschrieben.
+====
+
+man:autofs[5] ist eine gebräuchliche Bezeichnung für verschiedene Komponenten, welche es erlauben, lokale und entfernte Dateisysteme automatisch einzuhängen, sobald auf eine Datei oder ein Verzeichnis in diesem Dateisystem zugegriffen wird. Es besteht aus einer Kernel-Komponente man:autofs[5] und mehreren Benutzerprogrammen: man:automount[8], man:automountd[8] und man:autounmountd[8]. man:autofs[5] ist eine Alternative für man:amd[8] aus früheren FreeBSD-Versionen. man:amd[8] steht nach wie vor zur Verfügung, da beide Programme ein unterschiedliches Format verwenden. Das Format welches man:autofs[5] verwendet ist das gleiche wie bei anderen SVR4 Automountern, beispielsweise denen aus Solaris(TM), Mac OS(R) X und Linux(R).
+
+Das virtuelle man:autofs[5]-Dateisystem wird von man:automount[8] in einen bestimmten Mountpunkt eingehängt. Dies geschieht gewöhnlich während des Bootens.
+
+Jedes Mal, wenn ein Prozess versucht auf eine Datei unterhalb des man:autofs[5]-Mountpunkts zuzugreifen, wird der Kernel den man:automountd[8]-Daemon benachrichtigen und den aktuellen Prozess anhalten. Der man:automountd[8]-Daemon wird dann die Anfrage des Kernels bearbeiten und das entsprechende Dateisystem einhängen. Anschließend wird der Daemon den Kernel benachrichtigen, dass der angehaltene Prozess wieder freigegeben werden kann. Der man:autounmountd[8]-Daemon hängt automatisch Dateisysteme nach einiger Zeit ab, sofern sie nicht mehr verwendet werden.
+
+Die primäre Konfigurationsdatei von autofs ist [.filename]#/etc/auto_master#. Sie enthält die einzelnen Zuordnungen zu den Mountpunkten. Eine Erklärung zu [.filename]#auto_master# und der Syntax für die Zuordnungen finden Sie in man:auto_master[5].
+
+Eine spezielle Automounter Zuordnung wird in [.filename]#/net# eingehängt. Wenn auf eine Datei in diesem Verzeichnis zugegriffen wird, hängt man:autofs[5] einen bestimmten, entfernen Mountpunkt ein. Wenn beispielsweise auf eine Datei unterhalb von [.filename]#/net/foobar/usr# zugegriffen werden soll, würde man:automountd[8] das exportierte Dateisystem [.filename]#/usr# von dem Rechner `foobar` einhängen.
+
+.Ein exportiertes Dateisystem mit man:autofs[5] in den Verzeichnisbaum einhängen
+[example]
+====
+In diesem Beispiel zeigt `showmount -e` die exportierten Dateisysteme des NFS-Servers `foobar`:
+
+[source,bash]
+....
+% showmount -e foobar
+Exports list on foobar:
+/usr 10.10.10.0
+/a 10.10.10.0
+% cd /net/foobar/usr
+....
+
+====
+
+Die Ausgabe von `showmount` zeigt das exportierte Dateisystem [.filename]#/usr#. Wenn in das Verzeichnis [.filename]#/host/foobar/usr# gewechselt wird, fängt man:automountd[8] die Anforderung ab und versucht, den Rechnernamen `foobar` aufzulösen. Gelingt dies, wird man:automountd[8] automatisch das exportierte Dateisystem einhängen.
+
+Um man:autofs[5] beim Booten zu aktivieren, fügen Sie diese Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+autofs_enable="YES"
+....
+
+Danach kann man:autofs[5] gestartet werden:
+
+[source,bash]
+....
+# service automount start
+# service automountd start
+# service autounmountd start
+....
+
+Obwohl das Format von man:autofs[5] das gleiche ist wie in anderen Betriebssystemen, kann es wünschenswert sein, Informationen von anderen Betriebssystemen zu Rate zu ziehen, wie dieses http://images.apple.com/business/docs/Autofs.pdf[Mac OS X Dokument].
+
+Weitere Informationen finden Sie in den Manualpages man:automount[8], man:automountd[8], man:autounmountd[8] und man:auto_master[5].
+
+[[network-nis]]
+== Network Information System (NIS)
+
+Das Network Information System (NIS) wurde entwickelt, um UNIX(R)-Systeme zentral verwalten zu können. Dazu zählen beispielsweise Solaris(TM), HP-UX, AIX(R), Linux(R), NetBSD, OpenBSD und FreeBSD. NIS war ursprünglich als _Yellow Pages_ bekannt, aus markenrechtlichen Gründen wurde der Name aber geändert. Dies ist der Grund, warum NIS-Kommandos mit `yp` beginnen.
+
+Bei NIS handelt es sich um ein RPC-basiertes Client/Server-System. Eine Gruppe von Rechnern greift dabei innerhalb einer NIS-Domäne auf gemeinsame Konfigurationsdateien zu. Dies erlaubt es einem Systemadministrator, NIS-Clients mit minimalem Aufwand einzurichten, sowie Änderungen an der Systemkonfiguration von einem zentralen Ort aus durchzuführen.
+
+FreeBSD verwendet die Version 2 des NIS-Protokolls.
+
+=== NIS-Begriffe und -Prozesse
+
+Tabelle 30.1 fasst die Begriffe und Anwenderprozesse zusammen, die von NIS verwendet werden:
+
+.NIS Begriffe
+[cols="1,1", frame="none", options="header"]
+|===
+| Begriff
+| Beschreibung
+
+|NIS-Domänenname
+|NIS-Masterserver und Clients benutzen einen gemeinsamen NIS-Domänennamen. In der Regel hat dieser Name nichts mit DNS zu tun.
+
+|man:rpcbind[8]
+|Dieser Dienst aktiviert RPC und muss gestartet sein, damit ein NIS-Server oder -Client ausgeführt werden kann.
+
+|man:ypbind[8]
+|Dieser Dienst "bindet" einen NIS-Client an seinen NIS-Server. Der Client bezieht den NIS-Domänennamen vom System und stellt über das RPC-Protokoll eine Verbindung zum NIS-Server her. ypbind ist der zentrale Bestandteil der Client-Server-Kommunikation in einer NIS-Umgebung. Wird der Dienst auf einem Client beendet, ist dieser nicht mehr in der Lage, auf den NIS-Server zuzugreifen.
+
+|man:ypserv[8]
+|Dies ist der Prozess für den NIS-Server. Wenn dieser Dienst nicht mehr läuft, kann der Server nicht mehr auf NIS-Anforderungen reagieren. Wenn ein Slaveserver existiert, kann dieser als Ersatz fungieren. Einige NIS-Systeme (allerdings nicht das von FreeBSD) versuchen allerdings erst gar nicht, sich mit einem anderen Server zu verbinden, wenn der Masterserver nicht mehr reagiert. Die einzige Lösung besteht darin, den Serverprozess oder den ypbind-Prozess auf dem Client neu zu starten.
+
+|man:rpc.yppasswdd[8]
+|Dieser Prozess läuft nur auf dem NIS-Masterserver. Es handelt sich um einen Daemonprozess, der es NIS-Clients ermöglicht, ihre NIS-Passwörter zu ändern. Wenn dieser Daemon nicht läuft, müssen sich die Benutzer am NIS-Masterserver anmelden und ihre Passwörter dort ändern.
+|===
+
+=== Arten von NIS-Rechnern
+
+* NIS-Masterserver
++
+Dieser Server dient als zentraler Speicherort für Rechnerkonfigurationen. Zudem verwaltet er die maßgebliche Kopie, der von den NIS-Clients gemeinsam verwendeten Dateien. [.filename]#passwd#, [.filename]#group#, sowie verschiedene andere von den Clients verwendete Dateien existieren auf dem Masterserver. Obwohl ein Rechner auch für mehrere NIS-Domänen als Masterserver fungieren kann, wird diese Art von Konfiguration nicht behandelt, da sich dieser Abschnitt auf eine relativ kleine NIS-Umgebung konzentriert.
+* NIS-Slaveserver
++
+NIS-Slaveserver verwalten Kopien der Daten des NIS-Masterservers um Redundanz zu bieten. Zudem entlasten Slaveserver den Masterserver: NIS-Clients verbinden sich immer mit dem NIS-Server, welcher zuerst reagiert. Dieser Server kann auch ein Slaveserver sein.
+* NIS-Clients
++
+NIS-Clients identifizieren sich gegenüber dem NIS-Server während der Anmeldung.
+
+Mit NIS können Informationen aus verschiedenen Dateien von mehreren Rechnern gemeinsam verwendet werden. [.filename]#master.passwd#, [.filename]#group#, und [.filename]#hosts# werden oft gemeinsam über NIS verwendet. Immer, wenn ein Prozess auf einem Client auf Informationen zugreifen will, die normalerweise in lokalen Dateien vorhanden wären, wird stattdessen eine Anfrage an den NIS-Server gestellt, an den der Client gebunden ist.
+
+=== Planung
+
+Dieser Abschnitt beschreibt eine einfache NIS-Umgebung, welche aus 15 FreeBSD-Maschinen besteht, für die keine zentrale Verwaltung existiert. Jeder Rechner hat also eine eigene Version von [.filename]#/etc/passwd# und [.filename]#/etc/master.passwd#. Diese Dateien werden manuell synchron gehalten; wird ein neuer Benutzer angelegt, so muss dies auf allen fünfzehn Rechnern manuell erledigt werden.
+
+In Zukunft soll die Konfiguration wie folgt aussehen:
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Rechnername
+| IP-Adresse
+| Rechneraufgabe
+
+|`ellington`
+|`10.0.0.2`
+|NIS-Master
+
+|`coltrane`
+|`10.0.0.3`
+|NIS-Slave
+
+|`basie`
+|`10.0.0.4`
+|Workstation der Fakultät
+
+|`bird`
+|`10.0.0.5`
+|Clientrechner
+
+|`cli[1-11]`
+|`10.0.0.[6-17]`
+|Verschiedene andere Clients
+|===
+
+Wenn erstmalig ein NIS-Schema eingerichtet wird, sollte es im Voraus sorgfältig geplant werden. Unabhängig von der Größe des Netzwerks müssen einige Entscheidungen im Rahmen des Planungsprozesses getroffen werden.
+
+==== Einen NIS-Domänennamen wählen
+
+Wenn ein Client Informationen anfordert, ist in dieser Anforderung der Name der NIS-Domäne enthalten. Dadurch weiß jeder Server im Netzwerk, auf welche Anforderung er antworten muss. Stellen Sie sich den NIS-Domänennamen als einen Namen einer Gruppe von Rechnern vor.
+
+Manchmal wird der Name der Internetdomäne auch für die NIS-Domäne verwendet. Dies ist allerdings nicht empfehlenswert, da es bei der Behebung von Problemen verwirrend sein kann. Der Name der NIS-Domäne sollte innerhalb des Netzwerks eindeutig sein. Hilfreich ist es, wenn der Name die Gruppe der in ihr zusammengefassten Rechner beschreibt. Die Kunstabteilung von Acme Inc. hätte daher vielleicht die NIS-Domäne "acme-art". Für dieses Beispiel wird der Name `test-domain` verwendet.
+
+Es gibt jedoch auch Betriebssysteme, die als NIS-Domänennamen den Namen der Internetdomäne verwenden. Wenn dies für einen oder mehrere Rechner des Netzwerks zutrifft, _muss_ der Name der Internetdomäne als NIS-Domänennamen verwendet werden.
+
+==== Anforderungen an den Server
+
+Bei der Wahl des NIS-Servers müssen einige Dinge beachtet werden. Da die NIS-Clients auf die Verfügbarkeit des Servers angewiesen sind, sollten Sie einen Rechner wählen, der nicht regelmäßig neu gestartet werden muss. Der NIS-Server sollte idealerweise ein alleinstehender Rechner sein, dessen einzige Aufgabe es ist, als NIS-Server zu dienen. Wenn das Netzwerk nicht zu stark ausgelastet ist, ist es auch möglich, den NIS-Server als weiteren Dienst auf einem anderen Rechner laufen zu lassen. Wenn jedoch ein NIS-Server ausfällt, wirkt sich dies negativ auf _alle_ NIS-Clients aus.
+
+=== Einen NIS-Masterserver konfigurieren
+
+Die verbindlichen Kopien aller NIS-Dateien befinden sich auf dem Masterserver. Die Datenbanken, in denen die Informationen gespeichert sind, bezeichnet man als NIS-Maps. Unter FreeBSD werden diese Maps unter [.filename]#/var/yp/[domainname]# gespeichert, wobei [.filename]#[domainname]# der Name der NIS-Domäne ist. Da ein NIS-Server mehrere Domänen verwalten kann, können auch mehrere Verzeichnisse vorhanden sein. Jede Domäne verfügt über ein eigenes Verzeichnis sowie einen eigenen, von anderen Domänen unabhängigen Satz von NIS-Maps.
+
+NIS-Master- und Slaveserver verwenden man:ypserv[8], um NIS-Anfragen zu bearbeiten. Dieser Daemon ist für eingehende Anfragen der NIS-Clients verantwortlich. Er ermittelt aus der angeforderten Domäne und Map einen Pfad zur entsprechenden Datenbank und sendet die angeforderten Daten von der Datenbank zum Client.
+
+Abhängig von den Anforderungen ist die Einrichtung eines NIS-Masterservers relativ einfach, da NIS von FreeBSD bereits in der Standardkonfiguration unterstützt wird. Es kann durch folgende Zeilen in [.filename]#/etc/rc.conf# aktiviert werden:
+
+[.programlisting]
+....
+nisdomainname="test-domain" <.>
+nis_server_enable="YES" <.>
+nis_yppasswdd_enable="YES" <.>
+....
+
+<.> Diese Zeile setzt den NIS-Domänennamen auf `test-domain`.
+<.> Dadurch werden die NIS-Serverprozesse beim Systemstart automatisch ausgeführt.
+<.> Durch diese Zeile wird der man:rpc.yppasswdd[8]-Daemon aktiviert, der die Änderung von NIS-Passwörtern von einem Client aus ermöglicht.
+
+Wird ypserv in einer Multi-Serverdomäne verwendet, in der NIS-Server gleichzeitig als NIS-Clients arbeiten, ist es eine gute Idee, diese Server zu zwingen, sich an sich selbst zu binden. Damit wird verhindert, dass Bindeanforderungen gesendet werden und sich die Server gegenseitig binden. Sonst könnten seltsame Fehler auftreten, wenn ein Server ausfällt, auf den andere Server angewiesen sind. Letztlich werden alle Clients einen Timeout melden, und versuchen, sich an andere Server zu binden. Die dadurch entstehende Verzögerung kann beträchtlich sein. Außerdem kann der Fehler erneut auftreten, da sich die Server wiederum aneinander binden könnten.
+
+Server, die auch als Client arbeiten, können durch das Hinzufügen der folgenden Zeilen in [.filename]#/etc/rc.conf# zu gezwungen werden, sich an einen bestimmten Server zu binden:
+
+[.programlisting]
+....
+nis_client_enable="YES" <.>
+nis_client_flags="-S test-domain,server" <.>
+....
+
+<.> Ermöglicht die Aktivierung der Client-Komponenten.
+<.> Diese Zeile setzt den NIS-Domain Namen `test-domain` und bindet sich an sich selbst.
+
+Nachdem die Parameter konfiguriert wurden, muss noch `/etc/netstart` ausgeführt werden, um alles entsprechend den Vorgaben in [.filename]#/etc/rc.conf# einzurichten. Bevor die NIS-Maps einrichtet werden können, muss der man:ypserv[8]-Daemon manuell gestartet werden:
+
+[source,bash]
+....
+# service ypserv start
+....
+
+==== Die NIS-Maps initialisieren
+
+NIS-Maps Sie werden am NIS-Masterserver aus den Konfigurationsdateien unter [.filename]#/etc# erzeugt. Einzige Ausnahme: [.filename]#/etc/master.passwd#. Dies verhindert, dass die Passwörter für `root`- oder andere Administratorkonten an alle Server in der NIS-Domäne verteilt werden. Deshalb werden die primären Passwort-Dateien konfiguriert, bevor die NIS-Maps initialisiert werden:
+
+[source,bash]
+....
+# cp /etc/master.passwd /var/yp/master.passwd
+# cd /var/yp
+# vi master.passwd
+....
+
+Es ist ratsam, alle Einträge für Systemkonten sowie Benutzerkonten, die nicht an die NIS-Clients weitergegeben werden sollen, wie beispielsweise `root` und weitere administrative Konten, zu entfernen.
+
+[NOTE]
+====
+Stellen Sie sicher, dass [.filename]#/var/yp/master.passwd# weder von der Gruppe noch von der Welt gelesen werden kann, indem Sie Zugriffsmodus auf `600` einstellen.
+====
+
+Nun können die NIS-Maps initialisiert werden. FreeBSD verwendet dafür das Skript man:ypinit[8]. Geben Sie `-m` und den NIS-Domänennamen an, wenn Sie NIS-Maps für den Masterserver erzeugen:
+
+[source,bash]
+....
+ellington# ypinit -m test-domain
+Server Type: MASTER Domain: test-domain
+Creating an YP server will require that you answer a few questions.
+Questions will all be asked at the beginning of the procedure.
+Do you want this procedure to quit on non-fatal errors? [y/n: n] n
+Ok, please remember to go back and redo manually whatever fails.
+If not, something might not work.
+At this point, we have to construct a list of this domains YP servers.
+rod.darktech.org is already known as master server.
+Please continue to add any slave servers, one per line. When you are
+done with the list, type a <control D>.
+master server : ellington
+next host to add: coltrane
+next host to add: ^D
+The current list of NIS servers looks like this:
+ellington
+coltrane
+Is this correct? [y/n: y] y
+
+[..output from map generation..]
+
+NIS Map update completed.
+ellington has been setup as an YP master server without any errors.
+....
+
+Dadurch erzeugt `ypinit`[.filename]#/var/yp/Makefile# aus [.filename]#/var/yp/Makefile.dist#. Diese Datei geht in der Voreinstellung davon aus, dass in einer NIS-Umgebung mit nur einem Server gearbeitet wird und dass alle Clients unter FreeBSD laufen. Da `test-domain` aber auch über einen Slaveserver verfügt, muss [.filename]#/var/yp/Makefile# entsprechend angepasst werden, sodass es mit einem Kommentar (`#`) beginnt:
+
+[.programlisting]
+....
+NOPUSH = "True"
+....
+
+==== Neue Benutzer hinzufügen
+
+Jedes Mal, wenn ein neuer Benutzer angelegt wird, muss er am NIS-Masterserver hinzugefügt und die NIS-Maps anschließend neu erzeugt werden. Wird dieser Punkt vergessen, kann sich der neue Benutzer _nur_ am NIS-Masterserver anmelden. Um beispielsweise den neuen Benutzer `jsmith` zur Domäne `test-domain` hinzufügen wollen, müssen folgende Kommandos auf dem Masterserver ausgeführt werden:
+
+[source,bash]
+....
+# pw useradd jsmith
+# cd /var/yp
+# make test-domain
+....
+
+Statt `pw useradd jsmith` kann auch `adduser jsmith` verwendet werden.
+
+=== Einen NIS-Slaveserver einrichten
+
+Um einen NIS-Slaveserver einzurichten, melden Sie sich am Slaveserver an und bearbeiten Sie [.filename]#/etc/rc.conf# analog zum Masterserver. Erzeugen Sie aber keine NIS-Maps, da diese bereits auf dem Server vorhanden sind. Wenn `ypinit` auf dem Slaveserver ausgeführt wird, benutzen Sie `-s` (Slave) statt `-m` (Master). Diese Option benötigt den Namen des NIS-Masterservers und den Domänennamen, wie in diesem Beispiel zu sehen:
+
+[source,bash]
+....
+coltrane# ypinit -s ellington test-domain
+
+Server Type: SLAVE Domain: test-domain Master: ellington
+
+Creating an YP server will require that you answer a few questions.
+Questions will all be asked at the beginning of the procedure.
+
+Do you want this procedure to quit on non-fatal errors? [y/n: n] n
+
+Ok, please remember to go back and redo manually whatever fails.
+If not, something might not work.
+There will be no further questions. The remainder of the procedure
+should take a few minutes, to copy the databases from ellington.
+Transferring netgroup...
+ypxfr: Exiting: Map successfully transferred
+Transferring netgroup.byuser...
+ypxfr: Exiting: Map successfully transferred
+Transferring netgroup.byhost...
+ypxfr: Exiting: Map successfully transferred
+Transferring master.passwd.byuid...
+ypxfr: Exiting: Map successfully transferred
+Transferring passwd.byuid...
+ypxfr: Exiting: Map successfully transferred
+Transferring passwd.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring group.bygid...
+ypxfr: Exiting: Map successfully transferred
+Transferring group.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring services.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring rpc.bynumber...
+ypxfr: Exiting: Map successfully transferred
+Transferring rpc.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring protocols.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring master.passwd.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring networks.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring networks.byaddr...
+ypxfr: Exiting: Map successfully transferred
+Transferring netid.byname...
+ypxfr: Exiting: Map successfully transferred
+Transferring hosts.byaddr...
+ypxfr: Exiting: Map successfully transferred
+Transferring protocols.bynumber...
+ypxfr: Exiting: Map successfully transferred
+Transferring ypservers...
+ypxfr: Exiting: Map successfully transferred
+Transferring hosts.byname...
+ypxfr: Exiting: Map successfully transferred
+
+coltrane has been setup as an YP slave server without any errors.
+Remember to update map ypservers on ellington.
+....
+
+Hierbei wird auf dem Slaveserver ein Verzeichnis namens [.filename]#/var/yp/test-domain# erstellt, welches Kopien der NIS-Masterserver-Maps enthält. Durch hinzufügen der folgenden Zeilen in [.filename]#/etc/crontab# wird der Slaveserver angewiesen, seine Maps mit den Maps des Masterservers zu synchronisieren:
+
+[.programlisting]
+....
+20 * * * * root /usr/libexec/ypxfr passwd.byname
+21 * * * * root /usr/libexec/ypxfr passwd.byuid
+....
+
+Diese Einträge sind nicht zwingend notwendig, da der Masterserver automatisch versucht, alle Änderungen seiner NIS-Maps an seine Slaveserver weiterzugeben. Da Passwortinformationen aber auch für nur vom Slaveserver abhängige Systeme vital sind, ist es eine gute Idee, diese Aktualisierungen zu erzwingen. Besonders wichtig ist dies in stark ausgelasteten Netzen, in denen Map-Aktualisierungen unvollständig sein könnten.
+
+Um die Konfiguration abzuschließen, führen Sie `/etc/netstart` auf dem Slaveserver aus, um die NIS-Dienste erneut zu starten.
+
+=== Einen NIS-Client einrichten
+
+Ein NIS-Client `bindet` sich unter Verwendung von `ypbind` an einen NIS-Server. Dieser Daemon sendet RPC-Anfragen auf dem lokalen Netzwerk. Diese Anfragen legen den Namen der Domäne fest, die auf dem Client konfiguriert ist. Wenn der Server der entsprechenden Domäne eine solche Anforderung erhält, schickt er eine Antwort an `ypbind`, das wiederum die Adresse des Servers speichert. Wenn mehrere Server verfügbar sind, verwendet der Client die erste erhaltene Adresse und richtet alle Anfragen an genau diesen Server. `ypbind` "pingt" den Server gelegentlich an, um sicherzustellen, dass der Server funktioniert. Antwortet der Server innerhalb eines bestimmten Zeitraums nicht (Timeout), markiert `ypbind` die Domäne als ungebunden und beginnt erneut, RPCs über das Netzwerk zu verteilen, um einen anderen Server zu finden.
+
+Einen FreeBSD-Rechner als NIS-Client einrichten:
+
+[.procedure]
+. Fügen Sie folgende Zeilen in [.filename]#/etc/rc.conf# ein, um den NIS-Domänennamen festzulegen, und um man:ypbind[8] bei der Initialisierung des Netzwerks zu starten:
++
+[.programlisting]
+....
+nisdomainname="test-domain"
+nis_client_enable="YES"
+....
+
+. Um alle Passworteinträge des NIS-Servers zu importieren, löschen Sie alle Benutzerkonten in [.filename]#/etc/master.passwd# mit `vipw`. Denken Sie daran, zumindest ein lokales Benutzerkonto zu behalten. Dieses Konto sollte außerdem Mitglied der Gruppe `wheel` sein. Wenn es mit NIS Probleme gibt, können Sie diesen Zugang verwenden, um sich als Superuser anzumelden und das Problem zu beheben. Bevor Sie die Änderungen speichern, fügen Sie folgende Zeile am Ende der Datei hinzu:
++
+[.programlisting]
+....
++:::::::::
+....
++
+Diese Zeile legt für alle gültigen Benutzerkonten der NIS-Server-Maps einen Zugang an. Es gibt verschiedene Wege, den NIS-Client durch Änderung dieser Zeile zu konfigurieren. Eine Methode wird in <<network-netgroups>> beschrieben. Weitere detaillierte Informationen finden Sie im Buch `Managing NFS and NIS` vom O'Reilly Verlag.
+. Um alle möglichen Gruppeneinträge vom NIS-Server zu importieren, fügen Sie folgende Zeile in [.filename]#/etc/group# ein:
++
+[.programlisting]
+....
++:*::
+....
+
+Um den NIS-Client direkt zu starten, führen Sie als Superuser die folgenden Befehle aus:
+
+[source,bash]
+....
+# /etc/netstart
+# service ypbind start
+....
+
+Danach sollte bei der Eingabe von `ypcat passwd` auf dem Client die `passwd-Map` des NIS-Servers angezeigt werden.
+
+=== Sicherheit unter NIS
+
+Da RPC ein Broadcast-basierter Dienst ist, kann jedes System innerhalb der Domäne mittels ypbind den Inhalt der NIS-Maps abrufen. Um nicht autorisierte Transaktionen zu verhindern, unterstützt man:ypserv[8] eine Funktion namens "securenets", durch die der Zugriff auf bestimmte Rechner beschränkt werden kann. In der Voreinstellung sind diese Informationen in [.filename]#/var/yp/securenets# gespeichert, es sei denn, man:ypserv[8] wurde mit der Option `-p` und einem alternativen Pfad gestartet. Diese Datei enthält Einträge, die aus einer Netzwerkadresse und einer Netzmaske bestehen. Kommentarzeilen beginnen mit "#". [.filename]##/var/yp/securnets## könnte beispielsweise so aussehen:
+
+[.programlisting]
+....
+# allow connections from local host -- mandatory
+127.0.0.1 255.255.255.255
+# allow connections from any host
+# on the 192.168.128.0 network
+192.168.128.0 255.255.255.0
+# allow connections from any host
+# between 10.0.0.0 to 10.0.15.255
+# this includes the machines in the testlab
+10.0.0.0 255.255.240.0
+....
+
+Wenn man:ypserv[8] eine Anforderung von einer zu diesen Regeln passenden Adresse erhält, wird die Anforderung bearbeitet. Gibt es keine passende Regel, wird die Anforderung ignoriert und eine Warnmeldung aufgezeichnet. Wenn [.filename]#securenets# nicht existiert, erlaubt `ypserv` Verbindungen von jedem Rechner.
+
+crossref:security[tcpwrappers,"TCP Wrapper"] beschreibt eine alternative Methode zur Zugriffskontrolle. Obwohl beide Methoden einige Sicherheit gewähren, sind sie anfällig für "IP-Spoofing"-Angriffe. Der NIS-Verkehr sollte daher von einer Firewall blockiert werden.
+
+Server, die [.filename]#securenets# verwenden, können Schwierigkeiten bei der Anmeldung von NIS-Clients haben, die ein veraltetes TCP/IP-Subsystem besitzen. Einige dieser TCP/IP-Subsysteme setzen alle Rechnerbits auf Null, wenn sie einen `Broadcast` durchführen oder können die Subnetzmaske nicht auslesen, wenn sie die Broadcast-Adresse berechnen. Einige Probleme können durch Änderungen der Clientkonfiguration behoben werden. Andere hingegen lassen sich nur durch das Entfernen des betreffenden Rechners aus dem Netzwerk oder den Verzicht auf [.filename]#securenets# umgehen.
+
+Die Verwendung der TCP-Wrapper verlangsamt die Reaktion des NIS-Servers. Diese zusätzliche Reaktionszeit kann in Clientprogrammen zu Timeouts führen. Dies vor allem in Netzwerken, die stark ausgelastet sind, oder nur über langsame NIS-Server verfügen. Wenn ein oder mehrere Clients dieses Problem aufweisen, sollten Sie die betreffenden Clients in NIS-Slaveserver umwandeln, und diese an sich selbst binden.
+
+==== Bestimmte Benutzer an der Anmeldung hindern
+
+In diesem Beispiel gibt es innerhalb der NIS-Domäne den Rechner `basie`, der nur für Mitarbeiter der Fakultät bestimmt ist. Die [.filename]#passwd# Datenbank des NIS-Masterservers enthält Benutzerkonten sowohl für Fakultätsmitarbeiter als auch für Studenten. Dieser Abschnitt beschreibt, wie Sie den Mitarbeitern der Fakultät die Anmeldung am System ermöglichen, während den Studenten die Anmeldung verweigert wird.
+
+Es gibt eine Möglichkeit, bestimmte Benutzer an der Anmeldung an einem bestimmten Rechner zu hindern, selbst wenn diese in der NIS-Datenbank vorhanden sind. Dazu kann mit `vipw` der Eintrag `-_Benutzername_` und die richtige Anzahl von Doppelpunkten an das Ende von [.filename]#/etc/master.passwd# gesetzt werden, wobei _Benutzername_ der zu blockierende Benutzername ist. Die Zeile mit dem geblockten Benutzer muss dabei vor der `+` Zeile, für zugelassene Benutzer stehen. In diesem Beispiel wird die Anmeldung für den Benutzer `bill` am Rechner `basie` blockiert:
+
+[source,bash]
+....
+basie# cat /etc/master.passwd
+root:[password]:0:0::0:0:The super-user:/root:/bin/csh
+toor:[password]:0:0::0:0:The other super-user:/root:/bin/sh
+daemon:*:1:1::0:0:Owner of many system processes:/root:/usr/sbin/nologin
+operator:*:2:5::0:0:System &:/:/usr/sbin/nologin
+bin:*:3:7::0:0:Binaries Commands and Source,,,:/:/usr/sbin/nologin
+tty:*:4:65533::0:0:Tty Sandbox:/:/usr/sbin/nologin
+kmem:*:5:65533::0:0:KMem Sandbox:/:/usr/sbin/nologin
+games:*:7:13::0:0:Games pseudo-user:/usr/games:/usr/sbin/nologin
+news:*:8:8::0:0:News Subsystem:/:/usr/sbin/nologin
+man:*:9:9::0:0:Mister Man Pages:/usr/shared/man:/usr/sbin/nologin
+bind:*:53:53::0:0:Bind Sandbox:/:/usr/sbin/nologin
+uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
+xten:*:67:67::0:0:X-10 daemon:/usr/local/xten:/usr/sbin/nologin
+pop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
+nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin
+-bill:::::::::
++:::::::::
+
+basie#
+....
+
+[[network-netgroups]]
+=== Netzgruppen verwenden
+
+Bestimmten Benutzern die Anmeldung an einzelnen Systemen zu verweigern, kann in großen Netzwerken schnell unübersichtlich werden. Dadurch verlieren Sie den Hauptvorteil von NIS: die _zentrale_ Verwaltung.
+
+Netzgruppen wurden entwickelt, um große, komplexe Netzwerke mit Hunderten Benutzern und Rechnern zu verwalten. Ihre Aufgabe ist vergleichbar mit UNIX(R) Gruppen. Die Hauptunterschiede sind das Fehlen einer numerischen ID sowie die Möglichkeit, Netzgruppen zu definieren, die sowohl Benutzer als auch andere Netzgruppen enthalten.
+
+Um das Beispiel in diesem Kapitel fortzuführen, wird die NIS-Domäne um zusätzliche Benutzer und Rechner erweitert:
+
+.Zusätzliche Benutzer
+[cols="1,1", frame="none", options="header"]
+|===
+| Benutzername(n)
+| Beschreibung
+
+|`alpha`, `beta`
+|Mitarbeiter der IT-Abteilung
+
+|`charlie`, `delta`
+|Lehrlinge der IT-Abteilung
+
+|`echo`, `foxtrott`, `golf`, ...
+|Mitarbeiter
+
+|`able`, `baker`, ...
+|Praktikanten
+|===
+
+.Zusätzliche Rechner
+[cols="1,1", frame="none", options="header"]
+|===
+| Rechnername(n)
+| Beschreibung
+
+|`war`, `death`, `famine`, `pollution`
+|Nur Mitarbeiter der IT-Abteilung dürfen sich an diesen Rechnern anmelden.
+
+|`pride`, `greed`, `envy`, `wrath`, `lust`, `sloth`
+|Nur Mitarbeiter und Lehrlinge der IT-Abteilung dürfen sich auf diesen Rechnern anmelden.
+
+|`one`, `two`, `three`, `four`, ...
+|Gewöhnliche Arbeitsrechner für Mitarbeiter.
+
+|`trashcan`
+|Ein sehr alter Rechner ohne kritische Daten. Sogar Praktikanten dürfen diesen Rechner verwenden.
+|===
+
+Bei der Verwendung von Netzgruppen wird jeder Benutzer einer oder mehreren Netzgruppen zugewiesen und die Anmeldung wird dann für die Netzgruppe erlaubt oder verwehrt. Wenn ein neuer Rechner hinzugefügt wird, müssen die Zugangsbeschränkungen nur für die Netzgruppen festgelegt werden. Wird ein neuer Benutzer angelegt, muss er einer oder mehreren Netzgruppen zugewiesen werden. Wenn die Einrichtung von NIS sorgfältig geplant wurde, muss nur noch eine zentrale Konfigurationsdatei bearbeitet werden, um den Zugriff auf bestimmte Rechner zu erlauben oder zu verbieten.
+
+Dieses Beispiel erstellt vier Netzgruppen: IT-Mitarbeiter, IT-Lehrlinge, normale Mitarbeiter sowie Praktikanten:
+
+[.programlisting]
+....
+IT_EMP (,alpha,test-domain) (,beta,test-domain)
+IT_APP (,charlie,test-domain) (,delta,test-domain)
+USERS (,echo,test-domain) (,foxtrott,test-domain) \
+ (,golf,test-domain)
+INTERNS (,able,test-domain) (,baker,test-domain)
+....
+
+Jede Zeile konfiguriert eine Netzgruppe. Die erste Spalte der Zeile bezeichnet den Namen der Netzgruppe. Die Einträge in den Klammern stehen entweder für eine Gruppe von einem oder mehreren Benutzern, oder für den Namen einer weiteren Netzgruppe. Wenn ein Benutzer angegeben wird, haben die drei Felder in der Klammer folgende Bedeutung:
+
+. Der Name des Rechner(s), auf dem die weiteren Felder für den Benutzer gültig sind. Wird kein Rechnername festgelegt, ist der Eintrag auf allen Rechnern gültig.
+. Der Name des Benutzerkontos, der zu dieser Netzgruppe gehört.
+. Die NIS-Domäne für das Benutzerkonto. Benutzerkonten können von anderen NIS-Domänen in eine Netzgruppe importiert werden.
+
+Wenn eine Gruppe mehrere Benutzer enthält, müssen diese durch Leerzeichen getrennt werden. Darüber hinaus kann jedes Feld Wildcards enthalten. Weitere Einzelheiten finden Sie in man:netgroup[5].
+
+Netzgruppennamen sollten nicht länger als 8 Zeichen sein. Es wird zwischen Groß- und Kleinschreibung unterschieden. Die Verwendung von Großbuchstaben für Netzgruppennamen ermöglicht eine leichte Unterscheidung zwischen Benutzern, Rechnern und Netzgruppen.
+
+Einige NIS-Clients (dies gilt nicht für FreeBSD) können keine Netzgruppen mit mehr als 15 Einträgen verwalten. Diese Grenze kann umgangen werden, indem mehrere Subnetzgruppen mit weniger als fünfzehn Benutzern angelegt werden und diese Subnetzgruppen wiederum in einer Netzgruppe zusammengefasst wird, wie in diesem Beispiel zu sehen:
+
+[.programlisting]
+....
+BIGGRP1 (,joe1,domain) (,joe2,domain) (,joe3,domain) [...]
+BIGGRP2 (,joe16,domain) (,joe17,domain) [...]
+BIGGRP3 (,joe31,domain) (,joe32,domain)
+BIGGROUP BIGGRP1 BIGGRP2 BIGGRP3
+....
+
+Wiederholen Sie diesen Vorgang, wenn mehr als 225 (15*15) Benutzer in einer einzigen Netzgruppe existieren.
+
+Die neue NIS-Map aktivieren und verteilen:
+
+[source,bash]
+....
+ellington# cd /var/yp
+ellington# make
+....
+
+Dadurch werden die NIS-Maps [.filename]#netgroup#, [.filename]#netgroup.byhost# und [.filename]#netgroup.byuser# erzeugt. Prüfen Sie die Verfügbarkeit der neuen NIS-Maps mit man:ypcat[1]:
+
+[source,bash]
+....
+ellington% ypcat -k netgroup
+ellington% ypcat -k netgroup.byhost
+ellington% ypcat -k netgroup.byuser
+....
+
+Die Ausgabe des ersten Befehls gibt den Inhalt von [.filename]#/var/yp/netgroup# wieder. Der zweite Befehl erzeugt nur dann eine Ausgabe, wenn rechnerspezifische Netzgruppen erzeugt wurden. Der dritte Befehl gibt die Netzgruppen nach Benutzern sortiert aus.
+
+Wenn Sie einen Client einrichten, verwenden Sie man:vipw[8] um den Namen der Netzgruppe anzugeben. Ersetzen Sie beispielsweise auf dem Server namens `war` die folgende Zeile:
+
+[.programlisting]
+....
++:::::::::
+....
+
+durch
+
+[.programlisting]
+....
++@IT_EMP:::::::::
+....
+
+ersetzt werden.
+
+Diese Zeile legt fest, dass nur noch Benutzer der Netzgruppe `IT_EMP` in die Passwortdatenbank dieses Systems importiert werden. Nur diese Benutzer dürfen sich an diesem Server anmelden.
+
+Diese Konfiguration gilt auch für die `~`-Funktion der Shell und für alle Routinen, die auf Benutzernamen und numerische Benutzer-IDs zugreifen. Oder anders formuliert, `cd ~_Benutzer_` ist nicht möglich, `ls -l` zeigt die numerische Benutzer-ID statt dem Benutzernamen und `find . -user joe -print` erzeugt die Fehlermeldung `No such user`. Um dieses Problem zu beheben, müssen alle Benutzereinträge importiert werden, ohne ihnen jedoch zu erlauben, sich am Server anzumelden. Dies kann durch das Hinzufügen einer zusätzlichen Zeile erreicht werden:
+
+[.programlisting]
+....
++:::::::::/usr/sbin/nologin
+....
+
+Diese Zeile weist den Client an, alle Einträge zu importieren, aber die Shell in diesen Einträgen durch [.filename]#/usr/sbin/nologin# zu ersetzen.
+
+Stellen Sie sicher, dass die zusätzliche Zeile _nach_ der Zeile `+@IT_EMP:::::::::` eingetragen ist. Andernfalls haben alle via NIS importierten Benutzerkonten [.filename]#/usr/sbin/nologin# als Loginshell und niemand wird sich mehr am System anmelden können.
+
+Um die weniger wichtigen Server zu konfigurieren, ersetzen Sie den alten Eintrag `+:::::::::` auf den Servern mit diesen Zeilen:
+
+[.programlisting]
+....
++@IT_EMP:::::::::
++@IT_APP:::::::::
++:::::::::/usr/sbin/nologin
+....
+
+Die entsprechenden Zeilen für Arbeitsplätze lauten:
+
+[.programlisting]
+....
++@IT_EMP:::::::::
++@USERS:::::::::
++:::::::::/usr/sbin/nologin
+....
+
+NIS ist in der Lage, Netzgruppen aus anderen Netzgruppen zu bilden. Dies kann nützlich sein, wenn sich die Firmenpolitik ändert. Eine Möglichkeit ist die Erzeugung rollenbasierter Netzgruppen. Sie könnten eine Netzgruppe `BIGSRV` erzeugen, um den Zugang zu den wichtigsten Servern zu beschränken, eine weitere Gruppe `SMALLSRV` für die weniger wichtigen Server und eine dritte Netzgruppe `USERBOX` für die Arbeitsplatzrechner. Jede dieser Netzgruppen enthält die Netzgruppen, die sich auf diesen Rechnern anmelden dürfen. Die Einträge der Netzgruppen in der NIS-Map sollten ähnlich den folgenden aussehen:
+
+[.programlisting]
+....
+BIGSRV IT_EMP IT_APP
+SMALLSRV IT_EMP IT_APP ITINTERN
+USERBOX IT_EMP ITINTERN USERS
+....
+
+Diese Methode funktioniert besonders gut, wenn Rechner in Gruppen mit identischen Beschränkungen eingeteilt werden können. Unglücklicherweise ist dies die Ausnahme und nicht die Regel. Meistens wird die Möglichkeit zur rechnerspezischen Zugangsbeschränkung benötigt.
+
+Rechnerspezifische Netzgruppen sind eine weitere Möglichkeit, um mit den oben beschriebenen Änderungen umzugehen. In diesem Szenario enthält [.filename]#/etc/master.passwd# auf jedem Rechner zwei mit "+" beginnende Zeilen. Die erste Zeile legt die Netzgruppe mit den Benutzern fest, die sich auf diesem Rechner anmelden dürfen. Die zweite Zeile weist allen anderen Benutzern [.filename]#/usr/sbin/nologin# als Shell zu. Verwenden Sie auch hier (analog zu den Netzgruppen) Großbuchstaben für die Rechnernamen:
+
+[.programlisting]
+....
++@BOXNAME:::::::::
++:::::::::/usr/sbin/nologin
+....
+
+Sobald dies für alle Rechner erledigt ist, müssen die lokalen Versionen von [.filename]#/etc/master.passwd# nie mehr verändert werden. Alle weiteren Änderungen geschehen über die NIS-Maps. Nachfolgend ein Beispiel für eine mögliche Netzgruppen-Map:
+
+[.programlisting]
+....
+# Define groups of users first
+IT_EMP (,alpha,test-domain) (,beta,test-domain)
+IT_APP (,charlie,test-domain) (,delta,test-domain)
+DEPT1 (,echo,test-domain) (,foxtrott,test-domain)
+DEPT2 (,golf,test-domain) (,hotel,test-domain)
+DEPT3 (,india,test-domain) (,juliet,test-domain)
+ITINTERN (,kilo,test-domain) (,lima,test-domain)
+D_INTERNS (,able,test-domain) (,baker,test-domain)
+#
+# Now, define some groups based on roles
+USERS DEPT1 DEPT2 DEPT3
+BIGSRV IT_EMP IT_APP
+SMALLSRV IT_EMP IT_APP ITINTERN
+USERBOX IT_EMP ITINTERN USERS
+#
+# And a groups for a special tasks
+# Allow echo and golf to access our anti-virus-machine
+SECURITY IT_EMP (,echo,test-domain) (,golf,test-domain)
+#
+# machine-based netgroups
+# Our main servers
+WAR BIGSRV
+FAMINE BIGSRV
+# User india needs access to this server
+POLLUTION BIGSRV (,india,test-domain)
+#
+# This one is really important and needs more access restrictions
+DEATH IT_EMP
+#
+# The anti-virus-machine mentioned above
+ONE SECURITY
+#
+# Restrict a machine to a single user
+TWO (,hotel,test-domain)
+# [...more groups to follow]
+....
+
+Es ist nicht immer ratsam, rechnerbasierte Netzgruppen zu verwenden. Wenn Dutzende oder Hunderte identische Rechner eingerichtet werden müssen, sollten rollenbasierte Netzgruppen verwendet werden, um die Größe der NIS-Maps in Grenzen zu halten.
+
+=== Passwortformate
+
+Alle Rechner innerhalb der NIS-Domäne müssen für die Verschlüsselung von Passwörtern das gleiche Format benutzen. Wenn Benutzer Schwierigkeiten bei der Authentifizierung auf einem NIS-Client haben, liegt dies möglicherweise an einem anderen Passwort-Format. In einem heterogenen Netzwerk muss das verwendete Format von allen Betriebssystemen unterstützt werden, wobei DES der kleinste gemeinsame Standard ist.
+
+Welches Format die Server und Clients verwenden, steht in [.filename]#/etc/login.conf#:
+
+[.programlisting]
+....
+default:\
+ :passwd_format=des:\
+ :copyright=/etc/COPYRIGHT:\
+ [weitere Einträge]
+....
+
+In diesem Beispiel verwendet das System das Format DES. Weitere mögliche Werte sind unter anderem `blf` und `md5` (mit Blowfish und MD5 verschlüsselte Passwörter).
+
+Wird auf einem Rechner das Format entsprechend der NIS-Domäne geändert, muss anschließend die Login-Capability Datenbank neu erstellt werden:
+
+[source,bash]
+....
+# cap_mkdb /etc/login.conf
+....
+
+[NOTE]
+====
+Das Format der schon bestehenden Passwörter wird erst aktualisiert, wenn ein Benutzer sein Passwort ändert, _nachdem_ die Datenbank neu erstellt wurde.
+====
+
+[[network-ldap]]
+== Lightweight Access Directory Protocol (LDAP)
+
+Das Lightweight Directory Access Protocol (LDAP) ist ein Protokoll der Anwendungsschicht, das verwendet wird um Objekte mithilfe eines verteilten Verzeichnisdienstes abzurufen, zu verändern und zu authentifizieren. Betrachten Sie es als ein Telefonbuch, das homogene Informationen in mehreren hierarchischen Ebenen speichert. Es wird in Active Directory und OpenLDAP-Netzwerken eingesetzt, in denen Benutzer unter Verwendung eines einzigen Kontos auf diverse interne Informationen zugreifen. Beispielsweise kann E-Mail-Authentifizierung, Abfrage von Kontaktinformationen und Website-Authentifizierung über ein einzelnes Benutzerkonto aus der Datenbank des LDAP-Servers erfolgen.
+
+Dieser Abschnitt enthält eine kompakte Anleitung, um einen LDAP-Server auf einem FreeBSD-System zu konfigurieren. Es wird vorausgesetzt, dass der Administrator bereits einen Plan erarbeitet hat, der verschiedene Punkte umfasst, unter anderem die Art der zu speichernden Informationen, für was die Informationen verwendet werden, welche Benutzer Zugriff auf die Informationen haben und wie die Informationen vor unbefugtem Zugriff geschützt werden.
+
+=== LDAP Terminologie und Struktur
+
+LDAP verwendet mehrere Begriffe die Sie verstehen sollten bevor Sie die Konfiguration beginnen. Alle Verzeichniseinträge bestehen aus einer Gruppe von _Attributen_. Jede Attributgruppe enthält einen eindeutigen Bezeichner, der als distinguished name (DN) bekannt ist. Dieser setzt sich normalerweise aus mehreren anderen Attributen, wie dem Relative Distinguished Name (RDN) zusammen. Wie bei Verzeichnissen gibt es auch hier absolute und relative Pfade. Betrachten Sie DN als absoluten Pfad und RDN als relativen Pfad.
+
+Beispielsweise könnte ein LDAP-Eintrag wie folgt aussehen. Dieses Beispiel sucht nach dem Eintrag für das angegebene Benutzerkonto (`uid`), Organisationseinheit (`ou` und Organisation (`o`):
+
+[source,bash]
+....
+% ldapsearch -xb "uid=trhodes,ou=users,o=example.com"
+# extended LDIF
+
+#
+# LDAPv3
+# base <uid=trhodes,ou=users,o=example.com> with scope subtree
+# filter: (objectclass=*)
+# requesting: ALL
+#
+
+# trhodes, users, example.com
+dn: uid=trhodes,ou=users,o=example.com
+mail: trhodes@example.com
+cn: Tom Rhodes
+uid: trhodes
+telephoneNumber: (123) 456-7890
+
+# search result
+search: 2
+result: 0 Success
+
+# numResponses: 2
+# numEntries:1
+....
+
+Die Einträge in diesem Beispiel zeigen die Werte für die Attribute `dn`, `mail`, `cn`, `uid` und `telephoneNumber`. Das Attribut `cn` ist der RDN.
+
+Weitere Informationen über LDAP und dessen Terminologie finden Sie unter http://www.openldap.org/doc/admin24/intro.html[ http://www.openldap.org/doc/admin24/intro.html].
+
+[[ldap-config]]
+=== Konfiguration eines LDAP-Servers
+
+FreeBSD integriert keinen LDAP-Server. Beginnen Sie die Konfiguration mit der Installation des Ports oder Pakets package:net/openldap-server[]:
+
+[source,bash]
+....
+# pkg install openldap-server
+....
+
+Im link:{linux-users}#software/[ Paket] sind eine große Anzahl an Optionen aktiviert. Mit dem Befehl `pkg info openldap-server` können diese überprüft werden. Falls die Optionen nicht ausreichend sind (weil bspw. SQL-Unterstützung benötigt wird), sollten Sie in Betracht ziehen, den Port mit dem entsprechenden Framework neu zu übersetzen.
+
+Während der Installation wird für die Daten das Verzeichnis [.filename]#/var/db/openldap-data# erstellt. Das Verzeichnis für die Ablage der Zertifikate muss manuell angelegt werden:
+
+[source,bash]
+....
+# mkdir /usr/local/etc/openldap/private
+....
+
+Im nächsten Schritt wird die Zertifizierungsstelle konfiguriert. Die folgenden Befehle müssen in [.filename]#/usr/local/etc/openldap/private# ausgeführt werden. Dies ist wichtig, da die Dateiberechtigungen restriktiv gesetzt werden und Benutzer keinen direkten Zugriff auf diese Daten haben sollten. Weitere Informationen über Zertifikate und deren Parameter finden Sie im crossref:security[openssl,"OpenSSL"]. Geben Sie folgenden Befehl ein, um die Zertifizierungsstelle zu erstellen und folgen Sie den Anweisungen:
+
+[source,bash]
+....
+# openssl req -days 365 -nodes -new -x509 -keyout ca.key -out ../ca.crt
+....
+
+Diese Einträge sind frei wählbar, _mit Ausnahme_ von _Common Name_. Hier muss etwas anderes als der Hostname des Systems eingetragen werden. Wenn ein selbstsigniertes Zertifikat verwendet wird, stellen Sie dem Hostnamen einfach das Präfix `CA` für die Zertifizierungsstelle voran.
+
+Die nächste Aufgabe besteht darin, einen Zertifikatsregistrierungsanforderung (CSR) sowie einen privaten Schlüssel zu erstellen. Geben Sie folgenden Befehl ein und folgen Sie den Anweisungen:
+
+[source,bash]
+....
+# openssl req -days 365 -nodes -new -keyout server.key -out server.csr
+....
+
+Stellen Sie hierbei sicher, dass `Common Name` richtig eingetragen wird. Die Zertifikatsregistrierungsanforderung muss mit dem Schlüssel der Zertifizierungsstelle unterschrieben werden, um als gültiges Zertifikat verwendet zu werden:
+
+[source,bash]
+....
+# openssl x509 -req -days 365 -in server.csr -out ../server.crt -CA ../ca.crt -CAkey ca.key -CAcreateserial
+....
+
+Der letzte Schritt für die Erstellung der Zertifikate besteht darin, die Client-Zertifikate zu erstellen und zu signieren:
+
+[source,bash]
+....
+# openssl req -days 365 -nodes -new -keyout client.key -out client.csr
+# openssl x509 -req -days 3650 -in client.csr -out ../client.crt -CAkey ca.key
+....
+
+Achten Sie wieder auf das Attribut `Common name`. Stellen Sie außerdem sicher, dass bei diesem Verfahren acht (8) neue Dateien erzeugt worden sind.
+
+Der Daemon, auf dem der OpenLDAP-Server läuft, heißt [.filename]#slapd#. Die Konfiguration erfolgt über [.filename]#slapd.ldif#. Die alte [.filename]#slapd.conf# wird von OpenLDAP nicht mehr verwendet.
+
+http://www.openldap.org/doc/admin24/slapdconf2.html[Konfigurationsbeispiele] für [.filename]#slapd.ldif# finden sich auch in [.filename]#/usr/local/etc/openldap/slapd.ldif.sample#. Optionen sind in slapd-config(5) dokumentiert. Jeder Abschnitt in [.filename]#slapd.ldif# wird, wie alle anderen LDAP-Attributgruppen, durch einen DN eindeutig identifiziert. Achten Sie darauf, dass keine Leerzeilen zwischen der Anweisung `dn:` und dem gewünschten Ende des Abschnitts verbleiben. Im folgenden Beispiel wird TLS verwendet, um einen sicheren Kanal zu implementieren. Der erste Abschnitt stellt die globale Konfiguration dar:
+
+[.programlisting]
+....
+#
+# See slapd-config(5) for details on configuration options.
+# This file should NOT be world readable.
+#
+dn: cn=config
+objectClass: olcGlobal
+cn: config
+#
+#
+# Define global ACLs to disable default read access.
+#
+olcArgsFile: /var/run/openldap/slapd.args
+olcPidFile: /var/run/openldap/slapd.pid
+olcTLSCertificateFile: /usr/local/etc/openldap/server.crt
+olcTLSCertificateKeyFile: /usr/local/etc/openldap/private/server.key
+olcTLSCACertificateFile: /usr/local/etc/openldap/ca.crt
+#olcTLSCipherSuite: HIGH
+olcTLSProtocolMin: 3.1
+olcTLSVerifyClient: never
+....
+
+Hier müssen die Zertifizierungsstelle, das Serverzertifikat und die privaten Schlüssel des Servers angegeben werden. Es wird empfohlen, den Clients die Wahl der Sicherheits-Chiffre zu überlassen und die Option `olcTLSCipherSuite` wegzulassen (inkompatibel mit anderen TLS-Clients als [.filename]#openssl#). Mit der Option `olcTLSProtocolMin` benötigt der Server nur eine minimale Sicherheitsstufe. Diese Option wird empfohlen. Während die Verfizierung für den Server verpflichtend ist, ist sie es nicht für den Client: `olcTLSVerifyClient: never`.
+
+Der zweite Abschnitt behandelt die Backend-Module und kann wie folgt konfiguriert werden:
+
+[.programlisting]
+....
+#
+# Load dynamic backend modules:
+#
+dn: cn=module,cn=config
+objectClass: olcModuleList
+cn: module
+olcModulepath: /usr/local/libexec/openldap
+olcModuleload: back_mdb.la
+#olcModuleload: back_bdb.la
+#olcModuleload: back_hdb.la
+#olcModuleload: back_ldap.la
+#olcModuleload: back_passwd.la
+#olcModuleload: back_shell.la
+....
+
+Der dritte Abschnitt widmet sich dem Laden der benötigten ldif-Schemata, die von den Datenbanken verwendet werden sollen. Diese Dateien sind essentiell.
+
+[.programlisting]
+....
+dn: cn=schema,cn=config
+objectClass: olcSchemaConfig
+cn: schema
+
+include: file:///usr/local/etc/openldap/schema/core.ldif
+include: file:///usr/local/etc/openldap/schema/cosine.ldif
+include: file:///usr/local/etc/openldap/schema/inetorgperson.ldif
+include: file:///usr/local/etc/openldap/schema/nis.ldif
+....
+
+Als nächstes folgt der Abschnitt zur Frontend-Konfiguration:
+
+[.programlisting]
+....
+# Frontend settings
+#
+dn: olcDatabase={-1}frontend,cn=config
+objectClass: olcDatabaseConfig
+objectClass: olcFrontendConfig
+olcDatabase: {-1}frontend
+olcAccess: to * by * read
+#
+# Sample global access control policy:
+# Root DSE: allow anyone to read it
+# Subschema (sub)entry DSE: allow anyone to read it
+# Other DSEs:
+# Allow self write access
+# Allow authenticated users read access
+# Allow anonymous users to authenticate
+#
+#olcAccess: to dn.base="" by * read
+#olcAccess: to dn.base="cn=Subschema" by * read
+#olcAccess: to *
+# by self write
+# by users read
+# by anonymous auth
+#
+# if no access controls are present, the default policy
+# allows anyone and everyone to read anything but restricts
+# updates to rootdn. (e.g., "access to * by * read")
+#
+# rootdn can always read and write EVERYTHING!
+#
+olcPasswordHash: {SSHA}
+# {SSHA} is already the default for olcPasswordHash
+....
+
+Ein weiterer Abschnitt ist dem Konfigurations-Backend gewidmet, der einzige Weg, später auf die OpenLDAP-Serverkonfiguration zuzugreifen, ist als globaler Superuser.
+
+[.programlisting]
+....
+dn: olcDatabase={0}config,cn=config
+objectClass: olcDatabaseConfig
+olcDatabase: {0}config
+olcAccess: to * by * none
+olcRootPW: {SSHA}iae+lrQZILpiUdf16Z9KmDmSwT77Dj4U
+....
+
+Der voreingestellte Benutzername für den Administrator lautet `cn=config`. Geben Sie [.filename]#slappasswd# in eine Shell ein, wählen Sie ein Passwort und verwenden Sie seinen Hash in `olcRootPW`. Wenn diese Option jetzt nicht angegeben ist, kann vor dem Import der [.filename]#slapd.ldif# niemand später den Abschnitt _global configuration_ ändern.
+
+Der letzte Abschnitt befasst sich mit dem Datenbank-Backend:
+
+[.programlisting]
+....
+#######################################################################
+# LMDB database definitions
+#######################################################################
+#
+dn: olcDatabase=mdb,cn=config
+objectClass: olcDatabaseConfig
+objectClass: olcMdbConfig
+olcDatabase: mdb
+olcDbMaxSize: 1073741824
+olcSuffix: dc=domain,dc=example
+olcRootDN: cn=mdbadmin,dc=domain,dc=example
+# Cleartext passwords, especially for the rootdn, should
+# be avoided. See slappasswd(8) and slapd-config(5) for details.
+# Use of strong authentication encouraged.
+olcRootPW: {SSHA}X2wHvIWDk6G76CQyCMS1vDCvtICWgn0+
+# The database directory MUST exist prior to running slapd AND
+# should only be accessible by the slapd and slap tools.
+# Mode 700 recommended.
+olcDbDirectory: /var/db/openldap-data
+# Indices to maintain
+olcDbIndex: objectClass eq
+....
+
+Diese Datenbank enthält den _eigentlichen Inhalt_ des LDAP-Verzeichnisses. Neben `mdb` sind weitere Versionen verfügbar. Dessen Superuser, nicht zu verwechseln mit dem globalen, wird hier konfiguriert: ein Benutzername in `olcRootDN` und der Passworthash in `olcRootPW`; [.filename]#slappasswd# kann wie zuvor benutzt werden.
+
+Dieses http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=tree;f=tests/data/regressions/its8444;h=8a5e808e63b0de3d2bdaf2cf34fecca8577ca7fd;hb=HEAD[Repository] enthält vier Beispiele für [.filename]#slapd.ldif#. Lesen Sie diese Seite, um eine bestehende [.filename]#slapd.conf# in [.filename]#slapd.ldif# zu konvertieren. Beachten Sie, dass dies einige unbrauchbare Optionen einführen kann.
+
+Wenn die Konfiguration abgeschlossen ist, muss [.filename]#slapd.ldif# in ein leeres Verzeichnis verschoben werden. Folgendes ist die empfohlene Vorgehensweise:
+
+[source,bash]
+....
+# mkdir /usr/local/etc/openldap/slapd.d/
+....
+
+Importieren Sie die Konfigurationsdatenbank:
+
+[source,bash]
+....
+# /usr/local/sbin/slapadd -n0 -F /usr/local/etc/openldap/slapd.d/ -l /usr/local/etc/openldap/slapd.ldif
+....
+
+Starten Sie den [.filename]#slapd#-Daemon:
+
+[source,bash]
+....
+# /usr/local/libexec/slapd -F /usr/local/etc/openldap/slapd.d/
+....
+
+Die Option `-d` kann, wie in slapd(8) beschrieben, zur Fehlersuche benutzt werden. Stellen Sie sicher, dass der Server läuft und korrekt arbeitet:
+
+[source,bash]
+....
+# ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
+# extended LDIF
+#
+# LDAPv3
+# base <> with scope baseObject
+# filter: (objectclass=*)
+# requesting: namingContexts
+#
+
+#
+dn:
+namingContexts: dc=domain,dc=example
+
+# search result
+search: 2
+result: 0 Success
+
+# numResponses: 2
+# numEntries: 1
+....
+
+Dem Server muss noch vertraut werden. Wenn dies noch nie zuvor geschehen ist, befolgen Sie diese Anweisungen. Installieren Sie das Paket oder den Port OpenSSL:
+
+[source,bash]
+....
+# pkg install openssl
+....
+
+Aus dem Verzeichnis, in dem [.filename]#ca.crt# gespeichert ist (in diesem Beispiel [.filename]#/usr/local/etc/openldap#), starten Sie:
+
+[source,bash]
+....
+# c_rehash .
+....
+
+Sowohl die CA als auch das Serverzertifikat werden nun in ihren jeweiligen Rollen korrekt erkannt. Um dies zu überprüfen, führen die folgenden Befehl aus dem Verzeichnis der [.filename]#server.crt# aus:
+
+[source,bash]
+....
+# openssl verify -verbose -CApath . server.crt
+....
+
+Falls [.filename]#slapd# ausgeführt wurde, muss der Daemon neu gestartet werden. Wie in [.filename]#/usr/local/etc/rc.d/slapd# angegeben, müssen die folgenden Zeilen in [.filename]#/etc/rc.conf# eingefügt werden, um [.filename]#slapd# beim Booten ordnungsgemäß auszuführen:
+
+[.programlisting]
+....
+lapd_enable="YES"
+slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/
+ldap://0.0.0.0/"'
+slapd_sockets="/var/run/openldap/ldapi"
+slapd_cn_config="YES"
+....
+
+[.filename]#slapd# bietet beim Booten keine Möglichkeit zur Fehlersuche. Überprüfen Sie dazu [.filename]#/var/log/debug.log#, `dmesg -a` und [.filename]#/var/log/messages#.
+
+Das folgende Beispiel fügt die Gruppe `team` und den Benutzer `john` zur LDAP-Datenbank `domain.example` hinzu, die bislang leer ist. Erstellen Sie zunächst die Datei [.filename]#domain.ldif#:
+
+[source,bash]
+....
+# cat domain.ldif
+dn: dc=domain,dc=example
+objectClass: dcObject
+objectClass: organization
+o: domain.example
+dc: domain
+
+dn: ou=groups,dc=domain,dc=example
+objectClass: top
+objectClass: organizationalunit
+ou: groups
+
+dn: ou=users,dc=domain,dc=example
+objectClass: top
+objectClass: organizationalunit
+ou: users
+
+dn: cn=team,ou=groups,dc=domain,dc=example
+objectClass: top
+objectClass: posixGroup
+cn: team
+gidNumber: 10001
+
+dn: uid=john,ou=users,dc=domain,dc=example
+objectClass: top
+objectClass: account
+objectClass: posixAccount
+objectClass: shadowAccount
+cn: John McUser
+uid: john
+uidNumber: 10001
+gidNumber: 10001
+homeDirectory: /home/john/
+loginShell: /usr/bin/bash
+userPassword: secret
+....
+
+Weitere Informationen finden Sie in der OpenLDAP-Dokumentation. Benutzen Sie [.filename]#slappasswd#, um das Passwort durch einen Hash in `userPassword` zu ersetzen. Der in `loginShell` angegebene Pfad muss in allen Systemen existieren, in denen `john` sich anmelden darf. Benutzen Sie schließlich den `mdb`-Administrator, um die Datenbank zu ändern:
+
+[source,bash]
+....
+# ldapadd -W -D "cn=mdbadmin,dc=domain,dc=example" -f domain.ldif
+....
+
+Änderungen im Bereich _global configuration_ können nur vom globalen Superuser vorgenommen werden. Angenommen die Option `olcTLSCipherSuite: HIGH:MEDIUM:SSLv3` wurde ursprünglich definiert und soll nun gelöscht werden. Dazu erstellen Sie zunächst eine Datei mit folgendem Inhalt:
+
+[source,bash]
+....
+# cat global_mod
+dn: cn=config
+changetype: modify
+delete: olcTLSCipherSuite
+....
+
+Übernehmen Sie dann die Änderungen:
+
+[source,bash]
+....
+# ldapmodify -f global_mod -x -D "cn=config" -W
+....
+
+Geben Sie bei Aufforderung das im Abschnitt _configuration backend_ gewählte Passwort ein. Der Benutzername ist nicht erforderlich: Hier repräsentiert `cn=config` den DN des zu ändernden Datenbankabschnitts. Alternativ können Sie mit `ldapmodify` eine einzelne Zeile der Datenbank löschen, mit `ldapdelete` einen ganzen Eintrag.
+
+Wenn etwas schief geht oder der globale Superuser nicht auf das Konfigurations-Backend zugreifen kann, ist es möglich, die gesamte Konfiguration zu löschen und neu zu schreiben:
+
+[source,bash]
+....
+# rm -rf /usr/local/etc/openldap/slapd.d/
+....
+
+[.filename]#slapd.ldif# kann dann bearbeitet und erneut importiert werden. Bitte folgenden Sie dieser Vorgehensweise nur, wenn keine andere Lösung verfügbar ist.
+
+Dies ist nur die Konfiguration des Servers. Auf demselben Rechner kann auch ein LDAP-Client mit eigener, separater Konfiguration betrieben werden.
+
+[[network-dhcp]]
+== Dynamic Host Configuration Protocol (DHCP)
+
+Das Dynamic Host Configuration Protocol (DHCP) ermöglicht es einem System, sich mit einem Netzwerk zu verbinden und die für die Kommunikation mit diesem Netzwerk nötigen Informationen zu beziehen. FreeBSD verwendet den von OpenBSD stammenden `dhclient`, um die Adressinformationen zu beziehen. FreeBSD installiert keinen DHCP-Server, aber es stehen einige Server in der FreeBSD Ports-Sammlung zu Verfügung. Das DHCP-Protokoll wird vollständig im http://www.freesoft.org/CIE/RFC/2131/[ RFC 2131] beschrieben. Eine weitere, lehrreiche Informationsquelle existiert unter http://www.isc.org/downloads/dhcp[ isc.org/downloads/dhcp/].
+
+In diesem Abschnitt wird beschrieben, wie der integrierte DHCP-Client verwendet wird. Anschließend wird erklärt, wie ein DHCP-Server zu installieren und konfigurieren ist.
+
+[NOTE]
+====
+Unter FreeBSD wird das Gerät man:bpf[4] für den DHCP-Server und den DHCP-Client benötigt. Das Gerät ist bereits im [.filename]#GENERIC#-Kernel enthalten. Benutzer, die es vorziehen einen angepassten Kernel zu erstellen, müssen dieses Gerät behalten, wenn DHCP verwendet wird.
+
+Es sei darauf hingewiesen, dass [.filename]#bpf# es priviligierten Benutzern ermöglicht einen Paket-Sniffer auf dem System auszuführen.
+====
+
+=== Einen DHCP-Client konfigurieren
+
+Die Unterstützung für den DHCP-Client ist im Installationsprogramm von FreeBSD enthalten, sodass ein neu installiertes System automatisch die Adressinformationen des Netzwerks vom DHCP-Server erhält. In crossref:bsdinstall[bsdinstall-post,"Benutzerkonten, Zeitzone, Dienste und Sicherheitsoptionen"] finden Sie Beispiele für eine Netzwerkkonfiguration.
+
+`dhclient` beginnt von einem Clientrechner aus über den UDP-Port 68 Konfigurationsinformationen anzufordern. Der Server antwortet auf dem UDP-Port 67, indem er dem Client eine IP-Adresse zuweist und ihm weitere relevante Informationen über das Netzwerk, wie Netzmasken, Router und DNS-Server mitteilt. Diese Informationen werden als DHCP-Lease bezeichnet und sind nur für bestimmte Zeit, die vom Administrator des DHCP-Servers vorgegeben wird, gültig. Dadurch fallen verwaiste IP-Adressen, deren Clients nicht mehr mit dem Netzwerk verbunden sind, automatisch an den Server zurück. DHCP-Clients können sehr viele Informationen von einem DHCP-Server erhalten. Eine ausführliche Liste finden Sie in man:dhcp-options[5].
+
+Das Gerät [.filename]#bpf# ist im [.filename]#GENERIC#-Kernel bereits enthalten. Für die Nutzung von DHCP muss also kein angepasster Kernel erzeugt werden. In einer angepassten Kernelkonfigurationsdatei muss das Gerät enthalten sein, damit DHCP ordnungsgemäß funktioniert.
+
+Standardmässig läuft die DHCP-Konfiguration bei FreeBSD im Hintergrund oder auch _asynchron_. Andere Startskripte laufen weiter, während DHCP fertig abgearbeitet wird, was den Systemstart beschleunigt.
+
+DHCP im Hintergrund funktioniert gut, wenn der DHCP-Server schnell auf Anfragen der Clients antwortet. Jedoch kann DHCP eine lange Zeit benötigen, um auf manchen Systemen fertig zu werden. Falls Netzwerkdienste gestartet werden, bevor DHCP die Informationen und Netzwerkadressen gesetzt hat, werden diese fehlschlagen. Durch die Verwendung von DHCP im _asynchronen_ Modus wird das Problem verhindert, so dass die Startskripte pausiert werden, bis die DHCP-Konfiguration abgeschlossen ist.
+
+Diese Zeile wird in [.filename]#/etc/rc.conf# verwendet, um den asynchronen Modus zu aktivieren:
+
+[.programlisting]
+....
+ifconfig_fxp0="DHCP"
+....
+
+Die Zeile kann bereits vorhanden sein, wenn bei der Installation des Systems DHCP konfiguriert wurde. Ersetzen Sie _fxp0_ durch die entsprechende Schnittstelle. Die dynamische Konfiguration von Netzwerkkarten wird in crossref:config[config-network-setup,“Einrichten von Netzwerkkarten”] beschrieben.
+
+Um stattdessen den synchronen Modus zu verwenden, der während des Systemstarts pausiert bis die DHCP-Konfiguration abgeschlossen ist, benutzen Sie "SYNCDHCP":
+
+[.programlisting]
+....
+ifconfig_fxp0="SYNCDHCP"
+....
+
+Es stehen weitere Optionen für den Client zur Verfügung. Suchen Sie in man:rc.conf[5] nach `dhclient`, wenn Sie an Einzelheiten interessiert sind.
+
+Der DHCP-Client verwendet die folgenden Dateien:
+
+* [.filename]#/etc/dhclient.conf#
++
+Die Konfigurationsdatei von `dhclient`. Diese Datei enthält normalerweise nur Kommentare, da die Vorgabewerte zumeist ausreichend sind. Diese Konfigurationsdatei wird in man:dhclient.conf[5] beschrieben.
+* [.filename]#/sbin/dhclient#
++
+Weitere Informationen über dieses Kommando finden Sie in man:dhclient[8].
+* [.filename]#/sbin/dhclient-script#
++
+Das FreeBSD-spezifische Konfigurationsskript des DHCP-Clients. Es wird in man:dhclient-script[8] beschrieben und kann meist unverändert übernommen werden.
+* [.filename]#/var/db/dhclient.leases.interface#
++
+Der DHCP-Client verfügt über eine Datenbank, die alle derzeit gültigen Leases enthält und als Logdatei erzeugt wird. Diese Datei wird in man:dhclient.leases[5] beschrieben.
+
+[[network-dhcp-server]]
+=== Einen DHCP-Server installieren und einrichten
+
+Dieser Abschnitt beschreibt die Einrichtung eines FreeBSD-Systems als DHCP-Server. Dazu wird die DHCP-Implementation von ISC (Internet Systems Consortium) verwendet. Diese Implementation und die Dokumentation können als Port oder Paket package:net/isc-dhcp43-server[] installiert werden.
+
+Der Port package:net/isc-dhcp43-server[] installiert eine Beispiel-Konfigurationsdatei. Kopieren Sie [.filename]#/usr/local/etc/dhcpd.conf.example# nach [.filename]#/usr/local/etc/dhcpd.conf# und nehmen Sie die Änderungen an der neuen Datei vor.
+
+Diese Konfigurationsdatei umfasst Deklarationen für Subnetze und Rechner, die den DHCP-Cleints zur Verfügung gestellt wird. Die folgenden Zeilen konfigurieren Folgendes:
+
+[.programlisting]
+....
+option domain-name "example.org";<.>
+option domain-name-servers ns1.example.org;<.>
+option subnet-mask 255.255.255.0;<.>
+
+default-lease-time 600;<.>
+max-lease-time 72400;<.>
+ddns-update-style none;<.>
+
+subnet 10.254.239.0 netmask 255.255.255.224 {
+ range 10.254.239.10 10.254.239.20;<.>
+ option routers rtr-239-0-1.example.org;<.>
+}
+
+host fantasia {
+ hardware ethernet 08:00:07:26:c0:a5;<.>
+ fixed-address fantasia.fugue.com;<.>
+}
+....
+
+<.> Diese Option beschreibt die Standardsuchdomäne, die den Clients zugewiesen wird. Weitere Informationen finden Sie in man:resolv.conf[5].
+
+<.> Diese Option legt eine, durch Kommata getrennte Liste von DNS-Servern fest, die von den Clients verwendet werden sollen. Die Server können über den Namen (FQDN) oder die IP-Adresse spezifiziert werden.
+
+<.> Die den Clients zugewiesene Subnetzmaske.
+
+<.> Die Voreinstellung für die Ablaufzeit des Lease in Sekunden. Ein Client kann diesen Wert in der Konfiguration überschreiben.
+
+<.> Die maximale Zeitdauer, für die der Server Leases vergibt. Sollte ein Client eine längere Zeitspanne anfordern, wird dennoch nur der Wert `max-lease-time` zugewiesen.
+
+<.> Die Voreinstellung `none` deaktiviert dynamische DNS-Updates. Bei der Einstellung `interim` aktualisiert der DHCP-Server den DNS-Server, wenn ein Lease vergeben oder zurückgezogen wurde. Ändern Sie die Voreinstellung nicht, wenn der Server so konfiguriert wurde, dynamische DNS-Updates zu unterstützen.
+
+<.> Diese Zeile erstellt einen Pool der verfügbaren IP-Adressen, die für die Zuweisung der DHCP-Clients reserviert sind. Der Bereich muss für das angegebene Netz oder Subnetz aus der vorherigen Zeile gültig sein.
+
+<.> Legt das Standard-Gateway für das Netz oder Subnetz fest, das nach der öffnenden Klammer `{` gültig ist.
+
+<.> Bestimmt die Hardware-MAC-Adresse eines Clients, durch die der DHCP-Server den Client erkennt, der eine Anforderung an ihn stellt.
+
+<.> Einem Rechner soll immer die gleiche IP-Adresse zugewiesen werden. Hier ist auch ein Rechnername gültig, da der DHCP-Server den Rechnernamen auflöst, bevor er das Lease zuweist.
+
+Die Konfigurationsdatei unterstützt viele weitere Optionen. Lesen Sie man:dhcpd.conf[5], die mit dem Server installiert wird, für Details und Beispiele.
+
+Nachdem [.filename]#dhcpd.conf# konfiguriert ist, aktivieren Sie den DHCP-Server in [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+dhcpd_enable="YES"
+dhcpd_ifaces="dc0"
+....
+
+Dabei müssen Sie `dc0` durch die Gerätedatei (mehrere Gerätedateien müssen durch Leerzeichen getrennt werden) ersetzen, die der DHCP-Server auf Anfragen von DHCP-Clients hin überwachen soll.
+
+Starten Sie den Server mit folgenden Befehl:
+
+[source,bash]
+....
+# service isc-dhcpd start
+....
+
+Künftige Änderungen an der Konfiguration des Servers erfordern, dass der Dienst `dhcpd` gestoppt und anschließend mit man:service[8] gestartet wird.
+
+* [.filename]#/usr/local/sbin/dhcpd#
++
+Weitere Informationen zu dhcpd finden Sie in man:dhcpd[8].
+* [.filename]#/usr/local/etc/dhcpd.conf#
++
+Die Konfigurationsdatei des Servers muss alle Informationen enthalten, die an die Clients weitergegeben werden soll. Außerdem sind hier Informationen zur Konfiguration des Servers enthalten. Diese Konfigurationsdatei wird in man:dhcpd.conf[5] beschrieben.
+* [.filename]#/var/db/dhcpd.leases#
++
+Der DHCP-Server hat eine Datenbank, die alle vergebenen Leases enthält. Diese wird als Logdatei erzeugt. man:dhcpd.leases[5] enthält eine ausführliche Beschreibung.
+* [.filename]#/usr/local/sbin/dhcrelay#
++
+Dieser Daemon wird in komplexen Umgebungen verwendet, in denen ein DHCP-Server eine Anfrage eines Clients an einen DHCP-Server in einem separaten Netzwerk weiterleitet. Wenn Sie diese Funktion benötigen, müssen Sie package:net/isc-dhcp43-relay[] installieren. Weitere Informationen zu diesem Thema finden Sie in man:dhcrelay[8].
+
+[[network-dns]]
+== Domain Name System (DNS)
+
+DNS ist das für die Umwandlung von Rechnernamen in IP-Adressen zuständige Protokoll. Im Internet wird DNS durch ein komplexes System von autoritativen Root-Nameservern, Top Level Domain-Servern (TLD) sowie anderen kleineren Nameservern verwaltet, die individuelle Domaininformationen speichern und untereinander abgleichen. Für einfache DNS-Anfragen wird auf dem lokalen System kein Nameserver benötigt.
+
+Die folgende Tabelle beschreibt einige mit DNS verbundenen Begriffe:
+
+.DNS-Begriffe
+[cols="1,1", frame="none", options="header"]
+|===
+| Begriff
+| Bedeutung
+
+|Forward-DNS
+|Rechnernamen in IP-Adressen umwandeln.
+
+|Origin (Ursprung)
+|Die in einer bestimmten Zonendatei beschriebene Domäne.
+
+|Resolver
+|Ein Systemprozess, durch den ein Rechner Zoneninformationen von einem Nameserver anfordert.
+
+|Reverse-DNS
+|die Umwandlung von IP-Adressen in Rechnernamen
+
+|Root-Zone
+|Der Beginn der Internet-Zonenhierarchie. Alle Zonen befinden sich innerhalb der Root-Zone. Dies ist analog zu einem Dateisystem, in dem sich alle Dateien und Verzeichnisse innerhalb des Wurzelverzeichnisses befinden.
+
+|Zone
+|Eine individuelle Domäne, Unterdomäne, oder ein Teil von DNS, der von der gleichen Autorität verwaltet wird.
+|===
+
+Es folgen nun einige Zonenbeispiele:
+
+* Innerhalb der Dokumentation wird die Root-Zone in der Regel mit `.` bezeichnet.
+* `org.` ist eine Top level Domain (TLD) innerhalb der Root-Zone.
+* `example.org.` ist eine Zone innerhalb der `org.`-TLD.
+* `1.168.192.in-addr.arpa.` ist die Zone mit allen IP-Adressen des Bereichs `192.168.1.*`.
+
+Wie man an diesen Beispielen erkennen kann, befindet sich der spezifischere Teil eines Rechnernamens auf der linken Seite der Adresse. `example.org.` beschreibt einen Rechner also genauer als `org.`, während `org.` genauer als die Root-Zone ist. Jeder Teil des Rechnernamens hat Ähnlichkeiten mit einem Dateisystem, in dem etwa [.filename]#/dev# dem Wurzelverzeichnis untergeordnet ist.
+
+=== Gründe für die Verwendung eines Nameservers
+
+Es gibt zwei Arten von Nameservern: Autoritative Nameserver sowie zwischenspeichernde (cachende, auch bekannt als auflösende) Nameserver.
+
+Ein autoritativer Nameserver ist notwendig, wenn
+
+* Sie anderen verbindliche DNS-Auskünfte erteilen wollen.
+* eine Domain, beispielsweise `example.org`, registriert wird, und den zu dieser Domain gehörenden Rechnern IP-Adressen zugewiesen werden müssen.
+* ein IP-Adressblock reverse-DNS-Einträge benötigt, um IP-Adressen in Rechnernamen auflösen zu können.
+* ein Backup-Nameserver (auch Slaveserver genannt) oder ein zweiter Nameserver auf Anfragen antworten soll.
+
+Ein cachender Nameserver ist notwendig, weil
+
+* ein lokaler DNS-Server Daten zwischenspeichern und daher schneller auf Anfragen reagieren kann als ein entfernter Server.
+
+Wird nach `www.FreeBSD.org` gesucht, leitet der Resolver diese Anfrage an den Nameserver des ISPs weiter und nimmt danach das Ergebnis der Abfrage entgegen. Existiert ein lokaler, zwischenspeichernder DNS-Server, muss dieser die Anfrage nur einmal nach außen weitergeben. Für alle weiteren Anfragen ist dies nicht mehr nötig, da diese Information nun lokal gespeichert ist.
+
+=== DNS-Server Konfiguration
+
+Unbound ist im Basissystem von FreeBSD enthalten. In der Voreinstellung bietet es nur die DNS-Auflösung auf dem lokalen Rechner. Obwohl das im Basissystem enthaltene Unbound konfiguriert werden kann, um Namensauflösung über den lokalen Rechner hinweg bereitzustellen, ist es empfehlenswert für solche Anforderungen Unbound aus der FreeBSD Ports-Sammlung zu installieren.
+
+Um Unbound zu aktivieren, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+local_unbound_enable="YES"
+....
+
+Alle vorhandenen Nameserver aus [.filename]#/etc/resolv.conf# werden als Forwarder in der neuen Unbound-Konfiguration benutzt.
+
+[NOTE]
+====
+Wenn einer der aufgeführten Nameserver kein DNSSEC unterstützt, wird die lokale DNS-Auflösung nicht funktionieren. Testen Sie jeden Server und entfernen Sie die Server, die den Test nicht bestehen. Das folgende Beispiel zeigt einen Trust Tree beziehungsweise einen Fehler für den Nameserver auf `192.168.1.1`:
+====
+
+[source,bash]
+....
+# drill -S FreeBSD.org @192.168.1.1
+....
+
+Nachdem jeder Server für DNSSEC konfiguriert ist, starten Sie Unbound:
+
+[source,bash]
+....
+# service local_unbound onestart
+....
+
+Dieses Kommando sorgt für die Aktualisierung von [.filename]#/etc/resolv.conf#, so dass Abfragen für DNSSEC gesicherte Domains jetzt funktionieren. Führen Sie folgenden Befehl aus, um den DNSSECTrust Tree für FreeBSD.org zu überprüfen:
+
+[source,bash]
+....
+% drill -S FreeBSD.org
+;; Number of trusted keys: 1
+;; Chasing: freebsd.org. A
+
+DNSSEC Trust tree:
+freebsd.org. (A)
+|---freebsd.org. (DNSKEY keytag: 36786 alg: 8 flags: 256)
+ |---freebsd.org. (DNSKEY keytag: 32659 alg: 8 flags: 257)
+ |---freebsd.org. (DS keytag: 32659 digest type: 2)
+ |---org. (DNSKEY keytag: 49587 alg: 7 flags: 256)
+ |---org. (DNSKEY keytag: 9795 alg: 7 flags: 257)
+ |---org. (DNSKEY keytag: 21366 alg: 7 flags: 257)
+ |---org. (DS keytag: 21366 digest type: 1)
+ | |---. (DNSKEY keytag: 40926 alg: 8 flags: 256)
+ | |---. (DNSKEY keytag: 19036 alg: 8 flags: 257)
+ |---org. (DS keytag: 21366 digest type: 2)
+ |---. (DNSKEY keytag: 40926 alg: 8 flags: 256)
+ |---. (DNSKEY keytag: 19036 alg: 8 flags: 257)
+;; Chase successful
+....
+
+[[network-apache]]
+== Apache HTTP-Server
+
+Der Open Source Apache HTTP-Server ist der am weitesten verbreitete Webserver. Dieser Webserver ist nicht im Basissystem von FreeBSD enthalten, kann aber als Paket oder Port package:www/apache24[] installiert werden.
+
+Dieser Abschnitt beschreibt die Konfiguration der Version 2._x_ des Apache HTTP-Server. Weiterführende Informationen und Konfigurationsanweisungen für Apache 2.X finden Sie unter http://httpd.apache.org/[ httpd.apache.org].
+
+=== Apache konfigurieren und starten
+
+Der Apache HTTP-Server wird unter FreeBSD primär in [.filename]#/usr/local/etc/apache2x/httpd.conf# konfiguriert, wobei das _x_ die Versionsnummer darstellt. In dieser Textdatei leitet ein `#` einen Kommentar ein. Die am häufigsten verwendeten Optionen sind:
+
+`ServerRoot "/usr/local"`::
+Legt das Standardwurzelverzeichnis für die Apache-Installation fest. Binärdateien werden in die Verzeichnisse [.filename]#bin# und [.filename]#sbin# unterhalb des Serverwurzelverzeichnisses installiert, während sich Konfigurationsdateien im Unterverzeichnis [.filename]#etc/apache2x# befinden.
+
+`ServerAdmin you@example.com`::
+Die E-Mail-Adresse, an die Mitteilungen über Serverprobleme geschickt werden. Diese Adresse erscheint auf vom Server erzeugten Seiten, beispielsweise auf Fehlerseiten.
+
+`ServerName www.example.com:80`::
+Erlaubt dem Administrator, einen Rechnernamen festzulegen, den der Server an die Clients sendet. Beispielsweise könnte `www` statt des richtigen Rechnernamens verwendet werden. Wenn das System keinen eingetragenen DNS-Namen hat, kann stattdessen die IP-Adresse eingetragen werden. Lauscht der Server auf einem anderen Port, tauschen Sie die `80` gegen eine entsprechende Portnummer.
+
+`DocumentRoot "/usr/local/www/apache2__x__/data"`::
+Das Verzeichnis, in dem die Dokumente abgelegt sind. In der Voreinstellung befinden sich alle Seiten in diesem Verzeichnis, durch symbolische Links oder Aliase lassen sich aber auch andere Orte festlegen.
+
+Es ist empfehlenswert, eine Sicherungskopie der Apache-Konfigurationsdatei anzulegen, bevor Änderungen durchgeführt werden. Wenn die Konfiguration von Apache abgeschlossen ist, speichern Sie die Datei und überprüfen Sie die Konfiguration mit `apachectl`. Der Befehl `apachectl configtest` sollte `Syntax OK` zurückgeben.
+
+Um den Apache beim Systemstart zu starten, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+apache24_enable="YES"
+....
+
+Wenn Sie während des Systemstarts weitere Parameter an den Apache übergeben wollen, können Sie diese durch eine zusätzliche Zeile in [.filename]#rc.conf# angeben:
+
+[.programlisting]
+....
+apache24_flags=""
+....
+
+Wenn apachectl keine Konfigurationsfehler meldet, starten Sie `httpd`:
+
+[source,bash]
+....
+# service apache24 start
+....
+
+Sie können den `httpd`-Dienst testen, indem Sie `http://_localhost_` in einen Browser eingeben, wobei Sie _localhost_ durch den vollqualifizierten Domainnamen der Maschine ersetzen, auf dem der `httpd` läuft. Die Standard Webseite, die angezeigt wird, ist [.filename]#/usr/local/www/apache24/data/index.html#.
+
+Die Konfiguration von Apache kann bei nachfolgenden Änderungen an der Konfigurationsdatei bei laufendem `httpd`, auf Fehler überprüft werden. Geben Sie dazu folgendes Kommando ein:
+
+[source,bash]
+....
+# service apache24 configtest
+....
+
+[NOTE]
+====
+Es ist wichitg zu beachten, dass `configtest` kein man:rc[8]-Standard ist, und somit nicht zwingend mit anderen man:rc[8]-Startskripten funktioniert.
+====
+
+=== Virtual Hosting
+
+Virtual Hosting ermöglicht es, mehrere Webseiten auf einem Apache-Server laufen zu lassen. Die virtuellen Hosts können _IP-basiert_ oder _namensbasiert_ sein. IP-basiertes virtual Hosting verwendet eine IP-Adresse für jede Webseite. Beim namensbasierten virtual Hosting wird der HTTP/1.1-Header der Clients dazu verwendet, den Rechnernamen zu bestimmen. Dadurch wird es möglich, mehrere Domains unter der gleichen IP-Adresse zu betreiben.
+
+Damit der Apache namenbasierte virtuelle Domains verwalten kann, fügen Sie für jede Webseite einen separaten `VirtualHost`-Block ein. Wenn der Webserver beispielsweise `www.domain.tld` heißt und die virtuelle Domain `www.someotherdomain.tld` einrichtet werden soll, ergänzen Sie [.filename]#httpd.conf# um folgende Einträge:
+
+[.programlisting]
+....
+<VirtualHost *>
+ ServerName www.domain.tld
+ DocumentRoot /www/domain.tld
+</VirtualHost>
+
+<VirtualHost *>
+ ServerName www.someotherdomain.tld
+ DocumentRoot /www/someotherdomain.tld
+</VirtualHost>
+....
+
+Setzen Sie für jeden virtuellen Host die entsprechenden Werte für `ServerName` und `DocumentRoot`.
+
+Ausführliche Informationen zum Einrichten von virtuellen Hosts finden Sie in der offiziellen Apache-Dokumentation unter http://httpd.apache.org/docs/vhosts/[ http://httpd.apache.org/docs/vhosts/].
+
+=== Häufig verwendete Apache-Module
+
+Apache verwendet Module, die den Server um zusätzliche Funktionen erweitern. Eine vollständige Auflistung der zur Verfügung stehenden Module und Konfigurationsdetails finden Sie unter http://httpd.apache.org/docs/current/mod/[ http://httpd.apache.org/docs/current/mod/].
+
+In FreeBSD können einige Module mit dem Port package:www/apache24[] kompiliert werden. Geben Sie in [.filename]#/usr/ports/www/apache24#`make config` ein, um zu sehen, welche Module zur Verfügung stehen und welche Module in der Voreinstellung aktiviert sind. Wenn ein Modul nicht zusammen mit dem Port kompiliert wird, bietet die Ports-Sammlung die Möglichkeit viele Module zu installieren. Dieser Abschnitt beschreibt drei der am häufigsten verwendeten Module.
+
+==== SSL-Unterstützung
+
+Zu einem bestimmten Zeitpunkt erforderte die Unterstützung von SSL innerhalb von Apache ein separates Modul namens [.filename]#mod_ssl#. Dies ist nicht mehr der Fall und die Installation des Apache-Webservers wird im Standard mit SSL-Unterstützung ausgeliefert. Ein Beispiel, wie Sie SSL-Unterstützung für einen Webserver aktivieren können, finden Sie in der Datei [.filename]#httpd-ssl.conf# im Verzeichnis [.filename]#/usr/local/etc/apache24/extra#. In diesem Verzeichnis befindet sich auch eine Beispieldatei namens [.filename]#ssl.conf-sample#. Es wird empfohlen, beide Dateien zu überprüfen, um sichere Webseiten auf dem Apache-Webserver einzurichten.
+
+Nachdem die Konfiguration von SSL abgeschlossen ist, muss die folgende Zeile in [.filename]#httpd.conf# auskommentiert werden, um die Änderungen beim nächsten Neustart oder erneuten Laden der Konfiguration zu aktivieren:
+
+[.programlisting]
+....
+#Include etc/apache24/extra/httpd-ssl.conf
+....
+
+[WARNING]
+====
+SSL in Version 2 und 3 haben bekannte Schwachstellen. Es wird dringend empfohlen, TLS Version 1.2 und 1.3 anstelle der älteren SSL-Optionen zu aktivieren. Dies kann durch die Einstellung der folgenden Optionen in [.filename]#ssl.conf# erreicht werden:
+====
+
+[.programlisting]
+....
+SSLProtocol all -SSLv3 -SSLv2 +TLSv1.2 +TLSv1.3
+SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
+....
+
+Um die Konfiguration von SSL im Webserver abzuschließen, entfernen Sie den Kommentar in der folgenden Zeile, um sicherzustellen, dass die Konfiguration bei einem Neustart oder beim erneuten laden der Konfiguration von Apache übernommen wird:
+
+[.programlisting]
+....
+# Secure (SSL/TLS) connections
+Include etc/apache24/extra/httpd-ssl.conf
+....
+
+Diese Zeilen müssen in [.filename]#httpd.conf# ebenfalls auskommentiert bleiben, um SSL in Apache vollständig zu unterstützen:
+
+[.programlisting]
+....
+LoadModule authn_socache_module libexec/apache24/mod_authn_socache.so
+LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
+LoadModule ssl_module libexec/apache24/mod_ssl.so
+....
+
+Der nächste Schritt ist die Kooperation mit einer Zertifizierungsstelle, um die entsprechenden Zertifikate auf dem System installieren zu lassen. Dadurch wird eine Vertrauenskette für die Webseite etabliert und jegliche Warnungen vor selbstsignierten Zertifikaten verhindert.
+
+==== [.filename]#mod_perl#
+
+Das Modul [.filename]#mod_perl# macht es möglich, vollständig in Perl geschriebene Apache-Module zu erzeugen. Da der Perl-Interpreter in den Server eingebettet wird, muss weder ein externer Interpreter noch Perl zusätzlich aufgerufen werden.
+
+[.filename]#mod_perl# wird über den Port oder das Paket package:www/mod_perl2[] installiert. Dokumentation für dieses Modul finden Sie unter http://perl.apache.org/docs/2.0/index.html[ http://perl.apache.org/docs/2.0/index.html].
+
+==== [.filename]#mod_php#
+
+_PHP: Hypertext Preprocessor_ (PHP) ist eine vielseitig verwendbare Skriptsprache, die besonders für die Web-Entwicklung geeignet ist. PHP kann in HTML eingebettet werden und ähnelt von der Syntax her Sprachen wie C, Java(TM) und Perl. Das Hauptanliegen von PHP ist es, Web-Entwicklern die rasche Erstellung von dynamisch erzeugten Internetseiten zu ermöglichen.
+
+PHP und weitere in PHP geschriebene Funktionen unterstützt, muss das entsprechende Paket installiert werden.
+
+Sie können mit `pkg` die Paketdatenbank nach allen unterstützten PHP-Versionen durchsuchen:
+
+[source,bash]
+....
+# pkg search php
+....
+
+Die Ausgabe ist eine Liste mit Versionen und Funktionen des jeweiligen Pakets. Die Komponenten sind vollständig modular, d.h. die Funktionen werden durch die Installation des entsprechenden Pakets aktiviert. Geben Sie folgenden Befehl ein, um PHP-Version 7.4 für Apache zu installieren:
+
+[source,bash]
+....
+# pkg install mod_php74
+....
+
+Falls irgendwelche Pakete Abhängigkeiten besitzen, werden diese zusätzlichen Pakete ebenfalls installiert.
+
+Standardmäßig ist PHP nicht aktiviert. Die folgenden Zeilen müssen in der Apache-Konfigurationsdatei unterhalb von [.filename]#/usr/local/etc/apache24# hinzugefügt werden, um PHP zu aktivieren:
+
+[.programlisting]
+....
+<FilesMatch "\.php$">
+ SetHandler application/x-httpd-php
+</FilesMatch>
+<FilesMatch "\.phps$">
+ SetHandler application/x-httpd-php-source
+</FilesMatch>
+....
+
+Zusätzlich muss auch der `DirectoryIndex` in der Konfigurationsdatei aktualisiert werden und Apache muss entweder neu gestartet, oder die Konfiguration neu geladen werden, damit die Änderungen wirksam werden.
+
+Mit `pkg` kann die Unterstützung für viele weitere PHP-Funktionen installiert werden. Um beispielsweise die Unterstützung für XML oder SSL zu erhalten, installieren Sie die entsprechenden Pakete:
+
+[source,bash]
+....
+# pkg install php74-xml php74-openssl
+....
+
+Wie zuvor muss die Konfiguration von Apache neu geladen werden, damit die Änderungen wirksam werden. Dies gilt auch für Fälle, in denen lediglich ein Modul installiert wurde.
+
+Geben Sie folgenden Befehl ein, um einen geordneten Neustart durchzuführen und die Konfiguration neu zu laden:
+
+[source,bash]
+....
+# apachectl graceful
+....
+
+Sobald die Installation abgeschlossen ist, gibt es zwei Möglichkeiten, um eine Liste der installierten PHP-Module und Informationen über die Umgebung der Installation zu erhalten. Die erste Möglichkeit besteht darin, die vollständige PHP-Binärdatei zu installieren und den Befehl auszuführen, um die Informationen zu erhalten:
+
+[source,bash]
+....
+# pkg install php74
+....
+
+[source,bash]
+....
+# php -i | less
+....
+
+Da die Ausgabe des Befehls sehr umfangreich ist, ist die Weiterleitung an einen Pager, wie beispielsweise `more` oder `less`, sinnvoll.
+
+Um Änderungen an der globalen Konfiguration von PHP vorzunehmen, gibt es schließlich eine gut dokumentierte Datei, die in [.filename]#/usr/local/etc/php.ini# installiert ist. Zum Zeitpunkt der Installation wird diese Datei nicht existieren, da zwei Versionen zur Auswahl stehen. Eine [.filename]#php.ini-development# und eine [.filename]#php.ini-production#. Diese Dateien sind Ansatzpunkte, die Administratoren bei der Implementierung unterstützen sollen.
+
+=== Dynamische Webseiten
+
+Neben mod_perl und mod_php stehen noch weitere Sprachen zur Erstellung von dynamischen Inhalten zur Verfügung. Dazu gehören auch Django und Ruby on Rails.
+
+==== Django
+
+Bei Django handelt es sich um ein unter der BSD-Lizenz verfügbares Framework zur schnellen Erstellung von mächtigen Internet-Applikationen. Es beinhaltet einen objekt-relationalen Mapper (wodurch Datentypen als Phyton-Objekte entwickelt werden können) sowie eine API für den dynamischen Datenbankzugriff auf diese Objekte, ohne dass Entwickler jemals SQL-Code schreiben müssen. Zusätzlich existiert ein umfangreiches Template-System, wodurch die Programmlogik von der HTML-Präsentation getrennt werden kann.
+
+Django setzt das Modul mod_python und eine SQL-Datenbank voraus. In FreeBSD wird bei der Installation von package:www/py-django[] automatisch [.filename]#mod_python# installiert. Als Datenbanken werden PostgreSQL, MySQL und SQLite unterstützt, wobei SQLite die Voreinstellung ist. Wenn Sie die Datenbank ändern möchten, geben Sie in [.filename]#/usr/ports/www/py-django#`make config` ein und installieren Sie den Port neu.
+
+Nachdem Django installiert ist, benötigt die Anwendung ein Projektverzeichnis und die Apache-Konfiguration, um den eingebetteten Python-Interpreter zu nutzen. Dieser Interpreter wird verwendet um die Anwendung für spezifische URLs der Seite aufrufen.
+
+Damit Apache Anfragen für bestimmte URLs an die Web-Applikation übergeben kann, müssen Sie den vollständigen Pfad zum Projektverzeichnis in [.filename]#httpd.conf# festlegen:
+
+[source,bash]
+....
+<Location "/">
+ SetHandler python-program
+ PythonPath "['/pfad/zu/den/django/paketen/'] + sys.path"
+ PythonHandler django.core.handlers.modpython
+ SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+ PythonAutoReload On
+ PythonDebug On
+</Location>
+....
+
+Weitere Informationen zur Verwendung von Django finden Sie unter https://docs.djangoproject.com/en/1.6/[ https://docs.djangoproject.com/en/1.6/].
+
+==== Ruby on Rails
+
+Ruby on Rails ist ein weiteres, als Open Source verfügbares Webframework. Es bietet einen kompletten Entwicklungsstack und erlaubt es Webentwicklern, umfangreiche und mächtige Applikationen in kurzer Zeit zu programmieren. Unter FreeBSD kann das Framework über den Port oder das Paket package:www/rubygem-rails[] installiert werden.
+
+Weitere Informationen zur Verwendung von Ruby on Rails finden Sie unter http://rubyonrails.org/documentation[ http://rubyonrails.org/documentation].
+
+[[network-ftp]]
+== File Transfer Protocol (FTP)
+
+Das File Transfer Protocol (FTP) ermöglicht auf einfache Art und Weise den Dateiaustausch mit einem FTP-Server. Der FTP-Server ftpd ist bei FreeBSD bereits im Basisystem enthalten.
+
+FreeBSD verwendet mehrere Konfigurationsdateien, um den Zugriff auf den FTP zu kontrollieren. Dieser Abschnitt fasst diese Dateien zusammen. In man:ftpd[8] finden Sie weitere Inforamtionen über den integrierten FTP-Server.
+
+=== Konfiguration
+
+Der wichtigste Punkt ist hier die Entscheidung darüber, welche Benutzer auf den FTP-Server zugreifen dürfen. Ein FreeBSD-System verfügt über diverse Systembenutzerkonten, die jedoch nicht auf den FTP-Server zugreifen sollen. Die Datei [.filename]#/etc/ftpusers# enthält alle Benutzer, die vom FTP-Zugriff ausgeschlossen sind. In der Voreinstellung gilt dies auch die gerade erwähnten Systembenutzerkonten. Sie können über diese Datei weitere Benutzer vom FTP-Zugriff ausschließen.
+
+In einigen Fällen kann es wünschenswert sein, den Zugang für manche Benutzer einzuschränken, ohne dabei FTP komplett zu verbieten. Dazu passen Sie [.filename]#/etc/ftpchroot#, wie in man:ftpchroot[5] beschrieben, entsprechend an. Diese Datei enthält Benutzer und Gruppen sowie die für sie geltenden Einschränkungen für FTP.
+
+Um anonymen FTP-Zugriff auf dem Server zu aktivieren, muss ein Benutzer `ftp` auf dem FreeBSD-System angelegt werden. Danach können sich Benutzer mit dem Benutzernamen `ftp` oder `anonymous` am FTP-Server anmelden. Das Passwort ist dabei beliebig, allerdings wird dazu in der Regel eine E-Mail-Adresse verwendet. Meldet sich ein anonymer Benutzer an, aktiviert der FTP-Server man:chroot[2], um den Zugriff auf das Heimatverzeichnis des Benutzers `ftp` zu beschränken.
+
+Es gibt zwei Textdateien, deren Inhalt den FTP-Clients bei der Anmeldung angezeigt wird. Der Inhalt von [.filename]#/etc/ftpwelcome# wird angezeigt, bevor der Login-Prompt erscheint. Nach einer erfolgreichen Anmeldung wird der Inhalt von [.filename]#/etc/ftpmotd# angezeigt. Beachten Sie aber, dass es dabei um einen Pfad relativ zur Umgebung des anzumeldenden Benutzers handelt. Bei einer anonymen Anmeldung würde also der Inhalt von [.filename]#~ftp/etc/ftpmotd# angezeigt.
+
+Sobald der FTP-Server konfiguriert ist, setzen Sie die entsprechende Variable in [.filename]#/etc/rc.conf#, damit der Dienst beim Booten gestartet wird:
+
+[.programlisting]
+....
+ftpd_enable="YES"
+....
+
+Starten Sie den Dienst:
+
+[source,bash]
+....
+# service ftpd start
+....
+
+Testen Sie die Verbindung zum FTP-Server, indem Sie folgendes eingeben:
+
+[source,bash]
+....
+% ftp localhost
+....
+
+=== Wartung
+
+Der ftpd-Daemon verwendet man:syslog[3], um Protokolldateien zu erstellen. In der Voreinstellung werden alle FTP betreffenden Nachrichten nach [.filename]#/var/log/xferlog# geschrieben. Dies lässt sich aber durch das Einfügen der folgenden Zeile in [.filename]#/etc/syslog.conf# ändern:
+
+[.programlisting]
+....
+ftp.info /var/log/xferlog
+....
+
+[NOTE]
+====
+Beachten Sie, dass mit dem Betrieb eines anonymen FTP-Servers verschiedene Sicherheitsrisiken verbunden sind. Problematisch ist hier vor allem die Erlaubnis zum anonymen Upload von Dateien. Dadurch könnte der Server zur Verbreitung von illegaler oder nicht lizensierter Software oder noch Schlimmeren missbraucht werden. Wenn anonyme FTP-Uploads dennoch erforderlich sind, sollten Sie die Zugriffsrechte so setzen, dass solche Dateien erst nach Zustimmung eines Administrators von anderen Benutzern heruntergeladen werden können.
+====
+
+[[network-samba]]
+== Datei- und Druckserver für Microsoft(R) Windows(R)-Clients (Samba)
+
+Samba ist ein beliebtes Open Source Softwarepaket, das Datei- und Druckdienste über das SMB/CIFS-Protokoll zur Verfügung stellt. Dieses Protokoll ist in Microsoft(R) Windows(R)-Systemen enthalten und kann über die Installation der Samba-Client-Bibliotheken in andere Betriebssysteme integriert werden. Das Protokoll ermöglicht es Clients auf freigegebene Daten und Drucker zuzugreifen, so als ob es sich um lokale Drucker und Festplatten handeln würde.
+
+Unter FreeBSD können die Samba-Client-Bibliotheken über den Port oder das Paket package:net/samba410[] installiert werden. Der Client ermöglicht es einem FreeBSD-System auf SMB/CIFS-Freigaben in einem Microsoft(R) Windows(R)-Netzwerk zuzugreifen.
+
+Ein FreeBSD-System kann auch als Samba-Server agieren, wenn Sie den Port oder das Paket package:net/samba410[] installieren. Dies erlaubt es dem Administrator SMB/CIFS-Freigaben auf dem FreeBSD-System einzurichten, auf welche dann Clients mit Microsoft(R) Windows(R) oder den Samba-Client-Bibliotheken zugreifen können.
+
+=== Konfiguration des Servers
+
+Samba wird in [.filename]#/usr/local/etc/smb4.conf# konfiguriert. Diese Datei muss erstellt werden, bevor Samba benutzt werden kann.
+
+Eine einfache [.filename]#smb4.conf#, wie hier gezeigt, stellt den Zugriff auf Verzeichnisse und Drucker für Windows(R)-Clients in einer Arbeitsgruppe (engl. Workgroup) zur Verfügung. In aufwendigeren Installationen, in denen LDAP oder Active Directory zum Einsatz kommt, ist es einfacher die [.filename]#smb4.conf# mit dem Werkzeug man:samba-tool[8] zu erstellen.
+
+[.programlisting]
+....
+[global]
+workgroup = WORKGROUP
+server string = Samba Server Version %v
+netbios name = ExampleMachine
+wins support = Yes
+security = user
+passdb backend = tdbsam
+
+# Example: share /usr/src accessible only to 'developer' user
+[src]
+path = /usr/src
+valid users = developer
+writable = yes
+browsable = yes
+read only = no
+guest ok = no
+public = no
+create mask = 0666
+directory mask = 0755
+....
+
+==== Globale Einstellungen
+
+Einstellungen für das Netzwerk werden in [.filename]#/usr/local/etc/smb4.conf# definiert:
+
+`workgroup`::
+Der Name der Arbeitsgruppe.
+
+`netbios name`::
+Der NetBIOS-Namen fest, unter dem der Samba-Server bekannt ist. In der Regel handelt es sich dabei um den ersten Teil des DNS-Namens des Servers.
+
+`server string`::
+Legt die Beschreibung fest, die angezeigt wird, wenn mit `net view` oder anderen Netzwerkprogrammen Informationen über den Server angefordert werden.
+
+`wins support`::
+Legt fest, ob Samba als WINS-Server fungieren soll. Aktivieren Sie die Unterstützung für WINS auf maximal einem Server im Netzwerk.
+
+==== Samba absichern
+
+Die wichtigsten Einstellungen in [.filename]#/usr/local/etc/smb4.conf# betreffen das zu verwendende Sicherheitsmodell sowie das Backend-Passwortformat. Die folgenden Direktiven steuern diese Optionen:
+
+`security`::
+Die häufigsten Optionen sind `security = share` und `security = user`. Wenn die Clients Benutzernamen verwenden, die den Benutzernamen auf dem FreeBSD-Rechner entsprechen, dann sollte die Einstellung `user level` verwendet werden. Dies ist die Standardeinstellung. Allerdings ist es dazu erforderlich, dass sich die Clients auf dem Rechner anmelden, bevor sie auf gemeinsame Ressourcen zugreifen können.
++
+In der Einstellung `share level` müssen sich Clients nicht unter Verwendung eines gültigen Logins auf dem Rechner anmelden, bevor sie auf gemeinsame Ressourcen zugreifen können. In früheren Samba-Versionen war dies die Standardeinstellung.
+
+`passdb backend`::
+Samba erlaubt verschiedene Backend-Authentifizierungsmodelle. Clients können sich durch LDAP, NIS+, eine SQL-Datenbank oder eine Passwortdatei authentifizieren. Die empfohlene Authentifizierungsmethode, `tdbsam`, ist ideal für einfache Netzwerke und wird hier vorgestellt. Für größere oder komplexere Netzwerke wird `ldapsam` empfohlen. `smbpasswd` war der frühere Standard und gilt mittlerweile als veraltet.
+
+==== Samba Benutzer
+
+Damit Windows(R)-Clients auf die Freigaben zugreifen können, müssen die FreeBSD-Benutzerkonten in der `SambaSAMAccount`-Datenbank zugeordnet werden. Für bereits vorhandene Benutzerkonten kann dazu man:pdbedit[8] benutzt werden:
+
+[source,bash]
+....
+# pdbedit -a username
+....
+
+Dieser Abschnitt beschreibt lediglich die am häufigsten verwendeten Einstellungen. Ausführliche Informationen zur Konfiguration von Samba finden Sie im http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/[ Official Samba HOWTO].
+
+=== Samba starten
+
+Damit Samba beim Systemstart automatisch aktiviert wird, fügen Sie die folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+samba_server_enable="YES"
+....
+
+Jetzt kann Samba direkt gestartet werden:
+
+[source,bash]
+....
+# service samba_server start
+Performing sanity check on Samba configuration: OK
+Starting nmbd.
+Starting smbd.
+....
+
+Samba verwendet drei Daemonen. Sowohl nmbd als auch smbd werden durch `samba_enable` gestartet. Wenn eine Namensauflösung über winbind benötigt wird, setzen Sie zusätzlich:
+
+[.programlisting]
+....
+winbindd_enable="YES"
+....
+
+Samba kann jederzeit durch folgenden Befehl beendet werden:
+
+[source,bash]
+....
+# service samba_server stop
+....
+
+Samba ist ein komplexes Softwarepaket mit umfassenden Funktionen, die eine weitreichende Integration von Microsoft(R) Windows(R)-Netzwerken ermöglichen. Für eine Beschreibung dieser Zusatzfunktionen sollten Sie sich auf http://www.samba.org[http://www.samba.org] umsehen.
+
+[[network-ntp]]
+== Die Uhrzeit mit NTP synchronisieren
+
+Die interne Uhrzeit eines Computers ist nie ganz exakt. Dies ist problematisch, da viele Dienste darauf angewiesen sind, dass die Computer im Netzwerk die exakte Uhrzeit übermitteln. Die exakte Uhrzeit ist auch erforderlich um sicherzustellen, dass die Zeitstempel der Dateien konsistent bleiben. Das Network Time Protocol (NTP) bietet die Möglichkeit, die exakte Uhrzeit in einem Netzwerk zur Verfügung zu stellen.
+
+FreeBSD enthält man:ntpd[8], das andere NTP-Server abfragen kann um die Uhrzeit auf diesem Computer zu synchronisieren, oder um selbst die Uhrzeit für andere Computer im Netzwerk bereitzustellen.
+
+Dieser Abschnitt beschreibt die Konfiguration von ntpd unter FreeBSD. Zusätzliche Dokumentation im HTML-Format finden Sie in [.filename]#/usr/shared/doc/ntp/#.
+
+=== NTP konfigurieren
+
+FreeBSD enthält mit ntpd ein Werkzeug, das zur Synchronisation der Uhrzeit verwendet werden kann. Die Konfiguration von Ntpd erfolgt über Variablen in man:rc.conf[5] und [.filename]#/etc/ntp.conf#, und wird in den folgenden Abschnitten beschrieben.
+
+Ntpd kommuniziert über UDP mit mit seinen Peers. Sämtliche Firewalls zwischen Ihrem Rechner und seinen NTP-Peers müssen so konfiguriert sein, dass UDP-Pakete auf Port 123 ein- und ausgehen können.
+
+==== [.filename]#/etc/ntp.conf#
+
+Ntpd liest [.filename]#/etc/ntp.conf# um herauszufinden, welche NTP-Server abgefragt werden sollen. Die Auswahl mehrerer NTP-Server wird empfohlen, falls einer der Server nicht erreichbar ist oder sich seine Uhr als unzuverlässig erweist. Wenn ntpd Antworten erhält, bevorzugt es zuverlässige Server gegenüber weniger zuverlässigen. Die abgefragten Server können lokal im Netzwerk, von einem ISP bereitgestellt oder aus einer http://support.ntp.org/bin/view/Servers/WebHome[Liste öffentlich zugänglicher NTP-Server] ausgewählt werden. Wenn Sie einen öffentlichen NTP-Server auswählen, wählen Sie einen geografisch nahen NTP-Server und überprüfen Sie dessen Nutzungsrichtlinien. Das Schlüsselwort `pool` wählt einen oder mehrere Server aus einem Pool von Servern aus. Eine http://support.ntp.org/bin/view/Servers/NTPPoolServers[ Liste mit öffentlich zugänglichen NTP-Pools] ist ebenfalls verfügbar, sortiert nach geografischen Gebieten. Darüber hinaus bietet FreeBSD einen vom Projekt gespendeten Pool, `0.freebsd.pool.ntp.org`.
+
+.Beispiel für [.filename]#/etc/ntp.conf#
+[example]
+====
+Dies ist ein einfaches Beispiel für eine [.filename]#ntp.conf#-Datei. Die Einträge können so übernommen werden, wie sie sind. Die Datei enthält die notwendigen Einschränkungen für den Betrieb an einer öffentlich zugänglichen Netzwerkverbindung.
+
+[.programlisting]
+....
+# Disallow ntpq control/query access. Allow peers to be added only
+# based on pool and server statements in this file.
+restrict default limited kod nomodify notrap noquery nopeer
+restrict source limited kod nomodify notrap noquery
+
+# Allow unrestricted access from localhost for queries and control.
+restrict 127.0.0.1
+restrict ::1
+
+# Add a specific server.
+server ntplocal.example.com iburst
+
+# Add FreeBSD pool servers until 3-6 good servers are available.
+tos minclock 3 maxclock 6
+pool 0.freebsd.pool.ntp.org iburst
+
+# Use a local leap-seconds file.
+leapfile "/var/db/ntpd.leap-seconds.list"
+....
+
+====
+
+Das Format dieser Datei ist in man:ntp.conf[5] beschrieben. Die folgenden Erläuterungen geben einen Überblick über die Schlüsselwörter, die in dem obigen Beispiel benutzt werden.
+
+In der Voreinstellung ist ein NTP-Server für jeden Host im Netzwerk zugänglich. Das Schlüsselwort `restrict` steuert, welche Systeme auf den Server zugreifen dürfen. Es werden mehrere `restrict`-Einträge unterstützt, die jeweils die vorherigen Anweisungen verfeinern. Die im Beispiel gezeigten Werte gewährem dem lokalen System vollen Abfrage- und Kontrollzugriff, während entfernte Systemen nur die Möglichkeit gegeben wird, die Zeit abzufragen. Weitere Details finden Sie im Abschnitt `Access Control Support` von man:ntp.conf[5].
+
+Das Schlüsselwort `server` gibt einen einzelnen Server zur Abfrage der Zeit an. Die Datei kann das Schlüsselwort `server` mehrmals enthalten, wobei pro Zeile jeweils ein Server aufgeführt ist. Das Schlüsselwort `pool` gibt einen Pool von Servern an. Ntpd fügt bei Bedarf einen oder mehrere Server aus diesem Pool hinzu, um die Anzahl der mit dem Wert `tos minclock` Peers zu erreichen. Das Schlüsselwort `iburst` weist ntpd an, einen Burst von acht schnellen Paketen mit dem Server auszutauschen, wenn der Kontakt zum ersten Mal hergestellt wird, um so die Systemzeit schneller zu synchronisieren.
+
+Das Schlüsselwort `leapfile` gibt den Pfad einer Datei an, die Informationen über Schaltsekunden enthält. Die Datei wird automatisch durch man:periodic[8] aktualisiert. Der angegebene Pfad muss mit dem in der Variable `ntp_db_leapfile` aus [.filename]#/etc/rc.conf# übereinstimmen.
+
+==== NTP-Einträge in [.filename]#/etc/rc.conf#
+
+Um ntpd beim Booten zu starten, Sie in [.filename]#/etc/rc.conf# den Eintrag `ntpd_enable="YES"` hinzu. Danach kann ntpd direkt gestartet werden:
+
+[source,bash]
+....
+# service ntpd start
+....
+
+Lediglich `ntpd_enable` wird benötigt um ntpd benutzen zu können. Die unten aufgeführten [.filename]#rc.conf#-Variablen können bei Bedarf ebenfalls verwendet werden.
+
+Ist `ntpd_sync_on_start="YES"` konfiguriert, setzt ntpd die Uhrzeit beim Systemstart, unabhängig davon wie hoch die Abweichung ist. Normalerweise protokolliert ntpd eine Fehlermeldung und beendet sich selbst, wenn die Uhr um mehr als 1000 Sekunden abweicht. Diese Option ist besonders auf Systemem ohne batteriegepufferte Echtzeituhr nützlich.
+
+Setzen Sie `ntpd_oomprotect="YES"`, um ntpd-Daemon davor zu schützen, vom System beendet zu werden, das versucht, sich von einer Out of Memory (OOM) Situation zu retten.
+
+Mit `ntpd_config=` setzen Sie den Pfad auf eine alternative [.filename]#ntp.conf#-Datei.
+
+In `ntpd_flags=` können bei Bedarf weitere Werte enthalten sein. Vermeiden Sie jedoch die Werte, die intern von [.filename]#/etc/rc.d/ntpd# verwaltet werden:
+
+* `-p` (Pfad zur PID-Datei)
+* `-c` (Setzen Sie stattdessen `ntpd_config=`)
+
+==== Ntpd und der nicht privilegierte `ntpd`-Benutzer
+
+In FreeBSD kann Ntpd als nicht privilegierter Benutzer gestartet und ausgeführt werden. Dies erfordert das Modul man:mac_ntpd[4]. Das Startskript [.filename]#/etc/rc.d/ntpd# untersucht zunächst die NTP Konfiguration. Wenn möglich, lädt es das `mac_ntpd`-Modul und startet dann ntpd als nicht privilegierten Benutzer `ntpd` (Benutzer-ID 123). Um Probleme mit dem Datei- und Verzeichniszugriff zu vermeiden, wird das Startskript ntpd nicht automatisch als Benutzer `ntpd` starten, falls die Konfiguration irgendwelche Datei-bezogenen Optionen enthält.
+
+Falls einer der folgenden Werte in `ntpd_flags` vorhanden ist, muss eine manuelle Konfiguration vorgenommen werden, damit der Daemon vom `ntpd`-Benutzer ausgeführt werden kann:
+
+* -f oder --driftfile
+* -i oder --jaildir
+* -k oder --keyfile
+* -l oder --logfile
+* -s oder --statsdir
+
+Wenn einer der folgenden Schlüsselwörter in [.filename]#ntp.conf# vorhanden ist, muss eine manuelle Konfiguration vorgenommen werden, damit der Daemon vom `ntpd`-Benutzer ausgeführt werden kann:
+
+* crypto
+* driftfile
+* key
+* logdir
+* statsdir
+
+Um ntpd so zu konfigurieren, dass der Daemon als Benutzer `ntpd` läuft, müssen folgende Voraussetzungen erfüllt sein:
+
+* Stellen Sie sicher, dass der `ntpd`-Benutzer Zugriff auf alle in der Konfiguration angegebenen Dateien und Verzeichnisse hat.
+* Stellen Sie sicher, dass das Modul `mac_ntpd` in den Kernel geladen oder kompiliert wird. man:mac_ntpd[4] enthält weitere Details.
+* Setzen Sie `ntpd_user="ntpd"` in [.filename]#/etc/rc.conf#.
+
+=== NTP mit einer PPP-Verbindung verwenden
+
+ntpd benötigt keine ständige Internetverbindung. Wenn Sie sich über eine PPP-Verbindung ins Internet einwählen, sollten Sie verhindern, dass NTP-Verkehr eine Verbindung aufbauen oder aufrechterhalten kann. Dies kann in den `filter`-Direktiven von [.filename]#/etc/ppp/ppp.conf# festgelegt werden. Ein Beispiel:
+
+[.programlisting]
+....
+set filter dial 0 deny udp src eq 123
+# Prevent NTP traffic from initiating dial out
+set filter dial 1 permit 0 0
+set filter alive 0 deny udp src eq 123
+# Prevent incoming NTP traffic from keeping the connection open
+set filter alive 1 deny udp dst eq 123
+# Prevent outgoing NTP traffic from keeping the connection open
+set filter alive 2 permit 0/0 0/0
+....
+
+Weitere Informationen finden Sie im Abschnitt `PACKET FILTERING` von man:ppp[8] sowie in den Beispielen unter [.filename]#/usr/shared/examples/ppp/#.
+
+[NOTE]
+====
+Einige Internetprovider blockieren Ports mit niedrigen Nummern. In solchen Fällen funktioniert NTP leider nicht, da Antworten eines NTP-Servers den Rechner nicht erreichen werden.
+====
+
+[[network-iscsi]]
+== iSCSI Initiator und Target Konfiguration
+
+iSCSI bietet die Möglichkeit, Speicherkapazitäten über ein Netzwerk zu teilen. Im Gegensatz zu NFS, das auf Dateisystemebene arbeitet, funktioniert iSCSI auf Blockgerätebene.
+
+In der iSCSI-Terminologie wird das System, das den Speicherplatz zur Verfügung stellt, als _Target_ bezeichnet. Der Speicherplatz selbst kann aus einer physischen Festplatte bestehen, oder auch aus einem Bereich, der mehrere Festplatten, oder nur Teile einer Festplatte, repräsentiert. Wenn beispielsweise die Festplatte(n) mit ZFS formatiert ist, kann ein zvol erstellt werden, welches dann als iSCSI-Speicher verwendet werden kann.
+
+Die Clients, die auf den iSCSI-Speicher zugreifen, werden _Initiator_ genannt. Ihnen steht der verfügbare Speicher als rohe, nicht formatierte Festplatte, die auch als LUN bezeichnet wird, zur Verfügung. Die Gerätedateien für die Festplatten erscheinen in [.filename]#/dev/# und müssen separat formatiert und eingehangen werden.
+
+FreeBSD enthält einen nativen, kernelbasierten iSCSI _Target_ und _Initiator_. Dieser Abschnitt beschreibt, wie ein FreeBSD-System als Target oder Initiator konfiguriert wird.
+
+[[network-iscsi-target]]
+=== Ein iSCSI-Target konfigurieren
+
+Um ein iSCSI-Target zu konfigurieren, erstellen Sie die Konfigurationsdatei [.filename]#/etc/ctl.conf# und fügen Sie eine Zeile in [.filename]#/etc/rc.conf# hinzu, um sicherzustellen, dass man:ctld[8] automatisch beim Booten gestartet wird. Starten Sie dann den Daemon.
+
+Das folgende Beispiel zeigt eine einfache [.filename]#/etc/ctl.conf#. Eine vollständige Beschreibung dieser Datei und der verfügbaren Optionen finden Sie in man:ctl.conf[5].
+
+[.programlisting]
+....
+portal-group pg0 {
+ discovery-auth-group no-authentication
+ listen 0.0.0.0
+ listen [::]
+}
+
+target iqn.2012-06.com.example:target0 {
+ auth-group no-authentication
+ portal-group pg0
+
+ lun 0 {
+ path /data/target0-0
+ size 4G
+ }
+}
+....
+
+Der erste Eintrag definiert die Portalgruppe `pg0`. Portalgruppen legen fest, auf welchen Netzwerk-Adressen der man:ctld[8]-Daemon Verbindungen entgegennehmen wird. Der Eintrag `discovery-auth-group no-authentication` zeigt an, dass jeder Initiator iSCSI-Targets suchen darf, ohne sich authentifizieren zu müssen. Die dritte und vierte Zeilen konfigurieren man:ctld[8] so, dass er auf allen IPv4- (`listen 0.0.0.0`) und IPv6-Adressen (`listen [::]`) auf dem Standard-Port 3260 lauscht.
+
+Es ist nicht zwingend notwendig eine Portalgruppe zu definieren, da es bereits eine integrierte Portalgruppe namens `default` gibt. In diesem Fall ist der Unterschied zwischen `default` und `pg0` der, dass bei `default` eine Authentifizierung nötig ist, während bei `pg0` die Suche nach Targets immer erlaubt ist.
+
+Der zweite Eintrag definiert ein einzelnes Target. Ein Target hat zwei mögliche Bedeutungen: eine Maschine die iSCSI bereitstellt, oder eine Gruppe von LUNs. Dieses Beispiel verwendet die letztere Bedeutung, wobei `iqn.2012-06.com.example:target0` der Name des Targets ist. Dieser Name ist nur für Testzwecke geeignet. Für den tatsächlichen Gebrauch ändern Sie `com.example` auf einen echten, rückwärts geschriebenen Domainnamen. `2012-06` steht für das Jahr und den Monat, an dem die Domain erworben wurde. `target0` darf einen beliebigen Wert haben und in der Konfigurationsdatei darf eine beliebige Anzahl von Targets definiert werden.
+
+Der Eintrag `auth-group no-authentication` erlaubt es allen Initiatoren sich mit dem angegebenen Target zu verbinden und `portal-group pg0` macht das Target über die Portalgruppe `pg0` erreichbar.
+
+Die nächste Sektion definiert die LUN. Jede LUN wird dem Initiator als separate Platte präsentiert. Für jedes Target können mehrere LUNs definiert werden. Jede LUN wird über eine Nummer identifiziert, wobei LUN 0 verpflichtend ist. Die Zeile mit dem Pfad `path /data/target0-0` definiert den absoluten Pfad zu der Datei oder des zvols für die LUN. Der Pfad muss vorhanden sein, bevor man:ctld[8] gestartet wird. Die zweite Zeile ist optional und gibt die Größe der LUN an. Als nächstes fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein, um man:ctld[8] automatisch beim Booten zu starten:
+
+[.programlisting]
+....
+ctld_enable="YES"
+....
+
+Um man:ctld[8] jetzt zu starten, geben Sie dieses Kommando ein:
+
+[source,bash]
+....
+# service ctld start
+....
+
+Der man:ctld[8]-Daemon liest beim Start [.filename]#/etc/ctl.conf#. Wenn diese Datei nach dem Starten des Daemons bearbeitet wird, verwenden Sie folgenden Befehl, damit die Änderungen sofort wirksam werden:
+
+[source,bash]
+....
+# service ctld reload
+....
+
+==== Authentifizierung
+
+Die vorherigen Beispiele sind grundsätzlich unsicher, da keine Authentifizierung verwendet wird und jedermann vollen Zugriff auf alle Targets hat. Um für den Zugriff auf die Targets einen Benutzernamen und ein Passwort vorauszusetzen, ändern Sie die Konfigurationsdatei wie folgt:
+
+[.programlisting]
+....
+auth-group ag0 {
+ chap username1 secretsecret
+ chap username2 anothersecret
+}
+
+portal-group pg0 {
+ discovery-auth-group no-authentication
+ listen 0.0.0.0
+ listen [::]
+}
+
+target iqn.2012-06.com.example:target0 {
+ auth-group ag0
+ portal-group pg0
+ lun 0 {
+ path /data/target0-0
+ size 4G
+ }
+}
+....
+
+Die Sektion `auth-group` definiert die Benutzernamen und Passwörter. Um sich mit `iqn.2012-06.com.example:target0` zu verbinden, muss ein Initiator zuerst einen Benutzernamen und ein Passwort angeben. Eine Suche nach Targets wird jedoch immer noch ohne Authentifizierung gestattet. Um eine Authentifizierung zu erfordern, setzen Sie `discovery-auth-group` auf eine definierte `auth-group` anstelle von `no-autentication`.
+
+In der Regel wird für jeden Initiator ein einzelnes Target exportiert. In diesem Beispiel wird der Benutzername und das Passwort direkt im Target-Eintrag festgelegt:
+
+[.programlisting]
+....
+target iqn.2012-06.com.example:target0 {
+ portal-group pg0
+ chap username1 secretsecret
+
+ lun 0 {
+ path /data/target0-0
+ size 4G
+ }
+}
+....
+
+[[network-iscsi-initiator]]
+=== Einen iSCSI-Initiator konfigurieren
+
+[NOTE]
+====
+Der in dieser Sektion beschriebene iSCSI-Initiator wird seit FreeBSD 10.0-RELEASE unterstützt. Lesen Sie man:iscontrol[8], wenn Sie den iSCSI-Initiator mit älteren Versionen benutzen möchten.
+====
+
+Um den Initiator zu verwenden, muss zunächst ein iSCSI-Daemon gestartet sein. Der Daemon des Initiators benötigt keine Konfigurationsdatei. Um den Daemon automatisch beim Booten zu starten, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+iscsid_enable="YES"
+....
+
+Um man:iscsid[8] jetzt zu starten, geben Sie dieses Kommando ein:
+
+[source,bash]
+....
+# service iscsid start
+....
+
+Die Verbindung mit einem Target kann mit, oder ohne eine Konfigurationsdatei [.filename]#/etc/iscsi.conf# durchgeführt werden. Dieser Abschnitt beschreibt beide Möglichkeiten.
+
+==== Verbindung zu einem Target herstellen - ohne Konfigurationsdatei
+
+Um einen Initiator mit einem Target zu verbinden, geben Sie die IP-Adresse des Portals und den Namen des Ziels an:
+
+[source,bash]
+....
+# iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0
+....
+
+Um zu überprüfen, ob die Verbindung gelungen ist, rufen Sie `iscsictl` ohne Argumente auf. Die Ausgabe sollte in etwa wie folgt aussehen:
+
+[.programlisting]
+....
+Target name Target portal State
+iqn.2012-06.com.example:target0 10.10.10.10 Connected: da0
+....
+
+In diesem Beispiel wurde die iSCSI-Sitzung mit der LUN [.filename]#/dev/da0# erfolgreich hergestellt. Wenn das Target `iqn.2012-06.com.example:target0` mehr als nur eine LUN exportiert, werden mehrere Gerätedateien in der Ausgabe angezeigt:
+
+[source,bash]
+....
+Connected: da0 da1 da2.
+....
+
+Alle Fehler werden auf die Ausgabe und in die Systemprotokolle geschrieben. Diese Meldung deutet beispielsweise darauf hin, dass der man:iscsid[8]-Daemon nicht ausgeführt wird:
+
+[.programlisting]
+....
+Target name Target portal State
+iqn.2012-06.com.example:target0 10.10.10.10 Waiting for iscsid(8)
+....
+
+Die folgende Meldung deutet auf ein Netzwerkproblem hin, zum Beispiel eine falsche IP-Adresse oder einen falschen Port:
+
+[.programlisting]
+....
+Target name Target portal State
+iqn.2012-06.com.example:target0 10.10.10.11 Connection refused
+....
+
+Diese Meldung bedeutet, dass der Name des Targets falsch angegeben wurde:
+
+[.programlisting]
+....
+Target name Target portal State
+iqn.2012-06.com.example:target0 10.10.10.10 Not found
+....
+
+Diese Meldung bedeutet, dass das Target eine Authentifizierung erfordert:
+
+[.programlisting]
+....
+Target name Target portal State
+iqn.2012-06.com.example:target0 10.10.10.10 Authentication failed
+....
+
+Verwenden Sie diese Syntax, um einen CHAP-Benutzernamen und ein Passwort anzugeben:
+
+[source,bash]
+....
+# iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0 -u user -s secretsecret
+....
+
+==== Verbindung mit einem Target herstellen - mit Konfigurationsdatei
+
+Wenn Sie für die Verbindung eine Konfigurationsdatei verwenden möchten, erstellen Sie [.filename]#/etc/iscsi.conf# mit etwa folgendem Inhalt:
+
+[.programlisting]
+....
+t0 {
+ TargetAddress = 10.10.10.10
+ TargetName = iqn.2012-06.com.example:target0
+ AuthMethod = CHAP
+ chapIName = user
+ chapSecret = secretsecret
+}
+....
+
+`t0` gibt den Namen der Sektion in der Konfigurationsdatei an. Diser Name wird vom Initiator benutzt, um zu bestimmen, welche Konfiguration verwendet werden soll. Die anderen Einträge legen die Parameter fest, die während der Verbindung verwendet werden. `TargetAddress` und `TargetName` müssen angegeben werden, die restlichen sind optional. In diesen Beispiel wird der CHAP-Benuztername und das Passwort angegeben.
+
+Um sich mit einem bestimmten Target zu verbinden, geben Sie dessen Namen an:
+
+[source,bash]
+....
+# iscsictl -An t0
+....
+
+Um sich stattdessen mit allen definierten Targets aus der Konfigurationsdatei zu verbinden, verwenden Sie:
+
+[source,bash]
+....
+# iscsictl -Aa
+....
+
+Damit sich der Initiator automatisch mit allen Targets aus [.filename]#/etc/iscsi.conf# verbindet, fügen Sie folgendes in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+iscsictl_enable="YES"
+iscsictl_flags="-Aa"
+....
diff --git a/documentation/content/de/books/handbook/parti.adoc b/documentation/content/de/books/handbook/parti.adoc
new file mode 100644
index 0000000000..91a1bba0af
--- /dev/null
+++ b/documentation/content/de/books/handbook/parti.adoc
@@ -0,0 +1,20 @@
+---
+title: Teil I. Erste Schritte
+prev: books/handbook/preface
+next: books/handbook/introduction
+---
+
+[[getting-started]]
+= Erste Schritte
+
+Dieser Teil des Handbuchs richtet sich an Benutzer und Administratoren für die FreeBSD neu ist. Diese Kapitel
+
+* enthalten eine Einführung in FreeBSD,
+* geleitet den Leser durch den Installationsprozess,
+* erklärt die Grundlagen von UNIX(R) Systemen,
+* demonstriert, wie die Fülle der erhältlichen Anwendungen Dritter installiert werden und
+* führt den Leser in X, der Benutzeroberfläche von UNIX(R) Systemen ein. Es wird gezeigt, wie ein Desktop konfiguriert wird, um effektiver arbeiten zu können.
+
+Referenzen auf weiter vorne liegende Textteile wurden auf ein Minimum beschränkt, so dass dieser Abschnitt ohne viel Blättern durchgearbeitet werden kann.
+
+include::content/de/books/handbook/toc-1.adoc[]
diff --git a/documentation/content/de/books/handbook/partii.adoc b/documentation/content/de/books/handbook/partii.adoc
new file mode 100644
index 0000000000..1dce35fcbc
--- /dev/null
+++ b/documentation/content/de/books/handbook/partii.adoc
@@ -0,0 +1,20 @@
+---
+title: Teil II. Oft benutzte Funktionen
+prev: books/handbook/x11
+next: books/handbook/desktop
+---
+
+[[common-tasks]]
+= Oft benutzte Funktionen
+
+Nach den Grundlagen beschäftigt sich das Handbuch mit oft benutzten Funktionen von FreeBSD. Die Kapitel behandeln die nachstehenden Themen:
+
+* Beliebte und nützliche Werkzeuge wie Browser, Büroanwendungen und Programme zum Anzeigen von Dokumenten.
+* Multimedia-Werkzeuge für FreeBSD.
+* Erstellung eines angepassten FreeBSD-Kernels, um zusätzliche Funktionen zu aktivieren.
+* Ausführliche Beschreibung des Drucksystems, sowohl für direkt angeschlossene Drucker als auch für Netzwerkdrucker.
+* Ausführung von Linux-Anwendungen auf einem FreeBSD-System.
+
+Damit Sie einige Kapitel verstehen, sollten Sie vorher andere Kapitel gelesen haben. Die Übersicht zu jedem Kapitel zählt die Voraussetzungen für das erolgreiche Durcharbeiten des Kapitels auf.
+
+include::content/de/books/handbook/toc-2.adoc[]
diff --git a/documentation/content/de/books/handbook/partiii.adoc b/documentation/content/de/books/handbook/partiii.adoc
new file mode 100644
index 0000000000..a725515aa6
--- /dev/null
+++ b/documentation/content/de/books/handbook/partiii.adoc
@@ -0,0 +1,14 @@
+---
+title: Teil III. Systemadministration
+prev: books/handbook/linuxemu
+next: books/handbook/config
+---
+
+[[system-administration]]
+= Systemadministration
+
+Die restlichen Kapitel behandeln alle Aspekte der FreeBSD Systemadministration. Am Anfang jedes Kapitels finden Sie eine Zusammenfassung, die beschreibt, was Sie nach dem Durcharbeiten des Kapitels gelernt haben. Weiterhin werden die Voraussetzungen beschrieben, die für das Durcharbeiten des Kapitels erforderlich sind.
+
+Diese Kapitel sollten Sie lesen, wenn Sie die Informationen darin benötigen. Sie brauchen Sie nicht in einer bestimmten Reihenfolge zu lesen, noch müssen Sie die Kapitel lesen, bevor Sie anfangen, FreeBSD zu benutzen.
+
+include::content/de/books/handbook/toc-3.adoc[]
diff --git a/documentation/content/de/books/handbook/partiv.adoc b/documentation/content/de/books/handbook/partiv.adoc
new file mode 100644
index 0000000000..c56c04d048
--- /dev/null
+++ b/documentation/content/de/books/handbook/partiv.adoc
@@ -0,0 +1,21 @@
+---
+title: Teil IV. Netzwerke
+prev: books/handbook/usb-device-mode
+next: books/handbook/serialcomms
+---
+
+[[network-communication]]
+= Netzwerke
+
+FreeBSD ist eins der meist benutzten Betriebssysteme für leistungsfähige Netzwerkserver. Die Kapitel in diesem Teil behandeln die nachstehenden Themen:
+
+* Serielle Datenübertragung
+* PPP und PPP over Ethernet
+* Elektronische Post (E-Mail)
+* Den Betrieb von Netzwerkdiensten
+* Firewalls
+* Weiterführende Netzwerkthemen
+
+Diese Kapitel sollten Sie lesen, wenn Sie die Informationen darin benötigen. Sie brauchen die Kapitel nicht in einer bestimmten Reihenfolge zu lesen, noch müssen Sie die Kapitel lesen, bevor Sie anfangen, FreeBSD in einer Netzwerkumgebung zu benutzen.
+
+include::content/de/books/handbook/toc-4.adoc[]
diff --git a/documentation/content/de/books/handbook/partv.adoc b/documentation/content/de/books/handbook/partv.adoc
new file mode 100644
index 0000000000..2a8343ac72
--- /dev/null
+++ b/documentation/content/de/books/handbook/partv.adoc
@@ -0,0 +1,10 @@
+---
+title: Teil V. Anhang
+prev: books/handbook/advanced-networking
+next: books/handbook/mirrors
+---
+
+[[appendices]]
+= Anhang
+
+include::content/de/books/handbook/toc-5.adoc[]
diff --git a/documentation/content/de/books/handbook/pgpkeys/_index.adoc b/documentation/content/de/books/handbook/pgpkeys/_index.adoc
new file mode 100644
index 0000000000..3dd74c2628
--- /dev/null
+++ b/documentation/content/de/books/handbook/pgpkeys/_index.adoc
@@ -0,0 +1,55 @@
+---
+title: Anhang D. OpenPGP-Schlüssel
+part: Teil V. Anhang
+prev: books/handbook/eresources
+next: books/handbook/freebsd-glossary
+---
+
+[appendix]
+[[pgpkeys]]
+= OpenPGP-Schlüssel
+:doctype: book
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: D
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+:pgpkeys-path:
+
+Verwenden Sie die nachstehenden Schlüssel, wenn Sie eine Signatur überprüfen oder eine verschlüsselte E-Mail an einen Ansprechpartner oder einen Entwickler schicken wollen. Eine vollständige Liste der FreeBSD OpenPGP-Schlüssel finden Sie im Artikel {pgpkeys}[PGP Keys]. Den vollständigen Schlüsselring der Entwickler von FreeBSD finden Sie unter https://www.FreeBSD.org/doc/pgpkeyring.txt[https://www.FreeBSD.org/doc/pgpkeyring.txt].
+
+[[pgpkeys-officers]]
+== Ansprechpartner
+
+=== {security-officer-name} `<{security-officer-email}>`
+include::{pgpkeys-path}static/pgpkeys/security-officer.key[]
+
+=== {secteam-secretary-name} `<{secteam-secretary-email}>`
+include::{pgpkeys-path}static/pgpkeys/secteam-secretary.key[]
+
+=== {core-secretary-name} `<{core-secretary-email}>`
+include::{pgpkeys-path}static/pgpkeys/core-secretary.key[]
+
+=== {portmgr-secretary-name} `<{portmgr-secretary-email}>`
+include::{pgpkeys-path}static/pgpkeys/portmgr-secretary.key[]
+
+=== `{doceng-secretary-email}`
+include::{pgpkeys-path}static/pgpkeys/doceng-secretary.key[]
+
+:sectnums:
+:sectnumlevels: 6
diff --git a/documentation/content/de/books/handbook/ports/_index.adoc b/documentation/content/de/books/handbook/ports/_index.adoc
new file mode 100644
index 0000000000..b4666a2d85
--- /dev/null
+++ b/documentation/content/de/books/handbook/ports/_index.adoc
@@ -0,0 +1,1151 @@
+---
+title: "Kapitel 4. Installieren von Anwendungen: Pakete und Ports"
+part: Teil I. Erste Schritte
+prev: books/handbook/basics
+next: books/handbook/x11
+---
+
+[[ports]]
+= Installieren von Anwendungen: Pakete und Ports
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 4
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/ports/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/ports/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/ports/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[ports-synopsis]]
+== Übersicht
+
+FreeBSD enthält eine umfassende Sammlung von Systemwerkzeugen, die Teil des Basissystems sind. Darüber hinaus stellt FreeBSD zwei sich ergänzende Methoden zur Installation von Drittanbieter-Software zur Verfügung: Die Ports-Sammlung zur Installation aus dem Quellcode sowie Pakete zur Installation von vorkompilierten binären Softwarepaketen. Beide Methoden können benutzt werden, um Anwendungen von lokalen Medien oder über das Netzwerk zu installieren.
+
+Dieses Kapitel behandelt die folgenden Themen:
+
+* Den Unterschied zwischen binären Softwarepaketen und Ports.
+* Wie man Drittanbieter-Software findet, die nach FreeBSD portiert wurde.
+* Wie Binärpakete mit pkg verwaltet werden.
+* Den Bau von Drittanbieter-Software aus dem Quellcode mithilfe der Ports-Sammlung.
+* Wie man die Dateien findet, die zusammen mit der Anwendung installiert wurden.
+* Was zu tun ist, wenn die Installation einer Software fehlschlägt.
+
+[[ports-overview]]
+== Installation von Software
+
+Die typischen Schritte zur Installation von Drittanbieter-Software auf einem UNIX(R) System sind:
+
+[.procedure]
+. Download der Software, die als Quelltext oder im Binärformat vorliegen kann.
+. Auspacken der Software. Dies ist typischerweise ein mit man:compress[1], man:gzip[1], man:bzip2[1] oder man:xz[1] komprimiertes Tar-Archiv.
+. Durchsuchen der Dokumentation, die sich in [.filename]#INSTALL#, [.filename]#README# oder mehreren Dateien im Verzeichnis [.filename]#doc/# befindet, nach Anweisungen, wie die Software zu installieren ist.
+. Kompilieren der Software, wenn sie als Quelltext vorliegt. Dazu muss vielleicht das [.filename]#Makefile# angepasst, oder `configure` ausgeführt werden.
+. Testen und installieren der Software.
+
+Ein FreeBSD-Port ist eine Sammlung von Dateien, die das Kompilieren der Quelltexte einer Anwendung automatisieren. Die Dateien, die ein Port umfasst enthalten alle notwendigen Informationen um die Anwendung herunterzuladen, zu extrahieren, anzupassen und zu installieren.
+
+Wenn die Software nicht bereits für FreeBSD angepasst und getestet wurde, muss vielleicht sogar der Quelltext angepasst werden, damit die Software funktioniert.
+
+Bislang wurden über link:https://www.FreeBSD.org/ports/[{numports}] Anwendungen von Drittanbietern nach FreeBSD portiert. Falls möglich, werden diese Anwendungen als vorkompilierte _Pakete_ zur Verfügung gestellt.
+
+Pakete können mit FreeBSDs Paketverwaltungswerkzeugen manipuliert werden.
+
+Pakete und Ports beachten Abhängigkeiten zwischen Anwendungen. Wenn ein Paket oder die Ports-Sammlung benutzt wird, um eine Anwendung zu installieren, dann werden fehlende Bibliotheken zuerst installiert, sofern sie nicht schon vorher installiert waren.
+
+Ein FreeBSD-Paket enthält vorkompilierte Kopien aller Befehle für eine Anwendung, sowie zusätzliche Konfigurationsdateien und Dokumentation. Pakete können mit den man:pkg[8]-Befehlen, wie `pkg install`, manipuliert werden.
+
+Obwohl beide Technologien gleichartig sind, so haben Pakete und Ports jeweils ihre eigenen Stärken. Welche Technologie eingesetzt wird, hängt letzten Endes von den Anforderungen ab, die an eine bestimmte Anwendung gestellt werden.
+
+.Vorteile von Paketen
+* Das komprimierte Paket einer Anwendung ist normalerweise kleiner als das komprimierte Archiv der Quelltexte.
+* Pakete müssen nicht mehr kompiliert werden. Dies ist ein Vorteil, wenn große Pakete wie Mozilla, KDE oder GNOME auf langsamen Maschinen installiert werden.
+* Wenn Sie Pakete verwenden, brauchen Sie nicht zu verstehen, wie Software unter FreeBSD kompiliert wird.
+
+.Vorteile von Ports
+* Da die Pakete auf möglichst vielen System laufen sollen, werden Optionen beim Übersetzen zurückhaltend gesetzt. Wird eine Anwendung über die Ports übersetzt, können die Optionen nach eigenen Bedürfnissen angepasst werden.
+* Die Eigenschaften einiger Anwendungen werden über Optionen zum Zeitpunkt des Übersetzens festgelegt. Apache kann zum Beispiel über eine große Auswahl an eingebauten Optionen konfiguriert werden.
++
+Für einige Fälle existieren verschiedene Pakete einer Anwendung, die beim Übersetzen unterschiedlich konfiguriert wurden. Für Ghostscript gibt es ein [.filename]#ghostscript#-Paket und ein [.filename]#ghostscript-nox11#-Paket, die sich durch die Xorg Unterstützung unterscheiden. Das Erstellen von verschiedenen Paketen wird aber schnell unhandlich, wenn eine Anwendung mehr als ein oder zwei Optionen zum Zeitpunkt des Übersetzens besitzt.
+* Die Lizenzbestimmungen mancher Software verbietet ein Verbreiten in binärer Form. Diese Software muss als Quelltext, der durch den Benutzer kompiliert werden muss, ausgeliefert werden.
+* Einige Leute trauen binären Distributionen nicht, oder sie ziehen es vor den Quelltext zu lesen, um diesen nach möglichen Problemen zu durchsuchen.
+* Der Quellcode wird benötigt, um individuelle Anpassungen anzuwenden.
+
+Wenn Sie über aktualisierte Ports informiert sein wollen, lesen Sie die Mailinglisten {freebsd-ports} und {freebsd-ports-bugs}.
+
+[WARNING]
+====
+
+Bevor Sie eine Anwendung installieren, informieren Sie sich auf der Seite https://vuxml.FreeBSD.org/[] über mögliche Sicherheitsprobleme mit der Anwendung, oder führen Sie `pkg audit -F` aus, um alle installierten Pakete auf bekannte Sicherheitslücken zu überprüfen.
+====
+
+Der Rest dieses Kapitels beschreibt, wie man Software Dritter mit Paketen und Ports unter FreeBSD installiert und verwaltet.
+
+[[ports-finding-applications]]
+== Suchen einer Anwendung
+
+Die Anzahl der nach FreeBSD portierten Anwendungen steigt ständig. Es gibt einige Wege, um nach Anwendungen zu suchen:
+
+* Die FreeBSD-Webseite stellt unter link:https://www.FreeBSD.org/ports/[https://www.FreeBSD.org/ports/] eine aktuelle und durchsuchbare Liste aller Anwendungen zur Verfügung. Die Ports können nach dem Namen den Anwendung, oder über die Software-Kategorie durchsucht werden.
+* Dan Langille verwaltet http://www.FreshPorts.org/[FreshPorts.org], das eine umfassende Suchfunktion bietet und Änderungen an den Anwendungen in der Ports-Sammlung verfolgt. Registrierte Benutzer können eine Merkliste erstellen, um automatisch eine E-Mail zu erhalten, sobald ein Port von dieser Liste aktualisiert wurde.
+* Wenn Sie bei der Suche nach einer bestimmten Anwendung nicht weiter kommen, versuchen Sie eine Webseite wie http://www.sourceforge.net/[SourceForge.net] oder http://www.github.com/[GitHub.com]. Schauen Sie dann auf der link:https://www.FreeBSD.org/ports/[FreeBSD-Webseite] nach, ob die Anwendung portiert wurde.
+* Das Paket Repository nach einer Anwendung durchsuchen:
++
+[source,bash]
+....
+# pkg search subversion
+git-subversion-1.9.2
+java-subversion-1.8.8_2
+p5-subversion-1.8.8_2
+py27-hgsubversion-1.6
+py27-subversion-1.8.8_2
+ruby-subversion-1.8.8_2
+subversion-1.8.8_2
+subversion-book-4515
+subversion-static-1.8.8_2
+subversion16-1.6.23_4
+subversion17-1.7.16_2
+....
++
+Die Paketnamen enthalten jeweils die Versionsnummer. Wenn ein Port von python abhängt, wird auch die Versionsnummer von python ausgegeben, mit der die Anwendung gebaut wurde. Für einige Ports stehen sogar mehrere Versionen zur Verfügung. Im Fall von Subversion gibt es drei verschiedene Versionen, mit unterschiedlichen Optionen. In diesem Fall wird die Version von Subversion statisch gelinkt. Wenn Sie ein Paket installieren, ist es am besten den Ursprung des Ports anzugeben, also den Pfad in der Ports-Sammlung. Wiederholen Sie `pkg search` mit `-o` um den Ursprung der Pakete anzuzeigen:
++
+[source,bash]
+....
+# pkg search -o subversion
+devel/git-subversion
+java/java-subversion
+devel/p5-subversion
+devel/py-hgsubversion
+devel/py-subversion
+devel/ruby-subversion
+devel/subversion16
+devel/subversion17
+devel/subversion
+devel/subversion-book
+devel/subversion-static
+....
++
+Zudem unterstützt `pkg search` die Suche mit regulären Ausdrücken, nach exakten Treffern, nach der Beschreibung oder nach anderen Feldern in der Repository-Datenbank. Nach der Installation von package:ports-mgmt/pkg[] oder package:ports-mgmt/pkg-devel[], finden Sie in man:pkg-search[8] weitere Details.
+* Wenn die Ports-Sammlung bereits installiert ist, gibt es mehrere Methoden, um die lokale Version dieser Port-Sammlung abzufragen. Verwenden Sie `whereis _Datei_` um herauszufinden, in welcher Kategorie ein Port ist, wobei _Datei_ der Name des Programms ist, das installiert werden soll:
++
+[source,bash]
+....
+# whereis lsof
+lsof: /usr/ports/sysutils/lsof
+....
++
+Alternativ kann der man:echo[1]-Befehl verwendet werden:
++
+[source,bash]
+....
+# echo /usr/ports/*/*lsof*
+/usr/ports/sysutils/lsof
+....
++
+Beachten Sie aber, dass dieser Befehl auch alle Dateien im Verzeichnis [.filename]#/usr/ports/distfiles# findet, auf die der angegebene Suchbegriff passt.
+* Ein weiterer Weg nach Software zu suchen besteht darin, die eingebaute Suchfunktion der Ports-Sammlung zu benutzen. Wechseln Sie dazu in das Verzeichnis [.filename]#/usr/ports#, und rufen Sie `make search name=_Anwendungsname_` auf, wobei _Anwendungsname_ der Name der Software ist. Um zum Beispiel nach `lsof` zu suchen:
++
+[source,bash]
+....
+# cd /usr/ports
+# make search name=lsof
+Port: lsof-4.88.d,8
+Path: /usr/ports/sysutils/lsof
+Info: Lists information about open files (similar to fstat(1))
+Maint: ler@lerctr.org
+Index: sysutils
+B-deps:
+R-deps:
+....
++
+[TIP]
+====
+
+Der integrierte Suchmechanismus verwendet eine Datei mit Index-Informationen. Erscheint eine Meldung, dass der [.filename]#INDEX# benötigt wird, führen Sie `make fetchindex` aus, um die aktuelle Index-Datei herunterzuladen. Mit einem vorhandenen [.filename]#INDEX# ist `make search` in der Lage, die gewünschte Suche durchzuführen.
+====
++
+Die "Path:"-Zeile zeigt an, wo der Port zu finden ist.
++
+Um weniger Informationen zu erhalten, benutzen Sie die Funktion `quicksearch`:
++
+[source,bash]
+....
+# cd /usr/ports
+# make quicksearch name=lsof
+Port: lsof-4.88.d,8
+Path: /usr/ports/sysutils/lsof
+Info: Lists information about open files (similar to fstat(1))
+....
++
+Erweiterte Suchen führen Sie mit `make search key=_Text_` oder `make quicksearch key=_Text_` aus. Damit werden Portnamen, Kommentare, Beschreibungen und Abhängigkeiten nach _Text_ durchsucht. Dies kann sehr nützlich sein, wenn der Name des Programms nicht bekannt ist.
++
+Bei der Verwendung von `search` und `quicksearch` wird Groß- und Kleinschreibung bei der Suche ignoriert. Die Suche nach "LSOF" wird dieselben Ergebnisse wie die Suche nach "lsof" liefern.
+
+[[pkgng-intro]]
+== Benutzen von pkg zur Verwaltung von Binärpaketen
+
+pkg ist der Nachfolger für die traditionellen Paketverwaltungswerkzeuge von FreeBSD. Es bietet viele Funktionen, die den Umgang mit Binärpaketen schneller und einfacher machen.
+
+Wenn Sie lediglich vorgefertigte Binärpakete von den FreeBSD Spiegeln benutzen möchten, ist pkg für die Verwaltung von Paketen ausreichend.
+
+Falls Sie jedoch die Software aus dem Quellcode bauen oder eigene Repositories verwenden, benötigen Sie ein separates <<ports-upgrading-tools, Paketverwaltungswerkzeug>>.
+
+pkg ist kein Ersatz für diese Werkzeuge. Während diese Werkzeuge Drittanbieter-Software sowohl aus Binärpaketen als auch aus der Ports-Sammlung installieren können, so installiert pkg ausschließlich Binärpakete.
+
+[[pkgng-initial-setup]]
+=== Erste Schritte mit pkg
+
+FreeBSD enthält ein Bootstrap-Programm, welches pkg zusammen mit den Manualpages installiert. pkg wurde für FreeBSD Versionen ab 10._X_ entwickelt.
+
+[NOTE]
+====
+Nicht alle FreeBSD Versionen unterstüzen den folgenden Bootstrap Prozess. Eine aktuelle Liste finden Sie unter https://pkg.FreeBSD.org/[]. Andernfalls muss pkg aus der Ports-Sammlung oder als Binärpaket installiert werden.
+====
+
+Um das Bootstrap Programm zu starten, geben Sie folgendes ein:
+
+[source,bash]
+....
+# /usr/sbin/pkg
+....
+
+Sie müssen eine Internetverbindung haben, damit der Bootstrap Prozess funktioniert.
+
+Um den Port zu installieren, geben Sie stattdessen folgendes ein:
+
+[source,bash]
+....
+# cd /usr/ports/ports-mgmt/pkg
+# make
+# make install clean
+....
+
+Bei der Aktualisierung eines bestehenden Systems, welches ursprünglich die alten pkg_* Werkzeuge verwendet hat, muss die Datenbank in das neue Format konvertiert werden, damit die neuen Werkzeuge wissen, welche Pakete bereits installiert sind. Sobald pkg installiert ist, muss die Paketdatenbank mit dem folgenden Befehl vom traditionellen Format in das neue Format konvertiert werden:
+
+[source,bash]
+....
+# pkg2ng
+....
+
+[NOTE]
+====
+Auf neu installieren Systemen, auf denen noch keine Software von Drittanbietern installiert wurde, kann dieser Schritt entfallen.
+====
+
+[IMPORTANT]
+====
+Die Konvertierung ist unwiderruflich. Sobald die Paketdatenbank in das Format von pkg umgewandelt wurde, sollten die traditionellen pkg_* Werkzeuge nicht mehr benutzt werden.
+====
+
+[NOTE]
+====
+Bei der Konvertierung der Paketdatenbank können Fehler ausgegeben werden, wenn die Inhalte auf die neue Version umgewandelt werden. Im Allgemeinen können diese Fehler ignoriert werden. Wenn pkg2ng fertig ist, wird eine Liste von Software ausgegeben, die nicht erfolgreich konvertiert werden konnte. Diese Anwendungen müssen manuell neu installiert werden.
+====
+
+Um sicherzustellen, dass die Ports-Sammlung neue Pakete mit pkg und nicht mit den traditionellen Formaten registriert, muss in FreeBSD 10._X_ und früheren Versionen folgende Zeile in [.filename]#/etc/make.conf# hinzugefügt werden:
+
+[.programlisting]
+....
+WITH_PKGNG= yes
+....
+
+In der Voreinstellung benutzt pkg die Pakete der FreeBSD-Spiegel (das _Repository_). Wenn Sie ein eigenes Paket-Repository erstellen möchten, lesen Sie <<ports-poudriere>>
+
+Weitere Konfigurationsoptionen für pkg sind in man:pkg.conf[5] beschrieben.
+
+Informationen zur Bedienung von pkg ist in man:pkg[8] verfügbar. Alternativ kann `pkg` ohne zusätzliche Argumente aufgerufen werden.
+
+Jedes Argument von pkg ist in seiner spezifischen Manualpage dokumentiert. Um beispielsweise die Manualpage von `pkg install` zu lesen, geben Sie einen der folgenden Befehle ein:
+
+[source,bash]
+....
+# pkg help install
+....
+
+[source,bash]
+....
+# man pkg-install
+....
+
+Der Rest dieses Abschnitts beschreibt die typischen Verwaltungsaufgaben für Binärpakete, die mit pkg erledigt werden können. Jedes gezeigte Kommando verfügt über Optionen, um das Verhalten anzupassen. Details und weitere Beispiele finden Sie in den Manualpages der einzelnen Kommandos.
+
+[[quarterly-latest-branch]]
+=== Die Port-Zweige _Quarterly_ und _Latest_
+
+Der vierteljährliche Zweig (Quarterly) bietet eine besser vorhersehbare und stabilere Erfahrung bei der Installation und Aktualisierung von Ports und Paketen. Dies wird im Wesentlichen dadurch erreicht, das nur Aktualisierungen zugelassen werden, die nicht zum Funktionsumfang gehören. Der vierteljährliche Zweig zielt darauf ab, Sicherheitskorrekturen (Aktualisierungen und Rückportierungen von Commits), Fehlerbehebungen und Port-Konformität oder Framework-Änderungen zu erhalten. Der vierteljährliche Zweig wird zu Beginn eines jeden Quartals im Januar, April, Juli und Oktober von HEAD abgetrennt. Die Zweige werden nach dem Jahr (YYYY) und dem Quartal (Q1 - Q4) benannt, in dem sie erstellt wurden. Zum Beispiel wird der Zweig, der im Januar 2016 erstellt wurde, 2016Q1 genannt. Der neueste Zweig (Latest) stellt die aktuellsten Versionen der Pakete zur Verfügung.
+
+Um vom Quarterly auf Latest zu wechseln, führen Sie die folgenden Befehle aus:
+
+[source,bash]
+....
+# cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf
+....
+
+Bearbeiten Sie die Datei [.filename]#/usr/local/etc/pkg/FreeBSD.conf# und ändern Sie in der `url:`-Zeile die Zeichenkette _quarterly_ in _latest_.
+
+Das Ergebnis sollte wie folgt aussehen:
+
+[.programlisting]
+....
+FreeBSD: {
+ url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
+ mirror_type: "srv",
+ signature_type: "fingerprints",
+ fingerprints: "/usr/shared/keys/pkg",
+ enabled: yes
+}
+....
+
+Führen Sie zuletzt diesen Befehl aus, um die neuen Repository-Metadaten zu aktualisieren:
+
+[source,bash]
+....
+# pkg update -f
+....
+
+[[pkgng-pkg-info]]
+=== Informationen über installierte Pakete anzeigen
+
+Informationen über bereits installierte Pakete können mit `pkg info` angezeigt werden. Dabei wird, wenn keine weiteren Optionen angegeben werden, die Version und die Beschreibung aller Pakete oder eines einzelnen Pakets ausgegeben.
+
+Um zu ermitteln welche Version von pkg installiert ist, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg info pkg
+pkg-1.1.4_1
+....
+
+[[pkgng-installing-deinstalling]]
+=== Installation und Deinstallation von Paketen
+
+Ein Binärpaket installieren Sie mit dem folgenden Befehl, wobei _paketname_ der Name des zu installierenden Pakets ist:
+
+[source,bash]
+....
+# pkg install paketname
+....
+
+Dieser Befehl verwendet Daten aus dem Repository um zu bestimmen, welche Version der Software und welche Abhängigkeiten installiert werden müssen. Um beispielsweise curl zu installieren:
+
+[source,bash]
+....
+# pkg install curl
+Updating repository catalogue
+/usr/local/tmp/All/curl-7.31.0_1.txz 100% of 1181 kB 1380 kBps 00m01s
+
+/usr/local/tmp/All/ca_root_nss-3.15.1_1.txz 100% of 288 kB 1700 kBps 00m00s
+
+Updating repository catalogue
+The following 2 packages will be installed:
+
+ Installing ca_root_nss: 3.15.1_1
+ Installing curl: 7.31.0_1
+
+The installation will require 3 MB more space
+
+0 MB to be downloaded
+
+Proceed with installing packages [y/N]: y
+Checking integrity... done
+[1/2] Installing ca_root_nss-3.15.1_1... done
+[2/2] Installing curl-7.31.0_1... done
+Cleaning up cache files...Done
+....
+
+Das neue Paket und jedes weitere Paket, das als Abhängigkeit installiert wurde, ist in der Liste der installierten Pakete zu sehen:
+
+[source,bash]
+....
+# pkg info
+ca_root_nss-3.15.1_1 The root certificate bundle from the Mozilla Project
+curl-7.31.0_1 Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
+pkg-1.1.4_6 New generation package manager
+....
+
+Wird ein Paket nicht mehr benötigt, kann es mit `pkg delete` entfernt werden. Zum Beispiel:
+
+[source,bash]
+....
+# pkg delete curl
+The following packages will be deleted:
+
+ curl-7.31.0_1
+
+The deletion will free 3 MB
+
+Proceed with deleting packages [y/N]: y
+[1/1] Deleting curl-7.31.0_1... done
+....
+
+[[pkgng-upgrading]]
+=== Installierte Pakete aktualisieren
+
+Installierte Pakete können mit diesem Kommando auf die neuesten Versionen aktualisiert werden:
+
+[source,bash]
+....
+# pkg upgrade
+....
+
+Dieses Kommando vergleicht und aktualisiert die installierten Versionen der Pakete mit denen im Repository.
+
+[[pkgng-auditing]]
+=== Installierte Pakete auditieren
+
+Regelmäßig werden Sicherheitslücken in Drittanbieter-Software entdeckt. pkg besitzt einen eingebauten Auditing-Mechanismus. Um die auf dem System installierte Software auf Sicherheitslücken zu prüfen, geben Sie folgenden Befehl ein:
+
+[source,bash]
+....
+# pkg audit -F
+....
+
+[[pkgng-autoremove]]
+=== Automatisches Entfernen unbenutzter Pakete
+
+Das Entfernen eines Pakets kann möglicherweise Abhängigkeiten hinterlassen, die nicht mehr benötigt werden. Unnötige Pakete, die als Abhängigkeit von anderen Paketen installiert wurden, können automatisch erfasst und entfernt werden:
+
+[source,bash]
+....
+# pkg autoremove
+Packages to be removed:
+ ca_root_nss-3.15.1_1
+
+The autoremoval will free 723 kB
+
+Proceed with autoremoval of packages [y/N]: y
+Deinstalling ca_root_nss-3.15.1_1... done
+....
+
+Pakete, die als Abhängigkeiten installiert werden, bezeichnet man als _automatische_ Pakete. Nichtautomatische Pakete, also die Pakete, die explizit nicht als Abhängigkeit von einem anderen Paket installiert wurden, können wie folgt angezeigt werden:
+
+[source,bash]
+....
+# pkg prime-list
+nginx
+openvpn
+sudo
+....
+
+`pkg prime-list` ist ein Alias-Befehl, der in [.filename]#/usr/local/etc/pkg.conf# definiert ist. Es gibt noch weitere Befehle die Sie verwenden können, um die Paketdatenbank des Systems abzufragen. Beispielsweise kann der Befehl `pkg prime-origins` benutzt werden, um das ursprüngliche Portverzeichnis der oben gezeigten Liste zu erhalten:
+
+[source,bash]
+....
+# pkg prime-origins
+www/nginx
+security/openvpn
+security/sudo
+....
+
+Diese Liste kann verwendet werden, um alle auf einem System installierten Pakete mit Hilfe von Werkzeugen wie package:ports-mgmt/poudriere[] oder package:ports-mgmt/synth[] neu zu erstellen.
+
+Um ein bereits installiertes Paket als automatisches Paket zu kennzeichnen, können Sie folgenden Befehl benutzen:
+
+[source,bash]
+....
+# pkg set -A 1 devel/cmake
+....
+
+Sobald ein Paket nicht mehr genutzt wird und es als automatisch gekennzeichnet ist, wird es durch `pkg autoremove` erfasst.
+
+Das kennzeichnen eines installierten Pakets als _nicht_ automatisch kann wie folgt gemacht werden:
+
+[source,bash]
+....
+# pkg set -A 0 devel/cmake
+....
+
+[[pkgng-backup]]
+=== Wiederherstellung der Paketdatenbank
+
+Im Gegensatz zum alten Paketverwaltungssystem beinhaltet pkg einen eigenen Mechanismus zur Sicherung der Paketdatenbank. Diese Funktionalität ist standardmäßig aktiviert.
+
+[TIP]
+====
+
+Um das Skript daran zu hindern, eine Sicherung der Paketdatenbank zu erstellen, muss in man:periodic.conf[5] `daily_backup_pkgdb_enable="NO"` gesetzt werden.
+====
+
+Um den Inhalt einer früheren Paketdatenbank wiederherzustellen, geben Sie folgendes Kommando ein und ersetzen Sie _/path/to/pkg.sql_ durch den Speicherort der gesicherten Datenbank:
+
+[source,bash]
+....
+# pkg backup -r /path/to/pkg.sql
+....
+
+[NOTE]
+====
+Wenn Sie eine Sicherung wiederherstellen, die von einem `periodic` Skript erstellt wurde, müssen Sie diese zuerst dekomprimieren.
+====
+
+Um eine manuelle Sicherung der pkg Paketdatenbank zu erstellen, führen Sie den folgenden Befehl aus, und ersetzen Sie _/path/to/pkg.sql_ durch einen geeigneten Dateinamen:
+
+[source,bash]
+....
+# pkg backup -d /path/to/pkg.sql
+....
+
+[[pkgng-clean]]
+=== Alte Pakete entfernen
+
+Standardmäßig speichert pkg Pakete in einem Cache-Verzeichnis, welches in man:pkg.conf[5] in der Variablen `PKG_CACHEDIR` definiert wird. Nur Kopien der neusten installierten Pakete werden beibehalten. Ältere Versionen von pkg haben alle Pakete aufbewahrt. Um diese veralteten Pakete zu entfernen, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg clean
+....
+
+Um alle Pakte aus dem Cache-Verzeichnis zu löschen, geben Sie ein:
+
+[source,bash]
+....
+# pkg clean -a
+....
+
+[[pkgng-set]]
+=== Manipulation der Paket-Metadaten
+
+Bei Software aus der FreeBSD Ports-Sammlung kann es vorkommen, dass die Hauptversionsnummer geändert wird. Dafür hat pkg ein eingebautes Kommando, um die Quelle eines Pakets zu aktualisieren. Dies ist nützlich, wenn zum Beispiel package:lang/php5[] zu package:lang/php53[] umbenannt wurde, damit package:lang/php5[] jetzt die Version `5.4` integrieren kann.
+
+Um die Quelle des Pakets für das obige Beispiel zu ändern, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg set -o lang/php5:lang/php53
+....
+
+Ein weiteres Beispiel: Um package:lang/ruby18[] auf package:lang/ruby19[] zu aktualisieren, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg set -o lang/ruby18:lang/ruby19
+....
+
+In diesem letzten Beispiel wird die Quelle der Bibliotheken von [.filename]#libglut# von package:graphics/libglut[] auf package:graphics/freeglut[] geändert:
+
+[source,bash]
+....
+# pkg set -o graphics/libglut:graphics/freeglut
+....
+
+[NOTE]
+====
+Bei einem Wechsel der Paketquelle ist es notwendig, die Pakete neu zu installieren, welche von dem Paket abhängig sind, das seine Paketquelle geändert hat. Um eine Neuinstallation von abhängigen Paketen zu erzwingen, führen Sie folgenden Befehl aus:
+
+[source,bash]
+....
+# pkg install -Rf graphics/freeglut
+....
+
+====
+
+[[ports-using]]
+== Benutzen der Ports-Sammlung
+
+Die Ports-Sammlung ist eine Reihe von [.filename]##Makefile##s, Patches und Beschreibungen. Die Dateien für den Bau und die Installation von einzelnen Anwendungen unter FreeBSD werden als _Port_ bezeichnet.
+
+In der Voreinstellung wird die Ports-Sammlung im Verzeichnis [.filename]#/usr/ports# gespeichert.
+
+Bevor eine Anwendung aus den Ports erstellt werden kann, muss zuerst die Ports-Sammlung installiert werden. Wenn dies nicht bereits bei der Installation von FreeBSD geschehen ist, benutzen Sie eine der beiden Methoden um sie zu installieren:
+
+[[ports-using-portsnap-method]]
+[.procedure]
+****
+*Procedure: Installation mit Portsnap*
+
+FreeBSDs Basissystem enthält mit Portsnap ein schnelles und benutzerfreundliches Werkzeug zur Installation der Ports-Sammlung und die bevorzugte Wahl für die meisten Benutzer, die noch nicht FreeBSD-CURRENT benutzen. Dieses Programm stellt eine Verbindung zu einem FreeBSD-Server her, überprüft den gesicherten Schlüssel und lädt eine aktuelle Kopie der Ports-Sammlung herunter. Der Schlüssel wird benötigt, um die Integrität der heruntergeladenen Dateien zu untersuchen.
+
+. Laden Sie einen komprimierten Snapshot der Ports-Sammlung in [.filename]#/var/db/portsnap#:
++
+[source,bash]
+....
+# portsnap fetch
+....
++
+. Wenn Sie Portsnap das erste Mal verwenden, müssen Sie den Snapshot nach [.filename]#/usr/ports# extrahieren:
++
+[source,bash]
+....
+# portsnap extract
+....
++
+. Nach dem ersten Einsatz von Portsnap, kann [.filename]#/usr/ports# wie folgt aktualisiert werden:
++
+[source,bash]
+....
+# portsnap fetch
+# portsnap update
+....
++
+Bei der Verwendung von `fetch` können die `extract` oder `update` Operationen nacheinander ausgeführt werden, etwa so:
++
+[source,bash]
+....
+# portsnap fetch update
+....
+****
+
+[[ports-using-subversion-method]]
+[.procedure]
+****
+*Procedure: Installation mit Subversion*
+
+Wird mehr Kontrolle über die Ports-Sammlung benötigt, oder wenn die lokalen Änderungen beibehalten werden sollen, oder Sie FreeBSD-CURRENT benutzen, kann Subversion benutzt werden, um die Ports-Sammlung zu laden. Lesen Sie link:{committers-guide}#subversion-primer/[den Subversion Primer] für eine detaillierte Beschreibung von Subversion.
+
+. Subversion muss installiert sein, bevor die Ports-Sammlung geladen werden kann. Ist eine lokale Kopie der Ports-Sammlung bereits vorhanden, installieren Sie Subversion wie folgt:
++
+[source,bash]
+....
+# cd /usr/ports/devel/subversion
+# make install clean
+....
++
+Wenn keine lokale Kopie der Ports-Sammlung vorhanden ist, oder pkg zur Verwaltung von Paketen benutzt wird, kann Subversion als Paket installiert werden:
++
+[source,bash]
+....
+# pkg install subversion
+....
++
+. Laden Sie eine Kopie der Ports-Sammlung:
++
+[source,bash]
+....
+# svn checkout https://svn.FreeBSD.org/ports/head /usr/ports
+....
++
+. Nach dem erstmaligen checkout mit Subversion kann [.filename]#/usr/ports# wie folgt aktualisiert werden:
++
+[source,bash]
+....
+# svn update /usr/ports
+....
+****
+
+Die Ports-Sammlung enthält eine Reihe von Verzeichnissen, die jeweils eine Softwarekategorie repräsentieren. Jede Kategorie hat für jede einzelne Anwendung ein weiteres Unterverzeichnis. Jedes Unterverzeichnis enthält Dateien, die FreeBSD sagen, wie ein Programm kompiliert und installiert werden muss. Diese Dateien werden auch Port-"Gerüst" genannt. Jedes Port-"Gerüst" beinhaltet die folgenden Dateien und Verzeichnisse:
+
+* [.filename]#Makefile#: enthält Anweisungen, die spezifizieren, wie die Anwendung kompiliert wird und wohin die Komponenten installiert werden sollten.
+* [.filename]#distinfo#: enthält die Namen und die Prüfsummen der Dateien, die heruntergeladen werden müssen, um den Port zu bauen.
+* [.filename]#files#: dieses Verzeichnis enthält Patches, welche das Übersetzen und Installieren der Anwendung unter FreeBSD ermöglichen. Zudem können noch weitere Dateien, die für die Übersetzung des Ports verwendet werden, enthalten sein.
+* [.filename]#pkg-descr#: enthält eine ausführlichere Beschreibung der Anwendung.
+* [.filename]#pkg-plist#: eine Liste aller Dateien, die durch diesen Port installiert werden. Außerdem sind hier Informationen enthalten, die zum Entfernen des Ports benötigt werden.
+
+Einige Ports beinhalten noch [.filename]#pkg-message# oder weitere Dateien, die vom Port-System benutzt werden, um spezielle Situationen zu handhaben. Wenn Sie mehr über diese Dateien oder das Port-System erfahren wollen, lesen Sie das link:{porters-handbook}[FreeBSD Porter's Handbook].
+
+Ein Port enthält nicht den eigentlichen Quellcode, der auch als "Distfile" bekannt ist. Der heruntergeladene Quellcode wird automatisch nach [.filename]#/usr/ports/distfiles# extrahiert.
+
+[[ports-skeleton]]
+=== Ports installieren
+
+Dieser Abschnitt beschreibt die grundlegende Benutzung der Ports-Sammlung, um Software zu installieren oder zu deinstallieren. Eine ausführliche Beschreibung der einzelnen `make`-Targets finden Sie in man:ports[7].
+
+[WARNING]
+====
+
+Stellen Sie sicher, dass die Ports-Sammlung aktuell ist, bevor Sie einen Port kompilieren. Informieren Sie sich vorher zusätzlich unter https://vuxml.FreeBSD.org/[] über mögliche Sicherheitsprobleme des zu installierenden Ports. Alternativ können Sie `pkg audit -F` ausführen, bevor Sie einen neuen Port installieren. Die täglich laufende Sicherheitsprüfung des Systems aktualisiert ebenfalls die Datenbank und prüft installierte Anwendungen auf vorhandene Sicherheitsprobleme. Weitere Informationen finden Sie in man:pkg-audit[8] und man:periodic[8].
+====
+
+Die Benutzung der Ports-Sammlung setzt eine funktionierende Internetverbindung und Superuser-Rechte voraus.
+
+Um einen Port zu installieren, wechseln Sie in das Verzeichnis des Ports, den Sie installieren möchten. Geben Sie dann `make install` am Prompt ein:
+
+[source,bash]
+....
+# cd /usr/ports/sysutils/lsof
+# make install
+>> lsof_4.88D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+>> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
+===> Extracting for lsof-4.88
+...
+[Ausgabe des Auspackens weggelassen]
+...
+>> Checksum OK for lsof_4.88D.freebsd.tar.gz.
+===> Patching for lsof-4.88.d,8
+===> Applying FreeBSD patches for lsof-4.88.d,8
+===> Configuring for lsof-4.88.d,8
+...
+[configure-Ausgabe weggelassen]
+...
+===> Building for lsof-4.88.d,8
+...
+[Ausgabe der Übersetzung weggelassen]
+...
+===> Installing for lsof-4.88.d,8
+...
+[Ausgabe der Installation weggelassen]
+...
+===> Generating temporary packing list
+===> Compressing manual pages for lsof-4.57
+===> Registering installation for lsof-4.57
+===> SECURITY NOTE:
+ This port has installed the following binaries which execute with
+ increased privileges.
+/usr/local/bin/lsof
+#
+....
+
+Da `lsof` eine Anwendung ist, die mit erhöhten Rechten läuft, wird nach der Installation eine Sicherheitswarnung angezeigt. Sobald die Installation abgeschlossen ist, erscheint wieder der Prompt.
+
+Um die Suche nach Kommandos zu beschleunigen, speichern einige Shells eine Liste der verfügbaren Kommandos in den durch die Umgebungsvariable `PATH` gegebenen Verzeichnissen. Benutzer der `tcsh` müssen eventuell `rehash` eintippen, um die neu installierten Kommandos benutzen zu können, ohne den vollständigen Pfad anzugeben. Benutzer der Shell `sh` müssen stattdessen `hash -r` eintippen. Weitere Informationen finden Sie in der Dokumentation der jeweiligen Shell.
+
+Bei der Installation wird ein Arbeitsverzeichnis erstellt, das alle temporären Dateien enthält, die während des Bauvorgangs benötigt werden. Wenn dieses Verzeichnis nach der Installation entfernt wird, spart dies Plattenplatz und minimiert mögliche Probleme bei der Aktualisierung des Ports auf eine neuere Version:
+
+[source,bash]
+....
+# make clean
+===> Cleaning for lsof-4.88.d,8
+#
+....
+
+[NOTE]
+====
+Sie können zwei Schritte sparen, wenn Sie bei der Kompilierung des Ports gleich `make install clean` eingeben.
+====
+
+==== Port Installation anpassen
+
+Einige Ports bieten Optionen, mit denen zusätzliche Funktionen oder Sicherheitsoptionen eingestellt werden können. Beispiele dafür sind package:www/firefox[], package:security/gpgme[] und package:mail/sylpheed-claws[]. Wenn ein Port von anderen Ports abhängig ist und diese über zusätzliche Abhängigkeiten und Optionen verfügen, wird mehrmals ein Menü ausgegeben, wo der Benutzer verschiedene Optionen wählen kann. Um dies zu vermeiden und die Konfiguration in einem Stück zu erledigen, wechseln Sie in das Verzeichnis des Ports und geben Sie `make config-recursive` ein. Führen Sie danach `make install [clean]` aus, um den Port zu kompilieren und zu installieren.
+
+[TIP]
+====
+
+Bei der Verwendung von `config-recursive` wird eine Liste von Ports, die konfiguriert werden, vom Target `all-depends-list` erstellt. Es wird empfohlen, `make config-recursive` so lange auszuführen, bis alle Optionen der abhängigen Ports definiert sind und keine Optionen und Menüs mehr erscheinen. Damit soll sichergestellt werden, dass alle Optionen konfiguriert wurden.
+====
+
+Es gibt diverse Möglichkeiten, dieses Menü nach dem Bau eines Ports erneut aufzurufen, um Optionen zu entfernen, hinzuzufügen oder anzupassen. Sie können beispielsweise mit `cd` in das Verzeichnis des Ports wechseln und dort `make config` eingeben. Eine andere Möglichkeit ist `make showconfig`. Eine weitere Alternative bietet `make rmconfig`, das alle ursprünglich gewählten Optionen zurücksetzt und es Ihnen dadurch ermöglicht, die Konfiguration erneut zu beginnen. Die eben erwähnten Optionen werden ausführlich in man:ports[7] beschrieben.
+
+Die Ports-Sammlung benutzt zum Herunterladen von Dateien man:fetch[3], das diverse Umgebungsvariablen unterstützt. Die Variablen `FTP_PASSIVE_MODE`, `FTP_PROXY` und `FTP_PASSWORD` müssen unter Umständen gesetzt werden, wenn das FreeBSD-System hinter einer Firewall oder einem FTP/HTTP-Proxy arbeitet. Eine vollständige Liste der unterstützten Variablen finden Sie in man:fetch[1].
+
+Benutzer ohne eine ständige Internet-Verbindung können `make fetch` im Verzeichnis [.filename]#/usr/ports# ausführen, um die benötigten Dateien herunterzuladen. Es ist auch möglich, `make fetch` nur in einem Teil des Baums, wie [.filename]#/usr/ports/net#, aufzurufen. Die Dateien von allen abhängigen Ports werden mit diesem Kommando allerdings nicht heruntergeladen. Wenn Sie diese Dateien ebenfalls herunterladen wollen, benutzen Sie stattdessen `make fetch-recursive`.
+
+In einigen seltenen Fällen ist es erforderlich, die benötigten Dateien von einem anderen Ort als den im Port definierten `MASTER_SITES` herunterzuladen. Sie können `MASTER_SITES` mit dem folgenden Kommando überschreiben:
+
+[source,bash]
+....
+# cd /usr/ports/directory
+# make MASTER_SITE_OVERRIDE= \
+ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch
+....
+
+Die Variablen `WRKDIRPREFIX` und `PREFIX` überschreiben das voreingestellte Bau- und Zielverzeichnis. Zum Beispiel:
+
+[source,bash]
+....
+# make WRKDIRPREFIX=/usr/home/example/ports install
+....
+
+Dieses Kommando baut den Port unter [.filename]#/usr/home/example/ports# und installiert ihn unter [.filename]#/usr/local#.
+
+Die Variable `PREFIX` legt das Installations-Verzeichnis fest:
+
+[source,bash]
+....
+# make PREFIX=/usr/home/example/local install
+....
+
+In diesem Beispiel wird der Port unter [.filename]#/usr/ports# gebaut und nach [.filename]#/usr/home/example/local# installiert.
+
+Sie können beide Variablen auch zusammen benutzen:
+
+[source,bash]
+....
+# make WRKDIRPREFIX=../ports PREFIX=../local install
+....
+
+Alternativ können diese Variablen auch als Umgebungsvariablen gesetzt werden. In der Manualpage Ihrer Shell finden Sie Anweisungen, wie Umgebungsvariablen gesetzt werden.
+
+[[ports-removing]]
+=== Entfernen installierter Ports
+
+Installierte Ports können mit `pkg delete` wieder deinstalliert werden. Beispiele für dieses Kommando finden Sie in man:pkg-delete[8].
+
+Alternativ kann `make deinstall` im Verzeichnis des Ports aufgerufen werden:
+
+[source,bash]
+....
+# cd /usr/ports/sysutils/lsof
+# make deinstall
+===> Deinstalling for sysutils/lsof
+===> Deinstalling
+Deinstallation has been requested for the following 1 packages:
+
+ lsof-4.88.d,8
+
+Thee deinstallation will free 229 kB
+[1/1] Deleting lsof-4.88.d,8... done
+....
+
+Es wird empfohlen die Nachrichten zu lesen, die ausgegeben werden, wenn ein Port deinstalliert wird. Wenn der Port noch Anwendungen hat, die von ihm abhängig sind, werdenn diese am Bildschirm angezeigt, aber die Deinstallation wird forgesetzt. In solchen Fällen ist es besser, die Anwendung neu zu installieren, um fehlende Abhängigkeiten zu vermeiden.
+
+[[ports-upgrading]]
+=== Ports aktualisieren
+
+Im Laufe der Zeit stehen neuere Versionen der Software in der Ports-Sammlung zur Verfügung. In diesem Abschnitt wird beschrieben, wie Sie bestimmen, welche Software aktualisiert werden kann und wie das Upgrade durchzuführen ist.
+
+Um festzustellen, ob neuere Versionen der installierten Ports verfügbar sind, stellen Sie sicher, dass die neueste Version der Ports-Sammlung installiert ist. Dies wird in <<ports-using-portsnap-method, "Installation mit Portsnap">> und <<ports-using-subversion-method, "Installation mit Subversion">> beschrieben. Führen Sie unter FreeBSD 10 und neueren Versionen, bzw. auf Systemen die bereits mit pkg arbeiten, den folgenden Befehl aus, um eine Liste der installierten Ports zu erhalten für die eine aktuelle Version existiert:
+
+[source,bash]
+....
+# pkg version -l "<"
+....
+
+Mit FreeBSD 9.__X__ und älteren Versionen kann stattdessen dieser Befehl verwendet werden:
+
+[source,bash]
+....
+# pkg_version -l "<"
+....
+
+[IMPORTANT]
+====
+Lesen Sie zuerst [.filename]#/usr/ports/UPDATING#, bevor Sie einen Port aktualisieren. In dieser Datei werden Probleme und zusätzlich durchzuführende Schritte bei der Aktualisierung einzelner Ports beschrieben. Dazu gehören solche Dinge wie geänderte Dateiformate, verschobene Konfigurationsdateien, aber auch Inkompatibilitäten zu einer Vorgängerversion. Notieren Sie sich alle Anweisungen der Ports, die aktualisiert werden müssen. Folgen Sie den Anweisungen, wenn Sie das Upgrade durchführen.
+====
+
+[[ports-upgrading-tools]]
+==== Werkzeuge für die Aktualisierung und Verwaltung von Ports
+
+Die Ports-Sammlung enthält mehrere Werkzeuge, um die eigentliche Aktualisierung durchzuführen. Jedes hat seine Stärken und Schwächen.
+
+Historisch gesehen verwenden die meisten Installationen entweder Portmaster oder Portupgrade. Synth ist eine neuere Alternative.
+
+[NOTE]
+====
+Es bleibt dem Systemadministrator überlassen, welches dieser Werkzeuge für ein bestimmtes System am besten geeignet ist. Es wird empfohlen, die Daten zu sichern, bevor Sie eines dieser Werkzeuge verwenden.
+====
+
+[[portmaster]]
+==== Ports mit Portmaster aktualisieren
+
+package:ports-mgmt/portmaster[] ist ein sehr kleines Werkzeug zum Aktualisieren von Ports. Es wurde entwickelt, um mit den Werkzeugen aus dem FreeBSD Basissystem zu arbeiten, ohne dabei von anderen Ports oder Datenbanken abhängig zu sein. Sie können das Programm aus der Ports-Sammlung installieren:
+
+[source,bash]
+....
+# cd /usr/ports/ports-mgmt/portmaster
+# make install clean
+....
+
+Portmaster teilt Ports in vier Kategorien ein:
+
+* Root Port: hat keine Abhängigkeiten und andere Ports sind nicht von diesem Port abhängig.
+* Trunk Port: hat keine Abhängigkeiten, aber andere Ports sind von diesem Port abhängig.
+* Branch Port: hat Abhängigkeiten und andere Ports sind von diesem Port abhängig.
+* Leaf Port: hat Abhängigkeiten, aber andere Ports sind nicht von diesem Port abhängig.
+
+Um eine Liste der installierten Ports anzuzeigen und nach neueren Versionen zu suchen, verwenden Sie:
+
+[source,bash]
+....
+# portmaster -L
+===>>> Root ports (No dependencies, not depended on)
+===>>> ispell-3.2.06_18
+===>>> screen-4.0.3
+ ===>>> New version available: screen-4.0.3_1
+===>>> tcpflow-0.21_1
+===>>> 7 root ports
+...
+===>>> Branch ports (Have dependencies, are depended on)
+===>>> apache22-2.2.3
+ ===>>> New version available: apache22-2.2.8
+...
+===>>> Leaf ports (Have dependencies, not depended on)
+===>>> automake-1.9.6_2
+===>>> bash-3.1.17
+ ===>>> New version available: bash-3.2.33
+...
+===>>> 32 leaf ports
+
+===>>> 137 total installed ports
+ ===>>> 83 have new versions available
+....
+
+Um alle installierten Ports zu aktualisieren, verwenden Sie folgenden Befehl:
+
+[source,bash]
+....
+# portmaster -a
+....
+
+[NOTE]
+====
+In der Voreinstellung erzeugt Portmaster eine Sicherheitskopie, bevor ein installierter Port gelöscht wird. Ist die Installation der neuen Version erfolgreich, wird dieses Backup wieder gelöscht. Wollen Sie das Backup lieber manuell löschen, verwenden Sie die Option `-b` beim Aufruf von Portmaster. Durch die Verwendung von `-i` wird Portmaster im interaktiven Modus gestartet und fragt bei jedem zu aktualisierenden Port nach, wie weiter vorgegangen werden soll. Viele weitere Optionen stehen zur Verfügung. Lesen Sie die Manualpage von man:portmaster[8] für weitere Einzelheiten in Bezug auf ihre Nutzung.
+====
+
+Treten während der Aktualisierung Fehler auf, verwenden Sie die Option `-f`, um alle Ports zu aktualisieren beziehungsweise neu zu bauen:
+
+[source,bash]
+....
+# portmaster -af
+....
+
+Portmaster ist auch in der Lage, neue Ports zu installieren, wobei zuvor alle abhängigen Ports aktualisiert werden. Um diese Funktion zu nutzen, geben Sie den Pfad des Ports in der Ports-Sammlung an:
+
+[source,bash]
+....
+# portmaster shells/bash
+....
+
+Weitere Informationen über package:ports-mgmt/portmaster[] finden Sie in der Beschreibung [.filename]#pkg-descr#.
+
+[[portupgrade]]
+==== Ports mit Portupgrade aktualisieren
+
+package:ports-mgmt/portupgrade[] ist ein weiteres Werkzeug zur Aktualisierung von Ports. Es installiert eine Reihe von Anwendungen, die für die Verwaltung von Ports verwendet werden können. Das Programm ist jedoch von Ruby abhängig. Um den Port zu installieren, geben Sie ein:
+
+[source,bash]
+....
+# cd /usr/ports/ports-mgmt/portupgrade
+# make install clean
+....
+
+Durchsuchen Sie vor jedem Update die Liste der installierten Ports mit `pkgdb -F` und beheben Sie alle gefundenen Probleme.
+
+Benutzen Sie `portupgrade -a`, um automatisch alle veralteten Ports auf dem System zu aktualisieren. Verwenden Sie zusätzlich den Schalter `-i`, wenn Sie individuell entscheiden wollen, ob ein Port aktualisiert werden soll:
+
+[source,bash]
+....
+# portupgrade -ai
+....
+
+Um nur eine spezifische Anwendung zu aktualisieren, verwenden Sie `portupgrade _Paketname_`. Es ist wichtig den Schalter `-R` zu benutzen, um zuvor alle Ports zu aktualisieren, die von dem gegebenen Anwendung abhängen.
+
+[source,bash]
+....
+# portupgrade -R firefox
+....
+
+Um Pakete anstelle von Ports zu installieren, verwenden Sie den Schalter `-P`. Mit dieser Option durchsucht Portupgrade die in der Umgebungsvariablen `PKG_PATH` aufgeführten Verzeichnisse nach Paketen. Sind lokal keine Pakete vorhanden, versucht Portupgrade die Pakete über das Netz herunterzuladen. Gibt es die Pakete weder lokal noch auf entfernten Rechnern, werden die Ports verwendet. Um die Nutzung von Ports gänzlich zu verhindern, benutzen Sie die Option `-PP`. Portupgrade würde dann abbrechen, falls keine Pakete zur Verfügung stehen.
+
+[source,bash]
+....
+# portupgrade -PP gnome3
+....
+
+Wenn Sie nur die Quelldateien des Ports, oder die Pakete mit `-P` herunterladen möchten, ohne die Anwendung zu bauen oder zu installieren, geben Sie den Schalter `-F` an. Weitere Informationen zu den verfügbaren Schaltern finden Sie in der Manualpage von man:portupgrade[1].
+
+Weitere Informationen über package:ports-mgmt/portupgrade[] finden Sie in der Beschreibung [.filename]#pkg-descr#.
+
+[[ports-disk-space]]
+=== Platzbedarf von Ports
+
+Die Nutzung der Ports-Sammlung wird im Laufe der Zeit viel Plattenplatz verschlingen. Nach dem Bau und der Installation eines Ports, wird `make clean` die temporären Arbeitsverzeichnisse [.filename]#work# aufräumen. Portmaster wird dieses Verzeichnis nach der Installation eines Ports automatisch entfernen (es sei denn, die Option `-K` wird verwendet). Wenn Portupgrade installiert ist, wird der folgende Befehl alle Arbeitsverzeichnisse der lokalen Ports-Sammlung entfernen:
+
+[source,bash]
+....
+# portsclean -C
+....
+
+Zusätzlich werden sich im Laufe der Zeit zahlreiche veraltete Distfiles in [.filename]#/usr/ports/distfiles# ansammeln. Mit Portupgrade können alle Distfiles gelöscht werden, die vom keinem Port mehr benötigt werden:
+
+[source,bash]
+....
+# portsclean -D
+....
+
+Portupgrade kann alle Distfiles löschen, die von keinem derzeit installierten Port benötigt werden:
+
+[source,bash]
+....
+# portsclean -DD
+....
+
+Wenn Portmaster installiert ist, benutzen Sie diesen Befehl:
+
+[source,bash]
+....
+# portmaster --clean-distfiles
+....
+
+In der Voreinstellung arbeitet dieses Programm interaktiv und fragt den Benutzer um Bestätigung, bevor ein Distfile gelöscht wird.
+
+Zusätzlich zu diesen Kommandos gibt es noch package:port-mgmt/pkg_cutleaves[]. Dieses Werkzeug automatisiert die Deinstallation von installierten Ports, die nicht weiter benötigt werden.
+
+[[ports-poudriere]]
+== Pakete mit Poudriere bauen
+
+Poudriere ist ein unter der BSD-Lizenz stehendes Werkzeug zum Erstellen und Testen von FreeBSD-Paketen. Dieses Programm nutzt FreeBSD Jails, um die Pakete in einer isolierten Umgebung zu bauen. Diese Jails können verwendet werden, um Pakete für andere Versionen von FreeBSD zu bauen, oder um auf einem amd64-System Pakete für i386 zu bauen. Sobald die Pakete gebaut sind, haben sie das gleiche Format wie auf den offiziellen Spiegeln. Die Pakete können dann mit man:pkg[8] oder anderen Paketverwaltungswerkzeugen benutzt werden.
+
+Poudriere wird über das Paket oder den Port package:ports-mgmt/poudriere[] installiert. Die Installation beinhaltet eine Beispielkonfiguration in [.filename]#/usr/local/etc/poudriere.conf.sample#. Kopieren Sie diese Datei nach [.filename]#/usr/local/etc/poudriere.conf#. Bearbeiten Sie dann die kopierte Datei, um die Konfiguration anzupassen.
+
+Obwohl ZFS für poudriere nicht zwingend erforderlich ist, so hat die Nutzung doch einige Vorteile. Wird ZFS eingesetzt, muss in [.filename]#/usr/local/etc/poudriere.conf# die Variable `ZPOOL` definiert, und die Variable `FREEBSD_HOST` auf einen nahe gelegenen Spiegel gesetzt werden. Die Definition von `CCACHE_DIR` erlaubt die Verwendung von package:devel/ccache[], um die Bauzeit für häufig kompilierten Code verkürzen. Es kann vorteilhaft sein, die poudriere-Datasets in einem separaten Verzeichnis auf [.filename]#/poudriere# einzuhängen. Die Werte der anderen Konfigurationsvariablen sind in der Regel angemessen und brauchen nicht geändert werden.
+
+Die Anzahl der Kerne im Prozessor wird verwendet um zu bestimmen, wie viele Bauprozesse parallel ausgeführt werden. Stellen Sie ausreichend virtuellen Speicher bereit, entweder in Form von RAM oder als Swap-Speicher. Ist der virtuelle Speicher aufgebraucht, bricht der Bauprozess ab und die Jails stürzen ab, was zu seltsamen Fehlermeldungen führt.
+
+[[poudriere-initialization]]
+=== Jails und Ports-Sammlung initialisieren
+
+Nach der Konfiguration muss poudriere initialisiert werden, damit es eine Jail mit der benötigten Ports-Sammlung startet. Geben Sie mit `-j` den Namen der Jail und mit `-v` die gewünschte FreeBSD-Version an. Auf FreeBSD/amd64-Systemen kann die Architektur mit dem Schalter `-a` und `i386` oder `amd64` gesetzt werden. Der voreingestellte Wert für die Architektur können Sie sich mit `uname` anzeigen lassen.
+
+[source,bash]
+....
+# poudriere jail -c -j 11amd64 -v 11.4-RELEASE
+[00:00:00] Creating 11amd64 fs at /poudriere/jails/11amd64... done
+[00:00:00] Using pre-distributed MANIFEST for FreeBSD 11.4-RELEASE amd64
+[00:00:00] Fetching base for FreeBSD 11.4-RELEASE amd64
+/poudriere/jails/11amd64/fromftp/base.txz 125 MB 4110 kBps 31s
+[00:00:33] Extracting base... done
+[00:00:54] Fetching src for FreeBSD 11.4-RELEASE amd64
+/poudriere/jails/11amd64/fromftp/src.txz 154 MB 4178 kBps 38s
+[00:01:33] Extracting src... done
+[00:02:31] Fetching lib32 for FreeBSD 11.4-RELEASE amd64
+/poudriere/jails/11amd64/fromftp/lib32.txz 24 MB 3969 kBps 06s
+[00:02:38] Extracting lib32... done
+[00:02:42] Cleaning up... done
+[00:02:42] Recording filesystem state for clean... done
+[00:02:42] Upgrading using ftp
+/etc/resolv.conf -> /poudriere/jails/11amd64/etc/resolv.conf
+Looking up update.FreeBSD.org mirrors... 3 mirrors found.
+Fetching public key from update4.freebsd.org... done.
+Fetching metadata signature for 11.4-RELEASE from update4.freebsd.org... done.
+Fetching metadata index... done.
+Fetching 2 metadata files... done.
+Inspecting system... done.
+Preparing to download files... done.
+Fetching 124 patches.....10....20....30....40....50....60....70....80....90....100....110....120.. done.
+Applying patches... done.
+Fetching 6 files... done.
+The following files will be added as part of updating to
+11.4-RELEASE-p1:
+/usr/src/contrib/unbound/.github
+/usr/src/contrib/unbound/.github/FUNDING.yml
+/usr/src/contrib/unbound/contrib/drop2rpz
+/usr/src/contrib/unbound/contrib/unbound_portable.service.in
+/usr/src/contrib/unbound/services/rpz.c
+/usr/src/contrib/unbound/services/rpz.h
+/usr/src/lib/libc/tests/gen/spawnp_enoexec.sh
+The following files will be updated as part of updating to
+11.4-RELEASE-p1:
+[…]
+Installing updates...Scanning //usr/shared/certs/blacklisted for certificates...
+Scanning //usr/shared/certs/trusted for certificates...
+ done.
+11.4-RELEASE-p1
+[00:04:06] Recording filesystem state for clean... done
+[00:04:07] Jail 11amd64 11.4-RELEASE-p1 amd64 is ready to be used
+....
+
+[source,bash]
+....
+# poudriere ports -c -p local -m svn+https
+[00:00:00] Creating local fs at /poudriere/ports/local... done
+[00:00:00] Checking out the ports tree... done
+....
+
+poudriere kann auf einem einzelnen Rechner Ports mit mehreren Konfigurationen bauen, in mehreren Jails und aus unterschiedlichen Ports-Sammlungen. Spezifische Konfigurationen für diese Kombinationen werden _Sets_ genannt. Lesen Sie den Abschnitt CUSTOMIZATION in man:poudriere[8] für weitere Einzelheiten nach der Installation von package:port-mgmt/poudriere[] oder package:ports-mgmt/poudriere-devel[].
+
+Die hier gezeigte Konfiguration verwendet eine einzelne Jail-, Port- und Set-spezifische [.filename]#make.conf# in [.filename]#/usr/local/etc/poudriere.d#. Der verwendete Dateiname in diesem Beispiel wird aus einer Kombination von Jailnamen, Portnamen und Setnamen zusammen gesetzt: [.filename]#11amd64-local-workstation-make.conf#. Die [.filename]#make.conf# des Systems und diese neue Datei werden verwendet, um die [.filename]#make.conf# für die Jail zu erzeugen.
+
+Die zu bauenden Pakete werden in [.filename]#11amd64-local-workstation-pkglist# eingetragen:
+
+[.programlisting]
+....
+editors/emacs
+devel/git
+ports-mgmt/pkg
+...
+....
+
+Die Optionen und Abhängigkeiten für die Ports werden wie folgt konfiguriert:
+
+[source,bash]
+....
+# poudriere options -j 11amd64 -p local -z workstation -f 11amd64-local-workstation-pkglist
+....
+
+Schließlich werden die Pakete gebaut und ein Paket-Repository erstellt:
+
+[source,bash]
+....
+# poudriere bulk -j 11amd64 -p local -z workstation -f 11amd64-local-workstation-pkglist
+....
+
+Während der Ausführung zeigt kbd:[Ctrl+t] den aktuellen Status des Baus an. Poudriere speichert zudem Dateien in [.filename]#/poudriere/logs/bulk/jailname#. Diese Dateien kann ein Webserver nutzen, um Informationen über den Bau anzuzeigen.
+
+Nach der Fertigstellung stehen die Pakete im poudriere Repository für die Installation zur Verfügung.
+
+Weitere Informationen zu poudriere finden Sie in man:poudriere[8] und unter https://github.com/freebsd/poudriere/wiki[].
+
+=== Konfiguration des pkg-Clients für das Poudriere Repository
+
+Obwohl es möglich ist ein eigenes Repository zusammen mit dem offiziellen Repository zu nutzen, ist es manchmal sinnvoll das offizielle Repository zu deaktivieren. Dazu wird eine Konfigurationsdatei erstellt, welche die offizielle Konfigurationsdatei überschreibt. Erzeugen Sie dazu [.filename]#/usr/local/etc/pkg/repos/FreeBSD.conf# mit dem folgenden Inhalt:
+
+[.programlisting]
+....
+FreeBSD: {
+ enabled: no
+}
+....
+
+Am einfachsten ist es, das poudriere Repository über HTTP zur Verfügung zu stellen. Setzen Sie einen Webserver auf, der die Dateien des Paketverzeichnisses ausliefert, zum Beispiel [.filename]#/usr/local/poudriere/data/packages/11amd64#. [.filename]#11amd64# bezeichnet dabei den Namen des Baus.
+
+Wenn die URL des Paket Repositories `http://pkg.example.com/11amd64` ist, dann sollte die Konfiguration des Repositories in [.filename]#/usr/local/etc/pkg/repos/custom.conf# wie folgt aussehen:
+
+[.programlisting]
+....
+custom: {
+ url: "http://pkg.example.com/11amd64",
+ enabled: yes,
+}
+....
+
+[[ports-nextsteps]]
+== Nach der Installation
+
+Unabhängig davon, ob die Software aus einem binären Paket oder aus einem Port installiert wird, benötigen die meisten Anwendungen von Drittanbietern ein gewisses Maß an Konfiguration, nachdem sie installiert wurden. Die folgenden Kommandos und Speicherorte helfen Ihnen dabei festzustellen, was mit der Anwendung zusammen installiert wurde.
+
+* Die meisten Anwendungen installieren mindestens eine Konfigurationsdatei nach [.filename]#/usr/local/etc#. Falls die Anwendung viele Konfigurationsdateien enthält, wird ein Unterverzeichnis erstellt um die Dateien zu speichern. Oft werden die Konfigurationsdateien mit einem Suffix wie beispielsweise [.filename]#.sample# installiert. Die Konfigurationsdateien sollten überprüft und ggf. bearbeitet werden, um die Anforderungen des Systems zu erfüllen. Um eine Konfigurationsdatei zu bearbeiten, kopieren Sie diese zunächst ohne die Erweiterung [.filename]#.sample#.
+* Wenn die Anwendung Dokumentation zur Verfügung stellt, wird diese nach [.filename]#/usr/local/shared/doc# installiert. Viele Anwendungen installieren auch Manualpages. Diese Dokumentation sollten Sie lesen, bevor Sie fortfahren.
+* Einige Anwendungen laufen als Dienst und müssen vor dem ersten Start in [.filename]#/etc/rc.conf# eingetragen werden. Diese Anwendungen installieren meist ein Skript in [.filename]#/usr/local/etc/rc.d#. Weitere Informationen finden Sie im crossref:config[configtuning-starting-services,Start von Diensten].
++
+[NOTE]
+====
+In der Voreinstellung führen Anwendungen weder ihr Startskript bei der Installation aus, noch führen sie ihr Stopskript während der Deinstallation aus. Diese Entscheidung bleibt dem einzelnen Systemadministrator überlassen.
+====
+
+* Benutzer der man:csh[1] sollten `rehash` ausführen, um die neu installierten Programme nutzen zu können.
+* Benutzen Sie `pkg info`, um die Dateien, Manualpages und Binaries zu ermitteln, die mit der Anwendung installiert wurden.
+
+[[ports-broken]]
+== Kaputte Ports
+
+Wenn sich ein Port nicht bauen oder installieren lässt, versuchen Sie folgendes:
+
+. Stellen Sie fest, ob die link:https://www.FreeBSD.org/de/support/[Datenbank mit den Problemberichten] bereits einen Lösungsvorschlag enthält. Ist dies der Fall, kann die vorgeschlagene Lösung getestet werden.
+. Bitten Sie den Betreuer des Ports um Hilfe. Geben Sie dazu `make maintainer` ein oder lesen Sie das [.filename]#Makefile# im Verzeichnis des Ports, um an die E-Mail-Adresse zu kommen. Vergessen Sie nicht die Zeile mit `$FreeBSD:` aus dem [.filename]#Makefile# und die Ausgabe bis zur Fehlermeldung mitzuschicken.
++
+[NOTE]
+====
+Einige Ports werden nicht von einer Einzelperson, sondern von einer link:{mailing-list-faq}[Mailingliste] betreut. Viele (aber nicht alle) dieser Adressen haben die Form mailto:freebsd-NameDerListe@FreeBSD.org[freebsd-NameDerListe@FreeBSD.org]. Denken Sie daran, wenn Sie Ihre Fragen formulieren.
+
+Dies gilt insbesondere für Ports, die von mailto:ports@FreeBSD.org[ports@FreeBSD.org] betreut werden. Derartige Ports haben überhaupt keinen Betreuer. Korrekturen und Unterstützung kommen daher nur von Personen, die diese Mailingliste abonniert haben. Gerade in diesem Bereich werden jederzeit zusätzliche freiwillige Helfer benötigt!
+====
++
+Erhalten Sie auf Ihre Anfrage keine Antwort, benutzen Sie Bugzilla, um einen Problembericht zu erstellen. Bevor Sie einen solchen Bericht erstellen, lesen Sie den Artikel link:{problem-reports}[Writing FreeBSD Problem Reports].
+. Reparieren Sie ihn! Das link:{porters-handbook}[FreeBSD Porter's Handbook] enthält eine detaillierte Beschreibung des Portsystems. Damit sind Sie in der Lage, einen zeitweilig kaputten Port zu reparieren oder einen eigenen Port zu erstellen.
+. Installieren Sie das Paket anstelle des Ports. Anweisungen hierzu finden Sie in <<pkgng-intro>>.
diff --git a/documentation/content/de/books/handbook/ppp-and-slip/_index.adoc b/documentation/content/de/books/handbook/ppp-and-slip/_index.adoc
new file mode 100644
index 0000000000..c9187ccf58
--- /dev/null
+++ b/documentation/content/de/books/handbook/ppp-and-slip/_index.adoc
@@ -0,0 +1,833 @@
+---
+title: Kapitel 27. PPP
+part: Teil IV. Netzwerke
+prev: books/handbook/serialcomms
+next: books/handbook/mail
+---
+
+[[ppp-and-slip]]
+= PPP
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 27
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/ppp-and-slip/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/ppp-and-slip/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/ppp-and-slip/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[ppp-and-slip-synopsis]]
+== Übersicht
+
+FreeBSD unterstützt das Point-to-Point (PPP) Protokoll, mit dem über ein Modem eine Verbindung mit einem Netzwerk oder dem Internet hergestellt werden kann. Dieses Kapitel beschreibt die Konfiguration von Modem-basierten Kommunikationsdiensten unter FreeBSD.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie wissen:
+
+* Wie Sie PPP einrichten, benutzen, sowie Fehler beheben.
+* Was zu tun ist, um PPP over Ethernet (PPPoE) einzurichten.
+* Wie Sie PPP over ATM (PPPoA) einrichten.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie:
+
+* Mit den grundlegenden Begriffen der Netzwerktechnik vertraut sein.
+* Die Grundlagen und den Zweck einer Einwahlverbindung sowie PPP kennen.
+
+[[userppp]]
+== PPP konfigurieren
+
+FreeBSD enthält man:ppp[8], um Einwählverbindungen über PPP zu verwalten. Der FreeBSD-Kernel enthält Unterstützung für die [.filename]#tun#-Schnittstelle, die benutzt wird um mit einem Modem zu interagieren. Für die Konfiguration muss mindestens eine Datei bearbeitet werden. Beispiele sind in den Konfigurationsdateien ebenfalls enthalten. Schlussendlich wird `ppp` benutzt, um die Verbindungen zu starten und zu verwalten.
+
+Für eine PPP-Verbindung sind folgende Dinge erforderlich:
+
+* Ein Account bei einem Internet Service Provider (ISP).
+* Ein Modem.
+* Die Einwahlnummer(n) des ISPs.
+* Den Login-Namen und das Passwort, welches vom ISP zugewiesen wurde.
+* Die IP-Adresse von einem oder mehreren DNSServern. Üblicherweise werden diese Daten vom ISP zur Verfügung gestellt. Falls dies nicht der Fall ist, können Sie FreeBSD so konfigurieren, das es die DNS-Daten automatisch aushandeln kann.
+
+Sollte eine dieser Informationen fehlen, kontaktieren Sie den ISP!
+
+Die folgenden Informationen werden möglicherweise durch den ISP zur Verfügung gestellt, sie sind aber nicht zwingend erforderlich:
+
+* Die IP-Adresse des Standard-Gateways. Steht diese Information nicht zur Verfügung, wird der PPP-Server des ISPs beim Verbindungsaufbau eine gültige Adresse übermitteln. Diese Adresse wird in der Konfiguration von PPP unter FreeBSD als `HISADDR` bezeichnet.
+* Die Netzmaske. Falls der ISP keine Netzmaske vorgegeben hat, können Sie in der Konfigurationsdatei von man:ppp[8] `255.255.255.255` verwenden.
+*
++
+Wenn der ISP eine statische IP-Adresse und einen Rechnernamen zugewiesen hat, sollten diese Informationen in die Konfigurationsdatei eingetragen werden. Andernfalls werden diese Informationen automatisch beim Verbindungsaufbau zur Verfügung gestellt.
+
+Der Rest dieses Abschnitts beschreibt, wie FreeBSD für gebräuchliche PPP-Verbindungsszenarien konfiguriert wird. Die erforderliche Konfigurationsdatei ist [.filename]#/etc/ppp/ppp.conf#. Zusätzliche Dateien und Beispiele sind in [.filename]#/usr/shared/examples/ppp/# verfügbar.
+
+[NOTE]
+====
+Die Beispieldateien, die in diesem Kapitel dargestellt werden, enthalten Zeilennummern. Die Nummerierung dient lediglich einer leichteren Orientierung und sollte nicht in die Dateien übernommen werden.
+
+Achten Sie auf die richtige Einrückung, wenn Sie eine Konfigurationsdatei bearbeiten. Zeilen die mit einem `:` enden, beginnen in der ersten Spalte (am Beginn der Zeile). Alle anderen Zeilen sollten wie dargestellt durch Leerzeichen oder Tabulatoren eingerückt werden.
+====
+
+[[userppp-staticIP]]
+=== Grundlegende Konfiguration
+
+Um eine PPP-Verbindung zu konfigurieren, tragen Sie zuerst die Zugangsdaten des ISPs in [.filename]#/etc/ppp/ppp.conf# ein. Diese Datei wird wie folgt beschrieben:
+
+[.programlisting]
+....
+1 default:
+2 set log Phase Chat LCP IPCP CCP tun command
+3 ident user-ppp VERSION
+4 set device /dev/cuau0
+5 set speed 115200
+6 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
+7 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
+8 set timeout 180
+9 enable dns
+10
+11 provider:
+12 set phone "(123) 456 7890"
+13 set authname foo
+14 set authkey bar
+15 set timeout 300
+16 set ifaddr x.x.x.x/0 y.y.y.y/0 255.255.255.255 0.0.0.0
+17 add default HISADDR
+....
+
+Zeile 1:::
+Gibt den Standardeintrag an. Befehle dieses Eintrags (Zeile 2 bis 9) werden automatisch ausgeführt, wenn `ppp` läuft.
+
+Zeile 2:::
+Schaltet die ausführliche Protokollierung ein. Sobald die Verbindung zufriedenstellend funktioniert, können Sie diese Zeile verkürzen:
++
+[.programlisting]
+....
+set log phase tun
+....
++
+Dies verhindert ein übermäßiges Anwachsen der Logdateien.
+
+Zeile 3:::
+Übermittelt die Version von man:ppp[8] an die PPP-Software der Gegenstelle.
+
+Zeile 4:::
+Gibt das Device an, an dem das Modem angeschlossen ist. [.filename]#COM1# entspricht [.filename]#/dev/cuad0# und [.filename]#COM2# entspricht [.filename]#/dev/cuad1#.
+
+Zeile 5:::
+Legt die Verbindungsgeschwindigkeit fest. Falls ein Wert von `115200` bei älteren Modems nicht funktioniert, versuchen Sie es stattdessen mit `38400`.
+
+Zeile 6 & 7:::
+Die Zeichenfolge für die Einwahl in einer expect-send Syntax. Weitere Informationen finden Sie in man:chat[8].
++
+Beachten Sie, dass dieser Befehl aufgrund der besseren Lesbarkeit auf der nächsten Zeile weitergeht. Das kann für jeden Befehl in [.filename]#ppp.conf# gelten, wenn `\` das letzte Zeichen in einer Zeile ist.
+
+Zeile 8:::
+Legt den Zeitrahmen in Sekunden fest, innerhalb dessen eine Reaktion erfolgen muss.
+
+Zeile 9:::
+Weist die Gegenstelle an, die DNS-Einstellungen zu bestätigen. Wenn es im lokalen Netzwerk einen DNS-Server gibt, sollte diese Zeile auskommentiert oder gelöscht werden.
+
+Zeile 10:::
+Eine leere Zeile zur besseren Lesbarkeit. Leere Zeilen werden von man:ppp[8] ignoriert.
+
+Zeile 11:::
+Bestimmt einen Provider, namens `provider`. Wenn Sie hier den Namen des ISP einsetzen, können Sie später die Verbindung mit `load _ISP_` aufbauen.
+
+Zeile 12:::
+Gibt die Telefonnummer des Providers an. Mehrere Telefonnummern können angegeben werden, indem Doppelpunkte (`:`) oder Pipe-Zeichen (`|`) als Trennzeichen verwendet werden. Wenn Sie die verschiedenen Nummern abwechselnd verwenden möchten, sollten Sie die Nummern durch einen Doppelpunkt trennen. Wenn Sie immer die erste Nummer verwenden möchten und die anderen nur zum Einsatz kommen sollen, wenn eine Einwahl mit der ersten Telefonnummer nicht möglich ist, sollten Sie das Pipe-Zeichen zur Trennung verwenden. Sie sollten immer die gesamte Reihe der Telefonnummern in Anführungszeichen (`"`) setzen, um Wählfehler zu vermeiden.
+
+Zeile 13 & 14:::
+Gibt den Benutzernamen und das Passwort für den ISP an.
+
+Zeile 15:::
+Setzt einen Zeitrahmen in Sekunden, innerhalb dessen eine Reaktion erfolgen muss. In diesem Fall, wird die Verbindung nach 300 Sekunden automatisch geschlossen, wenn keine Aktivität zu verzeichnen ist. Wenn Sie keinen Zeitrahmen festlegen wollen, nach dessen Überschreiten die Verbindung geschlossen wird, können Sie diesen Wert auf `0` setzen.
+
+Zeile 16:::
+Legt die Adresse für die Schnittstelle fest. Die verwendeten Werte hängen davon ab, ob Sie vom ISP eine statische IP-Adresse zugeteilt bekommen haben, oder ob beim Verbindungsaufbau eine dynamische Adresse ausgehandelt wird.
++
+Wenn Ihnen der ISP keine statische IP-Adresse zugeteilt hat, ändern Sie diese Zeile auf den folgenden Wert. Dadurch weiß man:ppp[8], dass es das IP Configuration Protocol (IPCP) benutzen soll um die dynamische IP-Adresse auszuhandeln.
++
+[.programlisting]
+....
+set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255 0.0.0.0
+....
+
+Zeile 17:::
+Fügt eine Defaultroute für das Gateway hinzu. Belassen Sie die Zeile so wie sie ist. `HISADDR` wird dabei durch die in Zeile 16 angegebene Gateway-Adresse ersetzt. Wichtig ist, dass diese Zeile nach Zeile 16 erscheint.
+
+Je nachdem, ob man:ppp[8] manuell oder automatisch gestartet wird, muss vielleicht auch [.filename]#/etc/ppp/ppp.linkup# mit dem folgenden Inhalt erstellt werden. Diese Datei ist erforderlich, falls `ppp` im `-auto`-Modus ausgefürht wird. Die Datei wird verwendet, nachdem die Verbindung hergestellt wurde. An diesem Punkt wird die IP-Adresse zugewiesen und es sollte nun möglich sein, Einträge in die Routingtabelle hinzuzufügen. Stellen Sie bei der Bearbeitung der Datei sicher, dass der Eintrag für _provider_ mit dem Wert aus Zeile 11 in [.filename]#ppp.conf# übereinstimmt.
+
+[.programlisting]
+....
+provider:
+ add default HISADDR
+....
+
+Diese Datei wird ebenfalls benötigt, wenn bei einer Konfiguration mit statischer IP-Adresse die Adresse des Standard-Gateways "erraten" wird. In solchen Fällen entfernen Sie Zeile 17 aus [.filename]#ppp.conf# und erstellen Sie [.filename]#/etc/ppp/ppp.linkup# mit den oben genannten Zeilen. Weitere Beispiele für diese Datei finden Sie in [.filename]#/usr/shared/examples/ppp/#.
+
+In der Voreinstellung muss `ppp` als `root` ausgeführt werden. Um diesen Standard zu ändern, muss das Konto eines Benutzers, der `ppp` ausführen soll, zur Gruppe `network` in [.filename]#/etc/group# hinzugefügt werden.
+
+Danach geben Sie dem Benutzer ebenfalls Zugriff auf einen oder mehrere Abschnitte der Konfigurationsdatei [.filename]#/etc/ppp/ppp.conf# geben müssen, indem Sie den `allow` Befehl verwenden. Um beispielsweise den Benutzern `fred` und `mary` die Berechtigung für den Eintrag `provider:` zu geben, fügen Sie in der Sektion `provider` folgende Zeile ein:
+
+[.programlisting]
+....
+allow users fred mary
+....
+
+Wenn dieser Befehl stattdessen in der Sektion `default` verwendet wird, erhalten die angegebenen Benutzer vollständigen Zugriff.
+
+=== Fortgeschrittene Konfiguration
+
+Es ist möglich PPP so zu konfigurieren, dass bei Bedarf DNS und NetBIOS Nameserveradressen bereitgestellt werden.
+
+Um diese Erweiterungen für die PPP Version 1.x zu aktivieren, sollte der entsprechende Abschnitt der Datei [.filename]#/etc/ppp/ppp.conf# um folgende Zeilen ergänzt werden:
+
+[.programlisting]
+....
+enable msext
+set ns 203.14.100.1 203.14.100.2
+set nbns 203.14.100.5
+....
+
+Für PPP Version 2 und höher:
+
+[.programlisting]
+....
+accept dns
+set dns 203.14.100.1 203.14.100.2
+set nbns 203.14.100.5
+....
+
+Damit werden den Clients die primären und sekundären Nameserveradressen sowie ein NetBIOS Nameserver-Host mitgeteilt.
+
+In Version 2 und höher verwendet PPP die Werte, die in [.filename]#/etc/resolv.conf# zu finden sind, wenn die Zeile `set dns` weggelassen wird.
+
+[[userppp-PAPnCHAP]]
+==== Authentifizierung durch PAP und CHAP
+
+Einige ISPs haben ihr System so eingerichtet, dass der Authentifizierungsteil eines Verbindungsaufbaus mit Hilfe von PAP oder CHAP-Mechanismen durchgeführt wird. Wenn das der Fall sein sollte, wird der ISP bei der Verbindung keinen `login:`-Prompt präsentieren, sondern sofort mit der Aushandlung der PPP-Verbindung beginnen.
+
+PAP ist nicht so sicher wie CHAP, doch die Sicherheit ist hierbei normalerweise kein Problem, da Passwörter, obgleich von PAP im Klartext versandt, lediglich über die serielle Verbindung verschickt werden. Es gibt für Angreifer wenig Möglichkeiten zu "lauschen".
+
+Die folgenden Veränderungen müssen vorgenommen werden:
+
+[.programlisting]
+....
+13 set authname MyUserName
+14 set authkey MyPassword
+15 set login
+....
+
+Zeile 13:::
+Diese Zeile legt den PAP/CHAP Benutzernamen fest. Sie müssen den richtigen Wert für _MyUserName_ eingeben.
+
+Zeile 14:::
+Diese Zeile legt das PAP/CHAP Passwort fest. Sie müssen den richtigen Wert für _MyPassword_ eingeben. Sie können eine zusätzliche Zeile, wie etwa:
++
+[.programlisting]
+....
+16 accept PAP
+....
++
+oder
++
+[.programlisting]
+....
+16 accept CHAP
+....
++
+verwenden, um deutlich zu machen, dass dies beabsichtigt ist, aber sowohl PAP wie auch CHAP als standardmäßig akzeptiert werden.
+
+Zeile 15:::
+Der ISP wird normalerweise keine Anmeldung am Server verlangen, wenn PAP oder CHAP verwendet wird. Sie müssen deshalb den String "set login" deaktivieren.
+
+[[userppp-nat]]
+==== PPP NAT benutzen
+
+PPP kann Network Address Translation (NAT) ohne Hilfe des Kernels durchführen. Wenn Sie diese Funktion benutzen wollen, fügen Sie die folgende Zeile in [.filename]#/etc/ppp/ppp.conf# ein:
+
+[.programlisting]
+....
+nat enable yes
+....
+
+NAT kann mit der Option `-nat` auf der Kommandozeile aktiviert werden. Weiterhin kann NAT in [.filename]#/etc/rc.conf# mit der Variablen `ppp_nat` aktiviert werden. Dies ist auch die Voreinstellung.
+
+Die nachstehende [.filename]#/etc/ppp/ppp.conf# benutzt NAT für bestimmte eingehende Verbindungen:
+
+[.programlisting]
+....
+nat port tcp 10.0.0.2:ftp ftp
+nat port tcp 10.0.0.2:http http
+....
+
+Wenn Sie Verbindungen von außen überhaupt nicht trauen, benutzen Sie die folgende Zeile:
+
+[.programlisting]
+....
+nat deny_incoming yes
+....
+
+[[userppp-final]]
+=== Abschließende Systemkonfiguration
+
+Obwohl `ppp` nun konfiguriert ist, müssen noch einige Änderungen in [.filename]#/etc/rc.conf# vorgenommen werden.
+
+Gehen Sie diese Datei von oben nach unten durch, und stellen Sie als Erstes sicher, dass die Zeile `hostname=` vorhanden ist:
+
+[.programlisting]
+....
+hostname="foo.example.com"
+....
+
+Wenn der ISP eine statische IP-Adresse und einen Namen zugewiesen hat, verwenden Sie diesen Namen als Hostnamen.
+
+Schauen Sie nach der Variable `network_interfaces`. Wenn Sie das System so konfigurieren möchten, dass es bei Bedarf eine Verbindung zum ISP aufbaut, sollten Sie das Gerät [.filename]#tun0# zu der Liste hinzufügen oder es andernfalls entfernen.
+
+[.programlisting]
+....
+network_interfaces="lo0 tun0"
+ifconfig_tun0=
+....
+
+[NOTE]
+====
+Die Variable `ifconfig_tun0` sollte leer sein und eine Datei namens [.filename]#/etc/start_if.tun0# sollte erstellt werden. Diese Datei sollte die nachfolgende Zeile enthalten:
+
+[.programlisting]
+....
+ppp -auto mysystem
+....
+
+Dieses Skript startet den ppp-Daemon im Automatik-Modus. Es wird bei der Netzwerkkonfiguration ausgeführt. Wenn der Rechner als Gateway für ein LAN fungiert, möchten Sie vielleicht auch die Option `-alias` verwenden. In der Manualpage sind weitere Einzelheiten zu finden.
+====
+
+Stellen Sie sicher, dass der Start eines Routerprogramms in [.filename]#/etc/rc.conf# wie folgt deaktiviert ist:
+
+[.programlisting]
+....
+router_enable="NO"
+....
+
+Es ist wichtig, dass der `routed`-Daemon nicht gestartet wird da `routed` dazu tendiert, die von `ppp` erstellten Einträge der Standardroute zu überschreiben.
+
+Es ist außerdem sinnvoll, darauf zu achten, dass die Zeile `sendmail_flags` nicht die Option `-q` enthält, da `sendmail` sonst ab und zu die Netzwerkverbindung prüfen wird, was möglicherweise dazu führt, dass sich der Rechner einwählt. Sie können hier Folgendes angeben:
+
+[.programlisting]
+....
+sendmail_flags="-bd"
+....
+
+Der Nachteil dieser Lösung ist, dass Sie `sendmail` nach jedem Aufbau einer ppp-Verbindung auffordern müssen, die Mailwarteschlange zu überprüfen. Verwenden Sie den Befehl `!bg` in [.filename]#ppp.linkup#, um dies zu automatisieren:
+
+[.programlisting]
+....
+1 provider:
+2 delete ALL
+3 add 0 0 HISADDR
+4 !bg sendmail -bd -q30m
+....
+
+Alternativ ist es möglich, einen "dfilter" einzusetzen, um SMTP-Verkehr zu blockieren. Weitere Einzelheiten hierzu finden Sie in den Beispieldateien.
+
+=== `ppp` benutzen
+
+Das Einzige, was nun noch zu tun bleibt, ist den Rechner neu zu starten. Nach dem Neustart können Sie entweder:
+
+[source,bash]
+....
+# ppp
+....
+
+und danach `dial provider` eingeben, um eine PPP-Sitzung zu starten, oder Sie geben:
+
+[source,bash]
+....
+# ppp -auto provider
+....
+
+ein, um `ppp` bei Datenverkehr aus dem Netzwerk heraus, automatisch eine Verbindung herstellen zu lassen (vorausgesetzt Sie haben kein [.filename]#start_if.tun0# Skript erstellt).
+
+Es ist möglich, dem Programm `ppp` Befehle zu erteilen, während es im Hintergrund läuft. Dazu ist jedoch die Einrichtung eines passenden Diagnose-Ports erforderlich. Ergänzen Sie hierzu die Konfigurationsdatei um folgende Zeile:
+
+[.programlisting]
+....
+set server /var/run/ppp-tun%d DiagnosticPassword 0177
+....
+
+Damit wird PPP angewiesen, auf den angegebenen UNIX(R)-Domainsocket zu hören und Clients nach dem angegebenen Passwort zu fragen, bevor der Zugang gewährt wird. Das `%d` wird durch die Nummer des benutzten [.filename]#tun#-Devices ersetzt.
+
+Wenn ein Socket eingerichtet ist, kann das Programm man:pppctl[8] in Skripten verwendet werden, mit denen in das laufende Programm eingegriffen wird.
+
+[[userppp-mgetty]]
+=== Einwählverbindungen konfigurieren
+
+crossref:serialcomms[dialup,“Einwählverbindungen”] bietet eine gute Beschreibung, wie Einwählverbindungen unter Verwendung von man:getty[8] genutzt werden können.
+
+Eine Alternative zu `getty` ist package:comms/mgetty+sendfax[], eine raffiniertere Version von `getty`, die mit Blick auf Einwählverbindungen entworfen wurde.
+
+Der Vorteil von `mgetty` ist, dass es auf aktive Weise mit Modems _spricht_, das heißt wenn ein Port in [.filename]#/etc/ttys# ausgeschaltet ist, wird das Modem nicht auf Anrufe reagieren.
+
+Spätere Versionen von `mgetty` (von 0.99beta aufwärts) unterstützen auch die automatische Erkennung von PPP-Streams, was Clients den skriptlosen Zugang zum Server erlaubt.
+
+http://mgetty.greenie.net/doc/mgetty_toc.html[ http://mgetty.greenie.net/doc/mgetty_toc.html] enthält weitere Informationen zu `mgetty`.
+
+In der Voreinstellung wird package:comms/mgetty+sendfax[] mit der Option `AUTO_PPP` konfiguriert und kompiliert. Dadurch kann `mgetty` die LCP Phase von PPP-Verbindungen erkennen und automatisch eine ppp-Shell starten. Da hierbei jedoch die Login/Passwort-Sequenz nicht durchlaufen wird, ist es notwendig, Benutzer durch PAP oder CHAP zu authentifizieren.
+
+In diesem Abschnitt wird davon ausgegangen, dass der Benutzer den Port package:comms/mgetty+sendfax[] auf seinem System kompiliert und installiert hat.
+
+Stellen Sie sicher, dass [.filename]#/usr/local/etc/mgetty+sendfax/login.config# Folgendes enthält:
+
+[.programlisting]
+....
+/AutoPPP/ - - /etc/ppp/ppp-pap-dialup
+....
+
+Hierdurch wird `mgetty` angewiesen, [.filename]#ppp-pap-dialup# für die erkannten PPP-Verbindungen auszuführen.
+
+Erstellen Sie eine ausführbare Datei namens [.filename]#/etc/ppp/ppp-pap-dialup# mit folgendem Inhalt:
+
+[.programlisting]
+....
+#!/bin/sh
+exec /usr/sbin/ppp -direct pap$IDENT
+....
+
+Erstellen Sie bitte für jede Einwählverbindung, die Sie in [.filename]#/etc/ttys# ermöglicht haben, einen korrespondierenden Eintrag in der Datei [.filename]#/etc/ppp/ppp.conf#. Diese Einträge können problemlos, mit den Definitionen die weiter oben gemacht wurden, koexistieren.
+
+[.programlisting]
+....
+pap:
+ enable pap
+ set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40
+ enable proxy
+....
+
+Jeder Benutzer, der sich auf diese Weise anmeldet, benötigt einen Benutzernamen und ein Passwort in der Datei [.filename]#/etc/ppp/ppp.secret#. Sie haben auch die Möglichkeit, Benutzer mit Hilfe von PAP zu authentifizieren, indem Sie in [.filename]#/etc/passwd# folgende Option hinzufügen:
+
+[.programlisting]
+....
+enable passwdauth
+....
+
+Um bestimmten Benutzern eine statische IP-Adresse zuzuweisen, können Sie die Adresse als drittes Argument in [.filename]#/etc/ppp/ppp.secret# angeben. Beispiele finden Sie in [.filename]#/usr/shared/examples/ppp/ppp.secret.sample#.
+
+[[ppp-troubleshoot]]
+== Probleme bei PPP-Verbindungen
+
+Dieser Abschnitt behandelt Probleme, die auftauchen können, wenn PPP über ein Modem verwendet wird. Einige ISPs verwenden `ssword`, andere verwenden `password`. Wenn das Einwahlskript falsch ist, scheitert die Anmeldung. Üblicherweise suchen Sie nach Fehlern der PPP-Verbindung indem Sie sich manuell verbinden.
+
+=== Gerätedateien überprüfen
+
+Wenn Sie einen eigenen Kernel verwenden, stellen Sie sicher, dass die folgende Zeile in der Kernelkonfigurationsdatei vorhanden ist:
+
+[.programlisting]
+....
+device uart
+....
+
+Das [.filename]#uart#-Gerät ist bereits im `GENERIC`-Kernel vorhanden, deshalb sind in diesem Fall keine zusätzlichen Schritte vonnöten. Kontrollieren Sie die Ausgabe von `dmesg`:
+
+[source,bash]
+....
+# dmesg | grep uart
+....
+
+In der Ausgabe sollten die entsprechenden [.filename]#uart#-Geräte, beispielsweise [.filename]#uart1# ([.filename]#COM2#), angezeigt werden. Wird ein passendes Gerät angezeigt, braucht der Kernel nicht neu erstellt werden. Wenn das Modem an [.filename]#uart1# angeschlossen ist, ist [.filename]#/dev/cuau1# die dazugehörende Gerätedatei.
+
+=== Manuelle Verbindungen
+
+Ein Verbindungsaufbau zum Internet durch manuelle Steuerung von `ppp` geht schnell, ist einfach und stellt einen guten Weg dar, eine Verbindung auf Fehler hin zu überprüfen oder einfach Informationen darüber zu sammeln, wie der ISP Verbindungen handhabt. Lassen Sie uns PPP von der Kommandozeile aus starten. Beachten Sie, dass in allen Beispielen _example_ der Hostname der Maschine ist, auf der PPP läuft. `ppp` starten Sie wie folgt:
+
+[source,bash]
+....
+# ppp
+....
+
+[source,bash]
+....
+ppp ON example> set device /dev/cuau1
+....
+
+Mit dem zweiten Befehl wird das Gerät [.filename]#cuau1# festgelegt.
+
+[source,bash]
+....
+ppp ON example> set speed 115200
+....
+
+Dieser Befehlt setzt die Verbindungsgeschwindigkeit auf 115200 kbps.
+
+[source,bash]
+....
+ppp ON example> enable dns
+....
+
+Dieser Befehl weist `ppp` an, den Resolver zu konfigurieren und in [.filename]#/etc/resolv.conf# Einträge für den Nameserver hinzuzufügen. Falls `ppp` nicht in der Lage ist den Hostnamen selbst zu bestimmen, kann dieser auch später manuell eingetragen werden.
+
+[source,bash]
+....
+ppp ON example> term
+....
+
+Wechselt in den "Terminal"-Modus, um das Modem manuell kontrollieren zu können.
+
+[.programlisting]
+....
+deflink: Entering terminal mode on /dev/cuau1
+type '~h' for help
+....
+
+[source,bash]
+....
+at
+OK
+atdt123456789
+....
+
+Sie verwenden `at` zur Initialisierung des Modems und dann `atdt` sowie die Nummer des ISPs, um den Einwählprozess zu starten.
+
+[source,bash]
+....
+CONNECT
+....
+
+Dies ist die Bestätigung, dass eine Verbindung aufgebaut wurde. Falls wir Verbindungsprobleme bekommen, die nicht mit der Hardware zusammenhängen, werden wir an dieser Stelle ansetzen müssen, um eine Lösung zu finden.
+
+[source,bash]
+....
+ISP Login:myusername
+....
+
+Hier werden Sie nach einem Benutzernamen gefragt. Geben Sie am Prompt den Namen ein, den Ihnen der ISP zur Verfügung gestellt hat.
+
+[source,bash]
+....
+ISP Pass:mypassword
+....
+
+An dieser Stelle müssen Sie das Passwort angeben, das Ihnen vom ISP vorgegeben wurde. Das Passwort wird, analog dem normalen Anmeldevorgang, nicht angezeigt.
+
+[source,bash]
+....
+Shell or PPP:ppp
+....
+
+Abhängig vom ISP, kann es sein, dass dieser Prompt nicht erscheint. Wir werden hier gefragt, ob wir eine Shell beim Provider verwenden oder `ppp` starten wollen. Weil wir eine Internetverbindung aufbauen wollen, haben wir uns in diesem Beispiel für `ppp` entschieden.
+
+[source,bash]
+....
+Ppp ON example>
+....
+
+Beachten Sie, dass sich in diesem Beispiel das erste `p` in einen Großbuchstaben verwandelt hat. Dies zeigt, dass wir erfolgreich eine Verbindung zum ISP hergestellt haben.
+
+[source,bash]
+....
+PPp ON example>
+....
+
+An dieser Stelle haben wir uns erfolgreich beim ISP authentifiziert und warten darauf, dass uns eine IP-Adresse zugewiesen wird.
+
+[source,bash]
+....
+PPP ON example>
+....
+
+Wir haben uns mit der Gegenstelle auf eine IP-Adresse geeinigt und den Verbindungsaufbau erfolgreich abgeschlossen.
+
+[source,bash]
+....
+PPP ON example> add default HISADDR
+....
+
+Hier geben wir unsere Standardroute an. Weil zu diesem Zeitpunkt unsere einzige Verbindung zu unserer Gegenstelle besteht, müssen wir dies tun, bevor wir Kontakt zur Außenwelt aufnehmen können. Falls dies aufgrund bestehender Routen nicht funktionieren sollte, können Sie ein Ausrufungszeichen `!` vor `add` setzen. Sie können diese Standardroute aber auch vor dem eigentlichen Verbindungsaufbau angeben und PPP wird entsprechend eine neue Route aushandeln.
+
+Wenn alles gut ging, sollten wir nun eine aktive Internetverbindung haben, die wir mit kbd:[Ctrl+z] in den Hintergrund schicken können. Wenn Sie feststellen, dass `PPP` wieder zu `ppp` wird, ist die Verbindung abgebrochen. Es ist gut dies zu wissen, weil dadurch der Verbindungsstatus angezeigt wird. Große ``P``s zeigen an, dass eine Verbindung zum ISP besteht und kleine ``p``s zeigen an, dass keine Verbindung besteht.
+
+=== Fehlersuche
+
+Wenn keine Verbindung aufgebaut werden kann, schalten Sie die Hardware-Flusssteuerung CTS/RTS aus, indem Sie die Option `set ctsrts off` verwenden. Dies ist zumeist dann der Fall, wenn Sie mit einem PPP-fähigen Terminalserver verbunden sind. Hier bleibt PPP bei dem Versuch hängen, Daten über die Nachrichtenverbindung zu schicken, weil auf einCTS-Signal (Clear-to-Send) gewartet wird, das vielleicht nie kommt. Wenn Sie diese Option jedoch gebrauchen, sollten Sie auch die Option `set accmap` verwenden, die erforderlich sein kann, um bestimmte Hardware zu kontrollieren, die auf die Übertragung bestimmter Zeichen zwischen den Kommunikations-Endpunkten (zumeist XON/XOFF) angewiesen ist. Die Manualpage man:ppp[8] bietet mehr Informationen zu dieser Option und ihrer Verwendung.
+
+Für ein älteres Modem benötigen Sie vielleicht die Option `set parity even`. Standardmäßig wird keine Parität vorausgesetzt, sie ist aber für die Fehlerprüfung bei älteren Modems und bei bestimmten ISPs erforderlich.
+
+PPP kehrt möglicherweise nicht in den Befehlsmodus zurück, was normalerweise auf einen Fehler bei der Aushandlung hinweist, wobei der ISP wartet, dass der Aushandlungsprozess beginnt. Die Option `~p` erzwingt in diesem Fall den Beginn des Aushandlungsprozesses.
+
+Wenn der Login-Prompt nie erscheint, wird wahrscheinlich PAP oder CHAP für die Authentifizierung benötigt. Um PAP oder CHAP zu verwenden, ergänzen Sie PPP um folgende Optionen, bevor Sie in den Terminalmodus wechseln:
+
+[source,bash]
+....
+ppp ON example> set authname myusername
+....
+
+Hierbei sollte _myusername_ durch den Benutzernamen ersetzt werden, den Sie vom ISP bekommen haben.
+
+[source,bash]
+....
+ppp ON example> set authkey mypassword
+....
+
+_mypassword_ sollten Sie durch das Passwort ersetzen, das Ihnen der ISP zugewiesen hat.
+
+Wenn die Verbindung aufgebaut wird, Sie aber keine Rechner unter dem Domänen-Namen erreichen können, versuchen Sie, einen Rechner mit man:ping[8] und seiner IP-Adresse zu erreichen. Wenn 100% der Pakete verloren gehen, ist es sehr wahrscheinlich, dass keine Standardroute zugewiesen wurde. Überprüfen Sie, ob während des Verbindungsaufbaus die Option `add default HISADDR` gesetzt war. Wenn Sie zu einer entfernten IP-Adresse eine Verbindung aufbauen können, ist es möglich, dass die Adresse eines Nameservers nicht in [.filename]#/etc/resolv.conf# eingetragen wurde. Diese Datei sollte folgendermaßen aussehen:
+
+[.programlisting]
+....
+domain example.com
+nameserver x.x.x.x
+nameserver y.y.y.y
+....
+
+ Dabei sollten _x.x.x.x_ und _y.y.y.y_ durch die IP-Adressen der DNS-Server des ISPs ersetzt werden.
+
+Mit man:syslog[3] kann die PPP-Verbindung protokolliert werden. Fügen Sie einfach die folgende Zeile in [.filename]#/etc/syslog.conf# ein:
+
+[.programlisting]
+....
+!ppp
+*.* /var/log/ppp.log
+....
+
+[[pppoe]]
+== PPP over Ethernet (PPPoE)
+
+Dieser Abschnitt beschreibt, wie Sie PPP over Ethernet (PPPoE) einrichten.
+
+Dies ist ein Beispiel einer funktionierenden [.filename]#ppp.conf#:
+
+[.programlisting]
+....
+default:
+ set log Phase tun command # you can add more detailed logging if you wish
+ set ifaddr 10.0.0.1/0 10.0.0.2/0
+
+name_of_service_provider:
+ set device PPPoE:xl1 # replace xl1 with your Ethernet device
+ set authname YOURLOGINNAME
+ set authkey YOURPASSWORD
+ set dial
+ set login
+ add default HISADDR
+....
+
+Als `root`, geben Sie ein:
+
+[source,bash]
+....
+# ppp -ddial name_of_service_provider
+....
+
+Fügen Sie folgende Zeilen in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+ppp_enable="YES"
+ppp_mode="ddial"
+ppp_nat="YES" # if you want to enable nat for your local network, otherwise NO
+ppp_profile="name_of_service_provider"
+....
+
+=== Verwendung einer PPPoE-Dienstbezeichnung (service tag)
+
+Manchmal kann es notwendig sein, eine Dienstbezeichnung (service tag) zu verwenden, um eine Verbindung aufzubauen. Dienstbezeichnungen werden eingesetzt, um zwischen verschiedenen PPPoE-Servern unterscheiden zu können, die einem bestehenden Netzwerk zugeteilt sind.
+
+Die erforderlichen Dienstbezeichnungen sollten in der Dokumentation, zu finden sein, die der ISP zur Verfügung gestellt hat.
+
+Als letzte Möglichkeit könnten Sie versuchen, package:net/rr-pppoe[] zu installieren. Bedenken Sie aber, dass dadurch Daten Ihres Modems gelöscht werden können, so dass es nicht mehr benutzt werden kann. Überlegen Sie also genau, ob Sie dies machen wollen. Installieren Sie einfach das Programm, das Ihnen der Provider zusammen mit dem Modem geliefert hat. Gehen Sie dann in das Menü menu:System[] dieses Programms. Der Name des Profils, sollte in der Liste aufgeführt sein. Normalerweise ist dies _ISP_.
+
+Der Name des Profils (service tag) wird im Eintrag für die PPPoE-Konfiguration in der Datei [.filename]#ppp.conf# verwendet, als der Teil des Befehls `set device` (die Manualpage man:ppp[8] enthält Einzelheiten hierzu), der den Provider angibt. Dieser Eintrag sollte folgendermaßen aussehen:
+
+[.programlisting]
+....
+set device PPPoE:xl1:ISP
+....
+
+Vergessen Sie nicht, statt _xl1_ das richtige Gerät für die Netzwerkkarte anzugeben.
+
+Denken Sie auch daran, _ISP_ durch das Profil zu ersetzen.
+
+Weitere Informationen finden Sie unter http://renaud.waldura.com/doc/freebsd/pppoe/[ Cheaper Broadband with FreeBSD on DSL] von Renaud Waldura.
+
+[[ppp-3com]]
+=== PPPoE mit einem 3Com(R) HomeConnect(TM) ADSL Modem Dual Link
+
+Dieses Modem folgt nicht den in http://www.faqs.org/rfcs/rfc2516.html[ RFC 2516] festgelegten Spezifikationen.
+
+Um FreeBSD in die Lage zu versetzen, mit diesem Gerät zu kommunizieren, muss ein sysctl Befehl angegeben werden. Dies kann beim Systemstart automatisch geschehen, indem die Datei [.filename]#/etc/sysctl.conf# angepasst wird:
+
+[.programlisting]
+....
+net.graph.nonstandard_pppoe=1
+....
+
+oder, wenn der Befehl unmittelbar wirksam werden soll, durch:
+
+[source,bash]
+....
+# sysctl net.graph.nonstandard_pppoe=1
+....
+
+Da hiermit eine systemweit gültige Einstellung vorgenommen wird, ist es nicht möglich, gleichzeitig mit einem normalen PPPoE-Client oder Server und einem 3Com(R) HomeConnect(TM) ADSL Modem zu kommunizieren.
+
+[[pppoa]]
+== PPP over ATM (PPPoA)
+
+Nachfolgend wird beschrieben, wie PPP over ATM (PPPoA) eingerichtet wird. PPPoA ist vor allem unter europäischen DSL-Providern populär.
+
+=== Die Verwendung von mpd
+
+Sie können mpd verwenden, um zu einer Reihe von Diensten, insbesondere PPTP-Diensten eine Verbindung herzustellen. Das Programm kann aus den Ports oder als Paket package:net/mpd5[] installiert werden. Viele ADSL Modems sind auf einen PPTP-Tunnel zwischen dem Modem und dem Rechner angewiesen.
+
+Sobald das Programm installiert ist, müssen Sie es nach den Vorgaben des Providers konfigurieren. Der Port installiert auch einige gut dokumentierte Beispielkonfigurationsdateien in [.filename]#/usr/local/etc/mpd/#. Ein kompletter Leitfaden zur Konfiguration von mpd ist unter [.filename]#/usr/local/shared/doc/mpd/# zu finden. Hier ist eine Beispielkonfiguration, um mit mpd eine Verbindung zu einem ADSL-Dienst aufzubauen. Die Konfiguration ist auf zwei Dateien verteilt. Zunächst die Datei [.filename]#mpd.conf#:
+
+[NOTE]
+====
+Dieses Beispiel für [.filename]#mpd.conf# funktioniert nur mit mpd 4.x.
+====
+
+[.programlisting]
+....
+default:
+ load adsl
+
+adsl:
+ new -i ng0 adsl adsl
+ set bundle authname username <.>
+ set bundle password password <.>
+ set bundle disable multilink
+
+ set link no pap acfcomp protocomp
+ set link disable chap
+ set link accept chap
+ set link keep-alive 30 10
+
+ set ipcp no vjcomp
+ set ipcp ranges 0.0.0.0/0 0.0.0.0/0
+
+ set iface route default
+ set iface disable on-demand
+ set iface enable proxy-arp
+ set iface idle 0
+
+ open
+....
+
+<.> Der Benutzername, den Sie zur Authentifizierung bei Ihrem ISP verwenden.
+
+<.> Das Passwort, das Sie zur Authentifizierung bei Ihrem ISP verwenden.
+
+Die Datei [.filename]#mpd.links# enthält Informationen über die Verbindung(en), die Sie aufbauen möchten. Eine Beispieldatei [.filename]#mpd.links#, die das vorige Beispiel ergänzt, wird unten angegeben:
+
+[.programlisting]
+....
+adsl:
+ set link type pptp
+ set pptp mode active
+ set pptp enable originate outcall
+ set pptp self 10.0.0.1 <.>
+ set pptp peer 10.0.0.138 <.>
+....
+
+<.> Die IP-Adresse des FreeBSD-Rechners von dem aus Sie mpd verwenden.
+<.> Die IP-Adresse des ADSL-Modems. Das Alcatel SpeedTouch(TM) Home hat die Adresse `10.0.0.138` voreingestellt.
+
+Ein Verbindungsaufbau kann einfach durch Eingabe des folgenden Befehls als `root` gestartet werden:
+
+[source,bash]
+....
+# mpd -b adsl
+....
+
+Sie können sich den Status der Verbindung durch folgenden Befehl anzeigen lassen:
+
+[source,bash]
+....
+% ifconfig ng0
+ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500
+ inet 216.136.204.117 --> 204.152.186.171 netmask 0xffffffff
+....
+
+Die Verwendung von mpd ist der empfehlenswerteste Weg, um mit FreeBSD eine Verbindung zu einem ADSL-Dienst aufzubauen.
+
+=== Die Verwendung von pptpclient
+
+Es ist außerdem möglich, mit FreeBSD eine Verbindung zu anderen PPPoA-Diensten aufzubauen. Dazu wird package:net/pptpclient[] verwendet.
+
+Um mit package:net/pptpclient[] eine Verbindung zu einem DSL-Dienst aufbauen zu können, müssen Sie den entsprechenden Port bzw. das Paket installieren und [.filename]#/etc/ppp/ppp.conf# bearbeiten. Eine Beispieldatei für [.filename]#ppp.conf# ist weiter unten angegeben. Weitere Informationen zu den Optionen von [.filename]#ppp.conf# finden Sie in man:ppp[8].
+
+[.programlisting]
+....
+adsl:
+ set log phase chat lcp ipcp ccp tun command
+ set timeout 0
+ enable dns
+ set authname username <.>
+ set authkey password <.>
+ set ifaddr 0 0
+ add default HISADDR
+....
+
+<.> Der Benutzername für den Zugang beim DSL-Provider.
+<.> Das Passwort für Ihren Account.
+
+[WARNING]
+====
+
+Weil das Passwort in [.filename]#ppp.conf# im Klartext hinzugefügt wird, sollten Sie sicherstellen, dass niemand den Inhalt dieser Datei lesen kann:
+
+[source,bash]
+....
+# chown root:wheel /etc/ppp/ppp.conf
+# chmod 600 /etc/ppp/ppp.conf
+....
+
+====
+
+Dies wird einen Tunnel für eine PPP-Session zum DSL-Router öffnen. Ethernet-DSL-Modems haben eine vorkonfigurierte LAN-IP-Adresse, mit der Sie eine Verbindung aufbauen. Im Falle des Alcatel SpeedTouch(TM) Home handelt es sich dabei um die Adresse `10.0.0.138`. In der Dokumentation des Routers sollte angegeben sein, welche Adresse das Gerät verwendet. Um den Tunnel zu öffnen und eine PPP-Session zu starten, führen Sie folgenden Befehl aus:
+
+[source,bash]
+....
+# pptp address adsl
+....
+
+[TIP]
+====
+
+Wenn Sie ein kaufmännisches Und ("&") an das Ende dieses Kommandos anfügen, wird pptp den Prompt zurückgeben.
+====
+
+Ein virtuelles Tunnel-Device [.filename]#tun# wird für das Zusammenspiel der Prozesse pptp und ppp geschaffen. Wenn Sie den Prompt zurückerhalten haben oder der pptp-Prozess das Vorliegen einer Verbindung bestätigt, können Sie den Tunnel folgendermaßen überprüfen:
+
+[source,bash]
+....
+% ifconfig tun0
+tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
+ inet 216.136.204.21 --> 204.152.186.171 netmask 0xffffff00
+ Opened by PID 918
+....
+
+Wenn die Verbindung fehlschlägt, überprüfen Sie die Konfiguration des Routers, den Sie normalerweise mit einem Web-Browser erreichen können. Prüfen Sie auch die Ausgabe des Befehls `pptp` und die Logdatei [.filename]#/var/log/ppp.log#.
diff --git a/documentation/content/de/books/handbook/preface/_index.adoc b/documentation/content/de/books/handbook/preface/_index.adoc
new file mode 100644
index 0000000000..9dc3b1cec4
--- /dev/null
+++ b/documentation/content/de/books/handbook/preface/_index.adoc
@@ -0,0 +1,251 @@
+---
+title: Vorwort
+prev: books/handbook/
+next: books/handbook/parti
+---
+
+[preface]
+[[book-preface]]
+= Vorwort
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums!:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+
+[[preface-audience]]
+== Über dieses Buch
+
+Der erste Teil dieses Buchs führt FreeBSD-Einsteiger durch den Installationsprozess und stellt leicht verständlich Konzepte und Konventionen vor, die UNIX(R) zu Grunde liegen. Sie müssen nur neugierig sein und bereitwillig neue Konzepte aufnehmen, wenn diese vorgestellt werden, um diesen Teil durchzuarbeiten.
+
+Wenn Sie den ersten Teil bewältigt haben, bietet der umfangreichere zweite Teil eine verständliche Darstellung vieler Themen, die für FreeBSD-Administratoren relevant sind. Wenn Kapitel auf anderen Kapiteln aufbauen, wird das in der Übersicht am Anfang eines Kapitels erläutert.
+
+Weitere Informationsquellen entnehmen Sie bitte crossref:bibliography[bibliography,Bibliografie].
+
+[[preface-changes-from3]]
+== Änderungen gegenüber der dritten Auflage
+
+Die aktuelle Auflage des Handbuchs ist das Ergebnis der engagierten Arbeit Hunderter Mitarbeiter des FreeBSD Documentation Projects in den vergangenen 10 Jahren. Die wichtigsten Änderungen dieser Auflage gegenüber der dritten Auflage von 2004 sind:
+
+* crossref:dtrace[dtrace,DTrace] informiert Sie über die mächtigen Funktionen zur Leistungsmessung, die dieses Werkzeug bietet.
+* crossref:filesystems[filesystems,Dateisystemunterstützung] enthält Informationen über die Unterstützung nicht-nativer Dateisysteme in FreeBSD, wie beispielsweise ZFS von Sun(TM).
+* crossref:audit[audit,Security Event Auditing] informiert über die neuen Auditing-Fähigkeitenvon FreeBSD.
+* crossref:virtualization[virtualization,Virtualisierung] enthält Informationen zur Installation von FreeBSD in verschiedenen Virtualisierungs-Programmen.
+* crossref:bsdinstall[bsdinstall,FreeBSD installieren] wurde hinzugefügt, um die Installation von FreeBSD mit dem neuen Installationswerkzeug, bsdinstall, zu dokumentieren.
+
+[[preface-changes-from2]]
+== Änderungen gegenüber der zweiten Auflage (2004)
+
+Die dritte Auflage des Handbuchs war das Ergebnis der über zwei Jahre dauernden engagierten Arbeit des FreeBSD Documentation Projects. Die gedruckte Ausgabe war derart umfangreich, dass es notwendig wurde, sie in zwei Bände aufzuteilen. Die wichtigsten Änderungen dieser Auflage waren:
+
+* crossref:config[config-tuning,Konfiguration und Tuning] enthält neue Abschnitte über ACPI, Energie- und Ressourcenverwaltung und das Werkzeug `cron`.
+* crossref:security[security,Sicherheit] erläutert nun Virtual Private Networks (VPNs), Zugriffskontrolllisten (ACLs) und Sicherheitshinweise.
+* crossref:mac[mac,Verbindliche Zugriffskontrolle] ist ein neues Kapitel, das vorgeschriebene Zugriffskontrollen vorstellt und erklärt, wie FreeBSD-Systeme mit MACs abgesichert werden können.
+* crossref:disks[disks,Speichermedien] enthält neue Informationen über USB-Speichergeräte, Dateisystem-Snapshots, Quotas, Datei- und Netzwerk-basierte Dateisysteme sowie verschlüsselte Partitionen.
+* Zum crossref:ppp-and-slip[ppp-and-slip,PPP] wurde ein Abschnitt über Fehlersuche hinzugefügt.
+* crossref:mail[mail,Elektronische Post (E-Mail)] wurde um Abschnitte über alternative Transport-Agenten (MTAs), SMTP-Authentifizierung, UUCP, fetchmail, procmail und weitere Themen erweitert.
+* crossref:network-servers[network-servers,Netzwerkserver] ist ein weiteres neues Kapitel dieser Auflage. Das Kapitel beschreibt, wie der Apache HTTP-Server, ftpd und ein Samba-Server für Microsoft(R) Windows(R)-Clients eingerichtet werden. Einige Abschnitte aus dem crossref:advanced-networking[advanced-networking,Weiterführende Netzwerkthemen] befinden sich nun, wegen des thematischen Zusammenhangs, in diesem Kapitel.
+* Das crossref:advanced-networking[advanced-networking,Weiterführende Netzwerkthemen] beschreibt nun den Einsatz von Bluetooth(R)-Geräten unter FreeBSD und das Einrichten von drahtlosen Netzwerken sowie ATM-Netzwerken.
+* Neu hinzugefügt wurde ein Glossar, das die im Buch verwendeten technischen Ausdrücke definiert.
+* Das Erscheinungsbild der Tabellen und Abbildungen im Buch wurde verbessert.
+
+[[preface-changes]]
+== Änderungen gegenüber der ersten Auflage (2001)
+
+Die zweite Auflage ist das Ergebnis der engagierten Arbeit der Mitglieder des FreeBSD Documentation Projects über zwei Jahre. Die wichtigsten Änderungen gegenüber der ersten Auflage sind:
+
+* Ein Index wurde erstellt.
+* Alle ASCII-Darstellungen wurden durch Grafiken ersetzt.
+* Jedes Kapitel wird durch eine Übersicht eingeleitet, die den Inhalt des Kapitels zusammenfasst und die Voraussetzungen für ein erfolgreiches Durcharbeiten des Kapitels darstellt.
+* Der Inhalt wurde in die logischen Abschnitte "Erste Schritte", "Systemadministration" und "Anhänge" unterteilt.
+* crossref:basics[basics,Grundlagen des FreeBSD Betriebssystems] wurde um den Abschnitt "Dämonen, Signale und Stoppen von Prozessen" erweitert.
+* Das crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports] behandelt nun auch Pakete.
+* crossref:x11[x11,Das X-Window-System] wurde neu geschrieben. Der Schwerpunkt liegt auf modernen Benutzeroberflächen wie KDE und GNOME unter XFree86(TM).
+* Das crossref:boot[boot,FreeBSDs Bootvorgang] wurde erweitert.
+* crossref:disks[disks,Speichermedien] ist aus den beiden Kapiteln "Laufwerke" und "Sicherungen" entstanden. Die in den beiden Kapiteln diskutierten Themen sind so leichter zu verstehen. Hinzugekommen ist ein Abschnitt über Software- und Hardware-RAID.
+* Das crossref:serialcomms[serialcomms,Serielle Datenübertragung] wurde reorganisiert und auf FreeBSD 4.X/5.X angepasst.
+* Das crossref:ppp-and-slip[ppp-and-slip,PPP] wurde aktualisiert.
+* crossref:advanced-networking[advanced-networking,Weiterführende Netzwerkthemen] wurde um viele neue Abschnitte erweitert.
+* crossref:mail[mail,Elektronische Post (E-Mail)] wurde um einen Abschnitt über die Konfiguration von Sendmail erweitert.
+* crossref:linuxemu[linuxemu,Linux®-Binärkompatibilität] behandelt zusätzlich die Installation von Oracle(R) und SAP(R) R/3(R).
+* Neu hinzugekommen sind:
+
+** crossref:config[config-tuning,Konfiguration und Tuning].
+** crossref:multimedia[multimedia,Multimedia].
+
+[[preface-overview]]
+== Gliederung
+
+Dieses Buch ist in fünf Abschnitte unterteilt. Der erste Abschnitt, _Erste Schritte_, behandelt die Installation und die Grundlagen von FreeBSD. Dieser Abschnitt sollte in der vorgegebenen Reihenfolge durchgearbeitet werden, schon Bekanntes darf aber übersprungen werden. Der zweite Abschnitt, _Oft benutzte Funktionen_, behandelt häufig benutzte Funktionen von FreeBSD. Dieser Abschnitt sowie alle nachfolgenden Abschnitte können in beliebiger Reihenfolge gelesen werden. Jeder Abschnitt beginnt mit einer kurzen Übersicht, die das Thema des Abschnitts und das nötige Vorwissen erläutert. Die Übersichten helfen dem Leser, interessante Kapitel zu finden und erleichtern das Stöbern im Handbuch. Der dritte Abschnitt, _Systemadministration_, behandelt die Administration eines FreeBSD-Systems. Der vierte Abschnitt, _Netzwerke_, bespricht Netzwerke und Netzwerkdienste. Der fünfte Abschnitt enthält Anhänge und Verweise auf weitere Informationen.
+
+_crossref:introduction[introduction,Einleitung]_::
+Dieses Kapitel macht Einsteiger mit FreeBSD vertraut. Es behandelt die Geschichte, die Ziele und das Entwicklungsmodell des FreeBSD-Projekts.
+
+_crossref:bsdinstall[bsdinstall,FreeBSD installieren]_::
+Beschreibt den Ablauf der Installation von FreeBSD 9._x_ und neuere mittels bsdinstall.
+
+_crossref:basics[basics,Grundlagen des FreeBSD Betriebssystems]_::
+Erläutert die elementaren Kommandos und Funktionen von FreeBSD. Wenn Sie schon mit Linux(R) oder einem anderen UNIX(R) System vertraut sind, können Sie dieses Kapitel überspringen.
+
+_crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports]_::
+Zeigt wie mit der innovativen Ports-Sammlung oder mit Paketen Software von Fremdherstellern installiert wird.
+
+_crossref:x11[x11,Das X-Window-System]_::
+Beschreibt allgemein das X Window System und geht speziell auf X11 unter FreeBSD ein. Weiterhin werden graphische Benutzeroberflächen wie KDE und GNOME behandelt.
+
+_crossref:desktop[desktop,Desktop-Anwendungen]_::
+Enthält eine Aufstellung verbreiteter Anwendungen wie Browser, Büroanwendungen und Office-Pakete und beschreibt wie diese Anwendungen installiert werden.
+
+_crossref:multimedia[multimedia,Multimedia]_::
+Erklärt, wie Sie auf Ihrem System Musik und Videos abspielen können. Beispielhaft werden auch Anwendungen aus dem Multimedia-Bereich beleuchtet.
+
+_crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels]_::
+Erklärt, warum Sie einen angepassten Kernel erzeugen sollten und gibt ausführliche Anweisungen wie Sie einen angepassten Kernel konfigurieren, bauen und installieren.
+
+_crossref:printing[printing,Drucken]_::
+Beschreibt, wie Sie Drucker unter FreeBSD verwalten. Diskutiert werden Deckblätter, das Einrichten eines Druckers und ein Abrechnungssystem für ausgedruckte Seiten.
+
+_crossref:linuxemu[linuxemu,Linux®-Binärkompatibilität]_::
+Beschreibt die binäre Kompatibilität zu Linux(R). Weiterhin werden ausführliche Installationsanleitungen für Oracle(R) und Mathematica(R) gegeben.
+
+_crossref:config[config-tuning,Konfiguration und Tuning]_::
+Beschreibt die Einstellungen, die ein Systemadministrator vornehmen kann, um die Leistungsfähigkeit eines FreeBSD Systems zu verbessern. In diesem Kapitel werden auch verschiedene Konfigurationsdateien besprochen.
+
+_crossref:boot[boot,FreeBSDs Bootvorgang]_::
+Erklärt den Bootprozess von FreeBSD und beschreibt die Optionen, mit denen sich der Bootprozess beeinflussen lässt.
+
+_crossref:security[security,Sicherheit]_::
+Beschreibt die Werkzeuge mit denen Sie Ihr FreeBSD-System absichern. Unter Anderem werden Kerberos, IPsec und OpenSSH besprochen.
+
+_crossref:jails[jails,Jails]_::
+Dieses Kapitel beschreibt das Jails-Framework sowie die Vorteile von Jails gegenüber der traditionellen chroot-Unterstützung von FreeBSD.
+
+_crossref:mac[mac,Verbindliche Zugriffskontrolle]_::
+Erklärt vorgeschriebene Zugriffskontrollen (MACs) und wie mit ihrer Hilfe FreeBSD-Systeme gesichert werden.
+
+_crossref:audit[audit,Security Event Auditing]_::
+Beschreibt, was FreeBSD Event Auditing ist, wie Sie diese Funktion installieren und konfigurieren und die damit erzeugten Audit-Trails überwachen und auswerten können.
+
+_crossref:disks[disks,Speichermedien]_::
+Erläutert den Umgang mit Speichermedien und Dateisystemen. Behandelt werden Plattenlaufwerke, RAID-Systeme, optische Medien, Bandlaufwerke, speicherbasierte Laufwerke und verteilte Dateisysteme.
+
+_crossref:geom[geom,GEOM: Modulares Framework zur Plattentransformation]_::
+Beschreibt das GEOM-Framework von FreeBSD sowie die Konfiguration der verschiedenen unterstützten RAID-Level.
+
+_crossref:filesystems[filesystems,Dateisystemunterstützung]_::
+Beschreibt die Unterstützung nicht-nativer Dateisysteme (beispielsweise des Z-Dateisystems (zfs) von Sun(TM)) durch FreeBSD.
+
+_crossref:virtualization[virtualization,Virtualisierung]_::
+Dieses Kapitel beschreibt verschiedene Virtualisierungslösungen und wie diese mit FreeBSD zusammenarbeiten.
+
+_crossref:l10n[l10n,Lokalisierung – I18N/L10N einrichten und benutzen]_::
+Zeigt wie Sie FreeBSD mit anderen Sprachen als Englisch einsetzen. Es wird sowohl die Lokalisierung auf der System-Ebene wie auch auf der Anwendungs-Ebene betrachtet.
+
+_crossref:cutting-edge[updating-upgrading,FreeBSD aktualisieren]_::
+Erklärt die Unterschiede zwischen FreeBSD-STABLE, FreeBSD-CURRENT und FreeBSD-Releases. Das Kapitel enthält Kriterien anhand derer Sie entscheiden können, ob es sich lohnt, ein Entwickler-System zu installieren und aktuell zu halten. Außerdem wird beschrieben, wie Sie ein System durch das Einspielen neuer Sicherheits-Patches absichern.
+
+_crossref:dtrace[dtrace,DTrace]_::
+Beschreibt, wie das von Sun(TM) entwickelte DTrace-Werkzeug unter FreeBSD konfiguriert und eingesetzt werden kann. Dynamisches Tracing kann Ihnen beim Aufspüren von Leistungsproblemen helfen, indem Sie Echtzeit-Systemanalysen durchführen.
+
+_crossref:serialcomms[serialcomms,Serielle Datenübertragung]_::
+Erläutert, wie Sie Terminals und Modems an Ihr FreeBSD-System anschließen und sich so ein- und auswählen können.
+
+_crossref:ppp-and-slip[ppp-and-slip,PPP]_::
+Erklärt wie Sie mit PPP, SLIP oder PPP über Ethernet ein FreeBSD-System mit einem entfernten System verbinden.
+
+_crossref:mail[mail,Elektronische Post (E-Mail)]_::
+Erläutert die verschiedenen Bestandteile eines E-Mail Servers und zeigt einfache Konfigurationen für sendmail, dem meist genutzten E-Mail-Server.
+
+_crossref:network-servers[network-servers,Netzwerkserver]_::
+Bietet ausführliche Informationen und Beispielkonfigurationen, die es Ihnen ermöglichen, Ihren FreeBSD-Rechner als Network File System Server, Domain Name Server, Network Information Server, oder als Zeitsynchronisationsserver einzurichten.
+
+_crossref:firewalls[firewalls,Firewalls]_::
+Erklärt die Philosophie hinter softwarebasierten Firewalls und bietet ausführliche Informationen zur Konfiguration der verschiedenen, für FreeBSD verfügbaren Firewalls.
+
+_crossref:advanced-networking[advanced-networking,Weiterführende Netzwerkthemen]_::
+Behandelt viele Netzwerkthemen, beispielsweise das Verfügbarmachen einer Internetverbindung für andere Rechner eines LANs, Routing, drahtlose Netzwerke, Bluetooth(R), IPv6, ATM und andere mehr.
+
+_crossref:mirrors[mirrors,Bezugsquellen für FreeBSD]_::
+Enthält eine Aufstellung der Quellen von denen Sie FreeBSD beziehen können: CD-ROM, DVD sowie Internet-Sites.
+
+_crossref:bibliography[bibliography,Bibliografie]_::
+Dieses Buch behandelt viele Themen und kann nicht alle Fragen erschöpfend beantworten. Die Bibliografie enthält weiterführende Bücher, die im Text zitiert werden.
+
+_crossref:eresources[eresources,Ressourcen im Internet]_::
+Enthält eine Aufstellung der Foren, die FreeBSD Benutzern für Fragen und Diskussionen zur Verfügung stehen.
+
+_crossref:pgpkeys[pgpkeys,OpenPGP-Schlüssel]_::
+Enthält PGP-Fingerabdrücke von etlichen FreeBSD Entwicklern.
+
+[[preface-conv]]
+== Konventionen in diesem Buch
+
+Damit der Text einheitlich erscheint und leicht zu lesen ist, werden im ganzen Buch die nachstehenden Konventionen beachtet:
+
+[[preface-conv-typographic]]
+=== Typographie
+
+_Kursiv_::
+Für Dateinamen, URLs, betonte Teile eines Satzes und das erste Vorkommen eines Fachbegriffs wird ein _kursiver_ Zeichensatz benutzt.
+
+`Fixschrift`::
+Fehlermeldungen, Kommandos, Umgebungsvariablen, Namen von Ports, Hostnamen, Benutzernamen, Gruppennamen, Gerätenamen, Variablen und Code-Ausschnitte werden in einer `Fixschrift` dargestellt.
+
+Fett::
+*Fett* kennzeichnet Anwendungen, Kommandozeilen und Tastensymbole.
+
+[[preface-conv-commands]]
+=== Benutzereingaben
+
+Tasten werden *fett* dargestellt, um sie von dem umgebenden Text abzuheben. Tasten, die gleichzeitig gedrückt werden müssen, werden durch ein `+` zwischen den einzelnen Tasten dargestellt:
+
+kbd:[Ctrl+Alt+Del]
+
+Im gezeigten Beispiel soll der Benutzer die Tasten kbd:[Ctrl], kbd:[Alt] und kbd:[Del] gleichzeitig drücken.
+
+Tasten, die nacheinander gedrückt werden müssen, sind durch Kommas getrennt:
+
+kbd:[Ctrl+X], kbd:[Ctrl+S]
+
+Das letzte Beispiel bedeutet, dass die Tasten kbd:[Ctrl] und kbd:[X] gleichzeitig betätigt werden und danach die Tasten kbd:[Ctrl] und kbd:[S] gleichzeitig gedrückt werden müssen.
+
+[[preface-conv-examples]]
+=== Beispiele
+
+Beispiele, die durch [.filename]#C:\># eingeleitet werden, zeigen ein MS-DOS(R) Kommando. Wenn nichts Anderes angezeigt wird, können diese Kommandos unter neuen Versionen von Microsoft(R) Windows(R) auch in einem DOS-Fenster ausgeführt werden.
+
+[source,bash]
+....
+
+E:\> tools\fdimage floppies\kern.flp A:
+....
+
+Beispiele, die mit # beginnen, müssen unter FreeBSD mit Superuser-Rechten ausgeführt werden. Dazu melden Sie sich entweder als `root` an oder Sie wechseln von Ihrem normalen Account mit man:su[1] zu dem Benutzer `root`.
+
+[source,bash]
+....
+# dd if=kern.flp of=/dev/fd0
+....
+
+Beispiele, die mit % anfangen, werden unter einem normalen Benutzer-Account ausgeführt. Sofern nichts Anderes angezeigt wird, verwenden die Beispiele die Syntax der C-Shell.
+
+[source,bash]
+....
+% top
+....
+
+[[preface-acknowledgements]]
+== Danksagung
+
+Dieses Buch ist aus Beiträgen von vielen Leuten aus allen Teilen der Welt entstanden. Alle eingegangen Beiträge, zum Beispiel Korrekturen oder vollständige Kapitel, waren wertvoll.
+
+Einige Firmen haben dieses Buch dadurch unterstützt, dass Sie Autoren in Vollzeit beschäftigt und die Veröffentlichung des Buchs finanziert haben. Besonders BSDi (das später von http://www.windriver.com[Wind River Systems] übernommen wurde) beschäftigte Mitglieder des FreeBSD Documentation Projects, um dieses Buch zu erstellen. Dadurch wurde die erste (englische) gedruckte Auflage im März 2000 möglich (ISBN 1-57176-241-8). Wind River Systems bezahlte dann weitere Autoren, die die zum Drucken nötige Infrastruktur verbesserten und zusätzliche Kapitel beisteuerten. Das Ergebnis dieser Arbeit ist die zweite (englische) Auflage vom November 2001 (ISBN 1-57176-303-1). Zwischen 2003 und 2004 bezahlte http://www.freebsdmall.com[FreeBSD Mall, Inc] mehrere Mitarbeiter für die Vorbereitung der gedruckten dritten Auflage.
diff --git a/documentation/content/de/books/handbook/printing/_index.adoc b/documentation/content/de/books/handbook/printing/_index.adoc
new file mode 100644
index 0000000000..c7e280dc8f
--- /dev/null
+++ b/documentation/content/de/books/handbook/printing/_index.adoc
@@ -0,0 +1,734 @@
+---
+title: Kapitel 9. Drucken
+part: Part II. Common Tasks
+prev: books/handbook/kernelconfig
+next: books/handbook/linuxemu
+---
+
+[[printing]]
+= Drucken
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 9
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/printing/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/printing/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/printing/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+Trotz vieler Versuche es zu vermeiden, ist der Druck von Informationen auf Papier immer noch eine wichtige Funktion. Drucken hat zwei grundlegende Komponenten. Die Daten müssen an den Drucker gesendet werden, und zwar in einer Form, die der Drucker verstehen kann.
+
+[[printing-quick-start]]
+== Schnellstart
+
+Die grundlegende Druckfunktion kann schnell eingerichtet werden. Der Drucker muss lediglich fähig sein, normalen ASCII-Text zu drucken. Informationen zum Druck von anderen Dateien finden Sie in <<printing-lpd-filters>>.
+
+[.procedure]
+****
+. Erstellen Sie ein Verzeichnis zur Speicherung der Druckaufträge:
++
+[source,bash]
+....
+# mkdir -p /var/spool/lpd/lp
+# chown daemon:daemon /var/spool/lpd/lp
+# chmod 770 /var/spool/lpd/lp
+....
+
+. Erstellen Sie als `root` die Datei [.filename]#/etc/printcap# mit folgendem Inhalt:
++
+[.programlisting]
+....
+lp:\
+ :lp=/dev/unlpt0:\ <.>
+ :sh:\
+ :mx#0:\
+ :sd=/var/spool/lpd/lp:\
+ :lf=/var/log/lpd-errs:
+....
++
+<.> Diese Zeile ist für einen Drucker, der an einem USB-Port angeschlossen ist.Für einen Drucker, der am parallelen oder "Drucker"-Port angeschlossen ist, verwenden Sie:Für einen Netzwerkdrucker verwenden Sie:Ersetzen Sie _network-printer-name_ durch den DNS-Namen des Netzwerkdruckers.
+. Aktivieren Sie `lpd` beim Systemstart, indem Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzufügen:
++
+[.programlisting]
+....
+lpd_enable="YES"
+....
++
+Starten Sie den Dienst:
++
+[source,bash]
+....
+# service lpd start
+Starting lpd.
+....
++
+Drucken Sie eine Testseite:
++
+[source,bash]
+....
+# printf "1. Der Drucker kann drucken.\n2. Dies ist die zweite Zeile.\n" | lpr
+....
++
+[TIP]
+====
+
+Wenn die beiden Zeilen nicht am linken Rand starten und Sie einen "Treppeneffekt" beobachten, lesen Sie <<printing-lpd-filters-stairstep>>.
+====
++
+Mit `lpr` können nun Textdateien gedruckt werden. Geben Sie den Dateinamen auf der Kommandozeile an oder lassen Sie `lpr` von einer Pipe lesen.
++
+[source,bash]
+....
+% lpr textfile.txt
+% ls -lh | lpr
+....
+****
+
+[[printing-connections]]
+== Druckerverbindungen
+
+Es gibt eine Vielzahl von Möglichkeiten, einen Drucker mit einem Rechner zu verbinden. Kleine Desktop-Drucker werden in der Regel mit dem USB-Anschluss verbunden, ältere Modelle nutzen oft die parallele Schnittstelle. Einige Drucker sind direkt mit einem Netzwerk verbunden, damit sie leichter von mehreren Rechnern benutzt werden können. Nur noch wenige Drucker verwenden einen seriellen Anschluss.
+
+FreeBSD unterstützt die folgenden Arten von Druckern:
+
+[[printing-connections-usb]]
+USB::
+USB-Drucker können mit einem freien USB-Anschluss des Rechners verbunden werden.
++
+Wenn FreeBSD einen USB-Drucker erkennt, werden zwei Gerätenamen erstellt: [.filename]#/dev/ulpt0# und [.filename]#/dev/unlpt0#. Beide Geräte leiten die Daten an den Drucker weiter. Nach jedem Druckauftrag wird der USB-Anschluss von [.filename]#ultp0# zurückgesetzt. Das Zurücksetzen kann bei einigen Druckern Probleme verursachen, daher wird in der Regel stattdessen [.filename]#unlpt0# verwendet, das den Anschluss nicht zurücksetzt.
+[[printing-connections-parallel]]
+Prallel (IEEE-1284)::
+Die parallele Schnittstelle ist [.filename]#/dev/lpt0#. Der Gerätename erscheint unabhängig davon, ob ein Drucker angeschlossen ist oder nicht. Eine automatische Erkennung findet nicht statt.
++
+Die Hersteller haben sich weitgehend von diesem älteren Anschluss verabschiedet und auch viele Rechner haben keine parallele Schnittstelle mehr. Es existieren jedoch Adapter, um einen parallelen Drucker an einem USB-Port anzuschließen. Der Drucker wird dann wie ein USB-Drucker behandelt. Es können auch _Printserver_ verwendet werden, um parallele Drucker direkt mit einem Netzwerk zu verbinden.
+[[printing-connections-serial]]
+Seriell (RS-232)::
+Serielle Anschlüsse sind veraltet und werden außer in Nischenanwendungen nur noch selten verwendet. Die Kabel, Stecker und die erforderliche Verkabelung sind oft sehr unterschiedlich.
++
+Der Gerätename für einen seriellen Anschlüsse ist [.filename]#/dev/cuau0# oder [.filename]#/dev/cuau1#. Es können auch USB-Adapter verwendet werden. Diese erscheinen als [.filename]#/dev/cuaU0#.
++
+Damit mit dem Drucker kommuniziert werden kann, müssen einige Kommunikationsparameter bekannt sein. Zu den wichtigsten zählen die _Baudrate_ (BPS - Bits pro Sekunde) und die _Parität_. Diese Werte variieren, aber typische serielle Drucker verwenden eine Baudrate von 9600 und keine Parität.
+[[printing-connections-network]]
+Netzwerk::
+Netzwerkdrucker werden direkt mit dem lokalen Netzwerk verbunden.
++
+Der DNS-Name des Druckers muss bekannt sein. Wenn dem Drucker eine dynamische Adresse per DHCP zugeteilt wird, sollte das DNS automatisch aktualisiert werden, so dass der Drucker immer die richtige IP-Adresse hat. Um dieses Problem zu vermeiden, werden Netzwerkdruckern häufig statische IP-Adressen zugeteilt.
++
+Die meisten Netzwerkdrucker verstehen Druckaufträge, die über das LPD-Protokoll empfangen werden. Sie können auch den Namen der Druckwarteschlange angeben. Einige Drucker verarbeiten die Daten unterschiedlich, je nachdem welche Warteschlange verwendet wird. Zum Beispiel druckt eine `Raw`-Warteschlange die Daten unverändert, während eine `Text`-Warteschlange den Text um Wagenrückläufe ergänzt.
++
+Viele Netzwerkdrucker können auch Daten drucken, die direkt an Port 9100 gesendet werden.
+
+[[printing-connections-summary]]
+=== Zusammenfassung
+
+Verkabelte Netzwerkdrucker drucken in der Regel am schnellsten und sind einfach einzurichten. Für den direkten Anschluss am Rechner wird USB wegen seiner Geschwindigkeit und Einfachheit bevorzugt. Parallele Verbindungen funktionieren, haben jedoch ihre Begrenzung in Bezug auf Kabellänge und Geschwindigkeit. Serielle Verbindungen sind schwieriger zu konfigurieren und die Verdrahtung unterscheidet sich zwischen den Modellen. Zudem müssen Baudrate und Parität bekannt sein. Glücklicherweise sind serielle Drucker selten geworden.
+
+[[printing-pdls]]
+== Gebräuchliche Seitenbeschreibungssprachen
+
+Daten, die an einen Drucker gesendet werden, müssen in einer Sprache verfasst sein, die der Drucker verstehen kann. Diese Sprachen werden Seitenbeschreibungssprachen oder Page Description Languages (PDL) genannt.
+[[print-pdls-ascii]]
+ASCII::
+Schlichter ASCII-Text ist die einfachste Möglichkeit, um Daten an einen Drucker zu senden. Die Zeichen werden eins zu eins gedruckt: ein `A` in den Daten erscheint beim Druck als `A` auf dem Papier. Eine Formatierung ist nur bedingt verfügbar und es gibt keine Möglichkeit, eine Schriftart oder eine bestimmte Laufweite zu wählen. Die Einfachheit von schlichtem ASCII-Text bedeutet, dass Text ohne bzw. wenig Codierung oder Übersetzung gedruckt werden kann. Die gedruckte Ausgabe entspricht dem, was an den Drucker gesendet wurde.
++
+Einige kostengünstige Drucker können keinen einfachen ASCII-Text drucken. Das macht sie in der Regel schwieriger einzurichten.
+[[print-pdls-postscript]]
+PostScript(R)::
+PostScript(R) ist fast das Gegenteil von ASCII. Anstelle von einfachem Text, besteht ein PostScript(R)-Programm aus einer Reihe von Anweisungen, die das endgültige Dokument generieren. Es können auch verschiedene Schriften und Grafiken benutzt werden. Diese Fähigkeiten haben jedoch ihren Preis. Das Programm, das die Seite generiert, muss zunächst erzeugt werden. Normalerweise wird dieses Programm durch die Anwendung erzeugt, so dass der Prozess für den Benutzer transparent bleibt.
++
+Kostengünstige Drucker sind manchmal nicht kompatibel mit PostScript(R).
+
+[[print-pdls-pcl]]
+PCL (Printer Command Language)::
+PCL ist eine Erweiterung von ASCII. Es enthält Escape-Sequenzen für die Formatierung, Schriftauswahl und das Drucken von Grafiken. Viele Drucker bieten Unterstützung für PCL5, einige unterstützen auch das neuere PCL6 oder PCLXL. Die neueren Versionen sind Kombinationen von PCL5 und bieten eine schnellere Druckgeschwindigkeit.
+[[print-pdls-host-based]]
+Host-basiert::
+Hersteller können die Kosten eines Druckers reduzieren, indem sie einen einfachen Prozessor und etwas Speicher verbauen. Diese Drucker sind nicht in der Lage normalen Text zu drucken. Stattdessen werden die Texte und Grafiken von einem Treiber auf dem Host-Rechner generiert und dann an den Drucker gesendet. Diese Drucker werden Host-basierte Drucker genannt.
++
+Die Kommunikation zwischen dem Treiber und dem Drucker wird oft durch proprietäre oder nicht dokumentierte Protokolle realisiert, weshalb sie nur mit den gängigsten Betriebssystemen funktionieren.
+
+[[print-pdls-table]]
+=== PostScript(R) in eine andere Sprache konvertieren
+
+Viele Anwendungen aus der Ports-Sammlung und FreeBSD Werkzeuge können PostScript(R) erzeugen. Die folgende Tabelle listet die verfügbaren Programme, um PostScript(R) in andere PDLs zu konvertieren:
+
+[[printing-pdls-ps-to-other-tbl]]
+.Ausgabe PDLs
+[cols="20%,20%,60%", options="header"]
+|===
+<| Ausgabe PDL
+<| Generiert von
+<| Hinweis
+
+|PCL oder PCL5
+|package:print/ghostscript9-base[]
+|`-sDEVICE=ljet4` für Schwarzweiß, `-sDEVICE=cljet5` für Farbe
+
+|PCLXL oder PCL6
+|package:print/ghostscript9-base[]
+|`-sDEVICE=pxlmono` für Schwarzweiß, `-sDEVICE=pxlcolor` für Farbe
+
+|ESC/P2
+|package:print/ghostscript9-base[]
+|`-sDEVICE=uniprint`
+
+|XQX
+|package:print/foo2zjs[]
+|
+|===
+
+[[print-pdls-summary]]
+=== Zusammenfassung
+
+Um die Konfiguration einfach zu halten, wählen Sie einen Drucker, der PostScript(R) oder auch PCL unterstützt. Mit package:print/ghostscript9-base[] können diese Drucker PostScript(R) nativ verstehen. Wenn der Drucker PostScript(R) oder PCL direkt unterstützt, können Sie auch sofort einfache ASCII-Textdateien drucken.
+
+Zeilenbasierte Drucker wie Tintenstrahldrucker unterstützen in der Regel kein PostScript(R) oder PCL. Dennoch können Sie ASCII-Textdateien drucken. package:print/ghostscript9-base[] unterstützt die Sprachen dieser Drucker. Jedoch ist der Druck von Grafiken auf diesen Druckern oft sehr langsam, da aufgrund der großen Menge an Daten übertragen und ausgedruckt werden müssen.
+
+Host-basierte Drucker sind oft schwieriger einzurichten. Einige Drucker können überhaupt nicht benutzt werden, da sie proprieräte PDLs verwerden. Solche Drucker sollten Sie nach Möglichkeit vermeiden.
+
+Die Beschreibungen vieler PDLs finden Sie auf http://www.undocprint.org/formats/page_description_languages[]. Spezielle PDLs, die von einigen Druckern verwendet werden finden Sie auf http://www.openprinting.org/printers[].
+
+[[printing-direct]]
+== Direktes Drucken
+
+Für den gelegentlichen Druck können die Dateien auch direkt, ohne zusätzliche Einstellungen, an den Drucker gesendet werden. Zum Beispiel kann die Datei [.filename]#sample.txt# direkt an einen USB-Drucker gesendet werden:
+
+[source,bash]
+....
+# cp sample.txt /dev/unlpt0
+....
+
+Ob Sie direkt auf einen Netzwerkdrucker drucken können, hängt von den Fähigkeiten des Druckers ab. Die meisten akzeptieren jedoch Druckaufträge auf Port 9100, die Sie mit man:nc[1] an den Drucker senden können. So drucken Sie die gleiche Datei auf einem Drucker mit dem DNS-Namen _netlaser_:
+
+[source,bash]
+....
+# nc netlaser 9100 < sample.txt
+....
+
+[[printing-lpd]]
+== LPD (Line Printer Daemon)
+
+Drucken im Hintergrund wird _Spooling_ genannt. Ein Spooler (Warteschlange) ermöglicht es dem Benutzer die Programme auf dem Rechner fortzusetzen, ohne warten zu müssen bis der Druckauftrag abgeschlossen ist.
+
+FreeBSD enthält den Spooler namens man:lpd[8]. Druckaufträge werden mit man:lpr[1] übermittelt.
+
+[[printing-lpd-setup]]
+=== Konfiguration
+
+Erstellen Sie ein Verzeichnis zur Speicherung der Druckaufträge und setzen Sie die Berechtigungen auf diesem Verzeichnis, damit der Inhalt der Druckaufträge nicht von anderen Benutzern eingesehen werden kann:
+
+[source,bash]
+....
+# mkdir -p /var/spool/lpd/lp
+# chown daemon:daemon /var/spool/lpd/lp
+# chmod 770 /var/spool/lpd/lp
+....
+
+Drucker werden in [.filename]#/etc/printcap# angelegt. Ein Eintrag für einen Drucker enthält dessen Name, Anschluss sowie weitere Einstellungen. Erstellen Sie [.filename]#/etc/printcap# mit folgendem Inhalt:
+
+[.programlisting]
+....
+lp:\ <.>
+ :lp=/dev/unlpt0:\ <.>
+ :sh:\ <.>
+ :mx#0:\ <.>
+ :sd=/var/spool/lpd/lp:\ <.>
+ :lf=/var/log/lpd-errs: <.>
+....
+
+<.> Der Name des Druckers. man:lpr[1] sendet Druckaufträge an den Drucker `lp`, es sei denn, ein anderer Drucker wird mit der Option `-P` angegeben. Der Standarddrucker sollte also `lp` genannt werden.
+<.> Der Anschluss, über den der Drucker verbunden ist. Ersetzen Sie diese Zeile mit dem entsprechenden, hier aufgeführten Verbindungstyp.
+<.> Unterdrückt das Drucken eines Deckblattes zu Beginn des Druckauftrags.
+<.> Die maximale Größe des Druckauftrags wird nicht begrenzt.
+<.> Das Verzeichnis zur Speicherung der Druckdaten. Jeder Drucker verwendet ein eigenes Verzeichnis.
+<.> Die Logdatei, in welche die Fehler des Druckers geschrieben werden.
+
+Nachdem Sie [.filename]#/etc/printcap# erstellt haben, verwenden Sie man:chkprintcap[8] um die Datei auf Fehler zu testen:
+
+[source,bash]
+....
+# chkprintcap
+....
+
+Beheben Sie alle gemeldeten Fehler, bevor Sie fortfahren.
+
+Aktivieren Sie man:lpd[8] in [.filename]#/etc/rc.conf#:
+
+[.programlisting]
+....
+lpd_enable="YES"
+....
+
+Starten Sie den Dienst:
+
+[source,bash]
+....
+# service lpd start
+....
+
+[[printing-lpd-lpr]]
+=== Drucken mit man:lpr[1]
+
+Mit `lpr` werden Dokumente an den Drucker geschickt. Die Datei können Sie auf der Kommandozeile angeben, oder über eine Pipe an `lpr` schicken. Die beiden folgenden Kommandos sind gleichwertig, sie schicken den Inhalt von [.filename]#doc.txt# an den Standarddrucker:
+
+[source,bash]
+....
+% lpr doc.txt
+% cat doc.txt | lpr
+....
+
+Drucker können auch mit `-P` ausgewählt werden. Um auf einen Drucker namens _laser_ zu drucken:
+
+[source,bash]
+....
+% lpr -Plaser doc.txt
+....
+
+[[printing-lpd-filters]]
+=== Filter
+
+In den bisher gezeigten Beispielen wurde lediglich eine Textdatei an den Drucker gesendet. Solange der Drucker den Inhalt dieser Dateien versteht, wird die Ausgabe korrekt gedruckt werden.
+
+Einige Drucker sind nicht in der Lage einfachen Text zu drucken. Es kann sogar sein, das die Eingabedatei gar keinen Text enthält.
+
+Mit Hilfe von _Filtern_ können Dateien übersetzt oder verarbeitet werden. Ein typischer Anwendungsfall ist die Umwandlung der Eingabedaten in ein Format, das der Drucker verstehen kann, wie bspw. PostScript(R) oder PCL. Filter können auch verwendet werden um zusätzliche Funktionen hinzuzufügen, wie bspw. Seitenzahlen oder das Hervorheben von Quellcode, um die Lesbarkeit zu verbessern.
+
+Die hier beschriebenen Filter werden _Eingabefilter_ oder auch _Textfilter_ genannt. Diese Filter übersetzen die eingehende Datei in verschiedene Formen. Werden Sie mit man:su[1] zu `root`, bevor Sie die Dateien erstellen.
+
+Filter werden in [.filename]#/etc/printcap# mit der Kennung `if=` festgelegt. Um [.filename]#/usr/local/libexec/lf2crlf# als Filter einzusetzen, bearbeiten Sie [.filename]#/etc/printcap# wie folgt:
+
+[.programlisting]
+....
+lp:\
+ :lp=/dev/unlpt0:\
+ :sh:\
+ :mx#0:\
+ :sd=/var/spool/lpd/lp:\
+ :if=/usr/local/libexec/lf2crlf:\ <.>
+ :lf=/var/log/lpd-errs:
+....
+
+<.> `if=` identifiziert den Eingangsfilter, der auf den eingehenden Text angewendet werden soll.
+
+[TIP]
+====
+
+Der Backslash am Ende der Zeilen zeigt an, das ein Eintrag für einen Drucker wirklich nur eine Zeile ist, in der die einzelnen Einträge durch einen Doppelpunkt getrennt sind. Das Beispiel hätte man auch wie folgt schreiben können:
+
+[.programlisting]
+....
+lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:
+....
+
+====
+
+[[printing-lpd-filters-stairstep]]
+==== Den Treppeneffekt verhindern
+
+Typische Textdateien enthalten einen Zeilenvorschub am Ende jeder Zeile. Diese Zeilen erzeugen auf dem Drucker einen "Treppeneffekt":
+
+[.programlisting]
+....
+A printed file looks
+ like the steps of a staircase
+ scattered by the wind
+....
+
+Ein Filter kann Zeilenumbrüche in Wagenrückläufe und Zeilenumbrüche konvertieren. Erstellen Sie [.filename]#/usr/local/libexec/lf2crlf# mit folgendem Inhalt:
+
+[.programlisting]
+....
+#!/bin/sh
+CR=$'\r'
+/usr/bin/sed -e "s/$/${CR}/g"
+....
+
+Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:
+
+[source,bash]
+....
+# chmod 555 /usr/local/libexec/lf2crlf
+....
+
+Passen Sie [.filename]#/etc/printcap# an, so dass der neue Filter verwendet wird:
+
+[.programlisting]
+....
+:if=/usr/local/libexec/lf2crlf:\
+....
+
+Drucken Sie nochmal die gleiche Datei, um den Filter zu testen.
+
+[[printing-lpd-filters-enscript]]
+==== Mit package:print/enscript[] normalen Text auf PostScript(R)-Druckern drucken
+
+GNUEnscript wandelt Textdateien in formatiertes PostScript(R) um, die dann auf PostScript(R)-Druckern gedruckt werden können. Das Programm fügt auch Seitenzahlen und Zeilenumbrüche hinzu und stellt andere Funktionen bereit, um gedruckte Textdateien besser lesbar zu machen. Abhängig vom Papierformat können Sie entweder package:print/enscript-letter[] oder package:print/enscript-a4[] aus der Ports-Sammlung installieren.
+
+Erstellen Sie [.filename]#/usr/local/libexec/enscript# mit diesem Inhalt:
+
+[.programlisting]
+....
+#!/bin/sh
+/usr/local/bin/enscript -o -
+....
+
+Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:
+
+[source,bash]
+....
+# chmod 555 /usr/local/libexec/enscript
+....
+
+Bearbeiten Sie [.filename]#/etc/printcap# um den neuen Filter zu verwenden:
+
+[.programlisting]
+....
+:if=/usr/local/libexec/enscript:\
+....
+
+Testen Sie den Filter, indem Sie eine einfache Textdatei drucken.
+
+[[printing-lpd-filters-ps2pcl]]
+==== PostScript(R) auf PCL-Druckern drucken
+
+Viele Programme erzeugen PostScript(R)-Dokumente. Allerdings können kostengünstige Drucker oft nur Textdateien oder PCL verstehen. Dieser Filter wandelt PostScript(R)-Dateien in PCL um, bevor die Datei an den Drucker geschickt wird. Installieren Sie den Ghostscript PostScript(R) Interpreter package:print/ghostscript9-base[] aus der Ports-Sammlung.
+
+Erstellen Sie [.filename]#/usr/local/libexec/ps2pcl# mit diesem Inhalt:
+
+[.programlisting]
+....
+#!/bin/sh
+/usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -
+....
+
+Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:
+
+[source,bash]
+....
+# chmod 555 /usr/local/libexec/ps2pcl
+....
+
+Die PostScript(R)-Eingabe wird von dem Skript erst in PCL umgewandelt, bevor es an den Drucker geschickt wird.
+
+Bearbeiten Sie [.filename]#/etc/printcap# um den neuen Filter zu verwenden:
+
+[.programlisting]
+....
+:if=/usr/local/libexec/ps2pcl:\
+....
+
+Testen Sie den Filter mit einem kleinen PostScript(R)-Programm.
+
+[source,bash]
+....
+% printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
+72 432 moveto (PostScript printing successful.) show showpage \004" | lpr
+....
+
+[[printing-lpd-filters-smart]]
+==== Intelligente Filter
+
+Ein Filter kann sehr nützlich sein, wenn er die Eingabe erkennt und sie automatisch in ein für den Drucker verständliches Format umwandelt. Die ersten beiden Zeichen in einer PostScript(R)-Datei sind in der Regel `%!`. Ein Filter ist in der Lage diese beiden Zeichen zu erkennen. PostScript(R)-Dateien können unverändert an einen PostScript(R)-Drucker geschickt werden. Textdateien können, wie eben gezeigt, mit Enscript in PostScript(R) umgewandelt werden. Erstellen Sie [.filename]#/usr/local/libexec/psif# mit diesem Inhalt:
+
+[.programlisting]
+....
+#!/bin/sh
+#
+# psif - Print PostScript or plain text on a PostScript printer
+#
+IFS="" read -r first_line
+first_two_chars=`expr "$first_line" : '\(..\)'`
+
+case "$first_two_chars" in
+%!)
+ # %! : PostScript job, print it.
+ echo "$first_line" && cat && exit 0
+ exit 2
+ ;;
+*)
+ # otherwise, format with enscript
+ ( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
+ exit 2
+ ;;
+esac
+....
+
+Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:
+
+[source,bash]
+....
+# chmod 555 /usr/local/libexec/psif
+....
+
+Bearbeiten Sie [.filename]#/etc/printcap# um den neuen Filter zu verwenden:
+
+[.programlisting]
+....
+:if=/usr/local/libexec/psif:\
+....
+
+Um den Filter zu testen, drucken Sie PostScript(R)- und einfache Textdateien.
+
+[[printing-lpd-filters-othersmart]]
+==== Weitere intelligente Filter
+
+Einen Filter zu schreiben, der verschiedene Arten von Eingaben erkennen und formatieren kann, ist eine große Herausforderung. package:print/apsfilter[] aus der Ports-Sammlung ist auch ein intelligenter Filter, der Dutzende Dateitypen automatisch in eine für den Drucker verständliche PDL umwandeln kann. Weitere Details finden Sie auf http://www.apsfilter.org[].
+
+[[printing-lpd-queues]]
+=== Mehrere Warteschlangen
+
+Die Einträge in [.filename]#/etc/printcap# sind nichts anderes als Definitionen von Warteschlangen. Für jeden Drucker können eine oder mehrere Warteschlangen definiert werden. Kombiniert mit Filtern bieten mehrere Warteschlangen eine bessere Kontrolle über die Druckaufträge.
+
+Als Beispiel dient ein vernetzter PostScript(R)-Laserdrucker in einem Büro. Die meisten Benutzer möchten einfache Textdateien drucken, aber ein paar fortgeschrittene Anwender sollen in der Lage sein, PostScript(R)-Dateien direkt zu drucken. Hierfür werden zwei Einträge für den Drucker in [.filename]#/etc/printcap# erstellt:
+
+[.programlisting]
+....
+textprinter:\
+ :lp=9100@officelaser:\
+ :sh:\
+ :mx#0:\
+ :sd=/var/spool/lpd/textprinter:\
+ :if=/usr/local/libexec/enscript:\
+ :lf=/var/log/lpd-errs:
+
+psprinter:\
+ :lp=9100@officelaser:\
+ :sh:\
+ :mx#0:\
+ :sd=/var/spool/lpd/psprinter:\
+ :lf=/var/log/lpd-errs:
+....
+
+Dokumente, die zum `textprinter` geschickt werden, werden wie im vorherigen Beispiel durch den Filter [.filename]#/usr/local/libexec/enscript# formatiert. Fortgeschrittene Anwender können PostScript(R)-Dateien direkt auf dem Drucker `psprinter` drucken, wo keine Filterung stattfindet.
+
+Mit mehreren Warteschlangen können Sie einen direkten Zugriff auf alle Arten von Druckerfunktionen zur Verfügung stellen. Ein Duplex-Drucker könnte zwei Warteschlangen verwenden, eine für den gewöhnlichen Druck und eine für den Duplexdruck.
+
+[[printing-lpd-monitor]]
+=== Druckaufträge steuern und überwachen
+
+Es stehen verschiedene Programme zur Verfügung um Druckaufträge zu überwachen und den Druckbetrieb zu steuern.
+
+[[printing-lpd-monitor-lpq]]
+==== man:lpq[1]
+
+man:lpq[1] zeigt den Status der Druckaufträge des Benutzers an. Druckaufträge anderer Benutzer werden nicht angezeigt.
+
+Dieser Befehl zeigt die anstehenden Druckaufträge eines Benutzers für einen Drucker an:
+
+[source,bash]
+....
+% lpq -Plp
+Rank Owner Job Files Total Size
+1st jsmith 0 (standard input) 12792 bytes
+....
+
+Der folgende Befehl zeigt die anstehenden Druckaufträge eines Benutzers für alle Drucker an:
+
+[source,bash]
+....
+% lpq -a
+lp:
+Rank Owner Job Files Total Size
+1st jsmith 1 (standard input) 27320 bytes
+
+laser:
+Rank Owner Job Files Total Size
+1st jsmith 287 (standard input) 22443 bytes
+....
+
+[[printing-lpd-monitor-lprm]]
+==== man:lprm[1]
+
+Mit man:lprm[1] können Druckaufträge gelöscht werden. Normale Benutzer dürfen lediglich ihre eigenen Aufträge löschen. `root` kann hingegen jeden beliebigen Auftrag löschen.
+
+Dieser Befehl löscht alle anstehenden Druckaufträge eines Druckers:
+
+[source,bash]
+....
+# lprm -Plp -
+dfA002smithy dequeued
+cfA002smithy dequeued
+dfA003smithy dequeued
+cfA003smithy dequeued
+dfA004smithy dequeued
+cfA004smithy dequeued
+....
+
+Mit dem folgenden Befehl löschen Sie einen bestimmten Druckauftrag. Benutzen Sie man:lpq[1], um die Nummer des Auftrags zu finden.
+
+[source,bash]
+....
+% lpq
+Rank Owner Job Files Total Size
+1st jsmith 5 (standard input) 12188 bytes
+% lprm -Plp 5
+dfA005smithy dequeued
+cfA005smithy dequeued
+....
+
+[[printing-lpd-monitor-lpc]]
+==== man:lpc[8]
+
+Mit man:lpc[8] kann der Druckerstatus überprüft und verändert werden. `lpc` wird zusammen mit einem Kommando und optional mit einem Druckernamen aufgerufen. Mit `all` können alle Drucker angesprochen werden, auf denen das Kommando ausgeführt werden soll. Normale Benutzer können sich den Status mit man:lpc[8] ansehen. Nur `root` darf Kommandos ausführen, die den Status des Druckers verändern.
+
+Dieser Befehl zeigt den Status von allen Druckern an:
+
+[source,bash]
+....
+% lpc status all
+lp:
+ queuing is enabled
+ printing is enabled
+ 1 entry in spool area
+ printer idle
+laser:
+ queuing is enabled
+ printing is enabled
+ 1 entry in spool area
+ waiting for laser to come up
+....
+
+Der Drucker kann die Annahme neuer Druckaufträge verweigern. Anschließend sollen Aufträge wieder akzeptiert werden:
+
+[source,bash]
+....
+# lpc stop lp
+lp:
+ printing disabled
+# lpc start lp
+lp:
+ printing enabled
+ daemon started
+....
+
+Starten Sie den Drucker nach einem Fehler neu:
+
+[source,bash]
+....
+# lpc restart lp
+lp:
+ no daemon to abort
+ printing enabled
+ daemon restarted
+....
+
+Schalten Sie die Warteschlange aus und deaktivieren Sie den Druck. Sie können den Benutzern gleichzeitig eine Nachricht hinterlassen:
+
+[source,bash]
+....
+# lpc down lp Ersatzteile werden am Montag ankommen
+lp:
+ printer and queuing disabled
+ status message is now: Ersatzteile werden am Montag ankommen
+....
+
+Reaktivieren Sie den Drucker:
+
+[source,bash]
+....
+# lpc up lp
+lp:
+ printing enabled
+ daemon started
+....
+
+Weitere Kommandos und Optionen finden Sie in man:lpc[8].
+
+[[printing-lpd-shared]]
+=== Gemeinsam genutzte Drucker
+
+In Unternehmen und Schulen werden Drucker häufig von mehreren Benutzern genutzt. Es werden zusätzliche Funktionen angeboten, um die gemeinsame Nutzung von Druckern zu erleichtern.
+
+[[printing-shared-aliases]]
+==== Aliase
+
+Der Druckername wird in der ersten Zeile von [.filename]#/etc/printcap# festgelegt. Weitere Namen oder _Aliase_ können nach dem Druckernamen hinzugefügt werden. Aliase werden vom Namen durch das Pipe-Zeichen `|` getrennt:
+
+[.programlisting]
+....
+lp|repairsprinter|salesprinter:\
+....
+
+Anstelle des Druckernamens können Aliase verwendet werden. Zum Beispiel können Mitarbeiter der Verkaufsabteilung wie folgt auf ihren Drucker drucken:
+
+[source,bash]
+....
+% lpr -Psalesprinter sales-report.txt
+....
+
+Mitarbeiter der Reparaturabteilung drucken auf dem Drucker mit:
+
+[source,bash]
+....
+% lpr -Prepairsprinter repairs-report.txt
+....
+
+Alle Dokumente werden auf diesem einen Drucker gedruckt. Wenn die Verkaufsabteilung größer wird und die Abteilung einen eigenen Drucker benötigt, kann der Alias entfernt und für einen neuen Drucker verwendet werden. Die Mitarbeiter in beiden Abteilungen benutzen zum Drucken weiterhin die gleichen Befehle, nur dass die Aufträge der Verkaufsabteilung jetzt zum neuen Drucker gesendet werden.
+
+[[printing-shared-headers]]
+==== Deckblätter
+
+Bei einem viel benutzten Drucker kann es für die Anwender schwierig sein, ihre Dokumente in einem großen Papierstapel wiederzufinden. Um dieses Problem zu lösen, können _Deckblätter_ verwendet werden. Dabei wird vor jedem Druckauftrag ein Deckblatt mit dem Benutzernamen und dem Dokumentnamen gedruckt. Deckblätter werden manchmal auch als _Banner_ oder _Trennseite_ bezeichnet.
+
+Das Aktivieren der Deckblätter hängt davon ab, ob der Drucker direkt über ein USB, paralleles oder serielles Kabel, oder über ein Netzwerk mit dem Rechner verbunden ist.
+
+Wenn der Drucker direkt verbunden ist, aktivieren Sie die Deckblätter durch Entfernen der Zeile `:sh:\` (Supress Header) in [.filename]#/etc/printcap#. Diese Deckblätter verwenden lediglich einen Zeilenvorschub für neue Zeilen. Einige Drucker benötigen den Filter [.filename]#/usr/shared/examples/printing/hpif# um den Treppeneffekt zu vermeiden. Der Filter konfiguriert PCL-Drucker so, dass sowohl Zeilenumbrüche als auch Zeilenvorschübe verwendet werden, wenn ein Zeilenvorschub empfangen wird.
+
+Für Netzwerkdrucker müssen Deckblätter auf dem Drucker selbst konfiguriert werden, da Einträge für Deckblätter in [.filename]#/etc/printcap# ignoriert werden. Die Einstellungen sind über einen Webbrowser zugänglich und stehen in der Regel auf der Hauptseite der Konfigurations-Webseite zur Verfügung.
+
+[[printing-lpd-references]]
+=== Referenzen
+
+Beispieldateien: [.filename]#/usr/shared/examples/printing/#.
+
+Das _4.3BSD Line Printer Spooler Manual_, [.filename]#/usr/shared/doc/smm/07.lpd/paper.ascii.gz#.
+
+Manualpages: man:printcap[5], man:lpd[8], man:lpr[1], man:lpc[8], man:lprm[1], man:lpq[1].
+
+[[printing-other]]
+== Andere Drucksysteme
+
+Neben dem in FreeBSD enthaltenen man:lpd[8] existieren noch weitere Drucksysteme. Diese Systeme bieten zusätzliche Funktionen und Unterstützung für andere Protokolle.
+
+[[printing-other-cups]]
+=== CUPS (Common UNIX(R) Printing System)
+
+CUPS ist ein beliebtes Drucksystem, das für viele Betriebssysteme erhältlich ist. CUPS unter FreeBSD wird in einem separaten Artikel beschrieben: link:{cups}[CUPS on FreeBSD].
+
+[[printing-other-hplip]]
+=== HPLIP
+
+Hewlett Packard stellt ein Drucksystem zur Verfügung, das viele ihrer Drucker unterstützt. Der Port heißt package:print/hplip[]. Die Webseite befindet sich unter http://hplipopensource.com/hplip-web/index.html[]. Der FreeBSD-Port kümmert sich um alle Details während der Installation. Informationen zur Konfiguration finden Sie unter http://hplipopensource.com/hplip-web/install/manual/hp_setup.html[].
+
+[[printing-other-lprng]]
+=== LPRng
+
+LPRng wurde als eine verbesserte Alternative zu man:lpd[8] entwickelt. Der Port heißt package:sysutils/LPRng[]. Weitere Informationen und Dokumentation finden Sie unter http://www.lprng.com/[].
diff --git a/documentation/content/de/books/handbook/security/_index.adoc b/documentation/content/de/books/handbook/security/_index.adoc
new file mode 100644
index 0000000000..10ffffd44b
--- /dev/null
+++ b/documentation/content/de/books/handbook/security/_index.adoc
@@ -0,0 +1,2129 @@
+---
+title: Kapitel 13. Sicherheit
+part: Teil III. Systemadministration
+prev: books/handbook/boot
+next: books/handbook/jails
+---
+
+[[security]]
+= Sicherheit
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 13
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/security/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/security/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/security/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[security-synopsis]]
+== Übersicht
+
+Sicherheit, ob nun physisch oder virtuell, ist ein so breit gefächertes Thema, dass sich eine ganze Industrie darum gebildet hat. Es wurden bereits hunderte Verfahren zur Sicherung von Systemen und Netzwerken verfasst, und als Benutzer von FreeBSD ist es unumgänglich zu verstehen, wie Sie sich gegen Angreifer und Eindringlinge schützen können.
+
+In diesem Kapitel werden einige Grundlagen und Techniken diskutiert. Ein FreeBSD-System implementiert Sicherheit in mehreren Schichten, und viele weitere Programme von Drittanbietern können zur Verbesserung der Sicherheit beitragen.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie:
+
+* Grundlegende auf FreeBSD bezogene Sicherheitsaspekte kennen.
+* Die verschiedenen Verschlüsselungsmechanismen von FreeBSD kennen.
+* Wissen, wie Sie ein Einmalpasswörter zur Authentifizierung verwenden.
+* TCP Wrapper für man:inetd[8] einrichten können.
+* Wissen, wie Sie Kerberos unter FreeBSD einrichten.
+* Wissen, wie Sie IPsec konfigurieren und ein VPN einrichten.
+* Wissen, wie Sie OpenSSH unter FreeBSD konfigurieren und benutzen.
+* Wissen, wie Sie ACLs für Dateisysteme benutzen.
+* pkg anwenden können, um Softwarepakete aus der Ports-Sammlung auf bekannte Sicherheitslücken hin zu überprüfen.
+* Mit FreeBSD-Sicherheitshinweisen umgehen können.
+* Eine Vorstellung davon haben, was Prozessüberwachung (Process Accounting) ist und wie Sie diese Funktion unter FreeBSD aktivieren können.
+* Wissen, wie Sie Login-Klassen oder die Ressourcen-Datenbank benutzen, um die Ressourcen für Benutzer zu steuern.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie
+
+* Grundlegende Konzepte von FreeBSD und dem Internet verstehen.
+
+Dieses Buch behandelt weitere Sicherheitsthemen. Beispielsweise werden verbindliche Zugriffskontrollen im crossref:mac[mac,Verbindliche Zugriffskontrolle] und Firewalls im crossref:firewalls[firewalls,Firewalls] besprochen.
+
+[[security-intro]]
+== Einführung
+
+Sicherheit ist die Verantwortung eines jeden Einzelnen. Ein schwacher Einstiegspunkt in einem System kann einem Eindringling Zugriff auf wichtige Informationen verschaffen, was sich verheerend auf das gesamte Netzwerk auswirken kann. Eines der Grundprinzipien der Informationssicherheit sind die Vertraulichkeit, Integrität und Verfügbarkeit von Informationssystemen.
+
+Diese Grundprinzipien sind ein fundamentales Konzept der Computer-Sicherheit, da Kunden und Benutzer erwarten, dass ihre Daten geschützt sind. Zum Beispiel erwartet ein Kunde, dass seine Kreditkarteninformationen sicher gespeichert werden (Vertraulichkeit), dass seine Aufträge nicht hinter den Kulissen geändert werden (Integrität) und dass er zu jeder Zeit Zugang zu seinen Informationen hat (Verfügbarkeit).
+
+Um diese Grundprinzipien zu implementieren, wenden Sicherheitsexperten das sogenannte Defense-in-Depth-Konzept an. Die Idee dahinter ist, mehrere Sicherheitsschichten zu addieren, so dass nicht die gesamte Systemsicherheit gefährdet ist, wenn eine einzelne Sicherheitsschicht kompromittiert wird. Beispielsweise ist es nicht ausreichend, ein Netzwerk oder ein System nur mit einer Firewall zu sichern. Der Systemadministrator muss auch Benutzerkonten überwachen, die Integrität von Binärdateien prüfen und sicherstellen, dass keine bösartigen Programme installiert sind. Um eine effektive Sicherheitsstrategie zu implementieren, muss man Bedrohungen verstehen und wissen, wie man sich dagegen verteidigen kann.
+
+Was ist eine Bedrohung, wenn es um Computer-Sicherheit geht? Bedrohungen beschränken sich nicht nur auf entfernte Angreifer, die sich unerlaubten Zugriff auf ein System verschaffen wollen. Zu den Bedrohungen zählen auch Mitarbeiter, bösartige Software, nicht autorisierte Netzwerkgeräte, Naturkatastrophen, Sicherheitslücken und sogar konkurrierende Unternehmen.
+
+Der Zugriff auf Netzwerke und Systeme erfolgt ohne Erlaubnis, manchmal durch Zufall, oder von entfernten Angreifern, und in einigen Fällen durch Industriespionage oder ehemalige Mitarbeiter. Als Anwender müssen Sie vorbereitet sein und auch zugeben, wenn ein Fehler zu einer Sicherheitsverletzung geführt hat. Melden Sie Probleme umgehend dem verantwortlichen Sicherheitspersonal. Als Administrator ist es wichtig, Bedrohungen zu kennen und darauf vorbereitet zu sein, mögliche Schäden zu mildern.
+
+Wenn Sicherheit auf Systeme angewendet wird, empfiehlt es sich mit der Sicherung der Benutzerkonten zu beginnen und dann die Netzwerkschicht zu sichern. Dabei ist zu beachten, dass die Sicherheitsrichtlinien des Systems und des Unternehmens eingehalten werden. Viele Unternehmen haben bereits eine Sicherheitsrichtlinie, welche die Konfiguration von technischen Geräten abdeckt. Die Richtlinie sollte die Konfiguration von Arbeitsplatzrechnern, Desktops, mobilen Geräten, Mobiltelefonen, Produktions- und Entwicklungsservern umfassen. In einigen Fällen ist bereits eine Standardvorgehensweise vorhanden. Fragen Sie im Zweifelsfall das Sicherheitspersonal.
+
+Der übrige Teil dieser Einführung beschreibt, wie einige grundlegende Sicherheitskonfigurationen auf einem FreeBSD-System durchgeführt werden. Der Rest des Kapitels zeigt einige spezifische Werkzeuge, die verwendet werden können, um eine Sicherheitsrichtlinie auf einem FreeBSD-System zu implementieren.
+
+[[security-accounts]]
+=== Anmeldungen am System verhindern
+
+Ein guter Ausgangspunkt für die Absicherung des Systems ist die Prüfung der Benutzerkonten. Stellen Sie sicher, dass `root` ein starkes Passwort besitzt und dass dieses Passwort nicht weitergegeben wird. Deaktivieren Sie alle Konten, die keinen Zugang zum System benötigen.
+
+Es existieren zwei Methoden, um die Anmeldung über ein Benutzerkonto zu verweigern. Die erste Methode ist, das Konto zu sperren. Dieses Beispiel sperrt das Benutzerkonto `toor`:
+
+[source,bash]
+....
+# pw lock toor
+....
+
+Bei der zweiten Methode wird der Anmeldevorgang verhindert, indem die Shell auf [.filename]#/usr/sbin/nologin# gesetzt wird. Nur der Superuser kann die Shell für andere Benutzer ändern:
+
+[source,bash]
+....
+# chsh -s /usr/sbin/nologin toor
+....
+
+Die Shell [.filename]#/usr/sbin/nologin# verhindert, dass dem Benutzer bei der Anmeldung am System eine Shell zugeordnet wird.
+
+[[security-accountmgmt]]
+=== Gemeinsame Nutzung von Benutzerkonten
+
+In manchen Fällen wird die Systemadministration auf mehrere Benutzer aufgeteilt. FreeBSD bietet zwei Methoden, um solche Situationen zu handhaben. Bei der ersten und nicht empfohlenen Methode wird ein gemeinsames root Passwort der Mitglieder der Gruppe `wheel` verwendet. Hier gibt der Benutzer `su` und das Passwort für `wheel` ein, wenn er die Rechte des Superusers benötigt. Der Benutzer sollte dann nach der Beendigung der administrativen Aufgaben `exit` eingeben. Um einen Benutzer zu dieser Gruppe hinzuzufügen, bearbeiten Sie [.filename]#/etc/group# und fügen Sie den Benutzer an das Ende des Eintrags `wheel` hinzu. Die Benutzer müssen durch Komma und ohne Leerzeichen getrennt werden.
+
+Die zweite und empfohlene Methode ein Benutzerkonto zu teilen wird über den Port oder das Paket package:security/sudo[] realisiert. Dieses Programm bietet zusätzliche Prüfungen, bessere Benutzerkontrolle und es kann auch konfiguriert werden, einzelnen Benutzern Zugriff auf bestimme, privilegierte Befehle zu gestatten.
+
+Benutzen Sie nach der Installation `visudo`, um [.filename]#/usr/local/etc/sudoers# zu bearbeiten. Dieses Beispiel erstellt eine neue Gruppe `webadmin` und fügt das Benutzerkonto `trhodes` dieser Gruppe hinzu. Anschließend wird die Gruppe so konfiguriert, dass es Gruppenmitgliedern gestattet wird package:apache24[] neu zu starten:
+
+[source,bash]
+....
+# pw groupadd webadmin -M trhodes -g 6000
+# visudo
+%webadmin ALL=(ALL) /usr/sbin/service apache24 *
+....
+
+[[security-passwords]]
+=== Passwort-Hashes
+
+Passwörter sind ein notwendiges Übel. Wenn sie verwendet werden müssen, sollten sie sehr komplex sein und dazu sollte eine leistungsfähige Hash-Funktion gewählt werden, um die Version des Passworts zu verschlüsseln, die in der Passwortdatenbank gespeichert wird. FreeBSD unterstützt die Hash-Funktionen DES, MD5, SHA256, SHA512, sowie Blowfish Hash-Funktionen in seiner `crypt()`-Bibliothek. Das in der Voreinstellung verwendete SHA512 sollte nicht durch eine weniger sichere Hash-Funktion getauscht werden. Es kann jedoch durch den besseren Blowfish-Algorithmus ersetzt werden.
+
+[NOTE]
+====
+Blowfish ist nicht Bestandteil von AES und ist nicht kompatibel mit allen Federal Information Processing Standards (FIPS). Die Verwendung wird in einigen Umgebungen vielleicht nicht gestattet.
+====
+
+Um zu bestimmen, welche Hash-Funktion das Passwort eines Benutzers verschlüsselt, kann der Superuser den Hash für den Benutzer in der Passwortdatenbank von FreeBSD nachsehen. Jeder Hash beginnt mit einem Zeichen, mit dem die verwendete Hash-Funktion identifiziert werden kann. Bei DES gibt es allerdings kein führendes Zeichen. MD5 benutzt das Zeichen `$`. SHA256 und SHA512 verwenden das Zeichen `$6$`. Blowfish benutzt das Zeichen `$2a$`. In diesem Beispiel wird das Passwort von `dru` mit dem Hash-Algorithmus SHA512 verschlüsselt, da der Hash mit `$6$` beginnt. Beachten Sie, dass der verschlüsselte Hash und nicht das Passwort selbst, in der Passwortdatenbank gespeichert wird:
+
+[source,bash]
+....
+# grep dru /etc/master.passwd
+dru:$6$pzIjSvCAn.PBYQBA$PXpSeWPx3g5kscj3IMiM7tUEUSPmGexxta.8Lt9TGSi2lNQqYGKszsBPuGME0:1001:1001::0:0:dru:/usr/home/dru:/bin/csh
+....
+
+Der Hash-Mechanismus wird in der Login-Klasse des Benutzers festgelegt. In diesem Beispiel wird die voreingestellte Login-Klasse für den Benutzer verwendet. Der Hash-Algorithmus wird mit dieser Zeile in [.filename]#/etc/login.conf# gesetzt:
+
+[.programlisting]
+....
+ :passwd_format=sha512:\
+....
+
+Um den Algorithmus auf Blowfish zu ändern, passen Sie die Zeile wie folgt an:
+
+[.programlisting]
+....
+ :passwd_format=blf:\
+....
+
+Führen Sie anschließend `cap_mkdb /etc/login.conf` aus, wie in <<users-limiting>> beschrieben. Beachten Sie, dass vorhandene Passwort-Hashes durch diese Änderung nicht beeinträchtigt werden. Das bedeutet, dass alle Passwörter neu gehasht werden sollten, indem die Benutzer mit `passwd` ihr Passwort ändern.
+
+Für die Anmeldung auf entfernten Rechnern sollte eine Zwei-Faktor-Authentifizierung verwendet werden. Ein Beispiel für eine Zwei-Faktor-Authentifizierung ist "etwas, was Sie besitzen" (bspw. einen Schlüssel) und "etwas, was Sie wissen" (bspw. das Passwort für diesen Schlüssel). Da OpenSSH Teil des FreeBSD-Basissystems ist, sollten alle Anmeldungen über das Netzwerk über eine verschlüsselte Verbindung mit einer schlüsselbasierten Authentifizierung stattfinden. Passwörter sollten hier nicht verwendet werden. Weitere Informationen finden Sie in <<openssh>>. Kerberos-Benutzer müssen eventuell zusätzliche Änderungen vornehmen, um OpenSSH in Ihrem Netzwerk zu implementieren. Diese Änderungen sind in <<kerberos5>> beschrieben.
+
+[[security-pwpolicy]]
+=== Durchsetzung einer Passwort-Richtlinie
+
+Die Durchsetzung einer starken Passwort-Richtlinie für lokale Benutzerkonten ist ein wesentlicher Aspekt der Systemsicherheit. In FreeBSD kann die Länge, Stärke und Komplexität des Passworts mit den Pluggable Authentication Modules (PAM) implementiert werden.
+
+In diesem Abschnitt wird gezeigt, wie Sie die minimale und maximale Passwortlänge und die Durchsetzung von gemischten Zeichen mit dem Modul [.filename]#pam_passwdqc.so# konfigurieren. Dieses Modul wird aufgerufen, wenn ein Benutzer sein Passwort ändert.
+
+Um dieses Modul zu konfigurieren, müssen Sie als Superuser die Zeile mit `pam_passwdqc.so` in [.filename]#/etc/pam.d/passwd# auskommentieren. Anschließend bearbeiten Sie die Zeile, so dass sie den vorliegenden Passwort-Richtlinien entspricht:
+
+[.programlisting]
+....
+password requisite pam_passwdqc.so min=disabled,disabled,disabled,12,10 similar=deny retry=3 enforce=users
+....
+
+Dieses Beispiel legt gleich mehrere Anforderungen für neue Passwörter fest. Die Einstellung `min` kontrolliert die Passwortlänge. Es verfügt über fünf Werte, weil dieses Modul fünf verschiedene Arten von Passwörtern definiert, basierend auf der Komplexität. Die Komplexität wird durch die Art von Zeichen definiert, die in einem Passwort vorhanden sind, wie zum Beispiel Buchstaben, Zahlen und Sonderzeichen. Die verschiedenen Arten von Passwörtern werden in man:pam_passwdqc[8] beschrieben. In diesem Beispiel sind die ersten drei Arten von Passwörtern deaktiviert, was bedeutet, dass Passwörter, die dieser Komplexitätsstufe entsprechen, nicht akzeptiert werden, unabhängig von der Länge des Passworts. Die `12` legt eine Richtlinie von mindestens zwölf Zeichen fest, wenn das Passwort auch drei Arten von Komplexität aufweist. Die `10` legt eine Richtlinie fest, die auch Passwörter mit mindestens zehn Zeichen zulassen, wenn das Passwort Zeichen mit vier Arten von Komplexität aufweist.
+
+Die Einstellung `similar` verbietet Passwörter, die dem vorherigen Passwort des Benutzers ähnlich sind. Die Einstellung `retry` bietet dem Benutzer drei Möglichkeiten, ein neues Passwort einzugeben.
+
+Sobald diese Datei gespeichert wird, sehen Benutzer bei der Änderung ihres Passworts die folgende Meldung:
+
+[source,bash]
+....
+% passwd
+Changing local password for trhodes
+Old Password:
+
+You can now choose the new password.
+A valid password should be a mix of upper and lower case letters,
+digits and other characters. You can use a 12 character long
+password with characters from at least 3 of these 4 classes, or
+a 10 character long password containing characters from all the
+classes. Characters that form a common pattern are discarded by
+the check.
+Alternatively, if noone else can see your terminal now, you can
+pick this as your password: "trait-useful&knob".
+Enter new password:
+....
+
+Wenn ein Passwort nicht den Richtlinien entspricht, wird es mit einer Warnung abgelehnt und der Benutzer bekommt die Möglichkeit, es erneut zu versuchen, bis die Anzahl an Wiederholungen erreicht ist.
+
+Die meisten Passwort-Richtlinien erzwingen, dass Passwörter nach einer bestimmten Anzahl von Tagen ablaufen. Um dieses Limit in FreeBSD zu konfigurieren, setzen Sie es für die Login-Klasse des Benutzers in [.filename]#/etc/login.conf#. Die voreingestellte Login-Klasse enthält dazu ein Beispiel:
+
+[.programlisting]
+....
+# :passwordtime=90d:\
+....
+
+Um für diese Login-Klasse das Passwort nach 90 Tagen ablaufen zu lassen, entfernen Sie das Kommentarzeichen (`#`), speichern Sie die Änderungen und führen Sie `cap_mkdb /etc/login.conf` aus.
+
+Um das Passwort für einzelne Benutzer ablaufen zu lassen, geben Sie `pw` ein Ablaufdatum oder die Anzahl von Tagen, zusammen mit dem Benutzer an:
+
+[source,bash]
+....
+# pw usermod -p 30-apr-2015 -n trhodes
+....
+
+Wie zu sehen ist, wird das Ablaufdatum in der Form von Tag, Monat und Jahr angegeben. Weitere Informationen finden Sie in man:pw[8].
+
+[[security-rkhunter]]
+=== Erkennen von Rootkits
+
+Ein _Rootkit_ ist eine nicht autorisierte Software die versucht, Root-Zugriff auf ein System zu erlangen. Einmal installiert, wird diese bösartige Software normalerweise eine Hintertür für den Angreifer installieren. Realistisch betrachtet sollte ein durch ein Rootkit kompromittiertes System nach der Untersuchung von Grund auf neu installiert werden. Es besteht jedoch die enorme Gefahr, dass sogar das Sicherheitspersonal oder Systemingenieure etwas übersehen, was ein Angreifer dort platziert hat.
+
+Wird ein Rootkit erkannt, ist dies bereits ein Zeichen dafür, dass das System an einem bestimmten Zeitpunkt kompromittiert wurde. Meist neigen diese Art von Anwendungen dazu, sehr gut versteckt zu sein. Dieser Abschnitt zeigt das Werkzeug package:security/rkhunter[], mit dem Rootkits erkannt werden können.
+
+Nach der Installation dieses Ports oder Pakets kann das System mit dem folgenden Kommando überprüft werden. Das Programm generiert eine ganze Menge Informationen und Sie werden diverse Male kbd:[ENTER] drücken müssen:
+
+[source,bash]
+....
+# rkhunter -c
+....
+
+Nachdem der Prozess abgeschlossen ist, wird eine Statusmeldung auf dem Bildschirm ausgegeben. Die Meldung enthält die Anzahl der überprüften Dateien, verdächtige Dateien, mögliche Rootkits und weitere Informationen. Während der Überprüfung erscheinen allgemeine Sicherheitswarnungen, zum Beispiel über versteckte Dateien, die Auswahl von OpenSSH-Protokollen und bekannte, anfällige Versionen installierter Anwendungen. Diese können nun direkt, oder nach detaillierter Analyse untersucht werden.
+
+Jeder Administrator sollte wissen, was auf den Systemen läuft, für die er verantwortlich ist. Werkzeuge von Drittanbietern, wie rkhunter oder package:sysutils/lsof[], sowie native Befehle wie `netstat` oder `ps`, können eine große Menge an Informationen über das System anzeigen. Machen Sie sich Notizen darüber, was "normal" ist, und fragen Sie nach, wenn Ihnen etwas suspekt erscheint. Eine Beeinträchtigung zu verhindern ist ideal, aber die Erkennung einer Beeinträchtigung ist ein Muss.
+
+[[security-ids]]
+=== Überprüfung von Binärdateien
+
+Die Überprüfung von System- und Binärdateien ist wichtig, da sie Systemadministratoren Informationen über Systemänderungen zur Verfügung stellt. Eine Software, die das System auf Änderungen überwacht wird Intrustion Detection System (IDS) genannt.
+
+FreeBSD bietet native Unterstützung für ein einfaches IDS-System. Obwohl die täglichen Sicherheits-E-Mails den Administrator über Änderungen in Kenntnis setzen, werden diese Informationen lokal gespeichert und es besteht die Möglichkeit, dass ein Angreifer diese Informationen manipulieren kann, um Änderungen am System zu verbergen. Daher ist es empfehlenswert, einen eigenen Satz an Signaturen zu erstellen und diese dann in einem schreibgeschützten Verzeichnis, oder vorzugsweise auf einem USB-Stick oder auf einem entfernten Server zu speichern.
+
+Das im Basissystem enthaltene Werkzeug mtree kann verwendet werden, um eine Spezifikation des Inhalts eines Verzeichnisses zu erzeugen. Hierbei wird ein Startwert (Seed) oder eine numerische Konstante benutzt, um die Spezifikation zu erstellen und um sicherzustellen, dass sich die Spezifikation nicht geändert hat. Dadurch kann festgestellt werden, ob eine Datei oder eine Binärdatei verändert wurde. Da ein Angreifer den Seed nicht kennt, ist es ihm fast unmöglich die Prüfsummen von Dateien zu manipulieren. Das folgende Beispiel generiert einen Satz mit SHA256-Prüfsummen für jede Binärdatei unterhalb von [.filename]#/bin# und speichert diese Werte in einer versteckten Datei im Heimatverzeichnis von `root` unter dem Namen [.filename]#/root/.bin_chksum_mtree#:
+
+[source,bash]
+....
+# mtree -s 3483151339707503 -c -K cksum,sha256digest -p /bin > /root/.bin_chksum_mtree
+# mtree: /bin checksum: 3427012225
+....
+
+_3483151339707503_ stellt den Seed dar. Diesen Wert sollten Sie sich merken, aber nicht mit anderen Personen teilen.
+
+Die Ausgabe von [.filename]#/root/.bin_chksum_mtree# sollte ähnlich der folgenden sein:
+
+[.programlisting]
+....
+# user: root
+# machine: dreadnaught
+# tree: /bin
+# date: Mon Feb 3 10:19:53 2014
+
+# .
+/set type=file uid=0 gid=0 mode=0555 nlink=1 flags=none
+. type=dir mode=0755 nlink=2 size=1024 \
+ time=1380277977.000000000
+ \133 nlink=2 size=1170 time=1380277977.000000000 \
+ cksum=484492447 \
+ sha256digest=6207490fbdb5ed1904441fbfa941279055c3e24d3a4049aeb45094596400662a
+ cat size=12096 time=1380277975.000000000 cksum=3909216944 \
+ sha256digest=65ea347b9418760b247ab10244f47a7ca2a569c9836d77f074e7a306900c1e69
+ chflags size=8168 time=1380277975.000000000 cksum=3949425175 \
+ sha256digest=c99eb6fc1c92cac335c08be004a0a5b4c24a0c0ef3712017b12c89a978b2dac3
+ chio size=18520 time=1380277975.000000000 cksum=2208263309 \
+ sha256digest=ddf7c8cb92a58750a675328345560d8cc7fe14fb3ccd3690c34954cbe69fc964
+ chmod size=8640 time=1380277975.000000000 cksum=2214429708 \
+ sha256digest=a435972263bf814ad8df082c0752aa2a7bdd8b74ff01431ccbd52ed1e490bbe7
+....
+
+Der Report enthält den Rechnernamen, das Datum und die Uhrzeit der Spezifikation, sowie den Namen des Benutzers, der die Spezifikation erstellt hat. Für jede Binärdatei im Verzeichnis gibt es eine Prüfsumme, Größe, Uhrzeit und einen SHA256-Hashwert.
+
+Um sicherzustellen, dass die binären Signaturen nicht verändert wurden, vergleichen Sie den Inhalt des aktuellen Verzeichnisses mit der zuvor erstellen Spezifikation. Speichern Sie die Ergebnisse in einer Datei. Dieses Kommando benötigt den Seed, der verwendet wurde um die ursprüngliche Spezifikation zu erstellen:
+
+[source,bash]
+....
+# mtree -s 3483151339707503 -p /bin < /root/.bin_chksum_mtree >> /root/.bin_chksum_output
+# mtree: /bin checksum: 3427012225
+....
+
+Dies sollte die gleiche Prüfsumme für [.filename]#/bin# produzieren, wie die ursprüngliche Spezifikation. Wenn keine Änderungen an den Binärdateien in diesem Verzeichnis aufgetreten sind, wird die Ausgabedatei [.filename]#/root/.bin_chksum_output# leer sein. Um eine Änderung zu simulieren, ändern Sie mit `touch` das Datum von [.filename]#/bin/cat# und führen Sie die Verifikation erneut aus:
+
+[source,bash]
+....
+# touch /bin/cat
+# mtree -s 3483151339707503 -p /bin < /root/.bin_chksum_mtree >> /root/.bin_chksum_output
+# more /root/.bin_chksum_output
+cat changed
+ modification time expected Fri Sep 27 06:32:55 2013 found Mon Feb 3 10:28:43 2014
+....
+
+Es wird empfohlen, Spezifikationen für Verzeichnisse zu erstellen, welche Binärdateien, Konfigurationsdateien und sensible Daten enthalten. In der Regel werden Spezifikationen für [.filename]#/bin#, [.filename]#/sbin#, [.filename]#/usr/bin#, [.filename]#/usr/sbin#, [.filename]#/usr/local/bin#, [.filename]#/usr/local/sbin#, [.filename]#/etc# und [.filename]#/usr/local/etc# erstellt.
+
+Mit package:security/aide[] steht ein fortgeschrittenes IDS-System zur Verfügung, aber in den meisten Fällen bietet `mtree` die Funktionalität, die von Administratoren benötigt wird. Es ist jedoch sehr wichtig den Seed und die Prüfsummen in der Ausgabe vor böswilligen Benutzern verborgen zu halten. Weitere Informationen zu `mtree` finden Sie in man:mtree[8].
+
+[[security-tuning]]
+=== System-Tuning für Sicherheit
+
+Unter FreeBSD können viele Systemfunktionen mit `sysctl` konfiguriert werden. Dieser Abschnitt behandelt ein paar Sicherheitsmerkmale mit denen Denial of Service (DoS) verhindert werden sollen. Weitere Informationen über die Benutzung von `sysctl` und wie Werte vorübergehend oder auch permanent geändert werden können, finden Sie in crossref:config[configtuning-sysctl,“Einstellungen mit sysctl(8)”].
+
+[NOTE]
+====
+Jedes Mal wenn eine Einstellung mit `sysctl` geändert wird, vergrößert sich die Wahrscheinlichkeit eines unerwünschten Schadens, was die Verfügbarkeit des Systems beeinflusst. Alle Änderungen sollten überwacht und wenn möglich, vorher auf einem Testsystem ausprobiert werden, bevor sie auf einem Produktivsystem verwendet werden.
+====
+
+In der Voreinstellung startet FreeBSD in der Sicherheitsstufe (Securelevel) `-1`. Dieser Modus wird "unsicherer Modus" genannt, da die unveränderlichen Datei-Flags ausgeschaltet werden können und dadurch von allen Geräten gelesen und geschrieben werden kann. Solange die Einstellung nicht über `sysctl` oder in den Startskripten geändert wird, verbleibt die Sicherheitsstufe auf `-1`. Die Sicherheitsstufe kann während des Systemstarts erhöht werden. Dazu muss in [.filename]#/etc/rc.conf#`kern_securelevel_enable` auf `YES` und `kern_securelevel` auf den gewünschten Wert gesetzt werden. Weitere Informationen zu diesen Einstellungen und den verfügbaren Sicherheitsstufen finden Sie in man:security[7] und man:init[8].
+
+[WARNING]
+====
+
+Das Erhöhen der Sicherheitsstufe kann zu Problemen mit Xorg führen.
+====
+
+Die Einstellungen `net.inet.tcp.blackhole` und `net.inet.udp.blackhole` können benutzt werden, um eingehende SYN-Pakete an geschlossenen Ports zu blockieren, ohne ein RST-Paket als Antwort zu senden. Standardmäßig wird jedoch ein RST-Paket gesendet, um zu zeigen, dass der Port geschlossen ist. Das ändern dieser Voreinstellung bietet einen gewissen Schutz gegen Portscans. Diese Portscans versuchen herauszufinden, welche Anwendungen auf einem System ausgeführt werden. Setzen Sie `net.inet.tcp.blackhole` auf `2` und `net.inet.udp.blackhole` auf `1`. Weitere Informationen zu diesen Einstellungen finden Sie in man:blackhole[4].
+
+Die Einstellung `net.inet.icmp.drop_redirect` hilft dabei, sogenannte Redirect-Angriffe zu verhindern. Ein Redirect-Angriff ist eine Art von DoS, die massenhaft ICMP-Pakete Typ 5 versendet. Da solche Pakete nicht benötigt werden, setzen Sie `net.inet.icmp.drop_redirect` auf `1` und `net.inet.ip.redirect` auf `0`.
+
+Source Routing zur Erfassung und zum Zugriff auf nicht-routbare Adressen im internen Netzwerk. Dies sollte deaktiviert werden, da nicht-routbare Adressen in der Regel nicht absichtlich geroutet werden. Um diese Funktion zu deaktivieren, setzen Sie `net.inet.ip.sourceroute` und `net.inet.accept_sourceroute` auf `0`.
+
+Wenn ein Netzwerkgerät Nachrichten an alle Rechner in einem Subnetz senden muss, wird eine ICMP-Echo-Request Nachricht an die Broadcast-Adresse gesendet. Allerdings gibt es keinen guten Grund für externe Rechner, solche Nachrichten zu verschicken. Um alle externen Broadcast-Anfragen abzulehnen, setzen Sie `net.inet.icmp.bmcastecho` auf `0`.
+
+Einige zusätzliche Einstellungen sind in man:security[7] dokumentiert.
+
+[[one-time-passwords]]
+== Einmalpasswörter
+
+In der Voreinstellung unterstützt FreeBSD One-time Passwords in Everything (OPIE). OPIE wurde konzipiert um Replay-Angriffe zu verhindern, bei dem ein Angreifer das Passwort eines Benutzers ausspäht und es benutzt, um Zugriff auf ein System zu erlangen. Da ein Passwort unter OPIE nur einmal benutzt wird, ist ein ausgespähtes Passwort für einen Angreifer nur von geringem Nutzen. OPIE verwendet eine sichere Hash-Funktion und ein Challenge/Response-System, um Passwörter zu verwalten. Die FreeBSD-Implementation verwendet in der Voreinstellung die MD5-Hash-Funktion.
+
+OPIE verwendet drei verschiedene Arten von Passwörtern. Das erste ist das normale UNIX(R)- oder Kerberos-Passwort. Das zweite ist das Einmalpasswort, das von `opiekey` generiert wird. Das dritte Passwort ist das "geheime Passwort", das zum Erstellen der Einmalpasswörter verwendet wird. Das geheime Passwort steht in keiner Beziehung zum UNIX(R)-Passwort und beide Passwörter sollten unterschiedlich sein.
+
+Es gibt noch zwei weitere Werte, die für OPIE wichtig sind. Der erste ist der "Initialwert" (engl. seed oder key), der aus zwei Buchstaben und fünf Ziffern besteht. Der zweite Wert ist der "Iterationszähler", eine Zahl zwischen 1 und 100. OPIE generiert das Einmalpasswort, indem es den Initialwert und das geheime Passwort aneinander hängt und dann die MD5-Hash-Funktion so oft, wie durch den Iterationszähler gegeben, anwendet. Das Ergebnis wird in sechs englische Wörter umgewandelt, die das Einmalpasswort ergeben. Das Authentifizierungssystem (meistens PAM) merkt sich das zuletzt benutzte Einmalpasswort und der Benutzer ist authentifiziert, wenn die Hash-Funktion des Passworts dem vorigen Passwort entspricht. Da nicht umkehrbare Hash-Funktionen benutzt werden, ist es unmöglich, aus einem bekannten Passwort weitere gültige Einmalpasswörter zu berechnen. Der Iterationszähler wird nach jeder erfolgreichen Anmeldung um eins verringert und stellt so die Synchronisation zwischen Benutzer und Login-Programm sicher. Wenn der Iterationszähler den Wert `1` erreicht, muss OPIE neu initialisiert werden.
+
+Es gibt ein paar Programme, die in diesen Prozess einbezogen werden. Ein Einmalpasswort oder eine Liste von Einmalpasswörtern, die von man:opiekey[1] durch Angabe eines Iterationszählers, eines Initalwertes und einem geheimen Passwort generiert wird. man:opiepasswd[1] wird benutzt, um Passwörter, Iterationszähler oder Initialwerte zu ändern. man:opieinfo[1] hingegen gibt den momentanen Iterationszähler und Initialwert eines Benutzers aus, den es aus [.filename]#/etc/opiekeys# ermittelt.
+
+Dieser Abschnitt beschreibt vier verschiedene Arten von Tätigkeiten. Zuerst wird erläutert, wie Einmalpasswörter über eine gesicherte Verbindung konfiguriert werden. Als nächstes wird erklärt, wie `opiepasswd` über eine nicht gesicherte Verbindung eingesetzt wird. Als drittes wird beschrieben, wie man sich über eine nicht gesicherte Verbindung anmeldet. Die vierte Tätigkeit beschreibt, wie man eine Reihe von Schlüsseln generiert, die man sich aufschreiben oder ausdrucken kann, um sich von Orten anzumelden, die über keine gesicherten Verbindungen verfügen.
+
+=== OPIE initialisieren
+
+Um OPIE erstmals zu initialisieren, rufen Sie man:opiepasswd[1] über eine gesicherte Verbindung auf:
+
+[source,bash]
+....
+% opiepasswd -c
+[grimreaper] ~ $ opiepasswd -f -c
+Adding unfurl:
+Only use this method from the console; NEVER from remote. If you are using
+telnet, xterm, or a dial-in, type ^C now or exit with no password.
+Then run opiepasswd without the -c parameter.
+Using MD5 to compute responses.
+Enter new secret pass phrase:
+Again new secret pass phrase:
+
+ID unfurl OTP key is 499 to4268
+MOS MALL GOAT ARM AVID COED
+....
+
+Die Option `-c` startet den Konsolen-Modus, der davon ausgeht, dass der Befehl von einem sicherem Ort ausgeführt wird. Dies kann beispielsweise der eigene Rechner sein, oder über eine mit SSH gesicherte Verbindung zum eigenen Rechner.
+
+Geben Sie das geheime Passwort ein, wenn Sie danach gefragt werden. Damit werden die Einmalpasswörter generiert. Dieses Passwort sollte schwer zu erraten sein und sich ebenfalls vom Passwort des Bentuzerkontos unterscheiden. Es muss zwischen 10 und 127 Zeichen lang sein. Prägen Sie sich dieses Passwort gut ein!
+
+Die Zeile, die mit "ID" beginnt, enthält den Login-Namen (`unfrul`), den voreingestellten Iterationszähler (`499`) und den Initialwert (`to4268`). Das System erinnert sich an diese Parameter und wird sie bei einem Anmeldeversuch anzeigen. Sie brauchen sich diese Dinge also nicht merken. Die letzte Zeile enthält das generierte Einmalpasswort, das aus den Parametern und dem geheimen Passwort ermittelt wurde. Bei der nächsten Anmeldung muss dann diese Einmalpasswort benutzt werden.
+
+=== Initialisierung über eine nicht gesicherte Verbindung
+
+Um Einmalpasswörter über eine nicht gesicherte Verbindung zu initialisieren, oder das geheime Passwort zu ändern, müssen Sie über eine gesicherte Verbindung zu einer Stelle verfügen, an der Sie `opiekey` ausführen können. Dies kann etwa die Eingabeaufforderung auf einer Maschine sein, der Sie vertrauen. Zudem müssen Sie einen Iterationszähler vorgeben (100 ist ein guter Wert) und einen Initialwert wählen, wobei Sie auch einen zufällig generierten benutzen können. Benutzen Sie man:opiepasswd[1] über die ungesicherte Verbindung zu der Maschine, die Sie einrichten wollen:
+
+[source,bash]
+....
+% opiepasswd
+
+Updating unfurl:
+You need the response from an OTP generator.
+Old secret pass phrase:
+ otp-md5 498 to4268 ext
+ Response: GAME GAG WELT OUT DOWN CHAT
+New secret pass phrase:
+ otp-md5 499 to4269
+ Response: LINE PAP MILK NELL BUOY TROY
+
+ID mark OTP key is 499 gr4269
+LINE PAP MILK NELL BUOY TROY
+....
+
+Drücken Sie kbd:[Return], um die Vorgabe für den Initialwert zu akzeptieren. Bevor Sie nun das Zugriffspasswort (engl. access password) eingeben, rufen Sie über die gesicherte Verbindung `opikey` mit denselben Parametern auf:
+
+[source,bash]
+....
+% opiekey 498 to4268
+Using the MD5 algorithm to compute response.
+Reminder: Don not use opiekey from telnet or dial-in sessions.
+Enter secret pass phrase:
+GAME GAG WELT OUT DOWN CHAT
+....
+
+Gehen Sie zurück zu der nicht gesicherten Verbindung und geben dort das eben generierte Einmalpasswort ein.
+
+=== Erzeugen eines einzelnen Einmalpasswortes
+
+Nachdem Sie OPIE eingerichtet haben, werden Sie beim nächsten Anmelden wie folgt begrüßt:
+
+[source,bash]
+....
+% telnet example.com
+Trying 10.0.0.1...
+Connected to example.com
+Escape character is '^]'.
+
+FreeBSD/i386 (example.com) (ttypa)
+
+login: <username>
+otp-md5 498 gr4269 ext
+Password:
+....
+
+OPIE besitzt eine nützliche Eigenschaft. Wenn Sie an der Eingabeaufforderung kbd:[Return] drücken, wird die echo-Funktion eingeschaltet, das heißt Sie sehen, was Sie tippen. Dies ist besonders nützlich, wenn Sie ein generiertes Passwort von einem Ausdruck abtippen müssen.
+
+Jetzt müssen Sie das Einmalpasswort generieren, um der Anmeldeaufforderung nachzukommen. Dies muss auf einem gesicherten System geschehen, auf dem Sie man:opiekey[1] ausführen können. Dieses Programm gibt es auch für Windows(R), Mac OS(R) und FreeBSD. Es benötigt den Iterationszähler sowie den Initialwert als Parameter, die Sie mittels "cut-and-paste" direkt von der Login-Aufforderung nehmen können.
+
+Auf dem sicheren System:
+
+[source,bash]
+....
+% opiekey 498 to4268
+Using the MD5 algorithm to compute response.
+Reminder: Do not use opiekey from telnet or dial-in sessions.
+Enter secret pass phrase:
+GAME GAG WELT OUT DOWN CHAT
+....
+
+Sobald das Einmalpasswort generiert wurde, können Sie die Anmeldeprozedur fortsetzen.
+
+=== Erzeugen von mehreren Einmalpasswörtern
+
+Manchmal haben Sie keinen Zugriff auf eine sichere Maschine oder eine sichere Verbindung. In diesem Fall können Sie vorher mit man:opiekey[1] einige Einmalpasswörter generieren. Zum Beispiel:
+
+[source,bash]
+....
+% opiekey -n 5 30 zz99999
+Using the MD5 algorithm to compute response.
+Reminder: Do not use opiekey from telnet or dial-in sessions.
+Enter secret pass phrase: <secret password>
+26: JOAN BORE FOSS DES NAY QUIT
+27: LATE BIAS SLAY FOLK MUCH TRIG
+28: SALT TIN ANTI LOON NEAL USE
+29: RIO ODIN GO BYE FURY TIC
+30: GREW JIVE SAN GIRD BOIL PHI
+....
+
+Mit `-n 5` fordern Sie fünf Passwörter der Reihe nach an. Der letzte Iterationszähler wird durch `30` gegeben. Beachten Sie bitte, dass die Passwörter in der _umgekehrten_ Reihenfolge, in der sie zu benutzen sind, ausgeben werden. Wirklich paranoide Benutzer können sich jetzt die Passwörter aufschreiben oder ausdrucken. Sie sollten die Passwörter nach Gebrauch durchstreichen.
+
+=== Einschränken der Benutzung von System-Passwörtern
+
+OPIE kann die Verwendung von UNIX(R)-Passwörtern abhängig von der IP-Adresse einschränken. Die dazu nötigen Einstellungen werden in [.filename]#/etc/opieaccess# vorgenommen, die bei der Installation des Systems automatisch erzeugt wird. Weitere Informationen über diese Datei und Sicherheitshinweise zu ihrer Verwendung finden Sie in man:opieaccess[5].
+
+[.filename]#opieaccess# könnte beispielsweise die folgende Zeile enthalten:
+
+[.programlisting]
+....
+permit 192.168.0.0 255.255.0.0
+....
+
+Diese Zeile erlaubt es Benutzern, die sich von einer der angegebenen IP-Adressen anmelden, ihr UNIX(R)-Passwort zu verwenden. Beachten Sie bitte, dass eine IP-Adresse leicht gefälscht werden kann.
+
+Findet sich in [.filename]#opieaccess# kein passender Eintrag, muss die Anmeldung mit OPIE erfolgen.
+
+[[tcpwrappers]]
+== TCP Wrapper
+
+TCP Wrapper ist ein rechnerbasiertes Zugriffskontrollsystem, das die Fähigkeiten von crossref:network-servers[network-inetd,“Der inetd Super-Server”] erweitert. Beispielsweise können Verbindungen protokolliert, Nachrichten zurückgesandt oder nur interne Verbindungen angenommen werden. Weitere Informationen über TCP Wrapper und dessen Funktionen finden Sie in man:tcpd[8].
+
+TCP Wrapper sollten nicht als Ersatz für eine ordentlich konfigurierte Firewall angesehen werden. Stattdessen sollten TCP Wrapper in Verbindung mit einer Firewall und anderen Sicherheitsmechanismen eingesetzt werden, um bei der Umsetzung einer Sicherheitsrichtlinie eine weitere Sicherheitsschicht zu bieten.
+
+=== Konfiguration
+
+Um TCP Wrapper unter FreeBSD zu aktivieren, fügen Sie die folgenden Zeilen in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+inetd_enable="YES"
+inetd_flags="-Ww"
+....
+
+Anschließend muss [.filename]#/etc/hosts.allow# richtig konfiguriert werden.
+
+[NOTE]
+====
+Im Gegensatz zu anderen Implementierungen der TCP Wrapper wird unter FreeBSD vom Gebrauch der Datei [.filename]#hosts.deny# abgeraten. Die Konfiguration sollte sich vollständig in [.filename]#/etc/hosts.allow# befinden.
+====
+
+In der einfachsten Konfiguration werden Dienste abhängig von den Optionen in [.filename]#/etc/hosts.allow# erlaubt oder gesperrt. Unter FreeBSD wird in der Voreinstellung jeder von inetd gestartete Dienst erlaubt.
+
+Eine Konfigurationszeile ist wie folgt aufgebaut: `Dienst : Adresse : Aktion`. `Dienst` ist der von inetd gestartete Dienst (auch Daemon genannt). Die `Adresse` ist ein gültiger Rechnername, eine IP-Adresse oder eine IPv6-Adresse in Klammern (`[ ]`). Der Wert `allow` im Feld `Aktion` erlaubt Zugriffe, der Wert `deny` verbietet Zugriffe. Die Zeilen in [.filename]#hosts.allow# werden für jede Verbindung der Reihe nach abgearbeitet. Trifft eine Zeile auf eine Verbindung zu, wird die entsprechende Aktion ausgeführt und die Abarbeitung ist beendet.
+
+Um beispielsweise einkommende POP3-Verbindungen für den Dienst package:mail/qpopper[] zu erlauben, sollte [.filename]#hosts.allow# um die nachstehende Zeile erweitert werden:
+
+[.programlisting]
+....
+# This line is required for POP3 connections:
+qpopper : ALL : allow
+....
+
+Jedes Mal, wenn diese Datei bearbeitet wird, muss inetd neu gestartet werden:
+
+[source,bash]
+....
+# service inetd restart
+....
+
+=== Erweiterte Konfiguration
+
+TCP Wrapper besitzen weitere Optionen, die bestimmen, wie Verbindungen behandelt werden. In einigen Fällen ist es gut, wenn bestimmten Rechnern oder Diensten eine Nachricht geschickt wird. In anderen Fällen soll vielleicht der Verbindungsaufbau protokolliert oder eine E-Mail an einen Administrator versandt werden. Oder ein Dienst soll nur für das lokale Netz bereitstehen. Dies alles ist mit so genannten Wildcards, Metazeichen und der Ausführung externer Programme möglich.
+
+Stellen Sie sich vor, eine Verbindung soll verhindert werden und gleichzeitig soll dem Rechner, der die Verbindung aufgebaut hat, eine Nachricht geschickt werden. Solch eine Aktion ist mit `twist` möglich. `twist` führt beim Verbindungsaufbau ein Kommando oder ein Skript aus. Ein Beispiel ist in [.filename]#hosts.allow# enthalten:
+
+[.programlisting]
+....
+# Alle anderen Dienste sind geschützt
+ALL : ALL \
+ : severity auth.info \
+ : twist /bin/echo "You are not welcome to use %d from %h."
+....
+
+Für jeden Dienst, der nicht vorher in [.filename]#hosts.allow# konfiguriert wurde, wird die Meldung "You are not allowed to use _daemon name_ from _hostname_." zurückgegeben. Dies ist nützlich, wenn die Gegenstelle sofort benachrichtigt werden soll, nachdem die Verbindung getrennt wurde. Der Text der Meldung _muss_ in Anführungszeichen (`"`) stehen.
+
+[WARNING]
+====
+
+Ein so konfigurierter Server ist anfällig für Denial-of-Service-Angriffe. Ein Angreifer kann die gesperrten Dienste mit Verbindungsanfragen überfluten.
+====
+
+Eine weitere Möglichkeit bietet `spawn`. Wie `twist` verbietet `spawn` die Verbindung und führt externe Kommandos aus. Allerdings sendet `spawn` dem Rechner keine Rückmeldung. Sehen Sie sich die nachstehende Konfigurationsdatei an:
+
+[.programlisting]
+....
+# Verbindungen von example.com sind gesperrt:
+ALL : .example.com \
+ : spawn (/bin/echo %a from %h attempted to access %d >> \
+ /var/log/connections.log) \
+ : deny
+....
+
+Damit sind Verbindungen von der Domain `*.example.com` gesperrt. Jeder Verbindungsaufbau wird zudem in [.filename]#/var/log/connections.log# protokolliert. Das Protokoll enthält den Rechnernamen, die IP-Adresse und den Dienst, der angesprochen wurde. In diesem Beispiel wurden die Metazeichen `%a` und `%h` verwendet. Eine vollständige Liste der Metazeichen finden Sie in man:hosts_access[5].
+
+Die Wildcard `ALL` passt auf jeden Dienst, jede Domain oder jede IP-Adresse. Eine andere Wildcard ist `PARANOID`. Sie passt auf jeden Rechner, dessen IP-Adresse möglicherweise gefälscht ist. Dies ist beispielsweise der Fall, wenn der Verbindungsaufbau von einer IP-Adresse erfolgt, die nicht zu dem übermittelten Rechnernamen passt. In diesem Beispiel werden alle Verbindungsanfragen zu Sendmail abgelehnt, wenn die IP-Adresse nicht zum Rechnernamen passt:
+
+[.programlisting]
+....
+# Block possibly spoofed requests to sendmail:
+sendmail : PARANOID : deny
+....
+
+[CAUTION]
+====
+
+Die Wildcard `PARANOID` wird Verbindungen ablehnen, wenn der Client oder der Server eine fehlerhafte DNS-Konfiguration besitzt.
+====
+
+Weitere Informationen über Wildcards und deren Funktion finden Sie in man:hosts_access[5].
+
+[NOTE]
+====
+Wenn Sie neue Einträge zur Konfiguration hinzufügen, sollten Sie sicherstellen, dass nicht benötigte Einträge in [.filename]#hosts.allow# auskommentiert werden.
+====
+
+[[kerberos5]]
+== Kerberos
+
+Kerberos ist ein Netzwerk-Authentifizierungsprotokoll, das ursprünglich am Massachusetts Institute of Technology (MIT) entwickelt wurde. Es bietet die Möglichkeit zur sicheren Authentifizierung über ein potentiell unsicheres Netzwerk. Das Kerberos-Protokoll benutzt eine starke Kryptographie, um die Identität von Clients und Servern nachweisen zu können. Dabei werden keine unverschlüsselten Daten über das Netzewrk gesendet. Kerberos kann als eine Art Proxy zur Identitätsprüfung, oder als vertrauenswürdiges Authentifizierungssystem betrachtet werden.
+
+Kerberos hat nur eine Aufgabe: Die sichere Prüfung der Identität eines Benutzers (Authentifizierung) über das Netzwerk. Das System überprüft weder die Berechtigungen der Benutzer (Autorisierung), noch verfolgt es die durchgeführten Aktionen (Audit). Daher sollte Kerberos zusammen mit anderen Sicherheits-Systemen eingesetzt werden, die diese Funktionen bereitstellen.
+
+Die aktuelle Version des Protokolls ist Version 5, die in RFC 4120 beschrieben ist. Es existieren mehrere freie Implementierungen dieses Protokolls für eine Reihe von Betriebssystemen. Das MIT entwickelt auch weiterhin seine Kerberos-Version weiter. Es wird in den vereinigten Staaten als Kryptographie-Produkt eingesetzt und unterlag in der Vergangenheit US-Exportbeschränkungen. In FreeBSD ist MIT-Kerberos als Port oder Paket package:security/krb5[] verfügbar. Die Kerberos-Implementation von Heimdal wurde außerhalb der USA entwickelt und unterliegt daher keinen Export-Beschränkungen. Heimdal-Kerberos ist im Basissystem von FreeBSD enthalten. Mit package:security/heimdal[] aus der Ports-Sammlung steht eine weitere Distribution, mit mehr konfigurierbaren Optionen zur Verfügung.
+
+Unter Kerberos werden Benutzer und Dienste als "Prinzipale" bezeichnet, die innerhalb einer administrativen Domäne, dem sogenannten "Realm" enthalten sind. Ein typisches Benutzer-Prinzipal hätte das Format `_user_@_REALM_` (Realms sind traditionell in Großbuchstaben).
+
+Die folgenden Anweisungen beschreiben, wie Sie das mit FreeBSD gelieferte Heimdal-Kerberos einrichten.
+
+Die Beschreibung der Kerberos-Installation benutzt folgende Namensräume:
+
+* Die DNS-Domain ("Zone") heißt `example.org`.
+* Das Kerberos-Realm heißt `EXAMPLE.ORG`.
+
+[NOTE]
+====
+Benutzen Sie echte Domain-Namen, wenn Sie Kerberos einrichten. Damit vermeiden Sie DNS-Probleme und stellen die Zusammenarbeit mit anderen Kerberos-Realms sicher.
+====
+
+=== Das Heimdal KDC einrichten
+
+Kerberos authentifiziert Benutzer an einer zentralen Stelle: dem Key Distribution Center (KDC). Das KDC verteilt _Tickets_, mit denen ein Dienst die Identität eines Benutzers feststellen kann. Weil alle Mitglieder eines Kerberos-Realms dem KDC vertrauen, gelten für das KDC erhöhte Sicherheitsanforderungen. Der direkte Zugriff auf das KDC sollte daher eingeschränkt sein.
+
+Obwohl der Kerberos-Server wenig Ressourcen benötigt, sollte das KDC wegen der Sicherheitsanforderungen auf einem separaten Rechner installiert werden.
+
+Installieren Sie zunächst das Paket package:security/heimdal[] wie folgt:
+
+[source,bash]
+....
+# pkg install heimdal
+....
+
+Als nächstes aktualisieren Sie [.filename]#/etc/rc.conf# mittels `sysrc`:
+
+[source,bash]
+....
+# sysrc kdc_enable=yes
+# sysrc kadmind_enable=yes
+....
+
+Danach wird [.filename]#/etc/krb5.conf# wie folgt bearbeitet:
+
+[.programlisting]
+....
+[libdefaults]
+ default_realm = EXAMPLE.ORG
+[realms]
+ EXAMPLE.ORG = {
+ kdc = kerberos.example.org
+ admin_server = kerberos.example.org
+ }
+[domain_realm]
+ .example.org = EXAMPLE.ORG
+....
+
+Diese Einstellungen setzen voraus, dass der voll qualifizierte Name des KDCs `kerberos.example.org` ist. Der Rechnername des KDC muss im DNS auflösbar sein.
+
+In großen Netzwerken mit einem ordentlich konfigurierten DNS-Server kann die Datei aus dem obigen Beispiel verkürzt werden:
+
+[.programlisting]
+....
+[libdefaults]
+ default_realm = EXAMPLE.ORG
+[domain_realm]
+ .example.org = EXAMPLE.ORG
+....
+
+Die Zonendatei von `example.org` muss dann die folgenden Zeilen enthalten:
+
+[.programlisting]
+....
+_kerberos._udp IN SRV 01 00 88 kerberos.example.org.
+_kerberos._tcp IN SRV 01 00 88 kerberos.example.org.
+_kpasswd._udp IN SRV 01 00 464 kerberos.example.org.
+_kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org.
+_kerberos IN TXT EXAMPLE.ORG
+....
+
+[NOTE]
+====
+Damit die Clients die Kerberos-Dienste benutzen können, _muss_ sie entweder eine vollständig konfigurierte [.filename]#/etc/krb5.conf# enthalten, oder eine minimale Konfiguration _und_ zusätzlich ein richtig konfigurierter DNS-Server.
+====
+
+Im nächsten Schritt wird die Kerberos-Datenbank eingerichtet. Die Datenbank enthält die Schlüssel aller Prinzipale und ist mit einem Passwort geschützt. Dieses Passwort brauchen Sie sich nicht merken, da ein davon abgeleiteter Schlüssel in [.filename]#/var/heimdal/m-key# gespeichert wird. Es wäre durchaus sinnvoll, ein 45-stelliges Zufallspasswort für diesen Zweck zu benutzten. Um den Schlüssel zu erstellen, rufen Sie `kstash` auf und geben Sie ein Passwort ein:
+
+[source,bash]
+....
+# kstash
+Master key: xxxxxxxxxxxxxxxxxxxxxxx
+Verifying password - Master key: xxxxxxxxxxxxxxxxxxxxxxx
+....
+
+Nachdem der Schlüssel erstellt wurde, sollte die Datenbank initialisiert werden. Das Kerberos-Werkzeug man:kadmin[8] kann die Datenbank mit `kadmin -l` direkt bearbeiten, ohne dabei den Netzwerkdienst man:kadmind[8] zu benutzen. An der Eingabeaufforderung von `kadmin` kann mit `init` die Datenbank des Realms initialisiert werden:
+
+[source,bash]
+....
+# kadmin -l
+kadmin> init EXAMPLE.ORG
+Realm max ticket life [unlimited]:
+....
+
+Zuletzt wird in `kadmin` mit `add` das erste Prinzipal erstellt. Benutzen Sie vorerst die voreingestellten Optionen für das Prinzipal. Die Optionen können später mit `modify` verändert werden. An der Eingabeaufforderung von man:kadmin[8] zeigt `?` die verfügbaren Optionen an.
+
+[source,bash]
+....
+kadmin> add tillman
+Max ticket life [unlimited]:
+Max renewable life [unlimited]:
+Principal expiration time [never]:
+Password expiration time [never]:
+Attributes []:
+Password: xxxxxxxx
+Verifying password - Password: xxxxxxxx
+....
+
+Jetzt können die KDC-Dienste wie folgt gestartet werden:
+
+[source,bash]
+....
+# service kdc start
+# service kadmind start
+....
+
+Obwohl zu diesem Zeitpunkt noch keine kerberisierten Dienste laufen, kann die Funktion des KDC schon überprüft werden, indem Sie für den eben angelegten Benutzer ein Ticket anfordern:
+
+[source,bash]
+....
+% kinit tillman
+tillman@EXAMPLE.ORG's Password:
+....
+
+Überprüfen Sie, ob das Ticket erfolgreich ausgestellt wurde:
+
+[source,bash]
+....
+% klist
+Credentials cache: FILE: /tmp/krb5cc_1001
+ Principal: tillman@EXAMPLE.ORG
+
+ Issued Expires Principal
+Aug 27 15:37:58 2013 Aug 28 01:37:58 2013 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG
+....
+
+Nachdem der Test abgeschlossen ist, kann das temporäre Ticket zurückgezogen werden:
+
+[source,bash]
+....
+% kdestroy
+....
+
+=== Kerberos-Dienste auf dem Server einrichten
+
+Bei der Konfiguration eines Servers für die Kerberos-Authentifizierung muss zuerst sichergestellt werden, dass [.filename]#/etc/krb5.conf# richtig konfiguriert ist. Die Datei kann entweder vom KDC kopiert, oder auf dem neuen System generiert werden.
+
+Als nächstes muss auf dem Server die [.filename]#/etc/krb5.keytab# erzeugt werden. Dies ist der Hauptbestandteil um Dienste zu "kerberisieren" und entspricht der Erzeugung eines geheimen Schlüssels zwischen dem Dienst und dem KDC. Das Geheimnis ist ein kryptographischer Schlüssel, der in einem [.filename]#keytab#> abgelegt wird. Diese Datei enthält den Schlüssel des Servers, mit dem sich der Server und das KDC gegenseitig authentifizieren können. Sie muss in einer sicheren Art und Weise an den Server übertragen werden, da ansonsten die Sicherheit des Servers gefährdet ist, wenn z.B. die Schlüssel öffentlich werden. In der Regel wird die [.filename]#keytab# auf einem vertrauenswürdigen Rechner mit `kadmin` erzeugt und anschließend sicher auf den Server übertragen, beispielsweise mit man:scp[1]. Wenn die Sicherheitsrichtlinien es erlauben, kann die Datei auch direkt auf dem Server erzeugt werden. Es ist sehr wichtig, dass die [.filename]#keytab# auf sichere Weise auf den Server übertragen wird. Wenn der Schlüssel einer anderen Partei bekannt wird, kann sich diese Partei den Benutzern als Server ausgeben! Da der Eintrag für das Host-Prinzipal für die KDC-Datenbank auch mit `kadmin` erstellt wird, ist es praktisch, `kadmin` direkt auf dem Server zu benutzen.
+
+Natürlich ist auch `kadmin` ein kerberisierter Dienst: ein Kerberos-Ticket ist erforderlich, um sich gegenüber dem Netzwerkdienst zu authentifizieren und um sicherzustellen, dass der Benutzer, der `kadmin` ausführt, tatsächlich vorhanden ist. `kadmin` wird nach dem Passwort fragen, um ein neues Ticket zu generieren. Das Prinzipal, das sich mit dem kadmin-Dienst authentifiziert, muss über die Zugriffskontrollliste [.filename]#/var/heimdal/kadmin.acl# dazu berechtigt sein. Weitere Informationen über Zugriffskontrolllisten finden Sie in den Heimdal-Info-Seiten (`info heimdal`) im Abschnitt "Remote administration". Wenn der Zugriff auf `kadmin` von entfernten Rechnern verboten ist, kann sich der Administrator entweder über die lokale Konsole oder über man:ssh[1] mit dem KDC verbinden, um die lokale Administration mit `kadmin -l` durchzuführen.
+
+Nach der Installation von [.filename]#/etc/krb5.conf#, können Sie das Kommando `add --random-key` in `kadmin` ausführen, um das Host-Prinzipal in die Datenbank zu schreiben. Das Kommando `ext` extrahiert den Schlüssel des Prinzipals in eine eigene keytab:
+
+[source,bash]
+....
+# kadmin
+kadmin> add --random-key host/myserver.example.org
+Max ticket life [unlimited]:
+Max renewable life [unlimited]:
+Principal expiration time [never]:
+Password expiration time [never]:
+Attributes []:
+kadmin> ext_keytab host/myserver.example.org
+kadmin> exit
+....
+
+Beachten Sie, dass `ext_keytab` den extrahierten Schlüssel standardmäßig in [.filename]#/etc/krb5.keytab# speichert. Das ist gut, wenn das Kommando auf dem kerberisierten Server ausgeführt wird, ansonsten sollte das Argument `--keytab _pfad/zur/datei_` benutzt werden, wenn die keytab an einen anderen Ort extrahiert wird:
+
+[source,bash]
+....
+# kadmin
+kadmin> ext_keytab --keytab=/tmp/example.keytab host/myserver.example.org
+kadmin> exit
+....
+
+Anschließend kann die erzeugte keytab sicher mit man:scp[1] auf Server oder auf einen Wechseldatenträger kopiert werden. Geben Sie auf jeden Fall einen anderen Namen für die keytab an, um unnötige Schlüssel in der keytab des Systems zu vermeiden.
+
+Mit Hilfe der Datei [.filename]#krb5.conf# kann der Server nun mit dem KDC kommunizieren und seine Identität mithilfe der Datei [.filename]#krb5.keytab# nachweisen. Jetzt können die kerberisierten Dienste aktiviert werden. Einer der gebräuchlichsten Dienste ist man:sshd[8], der Kerberos über GSS-API unterstützt. Fügen Sie folgende Zeile in [.filename]#/etc/ssh/sshd_config# ein:
+
+[.programlisting]
+....
+GSSAPIAuthentication yes
+....
+
+Nach dieser Änderung muss man:sshd[8] mit `service sshd restart` neu gestartet werden, damit die neue Konfiguration wirksam wird.
+
+=== Kerberos auf dem Client einrichten
+
+Genau wie der Server, benötigt auch der Client eine Konfiguration in [.filename]#/etc/krb5.conf#. Kopien Sie die Datei (sicher) vom KDC auf den Client, oder schreiben Sie die Datei bei Bedarf einfach neu.
+
+Testen Sie den Client, indem Sie mit `kinit` Tickets anfordern, mit `klist` Tickets anzeigen und mit `kdestroy` Tickets löschen. Kerberos-Anwendungen sollten auch kerberisierte Server ansprechen können. Wenn das nicht funktioniert, Sie aber Tickets anfordern können, hat wahrscheinlich der kerberisierte Server ein Problem und nicht der Client oder das KDC. Im Falle eines kerberisierten man:ssh[1] ist GSS-API in der Voreinstellung deaktiviert. Testen Sie daher mit `ssh -o GSSAPIAuthentication=yes _hostname_`.
+
+Wenn Sie die kerberisierten Anwendungen testen, können Sie einen Paket-Sniffer wie `tcpdump` benutzen, um sicherzustellen, dass keine sensiblen Informationen im Klartext übertragen werden.
+
+Es stehen verschiedene Kerberos-Anwendungen zur Verfügung. Die Anwendungen, die SASL benutzen, können dann auch GSS-API benutzen. Viele Arten von Anwendungen können Kerberos zur Authentifizierung verwenden, vom Jabber-Client bis zum IMAP-Client.
+
+Normalerweise wird ein Kerberos-Prinzipal auf ein lokales Benutzerkonto abgebildet. Manchmal wird aber Zugriff auf ein lokales Benutzerkonto benötigt, zu dem es keinen passenden Kerberos-Prinzipal gibt. Der Prinzipal `tillman@EXAMPLE.ORG` bräuchte beispielsweise Zugriff auf das Konto `webdevelopers`. Ebenso könnten andere Prinzipale auf dieses Konto zugreifen wollen.
+
+Die Dateien [.filename]#.k5login# und [.filename]#.k5users# im Heimatverzeichnis eines Benutzers können verwendet werden, um dieses Problem zu lösen. Mit der folgenden [.filename]#.k5login# im Heimatverzeichnis des Benutzers `webdevelopers` haben beide Prinzipale auch ohne das gemeinsame Passwort Zugriff auf das Konto:
+
+[.programlisting]
+....
+tillmann@example.org
+jdoe@example.org
+....
+
+Weitere Informationen zu [.filename]#.k5users# finden Sie in man:ksu[1].
+
+=== Unterschiede zur MIT-Implementation
+
+Der Hauptunterschied zwischen der MIT- und der Heimdal-Implementation ist das Kommando `kadmin`. Die Befehlssätze des Kommandos (obwohl funktional gleichwertig) und das verwendete Protokoll unterscheiden sich in beiden Varianten. Das KDC lässt sich nur mit dem `kadmin` Kommando der passenden Kerberos-Variante verwalten.
+
+Für dieselbe Funktion können auch die Client-Anwendungen leicht geänderte Kommandozeilenoptionen besitzen. Folgen Sie der Anleitung auf http://web.mit.edu/Kerberos/www/[ http://web.mit.edu/Kerberos/www/]. Achten Sie besonders auf den Suchpfad für Anwendungen. Der MIT-Port wird unter FreeBSD standardmäßig in [.filename]#/usr/local/# installiert. Wenn die Umgebungsvariable `PATH` zuerst die Systemverzeichnisse enthält, werden die Systemprogramme anstelle der MIT-Programme ausgeführt.
+
+Wenn Sie MIT-Kerberos verwenden, sollten Sie außerdem folgende Änderungen an [.filename]#/etc/rc.conf# vornehmen:
+
+[.programlisting]
+....
+kdc_program="/usr/local/sbin/kdc"
+kadmind_program="/usr/local/sbin/kadmind"
+kdc_flags=""
+kdc_enable="YES"
+kadmind_enable="YES"
+....
+
+=== Tipps und Fehlersuche
+
+Während der Konfiguration und bei der Fehlersuche sollten die folgenden Punkte beachtet werden:
+
+* Wenn Sie Heimdal- oder MIT-Kerberos benutzen, muss in der Umgebungsvariable `PATH` der Pfad zu den Kerberos-Programmen vor dem Pfad zu den Programmen des Systems stehen.
+* Wenn die Clients im Realm ihre Uhrzeit nicht synchronisieren, schlägt vielleicht die Authentifizierung fehl. crossref:network-servers[network-ntp,“Die Uhrzeit mit NTP synchronisieren”] beschreibt, wie Sie mithilfe von NTP die Uhrzeiten synchronisieren.
+* Wenn Sie den Namen eines Rechners ändern, müssen Sie auch den `host/`-Prinzipal ändern und die keytab aktualisieren. Dies betrifft auch spezielle Einträge wie den `HTTP/`-Prinzipal für Apaches package:www/mod_auth_kerb[].
+* Alle Rechner in einem Realm müssen vor- und rückwärts aufgelöst werden können. Entweder über DNS, zumindest aber über [.filename]#/etc/hosts#. CNAME-Einträge im DNS funktionieren, aber die entsprechenden A- und PTR-Einträge müssen vorhanden und richtig sein. Wenn sich Namen nicht auflösen lassen, ist die Fehlermeldung nicht gerade selbstsprechend: `Kerberos5 refuses authentication because Read req failed: Key table entry not found`.
+* Einige Betriebssysteme installieren `ksu` mit falschen Zugriffsrechten; es fehlt das Set-UID-Bit für `root`. Das hat zur Folge, dass `ksu` nicht funktioniert. Dies ist ein Fehler in den Zugriffsrechten und kein Fehler des KDCs.
+* Wenn Sie für einen Prinzipal unter MIT-Kerberos Tickets mit einer längeren Gültigkeit als der vorgegebenen zehn Stunden einrichten wollen, müssen Sie zwei Sachen ändern. Benutzen Sie `modify_principal` am Prompt von man:kadmin[8], um die maximale Gültigkeitsdauer für den Prinzipal selbst und den Prinzipal `krbtgt` zu erhöhen. Das Prinzipal kann dann mit `kinit -l` ein Ticket mit einer längeren Gültigkeit beantragen.
+* Mit einem Packet-Sniffer können Sie feststellen, dass Sie sofort nach dem Aufruf von `kinit` eine Antwort vom KDC bekommen - noch bevor Sie überhaupt ein Passwort eingegeben haben! Das ist in Ordnung: Das KDC händigt ein Ticket-Granting-Ticket (TGT) auf Anfrage aus, da es durch einen vom Passwort des Benutzers abgeleiteten Schlüssel geschützt ist. Wenn das Passwort eingegeben wird, wird es nicht zum KDC gesendet, sondern zum Entschlüsseln der Antwort des KDCs benutzt, die `kinit` schon erhalten hat. Wird die Antwort erfolgreich entschlüsselt, erhält der Benutzer einen Sitzungs-Schlüssel für die künftige verschlüsselte Kommunikation mit dem KDC und das TGT. Das TGT wiederum ist mit dem Schlüssel des KDCs verschlüsselt. Diese Verschlüsselung ist für den Benutzer völlig transparent und erlaubt dem KDC, die Echtheit jedes einzelnen TGT zu prüfen.
+* Host-Prinzipale können Tickets mit längerer Gültigkeit besitzen. Wenn der Prinzipal eines Benutzers über ein Ticket verfügt, das eine Woche gültig ist, das Ticket des Host-Prinzipals aber nur neun Stunden gültig ist, funktioniert der Ticket-Cache nicht wie erwartet. Im Cache befindet sich dann ein abgelaufenes Ticket des Host-Prinzipals.
+* Wenn Sie mit [.filename]#krb5.dict# die Verwendung schlechter Passwörter verhindern wollen, wie in man:kadmin[8] beschrieben, geht das nur mit Prinzipalen, denen eine Passwort-Policy zugewiesen wurde. Das Format von [.filename]#krb5.dict# enthält pro Zeile ein Wort. Sie können daher einen symbolischen Link auf [.filename]#/usr/shared/dict/words# erstellen.
+
+=== Beschränkungen von Kerberos
+
+Kerberos muss ganzheitlich verwendet werden. Jeder über das Netzwerk angebotene Dienst muss mit Kerberos zusammenarbeiten oder auf anderen Wegen gegen Angriffe aus dem Netzwerk geschützt sein. Andernfalls können Berechtigungen gestohlen und wiederverwendet werden. Es ist beispielsweise nicht sinnvoll, für Remote-Shells Kerberos zu benutzen, dagegen aber POP3-Zugriff auf einem Mail-Server zu erlauben, da POP3 Passwörter im Klartext versendet.
+
+Das KDC ist verwundbar und muss daher genauso abgesichert werden, wie die auf ihm befindliche Passwort-Datenbank. Auf dem KDC sollten absolut keine anderen Dienste laufen und der Rechner sollte physikalisch gesichert sein. Die Gefahr ist groß, da Kerberos alle Passwörter mit einem Schlüssel, dem Haupt-Schlüssel, verschlüsselt. Der Haupt-Schlüssel wiederum wird in einer Datei auf dem KDC gespeichert.
+
+Ein kompromittierter Haupt-Schlüssel ist nicht ganz so schlimm wie allgemein angenommen. Der Haupt-Schlüssel wird nur zum Verschlüsseln der Passwort-Datenbank und zum Initialisieren des Zufallsgenerators verwendet. Solange der Zugriff auf das KDC abgesichert ist, kann ein Angreifer wenig mit dem Haupt-Schlüssel anfangen.
+
+Wenn das KDC nicht zur Verfügung steht, sind auch die Netzwerkdienste nicht benutzbar, da eine Authentifizierung nicht durchgeführt werden kann. Das KDC ist also ein optimales Ziel für einen Denial-of-Service Angriff. Sie können diesem Angriff entgegenwirken, indem Sie einen KDC-Master und einen oder mehrere Slaves verwenden. Der Rückfall auf ein sekundäres KDC mittels PAM-Authentifizierung muss sorgfältig eingerichtet werden.
+
+Mit Kerberos können sich Benutzer, Rechner und Dienste gegenseitig authentifizieren. Allerdings existiert kein Mechanismus, der das KDC gegenüber Benutzern, Rechnern oder Diensten authentifiziert. Ein verändertes `kinit` könnte beispielsweise alle Benutzernamen und Passwörter abfangen. Die von veränderten Programmen ausgehende Gefahr können Sie lindern, indem Sie die Integrität von Dateien mit Werkzeugen wie package:security/tripwire[] prüfen.
+
+=== Weiterführende Dokumentation
+
+* http://www.faqs.org/faqs/Kerberos-faq/general/preamble.html[The Kerberos FAQ]
+* http://web.mit.edu/Kerberos/www/dialogue.html[Designing an Authentication System: a Dialogue in Four Scenes]
+* https://www.ietf.org/rfc/rfc4120.txt[RFC 4120, The Kerberos Network Authentication Service (V5)]
+* http://web.mit.edu/Kerberos/www/[MIT Kerberos-Seite]
+* https://github.com/heimdal/heimdal/wiki[Heimdal Kerberos-Wiki]
+
+[[openssl]]
+== OpenSSL
+
+OpenSSL ist eine Open Source Implementierung der SSL und TLS-Protokolle. Es bietet eine verschlüsselte Transportschicht oberhalb der normalen Kommunikationsschicht und kann daher zusammen mit vielen Netzdiensten benutzt werden.
+
+Das in FreeBSD integrierte OpenSSL stellt die Protokolle Secure Sockets Layer 3.0 (SSLv3) und Transport Layer Security 1.0/1.1/1.2 (TLSv1/TLSv1.1/TLSv1.2) zur Verfügung. Die OpenSSL-Bibliotheken stellen kryptographische Funktionen bereit. FreeBSD 12.0-RELEASE und neuere Versionen enthalten OpenSSL mit Unterstützung für Transport Layer Security 1.3 (TLSv1.3).
+
+Anwendungsbeispiele für OpenSSL sind die verschlüsselte Authentifizierung von E-Mail-Clients oder Web-Transaktionen wie das Bezahlen mit Kreditkarte. Einige Ports, wie package:www/apache24[] und package:databases/postgresql11-server[], haben eine Option für den Bau mit OpenSSL. Bei Auswahl dieser Option, wird OpenSSL aus dem Basissystem benutzt. Wenn Sie für den Bau der Anwendung stattdessen OpenSSL aus dem Port package:security/openssl[] benutzten wollen, fügen Sie folgende Zeile in [.filename]#/etc/make.conf# ein:
+
+[.programlisting]
+....
+DEFAULT_VERSIONS+= ssl=openssl
+....
+
+OpenSSL wird auch eingesetzt, um Zertifikate für Anwendungen bereitzustellen. Die Zertifikate stellen die Identität einer Firma oder eines Einzelnen sicher. Wenn ein Zertifikat nicht von einer Zertifizierungsstelle (Certificate Authority, CA) gegengezeichnet wurde, erhalten Sie normalerweise eine Warnung. Eine Zertifizierungsstelle ist eine Firma wie http://www.verisign.com/[VeriSign], die Zertifikate von Personen oder Firmen gegenzeichnet und damit die Korrektheit der Zertifikate bestätigt. Diese Prozedur kostet Geld, ist aber keine Voraussetzung für den Einsatz von Zertifikaten, beruhigt aber sicherheitsbewusste Benutzer.
+
+Dieser Abschnitt beschreibt, wie Sie auf einem FreeBSD-System Zertifikate erstellen und benutzen. crossref:network-servers[ldap-config,“Konfiguration eines LDAP-Servers”] beschreibt, wie Sie eine CA erstellen um die eigenen Zertifikate zu signieren.
+
+Weitere Informationen über SSL finden Sie im kostenlosen https://www.feistyduck.com/books/openssl-cookbook/[OpenSSL Cookbook].
+
+=== Zertifikate erzeugen
+
+Um ein Zertifikat zu erzeugen, das von einer externen CA signiert werden soll, geben Sie folgenden Befehl und die angeforderten Informationen ein. Diese Informationen werden in das Zertifikat geschrieben. Für `Common Name` geben Sie den vollqualifizierten Namen des Systems ein, auf dem das Zertifikat später installiert wird. Wenn der Name nicht übereinstimmt, wird die Anwendung, die das Zertifikat überprüft, dem Benuzter eine Warnung anzeigen. Die Überprüfung würde fehlschlagen und das Zertifikat damit unbrauchbar machen.
+
+[source,bash]
+....
+# openssl req -new -nodes -out req.pem -keyout cert.key -sha256 -newkey rsa:2048
+Generating a 2048 bit RSA private key
+..................+++
+.............................................................+++
+writing new private key to 'cert.key'
+-----
+You are about to be asked to enter information that will be incorporated
+into your certificate request.
+What you are about to enter is what is called a Distinguished Name or a DN.
+There are quite a few fields but you can leave some blank
+For some fields there will be a default value,
+If you enter '.', the field will be left blank.
+-----
+Country Name (2 letter code) [AU]:US
+State or Province Name (full name) [Some-State]:PA
+Locality Name (eg, city) []:Pittsburgh
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
+Organizational Unit Name (eg, section) []:Systems Administrator
+Common Name (eg, YOUR name) []:localhost.example.org
+Email Address []:trhodes@FreeBSD.org
+
+Please enter the following 'extra' attributes
+to be sent with your certificate request
+A challenge password []:
+An optional company name []:Another Name
+....
+
+Bei der Erzeugung des Zertifikates können noch weitere Optionen, wie die Gültigkeitsdauer und alternative Verschlüsselungsalgorithmen, angegeben werden. man:openssl[1] beschreibt die zur Verfügung stehenden Optionen.
+
+Das folgende Kommando erstellt zwei Dateien im aktuellen Verzeichnis: Die Anforderung für ein neues Zertifikat wird in [.filename]#req.pem# gespeichert. Diese Datei können Sie an eine CA senden, wo die Angaben geprüft werden. Nach erfolgreicher Prüfung wird das Zertifikat signiert und an Sie zurückgesandt. [.filename]#cert.key#, enthält den privaten Schlüssel für das Zertifikat und darf auch keine Fall in fremde Hände geraten, da ein Angreifer sonst in der Lage ist, anderen Personen oder Rechnern vorzugaukeln, dass es sich bei ihm um Sie handelt.
+
+Wenn Sie keine Signatur einer Zertifizierungsstelle benötigen, können Sie ein selbst signiertes Zertifikat erstellen. Erzeugen Sie dazu zuerst einen RSA-Schlüssel:
+
+[source,bash]
+....
+# openssl genrsa -rand -genkey -out cert.key 2048
+0 semi-random bytes loaded
+Generating RSA private key, 2048 bit long modulus
+.............................................+++
+.................................................................................................................+++
+e is 65537 (0x10001)
+....
+
+Benutzen Sie diesen Schlüssel, um ein selbst signiertes Zertifikat zu erzeugen. Folgen Sie wieder den Anweisungen am Prompt:
+
+[source,bash]
+....
+# openssl req -new -x509 -days 365 -key cert.key -out cert.crt -sha256
+You are about to be asked to enter information that will be incorporated
+into your certificate request.
+What you are about to enter is what is called a Distinguished Name or a DN.
+There are quite a few fields but you can leave some blank
+For some fields there will be a default value,
+If you enter '.', the field will be left blank.
+-----
+Country Name (2 letter code) [AU]:US
+State or Province Name (full name) [Some-State]:PA
+Locality Name (eg, city) []:Pittsburgh
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
+Organizational Unit Name (eg, section) []:Systems Administrator
+Common Name (e.g. server FQDN or YOUR name) []:localhost.example.org
+Email Address []:trhodes@FreeBSD.org
+....
+
+Dieses Kommando erstellt zwei neue Dateien im aktuellen Verzeichnis: Der Schlüssel der Zertifizierungsstelle [.filename]#cert.key# und das Zertifikat selbst, [.filename]#cert.crt#. Sie sollten in einem Verzeichnis, vorzugsweise unterhalb von [.filename]#/etc/ssl/# abgelegt werden, das nur von `root` lesbar ist. Die Zugriffsrechte der Dateien können mit `chmod` auf `0700` gesetzt werden.
+
+=== Zertifikate benutzen
+
+Mit einem Zertifikat können beispielsweise die Verbindungen zu Sendmail verschlüsselt werden, um eine Klartext-Authentifizierung zu verhindern.
+
+[NOTE]
+====
+Einige E-Mail-Programme geben Warnungen aus, wenn ein Zertifikat nicht lokal installiert ist. Weitere Informationen zur Installation von Zertifikaten finden Sie in der Dokumentation der entsprechenden Software.
+====
+
+Unter FreeBSD 10.0-RELEASE und neueren Versionen ist es möglich, ein selbst signiertes Zertifikat für Sendmail automatisch erzeugen zu lassen. Um diese Funktionalität zu aktivieren, fügen Sie die folgenden Zeilen in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+sendmail_enable="YES"
+sendmail_cert_enable="YES"
+sendmail_cert_cn="localhost.example.org"
+....
+
+Dadurch wird automatisch ein selbst signiertes Zertifikat ([.filename]#/etc/mail/certs/host.cert#), der Schlüssel für die CA ([.filename]#/etc/mail/certs/host.key# und das Zertifikat der CA ([.filename]#/etc/mail/certs/cacert.pem# erzeugt. Das Zertifikat wird den in `sendmail_cert_cn` festgelegten `Common Name` verwenden. Nachdem Sie die Änderungen gespeichert haben, starten Sie Sendmail neu:
+
+[source,bash]
+....
+# service sendmail restart
+....
+
+Wenn alles gut ging, erscheinen keine Fehlermeldungen in [.filename]#/var/log/maillog#. Für einen einfachen Test, bauen Sie mit Hilfe von `telnet` eine Verbindung zum Mailserver auf:
+
+[source,bash]
+....
+# telnet example.com 25
+Trying 192.0.34.166...
+Connected to example.com.
+Escape character is '^]'.
+220 example.com ESMTP Sendmail 8.14.7/8.14.7; Fri, 18 Apr 2014 11:50:32 -0400 (EDT)
+ehlo example.com
+250-example.com Hello example.com [192.0.34.166], pleased to meet you
+250-ENHANCEDSTATUSCODES
+250-PIPELINING
+250-8BITMIME
+250-SIZE
+250-DSN
+250-ETRN
+250-AUTH LOGIN PLAIN
+250-STARTTLS
+250-DELIVERBY
+250 HELP
+quit
+221 2.0.0 example.com closing connection
+Connection closed by foreign host.
+....
+
+Wenn die Zeile `STARTTLS` erscheint, hat alles funktioniert.
+
+[[ipsec]]
+== VPN mit IPsec
+
+Internet Protocol Security (IPsec) ist ein Satz von Protokollen, die auf dem Internet-Protokoll (IP) aufbauen. Durch Authentifizierung und Verschlüsselung jedes einzelnen IP-Pakets, können mehrere Systeme geschützt miteinander kommunizieren. FreeBSDs IPSsec Netzwerk-Stack basiert auf der http://www.kame.net[http://www.kame.net] Implementierung und unterstützt sowohl IPv4 als auch IPv6.
+
+IPsec besteht aus den folgenden Protokollen:
+
+* _Encapsulated Security Payload (ESP)_: dieses Protokoll verschlüsselt IP-Pakete mit einem symmetrischen Verfahren wie Blowfish oder 3DES. Damit werden die Pakete vor Manipulationen Dritter geschützt.
+* _Authentication Header (AH)_: dieses Protokoll enthält eine kryptographische Prüfsumme, die sicher stellt, dass ein IP-Paket nicht verändert wurde. Der Authentication-Header folgt nach dem normalen IP-Header und erlaubt dem Empfänger eines IP-Paketes, dessen Integrität zu prüfen.
+* _IP Payload Compression Protocol (IPComp)_: dieses Protokoll versucht durch Komprimierung der IP-Nutzdaten die Menge der gesendeten Daten zu reduzieren und somit die Kommunikationsleistung zu verbessern.
+
+Diese Protokolle können, je nach Situation, zusammen oder einzeln verwendet werden.
+
+IPsec unterstützt zwei Modi: Der _Transport-Modus_ verschlüsselt die Daten zwischen zwei Systemen. Der _Tunnel-Modus_ verbindet zwei Subnetze miteinander. Durch einen Tunnel können dann verschlüsselte Daten übertragen werden. Ein Tunnel wird auch als Virtual-Private-Network (VPN) bezeichnet. Detaillierte Informationen über das IPsec-Subsystem von FreeBSD finden Sie in man:ipsec[4].
+
+Seit FreeBSD 11 ist IPsec in der Voreinstellung aktiviert. Um die Unterstützung für IPsec in älteren Versionen zu aktivieren, fügen Sie folgenden Optionen in die Kernelkonfigurationsdatei ein und erstellen Sie einen neuen Kernel, wie in crossref:kernelconfig[kernelconfig,Konfiguration des FreeBSD-Kernels] beschrieben.
+
+[source,bash]
+....
+options IPSEC IP security
+device crypto
+....
+
+Wenn Sie zur Fehlersuche im IPsec-Subsystem Unterstützung wünschen, sollten Sie die folgende Option ebenfalls aktivieren:
+
+[source,bash]
+....
+options IPSEC_DEBUG debug for IP security
+....
+
+Der Rest dieses Kapitels beschreibt die Einrichtung eines IPsec-VPN zwischen einem Heimnetzwerk und einem Firmennetzwerk. Für das folgende Beispiel gilt:
+
+* Beide Netzwerke sind über ein FreeBSD-Gateway mit dem Internet verbunden.
+* Der Gateway jedes Netzwerks besitzt mindestens eine externe IP-Adresse. In diesem Beispiel ist die externe IP-Adresse des Firmennetzwerks (LAN) `172.16.5.4` und das Heimnetzwerk (LAN) hat die externe IP-Adresse `192.168.1.12`.
+* Die intern verwendeten IP-Adressen können private oder öffentliche Adressen sein. Sie dürfen sich jedoch nicht überschneiden. Zum Beispiel sollten nicht beide Netze `192.168.1.x` benutzen. In diesem Beispiel ist die interne IP-Adresse des Firmennetzwerks (LAN) `10.246.38.1` und das Heimnetzwerk (LAN) hat die interne IP-Adresse `10.0.0.5`.
+
+=== Konfiguration eines VPN unter FreeBSD
+
+Als erstes muss package:security/ipsec-tools[] aus der Ports-Sammlung installiert werden. Diese Software enthält einige Anwendungen, die bei der Konfiguration von IPsec hilfreich sind.
+
+Als nächstes müssen zwei man:gif[4]-Pseudogeräte angelegt werden, um die Pakete zu tunneln und dafür zu sorgen, dass beide Netzwerke richtig miteinander kommunizieren können. Geben Sie als `root` die folgenden Befehle ein, wobei Sie _intern_ und _extern_ durch die realen internen und externen IP-Adressen der Gateways ersetzen müssen:
+
+[source,bash]
+....
+# ifconfig gif0 create
+# ifconfig gif0 intern1 intern2
+# ifconfig gif0 tunnel extern1 extern2
+....
+
+Überprüfen Sie mit `ifconfig` die Konfiguration auf beiden Gateways. Hier folgt die Ausgabe von Gateway 1:
+
+[.programlisting]
+....
+gif0: flags=8051 mtu 1280
+tunnel inet 172.16.5.4 --> 192.168.1.12
+inet6 fe80::2e0:81ff:fe02:5881%gif0 prefixlen 64 scopeid 0x6
+inet 10.246.38.1 --> 10.0.0.5 netmask 0xffffff00
+....
+
+Hier folgt die Ausgabe von Gateway 2:
+
+[.programlisting]
+....
+gif0: flags=8051 mtu 1280
+tunnel inet 192.168.1.12 --> 172.16.5.4
+inet 10.0.0.5 --> 10.246.38.1 netmask 0xffffff00
+inet6 fe80::250:bfff:fe3a:c1f%gif0 prefixlen 64 scopeid 0x4
+....
+
+Wenn Sie fertig sind, sollten beide internen Adressen über man:ping[8] erreichbar sein:
+
+[.programlisting]
+....
+priv-net# ping 10.0.0.5
+PING 10.0.0.5 (10.0.0.5): 56 data bytes
+64 bytes from 10.0.0.5: icmp_seq=0 ttl=64 time=42.786 ms
+64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=19.255 ms
+64 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=20.440 ms
+64 bytes from 10.0.0.5: icmp_seq=3 ttl=64 time=21.036 ms
+--- 10.0.0.5 ping statistics ---
+4 packets transmitted, 4 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 19.255/25.879/42.786/9.782 ms
+
+corp-net# ping 10.246.38.1
+PING 10.246.38.1 (10.246.38.1): 56 data bytes
+64 bytes from 10.246.38.1: icmp_seq=0 ttl=64 time=28.106 ms
+64 bytes from 10.246.38.1: icmp_seq=1 ttl=64 time=42.917 ms
+64 bytes from 10.246.38.1: icmp_seq=2 ttl=64 time=127.525 ms
+64 bytes from 10.246.38.1: icmp_seq=3 ttl=64 time=119.896 ms
+64 bytes from 10.246.38.1: icmp_seq=4 ttl=64 time=154.524 ms
+--- 10.246.38.1 ping statistics ---
+5 packets transmitted, 5 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 28.106/94.594/154.524/49.814 ms
+....
+
+Wie erwartet, können nun beiden Seiten ICMP-Pakete von ihren privaten Adressen senden und empfangen. Als nächstes müssen beide Gateways so konfiguriert werden, dass sie die Pakete des anderen Netzwerkes richtig routen. Dazu werden folgende Befehle verwendet:
+
+[source,bash]
+....
+corp-net# route add 10.0.0.0 10.0.0.5 255.255.255.0
+corp-net# route add net 10.0.0.0: gateway 10.0.0.5
+priv-net# route add 10.246.38.0 10.246.38.1 255.255.255.0
+priv-net# route add host 10.246.38.0: gateway 10.246.38.1
+....
+
+Ab jetzt sollten die Rechner von den Gateways sowie von den Rechnern hinter den Gateways erreichbar sein. Dies können Sie wieder mit man:ping[8] überprüfen:
+
+[.programlisting]
+....
+corp-net# ping 10.0.0.8
+PING 10.0.0.8 (10.0.0.8): 56 data bytes
+64 bytes from 10.0.0.8: icmp_seq=0 ttl=63 time=92.391 ms
+64 bytes from 10.0.0.8: icmp_seq=1 ttl=63 time=21.870 ms
+64 bytes from 10.0.0.8: icmp_seq=2 ttl=63 time=198.022 ms
+64 bytes from 10.0.0.8: icmp_seq=3 ttl=63 time=22.241 ms
+64 bytes from 10.0.0.8: icmp_seq=4 ttl=63 time=174.705 ms
+--- 10.0.0.8 ping statistics ---
+5 packets transmitted, 5 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 21.870/101.846/198.022/74.001 ms
+
+priv-net# ping 10.246.38.107
+PING 10.246.38.1 (10.246.38.107): 56 data bytes
+64 bytes from 10.246.38.107: icmp_seq=0 ttl=64 time=53.491 ms
+64 bytes from 10.246.38.107: icmp_seq=1 ttl=64 time=23.395 ms
+64 bytes from 10.246.38.107: icmp_seq=2 ttl=64 time=23.865 ms
+64 bytes from 10.246.38.107: icmp_seq=3 ttl=64 time=21.145 ms
+64 bytes from 10.246.38.107: icmp_seq=4 ttl=64 time=36.708 ms
+--- 10.246.38.107 ping statistics ---
+5 packets transmitted, 5 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 21.145/31.721/53.491/12.179 ms
+....
+
+Das Konfigurieren der Tunnel ist der einfache Teil. Die Konfiguration einer sicheren Verbindung geht viel mehr in die Tiefe. Die folgende Konfiguration benutzt pre-shared (PSK) RSA-Schlüssel. Abgesehen von den IP-Adressen, sind beide [.filename]#/usr/local/etc/racoon/racoon.conf# identisch und sehen ähnlich aus:
+
+[.programlisting]
+....
+path pre_shared_key "/usr/local/etc/racoon/psk.txt"; #location of pre-shared key file
+log debug; #log verbosity setting: set to 'notify' when testing and debugging is complete
+
+padding # options are not to be changed
+{
+ maximum_length 20;
+ randomize off;
+ strict_check off;
+ exclusive_tail off;
+}
+
+timer # timing options. change as needed
+{
+ counter 5;
+ interval 20 sec;
+ persend 1;
+# natt_keepalive 15 sec;
+ phase1 30 sec;
+ phase2 15 sec;
+}
+
+listen # address [port] that racoon will listen on
+{
+ isakmp 172.16.5.4 [500];
+ isakmp_natt 172.16.5.4 [4500];
+}
+
+remote 192.168.1.12 [500]
+{
+ exchange_mode main,aggressive;
+ doi ipsec_doi;
+ situation identity_only;
+ my_identifier address 172.16.5.4;
+ peers_identifier address 192.168.1.12;
+ lifetime time 8 hour;
+ passive off;
+ proposal_check obey;
+# nat_traversal off;
+ generate_policy off;
+
+ proposal {
+ encryption_algorithm blowfish;
+ hash_algorithm md5;
+ authentication_method pre_shared_key;
+ lifetime time 30 sec;
+ dh_group 1;
+ }
+}
+
+sainfo (address 10.246.38.0/24 any address 10.0.0.0/24 any) # address $network/$netmask $type address $network/$netmask $type ( $type being any or esp)
+{ # $network must be the two internal networks you are joining.
+ pfs_group 1;
+ lifetime time 36000 sec;
+ encryption_algorithm blowfish,3des;
+ authentication_algorithm hmac_md5,hmac_sha1;
+ compression_algorithm deflate;
+}
+....
+
+Eine Beschreibung der verfügbaren Optionen finden Sie in der Manualpage von [.filename]#racoon.conf#.
+
+Die Security Policy Database (SPD) muss noch konfiguriert werden, so dass FreeBSD und racoon in der Lage sind den Netzwerkverkehr zwischen den Hosts zu ver- und entschlüsseln.
+
+Dies wird durch ein Shellskript ähnlich wie das folgende, das auf dem Firmennetzwerk-Gateway liegt, ausgeführt. Diese Datei wird während der Systeminitialisierung ausgeführt und sollte unter [.filename]#/usr/local/etc/racoon/setkey.conf# gespeichert werden.
+
+[.programlisting]
+....
+flush;
+spdflush;
+
+# To the home network
+spdadd 10.246.38.0/24 10.0.0.0/24 any -P out ipsec esp/tunnel/172.16.5.4-192.168.1.12/use;
+spdadd 10.0.0.0/24 10.246.38.0/24 any -P in ipsec esp/tunnel/192.168.1.12-172.16.5.4/use;
+....
+
+Nachdem die Datei gespeichert wurde, kann racoon durch das folgende Kommando auf beiden Gateways gestartet werden:
+
+[source,bash]
+....
+# /usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf -l /var/log/racoon.log
+....
+
+Die Ausgabe sollte so ähnlich aussehen:
+
+[.programlisting]
+....
+corp-net# /usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf
+Foreground mode.
+2006-01-30 01:35:47: INFO: begin Identity Protection mode.
+2006-01-30 01:35:48: INFO: received Vendor ID: KAME/racoon
+2006-01-30 01:35:55: INFO: received Vendor ID: KAME/racoon
+2006-01-30 01:36:04: INFO: ISAKMP-SA established 172.16.5.4[500]-192.168.1.12[500] spi:623b9b3bd2492452:7deab82d54ff704a
+2006-01-30 01:36:05: INFO: initiate new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0]
+2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=28496098(0x1b2d0e2)
+2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.12[0] spi=47784998(0x2d92426)
+2006-01-30 01:36:13: INFO: respond new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0]
+2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=124397467(0x76a279b)
+2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.12[0] spi=175852902(0xa7b4d66)
+....
+
+Um sicherzustellen, dass der Tunnel richtig funktioniert, wechseln Sie auf eine andere Konsole und benutzen Sie man:tcpdump[1] mit dem folgenden Befehl, um sich den Netzwerkverkehr anzusehen. Tauschen Sie `em0` durch die richtige Netzwerkkarte aus:
+
+[source,bash]
+....
+# tcpdump -i em0 host 172.16.5.4 and dst 192.168.1.12
+....
+
+Die Ausgabe der Konsole sollte dem hier ähneln. Wenn nicht, gibt es ein Problem und ein Debuggen der ausgegebenen Daten ist notwendig.
+
+[.programlisting]
+....
+01:47:32.021683 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xa)
+01:47:33.022442 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xb)
+01:47:34.024218 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xc)
+....
+
+An diesem Punkt sollten beide Netzwerke verfügbar sein und den Anschein haben, dass sie zum selben Netzwerk gehören. Meistens sind beide Netzwerke durch eine Firewall geschützt. Um den Netzwerkverkehr zwischen den beiden Netzwerken zu erlauben, ist es notwendig Regeln zu erstellen. Für die man:ipfw[8] Firewall fügen Sie folgende Zeilen in die Firewall-Konfigurationsdatei ein:
+
+[.programlisting]
+....
+ipfw add 00201 allow log esp from any to any
+ipfw add 00202 allow log ah from any to any
+ipfw add 00203 allow log ipencap from any to any
+ipfw add 00204 allow log udp from any 500 to any
+....
+
+[NOTE]
+====
+Die Regelnummern müssen eventuell, je nach Hostkonfiguration, angepasst werden.
+====
+
+Für Benutzer der man:pf[4]- oder man:ipf[8]-Firewall sollte folgendes funktionieren:
+
+[.programlisting]
+....
+pass in quick proto esp from any to any
+pass in quick proto ah from any to any
+pass in quick proto ipencap from any to any
+pass in quick proto udp from any port = 500 to any port = 500
+pass in quick on gif0 from any to any
+pass out quick proto esp from any to any
+pass out quick proto ah from any to any
+pass out quick proto ipencap from any to any
+pass out quick proto udp from any port = 500 to any port = 500
+pass out quick on gif0 from any to any
+....
+
+Zum Ende, um dem Computer den Start vom VPN während der Systeminitialisierung zu erlauben, fügen Sie folgende Zeilen in ihre [.filename]#/etc/rc.conf#: ein
+
+[.programlisting]
+....
+ipsec_enable="YES"
+ipsec_program="/usr/local/sbin/setkey"
+ipsec_file="/usr/local/etc/racoon/setkey.conf" # allows setting up spd policies on boot
+racoon_enable="yes"
+....
+
+[[openssh]]
+== OpenSSH
+
+OpenSSH stellt Werkzeuge bereit, um sicher auf entfernte Maschinen zuzugreifen. Zusätzlich können TCP/IP-Verbindungen sicher durch SSH getunnelt oder weitergeleitet werden. OpenSSH verschlüsselt alle Verbindungen. Dadurch wird beispielsweise verhindert, dass die Verbindung abgehört oder übernommen (Hijacking) werden kann. Weitere Informationen zu OpenSSH finden Sie auf http://www.openssh.com/[ http://www.openssh.com/].
+
+Dieser Abschnitt enthält einen Überblick über die integrierten Client-Werkzeuge, mit denen Sie sicher auf entfernte Systeme zugreifen können, oder mit denen Sie sicher Dateien austauschen können. Der Abschnitt beschreibt auch die Konfiguration eines SSH-Servers auf einem FreeBSD-System. Weitere Informationen finden Sie in den hier erwähnten Manualpages.
+
+=== Die SSH Client-Werkzeuge benutzen
+
+Benutzen Sie `ssh` zusammen mit einem Benutzernamen und einer IP-Adresse oder dem Hostnamen, um sich an einem SSH-Server anzumelden. Ist dies das erste Mal, dass eine Verbindung mit dem angegebenen Server hergestellt wird, wird der Benutzer aufgefordert, zuerst den Fingerabdruck des Servers zu prüfen:
+
+[source,bash]
+....
+# ssh user@example.com
+The authenticity of host 'example.com (10.0.0.1)' can't be established.
+ECDSA key fingerprint is 25:cc:73:b5:b3:96:75:3d:56:19:49:d2:5c:1f:91:3b.
+Are you sure you want to continue connecting (yes/no)? yes
+Permanently added 'example.com' (ECDSA) to the list of known hosts.
+Password for user@example.com: user_password
+....
+
+SSH speichert einen Fingerabdruck des Serverschlüssels um die Echtheit des Servers zu überprüfen, wenn der Client eine Verbindung herstellt. Wenn der Benutzer den Fingerabdruck mit `yes` bestätigt, wird eine Kopie des Schlüssels in [.filename]#.ssh/known_hosts# im Heimatverzeichnis des Benutzers gespeichert. Zukünftige Verbindungen zu dem Server werden gegen den gespeicherten Fingerabdruck des Schlüssels geprüft und der Client gibt eine Warnung aus, wenn sich der empfangene Fingerabdruck von dem gespeicherten unterscheidet. Wenn dies passiert, sollte zunächst geprüft werden, ob sich der Schlüssel geändert hat, bevor die Verbindung hergestellt wird.
+
+In der Voreinstellung akzeptieren aktuelle Versionen von OpenSSH nur SSHv2 Verbindungen. Wenn möglich, wird der Client versuchen Version 2 zu verwenden, ist dies nicht möglich, fällt er auf Version 1 zurück. Der Client kann gezwungen werden, nur eine der beiden Versionen zu verwenden, indem die Option `-1` oder `-2` übergeben wird. Weitere Optionen sind in man:ssh[1] beschrieben.
+
+Mit man:scp[1] lassen sich Dateien in einer sicheren Weise auf entfernte Maschinen übertragen. Dieses Beispiel kopiert die Datei [.filename]#COPYRIGHT# von einem entfernten System in eine Datei mit dem gleichen Namen auf das lokale System:
+
+[source,bash]
+....
+# scp user@example.com:/COPYRIGHT COPYRIGHT
+Password for user@example.com: *******
+COPYRIGHT 100% |*****************************| 4735
+00:00
+#
+....
+
+Da der Fingerabdruck für diesen Rechner bereits bestätigt wurde, wird er automatisch überprüft, bevor der Benutzer zur Eingabe des Passworts aufgefordert wird.
+
+Die Argumente, die `scp` übergeben werden, gleichen denen von `cp` in der Beziehung, dass die ersten Argumente die zu kopierenden Dateien sind und das letzte Argument den Bestimmungsort angibt. Da die Dateien über das Netzwerk kopiert werden, können ein oder mehrere Argumente die Form `user@host:<path_to_remote_file>` besitzen. Beachten Sie, das `scp` die Option `-r` verwendet um Dateien rekursiv zu kopieren, während `cp -R` benutzt.
+
+Mit `sftp` können Dateien über eine interaktive Sitzung kopiert werden. man:sftp[1] beschreibt die verfügbaren Befehle, die während einer `sftp`-Sitzung zur Verfügung stehen.
+
+[[security-ssh-keygen]]
+==== Schlüsselbasierte Authentifizierung
+
+Ein Client kann bei der Verbindung auch Schlüssel anstelle von Passwörtern verwenden. Benutzen Sie `ssh-keygen` um RSA-Schlüssel erzeugen. Geben Sie das entsprechende Protokoll an, wenn Sie einen öffentlichen und einen privaten Schlüssel erzeugen. Folgen Sie anschließend den Anweisungen des Programms. Es wird empfohlen, die Schlüssel mit einer einprägsamen, aber schwer zu erratenen Passphrase zu schützen.
+
+[source,bash]
+....
+% ssh-keygen -t rsa
+Generating public/private rsa key pair.
+Enter file in which to save the key (/home/user/.ssh/id_rsa):
+Enter passphrase (empty for no passphrase): <.>
+Enter same passphrase again: <.>
+Your identification has been saved in /home/user/.ssh/id_rsa.
+Your public key has been saved in /home/user/.ssh/id_rsa.pub.
+The key fingerprint is:
+SHA256:54Xm9Uvtv6H4NOo6yjP/YCfODryvUU7yWHzMqeXwhq8 user@host.example.com
+The key's randomart image is:
++---[RSA 2048]----+
+| |
+| |
+| |
+| . o.. |
+| .S*+*o |
+| . O=Oo . . |
+| = Oo= oo..|
+| .oB.* +.oo.|
+| =OE**.o..=|
++----[SHA256]-----+
+....
+
+<.> Geben Sie hier die Passphrase ein. Diese darf auch Leer- und Sonderzeichen enthalten.
+<.> Geben Sie die Passphrase zur Überprüfung erneut ein.
+
+Der private Schlüssel wird in [.filename]#~/.ssh/id_rsa# und der öffentliche Schlüssel in [.filename]#~/.ssh/id_rsa.pub# gespeichert. Der _öffentliche_ Schlüssel muss zuerst auf den entfernten Rechner nach [.filename]#~/.ssh/authorized_keys# kopiert werden, damit die schlüsselbasierte Authentifizierung funktioniert.
+
+[WARNING]
+====
+
+Viele Benutzer denken, dass die Verwendung von Schlüsseln generell sicher ist. Sie verwenden dann einen Schlüssel ohne eine Passphrase. Dies ist jedoch sehr _gefährlich_. Ein Administrator kann überprüfen, ob ein Schlüsselpaar mit einer Passphrase geschützt ist. Wenn die Datei mit dem privaten Schlüssel den Text `ENCRYPTED` enthält, dann hat der Benutzer eine Passphrase verwendet. Um die Benutzer zusätzlich zu schützen, kann ein `from`-Feld in der Datei des öffentlichen Schlüssels hinzugefügt werden. Zum Beispiel würde das Hinzufügen von `from="192.168.10.5"` vor dem `ssh-rsa`-Präfix dafür sorgen, dass sich ein bestimmter Benutzer nur noch von dieser IP-Adresse anmelden darf.
+====
+
+Die Optionen und Dateinamen sind abhängig von der eingesetzten Version von OpenSSH. Die für das System gültigen Optionen finden Sie in man:ssh-keygen[1].
+
+Wenn bei der Erzeugung des Schlüssels eine Passphrase angegeben wurde, wird der Benutzer bei jeder Anmeldung am Server zur Eingabe der Passphrase aufgefordert. Mit man:ssh-agent[1] und man:ssh-add[1] ist es möglich, SSH-Schlüssel in den Speicher zu laden, damit die Passphrase nicht jedes Mal eingegeben werden muss.
+
+`ssh-agent` übernimmt die Authentifizierung mit den geladenen privaten Schlüsseln. `ssh-agent` kann dazu verwendet werden, ein anderes Programm zu starten, beispielsweise eine Shell oder einen Window-Manager.
+
+Um `ssh-agent` in einer Shell zu verwenden, muss es mit einer Shell als Argument aufgerufen werden. Die zu verwaltende Identität muss mit `ssh-add` sowie der Passphrase für den privaten Schlüssel übergeben werden. Danach kann sich der Benutzer mit `ssh` auf jedem Rechner anmelden, der einen entsprechenden öffentlichen Schlüssel besitzt. Dazu ein Beispiel:
+
+[source,bash]
+....
+% ssh-agent csh
+% ssh-add
+Enter passphrase for /usr/home/user/.ssh/id_rsa: <.>
+Identity added: /usr/home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
+%
+....
+
+<.> Geben Sie hier die Passphrase für den Schlüssel ein.
+
+Um `ssh-agent` unter Xorg zu verwenden, muss ein Eintrag für das Programm in [.filename]#~/.xinitrc# aufgenommen werden. Dadurch können alle unter Xorg gestarteten Programme die Dienste von `ssh-agent` nutzen. [.filename]#~/.xinitrc# könnte etwa so aussehen:
+
+[.programlisting]
+....
+exec ssh-agent startxfce4
+....
+
+Dadurch wird bei jedem Start von Xorg zuerst `ssh-agent` aufgerufen, das wiederum XFCE startet. Nachdem diese Änderung durchgeführt wurde, muss Xorg neu gestartet werden. Danach können Sie mit `ssh-add` die SSH-Schlüssel laden.
+
+[[security-ssh-tunneling]]
+==== SSH-Tunnel
+
+Mit OpenSSH ist es möglich, einen Tunnel zu erstellen, in dem ein anderes Protokoll verschlüsselt übertragen wird.
+
+Im folgenden Kommando erzeugt `ssh` einen Tunnel für `telnet`:
+
+[source,bash]
+....
+% ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
+%
+....
+
+Dieses Beispiel verwendet die folgenden Optionen:
+
+`-2`::
+Zwingt `ssh` dazu, die Version 2 des Protokolls zu verwenden, um sich mit dem Server zu verbinden.
+
+`-N`::
+Zeigt an, dass ein Tunnel erstellt werden soll. Ohne diese Option würde `ssh` eine normale Sitzung öffnen.
+
+`-f`::
+Zwingt `ssh` im Hintergrund zu laufen.
+
+`-L`::
+Ein lokaler Tunnel wird in der Form _localport:remotehost:remoteport_ angegeben. Die Verbindung wird dabei von dem lokalen Port _localport_ auf einen entfernten Rechner weitergeleitet.
+
+`user@foo.example.com`::
+Gibt den Anmeldenamen auf dem entfernten SSH-Server an.
+
+Ein SSH-Tunnel erzeugt einen Socket auf `localhost` und dem angegebenen lokalen Port. Jede Verbindung, die auf dem angegebenen Socket aufgemacht wird, wird dann auf den spezifizierten entfernten Rechner und Port weitergeleitet. Im Beispiel wird der lokale Port `5023` an die entfernte Maschine auf Port `23` weitergeleitet. Da der Port 23 für `telnet` reserviert ist, erzeugt das eine sichere man:telnet[1]-Verbindung durch einen SSH-Tunnel.
+
+Wie in den folgenden Beispielen zu sehen ist, kann diese Vorgehensweise genutzt werden, um jedes unsichere TCP-Protokoll, wie SMTP, POP3 und FTP, weiterzuleiten.
+
+.Einen sicheren Tunnel für SMTP erstellen
+[example]
+====
+
+[source,bash]
+....
+% ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
+user@mailserver.example.com's password: *****
+% telnet localhost 5025
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is '^]'.
+220 mailserver.example.com ESMTP
+....
+Zusammen mit `ssh-keygen` und zusätzlichen Benutzer-Accounts können leicht benutzbare SSH-Tunnel aufgebaut werden. Anstelle von Passwörtern können Schlüssel benutzt werden und jeder Tunnel kann unter einem eigenen Benutzer laufen.
+====
+
+.Sicherer Zugriff auf einen POP3-Server
+[example]
+====
+In diesem Beispiel gibt es einen SSH-Server, der Verbindungen von außen akzeptiert. Im selben Netzwerk befindet sich zudem noch ein Mail-Server, der POP3 spricht. Um E-Mails auf sichere Weise abzurufen, bauen Sie eine SSH-Verbindung zu dem SSH-Server im Netzwerk auf und tunneln von dort zum Mail-Server weiter.
+
+[source,bash]
+....
+% ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
+user@ssh-server.example.com's password: ******
+....
+
+Wenn Sie den Tunnel eingerichtet haben, konfigurieren Sie den Mail-Client so, dass er POP3 Anfragen zu `localhost` auf Port 2110 sendet. Diese Verbindung wird dann über den gesicherten Tunnel zu `mail.example.com` weitergeleitet.
+====
+
+.Umgehen einer Firewall
+[example]
+====
+Einige Firewalls filtern sowohl eingehende als auch ausgehende Verbindungen. Zum Beispiel könnte eine Firewall den Zugriff auf entfernte Rechner auf die Ports 22 und 80 beschränken, um lediglich SSH und Web-Inhalte zu erlauben. Dies würde den Zugriff auf Dienste verhindern, die nicht die Ports 22 oder 80 benutzen.
+
+Die Lösung hier ist es, eine SSH-Verbindung zu einer Maschine außerhalb der Firewall aufzumachen und durch diese zum gewünschten Dienst zu tunneln:
+
+[source,bash]
+....
+% ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
+user@unfirewalled-system.example.org's password: *******
+....
+
+In diesem Beispiel benutzt ein Ogg Vorbis Client `localhost` und Port 8888. Die Verbindung wird dann zu `music.example.com` Port 8000 weitergeleitet. Die Firewall wurde somit erfolgreich umgangen.
+====
+
+=== Den SSH-Server aktivieren
+
+Neben den integrierten SSH Client-Werkzeugen, die zur Verfügung stehen, kann ein FreeBSD-System auch als SSH-Server konfiguriert werden, um Verbindungen von anderen SSH-Clients zu akzeptieren.
+
+Benutzen Sie den Kommando man:service[8], um zu prüfen ob der sshd ausgeführt wird:
+
+[source,bash]
+....
+# service sshd status
+....
+
+Wenn der Dienst nicht ausgeführt wird, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+sshd_enable="YES"
+....
+
+Diese Zeile startet `sshd`, den OpenSSH-Daemon, beim nächsten Systemstart. Geben Sie folgendes ein, um den Dienst jetzt zu starten:
+
+[source,bash]
+....
+# service sshd start
+....
+
+Wenn `sshd` erstmalig gestartet wird, werden die Host-Schlüssel des Systems erzeugt und der Fingerabdruck wird auf der Konsole angezeigt. Stellen Sie den Fingerabdruck den Benutzern zur Verfügung, sodass sie ihn überprüfen können, wenn sie das erste Mal eine Verbindung mit dem Server herstellen.
+
+man:sshd[8] enthält die verfügbaren Optionen für den Start von `sshd` und weitere Informationen zur Authentifizierung, den Anmeldeprozess und die verschiedenen Konfigurationsdateien.
+
+Ab jetzt sollte sshd für alle Benutzer mit einem Benutzernamen und Kennwort zur Verfügung stehen.
+
+=== SSH Server Sicherheit
+
+Obwohl sshd das am weitesten verbreitete Remote-Administrations-Werkzeug ist, sind Brute-Force- und Drive-by-Angriffe auf öffentliche Netzwerke weit verbreitet. Daher stehen mehrere Optionen zur Verfügung, um diese Art von Angriffen zu verhindern. Diese Optionen werden in diesem Abschnitt beschrieben.
+
+Es ist in der Regel ein gute Idee, festzulegen, welche Benutzer sich von welchem Rechner aus anmelden können. Dies lässt sich beispielsweise über die Option `AllowUsers` festlegen. Soll sich etwa nur `root` vom Rechner mit der IP-Adresse `192.168.1.32` aus einwählen dürfen, würden Sie folgenden Eintrag in [.filename]#/etc/ssh/sshd_config# aufnehmen:
+
+[.programlisting]
+....
+AllowUsers root@192.168.1.32
+....
+
+Damit sich `admin` von jedem Rechner aus anmelden kann, geben Sie nur den Benutzernamen an:
+
+[.programlisting]
+....
+AllowUsers admin
+....
+
+Sie können auch mehrere Benutzer in einer Zeile aufführen:
+
+[.programlisting]
+....
+AllowUsers root@192.168.1.32 admin
+....
+
+Nachdem Sie [.filename]#/etc/ssh/sshd_config# angepasst haben, muss `sshd` seine Konfigurationsdateien neu einlesen. Dazu geben Sie Folgendes ein:
+
+[source,bash]
+....
+# /etc/rc.d/sshd reload
+....
+
+[NOTE]
+====
+Wenn die Option `AllowUsers` verwendet wird, ist es wichtig, jeden Benutzer aufzulisten, der sich an diesem Rechner anmelden muss. Benutzer, die nicht in dieser Liste aufgeführt sind, dürfen sich nicht anmelden. Die Optionen für die Konfigurationsdatei von OpenSSH unterscheiden zwischen Groß- und Kleinschreibung. Wenn Sie eine Option falsch schreiben, so wird sie ingnoriert. Testen Sie immer die Änderungen, um sicherzustellen, dass sie wie erwartet funktionieren. Weitere Informationen zu den verfügbaren Optionen finden Sie in man:sshd_config[5].
+====
+
+Darüber hinaus können Benutzer gezwungen werden, eine Zwei-Faktor-Authentifizierung mit einem öffentlichen und einem privaten Schlüssel zu benutzen. Bei Bedarf kann der Benutzer ein Schlüsselpaar mit man:ssh-keygen[1] erzeugen und dem Administrator den öffentlichen Schlüssel zukommen lassen. Der Schlüssel wird, wie weiter oben beschrieben, in [.filename]#authorized_keys# platziert. Um den Benutzer zu zwingen, ausschließlich Schlüssel zu benutzen, kann die folgende Option konfiguriert werden:
+
+[.programlisting]
+....
+AuthenticationMethods publickey
+....
+
+[TIP]
+====
+
+Verwechseln Sie nicht [.filename]#/etc/ssh/sshd_config# mit [.filename]#/etc/ssh/ssh_config# (beachten Sie das zusätzliche `d` im ersten Dateinamen). Die erste Datei konfiguriert den Server und die zweite Datei konfiguriert den Client. man:ssh_config[5] enthält eine Auflistung der verfügbaren Client-Einstellungen.
+====
+
+[[fs-acl]]
+== Zugriffskontrolllisten für Dateisysteme (ACL)
+
+_Zugriffskontrolllisten_ (Access Control Lists, ACL) erweitern die normalen Zugriffsrechte von UNIX(R) Systemen auf eine kompatible (POSIX(R).1e) Weise und bieten feiner granulierte Sicherheitsmechanismen.
+
+Der [.filename]#GENERIC#-Kernel von FreeBSD bietet ACL-Unterstützung für UFS-Dateisysteme. Benutzer, die es vorziehen einen eigenen Kernel zu übersetzen, müssen die folgende Option in die Kernelkonfigurationsdatei aufnehmen:
+
+[.programlisting]
+....
+options UFS_ACL
+....
+
+Das System gibt eine Warnung aus, wenn ein Dateisystem mit ACLs eingehangen werden soll und die Unterstützung für ACLs nicht im Kernel aktiviert ist. ACLs bauen auf den erweiterten Attributen auf, die von UFS2 standardmäßig unterstützt werden.
+
+Dieses Kapitel beschreibt, wie ACL-Unterstützung aktiviert wird. Zudem werden einige Anwendungsbeispiele vorgestellt.
+
+=== ACL-Unterstützung aktivieren
+
+Die Option `acl` in [.filename]#/etc/fstab# aktiviert Zugriffskontrolllisten für ein Dateisystem. Die bevorzugte Möglichkeit ist die Verwendung von Zugriffskontrolllisten mit man:tunefs[8] (Option `-a`), im Superblock des Dateisystems festzuschreiben. Diese Möglichkeit hat mehrere Vorteile:
+
+* Nochmaliges Einhängen eines Dateisystems (Option `-u` von man:mount[8]) verändert den Status der Zugriffskontrolllisten nicht. Die Verwendung von Zugriffskontrolllisten kann nur durch Abhängen und erneutes Einhängen eines Dateisystems verändert werden. Das heißt auch, dass Zugriffskontrolllisten nicht nachträglich auf dem Root-Dateisystem aktiviert werden können.
+* Die Zugriffskontrolllisten auf den Dateisystemen sind, unabhängig von den Optionen in [.filename]#/etc/fstab# oder Namensänderungen der Geräte, immer aktiv. Dies verhindert auch, dass Zugriffskontrolllisten aus Versehen auf Dateisystemen ohne Zugriffskontrolllisten aktiviert werden.
+
+[NOTE]
+====
+Es kann sein, dass sich der Status von Zugriffskontrolllisten später durch nochmaliges Einhängen des Dateisystems (Option `-u` von man:mount[8]) ändern lässt. Die momentane Variante ist aber sicherer, da der Status der Zugriffskontrolllisten nicht versehentlich geändert werden kann. Allgemein sollten Zugriffskontrolllisten auf einem Dateisystem, auf dem sie einmal verwendet wurden, nicht deaktiviert werden, da danach die Zugriffsrechte falsch sein können. Werden Zugriffskontrolllisten auf einem solchen Dateisystem wieder aktiviert, werden die Zugriffsrechte von Dateien, die sich zwischenzeitlich geändert haben, überschrieben, was zu erneuten Problemen führt.
+====
+
+Die Zugriffsrechte einer Datei werden durch ein `+` (Plus) gekennzeichnet, wenn die Datei durch Zugriffskontrolllisten geschützt ist:
+
+[.programlisting]
+....
+drwx------ 2 robert robert 512 Dec 27 11:54 private
+drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1
+drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2
+drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3
+drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html
+....
+
+In diesem Beispiel sind die Verzeichnisse [.filename]#directory1#, [.filename]#directory2# und [.filename]#directory3# durch Zugriffskontrolllisten geschützt, wohingegen das Verzeichnis [.filename]#public_html# nicht geschützt ist.
+
+=== Zugriffskontrolllisten benutzen
+
+`getfacl` zeigt Zugriffskontrolllisten an. Das folgende Kommando zeigt die ACLs auf der Datei [.filename]#test#:
+
+[source,bash]
+....
+% getfacl test
+ #file:test
+ #owner:1001
+ #group:1001
+ user::rw-
+ group::r--
+ other::r--
+....
+
+`setfacl` ändert oder entfernt ACLs auf Dateien. Um alle ACLs einer Datei zu entfernen, können Sie die Option `-k` benutzen. Es ist jedoch empfehlenswert die Option `-b` zu verwenden, da sie die erforderlichen Felder, die für ACLs benötigt werden, beibehält.
+
+[source,bash]
+....
+# setfacl -k test
+....
+
+Benutzen Sie `-m` um die Einträge der ACL zu verändern:
+
+[source,bash]
+....
+% setfacl -m u:trhodes:rwx,g:web:r--,o::--- test
+....
+
+In diesem Beispiel gab es keine vordefinierten Einträge, da sie durch den vorhergehenden Befehl entfernt wurden. Mit diesem Kommando werden die eben entfernten Zugriffskontrolllisten wiederhergestellt. Der Befehl gibt die Fehlermeldung `Invalid argument` aus, wenn Sie nicht existierende Benutzer oder Gruppen als Parameter angeben.
+
+Weitere Informationen zu den Optionen dieser Kommandos finden Sie in man:getfacl[1] und man:setfacl[1].
+
+[[security-pkg]]
+== Sicherheitsprobleme in Software von Drittanbietern überwachen
+
+In den letzten Jahren wurden zahlreiche Verbesserungen in der Einschätzung und dem Umgang mit Sicherheitsproblemen erzielt. Die Gefahr von Einbrüchen in ein System wird aber immer größer, da Softwarepakete von Dritten auf nahezu jedem Betriebssystem installiert und konfiguriert werden.
+
+Die Einschätzung der Verletzlichkeit eines Systems ist ein Schlüsselfaktor für dessen Sicherheit. FreeBSD veröffentlicht zwar Sicherheitshinweise (security advisories) für das Basissystem, das Projekt ist allerdings nicht dazu in der Lage, dies auch für die zahlreichen Softwarepakete von Dritten zu tun. Dennoch gibt es einen Weg, auch diese Programmpakete zu überwachen. Das FreeBSD Dienstprogramm pkg enthält Optionen für genau diesen Anwendungsfall.
+
+pkg fragt dazu eine Datenbank auf bekannte Sicherheitsprobleme ab. Diese Datenbank wird vom FreeBSD Security Team sowie den Ports-Entwicklern aktualisiert und gewartet.
+
+Anweisungen zur Installation von pkg finden Sie im crossref:ports[pkgng-intro,Benutzen von pkg zur Verwaltung von Binärpaketen].
+
+Die Installation enthält Konfigurationsdateien für man:periodic[8], welche die Datenbank von pkg verwaltet und aktualisiert. Diese Funktionalität wird aktiviert, wenn in man:periodic.conf[5] die Variable `daily_status_security_pkgaudit_enable` auf `YES` gesetzt wird. Stellen Sie auf jeden Fall sicher, dass diese (an das E-Mail-Konto von `root` gesendeten) Sicherheitsberichte auch gelesen werden.
+
+Nach der Installation kann ein Administrator mit dem folgenden Kommando die Datenbank aktualisieren und sich die Sicherheitslücken in installierten Paketen anzeigen lassen:
+
+[source,bash]
+....
+# pkg audit -F
+....
+
+pkg zeigt dann die Schwachstellen in installierten Pakete an:
+
+[.programlisting]
+....
+Affected package: cups-base-1.1.22.0_1
+Type of problem: cups-base -- HPGL buffer overflow vulnerability.
+Reference: <https://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html>
+
+1 problem(s) in your installed packages found.
+
+You are advised to update or deinstall the affected package(s) immediately.
+....
+
+Wenn Sie die angegebene URL über einen Internetbrowser aufrufen, erhalten Sie weitere Informationen über die bestehende Sicherheitslücke, wie die betroffenen Versionen, die Version des FreeBSD-Ports sowie Hinweise auf weitere Seiten, die ebenfalls Sicherheitshinweise zu diesem Problem bieten.
+
+pkg ist ein mächtiges Werkzeug und insbesondere in Zusammenarbeit mit package:ports-mgmt/portmaster[] äußerst hilfreich.
+
+[[security-advisories]]
+== FreeBSD Sicherheitshinweise
+
+Wie viele andere Hersteller von hochwertigen Betriebssystemen, hat auch das FreeBSD-Projekt ein Sicherheitsteam, das für die Bestimmung des End-of-Life (EoL) Datum verantwortlich ist. Das Sicherheitsteam stellt zudem sicher, dass Sicherheitsupdates für unterstützte Versionen, welche noch nicht ihr EoL erreicht haben, zur Verfügung gestellt werden. Weitere Informationen über das FreeBSD Sicherheitsteam und den unterstützten Versionen finden Sie auf der Webseite link:https://www.FreeBSD.org/security[FreeBSD Security].
+
+Zu den Aufgaben des Sicherheitsteams zählt es, auf gemeldete Sicherheitslücken im FreeBSD-Betriebssystem zu reagieren. Sobald eine Sicherheitslücke bestätigt wird, überprüft das Sicherheitsteam die notwendigen Schritte, um die Schwachstelle zu beheben und den Quellcode mit der Korrektur zu aktualisieren. Anschließend veröffentlicht es die Details in einem Sicherheitshinweis (Security Advisory). Die Sicherheitshinweise werden auf der link:https://www.FreeBSD.org/security/advisories/[FreeBSD Webseite] und auf den Mailinglisten {freebsd-security-notifications}, {freebsd-security} und {freebsd-announce} veröffentlicht.
+
+Dieser Abschnitt beschreibt das Format eines FreeBSD Sicherheitshinweises.
+
+=== Format eines Sicherheitshinweis
+
+Hier ist ein Beispiel für einen FreeBSD Sicherheitshinweis:
+
+[.programlisting]
+....
+=============================================================================
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-SA-14:04.bind Security Advisory
+ The FreeBSD Project
+
+Topic: BIND remote denial of service vulnerability
+
+Category: contrib
+Module: bind
+Announced: 2014-01-14
+Credits: ISC
+Affects: FreeBSD 8.x and FreeBSD 9.x
+Corrected: 2014-01-14 19:38:37 UTC (stable/9, 9.2-STABLE)
+ 2014-01-14 19:42:28 UTC (releng/9.2, 9.2-RELEASE-p3)
+ 2014-01-14 19:42:28 UTC (releng/9.1, 9.1-RELEASE-p10)
+ 2014-01-14 19:38:37 UTC (stable/8, 8.4-STABLE)
+ 2014-01-14 19:42:28 UTC (releng/8.4, 8.4-RELEASE-p7)
+ 2014-01-14 19:42:28 UTC (releng/8.3, 8.3-RELEASE-p14)
+CVE Name: CVE-2014-0591
+
+For general information regarding FreeBSD Security Advisories,
+including descriptions of the fields above, security branches, and the
+following sections, please visit <URL:http://security.FreeBSD.org/>.
+
+I. Background
+
+BIND 9 is an implementation of the Domain Name System (DNS) protocols.
+The named(8) daemon is an Internet Domain Name Server.
+
+II. Problem Description
+
+Because of a defect in handling queries for NSEC3-signed zones, BIND can
+crash with an "INSIST" failure in name.c when processing queries possessing
+certain properties. This issue only affects authoritative nameservers with
+at least one NSEC3-signed zone. Recursive-only servers are not at risk.
+
+III. Impact
+
+An attacker who can send a specially crafted query could cause named(8)
+to crash, resulting in a denial of service.
+
+IV. Workaround
+
+No workaround is available, but systems not running authoritative DNS service
+with at least one NSEC3-signed zone using named(8) are not vulnerable.
+
+V. Solution
+
+Perform one of the following:
+
+1) Upgrade your vulnerable system to a supported FreeBSD stable or
+release / security branch (releng) dated after the correction date.
+
+2) To update your vulnerable system via a source code patch:
+
+The following patches have been verified to apply to the applicable
+FreeBSD release branches.
+
+a) Download the relevant patch from the location below, and verify the
+detached PGP signature using your PGP utility.
+
+[FreeBSD 8.3, 8.4, 9.1, 9.2-RELEASE and 8.4-STABLE]
+# fetch http://security.FreeBSD.org/patches/SA-14:04/bind-release.patch
+# fetch http://security.FreeBSD.org/patches/SA-14:04/bind-release.patch.asc
+# gpg --verify bind-release.patch.asc
+
+[FreeBSD 9.2-STABLE]
+# fetch http://security.FreeBSD.org/patches/SA-14:04/bind-stable-9.patch
+# fetch http://security.FreeBSD.org/patches/SA-14:04/bind-stable-9.patch.asc
+# gpg --verify bind-stable-9.patch.asc
+
+b) Execute the following commands as root:
+
+# cd /usr/src
+# patch < /path/to/patch
+
+Recompile the operating system using buildworld and installworld as
+described in <URL:https://www.FreeBSD.org/handbook/makeworld.html>.
+
+Restart the applicable daemons, or reboot the system.
+
+3) To update your vulnerable system via a binary patch:
+
+Systems running a RELEASE version of FreeBSD on the i386 or amd64
+platforms can be updated via the freebsd-update(8) utility:
+
+# freebsd-update fetch
+# freebsd-update install
+
+VI. Correction details
+
+The following list contains the correction revision numbers for each
+affected branch.
+
+Branch/path Revision
+- -------------------------------------------------------------------------
+stable/8/ r260646
+releng/8.3/ r260647
+releng/8.4/ r260647
+stable/9/ r260646
+releng/9.1/ r260647
+releng/9.2/ r260647
+- -------------------------------------------------------------------------
+
+To see which files were modified by a particular revision, run the
+following command, replacing NNNNNN with the revision number, on a
+machine with Subversion installed:
+
+# svn diff -cNNNNNN --summarize svn://svn.freebsd.org/base
+
+Or visit the following URL, replacing NNNNNN with the revision number:
+
+<URL:https://svnweb.freebsd.org/base?view=revision&revision=NNNNNN>
+
+VII. References
+
+<URL:https://kb.isc.org/article/AA-01078>
+
+<URL:http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0591>
+
+The latest revision of this advisory is available at
+<URL:http://security.FreeBSD.org/advisories/FreeBSD-SA-14:04.bind.asc>
+-----BEGIN PGP SIGNATURE-----
+
+iQIcBAEBCgAGBQJS1ZTYAAoJEO1n7NZdz2rnOvQP/2/68/s9Cu35PmqNtSZVVxVG
+ZSQP5EGWx/lramNf9566iKxOrLRMq/h3XWcC4goVd+gZFrvITJSVOWSa7ntDQ7TO
+XcinfRZ/iyiJbs/Rg2wLHc/t5oVSyeouyccqODYFbOwOlk35JjOTMUG1YcX+Zasg
+ax8RV+7Zt1QSBkMlOz/myBLXUjlTZ3Xg2FXVsfFQW5/g2CjuHpRSFx1bVNX6ysoG
+9DT58EQcYxIS8WfkHRbbXKh9I1nSfZ7/Hky/kTafRdRMrjAgbqFgHkYTYsBZeav5
+fYWKGQRJulYfeZQ90yMTvlpF42DjCC3uJYamJnwDIu8OhS1WRBI8fQfr9DRzmRua
+OK3BK9hUiScDZOJB6OqeVzUTfe7MAA4/UwrDtTYQ+PqAenv1PK8DZqwXyxA9ThHb
+zKO3OwuKOVHJnKvpOcr+eNwo7jbnHlis0oBksj/mrq2P9m2ueF9gzCiq5Ri5Syag
+Wssb1HUoMGwqU0roS8+pRpNC8YgsWpsttvUWSZ8u6Vj/FLeHpiV3mYXPVMaKRhVm
+067BA2uj4Th1JKtGleox+Em0R7OFbCc/9aWC67wiqI6KRyit9pYiF3npph+7D5Eq
+7zPsUdDd+qc+UTiLp3liCRp5w6484wWdhZO6wRtmUgxGjNkxFoNnX8CitzF8AaqO
+UWWemqWuz3lAZuORQ9KX
+=OQzQ
+-----END PGP SIGNATURE-----
+....
+
+Jeder Sicherheitshinweis verwendet das folgende Format:
+
+* Jeder Sicherheitshinweis wird mit dem PGP-Schlüssel des Sicherheitsbeauftragten unterzeichnet. Der öffentliche Schlüssel des Sicherheitsbeauftragten kann in crossref:pgpkeys[pgpkeys,OpenPGP-Schlüssel] überprüft werden.
+* Der Name des Sicherheitshinweises beginnt immer mit `FreeBSD-SA-` (für FreeBSD Security Advisory), gefolgt vom Jahr im zweistelligen Format (`14:`), gefolgt von der Anzahl von Sicherheitshinweisen für dieses Jahr (`04.`), gefolgt vom Namen der Anwendung oder des betroffenen Subsystems (`bind`). Der hier gezeigte Sicherheitshinweis ist der vierte Hinweis für das Jahr 2014 und betrifft die Anwendung BIND.
+* Das Feld `Topic` enthält eine Beschreibung der Schwachstelle.
+* Das Feld `Category` beschreibt den betroffenen Systemteil. Mögliche Werte für dieses Feld sind `core`, `contrib` oder `ports`. Die Kategorie `core` gilt für Komponenten des FreeBSD-Betriebssystems, die Kategorie `contrib` beschreibt zum Basissystem gehörende Software Dritter, beispielsweise BIND. Die Kategorie `ports` beschreibt Software, die Teil der Ports-Sammlung ist.
+* Das Feld `Module` beschreibt die betroffene Komponente. Im diesem Beispiel ist das `bind`-Modul betroffen, dass heißt dieses Problem betrifft eine Anwendung aus dem Betriebssystem.
+* Das Feld `Announced` gibt den Zeitpunkt der Bekanntgabe des Sicherheitshinweises an. Das bedeutet, dass das Sicherheitsteam das Problem bestätigt hat und das eine entsprechende Korrektur bereits im FreeBSD Quellcode-Repository zur Verfügung steht .
+* Das Feld `Credits` gibt die Person oder Organisation an, die das Sicherheitsproblem bemerkt und gemeldet hat.
+* Das Feld `Affects` listet die FreeBSD-Releases auf, die von dem Problem betroffen sind.
+* Das Feld `Corrected` zeigt an, wann das Problem in welchem Release behoben wurde. Der Teil in Klammern zeigt an, in welchem Zweig die Aktualisierung eingeflossen ist und die entsprechende Versionsnummer und Patch-Level des Release. Der Patch-Level besteht aus dem Buchstaben `p`, gefolgt von einer Nummer. Dies erlaubt es dem Benutzer festzustellen, welche Korrekturen bereits auf dem System eingespielt wurden.
+* Reserviert für Informationen, über die auf http://cve.mitre.org[ cve.mitre.org] nach Sicherheitslücken gesucht werden kann.
+* Im Feld `Background` wird das betroffene Modul beschrieben.
+* Im Feld `Problem Description` wird das Sicherheitsproblem beschrieben. Hier wird fehlerhafter Code beschrieben oder geschildert, wie ein Werkzeug ausgenutzt werden könnte.
+* Das Feld `Impact` beschreibt die Auswirkungen des Sicherheitsproblems auf ein System.
+* Im Feld `Workaround` wird eine Umgehung des Sicherheitsproblems beschrieben. Die Umgehung ist für Administratoren gedacht, die das System aus Zeitnot, Netzwerk-technischen oder anderen Gründen nicht aktualisieren können.
+* Das Feld `Solution` enthält eine getestete Schritt-für-Schritt Anleitung, die das Sicherheitsproblem behebt.
+* Das Feld `Correction Details` enthält die Subversion-Tags der betroffenen Dateien zusammen mit zugehörigen Revisionsnummern, in denen das Problem behoben wurde.
+* Im Feld `References` finden sich Verweise auf weitere Informationsquellen.
+
+[[security-accounting]]
+== Prozess-Überwachung
+
+Prozess-Überwachung (Process accounting) ist ein Sicherheitsverfahren, bei dem ein Administrator verfolgt, welche Systemressourcen verwendet werden und wie sich diese auf die einzelnen Anwender verteilen. Dadurch kann das System überwacht werden und es ist sogar möglich, zu kontrollieren, welche Befehle ein Anwender eingibt.
+
+Die Überwachung von Prozessen hat sowohl Vor- als auch Nachteile. Positiv ist, dass man einen Einbruchsversuch bis an den Anfang zurückverfolgen kann. Von Nachteil ist allerdings, dass durch diesen Prozess Unmengen an Protokolldateien erzeugt werden, die auch dementsprechenden Plattenplatz benötigen. Dieser Abschnitt beschreibt die Grundlagen der Prozess-Überwachung.
+
+[NOTE]
+====
+Wenn Sie eine differenzierte Prozess-Überwachung benötigen, lesen Sie crossref:audit[audit,Security Event Auditing].
+====
+
+=== Die Prozess-Überwachung aktivieren und konfigurieren
+
+Bevor Sie die Prozess-Überwachung verwenden können, müssen Sie diese über die folgenden Befehle aktivieren:
+
+[source,bash]
+....
+# sysrc accounting_enable=yes
+# service accounting start
+....
+
+Die Informationen werden unterhalb von [.filename]#/var/account# gespeichert. Das Verzeichnis wird beim ersten Start des Dienstes automatisch erstellt. Die Dateien enthalten sensible Informationen, einschließlich aller Befehle, die von allen Benutzern ausgeführt wurden. Der Schreibzugriff auf diese Dateien ist auf `root` beschränkt, der Lesezugriff auf `root` und Mitgliedern der Gruppe `wheel`. Um zu verhindern, dass die Mitglieder der Gruppe `wheel` die Dateien lesen können, ändern Sie den Modus des Verzeichnisses [.filename]#/var/account# so, dass der Zugriff nur durch `root` möglich ist.
+
+Einmal aktiviert, wird sofort mit der Überwachung von CPU-Statistiken, Befehlen und anderen Vorgängen begonnen. Protokolldateien werden in einem nur von Maschinen lesbaren Format gespeichert und können mit `sa` aufgerufen werden. Ohne Optionen gibt `sa` Informationen wie die Anzahl der Aufrufe pro Anwender, die abgelaufene Zeit in Minuten, die gesamte CPU- und Anwenderzeit in Minuten und die durchschnittliche Anzahl der Ein- und Ausgabeoperationen aus. man:sa[8] enthält eine Liste der Optionen, welche die Ausgabe steuern.
+
+Benutzen Sie `lastcomm`, um die von den Benutzern ausgeführten Befehle anzuzeigen. Dieses Beispiel zeigt die Nutzung von `ls` durch `trhodes` auf dem Terminal `ttyp1`:
+
+[source,bash]
+....
+# lastcomm ls trhodes ttyp1
+....
+
+Zahlreiche weitere nützliche Optionen finden Sie man:lastcomm[1], man:acct[5] sowie man:sa[8].
+
+[[security-resourcelimits]]
+== Einschränkung von Ressourcen
+
+FreeBSD bietet dem Systemadministrator mehrere Möglichkeiten die System-Ressourcen, die ein einzelner Benutzer verwenden kann, einzuschränken. Festplatten-Kontingente schränken den Plattenplatz, der einem Benutzer zur Verfügung steht, ein. Kontingente werden im crossref:disks[quotas,"Disk Quotas"] diskutiert.
+
+Einschränkungen auf andere Ressourcen, wie CPU und Speicher, können über eine Konfigurationsdatei oder über die Kommandozeile konfiguriert werden. Traditionell werden Login-Klassen in [.filename]#/etc/login.conf# definiert. Obwohl diese Methode immer noch untersützt wird, muss nach jeder Änderung an dieser Datei die Ressourcen-Datenbank neu gebaut werden. Zudem müssen Sie die notwendigen Änderungen in [.filename]#/etc/master.passwd# vornehmen und die Passwort-Datenbnak neu bauen. Dieser Prozess kann, abhängig davon, wie viele Benutzer bearbeitet werden müssen, sehr zeitaufwändig sein.
+
+Mit `rctl` Ressourcen für Benutzer sehr detailliert gesteuert werden. Dieser Befehl unterstützt nicht nur die Kontrolle der Ressourcen für Benutzer, sondern auch die Beschränkung auf Prozesse und Jails.
+
+In diesem Abschnitt werden beide Methoden vorgestellt. Angefangen wird mit der traditionellen Methode.
+
+[[users-limiting]]
+=== Login-Klassen konfigurieren
+
+Bei der traditionellen Methode werden Login-Klassen und Ressourcenbeschränkungen in [.filename]#/etc/login.conf# definiert. Jeder Benutzer kann einer Login-Klasse zugewiesen werden (standardmäßig `default`) und jede Login-Klasse ist mit einem Satz von Login-Fähigkeiten verbunden. Eine Login-Fähigkeit ist ein `_Name_=_Wert_` Paar, in dem _Name_ die Fähigkeit bezeichnet und _Wert_ ein beliebiger Text ist, der in Abhänigkeit von _Name_ entsprechend verarbeitet wird.
+
+[NOTE]
+====
+Immer wenn [.filename]#/etc/login.conf# verändert wurde, muss die [.filename]#/etc/login.conf.db# mit dem folgenden Kommando aktualisiert werden:
+
+[source,bash]
+....
+# cap_mkdb /etc/login.conf
+....
+
+====
+
+Ressourcenbeschränkungen unterscheiden sich von normalen Login-Fähigkeiten zweifach. Erstens gibt es für jede Beschränkung ein aktuelles und ein maximales Limit. Das aktuelle Limit kann vom Benutzer oder einer Anwendung beliebig bis zum maximalen Limit verändert werden. Letzteres kann der Benutzer nur heruntersetzen. Zweitens gelten die meisten Ressourcenbeschränkungen für jeden vom Benutzer gestarteten Prozess.
+
+<<resource-limits>> listet die gebräuchlichen Ressourcenbeschränkungen auf. Alle verfügbaren Ressourcenbeschränkungen und Fähigkeiten sind im Detail in man:login.conf[5] beschrieben.
+
+[[resource-limits]]
+.Ressourcenbeschränkungen für Login-Klassen
+[cols="30%,70%", frame="none", options="header"]
+|===
+| Ressourcenbeschränkung
+| Beschreibung
+
+|coredumpsize
+|Das Limit der Größe einer core-Datei, die von einem Programm generiert wird, unterliegt aus offensichtlichen Gründen anderen Limits der Festplattenbenutzung, zum Beispiel `filesize` oder Festplattenkontingenten. Es wird oft als weniger harte Methode zur Kontrolle des Festplattenplatz-Verbrauchs verwendet. Da Benutzer die core-Dateien selbst nicht erstellen und sie oft nicht löschen, kann diese Option davor schützen, dass kein Festplattenspeicher mehr zur Verfügung steht, sollte ein großes Programm abstürzen.
+
+|cputime
+|Die maximale Rechenzeit, die ein Prozess eines Benutzers verbrauchen darf. Überschreitet ein Prozess diesen Wert, wird er vom Kernel beendet. Beachten Sie, dass die Rechen__zeit__ limitiert wird, nicht die prozentuale Prozessorenbenutzung, wie es in einigen Feldern von `top` und `ps` dargestellt wird.
+
+|filesize
+|Hiermit lässt sich die maximale Größe einer Datei bestimmen, die der Benutzer besitzen darf. Im Gegensatz zu crossref:disks[quotas,Festplattenkontingenten] ist diese Beschränkung nur für jede einzelne Datei gültig und nicht für den Platz, den alle Dateien eines Benutzers verwenden.
+
+|maxproc
+|Das ist die maximale Anzahl von Prozessen, die ein Benutzer starten darf, und beinhaltet sowohl Vordergrund- als auch Hintergrundprozesse. Dieser Wert nicht höher sein als das System-Limit, das in `kern.maxproc` angegeben ist. Vergessen Sie nicht, dass ein zu kleiner Wert den Benutzer in seiner Produktivität einschränken könnte, wenn beispielsweise ein großes Programm übersetzt wird oder viele Prozesse gestartet sind.
+
+|memorylocked
+|Dieses Limit gibt an, wie viel virtueller Speicher von einem Prozess maximal im Arbeitsspeicher festgesetzt werden kann (siehe auch man:mlock[2]). Ein paar systemkritische Programme, wie man:amd[8], verhindern damit einen Systemzusammenbruch, der auftreten könnte, wenn sie aus dem Speicher genommen werden.
+
+|memoryuse
+|Bezeichnet den maximalen Speicher, den ein Prozess benutzen darf und beinhaltet sowohl Arbeitsspeicher-, als auch Swap-Benutzung. Es ist kein allübergreifendes Limit für den Speicherverbrauch, aber ein guter Anfang.
+
+|openfiles
+|Mit diesem Limit lässt sich die maximale Anzahl der von einem Prozess des Benutzers geöffneten Dateien festlegen. In FreeBSD werden Dateien auch verwendet, um Sockets und >IPC>-Kanäle darzustellen. Setzen Sie es deshalb nicht zu niedrig. Das System-Limit ist in `kern.maxfiles` definiert.
+
+|sbsize
+|Dieses Limit beschränkt den Netzwerk-Speicher, den ein Benutzer verbrauchen darf. Es kann generell dazu benutzt werden Netzwerk-Verbindungen zu beschränken.
+
+|stacksize
+|Das ist die maximale Größe, auf die der Stack eines Prozesses heranwachsen darf. Das allein ist natürlich nicht genug, um den Speicher zu beschränken, den ein Programm verwenden darf. Es sollte deshalb in Verbindung mit anderen Limits verwendet werden.
+|===
+
+Beim Setzen von Ressourcenbeschränkungen sind noch andere Dinge zu beachten:
+
+* Von [.filename]#/etc/rc# beim Hochfahren des Systems gestartete Prozesse werden der `daemon` Login-Klasse zugewiesen.
+* Obwohl die voreingestellte [.filename]#/etc/login.conf# sinnvolle Limits enthält, sind sie evtl. nicht für jedes System geeignet. Ein zu hohes Limit kann das System für Missbrauch anfällig machen, und ein zu niedriges Limit kann der Produktivität schaden.
+* Xorg beansprucht selbst eine Menge Ressourcen und verleitet die Benutzer dazu, mehrere Programme gleichzeitig laufen zu lassen.
+* Bedenken Sie, dass viele Limits für einzelne Prozesse gelten und nicht für den Benutzer selbst. Setzt man zum Beispiel `openfiles` auf `50`, kann jeder Prozess des Benutzers bis zu `50` Dateien öffnen. Dadurch ist die maximale Anzahl von Dateien, die von einem Benutzer geöffnet werden können, `openfiles` mal `maxproc`. Das gilt auch für den Speicherverbrauch.
+
+Weitere Informationen über Ressourcenbeschränkungen, Login-Klassen und -Fähigkeiten finden Sie in man:cap.mkdb[1], man:getrlimit[2] und man:login.conf[5].
+
+=== Einschränkung von Ressourcen aktivieren und konfigurieren
+
+Die Variable `kern.racct.enable` muss auf einen Wert ungleich Null eingestellt sein. Angepasste Kernel benötigen eine spezielle Konfiguration:
+
+[.programlisting]
+....
+options RACCT
+options RCTL
+....
+
+Sobald das System mit dem neuen Kernel gestartet wird, kann `rctl` benutzt werden, um die Regeln für das System festzulegen.
+
+Die Syntax der Regeln wird durch _subject_, _subject-id_, _resource_ und _action_ gesteuert, wie in diesem Beispiel zu sehen ist:
+
+[.programlisting]
+....
+user:trhodes:maxproc:deny=10/user
+....
+
+Diese Regel zeigt den grundlegenden Aufbau, hier mit dem Subjekt `user` und der Subjekt-ID `trhodes`. `maxproc` definiert die Anzahl der Prozesse. Die "Aktion" `deny` verhindert, dass neue Prozesse erstellt werden. Im vorherigen Beispiel wurde für den Benutzer `trhodes` eine Beschränkung von `10` Prozessen konfiguriert. Zu den weiteren Aktionen zählen beispielsweise die Protokollierung auf der Konsole, Benachrichtigungen an man:devd[8] oder das Senden eines `SIGTERM` an einen Prozess.
+
+Beim hinzufügen von Regeln müssen einige Dinge beachtet werden. Das obige Beispiel würde den Benutzer sogar daran hindern, einfachste Dinge zu tun, nachdem er sich anmeldet und eine `screen` Sitzung gestartet hat. Sobald die Begrenzung für eine Ressource erreicht ist, wird folgende Fehlermeldung ausgegeben:
+
+[source,bash]
+....
+# man test
+/usr/bin/man: Cannot fork: Resource temporarily unavailable
+eval: Cannot fork: Resource temporarily unavailable
+....
+
+man:rctl[8] kann auch benutzt werden, um einer Jail eine Speichergrenze zuzuweisen. Eine solche Regel könnte wie folgt festgelegt werden:
+
+[source,bash]
+....
+# rctl -a jail:httpd:memoryuse:deny=2G/jail
+....
+
+Damit die Regeln auch nach einem Neustart erhalten bleiben, müssen sie in [.filename]#/etc/rctl.conf# hinzugefügt werden. Dazu schreiben Sie einfach die Regel, ohne das vorhergehende Kommando. Zum Beispiel:
+
+[.programlisting]
+....
+# Block jail from using more than 2G memory:
+jail:httpd:memoryuse:deny=2G/jail
+....
+
+Mit `rctl` können auch Regeln entfernt werden:
+
+[source,bash]
+....
+# rctl -r user:trhodes:maxproc:deny=10/user
+....
+
+man:rctl[8] zeigt auch eine Möglichkeit, alle Regeln zu entfernen. Falls es erforderlich ist alle Regeln für einen einzelnen Benutzer zu entfernen, kann dieser Befehl verwendet werden:
+
+[source,bash]
+....
+# rctl -r user:trhodes
+....
+
+Es gibt noch viele weitere Ressourcen, die verwendet werden können, um zusätzliche `subjects` zu kontrollieren. Weitere Informationen zu diesem Thema finden Sie in man:rctl[8].
+
+[[security-sudo]]
+== Gemeinsame Administration mit Sudo
+
+Systemadministratoren benötigen häufig die Möglichkeit, Benutzern erweiterte Berechtigungen zu gewähren, damit diese privilegierte Aufgaben ausführen können. Die Idee, dass Teammitglieder einen Zugang zu einem FreeBSD-System zur Verfügung gestellt bekommen, um ihre spezifischen Aufgaben erledigen zu können, stellt den Administrator vor eine große Herausforderung. Diese Teammitglieder benötigen in der Regel nur einen eingeschränkten Zugang. Für manche Aufgaben werden jedoch die Rechte des Superusers benötigt. Zum Glück gibt es keinen Grund, diesen Mitgliedern einen solchen Zugang zu geben, da es Werkzeuge für genau diesen Anwendungsfall gibt.
+
+Bislang wurde in diesem Kapitel immer versucht, den Zugriff für autorisierte Benutzer zu gewähren und den Zugriff für nicht autorisierte Benutzer zu verhindern. Ein weiteres Problem entsteht, sobald autorisierte Benutzer Zugriff auf die Ressourcen des Systems haben. In vielen Fällen benötigen einige Benutzer Zugriff auf Startskripte von Anwendungen. In anderen Fällen muss eine Gruppe von Administratoren das System verwalten. Traditionell wird der Zugriff über Benutzer, Gruppen, Dateiberechtigungen und manchmal sogar man:su[1] verwaltet. Und da immer mehr Anwendungen einen Zugriff brauchen und immer mehr Benutzer Zugriff auf die Systemressourcen benötigen, ist ein besserer Lösungsansatz erforderlich. Die am häufigsten verwendete Anwendung in solchen Fällen ist derzeit Sudo.
+
+Sudo erlaubt dem Administrator eine rigide Konfiguration des Zugriffs auf bestimmte Kommandos und stellt einige erweiterte Protokollfunktionen zur Verfügung. Dieses Werkzeug kann als Port oder Paket package:security/sudo[] installiert werden. Das Paket wird wie folgt installiert:
+
+[source,bash]
+....
+# pkg install sudo
+....
+
+Nach der Installation können Sie `visudo` benutzen, um die Konfiguration in einem Texteditor zu öffnen. Es wird ausdrücklich `visudo` empfohlen, da dieses Programm die Syntax auf Fehler überprüft, bevor die Konfigurationsdatei gespeichert wird.
+
+Die Konfigurationsdatei besteht aus mehreren kleinen Abschnitten, die eine umfangreiche Konfiguration ermöglichen. Im folgenden Beispiel soll der Webentwickler (`user1`) den Dienst _webservice_ starten und stoppen dürfen. Um ihm dieses Recht zu gewähren, fügen Sie folgende Zeile an das Ende von [.filename]#/usr/local/etc/sudoers# ein:
+
+[.programlisting]
+....
+user1 ALL=(ALL) /usr/sbin/service webservice *
+....
+
+Der Benutzer kann jetzt _webservice_ über dieses Kommando starten:
+
+[source,bash]
+....
+% sudo /usr/sbin/service webservice start
+....
+
+Diese Konfiguration gestattet den Zugriff auf den webservice für einen einzelnen Benutzer. Jedoch ist in den meisten Organisationen ein ganzes Team für die Verwaltung eines solchen Dienstes verantwortlich. Mit einer weiteren Zeile ist es möglich, einer ganzen Gruppe diesen Zugriff zu geben. Die folgenden Schritte erstellen eine Gruppe mit den entsprechenden Benutzern. Der Gruppe wird es dann ermöglicht, diesen Dienst zu verwalten:
+
+[source,bash]
+....
+# pw groupadd -g 6001 -n webteam
+....
+
+Nun werden die Benutzer mit Hilfe von man:pw[8] in die Gruppe _webteam_ hinzugefügt:
+
+[source,bash]
+....
+# pw groupmod -m user1 -n webteam
+....
+
+Zuletzt wird folgende Zeile in [.filename]#/usr/local/etc/sudoers# hinzugefügt, damit jedes Mitglied von _webteam_ den Dienst _webservice_ verwalten kann:
+
+[.programlisting]
+....
+%webteam ALL=(ALL) /usr/sbin/service webservice *
+....
+
+Im Gegensatz zu man:su[1], benötigt Sudo nur das Passwort des Benutzers.
+
+Benutzer, die mit Hilfe von Sudo Programme ausführen, müssen lediglich ihr eigenes Passwort eingeben. Dies ist sicherer und bietet eine bessere Kontrolle als man:su[1], wo der Benutzer das `root`-Passwort eingibt und damit alle Rechte von `root` erlangt.
+
+[TIP]
+====
+
+Viele Organisationen haben bereits auf eine Zwei-Faktor-Authentifizierung umgestellt. In diesen Fällen hat der Benutzer möglicherweise gar kein Passwort, welches er eingeben könnte. Sudo bietet für solche Fälle die Variable `NOPASSWD`. Wenn die Variable in die obige Konfiguration hinzugefügt wird, dürfen die Mitglieder der Gruppe _webteam_ den Dienst verwalten, ohne ein Passwort eingeben zu müssen:
+
+[.programlisting]
+....
+%webteam ALL=(ALL) NOPASSWD: /usr/sbin/service webservice *
+....
+
+====
+
+[[security-sudo-loggin]]
+=== Protokollierung
+
+Ein Vorteil von Sudo ist, dass Sitzungen protokolliert werden können. Mit den integrierten Protokollmechanismen und dem Befehl sudoreplay können alle über Sudo ausgelösten Befehle protokolliert und zu einem späteren Zeitpunkt überprüft werden. Um diese Funktion zu aktivieren, fügen Sie einen Eintrag für das Verzeichnis der Protokolle hinzu. Dieses Beispiel verwendet eine Benutzervariable. Weitere Informationen finden Sie in der Manualpage von sudoreplay.
+
+[.programlisting]
+....
+Defaults iolog_dir=/var/log/sudo-io/%{user}
+....
+
+[TIP]
+====
+
+Dieses Verzeichnis wird automatisch nach der Konfiguration erstellt. Um auf der sicheren Seite zu sein, ist es am besten, das System die Verzeichnisse mit Standardberechtigungen erstellen zu lassen. Dieser Eintrag wird auch ein Protokoll für Administratoren erstellen, wenn diese den Befehl sudoreplay benutzen. Um dieses Verhalten zu ändern, kommentieren Sie die entsprechenden Zeilen in [.filename]#sudoers# aus.
+====
+
+Nachdem dieser Eintrag in die Datei [.filename]#sudoers# hinzugefügt wurde, kann die Konfiguration der Benutzer für die Protokollierung aktualisiert werden. In dem gezeigten Beispiel würde der aktualisierte Eintrag für das _webteam_ zusätzlich folgende Änderung benötigen:
+
+[.programlisting]
+....
+%webteam ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: /usr/sbin/service webservice *
+....
+
+Von nun an wird jede Änderung am _webservice_ protokolliert, wenn sie von einem Mitglied der Gruppe _webteam_ initiiert wurde. Eine Liste der Sitzungen kann wie folgt angezeigt werden:
+
+[source,bash]
+....
+# sudoreplay -l
+....
+
+Wenn Sie eine bestimmte Sitzung wiedergeben möchten, suchen Sie in der Ausgabe nach dem Eintrag `TSID=` und übergeben Sie den Wert ohne weitere Optionen an sudoreplay. Zum Beispiel:
+
+[source,bash]
+....
+# sudoreplay user1/00/00/02
+....
+
+[WARNING]
+====
+
+Obwohl die Sitzungen protokolliert werden, kann ein böswilliger Administrator wahllos die Sitzungsprotokolle löschen. Daher ist es eine gute Idee, eine tägliche Kontrolle mit einem Intrusion Detection System (IDS) oder einer ähnlichen Software durchzuführen, so dass andere Administratoren auf manuelle Änderungen aufmerksam gemacht werden.
+====
+
+sudoreplay ist extrem erweiterbar. Lesen Sie die Dokumentation für weitere Informationen.
diff --git a/documentation/content/de/books/handbook/serialcomms/_index.adoc b/documentation/content/de/books/handbook/serialcomms/_index.adoc
new file mode 100644
index 0000000000..9cf28b902a
--- /dev/null
+++ b/documentation/content/de/books/handbook/serialcomms/_index.adoc
@@ -0,0 +1,1366 @@
+---
+title: Kapitel 26. Serielle Datenübertragung
+part: Teil IV. Netzwerke
+prev: books/handbook/partiv
+next: books/handbook/ppp-and-slip
+---
+
+[[serialcomms]]
+= Serielle Datenübertragung
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 26
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/serialcomms/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/serialcomms/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/serialcomms/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[serial-synopsis]]
+== Übersicht
+
+UNIX(R) Systeme unterstützten schon immer die serielle Datenübertragung. Tatsächlich wurden Ein- und Ausgaben auf den ersten UNIX(R) Maschinen über serielle Leitungen durchgeführt. Seit der Zeit, in der ein durchschnittlicher Terminal aus einem seriellen Drucker mit 10 Zeichen/Sekunde und einer Tastatur bestand, hat sich viel verändert. Dieses Kapitel behandelt einige Möglichkeiten, serielle Datenübertragung unter FreeBSD zu verwenden.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie Folgendes wissen:
+
+* Wie Sie Terminals an ein FreeBSD-System anschließen.
+* Wie Sie sich mit einem Modem auf entfernte Rechner einwählen.
+* Wie Sie entfernten Benutzern erlauben, sich mit einem Modem in ein FreeBSD-System einzuwählen.
+* Wie Sie ein FreeBSD-System über eine serielle Konsole booten.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie
+
+* einen crossref:kernelconfig[kernelconfig,angepassten Kernel konfigurieren und installieren] können.
+* crossref:basics[basics,Berechtigungen und Prozesse unter FreeBSD] verstehen.
+* Zugriff auf die Handbücher der seriellen Komponenten haben, die mit FreeBSD verwendet werden sollen.
+
+[[serial]]
+== Begriffe und Hardware
+
+Die folgenden Begriffe werden oft verwendet, wenn es um serielle Kommunikation geht:
+
+bps::
+Bits pro Sekunde (bps) ist die Einheit für die Übertragungsgeschwindigkeit.
+
+DEE (DTE)::
+Eine Datenendeinrichtung (Data Terminal Equipment) ist einer der beiden Endpunkte bei der seriellen Kommunikation. Zum Beispiel ein Computer.
+
+DÜE (DCE)::
+Datenübertragungseinrichtung (Data Communications Equipment) ist der andere Endpunkt bei der seriellen Kommunikation. Typischerweise ein Modem.
+
+RS-232::
+Der originale Standard, der serielle Datenübertragung definiert. Er wird heutzutage als TIA-232 bezeichnet.
+
+In diesem Abschnitt wird der Begriff "Baud" nicht für Übertragungsgeschwindigkeiten gebraucht. Baud bezeichnet elektrische Zustandswechsel pro Zeiteinheit, die Taktfrequenz, während "bps" der _richtige_ Begriff für die Übertragungsgeschwindigkeit ist.
+
+Um ein Modem oder einen Terminal an ein FreeBSD-System anzuschließen, muss der Computer über eine serielle Schnittstelle verfügen. Zusätzlich wird das passende Kabel benötigt, um das Gerät mit der Schnittstelle zu verbinden. Benutzer, die mit seriellen Geräten und den nötigen Kabeln schon vertraut sind, können diesen Abschnitt überspringen.
+
+[[term-cables-null]]
+=== Kabel und Schnittstellen
+
+Es gibt verschiedene serielle Kabel. Die zwei häufigsten sind Nullmodemkabel und Standard-RS-232-Kabel. Die Dokumentation der Hardware sollte beschreiben, welcher Kabeltyp benötigt wird.
+
+Ein Nullmodemkabel verbindet einige Signale, wie die Betriebserde, eins zu eins, andere Signale werden getauscht: Die Sende- und Empfangsleitungen werden zum Beispiel gekreuzt.
+
+Nullmodemkabel für die Anbindung eines Terminals können auch selbst hergestellt werden. Die folgende Tabelle enthält die <<serialcomms-signal-names,Signalnamen>> von RS-232C sowie die Pinbelegung für einen Stecker vom Typ DB-25. Obwohl der Standard eine direkte Verbindung von Pin 1 zu Pin 1 (_Protective Ground_) vorschreibt, ist diese in vielen Fällen nicht vorhanden. Einige Terminals benötigen nur die Pins 2, 3 und 7 für eine korrekte Funktion, während andere eine unterschiedliche Konfiguration als die in den folgenden Beispielen gezeigte benötigen.
+
+.Nullmodemkabel vom Typ DB-25-zu-DB-25
+[cols="1,1,1,1,1", frame="none", options="header"]
+|===
+<| Signal
+<| Pin #
+<|
+<| Pin #
+<| Signal
+
+|SG
+|7
+|verbunden mit
+|7
+|SG
+
+|TD
+|2
+|verbunden mit
+|3
+|RD
+
+|RD
+|3
+|verbunden mit
+|2
+|TD
+
+|RTS
+|4
+|verbunden mit
+|5
+|CTS
+
+|CTS
+|5
+|verbunden mit
+|4
+|RTS
+
+|DTR
+|20
+|verbunden mit
+|6
+|DSR
+
+|DTR
+|20
+|verbunden mit
+|8
+|DCD
+
+|DSR
+|6
+|verbunden mit
+|20
+|DTR
+
+|DCD
+|8
+|verbunden mit
+|20
+|DTR
+|===
+
+Die folgenden zwei Schemata werden heutzutage ebenfalls häufig eingesetzt:
+
+.Nullmodemkabel vom Typ DB-9-zu-DB-9
+[cols="1,1,1,1,1", frame="none", options="header"]
+|===
+<| Signal
+<| Pin #
+<|
+<| Pin #
+<| Signal
+
+|RD
+|2
+|verbunden mit
+|3
+|TD
+
+|TD
+|3
+|verbunden mit
+|2
+|RD
+
+|DTR
+|4
+|verbunden mit
+|6
+|DSR
+
+|DTR
+|4
+|verbunden mit
+|1
+|DCD
+
+|SG
+|5
+|verbunden mit
+|5
+|SG
+
+|DSR
+|6
+|verbunden mit
+|4
+|DTR
+
+|DCD
+|1
+|verbunden mit
+|4
+|DTR
+
+|RTS
+|7
+|verbunden mit
+|8
+|CTS
+
+|CTS
+|8
+|verbunden mit
+|7
+|RTS
+|===
+
+.Nullmodemkabel vom Typ DB-9-zu-DB-25
+[cols="1,1,1,1,1", frame="none", options="header"]
+|===
+<| Signal
+<| Pin #
+<|
+<| Pin #
+<| Signal
+
+|RD
+|2
+|verbunden mit
+|2
+|TD
+
+|TD
+|3
+|verbunden mit
+|3
+|RD
+
+|DTR
+|4
+|verbunden mit
+|6
+|DSR
+
+|DTR
+|4
+|verbunden mit
+|8
+|DCD
+
+|SG
+|5
+|verbunden mit
+|7
+|SG
+
+|DSR
+|6
+|verbunden mit
+|20
+|DTR
+
+|DCD
+|1
+|verbunden mit
+|20
+|DTR
+
+|RTS
+|7
+|verbunden mit
+|5
+|CTS
+
+|CTS
+|8
+|verbunden mit
+|4
+|RTS
+|===
+
+[NOTE]
+====
+Wird ein Pin eines Kabels mit zwei Pins des anderen Kabels verbunden, werden dazu in der Regel zuerst die beiden Pins mit einem kurzem Draht verbunden. Danach wird dieser Draht mit dem Pin des anderen Endes verbunden.
+====
+
+Die eben besprochenen Schemata scheinen die beliebtesten zu sein. Weitere Varianten verbinden SG mit SG, TD mit RD, RTS und CTS mit DCD, DTR mit DSR, und umgekehrt.
+
+Ein Standard-RS-232C-Kabel verbindet alle Signale direkt. Das Signal "Transmitted Data" wird mit dem Signal "Transmitted Data" der Gegenstelle verbunden. Dieses Kabel wird benötigt, um ein Modem mit einem FreeBSD-System zu verbinden. Manche Terminals benötigen dieses Kabel ebenfalls.
+
+Über serielle Schnittstellen werden Daten zwischen dem FreeBSD-System und dem Terminal übertragen. Dieser Abschnitt beschreibt die verschiedenen Schnittstellen und wie sie unter FreeBSD angesprochen werden.
+
+Da es verschiedene Schnittstellen gibt, sollte vor dem Kauf oder Selbstbau eines Kabels sichergestellt werden, dass dieses zu den Schnittstellen des Terminals und des FreeBSD-Systems passt.
+
+Die meisten Terminals besitzen DB-25-Stecker. Personal Computer haben DB-25- oder DB-9-Stecker. Eine serielle Multiportkarte hat vielleicht RJ-12- oder RJ-45-Anschlüsse.
+
+Die Dokumentation der Geräte sollte Aufschluss über den Typ der benötigten Anschlüsse geben. Oft hilft es, wenn Sie sich den Anschluss einfach ansehen.
+
+Unter FreeBSD wird jede serielle Schnittstelle (Port) über einen Eintrag in [.filename]#/dev# angesprochen. Es gibt dort zwei verschiedene Einträge:
+
+* Schnittstellen für eingehende Verbindungen werden [.filename]#/dev/ttyuN# genannt. Dabei ist _N_ die Nummer der Schnittstelle, deren Zählung bei Null beginnt. Allgemein wird diese Schnittstelle für Terminals benutzt. Diese Schnittstelle funktioniert nur, wenn ein "Data Carrier Detect" Signal (DCD) vorliegt.
+* Für ausgehende Verbindungen wird in FreeBSD 8.X und neueren Versionen [.filename]#/dev/cuauN# verwendet. FreeBSD 7.X und ältere Versionen verwenden [.filename]#/dev/cuadN#. Dieser Port wird normalerweise nur von Modems genutzt. Er kann allerdings auch für Terminals benutzt werden, die das "Data Carrier Detect" Signal nicht unterstützen.
+
+Wenn ein Terminal an die erste serielle Schnittstelle ([.filename]#COM1#) angeschlossen ist, wird er über [.filename]#/dev/ttyu0# angesprochen. Wenn er an der zweiten seriellen Schnittstelle (COM2) angeschlossen ist, verwenden Sie [.filename]#/dev/ttyu1#, usw.
+
+=== Kernelkonfiguration
+
+In der Voreinstellung benutzt FreeBSD vier serielle Schnittstellen, die unter MS-DOS(R) als [.filename]#COM1#, [.filename]#COM2#, [.filename]#COM3# und [.filename]#COM4# bekannt sind. Momentan unterstützt FreeBSD einfache Multiportkarten, wie bspw. die BocaBoard 1008 und 2016 und bessere wie die von Digiboard und Stallion Technologies. In der Voreinstellung sucht der Kernel allerdings nur nach den Standardanschlüssen.
+
+Um zu überprüfen, ob der Kernel die seriellen Schnittstellen erkennt, achten Sie auf die Meldungen beim Booten, oder schauen sich diese später mit `/sbin/dmesg` an. Achten Sie auf Meldungen die mit `uart` beginnen:
+
+[source,bash]
+....
+# /sbin/dmesg | grep 'uart'
+....
+
+Wenn der Kernel nicht alle seriellen Schnittstellen erkennt, müssen Sie [.filename]#/boot/device.hints# konfigurieren. Wenn Sie diese Datei editieren, können Sie die Einträge für Geräte, die auf dem System nicht vorhanden sind, auskommentieren oder komplett entfernen.
+
+[NOTE]
+====
+`port IO_COM1` ist ein Ersatz für `port 0x3f8`, `IO_COM2` bedeutet `port 0x2f8`, `IO_COM3` bedeutet `port 0x3e8` und `IO_COM4` steht für `port 0x2e8`. Die angegebenen IO-Adressen sind genau wie die Interrupts 4, 3, 5 und 9 üblich für serielle Schnittstellen. Beachten Sie, dass sich normale serielle Schnittstellen auf ISA-Bussen _keine_ Interrupts teilen können. Multiportkarten besitzen zusätzliche Schaltkreise, die es allen 16550As auf der Karte erlauben, sich einen oder zwei Interrupts zu teilen.
+====
+
+=== Gerätedateien
+
+Die meisten Geräte im Kernel werden durch Gerätedateien in [.filename]#/dev# angesprochen. Die [.filename]#sio# Geräte werden durch [.filename]#/dev/ttyuN# für eingehende Verbindungen und durch [.filename]#/dev/cuauN# für ausgehende Verbindungen angesprochen. Zum Initialisieren der Geräte stellt FreeBSD die Dateien [.filename]#/dev/ttyuN.init# und [.filename]#/dev/cuauN.init# zur Verfügung. Zusätzlich existieren Dateien für das Sperren von Gerätedateien (Locking). Dabei handelt es sich um die Dateien [.filename]#/dev/ttyuN.lock# und [.filename]#/dev/cuauN.lock#. Diese Dateien werden benutzt, um Kommunikationsparameter beim Öffnen eines Ports vorzugeben. Für Modems, die zur Flusskontrolle `RTS/CTS` benutzen, kann damit `crtscts` gesetzt werden. Die Geräte [.filename]#/dev/ttyldN# und [.filename]#/dev/cualaN# (locking devices) werden genutzt, um bestimmte Parameter festzuschreiben und vor Veränderungen zu schützen. Weitere Informationen zu Terminals finden Sie in man:termios[4], man:sio[4] erklärt die Dateien zum Initialisieren und Sperren der Geräte, man:stty[1] beschreibt schließlich Terminal-Einstellungen.
+
+[[serial-hw-config]]
+=== Konfiguration der seriellen Schnittstelle
+
+Anwendungen benutzen normalerweise die Geräte [.filename]#ttyuN# oder [.filename]#cuauN#. Das Gerät besitzt einige Voreinstellungen für Terminal-I/O, wenn es von einem Prozess geöffnet wird. Mit dem folgenden Kommando können Sie sich diese Einstellungen ansehen:
+
+[source,bash]
+....
+# stty -a -f /dev/ttyu1
+....
+
+Wenn diese Einstellungen verändert werden, bleiben sie nur solange wirksam, bis das Gerät geschlossen wird. Wenn das Gerät danach wieder geöffnet wird, sind die Voreinstellungen wieder wirksam. Um die Voreinstellungen dauerhaft zu ändern, öffnen Sie das Gerät, das zum Initialisieren dient und verändern dessen Einstellungen. Um beispielsweise für [.filename]#ttyu5# den `CLOCAL` Modus, 8-Bit Kommunikation und `XON/XOFF` Flusssteuerung einzuschalten, setzen Sie das folgende Kommando ab:
+
+[source,bash]
+....
+# stty -f /dev/ttyu5.init clocal cs8 ixon ixoff
+....
+
+In [.filename]#/etc/rc.d/rc.serial# werden die systemweiten Voreinstellungen für serielle Geräte vorgenommen.
+
+Um zu verhindern, dass Einstellungen von Anwendungen verändert werden, können Sie die Geräte zum Festschreiben von Einstellungen ("locking devices") benutzen. Wenn sie beispielsweise die Geschwindigkeit von [.filename]#ttyu5# auf 57600 bps festlegen wollen, benutzen Sie das folgende Kommando:
+
+[source,bash]
+....
+# stty -f /dev/ttyld5 57600
+....
+
+Eine Anwendung, die [.filename]#ttyu5# öffnet, kann nun nicht mehr die Geschwindigkeit ändern und muss 57600 bps benutzen.
+
+Die Geräte zum Initialisieren und Festschreiben von Einstellungen sollten selbstverständlich nur von `root` beschreibbar sein.
+
+[[term]]
+== Terminals
+
+Wenn Sie sich nicht an der Konsole oder über ein Netzwerk an ein FreeBSD-System anmelden können, sind Terminals ein bequemer und kostengünstiger Weg, um auf ein System zuzugreifen. Dieser Abschnitt beschreibt wie Sie Terminals mit FreeBSD benutzen.
+
+Das ursprüngliche UNIX(R) System besaß keine Konsolen. Zum Anmelden und Starten von Programmen wurden stattdessen Terminals benutzt, die an den seriellen Schnittstellen des Rechners angeschlossen waren.
+
+Die Möglichkeit, über eine serielle Schnittstelle eine Anmeldesitzung herzustellen, existiert heute noch in fast jedem UNIX(R)-artigen Betriebssystem, einschließlich FreeBSD. Der Einsatz eines Terminals, das an einem freien seriellen Port angeschlossen ist, ermöglicht es dem Benutzer sich anzumelden und dort jedes Textprogramm zu starten, das normalerweise an der Konsole oder in einem `xterm` Fenster ausgeführt wird.
+
+Viele Terminals können an einem FreeBSD-System angeschlossen werden. Ein alter Computer kann als Terminal an ein leistungsfähiges FreeBSD-System angeschlossen werden. Damit kann ein Einzelarbeitsplatz in ein leistungsfähiges Mehrbenutzersystem verwandelt werden.
+
+FreeBSD unterstützt drei Arten von Anschlüssen:
+
+Dumb-Terminals::
+Dumb-Terminals (unintelligente Datenstationen) sind Geräte, die über die serielle Schnittstelle mit einem Rechner verbunden werden. Sie werden "unintelligent" genannt, weil sie nur Text senden und empfangen und keine Programme laufen lassen können. Alle benötigten Programme befinden sich auf dem Rechner, der mit dem Terminal verbunden ist.
++
+Es gibt viele Dumb-Terminals, die von verschiedenen Herstellern produziert werden, und so gut wie jeder der verschiedenen Terminals sollte mit FreeBSD zusammenarbeiten. Manche High-End Geräte verfügen sogar über Grafikfähigkeiten, die allerdings nur von spezieller Software genutzt werden kann.
++
+Dumb-Terminals sind in Umgebungen beliebt, in denen keine Grafikanwendungen benötigt werden.
+
+Computer, die als Terminal fungieren::
+Jeder Computer kann die Funktion eines Dumb-Terminals, der ja nur Text senden und empfangen kann, übernehmen. Dazu wird lediglich das richtige Kabel benötigt und eine _Terminalemulation_, die auf dem Computer läuft.
++
+Diese Konfiguration ist sehr nützlich. Wenn ein Benutzer zum Beispiel gerade an der FreeBSD-Konsole arbeitet, kann ein anderer Benutzer einen weniger leistungsstarken Computer, der als Terminal mit dem FreeBSD-System verbunden ist, benutzen, um dort gleichzeitig im Textmodus zu arbeiten.
++
+Bereits im Basissystem sind mindestens zwei Werkzeuge vorhanden, die Sie zur Arbeit über eine serielle Konsole einsetzen können: man:cu[1] sowie man:tip[1].
++
+Um sich von einem FreeBSD-System aus über eine serielle Verbindung mit einem anderen System zu verbinden, geben Sie folgenden Befehl ein:
++
+
+[source,bash]
+....
+# cu -l /dev/cuauN
+....
+
++
+Die Ports sind von Null beginnend nummeriert. Das bedeutet, dass [.filename]#COM1# dem Gerät [.filename]#/dev/cuau0# entspricht.
++
+In der Ports-Sammlung finden sich weitere Programme, wie beispielsweise package:comms/minicom[], mit denen eine Verbindung über eine serielle Schnittstelle hergestellt werden kann.
+
+X-Terminals::
+X-Terminals sind die ausgereiftesten der verfügbaren Terminals. Sie werden nicht mit der seriellen Schnittstelle sondern mit einem Netzwerk, wie dem Ethernet, verbunden. Diese Terminals sind auch nicht auf den Textmodus beschränkt, sondern können jede Xorg-Anwendung darstellen.
++
+Die Einrichtung und Verwendung von X-Terminals wird in diesem Abschnitt nicht beschrieben.
+
+[[term-config]]
+=== Konfiguration
+
+Dieser Abschnitt beschreibt, wie Sie ein FreeBSD-System konfigurieren müssen, um sich an einem Terminal anzumelden. Dabei wird vorausgesetzt, dass der Kernel bereits die serielle Schnittstelle, die mit dem Terminal verbunden ist, unterstützt. Weiterhin sollte der Terminal schon angeschlossen sein.
+
+Der `init` Prozess ist für das Initialisieren des Systems und den Start von Prozessen zum Zeitpunkt des Systemstarts verantwortlich. Unter anderem liest `init`[.filename]#/etc/ttys# ein und startet für jeden verfügbaren Terminal einen `getty` Prozess. `getty` wiederum fragt beim Anmelden den Benutzernamen ab und startet `login`.
+
+Um Terminals auf einem FreeBSD-System einzurichten, führen Sie folgenden Schritte als `root` durch:
+
+[.procedure]
+. Fügen Sie einen Eintrag in [.filename]#/etc/ttys# für die serielle Schnittstelle aus [.filename]#/dev# ein, falls dieser nicht bereits vorhanden ist.
+. Geben Sie `/usr/libexec/getty` als auszuführendes Programm an. Als Parameter für _getty_ geben Sie den passenden Verbindungstyp aus [.filename]#/etc/gettytab# an.
+. Geben Sie den Terminaltyp an.
+. Aktivieren Sie den Anschluss.
+. Geben Sie die Sicherheit des Anschlusses an.
+. Veranlassen Sie `init`[.filename]#/etc/ttys# erneut zu lesen.
+
+Optional können Sie in [.filename]#/etc/gettytab# auch einen auf Ihre Zwecke angepassten Terminaltyp erstellen. man:gettytab[5] und man:getty[8] enthalten dazu weitere Informationen.
+
+[[term-etcttys]]
+==== Hinzufügen eines Eintrags in [.filename]#/etc/ttys#
+
+In [.filename]#/etc/ttys# werden alle Terminals aufgeführt, an denen eine Anmeldung auf dem FreeBSD-System möglich ist. Hier findet sich zum Beispiel ein Eintrag für die erste virtuelle Konsole [.filename]#/dev/ttyv0#, der es Benutzern ermöglicht, sich dort anzumelden. Die Datei enthält weitere Einträge für andere virtuelle Konsolen, serielle Schnittstellen und Pseudoterminals. Um einen Terminal zu konfigurieren, fügen Sie einen Eintrag für den Namen des Gerätes aus [.filename]#/dev# ohne das Präfix [.filename]#/dev# hinzu. Zum Beispiel wird [.filename]#/dev/ttyv0# als `ttyv0` aufgeführt.
+
+In der Voreinstellung enthält [.filename]#/etc/ttys# Einträge für die ersten vier seriellen Schnittstellen: [.filename]#ttyu0# bis [.filename]#ttyu3#. Wird an eine von diesen Schnittstellen ein Terminal angeschlossen, braucht in dieser Datei kein weiter Eintrag hinzugefügt werden.
+
+[[ex-etc-ttys]]
+.Einträge in [.filename]#/etc/ttys# hinzufügen
+[example]
+====
+Dieses Beispiel konfiguriert zwei Terminals: Einen Wyse-50 und einen alten 286 IBM PC, der mit Procomm einen VT-100 Terminal emuliert. Der Wyse-Terminal ist mit der zweiten seriellen Schnittstelle verbunden und der 286 mit der sechsten seriellen Schnittstelle, einem Anschluss auf einer Multiportkarte. Die entsprechenden Einträge in [.filename]#/etc/ttys# würden dann wie folgt aussehen:
+
+[.programlisting]
+....
+ttyu1 "/usr/libexec/getty std.38400" wy50 on insecure
+ttyu5 "/usr/libexec/getty std.19200" vt100 on insecure
+....
+
+Das erste Feld gibt normalerweise den Namen der Gerätedatei aus [.filename]#/dev# an.
+
+Im zweiten Feld wird das auszuführende Kommando, normal ist das man:getty[8], angegeben. `getty` initialisiert und öffnet die Verbindung, setzt die Geschwindigkeit und fragt den Benutzernamen ab. Danach führt es man:login[1] aus.
+
+`getty` akzeptiert einen optionalen Parameter auf der Kommandozeile, den Verbindungstyp, der die Eigenschaften der Verbindung, wie die Geschwindigkeit und Parität, festlegt. Die Typen und die damit verbundenen Eigenschaften liest `getty` aus [.filename]#/etc/gettytab#.
+
+[.filename]#/etc/gettytab# enthält viele Einträge sowohl für neue wie auch alte Terminalverbindungen. Die meisten Einträge, die mit `std` beginnen, sollten mit einem festverdrahteten Terminal funktionieren. Für jede Geschwindigkeit zwischen 110 bps und 115200 bps gibt es einen `std` Eintrag. Weitere Informationen dazu finden Sie in man:gettytab[5].
+
+Wenn Sie den Verbindungstyp in [.filename]#/etc/ttys# eintragen, stellen Sie sicher, dass die Kommunikationseinstellungen auch mit denen des Terminals übereinstimmen.
+
+In diesem Beispiel verwendet der Wyse-50 keine Parität und 38400 bps, der 286 PC benutzt ebenfalls keine Parität und arbeitet mit 19200 bps.
+
+Das dritte Feld gibt den Terminaltyp an, der normalerweise mit diesem Anschluss verbunden ist. Für Einwählverbindungen wird oft `unknown` oder `dialup` benutzt, da sich die Benutzer praktisch mit beliebigen Terminals oder Emulatoren anmelden können. Bei festverdrahteten Terminals ändert sich der Typ nicht, so dass in diesem Feld ein richtiger Typ aus der man:termcap[5] Datenbank angegeben werden kann.In diesem Beispiel benutzt der Wyse-50 den entsprechenden Typ aus man:termcap[5], der 286 PC wird als VT-100, den er ja emuliert, angegeben.
+
+Das vierte Feld gibt an, ob der Anschluss aktiviert werden soll. Ist das Feld auf `on` gesetzt, startet `init` das Programm, das im zweiten Feld angegeben ist. Normalerweise ist dies `getty`. Wenn das Feld auf `off` gesetzt wird, wird `getty` nicht ausgeführt und folglich kann sich niemand an dem betreffenden Terminal anmelden.
+
+Das letzte Feld gibt die Sicherheit des Anschlusses an. Wenn hier `secure` angegeben wird, darf sich `root`, oder jeder Account mit der UID `0` über diese Verbindung anmelden. Wenn `insecure` angegeben wird, dürfen sich nur unprivilegierte Benutzer anmelden. Diese können später mit man:su[1] oder einem ähnlichen Mechanismus zu `root` wechseln.Es wird dringend empfohlen `insecure` zu verwenden, sogar für Terminals hinter verschlossenen Türen. Es ist ganz einfach sich mit `su` anzumelden, wenn Superuser-Rechte benötigt werden.
+====
+
+[[term-hup]]
+==== `init` zwingen, [.filename]#/etc/ttys# erneut zu lesen
+
+Nachdem Änderungen in [.filename]#/etc/ttys# vorgenommen wurden, schicken Sie `init` ein SIGHUP-Signal (hangup), um es zu veranlassen, seine Konfigurationsdatei neu zu lesen:
+
+[source,bash]
+....
+# kill -HUP 1
+....
+
+[NOTE]
+====
+Da `init` immer der erste Prozess auf einem System ist, besitzt es immer die Prozess-ID `1`.
+====
+
+Wenn alles richtig eingerichtet ist, alle Kabel angeschlossen und die Terminals eingeschaltet sind, sollte für jeden Terminal ein `getty` Prozess laufen und auf jedem Terminal sollte eine Anmeldeaufforderung zu sehen sein.
+
+[[term-debug]]
+=== Fehlersuche
+
+Selbst wenn Sie den Anweisungen akribisch gefolgt sind, kann es immer noch zu Fehlern beim Einrichten eines Terminals kommen. Hier eine Liste der häufigsten Symptome, sowie einige mögliche Lösungen:
+
+Wenn kein Anmeldeprompt erscheint, stellen Sie sicher, dass der Terminal verbunden und eingeschaltet ist. Wenn ein PC als Terminal fungiert, überprüfen Sie, dass die Terminalemulation auf den richtigen Schnittstellen läuft.
+
+Stellen Sie sicher, dass Sie das richtige Kabel verwenden und dass das Kabel fest mit dem Terminal und dem FreeBSD-Rechner verbunden ist.
+
+Stellen Sie sicher, dass die Einstellungen für die Geschwindigkeit (bps) und Parität auf dem FreeBSD-System und dem Terminal gleich sind. Wenn der Terminal einen Bildschirm besitzt, überprüfen Sie die richtige Einstellung von Helligkeit und Kontrast. Wenn der Terminal druckt, stellen Sie die ausreichende Versorgung mit Papier und Tinte sicher.
+
+Überprüfen Sie mit `ps`, dass der `getty` Prozess für den Terminal läuft:
+
+[source,bash]
+....
+# ps -axww|grep getty
+....
+
+Für jeden Terminal sollte ein Eintrag vorhanden sein. Aus dem folgenden Beispiel ist zu erkennen, dass `getty` auf der zweiten seriellen Schnittstelle [.filename]#tyyd1# läuft und den Verbindungstyp `std.38400` aus [.filename]#/etc/gettytab# benutzt:
+
+[source,bash]
+....
+22189 d1 Is+ 0:00.03 /usr/libexec/getty std.38400 ttyu1
+....
+
+Wenn `getty` nicht läuft, überprüfen Sie, ob der Anschluss in [.filename]#/etc/ttys# aktiviert ist. Denken Sie daran `kill -HUP 1` auszuführen, nachdem [.filename]#/etc/ttys# geändert wurde.
+
+Wenn `getty` läuft, aber der Terminal immer noch kein Anmeldeprompt ausgibt, oder am Anmeldeprompt nichts eingegeben werden kann, kann es sein, dass der Terminal oder Kabel keinen Hardware-Handshake unterstützt. Ändern Sie dann den Eintrag `std.38400` in [.filename]#/etc/ttys# zu `3wire.38400`. Nachdem Sie [.filename]#/etc/ttys# geändert haben, setzen Sie `kill -HUP 1` ab. Der Eintrag `3wire` besitzt ähnliche Eigenschaften wie der Eintrag `std`, ignoriert aber den Hardware-Handshake. Wenn Sie den Eintrag `3wire` verwenden, muss vielleicht die Geschwindigkeit verkleinert oder die Software-Flusssteuerung aktiviert werden, um Pufferüberläufe zu vermeiden.
+
+Wenn nur unverständliche Zeichen erscheinen, stellen Sie sicher, dass die Einstellungen für die Geschwindigkeit (bps) und Parität auf dem FreeBSD-System und dem Terminal gleich sind. Kontrollieren Sie den `getty` Prozess und stellen Sie sicher, dass der richtige Verbindungstyp aus [.filename]#/etc/gettytab# benutzt wird. Wenn das nicht der Fall ist, editieren Sie [.filename]#/etc/ttys# und setzen das Kommando `kill-HUP 1` ab.
+
+Wenn Zeichen doppelt und eingegebene Passwörter im Klartext erscheinen, stellen Sie den Terminal oder die Terminalemulation von "half duplex" oder "local echo" auf "full duplex" um.
+
+[[dialup]]
+== Einwählverbindungen
+
+Das Einrichten von Einwählverbindungen auf FreeBSD-Systemen ähnelt dem Anschließen von Terminals, nur dass anstelle eines Terminals ein Modem verwendet wird. FreeBSD unterstützt sowohl externe als auch interne Modems.
+
+Externe Modems sind für Einwählverbindungen besser geeignet, da sie die Konfiguration in nicht flüchtigem RAM speichern können. Zudem verfügen Sie über Leuchtanzeigen, die den Status wichtiger RS-232 Signale anzeigen.
+
+Interne Modems verfügen normalerweise nicht über nicht flüchtiges RAM und lassen sich meist nur über DIP-Schalter konfigurieren. Selbst wenn ein internes Modem Leuchtanzeigen besitzt, sind diese meist schwer einzusehen, wenn das Modem eingebaut ist.
+
+Mit einem externen Modem muss das passende Kabel verwendet werden. Ein Standard RS-232C Kabel, bei dem die folgenden Signale miteinander verbunden sind, sollte ausreichen:
+[[serialcomms-signal-names]]
+.Signalnamen
+[cols="1,1", frame="none", options="header"]
+|===
+<| Abkürzung
+<| Bedeutung
+
+|RD
+|Received Data
+
+|TD
+|Transmitted Data
+
+|DTR
+|Data Terminal Ready
+
+|DSR
+|Data Set Ready
+
+|DCD
+|Data Carrier Detect (dadurch erkennt RS-232 das Signal _Received Line_)
+
+|SG
+|Signal Ground
+
+|RTS
+|Request to Send
+
+|CTS
+|Clear to Send
+|===
+
+Ab Geschwindigkeiten von 2400 bps benötigt FreeBSD die Signale RTS und CTS für die Flusssteuerung. Das Signal CD zeigt an, ob ein Träger vorliegt, das heißt ob die Verbindung aufgebaut ist oder beendet wurde. DTR zeigt an, dass das Gerät betriebsbereit ist. Es gibt einige Kabel, bei denen nicht alle nötigen Signale verbunden sind. Wenn Probleme dieser Art auftreten, dass zum Beispiel die Sitzung nicht beendet wird, obwohl die Verbindung beendet wurde, kann das an einem solchen Kabel liegen.
+
+Wie andere UNIX(R) Betriebssysteme auch, benutzt FreeBSD Hardwaresignale, um festzustellen, ob ein Anruf beantwortet wurde, eine Verbindung beendet wurde, oder um die Verbindung zu schließen und das Modem zurückzusetzen. FreeBSD vermeidet es, dem Modem Kommandos zu senden, oder den Statusreport des Modems abzufragen.
+
+=== Schnittstellenbausteine
+
+FreeBSD unterstützt EIA RS-232C (CCITT V.24) serielle Schnittstellen, die auf den NS8250, NS16450, NS16550 oder NS16550A Bausteinen basieren. Die Bausteine der Serie 16550 verfügen über einen 16 Byte großen Puffer, der als FIFO angelegt ist. Wegen Fehler in der FIFO-Logik kann der Puffer in einem 16550 Baustein allerdings nicht genutzt werden, das heißt der Baustein muss als 16450 betrieben werden. Bei allen Bausteinen ohne Puffer und dem 16550 Baustein muss jedes Byte einzeln von dem Betriebssystem verarbeitet werden, was Fehler bei hohen Geschwindigkeiten oder großer Systemlast erzeugt. Es sollten daher nach Möglichkeit serielle Schnittstellen, die auf 16550A Bausteinen basieren, eingesetzt werden.
+
+=== Überblick
+
+Wie bei Terminals auch, startet `init` für jede serielle Schnittstelle, die eine Einwählverbindung zur Verfügung stellt, einen `getty` Prozess. Wenn das Modem beispielsweise an [.filename]#/dev/ttyu0# angeschlossen ist, sollte in der Ausgabe von `ps ax` eine Zeile wie die folgende erscheinen:
+
+[source,bash]
+....
+4850 ?? I 0:00.09 /usr/libexec/getty V19200 ttyu0
+....
+
+Wenn sich ein Benutzer einwählt und die Verbindung aufgebaut ist, zeigt das Modem dies durch das CD Signal (Carrier Detect) an. Der Kernel merkt, dass ein Signal anliegt und weist `getty` an, die Schnittstelle zu öffnen. Dann sendet `getty` das Anmeldeprompt mit der ersten für die Verbindung vereinbarten Geschwindigkeit und wartet auf eine Antwort. Wenn die Antwort unverständlich ist, weil zum Beispiel die Geschwindigkeit des Modems von ``getty``s Geschwindigkeit abweicht, versucht `getty` die Geschwindigkeit solange anzupassen, bis es eine verständliche Antwort erhält.
+
+Nachdem der Benutzer seinen Benutzernamen eingegeben hat, führt `getty`[.filename]#/usr/bin/login# aus, welches das Passwort abfragt und danach die Shell des Benutzers startet.
+
+=== Konfigurationsdateien
+
+Drei Konfigurationsdateien in [.filename]#/etc# steuern, ob eine Einwahl in das FreeBSD-System möglich ist. [.filename]#/etc/gettytab#, konfiguriert den [.filename]#/usr/libexec/getty# Dæmon. In [.filename]#/etc/ttys# wird festgelegt, auf welchen Schnittstellen [.filename]#/sbin/init# einen `getty` Prozess startet. Schließlich bietet [.filename]#/etc/rc.d/serial# die Möglichkeit, Schnittstellen zu initialisieren.
+
+Es gibt zwei Ansichten darüber, wie Modems für Einwählverbindungen unter UNIX(R) zu konfigurieren sind. Zum einen kann die Geschwindigkeit zwischen dem Modem und dem Computer fest eingestellt werden. Sie ist damit unabhängig von der Geschwindigkeit, mit der sich der entfernte Benutzer einwählt. Dies hat den Vorteil, dass der entfernte Benutzer das Anmeldeprompt sofort bekommt. Der Nachteil bei diesem Verfahren ist, dass das System die tatsächliche Geschwindigkeit der Verbindung nicht kennt. Damit können bildschirmorientierte Programme wie Emacs ihren Bildschirmaufbau nicht an langsame Verbindungen anpassen, um die Antwortzeiten zu verbessern.
+
+Die andere Möglichkeit besteht darin, die Geschwindigkeit der RS-232 Schnittstelle des lokalen Modems an die Geschwindigkeit des entfernten Modems anzupassen. Bei einer V.32bis (14400 bps) Verbindung kann das lokale Modem die RS-232 Schnittstelle mit 19200 bps betreiben, während bei einer Verbindung mit 2400 bps die RS-232 Schnittstelle mit 2400 bps betrieben wird. Da `getty` die Verbindungsgeschwindigkeit des Modems nicht kennt, startet es den Anmeldevorgang mit der Ausgabe von `login:` und wartet auf eine Antwort. Wenn der Benutzer der Gegenstelle nun nur unverständliche Zeichen erhält, muss er solange kbd:[Enter] drücken, bis das Anmeldeprompt erscheint. Solange die Geschwindigkeiten nicht übereinstimmen, sind die Antworten der Gegenstelle für `getty` ebenfalls unverständlich. In diesem Fall wechselt `getty` zur nächsten Geschwindigkeit und gibt wieder `login:` aus. In aller Regel erhält der Benutzer der Gegenstelle nach ein bis zwei Tastendrücken eine erkennbare Anmeldeaufforderung. Diese Anmeldeprozedur sieht nicht so sauber wie die Methode mit einer festen Geschwindigkeit aus, bietet dem Benutzer einer langsamen Verbindung allerdings den Vorteil, dass sich bildschirmorientierte Programme an die Geschwindigkeit anpassen können.
+
+Im Folgenden wird die Konfiguration für beide Methoden besprochen, doch die Methode der angepassten Geschwindigkeit wird bei der Diskussion bevorzugt.
+
+==== [.filename]#/etc/gettytab#
+
+Mit [.filename]#/etc/gettytab# wird man:getty[8] im Stil von man:termcap[5] konfiguriert. Das Format dieser Datei und die Bedeutung der Einträge wird in man:gettytab[5] beschrieben.
+
+Wenn die Modemgeschwindigkeit vorgeben wird, sollten Anpassungen in [.filename]#/etc/gettytab# nicht erforderlich sein.
+
+Wenn jedoch die Geschwindigkeit angepasst werden soll, erstellen Sie einen Eintrag in [.filename]#/etc/gettytab#, um `getty` die Geschwindigkeit für das Modem mitzuteilen. Für ein 2400 bps Modem kann der vorhandene `D2400` Eintrag benutzt werden.
+
+[.programlisting]
+....
+#
+# Fast dialup terminals, 2400/1200/300 rotary (can start either way)
+#
+D2400|d2400|Fast-Dial-2400:\
+ :nx=D1200:tc=2400-baud:
+3|D1200|Fast-Dial-1200:\
+ :nx=D300:tc=1200-baud:
+5|D300|Fast-Dial-300:\
+ :nx=D2400:tc=300-baud:
+....
+
+Wird ein Modem mit einer höheren Geschwindigkeit eingesetzt, müssen weitere Einträge in [.filename]#/etc/gettytab# erstellt werden. Dieses Beispiel zeigt einen Eintrag für ein 14400 bps Modem mit einer Geschwindigkeit bis zu 19200 bps:
+
+[.programlisting]
+....
+#
+# Additions for a V.32bis Modem
+#
+um|V300|High Speed Modem at 300,8-bit:\
+ :nx=V19200:tc=std.300:
+un|V1200|High Speed Modem at 1200,8-bit:\
+ :nx=V300:tc=std.1200:
+uo|V2400|High Speed Modem at 2400,8-bit:\
+ :nx=V1200:tc=std.2400:
+up|V9600|High Speed Modem at 9600,8-bit:\
+ :nx=V2400:tc=std.9600:
+uq|V19200|High Speed Modem at 19200,8-bit:\
+ :nx=V9600:tc=std.19200:
+....
+
+Die damit erzeugten Verbindungen verwenden 8 Bit und keine Parität.
+
+Im obigen Beispiel startet die Geschwindigkeit bei 19200 bps (eine V.32bis Verbindung) und geht dann über 9600 bps (V.32), 400 bps, 1200 bps und 300 bps wieder zurück zu 19200 bps. Das Schlüsselwort `nx=` (next table) sorgt für das zyklische Durchlaufen der Geschwindigkeiten. Jede Zeile zieht zudem noch mit `tc=` (table continuation) die Vorgabewerte für die jeweilige Geschwindigkeit an.
+
+Wenn Sie ein 28800 bps Modem besitzen und/oder Kompression mit einem 14400 bps Modem benutzen wollen, brauchen Sie höhere Geschwindigkeiten als 19200 bps. Das folgende Beispiel startet mit 57600 bps:
+
+[.programlisting]
+....
+#
+# Additions for a V.32bis or V.34 Modem
+# Starting at 57600 bps
+#
+vm|VH300|Very High Speed Modem at 300,8-bit:\
+ :nx=VH57600:tc=std.300:
+vn|VH1200|Very High Speed Modem at 1200,8-bit:\
+ :nx=VH300:tc=std.1200:
+vo|VH2400|Very High Speed Modem at 2400,8-bit:\
+ :nx=VH1200:tc=std.2400:
+vp|VH9600|Very High Speed Modem at 9600,8-bit:\
+ :nx=VH2400:tc=std.9600:
+vq|VH57600|Very High Speed Modem at 57600,8-bit:\
+ :nx=VH9600:tc=std.57600:
+....
+
+Wenn Sie eine langsame CPU oder ein stark ausgelastetes System besitzen und sich kein 16550A im System befindet, erhalten Sie bei 57600 bps vielleicht `sio` Fehlermeldungen der Form "silo overflow".
+
+[[dialup-ttys]]
+==== [.filename]#/etc/ttys#
+
+[.filename]#/etc/ttys# wurde bereits in <<ex-etc-ttys>> besprochen. Die Konfiguration für Modems ist ähnlich, allerdings braucht `getty` ein anderes Argument und es muss ein anderer Terminaltyp angegeben werden. Der Eintrag für beide Methoden (feste und angepasste Geschwindigkeit) hat die folgende Form:
+
+[.programlisting]
+....
+ttyu0 "/usr/libexec/getty xxx" dialup on
+....
+
+Das erste Feld der obigen Zeile gibt die Gerätedatei für diesen Eintrag an. [.filename]#ttyu0# bedeutet, dass `getty` mit [.filename]#/dev/ttyu0# arbeitet. Das zweite Feld `"/usr/libexec/getty xxx"` gibt das Kommando an, das `init` für dieses Gerät startet (_xxx_ wird durch einen passenden Eintrag aus [.filename]#/etc/gettytab# ersetzt). Die Vorgabe für den Terminaltyp, hier `dialup`, wird im dritten Feld angegeben. Das vierte Feld, `on`, zeigt `init` an, dass die Schnittstelle aktiviert ist. Im fünften Feld könnte noch `secure` angegeben werden, um Anmeldungen von `root` zu erlauben, doch sollte das wirklich nur für physikalisch sichere Terminals, wie die Systemkonsole, aktiviert werden.
+
+Die Vorgabe für den Terminaltyp, `dialup` im obigen Beispiel, hängt von lokalen Gegebenheiten ab. Traditionell wird `dialup` für Einwählverbindungen verwendet, so dass die Benutzer in ihren Anmeldeskripten den Terminaltyp auf ihren Terminal abstimmen können, wenn der Typ auf `dialup` gesetzt ist. Wenn Sie nur VT102 Terminals oder Emulatoren einsetzen, können Sie den Terminaltyp hier auch fest auf `vt102` setzen.
+
+Nachdem [.filename]#/etc/ttys# geändert wurde, muss `init` ein HUP Signal schicken, damit es die Datei wieder einliest:
+
+[source,bash]
+....
+# kill -HUP 1
+....
+
+Stellen Sie sicher, dass das Modem richtig konfiguriert und angeschlossen ist, bevor Sie das Signal an `init` schicken.
+
+Das Argument von `getty` muss in diesem Fall eine feste Geschwindigkeit vorgeben. Der Eintrag für ein Modem, das fest auf 19200 bps eingestellt ist, könnte wie folgt aussehen:
+
+[.programlisting]
+....
+ttyu0 "/usr/libexec/getty std.19200" dialup on
+....
+
+Wenn das Modem auf eine andere Geschwindigkeit eingestellt ist, setzen Sie anstelle von `std.19200` einen passenden Eintrag der Form `std._speed_` ein. Stellen Sie sicher, dass dies auch ein gültiger Verbindungstyp aus [.filename]#/etc/gettytab# ist.
+
+Das Argument von `getty` muss hier auf einen der Einträge aus [.filename]#/etc/gettytab# zeigen, der zu einer Kette von Einträgen gehört, die die zu probierenden Geschwindigkeiten beschreiben. Wenn Sie dem obigen Beispiel gefolgt sind und zusätzliche Einträge in [.filename]#/etc/gettytab# erzeugt haben, können Sie die folgende Zeile verwenden:
+
+[.programlisting]
+....
+ttyu0 "/usr/libexec/getty V19200" dialup on
+....
+
+==== [.filename]#/etc/rc.d/serial#
+
+Modems, die höhere Geschwindigkeiten unterstützen, zum Beispiel V.32, V.32bis und V.34 Modems, benutzen Hardware-Flusssteuerung (`RTS/CTS`). Für die entsprechenden Schnittstellen können Sie die Flusssteuerung mit `stty` in [.filename]#/etc/rc.d/serial# einstellen.
+
+Um beispielsweise die Hardware-Flusssteuerung für die Geräte zur Ein- und Auswahl der zweiten seriellen Schnittstelle ([.filename]#COM2#) zu aktivieren, benutzen Sie die Dateien zur Initialisierung der entsprechenden Geräte und fügen die folgenden Zeilen in [.filename]#/etc/rc.d/serial# hinzu:
+
+[.programlisting]
+....
+# Serial port initial configuration
+stty -f /dev/ttyu1.init crtscts
+stty -f /dev/cuad1.init crtscts
+....
+
+=== Modemkonfiguration
+
+Für ein Modem, das seine Konfiguration in nicht flüchtigem RAM speichert, wird ein Terminalprogramm wie Telix unter MS-DOS(R) oder `tip` unter FreeBSD benötigt, um die Parameter einzustellen. Verbinden Sie sich mit derselben Geschwindigkeit, die `getty` zuerst benutzen würde, mit dem Modem und treffen Sie folgende Einstellungen:
+
+* DCD ist eingeschaltet, wenn das Trägersignal des entfernten Modems erkannt wird.
+* Im Betrieb liegt DTR an. Bei einem Verlust von DTR legt das Modem auf und setzt sich zurück.
+* CTS Flusssteuerung ist für ausgehende Daten aktiviert.
+* XON/XOFF Flusssteuerung ist ausgeschaltet.
+* RTS Flusssteuerung ist für eingehende Daten aktiviert.
+* Keine Rückmeldungen ausgeben.
+* Die Echo-Funktion ist deaktiviert.
+
+Lesen Sie die Dokumentation für das Modem, um herauszufinden welche Befehle und/oder DIP-Schalterstellungen benötigt werden.
+
+Für ein externes 14400 gelten zum Beispiel die folgenden Befehle:
+
+[.programlisting]
+....
+ATZ
+ATC1D2H1I0R2W
+....
+
+Bei dieser Gelegenheit können Sie auch gleich andere Einstellungen, zum Beispiel ob Sie V42.bis und/oder MNP5 Kompression benutzen wollen, an Ihrem Modem vornehmen.
+
+Bei einem externen 14400 müssen Sie auch noch einige DIP-Schalter einstellen. Die folgenden Einstellungen können verwendet werden:
+
+* Schalter 1: OBEN - DTR normal
+* Schalter 2: N/A (Rückmeldungen als Text/numerische Rückmeldungen)
+* Schalter 3: OBEN - Keine Rückmeldungen ausgeben
+* Schalter 4: UNTEN - Echo-Funktion aus
+* Schalter 5: OBEN - Rufannahme aktiviert
+* Schalter 6: OBEN - Carrier Detect normal
+* Schalter 7: OBEN - Einstellungen aus dem NVRAM laden
+* Schalter 8: N/A (Smart Mode/Dumb Mode)
+
+Für Einwählverbindungen sollten die Rückmeldungen deaktiviert sein, da sonst `getty` dem Modem das Anmeldeprompt `login:` schickt und das Modem im Kommandomodus das Prompt wieder ausgibt (Echo-Funktion) oder eine Rückmeldung gibt. Das führt dann zu einer länglichen und fruchtlosen Kommunikation zwischen dem Modem und `getty`.
+
+Die Geschwindigkeit zwischen Modem und Computer muss auf einen festen Wert eingestellt werden. Mit einem externen 14400 Modem setzen die folgenden Kommandos die Geschwindigkeit auf den Wert der Datenendeinrichtung fest:
+
+[.programlisting]
+....
+ATZ
+ATB1W
+....
+
+In diesem Fall muss die Geschwindigkeit der seriellen Schnittstelle des Modems der eingehenden Geschwindigkeit angepasst werden. Für ein externes 14400 Modem erlauben die folgenden Befehle eine Anpassung der Geschwindigkeit der seriellen Schnittstelle für Verbindungen, die keine Fehlerkorrektur verwenden:
+
+[.programlisting]
+....
+ATZ
+ATB2W
+....
+
+Verbindungen mit Fehlerkorrektur (V.42, MNP) verwenden die Geschwindigkeit der Datenendeinrichtung.
+
+==== Überprüfen der Modemkonfiguration
+
+Die meisten Modems verfügen über Kommandos, die die Konfiguration des Modems in lesbarer Form ausgeben. Auf einem externen 14400 zeigt `ATI5` die Einstellungen im nicht flüchtigen RAM an. Um die wirklichen Einstellungen unter Berücksichtigung der DIP-Schalter zu sehen, benutzen Sie `ATZ` gefolgt von `ATI4`.
+
+Wenn Sie ein anderes Modem benutzen, schauen Sie bitte in der Dokumentation des Modems nach, wie Sie die Konfiguration des Modems überprüfen können.
+
+=== Fehlersuche
+
+Bei Problemen können Sie die Einwählverbindung anhand der folgenden Punkte überprüfen:
+
+Schließen Sie das Modem an das FreeBSD-System an und booten Sie das System. Wenn das Modem über Statusindikatoren verfügt, überprüfen Sie, ob der DTR Indikator leuchtet, wenn das Anmeldeprompt erscheint. Dies zeigt an, dass das FreeBSD-System einen `getty` Prozess auf der entsprechenden Schnittstelle gestartet hat und das Modem auf einkommende Verbindungen wartet.
+
+Wenn der DTR-Indikator nicht leuchtet, melden Sie sich an dem FreeBSD-System an und überprüfen mit `ps ax`, ob FreeBSD einen `getty`-Prozess auf der entsprechenden Schnittstelle gestartet hat:
+
+[source,bash]
+....
+ 114 ?? I 0:00.10 /usr/libexec/getty V19200 ttyu0
+ 115 ?? I 0:00.10 /usr/libexec/getty V19200 ttyu1
+....
+
+Wenn das Modem noch keinen Anruf entgegengenommen hat und Sie stattdessen die folgende Zeile sehen
+
+[source,bash]
+....
+114 d0 I 0:00.10 /usr/libexec/getty V19200 ttyu0
+....
+
+bedeutet dies, dass `getty` die Schnittstelle schon geöffnet hat und zeigt Kabelprobleme oder eine falsche Modemkonfiguration an, da `getty` die Schnittstelle erst dann öffnen kann, wenn das CD Signal (Carrier Detect) vom Modem anliegt.
+
+Wenn Sie keine `getty`-Prozesse auf den gewünschten [.filename]#ttyuN# Ports finden, untersuchen Sie [.filename]#/etc/ttys# auf Fehler. Suchen Sie auch in [.filename]#/var/log/messages# nach Meldungen von `init` oder `getty`. Wenn Sie dort Meldungen finden, sollten Sie noch einmal die beiden Konfigurationsdateien [.filename]#/etc/ttys# und [.filename]#/etc/gettytab# nach Fehlern durchsehen. Überprüfen Sie auch, ob die Gerätedateien [.filename]#/dev/ttyuN# vorhanden sind.
+
+Versuchen Sie als nächstes, sich in das System einzuwählen. Auf dem entfernten System stellen Sie bitte die folgenden Kommunikationsparameter ein: 8 Bit, keine Parität, ein Stop-Bit. Wenn kein Anmeldeprompt erscheint oder nur unleserliche Zeichen, drücken Sie mehrmals, in Abständen von ungefähr einer Sekunde, kbd:[Enter]. Wenn Sie immer noch nicht die `login:` Meldung sehen, schicken Sie ein `BREAK` Kommando. Wenn Sie zur Einwahl ein Highspeed-Modem benutzen, verwenden Sie eine feste Geschwindigkeit auf der seriellen Schnittstelle des Modems.
+
+Wenn jetzt immer noch kein Anmeldeprompt erscheint, überprüfen Sie nochmals [.filename]#/etc/gettytab# und stellen sicher, dass:
+
+* der Verbindungstyp in [.filename]#/etc/ttys# zu einem gültigen Eintrag in [.filename]#/etc/gettytab# gehört.
+* jeder der `nx=` Einträge in [.filename]#gettytab# gültig ist und
+* jeder `tc=` Eintrag auf einen gültigen Eintrag in [.filename]#gettytab# verweist.
+
+Wenn das Modem am FreeBSD-System auf einen eingehenden Anruf nicht antwortet, stellen Sie sicher, dass das Modem so konfiguriert ist, dass es einen Anruf beantwortet, wenn DTR anliegt. Wenn das Modem Statusindikatoren besitzt, können Sie das Anliegen von DTR anhand der Leuchten überprüfen.
+
+Wenn Sie alles schon mehrfach überprüft haben und es immer noch noch nicht funktioniert, versuchen Sie es zu einem späteren Zeitpunkt erneut. Wenn es immer noch nicht funktioniert, können Sie eine Mail an die Mailingliste schicken, in der Sie Ihr Modem und Ihr Problem beschreiben.
+
+[[dialout]]
+== Verbindungen nach Außen
+
+Die folgenden Ratschläge beschreiben, wie Sie mit einem Modem eine Verbindung zu einem anderen Computer herstellen. Dies können Sie nutzen, um sich auf einem entfernten Computer anzumelden.
+
+Weiterhin ist diese Art von Verbindungen nützlich, wenn PPP mal nicht funktioniert. Wenn Sie zum Beispiel eine Datei mit FTP übertragen wollen und das über PPP gerade nicht möglich ist, melden Sie sich auf dem entfernten Rechner an und führen dort die FTP-Sitzung durch. Die Dateien können danach mit zmodem auf den lokalen Rechner übertragen werden.
+
+[[hayes-unsupported]]
+=== Ein Hayes Modem benutzen
+
+Es gibt einen eingebauten, allgemeinen Hayes Wähler in `tip`. Verwenden Sie `at=hayes` in [.filename]#/etc/remote#.
+
+Der Hayes-Treiber ist nicht schlau genug, um ein paar der erweiterten Funktionen von neueren Modems, bspw. `BUSY`, `NO DIALTONE` oder `CONNECT 115200` zu nutzen. Schalten Sie diese Nachrichten mit Hilfe von `ATX0W` ab, wenn Sie `tip` benutzen.
+
+Der Anwahl-Timeout von `tip` beträgt 60 Sekunden. Das Modem sollte weniger verwenden, oder `tip` denkt, dass ein Kommunikationsfehler vorliegt. Versuchen Sie es mit `ATS7=45W`.
+
+[[direct-at]]
+=== `AT`-Befehle benutzen
+
+Erstellen Sie einen `direct` Eintrag in [.filename]#/etc/remote#. Wenn das Modem zum Beispiel an der ersten seriellen Schnittstelle, [.filename]#/dev/cuad0#, angeschlossen ist, dann fügen Sie die folgende Zeile hinzu:
+
+[.programlisting]
+....
+cuad0:dv=/dev/cuad0:br#19200:pa=none
+....
+
+Verwenden Sie die höchste bps-Rate, die das Modem in der `br` Fähigkeit unterstützt. Geben Sie dann `tip cuad0` ein und Sie sind mit dem Modem verbunden.
+
+Oder benutzen Sie `cu` als `root` mit dem folgenden Befehl:
+
+[source,bash]
+....
+# cu -lline -sspeed
+....
+
+_line_ steht für die serielle Schnittstelle ([.filename]#/dev/cuad0#) und _speed_ für die Geschwindigkeit (`57600`). Wenn Sie mit dem Eingeben der AT Befehle fertig sind, beenden Sie mit `~.`.
+
+[[gt-failure]]
+=== Das `@` Zeichen funktioniert nicht
+
+Das `@` Zeichen in der Telefonnummerfähigkeit sagt `tip`, dass es in [.filename]#/etc/phones# nach einer Nummer suchen soll. Aber `@` ist auch ein spezielles Zeichen in den Dateien, in denen Fähigkeiten beschrieben werden, wie [.filename]#/etc/remote#. Schreiben Sie es mit einem Backslash:
+
+[.programlisting]
+....
+pn=\@
+....
+
+[[dial-command-line]]
+=== Wie kann ich von der Kommandozeile eine Telefonnummer wählen?
+
+Setzen Sie einen allgemeinen Eintrag in [.filename]#/etc/remote#. Zum Beispiel:
+
+[.programlisting]
+....
+tip115200|Dial any phone number at 115200 bps:\
+ :dv=/dev/cuad0:br#115200:at=hayes:pa=none:du:
+tip57600|Dial any phone number at 57600 bps:\
+ :dv=/dev/cuad0:br#57600:at=hayes:pa=none:du:
+....
+
+Folgendes sollte jetzt funktionieren:
+
+[source,bash]
+....
+# tip -115200 5551234
+....
+
+Benutzer, die `cu` gegenüber `tip` bevorzugen, können einen allgemeinen `cu`-Eintrag verwenden:
+
+[.programlisting]
+....
+cu115200|Use cu to dial any number at 115200bps:\
+ :dv=/dev/cuad1:br#57600:at=hayes:pa=none:du:
+....
+
+und benutzen zum Wählen das Kommando:
+
+[source,bash]
+....
+# cu 5551234 -s 115200
+....
+
+[[set-bps]]
+=== Die bps-Rate angeben
+
+Schreiben Sie einen `tip1200`- oder einen `cu1200`-Eintrag, aber geben Sie auch die bps-Rate an, die das 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 1200 bps benutzen.
+
+[[terminal-server]]
+=== Ü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 [.filename]#/etc/remote# verwenden. 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 Terminalserver.
+
+[.programlisting]
+....
+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/cuad2:br#38400:at=hayes:du:pa=none:pn=5551234:
+....
+
+[[tip-multiline]]
+=== Mehr als eine Verbindung mit `tip` benutzen
+
+Das ist oft ein Problem, wenn eine Universität mehrere Telefonleitungen hat und viele tausend Studenten diese benutzen wollen.
+
+Erstellen Sie einen Eintrag in [.filename]#/etc/remote# und benutzen Sie `@` für die `pn`-Fähigkeit:
+
+[.programlisting]
+....
+big-university:\
+ :pn=\@:tc=dialout
+dialout:\
+ :dv=/dev/cuad3:br#9600:at=courier:du:pa=none:
+....
+
+Listen Sie dann die Telefonnummern in [.filename]#/etc/phones# auf:
+
+[.programlisting]
+....
+big-university 5551111
+big-university 5551112
+big-university 5551113
+big-university 5551114
+....
+
+`tip` 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.
+
+[[multi-controlp]]
+=== Eine Übertragung erzwingen
+
+kbd:[Ctrl+P] ist das voreingestellte Zeichen, mit dem eine Übertragung erzwungen werden kann und wird benutzt, um `tip` zu sagen, dass das nächste Zeichen direkt gesendet werden soll und nicht als Fluchtzeichen interpretiert werden soll. Mit Hilfe der Fluchtsequenz `~s`, mit der man Variablen setzen kann, können Sie jedes andere Zeichen als "force"-Zeichen definieren.
+
+Geben Sie `~sforce=_Zeichen_` gefolgt von kbd:[Enter] ein. Für _Zeichen_ können Sie ein beliebiges einzelnes Zeichen einsetzen. Wenn Sie _Zeichen_ weglassen, ist das "force"-Zeichen "nul", das Sie mit kbd:[Ctrl+2] oder kbd:[Ctrl+Leertaste] eingeben können. Ein guter Wert für _Zeichen_ ist kbd:[Shift+Ctrl+6], welches nur auf wenigen Terminal Servern benutzt wird.
+
+Sie können das "force"-Zeichen auch bestimmen, indem Sie in [.filename]#$HOME/.tiprc# das Folgende einstellen:
+
+[.programlisting]
+....
+force=single-char
+....
+
+[[uppercase]]
+=== Großbuchstaben
+
+Dies passiert, wenn kbd:[Ctrl+A] eingegeben wurde, das "raise"-Zeichen von `tip`, 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 diese Fähigkeiten niemals benutzt werden sollen.
+
+Hier ist ein Muster der [.filename]#.tiprc# Datei für Emacs Benutzer, die kbd:[Ctrl+2] und kbd:[Ctrl+A] tippen müssen:
+
+[.programlisting]
+....
+force=^^
+raisechar=^^
+....
+
+Geben Sie für `^^` kbd:[Shift+Ctrl+6] ein.
+
+[[tip-filetransfer]]
+=== Dateien mit `tip` übertragen
+
+Wenn Sie mit einem anderen UNIX(R) System kommunizieren, können Sie mit `~p` (put) und `~t` (take) Dateien senden und empfangen. Diese Befehle lassen `cat` und `echo` auf dem entfernten System laufen, um Dateien zu empfangen und zu senden. Die Syntax ist:
+
+`~p` local-file [ remote-file ]
+
+`~t` remote-file [ local-file ]
+
+Es gibt keine Fehlerkontrolle, deshalb sollte besser ein anderes Protokoll, wie zmodem, benutzt werden.
+
+[[zmodem-tip]]
+=== zmodem mit `tip` benutzen
+
+Um Dateien zu empfangen, starten Sie das Programm zum Senden auf dem entfernten Computer. Geben Sie dann `~C rz` ein, um die Dateien lokal zu empfangen.
+
+Um Dateien zu senden, starten Sie das Programm zum Empfangen auf dem entfernten Computer. Geben Sie dann `~C sz _Dateien_` ein, um Dateien auf das entfernte System zu senden.
+
+[[serialconsole-setup]]
+== Einrichten der seriellen Konsole
+
+FreeBSD kann ein System mit einem Dumb-Terminal (unintelligente Datenstation) an einer seriellen Schnittstelle als Konsole booten. Diese Konfiguration ist besonders nützlich für Systemadministratoren, die FreeBSD auf Systemen ohne Tastatur oder Monitor installieren wollen, und Entwickler, die den Kernel oder Gerätetreiber debuggen.
+
+Wie in crossref:boot[boot,FreeBSDs Bootvorgang] beschrieben, besitzt FreeBSD drei Bootphasen. Der Code für die ersten beiden Bootphasen befindet sich im Bootsektor am Anfang der FreeBSD-Slice der Bootplatte. Dieser Bootblock lädt den Bootloader in Phase drei.
+
+Um eine serielle Konsole einzurichten, muss der Bootblock, der Bootloader und der Kernel konfiguriert werden.
+
+[[serialconsole-howto-fast]]
+=== Schnelle Konfiguration der seriellen Konsole
+
+Dieser Abschnitt bietet einen schnellen Überblick über die Einrichtung einer seriellen Konsolen. Es wird vorausgesetzt, dass die Voreinstellungen verwendet werden.
+
+[.procedure]
+. Verbinden Sie die serielle Konsole mit [.filename]#COM1# sowie dem Kontrollterminal.
+. Um die Startmeldungen der seriellen Konsole zu sehen, geben Sie als `root` folgendes ein:
++
+
+[source,bash]
+....
+....
+
+. Ändern Sie in [.filename]#/etc/ttys# den Eintrag für [.filename]#ttyu0# von `off` auf `on`. Zusätzlich sollten Sie den Wert `dialup` auf `vt100` ändern. Nur so wird auf der seriellen Konsole eine Eingabeaufforderung mit einer Passwortabfrage aktiviert.
+. Starten Sie nun das System neu, damit die serielle Konsole aktiviert wird.
+
+Wenn Sie eine unterschiedliche Konfiguration benötigen, lesen Sie den nächsten Abschnitt für eine tiefer gehende Erklärung.
+
+[[serialconsole-howto]]
+=== Konfiguration der seriellen Konsole
+
+[.procedure]
+****
+. Bereiten Sie ein serielles Kabel vor.
++
+Sie benötigen entweder ein Nullmodemkabel oder ein serielles Standard Kabel mit einem Nullmodemkabel-Adapter. In <<term-cables-null>> werden serielle Kabel beschrieben.
+. Trennen Sie die Tastatur vom Computer.
++
+Viele PC Systeme suchen beim Power On Self Test (POST) nach einer Tastatur und geben eine Fehlermeldung aus, wenn sie keine finden. Einige Maschinen werden sich sogar weigern, ohne Tastatur zu booten.
++
+Wenn der Rechner trotz einer Fehlermeldung normal weiterbootet, brauchen Sie weiter nichts zu tun.
++
+Wenn das System ohne Tastatur nicht booten will, müssen Sie das BIOS so konfigurieren, dass es diesen Fehler ignoriert (wenn das möglich ist). Das Handbuch zum Motherboard sollte beschreiben, wie das zu bewerkstelligen ist.
++
+[TIP]
+====
+
+Selbst wenn Sie im BIOS "Not installed" für die Tastatur einstellen, können Sie eine Tastatur angeschlossen haben und diese auch weiterhin benutzen, da sie mit dieser Anweisung das BIOS lediglich anweisen, nach dem Einschalten des Rechners nicht nach einer Tastatur zu suchen und den Rechner ohne entsprechende Fehlermeldung zu starten. Wenn die oben beschriebene Option nicht im BIOS vorhanden ist, halten Sie stattdessen Ausschau nach einer "Halt on Error" Option. Sie können den gleichen Effekt wie oben erzielen, wenn Sie diese Option auf "All but Keyboard" oder sogar "No Errors" setzen.
+====
++
+[NOTE]
+====
+Wenn das System über eine PS/2(R) Maus verfügt, müssen Sie diese wahrscheinlich auch abziehen. Da sich die PS/2(R) Maus und die Tastatur einige Hardwarekomponenten teilen, kann das dazu führen, dass die Hardwareerkennung fälschlicherweise eine Tastatur findet, wenn eine PS/2(R) Maus angeschlossen ist.
+====
+
+. Schließen Sie einen Dumb-Terminal an [.filename]#COM1# ([.filename]#sio0#) an.
++
+Wenn Sie keinen Dumb-Terminal besitzen, können Sie einen alten Computer mit einem Terminalemulator oder die serielle Schnittstelle eines anderen UNIX(R) Rechners benutzen. Sie benötigen auf jeden Fall eine freie erste serielle Schnittstelle ([.filename]#COM1#). Zurzeit ist es nicht möglich, in den Bootblöcken eine andere Schnittstelle zu konfigurieren, ohne diese neu zu kompilieren. Wenn Sie [.filename]#COM1# bereits für ein anderes Gerät benutzen, müssen Sie dieses Gerät temporär entfernen und einen neuen Bootblock sowie Kernel installieren, wenn FreeBSD erst einmal installiert ist.
+. Stellen Sie sicher, dass die Kernelkonfiguration die richtigen Optionen für [.filename]#COM1# ([.filename]#sio0#) enthält.
++
+Relevante Optionen sind:
++
+`0x10`:::
+Aktiviert die Konsolenunterstützung für dieses Gerät. Zurzeit kann nur ein Gerät die Konsolenunterstützung aktiviert haben. Das erste, in der Konfigurationsdatei aufgeführte Gerät, mit dieser Option, verfügt über eine aktivierte Konsolenunterstützung. Beachten Sie, dass diese Option alleine nicht ausreicht, um die serielle Konsole zu aktivieren. Setzen Sie entweder noch die nachfolgend diskutierte Option oder verwenden Sie beim Booten, wie unten beschrieben, den Schalter `-h`.
+
+`0x20`:::
+Das erste Gerät in der Kernelkonfigurationsdatei mit dieser Option wird, unabhängig von dem unten diskutierten Schalter `-h`, zur Konsole. Die Option `0x20` muss zusammen mit `0x10` verwendet werden.
+
+`0x40`:::
+Reserviert dieses Gerät und sperrt es für normale Zugriffe. Sie sollten diese Option nicht auf dem Gerät setzen, das Sie als serielle Konsole verwenden wollen. Der Zweck dieser Option ist es, dieses Gerät für das Remote-Debuggen zu reservieren. Das link:{developers-handbook}[ FreeBSD Developers' Handbook] enthält dazu weitere Informationen.
++
+Beispiel:
++
+[.programlisting]
+....
+device sio0 at isa? port IO_COM1 tty flags 0x10 irq 4
+....
++
+Weitere Einzelheiten finden Sie in man:sio[4].
++
+Wenn diese Optionen nicht gesetzt sind, müssen Sie auf einer anderen Konsole beim Booten UserConfig starten oder den Kernel neu kompilieren.
+. Erstellen Sie [.filename]#boot.config# im Rootverzeichnis der `a`-Partition des Bootlaufwerks.
++
+Der Code des Bootblocks entnimmt dieser Datei, wie Sie Ihr System booten möchten. Um die serielle Konsole zu aktivieren, müssen Sie hier eine oder mehrere Optionen (alle in derselben Zeile) angeben. Die folgenden Optionen stehen zur Auswahl der Konsole zur Verfügung:
++
+`-h`:::
+Schaltet zwischen der internen und der seriellen Konsole um. Wenn Sie beispielsweise von der internen Konsole (Bildschirm) booten, weist `-h` den Bootloader und den Kernel an, die serielle Schnittstelle als Konsole zu nehmen. Wenn die Konsole normal auf der seriellen Schnittstelle liegt, wählen Sie mit `-h` den Bildschirm aus.
+
+`-D`:::
+Schaltet zwischen Einzelkonsole und Dual-Konsole um. Die Einzelkonsole ist entweder die interne Konsole (der Bildschirm) oder die serielle Schnittstelle, je nach dem Stand von `-h`. Im Dual-Konsolen Betrieb ist die Konsole, unabhängig von `-h`, gleichzeitig der Bildschirm und die serielle Schnittstelle. Dies trifft aber nur zu, wenn der Bootblock ausgeführt wird. Sobald der Bootloader ausgeführt wird, wird die durch `-h` gegebene Konsole die alleinige Konsole.
+
+`-P`:::
+Veranlasst den Bootblock nach einer Tastatur zu suchen. Wenn keine Tastatur gefunden wird, werden `-D` und `-h` automatisch gesetzt.
++
+[NOTE]
+====
+Wegen Platzbeschränkungen in den Bootblöcken kann `-P` nur erweiterte Tastaturen erkennen. Tastaturen mit weniger als 101 Tasten und ohne F11 und F12 Tasten werden wahrscheinlich, wie vielleicht auch die Tastaturen einiger Laptops, nicht erkannt. Wenn das der Fall ist, können Sie `-P` nicht verwenden, da es leider keine Abhilfe für dieses Problem gibt.
+====
++
+Benutzen Sie also entweder `-P`, um die Konsole automatisch zu setzen, oder `-h`, um die serielle Konsole zu verwenden.
++
+Weitere Optionen werden in man:boot[8] beschrieben.
++
+Mit Ausnahme von `-P` werden die Optionen an den Bootloader weitergegeben. Der Bootloader untersucht dann einzig `-h` um festzustellen, welches Gerät die Konsole wird. Wenn Sie also nur `-D` angegeben haben, können Sie die serielle Schnittstelle nur als Konsole verwenden während der Bootblock ausgeführt wird. Danach wird der Bootloader, da ja `-h` fehlt, den Bildschirm zur Konsole machen.
+. Booten Sie die Maschine.
++
+Wenn Sie das FreeBSD-System starten, werden die Bootblöcke den Inhalt von [.filename]#/boot.config# auf der Konsole ausgeben:
++
+[source,bash]
+....
+/boot.config: -P
+Keyboard: no
+....
++
+Die zweite Zeile sehen Sie nur, wenn Sie in [.filename]#/boot.config#`-P` angegeben haben. Sie zeigt an, ob eine Tastatur angeschlossen ist oder nicht. Die Meldungen gehen je nach den Einstellungen in [.filename]#/boot.config# auf die interne Konsole, die serielle Konsole, oder beide Konsolen.
++
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+<| Optionen
+<| Meldungen erscheinen auf
+
+|keine
+|der internen Konsole
+
+|`-h`
+|der seriellen Konsole
+
+|`-D`
+|der seriellen und der internen Konsole
+
+|`-Dh`
+|der seriellen und der internen Konsole
+
+|`-P`, mit Tastatur
+|der internen Konsole
+
+|`-P`, ohne Tastatur
+|der seriellen Konsole
+|===
++
+Nach den oben gezeigten Meldungen gibt es eine kleine Verzögerung bevor die Bootblöcke den Bootloader laden und weitere Meldungen auf der Konsole erscheinen. Sie können die Ausführung der Bootblöcke unterbrechen, um zu überprüfen, ob auch alles richtig aufgesetzt ist, brauchen das aber unter normalen Umständen nicht zu tun.
++
+Drücken Sie eine Taste außer kbd:[Enter] um den Bootvorgang zu unterbrechen. Sie erhalten dann ein Prompt, an dem Sie weitere Eingaben tätigen können:
++
+[source,bash]
+....
+FreeBSD/i386 BOOT
+Default: 0:ad(0,a)/boot/loader
+boot:
+....
++
+Je nach Inhalt von [.filename]#/boot.config# erscheint das Prompt auf der seriellen Konsole, der internen Konsole oder beiden Konsolen. Wenn die Meldung auf der richtigen Konsole erscheint, drücken Sie kbd:[Enter] um fortzufahren.
++
+Wenn kein Prompt auf der seriellen Konsole erscheint, liegt ein Fehler in den Einstellungen vor. Als Abhilfe geben Sie an der momentanen Konsole `-h` ein, um den Bootblock und den Bootloader auf die serielle Konsole umzustellen. Führen Sie dann den Bootvorgang mit kbd:[Enter] weiter und wenn das System gebootet hat, können Sie die fehlerhaften Einstellungen korrigieren.
+****
+
+Während der dritten Bootphase können Sie immer noch zwischen der internen und der seriellen Konsole auswählen. Setzen Sie dazu, wie in <<serialconsole-loader>> beschrieben, die entsprechenden Variablen des Bootloaders.
+
+[[serialconsole-summary]]
+=== Zusammenfassung
+
+Die folgende Tabelle bietet eine Zusammenfassung der verschiedenen Einstellungen, die in diesem Abschnitt diskutiert wurden:
+
+.Fall 1: Option 0x10 für [.filename]#sio0#
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+<| Optionen in /boot.config
+<| Konsole in den Bootblöcken
+<| Konsole im Bootloader
+<| Konsole im Kernel
+
+|keine
+|interne
+|interne
+|interne
+
+|`-h`
+|serielle
+|serielle
+|serielle
+
+|`-D`
+|serielle und interne
+|interne
+|interne
+
+|`-Dh`
+|serielle und interne
+|serielle
+|serielle
+
+|`-P`, mit Tastatur
+|interne
+|interne
+|interne
+
+|`-P`, ohne Tastatur
+|serielle und interne
+|serielle
+|serielle
+|===
+
+.Fall 2: Option 0x30 für [.filename]#sio0#
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+<| Optionen in /boot.config
+<| Konsole in den Bootblöcken
+<| Konsole im Bootloader
+<| Konsole im Kernel
+
+|keine
+|interne
+|interne
+|serielle
+
+|`-h`
+|serielle
+|serielle
+|serielle
+
+|`-D`
+|serielle und interne
+|interne
+|serielle
+
+|`-Dh`
+|serielle und interne
+|serielle
+|serielle
+
+|`-P`, mit Tastatur
+|interne
+|interne
+|serielle
+
+|`-P`, ohne Tastatur
+|serielle und interne
+|serielle
+|serielle
+|===
+
+[[serialconsole-tips]]
+=== Hinweise zur seriellen Konsole
+
+==== Verwenden einer höheren Geschwindigkeit
+
+Die Vorgabewerte für die Kommunikationsparameter der seriellen Schnittstelle sind: 9600 baud, 8 Bit, keine Parität und ein Stopp-Bit. Um die Standardgeschwindigkeit zu ändern, stehen folgende Möglichkeiten zur Verfügung:
+
+* Geben Sie die neue Konsolengeschwindigkeit mit `BOOT_COMCONSOLE_SPEED` an und kompilieren Sie die Bootblöcke neu. Ausführliche Informationen zum Bau und zur Installation von neuen Bootblöcken finden Sie im <<serialconsole-com2>> des Handbuchs.
++
+Wenn die serielle Konsole nicht mit der Option `-h` gestartet wird, oder wenn die verwendete serielle Konsole sich von der von den Bootblöcken verwendeten unterscheidet, müsssen Sie zusätzlich die folgende Option in die Kernelkonfigurationsdatei aufnehmen und den Kernel neu bauen:
++
+[.programlisting]
+....
+options CONSPEED=19200
+....
+
+* Verwenden Sie die Option `-S`, um den Kernel zu booten. Eine Beschreibung dieses Vorgangs sowie eine Auflistung der von [.filename]#/boot.config# unterstützten Optionen finden Sie in man:boot[8].
+* Aktivieren Sie die Option `comconsole_speed` in [.filename]#/boot/loader.conf#.
++
+Diese Option setzt voraus, dass auch die Optionen `console`, `boot_serial`, sowie `boot_multicons` in [.filename]#/boot/loader.conf# gesetzt sind. Im Folgenden finden Sie ein Beispiel, in dem `comconsole_speed` verwendet wird, um die Geschwindigkeit der seriellen Konsole zu ändern:
++
+[.programlisting]
+....
+boot_multicons="YES"
+boot_serial="YES"
+comconsole_speed="115200"
+console="comconsole,vidconsole"
+....
+
+[[serialconsole-com2]]
+==== Eine andere Schnittstelle als [.filename]#sio0# benutzen
+
+Wenn Sie, warum auch immer, ein anderes Gerät als [.filename]#sio0# für die serielle Konsole einsetzen wollen, kompilieren Sie bitte die Bootblöcke, den Bootloader und den Kernel nach dem folgenden Verfahren neu.
+
+[.procedure]
+. Installieren Sie die Kernelquellen wie im crossref:cutting-edge[updating-upgrading,FreeBSD aktualisieren] beschrieben.
+. Setzen Sie in [.filename]#/etc/make.conf#`BOOT_COMCONSOLE_PORT` auf die Adresse der Schnittstelle (0x3F8, 0x2F8, 0x3E8 oder 0x2E8), die Sie benutzen möchten. Sie können nur [.filename]#sio0# bis [.filename]#sio3# ([.filename]#COM1# bis [.filename]#COM4#) benutzen, Multiportkarten können Sie nicht als Konsole benutzen. Interrupts müssen Sie hier nicht angeben.
+. Erstellen Sie eine angepasste Kernelkonfiguration und geben Sie dort die richtigen Optionen für die Schnittstelle, die Sie benutzen möchten, an. Wenn Sie zum Beispiel [.filename]#sio1# ([.filename]#COM2#) zur Konsole machen wollen, geben Sie dort entweder
++
+[.programlisting]
+....
+device sio1 at isa? port IO_COM2 tty flags 0x10 irq 3
+....
++
+oder
++
+[.programlisting]
+....
+device sio1 at isa? port IO_COM2 tty flags 0x30 irq 3
+....
++
+an. Keine andere serielle Schnittstelle sollte als Konsole definiert werden.
+. Übersetzen und installieren Sie die Bootblöcke und den Bootloader:
++
+
+[source,bash]
+....
+# cd /sys/boot
+# make clean
+# make
+# make install
+....
+
+. Bauen und installieren Sie einen neuen Kernel.
+. Schreiben Sie die Bootblöcke mit man:bsdlabel[8] auf die Bootplatte und booten Sie den neuen Kernel.
+
+[[serialconsole-ddb]]
+==== DDB Debugger über die serielle Schnittstelle
+
+Wenn Sie den Kerneldebugger über eine serielle Verbindung bedienen möchten, übersetzen Sie einen angepassten Kernel mit den folgenden Optionen. Das ist nützlich, kann aber gefährlich sein, wenn auf der Leitung falsche BREAK-Signale generiert werden.
+
+[.programlisting]
+....
+options BREAK_TO_DEBUGGER
+options DDB
+....
+
+==== Benutzung der seriellen Konsole zum Anmelden
+
+Da Sie schon die Bootmeldungen auf der Konsole verfolgen können und den Kerneldebugger über die Konsole bedienen können, wollen Sie sich vielleicht auch an der Konsole anmelden.
+
+Öffnen Sie [.filename]#/etc/ttys# in einem Editor und suchen Sie nach den folgenden Zeilen:
+
+[.programlisting]
+....
+ttyu0 "/usr/libexec/getty std.9600" unknown off secure
+ttyu1 "/usr/libexec/getty std.9600" unknown off secure
+ttyu2 "/usr/libexec/getty std.9600" unknown off secure
+ttyu3 "/usr/libexec/getty std.9600" unknown off secure
+....
+
+[.filename]#ttyu0# bis [.filename]#ttyu3# entsprechen [.filename]#COM1# bis [.filename]#COM4#. Ändern Sie für die entsprechende Schnittstelle `off` zu `on`. Wenn Sie auch die Geschwindigkeit der seriellen Schnittstelle geändert haben, müssen Sie `std.9600` auf die momentane Geschwindigkeit anpassen.
+
+Auch kann den Terminaltyp von `unknown` auf den tatsächlich verwendeten Terminal gesetzt werden.
+
+Damit die Änderungen wirksam werden, müssen Sie noch `kill -HUP 1` absetzen.
+
+[[serialconsole-loader]]
+=== Die Konsole im Bootloader ändern
+
+In den vorigen Abschnitten wurde beschrieben, wie Sie die serielle Konsole durch Änderungen im Bootblock aktivieren. Dieser Abschnitt zeigt, wie Sie mit Kommandos und Umgebungsvariablen die Konsole im Bootloader definieren. Da der Bootloader die dritte Phase im Bootvorgang ist und nach den Bootblöcken ausgeführt wird, überschreiben seine Einstellungen die des Bootblocks.
+
+==== Festlegen der Konsole
+
+Mit einer einzigen Zeile in [.filename]#/boot/loader.conf# können Sie den Bootloader und den Kernel anweisen, die serielle Schnittstelle zur Konsole zu machen:
+
+[.programlisting]
+....
+console="comconsole"
+....
+
+Unabhängig von den Einstellungen im Bootblock legt dies die Konsole fest.
+
+Die obige Zeile sollte die erste Zeile in [.filename]#/boot/loader.conf# sein, so dass die Bootmeldungen so früh wie möglich auf der Konsole zu sehen sind.
+
+Analog können Sie die interne Konsole verwenden:
+
+[.programlisting]
+....
+console="vidconsole"
+....
+
+Wenn die Umgebungsvariable `console` nicht gesetzt ist, bestimmt der Bootloader und damit auch der Kernel, die Konsole über die `-h` Option des Bootblocks.
+
+Die Bootkonsole kann in [.filename]#/boot/loader.conf.local# oder [.filename]#/boot/loader.conf# angegeben werden.
+
+Weitere Informationen erhalten Sie in man:loader.conf[5].
+
+[NOTE]
+====
+Momentan gibt es im Bootloader nichts vergleichbares zu `-P` im Bootblock. Damit kann die Konsole nicht automatisch über das Vorhandensein einer Tastatur festgelegt werden.
+====
+
+==== Eine andere Schnittstelle als [.filename]#sio0# benutzen
+
+Der Bootloader muss neu kompiliert werden, wenn eine andere Schnittstelle als [.filename]#sio0# benutzt werden soll. Folgen Sie der Anleitung aus <<serialconsole-com2>>.
+
+[[serialconsole-caveats]]
+=== Vorbehalte
+
+Obwohl es die meisten Systeme erlauben, ohne Tastatur zu booten, gibt es nur wenige Systeme, die ohne eine Grafikkarte booten. Maschinen mit einem AMI BIOS können ohne Grafik booten, indem Sie den Grafikadapter im CMOS-Setup auf `Not installed` setzen.
+
+Viele Maschinen unterstützen diese Option allerdings nicht. Damit diese Maschinen booten, müssen sie über eine Grafikkarte, auch wenn es nur eine alte Monochromkarte ist, verfügen. Allerdings brauchen Sie keinen Monitor an die Karte anzuschließen. Sie können natürlich auch versuchen, auf diesen Maschinen ein AMI BIOS zu installieren.
diff --git a/documentation/content/de/books/handbook/usb-device-mode/_index.adoc b/documentation/content/de/books/handbook/usb-device-mode/_index.adoc
new file mode 100644
index 0000000000..82aad41ae7
--- /dev/null
+++ b/documentation/content/de/books/handbook/usb-device-mode/_index.adoc
@@ -0,0 +1,261 @@
+---
+title: Kapitel 25. USB Gerätemodus
+part: Teil III. Systemadministration
+prev: books/handbook/dtrace
+next: books/handbook/partiv
+---
+
+[[usb-device-mode]]
+= USB Gerätemodus
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 25
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/usb-device-mode/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/usb-device-mode/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/usb-device-mode/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[usb-device-mode-synopsis]]
+== Übersicht
+
+Dieses Kapitel behandelt die Verwendung des USB Gerätemodus und USB On-The-Go (USB OTG) unter FreeBSD. Dazu gehören virtuelle serielle Konsolen, virtuelle Netzwerkkarten und virtuelle USB-Laufwerke.
+
+Wenn die eingesetzte Hardware den USB-Gerätemodus oder USB OTG unterstützt, kann FreeBSDs USB-Stack im Gerätemodus ausgeführt werden. Solche Hardware wird häufig in eingebetteten Systeme verbaut. Der Gerätemodus ermöglicht es dem Rechner verschiedene Arten von USB-Geräteklassen darzustellen, einschließlich serieller Schnittstellen, Netzwerkkarten und Massenspeicher oder Kombinationen davon. Ein USB-Host, beispielsweise ein Notebook oder ein Desktop-Rechner, kann wie auf ein physisches USB-Gerät darauf zugreifen.
+
+Es gibt zwei grundlegende Möglichkeiten, wie die Hardware den Gerätemodus bereitstellen kann: mit einem separaten "Client Modus", der nur den Gerätemodus unterstützt, und mit einem USB-OTG-Port, der sowohl den Geräte- als auch den Hostmodus bereitstellen kann. Bei USB-OTG-Ports wechselt der USB-Stack automatisch zwischen host- und geräteseitig, je nachdem, was an dem Port angeschlossen ist. Wenn Sie ein USB-Gerät wie einen Speicherstick an den Port anschließen, wechselt FreeBSD in den Hostmodus. Wenn Sie einen USB-Host wie einen Computer anschließen, wechselt FreeBSD in den Gerätemodus. "Client Ports" arbeiten immer im Gerätemodus.
+
+Was FreeBSD dem USB-Host präsentiert, hängt von der sysctl-Variable `hw.usb.template` ab. Einige Vorlagen bieten ein einzelnes Gerät, beispielsweise ein serielles Terminal, andere bieten mehrere, die alle gleichzeitig verwendet werden können. Ein Beispiel ist die Vorlage 10, die ein Massenspeichergerät, eine serielle Konsole und eine Netzwerkkarte bereitstellt. man:usb_template[4] enthält eine Liste der verfügbaren Werte.
+
+Beachten Sie, dass in einigen Fällen, abhängig von der Hardware und dem Betriebssystem des Hosts, die Änderung an der Konfiguration nur dann bemerkt werden kann, wenn der Host entweder physisch getrennt und wieder verbunden oder gezwungen wird, den USB-Bus auf eine systemspezifische Weise neu zu scannen. Wenn FreeBSD auf dem Host läuft, kann man:usbconfig[8] `reset` verwendet werden. Dies muss auch nach dem Laden von [.filename]#usb_template.ko# geschehen, wenn der USB-Host bereits an der USB OTG-Buchse angeschlossen war.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie wissen:
+
+* wie man den USB Gerätemodus unter FreeBSD einrichtet.
+* wie man die virtuelle serielle Schnittstelle unter FreeBSD konfiguriert.
+* wie man sich mit der virtuellen seriellen Schnittstelle von verschiedenen Betriebssystemen aus verbindet.
+
+[[usb-device-mode-terminals]]
+== Virtuelle serielle USB-Ports
+
+=== Konfiguration des USB-Gerätemodus für serielle Ports
+
+Die virtuellen seriellen Ports werden durch die Vorlagen 3, 8 und 10 unterstützt. Beachten Sie, dass Vorlage 3 mit Microsoft Windows 10 ohne spezielle Treiber und INF-Dateien funktioinert. Andere Host-Betriebssysteme arbeiten mit allen drei Vorlagen. Die beiden Kernelmodule man:usb_template[4] und man:umodem[4] müssen geladen werden.
+
+Um die seriellen Ports im USB-Gerätemodus zu aktivieren, fügen Sie folgenden Zeilen in [.filename]#/etc/ttys# hinzu:
+
+[.programlisting]
+....
+ttyU0 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+ttyU1 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+....
+
+Danach fügen Sie folgende Zeilen in [.filename]#/etc/devd.conf# hinzu:
+
+[.programlisting]
+....
+notify 100 {
+ match "system" "DEVFS";
+ match "subsystem" "CDEV";
+ match "type" "CREATE";
+ match "cdev" "ttyU[0-9]+";
+ action "/sbin/init q";
+};
+....
+
+Laden Sie die Konfiguration neu, falls man:devd[8] bereits läuft:
+
+[source,bash]
+....
+# service devd restart
+....
+
+Stellen Sie sicher, dass die notwendigen Module geladen sind und die richtige Vorlage beim Booten gesetzt ist. Fügen Sie dazu folgende Zeilen in [.filename]#/boot/loader.conf# ein:
+
+[.programlisting]
+....
+umodem_load="YES"
+hw.usb.template=3
+....
+
+Um das Modul zu laden und die Vorlage ohne Neustart zu aktivieren, verwenden Sie:
+
+[source,bash]
+....
+# kldload umodem
+# sysctl hw.usb.template=3
+....
+
+=== FreeBSD mit der seriellen Schnittstelle im USB-Gerätemodus verbinden
+
+Um eine Verbindung zu einer Karte herzustellen, die so konfiguriert ist, dass sie serielle Ports im USB-Gerätemodus bereitstellt, schließen Sie den USB-Host, beispielsweise einen Laptop, an den USB OTG- oder USB-Client-Port der Karte an. Verwenden Sie `pstat -t` auf dem Host, um die Terminalzeilen aufzulisten. Am Ende der Liste sollten Sie einen seriellen USB-Anschluss sehen, zum Beispiel "ttyU0". Um die Verbindung zu öffnen, benutzen Sie:
+
+[source,bash]
+....
+# cu -l /dev/ttyU0
+....
+
+Nach mehrmaligem Drücken der kbd:[Enter]-Taste erscheint ein Anmeldeprompt.
+
+=== macOS mit der seriellen Schnittstelle im USB-Gerätemodus verbinden
+
+Um eine Verbindung zu einer Karte herzustellen, die so konfiguriert ist, dass sie serielle Ports im USB-Gerätemodus bereitstellt, schließen Sie den USB-Host, beispielsweise einen Laptop, an den USB OTG- oder USB-Client-Port der Karte an. Um die Verbindung zu öffnen, benutzen Sie:
+
+[source,bash]
+....
+# cu -l /dev/cu.usbmodemFreeBSD1
+....
+
+=== Linux mit der seriellen Schnittstelle im USB-Gerätemodus verbinden
+
+Um eine Verbindung zu einer Karte herzustellen, die so konfiguriert ist, dass sie serielle Ports im USB-Gerätemodus bereitstellt, schließen Sie den USB-Host, beispielsweise einen Laptop, an den USB OTG- oder USB-Client-Port der Karte an. Um die Verbindung zu öffnen, benutzen Sie:
+
+[source,bash]
+....
+# minicom -D /dev/ttyACM0
+....
+
+=== Windows 10 mit der seriellen Schnittstelle im USB-Gerätemodus verbinden
+
+Um eine Verbindung zu einer Karte herzustellen, die so konfiguriert ist, dass sie serielle Ports im USB-Gerätemodus bereitstellt, schließen Sie den USB-Host, beispielsweise einen Laptop, an den USB OTG- oder USB-Client-Port der Karte an. Um die Verbindung zu öffnen, benötigen Sie ein Terminalprogramm mit Unterstützung für serielle Schnittstellen, zum Beispiel PuTTY. Um den von Windows(R) verwendeten COM-Port zu ermitteln, starten Sie den Geräte-Manager und erweitern Sie "Ports (COM & LPT)". Dort sehen Sie einen Namen wie "USB Serial Sevice (COM4)". Starten Sie das Terminalprogramm Ihrer Wahl, zum Beispiel PuTTY. Im Dialog von PuTTY setzen Sie den "Connection type" auf "Serial" und notieren im Feld "Serial line" den ermittelten COM-Namen. Danach klicken Sie auf "Open".
+
+[[usb-device-mode-network]]
+== Netzwerkkarten im USB-Gerätemodus
+
+Virtuelle Netzwerkkarten werden durch die Vorlagen 1, 8 und 10 unterstützt. Beachten Sie, dass keine dieser Vorlagen mit Windows(R) funktioniert. Andere Host-Betriebssysteme arbeiten mit allen drei Vorlagen. Die Kernelmodule man:usb_template[4] und man:if_cdce[4] müssen geladen sein.
+
+Stellen Sie sicher, dass die notwendigen Module geladen sind und die richtige Vorlage beim Booten gesetzt ist. Fügen Sie dazu folgende Zeilen in [.filename]#/boot/loader.conf# ein:
+
+[.programlisting]
+....
+if_cdce_load="YES"
+hw.usb.template=1
+....
+
+Um das Modul zu laden und die Vorlage ohne Neustart zu aktivieren, verwenden Sie:
+
+[source,bash]
+....
+# kldload if_cdce
+# sysctl hw.usb.template=1
+....
+
+[[usb-device-mode-storage]]
+== Virtuelle USB-Speichergeräte
+
+[NOTE]
+====
+man:cfumass[4] ist ein USB-Gerätetreiber, der seit FreeBSD 12.0 verfügbar ist.
+====
+
+Virtuelle Speichergeräte werden durch die Vorlagen 0 und 10 unterstützt. Die Kernelmodule man:usb_template[4] und man:cfumass[4] müssen geladen sein. man:cfumass[4] ist die Schnittstelle zum CTL-Subsystem, das auch für iSCSI- oder Fibre-Channel-Targets benutzt wird. Auf dem Host können Initiatioren von USB-Massenspeichern nur auf eine einzige LUN, LUN 0 zugreifen.
+
+=== Konfiguration von USB-Massenspeicher Targets mit dem cfumass-Startskript
+
+Der einfachste Weg, ein schreibgeschütztes USBSpeicherziel einzurichten, ist die Verwendung des [.filename]#cfumass# rc-Skripts. Kopieren Sie einfach die Dateien, die dem USB-Host präsentiert werden sollen, in das Verzeichnis [.filename]#/var/cfumass# und fügen Sie diese Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+cfumass_enable="YES"
+....
+
+Um das Ziel ohne Neustart zu konfigurieren, führen Sie diesen Befehl aus:
+
+[source,bash]
+....
+# service cfumass start
+....
+
+Im Gegensatz zur seriellen und Netzwerkfunktionalität sollte die Vorlage in [.filename]#/boot/loader.conf# nicht auf 0 oder 10 gesetzt werden, da die LUN vor dem Setzen der Vorlage konfiguriert werden muss. Das [.filename]#cfumass# rc-Skript setzt beim Start automatisch die richtige Vorlage.
+
+=== USB-Massenspeicher mit anderen Werkzeugen konfigurieren
+
+Der Rest dieses Kapitels enthält eine detaillierte Beschreibung der Konfiguration ohne die Verwendung des [.filename]#cfumass# rc-Skripts. Dies ist beispielsweise notwendig, wenn man eine beschreibbare LUN zur Verfügung stellen will.
+
+Im Gegensatz zu iSCSI ist es bei USB-Massenspeichern nicht zwingend erforderlich, dass der man:ctld[8] Daemon läuft. Es gibt zwei Möglichkeiten, das Target zu konfigurieren: man:ctladm[8] oder man:ctld[8]. Beide erfordern, dass das Kernelmodul [.filename]#cfumass.ko# geladen ist. Das Modul kann manuell geladen werden:
+
+[source,bash]
+....
+# kldload cfumass
+....
+
+Wenn [.filename]#cfumass# nicht im Kernel integriert ist, kann [.filename]#/boot/loader.conf# angepasst werden, damit das Modul beim Booten geladen wird:
+
+[.programlisting]
+....
+cfumass_load="YES"
+....
+
+Eine LUN kann ohne den man:ctld[8] Daemon erstellt werden:
+
+[source,bash]
+....
+# ctladm create -b block -o file=/data/target0
+....
+
+Dies stellt den Inhalt des Abbilds von [.filename]#/data/target0# als LUN auf dem USB-Host dar. Die Datei muss vor der Ausführung des Befehls vorhanden sein. Um die LUN beim Systemstart zu konfigurieren, muss das Kommando in [.filename]#/etc/rc.local# eingetragen werden.
+
+man:ctld[8] kann auch benutzt werden, um LUNs zu verwalten. Dazu erstellen Sie eine [.filename]#/etc/ctl.conf# und fügen eine Zeile in [.filename]#/etc/rc.conf# hinzu, um sicherzustellen, dass man:ctld[8] beim Booten automatisch gestartet wird. Danach kann der Daemon gestartet werden.
+
+Es folgt ein Beispiel einer einfachen Konfiguration für [.filename]#/etc/ctl.conf#. Eine ausführliche Beschreibung der Optionen finden Sie in man:ctl.conf[5].
+
+[.programlisting]
+....
+target naa.50015178f369f092 {
+ lun 0 {
+ path /data/target0
+ size 4G
+ }
+}
+....
+
+Dieses Beispiel erstellt ein einzelnes Target mit einer einzigen LUN. `naa.50015178f369f092` ist eine Gerätekennung, die aus 32 zufälligen Hexadezimalziffern besteht. `path` definiert den absoluten Pfad zu einer Datei oder eines zvol, welches die LUN als Speicher nutzen kann. Diese Datei muss vor dem Start von man:ctld[8] existieren. Die zweite Zeile ist optional und definiert die Größe der LUN.
+
+Damit der man:ctld[8] Daemon beim Booten gestartet wird, muss diese Zeile in [.filename]#/etc/rc.conf# hinzugefügt werden:
+
+[.programlisting]
+....
+ctld_enable="YES"
+....
+
+Sie können man:ctld[8] mit diesem Befehl direkt starten:
+
+[source,bash]
+....
+# service ctld start
+....
+
+Der man:ctld[8] Daemon liest beim Start [.filename]#/etc/ctl.conf#. Wenn diese Datei nach dem Start des Daemons bearbeitet wird, müssen die Änderungen neu geladen werden, damit sie sofort wirksam werden:
+
+[source,bash]
+....
+# service ctld reload
+....
diff --git a/documentation/content/de/books/handbook/virtualization/_index.adoc b/documentation/content/de/books/handbook/virtualization/_index.adoc
new file mode 100644
index 0000000000..0fdde776e8
--- /dev/null
+++ b/documentation/content/de/books/handbook/virtualization/_index.adoc
@@ -0,0 +1,1078 @@
+---
+title: Kapitel 21. Virtualisierung
+part: Teil III. Systemadministration
+prev: books/handbook/filesystems
+next: books/handbook/l10n
+---
+
+[[virtualization]]
+= Virtualisierung
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 21
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../../images/books/handbook/virtualization/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/virtualization/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/virtualization/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/en/mailing-lists.adoc[]
+include::shared/en/teams.adoc[]
+include::shared/en/urls.adoc[]
+
+toc::[]
+
+[[virtualization-synopsis]]
+== Übersicht
+
+Virtualisierungssoftware erlaubt es, mehrere Betriebssysteme gleichzeitig auf dem selben Computer laufen zu lassen. Derartige Softwaresysteme für PCs setzen in der Regel ein Host-Betriebssystem voraus, auf dem die Virtualisierungssoftware läuft und unterstützen eine nahezu beliebige Anzahl von Gast-Betriebssystemen.
+
+Nachdem Sie dieses Kapitel gelesen haben,
+
+* Kennen Sie den Unterscheid zwischen einem Host-Betriebssystem und einem Gast-Betriebssystem.
+* Können Sie FreeBSD auf einem Intel(R)-basierenden Apple(R) Mac(R) installieren.
+* Können Sie FreeBSD unter Microsoft(R) Windows(R) und Virtual PC installieren.
+* Wissen Sie, wie man ein virtualisiertes FreeBSD-System für optimale Leistung konfiguriert.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie
+
+* Die crossref:basics[basics,Grundlagen von UNIX(R) und FreeBSD] verstehen.
+* Wissen, wie Sie crossref:bsdinstall[bsdinstall,FreeBSD installieren] können.
+* Wissen, wie Sie eine crossref:advanced-networking[advanced-networking,Netzwerkverbindung konfigurieren].
+* Wissen, wie Sie crossref:ports[ports,zusätzliche Software installieren] können.
+
+[[virtualization-guest-parallels]]
+== FreeBSD als Gast-Betriebssystem unter Parallels für Mac OS(R) X
+
+Parallels Desktop für Mac(R) ist ein kommerzielles Softwareprodukt, welches für Intel(R)-basierende Apple(R) Mac(R)-Computer mit Mac OS(R) X 10.4.6 oder höher verfügbar ist. FreeBSD wird von diesem Softwarepaket als Gast-Betriebssystem vollständig unterstützt. Nach der Installation von Parallels auf Mac OS(R) X konfigurieren Sie als erstes eine virtuelle Maschine, in der Sie danach das gewünschte Gast-Betriebssystem (in diesem Fall FreeBSD) installieren.
+
+[[virtualization-guest-parallels-install]]
+=== Installation von FreeBSD unter Parallels/Mac OS(R) X
+
+Der erste Schritt bei der Installation von FreeBSD unter Parallels ist es, eine virtuelle Maschine zu konfigurieren, in der Sie FreeBSD installieren können. Dazu wählen Sie bei der Frage nach dem menu:Guest OS Type[][.guimenuitem]#FreeBSD# aus:
+
+image::parallels-freebsd1.png[]
+
+Legen Sie geeignete Größen für Festplatten- und Arbeitsspeicher für die zu erstellende FreeBSD-Instanz fest. 4 GB Plattenplatz sowie 512 MB RAM sind in der Regel für die Arbeit unter Parallels ausreichend:
+
+image::parallels-freebsd2.png[]
+
+image::parallels-freebsd3.png[]
+
+image::parallels-freebsd4.png[]
+
+image::parallels-freebsd5.png[]
+
+Wählen Sie den gewünschten Netzwerktyp aus und konfigurieren Sie die Netzwerkverbindung:
+
+image::parallels-freebsd6.png[]
+
+image::parallels-freebsd7.png[]
+
+Speichern Sie Ihre Eingaben, um die Konfiguration abzuschließen:
+
+image::parallels-freebsd8.png[]
+
+image::parallels-freebsd9.png[]
+
+Nachdem Sie die virtuelle Maschine erstellt haben, installieren Sie im nächsten Schritt FreeBSD in dieser virtuellen Maschine. Dazu verwenden Sie am besten eine offizielle FreeBSD-CD/DVD oder Sie laden von einem offiziellen FTP-Server ein ISO-Abbild auf Ihren Mac(R) herunter. Danach klicken Sie auf das Laufwerksymbol in der rechten unteren Ecke des Parallels-Fensters, um das virtuelles Laufwerk mit dem ISO-Abbild oder mit dem physikalischen CD-ROM-Laufwerk des Computers zu verknüpfen.
+
+image::parallels-freebsd11.png[]
+
+Nachdem Sie diese Verknüpfung hergestellt haben, starten sie die virtuelle FreeBSD-Maschine neu, indem Sie auf das Symbol "Neustarten" klicken. Parallels startet nun ein Spezial-BIOS, das zuerst prüft, ob eine CD-ROM eingelegt wurde.
+
+image::parallels-freebsd10.png[]
+
+In diesem Fall findet das BIOS ein FreeBSD-Installationsmedium und beginnt eine normale Installation. Versuchen Sie jetzt noch nicht Xorg zu konfigurieren.
+
+image::parallels-freebsd12.png[]
+
+Nachdem die Installation abgeschlossen ist, können Sie die virtuelle FreeBSD-Maschine starten.
+
+image::parallels-freebsd13.png[]
+
+[[virtualization-guest-parallels-configure]]
+=== FreeBSD für den Einsatz unter Parallels konfigurieren
+
+Nachdem FreeBSD erfolgreich unter Mac OS(R) X mit Parallels installiert wurde, sollten Sie das virtuelle FreeBSD-System für virtualisierte Operationen optimieren:
+
+[.procedure]
+. Setzen der Bootloader-Variablen
++
+Die wichtigste Änderung ist es, die Variable `kern.hz` zu verkleinern, um so die CPU-Auslastung in der Parallels-Umgebung zu verringern.
++
+[.programlisting]
+....
+kern.hz=100
+....
+
++
+Ohne diese Einstellung kann ein unbeschäftigtes FreeBSD unter Parallels trotzdem rund 15 Prozent der CPU-Leistung eines Single Prozessor iMac(R)'s verbrauchen. Nach dieser Änderung reduziert sich dieser Wert auf etwa 5 Prozent.
+. Erstellen einer neuen Kernelkonfigurationsdatei
++
+Sie können alle SCSI-, FireWire- und USB-Laufwerks-Treiber entfernen. Parallels stellt einen virtuellen Netzwerkadapter bereit, der den man:ed[4]-Treiber verwendet. Daher können alle Netzwerkgeräte bis auf man:ed[4] und man:miibus[4] aus dem Kernel entfernt werden.
+. Netzwerkbetrieb einrichten
++
+Die einfachste Netzwerkkonfiguration ist der Einsatz von DHCP, um die virtuelle Maschine mit dem gleichen lokalen Netzwerk, in dem sich der Host-Mac(R) befindet, zu verbinden. Dazu fügen Sie die Zeile `ifconfig_ed0="DHCP"` in [.filename]#/etc/rc.conf# ein. Weitere Informationen zur Konfiguration des Netzwerks unter FreeBSD finden Sie im crossref:advanced-networking[advanced-networking,Netzwerkverbindung konfigurieren].
+
+[[virtualization-guest-virtualpc]]
+== FreeBSD als Gast-Betriebssystem unter Virtual PC für Windows(R)
+
+Virtual PC für Windows(R) wird von Microsoft(R) kostenlos zum Download angeboten. Die Systemanforderungen für dieses Programm finden Sie http://www.microsoft.com/windows/downloads/virtualpc/sysreq.mspx[ hier]. Nachdem Virtual PC unter Microsoft(R) Windows(R) installiert wurde, muss eine virtuelle Maschine konfiguriert und das gewünschte Betriebssystem installiert werden.
+
+[[virtualization-guest-virtualpc-install]]
+=== FreeBSD in Virtual PC installieren
+
+Der erste Schritt zur Installation von FreeBSD in Virtual PC ist es, eine neue virtuelle Maschine zu erstellen, in die Sie FreeBSD installieren können. Dazu wählen Sie die Option [.guimenuitem]#Create a virtual machine#, wenn Sie danach gefragt werden:
+
+image::virtualpc-freebsd1.png[]
+
+image::virtualpc-freebsd2.png[]
+
+Bei der Frage nach dem [.guimenuitem]#Operating system# wählen Sie [.guimenuitem]#Other#:
+
+image::virtualpc-freebsd3.png[]
+
+Danach müssen Sie den gewünschten Plattenplatz sowie die Größe des Hauptspeichers angeben. 4 GB Plattenplatz sowie 512 MB RAM sollten für die Installation von FreeBSD in Virtual PC ausreichend sein:
+
+image::virtualpc-freebsd4.png[]
+
+image::virtualpc-freebsd5.png[]
+
+Speichern Sie die Eingaben und beenden Sie die Konfiguration:
+
+image::virtualpc-freebsd6.png[]
+
+Wählen Sie nun die für FreeBSD erstellte virtuelle Maschine aus und klicken Sie auf menu:Settings[], um das Netzwerk zu konfigurieren:
+
+image::virtualpc-freebsd7.png[]
+
+image::virtualpc-freebsd8.png[]
+
+Nachdem die virtuelle Maschine erstellt wurde, können Sie FreeBSD installieren. Dazu verwenden Sie am besten eine offizielle FreeBSD-CD/DVD oder ein ISO-Image, das Sie von einem offiziellen FreeBSD-FTP-Server heruntergeladen haben. Wenn Sie ein ISO-Image auf der Festplatte gespeichert haben, oder eine FreeBSD-CD/DVD in das Laufwerk eingelegt haben, doppelklicken Sie auf die virtuelle Maschine, die Sie für FreeBSD angelegt haben. Danach klicken Sie auf menu:CD[] und wählen die Option menu:Capture ISO Image...[] im Virtual PC-Fenster. Danach können Sie im folgenden Fenster das CD-Laufwerk mit dem physikalischen CD-Laufwerk oder mit dem ISO-Image verknüpfen.
+
+image::virtualpc-freebsd9.png[]
+
+image::virtualpc-freebsd10.png[]
+
+Danach starten Sie die virtuelle Maschine neu, indem Sie zuerst auf menu:Action[] und danach auf menu:Reset[] klicken. Virtual PC startet die virtuelle Maschine nun neu und prüft zuerst, ob die virtuelle Maschine über ein CD-Laufwerk verfügt.
+
+image::virtualpc-freebsd11.png[]
+
+Da dies hier der Fall ist, beginnt nun eine normale FreeBSD-Installation. Sie können FreeBSD nun installieren, aber verzichten Sie an dieser Stelle unbedingt auf die Xorg-Konfiguration.
+
+image::virtualpc-freebsd12.png[]
+
+Nachdem die Installation abgeschlossen ist, entfernen Sie die CD/DVD aus dem Laufwerk (oder lösen die Verknüpfung zum ISO-Image). Danach starten Sie die virtuelle Maschine neu, um FreeBSD zu starten.
+
+image::virtualpc-freebsd13.png[]
+
+[[virtualization-guest-virtualpc-configure]]
+=== FreeBSD in Virtual PC konfigurieren
+
+Nachdem FreeBSD auf Microsoft(R) Windows(R) mit Virtual PC erfolgreich installiert wurde, sollten Sie das virtuelle FreeBSD noch anpassen, um eine optimale Funktion zu gewährleisten.
+
+[.procedure]
+. Setzen der Bootloader-Variablen
++
+Die wichtigste Änderung ist es, die Variable `kern.hz` zu verkleinern, um so die CPU-Auslastung in der Virtual PC-Umgebung zu verringern. Dazu fügen Sie die folgende Zeile in [.filename]#/boot/loader.conf# ein:
++
+[.programlisting]
+....
+kern.hz=100
+....
++
+Ohne diese Einstellung kann ein unbeschäftigtes FreeBSD unter Virutal PC trotzdem rund 40 Prozent der CPU-Leistung eines Ein-Prozessor-Systems verbrauchen. Nach dieser Änderung reduziert sich dieser Wert auf etwa 3 Prozent.
+. Erstellen einer neuen Kernelkonfigurationsdatei
++
+Alle SCSI-, FireWire- und USB-Laufwerks-Treiber können aus der Kernelkonfigurationsdatei entfernt werden. Virtual PC stellt einen virtuellen Netzwerkadapter bereit, der den man:de[4]-Treiber verwendet. Daher können alle Netzwerkgeräte bis auf man:de[4] und man:miibus[4] aus dem Kernel entfernt werden.
+. Das Netzwerk einrichten
++
+Die einfachste Netzwerkkonfiguration nutzt von DHCP, um die virtuelle Maschine mit dem gleichen lokalen Netzwerk, in dem sich der Host-Microsoft(R) Windows(R) befindet, zu verbinden. Dazu fügen Sie die Zeile `ifconfig_de0="DHCP"` in [.filename]#/etc/rc.conf# ein. Weitere Informationen zur Konfiguration des Netzwerks unter FreeBSD finden Sie in crossref:advanced-networking[advanced-networking,Netzwerkverbindung konfigurieren].
+
+[[virtualization-guest-vmware]]
+== FreeBSD als Gast-Betriebssystem unter VMware Fusion für Mac OS(R)
+
+VMware Fusion für Mac(R) ist ein kommerzielles Programm, das für Intel(R) basierte Apple(R) Mac(R)-Computer mit Mac OS(R) 10.4.9 oder neuer erhältlich ist. FreeBSD wird von diesem Produkt vollständig als Gast-Betriebssystem unterstützt. Nachdem Sie VMware Fusion unter Mac OS(R) X installiert haben, können Sie eine virtuelle Maschine konfigurieren und das gewünschte Gastbetriebssystem installieren.
+
+[[virtualization-guest-vmware-install]]
+=== FreeBSD in VMware Fusion installieren
+
+Zuerst müssen Sie VMware Fusion starten, um eine virtuelle Maschine zu erstellen. Dazu wählen Sie die Option [.guimenuitem]#New#:
+
+image::vmware-freebsd01.png[]
+
+Dadurch wird ein Assistent gestartet, der bei der Erzeugung einer neuen virtuellen Maschine behilflich ist. Klicken Sie auf [.guimenuitem]#Continue#, um den Prozess zu starten:
+
+image::vmware-freebsd02.png[]
+
+Wählen Sie [.guimenuitem]#Other# als das [.guimenuitem]#Operating System#, danach [.guimenuitem]#FreeBSD# oder [.guimenuitem]#FreeBSD 64-bit#, je nach dem, welche Version Sie installieren wollen, wenn Sie nach der zu installierenden menu:Version[] gefragt werden:
+
+image::vmware-freebsd03.png[]
+
+Vergeben Sie einen Namen für die virtuelle Maschine und legen Sie den Speicherort fest:
+
+image::vmware-freebsd04.png[]
+
+Legen Sie die Größe der virtuellen Festplatte für die virtuelle Maschine fest:
+
+image::vmware-freebsd05.png[]
+
+Wählen Sie die Installationsmethode für die virtuelle Maschine. Entweder von einem ISO-Abbild oder von einer CD/DVD:
+
+image::vmware-freebsd06.png[]
+
+Nachdem Sie auf [.guimenuitem]#Finish# geklickt haben, wird die virtuelle Maschine gestartet:
+
+image::vmware-freebsd07.png[]
+
+Nun können Sie FreeBSD wie gewohnt installieren:
+
+image::vmware-freebsd08.png[]
+
+Nachdem die Installation abgeschlossen ist, können noch verschiedene Parameter der virtuellen Maschine, wie etwa der Speicherverbrauch, konfiguriert werden:
+
+[NOTE]
+====
+Die Hardware der virtuellen Maschine kann nicht geändert werden, solange die virtuelle Maschine läuft.
+====
+
+image::vmware-freebsd09.png[]
+
+Die Anzahl der CPUs der virtuellen Maschine:
+
+image::vmware-freebsd10.png[]
+
+Den Status des CD-Laufwerks. Sie können die CD/DVD/ISO von der virtuellen Maschine lösen, wenn Sie es nicht benötigen.
+
+image::vmware-freebsd11.png[]
+
+Zuletzt sollten Sie noch festlegen, wie sich die virtuelle Maschine mit dem Netzwerk verbinden soll. Sollen neben dem Gastsystem auch andere Rechner auf die virtuelle Maschine zugreifen können, muss die Option [.guimenuitem]#Connect directly to the physical network (Bridged)# gewählt werden. Ist dies nicht der Fall, sollte die Option [.guimenuitem]#Share the host's internet connection (NAT)# gewählt werden. In dieser Einstellung kann die virtuelle Maschine zwar auf das Internet zugreifen, andere Rechner dürfen aber nicht auf die virtuelle Maschine zugreifen.
+
+image::vmware-freebsd12.png[]
+
+Nachdem die Konfiguration abgeschlossen ist, kann FreeBSD gestartet werden.
+
+[[virtualization-guest-vmware-configure]]
+=== FreeBSD unter VMware Fusion konfigurieren
+
+Nachdem Sie FreeBSD erfolgreich unter VMware Fusion installiert haben, sollten Sie das virtuelle FreeBSD noch anpassen, um eine optimale Funktion zu gewährleisten.
+
+[.procedure]
+. Die wichtigste Änderung ist es, die Variable `kern.hz` zu verkleinern, um so die CPU-Auslastung in der VMware Fusion-Umgebung zu verringern.
++
+[.programlisting]
+....
+kern.hz=100
+....
+
++
+Ohne diese Einstellung kann ein unbeschäftigtes FreeBSD unter VMware Fusion trotzdem rund 15 Prozent der CPU-Leistung eines Single Prozessor iMac(R)'s verbrauchen. Nach dieser Änderung reduziert sich dieser Wert auf etwa 5 Prozent.
+. Erstellen einer neuen Kernelkonfigurationsdatei
++
+Alle FireWire- und USB-Laufwerks-Treiber können aus der Kernelkonfigurationsdatei entfernt werden. VMware Fusion stellt einen virtuellen Netzwerkadapter bereit, der den man:em[4]-Treiber verwendet. Daher können alle Netzwerkgeräte bis auf man:em[4] und man:miibus[4] aus dem Kernel entfernt werden.
+. Netzwerkbetrieb einrichten
++
+Die einfachste Netzwerkkonfiguration verwendet DHCP, um die virtuelle Maschine mit dem gleichen lokalen Netzwerk, in dem sich der Host-Mac(R) befindet, zu verbinden. Dazu fügen Sie die Zeile `ifconfig_em0="DHCP"` in [.filename]#/etc/rc.conf# ein. Weitere Informationen zur Konfiguration des Netzwerks unter FreeBSD finden Sie im crossref:advanced-networking[advanced-networking,Netzwerkverbindung konfigurieren].
+
+[[virtualization-guest-virtualbox-guest-additions]]
+== FreeBSD als Gast mit VirtualBox(TM)
+
+FreeBSD funktioniert einwandfrei als Gast-Betriebssystem unter VirtualBox(TM). Die Virtualisierungs-Software steht für die meisten Betriebssysteme zur Verfügung, einschließlich FreeBSD.
+
+Die VirtualBox(TM) Gasterweiterungen bieten Unterstützung für:
+
+* Gemeinsame Zwischenablage.
+* Mauszeiger-Integration.
+* Zeitsynchronisation mit dem Host.
+* Skalierung von Fenstern.
+* Nahtloser Modus.
+
+[NOTE]
+====
+Diese Kommandos werden im FreeBSD Gastsystem ausgeführt.
+====
+
+Installieren Sie das Paket oder den Port package:emulators/virtualbox-ose-additions[] in das FreeBSD Gastsystem. Dieses Beispiel installiert den Port:
+
+[source,bash]
+....
+# cd /usr/ports/emulators/virtualbox-ose-additions
+# make install clean
+....
+
+Fügen Sie folgende Einträge in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+vboxguest_enable="YES"
+vboxservice_enable="YES"
+....
+
+Wenn man:ntpd[8] oder man:ntpdate[8] verwendet wird um die Uhrzeit zu synchronisieren, dann deaktivieren Sie die Synchronisierung mit dem Host:
+
+[.programlisting]
+....
+vboxservice_flags="--disable-timesync"
+....
+
+Xorg wird den `vboxvideo`-Treiber automatisch erkennen. Alternativ kann auch manuell ein entsprechender Eintrag in [.filename]#/etc/X11/xorg.conf# hinzugefügt werden:
+
+[.programlisting]
+....
+Section "Device"
+ Identifier "Card0"
+ Driver "vboxvideo"
+ VendorName "InnoTek Systemberatung GmbH"
+ BoardName "VirtualBox Graphics Adapter"
+EndSection
+....
+
+Um den `vboxmouse_drv`-Treiber zu verwenden, muss [.filename]#/etc/X11/xorg.conf# ebenfalls angepasst werden:
+
+[.programlisting]
+....
+Section "InputDevice"
+ Identifier "Mouse0"
+ Driver "vboxmouse"
+EndSection
+....
+
+Benutzer von HAL sollten die Datei [.filename]#/usr/local/etc/hal/fdi/policy/90-vboxguest.fdi# erstellen oder sie aus [.filename]#/usr/local/shared/hal/fdi/policy/10osvendor/90-vboxguest.fdi# kopieren:
+
+[.programlisting]
+....
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+# Sun VirtualBox
+# Hal driver description for the vboxmouse driver
+# $Id: chapter.xml,v 1.33 2012-03-17 04:53:52 eadler Exp $
+
+ Copyright (C) 2008-2009 Sun Microsystems, Inc.
+
+ This file is part of VirtualBox Open Source Edition (OSE, as
+ available from http://www.virtualbox.org. This file is free software;
+ you can redistribute it and/or modify it under the terms of the GNU
+ General Public License (GPL) as published by the Free Software
+ Foundation, in version 2 as it comes in the "COPYING" file of the
+ VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+
+ Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
+ Clara, CA 95054 USA or visit http://www.sun.com if you need
+ additional information or have any questions.
+-->
+<deviceinfo version="0.2">
+ <device>
+ <match key="info.subsystem" string="pci">
+ <match key="info.product" string="VirtualBox guest Service">
+ <append key="info.capabilities" type="strlist">input</append>
+ <append key="info.capabilities" type="strlist">input.mouse</append>
+ <merge key="input.x11_driver" type="string">vboxmouse</merge>
+ <merge key="input.device" type="string">/dev/vboxguest</merge>
+ </match>
+ </match>
+ </device>
+</deviceinfo>
+....
+
+Gemeinsame Ordner für die Dateitransfer zwischen Host und VM sind verfügbar, wenn sie mit `mount_vboxvfs` eingebunden werden. Ein gemeinsamer Ordner kann auf dem Host über die graphische Oberfläche von VirtualBox oder mit `vboxmanage` erstellt werden. Um beispielsweise einen freigegebenen Ordner namens _myshare_ unter [.filename]#/mnt/bsdboxshare# für die VM _BSDBox_ zu erstellen, führen Sie folgendes Kommando aus:
+
+[source,bash]
+....
+# vboxmanage sharedfolder add 'BSDBox' --name myshare --hostpath /mnt/bsdboxshare
+....
+
+Beachten Sie, dass der Name des gemeinsamen Ordners keine Leerzeichen enthalten darf. Sie können den freigegebenen Ordner innerhalb des Gastsystems wie folgt einbinden:
+
+[source,bash]
+....
+# mount_vboxvfs -w myshare /mnt
+....
+
+[[virtualization-host-virtualbox]]
+== FreeBSD als Host mit Virtualbox
+
+VirtualBox(TM) ist ein vollständigesVirtualisierungspaket, das aktiv weiterentwickelt wird und für die meisten Betriebssysteme einschließlich Windows(R), Mac OS(R), Linux(R) und FreeBSD zur Verfügung steht. Es kann sowohl Windows(R) als auch UNIX(R)-ähnliche Gastsysteme betreiben. Es wird als Open Source Software veröffentlicht, jedoch mit Closed-Source-Komponenten in einem separaten Erweiterungspaket. Zu diesen Komponenten gehört Unterstützung für USB 2.0-Geräte. Weitere Informationen finden Sie auf der http://www.virtualbox.org/wiki/Downloads[ Downloads-Seite im VirtualBox(TM) Wiki]. Derzeit sind diese Erweiterungen für FreeBSD nicht verfügbar.
+
+[[virtualization-virtualbox-install]]
+=== VirtualBox(TM) installieren
+
+VirtualBox(TM) steht als Paket oder Port in package:emulators/virtualbox-ose[] bereit. Der Port kann mit folgendem Kommando installiert werden:
+
+[source,bash]
+....
+# cd /usr/ports/emulators/virtualbox-ose
+# make install clean
+....
+
+Eine nützliche Option im Konfigurationsdialog ist die `GuestAdditions`-Programmsammlung. Diese stellen eine Reihe von nützlichen Eigenschaften in den Gastbetriebssystemen zur Verfügung, wie beispielsweise Mauszeigerintegration (was es ermöglicht, die Maus zwischen dem Host und dem Gast zu teilen ohne eine spezielle Tastenkombination für diesen Wechsel zu drücken), sowie schnelleres Rendern von Videos, besonders in Windows(R) Gästen. Diese Gastzusätze sind im menu:Devices[]-Menü zu finden, nachdem die Installation des Gastbetriebssystem abgeschlossen ist.
+
+Ein paar Konfigurationsänderungen sind notwendig, bevor VirtualBox(TM) das erste Mal gestartet wird. Der Port installiert ein Kernelmodul in [.filename]#/boot/modules#, das in den laufenden Kernel geladen werden muss:
+
+[source,bash]
+....
+# kldload vboxdrv
+....
+
+Um sicherzustellen, dass das Modul immer nach einem Neustart geladen wird, fügen Sie die folgende Zeile in [.filename]#/boot/loader.conf# ein:
+
+[.programlisting]
+....
+vboxdrv_load="YES"
+....
+
+Um die Kernelmodule für die Unterstützung von Netzwerkbrücken oder Host-Only Netzwerken zu laden, fügen Sie folgendes in [.filename]#/etc/rc.conf# ein und starten Sie den Computer neu:
+
+[.programlisting]
+....
+vboxnet_enable="YES"
+....
+
+Die Gruppe `vboxusers` wird während der Installation von VirtualBox(TM) angelegt. Alle Benutzer, die Zugriff auf VirtualBox(TM) haben sollen, müssen in diese Gruppe aufgenommen werden. `pw` kann benutzt werden, um neue Mitglieder hinzuzufügen:
+
+[source,bash]
+....
+# pw groupmod vboxusers -m yourusername
+....
+
+Damit Netzwerkbrücken funktionieren, müssen die in der Voreinstellung eingeschränkten Berechtigungen für [.filename]#/dev/vboxnetctl# angepasst werden:
+
+[source,bash]
+....
+# chown root:vboxusers /dev/vboxnetctl
+# chmod 0600 /dev/vboxnetctl
+....
+
+Um diese Berechtigungen dauerhaft zu speichern, fügen Sie folgende Einträge in [.filename]#/etc/devfs.conf# hinzu:
+
+[.programlisting]
+....
+own vboxnetctl root:vboxusers
+perm vboxnetctl 0600
+....
+
+Um VirtualBox(TM) zu starten, geben Sie folgenden Befehl in der Xorg-Sitzung ein:
+
+[source,bash]
+....
+% VirtualBox
+....
+
+Besuchen Sie die offizielle Webseite von VirtualBox(TM) unter http://www.virtualbox.org[ http://www.virtualbox.org], um weitere Informationen zur Konfiguration und Verwendung zu erhalten. FreeBSD-spezifische Informationen und Anleitungen zur Fehlerbehebung finden Sie auf der entsprechenden Seite im FreeBSD-Wiki unter http://wiki.FreeBSD.org/VirtualBox[ http://wiki.FreeBSD.org/VirtualBox].
+
+[[virtualization-virtualbox-usb-support]]
+=== USB Unterstützung für VirtualBox(TM)
+
+Sie können VirtualBox(TM) so konfigurieren, dass USB-Geräte an das Gastsystem weitergeleitet werden. So lange das Erweiterungspaket für USB 2.0 und 3.0 auf FreeBSD nicht verfügbar ist, ist der Host-Controller der OSE-Version auf die Emulation von USB 1.1-Geräten beschränkt.
+
+Damit VirtualBox(TM) angeschlossene USB-Geräte am Rechner erkennt, muss der Benutzer Mitglied der Gruppe `operator` sein.
+
+[source,bash]
+....
+# pw groupmod operator -m ihrbenutzername
+....
+
+Anschließend fügen Sie folgenden Eintrag in [.filename]#/etc/devfs.rules# ein. Wenn die Datei nicht existiert, muss sie zuvor erstellt werden:
+
+[.programlisting]
+....
+[system=10]
+add path 'usb/*' mode 0660 group operator
+....
+
+Um diese neuen Regeln zu laden, fügen Sie Folgendes in [.filename]#/etc/rc.conf# hinzu:
+
+[.programlisting]
+....
+devfs_system_ruleset="system"
+....
+
+Danach starten Sie devfs neu:
+
+[source,bash]
+....
+# service devfs restart
+....
+
+Sie müssen die Anmeldesitzung und VirtualBox(TM) neu starten, damit die Änderungen wirksam werden. Danach können Sie nach Bedarf neue USB-Filter erstellen.
+
+[[virtualbox-virtualization-host-dvd-cd-access]]
+=== Host CD/DVD-Zugriff in VirtualBox(TM)
+
+Ein Gastsystem kann auf die DVD/CD-Laufwerke des Hosts zugreifen. Der Zugriff für die virtuellen Maschinen wird in den Einstellungen von VirtualBox(TM) konfiguriert. Falls erforderlich, erstellen Sie zunächst ein leeres IDEDVD/CD-Gerät und wählen Sie dann ein entsprechendes Medium für dieses Laufwerk aus. Das Kontrollkästchen `Passthrough` besagt, dass die virtuelle Maschine die Hardware direkt verwenden kann. Audio-CDs und Brenner funktionieren nur, wenn diese Option ausgewählt ist.
+
+Damit die CD/DVD-Funktionen von VirtualBox(TM) funktionieren, muss HAL in [.filename]#/etc/rc.conf# aktiviert und anschließend gestartet werden:
+
+[.programlisting]
+....
+hald_enable="YES"
+....
+
+[source,bash]
+....
+# service hald start
+....
+
+Damit die CD/DVD-Funktionen von Benutzern verwendet werden können, benötigen diese Zugriff auf [.filename]#/dev/xpt0#, [.filename]#/dev/cdN# und [.filename]#/dev/passN#. Dies wird in der Regel dadurch erreicht, den Benutzer zum Mitglied der Gruppe `operator` zu machen. Die Berechtigungen für diese Geräte werden mit folgenden Zeilen in [.filename]#/etc/devfs.conf# konfiguriert:
+
+[.programlisting]
+....
+perm cd* 0660
+perm xpt0 0660
+perm pass* 0660
+....
+
+[source,bash]
+....
+# service devfs restart
+....
+
+[[virtualization-host-bhyve]]
+== FreeBSD als Host mit bhyve
+
+Beginnend mit FreeBSD 10.0-RELEASE ist bhyve, ein BSD-lizensierter Hypervisor, Teil des Basissystems. Dieser Hypervisor unterstützt eine Reihe von Gastbetriebssystemen, darunter FreeBSD, OpenBSD und viele Linux(R) Distributionen. In der Voreinstellung unterstützt bhyve eine serielle Konsole, graphische Konsolen werden nicht emuliert. bhyve verwendet Offload-Funktionen von neueren CPUs, um manuelle Speicherzuordnungen und Anweisungen zu vermeiden.
+
+Das Design von bhyve erfordert einen Prozessor, der Intel(R) Extended Page Tables (EPT), AMD(R) Rapid Vitualization Indexing (RVI) oder Nested Page Tables (NPT) unterstützt. FreeBSD- oder Linux(R)-Gastsysteme mit mehr als einer vCPU benötigen VMX unrestricted mode support (UG). Die meisten neueren Prozessoren, speziell Intel(R) Core(TM) i3/i5/i7 und Intel(R) Xeon(TM) E3/E5/E7, unterstützen diese Funktionen. Unterstützung für UG wurde mit Intel's Westmere Mikroarchitektur eingeführt. Eine vollständige Liste der Intel(R)-Prozessoren mit EPT-Unterstützung finden Sie unter https://ark.intel.com/content/www/us/en/ark/search/featurefilter.html?productType=873&0_ExtendedPageTables=True[]. RVI wird seit der dritten Generation der AMD Opteron(TM)-Prozessoren (Barcelona) unterstützt. Um zu sehen ob der Prozessor bhyve unterstützt, prüfen Sie die Ausgabe von `dmesg` oder [.filename]#/var/run/dmesg.boot#. Für AMD(R)-Prozessoren suchen Sie in der Zeile `Features2` nach `POPCNT`. Für Intel(R)-Prozessoren suchen Sie in der Zeile `VT-x` nach `EPT` und `UG`.
+
+[[virtualization-bhyve-prep]]
+=== Vorbereitung des Hosts
+
+Der erste Schritt bei der Erstellung einer virtuellen Maschine in bhyve ist die Konfiguration des Host-Systems. Laden Sie zunächst das bhyve Kernelmodul:
+
+[source,bash]
+....
+# kldload vmm
+....
+
+Erstellen Sie ein [.filename]#tap#-Gerät, um dieses mit der Netzwerk-Schnittstelle der virtuellen Maschine zu verbinden. Damit sich die Schnittstelle mit dem Netzwerk verbinden kann, müssen Sie zusätzlich eine Bridge-Schnittstelle erzeugen, bestehend aus dem [.filename]#tap#-Gerät und der physikalischen Schnittstelle. In diesem Beispiel wird die physikalische Schnittstelle [.filename]#igb0# verwendet:
+
+[source,bash]
+....
+# ifconfig tap0 create
+# sysctl net.link.tap.up_on_open=1
+net.link.tap.up_on_open: 0 -> 1
+# ifconfig bridge0 create
+# ifconfig bridge0 addm igb0 addm tap0
+# ifconfig bridge0 up
+....
+
+[[virtualization-bhyve-freebsd]]
+=== Ein FreeBSD-Gastsystem erstellen
+
+Erzeugen Sie eine Datei, die als virtuelle Festplatte für das Gastsystem verwendet wird. Geben Sie die Größe und den Namen der virtuellen Festplatte an:
+
+[source,bash]
+....
+# truncate -s 16G guest.img
+....
+
+Laden Sie ein Installationsabbild von FreeBSD:
+
+[source,bash]
+....
+# fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.3/FreeBSD-10.3-RELEASE-amd64-bootonly.iso
+FreeBSD-10.3-RELEASE-amd64-bootonly.iso 100% of 230 MB 570 kBps 06m17s
+....
+
+FreeBSD enthält ein Beispielskript um eine virtuelle Maschine in bhyve auszuführen. Das Skript wird die virtuelle Maschine starten und sie in einer Schleife ausführen. Sollte die virtuelle Maschine abstürzen, wird sie vom Skript automatisch neu gestartet. Das Skript akzeptiert einige Optionen, um die Konfiguration der virtuellen Maschine zu kontrollieren: `-c` bestimmt die Anzahl der virtuellen CPUs, `-m` begrenzt den verfügbaren Speicher des Gastsystems, `-t` bestimmt das verwendete [.filename]#tap#-Gerät, `-d` gibt das zu benutzende Festplattenabbild an, `-i` sagt bhyve dass es von CD booten soll und `-I` bestimmt das CD-Abbild. Der letzte Parameter ist der Name der virtuellen Maschine. Dieses Beispiel startet die virtuelle Maschine im Installationsmodus:
+
+[source,bash]
+....
+# sh /usr/shared/examples/bhyve/vmrun.sh -c 1 -m 1024M -t tap0 -d guest.img -i -I FreeBSD-10.3-RELEASE-amd64-bootonly.iso guestname
+....
+
+Die virtuelle Maschine wird starten und das Installationsprogramm ausführen. Nachdem das System in der virtuellen Maschine installiert ist, werden Sie gefragt, ob eine Shell gestartet werden soll. Wählen Sie btn:[Yes].
+
+Starten Sie die virtuelle Maschine neu. Ein Neustart der virtuellen Maschine wird bhyve beenden, aber da das [.filename]#vmrun.sh#-Skript in einer Schleife läuft, wird bhyve automatisch neu gestartet. Wenn dies passiert, wählen Sie die Option `Reboot` im Bootloader-Menü, um die Schleife zu unterbrechen. Anschließend kann das Gastsystem von der virtuellen Festplatte gestartet werden:
+
+[source,bash]
+....
+# sh /usr/shared/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d guest.img guestname
+....
+
+[[virtualization-bhyve-linux]]
+=== Ein Linux(R)-Gastsystem erstellen
+
+Um andere Betriebssysteme als FreeBSD zu booten, muss zunächst der Port package:sysutils/grub2-bhyve[] installiert werden.
+
+Als nächstes erzeugen Sie eine Datei, die das Gastsystem als virtuelle Festplatte verwenden kann:
+
+[source,bash]
+....
+# truncate -s 16G linux.img
+....
+
+Der Start einer virtuellen Maschine mit bhyve ist ein zweistufiger Prozess. Zuerst muss ein Kernel geladen werden, dann kann das Gastsystem gestartet werden. Der Linux(R)-Kernel wird mit package:sysutils/grub2-bhyve[] geladen. Erstellen Sie eine [.filename]#device.map#, damit grub die virtuellen Geräte den Dateien auf dem Hostsystem zuordnen kann:
+
+[.programlisting]
+....
+(hd0) ./linux.img
+(cd0) ./somelinux.iso
+....
+
+Benutzen Sie package:sysutils/grub2-bhyve[] um den Linux(R)-Kernel vom ISO-Abbild zu laden:
+
+[source,bash]
+....
+# grub-bhyve -m device.map -r cd0 -M 1024M linuxguest
+....
+
+Damit wird grub gestartet. Wenn die Installations-CD eine Datei namens [.filename]#grub.cfg# enthält, wird ein Menü angezeigt. Wenn nicht, müssen die Dateien [.filename]#vmlinuz# und [.filename]#initrd# manuell geladen werden:
+
+[source,bash]
+....
+grub> ls
+(hd0) (cd0) (cd0,msdos1) (host)
+grub> ls (cd0)/isolinux
+boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest
+splash.jpg TRANS.TBL vesamenu.c32 vmlinuz
+grub> linux (cd0)/isolinux/vmlinuz
+grub> initrd (cd0)/isolinux/initrd.img
+grub> boot
+....
+
+Nun, da der Linux(R)-Kernel geladen ist, kann das Gastsystem gestartet werden:
+
+[source,bash]
+....
+# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img \
+ -s 4:0,ahci-cd,./somelinux.iso -l com1,stdio -c 4 -m 1024M linuxguest
+....
+
+Das System wird booten und das Installtionsprogramm starten. Starten Sie die virtuelle Maschine nach der Installation des Betriebssystems neu. Dies führt auch dazu, dass bhyve beendet wird. Die Instanz der virtuellen Maschine muss zerstört werden, bevor sie erneut in Betrieb genommen werden kann:
+
+[source,bash]
+....
+# bhyvectl --destroy --vm=linuxguest
+....
+
+Nun kann das Gastsystem direkt von der virtuellen Festplatte gestartet werden. Laden Sie den Kernel:
+
+[source,bash]
+....
+# grub-bhyve -m device.map -r hd0,msdos1 -M 1024M linuxguest
+grub> ls
+(hd0) (hd0,msdos2) (hd0,msdos1) (cd0) (cd0,msdos1) (host)
+(lvm/VolGroup-lv_swap) (lvm/VolGroup-lv_root)
+grub> ls (hd0,msdos1)/
+lost+found/ grub/ efi/ System.map-2.6.32-431.el6.x86_64 config-2.6.32-431.el6.x
+86_64 symvers-2.6.32-431.el6.x86_64.gz vmlinuz-2.6.32-431.el6.x86_64
+initramfs-2.6.32-431.el6.x86_64.img
+grub> linux (hd0,msdos1)/vmlinuz-2.6.32-431.el6.x86_64 root=/dev/mapper/VolGroup-lv_root
+grub> initrd (hd0,msdos1)/initramfs-2.6.32-431.el6.x86_64.img
+grub> boot
+....
+
+Starten Sie die virtuelle Maschine:
+
+[source,bash]
+....
+# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \$ -s 3:0,virtio-blk,./linux.img -l com1,stdio -c 4 -m 1024M linuxguest
+....
+
+Linux(R) wird jetzt in der virtuellen Maschine gestartet und präsentiert Ihnen vielleicht einen Anmeldeprompt. Sie können sich anmelden und die virtuelle Maschine benutzen. Wenn Sie fertig sind, starten Sie die virtuelle Maschine neu, um bhyve zu verlassen. Anschließend zerstören Sie die Instanz der virtuellen Maschine:
+
+[source,bash]
+....
+# bhyvectl --destroy --vm=linuxguest
+....
+
+[[virtualization-bhyve-uefi]]
+=== bhyve virtuelle Maschinen mit UEFI Firmware booten
+
+Neben bhyveload und grub-bhyve kann der bhyve Hypervisor virtuelle Maschinen auch über die UEFI-Userspace-Firmware booten. Mit dieser Option werden Gastsysteme unterstützt, die von anderen Bootloadern nicht unterstützt werden.
+
+Um die UEFI-Unterstützung in bhyve nutzen zu können, benötigen Sie zuerst die Abbilder der UEFI-Firmware. Dazu können Sie den Port oder das Paket package:sysutils/bhyve-firmware[] installieren.
+
+Mit der Firmware an Ort und Stelle, fügen Sie die Option `-l bootrom,_/pfad/zur/firmware_` zur bhyve-Befehlszeile hinzu. Der eigentliche bhyve-Befehl könnte wie folgt lauten:
+
+[source,bash]
+....
+# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \
+-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
+-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
+-l bootrom,/usr/local/shared/uefi-firmware/BHYVE_UEFI.fd \
+guest
+....
+
+package:sysutils/bhyve-firmware[] enthält auch eine CSM-fähige Firmware, um Gastsysteme ohne UEFI-Unterstützung im alten BIOS-Modus zu booten:
+
+[source,bash]
+....
+# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \
+-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
+-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
+-l bootrom,/usr/local/shared/uefi-firmware/BHYVE_UEFI_CSM.fd \
+guest
+....
+
+[[virtualization-bhyve-framebuffer]]
+=== Graphische Framebuffer für bhyve-Gastsysteme
+
+Die Unterstützung von UEFI-Firmware ist bei graphischen Betriebssystemen, wie Microsoft Windows(R), besonders nützlich.
+
+Unterstützung für den UEFI-GOP Framebuffer kann auch über die Option `-s 29,fbuf,tcp=_0.0.0.0:5900_` aktiviert werden. Die Framebuffer-Auflösung kann mit `w=_800_` und `h=_600_` konfiguriert werden. Mit der Option `wait` können Sie bhyve anweisen, auf eine VNC-Verbindung zu warten, bevor das Gastsystem gebootet wird. Vom Host oder aus dem Netzwerk kann über das VNC-Protokoll auf den Framebuffer zugegriffen werden. Zusätzlich kann `-s 30,xhci,tablet` hinzugefügt werden, um eine präzise Mauszeigersynchronisation mit dem Host zu gewährleisten.
+
+Der daraus resultierende Befehl würde so aussehen:
+
+[source,bash]
+....
+# bhyve -AHP -s 0:0,hostbridge -s 31:0,lpc \
+-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
+-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
+-s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait \
+-l bootrom,/usr/local/shared/uefi-firmware/BHYVE_UEFI.fd \
+-s 30,xhci,tablet \
+guest
+....
+
+Beachten Sie, dass der Framebuffer im BIOS-Modus keine Befehle mehr empfängt, sobald die Steuerung von der Firmware an das Gastsystem übergeben wird.
+
+[[virtualization-bhyve-zfs]]
+=== Verwendung von ZFS mit bhyve-Gastsystemen
+
+Wenn auf dem Host-Rechner ZFS eingerichtet ist, können Sie ZFS-Volumes anstelle eines Festplattenabbilds verwenden. Dies kann erhebliche Leistungsvorteile für das Gastsystem mit sich bringen. Ein ZFS-Volume kann wie folgt erstellt werden:
+
+[source,bash]
+....
+# zfs create -V16G -o volmode=dev zroot/linuxdisk0
+....
+
+Geben Sie das ZFS-Volume beim Start der virtuellen Maschine an:
+
+[source,bash]
+....
+# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s3:0,virtio-blk,/dev/zvol/zroot/linuxdisk0 \
+ -l com1,stdio -c 4 -m 1024M linuxguest
+....
+
+[[virtualization-bhyve-nmdm]]
+=== Konsolen in der virtuellen Maschine
+
+Es ist vorteilhaft, die bhyve-Konsole mit einem Werkzeug wie package:sysutils/tmux[] oder package:sysutils/screen[] zu bedienen. Damit ist es leicht, die Konsole zu verbinden oder zu trennen. Es ist auch möglich, die Konsole als Nullmodem-Gerät zu nutzen, auf das Sie mit `cu` zugreifen können. Laden Sie dazu das [.filename]#nmdm# Kernelmodul und ersetzen Sie `-l com1,stdio` mit `-l com1,/dev/nmdm0A`. Die [.filename]#/dev/nmdm#-Geräte werden bei Bedarf automatisch erstellt, jeweils paarweise, entsprechend den beiden Enden eines Nullmodemkabels ([.filename]#/dev/nmdm0A# und [.filename]#/dev/nmdm0B#). Weitere Informationen finden Sie in man:nmdm[4].
+
+[source,bash]
+....
+# kldload nmdm
+# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img \
+ -l com1,/dev/nmdm0A -c 4 -m 1024M linuxguest
+# cu -l /dev/nmdm0B
+Connected
+
+Ubuntu 13.10 handbook ttyS0
+
+handbook login:
+....
+
+[[virtualization-bhyve-managing]]
+=== Virtuelle Maschinen verwalten
+
+Für jede virtuelle Maschine wird unterhalb von [.filename]#/dev/vmm# ein Gerätename erzeugt. Dadurch kann der Administrator einfach feststellen, welche virtuellen Maschinen zur Zeit ausgeführt werden:
+
+[source,bash]
+....
+# ls -al /dev/vmm
+total 1
+dr-xr-xr-x 2 root wheel 512 Mar 17 12:19 ./
+dr-xr-xr-x 14 root wheel 512 Mar 17 06:38 ../
+crw------- 1 root wheel 0x1a2 Mar 17 12:20 guestname
+crw------- 1 root wheel 0x19f Mar 17 12:19 linuxguest
+crw------- 1 root wheel 0x1a1 Mar 17 12:19 otherguest
+....
+
+Mit Hilfe von `bhyvectl` kann eine virtuelle Maschine zerstört werden:
+
+[source,bash]
+....
+# bhyvectl --destroy --vm=guestname
+....
+
+[[virtualization-bhyve-onboot]]
+=== Persistente Konfiguration
+
+Um das System so zu konfigurieren, dass bhyve-Gastsysteme beim Booten gestartet werden, müssen die folgenden Konfigurationen in den jeweiligen Dateien vorgenommen werden:
+
+[.procedure]
+. [.filename]#/etc/sysctl.conf#
++
+[.programlisting]
+....
+net.link.tap.up_on_open=1
+....
+
+. [.filename]#/etc/rc.conf#
++
+[.programlisting]
+....
+cloned_interfaces="bridge0 tap0"
+ifconfig_bridge0="addm igb0 addm tap0"
+kld_list="vmm nmdm"
+....
+
+[[virtualization-host-xen]]
+== FreeBSD als Xen(TM)-Host
+
+Xen ist ein GPLv2-lizensierter https://de.wikipedia.org/wiki/Hypervisor#Klassifizierung[ Typ-1-Hypervisor] für Intel(R) und ARM(R) Architekturen. Seit FreeBSD 8.0 gibt es Unterstützung für i386(TM) und AMD(R) 64-Bit https://wiki.xenproject.org/wiki/DomU[DomU] sowie https://en.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud[Amazon EC2] unpriviligierte Domänen (virtuelle Maschinen). Dom0 priviligierte Domänen (Host) wird seit FreeBSD 11.0 unterstützt. Aus Performancegründen wurde in FreeBSD 11 die Unterstützung für paravirtualisierte Domänen (PV) zugunsten von Hardware virtualisierten Domänen (HVM) entfernt.
+
+Xen(TM) ist ein Bare-Metal-Hypervisor, was bedeutet, dass es das erste Programm ist, welches nach dem BIOS geladen wird. Anschließend wird ein spezieller priviligierter Gast namens Domain-0 (kurz `Dom0`) gestartet. Dom0 nutzt seine speziellen Privilegien, um direkt auf die zugrunde liegende Hardware zuzugreifen, was es zu einer sehr leistungsstarken Lösung macht. Es ist in der Lage, direkt auf Festplattencontroller und Netzwerkadapter zuzugreifen. Die Xen(TM) Werkzeuge zum Verwalten und Steuern des Xen(TM) Hypervisors werden auch von Dom0 zum Erstellen, Auflisten und Zerstören von VMs verwendet. Dom0 stellt virtuelle Festplatten und Netzwerkfunktionalität für unpriviligierte Domänen bereit, die oft als DomU bezeichnet werden. Dom0 kann mit der Servicekonsole anderer Hypervisor verglichen werden, wohingegen DomU die einzelnen Gast-VMs ausführt.
+
+Xen(TM) kann VMs zwischen verschiedenen Xen(TM) Servern migrieren. Wenn beide Xen-Hosts denselben zugrundeliegenden Speicher teilen, kann die Migration durchgeführt werden, ohne dass die VM zuerst heruntergefahren werden muss. Stattdessen wird die Migration live durchgeführt, während die DomU läuft. Sie brauchen daher keinen Neustart oder Ausfallzeit einplanen. Dies ist bei Wartungsarbeiten und Upgrade-Fenstern sinnvoll, um sicherzustellen, dass die von der DomU bereitgestellten Dienste weiterhin zur Verfügung stehen. Viele weitere Funktionen von Xen(TM) finden Sie im https://wiki.xenproject.org/wiki/Category:Overview[ Xen Wiki]. Sie sollten jedoch beachten, dass derzeit noch nicht alle Funktionen von FreeBSD unterstützt werden.
+
+[[virtualization-host-xen-requirements]]
+=== Hardwareanforderungen für Xen(TM) Dom0
+
+Um den Xen(TM) Hypervisor auf einem Host auszuführen, ist eine bestimmte Hardwarefunktionalität erforderlich. Hardware-virtualisierte Domänen benötigen Unterstützung für Extended Page Table (https://de.wikipedia.org/wiki/Extended_Page_Table[ EPT]) und Input/Output Memory Management Unit (https://de.wikipedia.org/wiki/IOMMU[IOMMU]) im Host-Prozessor.
+
+[NOTE]
+====
+Um ein FreeBSD Xen(TM) Dom0 betreiben zu können, muss die Maschine mit Legacy Boot (BIOS) gestartet werden.
+====
+
+[[virtualization-host-xen-dom0-setup]]
+=== Xen(TM) Dom0 Control Domain Konfiguration
+
+Benutzer von FreeBSD 11 sollten die Pakete package:emulators/xen-kernel47[] und package:sysutils/xen-tools47[] installieren. Diese Pakete basieren auf Xen Version 4.7. Mit FreeBSD-12.0 und neueren Versionen können die Pakete package:emulators/xen-kernel411[] und package:sysutils/xen-tools411[] für Xen 4.11 verwendet werden.
+
+Nach der Installation der Xen Pakete müssen die Konfigurationsdateien angepasst werden, um den Host für die Integration von Dom0 vorzubereiten. Ein Eintrag in [.filename]#/etc/sysctl.conf# deaktiviert die Begrenzung für Speicherseiten. Andernfalls lassen sich DomU VMs mit höheren Speicheranforderungen nicht ausführen.
+
+[source,bash]
+....
+# echo 'vm.max_wired=-1' >> /etc/sysctl.conf
+....
+
+Für eine andere speicherbezogene Einstellung muss in [.filename]#/etc/login.conf# die Option `memorylocked` auf `unlimited` gesetzt werden. Ansonsten kann das Erstellen von DomU-Domänen mit der Meldung `Cannot allocate memory` fehlschlagen. Nachdem Sie die Änderung in [.filename]#/etc/login.conf# gemacht haben, müssen Sie `cap_mkdb` ausführen um die Datenbank zu aktualisieren. crossref:security[security-resourcelimits,"Einschränkung von Ressourcen"] enthält hierzu ausführliche Informationen.
+
+[source,bash]
+....
+# sed -i '' -e 's/memorylocked=64K/memorylocked=unlimited/' /etc/login.conf
+# cap_mkdb /etc/login.conf
+....
+
+Fügen Sie einen Eintrag für die Xen(TM) Konsole in [.filename]#/etc/ttys# ein:
+
+[source,bash]
+....
+# echo 'xc0 "usr/libexec/getty Pc" xterm onifconsole secure' >> /etc/ttys
+....
+
+Dom0 wird durch die Auswahl eines Xen(TM)-Kernels in [.filename]#/boot/loader.conf# aktiviert. Xen(TM) benötigt von dem Hostsystem auch Ressourcen wie CPU und Speicher, sowohl für sich selbst als auch für andere DomU Domains. Wie viele Ressourcen benötigt werden, hängt von den individuellen Anforderungen und der eingesetzten Hardware ab. In diesem Beispiel werden der Dom0 8 GB Speicher und 4 virtuelle CPUs zur Verfügung gestellt. Die serielle Konsole und Protokollierung wird ebenfalls aktiviert.
+
+Benutzen Sie die folgenden Kommandos, wenn Sie die Xen 4.7 Pakete verwenden:
+
+[source,bash]
+....
+# sysrc -f /boot/loader.conf hw.pci.mcfg=0
+# sysrc -f /boot/loader.conf if_tap_load="YES"
+# sysrc -f /boot/loader.conf xen_kernel="/boot/xen"
+# sysrc -f /boot/loader.conf xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0pvh=1 console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"
+....
+
+Für Xen Version 4.11 oder höher, benutzen Sie stattdessen diese Kommandos:
+
+[source,bash]
+....
+# sysrc -f /boot/loader.conf if_tap_load="YES"
+# sysrc -f /boot/loader.conf xen_kernel="/boot/xen"
+# sysrc -f /boot/loader.conf xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0=pvh console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"
+....
+
+[TIP]
+====
+
+Protokolldateien, die Xen(TM) für die Dom0- und DomU-VMs erstellt, werden in [.filename]#/var/log/xen# gespeichert. Sie sollten dieses Verzeichnis überprüfen, falls es zu Problemen kommt.
+====
+
+Aktivieren Sie den xencommons Dienst während des Systemstarts:
+
+[source,bash]
+....
+# sysrc xencommons_enable=yes
+....
+
+Diese Einstellungen reichen zwar aus, um ein Dom0-fähiges System zu starten, allerdings fehlt es dann an Netzwerkfunktionalität für die DomU-Rechner. Um dies zu beheben, können Sie eine Netzwerkbrücke über die Netzwerkschnittstelle des Hosts herstellen, die die DomU-VMs für die Verbindung zum Netzwerk benutzen können. Ersetzen Sie _em0_ durch den Namen der Netzwerkschnittstelle des Hosts.
+
+[source,bash]
+....
+# sysrc cloned_interfaces="bridge0"
+# sysrc ifconfig_bridge0="addm em0 SYNCDHCP"
+# sysrc ifconfig_em0="up"
+....
+
+Starten Sie den Host neu, um den Xen(TM)-Kernel zu laden und den Dom0 zu starten.
+
+[source,bash]
+....
+# reboot
+....
+
+Nach dem erfolgreichen Booten des Xen(TM)-Kernels und der Anmeldung am System wird das Xen(TM)-Werkzeug `xl` verwendet, um Informationen über die Domänen anzuzeigen.
+
+[source,bash]
+....
+# xl list
+Name ID Mem VCPUs State Time(s)
+Domain-0 0 8192 4 r----- 962.0
+....
+
+Die Ausgabe bestätigt, dass der Dom0 (auch Domain-0 genannt) die ID `0` hat und ausgeführt wird. Der vorher in [.filename]#/boot/loader.conf# definierte Speicher und die virtuellen CPUs sind ebenfalls vorhanden. Weitere Informationen finden Sie in der https://www.xenproject.org/help/documentation.html[ Xen(TM) Dokumentation]. Jetzt können DomU Gast-VMs erstellt werden.
+
+[[virtualization-host-xen-domu-setup]]
+=== Xen(TM) DomU Gast-VM Konfiguration
+
+Unpriviligierte Domänen bestehen aus einer Konfigurationsdatei und virtuellen oder physikalischen Festplatten. Der virtuelle Plattenspeicher für die DomU kann aus Dateien bestehen, die mit man:truncate[1] erstellt wurden, oder ZFS Volumes wie in crossref:zfs[zfs-zfs-volume,“Volumes erstellen und zerstören”] beschrieben. In diesem Beispiel wird ein 20 GB Volume verwendet. Eine VM wird mit dem ZFS Volume erstellt, ein FreeBSD ISO-Abbild, 1 GB RAM und zwei virtuelle CPUs. Das ISO-Abbild mit den Installationsdateien wird mit man:fetch[1] heruntergeladen und lokal in der Datei [.filename]#freebsd.iso# gespeichert.
+
+[source,bash]
+....
+# fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/12.0/FreeBSD-12.0-RELEASE-amd64-bootonly.iso -o freebsd.iso
+....
+
+Ein ZFS Volume von 20 GB namens [.filename]#xendisk0# wird erstellt und dient der VM als Festplatte.
+
+[source,bash]
+....
+# zfs create -V20G -o volmode=dev zroot/xendisk0
+....
+
+Die neue DomU Gast-VM wird in einer Datei definiert. Einige spezifische Einstellungen wie Name, Tastaturbelegung und VNC-Verbindungsdetails werden ebenfalls konfiguriert. Für dieses Beispiel enthält die folgende [.filename]#freebsd.cfg# eine minimale DomU-Konfiguration:
+
+[source,bash]
+....
+# cat freebsd.cfg
+builder = "hvm" <.>
+name = "freebsd" <.>
+memory = 1024 <.>
+vcpus = 2 <.>
+vif = [ 'mac=00:16:3E:74:34:32,bridge=bridge0' ] <.>
+disk = [
+'/dev/zvol/tank/xendisk0,raw,hda,rw', <.>
+'/root/freebsd.iso,raw,hdc:cdrom,r' <.>
+]
+vnc = 1 <.>
+vnclisten = "0.0.0.0"
+serial = "pty"
+usbdevice = "tablet"
+....
+
+Erklärung der einzelnen Zeilen:
+
+<.> Dies definiert, welche Art von Virtualisierung verwendet wird. `hvm` bezieht sich auf hardwaregestützte Virtualisierung oder Hardware Virtual Machine. Gastbetriebssysteme können unverändert auf der CPU mit Virtualisierungserweiterungen laufen und bieten nahezu die gleiche Leistung wie auf physikalischer Hardware. `generic` ist der voreingestellte Wert und erstellt eine PV-Domain.
+
+<.> Der Name dieser virtuellen Maschine. Er dient zur Unterscheidung von anderen virtuellen Maschinen auf der selben Dom0. Diese Angabe ist zwingend erforderlich.
+
+<.> Die Größe an RAM in Megabytes, die der VM zur Verfügung steht. Die Größe wird vom verfügbaren Speicher des Hypervisors subtrahiert, nicht vom Speicher der Dom0.
+
+<.> Die Anzahl der virtuellen CPUs, die dem Gast zur Verfügung stehen. Für die beste Leistung sollten Sie dem Gast nicht mehr CPUs zuteilen, als die Anzahl der CPUs auf dem physikalischen Host.
+
+<.> Der virtuelle Netzwerkadapter. Dies ist die Brücke, die mit der Netzwerkschnittstelle des Hosts verbunden ist. Der Parameter `mac` definiert die MAC-Adresse der virtuellen Schnittstelle. Dieser Parameter ist optional. Falls keine MAC definiert ist, wird Xen(TM) eine zufällige MAC generieren.
+
+<.> Der vollständige Pfad zur Festplatte, Datei, oder ZFS Volume für den Plattenspeicher dieser VM. Optionen und Festplattendefinitionen werden durch Kommata getrennt.
+
+<.> Das Boot-Medium, aus dem das initiale Betriebssystem installiert wird. In diesem Beispiel wird das zuvor heruntergeladene ISO-Abbild benutzt. Andere Geräte und weitere Optionen sind in der Xen(TM) Dokumentation beschrieben.
+
+<.> Optionen, die die VNC-Konnektivität der seriellen Konsole der DomU steuern. Dabei handelt es sich um die aktive VNC-Unterstützung, die verwendete IP-Adresse, der Gerätename der seriellen Konsole und die Eingabemethoden für Maus, Tastatur und andere Geräte. `keymap` konfiguriert die Tastaturbelegung, die in der Voreinstellung `english` ist.
+
+Nachdem die Konfigurationsdatei mit allen notwendigen Optionen erstellt wurde, wird die DomU erstellt, indem die Datei als Parameter an `xl` übergeben wird.
+
+[source,bash]
+....
+# xl create freebsd.cfg
+....
+
+[NOTE]
+====
+Jedes mal, wenn die Dom0 neu gestartet wird, muss die Konfigurationsdatei nochmals an `xl` übergeben werden, um die DomU neu zu erstellen. In der Voreinstellung wird nur die Dom0 nach einem Neustart angelegt, nicht die einzelnen VMs. Die VMs können dort fortfahren, wo sie aufgehört haben, weil sie das Betriebssystem auf der virtuellen Festplatte gespeichert haben. Die Konfiguration der virtuellen Maschine kann sich mit der Zeit ändern (bspw. beim Hinzufügen von mehr Arbeitsspeicher). Die Konfigurationsdateien der virtuellen Maschinen müssen ordnungsgemäß gesichert und vorgehalten werden, um die Gast-VM bei Bedarf neu erstellen zu können.
+====
+
+Die Ausgabe von `xl list` bestätigt, dass die DomU erstellt wurde.
+
+[source,bash]
+....
+# xl list
+Name ID Mem VCPUs State Time(s)
+Domain-0 0 8192 4 r----- 1653.4
+freebsd 1 1024 1 -b---- 663.9
+....
+
+Um die Installation des Basis-Betriebssystems zu beginnen, starten Sie den VNC-Client und verbinden Sie sich mit Netzwerkadresse des Hosts oder mit der IP-Adresse, die auf der Zeile `vnclisten` in [.filename]#freebsd.cfg# konfiguriert wurde. Nachdem das Betriebssystem installiert ist, fahren Sie die DomU herunter und trennen den VNC-Viewer. Bearbeiten Sie dann die [.filename]#freebsd.cfg#, entfernen Sie die Zeile mit der `cdrom` Definiton, oder kommentieren Sie die Zeile mit `#` aus. Um diese neue Konfiguration zu laden, ist es notwendig, die alte DomU mit `xl` zu zerstören, indem Sie entweder den Namen oder die ID als Parameter übergeben. Danach kann die DomU mit der angepassten [.filename]##freebsd.cfg## neu erstellt werden.
+
+[source,bash]
+....
+# xl destroy freebsd
+# xl create freebsd.cfg
+....
+
+Auf die Maschine kann jetzt wieder mit dem VNC-Viewer zugegriffen werden. Dieses mal wird sie von einer virtuellen Festplatte booten, auf der das Betriebssystem installiert wurde. Die virtuelle Maschine kann nun verwendet werden.
+
+[[virtualization-host-xen-troubleshooting]]
+=== Fehlerbehebung
+
+Dieser Abschnitt enthält grundlegende Informationen, um Probleme zu beheben, die bei der Verwendung von FreeBSD als Host oder Gast von Xen(TM) auftreten können.
+
+[[virtualization-host-xen-troubleshooting-host]]
+==== Fehlerbehebung beim Booten des Hosts
+
+Bitte beachten Sie, dass die folgenden Tipps zur Fehlerbehebung für Xen(TM) 4.11 oder neuer gedacht sind. Wenn Sie noch Xen(TM) 4.7 benutzen und Probleme haben, sollten Sie die Migration auf eine neuere Version in Betracht ziehen.
+
+Um Probleme beim Booten des Hosts zu beheben, benötigen Sie wahrscheinlich ein serielles Kabel oder ein USB-Kabel. Ausführliche Informationen während des Bootens erhalten Sie, wenn Sie die Option `xen_cmdline` in [.filename]#loader.conf# hinzufügen. Einige relevante Optionen sind:
+
+* `iommu=debug`: kann benutzt werden, um zusätzliche Informationen über das iommu auszugeben.
+* `dom0=verbose`: kann benutzt werden, um zusätzliche Informationen über den dom0 Build Prozess auszugeben.
+* `sync_console`: diese Option erzwingt eine synchrone Konsolenausgabe. Dies ist sehr nützlich für die Fehlersuche, um den Verlust von Nachrichten durch die Begrenzung zu vermeiden. Verwenden Sie diese Option niemals in produktiven Umgebungen, da sie es böswilligen Gästen ermöglichen kann, DoS-Angriffe gegen Xen(TM) über die Konsole durchzuführen.
+
+Um Probleme zu identifizieren, sollte FreeBSD beim Booten ebenfalls detaillierte Informationen anzeigen. Dies können Sie wie folgt aktivieren:
+
+[source,bash]
+....
+# sysrc -f /boot/loader.conf boot_verbose="YES"
+....
+
+Wenn keine dieser Optionen zur Lösung des Problems beiträgt, senden Sie bitte das serielle Bootprotokoll zur weiteren Analyse an mailto:freebsd-xen@FreeBSD.org[freebsd-xen@FreeBSD.org] und mailto:xen-devel@lists.xenproject.org[xen-devel@lists.xenproject.org].
+
+[[virtualization-host-xen-troubleshooting-guest]]
+==== Fehlerbehebung beim Erstellen von Gastsystemen
+
+Die folgenden Informationen können helfen, Probleme beim Erstellen von Gastsystemen zu diagnostizieren.
+
+Die häufigste Ursache für Fehler beim Erstellen von Gastsystemen ist der `xl` Befehl, der einen Fehler generiert und mit einem Rückgabewert ungleich 0 endet. Wenn der angezeigte Fehler nicht ausreicht, um das Problem zu identifizieren, kann auch eine umfangreichere Ausgabe von `xl` erhalten werden, indem die Option `v` wiederholt verwendet wird.
+
+[source,bash]
+....
+# xl -vvv create freebsd.cfg
+Parsing config from freebsd.cfg
+libxl: debug: libxl_create.c:1693:do_domain_create: Domain 0:ao 0x800d750a0: create: how=0x0 callback=0x0 poller=0x800d6f0f0
+libxl: debug: libxl_device.c:397:libxl__device_disk_set_backend: Disk vdev=xvda spec.backend=unknown
+libxl: debug: libxl_device.c:432:libxl__device_disk_set_backend: Disk vdev=xvda, using backend phy
+libxl: debug: libxl_create.c:1018:initiate_domain_create: Domain 1:running bootloader
+libxl: debug: libxl_bootloader.c:328:libxl__bootloader_run: Domain 1:not a PV/PVH domain, skipping bootloader
+libxl: debug: libxl_event.c:689:libxl__ev_xswatch_deregister: watch w=0x800d96b98: deregister unregistered
+domainbuilder: detail: xc_dom_allocate: cmdline="", features=""
+domainbuilder: detail: xc_dom_kernel_file: filename="/usr/local/lib/xen/boot/hvmloader"
+domainbuilder: detail: xc_dom_malloc_filemap : 326 kB
+libxl: debug: libxl_dom.c:988:libxl__load_hvm_firmware_module: Loading BIOS: /usr/local/shared/seabios/bios.bin
+...
+....
+
+Wenn die ausführliche Ausgabe nicht bei der Diagnose des Problems hilft, gibt es auch noch die Protokolle des QEMU und Xen(TM) Toolstacks in [.filename]#/var/log/xen#. Beachten Sie, dass der Name der Domäne an den Protokollnamen angehängt wird. Wenn die Domäne also `freebsd` heißt, sollten Sie wahrscheinlich die Dateien [.filename]#/var/log/xen/xl-freebsd.log# und [.filename]#/var/log/xen/qemu-dm.freebsd.log# finden. Beide Dateien können nützliche Informationen zur Fehlerbehebung enthalten. Wenn nichts davon zur Lösung des Problems beiträgt, senden Sie bitte die Beschreibung des Problems und so viele Informationen wie möglich an mailto:freebsd-xen@FreeBSD.org[freebsd-xen@FreeBSD.org] und mailto:xen-devel@lists.xenproject.org[xen-devel@lists.xenproject.org], um Hilfe zu erhalten.
diff --git a/documentation/content/de/books/handbook/x11/_index.adoc b/documentation/content/de/books/handbook/x11/_index.adoc
new file mode 100644
index 0000000000..d12510b555
--- /dev/null
+++ b/documentation/content/de/books/handbook/x11/_index.adoc
@@ -0,0 +1,1411 @@
+---
+title: Kapitel 5. Das X-Window-System
+part: Teil I. Erste Schritte
+prev: books/handbook/ports
+next: books/handbook/partii
+---
+
+[[x11]]
+= Das X-Window-System
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 5
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/x11/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/x11/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/x11/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+[[x11-synopsis]]
+== Übersicht
+
+Bei einer Installation von FreeBSD mit bsdinstall wird nicht automatisch eine grafische Benutzeroberfläche installiert. Dieses Kapitel beschreibt die Installation und Konfiguration von Xorg, das eine grafische Umgebung über das quelloffene X-Window-System zur Verfügung stellt. Weiterhin wird beschrieben, wie Sie eine Desktop-Umgebung oder einen Window Manager finden und installieren können.
+
+[NOTE]
+====
+Benutzer die eine Installationsmethode bevorzugen, welche automatisch Xorg konfiguriert, sollten sich https://www.furybsd.org[FuryBSD], https://ghostbsd.org[GhostBSD] oder https://www.midnightbsd.org[MidnightBSD] ansehen.
+====
+
+Weitere Informationen über Video-Hardware, die von Xorg unterstützt wird, finden Sie auf der http://www.x.org/[x.org] Webseite.
+
+Nachdem Sie dieses Kapitel gelesen haben, werden Sie
+
+* Die Komponenten des X-Window-Systems und ihr Zusammenspiel kennen.
+* Wissen, wie Xorg installiert und konfiguriert wird.
+* Wissen, wie verschiedene Window-Manager und Desktop-Umgebungen installiert und konfiguriert werden.
+* Wissen, wie TrueType(R)-Schriftarten mit Xorg benutzt werden.
+* Wissen, wie Sie die grafische Anmeldung (XDM) einrichten.
+
+Bevor Sie dieses Kapitel lesen, sollten Sie
+
+* Wissen, wie Sie Software Dritter, wie in crossref:ports[ports,Installieren von Anwendungen: Pakete und Ports] beschrieben, installieren.
+
+[[x-understanding]]
+== Terminologie
+
+Obwohl es nicht nötig ist, alle Details der verschiedenen Komponenten des X Window Systems und deren Zusammenspiel zu kennen, kann es trotzdem nützlich sein die Grundlagen dieser Komponenten zu verstehen:
+
+X-Server::
+X wurde von Anfang an netzwerktransparent entworfen und verwendet ein "Client-Server-Modell". In diesem Modell läuft der "X-Server" auf dem Rechner, an dem die Tastatur, der Bildschirm und die Maus angeschlossen ist. Der Server ist für Dinge wie die Verwaltung des Bildschirms und die Verarbeitung von Tastatur- und Maus-Eingaben sowie anderer Ein- und Ausgabegeräte, wie beispielsweise ein Tablet oder ein Videoprojektor, verantwortlich. Dieses Modell verwirrt viele Leute, die erwarten, dass der "X-Server" der leistungsstarke Rechner im Maschinenraum und der "X-Client" ihr Arbeitsplatzrechner ist.
+
+X-Client::
+Jede X-Anwendung, wie beispielsweise XTerm oder Firefox ist ein "X-Client". Der Client sendet dem Server Nachrichten wie "Zeichne an diesen Koordinaten ein Fenster" und der Server sendet dem Client Nachrichten der Art "Der Benutzer hat gerade den Ok-Knopf gedrückt".
++
+In kleinen Umgebungen laufen der X-Server und die X-Clients auf demselben Rechner. Es ist auch möglich, den X-Server auf einem weniger leistungsfähigen Rechner laufen zu lassen und die X-Anwendungen auf einem leistungsfähigeren Rechner zu betreiben. In diesem Fall kommunizieren der X-Server und die X-Clients über das Netzwerk.
+
+Window-Manager::
+X schreibt nicht vor, wie Fenster auf dem Bildschirm auszusehen haben, wie sie mit der Maus zu verschieben sind, welche Tastenkombinationen benutzt werden sollen um zwischen den Fenstern zu wechseln, wie die Fensterrahmen aussehen, oder ob diese Schaltflächen zum schließen haben. Stattdessen gibt X die Verantwortung für all diese Sachen an eine separate _Window-Manager_ Anwendung ab. Es stehen http://www.xwinman.org/[zahlreiche Window-Manager] zur Verfügung. Jeder Window-Manager bietet ein anderes Erscheinungsbild: einige unterstützen virtuelle Bildschirme, andere erlauben Tastenkombinationen zur Verwaltung des Bildschirms. Einige besitzen eine "Start" Schaltfläche und in manchen lässt sich das Aussehen und Verhalten der Anwendung über Themes beliebig einstellen. Window-Manager stehen in der Kategorie [.filename]#x11-wm# der Ports-Sammlung zur Verfügung.
++
+Jeder Window-Manager wird unterschiedlich konfiguriert. Einige erwarten eine manuell erstellte Konfigurationsdatei, während andere ein grafisches Werkzeug für die meisten Konfigurationsarbeiten anbieten.
+
+Desktop-Umgebungen::
+KDE und GNOME werden als Desktop-Umgebungen bezeichnet, da sie eine ganze Reihe von Anwendungen für typische Desktop-Aufgaben enthalten. Dazu zählen beispielsweise Office-Pakete, Webbrowser und Spiele.
+
+Fokus::
+Der Window-Manager ist für die Methode verantwortlich, mit der ein Fenster den Fokus bekommt. Jedes System, das Fenster verwendet muss entscheiden, wie ein Fenster aktiviert wird, damit es Eingaben empfangen kann. Das aktive Fenster sollte zudem sichtbar gekennzeichnet werden.
++
+Eine Methode wird "click-to-focus" genannt. Ein Fenster wird aktiv, wenn es mit der Maus angeklickt wird. Eine weitere Methode ist "focus-follows-mouse". Hier hat liegt der Fokus auf dem Fenster, auf dem sich der Mauszeiger befindet. Wird der Mauszeiger in ein anderes Fenster bewegt, so erhält dieses Fenster den Fokus. Eine dritte Methode ist "sloppy-focus". Hier wechselt der Fokus nur dann, wenn sich der Mauszeiger in ein neues Fenster bewegt und nicht, wenn er das aktive Fenster verlässt. Ist der Mauszeiger auf der Desktop Oberfläche, so bleibt der Fokus auf dem zuletzt verwendeten Fenster. Bei der Methode "click-to-focus" wird das aktive Fenster durch einen Mausklick festgelegt. Dabei kann das Fenster vor alle anderen Fenster gesetzt werden. Alle Eingaben werden dann, unabhängig von der Position des Mauszeigers, dem aktiven Fenster zugeordnet.
++
+Die verschiedenen Window-Manager unterstützen noch andere Methoden. Alle unterstützen jedoch "click-to-focus" und die meisten von ihnen auch die anderen Methoden. Lesen Sie die Dokumentation des Window-Managers um festzustellen, welche Methoden zur Verfügung stehen.
+
+Widgets::
+_Widget_ bezeichnet Objekte, die in irgendeiner Weise geklickt oder manipuliert werden können. Dazu gehören buttons (Schaltflächen), check buttons (Schaltfläche für Mehrfachauswahlen), radio buttions (Schaltfläche für Einfachauswahlen), Icons und Auswahllisten. Eine Widget-Sammlung ist eine Reihe von Widgets, die verwendet werden um grafische Anwendungen zu erstellen. Es gibt mehrere populäre Widget-Sammlungen, einschließlich Qt, das von KDE benutzt wird, und GTK+, das von GNOME benutzt wird. Als Folge dessen, haben Anwendungen einen bestimmten look and feel, je nachdem welche Widget-Sammlung benutzt wurde, um die Anwendung zu erstellen.
+
+[[x-install]]
+== Xorg installieren
+
+In FreeBSD kann Xorg als Paket oder Port installiert werden.
+
+Die Installation des Pakets ist zwar schneller, dafür können weniger Optionen angepasst werden:
+
+[source,bash]
+....
+# pkg install xorg
+....
+
+Die nachstehenden Kommandos bauen und installieren Xorg aus der Ports-Sammlung:
+
+[source,bash]
+....
+# cd /usr/ports/x11/xorg
+# make install clean
+....
+
+Bei beiden Vorgehensweisen wird ein vollständiges Xorg-System installiert. Für die meisten Anwender ist die Installation des Binärpakets die bessere Option.
+
+Eine kleinere Version des Xorg-Systems für erfahrene Anwender ist mit package:x11/xorg-minimal[] verfügbar. Die meisten Dokumente, Bibliotheken und Anwendungen werden hierbei nicht installiert. Einige Anwendungen erfordern jedoch diese zusätzlichen Komponenten, um ordnungsgemäß zu funktionieren.
+
+[[x-config]]
+== Xorg konfigurieren
+
+[[x-config-quick-start]]
+=== Schnellstartanleitung
+
+Xorg unterstützt die meisten gängigen Grafikkarten, Tastaturen und Zeigegeräte.
+
+[TIP]
+====
+
+Grafikkarten, Monitore und Eingabegeräte werden automatisch erkannt und müssen nicht manuell konfiguriert werden. Erstellen Sie keine [.filename]#xorg.conf# und führen Sie nicht `-configure` aus, es sei denn, die automatische Konfiguration schlägt fehl.
+====
+
+[.procedure]
+. Wenn Xorg bereits zuvor auf diesem Computer verwendet wurde, verschieben oder entfernen Sie alle vorhandenen Konfigurationsdateien:
++
+[source,bash]
+....
+# mv /etc/X11/xorg.conf ~/xorg.conf.etc
+# mv /usr/local/etc/X11/xorg.conf ~/xorg.conf.localetc
+....
+
+. Fügen Sie die Benutzer, die Xorg verwenden, zur Gruppe `video` oder `wheel` hinzu, um die 3D-Beschleunigung zu aktivieren. Um den Benutzer _jru_ in eine der verfügbaren Gruppen hinzuzufügen:
++
+[source,bash]
+....
+# pw groupmod video -m jru || pw groupmod wheel -m jru
+....
+
+. Der Window-Manager `twm` ist standardmäßig enthalten und wird auch gestartet, wenn Xorg startet:
++
+[source,bash]
+....
+% startx
+....
+
+. Auf einigen älteren Versionen von FreeBSD muss die Systemkonsole auf man:vt[4] eingestellt sein, damit der Wechsel auf die Konsole ordnungsgemäß funktioniert. Informationen dazu finden Sie im <<x-config-kms>>.
+
+[[x-config-user-group]]
+=== Benutzergruppen für Grafikbeschleunigung
+
+Um die 3D-Beschleunigung für Grafikkarten zu ermöglichen, ist der Zugriff auf [.filename]#/dev/dri# notwendig. In der Regel ist es am einfachsten, die Benutzer zur Gruppe `video` oder `wheel` hinzuzufügen. In diesem Beispiel wird man:pw[8] verwendet, um den Benutzer _slurms_ zu der Gruppe `video` hinzuzufügen, bzw. zur Gruppe `wheel`, falls die Gruppe `video` nicht existiert:
+
+[source,bash]
+....
+# pw groupmod video -m slurms || pw groupmod wheel -m slurms
+....
+
+[[x-config-kms]]
+=== Kernel Mode Setting (KMS)
+
+Wenn der Computer die Anzeige von der Konsole auf eine höhere Bildschirmauflösung für X umstellt, muss der Videoausgabe-Modus eingestellt werden. Neuere Versionen von Xorg verwenden dazu ein System innerhalb des Kernels, um diesen Modus effizienter zu ändern. Ältere Versionen von FreeBSD verwenden dafür man:sc[4], welches jedoch nicht mit dem KMS-System umgehen kann. Das führt dazu, dass nach dem Schließen von X die Konsole leer bleibt, obwohl sie weiterhin funktioniert. Die neuere man:vt[4] Konsole vermeidet dieses Problem.
+
+Fügen Sie diese Zeile in [.filename]#/boot/loader.conf# ein um man:vt[4] zu aktivieren:
+
+[.programlisting]
+....
+kern.vty=vt
+....
+
+[[x-config-files]]
+=== Konfigurationsdateien
+
+Eine manuelle Konfiguration ist in der Regel nicht erforderlich. Bitte erstellen Sie keine manuellen Konfigurationsdateien, es sei denn, die automatische Konfiguration funktioniert nicht.
+
+[[x-config-files-directory]]
+==== Verzeichnis
+
+Xorg sucht in verschiedenen Verzeichnissen nach Konfigurationsdateien. Unter FreeBSD ist [.filename]#/usr/local/etc/X11/# das bevorzugte Verzeichnis für diese Dateien. Die Verwendung dieses Verzeichnisses hilft dabei, Anwendungsdateien vom Betriebssystem getrennt zu halten.
+
+Das Speichern von Konfigurationsdateien unter [.filename]#/etc/X11/# funktioniert immer noch, allerdings vermischt diese Methode Anwendungsdateien mit Dateien des Basissystems und wird daher nicht empfohlen.
+
+[[x-config-files-single-or-multiple]]
+==== Einzelne oder mehrere Dateien
+
+Anstatt die traditionelle [.filename]#xorg.conf# zu verwenden, ist es einfacher, mehrere Dateien, die jeweils eine bestimmte Einstellung konfigurieren, zu verwenden. Diese Dateien werden im Unterverzeichnis [.filename]#xorg.conf.d/# des Hauptverzeichnisses gespeichert. Der vollständige Pfad ist normalerweise [.filename]#/usr/local/etc/X11/xorg.conf.d/#.
+
+Beispiele für diese Dateien werden später in diesem Abschnitt vorgestellt.
+
+Die traditionelle, einzelne [.filename]#xorg.conf# funktioniert weiterhin, ist jedoch nicht so übersichtlich und flexibel wie die Verwendung von mehreren Dateien im Unterverzeichnis [.filename]#xorg.conf.d/#.
+
+[[x-config-video-cards]]
+=== Grafikkarten
+
+Aufgrund von Änderungen in neueren Versionen von FreeBSD ist es nun möglich, Grafiktreiber zu benutzen, die aus der Ports-Sammlung oder als Pakete bereitgestellt werden. Die folgenden Treiber sind mit package:graphics/drm-kmod[] verfügbar:
+
+[[x-config-video-cards-ports]]
+Intel KMS driver::
+2D- und 3D-Beschleunigung wird auf den meisten Intel KMS driver Grafikkarten von Intel(R) unterstützt.
++
+Name des Treibers: `i915kms`
++
+2D- und 3D-Beschleunigung wird auf den meisten älteren Radeon KMS driver Grafikkarten von AMD(R) unterstützt.
++
+Name des Treibers: `radeonkms`
++
+2D- und 3D-Beschleunigung wird auf den meisten neueren AMD KMS driver Grafikkarten von AMD(R) unterstützt.
++
+Name des Treibers: `amdgpu`
++
+Eine Liste der unterstützten GPUs finden Sie unter https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units[] und https://en.wikipedia.org/wiki/List_of_AMD_graphics_processing_units[].
+
+[[x-config-video-cards-intel]]
+Intel(R)::
+3D-Beschleunigung wird von den meisten Intel(R)-Grafikkarten unterstützt, einschließlich Ivy Bridge (HD Graphics 2500, 4000 und P4000), Iron Lake (HD Graphics) und Sandy Bridge (HD Graphics 2000).
++
+Treibername: `intel`
++
+Weitere Informationen finden Sie unter https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units[].
+
+[[x-config-video-cards-radeon]]
+AMD(R) Radeon::
+2D- und 3D-Beschleunigung wird von den meisten Radeon-Karten bis zur HD6000-Serie unterstützt.
++
+Treibername: `radeon`
++
+Weitere Informationen finden Sie unter https://en.wikipedia.org/wiki/List_of_AMD_graphics_processing_units[].
+
+[[x-config-video-cards-nvidia]]
+NVIDIA::
+Verschiedene NVIDIA Treiber sind in der Kategorie [.filename]#x11# der Ports-Sammlung enthalten. Installieren Sie den Treiber, der für die Grafikkarte benötigt wird.
++
+Weitere Informationen finden Sie unter https://en.wikipedia.org/wiki/List_of_Nvidia_graphics/processing_units[].
+
+[[x-config-video-cards-hybrid]]
+Hybride Kombinationen::
+Einige Notebooks besitzen zusätzlich zum Chipsatz oder Prozessor einen Grafikprozessor. _Optimus_ kombiniert Intel(R) und NVIDIA Hardware. _Umschaltbare Grafik_ bzw. _Hybride Grafik_ ist eine Kombination aus Intel(R), oder AMD(R) Prozessor mit AMD(R) Radeon GPU.
++
+Die Implementierungen dieser Hybrid-Grafik-Systeme variieren und Xorg in FreeBSD ist nicht in der Lage, alle Versionen der Hardware zu betreiben.
++
+Einige Computer bieten jedoch eine BIOS-Option, um eine der beiden Grafikkarten zu deaktivieren oder den _diskreten_ Modus einzuschalten. Zum Beispiel ist es manchmal möglich, die NVIDIA GPU in einem Optimus-System zu deaktivieren. Intel(R) Video kann dann mit einem Intel(R) Treiber verwendet werden.
++
+Die BIOS-Einstellungen sind abhängig vom Modell des Computers. In manchen Situationen können beide GPUs aktiviert bleiben. Um solch ein System lauffähig zu machen genügt es bereits, nur die Haupt-GPU im Abschnitt `Device` der Konfigurationsdatei zu setzen.
+
+[[x-config-video-cards-other]]
+Andere Grafikkarten::
+Treiber für weniger gebräuchliche Grafikkarten finden Sie in der Kategorie [.filename]#x11-drivers# der Ports-Sammlung.
++
+Karten, die nicht durch einen speziellen Treiber unterstützt werden, sind vielleicht noch mit dem Treiber package:x11-drivers/xf86-video-vesa[] nutzbar. Dieser Treiber wird von package:x11/xorg[] installiert. Der Treiber kann auch manuell als package:x11-drivers/xf86-video-vesa[] installiert werden. Xorg versucht immer diesen Treiber zu verwenden, wenn für die Grafikkarte kein passender Treiber gefunden wird.
++
+package:x11-drivers/xf86-video-scfb[] ist ein ähnlicher Treiber, der mit vielen UEFI und ARM(R) Computern funktioniert.
+
+[[x-config-video-cards-file]]
+Video-Treiber über eine Datei einstellen::
+Den Intel(R) Treiber in einer Konfigurationsdatei einstellen:
++
+[[x-config-video-cards-file-intel]]
+.Den Intel(R) Treiber über eine Datei auswählen
+[example]
+====
+
+[.filename]#/usr/local/etc/X11/xorg.conf.d/driver-intel.conf#
+
+[.programlisting]
+....
+Section "Device"
+ Identifier "Card0"
+ Driver "intel"
+ # BusID "PCI:1:0:0"
+EndSection
+....
+
+Wenn mehr als eine Grafikkarte vorhanden ist, kann der Eintrag `BusID` verwendet werden, um die gewünschte Karte auszuwählen. Eine Liste der `BusID`s der Grafikkarten kann mit `pciconf -lv | grep -B3 display` ausgegeben werden.
+====
++
+Den Radeon Treiber in einer Konfigurationsdatei einstellen:
++
+[[x-config-video-cards-file-radeon]]
+.Den Radeon Treiber über eine Datei auswählen
+[example]
+====
+
+[.filename]#/usr/local/etc/X11/xorg.conf.d/driver-radeon.conf#
+
+[.programlisting]
+....
+Section "Device"
+ Identifier "Card0"
+ Driver "radeon"
+EndSection
+....
+
+====
++
+Den VESA Treiber in einer Konfigurationsdatei einstellen:
++
+[[x-config-video-cards-file-vesa]]
+.Den VESA Treiber über eine Datei auswählen
+[example]
+====
+
+[.filename]#/usr/local/etc/X11/xorg.conf.d/driver-vesa.conf#
+
+[.programlisting]
+....
+Section "Device"
+ Identifier "Card0"
+ Driver "vesa"
+EndSection
+....
+
+====
++
+Den Treiber `scfb` für UEFI- oder ARM(R)-Computer auswählen:
++
+[[x-config-video-cards-file-scfb]]
+.Den `scfb` Treiber über eine Datei auswählen
+[example]
+====
+
+[.filename]#/usr/local/etc/X11/xorg.conf.d/driver-scfb.conf#
+
+[.programlisting]
+....
+Section "Device"
+ Identifier "Card0"
+ Driver "scfb"
+EndSection
+....
+
+====
+
+[[x-config-monitors]]
+=== Monitore
+
+Fast alle Monitore unterstützen den Extended Display Identification Data Standard (EDID). Xorg verwendet EDID um mit dem Monitor zu kommunizieren und die unterstützten Auflösungen und Bildwiederholfrequenzen zu erkennen. Xorg wählt dann die für den Monitor am besten geeignete Kombination von Einstellungen.
+
+Weitere vom Monitor unterstützte Auflösungen, können in der Konfigurationsdatei, oder nach dem Start des X-Servers mit man:xrandr[1] gesetzt werden.
+
+[[x-config-monitors-xrandr]]
+man:xrandr[1] benutzen::
+Führen Sie man:xrandr[1] ohne Parameter aus, um eine Liste von Video-Ausgängen und erkannten Monitor-Modi zu sehen:
++
+[source,bash]
+....
+% xrandr
+Screen 0: minimum 320 x 200, current 3000 x 1920, maximum 8192 x 8192
+DVI-0 connected primary 1920x1200+1080+0 (normal left inverted right x axis y axis) 495mm x 310mm
+ 1920x1200 59.95*+
+ 1600x1200 60.00
+ 1280x1024 85.02 75.02 60.02
+ 1280x960 60.00
+ 1152x864 75.00
+ 1024x768 85.00 75.08 70.07 60.00
+ 832x624 74.55
+ 800x600 75.00 60.32
+ 640x480 75.00 60.00
+ 720x400 70.08
+DisplayPort-0 disconnected (normal left inverted right x axis y axis)
+HDMI-0 disconnected (normal left inverted right x axis y axis)
+....
++
+Die Auflistung zeigt, dass der `DVI-0` Ausgang benutzt wird, um eine Bildschirmauflösung von 1920x1200 bei einer Bildwiederholrate von 60 Hz anzuzeigen. An den Anschlüssen `DisplayPort-0` und `HDMI-0` sind keine Monitore angeschlossen.
++
+Die anderen Anzeigemodi können mit man:xrandr[1] ausgewählt werden. Um beispielsweise auf 1280x1024 bei 60 Hz umzuschalten:
++
+[source,bash]
+....
+% xrandr --mode 1280x1024 --rate 60
+....
++
+Häufig wird für einen Videoprojektor der externe Videoausgang eines Notebooks verwendet.
++
+Die Typen und Anzahl der Videoanschlüsse variiert zwischen den Geräten und auch die Ausgabe variiert von Treiber zu Treiber. Was für den einen Treiber `HDMI-1` ist, nennt ein anderer Treiber vielleicht `HDMI1`. Führen Sie daher zunächst man:xrandr[1] aus, um alle verfügbaren Anschlüsse aufzulisten.
++
+[source,bash]
+....
+% xrandr
+Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
+LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 344mm x 193mm
+ 1366x768 60.04*+
+ 1024x768 60.00
+ 800x600 60.32 56.25
+ 640x480 59.94
+VGA1 connected (normal left inverted right x axis y axis)
+ 1280x1024 60.02 + 75.02
+ 1280x960 60.00
+ 1152x864 75.00
+ 1024x768 75.08 70.07 60.00
+ 832x624 74.55
+ 800x600 72.19 75.00 60.32 56.25
+ 640x480 75.00 72.81 66.67 60.00
+ 720x400 70.08
+HDMI1 disconnected (normal left inverted right x axis y axis)
+DP1 disconnected (normal left inverted right x axis y axis)
+....
++
+Vier Ausgänge wurden gefunden: das integrierte Panel `LVDS1`, sowie die externen Anschlüsse `VGA1`, `HDMI1` und `DP1`.
++
+Der Videoprojektor wurde am Ausgang `VGA1` angeschlossen. man:xrandr[1] wird nun verwendet, um diese Ausgabe auf die native Auflösung des Projektors einzustellen und den zusätzlichen Platz auf der rechten Seite des Desktops hinzuzufügen:
++
+[source,bash]
+....
+% xrandr --output VGA1 --auto --right-of LVDS1
+....
++
+`--auto` wählt die Auflösung und Aktualisierungsrate die von EDID ermittelt wurden. Wenn die Auflösung nicht richtig ermittelt wurde, kann ein fester Wert mit `--mode` anstelle von `--auto` angegeben werden. Beispielsweise können die meisten Projektoren mit einer Auflösung von 1024x768 betrieben werden, die mit `--mode 1024x768` gesetzt wird.
++
+man:xrandr[1] wird häufig aus [.filename]#.xinitrc# ausgeführt, um den entsprechenden Modus zu setzen wenn X startet.
+
+[[x-config-monitors-files]]
+Bildschirmauflösung über eine Datei einstellen::
+Eine Bildschirmauflösung von 1024x768 in einer Konfigurationsdatei einstellen:
++
+.Die Bildschirmauflösung in eine Datei schreiben
+[example]
+====
+
+[.filename]#/usr/local/etc/X11/xorg.conf.d/screen-resolution.conf#
+
+[.programlisting]
+....
+Section "Screen"
+ Identifier "Screen0"
+ Device "Card0"
+ SubSection "Display"
+ Modes "1024x768"
+ EndSubSection
+EndSection
+....
+
+====
++
+Die wenigen Monitore, die EDID nicht beherrschen, können durch setzen von `HorizSync` und `VertRefresh` auf den Bereich der vom Monitor unterstützten Frequenzen konfiguriert werden.
++
+.Manuelles Einstellen der Monitorfrequenzen
+[example]
+====
+
+[.filename]#/usr/local/etc/X11/xorg.conf.d/monitor0-freq.conf#
+
+[.programlisting]
+....
+Section "Monitor"
+ Identifier "Monitor0"
+ HorizSync 30-83 # kHz
+ VertRefresh 50-76 # Hz
+EndSection
+....
+
+====
+
+[[x-config-input]]
+=== Eingabegeräte
+
+[[x-config-input-keyboard]]
+==== Tastaturen
+
+[[x-config-input-keyboard-layout]]
+Tastaturlayout::
+Die standardisierte Position von Tasten auf einer Tastatur wird als _Layout_ bezeichnet. Layouts und andere einstellbare Parameter werden in man:xkeyboard-config[7] beschrieben.
++
+In der Voreinstellung ist ein US-amerikanisches Layout aktiv. Um ein alternatives Layout zu wählen, setzen Sie die Optionen `XkbLayout` und `XkbVariant` in der Klasse `InputClass`. Dies wird für alle Eingabegeräte der entsprechenden Klasse angewendet werden.
++
+Dieses Beispiel konfiguriert ein deutsches Tastaturlayout.
++
+.Konfiguration eines Tastaturlayouts
+[example]
+====
+
+[.filename]#/usr/local/etc/X11/xorg.conf.d/keyboard-de.conf#
+
+[.programlisting]
+....
+Section "InputClass"
+ Identifier "KeyboardDefaults"
+ MatchIsKeyboard "on"
+ Option "XkbLayout" "de"
+EndSection
+....
+
+====
++
+.Konfiguration mehrerer Tastaturlayouts
+[example]
+====
+
+Hier werden die Tastaturlayouts für Vereinigte Staaten, Spanien und Ukraine gesetzt. Mit kbd:[Alt+Shift] können Sie zwischen den einzelnen Layouts wechseln. Für eine verbesserte Steuerung des Layouts kann package:x11/xxkb[] oder package:x11/sbxkb[] benutzt werden.
+
+[.filename]#/usr/local/etc/X11/xorg.conf.d/kbd-layout-multi.conf#
+
+[.programlisting]
+....
+Section "InputClass"
+ Identifier "All Keyboards"
+ MatchIsKeyboard "yes"
+ Option "XkbLayout" "us,es,ua"
+EndSection
+....
+
+====
+
+[[x-config-input-keyboard-zap]]
+Xorg über die Tastatur beenden::
+X kann über eine Tastenkombination geschlossen werden. Standardmäßig ist die Tastenkombination jedoch nicht gesetzt, da sie mit Tastaturbefehlen für einige Anwendungen in Konflikt steht. Die Aktivierung dieser Option erfordert Änderungen in der Sektion `InputDevice` für die Tastatur:
++
+.X über die Tastatur beenden
+[example]
+====
+
+[.filename]#/usr/local/etc/X11/xorg.conf.d/keyboard-zap.conf#
+
+[.programlisting]
+....
+Section "InputClass"
+ Identifier "KeyboardDefaults"
+ MatchIsKeyboard "on"
+ Option "XkbOptions" "terminate:ctrl_alt_bksp"
+EndSection
+....
+
+====
+
+[[x11-input-mice]]
+==== Mäuse und Zeigegeräte
+
+[IMPORTANT]
+====
+Wenn Sie unter FreeBSD {rel121-current} das Paket package:xorg-server[] 1.20.8 oder eine neuere Version installiert haben, und Sie auch nicht den man:moused[8]-Daemon verwenden, fügen Sie `kern.evdev.rcpt_mask=12` in [.filename]#/etc/sysctl.conf# ein.
+====
+
+Viele Parameter für die Maus können über Konfigurationseinstellungen eingestellt werden. man:mousedrv[4] enthält eine vollständige Liste.
+[[x11-input-mice-buttons]]
+Mauszeiger::
+Die Anzahl der Maustasten wird in [.filename]#xorg.conf# im Abschnitt `InputDevice` für die Maus festgelegt. Um die Anzahl der Tasten auf 7 zu setzen:
++
+.Die Anzahl der Maustasten festlegen
+[example]
+====
+
+[.filename]#/usr/local/X11/xorg.conf.d/mouse0-buttons.conf#
+
+[.programlisting]
+....
+Section "InputDevice"
+ Identifier "Mouse0"
+ Option "Buttons" "7"
+EndSection
+....
+
+====
+
+[[x-config-manual-configuration]]
+=== Manuelle Konfiguration
+
+In einigen Fällen funktioniert die Autokonfiguration nicht mit bestimmter Hardware, oder es wird eine andere Konfiguration benötigt. Für diese Fälle kann eine benutzerdefinierte Konfigurationsdatei erstellt werden.
+
+[WARNING]
+====
+
+Erstellen Sie keine manuellen Konfigurationsdateien, sofern dies nicht erforderlich ist. Eine unnötige manuelle Konfiguration kann den ordnungsgemäßen Betrieb verhindern.
+====
+
+Eine Konfigurationsdatei kann, basierend auf der von Xorg erfassten Hardware erzeugt werden. Diese Konfigurationsdatei ist ein guter Ausgangspunkt für angepasste Konfigurationen.
+
+Erzeugung einer [.filename]#xorg.conf#:
+
+[source,bash]
+....
+# Xorg -configure
+....
+
+Die Konfigurationsdatei wird in [.filename]#/root/xorg.conf.new# gespeichert. Machen Sie alle gewünschten Änderungen an dieser Datei. Danach testen Sie die Datei mit:
+
+[source,bash]
+....
+# Xorg -retro -config /root/xorg.conf.new
+....
+
+Nachdem die neue Konfiguration angepasst und getestet wurde, kann die Konfiguration in kleinere Dateien unter [.filename]#/usr/local/etc/X11/xorg.conf.d/# aufgeteilt werden.
+
+[[x-fonts]]
+== Schriftarten in Xorg benutzen
+
+[[type1]]
+=== Type 1 Schriftarten
+
+Die Schriftarten, die mit Xorg ausgeliefert werden, eignen sich ganz und gar nicht für Desktop-Publishing-Anwendungen. Große Schriftarten zeigen bei Präsentationen deutliche Treppenstufen und kleine Schriftarten sind fast unleserlich. Es gibt allerdings mehrere hochwertige Type 1 Schriftarten (PostScript(R)), die mit Xorg benutzt werden können. Beispielsweise enthalten die URW-Schriftarten (package:x11-fonts/urwfonts[]) hochwertige Versionen gängiger Type 1 Schriftarten (unter anderem Times Roman(TM), Helvetica(TM), Palatino(TM)). Die Sammlung Freefonts (package:x11-fonts/freefonts[]) enthält viele weitere Schriftarten, doch sind diese für den Einsatz in Grafikprogrammen wie Gimp gedacht und nicht für den alltäglichen Gebrauch. Weiterhin kann Xorg mit einem Minimum an Aufwand konfiguriert werden, damit TrueType(R)-Schriftarten benutzt werden können. Mehr dazu erfahren Sie in der Manualpage man:X[7] und im <<truetype>>.
+
+Die Type 1 Schriftarten lassen sich als Paket wie folgt installieren:
+
+[source,bash]
+....
+# pkg install urwfonts
+....
+
+Alternativ können die Schriftarten aus der Ports-Sammlung gebaut und installiert werden:
+
+[source,bash]
+....
+# cd /usr/ports/x11-fonts/urwfonts
+# make install clean
+....
+
+Analog lassen sich Freefont und andere Sammlungen installieren. Damit der X-Server diese Schriftarten erkennt, fügen Sie eine entsprechende Zeile in die Konfigurationsdatei des X-Servers ([.filename]#/etc/X11/xorg.conf#) hinzu:
+
+[.programlisting]
+....
+FontPath "/usr/local/shared/fonts/urwfonts/"
+....
+
+Alternativ kann in der X-Sitzung das folgende Kommando abgesetzt werden:
+
+[source,bash]
+....
+% xset fp+ /usr/local/shared/fonts/urwfonts
+% xset fp rehash
+....
+
+Jetzt kennt der X-Server die neuen Schriftarten, jedoch nur bis zu Ende der Sitzung. Soll die Änderung dauerhaft sein, müssen die Befehle in [.filename]#~/.xinitrc# eingetragen werden, wenn X mittels `startx` gestartet wird, beziehungsweise in [.filename]#~/.xsession#, wenn ein grafischer Login-Manager, wie XDM verwendet wird. Eine dritte Möglichkeit besteht darin, [.filename]#/usr/local/etc/fonts/local.conf# zu verwenden, was im <<antialias>> demonstriert wird.
+
+[[truetype]]
+=== TrueType(R)-Schriftarten
+
+Xorg besitzt eine eingebaute Unterstützung zur Darstellung von TrueType(R)-Schriftarten. Hierzu existieren zwei verschiedene Module, die diese Funktionalität aktivieren können. In diesem Beispiel wird das Freetype-Modul benutzt, da es besser mit anderen Werkzeugen, die TrueType(R)-Schriftarten darstellen, übereinstimmt. Um das Freetype-Modul zu aktivieren, muss die folgende Zeile zum Abschnitt `"Module"` in [.filename]#/etc/X11/xorg.conf# hinzugefügt werden.
+
+[.programlisting]
+....
+Load "freetype"
+....
+
+Erstellen Sie ein Verzeichnis für die TrueType(R)-Schriftarten (beispielsweise [.filename]#/usr/local/shared/fonts/TrueType#) und kopieren Sie alle Schriftarten dorthin. Beachten Sie, dass die Schriftarten für Xorg im UNIX(R)/MS-DOS(R)/Windows(R)-Format vorliegen müssen und nicht direkt von einem Apple(R) Mac(R) übernommen werden können. Sobald die Dateien in das Verzeichnis kopiert wurden, verwenden Sie mkfontscale um [.filename]#fonts.dir# zu erstellen, damit X weiß, dass diese neuen Dateien installiert wurden. `mkfontscale` kann als Paket installiert werden:
+
+[source,bash]
+....
+# pkg install mkfontscale
+....
+
+Erstellen Sie dann einen Index der Schriftarten für X:
+
+[source,bash]
+....
+# cd /usr/local/shared/fonts/TrueType
+# mkfontscale
+....
+
+Geben Sie dem System das TrueType(R)-Verzeichnis, wie im <<type1>> beschrieben, bekannt:
+
+[source,bash]
+....
+# xset fp+ /usr/local/shared/fonts/TrueType
+# xset fp rehash
+....
+
+Oder fügen Sie eine `FontPath`-Zeile in [.filename]#xorg.conf# ein.
+
+Jetzt sollten Gimp, Apache OpenOffice und alle anderen X-Anwendungen die TrueType(R)-Schritarten erkennen. Extrem kleine Schriftarten (Webseiten, die mit hoher Auflösung betrachtet werden) und sehr große Schriftarten (in StarOffice(TM)) werden jetzt viel besser aussehen.
+
+[[antialias]]
+=== Anti-aliasing
+
+Alle Schriftarten in Xorg, die in den Verzeichnissen [.filename]#/usr/local/shared/fonts/# und [.filename]#~/.fonts/# gefunden werden, werden automatisch für Anti-aliasing an Anwendungen zur Verfügung gestellt, die Xft beherrschen. Die meisten aktuellen Anwendungen beherrschen Xft, dazu gehören auch KDE, GNOME und Firefox.
+
+In [.filename]#/usr/local/etc/fonts/local.conf# werden die Schriftarten, die mit dem Anti-aliasing-Verfahren benutzt werden sollen und die Eigenschaften des Verfahrens festgelegt. In diesem Abschnitt wird nur die grundlegende Konfiguration von Xft beschrieben. Weitere Details entnehmen Sie bitte der Hilfeseite man:fonts-conf[5].
+
+Die Datei [.filename]#local.conf# ist ein XML-Dokument. Achten Sie beim Editieren der Datei daher auf die richtige Groß- und Kleinschreibung und darauf, dass alle Tags geschlossen sind. Die Datei beginnt mit der üblichen XML-Deklaration gefolgt von einer DOCTYPE-Definition und dem `<fontconfig>`-Tag:
+
+[.programlisting]
+....
+<?xml version="1.0"?>
+ <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+ <fontconfig>
+....
+
+Wie vorher erwähnt, stehen schon alle Schriftarten in [.filename]#/usr/local/shared/fonts/# und [.filename]#~/.fonts/# für Anwendungen, die Xft unterstützen, zur Verfügung. Um ein Verzeichnis außerhalb dieser beiden Bäume zu benutzen, fügen Sie eine Zeile wie die nachstehende in [.filename]#/usr/local/etc/fonts/local.conf# hinzu:
+
+[.programlisting]
+....
+<dir>/path/to/my/fonts</dir>
+....
+
+Wenn Sie neue Schriftarten hinzugefügt haben, müssen Sie den Schriftarten-Cache neu aufbauen:
+
+[source,bash]
+....
+# fc-cache -f
+....
+
+Das Anti-aliasing-Verfahren zeichnet Ränder leicht unscharf, dadurch werden kleine Schriften besser lesbar und der Treppenstufen-Effekt bei wird großen Schriften vermieden. Auf normale Schriftgrößen sollte das Verfahren aber nicht angewendet werden, da dies die Augen zu sehr anstrengt. Um kleinere Schriftgrößen als 14 Punkt von dem Verfahren auszuschließen, fügen Sie in [.filename]#local.conf# die nachstehenden Zeilen ein:
+
+[.programlisting]
+....
+ <match target="font">
+ <test name="size" compare="less">
+ <double>14</double>
+ </test>
+ <edit name="antialias" mode="assign">
+ <bool>false</bool>
+ </edit>
+ </match>
+ <match target="font">
+ <test name="pixelsize" compare="less" qual="any">
+ <double>14</double>
+ </test>
+ <edit mode="assign" name="antialias">
+ <bool>false</bool>
+ </edit>
+ </match>
+....
+
+Das Anti-aliasing-Verfahren kann die Abstände einiger Fixschriften falsch darstellen, dies fällt besonders unter KDE auf. Sie können das Problem umgehen, indem Sie die Abstände dieser Schriften auf den Wert `100` festsetzen. Fügen Sie die nachstehenden Zeilen hinzu:
+
+[.programlisting]
+....
+ <match target="pattern" name="family">
+ <test qual="any" name="family">
+ <string>fixed</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>mono</string>
+ </edit>
+ </match>
+ <match target="pattern" name="family">
+ <test qual="any" name="family">
+ <string>console</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>mono</string>
+ </edit>
+ </match>
+....
+
+Damit werden die Namen der gebräuchlichen Fixschriften auf `"mono"` abgebildet. Für diese Schriften setzen Sie dann den Abstand fest:
+
+[.programlisting]
+....
+ <match target="pattern" name="family">
+ <test qual="any" name="family">
+ <string>mono</string>
+ </test>
+ <edit name="spacing" mode="assign">
+ <int>100</int>
+ </edit>
+ </match>
+....
+
+Bestimmte Schriftarten, wie Helvetica, können Probleme mit dem Anti-Aliasing-Verfahren verursachen. In der Regel erscheinen diese Schriftarten dann vertikal halbiert. Im schlimmsten Fall stürzen Anwendungen als Folge davon ab. Sie vermeiden dies, indem Sie betroffene Schriftarten in [.filename]#local.conf# von dem Verfahren ausnehmen:
+
+[.programlisting]
+....
+ <match target="pattern" name="family">
+ <test qual="any" name="family">
+ <string>Helvetica</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+....
+
+Nachdem Sie [.filename]#local.conf# editiert haben, müssen Sie sicherstellen, dass die Datei mit dem Tag `</fontconfig>` endet. Ist das nicht der Fall, werden die Änderungen nicht berücksichtigt.
+
+Benutzer können personalisierte Einstellungen in [.filename]#~/.fonts.conf# vornehmen. Diese Datei verwendet die gleiche XML-Syntax wie im obigen Beispiel.
+
+Mit einem LCD können Sie sub-pixel sampling anstelle von Anti-aliasing einsetzen. Dieses Verfahren behandelt die horizontal getrennten Rot-, Grün- und Blau-Komponenten eines Pixels gesondert und verbessert damit (teilweise sehr wirksam) die horizontale Auflösung. Die nachstehende Zeile in [.filename]#local.conf# aktiviert diese Funktion:
+
+[.programlisting]
+....
+ <match target="font">
+ <test qual="all" name="rgba">
+ <const>unknown</const>
+ </test>
+ <edit name="rgba" mode="assign">
+ <const>rgb</const>
+ </edit>
+ </match>
+....
+
+[NOTE]
+====
+Abhängig von der Art Ihres Bildschirms müssen Sie anstelle von `rgb` eines der folgenden verwenden: `bgr`, `vrgb` oder `vbgr`. Experimentieren Sie und vergleichen, was besser aussieht.
+====
+
+[[x-xdm]]
+== Der X-Display-Manager
+
+Xorg enthält den X-Display-Manager XDM, um Sitzungen zu verwalten. XDM stellt eine graphische Anmeldemaske zur Verfügung, in der Sie den Server, auf dem eine Sitzung laufen soll, auswählen können und in der Sie die Autorisierungs-Informationen, wie Benutzername und Passwort, eingeben können.
+
+Dieser Abschnitt zeigt, wie der X-Displaymanager konfiguriert wird. Einige grafische Oberflächen enthalten ihre eigenen graphischen Login-Manager. Eine Anleitung zur Konfiguration des GNOME Display-Managers finden Sie im <<x11-wm-gnome>>. Eine Anleitung zur Konfiguration des KDE Display Managers finden Sie im <<x11-wm-kde>>.
+
+=== XDM einrichten
+
+XDM kann über das Paket oder den Port package:x11/xdm[] installiert werden. Nach der Installation lässt sich XDM durch einen Eintrag in [.filename]#/etc/ttys# bei jedem Start des Rechners aktivieren:
+
+[.programlisting]
+....
+ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure
+....
+
+Ändern Sie den Wert `off` zu `on` und speichern Sie die Datei. `ttyv8` zeigt an, dass XDM auf dem neunten virtuellen Terminal ausgeführt wird.
+
+Die Konfigurationsdateien von XDM befinden sich in [.filename]#/usr/local/etc/X11/xdm#. Dieses Verzeichnis enthält einige Dateien, mit denen das Verhalten und Aussehen von XDM beeinflusst werden kann, sowie ein paar Skripte und Programme zur Einrichtung des Desktops. Eine Zusammenfassung der Aufgaben dieser Dateien beschreibt die <<xdm-config-files>>. Die genaue Syntax und Verwendung wird in man:xdm[1] beschrieben.
+
+[[xdm-config-files]]
+.Die Konfigurationsdateien von XDM
+[cols="1,1", frame="none", options="header"]
+|===
+| Datei
+| Beschreibung
+
+|[.filename]#Xaccess#
+|Verbindungen zu XDM werden über das "X Display Manager Connection Protocol" (XDMCP) hergestellt. [.filename]#Xaccess# enthält die Client-Berechtigungen zur Steuerung der XDMCP-Verbindungen entfernter Maschinen. In der Voreinstellung erlaubt diese Datei keine Verbindungen von entfernten Maschinen.
+
+|[.filename]#Xresources#
+|Diese Datei steuert das Erscheinungsbild der Bildschirmauswahl und Anmeldemasken von XDM. In der Voreinstellung erscheint ein rechteckiges Anmeldefenster, dass den Hostnamen und einen Anmeldeprompt mit "Login:" und "Password" anzeigt. Das Format dieser Datei entspricht den Dateien im Verzeichnis [.filename]#app-defaults#, die in der Dokumentation von Xorg beschrieben sind.
+
+|[.filename]#Xservers#
+|Diese Datei enthält eine Liste entfernter Rechner, die in der Bildschirmauswahl angeboten werden.
+
+|[.filename]#Xsession#
+|Dieses Skript wird von XDM aufgerufen, nachdem sich ein Benutzer erfolgreich angemeldet hat. Es verweist auf ein angepasstes Skript in [.filename]#~/.xsession#.
+
+|[.filename]#Xsetup_*#
+|Diese Skripten werden automatisch ausgeführt, bevor die Bildschirmauswahl oder die Anmeldemasken angezeigt werden. Für jeden lokalen Bildschirm gibt es ein Skript namens [.filename]#Xsetup_*#, wobei `*` die lokale Bildschirmnummer ist. Normalerweise werden damit ein oder zwei Programme, wie `xconsole`, im Hindergrund gestartet.
+
+|[.filename]#xdm-config#
+|Konfiguration für alle auf der Maschine verwalteten Bildschirme.
+
+|[.filename]#xdm-errors#
+|Enthält Fehler, die vom Server generiert werden. Wenn ein von XDM verwalteter Bildschirm hängen bleibt, suchen Sie in dieser Datei nach Fehlermeldungen. Für jede Sitzung werden die Meldungen auch in die Datei [.filename]#~/.xsession-errors# des Benutzers geschrieben.
+
+|[.filename]#xdm-pid#
+|Die Prozess-ID des gerade laufenden XDM-Prozesses.
+|===
+
+=== Fernzugriff einrichten
+
+In der Voreinstellung können sich nur Benutzer auf dem selben System über XDM anmelden. Um es Benutzern anderer Systeme zu ermöglichen, sich mit dem Bildschirm-Server zu verbinden, muss der Zugriffsregelsatz bearbeitet und der Listener aktiviert werden.
+
+Um XDM so zu konfigurieren, dass jede Verbindung angenommen wird, kommentieren Sie die Zeile `DisplayManager.requestPort` in [.filename]#/usr/local/etc/X11/xdm/xdm-config# aus, indem Sie der Zeile ein `!` voranstellen.
+
+[.programlisting]
+....
+! SECURITY: do not listen for XDMCP or Chooser requests
+! Comment out this line if you want to manage X terminals with xdm
+DisplayManager.requestPort: 0
+....
+
+Speichern Sie die Änderungen und starten Sie XDM neu. Um den Fernzugriff zu beschränken, sehen Sie sich die Beispiele in [.filename]#/usr/local/etc/X11/xdm/Xaccess# an. Zusätzliche Informationen finden Sie in man:xdm[1]
+
+[[x11-wm]]
+== Grafische Oberflächen
+
+Dieser Abschnitt beschreibt die Installation der drei beliebtesten grafischen Oberflächen unter FreeBSD. Eine Oberfläche kann alles von einem einfachen Window-Manager bis hin zu kompletten Anwendungen sein. Mehr als einhundert grafische Oberflächen stehen in der Kategorie [.filename]#x11-wm# der Ports-Sammlung zur Verfügung.
+
+[[x11-wm-gnome]]
+=== GNOME
+
+GNOME ist eine benutzerfreundliche Oberfläche. Es besitzt eine Leiste, mit der Anwendungen gestartet werden und die Statusinformationen anzeigen kann. Programme und Daten können auf der Oberfläche abgelegt werden und Standardwerkzeuge stehen zur Verfügung. Es gibt Konventionen, die es Anwendungen leicht machen, zusammenzuarbeiten und ein konsistentes Erscheinungsbild garantieren. Weitere Informationen zu GNOME unter FreeBSD finden Sie unter https://www.FreeBSD.org/gnome[https://www.FreeBSD.org/gnome]. Die Webseite enthält zusätzliche Informationen über die Installation, Konfiguration und Verwaltung von GNOME unter FreeBSD.
+
+Diese grafische Oberfläche kann als Paket installiert werden:
+
+[source,bash]
+....
+# pkg install gnome3
+....
+
+Um GNOME stattdessen aus der Ports-Sammlung zu übersetzen, nutzen Sie das folgende Kommando. GNOME ist eine große Anwendung, die sogar auf einem schnellen Computer einige Zeit zum Übersetzten benötigt.
+
+[source,bash]
+....
+# cd /usr/ports/x11/gnome3
+# make install clean
+....
+
+GNOME benötigt ein eingehängtes [.filename]#/proc# Dateisystem. Fügen Sie daher die folgende Zeile in [.filename]#/etc/fstab# ein, damit man:procfs[5] beim Systemstart automatisch eingehängt wird:
+
+[.programlisting]
+....
+proc /proc procfs rw 0 0
+....
+
+GNOME benötigt D-Bus und HAL für einen Nachrichtenbus und Hardware Abstraktion. Diese Anwendungen werden automatisch als Abhängigkeiten von GNOME installiert. Aktivieren Sie die Dienste in [.filename]#/etc/rc.conf#, sodass sie automatisch gestartet werden wenn das System bootet:
+
+[.programlisting]
+....
+dbus_enable="YES"
+hald_enable="YES"
+....
+
+Nach der Installation weisen Sie Xorg an, GNOME zu starten. Der einfachste Weg, dies zu tun, ist über den GNOME Display Manager GDM, der als Teil des GNOME-Desktops installiert wird. Um GDM zu aktivieren, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+gdm_enable="YES"
+....
+
+In der Regel ist es ratsam, alle GNOME-Dienste zu starten. Um dies zu erreichen, fügen Sie die folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+gnome_enable="YES"
+....
+
+GDM wird nun automatisch gestartet, wenn das System hochfährt.
+
+GNOME kann alternativ auch von der Kommandozeile gestartet werden, wenn eine entsprechend konfigurierte [.filename]#~/.xinitrc# vorliegt. Existiert diese Datei bereits, ersetzen Sie den Aufruf des Window-Managers durch /usr/local/bin/gnome-session. Wenn [.filename]#.xinitrc# nicht existiert, erstellen Sie die Datei mit folgendem Befehl:
+
+[source,bash]
+....
+% echo "exec /usr/local/bin/gnome-session" > ~/.xinitrc
+....
+
+Eine dritte Methode ist, XDM als Display-Manager zu verwenden. In diesem Fall erstellen Sie eine ausführbare [.filename]#~/.xsession#:
+
+[source,bash]
+....
+% echo "exec /usr/local/bin/gnome-session" > ~/.xsession
+....
+
+[[x11-wm-kde]]
+=== KDE
+
+KDE ist eine weitere, leicht zu benutzende Desktop-Umgebung. Dieser Desktop bietet eine Sammlung von Anwendungen mit einheitlichem Erscheinungsbild (look and feel), einheitlichen Menüs, Werkzeugleisten, Tastenkombinationen, Farbschemata, Internationalisierung und einer zentralen, dialoggesteuerten Desktop-Konfiguration. Weitere Informationen zu KDE finden Sie unter http://www.kde.org/[http://www.kde.org/]. Spezifische Informationen für FreeBSD finden Sie unter http://freebsd.kde.org/[http://freebsd.kde.org].
+
+Um KDE als Paket zu installieren, geben Sie ein:
+
+[source,bash]
+....
+# pkg install x11/kde5
+....
+
+Um KDE stattdessen aus dem Quellcode zu übersetzen, verwenden Sie das folgende Kommando. Bei der Installation wird ein Menü zur Auswahl der Komponenten angezeigt. KDE ist eine große Anwendung, die sogar auf einem schnellen Computer einige Zeit zum Übersetzen benötigt.
+
+[source,bash]
+....
+# cd /usr/ports/x11/kde5
+# make install clean
+....
+
+KDE benötigt ein eingehängtes [.filename]#/proc#. Fügen Sie diese Zeile in [.filename]#/etc/fstab# ein, um das Dateisystem automatisch beim Systemstart einzuhängen:
+
+[.programlisting]
+....
+proc /proc procfs rw 0 0
+....
+
+KDE benötigt D-Bus und HAL für einen Nachrichtenbus und Hardware Abstraktion. Diese Anwendungen werden automatisch als Abhängigkeiten von KDE installiert. Aktivieren Sie die Dienste in [.filename]#/etc/rc.conf#, sodass sie automatisch gestartet werden wenn das System bootet:
+
+[.programlisting]
+....
+dbus_enable="YES"
+hald_enable="YES"
+....
+
+Seit KDE Plasma 5 wird der KDE Display-Manager KDM nicht weiterentwickelt. Eine mögliche Alternative ist SDDM. Sie können das Paket wie folgt installieren:
+
+[source,bash]
+....
+# pkg install x11/sddm
+....
+
+Fügen Sie anschließend folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+sddm_enable="YES"
+....
+
+Eine zweite Möglichkeit KDE zu starten, ist `startx` in der Kommandozeile einzugeben. Damit dies funktioniert, wird folgende Zeile in [.filename]#~/.xinitrc# benötigt:
+
+[.programlisting]
+....
+exec ck-launch-session startplasma-x11
+....
+
+Eine dritte Möglichkeit ist KDE über XDM zu starten. Um dies zu tun, erstellen Sie eine ausführbare [.filename]#~/.xsession# wie folgt:
+
+[source,bash]
+....
+% echo "exec ck-launch-session startkde" > ~/.xsession
+....
+
+Sobald KDE gestartet wird, finden Sie im integrierten Hilfesystem weitere Informationen zur Benutzung der verschiedenen Menüs und Anwendungen.
+
+[[x11-wm-xfce]]
+=== Xfce
+
+Xfce ist eine Desktop-Umgebung, basierend auf den von GNOME verwendeten GTK+-Bibliotheken. Es hat einen geringeren Speicherbedarf und stellt dabei einen schlichten, effizienten und einfach zu benutzenden Desktop zur Verfügung. Xfce ist vollständig konfigurierbar, verfügt über eine Programmleiste mit Menüs, Applets und einen Programmstarter. Zudem sind ein Datei-Manager und ein Sound-Manager enthalten und das Programm ist über Themes anpassbar. Da es schnell, leicht und effizient ist, eignet sich Xfce ideal für ältere oder langsamere Rechner mit wenig Speicher. Weitere Informationen zu Xfce finden Sie unter http://www.xfce.org/[http://www.xfce.org].
+
+Um das Paket Xfce zu installieren, geben Sie folgendes ein:
+
+[source,bash]
+....
+# pkg install xfce
+....
+
+Um stattdessen den Port zu übersetzen:
+
+[source,bash]
+....
+# cd /usr/ports/x11-wm/xfce4
+# make install clean
+....
+
+Xfce benutzt D-Bus als Nachrichtenbus. Die Komponente wird automatisch als Abhängigkeit von Xfce installiert. Um D-Bus beim Hochfahren des Systems zu starten, fügen Sie folgende Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+dbus_enable="YES"
+....
+
+Im Gegensatz zu GNOME oder KDE, besitzt Xfce keinen eigenen Login-Manager. Damit Xfce von der Kommandozeile mit `startx` gestartet werden kann, muss zunächst [.filename]#~/.xinitrc# mit diesem Befehl erstellt werden:
+
+[source,bash]
+....
+% echo ". /usr/local/etc/xdg/xfce4/xinitrc" > ~/.xinitrc
+....
+
+Alternativ dazu kann XDM verwendet werden. Um diese Methode zu konfigurieren, erstellen Sie eine ausführbare [.filename]#~/.xsession#:
+
+[source,bash]
+....
+% echo ". /usr/local/etc/xdg/xfce4/xinitrc" > ~/.xsession
+....
+
+[[x-compiz-fusion]]
+== Compiz Fusion installieren
+
+Der Einsatz von hübschen 3D-Effekten ist eine Möglichkeit, die Benutzerfreundlichkeit eines Desktop-Rechners zu erhöhen.
+
+Die Installation des Compiz Fusion Pakets ist einfach, aber bei der Konfiguration sind ein paar Schritte notwendig, die nicht in der Dokumentation des Ports beschrieben werden.
+
+[[x-compiz-video-card]]
+=== Konfiguration des FreeBSD nVidia-Treibers
+
+Desktop-Effekte erzeugen eine hohe Last auf der Grafikkarte. Für nVidia-basierte Grafikkarten sind die proprietären Treiber für eine gute Leistung erforderlich. Benutzer anderer Grafikkarten können diesen Abschnitt überspringen und mit der Konfiguration von Xorg fortfahren.
+
+Lesen Sie die link:{faq}#x/[FAQ zu diesem Thema], um herauszufinden, wie der richtige nVidia-Treiber ermittelt werden kann.
+
+Nachdem der richtige Treiber für die Karte ermittelt wurde, kann er wie jedes andere Paket installiert werden.
+
+Um beispielsweise den aktuellsten Treiber zu installieren:
+
+[source,bash]
+....
+# pkg install x11/nvidia-driver
+....
+
+Der Treiber erstellt ein Kernelmodul, welches beim Systemstart geladen werden muss. Fügen folgende Zeile in [.filename]#/boot/loader.conf# ein:
+
+[.programlisting]
+....
+nvidia_load="YES"
+....
+
+[NOTE]
+====
+Um das Kernelmodul direkt in den laufenden Kernel zu laden, kann der Befehl `kldload nvidia` eingeben werden. Allerdings wurde festgestellt, dass einige Versionen von Xorg nicht richtig funktionieren, wenn der Treiber nicht beim Systemstart geladen wurde. Nach der Änderung in [.filename]#/boot/loader.conf# wird daher ein Neustart des Systems empfohlen.
+====
+
+Wenn das Kernelmodul geladen ist, muss in der Regel nur noch eine einzige Zeile in [.filename]#xorg.conf# geändert werden, um den proprietären Treiber zu aktivieren:
+
+Suchen Sie folgende Zeile in [.filename]#/etc/X11/xorg.conf#:
+
+[.programlisting]
+....
+Driver "nv"
+....
+
+und ändern Sie die Zeile zu:
+
+[.programlisting]
+....
+Driver "nvidia"
+....
+
+Wenn Sie nun die grafische Oberfläche starten, sollten Sie vom nVidia Startbildschirm begrüßt werden. Alles sollte wie gewohnt funktionieren.
+
+[[xorg-configuration]]
+=== Konfiguration von Desktop-Effekten in xorg.conf
+
+Um Compiz Fusion zu aktivieren, muss [.filename]#/etc/X11/xorg.conf# angepasst werden:
+
+Fügen Sie diesen Abschnitt hinzu, um Composite-Effekte zu aktivieren:
+
+[.programlisting]
+....
+Section "Extensions"
+ Option "Composite" "Enable"
+EndSection
+....
+
+Suchen Sie den Abschnitt "Screen", der ähnlich wie hier gezeigt aussehen sollte:
+
+[.programlisting]
+....
+Section "Screen"
+ Identifier "Screen0"
+ Device "Card0"
+ Monitor "Monitor0"
+ ...
+....
+
+und fügen Sie die beiden folgenden Zeilen hinzu (z.B. nach "Monitor"):
+
+[.programlisting]
+....
+DefaultDepth 24
+Option "AddARGBGLXVisuals" "True"
+....
+
+Suchen Sie den Abschnitt "Subsection", der sich auf die gewünschte Bildschirmauflösung bezieht. Wenn Sie z.B. 1280x1024 verwenden möchten, suchen Sie den folgenden Abschnitt. Sollte die gewünschte Auflösung nicht in allen Unterabschnitten vorhanden sein, können Sie den entsprechenden Eintrag manuell hinzufügen:
+
+[.programlisting]
+....
+SubSection "Display"
+ Viewport 0 0
+ Modes "1280x1024"
+EndSubSection
+....
+
+Für Composite-Effekte wird eine Farbtiefe von 24 Bit benötigt. Ändern Sie dazu den obigen Abschnitt wie folgt:
+
+[.programlisting]
+....
+SubSection "Display"
+ Viewport 0 0
+ Depth 24
+ Modes "1280x1024"
+EndSubSection
+....
+
+Zuletzt muss noch sichergestellt werden, dass die Module "glx" und "extmod" im Abschnitt "Module" geladen werden:
+
+[.programlisting]
+....
+Section "Module"
+ Load "extmod"
+ Load "glx"
+ ...
+....
+
+Die vorangegangenen Einstellungen können automatisch mit package:x11/nvidia-xconfig[] erledigt werden, indem Sie folgende Kommandos als root ausführen:
+
+[source,bash]
+....
+# nvidia-xconfig --add-argb-glx-visuals
+# nvidia-xconfig --composite
+# nvidia-xconfig --depth=24
+....
+
+[[compiz-fusion]]
+=== Installation und Konfiguration von Compiz Fusion
+
+Die Installation von Compiz Fusion ist so einfach wie die Installation jedes anderen Pakets:
+
+[source,bash]
+....
+# pkg install x11-wm/compiz-fusion
+....
+
+Wenn die Installation abgeschlossen ist, starten Sie (als normaler Benutzer) den grafischen Desktop mit folgendem Befehl:
+
+[source,bash]
+....
+% compiz --replace --sm-disable --ignore-desktop-hints ccp &
+% emerald --replace &
+....
+
+Der Bildschirm wird für einige Sekunden flackern, da der Window Manager (z.B. Metacity, wenn Sie GNOME benutzen) von Compiz Fusion ersetzt wird. Emerald kümmert sich um die Fensterdekoration (z.B. die Schatzflächenn schließen, minimieren und maximieren, Titelleisten, usw.).
+
+Sie können dieses einfache Skript anpassen und es dann beim Start automatisch ausführen lassen (z.B. durch Hinzufügen von "Sessions" beim GNOME-Desktop):
+
+[.programlisting]
+....
+#! /bin/sh
+compiz --replace --sm-disable --ignore-desktop-hints ccp &
+emerald --replace &
+....
+
+Speichern Sie die Datei in Ihrem Heimatverzeichnis, beispielsweise als [.filename]#start-compiz# und machen Sie die Datei ausführbar:
+
+[source,bash]
+....
+% chmod +x ~/start-compiz
+....
+
+Benutzen Sie dann die grafische Oberfläche, um das Skript zu [.guimenuitem]#Autostart-Programme# hinzuzufügen (beim GNOME-Desktop unter [.guimenuitem]#Systemwerkzeuge#, [.guimenuitem]#Einstellungen#, [.guimenuitem]#Sessions#).
+
+Um die gewünschten Effekte und Einstellungen zu konfigurieren, starten Sie (wieder als normaler Benutzer) den Compiz Config Einstellungs-Manager:
+
+[source,bash]
+....
+% ccsm
+....
+
+[NOTE]
+====
+In GNOME finden Sie diese Einstellungen wieder im Menü unter [.guimenuitem]#Systemwerkzeuge#, [.guimenuitem]#Einstellungen#.
+====
+
+Wenn Sie "gconf support" während der Installation ausgewählt haben, können Sie diese Einstellungen auch im `gconf-editor` unter `apps/compiz` finden.
+
+[[x11-troubleshooting]]
+== Fehlersuche
+
+Wenn die Maus nicht funktioniert, müssen Sie diese zuerst konfigurieren. In neueren Versionen von Xorg werden die `InputDevice`-Abschnitte in [.filename]#xorg.conf# ignoriert, um stattdessen die automatisch erkannten Geräte zu verwenden. Um das alte Verhalten wiederherzustellen, fügen Sie folgende Zeile zum Abschnitt `ServerLayout` oder `ServerFlags` dieser Datei hinzu:
+
+[.programlisting]
+....
+Option "AutoAddDevices" "false"
+....
+
+[NOTE]
+====
+Wie zuvor erwähnt, wird standardmäßig der hald-Dienst automatisch die Tastatur erkennen. Es kann jedoch passieren, dass das Tastaturlayout oder das Modell nicht korrekt erkannt wird. Grafische Oberflächen wie GNOME, KDE oder Xfce stellen Werkzeuge für die Konfiguration der Tastatur bereit. Es ist allerdings auch möglich, die Tastatureigenschaften direkt zu setzen, entweder mit Hilfe von man:setxkbmap[1] oder mit einer Konfigurationsregel von hald.
+
+Wenn Sie zum Beispiel eine PC 102-Tasten Tastatur mit französischem Layout verwenden möchten, müssen sie eine Tastaturkonfigurationsdatei [.filename]#x11-input.fdi# für hald im Verzeichnis [.filename]#/usr/local/etc/hal/fdi/policy# anlegen. Diese Datei sollte die folgenden Zeilen enthalten:
+
+[.programlisting]
+....
+<?xml version="1.0" encoding="utf-8"?>
+<deviceinfo version="0.2">
+ <device>
+ <match key="info.capabilities" contains="input.keyboard">
+ <merge key="input.x11_options.XkbModel" type="string">pc102</merge>
+ <merge key="input.x11_options.XkbLayout" type="string">fr</merge>
+ </match>
+ </device>
+</deviceinfo>
+....
+
+Wenn diese Datei bereits existiert, kopieren Sie nur die Zeilen in die Datei, welche die Tastaturkonfiguration betreffen.
+
+Sie müssen Ihren Computer neu starten, um hald zu zwingen, diese Datei einzulesen.
+
+Es ist auch möglich, die gleiche Konfiguration von einem X-Terminal oder einem Skript über den folgenden Befehl heraus zu tätigen:
+
+[source,bash]
+....
+% setxkbmap -model pc102 -layout fr
+....
+
+[.filename]#/usr/local/shared/X11/xkb/rules/base.lst# enthält die zur Verfügung stehenden Tastatur- und Layoutoptionen.
+====
+
+Die Konfigurationsdatei [.filename]#xorg.conf.new# kann nun an bestimmte Bedürfnisse angepasst werden. Öffnen Sie die Datei in einem Editor, wie man:emacs[1] oder man:ee[1]. Falls der Monitor ein älteres oder ungewöhnliches Modell ist und keine automatische Erkennung unterstützt, können die Synchronisationsfrequenzen im Abschnitt `"Monitor"` der [.filename]#xorg.conf.new# eingetragen werden.
+
+[.programlisting]
+....
+Section "Monitor"
+ Identifier "Monitor0"
+ VendorName "Monitor Vendor"
+ ModelName "Monitor Model"
+ HorizSync 30-107
+ VertRefresh 48-120
+EndSection
+....
+
+Die meisten Monitore unterstützen die automatische Erkennung der Synchronisationsfrequenzen, so dass eine manuelle Eingabe der Werte nicht erforderlich ist. Für die wenigen Monitore, die keine automatische Erkennung unterstützen, sollten nur die vom Hersteller zur Verfügung gestellten Werte eingegeben werden, um einen möglichen Schaden zu vermeiden.
+
+X unterstützt die Energiesparfunktionen (DPMS, Energy Star) für Monitore. Mit man:xset[1] können die Zeitlimits für die DPMS-Modi standby, suspend, off vorgeben, oder zwingend aktiviert werden. Die DPMS-Funktionen können mit der folgenden Zeile im Abschnitt `"Monitor"` aktiviert werden:
+
+[.programlisting]
+....
+Option "DPMS"
+....
+
+Die gewünschte Auflösung und Farbtiefe stellen sie im Abschnitt `"Screen"` ein:
+
+[.programlisting]
+....
+Section "Screen"
+ Identifier "Screen0"
+ Device "Card0"
+ Monitor "Monitor0"
+ DefaultDepth 24
+ SubSection "Display"
+ Viewport 0 0
+ Depth 24
+ Modes "1024x768"
+ EndSubSection
+EndSection
+....
+
+Mit `DefaultDepth` wird die standardmäßige Farbtiefe angegeben. Mit der Option `-depth` von man:Xorg[1] lässt sich die vorgegebene Farbtiefe überschreiben. `Modes` gibt die Auflösung für die angegebene Farbtiefe an. Die Farbtiefe im Beispiel beträgt 24 Bits pro Pixel, die zugehörige Auflösung ist 1024x768 Pixel. Beachten Sie, dass in der Voreinstellung nur Standard-VESA-Modi der Grafikkarte angegeben werden können.
+
+Sichern Sie die Konfigurationsdatei. Testen Sie anschließend die Konfiguration, wie oben beschrieben.
+
+[NOTE]
+====
+Bei der Fehlersuche stehen Ihnen die Protokolldateien von Xorg zur Verfügung. Die Protokolle enthalten Informationen über alle Geräte, die mit dem Xorg-Server verbunden ist. Die Namen der Xorg-Protkolldateien haben das Format [.filename]#/var/log/Xorg.0.log#. Der exakte Name der Datei variiert dabei von [.filename]#Xorg.0.log# bis [.filename]#Xorg.8.log#, und so weiter.
+====
+
+Wenn alles funktioniert, installieren Sie die Datei an einen Ort, an dem man:Xorg[1] sie finden kann. Typischerweise ist dies [.filename]#/etc/X11/xorg.conf# oder [.filename]#/usr/local/etc/X11/xorg.conf#.
+
+[source,bash]
+....
+# cp xorg.conf.new /etc/X11/xorg.conf
+....
+
+Damit ist die Konfiguration von Xorg abgeschlossesn. Xorg kann nun mit dem Programm man:startx[1] gestartet werden. Alternativ kann der Xorg-Server auch mithilfe von man:xdm[1] gestartet werden.
+
+=== Konfiguration des Intel(R) `i810` Graphics Chipsets
+
+Der Intel(R) i810-Chipset benötigt den Treiber [.filename]#agpgart#, die AGP-Schnittstelle für Xorg. Die Manualpage für den Treiber man:agp[4] enthält weitere Informationen.
+
+Ab jetzt kann die Hardware wie jede andere Grafikkarte auch konfiguriert werden. Beachten Sie, dass der Treiber man:agp[4] nicht nachträglich in einen laufenden Kernel geladen werden kann. Er muss entweder fest im Kernel eingebunden sein, oder beim Systemstart über [.filename]#/boot/loader.conf# geladen werden.
+
+=== Einen Widescreen-Monitor einsetzen
+
+Dieser Abschnitt geht über die normalen Konfigurationsarbeiten hinaus und setzt ein wenig Vorwissen voraus. Selbst wenn die Standardwerkzeuge zur X-Konfiguration bei diesen Geräten nicht zum Erfolg führen, gibt es in den Protokolldateien genug Informationen, mit denen Sie letztlich doch einen funktionierenden X-Server konfigurieren können. Alles, was Sie dazu benötigen, ist ein Texteditor.
+
+Aktuelle Widescreen-Formate (wie WSXGA, WSXGA+, WUXGA, WXGA, WXGA+, und andere mehr) unterstützen Seitenverhältnisse wie 16:10 oder 10:9, die unter X Probleme verursachen können. Bei einem Seitenverhältnis von 16:10 sind beispielsweise folgende Auflösungen möglich:
+
+* 2560x1600
+* 1920x1200
+* 1680x1050
+* 1440x900
+* 1280x800
+
+Irgendwann wird die Konfiguration vereinfacht werden, dass nur noch die Auflösung als `Mode` in `Section "Screen"` eingtragen wird, so wie hier:
+
+[.programlisting]
+....
+Section "Screen"
+Identifier "Screen 0"
+Device "Card 0"
+Monitor "Monitor0"
+Default Depth 24
+SubSection "Display"
+ ViewPort 0 0
+ Depth 24
+ Modes "1680x1050"
+EndSubSection
+EndSection
+....
+
+Xorg ist intelligent genug, um die Informationen zu den Auflösungen über I2C/DDC zu beziehen, und weiß daher, welche Auflösungen und Frequenzen der Widescreen-Monitor unterstützt.
+
+Wenn diese `ModeLines` in den Treiberdateien nicht vorhanden sind, kann es sein, dass Sie Xorg beim Finden der korrekten Werte unterstützen müssen. Dazu extrahieren Sie die benötigten Informationen aus [.filename]#/var/log/Xorg.0.log# und erzeugen daraus eine funktionierende `ModeLine`. Suchen Sie nach Zeilen ähnlich den folgenden:
+
+[.programlisting]
+....
+(II) MGA(0): Supported additional Video Mode:
+(II) MGA(0): clock: 146.2 MHz Image Size: 433 x 271 mm
+(II) MGA(0): h_active: 1680 h_sync: 1784 h_sync_end 1960 h_blank_end 2240 h_border: 0
+(II) MGA(0): v_active: 1050 v_sync: 1053 v_sync_end 1059 v_blanking: 1089 v_border: 0
+(II) MGA(0): Ranges: V min: 48 V max: 85 Hz, H min: 30 H max: 94 kHz, PixClock max 170 MHz
+....
+
+Diese Informationen werden auch als EDID-Informationen bezeichnet. Um daraus eine funktionierende `ModeLine` zu erzeugen, müssen lediglich die Zahlen in die korrekte Reihenfolge gebracht werden:
+
+[.programlisting]
+....
+ModeLine <name> <clock> <4 horiz. timings> <4 vert. timings>
+....
+
+Die korrekte `ModeLine` in `Section "Monitor"` würde für dieses Beispiel folgendermaßen aussehen:
+
+[.programlisting]
+....
+Section "Monitor"
+Identifier "Monitor1"
+VendorName "Bigname"
+ModelName "BestModel"
+ModeLine "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089
+Option "DPMS"
+EndSection
+....
+
+Nachdem diese Äderungen durchgeführt sind, sollte X auch auf Ihrem neuen Widescreen-Monitor starten.
+
+[[compiz-troubleshooting]]
+=== Fehersuche in Compiz Fusion
+
+==== Ich habe Compiz Fusion installiert und anschließend die hier erwähnten Kommandos eingegeben. Nun fehlen den Fenstern die Titelleisten und Schaltflächen. Was kann ich tun?
+
+Wahrscheinlich fehlt eine Einstellung in [.filename]#/etc/X11/xorg.conf#. Überprüfen Sie diese Datei gründlich, und überprüfen Sie insbesondere die Richtlinien `DefaultDepth` und `AddARGBGLXVisuals`.
+
+==== Wenn ich Compiz Fusion starte, bringt dass den X-Server zum Absturz. Was kann ich tun?
+
+Wenn Sie [.filename]#/var/log/Xorg.0.log# durchsuchen, finden Sie wahrscheinlich Fehlermeldungen, die während des Starts von X ausgegeben werden. Die häufigste Meldung ist:
+
+[source,bash]
+....
+(EE) NVIDIA(0): Failed to initialize the GLX module; please check in your X
+(EE) NVIDIA(0): log file that the GLX module has been loaded in your X
+(EE) NVIDIA(0): server, and that the module is the NVIDIA GLX module. If
+(EE) NVIDIA(0): you continue to encounter problems, Please try
+(EE) NVIDIA(0): reinstalling the NVIDIA driver.
+....
+
+Dies ist für gewöhnlich der Fall, wenn Sie Xorg aktualisieren. Sie müssen das Paket package:x11/nvidia-driver[] neu installieren, damit GLX neu gebaut wird.
diff --git a/documentation/content/de/books/handbook/zfs/_index.adoc b/documentation/content/de/books/handbook/zfs/_index.adoc
new file mode 100644
index 0000000000..705b4cf325
--- /dev/null
+++ b/documentation/content/de/books/handbook/zfs/_index.adoc
@@ -0,0 +1,2416 @@
+---
+title: Kapitel 19. Das Z-Dateisystem (ZFS)
+part: Teil III. Systemadministration
+prev: books/handbook/geom
+next: books/handbook/filesystems
+---
+
+[[zfs]]
+= Das Z-Dateisystem (ZFS)
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 19
+
+ifeval::["{backend}" == "html5"]
+:imagesdir: ../../../images/books/handbook/zfs/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:imagesdir: ../../../../static/images/books/handbook/zfs/
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:imagesdir: ../../../../static/images/books/handbook/zfs/
+endif::[]
+
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+
+toc::[]
+
+Das _Z-Dateisystem_, oder kurz ZFS, ist ein fortgeschrittenes Dateisystem, das entwickelt wurde, um viele der großen Probleme in vorherigen Entwicklungen zu überwinden.
+
+Ursprünglich von Sun(TM) entworfen, wird die weitere Entwicklung von ZFS heutzutage als Open Source vom http://open-zfs.org[OpenZFS Projekt] vorangetrieben.
+
+ZFS hat drei große Entwurfsziele:
+
+* Datenintegrität: Alle Daten enthalten eine Prüfsumme (<<zfs-term-checksum,checksum>>) der Daten. Wenn Daten geschrieben werden, wird die Prüfsumme berechnet und zusammen mit den Daten gespeichert. Wenn diese Daten später wieder eingelesen werden, wird diese Prüfsumme erneut berechnet. Falls die Prüfsummen nicht übereinstimmen, wurde ein Datenfehler festgestellt. ZFS wird versuchen, diesen Fehler automatisch zu korrigieren, falls genug Datenredundanz vorhanden ist.
+* Gepoolter Speicher: physikalische Speichermedien werden zu einem Pool zusammengefasst und der Speicherplatz wird von diesem gemeinsam genutzten Pool allokiert. Der Speicherplatz steht allen Dateisystemen zur Verfügung und kann durch das Hinzufügen von neuen Speichermedien vergrößert werden.
+* Geschwindigkeit: mehrere Zwischenspeichermechanismen sorgen für erhöhte Geschwindigkeit. Der <<zfs-term-arc,ARC>> ist ein weiterentwickelter, hauptspeicherbasierter Zwischenspeicher für Leseanfragen. Auf einer zweiten Stufe kann ein plattenbasierter <<zfs-term-l2arc,L2ARC>>-Lesezwischenspeicher hinzugefügt werden. Zusätzlich ist auch noch ein plattenbasierter, synchroner Schreibzwischenspeicher verfügbar, der sog. <<zfs-term-zil,ZIL>>.
+
+Eine vollständige Liste aller Eigenschaften und der dazugehörigen Terminologie ist in <<zfs-term>> zu sehen.
+
+[[zfs-differences]]
+== Was ZFS anders macht
+
+ZFS ist signifikant unterschiedlich zu allen bisherigen Dateisystemen, weil es mehr als nur ein Dateisystem ist. Durch die Kombination von traditionell getrennten Rollen von Volumenmanager und Dateisystem ist ZFS mit einzigartigen Vorteilen ausgestattet. Das Dateisystem besitzt jetzt Kenntnis von der zugrundeliegenden Struktur der Speichermedien. Traditionelle Dateisysteme konnten nur auf einer einzigen Platte gleichzeitig angelegt werden. Falls es zwei Festplatten gab, mussten auch zwei getrennte Dateisysteme erstellt werden. In einer traditionellen Hardware-RAID-Konfiguration wurde dieses Problem umgangen, indem dem Betriebssystem nur eine einzige logische Platte angezeigt wurde, die sich aus dem Speicherplatz von der Anzahl an physischen Platten zusammensetzte, auf dem dann das Betriebssystem ein Dateisystem erstellte. Sogar im Fall von Software-RAID-Lösungen, wie die, die von GEOM bereitgestellt werden, war das UFS-Dateisystem der Ansicht, dass es auf nur einem einzigen Gerät angelegt wurde. ZFS's Kombination eines Volumenmanagers und eines Dateisystems löst dies und erlaubt das Erstellen von vielen Dateisystemen, die sich alle den darunterliegenden Pool aus verfügbarem Speicher teilen. Einer der größten Vorteile von ZFS's Kenntnis des physikalischen Layouts der Platten ist, dass existierende Dateisysteme automatisch wachsen können, wenn zusätzliche Platten zum Pool hinzugefügt werden. Dieser neue Speicherplatz wird dann allen Dateisystemen zur Verfügung gestellt. ZFS besitzt ebenfalls eine Menge an unterschiedlichen Eigenschaften, die für jedes Dateisystem angepasst werden können, was viele Vorteile bringt, wenn man unterschiedliche Dateisysteme und Datasets anlegt, anstatt ein einziges, monolithisches Dateisystem zu erzeugen.
+
+[[zfs-quickstart]]
+== Schnellstartanleitung
+
+Es existiert ein Startmechanismus, der es FreeBSD erlaubt, ZFS-Pools während der Systeminitialisierung einzubinden. Um diesen zu aktivieren, fügen Sie diese Zeile in [.filename]#/etc/rc.conf# ein:
+
+[.programlisting]
+....
+zfs_enable="YES"
+....
+
+Starten Sie dann den Dienst:
+
+[source,bash]
+....
+# service zfs start
+....
+
+Die Beispiele in diesem Abschnitt gehen von drei SCSI-Platten mit den Gerätenamen [.filename]#da0#, [.filename]#da1# und [.filename]#da2# aus. Nutzer von SATA-Hardware sollten stattdessen die Bezeichnung [.filename]#ada# als Gerätenamen verwenden.
+
+[[zfs-quickstart-single-disk-pool]]
+=== Pools mit einer Platte
+
+Um einen einfachen, nicht-redundanten Pool mit einem einzigen Gerät anzulegen, geben Sie folgendes ein:
+
+[source,bash]
+....
+# zpool create example /dev/da0
+....
+
+Um den neuen Pool anzuzeigen, prüfen Sie die Ausgabe von `df`:
+
+[source,bash]
+....
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235230 1628718 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032846 48737598 2% /usr
+example 17547136 0 17547136 0% /example
+....
+
+Diese Ausgabe zeigt, dass der `example`-Pool erstellt und eingehängt wurde. Er ist nun als Dateisystem verfügbar. Dateien können darauf angelegt werden und Anwender können sich den Inhalt ansehen:
+
+[source,bash]
+....
+# cd /example
+# ls
+# touch testfile
+# ls -al
+total 4
+drwxr-xr-x 2 root wheel 3 Aug 29 23:15 .
+drwxr-xr-x 21 root wheel 512 Aug 29 23:12 ..
+-rw-r--r-- 1 root wheel 0 Aug 29 23:15 testfile
+....
+
+Allerdings nutzt dieser Pool noch keine der Vorteile von ZFS. Um ein Dataset auf diesem Pool mit aktivierter Komprimierung zu erzeugen, geben Sie ein:
+
+[source,bash]
+....
+# zfs create example/compressed
+# zfs set compression=gzip example/compressed
+....
+
+Das `example/compressed`-Dataset ist nun ein komprimiertes ZFS-Dateisystem. Versuchen Sie, ein paar große Dateien auf [.filename]#/example/compressed# zu kopieren.
+
+Deaktivieren lässt sich die Komprimierung durch:
+
+[source,bash]
+....
+# zfs set compression=off example/compressed
+....
+
+Um ein Dateisystem abzuhängen, verwenden Sie `zfs umount` und überprüfen Sie dies anschließend mit `df`:
+
+[source,bash]
+....
+# zfs umount example/compressed
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235232 1628716 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032864 48737580 2% /usr
+example 17547008 0 17547008 0% /example
+....
+
+Um das Dateisystem wieder einzubinden und erneut verfügbar zu machen, verwenden Sie `zfs mount` und prüfen Sie erneut mit `df`:
+
+[source,bash]
+....
+# zfs mount example/compressed
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235234 1628714 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032864 48737580 2% /usr
+example 17547008 0 17547008 0% /example
+example/compressed 17547008 0 17547008 0% /example/compressed
+....
+
+Den Pool und die Dateisysteme können Sie auch über die Ausgabe von `mount` prüfen:
+
+[source,bash]
+....
+# mount
+/dev/ad0s1a on / (ufs, local)
+devfs on /dev (devfs, local)
+/dev/ad0s1d on /usr (ufs, local, soft-updates)
+example on /example (zfs, local)
+example/compressed on /example/compressed (zfs, local)
+....
+
+Nach der Erstellung können ZFS-Datasets wie jedes andere Dateisystem verwendet werden. Jedoch sind jede Menge andere Besonderheiten verfügbar, die individuell auf Dataset-Basis eingestellt sein können. Im Beispiel unten wird ein neues Dateisystem namens `data` angelegt. Wichtige Dateien werden dort abgespeichert, deshalb wird es so konfiguriert, dass zwei Kopien jedes Datenblocks vorgehalten werden.
+
+[source,bash]
+....
+# zfs create example/data
+# zfs set copies=2 example/data
+....
+
+Es ist jetzt möglich, den Speicherplatzverbrauch der Daten durch die Eingabe von `df` zu sehen:
+
+[source,bash]
+....
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235234 1628714 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032864 48737580 2% /usr
+example 17547008 0 17547008 0% /example
+example/compressed 17547008 0 17547008 0% /example/compressed
+example/data 17547008 0 17547008 0% /example/data
+....
+
+Sie haben vermutlich bemerkt, dass jedes Dateisystem auf dem Pool die gleiche Menge an verfügbarem Speicherplatz besitzt. Das ist der Grund dafür, dass in diesen Beispielen `df` verwendet wird, um zu zeigen, dass die Dateisysteme nur die Menge an Speicher verbrauchen, den sie benötigen und alle den gleichen Pool verwenden. ZFS eliminiert Konzepte wie Volumen und Partitionen und erlaubt es mehreren Dateisystemen den gleichen Pool zu belegen.
+
+Um das Dateisystem und anschließend den Pool zu zerstören, wenn dieser nicht mehr benötigt wird, geben Sie ein:
+
+[source,bash]
+....
+# zfs destroy example/compressed
+# zfs destroy example/data
+# zpool destroy example
+....
+
+[[zfs-quickstart-raid-z]]
+=== RAID-Z
+
+Platten fallen aus. Eine Methode, um Datenverlust durch Festplattenausfall zu vermeiden, ist die Verwendung von RAID. ZFS unterstützt dies in seiner Poolgestaltung. Pools mit RAID-Z benötigen drei oder mehr Platten, bieten aber auch mehr nutzbaren Speicher als gespiegelte Pools.
+
+Dieses Beispiel erstellt einen RAID-Z-Pool, indem es die Platten angibt, die dem Pool hinzugefügt werden sollen:
+
+[source,bash]
+....
+# zpool create storage raidz da0 da1 da2
+....
+
+[NOTE]
+====
+Sun(TM) empfiehlt, dass die Anzahl der Geräte in einer RAID-Z Konfiguration zwischen drei und neun beträgt. Für Umgebungen, die einen einzelnen Pool benötigen, der aus 10 oder mehr Platten besteht, sollten Sie in Erwägung ziehen, diesen in kleinere RAID-Z-Gruppen aufzuteilen. Falls nur zwei Platten verfügbar sind und Redundanz benötigt wird, ziehen Sie die Verwendung eines ZFS-Spiegels (mirror) in Betracht. Lesen Sie dazu man:zpool[8], um weitere Details zu erhalten.
+====
+
+Das vorherige Beispiel erstellte einen ZPool namens `storage`. Dieses Beispiel erzeugt ein neues Dateisystem, genannt `home`, in diesem Pool:
+
+[source,bash]
+....
+# zfs create storage/home
+....
+
+Komprimierung und das Vorhalten von mehreren Kopien von Dateien und Verzeichnissen kann aktiviert werden:
+
+[source,bash]
+....
+# zfs set copies=2 storage/home
+# zfs set compression=gzip storage/home
+....
+
+Um dies als das neue Heimatverzeichnis für Anwender zu setzen, kopieren Sie die Benutzerdaten in dieses Verzeichnis und erstellen passende symbolische Verknüpfungen:
+
+[source,bash]
+....
+# cp -rp /home/* /storage/home
+# rm -rf /home /usr/home
+# ln -s /storage/home /home
+# ln -s /storage/home /usr/home
+....
+
+Daten von Anwendern werden nun auf dem frisch erstellten [.filename]#/storage/home# abgelegt. Überprüfen Sie dies durch das Anlegen eines neuen Benutzers und das anschließende Anmelden als dieser Benutzer.
+
+Versuchen Sie, einen Dateisystemschnappschuss anzulegen, den Sie später wieder zurückrollen können:
+
+[source,bash]
+....
+# zfs snapshot storage/home@08-30-08
+....
+
+Schnappschüsse können nur auf einem Dateisystem angelegt werden, nicht auf einem einzelnen Verzeichnis oder einer Datei.
+
+Das Zeichen `@` ist der Trenner zwischen dem Dateisystem- oder dem Volumennamen. Wenn ein wichtiges Verzeichnis aus Versehen gelöscht wurde, kann das Dateisystem gesichert und dann zu einem früheren Schnappschuss zurückgerollt werden, in welchem das Verzeichnis noch existiert:
+
+[source,bash]
+....
+# zfs rollback storage/home@08-30-08
+....
+
+Um all verfügbaren Schnappschüsse aufzulisten, geben Sie `ls` im Verzeichnis [.filename]#.zfs/snapshot# dieses Dateisystems ein. Beispielsweise lässt sich der zuvor angelegte Schnappschuss wie folgt anzeigen:
+
+[source,bash]
+....
+# ls /storage/home/.zfs/snapshot
+....
+
+Es ist möglich, ein Skript zu schreiben, um regelmäßig Schnappschüsse von Benutzerdaten anzufertigen. Allerdings verbrauchen Schnappschüsse über lange Zeit eine große Menge an Speicherplatz. Der zuvor angelegte Schnappschuss kann durch folgendes Kommando wieder entfernt werden:
+
+[source,bash]
+....
+# zfs destroy storage/home@08-30-08
+....
+
+Nach erfolgreichen Tests kann [.filename]#/storage/home# zum echten [.filename]#/home#-Verzeichnis werden, mittels:
+
+[source,bash]
+....
+# zfs set mountpoint=/home storage/home
+....
+
+Prüfen Sie mit `df` und `mount`, um zu bestätigen, dass das System das Dateisystem nun als [.filename]#/home# verwendet:
+
+[source,bash]
+....
+# mount
+/dev/ad0s1a on / (ufs, local)
+devfs on /dev (devfs, local)
+/dev/ad0s1d on /usr (ufs, local, soft-updates)
+storage on /storage (zfs, local)
+storage/home on /home (zfs, local)
+# df
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/ad0s1a 2026030 235240 1628708 13% /
+devfs 1 1 0 100% /dev
+/dev/ad0s1d 54098308 1032826 48737618 2% /usr
+storage 26320512 0 26320512 0% /storage
+storage/home 26320512 0 26320512 0% /home
+....
+
+Damit ist die RAID-Z Konfiguration abgeschlossen. Tägliche Informationen über den Status der erstellten Dateisysteme können als Teil des nächtlichen man:periodic[8]-Berichts generiert werden. Fügen Sie dazu die folgende Zeile in [.filename]#/etc/periodic.conf# ein:
+
+[.programlisting]
+....
+daily_status_zfs_enable="YES"
+....
+
+[[zfs-quickstart-recovering-raid-z]]
+=== RAID-Z wiederherstellen
+
+Jedes Software-RAID besitzt eine Methode, um den Zustand (`state`) zu überprüfen. Der Status von RAID-Z Geräten wird mit diesem Befehl angezeigt:
+
+[source,bash]
+....
+# zpool status -x
+....
+
+Wenn alle Pools <<zfs-term-online,Online>> sind und alles normal ist, zeigt die Meldung folgendes an:
+
+[source,bash]
+....
+all pools are healthy
+....
+
+Wenn es ein Problem gibt, womöglich ist eine Platte im Zustand <<zfs-term-offline,Offline>>, dann wird der Poolzustand ähnlich wie dieser aussehen:
+
+[source,bash]
+....
+ pool: storage
+ state: DEGRADED
+status: One or more devices has been taken offline by the administrator.
+ Sufficient replicas exist for the pool to continue functioning in a
+ degraded state.
+action: Online the device using 'zpool online' or replace the device with
+ 'zpool replace'.
+ scrub: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ storage DEGRADED 0 0 0
+ raidz1 DEGRADED 0 0 0
+ da0 ONLINE 0 0 0
+ da1 OFFLINE 0 0 0
+ da2 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Dies zeigt an, dass das Gerät zuvor vom Administrator mit diesem Befehl abgeschaltet wurde:
+
+[source,bash]
+....
+# zpool offline storage da1
+....
+
+Jetzt kann das System heruntergefahren werden, um [.filename]#da1# zu ersetzen. Wenn das System wieder eingeschaltet wird, kann die fehlerhafte Platte im Pool ersetzt werden:
+
+[source,bash]
+....
+# zpool replace storage da1
+....
+
+Von diesem Punkt an kann der Status erneut geprüft werden. Dieses Mal ohne die Option `-x`, damit alle Pools angezeigt werden:
+
+[source,bash]
+....
+# zpool status storage
+ pool: storage
+ state: ONLINE
+ scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008
+config:
+
+ NAME STATE READ WRITE CKSUM
+ storage ONLINE 0 0 0
+ raidz1 ONLINE 0 0 0
+ da0 ONLINE 0 0 0
+ da1 ONLINE 0 0 0
+ da2 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+In diesem Beispiel ist alles normal.
+
+[[zfs-quickstart-data-verification]]
+=== Daten verifizieren
+
+ZFS verwendet Prüfsummen, um die Integrität der gespeicherten Daten zu gewährleisten. Dies wird automatisch beim Erstellen von Dateisystemen aktiviert.
+
+[WARNING]
+====
+
+Prüfsummen können deaktiviert werden, dies wird jedoch _nicht_ empfohlen! Prüfsummen verbrauchen nur sehr wenig Speicherplatz und sichern die Integrität der Daten. Viele Eigenschaften vom ZFS werden nicht richtig funktionieren, wenn Prüfsummen deaktiviert sind. Es gibt keinen merklichen Geschwindigkeitsunterschied durch das Deaktivieren dieser Prüfsummen.
+====
+
+Prüfsummenverifikation ist unter der Bezeichnung _scrubbing_ bekannt. Verifizieren Sie die Integrität der Daten des `storage`-Pools mit diesem Befehl:
+
+[source,bash]
+....
+# zpool scrub storage
+....
+
+Die Laufzeit einer Überprüfung hängt ab von der Menge an Daten, die gespeichert sind. Größere Mengen an Daten benötigen proportional mehr Zeit zum überprüfen. Diese Überprüfungen sind sehr I/O-intensiv und es kann auch nur eine Überprüfung zur gleichen Zeit durchgeführt werden. Nachdem eine Prüfung beendet ist, kann der Status mit dem Unterkommando `status` angezeigt werden:
+
+[source,bash]
+....
+# zpool status storage
+ pool: storage
+ state: ONLINE
+ scrub: scrub completed with 0 errors on Sat Jan 26 19:57:37 2013
+config:
+
+ NAME STATE READ WRITE CKSUM
+ storage ONLINE 0 0 0
+ raidz1 ONLINE 0 0 0
+ da0 ONLINE 0 0 0
+ da1 ONLINE 0 0 0
+ da2 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Das Datum der letzten Prüfoperation wird angezeigt, um zu verfolgen, wann die nächste Prüfung benötigt wird. Routinemässige Überprüfungen helfen dabei, Daten vor stiller Korrumpierung zu schützen und die Integrität des Pools sicher zu stellen.
+
+Lesen Sie man:zfs[8] und man:zpool[8], um über weitere ZFS-Optionen zu erfahren.
+
+[[zfs-zpool]]
+== `zpool` Administration
+
+Administration von ZFS ist unterteilt zwischen zwei Hauptkommandos. Das `zpool`-Werkzeug steuert die Operationen des Pools und kümmert sich um das Hinzufügen, entfernen, ersetzen und verwalten von Platten. Mit dem <<zfs-zfs,`zfs`>>-Befehl können Datasets erstellt, zerstört und verwaltet werden, sowohl <<zfs-term-filesystem,Dateisysteme>> als auch <<zfs-term-volume,Volumes>>.
+
+[[zfs-zpool-create]]
+=== Pools anlegen und zerstören
+
+Einen ZFS-Pool (_zpool_) anzulegen beinhaltet das Treffen von einer Reihe von Entscheidungen, die relativ dauerhaft sind, weil die Struktur des Pools nachdem er angelegt wurde, nicht mehr geändert werden kann. Die wichtigste Entscheidung ist, welche Arten von vdevs als physische Platten zusammengefasst werden soll. Sehen Sie sich dazu die Liste von <<zfs-term-vdev,vdev-Arten>> an, um Details zu möglichen Optionen zu bekommen. Nachdem der Pool angelegt wurde, erlauben die meisten vdev-Arten es nicht mehr, weitere Geräte zu diesem vdev hinzuzufügen. Die Ausnahme sind Spiegel, die das Hinzufügen von weiteren Platten zum vdev gestatten, sowie stripes, die zu Spiegeln umgewandelt werden können, indem man zusätzliche Platten zum vdev anhängt. Obwohl weitere vdevs eingefügt werden können, um einen Pool zu vergrößern, kann das Layout des Pools nach dem Anlegen nicht mehr verändert werden. Stattdessen müssen die Daten gesichert, der Pool zerstört und danach neu erstellt werden.
+
+Erstellen eines einfachen gespiegelten Pools:
+
+[source,bash]
+....
+# zpool create mypool mirror /dev/ada1 /dev/ada2
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada1 ONLINE 0 0 0
+ ada2 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Mehrere vdevs können gleichzeitig angelegt werden. Geben Sie zusätzliche Gruppen von Platten, getrennt durch das vdev-Typ Schlüsselwort, in diesem Beispiel `mirror`, an:
+
+[source,bash]
+....
+# zpool create mypool mirror /dev/ada1 /dev/ada2 mirror /dev/ada3 /dev/ada4
+ pool: mypool
+ state: ONLINE
+ scan: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada1 ONLINE 0 0 0
+ ada2 ONLINE 0 0 0
+ mirror-1 ONLINE 0 0 0
+ ada3 ONLINE 0 0 0
+ ada4 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Pools lassen sich auch durch die Angabe von Partitionen anstatt von ganzen Platten erzeugen. Durch die Verwendung von ZFS in einer separaten Partition ist es möglich, dass die gleiche Platte andere Partitionen für andere Zwecke besitzen kann. Dies ist besonders von Interesse, wenn Partitionen mit Bootcode und Dateisysteme, die zum starten benötigt werden, hinzugefügt werden können. Das erlaubt es, von Platten zu booten, die auch Teil eines Pools sind. Es gibt keinen Geschwindigkeitsnachteil unter FreeBSD wenn eine Partition anstatt einer ganzen Platte verwendet wird. Durch den Einsatz von Partitionen kann der Administrator die Platten _unter provisionieren_, indem weniger als die volle Kapazität Verwendung findet. Wenn in Zukunft eine Ersatzfestplatte mit der gleichen Größe als die Originalplatte eine kleinere Kapazität aufweist, passt die kleinere Partition immer noch und die Ersatzplatte kann immer noch verwendet werden.
+
+Erstellen eines <<zfs-term-vdev-raidz,RAID-Z2>>-Pools mit Partitionen:
+
+[source,bash]
+....
+# zpool create mypool raidz2 /dev/ada0p3 /dev/ada1p3 /dev/ada2p3 /dev/ada3p3 /dev/ada4p3 /dev/ada5p3
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ raidz2-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+ ada2p3 ONLINE 0 0 0
+ ada3p3 ONLINE 0 0 0
+ ada4p3 ONLINE 0 0 0
+ ada5p3 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Ein Pool, der nicht länger benötigt wird, kann zerstört werden, so dass die Platten für einen anderen Einsatzzweck Verwendung finden können. Um einen Pool zu zerstören, müssen zuerst alle Datasets in diesem Pool abgehängt werden. Wenn die Datasets verwendet werden, wird das Abhängen fehlschlagen und der Pool nicht zerstört. Die Zerstörung des Pools kann erzwungen werden durch die Angabe der Option `-f`, jedoch kann dies undefiniertes Verhalten in den Anwendungen auslösen, die noch offene Dateien auf diesen Datasets hatten.
+
+[[zfs-zpool-attach]]
+=== Hinzufügen und Löschen von Geräten
+
+Es gibt zwei Fälle für das Hinzufügen von Platten zu einem Pool: einhängen einer Platte zu einem existierenden vdev mit `zpool attach` oder einbinden von vdevs zum Pool mit `zpool add`. Nur manche <<zfs-term-vdev,vdev-Arten>> gestatten es, Platten zum vdev hinzuzufügen, nachdem diese angelegt wurden.
+
+Ein Pool mit nur einer einzigen Platte besitzt keine Redundanz. Datenverfälschung kann erkannt, aber nicht repariert werden, weil es keine weiteren Kopien der Daten gibt. Die Eigenschaft <<zfs-term-copies,copies>> kann genutzt werden, um einen geringen Fehler wie einen beschädigtem Sektor auszumerzen, enthält aber nicht die gleiche Art von Schutz, die Spiegelung oder RAID-Z bieten. Wenn man mit einem Pool startet, der nur aus einer einzigen vdev-Platte besteht, kann mit dem Kommando `zpool attach` eine zustätzliche Platte dem vdev hinzugefügt werden, um einen Spiegel zu erzeugen. Mit `zpool attach` können auch zusätzliche Platten zu einer Spiegelgruppe eingefügt werden, was die Redundanz und Lesegeschwindigkeit steigert. Wenn die Platten, aus denen der Pool besteht, partitioniert sind, replizieren Sie das Layout der ersten Platte auf die Zweite. Verwenden Sie dazu `gpart backup` und `gpart restore`, um diesen Vorgang einfacher zu gestalten.
+
+Umwandeln eines (stripe) vdevs namens _ada0p3_ mit einer einzelnen Platte zu einem Spiegel durch das Einhängen von _ada1p3_:
+
+[source,bash]
+....
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+
+errors: No known data errors
+# zpool attach mypool ada0p3 ada1p3
+Make sure to wait until resilver is done before rebooting.
+
+If you boot from pool 'mypool', you may need to update
+boot code on newly attached disk 'ada1p3'.
+
+Assuming you use GPT partitioning und 'da0' is your new boot disk
+you may use the following command:
+
+ gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
+# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
+bootcode written to ada1
+# zpool status
+ pool: mypool
+ state: ONLINE
+status: One or more devices is currently being resilvered. The pool will
+ continue to function, possibly in a degraded state.
+action: Wait for the resilver to complete.
+ scan: resilver in progress since Fri May 30 08:19:19 2014
+ 527M scanned out of 781M at 47.9M/s, 0h0m to go
+ 527M resilvered, 67.53% done
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0 (resilvering)
+
+errors: No known data errors
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: resilvered 781M in 0h0m with 0 errors on Fri May 30 08:15:58 2014
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Wenn das Hinzufügen von Platten zu einem vdev keine Option wie für RAID-Z ist, gibt es eine Alternative, nämlich einen anderen vdev zum Pool hinzuzufügen. Zusätzliche vdevs bieten höhere Geschwindigkeit, indem Schreibvorgänge über die vdevs verteilt werden. Jedes vdev ist dafür verantwortlich, seine eigene Redundanz sicherzustellen. Es ist möglich, aber nicht empfehlenswert, vdev-Arten zu mischen, wie zum Beispiel `mirror` und `RAID-Z`. Durch das Einfügen eines nicht-redundanten vdev zu einem gespiegelten Pool oder einem RAID-Z vdev riskiert man die Daten des gesamten Pools. Schreibvorgänge werden verteilt, deshalb ist der Ausfall einer nicht-redundanten Platte mit dem Verlust eines Teils von jedem Block verbunden, der auf den Pool geschrieben wird.
+
+Daten werden über jedes vdev gestriped. Beispielsweise sind zwei Spiegel-vdevs effektiv ein RAID 10, dass über zwei Sets von Spiegeln die Daten schreibt. Speicherplatz wird so allokiert, dass jedes vdev zur gleichen Zeit vollgeschrieben wird. Es gibt einen Geschwindigkeitsnachteil wenn die vdevs unterschiedliche Menge von freiem Speicher aufweisen, wenn eine unproportionale Menge an Daten auf das weniger volle vdev geschrieben wird.
+
+Wenn zusätzliche Geräte zu einem Pool, von dem gebootet wird, hinzugefügt werden, muss der Bootcode aktualisiert werden.
+
+Einbinden einer zweiten Spiegelgruppe ([.filename]#ada2p3# und [.filename]#ada3p3#) zu einem bestehenden Spiegel:
+
+[source,bash]
+....
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: resilvered 781M in 0h0m with 0 errors on Fri May 30 08:19:35 2014
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+
+errors: No known data errors
+# zpool add mypool mirror ada2p3 ada3p3
+# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
+bootcode written to ada2
+# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3
+bootcode written to ada3
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 30 08:29:51 2014
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+ mirror-1 ONLINE 0 0 0
+ ada2p3 ONLINE 0 0 0
+ ada3p3 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Momentan können vdevs nicht von einem Pool entfernt und Platten nur von einem Spiegel ausgehängt werden, wenn genug Redundanz übrig bleibt. Wenn auch nur eine Platte in einer Spiegelgruppe bestehen bleibt, hört der Spiegel auf zu existieren und wird zu einem stripe, was den gesamten Pool riskiert, falls diese letzte Platte ausfällt.
+
+Entfernen einer Platte aus einem Spiegel mit drei Platten:
+
+[source,bash]
+....
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 30 08:29:51 2014
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+ ada2p3 ONLINE 0 0 0
+
+errors: No known data errors
+# zpool detach mypool ada2p3
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: scrub repaired 0 in 0h0m with 0 errors on Fri May 30 08:29:51 2014
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+[[zfs-zpool-status]]
+=== Den Status eines Pools überprüfen
+
+Der Status eines Pools ist wichtig. Wenn ein Gerät sich abschaltet oder ein Lese-, Schreib- oder Prüfsummenfehler festgestellt wird, wird der dazugehörige Fehlerzähler erhöht. Die `status`-Ausgabe zeigt die Konfiguration und den Status von jedem Gerät im Pool und den Gesamtstatus des Pools. Aktionen, die durchgeführt werden sollten und Details zum letzten <<zfs-zpool-scrub,`scrub`>> werden ebenfalls angezeigt.
+
+[source,bash]
+....
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: scrub repaired 0 in 2h25m with 0 errors on Sat Sep 14 04:25:50 2013
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ raidz2-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+ ada2p3 ONLINE 0 0 0
+ ada3p3 ONLINE 0 0 0
+ ada4p3 ONLINE 0 0 0
+ ada5p3 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+[[zfs-zpool-clear]]
+=== Fehler beseitigen
+
+Wenn ein Fehler erkannt wurde, werden die Lese-, Schreib- oder Prüfsummenzähler erhöht. Die Fehlermeldung kann beseitigt und der Zähler mit `zpool clear _mypool_` zurückgesetzt werden. Den Fehlerzustand zurückzusetzen kann wichtig sein, wenn automatisierte Skripte ablaufen, die den Administrator informieren, sobald der Pool Fehler anzeigt. Weitere Fehler werden nicht gemeldet, wenn der alte Fehlerbericht nicht entfernt wurde.
+
+[[zfs-zpool-replace]]
+=== Ein funktionierendes Gerät ersetzen
+
+Es gibt eine Reihe von Situationen, in denen es nötig ist, eine Platte mit einer anderen auszutauschen. Wenn eine funktionierende Platte ersetzt wird, hält der Prozess die alte Platte während des Ersetzungsvorganges noch aktiv. Der Pool wird nie den Zustand <<zfs-term-degraded,degraded>> erhalten, was das Risiko eines Datenverlustes minimiert. Alle Daten der alten Platte werden durch das Kommando `zpool replace` auf die Neue übertragen. Nachdem die Operation abgeschlossen ist, wird die alte Platte vom vdev getrennt. Falls die neue Platte grösser ist als die alte Platte , ist es möglich den Pool zu vergrößern, um den neuen Platz zu nutzen. Lesen Sie dazu <<zfs-zpool-online,Einen Pool vergrößern>>.
+
+Ersetzen eines funktionierenden Geräts in einem Pool:
+
+[source,bash]
+....
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+
+errors: No known data errors
+# zpool replace mypool ada1p3 ada2p3
+Make sure to wait until resilver is done before rebooting.
+
+If you boot from pool 'zroot', you may need to update
+boot code on newly attached disk 'ada2p3'.
+
+Assuming you use GPT partitioning und 'da0' is your new boot disk
+you may use the following command:
+
+ gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
+# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
+# zpool status
+ pool: mypool
+ state: ONLINE
+status: One or more devices is currently being resilvered. The pool will
+ continue to function, possibly in a degraded state.
+action: Wait for the resilver to complete.
+ scan: resilver in progress since Mon Jun 2 14:21:35 2014
+ 604M scanned out of 781M at 46.5M/s, 0h0m to go
+ 604M resilvered, 77.39% done
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ replacing-1 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+ ada2p3 ONLINE 0 0 0 (resilvering)
+
+errors: No known data errors
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: resilvered 781M in 0h0m with 0 errors on Mon Jun 2 14:21:52 2014
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada2p3 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+[[zfs-zpool-resilver]]
+=== Behandlung von fehlerhaften Geräten
+
+Wenn eine Platte in einem Pool ausfällt, wird das vdev zu dem diese Platte gehört, den Zustand <<zfs-term-degraded,degraded>> erhalten. Alle Daten sind immer noch verfügbar, jedoch wird die Geschwindigkeit möglicherweise reduziert, weil die fehlenden Daten aus der verfügbaren Redundanz heraus berechnet werden müssen. Um das vdev in einen funktionierenden Zustand zurück zu versetzen, muss das physikalische Gerät ersetzt werden. ZFS wird dann angewiesen, den <<zfs-term-resilver,resilver>>-Vorgang zu beginnen. Daten, die sich auf dem defekten Gerät befanden, werden neu aus der vorhandenen Prüfsumme berechnet und auf das Ersatzgerät geschrieben. Nach Beendigung dieses Prozesses kehrt das vdev zum Status <<zfs-term-online,online>> zurück.
+
+Falls das vdev keine Redundanz besitzt oder wenn mehrere Geräte ausgefallen sind und es nicht genug Redundanz gibt, um dies zu kompensieren, geht der Pool in den Zustand <<zfs-term-faulted,faulted>> über. Wenn keine ausreichende Anzahl von Geräten wieder an den Pool angeschlossen wird, fällt der Pool aus und die Daten müssen von Sicherungen wieder eingespielt werden.
+
+Wenn eine defekte Platte ausgewechselt wird, wird der Name dieser defekten Platte mit der GUID des Geräts ersetzt. Ein neuer Gerätename als Parameter für `zpool replace` wird nicht benötigt, falls das Ersatzgerät den gleichen Gerätenamen besitzt.
+
+Ersetzen einer defekten Platte durch `zpool replace`:
+
+[source,bash]
+....
+# zpool status
+ pool: mypool
+ state: DEGRADED
+status: One or more devices could not be opened. Sufficient replicas exist for
+ the pool to continue functioning in a degraded state.
+action: Attach the missing device und online it using 'zpool online'.
+ see: http://illumos.org/msg/ZFS-8000-2Q
+ scan: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool DEGRADED 0 0 0
+ mirror-0 DEGRADED 0 0 0
+ ada0p3 ONLINE 0 0 0
+ 316502962686821739 UNAVAIL 0 0 0 was /dev/ada1p3
+
+errors: No known data errors
+# zpool replace mypool 316502962686821739 ada2p3
+# zpool status
+ pool: mypool
+ state: DEGRADED
+status: One or more devices is currently being resilvered. The pool will
+ continue to function, possibly in a degraded state.
+action: Wait for the resilver to complete.
+ scan: resilver in progress since Mon Jun 2 14:52:21 2014
+ 641M scanned out of 781M at 49.3M/s, 0h0m to go
+ 640M resilvered, 82.04% done
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool DEGRADED 0 0 0
+ mirror-0 DEGRADED 0 0 0
+ ada0p3 ONLINE 0 0 0
+ replacing-1 UNAVAIL 0 0 0
+ 15732067398082357289 UNAVAIL 0 0 0 was /dev/ada1p3/old
+ ada2p3 ONLINE 0 0 0 (resilvering)
+
+errors: No known data errors
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: resilvered 781M in 0h0m with 0 errors on Mon Jun 2 14:52:38 2014
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada2p3 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+[[zfs-zpool-scrub]]
+=== Einen Pool überprüfen
+
+Es wird empfohlen, dass Pools regelmäßig geprüft (<<zfs-term-scrub,scrubbed>>) werden, idealerweise mindestens einmal pro Monat. Der `scrub`-Vorgang ist beansprucht die Platte sehr und reduziert die Geschwindigkeit während er läuft. Vermeiden Sie Zeiten, in denen großer Bedarf besteht, wenn Sie `scrub` starten oder benutzen Sie <<zfs-advanced-tuning-scrub_delay,`vfs.zfs.scrub_delay`>>, um die relative Priorität vom `scrub` einzustellen, um zu verhindern, dass es mit anderen Aufgaben kollidiert.
+
+[source,bash]
+....
+# zpool scrub mypool
+# zpool status
+ pool: mypool
+ state: ONLINE
+ scan: scrub in progress since Wed Feb 19 20:52:54 2014
+ 116G scanned out of 8.60T at 649M/s, 3h48m to go
+ 0 repaired, 1.32% done
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ raidz2-0 ONLINE 0 0 0
+ ada0p3 ONLINE 0 0 0
+ ada1p3 ONLINE 0 0 0
+ ada2p3 ONLINE 0 0 0
+ ada3p3 ONLINE 0 0 0
+ ada4p3 ONLINE 0 0 0
+ ada5p3 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Falls eine Überrpüfaktion abgebrochen werden muss, geben Sie `zpool scrub -s _mypool_` ein.
+
+[[zfs-zpool-selfheal]]
+=== Selbstheilung
+
+Die Prüfsummen, welche zusammen mit den Datenblöcken gespeichert werden, ermöglichen dem Dateisystem, sich _selbst zu heilen_. Diese Eigenschaft wird automatisch Daten korrigieren, deren Prüfsumme nicht mit der Gespeicherten übereinstimmt, die auf einem anderen Gerät, das Teil des Pools ist, vorhanden ist. Beispielsweise bei einem Spiegel aus zwei Platten, von denen eine anfängt, Fehler zu produzieren und nicht mehr länger Daten speichern kann. Dieser Fall ist sogar noch schlimmer, wenn auf die Daten seit einiger Zeit nicht mehr zugegriffen wurde, zum Beispiel bei einem Langzeit-Archivspeicher. Traditionelle Dateisysteme müssen dann Algorithmen wie man:fsck[8] ablaufen lassen, welche die Daten überprüfen und reparieren. Diese Kommandos benötigen einige Zeit und in gravierenden Fällen muss ein Administrator manuelle Entscheidungen treffen, welche Reparaturoperation vorgenommen werden soll. Wenn ZFS einen defekten Datenblock mit einer Prüfsumme erkennt, die nicht übereinstimmt, versucht es die Daten von der gespiegelten Platte zu lesen. Wenn diese Platte die korrekten Daten liefern kann, wird nicht nur dieser Datenblock an die anfordernde Applikation geschickt, sondern auch die falschen Daten auf der Disk reparieren, welche die falsche Prüfsumme erzeugt hat. Dies passiert während des normalen Betriebs des Pools, ohne dass eine Interaktion vom Systemadministrator notwendig wäre.
+
+Das nächste Beispiel demonstriert dieses Verhalten zur Selbstheilung. Ein gespiegelter Pool mit den beiden Platten [.filename]#/dev/ada0# und [.filename]#/dev/ada1# wird angelegt.
+
+[source,bash]
+....
+# zpool create healer mirror /dev/ada0 /dev/ada1
+# zpool status healer
+ pool: healer
+ state: ONLINE
+ scan: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ healer ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0 ONLINE 0 0 0
+ ada1 ONLINE 0 0 0
+
+errors: No known data errors
+# zpool list
+NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
+healer 960M 92.5K 960M - - 0% 0% 1.00x ONLINE -
+....
+
+Ein paar wichtige Daten, die es vor Datenfehlern mittels der Selbstheilungsfunktion zu schützen gilt, werden auf den Pool kopiert. Eine Prüfsumme wird zum späteren Vergleich berechnet.
+
+[source,bash]
+....
+# cp /some/important/data /healer
+# zfs list
+NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
+healer 960M 67.7M 892M 7% 1.00x ONLINE -
+# sha1 /healer > checksum.txt
+# cat checksum.txt
+SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f
+....
+
+Datenfehler werden durch das Schreiben von zufälligen Daten an den Anfang einer Platte des Spiegels simuliert. Um ZFS daran zu hindern, die Daten so schnell zu reparieren, wie es diese entdeckt, wird der Pool vor der Veränderung exportiert und anschließend wieder importiert.
+
+[WARNING]
+====
+
+Dies ist eine gefährliche Operation, die wichtige Daten zerstören kann. Es wird hier nur zu Demonstrationszwecken gezeigt und sollte nicht während des normalen Betriebs des Pools versucht werden. Dieses vorsätzliche Korrumpierungsbeispiel sollte auf gar keinen Fall auf einer Platte mit einem anderen Dateisystem durchgeführt werden. Verwenden Sie keine anderen Gerätenamen als diejenigen, die hier gezeigt werden, die Teil des Pools sind. Stellen Sie sicher, dass die passende Sicherungen angefertigt haben, bevor Sie dieses Kommando ausführen!
+====
+
+[source,bash]
+....
+# zpool export healer
+# dd if=/dev/random of=/dev/ada1 bs=1m count=200
+200+0 records in
+200+0 records out
+209715200 bytes transferred in 62.992162 secs (3329227 bytes/sec)
+# zpool import healer
+....
+
+Der Status des Pools zeigt an, dass bei einem Gerät ein Fehler aufgetreten ist. Wichtig zu wissen ist, dass Anwendungen, die Daten vom Pool lesen keine ungültigen Daten erhalten haben. ZFS lieferte Daten vom [.filename]#ada0#-Gerät mit der korrekten Prüfsumme aus. Das Gerät mit der fehlerhaften Prüfsumme kann sehr einfach gefunden werden, da die Spalte `CKSUM` einen Wert ungleich Null enthält.
+
+[source,bash]
+....
+# zpool status healer
+ pool: healer
+ state: ONLINE
+ status: One or more devices has experienced an unrecoverable error. An
+ attempt was made to correct the error. Applications are unaffected.
+ action: Determine if the device needs to be replaced, und clear the errors
+ using 'zpool clear' or replace the device with 'zpool replace'.
+ see: http://illumos.org/msg/ZFS-8000-4J
+ scan: none requested
+ config:
+
+ NAME STATE READ WRITE CKSUM
+ healer ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0 ONLINE 0 0 0
+ ada1 ONLINE 0 0 1
+
+errors: No known data errors
+....
+
+Der Fehler wurde erkannt und korrigiert durch die vorhandene Redundanz, welche aus der nicht betroffenen Platte [.filename]#ada0# des Spiegels gewonnen wurde. Ein Vergleich der Prüfsumme mit dem Original wird zeigen, ob sich der Pool wieder in einem konsistenten Zustand befindet.
+
+[source,bash]
+....
+# sha1 /healer >> checksum.txt
+# cat checksum.txt
+SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f
+SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f
+....
+
+Die beiden Prüfsummen, die vor und nach der vorsätzlichen Korrumpierung der Daten des Pools angelegt wurden, stimmen immer noch überein. Dies zeigt wie ZFS in der Lage ist, Fehler automatisch zu erkennen und zu korrigieren, wenn die Prüfsummen nicht übereinstimmen. Beachten Sie, dass dies nur möglich ist, wenn genug Redundanz im Pool vorhanden ist. Ein Pool, der nur aus einer einzigen Platte besteht besitzt keine Selbstheilungsfunktion. Dies ist auch der Grund warum Prüfsummen bei ZFS so wichtig sind und deshalb aus keinem Grund deaktiviert werden sollten. Kein man:fsck[8] ist nötig, um diese Fehler zu erkennen und zu korrigieren und der Pool war während der gesamten Zeit, in der das Problem bestand, verfügbar. Eine scrub-Aktion ist nun nötig, um die fehlerhaften Daten auf [.filename]#ada1# zu beheben.
+
+[source,bash]
+....
+# zpool scrub healer
+# zpool status healer
+ pool: healer
+ state: ONLINE
+status: One or more devices has experienced an unrecoverable error. An
+ attempt was made to correct the error. Applications are unaffected.
+action: Determine if the device needs to be replaced, und clear the errors
+ using 'zpool clear' or replace the device with 'zpool replace'.
+ see: http://illumos.org/msg/ZFS-8000-4J
+ scan: scrub in progress since Mon Dec 10 12:23:30 2012
+ 10.4M scanned out of 67.0M at 267K/s, 0h3m to go
+ 9.63M repaired, 15.56% done
+config:
+
+ NAME STATE READ WRITE CKSUM
+ healer ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0 ONLINE 0 0 0
+ ada1 ONLINE 0 0 627 (repairing)
+
+errors: No known data errors
+....
+
+Durch das scrub werden die Daten von [.filename]#ada0# gelesen und alle Daten mit einer falschen durch diejenigen mit der richtigen Prüfsumme auf [.filename]#ada1# ersetzt. Dies wird durch die Ausgabe `(repairing)` des Kommandos `zpool status` angezeigt. Nachdem die Operation abgeschlossen ist, ändert sich der Poolstatus zu:
+
+[source,bash]
+....
+# zpool status healer
+ pool: healer
+ state: ONLINE
+status: One or more devices has experienced an unrecoverable error. An
+ attempt was made to correct the error. Applications are unaffected.
+action: Determine if the device needs to be replaced, und clear the errors
+ using 'zpool clear' or replace the device with 'zpool replace'.
+ see: http://illumos.org/msg/ZFS-8000-4J
+ scan: scrub repaired 66.5M in 0h2m with 0 errors on Mon Dec 10 12:26:25 2012
+config:
+
+ NAME STATE READ WRITE CKSUM
+ healer ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0 ONLINE 0 0 0
+ ada1 ONLINE 0 0 2.72K
+
+errors: No known data errors
+....
+
+Nach der scrub-Operation und der anschliessenden Synchronisation der Daten von [.filename]#ada0# nach [.filename]#ada1#, kann die Fehlermeldung vom Poolstatus durch die Eingabe von `zpool clear`<<zfs-zpool-clear,bereinigt>> werden.
+
+[source,bash]
+....
+# zpool clear healer
+# zpool status healer
+ pool: healer
+ state: ONLINE
+ scan: scrub repaired 66.5M in 0h2m with 0 errors on Mon Dec 10 12:26:25 2012
+config:
+
+ NAME STATE READ WRITE CKSUM
+ healer ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0 ONLINE 0 0 0
+ ada1 ONLINE 0 0 0
+
+errors: No known data errors
+....
+
+Der Pool ist jetzt wieder in einem voll funktionsfähigen Zustand versetzt worden und alle Fehler wurden beseitigt.
+
+[[zfs-zpool-online]]
+=== Einen Pool vergrössern
+
+Die verwendbare Größe eines redundant ausgelegten Pools ist durch die Kapazität des kleinsten Geräts in jedem vdev begrenzt. Das kleinste Gerät kann durch ein größeres Gerät ersetzt werden. Nachdem eine <<zfs-zpool-replace,replace>> oder <<zfs-term-resilver,resilver>>-Operation abgeschlossen wurde, kann der Pool anwachsen, um die Kapazität des neuen Geräts zu nutzen. Nehmen wir als Beispiel einen Spiegel mit einer 1 TB und einer 2 TB Platte. Der verwendbare Plattenplatz beträgt 1 TB. Wenn die 1 TB Platte mit einer anderen 2 TB Platte ersetzt wird, kopiert der resilver-Prozess die existierenden Daten auf die neue Platte. Da beide Geräte nun 2 TB Kapazität besitzen, kann auch der verfügbare Plattenplatz auf die Größe von 2 TB anwachsen.
+
+Die Erweiterung wird durch das Kommando `zpool online -e` auf jedem Gerät ausgelöst. Nachdem alle Geräte expandiert wurden, wird der Speicher im Pool zur Verfügung gestellt.
+
+[[zfs-zpool-import]]
+=== Importieren und Exportieren von Pools
+
+Pools werden _exportiert_ bevor diese an ein anderes System angeschlossen werden. Alle Datasets werden abgehängt und jedes Gerät wird als exportiert markiert, ist jedoch immer noch gesperrt, so dass es nicht von anderen Festplattensubsystemen verwendet werden kann. Dadurch können Pools auf anderen Maschinen _importiert_ werden, die ZFS und sogar andere Hardwarearchitekturen (bis auf ein paar Ausnahmen, siehe man:zpool[8]) unterstützen. Besitzt ein Dataset offene Dateien, kann `zpool export -f` den Export des Pools erzwingen. Verwenden Sie dies mit Vorsicht. Die Datasets werden dadurch gewaltsam abgehängt, was bei Anwendungen, die noch offene Dateien auf diesem Dataset hatten, möglicherweise zu unerwartetem Verhalten führen kann.
+
+Einen nichtverwendeten Pool exportieren:
+
+[source,bash]
+....
+# zpool export mypool
+....
+
+Beim Importieren eines Pool werden auch automatisch alle Datasets eingehängt. Dies ist möglicherweise nicht das bevorzugte Verhalten und wird durch `zpool import -N` verhindert. Durch `zpool import -o` temporäre Eigenschaften nur für diesen Import gesetzt. Mit dem Befehl `zpool import altroot=` ist es möglich, einen Pool mit einem anderen Basiseinhängepunkt anstatt der Wurzel des Dateisystems einzubinden. Wenn der Pool zuletzt auf einem anderen System verwendet und nicht korrekt exportiert wurde, muss unter Umständen ein Import erzwungen werden durch `zpool import -f`. Alle Pools, die momentan nicht durch ein anderes System verwendet werden, lassen sich mit `zpool import -a` importieren.
+
+Alle zum Import verfügbaren Pools auflisten:
+
+[source,bash]
+....
+# zpool import
+ pool: mypool
+ id: 9930174748043525076
+ state: ONLINE
+ action: The pool can be imported using its name or numeric identifier.
+ config:
+
+ mypool ONLINE
+ ada2p3 ONLINE
+....
+
+Den Pool mit einem anderen Wurzelverzeichnis importieren:
+
+[source,bash]
+....
+# zpool import -o altroot=/mnt mypool
+# zfs list
+zfs list
+NAME USED AVAIL REFER MOUNTPOINT
+mypool 110K 47.0G 31K /mnt/mypool
+....
+
+[[zfs-zpool-upgrade]]
+=== Einen Pool aktualisieren
+
+Nachdem FreeBSD aktualisiert wurde oder wenn der Pool von einem anderen System, das eine ältere Version von ZFS einsetzt, lässt sich der Pool manuell auf den aktuellen Stand von ZFS bringen, um die neuesten Eigenschaften zu unterstützen. Bedenken Sie, ob der Pool jemals wieder von einem älteren System eingebunden werden muss, bevor Sie die Aktualisierung durchführen. Das aktualisieren eines Pools ist ein nicht umkehrbarer Prozess. ältere Pools lassen sich aktualisieren, jedoch lassen sich Pools mit neueren Eigenschaften nicht wieder auf eine ältere Version bringen.
+
+Aktualisierung eines v28-Pools, um `Feature Flags` zu unterstützen:
+
+[source,bash]
+....
+# zpool status
+ pool: mypool
+ state: ONLINE
+status: The pool is formatted using a legacy on-disk format. The pool can
+ still be used, but some features are unavailable.
+action: Upgrade the pool using 'zpool upgrade'. Once this is done, the
+ pool will no longer be accessible on software that does not support feat
+ flags.
+ scan: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0 ONLINE 0 0 0
+ ada1 ONLINE 0 0 0
+
+errors: No known data errors
+# zpool upgrade
+This system supports ZFS pool feature flags.
+
+The following pools are formatted with legacy version numbers und can
+be upgraded to use feature flags. After being upgraded, these pools
+will no longer be accessible by software that does not support feature
+flags.
+
+VER POOL
+--- ------------
+28 mypool
+
+Use 'zpool upgrade -v' for a list of available legacy versions.
+Every feature flags pool has all supported features enabled.
+# zpool upgrade mypool
+This system supports ZFS pool feature flags.
+
+Successfully upgraded 'mypool' from version 28 to feature flags.
+Enabled the following features on 'mypool':
+ async_destroy
+ empty_bpobj
+ lz4_compress
+ multi_vdev_crash_dump
+....
+
+Die neueren Eigenschaften von ZFS werden nicht verfügbar sein, bis `zpool upgrade` abgeschlossen ist. `zpool upgrade -v` kann verwendet werden, um zu sehen, welche neuen Eigenschaften durch die Aktualisierung bereitgestellt werden, genauso wie diejenigen, die momentan schon verfügbar sind.
+
+Einen Pool um zusätzliche Feature Flags erweitern:
+
+[source,bash]
+....
+# zpool status
+ pool: mypool
+ state: ONLINE
+status: Some supported features are not enabled on the pool. The pool can
+ still be used, but some features are unavailable.
+action: Enable all features using 'zpool upgrade'. Once this is done,
+ the pool may no longer be accessible by software that does not support
+ the features. See zpool-features(7) for details.
+ scan: none requested
+config:
+
+ NAME STATE READ WRITE CKSUM
+ mypool ONLINE 0 0 0
+ mirror-0 ONLINE 0 0 0
+ ada0 ONLINE 0 0 0
+ ada1 ONLINE 0 0 0
+
+errors: No known data errors
+# zpool upgrade
+This system supports ZFS pool feature flags.
+
+All pools are formatted using feature flags.
+
+Some supported features are not enabled on the following pools. Once a
+feature is enabled the pool may become incompatible with software
+that does not support the feature. See zpool-features(7) for details.
+
+POOL FEATURE
+---------------
+zstore
+ multi_vdev_crash_dump
+ spacemap_histogram
+ enabled_txg
+ hole_birth
+ extensible_dataset
+ bookmarks
+ filesystem_limits
+# zpool upgrade mypool
+This system supports ZFS pool feature flags.
+
+Enabled the following features on 'mypool':
+ spacemap_histogram
+ enabled_txg
+ hole_birth
+ extensible_dataset
+ bookmarks
+ filesystem_limits
+....
+
+[WARNING]
+====
+
+Der Bootcode muss auf Systemen, die von dem Pool starten, aktualisiert werden, um diese neue Version zu unterstützen. Verwenden Sie `gpart bootcode` auf der Partition, die den Bootcode enthält. Es gibt zwei Arten von Bootcode, je nachdem, wie das System bootet: GPT (die häufigste Option) und EFI (für moderne Systeme).
+
+Benutzen Sie für GPT den folgenden Befehl:
+
+[source,bash]
+....
+# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
+....
+
+Für Systeme, die EFI zum Booten benutzen, führen Sie folgenden Befehl aus:
+
+[source,bash]
+....
+# gpart bootcode -p /boot/boot1.efifat -i 1 ada1
+....
+
+Installieren Sie den Bootcode auf allen bootfähigen Platten im Pool. Lesen Sie man:gpart[8] für weitere Informationen.
+====
+
+[[zfs-zpool-history]]
+=== Aufgezeichnete Historie des Pools anzeigen
+
+Befehle, die den Pool in irgendeiner Form verändern, werden aufgezeichnet. Diese Befehle beinhalten das Erstellen von Datasets, verändern von Eigenschaften oder das Ersetzen einer Platte. Diese Historie ist nützlich um nachzuvollziehen, wie ein Pool aufgebaut ist und welcher Benutzer eine bestimmte Aktion wann und wie getätigt hat. Die aufgezeichnete Historie wird nicht in einer Logdatei festgehalten, sondern ist Teil des Pools selbst. Das Kommando zum darstellen dieser Historie lautet passenderweise `zpool history`:
+
+[source,bash]
+....
+# zpool history
+History for 'tank':
+2013-02-26.23:02:35 zpool create tank mirror /dev/ada0 /dev/ada1
+2013-02-27.18:50:58 zfs set atime=off tank
+2013-02-27.18:51:09 zfs set checksum=fletcher4 tank
+2013-02-27.18:51:18 zfs create tank/backup
+....
+
+Die Ausgabe zeigt `zpool` und `zfs`-Befehle, die ausgeführt wurden zusammen mit einem Zeitstempel. Nur Befehle, die den Pool verändern werden aufgezeichnet. Befehle wie `zfs list` sind dabei nicht enthalten. Wenn kein Name angegeben wird, erscheint die gesamte Historie aller Pools.
+
+Der Befehl `zpool history` kann sogar noch mehr Informationen ausgeben, wenn die Optionen `-i` oder `-l` angegeben werden. Durch `-i` zeigt ZFS vom Benutzer eingegebene, als auch interne Ereignisse an.
+
+[source,bash]
+....
+# zpool history -i
+History for 'tank':
+2013-02-26.23:02:35 [internal pool create txg:5] pool spa 28; zfs spa 28; zpl 5;uts 9.1-RELEASE 901000 amd64
+2013-02-27.18:50:53 [internal property set txg:50] atime=0 dataset = 21
+2013-02-27.18:50:58 zfs set atime=off tank
+2013-02-27.18:51:04 [internal property set txg:53] checksum=7 dataset = 21
+2013-02-27.18:51:09 zfs set checksum=fletcher4 tank
+2013-02-27.18:51:13 [internal create txg:55] dataset = 39
+2013-02-27.18:51:18 zfs create tank/backup
+....
+
+Weitere Details lassen sich durch die Angabe von `-l` entlocken. Historische Einträge werden in einem langen Format ausgegeben, einschließlich Informationen wie der Name des Benutzers, welcher das Kommando eingegeben hat und der Hostname, auf dem die Änderung erfolgte.
+
+[source,bash]
+....
+# zpool history -l
+History for 'tank':
+2013-02-26.23:02:35 zpool create tank mirror /dev/ada0 /dev/ada1 [user 0 (root) on :global]
+2013-02-27.18:50:58 zfs set atime=off tank [user 0 (root) on myzfsbox:global]
+2013-02-27.18:51:09 zfs set checksum=fletcher4 tank [user 0 (root) on myzfsbox:global]
+2013-02-27.18:51:18 zfs create tank/backup [user 0 (root) on myzfsbox:global]
+....
+
+Die Ausgabe zeigt, dass der Benutzer `root` den gespiegelten Pool mit den beiden Platten [.filename]#/dev/ada0# und [.filename]#/dev/ada1# angelegt hat. Der Hostname `myzfsbox` wird ebenfalls in den Kommandos angezeigt, nachdem der Pool erzeugt wurde. Die Anzeige des Hostnamens wird wichtig, sobald der Pool von einem System exportiert und auf einem anderen importiert wird. Die Befehle, welche auf dem anderen System verwendet werden, können klar durch den Hostnamen, der bei jedem Kommando mit verzeichnet wird, unterschieden werden.
+
+Beide Optionen für `zpool history` lassen sich auch kombinieren, um die meisten Details zur Historie eines Pools auszugeben. Die Pool Historie liefert wertvolle Informationen, wenn Aktionen nachverfolgt werden müssen oder zur Fehlerbeseitigung mehr Informationen gebraucht werden.
+
+[[zfs-zpool-iostat]]
+=== Geschwindigkeitsüberwachung
+
+Ein eingebautes Überwachungssystem kann I/O-Statistiken in Echtzeit liefern. Es zeigt die Menge von freiem und belegtem Speicherplatz auf dem Pool an, wieviele Lese- und Schreiboperationen pro Sekunde durchgeführt werden und die aktuell verwendete I/O-Bandbreite. Standardmäßig werden alle Pools in einem System überwacht und angezeigt. Ein Poolname kann angegeben werden, um die Anzeige auf diesen Pool zu beschränken. Ein einfaches Beispiel:
+
+[source,bash]
+....
+# zpool iostat
+ capacity operations bundwidth
+pool alloc free read write read write
+---------- ----- ----- ----- ----- ----- -----
+data 288G 1.53T 2 11 11.3K 57.1K
+....
+
+Um kontinuierlich die I/O-Aktivität zu überprüfen, kann eine Zahl als letzter Parameter angegeben werden, die ein Intervall in Sekunden angibt, die zwischen den Aktualisierungen vergehen soll. Die nächste Zeile mit Statistikinformationen wird dann nach jedem Intervall ausgegeben. Drücken Sie kbd:[Ctrl+C], um diese kontinuierliche Überwachung zu stoppen. Alternativ lässt sich auch eine zweite Zahl nach dem Intervall auf der Kommandozeile angeben, welche die Obergrenze von Statistikausgaben darstellt, die angezeigt werden sollen.
+
+Noch mehr Informationen zu I/O-Statistiken können durch Angabe der Option `-v` angezeigt werden. Jedes Gerät im Pool wird dann mit einer eigenen Statistikzeile aufgeführt. Dies ist hilfreich um zu sehen, wieviele Lese- und Schreiboperationen von jedem Gerät durchgeführt werden und kann bei der Diagnose eines langsamen Geräts, das den Pool ausbremst, hilfreich sein. Dieses Beispiel zeigt einen gespiegelten Pool mit zwei Geräten:
+
+[source,bash]
+....
+# zpool iostat -v
+ capacity operations bundwidth
+pool alloc free read write read write
+----------------------- ----- ----- ----- ----- ----- -----
+data 288G 1.53T 2 12 9.23K 61.5K
+ mirror 288G 1.53T 2 12 9.23K 61.5K
+ ada1 - - 0 4 5.61K 61.7K
+ ada2 - - 1 4 5.04K 61.7K
+----------------------- ----- ----- ----- ----- ----- -----
+....
+
+[[zfs-zpool-split]]
+=== Einen Pool aufteilen
+
+Ein Pool, der aus einem oder mehreren gespiegelten vdevs besteht, kann in zwei Pools aufgespalten werden. Falls nicht anders angegeben, wird das letzte Mitglied eines Spiegels abgehängt und dazu verwendet, einen neuen Pool mit den gleichen Daten zu erstellen. Die Operation sollte zuerst mit der Option `-n` versucht werden. Die Details der vorgeschlagenen Option werden dargestellt, ohne die Aktion in Wirklichkeit durchzuführen. Das hilft dabei zu bestätigen, ob die Aktion das tut, was der Benutzer damit vor hatte.
+
+[[zfs-zfs]]
+== `zfs` Administration
+
+Das `zfs`-Werkzeug ist dafür verantwortlich, alle ZFS Datasets innerhalb eines Pools zu erstellen, zerstören und zu verwalten. Der Pool selbst wird durch <<zfs-zpool,`zpool`>> verwaltet.
+
+[[zfs-zfs-create]]
+=== Datasets erstellen und zerstören
+
+Anders als in traditionellen Festplatten- und Volumenmanagern wird der Plattenplatz in ZFS _nicht_ vorher allokiert. Bei traditionellen Dateisystemen gibt es, nachdem der Plattenplatz partitioniert und zugeteilt wurde, keine Möglichkeit, ein zusätzliches Dateisystem hinzuzufügen, ohne eine neue Platte anzuschließen. Mit ZFS lassen sich neue Dateisysteme zu jeder Zeit anlegen. Jedes <<zfs-term-dataset,_Dataset_>> besitzt Eigenschaften wie Komprimierung, Deduplizierung, Zwischenspeicher (caching), Quotas, genauso wie andere nützliche Einstellungen wie Schreibschutz, Unterscheidung zwischen Groß- und Kleinschreibung, Netzwerkfreigaben und einen Einhängepunkt. Datasets können ineinander verschachtelt werden und Kind-Datasets erben die Eigenschaften ihrer Eltern. Jedes Dataset kann als eine Einheit verwaltet, <<zfs-zfs-allow,delegiert>>, <<zfs-zfs-send,repliziert>>, <<zfs-zfs-snapshot,mit Schnappschüssen versehen>>, <<zfs-zfs-jail,in Jails gesteckt>> und zerstört werden. Es gibt viele Vorteile, ein separates Dataset für jede Art von Dateien anzulegen. Der einzige Nachteil einer großen Menge an Datasets ist, dass manche Befehle wie `zfs list` langsamer sind und dass das Einhängen von hunderten oder hunderttausenden von Datasets den FreeBSD-Bootvorgang verzögert.
+
+Erstellen eines neuen Datasets und aktivieren von <<zfs-term-compression-lz4,LZ4 Komprimierung>>:
+
+[source,bash]
+....
+# zfs list
+NAME USED AVAIL REFER MOUNTPOINT
+mypool 781M 93.2G 144K none
+mypool/ROOT 777M 93.2G 144K none
+mypool/ROOT/default 777M 93.2G 777M /
+mypool/tmp 176K 93.2G 176K /tmp
+mypool/usr 616K 93.2G 144K /usr
+mypool/usr/home 184K 93.2G 184K /usr/home
+mypool/usr/ports 144K 93.2G 144K /usr/ports
+mypool/usr/src 144K 93.2G 144K /usr/src
+mypool/var 1.20M 93.2G 608K /var
+mypool/var/crash 148K 93.2G 148K /var/crash
+mypool/var/log 178K 93.2G 178K /var/log
+mypool/var/mail 144K 93.2G 144K /var/mail
+mypool/var/tmp 152K 93.2G 152K /var/tmp
+# zfs create -o compress=lz4 mypool/usr/mydataset
+# zfs list
+NAME USED AVAIL REFER MOUNTPOINT
+mypool 781M 93.2G 144K none
+mypool/ROOT 777M 93.2G 144K none
+mypool/ROOT/default 777M 93.2G 777M /
+mypool/tmp 176K 93.2G 176K /tmp
+mypool/usr 704K 93.2G 144K /usr
+mypool/usr/home 184K 93.2G 184K /usr/home
+mypool/usr/mydataset 87.5K 93.2G 87.5K /usr/mydataset
+mypool/usr/ports 144K 93.2G 144K /usr/ports
+mypool/usr/src 144K 93.2G 144K /usr/src
+mypool/var 1.20M 93.2G 610K /var
+mypool/var/crash 148K 93.2G 148K /var/crash
+mypool/var/log 178K 93.2G 178K /var/log
+mypool/var/mail 144K 93.2G 144K /var/mail
+mypool/var/tmp 152K 93.2G 152K /var/tmp
+....
+
+Ein Dataset zu zerstören ist viel schneller, als alle Dateien zu löschen, die sich in dem Dataset befindet, da es keinen Scan aller Dateien und aktualisieren der dazugehörigen Metadaten erfordert.
+
+Zerstören des zuvor angelegten Datasets:
+
+[source,bash]
+....
+# zfs list
+NAME USED AVAIL REFER MOUNTPOINT
+mypool 880M 93.1G 144K none
+mypool/ROOT 777M 93.1G 144K none
+mypool/ROOT/default 777M 93.1G 777M /
+mypool/tmp 176K 93.1G 176K /tmp
+mypool/usr 101M 93.1G 144K /usr
+mypool/usr/home 184K 93.1G 184K /usr/home
+mypool/usr/mydataset 100M 93.1G 100M /usr/mydataset
+mypool/usr/ports 144K 93.1G 144K /usr/ports
+mypool/usr/src 144K 93.1G 144K /usr/src
+mypool/var 1.20M 93.1G 610K /var
+mypool/var/crash 148K 93.1G 148K /var/crash
+mypool/var/log 178K 93.1G 178K /var/log
+mypool/var/mail 144K 93.1G 144K /var/mail
+mypool/var/tmp 152K 93.1G 152K /var/tmp
+# zfs destroy mypool/usr/mydataset
+# zfs list
+NAME USED AVAIL REFER MOUNTPOINT
+mypool 781M 93.2G 144K none
+mypool/ROOT 777M 93.2G 144K none
+mypool/ROOT/default 777M 93.2G 777M /
+mypool/tmp 176K 93.2G 176K /tmp
+mypool/usr 616K 93.2G 144K /usr
+mypool/usr/home 184K 93.2G 184K /usr/home
+mypool/usr/ports 144K 93.2G 144K /usr/ports
+mypool/usr/src 144K 93.2G 144K /usr/src
+mypool/var 1.21M 93.2G 612K /var
+mypool/var/crash 148K 93.2G 148K /var/crash
+mypool/var/log 178K 93.2G 178K /var/log
+mypool/var/mail 144K 93.2G 144K /var/mail
+mypool/var/tmp 152K 93.2G 152K /var/tmp
+....
+
+In modernen Versionen von ZFS ist `zfs destroy` asynchron und der freie Speicherplatz kann erst nach ein paar Minuten im Pool auftauchen. Verwenden Sie `zpool get freeing _poolname_`, um die Eigenschaft `freeing` aufzulisten, die angibt, bei wievielen Datasets die Blöcke im Hintergrund freigegeben werden. Sollte es Kind-Datasets geben, <<zfs-term-snapshot,Schnappschüsse>> oder andere Datasets, dann lässt sich der Elternknoten nicht zerstören. Um ein Dataset und all seine Kinder zu zerstören, verwenden Sie die Option `-r`, um das Dataset und all seine Kinder rekursiv zu entfernen. Benutzen Sie die Option `-n` und `-v`, um Datasets und Snapshots anzuzeigen, die durch diese Aktion zerstört werden würden, dies jedoch nur zu simulieren und nicht wirklich durchzuführen. Speicherplatz, der dadurch freigegeben würde, wird ebenfalls angezeigt.
+
+[[zfs-zfs-volume]]
+=== Volumes erstellen und zerstören
+
+Ein Volume ist ein spezieller Typ von Dataset. Anstatt dass es als Dateisystem eingehängt wird, stellt es ein Block-Gerät unter [.filename]#/dev/zvol/poolname/dataset# dar. Dies erlaubt es, das Volume für andere Dateisysteme zu verwenden, die Festplatten einer virtuellen Maschine bereitzustellen oder über Protokolle wie iSCSI oder HAST exportiert zu werden.
+
+Ein Volume kann mit einem beliebigen Dateisystem formatiert werden oder auch ohne ein Dateisystem als reiner Datenspeicher fungieren. Für den Benutzer erscheint ein Volume als eine gewöhnliche Platte. Indem gewöhnliche Dateisysteme auf diesen _zvols_ angelegt werden, ist es möglich, diese mit Eigenschaften auszustatten, welche diese normalerweise nicht besitzen. Beispielsweise wird durch Verwendung der Komprimierungseigenschaft auf einem 250 MB Volume das Erstellen eines komprimierten FAT Dateisystems möglich.
+
+[source,bash]
+....
+# zfs create -V 250m -o compression=on tank/fat32
+# zfs list tank
+NAME USED AVAIL REFER MOUNTPOINT
+tank 258M 670M 31K /tank
+# newfs_msdos -F32 /dev/zvol/tank/fat32
+# mount -t msdosfs /dev/zvol/tank/fat32 /mnt
+# df -h /mnt | grep fat32
+Filesystem Size Used Avail Capacity Mounted on
+/dev/zvol/tank/fat32 249M 24k 249M 0% /mnt
+# mount | grep fat32
+/dev/zvol/tank/fat32 on /mnt (msdosfs, local)
+....
+
+Ein Volume zu zerstören ist sehr ähnlich wie ein herkömmliches Dataset zu entfernen. Die Operation wird beinahe sofort durchgeführt, jedoch kann es mehrere Minuten dauern, bis der freie Speicherplatz im Hintergrund wieder freigegeben ist.
+
+[[zfs-zfs-rename]]
+=== Umbenennen eines Datasets
+
+Der Name eines Datasets lässt sich durch `zfs rename` ändern. Das Eltern-Dataset kann ebenfalls mit diesem Kommando umbenannt werden. Ein Dataset unter einem anderen Elternteil umzubenennen wird den Wert dieser Eigenschaft verändern, die vom Elternteil vererbt wurden. Wird ein Dataset umbenannt, wird es abgehängt und dann erneut unter der neuen Stelle eingehängt (welche vom neuen Elternteil geerbt wird). Dieses Verhalten kann durch die Option `-u` verhindert werden.
+
+Ein Dataset umbenennen und unter einem anderen Elterndataset verschieben:
+
+[source,bash]
+....
+# zfs list
+NAME USED AVAIL REFER MOUNTPOINT
+mypool 780M 93.2G 144K none
+mypool/ROOT 777M 93.2G 144K none
+mypool/ROOT/default 777M 93.2G 777M /
+mypool/tmp 176K 93.2G 176K /tmp
+mypool/usr 704K 93.2G 144K /usr
+mypool/usr/home 184K 93.2G 184K /usr/home
+mypool/usr/mydataset 87.5K 93.2G 87.5K /usr/mydataset
+mypool/usr/ports 144K 93.2G 144K /usr/ports
+mypool/usr/src 144K 93.2G 144K /usr/src
+mypool/var 1.21M 93.2G 614K /var
+mypool/var/crash 148K 93.2G 148K /var/crash
+mypool/var/log 178K 93.2G 178K /var/log
+mypool/var/mail 144K 93.2G 144K /var/mail
+mypool/var/tmp 152K 93.2G 152K /var/tmp
+# zfs rename mypool/usr/mydataset mypool/var/newname
+# zfs list
+NAME USED AVAIL REFER MOUNTPOINT
+mypool 780M 93.2G 144K none
+mypool/ROOT 777M 93.2G 144K none
+mypool/ROOT/default 777M 93.2G 777M /
+mypool/tmp 176K 93.2G 176K /tmp
+mypool/usr 616K 93.2G 144K /usr
+mypool/usr/home 184K 93.2G 184K /usr/home
+mypool/usr/ports 144K 93.2G 144K /usr/ports
+mypool/usr/src 144K 93.2G 144K /usr/src
+mypool/var 1.29M 93.2G 614K /var
+mypool/var/crash 148K 93.2G 148K /var/crash
+mypool/var/log 178K 93.2G 178K /var/log
+mypool/var/mail 144K 93.2G 144K /var/mail
+mypool/var/newname 87.5K 93.2G 87.5K /var/newname
+mypool/var/tmp 152K 93.2G 152K /var/tmp
+....
+
+Schnappschüsse können auf diese Weise ebenfalls umbenannt werden. Aufgrund der Art von Schnappschüssen können diese nicht unter einem anderen Elterndataset eingehängt werden. Um einen rekursiven Schnappschuss umzubenennen, geben Sie die Option `-r` an, um alle Schnappschüsse mit dem gleichen Namen im Kind-Dataset ebenfalls umzubenennen.
+
+[source,bash]
+....
+# zfs list -t snapshot
+NAME USED AVAIL REFER MOUNTPOINT
+mypool/var/newname@first_snapshot 0 - 87.5K -
+# zfs rename mypool/var/newname@first_snapshot new_snapshot_name
+# zfs list -t snapshot
+NAME USED AVAIL REFER MOUNTPOINT
+mypool/var/newname@new_snapshot_name 0 - 87.5K -
+....
+
+[[zfs-zfs-set]]
+=== Festlegen von Dataset-Eigenschaften
+
+Jedes ZFS-Dataset besitzt eine Menge von Eigenschaften, die sein Verhalten beeinflussen. Die meisten Eigenschaften werden automatisch vom Eltern-Dataset vererbt, können jedoch lokal überschrieben werden. Sie legen eine Eigenschaft durch `zfs set __property=value dataset__` fest. Die meisten Eigenschaften haben eine begrenzte Menge von gültigen Werten. `zfs get` stellt diese dar und zeigt jede mögliche Eigenschaft und gültige Werte an. Die meisten Eigenschaften können über `zfs inherit` wieder auf ihren Ausgangswert zurückgesetzt werden.
+
+Benutzerdefinierte Eigenschaften lassen sich ebenfalls setzen. Diese werden Teil der Konfiguration des Datasets und können dazu verwendet werden, zusätzliche Informationen über das Dataset oder seine Bestandteile zu speichern. Um diese benutzerdefinierten Eigenschaften von den ZFS-eigenen zu unterscheiden, wird ein Doppelpunkt (`:`) verwendet, um einen eigenen Namensraum für diese Eigenschaft zu erstellen.
+
+[source,bash]
+....
+# zfs set custom:costcenter=1234 tank
+# zfs get custom:costcenter tank
+NAME PROPERTY VALUE SOURCE
+tank custom:costcenter 1234 local
+....
+
+Um eine selbstdefinierte Eigenschaft umzubenennen, verwenden Sie `zfs inherit` mit der Option `-r`. Wenn die benutzerdefinierte Eigenschaft nicht in einem der Eltern-Datasets definiert ist, wird diese komplett entfernt (obwohl diese Änderungen natürlich in der Historie des Pools noch aufgezeichnet sind).
+
+[source,bash]
+....
+# zfs inherit -r custom:costcenter tank
+# zfs get custom:costcenter tank
+NAME PROPERTY VALUE SOURCE
+tank custom:costcenter - -
+# zfs get all tank | grep custom:costcenter
+#
+....
+
+[[zfs-zfs-set-share]]
+==== Festlegen und Abfragen von Eigenschaften für Freigaben
+
+Zwei häufig verwendete und nützliche Dataset-Eigenschaften sind die Freigabeoptionen von NFS und SMB. Diese Optionen legen fest, ob und wie ZFS-Datasets im Netzwerk freigegeben werden. Derzeit unterstützt FreeBSD nur Freigaben von Datasets über NFS. Um den Status einer Freigabe zu erhalten, geben Sie folgendes ein:
+
+[source,bash]
+....
+# zfs get sharenfs mypool/usr/home
+NAME PROPERTY VALUE SOURCE
+mypool/usr/home sharenfs on local
+# zfs get sharesmb mypool/usr/home
+NAME PROPERTY VALUE SOURCE
+mypool/usr/home sharesmb off local
+....
+
+Um ein Dataset freizugeben, geben Sie ein:
+
+[source,bash]
+....
+# zfs set sharenfs=on mypool/usr/home
+....
+
+Es ist auch möglich, weitere Optionen für die Verwendung von Datasets über NFS zu definieren, wie etwa `-alldirs`, `-maproot` und `-network`. Um zusätzliche Optionen auf ein durch NFS freigegebenes Dataset festzulegen, geben Sie ein:
+
+[source,bash]
+....
+# zfs set sharenfs="-alldirs,maproot=root,-network=192.168.1.0/24" mypool/usr/home
+....
+
+[[zfs-zfs-snapshot]]
+=== Verwalten von Schnappschüssen
+
+<<zfs-term-snapshot,Schnappschüsse>> sind eine der mächtigen Eigenschaften von ZFS. Ein Schnappschuss bietet einen nur-Lese Zustand eines Datasets zu einem bestimmten Zeitpunkt. Mit Kopieren-beim-Schreiben (Copy-On-Write COW), können Schnappschüsse schnell erstellt werden durch das Aufheben der älteren Version der Daten auf der Platte. Falls kein Snapshot existiert, wird der Speicherplatz wieder für zukünftige Verwendung freigegeben wenn Daten geschrieben oder gelöscht werden. Schnappschüsse sparen Speicherplatz, indem diese nur die Unterschiede zwischen dem momentanen Dataset und der vorherigen Version aufzeichnen. Schnappschüsse sind nur auf ganzen Datasets erlaubt, nicht auf individuellen Dateien oder Verzeichnissen. Wenn ein Schnappschuss eines Datasets erstellt wird, wird alles was darin enthalten ist, dupliziert. Das beinhaltet Dateisystemeigenschaften, Dateien, Verzeichnisse, Rechte und so weiter. Schnappschüsse benötigen keinen zusätzlichen Speicherplatz wenn diese erstmals angelegt werden, nur wenn Blöcke, die diese referenzieren, geändert werden. Rekursive Schnappschüsse, die mit der Option `-r` erstellt, erzeugen einen mit dem gleichen Namen des Datasets und all seinen Kindern, was eine konsistente Momentaufnahme aller Dateisysteme darstellt. Dies kann wichtig sein, wenn eine Anwendung Dateien auf mehreren Datasets ablegt, die miteinander in Verbindung stehen oder voneinander abhängig sind. Ohne Schnappschüsse würde ein Backup Kopien dieser Dateien zu unterschiedlichen Zeitpunkten enthalten.
+
+Schnappschüsse in ZFS bieten eine Vielzahl von Eigenschaften, die selbst in anderen Dateisystemen mit Schnappschussfunktion nicht vorhanden sind. Ein typisches Beispiel zur Verwendung von Schnappschüssen ist, den momentanen Stand des Dateisystems zu sichern, wenn eine riskante Aktion wie das Installieren von Software oder eine Systemaktualisierung durchgeführt wird. Wenn diese Aktion fehlschlägt, so kann der Schnappschuss zurückgerollt werden und das System befindet sich wieder in dem gleichen Zustand, wie zu dem, als der Schnappschuss erstellt wurde. Wenn die Aktualisierung jedoch erfolgreich war, kann der Schnappschuss gelöscht werden, um Speicherplatz frei zu geben. Ohne Schnappschüsse, wird durch ein fehlgeschlagenes Update eine Wiederherstellung der Sicherung fällig, was oft mühsam und zeitaufwändig ist, außerdem ist währenddessen das System nicht verwendbar. Schnappschüsse lassen sich schnell und mit wenig bis gar keiner Ausfallzeit zurückrollen, selbst wenn das System im normalen Betrieb läuft. Die Zeitersparnis ist enorm, wenn mehrere Terabyte große Speichersysteme eingesetzt werden und viel Zeit für das Kopieren der Daten vom Sicherungssystem benötigt wird. Schnappschüsse sind jedoch keine Ersatz für eine Vollsicherung des Pools, können jedoch als eine schnelle und einfache Sicherungsmethode verwendet werden, um eine Kopie eines Datasets zu einem bestimmten Zeitpunkt zu sichern.
+
+[[zfs-zfs-snapshot-creation]]
+==== Schnappschüsse erstellen
+
+Schnappschüsse werden durch das Kommando `zfs snapshot _dataset_@_snapshotname_` angelegt. Durch Angabe der Option `-r` werden Schnappschüsse rekursive angelegt, mit dem gleichen Namen auf allen Datasets.
+
+Einen rekursiven Schnappschuss des gesamten Pools erzeugen:
+
+[source,bash]
+....
+# zfs list -t all
+NAME USED AVAIL REFER MOUNTPOINT
+mypool 780M 93.2G 144K none
+mypool/ROOT 777M 93.2G 144K none
+mypool/ROOT/default 777M 93.2G 777M /
+mypool/tmp 176K 93.2G 176K /tmp
+mypool/usr 616K 93.2G 144K /usr
+mypool/usr/home 184K 93.2G 184K /usr/home
+mypool/usr/ports 144K 93.2G 144K /usr/ports
+mypool/usr/src 144K 93.2G 144K /usr/src
+mypool/var 1.29M 93.2G 616K /var
+mypool/var/crash 148K 93.2G 148K /var/crash
+mypool/var/log 178K 93.2G 178K /var/log
+mypool/var/mail 144K 93.2G 144K /var/mail
+mypool/var/newname 87.5K 93.2G 87.5K /var/newname
+mypool/var/newname@new_snapshot_name 0 - 87.5K -
+mypool/var/tmp 152K 93.2G 152K /var/tmp
+# zfs snapshot -r mypool@my_recursive_snapshot
+# zfs list -t snapshot
+NAME USED AVAIL REFER MOUNTPOINT
+mypool@my_recursive_snapshot 0 - 144K -
+mypool/ROOT@my_recursive_snapshot 0 - 144K -
+mypool/ROOT/default@my_recursive_snapshot 0 - 777M -
+mypool/tmp@my_recursive_snapshot 0 - 176K -
+mypool/usr@my_recursive_snapshot 0 - 144K -
+mypool/usr/home@my_recursive_snapshot 0 - 184K -
+mypool/usr/ports@my_recursive_snapshot 0 - 144K -
+mypool/usr/src@my_recursive_snapshot 0 - 144K -
+mypool/var@my_recursive_snapshot 0 - 616K -
+mypool/var/crash@my_recursive_snapshot 0 - 148K -
+mypool/var/log@my_recursive_snapshot 0 - 178K -
+mypool/var/mail@my_recursive_snapshot 0 - 144K -
+mypool/var/newname@new_snapshot_name 0 - 87.5K -
+mypool/var/newname@my_recursive_snapshot 0 - 87.5K -
+mypool/var/tmp@my_recursive_snapshot 0 - 152K -
+....
+
+Schnappschüsse werden nicht durch einen `zfs list`-Befehl angezeigt. Um Schnappschüsse mit aufzulisten, muss `-t snapshot` an das Kommando `zfs list` angehängt werden. Durch `-t all` werden sowohl Dateisysteme als auch Schnappschüsse nebeneinander angezeigt.
+
+Schnappschüsse werden nicht direkt eingehängt, deshalb wird auch kein Pfad in der Spalte `MOUNTPOINT` angezeigt. Ebenso wird kein freier Speicherplatz in der Spalte `AVAIL` aufgelistet, da Schnappschüsse nicht mehr geschrieben werden können, nachdem diese angelegt wurden. Vergleichen Sie den Schnappschuss mit dem ursprünglichen Dataset von dem es abstammt:
+
+[source,bash]
+....
+# zfs list -rt all mypool/usr/home
+NAME USED AVAIL REFER MOUNTPOINT
+mypool/usr/home 184K 93.2G 184K /usr/home
+mypool/usr/home@my_recursive_snapshot 0 - 184K -
+....
+
+Durch das Darstellen des Datasets und des Schnappschusses nebeneinander zeigt deutlich, wie Schnappschüsse in <<zfs-term-cow,COW>> Manier funktionieren. Sie zeichnen nur die Änderungen (_delta_) auf, die währenddessen entstanden sind und nicht noch einmal den gesamten Inhalt des Dateisystems. Das bedeutet, dass Schnappschüsse nur wenig Speicherplatz benötigen, wenn nur kleine Änderungen vorgenommen werden. Der Speicherverbrauch kann sogar noch deutlicher gemacht werden, wenn eine Datei auf das Dataset kopiert wird und anschließend ein zweiter Schnappschuss angelegt wird:
+
+[source,bash]
+....
+# cp /etc/passwd /var/tmp
+# zfs snapshot mypool/var/tmp@after_cp
+# zfs list -rt all mypool/var/tmp
+NAME USED AVAIL REFER MOUNTPOINT
+mypool/var/tmp 206K 93.2G 118K /var/tmp
+mypool/var/tmp@my_recursive_snapshot 88K - 152K -
+mypool/var/tmp@after_cp 0 - 118K -
+....
+
+Der zweite Schnappschuss enthält nur die Änderungen am Dataset, die nach der Kopieraktion gemacht wurden. Dies bedeutet enorme Einsparungen von Speicherplatz. Beachten Sie, dass sich die Größe des Schnappschusses `_mypool/var/tmp@my_recursive_snapshot_` in der Spalte `USED` ebenfalls geändert hat, um die Änderungen von sich selbst und dem Schnappschuss, der im Anschluss angelegt wurde, anzuzeigen.
+
+[[zfs-zfs-snapshot-diff]]
+==== Schnappschüsse vergleichen
+
+ZFS enthält ein eingebautes Kommando, um die Unterschiede zwischen zwei Schnappschüssen miteinander zu vergleichen. Das ist hilfreich, wenn viele Schnappschüsse über längere Zeit angelegt wurden und der Benutzer sehen will, wie sich das Dateisystem über diesen Zeitraum verändert hat. Beispielsweise kann `zfs diff` den letzten Schnappschuss finden, der noch eine Datei enthält, die aus Versehen gelöscht wurde. Wenn dies für die letzten beiden Schnappschüsse aus dem vorherigen Abschnitt durchgeführt wird, ergibt sich folgende Ausgabe:
+
+[source,bash]
+....
+# zfs list -rt all mypool/var/tmp
+NAME USED AVAIL REFER MOUNTPOINT
+mypool/var/tmp 206K 93.2G 118K /var/tmp
+mypool/var/tmp@my_recursive_snapshot 88K - 152K -
+mypool/var/tmp@after_cp 0 - 118K -
+# zfs diff mypool/var/tmp@my_recursive_snapshot
+M /var/tmp/
++ /var/tmp/passwd
+....
+
+Das Kommando zeigt alle Änderungen zwischen dem angegebenen Schnappschuss (in diesem Fall `_mypool/var/tmp@my_recursive_snapshot_`) und dem momentan aktuellen Dateisystem. Die erste Spalte zeigt die Art der Änderung an:
+
+[.informaltable]
+[cols="20%,80%"]
+|===
+
+|+
+|Das Verzeichnis oder die Datei wurde hinzugefügt.
+
+|-
+|Das Verzeichnis oder die Datei wurde gelöscht.
+
+|M
+|Das Verzeichnis oder die Datei wurde geändert.
+
+|R
+|Das Verzeichnis oder die Datei wurde umbenannt.
+|===
+
+Vergleicht man die Ausgabe mit der Tabelle, wird klar, dass [.filename]#passwd# hinzugefügt wurde, nachdem der Schnappschuss `_mypool/var/tmp@my_recursive_snapshot_` erstellt wurde. Das resultierte ebenfalls in einer Änderung am darüberliegenden Verzeichnis, das unter `_/var/tmp_` eingehängt ist.
+
+Zwei Schnappschüsse zu vergleichen ist hilfreich, wenn die Replikationseigenschaft von ZFS verwendet wird, um ein Dataset auf einen anderen Host zu Sicherungszwecken übertragen.
+
+Zwei Schnappschüsse durch die Angabe des kompletten Namens des Datasets und dem Namen des Schnappschusses beider Datasets vergleichen:
+
+[source,bash]
+....
+# cp /var/tmp/passwd /var/tmp/passwd.copy
+# zfs snapshot mypool/var/tmp@diff_snapshot
+# zfs diff mypool/var/tmp@my_recursive_snapshot mypool/var/tmp@diff_snapshot
+M /var/tmp/
++ /var/tmp/passwd
++ /var/tmp/passwd.copy
+# zfs diff mypool/var/tmp@my_recursive_snapshot mypool/var/tmp@after_cp
+M /var/tmp/
++ /var/tmp/passwd
+....
+
+Ein Administrator, der für die Sicherung zuständig ist, kann zwei Schnappschüsse miteinander vergleichen, die vom sendenden Host empfangen wurden, um festzustellen, welche Änderungen am Dataset vorgenommen wurden. Lesen Sie dazu den Abschnitt <<zfs-zfs-send,Replication>> um weitere Informationen zu erhalten.
+
+[[zfs-zfs-snapshot-rollback]]
+==== Schnappschüsse zurückrollen
+
+Wenn zumindest ein Schnappschuss vorhanden ist, kann dieser zu einem beliebigen Zeitpunkt zurückgerollt werden. In den meisten Fällen passiert dies, wenn der aktuelle Zustand des Datasets nicht mehr benötigt wird und eine ältere Version bevorzugt wird. Szenarien wie lokale Entwicklungstests, die fehlgeschlagen sind, defekte Systemaktualisierungen, welche die Funktionalität des Gesamtsystems einschränken oder die Anforderung, versehentlich gelöschte Dateien oder Verzeichnisse wiederherzustellen, sind allgegenwärtig. Glücklicherweise ist das zurückrollen eines Schnappschusses so leicht wie die Eingabe von `zfs rollback _snapshotname_`. Abhängig davon, wie viele Änderungen betroffen sind, wird diese Operation innerhalb einer gewissen Zeit abgeschlossen sein. Während dieser Zeit bleibt das Dataset in einem konsistenten Zustand, sehr ähnlich den ACID-Prinzipien, die eine Datenbank beim Zurückrollen entspricht. Während all dies passiert, ist das Dataset immer noch aktiv und erreichbar ohne dass eine Ausfallzeit nötig wäre. Sobald der Schnappschuss zurückgerollt wurde, besitzt das Dataset den gleichen Zustand, den es besaß, als der Schnappschuss angelegt wurde. Alle anderen Daten in diesem Dataset, die nicht Teil des Schnappschusses sind, werden verworfen. Einen Schnappschuss des aktuellen Zustandes des Datasets vor dem Zurückrollen anzulegen ist eine gute Idee, wenn hinterher noch Daten benötigt werden. Auf diese Weise kann der Benutzer vor und zurück zwischen den Schnappschüssen springen, ohne wertvolle Daten zu verlieren.
+
+Im ersten Beispiel wird ein Schnappschuss aufgrund eines unvorsichtigen `rm`-Befehls zurückgerollt, der mehr Daten gelöscht hat, als vorgesehen.
+
+[source,bash]
+....
+# zfs list -rt all mypool/var/tmp
+NAME USED AVAIL REFER MOUNTPOINT
+mypool/var/tmp 262K 93.2G 120K /var/tmp
+mypool/var/tmp@my_recursive_snapshot 88K - 152K -
+mypool/var/tmp@after_cp 53.5K - 118K -
+mypool/var/tmp@diff_snapshot 0 - 120K -
+# ls /var/tmp
+passwd passwd.copy vi.recover
+# rm /var/tmp/passwd*
+# ls /var/tmp
+vi.recover
+#
+....
+
+Zu diesem Zeitpunkt bemerkt der Benutzer, dass zuviele Dateien gelöscht wurden und möchte diese zurück haben. ZFS bietet eine einfache Möglichkeit, diese durch zurückrollen zurück zu bekommen, allerdings nur, wenn Schnappschüsse von wichtigen Daten regelmäßig angelegt werden. Um die Dateien zurückzuerhalten und vom letzten Schnappschuss wieder zu beginnen, geben Sie ein:
+
+[source,bash]
+....
+# zfs rollback mypool/var/tmp@diff_snapshot
+# ls /var/tmp
+passwd passwd.copy vi.recover
+....
+
+Die Operation zum Zurückrollen versetzt das Dataset in den Zustand des letzten Schnappschusses zurück. Es ist ebenfalls möglich, zu einem Schnappschuss zurückzurollen, der viel früher angelegt wurde und es noch Schnappschüsse nach diesem gibt. Wenn Sie dies versuchen, gibt ZFS die folgende Warnung aus:
+
+[source,bash]
+....
+# zfs list -rt snapshot mypool/var/tmp
+AME USED AVAIL REFER MOUNTPOINT
+mypool/var/tmp@my_recursive_snapshot 88K - 152K -
+mypool/var/tmp@after_cp 53.5K - 118K -
+mypool/var/tmp@diff_snapshot 0 - 120K -
+# zfs rollback mypool/var/tmp@my_recursive_snapshot
+cannot rollback to 'mypool/var/tmp@my_recursive_snapshot': more recent snapshots exist
+use '-r' to force deletion of the following snapshots:
+mypool/var/tmp@after_cp
+mypool/var/tmp@diff_snapshot
+....
+
+Diese Warnung bedeutet, dass noch Schnappschüsse zwischen dem momentanen Stand des Datasets und dem Schnappschuss, zu dem der Benutzer zurückrollen möchte, existieren. Um das Zurückrollen durchzuführen, müssen die Schnappschüsse gelöscht werden. ZFS kann nicht alle Änderungen zwischen verschiedenen Zuständen eines Datasets verfolgen, da Schnappschüsse nur gelesen werden können. ZFS wird nicht die betroffenen Schnappschüsse löschen, es sei denn, der Benutzer verwendet die Option `-r`, um anzugeben, dass dies die gewünschte Aktion ist. Falls dies der Fall ist und die Konsequenzen alle dazwischenliegenden Schnappschüsse zu verlieren verstanden wurden, kann der Befehl abgesetzt werden:
+
+[source,bash]
+....
+# zfs rollback -r mypool/var/tmp@my_recursive_snapshot
+# zfs list -rt snapshot mypool/var/tmp
+NAME USED AVAIL REFER MOUNTPOINT
+mypool/var/tmp@my_recursive_snapshot 8K - 152K -
+# ls /var/tmp
+vi.recover
+....
+
+Die Ausgabe von `zfs list -t snapshot` bestätigt, dass die dazwischenliegenden Schnappschüsse als Ergebnis von `zfs rollback -r` entfernt wurden.
+
+[[zfs-zfs-snapshot-snapdir]]
+==== Individuelle Dateien aus Schnappschüssen wiederherstellen
+
+Schnappschüsse sind unter einem versteckten Verzeichnis unter dem Eltern-Dataset eingehängt: [.filename]#.zfs/snapshots/snapshotname#. Standardmäßig werden diese Verzeichnisse nicht von einem gewöhnlichen `ls -a` angezeigt. Obwohl diese Verzeichnisse nicht angezeigt werden, sind diese trotzdem vorhanden und der Zugriff darauf erfolgt wie auf jedes andere Verzeichnis. Die Eigenschaft `snapdir` steuert, ob diese Verzeichnisse beim Auflisten eines Verzeichnisses angezeigt werden oder nicht. Das Einstellen der Eigenschaft auf den Wert `visible` erlaubt es, diese in der Ausgabe von `ls` und anderen Kommandos, die mit Verzeichnisinhalten umgehen können, anzuzeigen.
+
+[source,bash]
+....
+# zfs get snapdir mypool/var/tmp
+NAME PROPERTY VALUE SOURCE
+mypool/var/tmp snapdir hidden default
+# ls -a /var/tmp
+. .. passwd vi.recover
+# zfs set snapdir=visible mypool/var/tmp
+# ls -a /var/tmp
+. .. .zfs passwd vi.recover
+....
+
+Einzelne Dateien lassen sich einfach auf einen vorherigen Stand wiederherstellen, indem diese aus dem Schnappschuss zurück in das Eltern-Dataset kopiert werden. Die Verzeichnisstruktur unterhalb von [.filename]#.zfs/snapshot# enthält ein Verzeichnis, das exakt wie der Schnappschuss benannt ist, der zuvor angelegt wurde, um es einfacher zu machen, diese zu identifizieren. Im nächsten Beispiel wird angenommen, dass eine Datei aus dem versteckten [.filename]#.zfs# Verzeichnis durch kopieren aus dem Schnappschuss, der die letzte Version dieser Datei enthielt, wiederhergestellt wird:
+
+[source,bash]
+....
+# rm /var/tmp/passwd
+# ls -a /var/tmp
+. .. .zfs vi.recover
+# ls /var/tmp/.zfs/snapshot
+after_cp my_recursive_snapshot
+# ls /var/tmp/.zfs/snapshot/after_cp
+passwd vi.recover
+# cp /var/tmp/.zfs/snapshot/after_cp/passwd /var/tmp
+....
+
+Als `ls .zfs/snapshot` ausgeführt wurde, war die `snapdir`-Eigenschaft möglicherweise nicht auf hidden gesetzt, trotzdem ist es immer noch möglich, den Inhalt dieses Verzeichnisses aufzulisten. Es liegt am Administrator zu entscheiden, ob diese Verzeichnisse angezeigt werden soll. Es ist möglich, diese für bestimmte Datasets anzuzeigen und für andere zu verstecken. Das Kopieren von Dateien oder Verzeichnissen aus diesem versteckten [.filename]#.zfs/snapshot# Verzeichnis ist einfach genug. Jedoch führt der umgekehrte Weg zu einem Fehler:
+
+[source,bash]
+....
+# cp /etc/rc.conf /var/tmp/.zfs/snapshot/after_cp/
+cp: /var/tmp/.zfs/snapshot/after_cp/rc.conf: Read-only file system
+....
+
+Der Fehler erinnert den Benutzer daran, dass Schnappschüsse nur gelesen aber nicht mehr geändert werden können, nachdem diese angelegt wurden. Es können keine Dateien in diese Schnappschuss-Verzeichnisse kopiert oder daraus gelöscht werden, da dies sonst den Zustand des Datasets verändern würde, den sie repräsentieren.
+
+Schnappschüsse verbrauchen Speicherplatz basierend auf der Menge an Änderungen, die am Eltern-Dataset durchgeführt wurden, seit der Zeit als der Schnappschuss erstellt wurde. Die Eigenschaft `written` eines Schnappschusses verfolgt, wieviel Speicherplatz vom Schnappschuss belegt wird.
+
+Schnappschüsse werden zerstört und der belegte Platz wieder freigegeben durch den Befehl `zfs destroy _dataset_@_snapshot_`. Durch hinzufügen von `-r` werden alle Schnappschüsse rekursiv gelöscht, die den gleichen Namen wie das Eltern-Dataset besitzen. Mit der Option `-n -v` wird eine Liste von Schnappschüssen, die gelöscht werden würden, zusammen mit einer geschätzten Menge an zurückgewonnenem Speicherplatz angezeigt, ohne die eigentliche Zerstöroperation wirklich durchzuführen.
+
+[[zfs-zfs-clones]]
+=== Klone verwalten
+
+Ein Klon ist eine Kopie eines Schnappschusses, der mehr wie ein reguläres Dataset behandelt wird. Im Gegensatz zu Schnappschüssen kann man von einem Klon nicht nur lesen, er ist eingehängt und kann seine eigenen Eigenschaften haben. Sobald ein Klon mittels `zfs clone` erstellt wurde, lässt sich der zugrundeliegende Schnappschuss nicht mehr zerstören. Die Eltern-/Kindbeziehung zwischen dem Klon und dem Schnappschuss kann über `zfs promote` aufgelöst werden. Nachdem ein Klon auf diese Weise befördert wurde, wird der Schnappschuss zum Kind des Klons, anstatt des ursprünglichen Datasets. Dies wird die Art und Weise, wie der Speicherplatz berechnet wird, verändern, jedoch nicht den bereits belegten Speicher anpassen. Der Klon kann an einem beliebigen Punkt innerhalb der ZFS-Dateisystemhierarchie eingehängt werden, nur nicht unterhalb der ursprünglichen Stelle des Schnappschusses.
+
+Um diese Klon-Funktionalität zu demonstrieren, wird dieses Beispiel-Dataset verwendet:
+
+[source,bash]
+....
+# zfs list -rt all camino/home/joe
+NAME USED AVAIL REFER MOUNTPOINT
+camino/home/joe 108K 1.3G 87K /usr/home/joe
+camino/home/joe@plans 21K - 85.5K -
+camino/home/joe@backup 0K - 87K -
+....
+
+Ein typischer Einsatzzweck für Klone ist das experimentieren mit einem bestimmten Dataset, während der Schnappschuss beibehalten wird für den Fall, dass etwas schiefgeht. Da Schnappschüsse nicht verändert werden können, wird ein Lese-/Schreibklon des Schnappschusses angelegt. Nachdem das gewünschte Ergebnis im Klon erreicht wurde, kann der Klon zu einem Dataset ernannt und das alte Dateisystem entfernt werden. Streng genommen ist das nicht nötig, da der Klon und das Dataset ohne Probleme miteinander koexistieren können.
+
+[source,bash]
+....
+# zfs clone camino/home/joe@backup camino/home/joenew
+# ls /usr/home/joe*
+/usr/home/joe:
+backup.txz plans.txt
+
+/usr/home/joenew:
+backup.txz plans.txt
+# df -h /usr/home
+Filesystem Size Used Avail Capacity Mounted on
+usr/home/joe 1.3G 31k 1.3G 0% /usr/home/joe
+usr/home/joenew 1.3G 31k 1.3G 0% /usr/home/joenew
+....
+
+Nachdem ein Klon erstellt wurde, stellt er eine exakte Kopie des Datasets zu dem Zeitpunkt dar, als der Schnappschuss angelegt wurde. Der Klon kann nun unabhängig vom ursprünglichen Dataset geändert werden. Die einzige Verbindung zwischen den beiden ist der Schnappschuss. ZFS zeichnet diese Verbindung in der Eigenschaft namens `origin` auf. Sobald die Abhängigkeit zwischen dem Schnappschuss und dem Klon durch das Befördern des Klons mittels `zfs promote` entfernt wurde, wird auch die `origin`-Eigenschaft des Klons entfernt, da es sich nun um ein eigenständiges Dataset handelt. Dieses Beispiel demonstriert dies:
+
+[source,bash]
+....
+# zfs get origin camino/home/joenew
+NAME PROPERTY VALUE SOURCE
+camino/home/joenew origin camino/home/joe@backup -
+# zfs promote camino/home/joenew
+# zfs get origin camino/home/joenew
+NAME PROPERTY VALUE SOURCE
+camino/home/joenew origin - -
+....
+
+Nachdem ein paar Änderungen, wie beispielsweise das Kopieren von [.filename]#loader.conf# auf den beförderten Klon vorgenommen wurden, wird das alte Verzeichnis in diesem Fall überflüssig. Stattdessen kann der beförderte Klon diesen ersetzen. Dies kann durch zwei aufeinanderfolgende Befehl geschehen: `zfs destroy` auf dem alten Dataset und `zfs rename` auf dem Klon, um diesen genauso wie das alte Dataset zu benennen (es kann auch einen ganz anderen Namen erhalten).
+
+[source,bash]
+....
+# cp /boot/defaults/loader.conf /usr/home/joenew
+# zfs destroy -f camino/home/joe
+# zfs rename camino/home/joenew camino/home/joe
+# ls /usr/home/joe
+backup.txz loader.conf plans.txt
+# df -h /usr/home
+Filesystem Size Used Avail Capacity Mounted on
+usr/home/joe 1.3G 128k 1.3G 0% /usr/home/joe
+....
+
+Der geklonte Schnappschuss wird jetzt wie ein gewöhnliches Dataset behandelt. Es enthält alle Daten aus dem ursprünglichen Schnappschuss inklusive der Dateien, die anschließend hinzugefügt wurden, wie [.filename]#loader.conf#. Klone können in unterschiedlichen Szenarien eingesetzt werden, um nützliche Eigenschaften für ZFS-Anwender zur Verfügung zu stellen. Zum Beispiel können Jails als Schnappschüsse bereitgestellt werden, die verschiedene Arten von installierten Anwendungen anbieten. Anwender können diese Schnappschüsse klonen und ihre eigenen Anwendungen nach Belieben hinzufügen. Sobald sie mit den Änderungen zufrieden sind, können die Klone zu vollständigen Datasets ernannt werden und dem Anwender zur Verfügung gestellt werden, als würde es sich um echte Datasets handeln. Das spart Zeit und Administrationsaufwand, wenn diese Jails auf diese Weise zur Verfügung gestellt werden.
+
+[[zfs-zfs-send]]
+=== Replikation
+
+Daten auf einem einzigen Pool an einem Platz aufzubewahren, setzt diese dem Risiko aus, gestohlen oder Opfer von Naturgewalten zu werden, sowie menschlichem Versagen auszusetzen. Regelmäßige Sicherungen des gesamten Pools ist daher unerlässlich. ZFS bietet eine Reihe von eingebauten Serialisierungsfunktionen an, die in der Lage ist, eine Repräsentation der Daten als Datenstrom auf die Standardausgabe zu schreiben. Mit dieser Methode ist es nicht nur möglich, die Daten auf einen anderen Pool zu schicken, der an das lokale System angeschlossen ist, sondern ihn auch über ein Netzwerk an ein anderes System zu senden. Schnappschüsse stellen dafür die Replikationsbasis bereit (lesen Sie dazu den Abschnitt zu <<zfs-zfs-snapshot,ZFS snapshots>>). Die Befehle, die für die Replikation verwendet werden, sind `zfs send` und `zfs receive`.
+
+Diese Beispiele demonstrieren die Replikation von ZFS anhand dieser beiden Pools:
+
+[source,bash]
+....
+# zpool list
+NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
+backup 960M 77K 896M - - 0% 0% 1.00x ONLINE -
+mypool 984M 43.7M 940M - - 0% 4% 1.00x ONLINE -
+....
+
+Der Pool namens _mypool_ ist der primäre Pool, auf den regelmäßig Daten geschrieben und auch wieder gelesen werden. Ein zweiter Pool, genannt _backup_ wird verwendet, um als Reserve zu dienen im Falle, dass der primäre Pool nicht zur Verfügung steht. Beachten Sie, dass diese Ausfallsicherung nicht automatisch von ZFS durchgeführt wird, sondern manuell von einem Systemadministrator bei Bedarf eingerichtet werden muss. Ein Schnappschuss wird verwendet, um einen konsistenten Zustand des Dateisystems, das repliziert werden soll, zu erzeugen. Sobald ein Schnappschuss von _mypool_ angelegt wurde, kann er auf den _backup_-Pool abgelegt werden. Nur Schnappschüsse lassen sich auf diese Weise replizieren. Änderungen, die seit dem letzten Schnappschuss entstanden sind, werden nicht mit repliziert.
+
+[source,bash]
+....
+# zfs snapshot mypool@backup1
+# zfs list -t snapshot
+NAME USED AVAIL REFER MOUNTPOINT
+mypool@backup1 0 - 43.6M -
+....
+
+Da nun ein Schnappschuss existiert, kann mit `zfs send` ein Datenstrom, der den Inhalt des Schnappschusses repräsentiert, erstellt werden. Dieser Datenstrom kann als Datei gespeichert oder von einem anderen Pool empfangen werden. Der Datenstrom wird auf die Standardausgabe geschrieben, muss jedoch in eine Datei oder in eine Pipe umgeleitet werden, sonst wird ein Fehler produziert:
+
+[source,bash]
+....
+# zfs send mypool@backup1
+Error: Stream can not be written to a terminal.
+You must redirect standard output.
+....
+
+Um ein Dataset mit `zfs send` zu replizieren, leiten Sie dieses in eine Datei auf dem eingehängten Backup-Pool um. Stellen Sie sicher, dass der Pool genug freien Speicherplatz besitzt, um die Größe des gesendeten Schnappschusses aufzunehmen. Das beinhaltet alle Daten im Schnappschuss, nicht nur die Änderungen zum vorherigen Schnappschuss.
+
+[source,bash]
+....
+# zfs send mypool@backup1 > /backup/backup1
+# zpool list
+NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
+backup 960M 63.7M 896M - - 0% 6% 1.00x ONLINE -
+mypool 984M 43.7M 940M - - 0% 4% 1.00x ONLINE -
+....
+
+Das Kommando `zfs send` transferierte alle Daten im _backup1_-Schnappschuss auf den Pool namens _backup_. Erstellen und senden eines Schnappschusses kann automatisch von man:cron[8] durchgeführt werden.
+
+Anstatt die Sicherungen als Archivdateien zu speichern, kann ZFS diese auch als aktives Dateisystem empfangen, was es erlaubt, direkt auf die gesicherten Daten zuzugreifen. Um an die eigentlichen Daten in diesem Strom zu gelangen, wird `zfs receive` benutzt, um den Strom wieder in Dateien und Verzeichnisse umzuwandeln. Das Beispiel unten kombiniert `zfs send` und `zfs receive` durch eine Pipe, um die Daten von einem Pool auf den anderen zu kopieren. Die Daten können direkt auf dem empfangenden Pool verwendet werden, nachdem der Transfer abgeschlossen ist. Ein Dataset kann nur auf ein leeres Dataset repliziert werden.
+
+[source,bash]
+....
+# zfs snapshot mypool@replica1
+# zfs send -v mypool@replica1 | zfs receive backup/mypool
+send from @ to mypool@replica1 estimated size is 50.1M
+total estimated size is 50.1M
+TIME SENT SNAPSHOT
+
+# zpool list
+NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
+backup 960M 63.7M 896M - - 0% 6% 1.00x ONLINE -
+mypool 984M 43.7M 940M - - 0% 4% 1.00x ONLINE -
+....
+
+[[zfs-send-incremental]]
+==== Inkrementelle Sicherungen
+
+Die Unterschiede zwischen zwei Schnappschüssen kann `zfs send` ebenfalls erkennen und nur diese übertragen. Dies spart Speicherplatz und Übertragungszeit. Beispielsweise:
+
+[source,bash]
+....
+# zfs snapshot mypool@replica2
+# zfs list -t snapshot
+NAME USED AVAIL REFER MOUNTPOINT
+mypool@replica1 5.72M - 43.6M -
+mypool@replica2 0 - 44.1M -
+# zpool list
+NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
+backup 960M 61.7M 898M - - 0% 6% 1.00x ONLINE -
+mypool 960M 50.2M 910M - - 0% 5% 1.00x ONLINE -
+....
+
+Ein zweiter Schnappschuss genannt _replica2_ wurde angelegt. Dieser zweite Schnappschuss enthält nur die Änderungen, die zwischen dem jetzigen Stand des Dateisystems und dem vorherigen Schnappschuss, _replica1_, vorgenommen wurden. Durch `zfs send -i` und die Angabe des Schnappschusspaares wird ein inkrementeller Replikationsstrom erzeugt, welcher nur die Daten enthält, die sich geändert haben. Das kann nur erfolgreich sein, wenn der initiale Schnappschuss bereits auf der Empfängerseite vorhanden ist.
+
+[source,bash]
+....
+# zfs send -v -i mypool@replica1 mypool@replica2 | zfs receive /backup/mypool
+send from @replica1 to mypool@replica2 estimated size is 5.02M
+total estimated size is 5.02M
+TIME SENT SNAPSHOT
+
+# zpool list
+NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
+backup 960M 80.8M 879M - - 0% 8% 1.00x ONLINE -
+mypool 960M 50.2M 910M - - 0% 5% 1.00x ONLINE -
+
+# zfs list
+NAME USED AVAIL REFER MOUNTPOINT
+backup 55.4M 240G 152K /backup
+backup/mypool 55.3M 240G 55.2M /backup/mypool
+mypool 55.6M 11.6G 55.0M /mypool
+
+# zfs list -t snapshot
+NAME USED AVAIL REFER MOUNTPOINT
+backup/mypool@replica1 104K - 50.2M -
+backup/mypool@replica2 0 - 55.2M -
+mypool@replica1 29.9K - 50.0M -
+mypool@replica2 0 - 55.0M -
+....
+
+Der inkrementelle Datenstrom wurde erfolgreich übertragen. Nur die Daten, die verändert wurden, sind übertragen worden, anstatt das komplette _replica1_. Nur die Unterschiede wurden gesendet, was weniger Zeit und Speicherplatz in Anspruch genommen hat, statt jedesmal den gesamten Pool zu kopieren. Das ist hilfreich wenn langsame Netzwerke oder Kosten für die übertragene Menge Bytes in Erwägung gezogen werden müssen.
+
+Ein neues Dateisystem, _backup/mypool_, ist mit allen Dateien und Daten vom Pool _mypool_ verfügbar. Wenn die Option `-P` angegeben wird, werden die Eigenschaften des Datasets kopiert, einschließlich der Komprimierungseinstellungen, Quotas und Einhängepunkte. Wird die Option `-R` verwendet, so werden alle Kind-Datasets des angegebenen Datasets kopiert, zusammen mit ihren Eigenschaften. Senden und Empfangen kann automatisiert werden, so dass regelmäßig Sicherungen auf dem zweiten Pool angelegt werden.
+
+[[zfs-send-ssh]]
+==== Sicherungen verschlüsselt über SSH senden
+
+Datenströme über das Netzwerk zu schicken ist eine gute Methode, um Sicherungen außerhalb des Systems anzulegen. Jedoch ist dies auch mit einem Nachteil verbunden. Daten, die über die Leitung verschickt werden, sind nicht verschlüsselt, was es jedem erlaubt, die Daten abzufangen und die Ströme wieder zurück in Daten umzuwandeln, ohne dass der sendende Benutzer davon etwas merkt. Dies ist eine unerwünschte Situation, besonders wenn die Datenströme über das Internet auf ein entferntes System gesendet werden. SSH kann benutzt werden, um durch Verschlüsselung geschützte Daten über eine Netzwerkverbindung zu übertragen. Da ZFS nur die Anforderung hat, dass der Strom von der Standardausgabe umgeleitet wird, ist es relativ einfach, diesen durch SSH zu leiten. Um den Inhalt des Dateisystems während der Übertragung und auf dem entfernten System weiterhin verschlüsselt zu lassen, denken Sie über den Einsatz von https://wiki.freebsd.org/PEFS[PEFS] nach.
+
+Ein paar Einstellungen und Sicherheitsvorkehrungen müssen zuvor abgeschlossen sein. Es werden hier nur die nötigen Schritte für die `zfs send`-Aktion gezeigt. Weiterführende Informationen zu SSH, gibt es im Kapitel crossref:security[openssh,"OpenSSH"].
+
+Die folgende Konfiguration wird benötigt:
+
+* Passwortloser SSH-Zugang zwischen dem sendenden und dem empfangenden Host durch den Einsatz von SSH-Schlüsseln.
+* Normalerweise werden die Privilegien des `root`-Benutzers gebraucht, um Strom zu senden und zu empfangen. Das beinhaltet das Anmelden auf dem empfangenden System als `root`. Allerdings ist das Anmelden als `root` aus Sicherheitsgründen standardmäßig deaktiviert. Mit <<zfs-zfs-allow,ZFS Delegation>> lassen sich nicht-`root`-Benutzer auf jedem System einrichten, welche die nötigen Rechte besitzen, um die Sende- und Empfangsoperation durchzuführen.
+* Auf dem sendenden System:
++
+[source,bash]
+....
+# zfs allow -u someuser send,snapshot mypool
+....
+
+* Um den Pool einzuhängen, muss der unprivilegierte Benutzer das Verzeichnis besitzen und gewöhnliche Benutzern muss die Erlaubnis gegeben werden, das Dateisystem einzuhängen. Auf dem empfangenden System nehmen Sie dazu die folgenden Einstellungen vor:
++
+[source,bash]
+....
+# sysctl vfs.usermount=1
+vfs.usermount: 0 -> 1
+# echo vfs.usermount=1 >> /etc/sysctl.conf
+# zfs create recvpool/backup
+# zfs allow -u someuser create,mount,receive recvpool/backup
+# chown someuser /recvpool/backup
+....
+
+Der unprivilegierte Benutzer hat jetzt die Fähigkeit, Datasets zu empfangen und einzuhängen und das _home_-Dataset auf das entfernte System zu replizieren:
+
+[source,bash]
+....
+% zfs snapshot -r mypool/home@monday
+% zfs send -R mypool/home@monday | ssh someuser@backuphost zfs recv -dvu recvpool/backup
+....
+
+Ein rekursiver Schnappschuss namens _monday_ wird aus dem Dataset _home_ erstellt, dass auf dem Pool _mypool_ liegt. Es wird dann mit `zfs send -R` gesendet, um das Dataset, alle seine Kinder, Schnappschüsse, Klone und Einstellungen in den Strom mit aufzunehmen. Die Ausgabe wird an das wartende System _backuphost_ mittels `zfs receive` durch SSH umgeleitet. Die Verwendung des Fully Qulified Domänennamens oder der IP-Adresse wird empfohlen. Die empfangende Maschine schreibt die Daten auf das _backup_-Dataset im _recvpool_-Pool. Hinzufügen der Option `-d` zu `zfs recv` überschreibt den Namen des Pools auf der empfangenden Seite mit dem Namen des Schnappschusses. Durch Angabe von `-u` wird das Dateisystem nicht auf der Empfängerseite eingehängt. Wenn `-v` enthalten ist, werden mehr Details zum Transfer angezeigt werden, einschließlich der vergangenen Zeit und der Menge an übertragenen Daten.
+
+[[zfs-zfs-quota]]
+=== Dataset-, Benutzer- und Gruppenquotas
+
+<<zfs-term-quota,Dataset-Quotas>> werden eingesetzt, um den Speicherplatz einzuschränken, den ein bestimmtes Dataset verbrauchen kann. <<zfs-term-refquota,Referenz-Quotas>> funktionieren auf eine ähnliche Weise, jedoch wird dabei der Speicherplatz des Datasets selbst gezählt, wobei Schnappschüsse und Kind-Datasets dabei ausgenommen sind. Ähnlich dazu werden <<zfs-term-userquota,Benutzer>>- und <<zfs-term-groupquota,Gruppen>>-Quotas dazu verwendet, um Benutzer oder Gruppen daran zu hindern, den gesamten Speicherplatz im Pool oder auf dem Dataset zu verbrauchen.
+
+Die folgenden Beispiele gehen davon aus, dass die Benutzer bereits im System vorhanden sind. Bevor Sie einen Benutzer hinzufügen, stellen Sie sicher, dass Sie zuerst ein Dataset für das Heimatverzeichnis anlegen und den `mountpoint` auf `/home/_bob_` festlegen. Legen Sie dann den Benutzer an und stellen Sie sicher, dass das Heimatverzeichnis auf den auf den `mountpoint` des Datasets verweist. Auf diese Weise werden die Eigentümer- und Gruppenberechtigungen richtig gesetzt, ohne dass bereits vorhandene Heimatverzeichnisse verschleiert werden.
+
+Um ein 10 GB großes Quota auf dem Dataset [.filename]#storage/home/bob# zu erzwingen, verwenden Sie folgenden Befehl:
+
+[source,bash]
+....
+# zfs set quota=10G storage/home/bob
+....
+
+Um ein Referenzquota von 10 GB für [.filename]#storage/home/bob# festzulegen, geben Sie ein:
+
+[source,bash]
+....
+# zfs set refquota=10G storage/home/bob
+....
+
+Um das Quota für [.filename]#storage/home/bob# wieder zu entfernen:
+
+[source,bash]
+....
+# zfs set quota=none storage/home/bob
+....
+
+Das generelle Format ist `userquota@_user_=_size_` und der Name des Benutzers muss in einem der folgenden Formate vorliegen:
+
+* POSIX-kompatibler Name wie _joe_.
+* POSIX-numerische ID wie _789_.
+* SID-Name wie _joe.bloggs@example.com_.
+* SID-numerische ID wie _S-1-123-456-789_.
+
+Um beispielsweise ein Benutzerquota von 50 GB für den Benutzer names _joe_ zu erzwingen:
+
+[source,bash]
+....
+# zfs set userquota@joe=50G
+....
+
+Um jegliche Quotas zu entfernen:
+
+[source,bash]
+....
+# zfs set userquota@joe=none
+....
+
+[NOTE]
+====
+Benutzerquota-Eigenschaften werden nicht von `zfs get all` dargestellt. Nicht-`root`-Benutzer können nur ihre eigenen Quotas sehen, ausser ihnen wurde das `userquota`-Privileg zugeteilt. Benutzer mit diesem Privileg sind in der Lage, jedermanns Quota zu sehen und zu verändern.
+====
+
+Das generelle Format zum Festlegen einer Gruppenquota lautet: `groupquota@_group_=_size_`.
+
+Um ein Quota für die Gruppe _firstgroup_ von 50 GB zu setzen, geben Sie ein:
+
+[source,bash]
+....
+# zfs set groupquota@firstgroup=50G
+....
+
+Um eine Quota für die Gruppe _firstgroup_ zu setzen oder sicherzustellen, dass diese nicht gesetzt ist, verwenden Sie stattdessen:
+
+[source,bash]
+....
+# zfs set groupquota@firstgroup=none
+....
+
+Genau wie mit der Gruppenquota-Eigenschaft, werden nicht-`root`-Benutzer nur die Quotas sehen, die den Gruppen zugeordnet ist, in denen Sie Mitglied sind. Allerdings ist `root` oder ein Benutzer mit dem `groupquota`-Privileg in der Lage, die Quotas aller Gruppen zu sehen und festzusetzen.
+
+Um die Menge an Speicherplatz zusammen mit der Quota anzuzeigen, die von jedem Benutzer auf dem Dateisystem oder Schnappschuss verbraucht wird, verwenden Sie `zfs userspace`. Für Gruppeninformationen, nutzen Sie `zfs groupspace`. Für weitere Informationen zu unterstützten Optionen oder wie sich nur bestimmte Optionen anzeigen lassen, lesen Sie man:zfs[1].
+
+Benutzer mit ausreichenden Rechten sowie `root` können das Quota für [.filename]#storage/home/bob# anzeigen lassen:
+
+[source,bash]
+....
+# zfs get quota storage/home/bob
+....
+
+[[zfs-zfs-reservation]]
+=== Reservierungen
+
+<<zfs-term-reservation,Reservierungen>> garantieren ein Minimum an Speicherplatz, der immer auf dem Dataset verfügbar sein wird. Der reservierte Platz wird nicht für andere Datasets zur Verfügung stehen. Diese Eigenschaft kann besonders nützlich sein, um zu gewährleisten, dass freier Speicherplatz für ein wichtiges Dataset oder für Logdateien bereit steht.
+
+Das generelle Format der `reservation`-Eigenschaft ist `reservation=_size_`. Um also eine Reservierung von 10 GB auf [.filename]#storage/home/bob# festzulegen, geben Sie Folgendes ein:
+
+[source,bash]
+....
+# zfs set reservation=10G storage/home/bob
+....
+
+Um die Reservierung zu beseitigen:
+
+[source,bash]
+....
+# zfs set reservation=none storage/home/bob
+....
+
+Das gleiche Prinzip kann auf die `refreservation`-Eigenschaft angewendet werden, um eine <<zfs-term-refreservation,Referenzreservierung>> mit dem generellen Format `refreservation=_size_` festzulegen.
+
+Dieser Befehl zeigt die Reservierungen oder Referenzreservierungen an, die auf [.filename]#storage/home/bob# existieren:
+
+[source,bash]
+....
+# zfs get reservation storage/home/bob
+# zfs get refreservation storage/home/bob
+....
+
+[[zfs-zfs-compression]]
+=== Komprimierung
+
+ZFS bietet transparente Komprimierung. Datenkomprimierung auf Blockebene während diese gerade geschrieben werden, spart nicht nur Plattenplatz ein, sondern kann auch den Durchsatz der Platte steigern. Falls Daten zu 25% komprimiert sind, jedoch die komprimierten Daten im gleichen Tempo wie ihre unkomprimierte Version, resultiert das in einer effektiven Schreibgeschwindigkeit von 125%. Komprimierung kann auch eine Alternative zu <<zfs-zfs-deduplication,Deduplizierung>> darstellen, da es viel weniger zusätzlichen Hauptspeicher benötigt.
+
+ZFS bietet mehrere verschiedene Kompressionsalgorithmen an, jede mit unterschiedlichen Kompromissen. Mit der Einführung von LZ4-Komprimierung in ZFS v5000, ist es möglich, Komprimierung für den gesamten Pool zu aktivieren, ohne die großen Geschwindigkeitseinbußen der anderen Algorithmen. Der größte Vorteil von LZ4 ist die Eigenschaft _früher Abbruch_. Wenn LZ4 nicht mindestens 12,5% Komprimierung im ersten Teil der Daten erreicht, wird der Block unkomprimiert geschrieben, um die Verschwendung von CPU-Zyklen zu vermeiden, weil die Daten entweder bereits komprimiert sind oder sich nicht komprimieren lassen. Für Details zu den verschiedenen verfügbaren Komprimierungsalgorithmen in ZFS, lesen Sie den Eintrag <<zfs-term-compression,Komprimierung>> im Abschnitt Terminologie
+
+Der Administrator kann die Effektivität der Komprimierung über eine Reihe von Dataset-Eigenschaften überwachen.
+
+[source,bash]
+....
+# zfs get used,compressratio,compression,logicalused mypool/compressed_dataset
+NAME PROPERTY VALUE SOURCE
+mypool/compressed_dataset used 449G -
+mypool/compressed_dataset compressratio 1.11x -
+mypool/compressed_dataset compression lz4 local
+mypool/compressed_dataset logicalused 496G -
+....
+
+Dieses Dataset verwendet gerade 449 GB Plattenplatz (used-Eigenschaft. Ohne Komprimierung würde es stattdessen 496 GB Plattenplatz belegen (`logicalused`). Das ergibt eine Kompressionsrate von 1,11:1.
+
+Komprimierung kann einen unerwarteten Nebeneffekt haben, wenn diese mit <<zfs-term-userquota,Benutzerquotas>> kombiniert wird. Benutzerquotas beschränken, wieviel Speicherplatz ein Benutzer auf einem Dataset verbrauchen kann. Jedoch basieren die Berechnungen darauf, wieviel Speicherplatz _nach der Komprimierung_ belegt ist. Wenn also ein Benutzer eine Quota von10 GB besitzt und 10 GB von komprimierbaren Daten schreibt, wird dieser immer noch in der Lage sein, zusätzliche Daten zu speichern. Wenn später eine Datei aktualisiert wird, beispielsweise eine Datenbank, mit mehr oder weniger komprimierbaren Daten, wird sich die Menge an verfügbarem Speicherplatz ändern. Das kann in einer merkwürdigen Situation resultieren, in welcher der Benutzer nicht die eigentliche Menge an Daten (die Eigenschaft `logicalused`) überschreitet, jedoch die Änderung in der Komprimierung dazu führt, dass das Quota-Limit erreicht ist.
+
+Kompression kann ebenso unerwartet mit Sicherungen interagieren. Quotas werden oft verwendet, um einzuschränken, wieviele Daten gespeichert werden können um sicherzustellen, dass ausreichend Speicherplatz für die Sicherung vorhanden ist. Wenn jedoch Quotas Komprimierung nicht berücksichtigen, werden womöglich mehr Daten geschrieben als in der unkomprimierten Sicherung Platz ist.
+
+[[zfs-zfs-deduplication]]
+=== Deduplizierung
+
+Wenn aktiviert, verwendet <<zfs-term-deduplication,Deduplizierung>> die Prüfsumme jedes Blocks, um Duplikate dieses Blocks zu ermitteln. Sollte ein neuer Block ein Duplikat eines existierenden Blocks sein, dann schreibt ZFS eine zusätzliche Referenz auf die existierenden Daten anstatt des kompletten duplizierten Blocks. Gewaltige Speicherplatzeinsparungen sind möglich wenn die Daten viele Duplikate von Dateien oder wiederholte Informationen enthalten. Seien Sie gewarnt: Deduplizierung benötigt eine extrem große Menge an Hauptspeicher und die meistens Einsparungen können stattdessen durch das Aktivieren von Komprimierung erreicht werden.
+
+Um Deduplizierung zu aktivieren, setzen Sie die `dedup`-Eigenschaft auf dem Zielpool:
+
+[source,bash]
+....
+# zfs set dedup=on pool
+....
+
+Nur neu auf den Pool geschriebene Daten werden dedupliziert. Daten, die bereits auf den Pool geschrieben wurden, werden nicht durch das Aktivieren dieser Option dedupliziert. Ein Pool mit einer gerade aktivierten Deduplizierung wird wie in diesem Beispiel aussehen:
+
+[source,bash]
+....
+# zpool list
+NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
+pool 2.84G 2.19M 2.83G - - 0% 0% 1.00x ONLINE -
+....
+
+Die Spalte `DEDUP` zeigt das aktuelle Verhältnis der Deduplizierung für diesen Pool an. Ein Wert von `1.00x` zeigt an, dass die Daten noch nicht dedupliziert wurden. Im nächsten Beispiel wird die Ports-Sammlung dreimal in verschiedene Verzeichnisse auf dem deduplizierten Pool kopiert.
+
+[source,bash]
+....
+# for d in dir1 dir2 dir3; do
+> mkdir $d && cp -R /usr/ports $d &
+> done
+....
+
+Redundante Daten werden erkannt und dedupliziert:
+
+[source,bash]
+....
+# zpool list
+NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
+pool 2.84G 20.9M 2.82G 0% 3.00x ONLINE -
+....
+
+Die `DEDUP`-Spalte zeigt einen Faktor von `3.00x`. Mehrere Kopien der Ports-Sammlung wurden erkannt und dedupliziert, was nur ein Drittel des Speicherplatzes benötigt. Das Potential für Einsparungen beim Speicherplatz ist enorm, wird jedoch damit erkauft, dass genügend Speicher zur Verfügung stehen muss, um die deduplizierten Blöcke zu verwalten.
+
+Deduplizierung ist nicht immer gewinnbringend, besonders wenn die Daten auf dem Pool nicht redundant sind. ZFS kann potentielle Speicherplatzeinsparungen durch Deduplizierung auf einem Pool simulieren:
+
+[source,bash]
+....
+# zdb -S pool
+Simulated DDT histogram:
+
+bucket allocated referenced
+______ ______________________________ ______________________________
+refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
+------ ------ ----- ----- ----- ------ ----- ----- -----
+ 1 2.58M 289G 264G 264G 2.58M 289G 264G 264G
+ 2 206K 12.6G 10.4G 10.4G 430K 26.4G 21.6G 21.6G
+ 4 37.6K 692M 276M 276M 170K 3.04G 1.26G 1.26G
+ 8 2.18K 45.2M 19.4M 19.4M 20.0K 425M 176M 176M
+ 16 174 2.83M 1.20M 1.20M 3.33K 48.4M 20.4M 20.4M
+ 32 40 2.17M 222K 222K 1.70K 97.2M 9.91M 9.91M
+ 64 9 56K 10.5K 10.5K 865 4.96M 948K 948K
+ 128 2 9.50K 2K 2K 419 2.11M 438K 438K
+ 256 5 61.5K 12K 12K 1.90K 23.0M 4.47M 4.47M
+ 1K 2 1K 1K 1K 2.98K 1.49M 1.49M 1.49M
+ Total 2.82M 303G 275G 275G 3.20M 319G 287G 287G
+
+dedup = 1.05, compress = 1.11, copies = 1.00, dedup * compress / copies = 1.16
+....
+
+Nachdem `zdb -S` die Analyse des Pool abgeschlossen hat, zeigt es die Speicherplatzeinsparungen, die durch aktivierte Deduplizierung erreichbar sind, an. In diesem Fall ist `1.16` ein sehr schlechter Faktor, der größtenteils von Einsparungen durch Komprimierung beeinflusst wird. Aktivierung von Deduplizierung auf diesem Pool würde also keine signifikante Menge an Speicherplatz einsparen und ist daher nicht die Menge an Speicher wert, die nötig sind, um zu deduplizieren. Über die Formel _ratio = dedup * compress / copies_ kann ein Systemadministrator die Speicherplatzbelegung planen und entscheiden, ob es sich lohnt, den zusätzlichen Hauptspeicher für die Deduplizierung anhand des späteren Workloads aufzuwenden. Wenn sich die Daten verhältnismäßig gut komprimieren lassen, sind die Speicherplatzeinsparungen sehr gut. Es wird empfohlen, in dieser Situation zuerst die Komprimierung zu aktivieren, da diese auch erhöhte Geschwindigkeit mit sich bringt. Aktivieren Sie Deduplizierung nur in solchen Fällen, bei denen die Einsparungen beträchtlich sind und genug Hauptspeicher zur Verfügung steht, um die <<zfs-term-deduplication,DDT>> aufzunehmen.
+
+[[zfs-zfs-jail]]
+=== ZFS und Jails
+
+Um ein ZFS-Dataset einem crossref:jails[jails,Jail] zuzuweisen, wird der Befehl `zfs jail` und die dazugehörige Eigenschaft `jailed` verwendet. Durch Angabe von `zfs jail _jailid_` wird ein Dataset dem spezifizierten Jail zugewiesen und kann mit `zfs unjail` wieder abgehängt werden. Damit das Dataset innerhalb der Jail kontrolliert werden kann, muss die Eigenschaft `jailed` gesetzt sein. Sobald ein Dataset sich im Jail befindet, kann es nicht mehr länger auf dem Hostsystem eingehängt werden, da es Einhängepunkte aufweisen könnte, welche die Sicherheit des Systems gefährden.
+
+[[zfs-zfs-allow]]
+== Delegierbare Administration
+
+Ein umfassendes System zur Berechtigungsübertragung erlaubt unprivilegierten Benutzern, ZFS-Administrationsaufgaben durchzuführen. Beispielsweise, wenn jedes Heimatverzeichnis eines Benutzers ein Dataset ist, können Benutzer das Recht darin erhalten, Schnappschüsse zu erstellen und zu zerstören. Einem Benutzer für die Sicherung kann die Erlaubnis eingeräumt werden, die Replikationseigenschaft zu verwenden. Einem Skript zum Sammeln von Speicherplatzverbrauch kann die Berechtigung gegeben werden, nur auf die Verbrauchsdaten aller Benutzer zuzugreifen. Es ist sogar möglich, die Möglichkeit zum Delegieren zu delegieren. Die Berechtigung zur Delegation ist für jedes Unterkommando und die meisten Eigenschaften möglich.
+
+[[zfs-zfs-allow-create]]
+=== Delegieren, ein Dataset zu erstellen
+
+`zfs allow _someuser_ create _mydataset_` gibt dem angegebenen Benutzer die Berechtigung, Kind-Datasets unter dem ausgewählten Elterndataset anzulegen. Es gibt einen Haken: ein neues Dataset anzulegen beinhaltet, dass es eingehängt wird. Dies bedeutet, dass FreeBSDs `vfs.usermount` man:sysctl[8] auf `1` gesetzt wird, um nicht-root Benutzern zu erlauben, Dateisysteme einzubinden. Es gibt eine weitere Einschränkung um Missbrauch zu verhindern: nicht-`root` Benutzer müssen Besitzer des Einhängepunktes sein, an dem das Dateisystem eingebunden werden soll.
+
+[[zfs-zfs-allow-allow]]
+=== Delegationsberechtigung delegieren
+
+`zfs allow _someuser_ allow _mydataset_` gibt dem angegebenen Benutzer die Fähigkeit, jede Berechtigung, die er selbst auf dem Dataset oder dessen Kindern besitzt, an andere Benutzer weiterzugeben. Wenn ein Benutzer die `snapshot`- und die `allow`-Berechtigung besitzt, kann dieser dann die `snapshot`-Berechtigung an andere Benutzer delegieren.
+
+[[zfs-advanced]]
+== Themen für Fortgeschrittene
+
+[[zfs-advanced-tuning]]
+=== Anpassungen
+
+Eine Reihe von Anpassungen können vorgenommen werden, um ZFS unter verschiedenen Belastungen während des Betriebs bestmöglich einzustellen.
+
+* `_vfs.zfs.arc_max_` - Maximale Größe des <<zfs-term-arc,ARC>>. Die Voreinstellung ist der gesamte RAM weniger 1 GB oder 5/8 vom RAM, je nachdem, was mehr ist. Allerdings sollte ein niedriger Wert verwendet werden, wenn das System weitere Dienste oder Prozesse laufen lässt, welche Hauptspeicher benötigen. Dieser Wert kann zur Laufzeit mit man:sysctl[8] eingestellt und in [.filename]#/boot/loader.conf# permanent gespeichert werden.
+* `_vfs.zfs.arc_meta_limit_` - Schränkt die Menge des <<zfs-term-arc,ARC>> ein, welche für die Speicherung von Metadaten verwendet wird. Die Voreinstellung ist ein Viertel von `vfs.zfs.arc_max`. Diesen Wert zu erhöhen steigert die Geschwindigkeit, wenn die Arbeitslast Operationen auf einer großen Menge an Dateien und Verzeichnissen oder häufigen Metadatenoperationen beinhaltet. Jedoch bedeutet dies auch weniger Dateidaten, die in den <<zfs-term-arc,ARC>> passen. Dieser Wert kann zur Laufzeit mit man:sysctl[8] eingestellt und in [.filename]#/boot/loader.conf# oder [.filename]#/etc/sysctl.conf# dauerhaft gespeichert werden.
+* `_vfs.zfs.arc_min_` - Minimale Größe des <<zfs-term-arc,ARC>>. Der Standard beträgt die Hälfte von `vfs.zfs.arc_meta_limit`. Passen Sie diesen Wert an, um zu verhindern, dass andere Anwendungen den gesamten <<zfs-term-arc,ARC>> verdrängen. Dieser Wert kann zur Laufzeit mit man:sysctl[8] geändert und in [.filename]#/boot/loader.conf# oder [.filename]#/etc/sysctl.conf# dauerhaft gespeichert werden.
+* `_vfs.zfs.vdev.cache.size_` - Eine vorallokierte Menge von Speicher, die als Cache für jedes Gerät im Pool reserviert wird. Die Gesamtgröße von verwendetem Speicher ist dieser Wert multipliziert mit der Anzahl an Geräten. Nur zur Bootzeit kann dieser Wert angepasst werden und wird in [.filename]#/boot/loader.conf# eingestellt.
+* `_vfs.zfs.min_auto_ashift_` - Minimaler `ashift`-Wert (Sektorgröße), welche zur Erstellungszeit des Pools automatisch verwendet wird. Der Wert ist ein Vielfaches zur Basis Zwei. Der Standardwert von `9` repräsentiert `2^9 = 512`, eine Sektorgröße von 512 Bytes. Um _write amplification_ zu vermeiden und die bestmögliche Geschwindigkeit zu erhalten, setzen Sie diesen Wert auf die größte Sektorgröße, die bei einem Gerät im Pool vorhanden ist.
++
+Viele Geräte besitzen 4 KB große Sektoren. Die Verwendung der Voreinstellung `9` bei `ashift` mit diesen Geräten resultiert in einer write amplification auf diesen Geräten. Daten, welche in einem einzelnen 4 KB Schreibvorgang Platz finden würden, müssen stattdessen in acht 512-byte Schreibvorgänge aufgeteilt werden. ZFS versucht, die allen Geräten zugrundeliegende Sektorgröße während der Poolerstellung zu lesen, jedoch melden viele Geräte mit 4 KB Sektoren, dass ihre Sektoren aus Kompatibilitätsgründen 512 Bytes betragen. Durch das Setzen von `vfs.zfs.min_auto_ashift` auf `12` (`2^12 = 4096`) bevor der Pool erstellt wird, zwingt ZFS dazu, für diese Geräte 4 KB Blöcke für bessere Geschwindigkeit zu nutzen.
++
+Erzwingen von 4 KB Blöcken ist ebenfalls hilfreich auf Pools bei denen Plattenaufrüstungen geplant sind. Zukünftige Platten werden wahrscheinlich 4 KB große Sektoren und der Wert von `ashift` lässt sich nach dem Erstellen des Pools nicht mehr ändern.
++
+In besonderen Fällen ist die kleinere Blockgröße von 512-Byte vorzuziehen. Weniger Daten werden bei kleinen, zufälligen Leseoperationen übertragen, was besonders bei 512-Byte großen Platten für Datenbanken oder Plattenplatz für virtuelle Maschinen der Fall ist. Dies kann bessere Geschwindigkeit bringen, ganz besonders wenn eine kleinere ZFS record size verwendet wird.
+* `_vfs.zfs.prefetch_disable_` - Prefetch deaktivieren. Ein Wert von `0` bedeutet aktiviert und `1` heißt deaktiviert. Die Voreinstellung ist `0`, außer, das System besitzt weniger als 4 GB RAM. Prefetch funktioniert durch das Lesen von grösseren Blöcken in den <<zfs-term-arc,ARC>> als angefordert wurden, in der Hoffnung, dass diese Daten ebenfalls bald benötigt werden. Wenn die I/O-Last viele große Mengen von zufälligen Leseoperationen beinhaltet, ist das Deaktivieren von prefetch eine Geschwindigkeitssteigerung durch die Reduzierung von unnötigen Leseoperationen. Dieser Wert kann zu jeder Zeit über man:sysctl[8] angepasst werden.
+* `_vfs.zfs.vdev.trim_on_init_` - Steuert, ob neue Geräte, die dem Pool hinzugefügt werden, das `TRIM`-Kommando ausführen sollen. Das beinhaltet die beste Geschwindigkeit und Langlebigkeit für SSDs, benötigt jedoch zusätzliche Zeit. Wenn das Gerät bereits sicher gelöscht wurde, kann durch deaktivieren dieser Option das Hinzufügen neuer Geräte schneller geschehen. Über man:sysctl[8] lässt sich dieser Wert jederzeit einstellen.
+* `_vfs.zfs.vdev.max_pending_` - Begrenzt die Menge von ausstehenden I/O-Anfragen pro Gerät. Ein größerer Wert wird die Gerätewarteschlange für Befehle gefüllt lassen und möglicherweise besseren Durchsatz erzeugen. Ein niedrigerer Wert reduziert die Latenz. Jederzeit kann dieser Wert über man:sysctl[8] angepasst werden.
+* `_vfs.zfs.top_maxinflight_` - Maximale Anzahl von ausstehenden I/Os pro darüberliegendem <<zfs-term-vdev,vdev>>. Begrenzt die Tiefe Kommandowarteschlange, um hohe Latenzen zu vermeiden. Das Limit ist pro darüberliegendem vdev, was bedeutet, dass das Limit für jeden <<zfs-term-vdev-mirror,mirror>>, <<zfs-term-vdev-raidz,RAID-Z>>, oder anderes vdev unabhängig gilt. Mit man:sysctl[8] kann dieser Wert jederzeit angepasst werden.
+* `_vfs.zfs.l2arc_write_max_` - Begrenzt die Menge an Daten, die pro Sekunde in den <<zfs-term-l2arc,L2ARC>> geschrieben wird. Durch diese Einstellung lässt sich die Lebensdauer von SSDs erhöhen, indem die Menge an Daten beschränkt wird, die auf das Gerät geschrieben wird. Dieser Wert ist über man:sysctl[8] zu einem beliebigen Zeitpunkt änderbar.
+* `_vfs.zfs.l2arc_write_boost_` - Der Wert dieser Einstellung wird zu <<zfs-advanced-tuning-l2arc_write_max,`vfs.zfs.l2arc_write_max`>> addiert und erhöht die Schreibgeschwindigkeit auf die SSD bis der erste Block aus dem <<zfs-term-l2arc,L2ARC>> verdrängt wurde. Diese "Turbo Warmup Phase" wurde entwickelt, um den Geschwindigkeitsverlust eines leeren <<zfs-term-l2arc,L2ARC>> nach einem Neustart zu reduzieren. Jederzeit kann dieser Wert mit man:sysctl[8] geändert werden.
+* `_vfs.zfs.scrub_delay_` - Anzahl von Ticks an Verzögerung zwischen jedem I/O während eines <<zfs-term-scrub,`scrub`>>. Um zu gewährleisten, dass ein `scrub` nicht mit die normalen Vorgänge eines Pools beeinträchtigt. Wenn währenddessen andere I/Os durchgeführt werden, wird der `scrub` zwischen jedem Befehl verzögert. Dieser Wert regelt die Gesamtmenge von IOPS (I/Os Per Second), die von `scrub` generiert werden. Die Granularität der Einstellung ist bestimmt durch den Wert von `kern.hz`, welcher standardmäßig auf auf 1000 Ticks pro Sekunde eingestellt ist. Diese Einstellung kann geändert werden, was in einer unterschiedlich effektiven Limitierung der IOPS resultiert. Der Standardwert ist `4`, was ein Limit von 1000 ticks/sec / 4 = 250 IOPS ergibt. Ein Wert von _20_ würde ein Limit von 1000 ticks/sec / 20 = 50 IOPS ergeben. Die `scrub`-Geschwindigkeit ist nur begrenzt, wenn es kürzlich Aktivität auf dem Pool gab, wie der Wert von <<zfs-advanced-tuning-scan_idle,`vfs.zfs.scan_idle`>> verrät. Zu einem beliebigen Zeitpunkt kann über man:sysctl[8] eine Änderung an diesem Wert erfolgen.
+* `_vfs.zfs.resilver_delay_` - Anzahl an Millisekunden Verzögerung, die zwischen jedem I/O während eines <<zfs-term-resilver,resilver>> eingefügt wird. Um zu versichern, dass ein resilver nicht die normalen Vorgänge auf dem Pool stört, wird dieser zwischen jedem Kommando verzögert, wenn andere I/Os auf dem Pool passieren. Dieser Wert steuert das Limit der Gesamt-IOPS (I/Os Pro Sekunde), die vom resilver erzeugt werden. Die Granularität der Einstellung wird durch den Wert von `kern.hz` bestimmt, welcher standardmäßig 1000 Ticks pro Sekunde beträgt. Diese Einstellung lässt sich ändern, was in einem unterschiedlich effizienten IOPS-Limit resultiert. Die Voreinstellung ist 2, was ein Limit von 1000 ticks/sec / 2 = 500 IOPS beträgt. Einen Pool wieder in den Zustand <<zfs-term-online,Online>> zu versetzen ist möglicherweise wichtiger wenn eine andere Platte den Pool in den <<zfs-term-faulted,Fault>>-Zustand versetzt, was Datenverlust zur Folge hat. Ein Wert von 0 wird der resilver-Operation die gleiche Priorität wie anderen Operationen geben, was den Heilungsprozess beschleunigt. Die Geschwindigkeit des resilver wird nur begrenzt, wenn es kürzlich andere Aktivitäten auf dem Pool gab, wie von <<zfs-advanced-tuning-scan_idle,`vfs.zfs.scan_idle`>> festgestellt wird. Dieser Wert kann zu jeder Zeit über. man:sysctl[8] eingestellt werden.
+* `_vfs.zfs.scan_idle_` - Anzahl an Millisekunden seit der letzten Operation bevor der Pool als im Leerlauf befindlich deklariert wird. Wenn sich der Pool im Leerlauf befindet, wird die Begrenzung für <<zfs-term-scrub,`scrub`>> und <<zfs-term-resilver,resilver>> deaktiviert. Dieser Wert kann mittels man:sysctl[8] jederzeit angepasst werden.
+* `_vfs.zfs.txg.timeout_` - Maximale Anzahl von Sekunden zwischen <<zfs-term-txg,Transaktionsgruppen>> (transaction group). Die momentane Transaktionsgruppe wird auf den Pool geschrieben und eine frische Transaktionsgruppe begonnen, wenn diese Menge an Zeit seit der vorherigen Transaktionsgruppe abgelaufen ist. Eine Transaktionsgruppe kann verfrüht ausgelöst werden, wenn genug Daten geschrieben werden. Der Standardwert beträgt 5 Sekunden. Ein größerer Wert kann die Lesegeschwindigkeit durch verzögern von asynchronen Schreibvorgängen verbessern, allerdings kann dies ungleiche Geschwindigkeiten hervorrufen, wenn eine Transaktionsgruppe geschrieben wird. Dieser Wert kann zu einem beliebigen Zeitpunkt mit man:sysctl[8] geändert werden.
+
+[[zfs-advanced-i386]]
+=== ZFS auf i386
+
+Manche der Eigenschaften, die von ZFS bereitgestellt werden, sind speicherintensiv und benötigen Anpassungen für die maximale Effizienz auf Systemen mit begrenztem RAM.
+
+==== Hauptspeicher
+
+Als absolutes Minimum sollte der gesamte verfügbare Hauptspeicher mindestens ein Gigabyte betragen. Die vorgeschlagene Menge an RAM ist bedingt durch die Poolgröße und welche Eigenschaften von ZFS verwendet werden. Eine Faustregel besagt, dass 1 GB RAM für jedes 1 TB Storage vorgesehen werden sollte. Wenn Deduplizierung zum Einsatz kommt, besagt die Regel, dass 5 GB RAM pro TB an Speicher, der dedupliziert werden soll, bereitgestellt sein muss. Obwohl manche Anwender ZFS mit weniger RAM einsetzen, stürzen Systeme häufiger wegen unzureichendem Hauptspeicher ab. Weitere Anpassungen sind unter Umständen nötig für Systeme mit weniger als die vorgeschlagene Menge an RAM.
+
+==== Kernel-Konfiguration
+
+Wegen des begrenzten Addressraumes der i386(TM)-Plattform müssen ZFS-Anwendern auf der i386(TM)-Architektur diese Option der Kernelkonfigurationsdatei hinzufügen, den Kernel erneut bauen und das System neu starten:
+
+[.programlisting]
+....
+options KVA_PAGES=512
+....
+
+Dies erweitert den Addressraum des Kernels, was es erlaubt, die Einstellung `vm.kvm_size` hinter die momentan vorgegebene Grenze von 1 GB oder das Limit von 2 GB für PAE zu bringen. Um den passenden Wert für diese Option zu finden, teilen Sie den gewünschten Addressraum in Megabyte durch vier. In diesem Beispiel beträgt sie `512` für 2 GB.
+
+==== Loader-Anpassungen
+
+Der [.filename]#kmem#-Addressraum kann auf allen FreeBSD-Architekturen erhöht werden. Auf einem Testsystem mit 1 GB physischen Speichers wurden mit diesen Optionen in [.filename]#/boot/loader.conf# und einem anschließenden Systemneustart Erfolge erzielt:
+
+[.programlisting]
+....
+vm.kmem_size="330M"
+vm.kmem_size_max="330M"
+vfs.zfs.arc_max="40M"
+vfs.zfs.vdev.cache.size="5M"
+....
+
+Für eine detailliertere Liste an Empfehlungen für ZFS-bezogene Einstellungen, lesen Sie https://wiki.freebsd.org/ZFSTuningGuide[].
+
+[[zfs-links]]
+== Zusätzliche Informationen
+
+* http://open-zfs.org[OpenZFS]
+* https://wiki.freebsd.org/ZFSTuningGuide[FreeBSD Wiki - ZFS Tuning]
+* http://docs.oracle.com/cd/E19253-01/819-5461/index.html[Oracle Solaris ZFS Administration Guide]
+* https://calomel.org/zfs_raid_speed_capacity.html[Calomel Blog - ZFS Raidz Performance, Capacity und Integrity]
+
+[[zfs-term]]
+== ZFS-Eigenschaften und Terminologie
+
+ZFS ist ein fundamental anderes Dateisystem aufgrund der Tatsache, dass es mehr als ein Dateisystem ist. ZFS kombiniert die Rolle eines Dateisystems mit dem Volumemanager, was es ermöglicht, zusätzliche Speichermedien zu einem laufenden System hinzuzufügen und diesen neuen Speicher sofort auf allen auf dem Pool existierenden Dateisystemen zur Verfügung zu haben. Durch die Kombination von traditionell getrennten Rollen ist ZFS in der Lage, Einschränkungen, die zuvor RAID-Gruppen daran gehindert hatten, zu wachsen. Jedes Gerät auf höchster Ebene in einem Pool wird ein _vdev_ genannt, was eine einfache Platte oder eine RAID-Transformation wie ein Spiegel oder RAID-Z-Verbund sein kann. ZFS-Dateisysteme (_datasets_ genannt), haben jeweils Zugriff auf den gesamten freien Speicherplatz des gesamten Pools. Wenn Blöcke aus diesem Pool allokiert werden, verringert sich auch der freie Speicherplatz für jedes Dateisystem. Dieser Ansatz verhindert die allgegenwärtige Falle von umfangreichen Partitionen, bei denen freier Speicherplatz über alle Partitionen hinweg fragmentiert wird.
+
+[.informaltable]
+[cols="10%,90%"]
+|===
+
+|[[zfs-term-pool]]zpool
+|Ein Speicher-_Pool_ ist der grundlegendste Baustein von ZFS. Ein Pool besteht aus einem oder mehreren vdevs, was die zugrundeliegenden Geräte repräsentiert, welche die Daten speichern. Ein Pool wird dann verwendet, um ein oder mehrere Dateisysteme (Datasets) oder Blockgeräte (Volumes) zu erstellen. Diese Datasets und Volumes teilen sich den im Pool verfügbaren Speicherplatz. Jeder Pool wird eindeutig durch einen Namen und eine GUID identifiziert. Die verfügbaren Eigenschaften werden durch die ZFS-Versionsnummer des Pools bestimmt.
+
+|[[zfs-term-vdev]]vdev Arten
+a|Ein Pool besteht aus einem oder mehreren vdevs, die selbst eine einfache Platte oder im Fall von RAID eine Gruppe von Platten darstellt. Wenn mehrere vdevs eingesetzt werden, verteilt ZFS die Daten über die vdevs, um die Geschwindigkeit zu steigern und den verfügbaren Platz zu maximieren.
+
+* [[zfs-term-vdev-disk]] _Festplatte_ - Der einfachste Typ von vdev ist ein Standard-Blockgerät. Dies kann die komplette Platte (wie [.filename]#/dev/ada0# oder [.filename]#/dev/da0#) oder auch eine Partition ([.filename]#/dev/ada0p3#) sein. Auf FreeBSD gibt es keine Geschwindigkeitseinbußen bei der Verwendung einer Partition anstatt einer kompletten Platte. Dies unterscheidet sich von den Empfehlungen, welche in der Solaris Dokumentation gegeben werden.
++
+[CAUTION]
+====
+
+Es wird dringend davon abgeraten, eine ganze Platte für einen bootbaren Pool zu benutzen, da dies dazu führen kann, dass der Pool nicht mehr bootet. Ebenso sollten Sie nicht eine ganze Platte als Teil eines Spiegels oder RAID-Z vdev verwenden, weil es dann nicht mehr möglich ist, die Größe einer nicht partitionierten Platte beim Booten zuverlässig zu bestimmen. Zudem gibt es dann keinen Platz mehr, um Boot-Code einzufügen.
+====
+
+* [[zfs-term-vdev-file]] _File_ - Zusätzlich zu Festplatten können ZFS-Pools aus regulären Dateien aufgebaut sein, was besonders hilfreich ist, um zu testen und zu experimentieren. Verwenden Sie den kompletten Pfad zu der Datei als Gerätepfad im Befehl `zpool create`. Alle vdevs müssen mindestens 128 MB groß sein.
+* [[zfs-term-vdev-mirror]] _Mirror_ - Wenn ein Spiegel erstellt wird, verwenden Sie das Schlüsselwort `mirror`, gefolgt von der Liste an Mitgliedsgeräten für den Spiegel. Ein Spiegel besteht aus zwei oder mehr Geräten und sämtliche Daten werden auf alle Geräte, die Mitglied des Spiegels sind, geschrieben. Ein Spiegel-vdev wird nur soviele Daten speichern, wie das kleinste Gerät im Verbund aufnehmen kann. Ein Spiegel-vdev kann den Verlust von allen Mitgliedsgeräten bis auf eines verkraften, ohne irgendwelche Daten zu verlieren.
++
+[NOTE]
+====
+Ein reguläre einzelne vdev-Platte kann jederzeit zu einem Spiegel-vdev über das Kommando `zpool <<zfs-zpool-attach,attach>>` aktualisiert werden.
+====
+
+* [[zfs-term-vdev-raidz]] _RAID-Z_ - ZFS implementiert RAID-Z, eine Varianten des RAID-5-Standards, der bessere Verteilung der Parität bietet und das "RAID-5 write hole" eliminiert, bei dem die Daten und Parität nach einem unerwarteten Neustart inkonsistent werden können. ZFS unterstützt drei Stufen von RAID-Z, die unterschiedliche Arten von Redundanz im Austausch gegen niedrigere Stufen von verwendbarem Speicher. Diese Typen werden RAID-Z1 bis RAID-Z3 genannt, basierend auf der Anzahl der Paritätsgeräte im Verbund und der Anzahl an Platten, die ausfallen können, während der Pool immer noch normal funktioniert.
++
+In einer RAID-Z1-Konfiguration mit vier Platten, bei der jede 1 TB besitzt, beträgt der verwendbare Plattenplatz 3 TB und der Pool wird immer noch im Modus degraded weiterlaufen, wenn eine Platte davon ausfällt. Wenn eine zusätzliche Platte ausfällt, bevor die defekte Platte ersetzt wird, können alle Daten im Pool verloren gehen.
++
+Eine Konfiguration von acht Platten zu je 1 TB als RAID-Z3 wird 5 TB verwendbaren Speicher bieten und in der Lage sein, weiterhin zu funktionieren, wenn drei Platten ausgefallen sind. Sun(TM) empfiehlt nicht mehr als neun Platten in einem einzelnen vdev. Wenn die Konfiguration mehr Platten aufweist, wird empfohlen, diese in getrennten vdevs aufzuteilen, so dass die Daten des Pools zwischen diesen aufgeteilt werden.
++
+Eine Konfiguration von zwei RAID-Z2-vdevs, bestehend aus jeweils 8 Platten würde etwa einem RAID-60-Verbund entsprechen. Der Speicherplatz einer RAID-Z-Gruppe ist ungefähr die Größe der kleinsten Platte multipliziert mit der Anzahl von nicht-Paritätsplatten. Vier 1 TB Platten in einem RAID-Z1 besitzt eine effektive Größe von ungefähr 3 TB und ein Verbund von acht 1 TB-Platten als RAID-Z3 enthält 5 TB verfügbarer Plattenplatz.
+* [[zfs-term-vdev-spare]] _Spare_ - ZFS besitzt einen speziellen Pseudo-vdev Typ, um einen Überblick über die verfügbaren hot spares zu behalten. Beachten Sie, dass hot spares nicht automatisch eingesetzt werden. Diese müssen manuell konfiguriert werden, um ein ausgefallenes Gerät über `zfs replace` zu ersetzen.
+* [[zfs-term-vdev-log]] _Log_ - ZFS Log-Geräte, auch bezeichnet als ein ZFS Intent Log (<<zfs-term-zil,ZIL>>) verschieben das Intent Log von den regulären Geräten im Pool auf ein dediziertes Gerät, typischerweise eine SSD. Ein dediziertes Log-Gerät zu besitzen kann die Geschwindigkeit von Anwendungen mit einer großen Anzahl von synchronen Schreibvorgängen, besonders Datenbanken, signifikant steigern. Log-Geräte können gespiegelt werden, jedoch wird RAID-Z nicht unterstützt. Werden mehrere Log-Geräte verwendet, so werden Schreibvorgänge gleichmäßig unter diesen aufgeteilt.
+* [[zfs-term-vdev-cache]] _Cache_ - Ein Cache-vdev einem Pool hinzuzufügen, erhöht den Speicher des <<zfs-term-l2arc,L2ARC>> Caches. Cache-Geräte lassen sich nicht spiegeln. Da ein Cache-Gerät nur zusätzliche Kopien von existierenden Daten speichert, gibt es kein Risiko, Daten zu verlieren.
+
+|[[zfs-term-txg]] Transaktionsgruppe (Transaction Group, TXG)
+|Transaktionsgruppen sind die Art und Weise, wie geänderte Blöcke zusammen gruppiert und letztendlich auf den Pool geschrieben werden. Transaktionsgruppen sind die atomare Einheit, welche ZFS verwendet, um Konsistenz zu gewährleisten. Jeder Transaktionsgruppe wird eine einzigartige, fortlaufende 64-Bit Identifikationsnummer zugewiesen. Es kann bis zu drei aktive Transaktionsgruppen gleichzeitig geben, wobei sich jede davon in einem der folgenden drei Zustände befinden kann:
+
+* _Open (Offen)_ - Wenn eine neue Transaktionsgruppe erstellt wird, befindet diese sich im Zustand offen und akzeptiert neue Schreibvorgänge. Es ist immer eine Transaktionsgruppe in diesem Zustand, jedoch kann die Transaktionsgruppe neue Schreibvorgänge ablehnen, wenn diese ein Limit erreicht hat. Sobald eine offene Transaktionsgruppe an das Limit stößt oder das <<zfs-advanced-tuning-txg-timeout,`vfs.zfs.txg.timeout`>> wurde erreicht, geht die Transaktionsgruppe in den nächsten Zustand über.
+* _Quiescing (Stilllegen)_ - Ein kurzer Zustand, der es noch ausstehenden Operationen erlaubt, zum Abschluss zu kommen, währenddessen das Erstellen einer neuen Transaktionsgruppe jedoch nicht blockiert wird. Sobald alle Transaktionen in der Gruppe abgeschlossen sind, geht die Transaktionsgruppen in den letzten Zustand über.
+* _Syncing (Sychronisieren)_ - Alle Daten in der Transaktionsgruppe werden auf das Speichermedium geschrieben. Dieser Prozess wird wiederum andere Daten wie Metadaten und space maps verändern, die ebenfalls auf das Speichermedium geschrieben werden müssen. Der Prozess des Synchronisierens beinhaltet mehrere Durchläufe. Der erste Prozess, welches der größte, gefolgt von den Metadaten, ist, beinhaltet alle geänderten Datenblöcke und kann mehrere Durchläufe benötigen, um zum Ende zu gelangen. Da das Allokieren von Speicher für die Datenblöcke neue Metadaten generiert, kann der Synchronisationsprozess nicht beendet werden, bis ein Durchlauf fertig ist, der keinen zusätzlichen Speicher allokiert. Der Synchronisierungszustand ist der Zustand, in dem auch _synctasks_ abgeschlossen werden. Synctasks sind administrative Operationen, wie das Erstellen oder zerstören von Schnappschüssen und Datasets, welche den Überblock verändern, wenn sie abgeschlossen sind. Sobald der Synchronisationszustand abgeschlossen ist, geht die Transaktionsgruppe aus dem Stilllegungszustand über in den Synchronisationszustand.
+ Alle administrativen Funktionen, wie <<zfs-term-snapshot,`Schnappschüsse`>> werden als Teil einer Transaktionsgruppe geschrieben. Wenn ein synctask erstellt ist, wird dieser der momentan geöffneten Transaktionsgruppe hinzugefügt und diese Gruppe wird so schnell wie möglich in den Synchronisationszustand versetzt, um die Latenz von administrativen Befehlen zu reduzieren.
+
+|[[zfs-term-arc]] Adaptive Replacement Cache (ARC)
+|ZFS verwendet einen Adaptive Replacement Cache (ARC), anstatt eines traditionellen Least Recently Used (LRU) Caches. Ein LRU-Cache ist eine einfache Liste von Elementen im Cache, sortiert nach der letzten Verwendung jedes Elements in der Liste. Neue Elemente werden an den Anfang der Liste eingefügt. Wenn der Cache voll ist, werden Elemente vom Ende der Liste verdrängt, um Platz für aktivere Objekte zu schaffen. Ein ARC besteht aus vier Listen: derjenigen der Most Recently Used (MRU) und Most Frequently Used (MFU) Objekte, plus einer sogenannten ghost list für jede von beiden. Diese Ghost Lists verfolgen die kürzlich verdrängten Objekte, um zu verhindern, dass diese erneut in den Cache aufgenommen werden. Dies erhöht die Trefferrate (hit ratio) des Caches, indem verhindert wird, dass Elemente, die in der Vergangenheit nur ab und zu benutzt wurden, wieder im Cache landen. Ein weiterer Vorteil der Verwendung sowohl einer MRU und einer MFU ist, dass das Scannen eines gesamten Dateisystems normalerweise alle Daten aus einem MRU- oder LRU-Cache verdrängt, um dem gerade frisch zugegriffenem Inhalt den Vorzug zu geben. Mit ZFS gibt es also eine MFU, die nur die am häufigsten verwendeten Elemente beinhaltet und der Cache von am meisten zugegriffenen Blöcken bleibt erhalten.
+
+|[[zfs-term-l2arc]] L2ARC
+|L2ARC ist die zweite Stufe des Caching-Systems von ZFS. Der Haupt-ARC wird im RAM abgelegt. Da die Menge an verfügbarem RAM meist begrenzt ist, kann ZFS auch <<zfs-term-vdev-cache,cache vdevs>> verwenden. Solid State Disks (SSDs) werden oft als diese Cache-Geräte eingesetzt, aufgrund ihrer höheren Geschwindigkeit und niedrigeren Latenz im Vergleich zu traditionellen drehenden Speichermedien wie Festplatten. Der Einsatz des L2ARC ist optional, jedoch wird durch die Verwendung eine signifikante Geschwindigkeitssteigerung bei Lesevorgängen bei Dateien erzielt, welche auf der SSD zwischengespeichert sind, anstatt von der regulären Platte gelesen werden zu müssen. L2ARC kann ebenfalls die <<zfs-term-deduplication,Deduplizierung>> beschleunigen, da eine DDT, welche nicht in den RAM passt, jedoch in den L2ARC wesentlich schneller sein wird als eine DDT, die von der Platte gelesen werden muss. Die Häufigkeit, in der Daten zum Cache-Gerät hinzugefügt werden, ist begrenzt, um zu verhindern, dass eine SSD frühzeitig durch zu viele Schreibvorgänge aufgebraucht ist. Bis der Cache voll ist (also der erste Block verdrängt wurde, um Platz zu schaffen), wird das Schreiben auf den L2ARC begrenzt auf die Summe der Schreibbegrenzung und das Bootlimit, sowie hinterher auf das Schreiblimit. Ein paar man:sysctl[8]-Werte steuert diese Limits. <<zfs-advanced-tuning-l2arc_write_max,`vfs.zfs.l2arc_write_max`>> steuert, wie viele Bytes in den Cache pro Sekunde geschrieben werden, während <<zfs-advanced-tuning-l2arc_write_boost,`vfs.zfs.l2arc_write_boost`>> zu diesem Limit während der "Turbo Warmup Phase" hinzuaddiert wird (Write Boost).
+
+|[[zfs-term-zil]] ZIL
+|ZIL beschleunigt synchrone Transaktionen durch die Verwendung von Speichermedien wie SSDs, welche schneller sind als diejenigen, welche Teil des Speicherpools sind. Wenn eine Anwendung einen synchronen Schreibvorgang anfordert (eine Garantie, dass die Daten sicher auf den Platten gespeichert wurden anstatt nur zwischengespeichert zu sein, um später geschrieben zu werden), werden die Daten auf den schnelleren ZIL-Speicher geschrieben und dann später auf die regulären Festplatten. Dies reduziert die Latenz sehr und verbessert die Geschwindigkeit. Nur synchrone Vorgänge wie die von Datenbanken werden durch den Einsatz eines ZIL profitieren. Reguläre, asynchrone Schreibvorgänge wie das Kopieren von Dateien wird den ZIL überhaupt nicht verwenden.
+
+|[[zfs-term-cow]] Copy-On-Write
+|Im Gegensatz zu traditionellen Dateisystemen werden beim Überschreiben von Daten bei ZFS die neuen Daten an einen anderen Block geschrieben, anstatt die alten Daten an der gleichen Stelle zu überschreiben. Nur wenn dieser Schreibvorgang beendet wurde, werden die Metadaten aktualisiert, um auf die neue Position zu verweisen. Im Falle eines kurzen Schreibvorgangs (ein Systemabsturz oder Spannungsverlust während eine Datei geschrieben wird) sind die gesamten Inhalte der Originaldatei noch vorhanden und der unvollständige Schreibvorgang wird verworfen. Das bedeutet auch, dass ZFS nach einem unvorhergesehenen Ausfall keinen man:fsck[8] benötigt.
+
+|[[zfs-term-dataset]] Dataset
+|_Dataset_ ist der generische Begriff für ein ZFS-Dateisystem, Volume, Schnappschüsse oder Klone. Jedes Dataset besitzt einen eindeutigen Namen in der Form _poolname/path@snapshot_ Die Wurzel des Pools ist technisch gesehen auch ein Dataset. Kind-Datasets werden hierarchisch wie Verzeichnisse benannt. Beispielsweise ist _mypool/home_ das Heimatdataset, ein Kind von _mypool_ und erbt die Eigenschaften von diesem. Dies kann sogar noch erweitert werden durch das Erstellen von _mypool/home/user_. Dieses Enkelkind-Dataset wird alle Eigenschaften von den Eltern und Großeltern erben. Eigenschaften auf einem Kind können die geerbten Standardwerte der Eltern und Großeltern ändern und überschreiben. Die Verwaltung von Datasets und dessen Kindern lässt sich <<zfs-zfs-allow,delegieren>>.
+
+|[[zfs-term-filesystem]] Dateisystem
+|Ein ZFS-Dataset wird meistens als ein Dateisystem verwendet. Wie jedes andere Dateisystem kann auch ein ZFS-Dateisystem irgendwo in der Verzeichnishierarchie eingehängt werden und enthält seine eigenen Dateien und Verzeichnisse mit Berechtigungen, Flags und anderen Metadaten.
+
+| [[zfs-term-volume]]Volume
+|Zusätzlich zu regulären Dateisystem-Datasets, kann ZFS auch Volumes erstellen, die Blockgeräte sind. Volumes besitzen viele der gleichen Eigenschaften, inklusive copy-on-write, Schnappschüsse, Klone und Prüfsummen. Volumes sind nützlich, um andere Dateisystemformate auf ZFS aufzusetzen, so wie UFS Virtualisierung, oder das Exportieren von iSCSI-Abschnitten.
+
+|[[zfs-term-snapshot]] Snapshot (Schnappschuss)
+|Das <<zfs-term-cow,copy-on-write>> (COW)-Entwicklung von ZFS erlaubt das Erstellen von beinahe sofortigen, konsistenten Schnappschüssen mit beliebigen Namen. Nachdem ein Schnappschuss von einem Dataset angelegt oder ein rekursiver Schnappschuss eines Elterndatasets, welcher alle Kinddatasets enthält, erstellt wurde, werden neue Daten auf neue Blöcke geschrieben, jedoch die alten Blöcke nicht wieder als freier Speicher zurückgewonnen. Der Schnappschuss enthält die Originalversion des Dateisystems und das aktive Dateisystem besitzt alle Änderungen, die seit dem Schnappschuss erstellt wurden. Kein zusätzlicher Platz wird benötigt. Werden neue Daten auf das aktive Dateisystem geschrieben, werden neue Blöcke allokiert, um diese Daten zu speichern. Die scheinbare Größe des Schnappschusses wird wachsen, da die Blöcke nicht mehr länger im aktiven Dateisystem, sondern nur noch im Schnappschuss Verwendung finden. Diese Schnappschüsse können nur lesend eingehängt werden, um vorherige Versionen von Dateien wiederherzustellen. Ein <<zfs-zfs-snapshot,rollback>> eines aktiven Dateisystems auf einen bestimmten Schnappschuss ist ebenfalls möglich, was alle Änderungen, die seit dem Anlegen des Schnappschusses vorgenommen wurden, wieder Rückgängig macht. Jeder Block im Pool besitzt einen Referenzzähler, der verfolgt, wieviele Schnappschüsse, Klone, Datasets oder Volumes diesen Block nutzen. Wenn Dateien und Schnappschüsse gelöscht werden, verringert dies auch den Referenzzähler. Wenn ein Block nicht mehr länger referenziert wird, kann er als freier Speicher wieder genutzt werden. Schnappschüsse können auch mit <<zfs-zfs-snapshot,hold>> markiert werden. Wenn versucht wird, einen solchen Schnappschuss zu zerstören, wird stattdessen ein `EBUSY`-Fehler ausgegeben. Jeder Schnappschuss kann mehrere holds besitzen, jeder mit einem eindeutigen Namen. Das Kommando <<zfs-zfs-snapshot,release>> entfernt diese, damit der Schnappschuss gelöscht werden kann. Schnappschüsse lassen sich auf Volumes ebenfalls anlegen, allerdings können diese nur geklont oder zurückgerollt werden, nicht jedoch unabhängig eingehängt.
+
+|[[zfs-term-clone]] Clone (Klone)
+|Schnappschüsse können auch geklont werden. Ein Klon stellt eine veränderbare Version eines Schnappschusses dar, was es ermöglicht, das Dateisystem als neues Dataset aufzuspalten. Genau wie bei einem Schnappschuss verbraucht ein Klon keinen zusätzlichen Platz. Wenn neue Daten auf einen Klon geschrieben und neue Blöcke allokiert werden, wächst auch die Größe des Klons. Wenn Blöcke im geklonten Dateisystem oder Volume überschrieben werden, verringert sich auch der Referenzzähler im vorherigen Block. Der Schnappschuss, auf dem der Klon basiert kann nicht gelöscht werden, weil der Klon darauf eine Abhängigkeit besitzt. Der Schnappschuss stellt den Elternteil dar und der Klon das Kind. Klone lassen sich _promoted_ (befördern), was die Abhängigkeit auflöst und den Klon zum Elternteil macht und den vorherigen Elternteil das Kind. Diese Operation benötigt keinen zusätzlichen Plattenplatz. Da die Menge an verwendetem Speicher vom Elternteil und dem Kind vertauscht wird, betrifft dies eventuell vorhandene Quotas und Reservierungen.
+
+|[[zfs-term-checksum]] Checksum (Prüfsumme)
+|Jeder Block, der allokiert wird erhält auch eine Prüfsumme. Der verwendete Prüfsummenalgorithmus ist eine Eigenschaft jedes Datasets, siehe dazu <<zfs-zfs-set,`set`>>. Die Prüfsumme jedes Blocks wird transparent validiert wenn er gelesen wird, was es ZFS ermöglicht, stille Verfälschung zu entdecken. Wenn die gelesenen Daten nicht mit der erwarteten Prüfsumme übereinstimmen, wird ZFS versuchen, die Daten aus jeglicher verfügbarer Redundanz (wie Spiegel oder RAID-Z) zu rekonstruieren. Eine Überprüfung aller Prüfsummen kann durch das Kommando <<zfs-term-scrub,`scrub`>> ausgelöst werden. Prüfsummenalgorithmen sind:
+
+* `fletcher2`
+* `fletcher4`
+* `sha256`
+ Die `fletcher`-Algorithmen sind schneller, aber dafür ist `sha256` ein starker kryptographischer Hash und besitzt eine viel niedrigere Chance auf Kollisionen zu stoßen mit dem Nachteil geringerer Geschwindigkeit. Prüfsummen können deaktiviert werden, dies wird aber nicht empfohlen.
+
+|[[zfs-term-compression]] Compression
+|Jedes Dataset besitzt eine compression-Eigenschaft, die standardmäßig ausgeschaltet ist. Diese Eigenschaft kann auf eine Reihe von Kompressionsalgorithmen eingestellt werden. Dadurch werden alle neuen Daten, die auf das Dataset geschrieben werden, komprimiert. Neben einer Reduzierung von verbrauchtem Speicher wird oft der Lese- und Schreibdurchsatz erhöht, weil weniger Blöcke gelesen oder geschrieben werden müssen.
+
+[[zfs-term-compression-lz4]]
+* _LZ4_ - Wurde in der ZFS Poolversion 5000 (feature flags) hinzugefügt und LZ4 ist jetzt der empfohlene Kompressionsalgorithmus. LZ4 komprimiert ungefähr 50% schneller als LZJB, wenn er auf komprimierbaren Daten angewendet wird und ist über dreimal schneller, wenn unkomprimierbare Daten vorliegen. LZ4 entkomprimiert auch ungefähr 80% schneller als LZJB. Auf modernen CPUs, kann LZ4 oft über 500 MB/s komprimieren und entkomprimiert (pro einzelnem CPU-Kern) bei über 1.5 GB/s.
+[[zfs-term-compression-lzjb]]
+* _LZJB_ - Der Standardkompressionsalgorithmus wurde von Jeff Bonwick, einem der ursprünglichen Entwickler von ZFS, entworfen. LZJB bietet gute Komprimierung mit weniger CPU-Überhang im Vergleich zu GZIP. In der Zukunft wird der Standardkompressionsalgorithmus wahrscheinlich auf LZ4 gewechselt.
+[[zfs-term-compression-gzip]]
+* _GZIP_ - Ein populärer Stromkompressionsalgorithmus ist auch in ZFS verfügbar. Einer der Hauptvorteile von der Verwendung von GZIP ist seine konfigurierbare Komprimierungsstufe. Wenn die Eigenschaft `compress` gesetzt wird, kann der Administrator die Stufe der Komprimierung wählen, die von `gzip1`, der kleinsten Komprimierungsstufe, bis zu `gzip9`, der höchsten Komprimierungsstufe, reicht. Dies erlaubt es dem Administrator zu steuern, wieviel CPU-Zeit für eingesparten Plattenplatz eingetauscht werde soll.
+[[zfs-term-compression-zle]]
+* _ZLE_ - Zero Length Encoding ist ein besonderer Kompressionsalgorithmus, welcher nur fortlaufende Aneinanderreihungen von Nullen komprimiert. Dieser Komprimierungsalgorithmus ist nur sinnvoll, wenn das Dataset viele große Blöcke von Nullen aufweist.
+
+|[[zfs-term-copies]] Copies
+|Wenn die Eigenschaft `copies` auf einen Wert grösser als 1 gesetzt wird, weist das ZFS an, mehrere Kopien eines Blocks im <<zfs-term-filesystem,Dateisystem>> oder <<zfs-term-volume,Volume>> anzulegen. Diese Eigenschaft auf einem wichtigen Dataset einzustellen sorgt für zusätzliche Redundanz, aus der ein Block wiederhergestellt werden kann, der nicht mehr mit seiner Prüfsumme übereinstimmt. In Pools ohne Redundanz ist die copies-Eigenschaft die einzige Form von Redundanz. Die Eigenschaft kann einen einzelnen schlechten Sektor oder andere Formen von kleineren Verfälschungen wiederherstellen, schützt jedoch nicht den Pool vom Verlust einer gesamten Platte.
+
+|[[zfs-term-deduplication]] Deduplizierung
+|Prüfsummen ermöglichen es, Duplikate von Blöcken zu erkennen, wenn diese geschrieben werden. Mit Deduplizierung erhöht sich der Referenzzähler eines existierenden, identischen Blocks, was Speicherplatz einspart. Um Blockduplikate zu erkennen, wird im Speicher eine Deduplizierungstabelle (DDT) geführt. Die Tabelle enthält eine Liste von eindeutigen Prüfsummen, die Position dieser Blöcke und einen Referenzzähler. Werden neue Daten geschrieben, wird die Prüfsumme berechnet und mit der Liste verglichen. Wird eine Übereinstimmung gefunden, wird der existierende Block verwendet. Der SHA256-Prüfsummenalgorithmus wird mit Deduplizierung benutzt, um einen sicheren kryptographischen Hash zu bieten. Deduplizierung lässt sich konfigurieren. Wenn `dedup` auf `on` steht, wird angenommen, dass eine übereinstimmende Prüfsumme bedeutet, dass die Daten identisch sind. Steht `dedup` auf `verify`, werden die Daten in den beiden Blöcken Byte für Byte geprüft, um sicherzustellen, dass diese wirklich identisch sind. Wenn die Daten nicht identisch sind, wird die Kollision im Hash vermerkt und die beiden Blöcke separat gespeichert. Da die DDT den Hash jedes einzigartigen Blocks speichern muss, benötigt sie eine große Menge an Speicher. Eine generelle Faustregel besagt, dass 5-6 GB RAM pro 1 TB deduplizierter Daten benötigt werden. In Situationen, in denen es nicht praktikabel ist, genug RAM vorzuhalten, um die gesamte DDT im Speicher zu belassen, wird die Geschwindigkeit stark darunter leiden, da die DDT von der Platte gelesen werden muss, bevor jeder neue Block geschrieben wird. Deduplizierung kann den L2ARC nutzen, um die DDT zu speichern, was einen guten Mittelweg zwischen schnellem Systemspeicher und langsameren Platten darstellt. Bedenken Sie, dass durch die Verwendung von Komprimierung meistens genauso große Platzersparnis möglich ist, ohne den zusätzlichen Hauptspeicherplatzbedarf.
+
+|[[zfs-term-scrub]] Scrub (Bereinigung)
+|Anstatt einer Konsistenzprüfung wie man:fsck[8] verwendet ZFS `scrub`. `scrub` liest alle Datenblöcke, die auf dem Pool gespeichert sind und prüft deren Prüfsumme gegen die als richtig in den Metadaten gespeicherte Prüfsumme. Eine periodische Prüfung aller im Pool gespeicherten Daten versichert, dass verfälschte Blöcke rekonstruiert werden können, bevor dies nötig ist. Ein Scrub wird nicht nach einem unsauberen Herunterfahren benötigt, wird jedoch einmal alle drei Monate angeraten. Die Prüfsumme von jedem Block wird verifiziert, wenn Blöcke während des normalen Betriebs gelesen werden, jedoch stellt ein Scrub sicher, dass sogar weniger häufig verwendete Blöcke auf stille Verfälschungen hin untersucht werden. Datenintegrität wird dadurch erhöht, besonders wenn es sich um Archivspeichersituationen handelt. Die relative Priorität des `scrub` lässt sich mit <<zfs-advanced-tuning-scrub_delay,`vfs.zfs.scrub_delay`>> anpassen, um zu verhindern, dass der scrub die Geschwindigkeit von anderen Anfragen auf dem Pool beeinträchtigt.
+
+|[[zfs-term-quota]]Dataset Quotas
+a|ZFS bietet sehr schnelle und akkurate Dataset-, Benutzer- und Gruppenspeicherplatzbuchhaltung, zusätzlich zu Quotas und Speicherplatzreservierungen. Dies gibt dem Administrator feingranulare Kontrolle darüber, wie Speicherplatz allokiert und die Reservierung für kritische Dateisysteme vorgenommen wird
+
+ZFS unterstützt verschiedene Arten von Quotas: die Dataset-Quota, die <<zfs-term-refquota,Referenzquota (refquota)>>, die <<zfs-term-userquota,Benutzerquota>> und die <<zfs-term-groupquota,Gruppenquota>> sind verfügbar.
+
+Quotas beschränken die Menge an Speicherplatz, welche ein Dataset, seine Kinder, einschließlich Schnappschüsse des Datasets, deren Kinder und die Schnappschüsse von diesen Datasets, verbrauchen können.
+
+[NOTE]
+====
+Quotas können nicht auf Volumes gesetzt werden, da die Eigenschaft `volsize` als eine implizite Quota agiert.
+====
+
+|[[zfs-term-refquota]] Referenzquota
+|Ein Referenzquota beschränkt die Menge an Speicherplatz, die ein Dataset verbrauchen kann durch das Erzwingen einer harten Grenze. Jedoch beinhaltet diese harte Grenze nur Speicherplatz, die das Dataset referenziert und beinhaltet nicht den Speicher, der von Kindern, wie Dateisystemen oder Schnappschüssen, verbraucht wird.
+
+|[[zfs-term-userquota]] Benutzerquota
+|Benutzerquotas sind hilfreich, um die Menge an Speicherplatz, die ein bestimmter Benutzer verbrauchen kann, einzuschränken.
+
+|[[zfs-term-groupquota]] Gruppenquota
+|Die Gruppenquota beschränkt die Menge an Speicherplatz, die eine bestimmte Gruppe verbrauchen darf.
+
+|[[zfs-term-reservation]] Dataset-Reservierung
+|Die Eigenschaft `reservation` ermöglicht es, ein Minimum an Speicherplatz für ein bestimmtes Dataset und dessen Kinder zu garantieren. Wenn eine Reservierung von 10 GB auf [.filename]#storage/home/bob# gesetzt ist und ein anderes Dataset versucht, allen freien Speicherplatz zu verwenden, bleiben zumindest noch 10 GB an Speicher reserviert. Wenn von [.filename]#storage/home/bob# ein Schnappschuss angelegt wird, wird dieser von der Reservierung abgezogen und zählt damit dagegen. Die Eigenschaft <<zfs-term-refreservation,`refreservation`>> funktioniert auf ähnliche Weise, jedoch _exkludiert_ diese Kinder wie Schnappschüsse.
+
+Reservierungen jeder Art sind in vielen Situationen nützlich, so wie bei der Planung und dem Testen der richtigen Speicherplatzallokation in einem neuen System oder durch die Zusicherung, dass genug Speicherplatz auf Dateisystemen für Audio-Logs oder Systemwiederherstellungsprozeduren und Dateien verfügbar ist.
+
+|[[zfs-term-refreservation]] Referenzreservierung
+|Die Eigenschaft `refreservation` ermöglicht es, ein Minimum an Speicherplatz für die Verwendung eines bestimmten Datasets zu garantieren, _exklusiv_ dessen Kinder. Das bedeutet, dass wenn eine 10 GB-Reservierung auf [.filename]#storage/home/bob# vorhanden ist und ein anderes Dataset versucht, alle freien Speicherplatz aufzubrauchen, sind zumindest noch 10 GB Speicher reserviert. Im Gegensatz zu einer regulären <<zfs-term-reservation,Reservierung>> wird der Speicher von Schnappschüssen und Kinddataset nicht gegen die Reservierung gezählt. Beispielsweise, wenn ein Schnappschuss von [.filename]#storage/home/bob# angelegt wird, muss genug Plattenplatz außerhalb der Menge an `refreservation` vorhanden sein, damit die Operation erfolgreich durchgeführt wird. Kinder des Hauptdatasets werden nicht in die Menge an `refreservation` gezählt und dringen auf diese Weise auch nicht in den gesetzten Speicher ein.
+
+|[[zfs-term-resilver]] Resilver
+|Wenn eine Platte ausfällt und ersetzt wird, muss die neue Platte mit den Daten gefüllt werden, die verloren gegangen sind. Der Prozess der Verwendung der Paritätsinformationen, welche über die übrigen Platten verteilt sind, um die fehlenden Daten zu berechnen und auf die neue Platte zu übertragen, wird _resilvering_ genannt.
+
+|[[zfs-term-online]] Online
+|Ein Pool oder vdev im Zustand `Online` besitzt alle verbundenen Mitgliedsgeräte und ist voll funktionsfähig. Individuelle Geräte im Zustand `Online` funktionieren normal.
+
+|[[zfs-term-offline]] Offline
+|Individuelle Geräte lassen sich vom Administrator in den Zustand `Offline` versetzen, wenn es ausreichend Redundanz gibt, um zu verhindern, dass der Pool oder das vdev in den Zustand <<zfs-term-faulted,Faulted>> versetzt wird. Ein Administrator kann eine Platte vor einem Austausch offline nehmen oder um es leichter zu machen, diese zu identifizieren.
+
+|[[zfs-term-degraded]] Degraded
+|Ein Pool oder vdev im Zustand `Degraded` hat eine oder mehrere Platten, welche getrennt wurden oder ausgefallen sind. Der Pool kann immer noch verwendet werden, doch wenn noch weitere Geräte ausfallen, kann der Pool nicht wiederhergestellt werden. Die fehlenden Geräte anzuschließen oder die defekten Platten zu ersetzen wird den Pool wieder in den Zustand <<zfs-term-online,Online>> versetzen, nachdem die angeschlossenen oder neuen Geräte den <<zfs-term-resilver,Resilver>>-Prozess abgeschlossen haben.
+
+|[[zfs-term-faulted]] Faulted
+|Ein Pool oder vdev im Zustand `Faulted` funktioniert nicht länger. Die Daten darauf sind nicht mehr länger verfügbar. Ein Pool oder vdev geht in den Zustand `Faulted` über, wenn die Anzahl der fehlenden oder defekten Geräte die Redundanzstufe im vdev überschreiten. Wenn fehlende Geräte angeschlossen werden, geht der Pool wieder in den Zustand <<zfs-term-online,Online>>. Wenn es nicht genügend Redundanz gibt, um die Anzahl an defekten Platten zu kompensieren, sind die Inhalte des Pools verloren und müssen von der Sicherung wiederhergestellt werden.
+|===
diff --git a/documentation/content/de/books/porters-handbook/_index.adoc b/documentation/content/de/books/porters-handbook/_index.adoc
new file mode 100644
index 0000000000..914ea0585b
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/_index.adoc
@@ -0,0 +1,83 @@
+---
+title: FreeBSD Porter's Handbook
+authors:
+ - author: The FreeBSD Documentation Project
+copyright: 2000-2020 The FreeBSD Documentation Project
+releaseinfo: "$FreeBSD$"
+trademarks: ["freebsd", "sun", "unix", "general"]
+---
+
+= FreeBSD Porter's Handbook
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:toc-title: Inhaltsverzeichnis
+:part-signifier: Teil
+:chapter-signifier: Kapitel
+:appendix-caption: Anhang
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+
+ifeval::["{backend}" == "html5"]
+include::shared/mirrors.adoc[]
+include::shared/authors.adoc[]
+include::shared/releases.adoc[]
+include::shared/de/mailing-lists.adoc[]
+include::shared/de/teams.adoc[]
+include::shared/de/urls.adoc[]
+:chapters-path: content/de/books/porters-handbook/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/de/mailing-lists.adoc[]
+include::../../../../shared/de/teams.adoc[]
+include::../../../../shared/de/urls.adoc[]
+:chapters-path:
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+include::../../../../shared/mirrors.adoc[]
+include::../../../../shared/authors.adoc[]
+include::../../../../shared/releases.adoc[]
+include::../../../../shared/de/mailing-lists.adoc[]
+include::../../../../shared/de/teams.adoc[]
+include::../../../../shared/de/urls.adoc[]
+:chapters-path:
+endif::[]
+
+'''
+
+toc::[]
+
+include::{chapters-path}toc-tables.adoc[]
+
+include::{chapters-path}toc-examples.adoc[]
+
+include::{chapters-path}why-port/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}own-port/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}quick-porting/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}slow/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}makefile/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}special/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}plist/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}pkg-files/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}testing/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}port-upgrading/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}security/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}porting-dads/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}porting-samplem/chapter.adoc[leveloffset=+1, lines=7..24;28..-1]
+include::{chapters-path}keeping-up/chapter.adoc[leveloffset=+1, lines=6..23;27..-1]
diff --git a/documentation/content/de/books/porters-handbook/chapters-order.adoc b/documentation/content/de/books/porters-handbook/chapters-order.adoc
new file mode 100644
index 0000000000..606ef5a93c
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/chapters-order.adoc
@@ -0,0 +1,14 @@
+why-port/chapter.adoc
+own-port/chapter.adoc
+quick-porting/chapter.adoc
+slow/chapter.adoc
+makefile/chapter.adoc
+special/chapter.adoc
+plist/chapter.adoc
+pkg-files/chapter.adoc
+testing/chapter.adoc
+port-upgrading/chapter.adoc
+security/chapter.adoc
+porting-dads/chapter.adoc
+porting-samplem/chapter.adoc
+keeping-up/chapter.adoc
diff --git a/documentation/content/de/books/porters-handbook/keeping-up/chapter.adoc b/documentation/content/de/books/porters-handbook/keeping-up/chapter.adoc
new file mode 100644
index 0000000000..d3264b3936
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/keeping-up/chapter.adoc
@@ -0,0 +1,67 @@
+---
+title: Kapitel 14. Auf dem Laufenden bleiben
+prev: books/porters-handbook/porting-samplem
+---
+
+[[keeping-up]]
+= Auf dem Laufenden bleiben
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 14
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+Die FreeBSD Ports-Sammlung verändert sich ständig. Hier finden Sie einige Informationen, wie Sie auf dem Laufenden bleiben.
+
+[[freshports]]
+== FreshPorts
+
+Einer der einfachsten Wege, um sich über Aktualisierungen, die bereits durchgeführt wurden, zu informieren, ist sich bei http://www.FreshPorts.org/[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 FreeBSD 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.
+
+[[cvsweb]]
+== 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 http://cvsweb.FreeBSD.org/ports/CHANGES[CHANGES] dokumentiert. Solche, die nur bestimmte Ports betreffen, in der Datei http://cvsweb.FreeBSD.org/ports/UPDATING[UPDATING]. Aber die maßgebliche Antwort auf alle Fragen liegt zweifellos darin, den Quelltext von http://cvsweb.FreeBSD.org/ports/Mk/bsd.port.mk[bsd.port.mk] und dazugehörige Dateien zu lesen.
+
+[[ports-mailling-list]]
+== Die FreeBSD Ports-Mailingliste
+
+Wenn Sie Maintainer sind, sollten Sie in Erwägung ziehen die {freebsd-ports}-Mailingliste zu verfolgen. Wichtige Änderungen an der grundlegenden Funktionsweise von Ports werden dort angekündigt und dann in [.filename]#CHANGES# committet.
+
+[[build-cluster]]
+== Der Cluster zum Bauen von FreeBSD-Ports auf `pointyhat.FreeBSD.org`
+
+Eine der weniger bekannten Stärken von FreeBSD 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 FreeBSD Release und jede Tier-1-Architektur. Die Ergebnisse können Sie unter http://pointyhat.FreeBSD.org/[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 [.filename]#Makefile# des Ports übergeben wird).
+
+[[distfile-survey]]
+== Der FreeBSD Ports-Distfile-Scanner
+
+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. Der https://portscout.freebsd.org[FreeBSD Ports-Distfile-Scanner] 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.
+
+[[portsmon]]
+== Das FreeBSD Ports-Monitoring-System
+
+Eine weitere praktische Ressource ist das http://portsmon.FreeBSD.org[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 http://portsmon.FreeBSD.org/portoverview.py[Übersicht eines Ports] betrachten.
+
+Zum Zeitpunkt des Schreibens ist dies die einzige Quelle, die GNATS PR-Einträge auf Portnamen abbildet (PR-Einreicher geben den Portnamen nicht immer in der Zusammenfassung an, obwohl wir uns das wünschen würden). Also ist `portsmon` ein guter Anlaufpunkt, wenn Sie herausfinden wollen, ob zu einem existierenden Port PRs oder Buildfehler eingetragen sind. Oder um herauszufinden, ob ein neuer Port, den Sie erstellen wollen, bereits eingereicht wurde.
diff --git a/documentation/content/de/books/porters-handbook/makefile/chapter.adoc b/documentation/content/de/books/porters-handbook/makefile/chapter.adoc
new file mode 100644
index 0000000000..ed20f1af55
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/makefile/chapter.adoc
@@ -0,0 +1,1866 @@
+---
+title: Kapitel 5. Die Konfiguration des Makefile
+prev: books/porters-handbook/slow
+next: books/porters-handbook/special
+---
+
+[[flavors]]
+= Die Konfiguration des Makefile
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 7
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+Das Konfigurieren des [.filename]#Makefile# ist sehr einfach und wir schlagen vor, dass Sie zunächst einen Blick auf vorhandene Beispiele werfen. Zusätzlich gibt es ein <<porting-samplem,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 [.filename]#Makefile# erstellen:
+
+[[makefile-source]]
+== Der originale Quelltext
+
+Liegt der Quelltext in `DISTDIR` als eine standardisierte und mit gzip gepackte Datei in der Art [.filename]#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.
+
+[[makefile-naming]]
+== Bezeichnungen
+
+Der erste Teil des [.filename]#Makefile# beschreibt die Versionsnummer des Ports und führt ihn in der richtigen Kategorie auf.
+
+=== `PORTNAME` und `PORTVERSION`
+
+Setzen Sie bitte die Variable `PORTNAME` auf den Basisnamen Ihres Ports und die Variable `PORTVERSION` auf dessen Versionsnummer.
+
+[[makefile-naming-revepoch]]
+=== `PORTREVISION` und `PORTEPOCH`
+
+==== `PORTREVISION`
+
+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 [.filename]#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 [.filename]#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`.
+
+==== `PORTEPOCH`
+
+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 `PORTREVISION` und `PORTEPOCH`
+
+Der `gtkmumble`-Port, Version `0.10`, befindet sich in der Ports-Sammlung:
+
+[.programlisting]
+....
+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.
+
+[.programlisting]
+....
+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 [.filename]#Makefile# entfernt).
+
+[.programlisting]
+....
+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:
+
+[.programlisting]
+....
+PORTNAME= gtkmumble
+PORTVERSION= 0.3
+PORTEPOCH= 1
+....
+
+`PKGNAME` wird zu `gtkmumble-0.3,1`
+
+[NOTE]
+====
+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.
+====
+
+=== `PKGNAMEPREFIX` und `PKGNAMESUFFIX`
+
+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 <<porting-pkgname,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`!
+
+=== `LATEST_LINK`
+
+Die Umgebungsvariable `LATEST_LINK` wird während der Paketerstellung verwendet, um einen Kurznamen festzulegen, der danach von `pkg_add -r` genutzt werden kann. Dadurch wird es beispielsweise möglich, die aktuelle Perl-Version durch einen einfachen Aufruf von `pkg_add -r perl` zu installieren (ohne die Angabe der korrekten Versionsnummer). Dieser Name muss eindeutig sowie "offensichtlich" sein.
+
+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 [.filename]#lang/gcc46# und [.filename]#lang/gcc#-Ports und die [.filename]#www/apache*#-Familie. Wenn Sie die Umgebungsvariable `NO_LATEST_LINK` setzen, wird kein Link erzeugt, was für alle Versionen (aber nicht für die "Hauptversion") nützlich sein kann. 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.
+
+[[porting-pkgname]]
+=== 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 [.filename]#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 [.filename]#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 [.filename]#textproc/libxml2# oder [.filename]#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 [.filename]#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, <<makefile-masterdir,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 verwendet werden, dass diese im Format `0.0.yyyy.mm.dd` und nicht `dd.mm.yyyy` oder gar dem nicht Y2K-kompatiblen Format `yy.mm.dd` vorliegen. Es ist wichtig, dass die Versionsnummer mit `0.0.` beginnt, da die Versionsnummer im Falle einer Veröffentlichung auf jeden Fall kleiner als `yyyy` sein wird.
+
+Hier sind einige reale Beispiele, die aufzeigen, wie man den Namen einer Applikation zu einem vernünftigen Paketnamen umwandelt:
+
+[.informaltable]
+[cols="1,1,1,1,1,1", frame="none", options="header"]
+|===
+| 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 in der Art `0.0.yyyy.mm.dd` als Version verwenden.
+
+[[makefile-categories]]
+== Kategorisierung
+
+=== `CATEGORIES`
+
+Wenn ein Paket erzeugt wird, dann wird es unter [.filename]#/usr/ports/packages/All# abgelegt und von einem oder mehreren Unterverzeichnissen werden auf [.filename]#/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 <<porting-categories,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 <<choosing-categories,unten>> für weitere Informationen darüber, wie man die richtige Kategorie bestimmt.
+
+[[porting-categories]]
+=== 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.
+
+[NOTE]
+====
+Für nicht-virtuelle Kategorien finden Sie eine einzeilige Beschreibung in der Variable `COMMENT` im [.filename]#Makefile# des jeweiligen Unterverzeichnisses.
+====
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Kategorie
+| Beschreibung
+| Anmerkung
+
+|[.filename]#accessibility#
+|Ports für behinderte Menschen.
+|
+
+|[.filename]#afterstep*#
+|Ports für den http://www.afterstep.org[AfterStep] Window Manager.
+|
+
+|[.filename]#arabic#
+|Arabische Sprachunterstützung.
+|
+
+|[.filename]#archivers#
+|Archivierungswerkzeuge.
+|
+
+|[.filename]#astro#
+|Ports für Astronomie.
+|
+
+|[.filename]#audio#
+|Sound-Unterstützung.
+|
+
+|[.filename]#benchmarks#
+|Benchmarking-Werkzeuge.
+|
+
+|[.filename]#biology#
+|Software für Biologie.
+|
+
+|[.filename]#cad#
+|CAD-Werkzeuge.
+|
+
+|[.filename]#chinese#
+|Chinesische Sprachunterstützung.
+|
+
+|[.filename]#comms#
+|Kommunikationsprogramme.
+|Hauptsächlich Software für serielle Schnittstellen.
+
+|[.filename]#converters#
+|Zeichensatz-Konverter.
+|
+
+|[.filename]#databases#
+|Datenbanken.
+|
+
+|[.filename]#deskutils#
+|Dinge, die vor der Erfindung des Computers auf dem Schreibtisch waren.
+|
+
+|[.filename]#devel#
+|Entwicklungs-Werkzeuge.
+|Legen Sie keine Bibliotheken hier ab, nur weil es Bibliotheken sind, es sei denn, sie gehören wirklich nirgendwo anders hin.
+
+|[.filename]#dns#
+|DNS-bezogene Software.
+|
+
+|[.filename]#docs*#
+|Meta-Ports für die FreeBSD-Dokumentation.
+|
+
+|[.filename]#editors#
+|allgemeine Editoren.
+|Spezielle Editoren gehören in Ihre jeweilige Kategorie, (z.B. gehört ein mathematischer Formeleditor in [.filename]#math#).
+
+|[.filename]#elisp*#
+|Emacs-lisp-Ports.
+|
+
+|[.filename]#emulators#
+|Emulatoren für andere Betriebssysteme.
+|Terminal-Emulatoren gehören _nicht_ hierher; X-basierende gehören zu [.filename]#x11# und text-basierende zu [.filename]#comms# oder [.filename]#misc#, abhängig von deren genauer Funktionalität.
+
+|[.filename]#finance#
+|Finanz-Software und ähnliches.
+|
+
+|[.filename]#french#
+|Französische Sprachunterstützung.
+|
+
+|[.filename]#ftp#
+|FTP Client- und Server-Werkzeuge.
+|Falls Ihr Port sowohl FTP als auch HTTP unterstützt, stellen Sie ihn in [.filename]#ftp# mit der Zweitkategorie [.filename]#www#.
+
+|[.filename]#games#
+|Spiele.
+|
+
+|[.filename]#geography*#
+|geografische Software.
+|
+
+|[.filename]#german#
+|Deutsche Sprachunterstützung.
+|
+
+|[.filename]#gnome*#
+|Ports für http://www.gnome.org[GNOME]
+|
+
+|[.filename]#gnustep*#
+|Software für GNUstep.
+|
+
+|[.filename]#graphics#
+|grafische Werkzeuge.
+|
+
+|[.filename]#hamradio*#
+|Software für Amateurfunk.
+|
+
+|[.filename]#haskell*#
+|Software für die Haskell-Programmiersprache.
+|
+
+|[.filename]#hebrew#
+|Hebräische Sprachunterstützung.
+|
+
+|[.filename]#hungarian#
+|Ungarische Sprachunterstützung.
+|
+
+|[.filename]#ipv6*#
+|IPv6-bezogene Software.
+|
+
+|[.filename]#irc#
+|Internet Relay Chat (IRC)-Werkzeuge.
+|
+
+|[.filename]#japanese#
+|Japanische Sprachunterstützung.
+|
+
+|[.filename]#java#
+|Software für die Java(TM)-Programmiersprache.
+|Die [.filename]#java#-Kategorie sollte nicht die Einzige für einen Port sein mit Ausnahme der direkt nur mit der Programmiersprache zusammenhängenden Applikationen. Porter sollten [.filename]#java# nicht als Hauptkategorie eines Ports wählen.
+
+|[.filename]#kde*#
+|Ports für das http://www.kde.org[K Desktop Environment (KDE)]-Projekt.
+|
+
+|[.filename]#kld*#
+|Kernelmodule.
+|
+
+|[.filename]#korean#
+|Koreanische Sprachunterstützung.
+|
+
+|[.filename]#lang#
+|Programmiersprachen.
+|
+
+|[.filename]#linux*#
+|Linux-Applikationen und -Werkzeuge.
+|
+
+|[.filename]#lisp*#
+|Software für die Lisp-Programmiersprache.
+|
+
+|[.filename]#mail#
+|Mail-Software.
+|
+
+|[.filename]#math#
+|Numerische Berechnungen und andere mathematische Werkzeuge.
+|
+
+|[.filename]#mbone*#
+|MBone-Applikationen.
+|
+
+|[.filename]#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.
+
+|[.filename]#multimedia#
+|Multimedia-Software.
+|
+
+|[.filename]#net#
+|Verschiedene Netzwerk-Software.
+|
+
+|[.filename]#net-im#
+|Instant Messaging-Software.
+|
+
+|[.filename]#net-mgmt#
+|Netzwerk-Management-Software.
+|
+
+|[.filename]#net-p2p#
+|Peer to peer-Netzwerkprogramme.
+|
+
+|[.filename]#news#
+|USENET News-Software.
+|
+
+|[.filename]#palm#
+|Software für http://www.palm.com/[Palm(TM)].
+|
+
+|[.filename]#parallel*#
+|Applikationen für paralleles Rechnen.
+|
+
+|[.filename]#pear*#
+|Ports für das Pear PHP-Framework.
+|
+
+|[.filename]#perl5*#
+|Ports, welche Perl Version 5 benötigen.
+|
+
+|[.filename]#plan9*#
+|Verschiedene Programme von http://www.cs.bell-labs.com/plan9dist/[Plan9].
+|
+
+|[.filename]#polish#
+|Polnische Sprachunterstützung.
+|
+
+|[.filename]#ports-mgmt#
+|Hilfsprogramme für das Installieren und Entwickeln von FreeBSD Ports und Paketen.
+
+|[.filename]#portuguese#
+|Portugiesische Sprachunterstützung.
+|
+
+|[.filename]#print#
+|Drucker-Software.
+|Desktop Veröffentlichungs-Werkzeuge (DTP, Betrachter etc.) gehören auch hierher.
+
+|[.filename]#python*#
+|Software für http://www.python.org/[Python].
+|
+
+|[.filename]#ruby*#
+|Software für http://www.ruby-lang.org/[Ruby].
+|
+
+|[.filename]#rubygems*#
+|Ports für http://www.rubygems.org/[RubyGems]-Pakete.
+|
+
+|[.filename]#russian#
+|Russische Sprachunterstützung.
+|
+
+|[.filename]#scheme*#
+|Software für die Scheme-Programmiersprache.
+|
+
+|[.filename]#science#
+|Wissenschaftliche Programme, die in keine andere Kategorie passen wie z.B. [.filename]#astro#, [.filename]#biology# und [.filename]#math#.
+|
+
+|[.filename]#security#
+|Security-Werkzeuge.
+|
+
+|[.filename]#shells#
+|Shells.
+|
+
+|[.filename]#spanish*#
+|Spanische Sprachunterstützung.
+|
+
+|[.filename]#sysutils#
+|System-Werkzeuge.
+|
+
+|[.filename]#tcl*#
+|Ports, welche Tcl benötigen.
+|
+
+|[.filename]#textproc#
+|Textverarbeitungsprogramme.
+|Dies beinhaltet nicht DTP-Werkzeuge, diese gehören in [.filename]#print#.
+
+|[.filename]#tk*#
+|Ports, welche Tk benötigen.
+|
+
+|[.filename]#ukrainian#
+|Ukrainische Sprachunterstützung.
+|
+
+|[.filename]#vietnamese#
+|Vietnamesische Sprachunterstützung.
+|
+
+|[.filename]#windowmaker*#
+|Ports für den WindowMaker Window-Manager.
+|
+
+|[.filename]#www#
+|Software für das World Wide Web (WWW).
+|HTML-Werkzeuge gehören auch hierher.
+
+|[.filename]#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 [.filename]#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.
+
+|[.filename]#x11-clocks#
+|X11-Uhren.
+|
+
+|[.filename]#x11-drivers#
+|X11-Treiber.
+|
+
+|[.filename]#x11-fm#
+|X11-Dateimanager.
+|
+
+|[.filename]#x11-fonts#
+|X11-Schriftarten und Werkzeuge.
+|
+
+|[.filename]#x11-servers#
+|X11-Server.
+|
+
+|[.filename]#x11-themes#
+|X11-Themes.
+|
+
+|[.filename]#x11-toolkits#
+|X11-Toolkits.
+|
+
+|[.filename]#x11-wm#
+|X11-Window-Manager.
+|
+
+|[.filename]#xfce*#
+|Ports in Zusammenhang mit http://www.xfce.org/[Xfce].
+|
+
+|[.filename]#zope*#
+|http://www.zope.org/[Zope]-Unterstützung.
+|
+|===
+
+[[choosing-categories]]
+=== 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 <<porting-categories,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 [.filename]#japanese x11-fonts# enthalten.
+* Spezifische Kategorien werden vor weniger spezifischen Kategorien aufgelistet. Ein HTML-Editor sollte z.B. als [.filename]#www editors# aufgeführt werden und nicht umgekehrt. Genauso sollten Sie keinen Port unter [.filename]#net# aufführen, wenn er zu [.filename]#irc#, [.filename]#mail#, [.filename]#news#, [.filename]#security# oder [.filename]#www# passt, da [.filename]#net# in diesen Kategorien bereits implizit eingeschlossen ist.
+* [.filename]#x11# wird nur als sekundäre Kategorie benutzt, wenn die primäre Kategorie eine sprachspezifische ist. Keinesfalls sollten Sie [.filename]#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 [.filename]#editors#. Ein Emacs mode z.B. für das Editieren von Quelltext einer bestimmten Programmiersprache gehört zur Kategorie [.filename]#lang#.
+* Für Ports, die vom Benutzer ladbare Kernelmodule installieren, sollte die virtuelle Kategorie [.filename]#kld# in die `CATEGORIES`-Zeile aufgenommen werden.
+* [.filename]#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 [.filename]#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 {freebsd-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.
+
+[[proposing-categories]]
+=== 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 link:{committers-guide}#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:
+
+[.procedure]
+====
+. Schlagen Sie die neue Kategorie auf {freebsd-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:
+
+** [.filename]##Makefile##s für die neuen Ports nach dem Repocopy
+** [.filename]#Makefile# für die neue Kategorie
+** [.filename]#Makefile# für die alten Kategorien der betroffenen Ports
+** [.filename]##Makefile##s 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 {portmgr} zugeordnet werden.
+. Sobald der PR bestätigt wurde muss ein Committer den Rest der Prozedur durchführen, welche im link:{committers-guide}#ports[ 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.
+
+[[proposing-reorg]]
+=== 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.
+
+[[makefile-distfiles]]
+== Die Distributionsdateien
+
+Der zweite Teil des [.filename]#Makefile# beschreibt die Dateien, welche heruntergeladen werden müssen, um den Port zu bauen und wo diese Dateien zu finden sind.
+
+=== `DISTVERSION/DISTNAME`
+
+`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 [.filename]#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:
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| DISTVERSION
+| PORTVERSION
+
+|0.7.1d
+|0.7.1.d
+
+|10Alpha3
+|10.a3
+
+|3Beta7-pre2
+|3.b7.p2
+
+|8:f_17
+|8f.17
+|===
+
+[NOTE]
+====
+`PKGNAMEPREFIX` und `PKGNAMESUFFIX` beeinflussen `DISTNAME` nicht. Beachten Sie bitte auch, dass Sie `DISTNAME` unverändert lassen sollten, falls `WRKSRC` denselben Wert hat wie [.filename]#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.
+====
+
+=== `MASTER_SITES`
+
+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 ([.filename]#/#) 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 SourceForge, 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_SOURCEFORGE`,, `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:
+
+[.programlisting]
+....
+MASTER_SITES= ${MASTER_SITE_GNU}
+MASTER_SITE_SUBDIR= make
+....
+
+Oder verwenden Sie ein kondensiertes Format:
+
+[.programlisting]
+....
+MASTER_SITES= GNU/make
+....
+
+Diese Variablen werden in [.filename]#/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.
+
+Für beliebte Seiten existieren sogenannte _magic_-Makros, die eine bestimmte Verzeichnisstruktur erstellen. Um eines dieser Makros zu verwenden, geben Sie dessen Abkürzung an und Ihr System wird versuchen, das korrekte Unterverzeichnis automatisch zu bestimmen.
+
+[.programlisting]
+....
+MASTER_SITES= SF
+....
+
+Ist das Ergebnis nicht korrekt, können Sie diesen Wert auch überschreiben.
+
+[.programlisting]
+....
+MASTER_SITES= SF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}
+....
+
+.Beliebte magic `MASTER_SITES`-Makros
+[cols="1,1", frame="none", options="header"]
+|===
+| Makro
+| Erwartetes Unterverzeichnis
+
+|`APACHE_JAKARTA`
+|`/dist/jakarta/${PORTNAME:S,-,,/,}/source`
+
+|`BERLIOS`
+|`/${PORTNAME:L}`
+
+|`CHEESESHOP`
+|`/packages/source/source/${DISTNAME:C/(.).\*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}`
+
+|`DEBIAN`
+|`/debian/pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}`
+
+|`GCC`
+|`/pub/gcc/releases/${DISTNAME}`
+
+|`GNOME`
+|`/pub/GNOME/sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}`
+
+|`GNU`
+|`/gnu/${PORTNAME}`
+
+|`MOZDEV`
+|`/pub/mozdev/${PORTNAME:L}`
+
+|`PERL_CPAN`
+|`/pub/CPAN/modules/by-module/${PORTNAME:C/-.*//}`
+
+|`PYTHON`
+|`/ftp/python/${PYTHON_PORTVERSION:C/rc[0-9]//}`
+
+|`RUBYFORGE`
+|`/${PORTNAME:L}`
+
+|`SAVANNAH`
+|`/${PORTNAME:L}`
+
+|`SF`
+|`/project/${PORTNAME:L}/${PORTNAME:L}/${PORTVERSION}`
+|===
+
+=== `EXTRACT_SUFX`
+
+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 [.filename]#foo.tgz# anstatt des normalen [.filename]#foo.tar.gz# benannt, würden Sie schreiben:
+
+[.programlisting]
+....
+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`.
+
+[NOTE]
+====
+Sie müssen niemals beide Variablen `EXTRACT_SUFX` und `DISTFILES` setzen.
+====
+
+=== `DISTFILES`
+
+Manchmal haben die zu ladenden Dateien keinerlei Ähnlichkeit mit dem Namen des Ports. Es könnte z.B. [.filename]#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.
+
+[.programlisting]
+....
+DISTFILES= source1.tar.gz source2.tar.gz
+....
+
+Wenn nicht ausdrücklich gesetzt, verwendet `DISTFILES` als Vorgabe `${DISTNAME}${EXTRACT_SUFX}`.
+
+=== `EXTRACT_ONLY`
+
+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.
+
+[.programlisting]
+....
+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.
+
+[.programlisting]
+....
+EXTRACT_ONLY=
+....
+
+[[porting-patchfiles]]
+=== `PATCHFILES`
+
+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 [.filename]#.gz# oder [.filename]#.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 [.filename]#bsd.port.mk# wird automatisch diese Dateien nutzen. Kopieren Sie _niemals_ Patch-Dateien in das `PATCHDIR`-Verzeichnis, weil es möglicherweise nicht beschreibbar ist.
+
+[NOTE]
+====
+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.
+====
+
+[[porting-master-sites-n]]
+=== Verschiedene Distributionsdateien oder Patches von verschiedenen Seiten und Verzeichnissen (`MASTER_SITES:n`)
+
+(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:
+
+[.programlisting]
+....
+DISTFILES= alpha:0 beta:1
+....
+
+In OpenBSD wird die Datei [.filename]#alpha# mit der Variable `MASTER_SITES0` verknüpft anstatt dem in FreeBSD gebräuchlichen `MASTER_SITES` und [.filename]#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, [.filename]#beta# findet sich auf allen Seiten in `MASTER_SITES` und [.filename]#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, [.filename]#source1.tar.gz# und [.filename]#source2.tar.gz#, welche von zwei verschiedenen Webseiten heruntergeladen werden müssen. Das [.filename]#Makefile# des Port würde Zeilen enthalten wie in <<ports-master-sites-n-example-simple-use-one-file-per-site>>.
+
+[[ports-master-sites-n-example-simple-use-one-file-per-site]]
+.Vereinfachtes Beispiel für den Gebrauch von `MASTER_SITES:n` mit einer Datei pro Webseite
+[example]
+====
+[.programlisting]
+....
+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 ([.filename]#source3.tar.gz#), welche von `ftp.example2.com` heruntergeladen werden soll. Das [.filename]#Makefile# würde dann aussehen wie <<ports-master-sites-n-example-simple-use-more-than-one-file-per-site>>.
+
+[[ports-master-sites-n-example-simple-use-more-than-one-file-per-site]]
+.Vereinfachtes Beispiel für den Gebrauch von `MASTER_SITES:n` mit mehr als einer Datei pro Webseite
+[example]
+====
+[.programlisting]
+....
+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 <<porting-master-sites-n-what-changes-in-port-targets,ii>>). Ausserdem ist `DEFAULT` ein reserviertes Wort (beachten Sie <<porting-master-sites-n-DEFAULT-group,3>>).
+. Elemente mit angehängtem `:n` gehören zur Gruppe `n`, `:m` gehört zur Gruppe `m` und so weiter.
+[[porting-master-sites-n-DEFAULT-group]]
+. 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 <<porting-master-sites-n-comma-operator,5>>).
++
+Die folgenden Beispiele sind gleichwertig, aber das erste Beispiel ist vorzuziehen:
++
+[.programlisting]
+....
+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.
+[[porting-master-sites-n-comma-operator]]
+. 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:
++
+[.programlisting]
+....
+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.
+[[porting-master-sites-n-group-semantics]]
+. 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 <<ports-master-sites-n-example-detailed-use-master-site-subdir>> als auch <<ports-master-sites-n-example-detailed-use-complete-example-master-sites>>.
++
+[[ports-master-sites-n-example-detailed-use-master-site-subdir]]
+.Ausführliches Beispiel von `MASTER_SITES:n` in `MASTER_SITE_SUBDIR`
+[example]
+====
+[.programlisting]
+....
+MASTER_SITE_SUBDIR= old:n new/:NEW
+....
+
+*** Verzeichnisse innerhalb der Gruppe `DEFAULT` -> old:n
+*** Verzeichnisse innerhalb der Gruppe `NEW` -> new
+
+====
++
+[[ports-master-sites-n-example-detailed-use-complete-example-master-sites]]
+.Ausführliches Beispiel von `MASTER_SITES:n` mit Komma-Operator, mehreren Dateien, mehreren Webseiten und mehreren Unterverzeichnissen
+[example]
+====
+[.programlisting]
+....
+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.
+
+*** [.filename]#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`
+
+*** [.filename]#file2# wird genauso heruntergeladen wie [.filename]#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`
+
+*** [.filename]#file3# wird heruntergeladen von
+
+**** `MASTER_SITE_OVERRIDE`
+**** http://site3/
+**** `MASTER_SITE_BACKUP`
+
+*** [.filename]#file4# wird heruntergeladen von
+
+**** `MASTER_SITE_OVERRIDE`
+**** http://site4/
+**** http://site5/
+**** http://site6/
+**** http://site7/
+**** http://site8/directory-one/
+**** `MASTER_SITE_BACKUP`
+
+*** [.filename]#file5# wird heruntergeladen von
+
+**** `MASTER_SITE_OVERRIDE`
+**** `MASTER_SITE_BACKUP`
+
+*** [.filename]#file6# wird heruntergeladen von
+
+**** `MASTER_SITE_OVERRIDE`
+**** http://site8/
+**** `MASTER_SITE_BACKUP`
+
+====
+
+. Wie gruppiere ich eine der speziellen Variablen aus [.filename]#bsd.sites.mk#, d.h. `MASTER_SITE_SOURCEFORGE`?
++
+Lesen Sie <<ports-master-sites-n-example-detailed-use-master-site-sourceforge>>.
++
+[[ports-master-sites-n-example-detailed-use-master-site-sourceforge]]
+.Ausführliches Beispiel von `MASTER_SITES:n` mit `MASTER_SITE_SOURCEFORGE`
+[example]
+====
+[.programlisting]
+....
+MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
+DISTFILES= something.tar.gz:sourceforge
+....
+
+====
++
+[.filename]#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 <<ports-master-sites-n-example-detailed-use-patch-sites>>. sehen können.
++
+[[ports-master-sites-n-example-detailed-use-patch-sites]]
+.Vereinfachte Nutzung von `MASTER_SITES:n` mit `PATCH_SITES`.
+[example]
+====
+[.programlisting]
+....
+PATCH_SITES= http://site1/ http://site2/:test
+PATCHFILES= patch1:test
+....
+
+====
+
+==== Was ändert sich für die Ports? Was ändert sich nicht?
+
+[lowerroman]
+. 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 <<porting-master-sites-n-group-semantics,7>> gezeigt gibt.
+[[porting-master-sites-n-what-changes-in-port-targets]]
+. 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 <<ports-master-sites-n-example-detailed-use-complete-example-master-sites>>.
+** `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 <<porting-master-sites-n-new-port-targets-master-sites-all,B>> 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.
+[[porting-master-sites-n-new-port-targets-master-sites-all]]
+.. 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`.
+
+=== `DIST_SUBDIR`
+
+Verhindern Sie, dass Ihr Port das Verzeichnis [.filename]#/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.[.filename]#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 [.filename]#/usr/ports/distfiles# auf [.filename]#/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 [.filename]#ftp.FreeBSD.org# suchen (das ausdrückliche Setzen von `DISTDIR` in Ihrem `Makefile` wird dies nicht gewährleisten, also nutzen Sie bitte `DIST_SUBDIR`).
+
+[NOTE]
+====
+Dies hat keine Auswirkungen auf die Variable `MASTER_SITES`, die Sie in Ihrem [.filename]#Makefile# definieren.
+====
+
+=== `ALWAYS_KEEP_DISTFILES`
+
+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 FreeBSD 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.
+
+[[ports-master-sites-n-example-always-keep-distfiles]]
+.Nutzung von `ALWAYS_KEEP_DISTFILES`.
+[example]
+====
+[.programlisting]
+....
+.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 [.filename]#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.
+
+[[makefile-maintainer]]
+== `MAINTAINER`
+
+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 [.filename]#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 link:{contributing-ports}#maintain-port/[ 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 {portmgr} oder das {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 {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 {security-officer} behält sich das Recht vor, jede Maintainerschaft aus Sicherheitsgründen aufzuheben oder ausser Kraft zu setzen.
+
+[[makefile-comment]]
+== `COMMENT`
+
+Dies ist eine einzeilige Beschreibung des Ports. _Bitte_ fügen Sie nicht den Paketnamen (oder die Version der Software) in den Kommentar ein. Der Kommentar soll mit einem Großbuchstaben beginnen und ohne Punkt enden. Hier ist ein Beispiel:
+
+[.programlisting]
+....
+COMMENT= A cat chasing a mouse all over the screen
+....
+
+Die COMMENT-Variable soll unmittelbar nach der MAINTAINER-Variable im [.filename]#Makefile# stehen.
+
+Bitte versuchen Sie die COMMENT-Zeile auf weniger als 70 Zeichen zu begrenzen, da man:pkg_info[1] diese zur Anzeige einer kurzen, einzeiligen Zusammenfassung des Ports verwendet.
+
+[[makefile-depend]]
+== Abhängigkeiten (dependencies)
+
+Viele Ports hängen von anderen Ports ab. Dies ist ein sehr praktisches und nettes Feature der meisten Unix-ähnlichen Betriebssysteme, FreeBSD nicht ausgeschlossen. Es erlaubt, dass häufig vorkommende Abhängigkeiten nicht mit jedem Port oder Paket zusammen ausgeliefert werden müssen, da viele Ports diese gemeinsam benutzen. Es gibt sieben Variablen, die benutzt werden 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.
+
+=== `LIB_DEPENDS`
+
+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
+
+[.programlisting]
+....
+LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg
+....
+
+auf eine jpeg-Bibliothek mit der Hauptversionsnummer 9 prüfen, in das [.filename]#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`).
+
+[NOTE]
+====
+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.
+
+=== `RUN_DEPENDS`
+
+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
+
+[.programlisting]
+....
+RUN_DEPENDS= ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
+ xmlcatmgr:${PORTSDIR}/textproc/xmlcatmgr
+....
+
+überprüfen, ob die Datei oder das Verzeichnis [.filename]#/usr/local/etc/innd# existiert und es erstellen und installieren aus dem [.filename]#news/inn#-Unterverzeichnis der Ports-Sammlung, falls es nicht gefunden wird. Es wird zudem überprüft, ob die Binärdatei namens `xmlcatmgr` im Suchpfad vorhanden ist und danach zum Unterverzeichnis [.filename]#textproc/xmlcatmgr# in Ihrer Ports-Sammlung wechseln, es bauen und installieren, falls es nicht gefunden wird.
+
+[NOTE]
+====
+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.
+====
+
+[NOTE]
+====
+Der offizielle Suchpfad `PATH`, welcher im Ports Cluster benutzt wird, ist
+
+[.programlisting]
+....
+/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`.
+
+Es kommt recht häufig vor, dass `RUN_DEPENDS` genau dasselbe enthält wie `BUILD_DEPENDS`, gerade dann, wenn die portierte Software in einer Skriptsprache geschrieben ist oder dieselbe Umgebung, die zum Bau verwendet wurde, zur Laufzeit gebraucht wird. In diesem Fall ist es sowohl verlockend als auch intuitiv, den Wert der einen Variable der anderen direkt zuzuweisen:
+
+[.programlisting]
+....
+RUN_DEPENDS= ${BUILD_DEPENDS}
+....
+
+Jedoch kann eine solche Zuweisung dazu führen, dass die Liste der Laufzeitabhängigkeiten mit überflüssigen Einträgen belastet wird, die sich nicht in der ursprünglichen Liste `BUILD_DEPENDS` des Ports befanden, da sich man:make[1] bei der Auswertung solcher Zuweisungen träge verhält. Stellen Sie sich ein [.filename]#Makefile# mit `USE_*`-Variablen vor, die von [.filename]#ports/Mk/bsd.*.mk# verarbeitet werden, um initiale Bauabhängigkeiten zusammenzutragen. Zum Beispiel fügt `USE_GMAKE=yes` package:devel/gmake[] zu `BUILD_DEPENDS` hinzu. Um zu verhindern, dass solche zusätzlichen Abhängigkeiten `RUN_DEPENDS` belasten, achten Sie darauf, bei gleichzeitiger Auswertung zuzuweisen, d.h. der Ausdruck wird ausgewertet, bevor er als Wert der Variablen zugewiesen wird:
+
+[.programlisting]
+....
+RUN_DEPENDS:= ${BUILD_DEPENDS}
+....
+
+=== `BUILD_DEPENDS`
+
+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
+
+[.programlisting]
+....
+ BUILD_DEPENDS=
+ unzip:${PORTSDIR}/archivers/unzip
+....
+
+überprüfen, ob eine Binärdatei `unzip` vorhanden ist und in das Unterverzeichnis [.filename]#archivers/unzip# Ihrer Ports-Sammlung wechseln und sie erstellen und installieren, falls sie nicht gefunden wird.
+
+[NOTE]
+====
+"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.
+====
+
+=== `FETCH_DEPENDS`
+
+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
+
+[.programlisting]
+....
+ FETCH_DEPENDS=
+ ncftp2:${PORTSDIR}/net/ncftp2
+....
+
+überprüfen, ob eine Binärdatei namens `ncftp2` vorhanden ist, in das Unterverzeichnis [.filename]#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.
+
+=== `EXTRACT_DEPENDS`
+
+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
+[.programlisting]
+....
+EXTRACT_DEPENDS=
+ unzip:${PORTSDIR}/archivers/unzip
+....
+
+überprüfen, ob eine Binärdatei namens `unzip` vorhanden ist, in das Unterverzeichnis [.filename]#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.
+
+[NOTE]
+====
+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 <<use-vars>> beschrieben zum Laufen gebracht werden kann.
+====
+
+=== `PATCH_DEPENDS`
+
+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
+[.programlisting]
+....
+ PATCH_DEPENDS=
+ ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
+....
+
+in das Unterverzeichnis [.filename]#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.
+
+[[use-vars]]
+=== `USE_*`
+
+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 [.filename]#Makefile# eines Ports zu erhöhen. Jede von ihnen ist im Stil von `USE_*`. Der Gebrauch dieser Variablen ist beschränkt auf das [.filename]#Makefile# eines Ports und [.filename]##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.
+
+[NOTE]
+====
+Es ist _immer_ falsch, irgendeine `USE_*`-Variable in der [.filename]#/etc/make.conf# zu setzen. Zum Beispiel würde das Setzen von
+[.programlisting]
+....
+USE_GCC=3.4
+....
+
+eine Abhängigkeit für GCC34 für jeden Port einschliesslich GCC34 selbst hinzufügen!
+====
+
+.Die `USE_*`-Varibalen
+[cols="1,1", frame="none", options="header"]
+|===
+| 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 package:sysutils/cdrtools[] oder package: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.4`. Mit `3.4+` 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 [.filename]#configure#-Skript werden in <<building>> beschrieben, währenddessen autoconf, automake und libtool in <<using-autotools>> beschrieben sind. Perl-spezifische Variablen werden in <<using-perl>> behandelt. X11-Variablen sind aufgelistet in <<using-x11>>. <<using-gnome>> behandelt GNOME-bezogene Variablen und <<using-kde>> KDE-bezogene Variablen. <<using-java>> dokumentiert Java-Variablen, während <<using-php>>Informationen zu Apache, PHP und PEAR-Modulen enthält. Python wird in <<using-python>> und Ruby in <<using-ruby>> erörtert. <<using-sdl>> stellt Variablen für SDL-Programme zur Verfügung und <<using-xfce>> 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:
+
+[.programlisting]
+....
+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 [.filename]#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
+
+[.programlisting]
+....
+BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract
+....
+
+immer zum ``jpeg``-Port wechseln und ihn extrahieren.
+
+=== Zirkuläre Abhängigkeiten sind fatal
+
+[IMPORTANT]
+====
+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.
+
+[[makefile-masterdir]]
+== `MASTERDIR`
+
+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 [.filename]#Makefile# in allen ausser einem Unterverzeichnis, wenn Sie Variablen intelligent nutzen. In diesem einzigen [.filename]#Makefile# können Sie `MASTERDIR` verwenden, um anzugeben, wo der Rest der Dateien liegt. Benutzen Sie bitte auch eine Variable für <<porting-pkgname,`PKGNAMESUFFIX`>>, damit die Pakete unterschiedliche Namen haben werden.
+
+Wir demonstrieren dies am Besten an einem Beispiel. Es ist Teil von [.filename]#japanese/xdvi300/Makefile#;
+
+[.programlisting]
+....
+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
+....
+
+package: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_ [.filename]#xdvi118/Makefile#:
+
+[.programlisting]
+....
+RESOLUTION= 118
+MASTERDIR= ${.CURDIR}/../xdvi300
+
+.include "${MASTERDIR}/Makefile"
+....
+
+([.filename]#xdvi240/Makefile# und [.filename]#xdvi400/Makefile# sind ähnlich). Die `MASTERDIR`-Definition teilt dem [.filename]#bsd.port.mk# mit, dass die normalen Unterverzeichnisse wie `FILESDIR` und `SCRIPTDIR` unter [.filename]#xdvi300# gefunden werden können. Die `RESOLUTION=118`-Zeile wird die `RESOLUTION=300`-Zeile in [.filename]#xdvi300/Makefile# überschreiben und der Port wird mit einer Auflösung von 118 erstellt.
+
+[[makefile-manpages]]
+== Manualpages
+
+Die Variablen `MAN[1-9LN]` werden automatisch jede Manualpage zur [.filename]#pkg-plist# hinzufügen (dies bedeutet, dass Sie Manualpages _nicht_ in der [.filename]#pkg-plist# auflisten dürfen, lesen Sie bitte <<plist-sub,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 `NO_MANCOMPRESS` in [.filename]#/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 [.filename]#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 [.filename]#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 `NO_MANCOMPRESS` beachtet, damit [.filename]#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 `PREFIX` 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 `MAN_sect_PREFIX` (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.
+
+[.programlisting]
+....
+MAN1= foo.1
+MAN3= bar.3
+MAN4= baz.4
+MLINKS= foo.1 alt-name.8
+MANLANG= "" ja
+MAN3PREFIX= ${PREFIX}/shared/foobar
+MANCOMPRESSED= yes
+....
+
+Dies zeigt an, dass sechs Dateien von diesem Port installiert werden;
+
+[.programlisting]
+....
+${MANPREFIX}/man/man1/foo.1.gz
+${MANPREFIX}/man/ja/man1/foo.1.gz
+${PREFIX}/shared/foobar/man/man3/bar.3.gz
+${PREFIX}/shared/foobar/man/ja/man3/bar.3.gz
+${MANPREFIX}/man/man4/baz.4.gz
+${MANPREFIX}/man/ja/man4/baz.4.gz
+....
+
+[.filename]#${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:
+
+[.programlisting]
+....
+MANLANG= "" de ja
+MAN1= foo.1
+MAN1_EN= bar.1
+MAN3_DE= baz.3
+....
+
+Dies führt zu folgender Liste von Dateien:
+
+[.programlisting]
+....
+${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
+....
+
+[[makefile-info]]
+== 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 [.filename]#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 [.filename]#PREFIX/INFO_PATH#. Zum Beispiel installiert package:lang/gcc34[] Info-Dateien nach [.filename]#PREFIX/INFO_PATH/gcc34#, wobei `INFO` etwa so aussieht:
+
+[.programlisting]
+....
+INFO= gcc34/cpp gcc34/cppinternals gcc34/g77 ...
+....
+
+Entsprechende Installations-/Deinstalltions-Codes werden vor der Paket-Registrierung automatisch der vorläufigen [.filename]#pkg-plist# hinzugefügt.
+
+[[makefile-options]]
+== 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)
+
+==== `WITH_*` und `WITHOUT_*`
+
+Diese Variablen sind entworfen worden, um vom System-Administrator gesetzt zu werden. Es gibt viele, die in http://www.freebsd.org/cgi/cvsweb.cgi/ports/KNOBS?rev=HEAD&content-type=text/x-cvsweb-markup[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`.
+
+[NOTE]
+====
+Sie sollten nicht annehmen, dass ein `WITH_*` notwendigerweise eine korrespondierende ``WITHOUT_*``-Variable hat oder umgekehrt. Im Allgemeinen wird diese Vorgabe einfach unterstellt.
+====
+
+[NOTE]
+====
+Falls nicht anderweitig festgelegt, werden diese Variablen nur dahingehend überprüft, ob sie gesetzt sind oder nicht - nicht darauf, ob sie auf bestimmte Werte wie `YES` oder `NO` gesetzt sind.
+====
+
+.Häufige `WITH_*` und ``WITHOUT_*``-Variablen
+[cols="1,1", frame="none", options="header"]
+|===
+| Variable
+| Bedeutung
+
+|`WITHOUT_NLS`
+|Falls gesetzt, bedeutet sie, dass eine Internationalisierung nicht benötigt wird, was Kompilierzeit sparen kann. Als Vorgabe wird Internationalisierung gebraucht.
+
+|`WITH_OPENSSL_BASE`
+|Nutze die Version von OpenSSL aus dem Basissystem.
+
+|`WITH_OPENSSL_PORT`
+|Installiert die Version von OpenSSL aus package: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 http://www.freebsd.org/cgi/cvsweb.cgi/ports/KNOBS?rev=HEAD&content-type=text/x-cvsweb-markup[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.
+
+=== `OPTIONS`
+
+==== Hintergrund
+
+Die `OPTIONS`-Variable gibt dem Nutzer, der diesen Port installiert, einen Dialog mit auswählbaren Optionen und speichert diese in [.filename]#/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 [.filename]#/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 [.filename]#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:
+
+[.programlisting]
+....
+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 [.filename]#bsd.port.options.mk# erscheinen. Die `WITH_*` und `WITHOUT_*`-Variablen können nur nach der Einbindung von [.filename]#bsd.port.options.mk# getestet werden. [.filename]#bsd.port.pre.mk# kann auch stattdessen eingebunden werden und wird immer noch von vielen Ports eingebunden, die vor der Einführung von [.filename]#bsd.port.options.mk# erstellt wurden. Jedoch wirken manche Variablen nicht wie gewohnt nach der Einbindung von [.filename]#bsd.port.pre.mk#, typischerweise `USE_*`-Optionen.
+
+[[ports-options-simple-use]]
+.Einfache Anwendung von `OPTIONS`
+[example]
+====
+
+[.programlisting]
+....
+OPTIONS= FOO "Enable option foo" On \
+ BAR "Support feature bar" Off
+
+.include <bsd.port.options.mk>
+
+.if defined(WITHOUT_FOO)
+CONFIGURE_ARGS+= --without-foo
+.else
+CONFIGURE_ARGS+= --with-foo
+.endif
+
+.if defined(WITH_BAR)
+RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar
+.endif
+
+.include <bsd.port.mk>
+....
+
+====
+
+[[ports-options-old-style-use]]
+.Veraltete Anwendung von `OPTIONS`
+[example]
+====
+
+[.programlisting]
+....
+OPTIONS= FOO "Enable option foo" On
+
+.include <bsd.port.pre.mk>
+
+.if defined(WITHOUT_FOO)
+CONFIGURE_ARGS+= --without-foo
+.else
+CONFIGURE_ARGS+= --with-foo
+.endif
+
+.include <bsd.port.post.mk>
+....
+
+====
+
+=== Automatische Aktivierung von Funktionen
+
+Wenn Sie ein GNU-Konfigurationsskript benutzen, sollten Sie ein Auge darauf werfen, welche Funktionen durch die automatische Erkennung aktiviert werden. Schalten Sie Funktionen, die Sie nicht möchten, ausdrücklich durch Verwendung von `--without-xxx` oder `--disable-xxx` in der Variable `CONFIGURE_ARGS` einzeln ab.
+
+.Falsche Behandlung einer Option
+[example]
+====
+[.programlisting]
+....
+.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
+[example]
+====
+[.programlisting]
+....
+.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.
+
+[[makefile-wrkdir]]
+== 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:
+
+[.programlisting]
+....
+PORTNAME= foo
+PORTVERSION= 1.0
+....
+
+festgelegt haben, dann enthalten die Distributions-Dateien des Ports ein Verzeichnis auf oberster Ebene, [.filename]#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.
+
+=== `WRKSRC`
+
+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 [.filename]#foo# (und nicht [.filename]#foo-1.0#) extrahiert wurde, würden Sie schreiben:
+
+[.programlisting]
+....
+WRKSRC= ${WRKDIR}/foo
+....
+
+oder möglicherweise
+
+[.programlisting]
+....
+WRKSRC= ${WRKDIR}/${PORTNAME}
+....
+
+=== `NO_WRKSUBDIR`
+
+Wenn der Port überhaupt nicht in einem Unterverzeichnis extrahiert wird, sollten Sie dies mit dem Setzen von `NO_WRKSUBDIR` anzeigen.
+
+[.programlisting]
+....
+NO_WRKSUBDIR= yes
+....
+
+[[conflicts]]
+== Konfliktbehandlung
+
+Es gibt drei verschiedene Variablen, um einen Konflikt zwischen Paketen und Ports zu dokumentieren: `CONFLICTS`, `CONFLICTS_INSTALL` sowie `CONFLICTS_BUILD`.
+
+[NOTE]
+====
+`CONFLICTS` setzt automatisch die Variable `IGNORE`, die ausführlicher in <<dads-noinstall>> beschrieben wird.
+====
+
+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.
+
+=== `CONFLICTS_INSTALL`
+
+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_INSTALL` auf. Sie können hier Shell-Globs wie `*` und `?` verwenden. Paketnamen sollten in der gleichen Weise aufgezählt werden, wie sie in [.filename]#/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_BUILD`
+
+Wenn Ihr Port nicht gebaut werden kann, wenn ein bestimmter Port bereits installiert ist, geben Sie diesen in der Variable `CONFLICTS_BUILD` an. Sie können hier Shell-Globs wie `*` und `?` verwenden. Paketnamen sollten in der gleichen Weise aufgezählt werden, wie sie in [.filename]#/var/db/pkg# auftauchen. Die CONFLICTS_BUILD-Prüfung erfolgt vor dem Bau des Ports. Baukonflikte werden im erzeugten Paket nicht verzeichnet.
+
+=== `CONFLICTS`
+
+Wenn Ihr Port nicht gebaut werden kann, wenn ein bestimmter Port bereits installiert ist und das aus dem Port erzeugte Paket nicht mit dem anderen Paket koexistieren kann, geben Sie das andere Paket in der Variable `CONFLICTS` an. Sie können hier Shell-Globs wie `*` und `?` verwenden. Paketnamen sollten in der gleichen Weise aufgezählt werden, wie sie in [.filename]#/var/db/pkg# auftauchen. Bitte stellen Sie sicher, dass `CONFLICTS_INSTALL` nicht mit dem Paket des Ports selbst übereinstimmt, da ansonsten das Erzwingen der Installation durch `FORCE_PKG_REGISTER` nicht länger funktionieren wird. Die CONFLICTS-Prüfung erfolgt vor dem Bau des Ports und vor der Installation des gebauten Ports.
+
+[[install]]
+== Installation von Dateien
+
+[[install-macros]]
+=== INSTALL_* macros
+
+Nutzen Sie die Makros in [.filename]#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_LIB` ist ein Befehl zur Installation Shared-Libraries.
+* `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.
+
+[[install-strip]]
+=== Zerlegen von Binärdateien und Shared-Libraries
+
+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). Das Makro `INSTALL_LIB` erledigt das gleiche für Shared-Libraries.
+
+Wenn Sie eine Datei strippen müssen, aber weder das `INSTALL_PROGRAM`- noch das `INSTALL_LIB`-Makro nutzen wollen, dann kann `${STRIP_CMD}` Ihr Programm strippen. Dies wird typischerweise innerhalb des `post-install`-Targets gemacht. Zum Beispiel:
+
+[.programlisting]
+....
+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.
+
+[[install-copytree]]
+=== 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 [.filename]#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 [.filename]#PREFIX/share#.
+
+[.programlisting]
+....
+post-install:
+ ${MKDIR} ${EXAMPLESDIR}
+ (cd ${WRKSRC}/examples/ && ${COPYTREE_SHARE} \* ${EXAMPLESDIR})
+....
+
+Dieses Beispiel wird den Inhalt des [.filename]#examples#-Verzeichnisses im Distfile des Drittanbieters in das Beispielverzeichnis Ihres Ports kopieren.
+
+[.programlisting]
+....
+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 [.filename]#summer#-Unterverzeichnis eines [.filename]#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.
+
+[.programlisting]
+....
+post-install:
+ ${MKDIR} ${EXAMPLESDIR}
+ (cd ${WRKSRC}/examples/ && \
+ ${COPYTREE_SHARE} \* ${EXAMPLESDIR} "! -name Makefile")
+....
+
+Beachten Sie bitte, dass diese Makros die installierten Dateien nicht zur [.filename]#pkg-plist# hinzufügen, Sie müssen sie immer noch selbst auflisten.
+
+[[install-documentation]]
+=== 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 [.filename]#PREFIX/shared/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 [.filename]#/etc/make.conf# abschalten können:
+
+[.programlisting]
+....
+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 [.filename]#Makefile# expandiert werden:
+
+* `DATADIR` wird expandiert zu [.filename]#PREFIX/shared/PORTNAME#.
+* `DATADIR_REL` wird expandiert zu [.filename]#share/PORTNAME#.
+* `DOCSDIR` wird expandiert zu [.filename]#PREFIX/shared/doc/PORTNAME#.
+* `DOCSDIR_REL` wird expandiert zu [.filename]#share/doc/PORTNAME#.
+* `EXAMPLESDIR` wird expandiert zu [.filename]#PREFIX/shared/examples/PORTNAME#.
+* `EXAMPLESDIR_REL` wird expandiert zu [.filename]#share/examples/PORTNAME#.
+
+[NOTE]
+====
+`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 [.filename]#PREFIX#, falls möglich. Das bedeutet, dass [.filename]#share/doc/PORTNAME# standardmässig ersetzt wird durch `%%DOCSDIR%%` in der Packliste usw. (mehr zur Ersetzung durch die [.filename]#pkg-plist# finden Sie <<plist-sub,hier>>).
+
+Alle installierten Dokumentationsdateien und -Verzeichnisse sollten in der [.filename]#pkg-plist# dem `%%PORTDOCS%%`-Präfix enthalten sein, zum Beispiel:
+
+[.programlisting]
+....
+%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
+%%PORTDOCS%%%%DOCSDIR%%/CONTACT
+%%PORTDOCS%%@dirrm %%DOCSDIR%%
+....
+
+Alternativ zur Auflistung der Dokumentationsdateien in der [.filename]#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:
+
+[.programlisting]
+....
+PORTDOCS= README.* ChangeLog docs/*
+....
+
+[NOTE]
+====
+Die Äquivalente zu `PORTDOCS` für unter `DATADIR` und `EXAMPLESDIR` installierte Dateien sind `PORTDATA` beziehungsweise `PORTEXAMPLES`.
+
+Sie können auch [.filename]#pkg-message# benutzen, um Meldungen während der Installation anzuzeigen. Lesen Sie <<porting-message,diesen Abschnitt über den Gebrauch von [.filename]#pkg-message#>> für weitere Details. Die [.filename]#pkg-message#-Datei muss nicht zur [.filename]#pkg-plist# hinzugefügt werden.
+====
+
+[[install-subdirs]]
+=== 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 [.filename]#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: [.filename]#etc# (Konfigurationsdateien), [.filename]#libexec# (intern gestartete Binärdateien), [.filename]#sbin# (Binärdateien für Superuser/Manager), [.filename]#info# (Dokumentation für Info-Browser) oder [.filename]#share# (Architektur-unabhängige Dateien). Lesen Sie hierzu man:hier[7]; weitestgehend greifen die Regeln für [.filename]#/usr# auch für [.filename]#/usr/local#. Die Ausnahme sind Ports, welche mit "news" aus dem USENET arbeiten. In diesem Falle sollte [.filename]#PREFIX/news# als Zielort für die Dateien benutzt werden.
diff --git a/documentation/content/de/books/porters-handbook/own-port/chapter.adoc b/documentation/content/de/books/porters-handbook/own-port/chapter.adoc
new file mode 100644
index 0000000000..9be1b77e68
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/own-port/chapter.adoc
@@ -0,0 +1,39 @@
+---
+title: Kapitel 2. Einen neuen Port erstellen
+prev: books/porters-handbook/why-port
+next: books/porters-handbook/quick-porting
+---
+
+[[own-port]]
+= Einen neuen Port erstellen
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 2
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+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 <<port-upgrading>> fortfahren.
+
+Wenn Ihnen dieses Dokument nicht detailliert genug ist, sollten Sie einen Blick in [.filename]#/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 {freebsd-ports}-Mailingliste stellen.
+
+[NOTE]
+====
+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 [.filename]#/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.
+====
+
+Sind Sie auf der Suche nach einer neuen Aufgabe? Dann sehen Sie sich bitte die http://wiki.freebsd.org/WantedPorts[Ports-Wunschliste] an und prüfen Sie, ob Sie an einem dieser Ports arbeiten können.
diff --git a/documentation/content/de/books/porters-handbook/pkg-files/chapter.adoc b/documentation/content/de/books/porters-handbook/pkg-files/chapter.adoc
new file mode 100644
index 0000000000..b9d65af088
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/pkg-files/chapter.adoc
@@ -0,0 +1,136 @@
+---
+title: Kapitel 8. Die pkg-* Dateien
+prev: books/porters-handbook/plist
+next: books/porters-handbook/testing
+---
+
+[[pkg-files]]
+= Die [.filename]#pkg-*# Dateien
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 8
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+[[porting-message]]
+== [.filename]#pkg-message#
+
+Wenn Sie dem Anwender bei der Installation weitere Informationen anzeigen wollen, so können Sie diese Nachricht in [.filename]#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`. [.filename]#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 [.filename]#shells/bash2/Makefile# zu finden:
+
+[.programlisting]
+....
+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
+....
+
+[NOTE]
+====
+Die [.filename]#pkg-message# wird nicht zur [.filename]#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.
+====
+
+[[pkg-install]]
+== [.filename]#pkg-install#
+
+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 [.filename]#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.
+
+[NOTE]
+====
+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.`
+====
+
+[[pkg-deinstall]]
+== [.filename]#pkg-deinstall#
+
+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.`
+
+[[pkg-req]]
+== [.filename]#pkg-req#
+
+Muss Ihr Port entscheiden, ob er installiert werden soll oder nicht, können Sie ein [.filename]#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.
+
+[[pkg-names]]
+== Ändern der Namen der [.filename]#pkg-*# Dateien
+
+Alle Namen der [.filename]#pkg-*# Dateien werden durch Variablen festgelegt. Sie können sie bei Bedarf also im [.filename]#Makefile# des Ports ändern. Das ist besonders nützlich, wenn Sie die gleichen [.filename]#pkg-*# Dateien in mehreren Ports nutzen oder in eine der oben genannten Dateien schreiben wollen. Schreiben Sie niemals außerhalb des Unterverzeichnisses `WRKDIR`[.filename]#pkg-*#, eine Erklärung hierzu finden Sie in <<porting-wrkdir, Schreiben ausserhalb von `WRKDIR`>>.
+
+Hier ist eine Liste von Variablennamen und ihren Standardwerten (`PKGDIR` ist standardmäßig `${MASTERDIR}`).
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| 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 [.filename]#/var/db/pkg# installiert.
+
+[[using-sub-files]]
+== Nutzung von `SUB_FILES` und `SUB_LIST`
+
+Die Variablen `SUB_FILES` und `SUB_LIST` sind nützlich, um dynamische Werte in Port-Dateien zu verwenden, wie beispielsweise der Installations-`PREFIX` in [.filename]#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 [.filename]#pkg-message#, [.filename]#pkg-install#, [.filename]#pkg-deinstall# und [.filename]#pkg-req# werden die jeweiligen Makefile-Variablen selbsttätig auf die geänderte Version der Datei gesetzt.
+
+Die Variable `SUB_LIST` ist eine Liste von `VAR=WERT`-Paaren. Jedes Paar `%%VAR%%` in den Dateien von `SUB_FILES` wird mit `WERT` ersetzt. Einige gebräuchliche Paare werden automatisch definiert: `PREFIX`, `LOCALBASE`, `DATADIR`, `DOCSDIR`, `EXAMPLESDIR`. Jede Zeile, die mit `@comment` beginnt, wird nach der Variablen-Ersetzung aus der neu erstellten Datei gelöscht.
+
+Im folgenden Beispiel wird `%%ARCH%%` mit der Systemarchitektur in [.filename]#pkg-message# ersetzt:
+
+[.programlisting]
+....
+SUB_FILES= pkg-message
+SUB_LIST= ARCH=${ARCH}
+....
+
+Beachten Sie bitte, dass in diesem Beispiel die Datei [.filename]#pkg-message.in# im Verzeichnis `FILESDIR` vorhanden sein muss.
+
+Hier ein Beispiel für eine gute [.filename]#pkg-message.in#:
+
+[.programlisting]
+....
+Now it is time to configure this package.
+Copy %%PREFIX%%/shared/examples/putsy/%%ARCH%%.conf into your home directory
+as .putsy.conf and edit it.
+....
diff --git a/documentation/content/de/books/porters-handbook/plist/chapter.adoc b/documentation/content/de/books/porters-handbook/plist/chapter.adoc
new file mode 100644
index 0000000000..2950b354ff
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/plist/chapter.adoc
@@ -0,0 +1,209 @@
+---
+title: Kapitel 7. Fortgeschrittene pkg-plist-Methoden
+prev: books/porters-handbook/special
+next: books/porters-handbook/pkg-files
+---
+
+[[plist]]
+= Fortgeschrittene [.filename]#pkg-plist#-Methoden
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 7
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+[[plist-sub]]
+== Änderungen an pkg-plist 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 [.filename]#pkg-plist# verändern. Um dies zu vereinfachen, werden für jeden Eintrag in [.filename]#pkg-plist# die Variablen `%%OSREL%%`, `%%PERL_VER%%` und `%%PERL_VERSION%%` durch die jeweiligen Werte ersetzt. Der Wert von `%%OSREL%%` ist die Revisionsnummer des Betriebssystems (z.B. `4.9`). `%%PERL_VERSION%%` und `%%PERL_VER%%` geben die vollständige Versionsnummer von `perl` (z.B. `5.8.9`) an. Weitere, die Dokumentationsdateien des Ports betreffende `%%VARS%%`, werden im <<install-documentation,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 [.filename]#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
+
+[.programlisting]
+....
+OCTAVE_VERSION= 2.0.13
+PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
+....
+
+in das [.filename]#Makefile# schreiben und `%%OCTAVE_VERSION%%` verwenden, unabhängig davon, wo die Variable in [.filename]#pkg-plist# verwendet wird. In diesem Fall müssen Sie bei einem Upgrade des Ports nicht dutzende (oder manchmal sogar hunderte) Zeilen in [.filename]#pkg-plist# anpassen.
+
+Falls Ihr Port in Abhängigkeit von den ausgewählten Optionen Dateien installiert, ist es üblich, den entsprechenden Zeilen in der [.filename]#pkg-plist# eine Zeichenfolge `%%TAG%%` voranzustellen, wobei der Platzhalter `TAG` der Variablen `PLIST_SUB` im [.filename]#Makefile# bei gleichzeitiger Zuweisung des speziellen Werts `@comment` hinzugefügt wird, der die Paket-Werkzeuge die Zeile ignorieren lässt:
+
+[.programlisting]
+....
+.if defined(WITH_X11)
+PLIST_SUB+= X11=""
+.else
+PLIST_SUB+= X11="@comment "
+.endif
+....
+
+und in der [.filename]#pkg-plist#:
+
+[.programlisting]
+....
+%%X11%%bin/foo-gui
+....
+
+Diese Ersetzung (ebenso wie das Hinzufügen weiterer <<makefile-manpages,Manualpages>>) wird zwischen den `pre-install`- und `do-install`-Targets ausgeführt, indem aus [.filename]#PLIST# gelesen und in [.filename]#TMPPLIST# geschrieben wird (Standard: [.filename]#WRKDIR/.PLIST.mktmp#). Falls Ihr Port also [.filename]#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 [.filename]#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 [.filename]#PLIST# in [.filename]#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 [.filename]#TMPPLIST# geschrieben wird - z.B. in `pre-install` oder vorher.
+
+[[plist-cleaning]]
+== Leere Verzeichnisse
+
+[[plist-dir-cleaning]]
+=== 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.
+
+[.programlisting]
+....
+ :
+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.
+
+[.programlisting]
+....
+@dirrmtry share/doc/gimp
+....
+
+Dadurch wird es weder eine Fehlermeldung geben noch wird man:pkg_delete[1] abnormal beendet werden - auch dann nicht, wenn [.filename]#${PREFIX}/shared/doc/gimp# nicht leer ist, da andere Ports hier ebenfalls Dateien installiert haben.
+
+[[plist-dir-empty]]
+=== 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 [.filename]#pkg-plist# über der entsprechenden `@dirrm` Zeile eingetragen werden:
+
+[.programlisting]
+....
+@exec mkdir -p %D/shared/foo/templates
+....
+
+[[plist-config]]
+== Konfigurationsdateien
+
+Sollte Ihr Port Konfigurationsdateien in [.filename]#PREFIX/etc# benötigen, so sollten Sie diese _nicht_ einfach installieren und in [.filename]#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]#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 [.filename]#Makefile# des Ports als auch in der [.filename]#pkg-plist# (für die Installation aus einem Paket) sichergestellt werden.
+
+Beispiel aus einem [.filename]#Makefile#:
+
+[.programlisting]
+....
+post-install:
+ @if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \
+ ${CP} -p ${PREFIX}/etc/orbit.conf.sample ${PREFIX}/etc/orbit.conf ; \
+ fi
+....
+
+Beispiel aus einer [.filename]#pkg-plist#:
+
+[.programlisting]
+....
+@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 <<porting-message,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.
+
+[[plist-dynamic]]
+== Dynamische oder statische Paketliste
+
+Eine _statische Paketliste_ ist eine Paketliste, die in der Ports-Sammlung, entweder in Form der [.filename]#pkg-plist# (mit oder ohne der Ersetzung von Variablen) oder durch `PLIST_FILES` und `PLIST_DIRS` im [.filename]#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 [.filename]#pkg-plist#-Datei erzeugen, sodass Benutzer den Inhalt überprüfen können.
+
+[[plist-autoplist]]
+== Automatisiertes Erstellen von Paketlisten
+
+Als Erstes sollten Sie sich vergewissern, dass der Port bis auf [.filename]#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.
+
+[source,bash]
+....
+# mkdir /var/tmp/`make -V PORTNAME`
+# mtree -U -f `make -V MTREE_FILE` -d -e -p /var/tmp/`make -V PORTNAME`
+# make depends PREFIX=/var/tmp/`make -V PORTNAME`
+....
+
+Speichern Sie die Verzeichnisstruktur in einer neuen Datei.
+
+[source,bash]
+....
+# (cd /var/tmp/`make -V PORTNAME` && find -d * -type d) | sort > OLD-DIRS
+....
+
+Erstellen Sie eine leere [.filename]#pkg-plist#-Datei:
+
+[source,bash]
+....
+# :>pkg-plist
+....
+
+Wenn Ihr Port auf `PREFIX` achtet (was er machen sollte), so kann der Port nun installiert und die Paketliste erstellt werden.
+
+[source,bash]
+....
+# make install PREFIX=/var/tmp/`make -V PORTNAME`
+# (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.
+
+[source,bash]
+....
+# (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 [.filename]#Makefile# des Ports unter `MAN__n__` aufgeführt sein und nicht in der Paketliste. Konfigurationsdateien des Benutzers sollten entfernt oder als [.filename]#filename.sample# installiert werden. Die [.filename]#info/dir#-Datei sollte nicht aufgeführt sein und die zugehörigen [.filename]#install-info#-Zeilen sollten hinzugefügt werden, wie im <<makefile-info,info files>>-Abschnitt beschrieben. Alle Bibliotheken, die der Port installiert, sollten aufgelistet werden, wie es im <<porting-shlibs,Shared Libraries>>-Abschnitt festgelegt ist.
+
+Alternativ dazu können Sie das `plist`-Skript in [.filename]#/usr/ports/Tools/scripts/# verwenden, um die Paketliste automatisch zu erstellen. Das [.filename]#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:
+
+[source,bash]
+....
+# make install PREFIX=/var/tmp/`make -V PORTNAME`
+....
+
+Und lassen Sie `plist` die [.filename]#pkg-plist#-Datei erstellen:
+
+[source,bash]
+....
+# /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 [.filename]#pkg-plist#-Datei ist package:ports-mgmt/genplist[]. Wie bei jedem automatisierten Hilfswerkzeug, sollte die erzeugte [.filename]#pkg-plist#-Datei überprüft und bei Bedarf von Hand nachbearbeitet werden.
+
+Es gibt noch einige Tricks mit [.filename]#pkg-*#, die wir noch nicht erwähnt haben, die aber oft sehr praktisch sind.
diff --git a/documentation/content/de/books/porters-handbook/port-upgrading/chapter.adoc b/documentation/content/de/books/porters-handbook/port-upgrading/chapter.adoc
new file mode 100644
index 0000000000..10bc57417d
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/port-upgrading/chapter.adoc
@@ -0,0 +1,157 @@
+---
+title: Kapitel 10. Einen existierenden Port aktualisieren
+prev: books/porters-handbook/testing
+next: books/porters-handbook/security
+---
+
+[[port-upgrading]]
+= Einen existierenden Port aktualisieren
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 10
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+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 [.filename]#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 link:{handbook}#CVSUP-CONFIG[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 http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[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 <<portsmon,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 http://portsmon.FreeBSD.org/portoverview.py[Ü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 {freebsd-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. Dazu verwenden Sie man:diff[1], das bereits im Basissystem enthalten ist.
+
+Um einen brauchbaren `diff` für einen einzelne Datei zu erstellen, kopieren Sie die zu patchende Datei nach _dateiname.orig_ und speichern Ihre Änderungen in die Datei _dateiname_. Danach erzeugen Sie den Patch:
+
+[source,bash]
+....
+% /usr/bin/diff dateiname.orig dateiname > dateiname.diff
+....
+
+Soll mehr als eine Datei gepatcht werden, können Sie entweder `cvs diff` verwenden (siehe dazu <<cvs-diff>>) oder Sie kopieren den kompletten Port in ein neues Verzeichnis und speichern die Ausgabe des rekursiven man:diff[1] auf das neue und alte Portverzeichniss (wenn Ihr verändertes Portverzeichnis z.B. [.filename]#superedit# und das Original [.filename]#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 ``diff``s. 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. Stellen Sie insbesondere sicher, dass Sie das Arbeitsverzeichnis mit `make clean` aufgerät haben).
+
+Um gängige Operationen mit Korrekturdateien zu vereinfachen, können Sie [.filename]#/usr/ports/Tools/scripts/patchtool.py# benutzen. Aber lesen Sie bitte vorher [.filename]#/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. FreeBSD hat mehr als 4000 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 link:{developers-handbook}#POLICIES-MAINTAINER[ 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 link:{problem-reports}#pr-writing/[ Den Problembericht schreiben] im Artikel über Problemberichte lesen. Dieser enthält sehr viel mehr Informationen darüber, wie man nützliche Problemberichte verfasst.
+
+[IMPORTANT]
+====
+Wenn Sie Ihre Aktualisierung aufgrund von Sicherheitsbedenken oder eines schwerwiegenden Fehlers bereitstellen wollen, informieren Sie bitte das {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.
+====
+
+[NOTE]
+====
+Noch einmal: Bitte verwenden Sie man:diff[1] und nicht man:shar[1], um Aktualisierungen existierender Ports zu senden. Sie erleichtern es damit den Ports-Committern, Ihre Änderungen nachzuvollziehen.
+====
+
+Nun, da Sie all das geschafft haben, können Sie in <<keeping-up>> nachlesen, wie Sie den Port aktuell halten.
+
+[[cvs-diff]]
+== Patches mit CVS erstellen
+
+Wenn möglich, sollten Sie stets eine man:cvs[1]-Differenz einreichen. Diese sind leichter zu bearbeiten als Differenzen zwischen "neuen und alten" Verzeichnissen. Außerdem könenn Sie so einfacher feststellen, welche Änderungen Sie vorgenommen haben oder Ihren Patch modifizieren, falls dies durch Änderungen in einem anderen Bereich der Ports-Sammlung notwendig wird oder Sie vom Committer um eine Korrektur Ihres Patches gebeten werden.
+
+[source,bash]
+....
+% cd ~/my_wrkdir <.>
+% cvs -d R_CVSROOT co pdnsd <.> <.>
+% cd ~/my_wrkdir/pdnsd
+....
+
+<.> Das Verzeichnis, in dem Sie den Port bauen wollen. Dieses Arbeitsverzeichnis kann sich auch außerhalb von [.filename]#/usr/ports/# befinden.
+
+<.> R_CVSROOT steht für einen öffentlichen CVS-Server. Eine Liste aller verfügbaren Server finden Sie im link:{handbook}#cvsup/[FreeBSD Handbuch].
+
+<.> Ersetzen Sie "pdnsd" durch den Modulnamen des Ports. Dieser entspricht in der Regel dem Namen des Ports. Allerdings gibt es einige Ausnahmen von dieser Regel, insbesondere bei sprachspezifischen Ports (beispielsweise lautet der Modulname für den Port package:german/selfhtml[] de-selfhtml). Um den Namen des Moduls herauszufinden, können Sie entweder die link:https://www.FreeBSD.org/cgi/cvsweb.cgi/ports[cvsweb-Schnittstelle] verwenden oder den kompletten Pfad des Ports angeben (in unserem Beispiel wäre der komplette Pfad also [.filename]#ports/dns/pdnsd#).
+
+Danach modifizieren Sie den Port in gewohnter Weise. Falls Sie Dateien hinzufügen oder entfernen, sollten Sie dies mit `cvs` protokollieren:
+
+[source,bash]
+....
+% cvs add new_file
+% cvs remove deleted_file
+....
+
+Überprüfen Sie die Funktion Ihres Ports anhand der Checklisten in <<porting-testing>> und <<porting-portlint>>.
+
+[source,bash]
+....
+% cvs status
+% cvs update <.>
+....
+
+<.> Dadurch wird versucht, die Differenz zwischen Ihrer geänderten Version und dem aktuellen Stand im CVS zu kombinieren. Achten Sie dabei unbedingt auf die Ausgabe dieses Befehls. Vor jeder Datei wird ein Buchstabe angezeigt, der Ihnen mitteilt, was mit dieser Datei passiert ist. Eine vollständige Liste dieser Präfixe finden Sie in <<table-cvs-up>>.
+
+[[table-cvs-up]]
+.Von cvs update verwendete Präfixe
+[cols="1,1", frame="none"]
+|===
+|U
+|Die Datei wurde aktualisiert. Es traten dabei keine Probleme auf.
+
+|P
+|Die Datei wurde ohne Probleme aktualisiert (dieses Präfix wird nur verwendet, wenn Sie mit einem entfernten Repository arbeiten).
+
+|M
+|Die Datei wurde modifiziert. Es traten keine Konflikte auf.
+
+|C
+|Die Datei wurde modifiziert, allerdings kam es dabei zu Konflikten zwischen Ihrer geänderten Version und der aktuellen Version im CVS.
+|===
+
+Wird das Präfix `C` nach einem `cvs update` angezeigt, bedeutet dies, dass im CVS etwas geändert wurde und man:cvs[1] daher nicht in der Lage war, Ihre Änderungen und die Änderungen im CVS zu kombinieren. Es ist immer sinnvoll, sich die Änderungen anzusehen, da `cvs` keine Informationen darüber hat, wie ein Port aufgebaut sein soll. Es kann (und wird wahrscheinlich) daher vorkommen, dass sich manchmal Änderungen ergeben, die keinen Sinn machen.
+
+Im letzten Schritt erzeugen Sie einen "unified man:diff[1]" gegen die derzeit im CVS vorhandenen Dateien:
+
+[source,bash]
+....
+% cvs diff -uN > ../`basename ${PWD}`.diff
+....
+
+[NOTE]
+====
+Verwenden Sie unbedingt die Option `-N`, um sicherzustellen, dass von hinzugefügte oder gelöschte Dateien im Patch erfasst sind. Der Patch enthät auch von Ihnen gelöschte Dateien (allerdings ohne Inhalt). Dies ist wichtig, da nur so der Committer wissen kann, welche Dateien er entfernen muss.
+====
+
+Zuletzt reichen Sie Ihren Patch ein, indem Sie der Anleitung in <<port-upgrading>> folgen.
+
+[[moved-and-updating-files]]
+== Die Dateien UPDATING und MOVED
+
+Wenn die Aktualisierung des Ports spezielle Schritte wie die Anpassung von Konfigurationsdateien oder die Ausführung eines speziellen Programms erfordert, sollten Sie diesen Umstand in der Datei [.filename]#/usr/ports/UPDATING# dokumentieren. Einträge in dieser Datei haben das folgende Format:
+
+[.programlisting]
+....
+YYYYMMDD:
+ AFFECTS: users of portcategory/portname
+ AUTHOR: Your name <Your email address>
+
+ Special instructions
+....
+
+Wenn Sie exakte Portmaster oder Portupgrade-Meldungen einfügen wollen, stellen Sie bitte sicher, dass alle Sonderzeichen korrekt dargestellt werden.
+
+Wurde der Port gelöscht oder umbenannt, sollten Sie dies in der Datei [.filename]#/usr/ports/MOVED# vermerken. Einträge in dieser Datei haben das folgende Format:
+
+[.programlisting]
+....
+old name|new name (blank for deleted)|date of move|reason
+....
diff --git a/documentation/content/de/books/porters-handbook/porting-dads/chapter.adoc b/documentation/content/de/books/porters-handbook/porting-dads/chapter.adoc
new file mode 100644
index 0000000000..8d114ed5be
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/porting-dads/chapter.adoc
@@ -0,0 +1,2762 @@
+---
+title: Kapitel 12. Was man machen respektive vermeiden sollte
+prev: books/porters-handbook/security
+next: books/porters-handbook/porting-samplem
+---
+
+[[porting-dads]]
+= Was man machen respektive vermeiden sollte
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 12
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+[[dads-intro]]
+== 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 http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[PR Datenbank], welche andere Menschen eingereicht haben, kontrollieren. Senden Sie bitte Kommentare zu Ports, die Sie verifizieren wie unter link:{contributing}#CONTRIB-GENERAL[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.
+
+[[porting-wrkdir]]
+== `WRKDIR`
+
+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 link:{handbook}#PORTS-CD[ Ports Installieren von CDROM] für ein Beispiel, um Ports in einem schreibgeschützen Zweig zu erstellen). Wenn Sie eine der [.filename]##pkg-*## Dateien modifizieren müssen, sollten Sie <<porting-pkgfiles,eine Variable erneut definieren>>, anstatt die Datei zu überschreiben.
+
+[[porting-wrkdirprefix]]
+== `WRKDIRPREFIX`
+
+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 [.filename]#WRKDIRPREFIXPORTSDIR/subdir/name/work#, und nicht etwa [.filename]#PORTSDIR/subdir/name/work#, [.filename]#.CURDIR/../../subdir/name/work# oder ähnliches ist.
+
+Falls Sie `WRKDIR` selbst definieren, sollten Sie sicherstellen, dass Sie `${WRKDIRPREFIX}${.CURDIR}` am Anfang anfügen.
+
+[[porting-versions]]
+== 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 http://cvsweb.freebsd.org/src/sys/sys/param.h[sys/param.h] definiert ist. Hoffentlich ist diese Datei schon enthalten - falls nicht, so fügen Sie folgenden Quelltext:
+
+[.programlisting]
+....
+#if (defined(__unix__) || defined(unix)) && !defined(USG)
+#include <sys/param.h>
+#endif
+....
+
+an der richtigen Stelle in der [.filename]#.c# Datei hinzu. Wir glauben, dass jedes System, welches diese beiden Symbole definiert, die Datei [.filename]#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 {freebsd-ports}.
+
+Eine andere Möglichkeit zur Unterscheidung ist der GNU Autoconf-Stil:
+
+[.programlisting]
+....
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+....
+
+Vergessen Sie nicht `-DHAVE_SYS_PARAM_H` zu den `CFLAGS` im [.filename]#Makefile# hinzuzufügen, falls Sie diese Methode benutzen sollten.
+
+Sobald Sie [.filename]#sys/param.h# hinzugefügt haben, können Sie mit Hilfe von
+
+[.programlisting]
+....
+#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:
+
+[.programlisting]
+....
+#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:
++
+[.programlisting]
+....
+#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-versions]]
+== __FreeBSD_version Werte
+
+Hier ist eine praktische Liste von `__FreeBSD_version`-Werten wie in http://cvsweb.freebsd.org/src/sys/sys/param.h[sys/param.h] definiert:
+
+.__FreeBSD_version-Werte
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Wert
+| Datum
+| Release
+
+|119411
+|
+|2.0-RELEASE
+
+|199501, 199503
+|19. März 1995
+|2.1-CURRENT
+
+|199504
+|9. April 1995
+|2.0.5-RELEASE
+
+|199508
+|26. August 1995
+|2.2-CURRENT vor 2.1
+
+|199511
+|10. November 1995
+|2.1.0-RELEASE
+
+|199512
+|10. November 1995
+|2.2-CURRENT vor 2.1.5
+
+|199607
+|10. Juli 1996
+|2.1.5-RELEASE
+
+|199608
+|12. Juli 1996
+|2.2-CURRENT vor 2.1.6
+
+|199612
+|15. November 1996
+|2.1.6-RELEASE
+
+|199612
+|
+|2.1.7-RELEASE
+
+|220000
+|19. Februar 1997
+|2.2-RELEASE
+
+|(nicht geändert)
+|
+|2.2.1-RELEASE
+
+|(nicht geändert)
+|
+|2.2-STABLE nach 2.2.1-RELEASE
+
+|221001
+|15. April 1997
+|2.2-STABLE nach texinfo-3.9
+
+|221002
+|30. April 1997
+|2.2-STABLE nach top
+
+|222000
+|16. Mai 1997
+|2.2.2-RELEASE
+
+|222001
+|19. Mai 1997
+|2.2-STABLE nach 2.2.2-RELEASE
+
+|225000
+|2. Oktober 1997
+|2.2.5-RELEASE
+
+|225001
+|20. November 1997
+|2.2-STABLE nach 2.2.5-RELEASE
+
+|225002
+|27. Dezember 1997
+|2.2-STABLE nach der Aufnahme von ldconfig -R
+
+|226000
+|24. März 1998
+|2.2.6-RELEASE
+
+|227000
+|21. Juli 1998
+|2.2.7-RELEASE
+
+|227001
+|21. Juli 1998
+|2.2-STABLE nach 2.2.7-RELEASE
+
+|227002
+|19. September 1998
+|2.2-STABLE nach man:semctl[2] Änderung
+
+|228000
+|29. November 1998
+|2.2.8-RELEASE
+
+|228001
+|29. November 1998
+|2.2-STABLE nach 2.2.8-RELEASE
+
+|300000
+|19. Februar 1996
+|3.0-CURRENT vor man:mount[2] Änderung
+
+|300001
+|24. September 1997
+|3.0-CURRENT nach man:mount[2] Änderung
+
+|300002
+|2. Juni 1998
+|3.0-CURRENT nach man:semctl[2] Änderung
+
+|300003
+|7. Juni 1998
+|3.0-CURRENT nach ioctl arg Änderungen
+
+|300004
+|3. September 1998
+|3.0-CURRENT nach ELF-Konvertierung
+
+|300005
+|16. Oktober 1998
+|3.0-RELEASE
+
+|300006
+|16. Oktober 1998
+|3.0-CURRENT nach 3.0-RELEASE
+
+|300007
+|22. Januar 1999
+|3.0-STABLE nach 3/4 Zweig
+
+|310000
+|9. Februar 1999
+|3.1-RELEASE
+
+|310001
+|27. März 1999
+|3.1-STABLE nach 3.1-RELEASE
+
+|310002
+|14. April 1999
+|3.1-STABLE nach Änderung der C++ Konstruktor/Destruktor-Reihenfolge
+
+|320000
+|
+|3.2-RELEASE
+
+|320001
+|8. Mai 1999
+|3.2-STABLE
+
+|320002
+|29. August 1999
+|3.2-STABLE nach binär-inkompatibler IPFW und Socket-Änderungen
+
+|330000
+|2. September 1999
+|3.3-RELEASE
+
+|330001
+|16. September 1999
+|3.3-STABLE
+
+|330002
+|24. November 1999
+|3.3-STABLE nach Hinzufügen von man:mkstemp[3] zur libc
+
+|340000
+|5. Dezember 1999
+|3.4-RELEASE
+
+|340001
+|17. Dezember 1999
+|3.4-STABLE
+
+|350000
+|20. Juni 2000
+|3.5-RELEASE
+
+|350001
+|12. Juli 2000
+|3.5-STABLE
+
+|400000
+|22. Januar 1999
+|4.0-CURRENT nach 3.4 Zweig
+
+|400001
+|20. Februar 1999
+|4.0-CURRENT nach der Änderung im Verhalten des dynamischen Linkers.
+
+|400002
+|13. März 1999
+|4.0-CURRENT nach Änderung der C++ Konstruktor/Destruktor Reihenfolge.
+
+|400003
+|27. März 1999
+|4.0-CURRENT nach funktionierendem man:dladdr[3].
+
+|400004
+|5. April 1999
+|4.0-CURRENT nach der __deregister_frame_info Fehlerbehebung für den dynamischen Linker (auch 4.0-CURRENT nach EGCS 1.1.2 Integration).
+
+|400005
+|27. April 1999
+|4.0-CURRENT nach man:suser[9] API Änderung (auch 4.0-CURRENT nach newbus).
+
+|400006
+|31. Mai 1999
+|4.0-CURRENT nach Änderung der cdevsw-Registrierung.
+
+|400007
+|17. Juni 1999
+|4.0-CURRENT nach Hinzufügen von so_cred für Zugangsberechtigungen auf Socket-Ebene.
+
+|400008
+|20. Juni 1999
+|4.0-CURRENT nach Hinzufügen eines poll Syscall-Wrappers zur libc_r.
+
+|400009
+|20. Juli 1999
+|4.0-CURRENT nach der Änderung des Kernel `dev_t`-Typs zum `struct specinfo`-Zeiger.
+
+|400010
+|25. September 1999
+|4.0-CURRENT nach dem Beseitigen eines Fehlers in man:jail[2].
+
+|400011
+|29. September 1999
+|4.0-CURRENT nach der `sigset_t` Datentyp Änderung.
+
+|400012
+|15. November 1999
+|4.0-CURRENT nach dem Wechsel zum GCC 2.95.2-Compiler.
+
+|400013
+|4. Dezember 1999
+|4.0-CURRENT nach Hinzufügen der erweiterbaren Linux Mode ioctl-Routinen.
+
+|400014
+|18. Januar 2000
+|4.0-CURRENT nach dem OpenSSL-Import.
+
+|400015
+|27. Januar 2000
+|4.0-CURRENT nach der C++ ABI Änderung in GCC 2.95.2 von -fvtable-thunks zu -fno-vtable-thunks als Standard.
+
+|400016
+|27. Februar 2000
+|4.0-CURRENT nach OpenSSH-Import.
+
+|400017
+|13. März 2000
+|4.0-RELEASE
+
+|400018
+|17. März 2000
+|4.0-STABLE nach 4.0-RELEASE
+
+|400019
+|5. Mai 2000
+|4.0-STABLE nach der Einführung von verzögerten Prüfsummen.
+
+|400020
+|4. Juni 2000
+|4.0-STABLE nach dem Einpflegen des libxpg4-Quelltextes in die libc.
+
+|400021
+|8. Juli 2000
+|4.0-STABLE nach der Aktualisierung von Binutils auf 2.10.0, Änderungen der binären ELF-Markierungen, Aufnahme von tcsh ins Basissystem.
+
+|410000
+|14. Juli 2000
+|4.1-RELEASE
+
+|410001
+|29. Juli 2000
+|4.1-STABLE nach 4.1-RELEASE
+
+|410002
+|16. September 2000
+|4.1-STABLE nachdem man:setproctitle[3] von der libutil in die libc verschoben wurde.
+
+|411000
+|25. September 2000
+|4.1.1-RELEASE
+
+|411001
+|
+|4.1.1-STABLE nach 4.1.1-RELEASE
+
+|420000
+|31. Oktober 2000
+|4.2-RELEASE
+
+|420001
+|10. Januar 2001
+|4.2-STABLE nach Kombinaion von libgcc.a und libgcc_r.a und zugehörigen Änderungen der GCC-Bindungen.
+
+|430000
+|6. März 2001
+|4.3-RELEASE
+
+|430001
+|18. Mai 2001
+|4.3-STABLE nach der Einführung von wint_t.
+
+|430002
+|22. Juli 2001
+|4.3-STABLE nach dem Einpflegen der PCI Stromstatus-API.
+
+|440000
+|1. August 2001
+|4.4-RELEASE
+
+|440001
+|23. Oktober 2001
+|4.4-STABLE nach der Einführung von d_thread_t.
+
+|440002
+|4. November 2001
+|4.4-STABLE nach den Änderungen der mount-Struktur (betrifft Dateisystem-Kernelmodule).
+
+|440003
+|18. Dezember 2001
+|4.4-STABLE nachdem die Userland-Komponenten von smbfs importiert worden sind.
+
+|450000
+|20. Dezember 2001
+|4.5-RELEASE
+
+|450001
+|24. Februar 2002
+|4.5-STABLE nach der Umbenennung von Elementen der USB-Struktur.
+
+|450004
+|16. April 2002
+|4.5-STABLE nachdem die `sendmail_enable` man:rc.conf[5] Variable geändert worden ist, um den Wert `NONE` zu akzeptieren.
+
+|450005
+|27. April 2002
+|4.5-STABLE nachdem XFree86 4 als Standard zum Bauen der Pakete benutzt wird.
+
+|450006
+|1. Mai 2002
+|4.5-STABLE nach dem Reparieren des Empfangsfilters, welcher anfällig für einfache DoS-Attacken war.
+
+|460000
+|21. Juni 2002
+|4.6-RELEASE
+
+|460001
+|21. Juni 2002
+|4.6-STABLE man:sendfile[2] repariert, um mit der Dokumentation übereinzustimmen, und nicht mehr die Anzahl der gesendeten Header mit der Anzahl der Daten, welche aus der Datei geschickt werden, gegenzurechnen.
+
+|460002
+|19. Juli 2002
+|4.6.2-RELEASE
+
+|460100
+|26. Juni 2002
+|4.6-STABLE
+
+|460101
+|26. Juni 2002
+|4.6-STABLE nach dem Einfließen von `sed -i` aus CURRENT.
+
+|460102
+|1. September 2002
+|4.6-STABLE nach dem Einfließen von vielen neuen pkg_install-Funktionen aus HEAD (HEAD = die aktuellste und letzte Version des Quellverzeichnisbaumes).
+
+|470000
+|8. Oktober 2002
+|4.7-RELEASE
+
+|470100
+|9. Oktober 2002
+|4.7-STABLE
+
+|470101
+|10. November 2002
+|Beginn von generierten __std{in,out,err}p Referenzen statt __sF. Dies ändert std{in,out,err} von einem Ausdruck während des Kompilierens zu einem Laufzeitausdruck.
+
+|470102
+|23. Januar 2003
+|4.7-STABLE nach dem Einfliessen von mbuf-Änderungen, um m_aux mbufs mit denen von m_tag zu ersetzen
+
+|470103
+|14. Februar 2003
+|4.7-STABLE erhält OpenSSL 0.9.7
+
+|480000
+|30. März 2003
+|4.8-RELEASE
+
+|480100
+|5. April 2003
+|4.8-STABLE
+
+|480101
+|22. Mai 2003
+|4.8-STABLE nachdem man:realpath[3] Thread-sicher gemacht wurde.
+
+|480102
+|10. August 2003
+|4.8-STABLE Änderung der 3ware-API in twe.
+
+|490000
+|27. Oktober 2003
+|4.9-RELEASE
+
+|490100
+|27. Oktober 2003
+|4.9-STABLE
+
+|490101
+|8. Januar 2004
+|4.9-STABLE nachdem e_sid zu der Struktur kinfo_eproc hinzugefügt wurde.
+
+|490102
+|4. Februar 2004
+|4.9-STABLE nach dem Einfliessen der libmap-Funktionalität für rtld.
+
+|491000
+|25. Mai 2004
+|4.10-RELEASE
+
+|491100
+|1. Juni 2004
+|4.10-STABLE
+
+|491101
+|11. August 2004
+|4.10-STABLE nach dem Einfliessen von Revision 20040629 der Paket-Werkzeuge aus CURRENT.
+
+|491102
+|16. November 2004
+|4.10-STABLE nach der Fehlerbehebung in der VM, um das Freigeben von fiktiven Speicherseiten korrekt zu handhaben.
+
+|492000
+|17. Dezember 2004
+|4.11-RELEASE
+
+|492100
+|17. Dezember 2004
+|4.11-STABLE
+
+|492101
+|18. April 2006
+|4.11-STABLE nach dem Hinzufügen von libdata/ldconfig Verzeichnissen zu den mtree-Dateien.
+
+|500000
+|13. März 2000
+|5.0-CURRENT
+
+|500001
+|18. April 2000
+|5.0-CURRENT nach Hinzufügen von zusätzlichen Feldern in den ELF-Headern und Ändern der Methode zur ELF-Markierung von Binärdateien.
+
+|500002
+|2. Mai 2000
+|5.0-CURRENT nach kld-Metadaten Änderungen.
+
+|500003
+|18. Mai 2000
+|5.0-CURRENT nach buf/bio Änderungen.
+
+|500004
+|26. Mai 2000
+|5.0-CURRENT nach binutils Aktualisierung.
+
+|500005
+|3. Juni 2000
+|5.0-CURRENT nach dem Einfliessen des libxpg4 Quelltextes in die libc und der Einführung der TASKQ-Schnittstelle.
+
+|500006
+|10. Juni 2000
+|5.0-CURRENT nach dem Hinzufügen der AGP-Schnittstellen.
+
+|500007
+|29. Juni 2000
+|5.0-CURRENT nach der Aktualisierung von Perl auf Version 5.6.0.
+
+|500008
+|7. Juli 2000
+|5.0-CURRENT nach der Aktualisierung des KAME-Quelltextes zu den 2000/07-Quellen.
+
+|500009
+|14. Juli 2000
+|5.0-CURRENT nach ether_ifattach() und ether_ifdetach() Änderungen.
+
+|500010
+|16. Juli 2000
+|5.0-CURRENT nachdem die mtree-Standards zurück zur ursprünglichen Variante geändert wurden; -L hinzugefügt, um Symlinks zu folgen.
+
+|500011
+|18. Juli 2000
+|5.0-CURRENT nachdem die kqueue-API geändert worden ist.
+
+|500012
+|2. September 2000
+|5.0-CURRENT nachdem man:setproctitle[3] von libutil nach libc verschoben worden ist.
+
+|500013
+|10. September 2000
+|5.0-CURRENT nach dem ersten SMPng-Commit.
+
+|500014
+|4. Januar 2001
+|5.0-CURRENT nachdem <sys/select.h> nach <sys/selinfo.h> verschoben worden ist.
+
+|500015
+|10. Januar 2001
+|5.0-CURRENT nach dem Kombinieren von libgcc.a und libgcc_r.a und damit verbundene Änderungen an GCC-Bindungen.
+
+|500016
+|24. Januar 2001
+|5.0-CURRENT nach der Änderung das Zusammenbinden von libc und libc_r zu erlauben, womit die -pthread Option veraltet ist.
+
+|500017
+|18. Februar 2001
+|5.0-CURRENT nach dem Umschalten von struct ucred zu struct xucred, um die vom Kernel exportierte API für mount u.a.zu stabilisieren.
+
+|500018
+|24. Februar 2001
+|5.0-CURRENT nach dem Hinzufügen der CPUTYPE make Variable zum Kontrollieren von CPU-spezifischen Optimierungen.
+
+|500019
+|9. Juni 2001
+|5.0-CURRENT nach dem Verschieben von machine/ioctl_fd.h nach sys/fdcio.h
+
+|500020
+|15. Juni 2001
+|5.0-CURRENT nach der Umbenennung der locale-Namen.
+
+|500021
+|22. Juni 2001
+|5.0-CURRENT nach dem Bzip2-Import. Kennzeichnet auch, dass S/Key entfernt wurde.
+
+|500022
+|12. Juli 2001
+|5.0-CURRENT nach SSE Unterstützung.
+
+|500023
+|14. September 2001
+|5.0-CURRENT nach KSE-Meilenstein 2.
+
+|500024
+|1. Oktober 2001
+|5.0-CURRENT nach d_thread_t, und nachdem UUCP in die Ports verschoben worden ist.
+
+|500025
+|4. Oktober 2001
+|5.0-CURRENT nach Änderungen in der ABI bei der Weitergabe von Deskriptoren und Berechtigungen auf 64 Bit Plattformen.
+
+|500026
+|9. Oktober 2001
+|5.0-CURRENT nachdem XFree86 4 als Standard zum Erstellen der Pakete benutzt wird und die neue libc strnstr()-Funktion hinzugefügt wurde.
+
+|500027
+|10. Oktober 2001
+|5.0-CURRENT nachdem die neue libc strcasestr()-Funktion hinzugefügt wurde.
+
+|500028
+|14. Dezember 2001
+|5.0-CURRENT nachdem die Userland-Komponenten von smbfs importiert wurden.
+
+|(nicht geändert)
+|
+|5.0-CURRENT nachdem die neuen C99-Ganzzahlen mit spezifischer Breite hinzugefügt wurden.
+
+|500029
+|29. Januar 2002
+|5.0-CURRENT nachdem eine Änderung im Rückgabewert von man:sendfile[2] gemacht wurde.
+
+|500030
+|15. Februar 2002
+|5.0-CURRENT nach der Einführung des Types `fflags_t`, welches die passende Größe für Dateiflags hat.
+
+|500031
+|24. Februar 2002
+|5.0-CURRENT nach der Umbenennung der USB elements-Struktur.
+
+|500032
+|16. März 2002
+|5.0-CURRENT nach der Einführung von Perl 5.6.1.
+
+|500033
+|3. April 2002
+|5.0-CURRENT nachdem die `sendmail_enable` man:rc.conf[5] Variable geändert worden ist, um den Wert `NONE` zu akzeptieren.
+
+|500034
+|30. April 2002
+|5.0-CURRENT nachdem mtx_init() einen dritten Parameter entgegen nimmt.
+
+|500035
+|13. Mai 2002
+|5.0-CURRENT mit GCC 3.1.
+
+|500036
+|17. Mai 2002
+|5.0-CURRENT ohne Perl in /usr/src
+
+|500037
+|29. Mai 2002
+|5.0-CURRENT nach dem Hinzufügen von man:dlfunc[3]
+
+|500038
+|24. Juli 2002
+|5.0-CURRENT nachdem die Typen von einigen Elementen der sockbuf-Struktur geändert wurden und nachdem die Struktur neu geordnet wurde.
+
+|500039
+|1. September 2002
+|5.0-CURRENT nach dem GCC 3.2.1 Import. Und auch nachdem die Header nicht mehr _BSD_FOO_T_ sondern _FOO_T_DECLARED benutzen. Dieser Wert kann auch als konservative Schätzung für den Beginn der Unterstützung des man:bzip2[1] Pakets verwendet werden.
+
+|500040
+|20. September 2002
+|5.0-CURRENT nachdem verschiedene Änderungen an Plattenfunktionen gemacht wurden, um die Anhängigkeit von Interna der disklabel-Struktur zu entfernen.
+
+|500041
+|1. Oktober 2002
+|5.0-CURRENT nach dem Hinzufügen von man:getopt_long[3] zur libc.
+
+|500042
+|15. Oktober 2002
+|5.0-CURRENT nach der Aktualisierung von Binutils auf 2.13, bei denen die FreeBSD-Emulation, vec und das Ausgabeformat geändert wurden.
+
+|500043
+|1. November 2002
+|5.0-CURRENT nach dem Hinzufügen schwacher pthread_XXX Stubs zur libc, womit libXThrStub.so veraltet ist. 5.0-RELEASE.
+
+|500100
+|17. Januar 2003
+|5.0-CURRENT nach dem Erstellen des RELENG_5_0-Zweiges
+
+|500101
+|19. Februar 2003
+|<sys/dkstat.h> ist leer und sollte nicht inkludiert werden.
+
+|500102
+|25. Februar 2003
+|5.0-CURRENT nach der Änderung in der d_mmap_t-Schnittstelle.
+
+|500103
+|26. Februar 2003
+|5.0-CURRENT nachdem taskqueue_swi geädert wurde, um ohne Giant zu arbeiten, und taskqueue_swi_giant hinzugefügt wurde, um Giant zu verwenden.
+
+|500104
+|27. Februar 2003
+|cdevsw_add() und cdevsw_remove() gibt es nicht länger. Auftauchen der MAJOR_AUTO-Allokationsmöglichkeit.
+
+|500105
+|4. März 2003
+|5.0-CURRENT nach der neuen cdevsw-Initialisierungsmethode.
+
+|500106
+|8. März 2003
+|devstat_add_entry() wurde durch devstat_new_entry() ersetzt.
+
+|500107
+|15. März 2003
+|Devstat Schnittstellenänderung; siehe sys/sys/param.h 1.149.
+
+|500108
+|15. März 2003
+|Token-Ring Schnittstellenänderungen.
+
+|500109
+|25. März 2003
+|Hinzufügen von vm_paddr_t.
+
+|500110
+|28. März 2003
+|5.0-CURRENT nachdem man:realpath[3] Thread-sicher gemacht wurde.
+
+|500111
+|9. April 2003
+|5.0-CURRENT nachdem man:usbhid[3] mit NetBSD synchronisiert wurde.
+
+|500112
+|17. April 2003
+|5.0-CURRENT nach der neuen NSS Implementierung und Hinzufügen der POSIX.1 getpw*_r, getgr*_r Funktionen.
+
+|500113
+|2. Mai 2003
+|5.0-CURRENT nach Entfernen des alten rc-Systems.
+
+|501000
+|4. Juni 2003
+|5.1-RELEASE.
+
+|501100
+|2. Juni 2003
+|5.1-CURRENT nach dem Erstellen des RELENG_5_1 Zweiges.
+
+|501101
+|29. Juni 2003
+|5.1-CURRENT nachdem die Semantik von sigtimedwait(2) and sigwaitinfo(2) korrigiert wurden.
+
+|501102
+|3. Juli 2003
+|5.1-CURRENT nach dem Hinzufügen der lockfunc und lockfuncarg-Felder zu man:bus_dma_tag_create[9].
+
+|501103
+|31. Juli 2003
+|5.1-CURRENT nach der Integration des GCC 3.3.1-pre 20030711 Snapshots.
+
+|501104
+|5. August 2003
+|5.1-CURRENT 3ware-API Änderungen in twe.
+
+|501105
+|17. August 2003
+|5.1-CURRENT Unterstützung von dynamisch gebundenen /bin und /sbin und Verschieben von Bibliotheken nach /lib.
+
+|501106
+|8. September 2003
+|5.1-CURRENT nachdem im Kernel Unterstützung für Coda 6.x hinzugefügt wurden.
+
+|501107
+|17. September 2003
+|5.1-CURRENT nachdem die 16550 UART-Konstanten von [.filename]#<dev/sio/sioreg.h># nach [.filename]#<dev/ic/ns16550.h># verschoben wurden. Und nachdem die libmap Funktionalität vorbehaltlos vom rtld unterstützt wurde.
+
+|501108
+|23. September 2003
+|5.1-CURRENT nach Aktualisierung der PFIL_HOOKS API.
+
+|501109
+|27. September 2003
+|5.1-CURRENT nachdem kiconv(3) hinzugefügt wurde.
+
+|501110
+|28. September 2003
+|5.1-CURRENT nachdem der standardmäßige Ablauf von open und close in cdevsw geändert wurde.
+
+|501111
+|16. Oktober 2003
+|5.1-CURRENT nachdem das Layout von cdevsw geändert wurde.
+
+|501112
+|16. Oktober 2003
+|5.1-CURRENT nach dem Hinzufügen von Mehrfachvererbung in kobj.
+
+|501113
+|31. Oktober 2003
+|5.1-CURRENT nach der if_xname Änderung in der Struktur ifnet
+
+|501114
+|16. November 2003
+|5.1-CURRENT nachdem /bin und /sbin geändert wurden, um sie dynamisch zu binden.
+
+|502000
+|7. Dezember 2003
+|5.2-RELEASE
+
+|502010
+|23. Februar 2004
+|5.2.1-RELEASE
+
+|502100
+|7. Dezember 2003
+|5.2-CURRENT nach dem Erstellen des RELENG_5_2-Zweiges.
+
+|502101
+|19. Dezember 2003
+|5.2-CURRENT nachdem die __cxa_atexit/__cxa_finalize Funktionen zur libc hinzugefügt wurden.
+
+|502102
+|30. Januar 2004
+|5.2-CURRENT nachdem die Standard-Thread Bibliothek von libc_r zu libpthread geändert wurde.
+
+|502103
+|21. Februar 2004
+|5.2-CURRENT nach dem Gerätetreiber API Megapatch.
+
+|502104
+|25. Februar 2004
+|5.2-CURRENT nachdem getopt_long_only() hinzugefügt wurde.
+
+|502105
+|5. März 2004
+|5.2-CURRENT nachdem NULL für C in ((void *)0) geändert wurde, was mehr Warnungen erzeugt.
+
+|502106
+|8. März 2004
+|5.2-CURRENT nachdem pf beim Bauen und Installieren mit eingebunden wird.
+
+|502107
+|10. März 2004
+|5.2-CURRENT nachdem time_t auf der sparc64-Plattform in einen 64-bit Wert geändert wurde.
+
+|502108
+|12. März 2004
+|5.2-CURRENT nachdem sich die Unterstützung für den Intel C/C++-Compiler in einigen Headern und execve(2) geändert hat, um sich strikter an POSIX zu halten.
+
+|502109
+|22. März 2004
+|5.2-CURRENT nach der Einführung der bus_alloc_resource_any API
+
+|502110
+|27. März 2004
+|5.2-CURRENT nach dem Hinzufügen von UTF-8 locales
+
+|502111
+|11. April 2004
+|5.2-CURRENT nach dem Entfernen der getvfsent(3) API
+
+|502112
+|13. April 2004
+|5.2-CURRENT nach dem Hinzufügen der .warning Directive für make.
+
+|502113
+|4. Juni 2004
+|5.2-CURRENT nachdem ttyioctl() zwingend erforderlich für serielle Treiber gemacht wurde.
+
+|502114
+|13. Juni 2004
+|5.2-CURRENT nach dem Import des ALTQ-Frameworks.
+
+|502115
+|14. Juni 2004
+|5.2-CURRENT nachdem sema_timedwait(9) geändert wurde, 0 bei Erfolg und einen von 0 verschiedenen Fehlercode im Falle eines Fehlers zurückzuliefern.
+
+|502116
+|16. Juni 2004
+|5.2-CURRENT nach dem Ändern der Kernel Struktur dev_t, in ein Zeiger auf die Struktur cdev *
+
+|502117
+|17. Juni 2004
+|5.2-CURRENT nach dem Ändern der Kernelstruktur udev_t in dev_t.
+
+|502118
+|17. Juni 2004
+|5.2-CURRENT nachdem Unterstützung für CLOCK_VIRTUAL und CLOCK_PROF zu clock_gettime(2) und clock_getres(2) hinzugefügt wurde.
+
+|502119
+|22. Juni 2004
+|5.2-CURRENT nachdem die Überprüfung des Klonens von Netzwerk-Schnittstellen geändert wurde.
+
+|502120
+|2. Juli 2004
+|5.2-CURRENT nach dem Einfliessen von Revision 20040629 der Paket-Werkzeuge.
+
+|502121
+|9. Juli 2004
+|5.2-CURRENT nachdem Bluetooth-Quelltext als nicht i386-spezifisch markiert wurde.
+
+|502122
+|11. Juli 2004
+|5.2-CURRENT nach der Einführung des KDB Debugger Frameworks, der Umwandlung des DDB in ein Backend und der Einführung des GDB-Backends.
+
+|502123
+|12. Juli 2004
+|5.2-CURRENT nachdem VFS_ROOT geändert wurde, eine Struktur thread als Argument zu aktzeptieren, wie vflush. Die Struktur kinfo_proc enthält nun einen Zeiger auf Benutzer Daten. Der Umstieg auf `xorg` als standardmäßige X Implementierung wurde auch zu dieser Zeit durchgeführt.
+
+|502124
+|24. Juli 2004
+|5.2-CURRENT nachdem die Art und Weise, wie rc.d-Skripte von Ports und Altlasten gestartet werden, getrennt wurde.
+
+|502125
+|28. Juli 2004
+|5.2-CURRENT nachdem die vorherige Änderung rückgängig gemacht wurde.
+
+|502126
+|31. Juli 2004
+|5.2-CURRENT nach dem Entfernen von kmem_alloc_pageable() und dem Import von GCC 3.4.2.
+
+|502127
+|2. August 2004
+|5.2-CURRENT nachdem die UMA Kernel API geändert wurde, um Konstruktoren und Initialisierungsmethoden zu erlauben fehlzuschlagen.
+
+|502128
+|8. August 2004
+|5.2-CURRENT nach der Änderung in der vfs_mount Signatur sowie allgemeines Ersetzen von PRISON_ROOT durch SUSER_ALLOWJAIL in der suser(9) API.
+
+|503000
+|23. August 2004
+|5.3-BETA/RC vor der Änderung der pfil-API.
+
+|503001
+|22. September 2004
+|5.3-RELEASE
+
+|503100
+|16. Oktober 2004
+|5.3-STABLE nach dem Erstellen des RELENG_5_3-Zweiges.
+
+|503101
+|3. Dezember 2004
+|5.3-STABLE nach dem Hinzufügen von Fülloptionen im Stile der libc zu man:strftime[3].
+
+|503102
+|13. Februar 2005
+|5.3-STABLE nachdem OpenBSD's nc(1) von CURRENT importiert wurde.
+
+|503103
+|27. Februar 2005
+|5.4-PRERELEASE nach dem Einfliessen der Reparaturen aus CURRENT, in [.filename]#<src/include/stdbool.h># und [.filename]#<src/sys/i386/include/_types.h>#, um die GCC-Kompatibilität des Intel C/C++-Compilers zu benutzen.
+
+|503104
+|28. Februar 2005
+|5.4-PRERELEASE nach dem Einfliessen der Änderung aus CURRENT in ifi_epoch statt der lokalen Zeit die Betriebszeit des Systems zu benutzen.
+
+|503105
+|2. März 2005
+|5.4-PRERELEASE nach dem Einfliessen der Reparaturen von EOVERFLOW in vswprintf(3) aus CURRENT.
+
+|504000
+|3. April 2005
+|5.4-RELEASE.
+
+|504100
+|3. April 2005
+|5.4-STABLE nach dem Erstellen des RELENG_5_4-Zweiges.
+
+|504101
+|11. Mai 2005
+|5.4-STABLE nach dem Vergrößern der standardmäßigen Stackgröße für Threads.
+
+|504102
+|24. Juni 2005
+|5.4-STABLE nach dem Hinzufügen von sha256.
+
+|504103
+|3. Oktober 2005
+|5.4-STABLE nach dem Einfliessen von if_bridge aus CURRENT.
+
+|504104
+|13. November 2005
+|5.4-STABLE nach dem Einfliessen von bsdiff und portsnap aus CURRENT.
+
+|504105
+|17. Januar 2006
+|5.4-STABLE nach dem Einfliessen der Änderung von ldconfig_local_dirs aus CURRENT.
+
+|505000
+|12. Mai 2006
+|5.5-RELEASE.
+
+|505100
+|12. Mai 2006
+|5.5-STABLE nach dem Erstellen des RELENG_5_5-Zweiges.
+
+|600000
+|18. August 2004
+|6.0-CURRENT
+
+|600001
+|27. August 2004
+|6.0-CURRENT nach der festen Aktivierung von PFIL_HOOKS im Kernel.
+
+|600002
+|30. August 2004
+|6.0-CURRENT nach der anfänglichen Einführung von ifi_epoch zur Struktur if_data. Wurde nach ein paar Tagen wieder rückgängig gemacht. Benutzen Sie diesen Wert bitte nicht.
+
+|600003
+|8. September 2004
+|6.0-CURRENT nach dem erneuten Hinzufügen des Elements ifi_epoch zur Struktur if_data.
+
+|600004
+|29. September 2004
+|6.0-CURRENT nach dem Hinzufügen der Struktur inpcb als Argument in der pfil API.
+
+|600005
+|5. Oktober 2004
+|6.0-CURRENT nach dem Hinzufügen des "-d DESTDIR" Schalters zu newsyslog.
+
+|600006
+|4. November 2004
+|6.0-CURRENT nach dem Hinzufügen von Fülloptionen im Style der libc zu man:strftime[3].
+
+|600007
+|12. Dezember 2004
+|6.0-CURRENT nach dem Hinzufügen von 802.11 Framework Neuerungen.
+
+|600008
+|25. Januar 2005
+|6.0-CURRENT Änderung an den VOP_*VOBJECT() Funktionen und Einführung des MNTK_MPSAFE Schalters für Dateisysteme, welche ohne Giant arbeiten.
+
+|600009
+|4. Februar 2005
+|6.0-CURRENT nach dem Hinzufügen von cpufreq Framework und Treibern.
+
+|600010
+|6. Februar 2005
+|6.0-CURRENT nachdem OpenBSD's nc(1) importiert wurde.
+
+|600011
+|12. Februar 2005
+|6.0-CURRENT nachdem der Anschein von `matherr()` Unterstützung in SVID2 entfernt wurde.
+
+|600012
+|15. Februar 2005
+|6.0-CURRENT nach dem Vergrößern der standardmäßigen Stackgröße für Threads.
+
+|600013
+|19. Februar 2005
+|6.0-CURRENT nach dem Einfliessen der Reparaturen in [.filename]#<src/include/stdbool.h># und [.filename]#<src/sys/i386/include/_types.h>#, um die GCC-Kompatibilität des Intel C/C++-Compilers zu benutzen.
+
+|600014
+|21. Februar 2005
+|6.0-CURRENT nachdem die Überprüfungen auf EOVERFLOW in vswprintf(3) korrigiert wurden.
+
+|600015
+|25. Februar 2005
+|6.0-CURRENT nach dem Einfliessen der Änderung, in ifi_epoch, statt der lokalen Zeit, die Betriebzeit des Systems zu benutzen.
+
+|600016
+|26. Februar 2005
+|6.0-CURRENT nachdem das Format von LC_CTYPE auf der Festplatte verändert wurde.
+
+|600017
+|27. Februar 2005
+|6.0-CURRENT nachdem das Format der NLS-Kataloge auf der Festplatte verändert wurde.
+
+|600018
+|27. Februar 2005
+|6.0-CURRENT nachdem das Format von LC_COLLATE auf der Festplatte verändert wurde.
+
+|600019
+|28. Februar 2005
+|Installation der acpica Include-Dateien in /usr/include.
+
+|600020
+|9. März 2005
+|Hinzufügen des MSG_NOSIGNAL Schalters zur send(2) API.
+
+|600021
+|17. März 2005
+|Hinzufügen von Feldern zu cdevsw
+
+|600022
+|21. März 2005
+|gtar wurde aus dem Basissystem entfernt.
+
+|600023
+|13. April 2005
+|Die Optionen LOCAL_CREDS, LOCAL_CONNWAIT für Sockets wurde zu unix(4) hinzugefügt.
+
+|600024
+|19. April 2005
+|man:hwpmc[4] und zugehörige Werkzeuge wurden zu 6.0-CURRENT hinzugefügt.
+
+|600025
+|26. April 2005
+|Die Struktur icmphdr wurden zu 6.0-CURRENT hinzugefügt.
+
+|600026
+|3. Mai 2005
+|pf Aktualisierung auf 3.7.
+
+|600027
+|6. Mai 2005
+|Kernel libalias und ng_nat wurden eingeführt.
+
+|600028
+|13. Mai 2005
+|POSIX ttyname_r(3) wurde über unistd.h und libc zur Verfügung gestellt.
+
+|600029
+|29. Mai 2005
+|6.0-CURRENT nachdem libpcap zu Version v0.9.1 alpha 096 aktualisiert wurde.
+
+|600030
+|5. Juni 2005
+|6.0-CURRENT nach dem Import von NetBSDs if_bridge(4).
+
+|600031
+|10. Juni 2005
+|6.0-CURRENT nachdem die Struktur ifnet aus dem Treiber softcs herausgelöst wurde.
+
+|600032
+|11. Juli 2005
+|6.0-CURRENT nach dem Import von libpcap v0.9.1.
+
+|600033
+|25. Juli 2005
+|6.0-STABLE nachdem die Versionen aller gemeinsam genutzten Bibliotheken, welche seit RELENG_5 nicht geändert wurden, erhöht wurden.
+
+|600034
+|13. August 2005
+|6.0-STABLE nachdem das Argument credential zu der dev_clone-Ereignisbehandlung hinzugefügt wurde. 6.0-RELEASE.
+
+|600100
+|1. November 2005
+|6.0-STABLE nach dem Erstellen des 6.0-RELEASE-Zweiges.
+
+|600101
+|21. Dezember 2005
+|6.0-STABLE nach dem Aufnehmen von Skripten aus den local_startup-Verzeichnissen in man:rcorder[8] des Basissystems.
+
+|600102
+|30. Dezember 2005
+|6.0-STABLE nach dem Aktualisieren der ELF-Typen und Konstanten.
+
+|600103
+|15. Januar 2006
+|6.0-STABLE nach dem Einfliessen der pidfile(3)-API aus CURRENT.
+
+|600104
+|17. Januar 2006
+|6.0-STABLE nach dem Einfliessen der Änderung von ldconfig_local_dirs aus CURRENT.
+
+|600105
+|26. Februar 2006
+|6.0-STABLE nach der NLS-Katalogunterstützung von csh(1).
+
+|601000
+|6. Mai 2006
+|6.1-RELEASE
+
+|601100
+|6. Mai 2006
+|6.1-STABLE nach 6.1-RELEASE.
+
+|601101
+|22. Juni 2006
+|6.1-STABLE nach dem Import von csup.
+
+|601102
+|11. Juli 2006
+|6.1-STABLE nach der iwi(4)-Aktualisierung.
+
+|601103
+|17. Juli 2006
+|6.1-STABLE nach der Aktualisierung der Namensauflösung zu BIND9 und Aufnahme der ablaufinvarianten Versionen der netdb-Funktionen.
+
+|601104
+|8. August 2006
+|6.1-STABLE nachdem Unterstützung für DSO (dynamic shared objects - gemeinsam genutzte, dynamische Objekte) in OpenSSL aktiviert wurde.
+
+|601105
+|2. September 2006
+|6.1-STABLE nachdem 802.11 Reparaturen die API der IEEE80211_IOC_STA_INFO ioctl geändert haben.
+
+|602000
+|15. November 2006
+|6.2-RELEASE
+
+|602100
+|15. September 2006
+|6.2-STABLE nach 6.2-RELEASE.
+
+|602101
+|12. Dezember 2006
+|6.2-STABLE nach dem Hinzufügen der Wi-Spy Eigenart.
+
+|602102
+|28. Dezember 2006
+|6.2-STABLE nachdem pci_find_extcap() hinzugefügt wurde.
+
+|602103
+|16. Januar 2007
+|6.2-STABLE nach dem Einpflegen der dlsym Änderung aus CURRENT, ein angefordertes Symbol sowohl in der spezifizierten dso, als auch in den impliziten Abhängigkeiten nachzuschlagen.
+
+|602104
+|28. Januar 2007
+|6.2-STABLE nach dem Einpflegen von ng_deflate(4) und ng_pred1(4) netgraph Knoten und neuen Kompressions- und -Verschlüsselungmodi für den ng_ppp(4) Knoten aus CURRENT.
+
+|602105
+|20. Februar 2007
+|6.2-STABLE nach dem Einpflegen der BSD lizensierten Version von man:gzip[1], welche von NetBSD portiert wurde aus CURRENT.
+
+|602106
+|31. März 2007
+|6.2-STABLE nach dem Einpflegen der PCI MSI und MSI-X Unterstützung aus CURRENT.
+
+|602107
+|6. April 2007
+|6.2-STABLE nach dem Einpflegen von ncurses 5.6 und Unterstützung für Multibyte-Zeichen aus CURRENT.
+
+|602108
+|11. April 2007
+|6.2-STABLE nach dem Einpflegen des 'SG' Peripheriegerätes aus CURRENT in CAM, welches einen Teil der SCSI SG passthrough Geräte API von Linux enthält.
+
+|602109
+|17. April 2007
+|6.2-STABLE nach dem Einpflegen von readline 5.2 Patchset 002 aus CURRENT.
+
+|602110
+|2. Mai 2007
+|6.2-STABLE nach dem Einpflegen von pmap_invalidate_cache(), pmap_change_attr(), pmap_mapbios(), pmap_mapdev_attr(), und pmap_unmapbios() für amd64 und i386 aus CURRENT.
+
+|602111
+|11. Juni 2007
+|6.2-STABLE nach dem Einpflegen von BOP_BDFLUSH aus CURRENT und dem daraus resultierendem Bruch mit dem Dateisystemmodul KBI.
+
+|602112
+|21. September 2007
+|6.2-STABLE nach dem Einpflegen von libutil(3) aus CURRENT.
+
+|602113
+|25. Oktober 2007
+|6.2-STABLE, nach der Trennung in "wide und single byte ctype". Neu kompilierte Binärdateien, die ctype.h referenzieren, erfordern möglicherweise ein neues Symbol, __mb_sb_limit, das auf älteren Systemen nicht verfügbar ist.
+
+|602114
+|30. Oktober 2007
+|6.2-STABLE, nachdem die ctype ABI-Aufwärtskompatibilität wiederhergestellt wurde.
+
+|602115
+|21. November 2007
+|FreeBSD 6.2-STABLE nach der Entfernung/Eliminierung der wide und single Byte ctype-Trennung
+
+|603000
+|25. November 2007
+|6.3-RELEASE
+
+|603100
+|25. November 2007
+|6.3-STABLE nach 6.3-RELEASE.
+
+|603101
+|7. Dezember 2007
+|6.3-STABLE, nachdem der Support für den Multibyte-Datentyp im Bit-Makro gefixt wurde.
+
+|603102
+|24. April 2008
+|6.3-STABLE nach Hinzufügen von l_sysid zu struct flock.
+
+|603103
+|27. Mai 2008
+|6.3-STABLE nach Einfließen der `memrchr`-Funktion.
+
+|603104
+|15. Juni 2008
+|6.3-STABLE nach Übernahme der Unterstützung von `:u` als Variablenwandler in make(1).
+
+|604000
+|4. Oktober 2008
+|6.4-RELEASE
+
+|604100
+|4. Oktober 2008
+|6.4-STABLE nach 6.4-RELEASE.
+
+|700000
+|11. Juli 2005
+|7.0-CURRENT.
+
+|700001
+|23. Juli 2005
+|7.0-CURRENT nachdem die Versionen aller gemeinsam genutzten Bibliotheken, welche seit RELENG_5 nicht geändert wurden, erhöht wurden.
+
+|700002
+|13. August 2005
+|7.0-CURRENT nachdem ein Berechtigungs-Argument zur dev_clone-Ereignisroutine hinzugefügt wurde.
+
+|700003
+|25. August 2005
+|7.0-CURRENT nachdem memmem(3) zur libc hinzugefügt wurde.
+
+|700004
+|30. Oktober 2005
+|7.0-CURRENT nachdem die Argumente der Kernelfunktion solisten(9) modifiziert wurden, um einen Backlog-Parameter (Anzahl der maximalen wartenden Verbindungen) zu akzeptieren.
+
+|700005
+|11. November 2005
+|7.0-CURRENT nachdem IFP2ENADDR() geändert wurde, einen Zeiger auf IF_LLADDR() zurückzugeben.
+
+|700006
+|11. November 2005
+|7.0-CURRENT nach dem Hinzufügen des `if_addr`-Elements zur Struktur `ifnet` und dem Entfernen von IFP2ENADDR().
+
+|700007
+|2. Dezember 2005
+|7.0-CURRENT nach dem Aufnehmen von Skripten aus den local_startup Verzeichnissen in man:rcorder[8] des Basissystems.
+
+|700008
+|5. Dezember 2005
+|7.0-CURRENT nach dem Entfernen der MNT_NODEV mount-Option.
+
+|700009
+|19. Dezember 2005
+|7.0-CURRENT nach ELF-64 Typen Änderungen und Symbol Versionierung.
+
+|700010
+|20. Dezember 2005
+|7.0-CURRENT nach Hinzufügen der hostb und vgapci Treiber, Hinzufügen von pci_find_extcap() und Änderung der AGP Treiber die Apertur nicht länger abzubilden.
+
+|700011
+|31. Dezember 2005
+|7.0-CURRENT nachdem auf allen Plattformen außer Alpha tv_sec in time_t umgewandelt wurde.
+
+|700012
+|8. Januar 2006
+|7.0-CURRENT nach Änderung von ldconfig_local_dirs.
+
+|700013
+|12. Januar 2006
+|7.0-CURRENT nach Änderung in [.filename]#/etc/rc.d/abi# um [.filename]#/compat/linux/etc/ld.so.cache# als Symlink in ein schreibgeschütztes Dateisystem zu unterstützen.
+
+|700014
+|26. Januar 2006
+|7.0-CURRENT nach pts Import.
+
+|700015
+|26. März 2006
+|7.0-CURRENT nach Einführung von Version 2 der man:hwpmc[4]'s ABI.
+
+|700016
+|22. April 2006
+|7.0-CURRENT nach dem Hinzufügen von man:fcloseall[3] zur libc.
+
+|700017
+|13. Mai 2006
+|7.0-CURRENT nach dem Entfernen von ip6fw.
+
+|700018
+|15. Juli 2006
+|7.0-CURRENT nach dem Import von snd_emu10kx.
+
+|700019
+|29. Juli 2006
+|7.0-CURRENT nach dem Import von OpenSSL 0.9.8b.
+
+|700020
+|3. September 2006
+|7.0-CURRENT nach dem Hinzufügen der bus_dma_get_tag-Funktion
+
+|700021
+|4. September 2006
+|7.0-CURRENT nach dem Import von libpcap 0.9.4 und tcpdump 3.9.4.
+
+|700022
+|9. September 2006
+|7.0-CURRENT nach der dlsym Änderung, ein angefordertes Symbol sowohl in der spezifizierten dso, als auch in den impliziten Abhängigkeiten nachzuschlagen.
+
+|700023
+|23. September 2006
+|7.0-CURRENT nach dem Hinzufügen neuer Sound-IOCTLs für die OSSv4-Mixer-API.
+
+|700024
+|28. September 2006
+|7.0-CURRENT nach dem Import von OpenSSL 0.9.8d.
+
+|700025
+|11. November 2006
+|7.0-CURRENT nach dem Hinzufügen der libelf.
+
+|700026
+|26. November 2006
+|7.0-CURRENT nach größeren Änderungen an den Sound sysctls.
+
+|700027
+|30. November 2006
+|7.0-CURRENT nach dem Hinzufügen der Wi-Spy-Eigenart.
+
+|700028
+|15. Dezember 2006
+|7.0-CURRENT nach dem Hinzufügen von sctp-Aufrufen zur libc.
+
+|700029
+|26. Januar 2007
+|7.0-CURRENT nach dem Ersetzen von GNU man:gzip[1] durch eine von NetBSD portierte Version, die unter BSD-Lizenz steht.
+
+|700030
+|7. Februar 2007
+|7.0-CURRENT nach dem Entfernen der IPIP Tunnelkapselung (VIFF_TUNNEL) aus dem IPv4 Multicast-Forwarding-Quelltext.
+
+|700031
+|23. Februar 2007
+|7.0-CURRENT nach den Modifizierungen an bus_setup_intr() (newbus).
+
+|700032
+|2. März 2007
+|7.0-CURRENT nach der Aufnahme der Firmware für ipw(4) und iwi(4).
+
+|700033
+|9. März 2007
+|7.0-CURRENT nach Unterstützung für Multibyte-Zeichen.
+
+|700034
+|19. März 2007
+|7.0-CURRENT nach Änderungen, wie insmntque(), getnewvnode() und vfs_hash_insert() arbeiten.
+
+|700035
+|26. März 2007
+|7.0-CURRENT nach Hinzufügen eines Benachrichtigungsmechanismus für CPU Frequenzänderungen.
+
+|700036
+|6. April 2007
+|7.0-CURRENT nach dem Import des ZFS Dateisystemes.
+
+|700037
+|8. April 2007
+|7.0-CURRENT nach dem Einpflegen des 'SG' Peripheriegerätes in CAM, welches einen Teil der SCSI SG passthrough Geräte API von Linux enthält.
+
+|700038
+|30. April 2007
+|7.0-CURRENT nachdem man:getenv[3], man:putenv[3], man:setenv[3] und man:unsetenv[3] geändert wurden, um POSIX konform zu sein.
+
+|700039
+|1. Mai 2007
+|7.0-CURRENT nachdem die Änderungen von 700038 rückgängig gemacht wurden.
+
+|700040
+|10. Mai 2007
+|7.0-CURRENT nach dem Hinzufügen von man:flopen[3] zur libutil.
+
+|700041
+|13. Mai 2007
+|7.0-CURRENT nachdem Symbol Versionierung aktiviert und die standardmäßige Thread-Bibliothek zu libthr geändert wurde.
+
+|700042
+|19. Mai 2007
+|7.0-CURRENT nach dem Import von GCC 4.2.0.
+
+|700043
+|21. Mai 2007
+|7.0-CURRENT nachdem die Versionen aller Shared-Libraries, welche seit RELENG_6 nicht geändert wurden, erhöht worden sind.
+
+|700044
+|7. Juni 2007
+|7.0-CURRENT nachdem das Argument für vn_open()/VOP_OPEN() vom Dateideskriptorindex zur Struktur file * geädert wurde.
+
+|700045
+|10. Juni 2007
+|7.0-CURRENT nachdem man:pam_nologin[8] geädert wurde, eine Kontoverwaltungs-Funktion statt einer Authentifizierungsfunktion für das PAM-Framework zur Verfügung zu stellen.
+
+|700046
+|11. Juni 2007
+|7.0-CURRENT nach aktualisierter 802.11 wireless Unterstützung.
+
+|700047
+|11. Juni 2007
+|7.0-CURRENT, nachdem TCP-LRO-Schnittstellen-Ressourcen hinzugefügt wurden.
+
+|700048
+|12. Juni 2007
+|7.0-CURRENT, nachdem die RFC 3678 API-Unterstützung zum IPv4-Stack hinzugefügt wurde. Veraltetes RFC 1724-Verhalten des IP_MULTICAST_IF ioctl wurde entfernt; 0.0.0.0/8 darf nicht länger als Schnittstellen-Index benutzt werden. Stattdessen sollte die Struktur ipmreqn verwendet werden.
+
+|700049
+|3. Juli 2007
+|7.0-CURRENT, nachdem pf von OpenBSD 4.1 importiert wurde
+
+|(nicht geändert)
+|
+|7.0-CURRENT, nachdem die IPv6-Unterstützung um FAST_IPSEC erweitert, KAME IPSEC entfernt und FAST_IPSEC in IPSEC umbenannt wurde.
+
+|700050
+|4. Juli 2007
+|7.0-CURRENT, nachdem Aufrufe von setenv/putenv/usw. von der traditionellen BSD-Art und Weise nach POSIX konvertiert wurden.
+
+|700051
+|4. Juli 2007
+|7.0-CURRENT, nachdem neue Systemaufrufe (mmap/lseek/usw.) implementiert wurden.
+
+|700052
+|6. Juli 2007
+|7.0-CURRENT, nachdem die I4B-Header nach include/i4b verschoben wurden.
+
+|700053
+|30. September 2007
+|7.0-CURRENT, nachdem die Unterstützung für PCI Domänen hinzugefügt wurde.
+
+|700054
+|25. Oktober 2007
+|7.0-CURRENT, nach der Trennung in "wide und single byte ctype".
+
+|700055
+|28. Oktober 2007
+|7.0-RELEASE sowie 7.0-CURRENT, nachdem die ABI-Abwärtskompatibilität für die FreeBSD 4/5/6-Versionen der PCIOCGETCONF-, PCIOCREAD- sowie PCIOCWRITE IOCTLs hinzugefügt wurde. Damit verbunden war, dass die ABI der PCIOCGETCONF IOCTL erneut deaktiviert werden musste.
+
+|700100
+|22. Dezember 2007
+|7.0-STABLE nach 7.0-RELEASE.
+
+|700101
+|8. Februar 2008
+|7.0-STABLE nach Einführung von m_collapse().
+
+|700102
+|30. März 2008
+|7.0-STABLE nach Einfließen von kdb_enter_why().
+
+|700103
+|10. April 2008
+|7.0-STABLE nach Hinzufügen von l_sysid zu struct flock.
+
+|700104
+|11. April 2008
+|7.0-STABLE nach Übernahme von procstat(1).
+
+|700105
+|11. April 2008
+|7.0-STABLE nach Einführung von umtx-Features.
+
+|700106
+|15. April 2008
+|7.0-STABLE nach Hinzufügen der Unterstützung von man:write[2] zu man:psm[4].
+
+|700107
+|20. April 2008
+|7.0-STABLE nach Hinzufügen des Befehls F_DUP2FD zu man:fcntl[2].
+
+|700108
+|5. Mai 2008
+|7.0-STABLE nach einigen Änderungen an man:lockmgr[9], welche die Einbindung von [.filename]#sys/lock.h# zur Verwendung von man:lockmgr[9] voraussetzen.
+
+|700109
+|27. Mai 2008
+|7.0-STABLE nach Einfließen der `memrchr`-Funktion.
+
+|700110
+|5. August 2008
+|7.0-STABLE nach Einführung eines Clients für den Kernel NFS lockd.
+
+|700111
+|20. August 2008
+|7.0-STABLE nach Hinzufügen einer Unterstützung von physisch fortlaufender Jumbo Frames.
+
+|700112
+|27. August 2008
+|7.0-STABLE nach Einfließen einer Kernelunterstützung für DTrace.
+
+|701000
+|25. November 2008
+|7.1-RELEASE
+
+|701100
+|25. November 2008
+|7.1-STABLE nach 7.1-RELEASE.
+
+|701101
+|10. Januar 2009
+|7.1-STABLE nach Übernahme von `strndup`.
+
+|701102
+|17. Januar 2009
+|7.1-STABLE nach Hinzufügen einer Unterstützung von cpuctl(4).
+
+|701103
+|7. Februar 2009
+|7.1-STABLE nach Einfließen der Unterstützung von Jails mit keinen oder mehreren IPv4-/IPv6-Adressen.
+
+|701104
+|14. Februar 2009
+|7.1-STABLE, nachdem der Besitzer des Suspend in struct mount gespeichert wird und die Funktion vfs_susp_clean in struct vfsops aufgenommen ist.
+
+|701105
+|12. März 2009
+|7.1-STABLE nach der inkompatiblen Änderung am sysctl kern.ipc.shmsegs, um die Anforderung größerer Segmente von gemeinsam genutzten SysV-Speicher auf 64bit-Architekturen zu erlauben.
+
+|701106
+|14. März 2009
+|7.1-STABLE nach der Übernahme einer Fehlerbehebung für Warteoperationen, die POSIX-Semaphore verwenden.
+
+|702000
+|15. April 2009
+|7.2-RELEASE
+
+|702100
+|15. April 2009
+|7.2-STABLE nach 7.2-RELEASE.
+
+|702101
+|15. Mai 2009
+|7.2-STABLE, nachdem ichsmb(4) dahingehend geändert wurde, dass es links-ausgerichtete Adressierung von Slaves verwendet, um anderen SMBus-Kontrollertreibern zu entsprechen.
+
+|702102
+|28. Mai 2009
+|7.2-STABLE nach dem Einfließen der Funktion `fdopendir`.
+
+|702103
+|06. Juni 2009
+|7.2-STABLE nach dem Einfließen von PmcTools.
+
+|702104
+|14. Juli 2009
+|7.2-STABLE nach dem Einfließen des Systemaufrufs `closefrom`.
+
+|702105
+|31. Juli 2009
+|7.2-STABLE nach dem Einfließen der Änderung an der SYSVIPC-ABI.
+
+|702106
+|14. September 2009
+|7.2-STABLE nach dem Einfließen der PAT-Verbesserungen für x86-Prozessoren sowie dem Hinzufügen von d_mmap_single() und des VM-Objekttyps für scatter/gather-Listen.
+
+|703000
+|9. Februar 2010
+|7.3-RELEASE
+
+|703100
+|9. Februar 2010
+|7.3-STABLE nach 7.3-RELEASE.
+
+|704000
+|22. Dezember 2010
+|7.4-RELEASE
+
+|704100
+|22. Dezember 2010
+|7.4-STABLE, nachdem 7.4-RELEASE erzeugt wurde.
+
+|800000
+|11. Oktober 2007
+|8.0-CURRENT. Nach der Trennung in "wide und single byte ctype".
+
+|800001
+|16. Oktober 2007
+|8.0-CURRENT, nachdem libpcap 0.9.8 und tcpdump 3.9.8 importiert wurden.
+
+|800002
+|21. Oktober 2007
+|8.0-CURRENT, nachdem kthread_create() und Konsorten in kproc_create() usw. umbenannt wurden.
+
+|800003
+|24. Oktober 2007
+|8.0-CURRENT, nachdem die ABI-Abwärtskompatibilität für die FreeBSD 4/5/6-Versionen der PCIOCGETCONF-, PCIOCREAD- sowie PCIOCWRITE IOCTLs hinzugefügt wurde. Damit verbunden war, dass die ABI der PCIOCGETCONF IOCTL erneut deaktiviert werden musste.
+
+|800004
+|12. November 2007
+|8.0-CURRENT, nachdem der agp(4) Treiber verschoben wurde von src/sys/pci nach src/sys/dev/agp.
+
+|800005
+|4. Dezember 2007
+|8.0-CURRENT nach http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/kern_mbuf.c#rev1.35[Änderungen am Jumbo Frame Allocator].
+
+|800006
+|7. Dezember 2007
+|8.0-CURRENT, nach dem Hinzufügen der callgraph capture Funktionalität zu man:hwpmc[4].
+
+|800007
+|25. Dezember 2007
+|8.0-CURRENT nach dem Hinzufügen von "why" als Argument in kdb_enter().
+
+|800008
+|28. Dezember 2007
+|8.0-CURRENT nach Entfernen der Option LK_EXCLUPGRADE.
+
+|800009
+|9. Januar 2008
+|8.0-CURRENT nach Einführung von man:lockmgr_disown[9]
+
+|800010
+|10. Januar 2008
+|8.0-CURRENT nach Änderungen am man:vn_lock[9]-Prototyp.
+
+|800011
+|13. Januar 2008
+|8.0-CURRENT nach Änderungen an den Prototypen von man:VOP_LOCK[9] und man:VOP_UNLOCK[9].
+
+|800012
+|19. Januar 2008
+|8.0-CURRENT nach Einführung von man:lockmgr_recursed[9], man:BUF_RECURSED[9] und man:BUF_ISLOCKED[9] sowie Entfernung von `BUF_REFCNT()`.
+
+|800013
+|23. Januar 2008
+|8.0-CURRENT nach Einführung der "ASCII"-Kodierung.
+
+|800014
+|24. Januar 2008
+|8.0-CURRENT nach Änderungen am man:lockmgr[9]-Prototyp und Entfernung von `lockcount()` sowie `LOCKMGR_ASSERT()`.
+
+|800015
+|26. Januar 2008
+|8.0-CURRENT nach Erweiterung der Datentypen der man:fts[3]-Strukturen.
+
+|800016
+|1. Februar 2008
+|8.0-CURRENT nach Hinzufügen eines neuen Parameters zu MEXTADD(9).
+
+|800017
+|6. Februar 2008
+|8.0-CURRENT nach Einführung der Optionen LK_NODUP und LK_NOWITNESS in die man:lockmgr[9]-Umgebung.
+
+|800018
+|8. Februar 2008
+|8.0-CURRENT nach Hinzufügen von m_collapse.
+
+|800019
+|9. Februar 2008
+|8.0-CURRENT nach Hinzufügen einer Arbeits-, Wurzel- und Jailverzeichnisunterstützung zur sysctl-Variable kern.proc.filedesc.
+
+|800020
+|13. Februar 2008
+|8.0-CURRENT nach Einführung der Funktionen man:lockmgr_assert[9] und `BUF_ASSERT`.
+
+|800021
+|15. Februar 2008
+|8.0-CURRENT nach Einführung von man:lockmgr_args[9] und Entfernung der Option LK_INTERNAL.
+
+|800022
+|(zurückgezogen)
+|8.0-CURRENT nach Setzen von BSD man:ar[1] als Systemstandard.
+
+|800023
+|25. Februar 2008
+|8.0-CURRENT nach Prototypenänderungen an man:lockstatus[9] und man:VOP_ISLOCKED[9];, eigens zur Abschaffung des Parameters `struct thread`.
+
+|800024
+|1. März 2008
+|8.0-CURRENT nach Beseitigung der Funktionen `lockwaiters` und `BUF_LOCKWAITERS`, Änderung des Rückgabewerts der Funktion `brelvp` von void nach int sowie Einführung neuer Optionen für man:lockinit[9].
+
+|800025
+|8. März 2008
+|8.0-CURRENT nach Hinzufügen des Kommandos F_DUP2FD zu man:fcntl[2].
+
+|800026
+|12. März 2008
+|8.0-CURRENT nach Änderung des Parameters für die Priorität an cv_broadcastpri, sodass 0 für keine Priorität steht.
+
+|800027
+|24. März 2008
+|8.0-CURRENT nach Änderung der Monitoring ABI von BPF, als Zero-Copy Puffer hinzugefügt wurden.
+
+|800028
+|26. März 2008
+|8.0-CURRENT nach Hinzufügen von l_sysid zu struct flock.
+
+|800029
+|28. März 2008
+|8.0-CURRENT nach Wiedereingliederung der Funktion `BUF_LOCKWAITERS` und Hinzufügen von man:lockmgr_waiters[9].
+
+|800030
+|1. April 2008
+|8.0-CURRENT nach Einführung der Funktionen man:rw_try_rlock[9] und man:rw_try_wlock[9].
+
+|800031
+|6. April 2008
+|8.0-CURRENT nach Einführung der Funktionen `lockmgr_rw` und `lockmgr_args_rw`.
+
+|800032
+|8. April 2008
+|8.0-CURRENT nach Implementierung des Systemaufrufs openat und seiner Verwandten, Einführung der Option O_EXEC in man:open[2] und Bereitstellung der entsprechenden Systemaufrufe innerhalb der Linux(R)-Kompatibilitätsumgebung.
+
+|800033
+|8. April 2008
+|8.0-CURRENT nach Hinzufügen der Unterstützung von man:write[2] in der nativen Operationsebene von man:psm[4]. Es können nun beliebig Kommandos nach [.filename]#/dev/psm%d# geschrieben und der Status dann von dort gelesen werden.
+
+|800034
+|10. April 2008
+|8.0-CURRENT nach Einführung der Funktion `memrchr`.
+
+|800035
+|16. April 2008
+|8.0-CURRENT nach Einführung der Funktion `fdopendir`.
+
+|800036
+|20. April 2008
+|8.0-CURRENT nach Umstellung des Standards 802.11 auf Unterstützung von Multi-BSS (auch vaps).
+
+|800037
+|9. Mai 2008
+|8.0-CURRENT nach Hinzufügen einer Unterstützung für Multi Routing-Tabellen (siehe setfib(1), setfib(2)).
+
+|800038
+|26. Mai 2008
+|8.0-CURRENT nach Entfernen von netatm und ISDN4BSD sowie dem Hinzufügen der Compact C Type (CTF)-Tools.
+
+|800039
+|14. Juni 2008
+|8.0-CURRENT nach Entfernen von sgtty.
+
+|800040
+|26. Juni 2008
+|8.0-CURRENT nach Einführung eines Clients für den Kernel NFS lockd.
+
+|800041
+|22. Juli 2008
+|8.0-CURRENT nach Hinzufügen von arc4random_buf(3) und arc4random_uniform(3).
+
+|800042
+|8. August 2008
+|8.0-CURRENT nach Hinzufügen von cpuctl(4).
+
+|800043
+|13. August 2008
+|8.0-CURRENT nach Änderung von bpf(4) zur Verwendung einer einzelnen Gerätedatei anstatt von Klonierung.
+
+|800044
+|17. August 2008
+|8.0-CURRENT nach Übernahme des ersten Teils aus dem vimage-Projekt durch Erweitern globaler Variablen um den Präfix V_. Zukünftig werden die virtualisierten Variablen dann mit Hilfe von Makros in ihre globalen Namen aufgelöst.
+
+|800045
+|20. August 2008
+|8.0-CURRENT nach Eingliederung des MPSAFE TTY-Layers, einschließlich Änderungen an diversen Treibern und Werkzeugen, die mit ihm kommunizieren.
+
+|800046
+|8. September 2008
+|8.0-CURRENT nach Abschottung der GDT pro CPU auf der AMD64-Architektur.
+
+|800047
+|10. September 2008
+|8.0-CURRENT nach Entfernen von VSVTX, VSGID und VSUID.
+
+|800048
+|16. September 2008
+|8.0-CURRENT nach Anpassung des Codes für Kernel NFS mount, sodass einzelne Mountoptionen im Parameter struct iovec an nmount() akzeptiert werden und nicht nur ein großes struct nfs_args.
+
+|800049
+|17. September 2008
+|8.0-CURRENT nach Entfernen von man:suser[9] und man:suser_cred[9].
+
+|800050
+|20. Oktober 2008
+|8.0-CURRENT nach API-Änderungen im Umgang mit dem Buffer Cache.
+
+|800051
+|23. Oktober 2008
+|8.0-CURRENT nach Entfernen der Makros man:MALLOC[9] und man:FREE[9].
+
+|800052
+|28. Oktober 2008
+|8.0-CURRENT nach Einführung von accmode_t und Umbennung des Parameters a_mode an VOP_ACCESS nach a_accmode.
+
+|800053
+|2. November 2008
+|8.0-CURRENT nach Änderung des Prototyps von man:vfs_busy[9] und Einführung der Optionen MBF_NOWAIT sowie MBF_MNTLSTLOCK.
+
+|800054
+|22. November 2008
+|8.0-CURRENT nach Hinzufügen von Funktionen im Bereich buf_ring, Memory Barriers und ifnet, um mehrere Sendeschlangen auf Hardwareebene für Karten zu ermöglichen, die dies unterstützen, sowie einer Ring Buffer-Implementierung ohne Lock, um Treibern zu ermöglichen, Paketschlangen effizienter zu verwalten.
+
+|800055
+|27. November 2008
+|8.0-CURRENT nach Hinzufügen einer Unterstützung für Intel(R) Core, Core2 und Atom zu man:hwpmc[4].
+
+|800056
+|29. November 2008
+|8.0-CURRENT nach Einführung von Jails mit mehreren oder gar keinen IPv4-/IPv6-Adressen.
+
+|800057
+|1. Dezember 2008
+|8.0-CURRENT nach Wechsel zum ath_hal Quellcode.
+
+|800058
+|12. Dezember 2008
+|8.0-CURRENT nach Einführung der Funktion VOP_VPTOCNP.
+
+|800059
+|15. Dezember 2008
+|8.0-CURRENT gliedert das neue ARPv2 ein.
+
+|800060
+|19. Dezember 2008
+|8.0-CURRENT nach Hinzufügen von makefs.
+
+|800061
+|15. Januar 2009
+|8.0-CURRENT nach Umsetzung von TCP Appropriate Byte Counting.
+
+|800062
+|28. Januar 2009
+|8.0-CURRENT nach Entfernen von minor(), minor2unit(), unit2minor() usw.
+
+|800063
+|18. Februar 2009
+|8.0-CURRENT nach Änderung der GENERIC-Konfiguration zur Verwendung des USB2-Stack und Hinzufügen von fdevname(3).
+
+|800064
+|23. Februar 2009
+|8.0-CURRENT, nachdem der USB2-Stack nach dev/usb verschoben wurde, um es zu ersetzen.
+
+|800065
+|26. Februar 2009
+|8.0-CURRENT nach Umbenennen aller Funktionen in libmp(3).
+
+|800066
+|27. Februar 2009
+|8.0-CURRENT nach Anpassung des devfs-Verhaltens im Zusammenhang mit USB.
+
+|800067
+|28. Februar 2009
+|8.0-CURRENT nach Hinzufügen von getdelim(), getline(), stpncpy(), strnlen(), wcsnlen(), wcscasecmp() und wcsncasecmp().
+
+|800068
+|2. März 2009
+|8.0-CURRENT nach Umbenennen der Geräteklasse ushub in uhub.
+
+|800069
+|9. März 2009
+|8.0-CURRENT nach Umbenennen von libusb20.so.1 in libusb.so.1.
+
+|800070
+|9. März 2009
+|8.0-CURRENT nach der Einführung von IGMPv3 und Source-Specific-Multicast (SSM) in den IPv4-Stack.
+
+|800071
+|14. März 2009
+|8.0-CURRENT nach der Anpassung von gcc zur Verwendung der C99-Inline-Semantik in den Modi c99 und gnu99.
+
+|800072
+|15. März 2009
+|8.0-CURRENT, nachdem die Option IFF_NEEDSGIANT entfernt wurde; Netzwerktreiber, die nicht MPSAFE sind, werden nicht mehr unterstützt.
+
+|800073
+|18. März 2009
+|8.0-CURRENT, nachdem die dynamische Ersetzung von Zeichenkettenkürzeln für rpath und benötigte Pfade implementiert wurde.
+
+|800074
+|24. März 2009
+|8.0-CURRENT nach dem Einfließen von tcpdump 4.0.0 und libpcap 1.0.0.
+
+|800075
+|6. April 2009
+|8.0-CURRENT, nachdem die Deklarationen von struct vnet_net, struct vnet_inet und struct vnet_ipfw geändert wurden.
+
+|800076
+|9. April 2009
+|8.0-CURRENT nach dem Hinzufügen von Laufzeitprofilen in dummynet.
+
+|800077
+|14. April 2009
+|8.0-CURRENT nach dem Entfernen von VOP_LEASE() und vop_vector.vop_lease.
+
+|800078
+|15. April 2009
+|8.0-CURRENT, nachdem die Felder aus struct rt_weight zu struct rt_metrics und struct rt_metrics_lite hinzugefügt wurden, wobei die Deklaration von struct rt_metrics_lite geändert wurde. RTM_VERSION wurde hochgezählt (zurückgezogen).
+
+|800079
+|15. April 2009
+|8.0-CURRENT, nachdem Pointer auf struct llentry zu struct route und struct route_in6 hinzugefügt wurden.
+
+|800080
+|15. April 2009
+|8.0-CURRENT nach Änderung der Deklaration von struct inpcb.
+
+|800081
+|19. April 2009
+|8.0-CURRENT nach Änderung der Deklaration von struct malloc_type.
+
+|800082
+|21. April 2009
+|8.0-CURRENT nach Änderung der Deklaration von struct ifnet und Hinzufügen von if_ref() und if_rele() zur Verwaltung von Referenzen auf ifnet.
+
+|800083
+|22. April 2009
+|8.0-CURRENT nach der Implementierung einer systemnahen Bluetooth-HCI-API.
+
+|800084
+|29. April 2009
+|8.0-CURRENT nach Änderungen an IPv6-SSM und MLDv2.
+
+|800085
+|30. April 2009
+|8.0-CURRENT, nachdem der Bau von VIMAGE-Kernel mit einem aktiven Image unterstützt wird.
+
+|800086
+|8. Mai 2009
+|8.0-CURRENT nach Hinzufügen der Unterstützung für Eingabezeilen mit beliebiger Länge durch patch(1).
+
+|800087
+|11. Mai 2009
+|8.0-CURRENT nach einigen Änderungen im Zusammenhang mit dem VFS-KPI. Der Thread-Parameter wurde von den FSD-Teilen des VFS entfernt. `VFS_*`-Funktionen benötigen den Kontext nicht mehr, da er sich immer auf `curthread` bezieht. In wenigen Sonderfällen ist das bisherige Verhalten nicht geändert worden.
+
+|800088
+|20. Mai 2009
+|8.0-CURRENT nach Änderungen am net80211-Monitormodus.
+
+|800089
+|23. Mai 2009
+|8.0-CURRENT nach dem Hinzufügen der Unterstützung von UDP-Kontrollblocks.
+
+|800090
+|23. Mai 2009
+|8.0-CURRENT nach der Virtualisierung der Schnittstellenklonierung.
+
+|800091
+|27. Mai 2009
+|8.0-CURRENT nach dem Hinzufügen von hierarchischen Jails und dem Entfernen des globalen securelevel.
+
+|800092
+|29. Mai 2009
+|8.0-CURRENT nach der Änderung des `sx_init_flags()`-KPI. [constant]#SX_ADAPTIVESPIN# wurde zurückgezogen und eine neue Option [constant]#SX_NOADAPTIVE# wurde eingeführt, um die umgekehrte Logik zu behandeln.
+
+|800093
+|29. Mai 2009
+|8.0-CURRENT nach dem Hinzufügen von mnt_xflag zu struct mount.
+
+|800094
+|30. Mai 2009
+|8.0-CURRENT nach dem Hinzufügen von man:VOP_ACCESSX[9].
+
+|800095
+|30. Mai 2009
+|8.0-CURRENT nach der Änderung des Polling-KPI. Die Polling-Handler liefern nun die Zahl der verarbeiteten Pakete zurück. Die neue Option [constant]#IFCAP_POLLING_NOCOUNT# wurde weiter eingeführt, um anzugeben, dass der Rückgabewert nicht von Bedeutung ist und das Zählen der Pakete ausgelassen werden soll.
+
+|800096
+|1. Juni 2009
+|8.0-CURRENT nach der Aktualisierung der netisr-Implementierung und nachdem die Weise, wie FIBs gespeichert werden und wie auf sie zugegriffen wird, geändert wurde.
+
+|800097
+|8. Juni 2009
+|8.0-CURRENT nach Einführung der Destruktor-Infrastruktur für vnet einschließlich Hooks.
+
+|800097
+|11. Juni 2009
+|8.0-CURRENT nach Einführung eines Erkennungssystems für ausgehende Pakete, die direkt wieder in netgraph gelangen und deswegen eingereiht werden. Dabei wurde auch die Definition von struct thread geändert.
+
+|800098
+|14. Juni 2009
+|8.0-CURRENT nach dem Einfließen von OpenSSL 0.9.8k.
+
+|800099
+|22. Juni 2009
+|8.0-CURRENT nach der Aktualisierung von NGROUPS und dem Verschieben der Routing-Virtualisierung in ein eigenes VImage-Modul.
+
+|800100
+|24. Juni 2009
+|8.0-CURRENT nach Änderung der SYSVIPC-ABI.
+
+|800101
+|29. Juni 2009
+|8.0-CURRENT nach dem Entfernen der zeichenorientierten Geräte aus /dev/net, von denen für jede Schnittstelle eines existiert.
+
+|800102
+|12. Juli 2009
+|8.0-CURRENT, nachdem struct sackhint, struct tcpcb und struct tcpstat mit Padding-Bytes aufgefüllt wurden.
+
+|800103
+|13. Juli 2009
+|8.0-CURRENT, nachdem struct tcpopt durch struct toeopt in der Schnittstelle zwischen dem TOE-Treiber und dem TCP-SYN-Cache ersetzt wurde.
+
+|800104
+|19. Juli 2009
+|8.0-CURRENT nach dem Hinzufügen einer vnet-spezifischen Speicherzuweisung, die auf dem Linker-Set-Verfahren basiert.
+
+|800105
+|19. Juli 2009
+|8.0-CURRENT nach der Inkrementierung der Versionsnummer aller Shared-Libraries, die Symbol-Versioning nicht aktiviert haben.
+
+|800106
+|24. Juli 2009
+|8.0-CURRENT nach Einführung des VM-Objekttyps OBJT_SG.
+
+|800107
+|2. August 2009
+|8.0-CURRENT nach Befreiung des Newbus-Subsystems von Giant durch Hinzufügen von sxlock und 8.0-RELEASE.
+
+|800108
+|21. November 2009
+|8.0-CURRENT nach Implementierung des kevent-Filters EVFILT_USER.
+
+|800500
+|7. Januar 2010
+|8.0-STABLE nach Erhöhung von `__FreeBSD_version`, damit `pkg_add -r` packages-8-stable verwendet.
+
+|800501
+|24. Januar 2010
+|8.0-STABLE, nachdem die Prototypen von `scandir(3)` und `alphasort(3)` geändert wurden, um der SUSv4 zu entsprechen.
+
+|800502
+|31. Januar 2010
+|8.0-STABLE nach Hinzufügen von `sigpause(3)`.
+
+|800503
+|25. Februar 2010
+|8.0-STABLE nach dem Hinzufügen der ioctls SIOCGIFDESCR und SIOCSIFDESCR für Netzwerk-Schnittstellen. Diese ioctls können, nach dem Vorbild von OpenBSD, dazu verwendet werden, Schnittstellenbeschreibungen zu bearbeiten und auszulesen.
+
+|800504
+|1. März 2010
+|8.0-STABLE, nachdem x86emu, ein Software-Emulator von OpenBSD für x86-Prozessoren im Real-Mode, von CURRENT übernommen wurde.
+
+|800505
+|18. Mai 2010
+|8.0-STABLE nach dem Einfließen von liblzma, xz, xzdec und lzmainfo.
+
+|801000
+|14. Juni 2010
+|8.1-RELEASE
+
+|801500
+|14. Juni 2010
+|8.1-STABLE nach 8.1-RELEASE.
+
+|801501
+|November 3, 2010
+|8.1-STABLE nach der KBI-Änderung in struct sysentve und der Implementierung von PL_FLAG_SCE/SCX/EXEC/SI und pl_siginfo für ptrace(PT_LWPINFO) .
+
+|802000
+|22. Dezember 2010
+|8.2-RELEASE
+
+|802500
+|22. Dezember 2010
+|8.2-STABLE, nachdem 8.2-RELEASE erzeugt wurde.
+
+|802501
+|28. Februar 2011
+|8.2-STABLE, nachdem DTrace aktualisiert wurde (so wird nun auch Userland-Tracing unterstützt).
+
+|802502
+|6. März 2011
+|8.2-STABLE, nachdem log2 und log2f in libm aufgenommen wurden.
+
+|802503
+|1. Mai 2011
+|8.2-STABLE, nachdem gcc auf die letzte unter der GPLv2 stehenden Version (aus dem FSF gcc-4_2-Zweig) aktualisiert wurde.
+
+|802504
+|28. Mai 2011
+|8.2-STABLE, nachdem KPI sowie die Infrastruktur zur Unterstützung von "modular congestion control" implementiert wurden.
+
+|802505
+|28. Mai 2011
+|8.2-STABLE, nachdem die KPIs Hhook und Khelp implementiert wurden.
+
+|802506
+|M28. Mai 2011
+|8.2-STABLE, nachdem OSD in die Struktur tcpcb eingebaut wurde.
+
+|802507
+|6. Juni 2011
+|8.2-STABLE nach dem Import von ZFS v28.
+
+|802508
+|8. Juni 2011
+|8.2-STABLE, nach dem Entfernen der Methode sv_schedtail struct sysvec.
+
+|802509
+|14. Juli 2011
+|8.2-STABLE, nachdem die binutils um die SSSE3-Unterstützung erweitert wurden.
+
+|802510
+|19. Juli 2011
+|8.2-STABLE, nach dem Hinzufügen des Flags RFTSIGZMB zu `rfork(2)`.
+
+|900000
+|22. August 2009
+|9.0-CURRENT.
+
+|900001
+|8. September 2009
+|9.0-CURRENT nach dem Import von x86emu, einem Software-Emulator von OpenBSD für x86-Prozessoren im Real-Mode.
+
+|900002
+|23. September 2009
+|9.0-CURRENT nach Implementierung des kevent-Filters EVFILT_USER.
+
+|900003
+|2. Dezember 2009
+|9.0-CURRENT nach Hinzufügen von `sigpause(3)` und der PIE-Unterstützung zu csu.
+
+|900004
+|6. Dezember 2009
+|9.0-CURRENT nach Hinzufügen von libulog und dessen libutempter-Kompatibilitätsschnittstelle.
+
+|900005
+|12. Dezember 2009
+|9.0-CURRENT nach Hinzufügen von `sleepq_sleepcnt()`, das dazu verwendet werden kann, die Anzahl der in einer bestimmten Warteschlange eingereihten Threads abzufragen.
+
+|900006
+|4. Januar 2010
+|9.0-CURRENT, nachdem die Prototypen von `scandir(3)` und `alphasort(3)` geändert wurden, um der SUSv4 zu entsprechen.
+
+|900007
+|13. Januar 2010
+|9.0-CURRENT nach dem Entfernen von utmp(5) und dem Hinzufügen von utmpx (siehe `getutxent(3)`) zur besseren Erfassung von Benutzeranmeldungen und Systemereignissen.
+
+|900008
+|20. Januar 2010
+|9.0-CURRENT nach der Einführung von BSDL bc/dc zur Ersetzung von GNU bc/dc.
+
+|900009
+|26. Januar 2010
+|9.0-CURRENT nach dem Hinzufügen der ioctls SIOCGIFDESCR und SIOCSIFDESCR für Netzwerk-Schnittstellen. Diese ioctls können, nach dem Vorbild von OpenBSD, dazu verwendet werden, Schnittstellenbeschreibungen zu bearbeiten und auszulesen.
+
+|900010
+|22. März 2010
+|9.0-CURRENT nach dem Import von zlib 1.2.4.
+
+|900011
+|24. April 2010
+|9.0-CURRENT nach Hinzufügen von Soft Updates Journaling.
+
+|900012
+|10. Mai 2010
+|9.0-CURRENT nach Hinzufügen von liblzma, xz, xzdec und lzmainfo.
+
+|900013
+|24. Mai 2010
+|9.0-CURRENT nach Einbringen von USB-Fehlerbehebungen in linux(4).
+
+|900014
+|10. Juni 2010
+|9.0-CURRENT nach Hinzufügen von Clang.
+
+|900015
+|22. Juli 2010
+|9.0-CURRENT nach dem Import von BSD grep.
+
+|900016
+|28. Juli 2010
+|9.0-CURRENT, nachdem mti_zone zu struct malloc_type_internal hinzugefügt wurde.
+
+|900017
+|23. August 2010
+|9.0-CURRENT nach dem Zurückkehren zu GNU grep als Standard und Hinzufügen der Option WITH_BSD_GREP.
+
+|900018
+|24. August 2010
+|9.0-CURRENT, nachdem das von `pthread_kill(3)` generierte Signal in si_code als SI_LWP bezeichnet wird. Zuvor war si_code SI_USER.
+
+|900019
+|28. August 2010
+|9.0-CURRENT nach Hinzufügen des Schalters MAP_PREFAULT_READ zu `mmap(2)`.
+
+|900020
+|9. September 2010
+|9.0-CURRENT, nachdem "drain"-Funktionalität in sbufs integriert wurde (wodurch sich auch das Layout von struct sbuf geändert hat).
+
+|900021
+|13. September 2010
+|9.0-CURRENT, nachdem "Userland tracing" in DTrace eingeführt wurde.
+
+|900022
+|2. Oktober 2010
+|9.0-CURRENT nach Hinzufügen der BSDL man-Utilities (und gleichzeitigem Entfernen der GNU/GPL man-Utilities).
+
+|900023
+|11. Oktober 2010
+|9.0-CURRENT nach der Aktualisierung von xz auf den git-Snapshot 20101010.
+
+|900024
+|11. November 2010
+|9.0-CURRENT, nachdem libgcc.a durch libcompiler_rt.a.
+
+|900025
+|12. November 2010
+|9.0-CURRENT nach der Einführung von "modularised congestion control".
+
+|900026
+|30. November 2010
+|9.0-CURRENT nach der Einführung von "Serial Management Protocol (SMP) passthrough" sowie den XPT_SMP_IO und XPT_GDEV_ADVINFO CAM CCBs.
+
+|900027
+|5. Dezember 2010
+|9.0-CURRENT, nachdem log2 zu libm hinzugefügt wurde.
+
+|900028
+|21. Dezember 2010
+|9.0-CURRENT, nach dem HInzufügen von Hhook (Helper Hook), Khelp (Kernel Helpers) und Object Specific Data (OSD) KPIs.
+
+|900029
+|28. Dezember 2010
+|9.0-CURRENT, nach der TCP-Stack modifiziert wurde, um es den Khelp-Modulen zu erlauben, mit ihm über Helper Hook Points zu kommunizieren und Verbindungsdaten im TCP-Kontrollblock zu speichern.
+
+|900030
+|12. Januar 2011
+|9.0-CURRENT, nachdem libdialog auf die Version 20100428 aktualisiert wurde.
+
+|900031
+|7. Februar 2011
+|9.0-CURRENT, nach dem Hinzufügen von `pthread_getthreadid_np(3)`.
+
+|900032
+|8. Februar 2011
+|9.0-CURRENT, nachdem Prototyp und Symbol für uio_yield entfernt wurden.
+
+|900033
+|18. Februar 2011
+|9.0-CURRENT, nachdem die binutils auf Version 2.17.50 aktualisiert wurden.
+
+|900034
+|8. März 2011
+|9.0-CURRENT, nachdem die Struktur sysvec (sv_schedtail) modifiziert wurde.
+
+|900035
+|29. März 20111
+|9.0-CURRENT, nach dem Update des im Basissystem enthaltenen gcc sowie von libstdc++ auf die letzten unter GPLv2 lizenzierten Versionen.
+
+|900036
+|18. April 2011
+|9.0-CURRENT, nachdem libobjc und die Unterstützung für Objective-C aus dem Basissystem entfernt wurden.
+
+|900037
+|13. Mai 2011
+|9.0-CURRENT, nach dem Import der libprocstat(3)-Bibliothek sowie von fuser(1) in das Basissystem.
+
+|900038
+|22. Mai 2011
+|9.0-CURRENT, nachdem ein Lock-Flag zu VFS_FHTOVP(9) hinzugefügt wurde.
+
+|900039
+|28. Juni 2011
+|9.0-CURRENT, nachdem pf von OpenBSD 4.5 importiert wurde.
+
+|900040
+|19. Juli 2011
+|Standardmäßige Erhöhung von MAXCPU für FreeBSD auf 64 für amd64 und ia64 und auf 128 für XLP (mips).
+
+|900041
+|13. August 2011
+|9.0-CURRENT, nachdem Capsicum-Funktionalitäten implementiert wurden. Zusätzlich wurde fget(9) um ein Rechte-Argument erweitert.
+
+|900042
+|28. August 2011
+|Versionssprünge für Shared-Libraries deren ABI sich geändert hat, in Vorbereitung für 9.0.
+
+|900043
+|2. September 2011
+|Automatische Erkennung von USB-Massenspeicher Geräten, die das no synchronize cache SCSI Kommando nicht unterstützen.
+
+|900044
+|10. September 2011
+|Re-factor auto-quirk.
+
+|900045
+|13. Oktober 2011
+|Allen nicht-kompatiblen Systemaufruf-Einstiegspunkten wurde ein sys_ vorangestellt.
+|===
+
+[NOTE]
+====
+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.
+====
+
+[[dads-after-port-mk]]
+== Etwas hinter die [.filename]#bsd.port.mk#-Anweisung schreiben
+
+Schreiben Sie bitte nichts hinter die `.include <bsd.port.mk>`-Zeile. Normalerweise kann dies vermieden werden, indem Sie die Datei [.filename]#bsd.port.pre.mk# irgendwo in der Mitte Ihres [.filename]##Makefile##s und [.filename]#bsd.port.post.mk# am Ende einfügen.
+
+[NOTE]
+====
+Sie dürfen entweder nur das [.filename]#bsd.port.pre.mk#/[.filename]#bsd.port.post.mk#-Paar oder [.filename]#bsd.port.mk# alleine hinzufügen; vermischen Sie diese Verwendungen nicht!
+====
+
+[.filename]#bsd.port.pre.mk# definiert nur einige Variablen, welche in Tests im [.filename]#Makefile# benutzt werden können, [.filename]#bsd.port.post.mk# definiert den Rest.
+
+Hier sind einige wichtige Variablen, welche in [.filename]#bsd.port.pre.mk# definiert sind (dies ist keine vollständige Liste, lesen Sie bitte [.filename]#bsd.port.mk# für eine vollständige Auflistung).
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| 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-versions,`__FreeBSD_version`>>.
+
+|`PORTOBJFORMAT`
+|Das Objektformat des Systems (`elf` oder `aout`; beachten Sie, dass für "moderne" Versionen von FreeBSD `aout` veraltet ist).
+
+|`LOCALBASE`
+|Die Basis des "local" Verzeichnisbaumes (z.B. `/usr/local/`)
+
+|`PREFIX`
+|Wo der Port sich selbst installiert (siehe <<porting-prefix, Mehr Informationen über `PREFIX`>>).
+|===
+
+[NOTE]
+====
+Falls Sie die Variablen `USE_IMAKE`, `USE_X_PREFIX`, oder `MASTERDIR` definieren müssen, sollten Sie dies vor dem Einfügen von [.filename]#bsd.port.pre.mk# machen.
+====
+
+Hier sind ein paar Beispiele von Dingen, die Sie hinter die Anweisung [.filename]#bsd.port.pre.mk# schreiben können:
+
+[.programlisting]
+....
+# 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? :-).
+
+[[dads-sh-exec]]
+== Benutzen Sie die `exec`-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:
+
+[.programlisting]
+....
+#!/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.
+
+[[dads-rational]]
+== Aufgaben vernünftig lösen
+
+Das [.filename]#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 [.filename]#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.
+
+[[dads-cc]]
+== Berücksichtigen Sie sowohl `CC` als auch `CXX`
+
+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 [.filename]#Makefile# eingefügt werden.
+
+Im Folgenden wird ein Beispiel eines [.filename]##Makefile##s gezeigt, welches die beiden Variablen `CC` und `CXX` berücksichtigt. Beachten Sie das `?=`:
+
+[.programlisting]
+....
+CC?= gcc
+....
+
+[.programlisting]
+....
+CXX?= g++
+....
+
+Nachfolgend ein Beispiel, welches weder `CC` noch `CXX` berücksichtigt:
+
+[.programlisting]
+....
+CC= gcc
+....
+
+[.programlisting]
+....
+CXX= g++
+....
+
+Die Variablen `CC` und `CXX` können auf FreeBSD-Systemen in [.filename]#/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.
+
+[[dads-cflags]]
+== Berücksichtigen Sie `CFLAGS`
+
+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 [.filename]#Makefile# eingefügt werden.
+
+Im Folgenden wird ein Beispiel eines [.filename]##Makefile##s gezeigt, welches die Variable `CFLAGS` berücksichtigt. Beachten Sie das `+=`:
+
+[.programlisting]
+....
+CFLAGS+= -Wall -Werror
+....
+
+Nachfolgend finden Sie ein Beispiel, welches die `CFLAGS`-Variable nicht berücksichtigt:
+
+[.programlisting]
+....
+CFLAGS= -Wall -Werror
+....
+
+Die Variable `CFLAGS` wird auf FreeBSD-Systemen in [.filename]#/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 [.filename]##Makefile##s Dritter entfernen. Die `CFLAGS` des Systems beinhalten systemweite Optimierungsflags. Ein Beispiel eines unveränderten [.filename]##Makefile##s:
+
+[.programlisting]
+....
+CFLAGS= -O3 -funroll-loops -DHAVE_SOUND
+....
+
+Werden nun systemweite Optimierungsflags verwendet so würde das [.filename]#Makefile# in etwa folgendermaßen aussehen:
+
+[.programlisting]
+....
+CFLAGS+= -DHAVE_SOUND
+....
+
+[[dads-pthread]]
+== Threading-Bibliotheken
+
+Die Threading-Bibliothek muss mit Hilfe eines speziellen Linker-Flags `-pthread` in die Binärdateien unter FreeBSD 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 FreeBSD-Versionen abweichende Werte haben und daher sollte nie `-pthread` direkt in Patches geschrieben werden, sondern immer `PTHREAD_LIBS`.
+
+[NOTE]
+====
+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.
+====
+
+[[dads-freedback]]
+== 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.
+
+[[dads-readme]]
+== [.filename]#README.html#
+
+Nehmen Sie bitte keine [.filename]#README.html# in den Port auf. Diese Datei ist kein Bestandteil der CVS-Sammlung sondern wird durch `make readme` erzeugt.
+
+[[dads-noinstall]]
+== Einen Port durch `BROKEN`, `FORBIDDEN` oder `IGNORE` 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 [.filename]#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 [.filename]#Makefile# abhängt, wie <<build-cluster,der Ports-Build-Custer>>, <<freshports,FreshPorts>> und <<portsmon,portsmon>>.
+
+[[dads-noinstall-variables]]
+=== 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 [.filename]#${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 FreeBSD läuft
+** FreeBSD 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 package:www/apache21[] ab, aber package:www/apache13[] ist installiert)
++
+[NOTE]
+====
+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:
++
+[.programlisting]
+....
+ONLY_FOR_ARCHS= i386 amd64
+....
++
+[.programlisting]
+....
+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 [.filename]#/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.
+
+[[dads-noinstall-notes]]
+=== 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:
+
+[.programlisting]
+....
+BROKEN= this port is unsupported on FreeBSD 5.x
+....
+
+[.programlisting]
+....
+IGNORE= is unsupported on FreeBSD 5.x
+....
+
+resultieren in den folgenden Ausgaben von `make describe`:
+
+[.programlisting]
+....
+===> foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x.
+....
+
+[.programlisting]
+....
+===> foobar-0.1 is unsupported on FreeBSD 5.x.
+....
+
+[[dads-deprecated]]
+== Kennzeichnen eines Ports zur Entfernung durch `DEPRECATED` oder `EXPIRATION_DATE`
+
+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.
+
+[[dads-dot-error]]
+== Vermeiden Sie den Gebrauch des `.error`-Konstruktes
+
+Der korrekte Weg eines [.filename]#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 [.filename]#/usr/ports/INDEX# zu bauen auf (siehe <<make-describe>>). Jedoch schlagen auch trivialere Befehle wie `make maintainer` in diesem Fall fehl. Dies ist nicht akzeptabel!
+
+[[dot-error-breaks-index]]
+.Wie vermeidet man die Verwendung von `.error`
+[example]
+====
+Nehmen Sie an, dass die Zeile
+[.programlisting]
+....
+USE_POINTYHAT=yes
+....
+
+in [.filename]#make.conf# enthalten ist. Der erste der folgenden zwei [.filename]#Makefile#-Schnipsel lässt `make index` fehlschlagen, während der zweite dies nicht tut.
+
+[.programlisting]
+....
+.if USE_POINTYHAT
+.error "POINTYHAT is not supported"
+.endif
+....
+
+[.programlisting]
+....
+.if USE_POINTYHAT
+IGNORE=POINTYHAT is not supported
+.endif
+....
+
+====
+
+[[dads-sysctl]]
+== Verwendung von [.filename]#sysctl#
+
+Vom Gebrauch von sysctl wird, außer in Targets, abgeraten. Das liegt daran, dass die Auswertung aller ``makevar``s, 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.
+
+[[dads-rerolling-distfiles]]
+== 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 [.filename]#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.
+
+[[dads-misc]]
+== Verschiedenes
+
+Die Dateien [.filename]#pkg-descr# und [.filename]#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!
diff --git a/documentation/content/de/books/porters-handbook/porting-samplem/chapter.adoc b/documentation/content/de/books/porters-handbook/porting-samplem/chapter.adoc
new file mode 100644
index 0000000000..5514bc8772
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/porting-samplem/chapter.adoc
@@ -0,0 +1,116 @@
+---
+title: Kapitel 13. Beispiel eines Makefile
+prev: books/porters-handbook/porting-dads
+next: books/porters-handbook/keeping-up
+---
+
+[[porting-samplem]]
+= Beispiel eines [.filename]#Makefile#
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 13
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+Hier ein Beispiel für ein [.filename]#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 [.filename]##Makefile##s sollten Sie <<porting-portlint,portlint>> verwenden.
+
+[.programlisting]
+....
+[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>
+....
diff --git a/documentation/content/de/books/porters-handbook/quick-porting/chapter.adoc b/documentation/content/de/books/porters-handbook/quick-porting/chapter.adoc
new file mode 100644
index 0000000000..0d9c64edb5
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/quick-porting/chapter.adoc
@@ -0,0 +1,197 @@
+---
+title: Kapitel 3. Einen neuen Port erstellen
+prev: books/porters-handbook/own-port
+next: books/porters-handbook/slow
+---
+
+[[quick-porting]]
+= Einen neuen Port erstellen
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 3
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+Dieser Abschnitt beschreibt, wie Sie schnell einen neuen 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 [.filename]#/usr/ports/distfiles# ist.
+
+[NOTE]
+====
+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.
+====
+
+[[porting-makefile]]
+== Das Makefile schreiben
+
+Ein minimales [.filename]#Makefile# sieht in etwa so aus:
+
+[.programlisting]
+....
+# 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 <<porting-samplem,sample Makefile>>.
+
+[[porting-desc]]
+== 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 [.filename]#pkg-descr# und [.filename]#pkg-plist#. Der [.filename]#pkg-# Präfix unterscheidet sie von anderen Dateien.
+
+=== [.filename]#pkg-descr#
+
+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.
+
+[NOTE]
+====
+[.filename]#pkg-descr# enthält __keine__ Anleitung oder detaillierte Beschreibung wie der Port benutzt oder kompiliert wird! __Bitte seien Sie vorsichtig, wenn Sie aus dem [.filename]#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 [.filename]#pkg-descr# aussehen sollte:
+
+[.programlisting]
+....
+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#
+
+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 [.filename]#/usr/local# oder [.filename]#/usr/X11R6#). Wenn Sie die `MAN__n__`-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:
+
+[.programlisting]
+....
+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.
+
+[NOTE]
+====
+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.
+====
+
+[NOTE]
+====
+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, <<plist-autoplist,eine Packliste automatisch zu erstellen>>.
+====
+
+Es gibt nur einen Fall, in dem [.filename]#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 [.filename]#Makefile# aufgelistet werden. Zum Beispiel könnten wir im obigen Beispiel ohne [.filename]#pkg-plist# für den [.filename]#oneko#-Port auskommen, indem wir die folgenden Zeilen ins [.filename]#Makefile# einfügen:
+
+[.programlisting]
+....
+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 [.filename]#pkg-plist# benutzen.
+
+Später werden wir uns ansehen, wie [.filename]#pkg-plist# und `PLIST_FILES` benutzt werden können, um <<plist,anspruchsvollere Aufgaben>> zu erfüllen.
+
+[[porting-checksum]]
+== Die Checksummendatei erzeugen
+
+Geben Sie einfach `make makesum` ein. Die Regeln von Make sorgen dafür, dass die Datei [.filename]#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.
+
+[[porting-testing]]
+== 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.
+
+* [.filename]#pkg-plist# enthält nichts, das nicht von Ihrem Port installiert wurde.
+* [.filename]#pkg-plist# enthält alles, was von Ihrem Port installiert wurde.
+* Ihr Port kann mit Hilfe von `make reinstall` mehrmals installiert werden.
+* Ihr Port <<plist-cleaning,räumt>> bei der Deinstallation hinter sich auf.
+
+[.procedure]
+====
+*Procedure: 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 [.filename]#ports/ports-mgmt/tinderbox#
+
+[[porting-portlint]]
+== Ihren Port mit `portlint` überprüfen
+
+Bitte verwenden Sie `portlint`, um festzustellen, ob Ihr Port unseren Richtlinien entspricht. Das Programm package:ports-mgmt/portlint[] ist Teil der Ports-Sammlung. Stellen Sie vor allem sicher, dass das <<porting-samplem,Makefile>> in der richtigen Form und das <<porting-pkgname,Paket>> passend benannt ist.
+
+[[porting-submitting]]
+== Den neuen Port einreichen
+
+Bevor Sie den neuen Port einreichen, lesen Sie bitte unbedingt den Abschnitt <<porting-dads,DOs and DON'Ts>>.
+
+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 [.filename]#work#-Verzeichnis oder Ihr [.filename]#pkgname.tgz#-Paket - diese können Sie nun löschen. Wenn Ihr Port beispielsweise `oneko` heißt, wechseln Sie in das Verzeichnis, in dem sich das Verzeichnis `oneko` befindet und führen den Befehl `shar find oneko > oneko.shar` aus.
+
+Fügen Sie Ihre Datei `oneko.shar` einem Fehlerbericht an und senden Sie diesen mit Hilfe des Programms man:send-pr[1] (unter link:{contributing}#CONTRIB-GENERAL[ 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 die shar-Datei in das "Fix"-Feld ein (bespielsweise eine kurze Version des `COMMENT`).
+
+[NOTE]
+====
+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. 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 [.filename]#work#-Verzeichnis oder das Paket, das Sie mit `make package` erstellt haben, ein._ Und verwenden Sie man:shar[1] für neue Ports (und NICHT man:diff[1]).
+
+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 http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports[ Liste der PRs, 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 link:{contributors}#contrib-additional/[Additional FreeBSD Contributors] und in anderen Dateien auf. Ist das nicht toll?! :-)
diff --git a/documentation/content/de/books/porters-handbook/security/chapter.adoc b/documentation/content/de/books/porters-handbook/security/chapter.adoc
new file mode 100644
index 0000000000..89ac2886f7
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/security/chapter.adoc
@@ -0,0 +1,232 @@
+---
+title: Kapitel 11. Sicherheit der Ports
+prev: books/porters-handbook/port-upgrading
+next: books/porters-handbook/porting-dads
+---
+
+[[security]]
+= Sicherheit der Ports
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 11
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+[[security-intro]]
+== 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.
+
+[[security-fix]]
+== 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 <<dads-noinstall,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 <<port-upgrading,die Standardvorgehensweise zum Einreichen von Änderungen>> beachtet werden - es sei denn, Sie haben das Recht diese direkt in den Ports-Baum zu committen.
+
+[IMPORTANT]
+====
+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 <<makefile-naming-revepoch,betreffenden Abschnitt>> für weitere Informationen.
+
+[[security-notify]]
+== Die Community informiert halten
+
+[[security-notify-vuxml-db]]
+=== 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 http://vuxml.freebsd.org/[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 http://www.freebsd.org/security/#how[FreeBSD Sicherheitsinformationen] beschrieben wird.
+
+Wie vielleicht aus dem Titel hervorgeht, handelt es sich bei der VuXMl-Datenbank um ein XML-Dokument. Die Quelldatei [.filename]#vuln.xml# können Sie im Port package:security/vuxml[] finden. Deshalb wird der komplette Pfadname [.filename]#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.
+
+[[security-notify-vuxml-intro]]
+=== 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 (e__X__tensible) - 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:
+
+[.programlisting]
+....
+<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</modified> <.>
+ </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.
+
+<.> 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.
+
+<.> 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 http://www.freebsd.org/security/#adv[FreeBSD Sicherheitshinweis].
+<.> Das ist ein http://www.freebsd.org/support/#gnats[ FreeBSD Problembericht].
+<.> Das ist eine http://www.cve.mitre.org/[Mitre CVE] Kennung.
+<.> Das ist eine http://www.securityfocus.com/bid[SecurityFocus Fehler-Kennung].
+<.> Das ist ein Sicherheitshinweis von http://www.cert.org/[US-CERT].
+<.> Das ist eine Mitteilung über eine Schwachstelle von http://www.cert.org/[US-CERT].
+<.> Das ist ein Cyber-Sicherheitsalarm von http://www.cert.org/[US-CERT].
+<.> Das ist ein technischer Cyber-Sicherheitsalarm von http://www.cert.org/[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.
+
+[[security-notify-vuxml-testing]]
+=== 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 müssen Sie die aktuellen Versionen der Ports package:ports-mgmt/portaudit[], package:ports-mgmt/portaudit-db[] sowie package:security/vuxml[]_installieren_.
+
+[NOTE]
+====
+Um `packaudit` auszuführen, müssen Sie die Berechtigung haben [.filename]#DATABASEDIR# zu schreiben - üblicherweise ist das [.filename]#/var/db/portaudit#.
+
+Durch Setzen der Umgebungsvariable [.filename]#DATABASEDIR# können Sie hier auch ein anderes Verzeichnis angeben.
+
+Arbeiten Sie nicht aus dem Verzeichnis [.filename]#${PORTSDIR}/security/vuxml# heraus, müssen Sie zusätzlich die Umgebungsvariable [.filename]#VUXMLDIR# setzen, um anzugeben, in welchem Verzeichnis sich die Datei [.filename]#vuln.xml# befindet.
+====
+
+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:
+
+[source,bash]
+....
+% packaudit
+% portaudit clamav-0.65_6
+....
+
+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:
+
+[source,bash]
+....
+% cd ${PORTSDIR}/security/vuxml && make validate
+....
+
+[NOTE]
+====
+Sie werden zumindest eines der folgenden Pakete benötigen: package:textproc/libxml2[], package:textproc/jade[].
+====
+
+Jetzt bauen Sie bitte die `portaudit`-Datenbank aus der VuXML-Datei neu:
+
+[source,bash]
+....
+% packaudit
+....
+
+Um sicherzustellen, dass der Abschnitt `<affected>` Ihres Eintrags die richtigen Pakete betrifft, verwenden Sie bitte den folgenden Befehl:
+
+[source,bash]
+....
+% portaudit -f /usr/ports/INDEX -r 74a9541d-5d6c-11d8-80e3-0020ed76ef5a
+....
+
+[NOTE]
+====
+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:
+
+[source,bash]
+....
+% 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:
+
+[source,bash]
+....
+% mkdir -p ~/public_html/portaudit
+% packaudit
+% lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html
+....
diff --git a/documentation/content/de/books/porters-handbook/slow/chapter.adoc b/documentation/content/de/books/porters-handbook/slow/chapter.adoc
new file mode 100644
index 0000000000..75bf69693a
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/slow/chapter.adoc
@@ -0,0 +1,143 @@
+---
+title: Kapitel 4. Einen Port in aller Ruhe erstellen
+prev: books/porters-handbook/quick-porting
+next: books/porters-handbook/makefile
+---
+
+[[slow]]
+= Einen Port in aller Ruhe erstellen
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 4
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+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.
+
+[[slow-work]]
+== 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 [.filename]#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 [.filename]#bsd.port.mk# macht, die Wenigsten begreifen dies... _:>_
+
+[.procedure]
+====
+. 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 link:ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles[ 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 [.filename]#work#).
+. Das Target `patch` wird aufgerufen. Zuerst werden alle in `PATCHFILES` festgelegten Patches eingespielt. Anschließend werden, falls Patches der Form [.filename]#patch-*# in `PATCHDIR` (standardmäßig das [.filename]#files#-Unterverzeichnis) gefunden werden, diese in alphabetischer Reihenfolge eingespielt.
+. Das Target `configure` wird aufgerufen. Dieses kann viele verschiedene Dinge machen.
+.. Existiert [.filename]#scripts/configure#, so wird es aufgerufen.
+.. Falls `HAS_CONFIGURE` oder `GNU_CONFIGURE` gesetzt sind, wird [.filename]#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 [.filename]#scripts#-Unterverzeichnis legen. Sie werden dann vor bzw. nach den Standardaktionen aufgerufen.
+
+Angenommen Sie haben das Target `post-extract` in Ihrem [.filename]#Makefile# definiert und eine Datei [.filename]#pre-build# im [.filename]#scripts# Unterverzeichnis, so wird das Target `post-extract` nach dem normalen Entpacken aufgerufen und das Skript [.filename]#pre-build# ausgeführt, bevor die vordefinierten Bau-Regeln abgearbeitet sind. Es wird empfohlen, dass Sie [.filename]#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 [.filename]#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 [.filename]#Makefile# neu definieren.
+
+[NOTE]
+====
+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.
+
+[[slow-sources]]
+== Den originalen Quelltext besorgen
+
+Normalerweise liegt der original Quelltext als gepackte Datei ([.filename]#foo.tar.gz# oder [.filename]#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 [.filename]#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 [.filename]#~/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 <<porting-patchfiles,PATCHFILES >>).
+
+[[slow-modifying]]
+== 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.
+
+[NOTE]
+====
+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.
+====
+
+[[slow-patch]]
+== 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 [.filename]#patch-*# abgelegt werden, wobei _*_ dem Pfadnamen der zu korrigierenden Datei entspricht, wie er auch in [.filename]#patch-Imakefile# oder im [.filename]#patch-src-config.h# erscheint. Diese Dateien sollten in `PATCHDIR` (normalerweise [.filename]#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. [.filename]#patch-file# und [.filename]#patch-file2#, welche beide [.filename]#WRKSRC/foobar.c# verändern). Beachten Sie, dass, falls der Pfad einer zu korrigierenden Datei einen Unterstrich (`_`) enthält, der Patch stattdessen zwei Unterstriche im Namen haben muss. Zum Beispiel muss der Patch, der eine Datei namens [.filename]#src/freeglut_joystick.c# korrigieren soll, [.filename]#patch-src-freeglut__joystick.c# genannt werden.
+
+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 [.filename]#patch-aa# oder [.filename]#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 (`-r`) 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, [.filename]##Makefile##s oder wenn der Port `Imake` oder GNU `configure` usw. nutzt, überflüssig sind und entfernt werden sollten. Falls es es notwendig war, [.filename]##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 [.filename]##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 [.filename]#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:
+
+[.programlisting]
+....
+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(R) 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 [.filename]#Makefile# des Ports geschrieben werden. Hierzu kann eine Liste der zu konvertierenden Dateien erstellt werden:
+
+[.programlisting]
+....
+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:
+
+[.programlisting]
+....
+USE_DOS2UNIX= yes
+ DOS2UNIX_REGEX= .*\.(c|cpp|h)
+....
+
+Wenn Sie einen Patch zu einer bereits existierenden Datei erstellen wollen, können Sie von ihr eine Kopie mit der Endung [.filename]#.orig# erstellen und anschließend die Originaldatei bearbeiten. Das make-Ziel `makepatch` führt dann zu einer entsprechenden Patch-Datei im Verzeichnis [.filename]#files# des Ports.
+
+[[slow-configure]]
+== Konfigurieren
+
+Fügen Sie alle zusätzlichen Veränderungsbefehle Ihrem Skript [.filename]#configure# hinzu und speichern Sie es im [.filename]#scripts#-Unterverzeichnis. Wie vorstehend schon erwähnt, können Sie dies auch mit den Targets [.filename]#Makefile# und/oder Skripte mit dem Namen [.filename]#pre-configure# oder [.filename]#post-configure# erledigen.
+
+[[slow-user-input]]
+== Handhabung von Benutzereingaben
+
+Sollte der Port Eingaben vom Benutzer benötigen, muss `IS_INTERACTIVE` im [.filename]#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.
diff --git a/documentation/content/de/books/porters-handbook/special/chapter.adoc b/documentation/content/de/books/porters-handbook/special/chapter.adoc
new file mode 100644
index 0000000000..1e04e57229
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/special/chapter.adoc
@@ -0,0 +1,2217 @@
+---
+title: Kapitel 6. Besonderheiten
+prev: books/porters-handbook/makefile
+next: books/porters-handbook/plist
+---
+
+[[special]]
+= Besonderheiten
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 6
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+Es gibt einige Dinge mehr, die zu beachten sind, wenn man einen Port erstellt. Dieser Abschnitt erklärt die wichtigsten.
+
+[[porting-shlibs]]
+== Shared-Libraries
+
+Wenn Ihr Port eine oder mehrere Shared-Libraries installiert, dann definieren Sie bitte eine `USE_LDCONFIG` make-Variable, die [.filename]#bsd.port.mk# anweisen wird, `${LDCONFIG} -m` auf das Verzeichnis, in das die neue Library installiert wird (normalerweise [.filename]#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 [.filename]#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.
+
+[.programlisting]
+....
+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 [.filename]#PREFIX/lib/foo# und [.filename]#PREFIX/lib/bar# installiert, könnten Sie folgendes in Ihrem [.filename]#Makefile# benutzen:
+
+[.programlisting]
+....
+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. package: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 package:www/seamonkey[] tut.
+
+Wenn Sie 32-Bit Libraries auf 64-Bit Systemen installieren, benutzen Sie stattdessen `USE_LDCONFIG32`.
+
+Versuchen Sie Shared-Library-Versionsnummern im [.filename]#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.
+
+[[porting-restrictions]]
+== 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.
+
+[IMPORTANT]
+====
+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 {freebsd-ports}.
+====
+
+In solchen Situationen können die in den folgenden Abschnitten beschriebenen Variablen gesetzt werden.
+
+=== `NO_PACKAGE`
+
+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.
+
+=== `NO_CDROM`
+
+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.
+
+=== `NOFETCHFILES`
+
+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.
+
+=== `RESTRICTED`
+
+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.
+
+=== `RESTRICTED_FILES`
+
+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 [.filename]#/usr/ports/LEGAL# hinzufügen sollte, der genau beschreibt, was die Beschränkung mit sich bringt.
+
+[[building]]
+== Build-Mechanismen
+
+[[parallel-builds]]
+=== Paralleles Bauen von Ports
+
+Das Ports-Framework von FreeBSD unterstützt das parallele Bauen von Ports, indem es mehrere `make`-Instanzen ausführt, damit SMP-Systeme ihre gesamte CPU-Rechenleistung ausnützen können und so das Bauen von Ports schneller und effektiver werden kann.
+
+Dies ermöglicht der Parameter `-jX` an man:make[1], wenn Code von Drittanbietern kompiliert wird. Leider können nicht alle Ports wirklich gut mit dem Parallelbau umgehen. Deshalb ist es erforderlich, dass dieses Feature explizit durch `MAKE_JOBS_SAFE=yes` irgendwo unterhalb des Abschnitts für Abhängigkeiten im [.filename]#Makefile# aktiviert wird.
+
+Eine weitere Möglichkeit im Umgang mit dieser Option besteht für den Maintainer darin, `MAKE_JOBS_UNSAFE=yes` zu setzen. Diese Variable wird dann verwendet, wenn ein Port bekannterweise mit `-jX` nicht gebaut werden kann, der Benutzer jedoch für alle Ports den Mehrprozessorbau durch `FORCE_MAKE_JOBS=yes` in [.filename]#/etc/make.conf# erzwingt.
+
+[[using-make]]
+=== `make`, `gmake` und `imake`
+
+Wenn Ihr Port GNU make benutzt, dann setzen Sie bitte `USE_GMAKE=yes`.
+
+.Port-Variablen im Zusammenhang mit gmake
+[cols="1,1", frame="none", options="header"]
+|===
+| 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 [.filename]#Makefile#-Dateien aus [.filename]#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 `-a` 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 [.filename]#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`.
+
+[[using-configure]]
+=== `configure` Skript
+
+Wenn Ihr Port ein `configure`-Skript benutzt, um [.filename]#Makefile#-Dateien aus [.filename]#Makefile.in#-Dateien zu erzeugen, setzen Sie `GNU_CONFIGURE=yes`. Wenn Sie dem `configure`-Skript zusätzliche Argumente übergeben wollen (das Vorgabeargument ist `--prefix=${PREFIX} --infodir=${PREFIX}/${INFO_PATH} --mandir=${MANPREFIX}/man --build=${CONFIGURE_TARGET}`), setzen Sie diese zusätzlichen Argumente in `CONFIGURE_ARGS`. Zusätzliche Umgebungsvariablen können überdie Variable `CONFIGURE_ENV` übergeben werden.
+
+.Variablen für Ports, die `configure` benutzen
+[cols="1,1", frame="none", options="header"]
+|===
+| 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}`.
+|===
+
+[[using-scons]]
+=== Benutzung von `scons`
+
+Wenn Ihr Port SCons benutzt, definieren Sie `USE_SCONS=yes`.
+
+.Variablen für Ports, die `scons` benutzen
+[cols="1,1", frame="none", options="header"]
+|===
+| 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 [.filename]#SConstruct# im Quelltext alles, was SCons in `SCONS_ENV` übergeben wird, respektieren zu lassen (das ist hauptsächlich `CC/CXX/CFLAGS/CXXFLAGS`), patchen Sie [.filename]#SConstruct#, sodass das Build `Environment` wie folgt konstruiert wird:
+
+[.programlisting]
+....
+env = Environment(**ARGUMENTS)
+....
+
+Es kann dann mit `env.Append` und `env.Replace` modifiziert werden.
+
+[[using-autotools]]
+== Benutzung von GNU autotools
+
+[[using-autotools-introduction]]
+=== 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:
+
+[.programlisting]
+....
+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.
+
+[[using-libtool]]
+=== `libtool`
+
+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:
+
+[.programlisting]
+....
+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 [.filename]#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 [.filename]#bsd.autotools.mk#.
+
+[[using-libltdl]]
+=== `libltdl`
+
+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.
+
+[.programlisting]
+....
+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.
+
+[[using-autoconf]]
+=== `autoconf` und `autoheader`
+
+Manche Ports enthalten kein Konfigurationsskript, sondern eine autoconf-Vorlage in der [.filename]#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.
+
+[.programlisting]
+....
+USE_AUTOTOOLS= autoconf:version[:env]
+....
+
+und
+
+[.programlisting]
+....
+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 [.filename]#Makefile# des Ports ausser Kraft gesetzt werden, wenn erforderlich. Wie bei den `libtool`-Äquivalenten werden die meisten Ports dies aber nicht benötigen.
+
+[[using-automake]]
+=== `automake` und `aclocal`
+
+Manche Pakete enthalten nur [.filename]#Makefile.am#-Dateien. Diese müssen durch `automake` in [.filename]#Makefile.in#-Dateien konvertiert und dann durch `configure` weiterbearbeitet werden, um schließlich ein [.filename]#Makefile# zu erzeugen.
+
+Ähnliches gilt für Pakete, die gelegentlich keine [.filename]#aclocal.m4#-Dateien mitliefern, welche ebenfalls zum Erstellen der Software benötigt werden. Diese können durch `aclocal` erzeugt werden, welches [.filename]#configure.ac# oder [.filename]#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:
+
+[.programlisting]
+....
+USE_AUTOTOOLS= automake:version[:env]
+....
+
+und
+
+[.programlisting]
+....
+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 [.filename]#Makefile# des Ports, falls nötig, außer Kraft gesetzt werden kann.
+
+[[using-gettext]]
+== Benutzung von GNU `gettext`
+
+=== Grundlegende Benutzung
+
+Wenn Ihr Port `gettext` benötigt, setzen Sie einfach `USE_GETTEXT` auf `yes`, und Ihr Port bekommt die Abhängigkeit von package: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 package: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:
+
+[.programlisting]
+....
+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:
+
+[.programlisting]
+....
+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 `--disable-nls` an `configure`. In diesem Fall sollte Ihr Port `gettext` abhängig vom Status von <<knobs-without-nls,`WITHOUT_NLS`>> benutzen. Für Ports mit niedriger bis mittlerer Komplexität können Sie sich auf das folgende Idiom verlassen:
+
+[.programlisting]
+....
+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 [.filename]#Makefile#-Teil dieser Aufgabe ist schon durch obiges Idiom erledigt. Das wird im Abschnitt über <<plist-sub,Fortgeschrittene [.filename]#pkg-plist#-Methoden>> erklärt. Kurz gesagt, jedes Vorkommen von `%%NLS%%` in [.filename]#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 [.filename]#pkg-plist# einzufügen. Zum Beispiel:
+
+[.programlisting]
+....
+%%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. <<plist-dynamic,Dynamische Packlistenerzeugung>>.
+
+=== Behandlung von Message-Catalog-Verzeichnissen
+
+Bei der Installation von Message-Catalog-Dateien gibt es einen Punkt zu beachten. Ihr Zielverzeichnis, das unter [.filename]#LOCALBASE/shared/locale# liegt, sollte nur selten von Ihrem Port erzeugt und gelöscht werden. Die Verzeichnisse für die gebräuchlichsten Sprachen sind in [.filename]#/etc/mtree/BSD.local.dist# aufgelistet; das heisst, sie sind Teil des Systems. Die Verzeichnisse für viele andere Sprachen sind Teil des Ports package:devel/gettext[]. Sie wollen vielleicht dessen [.filename]#pkg-plist# zur Hand nehmen, um festzustellen, ob Ihr Port eine Message-Catalog-Datei für eine seltene Sprache installiert.
+
+[[using-perl]]
+== Die Benutzung von `perl`
+
+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 http://cpan.org/modules/by-module/[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 `perl` benutzen
+[cols="1,1", frame="none", options="header"]
+|===
+| 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`.
+|===
+
+[NOTE]
+====
+Ports von Perl-Modulen, die keine offizielle Webseite haben, sollen in der WWW-Zeile ihrer [.filename]#pkg-descr#-Datei auf `cpan.org` verlinken. Die bevorzugte URL-Form ist `http://search.cpan.org/dist/Module-Name/` (inklusive des Slash am Ende).
+====
+
+[[using-x11]]
+== Benutzung von X11
+
+[[x11-variables]]
+=== 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 [.filename]#/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, glew, gl` und `linux`. Für Abwärtskompatibilität gilt der Wert `yes` als `glu`.
+
+[[use-xorg-example]]
+.Beispiel für USE_XORG
+[example]
+====
+[.programlisting]
+....
+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
+[cols="1,1", frame="none"]
+|===
+|`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
+[cols="1,1", frame="none"]
+|===
+|`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(R)-Schriftarten bereitstellt.
+
+|`X_FONTS_TYPE1_PORT`
+|Ein Port, der Type1-Schriftarten bereitstellt.
+
+|`X_MANUALS_PORT`
+|Ein Port, der entwicklerorientierte Manualpages bereitstellt.
+|===
+
+[[using-x11-vars]]
+.Benutzung von X11-bezogenen Variablen in einem Port
+[example]
+====
+[.programlisting]
+....
+# Port benutzt X11-Bibliotheken und hängt vom Font-Server sowie
+# von kyrillischen Schriftarten ab.
+RUN_DEPENDS= ${LOCALBASE}/bin/xfs:${X_FONTSERVER_PORT} \
+ ${LOCALBASE}/lib/X11/fonts/cyrillic/crox1c.pcf.gz:${X_FONTS_CYRILLIC_PORT}
+
+USE_XORG= x11 xpm
+....
+
+====
+
+[[x11-motif]]
+=== Ports, die Motif benötigen
+
+Wenn Ihr Port eine Motif-Bibliothek benötigt, definieren Sie `USE_MOTIF` im [.filename]#Makefile#. Die Standard-Motif-Implementierung ist package:x11-toolkits/open-motif[]. Benutzer können stattdessen package:x11-toolkits/lesstif[] wählen, indem Sie die `WANT_LESSTIF`-Variable setzen.
+
+Die Variable `MOTIFLIB` wird von [.filename]#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 [.filename]#Makefile# oder [.filename]#Imakefile# referenziert wird.
+
+Es gibt zwei verbreitete Fälle:
+
+* Wenn sich der Port in seinem [.filename]#Makefile# oder [.filename]#Imakefile# auf die Motif-Bibliothek als `-lXm` bezieht, ersetzen Sie das einfach durch `${MOTIFLIB}`.
+* Wenn der Port in seinem [.filename]#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 [.filename]#LOCALBASE/lib/X11/fonts/local#.
+
+=== Erzeugen eines künstlichen `DISPLAY` durch Xvfb
+
+Manche Applikationen benötigen ein funktionierendes X11-Display, damit die Kompilierung funktioniert. Das stellt für Systeme, die ohne Display laufen, ein Problem dar. Wenn die folgende Variable benutzt wird, startet die Bauumgebung den virtuellen Framebuffer-X-Server, und ein funktionierendes `DISPLAY` wird dem Build übergeben.
+
+[.programlisting]
+....
+USE_DISPLAY= yes
+....
+
+[[desktop-entries]]
+=== Desktop-Einträge
+
+Desktop-Einträge (http://standards.freedesktop.org/desktop-entry-spec/latest/[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 [.filename]#.desktop#-Datei wird dann automatisch erzeugt, installiert und der [.filename]#pkg-plist# hinzugefügt. Die Syntax ist:
+
+[.programlisting]
+....
+DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify
+....
+
+Die Liste der möglichen Kategorien ist auf der http://standards.freedesktop.org/menu-spec/latest/apa.html[Freedesktop Webseite] abrufbar. `StartupNotify` zeigt an, ob die Applikation den Status in Umgebungen, die Startup-Notifications kennen, löschen wird.
+
+Beispiel:
+
+[.programlisting]
+....
+DESKTOP_ENTRIES= "ToME" "Roguelike game based on JRR Tolkien's work" \
+ "${DATADIR}/xtra/graf/tome-128.png" \
+ "tome -v -g" "Application;Game;RolePlaying;" \
+ false
+....
+
+[[using-gnome]]
+== Benutzung von GNOME
+
+Das FreeBSD/GNOME-Projekt benutzt seine eigene Gruppe von Variablen, um zu definieren, welche GNOME-Komponenten ein bestimmter Port benutzt. Eine http://www.FreeBSD.org/gnome/docs/porting/[ umfassende Liste dieser Variablen] existiert innerhalb der Webseite des FreeBSD/GNOME-Projektes.
+
+[[using-qt]]
+== Benutzung von Qt
+
+[[qt-common]]
+=== Ports, die Qt benötigen
+
+.Variablen für Ports, die Qt benötigen
+[cols="1,1", frame="none"]
+|===
+|`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
+[cols="1,1", frame="none"]
+|===
+|`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:
+
+[.programlisting]
+....
+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:
+
+[.programlisting]
+....
+CONFIGURE_ENV+= UIC="${UIC}" QMAKE="${QMAKE}" QMAKESPEC="${QMAKESPEC}"
+MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"
+....
+
+[[qt4-components]]
+=== 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 [.filename]#/usr/ports/Mk/bsd.qt.mk# aufgelistet):
+
+.Verfügbare Qt4-Bibliothekskomponenten
+[cols="1,1", frame="none", options="header"]
+|===
+| 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
+[cols="1,1", frame="none", options="header"]
+|===
+| 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 [.filename]#*.rc# oder [.filename]#*.qrc# Dateien enthält)
+
+|`uic`
+|User-Interface-Compiler (wird benötigt, falls die Applikation von Qt-Designer erzeugte [.filename]#*.ui# Dateien enthält - gilt für praktisch jede Qt-Applikation mit einer GUI)
+|===
+
+.Verfügbare Qt4-Plugin-Komponenten
+[cols="1,1", frame="none", options="header"]
+|===
+| 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-components-example]]
+.Qt4-Komponenten auswählen
+[example]
+====
+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`:
+
+[.programlisting]
+....
+USE_QT_VER= 4
+QT_COMPONENTS= gui moc_build qmake_build rcc_build uic_build
+....
+
+====
+
+[[qt-additional]]
+=== Zusätzliche Besonderheiten
+
+Wenn die Applikation keine [.filename]#configure# Datei, sondern eine [.filename]#.pro# Datei hat, können Sie das Folgende benutzen:
+
+[.programlisting]
+....
+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 [.filename]#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.:
++
+[.programlisting]
+....
+${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. package:editors/texmaker[] ist hierfür ein Beispiel- siehe [.filename]#patch-texmaker.pro# im [.filename]#files#-Verzeichnis dieses Ports als eine Vorlage, die zeigt, wie man dies direkt in der Qmake Projektdatei löst.
+
+[[using-kde]]
+== Benutzung von KDE
+
+[[kde-variables]]
+=== Variablen-Definitionen (KDE 3)
+
+.Variablen für Ports, die KDE 3 benutzen
+[cols="1,1", frame="none"]
+|===
+|`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`.
+|===
+
+[[kde4-variables]]
+=== Variablen-Definitionen (KDE 4)
+
+Falls Ihre Anwendung von KDE 4 abhängt, weisen Sie `USE_KDE4` eine Liste mit benötigten Komponenten zu. Die am häufigsten gebrauchten sind unten aufgelistet (`_USE_KDE4_ALL` in [.filename]#/usr/ports/Mk/bsd.kde4.mk# enthält stets die aktuelle Liste):
+
+.Verfügbare KDE 4-Komponenten
+[cols="1,1", frame="none", options="header"]
+|===
+| Name
+| Beschreibung
+
+|`akonadi`
+|Personal Information Management (PIM)-Speicherdienst
+
+|`automoc4`
+|Lässt den Port das Bauwerkzeug automoc4 verwenden.
+
+|`kdebase`
+|Grundlegende KDE-Anwendungen (Konqueror, Dolphin, Konsole)
+
+|`kdeexp`
+|Experimentelle KDE-Bibliotheken (mit einer API, die als non-stable eingestuft ist)
+
+|`kdehier`
+|Stellt allgemeine KDE-Verzeichnisse bereit
+
+|`kdelibs`
+|Die grundlegenden KDE-Bibliotheken
+
+|`kdeprefix`
+|Falls in der Liste vorhanden, wird der Port unter `${KDE4_PREFIX}` statt `${LOCALBASE}` installiert
+
+|`pimlibs`
+|PIM-Bibliotheken
+
+|`workspace`
+|Anwendungen und Bibliotheken, welche die Desktopumgebung gestalten (Plasma, KWin)
+|===
+
+KDE 4-Ports werden unter `${KDE4_PREFIX}`, zur Zeit [.filename]#/usr/local/kde4#, installiert, um Konflikte mit KDE 3-Ports zu verhindern. Dies wird durch Auflisten der Komponente `kdeprefix` erreicht, welche die standardmäßig gesetzte Variable `PREFIX` überschreibt. Die Ports übernehmen jedoch, jeden über die Umgebungsvariable `MAKEFLAGS` oder make-Parameter festgelegten Wert für `PREFIX`.
+
+Es könnte bei der Installation von KDE 4-Ports zu Konflikten mit KDE 3-Ports kommen, sodass diese bei aktivierter `kdeprefix`-Komponente unter `${KDE4_PREFIX}` installiert werden. Der Standardwert von `KDE4_PREFIX` ist zur Zeit [.filename]#/usr/local/kde4#. Es ist auch möglich, KDE 4-Ports unter einem angepassten `PREFIX` zu installieren. Wenn `PREFIX` als `MAKEFLAGS`-Umgebungsvariable oder als make-Parameter gesetzt wird, überschreibt dies den von `kdeprefix` festgelegten Wert.
+
+[[kde4-components-example]]
+.`USE_KDE4`-Beispiel
+[example]
+====
+Dies ist ein einfaches Beispiel für einen KDE 4-Port. `USE_CMAKE` weist den Port an, CMake, ein unter KDE 4-Projekten weit verbreitetes Konfigurationswerkzeug, zu verwenden. `USE_KDE4` legt die Abhängigkeit von KDE-Bibliotheken und die Verwendung von automoc4 während der Kompilierung fest. Mit Hilfe des configure-Protokolls können die KDE-Komponenten und andere Abhängigkeiten festgestellt werden. `USE_KDE4` impliziert `USE_QT_VER` nicht. Falls der Port Qt 4-Komponenten benötigt, sollten `USE_QT_VER` gesetzt und verlangte Komponenten festgelegt werden.
+
+[.programlisting]
+....
+USE_CMAKE= yes
+USE_KDE4= automoc4 kdelibs kdeprefix
+USE_QT_VER= 4
+QT_COMPONENTS= qmake_build moc_build rcc_build uic_build
+....
+
+====
+
+[[using-java]]
+== Benutzung von Java
+
+[[java-variables]]
+=== Variablen-Definitionen
+
+Wenn Ihr Port ein Java(TM) Development Kit (JDK(TM)) 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 package:java/jdk16[].
+
+.Variablen, die von Ports, die Java benutzen, gesetzt werden müssen
+[cols="1,1", frame="none", options="header"]
+|===
+| 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.5[+] 1.6[+] 1.7[+]`).
+
+|`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 openjdk`).
+
+|`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.
+|===
+
+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
+[cols="1,1", frame="none", options="header"]
+|===
+| Variable
+| Wert
+
+|`JAVA_PORT`
+|Der Name des JDK-Ports (z.B. `'java/diablo-jdk16'`).
+
+|`JAVA_PORT_VERSION`
+|Die volle Version des JDK Ports (z.B. `'1.6.0'`). 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. `'native'`).
+
+|`JAVA_PORT_VENDOR`
+|Der Anbieter des JDK-Ports (z.B. `'freebsd'`).
+
+|`JAVA_PORT_OS_DESCRIPTION`
+|Beschreibung des vom JDK-Port benutzten Betriebssystems (z.B. `'Native'`).
+
+|`JAVA_PORT_VENDOR_DESCRIPTION`
+|Beschreibung des Anbieters des JDK-Ports (z.B. `'FreeBSD Foundation'`).
+
+|`JAVA_HOME`
+|Pfad zum Installationsverzeichnis des JDK (z.B. [.filename]#'/usr/local/diablo-jdk1.6.0'#).
+
+|`JAVAC`
+|Pfad zum Java-Compiler, der benutzt werden soll (z.B. [.filename]#'/usr/local/diablo-jdk1.6.0/bin/javac'#.
+
+|`JAR`
+|Pfad zum `jar`-Werkzeug, das benutzt werden soll (z.B.'[.filename]#'/usr/local/diablo-jdk1.6.0/bin/jar# oder [.filename]#'/usr/local/bin/fastjar'#).
+
+|`APPLETVIEWER`
+|Pfad zum `appletviewer`-Werkzeug (z.B. [.filename]#'/usr/local/diablo-jdk1.6.0/bin/appletviewer'#).
+
+|`JAVA`
+|Pfad zur `java` Binärdatei. Benutzen Sie dies, um Java-Programme auszuführen (z.B.[.filename]#'/usr/local/diablo-jdk1.6.0/bin/java'#).
+
+|`JAVADOC`
+|Pfad zum `javadoc`-Werkzeug.
+
+|`JAVAH`
+|Pfad zum `javah`-Programm.
+
+|`JAVAP`
+|Pfad zum `javap`-Programm.
+
+|`JAVA_KEYTOOL`
+|Pfad zum `keytool`-Werkzeug.
+
+|`JAVA_N2A`
+|Pfad zum `native2ascii`-Werkzeug.
+
+|`JAVA_POLICYTOOL`
+|Pfad zum `policytool` Programm.
+
+|`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`.
+
+|`JAVA_CLASSES`
+|Pfad zum Archiv, das die JDK-Klassendateien enthält, [.filename]#${JAVA_HOME}/jre/lib/rt.jar#.
+|===
+
+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
+[cols="1,1", frame="none", options="header"]
+|===
+| Konstante
+| Wert
+
+|`JAVASHAREDIR`
+|Das Basis-Verzeichnis für alles, was mit Java zusammenhängt. Standardmäßig [.filename]#${PREFIX}/shared/java#.
+
+|`JAVAJARDIR`
+|Das Verzeichnis, wohin JAR-Dateien installiert werden sollen. Standardmäßig [.filename]#${JAVASHAREDIR}/classes#.
+
+|`JAVALIBDIR`
+|Das Verzeichnis, in dem JAR-Dateien, die von anderen Ports installiert wurden, liegen. Standardmäßig [.filename]#${LOCALBASE}/shared/java/classes#.
+|===
+
+Die entsprechenden Einträge sind sowohl in `PLIST_SUB` (dokumentiert in <<plist-sub>>) als auch in `SUB_LIST` definiert.
+
+[[java-building-with-ant]]
+=== 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_TARGET` aufruft. Das ähnelt dem `USE_GMAKE`-Mechanismus, der in <<building>> dokumentiert ist.
+
+[[java-best-practices]]
+=== Optimales Verfahren
+
+Wenn Sie eine Java-Bibliothek portieren, sollte Ihr Port die JAR-Datei(en) in [.filename]#${JAVAJARDIR}# installieren, und alles andere unter [.filename]#${JAVASHAREDIR}/${PORTNAME}# (ausgenommen die Dokumentation - siehe unten). Um die Größe der Packlistendatei zu reduzieren, können die JAR-Datei(en) direkt im [.filename]#Makefile# angegeben werden. Benutzen Sie einfach die folgende Anweisung (wobei [.filename]#myport.jar# der Name der JAR-Datei ist, die als Teil des Ports installiert wird):
+
+[.programlisting]
+....
+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 [.filename]#${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 [.filename]#${JAVAJARDIR}#) benutzen soll.
+
+Unabhängig von der Art Ihres Ports (Bibliothek oder Applikation), sollte die zusätzliche Dokumentation an die <<install-documentation,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 ([.filename]#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 [.filename]#pkg-plist# befürwortet die Benutzung von `PORTDOCS`.
+
+Der Vorgabewert für `DATADIR` ist [.filename]#${PREFIX}/shared/${PORTNAME}#. Es ist eine gute Idee, `DATADIR` für Java-Ports stattdessen auf [.filename]#${JAVASHAREDIR}/${PORTNAME}# zu setzen. In der Tat wird `DATADIR` automatisch zu `PLIST_SUB` (dokumentiert in <<plist-sub>>) hinzugefügt, d.h. Sie können `%%DATADIR%%` direkt in [.filename]#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 http://www.freebsd.org/java/[FreeBSD 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 [.filename]#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 http://www.freebsd.org/cgi/cvsweb.cgi/ports/Mk/bsd.java.mk[ 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 freebsd-java.
+
+Obwohl es eine `java`-Kategorie für Fehlerberichte gibt, bezieht sich diese auf die JDK-Portierungsbemühungen des FreeBSD 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 [.filename]#bsd.java.mk#.
+
+Gleichermaßen gibt es eine definierte Richtlinie für die `CATEGORIES` eines Java-Ports, die in <<makefile-categories>> erklärt wird.
+
+[[using-php]]
+== Webanwendungen, Apache und PHP
+
+[[using-apache]]
+=== Apache
+
+.Variablen für Ports, die Apache verwenden
+[cols="1,1", frame="none"]
+|===
+|`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 [.filename]#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
+[cols="1,1", frame="none"]
+|===
+|`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 [.filename]#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`.
+|===
+
+[[web-apps]]
+=== Webanwendungen
+
+Webanwendungen sollten nach [.filename]#PREFIX/www/programmname# installiert werden. Der Einfachheit halber ist dieser Pfad sowohl im [.filename]#Makefile# als auch in [.filename]#pkg-plist# als `WWWDIR` verfügbar. Der relative Pfad `PREFIX` ist hingegen im [.filename]#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-variables]]
+=== PHP
+
+.Variablen für Ports, die PHP verwenden
+[cols="1,1", frame="none"]
+|===
+|`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 [.filename]#pkg-plist# hinzugefügt.
+
+Die Datei [.filename]#${PORTSDIR}/devel/pear/bsd.pear.mk# muss am Ende des [.filename]##Makefile##s eingebunden werden.
+
+[[pear-makefile]]
+.Beispiel eines Makefiles für eine PEAR Klasse
+[example]
+====
+[.programlisting]
+....
+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>
+....
+
+====
+
+[[using-python]]
+== 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.
+
+[.programlisting]
+....
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+....
+
+.Nützliche Variablen für Ports, die Python verwenden
+[cols="1,1", frame="none"]
+|===
+|`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 [.filename]#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 [.filename]#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 [.filename]#/usr/ports/Mk/bsd.python.mk# zu finden.
+
+[[using-tcl]]
+== Benutzung von Tcl/Tk
+
+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 Tcl/Tk benutzen
+[cols="1,1", frame="none"]
+|===
+|`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 [.filename]#/usr/ports/Mk/bsd.tcl.mk#.
+
+[[using-emacs]]
+== Emacs benutzen
+
+Dieser Abschnitt muss noch geschrieben werden.
+
+[[using-ruby]]
+== Ruby benutzen
+
+.Nützliche Variablen für Ports, die Ruby verwenden
+[cols="1,1", frame="none", options="header"]
+|===
+| Variable
+| Description
+
+|`USE_RUBY`
+|Der Port benötigt Ruby.
+
+|`USE_RUBY_EXTCONF`
+|Der Port verwendet [.filename]#extconf.rb# für die Konfiguration.
+
+|`USE_RUBY_SETUP`
+|Der Port verwendet [.filename]#setup.rb# für die Konfiguration.
+
+|`RUBY_SETUP`
+|Legt den alternativen Namen von [.filename]#setup.rb# fest. Üblich ist der Wert [.filename]#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 [.filename]#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
+[cols="1,1,1", frame="none", options="header"]
+|===
+| 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/shared/doc/ruby18/patsy`
+
+|`RUBY_MODEXAMPLESDIR`
+|Installationsverzeichnis für die Beispiele der Module.
+|`/usr/local/shared/examples/ruby18/patsy`
+|===
+
+Eine vollständige Liste der verfügbarenVariablen kann in [.filename]#/usr/ports/Mk/bsd.ruby.mk# eingesehen werden.
+
+[[using-sdl]]
+== 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 package:devel/sdl12[] und package:x11-toolkits/sdl_gui[] verwenden.
+
+Die folgenden SDL-Bibliotheken sind derzeit bekannt:
+
+* sdl: package:devel/sdl12[]
+* gfx: package:graphics/sdl_gfx[]
+* gui: package:x11-toolkits/sdl_gui[]
+* image: package:graphics/sdl_image[]
+* ldbad: package:devel/sdl_ldbad[]
+* mixer: package:audio/sdl_mixer[]
+* mm: package:devel/sdlmm[]
+* net: package:net/sdl_net[]
+* sound: package:audio/sdl_sound[]
+* ttf: package:graphics/sdl_ttf[]
+
+Falls ein Port z.B. von package:net/sdl_net[] und package:audio/sdl_mixer[] abhängt, so wäre die Syntax:
+
+[.programlisting]
+....
+USE_SDL= net mixer
+....
+
+Die Abhängigkeit von package:devel/sdl12[], die durch package:net/sdl_net[] und package: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:
+
+[.programlisting]
+....
+WANT_SDL=yes
+
+.include <bsd.port.pre.mk>
+
+.if ${HAVE_SDL:Mmixer}!=""
+USE_SDL+= mixer
+.endif
+
+.include <bsd.port.post.mk>
+....
+
+[[using-wx]]
+== wxWidgets verwenden
+
+Dieser Abschnitt beschreibt den Status der wxWidgets-Bibliotheken in den Ports und deren Einbindung in das Ports-System.
+
+[[wx-introduction]]
+=== 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.
+
+[[wx-version]]
+=== 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):
+
+[[wx-ver-sel-table]]
+.Variablen, um die wxWidgets-Version festzulegen
+[cols="1,1,1", frame="none", options="header"]
+|===
+| 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 wxWidgets-Versionen
+[cols="1,1", frame="none", options="header"]
+|===
+| Version
+| Port
+
+|`2.4`
+|package:x11-toolkits/wxgtk24[]
+
+|`2.6`
+|package:x11-toolkits/wxgtk26[]
+
+|`2.8`
+|package:x11-toolkits/wxgtk28[]
+|===
+
+[NOTE]
+====
+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 <<wx-unicode>>).
+====
+
+Die Variablen in <<wx-ver-sel-table>> können auf einen oder mehrere (durch Leerzeichen getrennt) der folgenden Werte gesetzt werden:
+
+.Spezifikationen der wxWidgets-Versionen
+[cols="1,1", frame="none", options="header"]
+|===
+| 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 wxWidgets-Version
+[cols="1,1", frame="none", options="header"]
+|===
+| Name
+| Bestimmt für
+
+|`WANT_WX_VER`
+|den Port
+
+|`WITH_WX_VER`
+|den Benutzer
+|===
+
+[[wx-components]]
+=== 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 wxWidgets-Komponenten
+[cols="1,1,1", frame="none", options="header"]
+|===
+| 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 <<wx-def-dep-types>>). Die folgenden Typen sind verfügbar:
+
+.Verfügbare Typen von wxWidgets-Abhängigkeiten
+[cols="1,1", frame="none", options="header"]
+|===
+| 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:
+
+[[wx-def-dep-types]]
+.Standardtypen der wxWidgets-Abhängigkeiten
+[cols="1,1", frame="none", options="header"]
+|===
+| Komponente
+| Typ der Abhängigkeit
+
+|`wx`
+|`lib`
+
+|`contrib`
+|`lib`
+
+|`python`
+|`run`
+
+|`mozilla`
+|`lib`
+
+|`svg`
+|`lib`
+|===
+
+[[wx-components-example]]
+.Auswahl von wxWidgets-Komponenten
+[example]
+====
+Der folgende Ausschnitt entspricht einem Port, der die wxWidgets-Version `2.4` und die zugehörigen Bibliotheken verwendet.
+
+[.programlisting]
+....
+USE_WX= 2.4
+WX_COMPS= wx contrib
+....
+
+====
+
+[[wx-unicode]]
+=== 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:
+[[wx-unicode-var-table]]
+.Variablen, um Unicode in den wxWidgets-Versionen auszuwählen
+[cols="1,1,1", frame="none", options="header"]
+|===
+| 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
+|===
+
+[WARNING]
+====
+
+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.
+====
+
+[[wx-version-detection]]
+=== 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.
+
+[[wx-ver-det-example]]
+.Installierte wxWidgets-Versionen und -Komponenten feststellen
+[example]
+====
+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.
+
+[.programlisting]
+....
+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.
+
+[.programlisting]
+....
+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
+....
+
+====
+
+[[wx-defined-variables]]
+=== Vordefinierte Variablen
+
+Die folgenden Variablen sind in den Ports verfügbar (nachdem sie entsprechend <<wx-ver-sel-table>> definiert wurden).
+
+.Vordefinierte Variablen für Ports, die wxWidgets verwenden
+[cols="1,1", frame="none", options="header"]
+|===
+| 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.
+|===
+
+[[wx-premk]]
+=== Verarbeitung in [.filename]#bsd.port.pre.mk#
+
+Falls die Variablen gleich nach dem Importieren von [.filename]#bsd.port.pre.mk# benutzt werden sollen, so muss die Variable `WX_PREMK` definiert werden.
+
+[IMPORTANT]
+====
+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 [.filename]#bsd.port.pre.mk# geändert werden.
+====
+
+[[wx-premk-example]]
+.Verwendung von wxWidgets-Variablen in Kommandos
+[example]
+====
+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.
+
+[.programlisting]
+....
+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
+....
+
+====
+
+[NOTE]
+====
+Die wxWidgets-Variablen können problemlos in Kommandos benutzt werden, falls diese in Targets ohne gesetztes `WX_PREMK` verwendet werden.
+====
+
+[[wx-additional-config-args]]
+=== Weitere `configure`-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 `WX_CONF_ARGS`
+[cols="1,1", frame="none", options="header"]
+|===
+| Möglicher Wert
+| Resultierendes Argument
+
+|`absolute`
+|`--with-wx-config=${WX_CONFIG}`
+
+|`relative`
+|`--with-wx=${LOCALBASE} --with-wx-config=${WX_CONFIG:T}`
+|===
+
+[[using-lua]]
+== Verwendung von Lua
+
+Dieser Abschnitt beschreibt den Status der Lua-Bibliotheken in den Ports und deren Einbindung in das Ports System.
+
+[[lua-introduction]]
+=== 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.
+
+[[lua-version]]
+=== 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):
+
+[[lua-ver-sel-table]]
+.Variablen, um die Lua-Version festzulegen
+[cols="1,1,1", frame="none", options="header"]
+|===
+| 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 Lua-Versionen
+[cols="1,1", frame="none", options="header"]
+|===
+| Version
+| Port
+
+|`4.0`
+|package:lang/lua4[]
+
+|`5.0`
+|package:lang/lua50[]
+
+|`5.1`
+|package:lang/lua[]
+|===
+
+Die Variablen in <<lua-ver-sel-table>> können auf einen oder mehrere (durch Leerzeichen getrennt) der folgenden Werte gesetzt werden:
+
+.Spezifikationen der Lua-Versionen
+[cols="1,1", frame="none", options="header"]
+|===
+| 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 Lua-Version
+[cols="1,1", frame="none", options="header"]
+|===
+| Name
+| Bestimmt für
+
+|`WANT_LUA_VER`
+|den Port
+
+|`WITH_LUA_VER`
+|den Benutzer
+|===
+
+[[lua-version-example]]
+.Auswahl der Lua-Version
+[example]
+====
+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.
+
+[.programlisting]
+....
+USE_LUA= 5.0-5.1
+WANT_LUA_VER= 5.0
+....
+
+====
+
+[[lua-components]]
+=== 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 Lua-Komponenten
+[cols="1,1,1", frame="none", options="header"]
+|===
+| 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`
+|===
+
+[NOTE]
+====
+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 <<lua-def-dep-types>>). Die folgenden Typen sind verfügbar:
+
+.Verfügbare Typen von Lua-Abhängigkeiten
+[cols="1,1", frame="none", options="header"]
+|===
+| 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:
+
+[[lua-def-dep-types]]
+.Standardtypen für Lua-Abhängigkeiten
+[cols="1,1", frame="none", options="header"]
+|===
+| 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)
+|===
+
+[[lua-components-example]]
+.Auswahl von Lua-Komponenten
+[example]
+====
+Der folgende Ausschnitt entspricht einem Port, welcher die Lua-Version `4.0` und die zugehörigen Ruby-Bindungen verwendet.
+
+[.programlisting]
+....
+USE_LUA= 4.0
+LUA_COMPS= lua ruby
+....
+
+====
+
+[[lua-version-detection]]
+=== 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.
+
+[[lua-ver-det-example]]
+.Installierte Lua-Versionen und- Komponenten feststellen
+[example]
+====
+Der folgende Ausschnitt kann in einem Port verwendet werden, der Lua benutzt, falls es installiert ist oder eine Option dafür ausgewählt wurde.
+
+[.programlisting]
+....
+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.
+
+[.programlisting]
+....
+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
+....
+
+====
+
+[[lua-defined-variables]]
+=== Vordefinierte Variablen
+
+Die folgenden Variablen sind in den Ports verfügbar (nachdem sie entsprechend <<lua-ver-sel-table>> definiert wurden).
+
+.Vordefinierte Variablen für Ports, die Lua verwenden
+[cols="1,1", frame="none", options="header"]
+|===
+| 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 [.filename]#${PREFIX}/bin#, [.filename]#${PREFIX}/share# und [.filename]#${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 ([.filename]#.so#) installiert sind
+
+|`LUA_MODSHAREDIR`
+|Das Verzeichnis, in dem Lua-Module ([.filename]#.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
+|===
+
+[[lua-variables-example]]
+.Einem Port mitteilen, in welchem Verzeichnis Lua liegt
+[example]
+====
+Der folgende Ausschnitt zeigt, wie einem Port, welcher ein configure-Skript verwendet, mitgeteilt werden kann, wo die Lua-Header-Dateien und Bibliotheken liegen.
+
+[.programlisting]
+....
+
+USE_LUA= 4.0
+GNU_CONFIGURE= yes
+CONFIGURE_ENV= CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"
+....
+
+====
+
+[[lua-premk]]
+=== Verarbeitung in [.filename]#bsd.port.pre.mk#
+
+Falls die Variablen gleich nach dem Einbinden von [.filename]#bsd.port.pre.mk# benutzt werden sollen, so muss die Variable `LUA_PREMK` definiert werden.
+
+[IMPORTANT]
+====
+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 [.filename]#bsd.port.pre.mk# geändert werden.
+====
+
+[[lua-premk-example]]
+.Verwendung von Lua-Variablen in Kommandos
+[example]
+====
+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.
+
+[.programlisting]
+....
+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
+....
+
+====
+
+[NOTE]
+====
+Die Lua-Variablen können problemlos in Befehlen benutzt werden, falls diese in Targets ohne gesetztes `LUA_PREMK` verwendet werden.
+====
+
+[[using-xfce]]
+== Xfce verwenden
+
+Die `USE_XFCE`-Variable wird für die automatische Konfiguration der Abhängigkeiten eingesetzt, welche die Xfce-Basisbibliotheken oder Anwendungen wie package:x11-toolkits/libxfce4gui[] und package:x11-wm/xfce4-panel[] verwenden.
+
+Die folgenden Xfce-Bibliotheken und -Anwendungen werden derzeit unterstützt:
+
+* libexo: package:x11/libexo[]
+* libgui: package:x11-toolkits/libxfce4gui[]
+* libutil: package:x11/libxfce4util[]
+* libmcs: package:x11/libxfce4mcs[]
+* mcsmanager: package:sysutils/xfce4-mcs-manager[]
+* panel: package:x11-wm/xfce4-panel[]
+* thunar: package:x11-fm/thunar[]
+* wm: package:x11-wm/xfce4-wm[]
+* xfdev: package: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.
++
+[.programlisting]
+....
+-I${LOCALBASE}/include
+ -L${LOCALBASE}/lib
+....
+
+wird CPPFLAGS hinzugefügt und ergibt `CONFIGURE_ENV`.
+
+Wenn also ein Port von package:sysutils/xfce4-mcs-manager[] abhängt und die speziellen CPPFLAGS in seiner configure-Umgebung verlangt, dann würde die Syntax wie folgt aussehen:
+
+[.programlisting]
+....
+USE_XFCE= mcsmanager configenv
+....
+
+[[using-mozilla]]
+== Mozilla verwenden
+
+.Variablen für Ports, die Mozilla verwenden
+[cols="1,1", frame="none"]
+|===
+|`USE_GECKO`
+|Vom Port unterstützte Gecko-Backends. Mögliche Werte sind: `libxul` ([.filename]#libxul.so#), `seamonkey` ([.filename]#libgtkembedmoz.so#, (veraltet, sollte daher nicht mehr verwendet werden).
+
+|`USE_FIREFOX`
+|Der Port benötigt Firefox, um korrekt zu funktionieren. Mögliche Werte sind: `yes` (verwendet die Standardversion), `40`, `36`, `35`. Die Standardversion ist derzeit `40`.
+
+|`USE_FIREFOX_BUILD`
+|Um den Port zu bauen, muss Firefox installiert sein. Wird diese Variable gesetzt, wird automatisch auch `USE_FIREFOX` gesetzt.
+
+|`USE_SEAMONKEY`
+|Der Port benötigt Seamonkey, um korrekt zu funktionieren. Mögliche Werte sind: `yes` (verwendet die Standardversion), `20`, `11` (veraltet, sollte daher nicht mehr verwendet werden). Die Standardversion ist `20`.
+
+|`USE_SEAMONKEY_BUILD`
+|Um den Port zu bauen, muss Seamonkey installiert sein. Wird diese Variable gesetzt, wird automatisch auch `USE_SEAMONKEY` gesetzt.
+
+|`USE_THUNDERBIRD`
+|Dieser Port benötigt Thunderbird, um korrekt zu funktionieren. Mögliche Werte sind: `yes` (verwendet die Standardversion), `31`, `30` (veraltet, sollte daher nicht mehr verwendet werden). Die Standardversion ist `31`.
+
+|`USE_THUNDERBIRD_BUILD`
+|Um den Port zu bauen, muss Thunderbird installiert sein. Wird diese Variable gesetzt, wird automatisch auch `USE_THUNDERBIRD` gesetzt.
+|===
+
+Eine komplette Liste aller verfügbaren Variablen finden Sie in der Datei [.filename]#/usr/ports/Mk/bsd.gecko.mk#.
+
+[[using-databases]]
+== Benutzung von Datenbanken
+
+.Variablen für Ports, die Datenbanken benutzen
+[cols="1,1", frame="none", options="header"]
+|===
+| Variable
+| Bedeutung
+
+|`USE_BDB`
+|Falls die Variable auf `yes` gesetzt ist, füge eine Abhängigkeit von package:databases/db41[] hinzu. Die Variable kann auch folgende Werte annehmen: 40, 41, 42, 43, 44, 46, 47, 48 oder 51. 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 package:databases/mysql55-server[] als Abhängigkeit hinzu. Die damit verknüpfte Variable `WANT_MYSQL_VER` kann Werte wie 323, 40, 41, 50, 51, 52, 55, oder 60 annehmen.
+
+|`USE_PGSQL`
+|Falls die Variable auf `yes` gesetzt ist, füge eine Abhängigkeit von package:databases/postgresql84[] hinzu. Die damit verknüpfte Variable `WANT_PGSQL_VER` kann Werte wie 73, 74, 80, 81, 82, 83, oder 90 annehmen.
+|===
+
+Weitere Informationen zu diesem Thema finden sich in der Datei http://www.freebsd.org/cgi/cvsweb.cgi/ports/Mk/bsd.database.mk[ bsd.database.mk].
+
+[[rc-scripts]]
+== Starten und Anhalten von Diensten (rc Skripten)
+
+[.filename]#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 [.filename]#rc.d#-Framework. Details zu deren Benutzung können im link:{handbook}#configtuning-rcd/[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 link:{rc-scripting.en}[einen Artikel] zu praktischen Aspekten bezüglich [.filename]#rc.d#-Skripten.
+
+Ein oder mehrere [.filename]#rc.d#-Skripten können installiert werden mittels:
+
+[.programlisting]
+....
+USE_RC_SUBR= doormand
+....
+
+Skripten müssen im Unterverzeichnis [.filename]#files# abgelegt und jeder Skript-Datei muss ein `.in`-Suffix hinzugefügt werden. Standardmäßige `SUB_LIST`-Ersetzungen werden für diese Dateien unterstützt. Die Verwendung von `%%PREFIX%%` und `%%LOCALBASE%%` wird dringend empfohlen. Näheres zu `SUB_LIST` kann im <<using-sub-files,zugehörigen Kapitel>> nachgelesen werden.
+
+Für FreeBSD-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 ist jedoch nur notwendig, wenn der Port in die Verzeichnisstruktur des Basissystems installiert werden kann oder der Dienst vor den [.filename]#FILESYSTEMS#-Skripten in [.filename]#rc.d# des Basissystems gestartet sein muss.
+
+Seit FreeBSD 6.1-RELEASE sind lokale [.filename]#rc.d#-Skripten (inklusive der durch Ports installierten) im allgemeinen man:rcorder[8] des Basissystems.
+
+Beispiel eines einfachen [.filename]#rc.d#-Skripts:
+
+[.programlisting]
+....
+#!/bin/sh
+
+# $FreeBSD$
+#
+# PROVIDE: doormand
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+#
+# 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.
+#
+
+. /etc/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"
+....
+
+Solange kein guter Grund dafür besteht, einen Dienst früher starten zu lassen, sollten alle Ports-Skripten
+
+[.programlisting]
+....
+REQUIRE: LOGIN
+....
+
+verwenden. Falls der Port von einem bestimmten Benutzer (außer root) ausgeführt wird, ist dies zwingend.
+
+[.programlisting]
+....
+KEYWORD: shutdown
+....
+
+ist im Skript oben deswegen vorhanden, weil der frei erfundene Beispiel-Port einen Dienst startet und dieser beim Herunterfahren des Systems sauber beendet werden sollte. Startete das Skript keinen persistenten Dienst, wäre dies nicht notwendig.
+
+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
+
+[.programlisting]
+....
+doormand_flags=""
+....
+
+in seiner [.filename]#rc.conf.local#-Datei stehen haben, und eine Variablenzuweisung mittels ":=" würde in diesem Fall die Benutzerdefinition überschreiben.
+
+[NOTE]
+====
+Es sollten keine weiteren Skripten mit der [.filename]#.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 [.filename]#pkg-plist# sollte eine Zeile wie folgt zugefügt werden:
+
+[.programlisting]
+....
+@stopdaemon doormand
+....
+
+Das Argument muss dabei mit dem Inhalt der `USE_RC_SUBR`-Variablen übereinstimmen.
+
+[[users-and-groups]]
+== Hinzufügen von Benutzern und Gruppen
+
+Manche Ports setzen voraus, dass ein bestimmter Benutzer auf dem System angelegt ist. Wählen Sie in einem solchen Fall eine freie Kennnummer zwischen 50 und 999 aus und tragen Sie diese in [.filename]#ports/UIDs# (für Benutzer) oder [.filename]#ports/GIDs# (für Gruppen) ein. Stellen Sie dabei sicher, dass Sie keine Kennnummer auswählen, die bereits vom System oder von anderen Ports verwendet wird.
+
+Erstellen Sie bitte eine entsprechende Patch-Datei für diese beiden Dateien, wenn für Ihren Port ein neuer Benutzer oder eine neue Gruppe angelegt werden muss.
+
+Sie können dann die Variablen `USERS` und `GROUPS` im [.filename]#Makefile# benutzen, um bei der Port-Installation das automatische Anlegen des Benutzers zu veranlassen.
+
+[.programlisting]
+....
+USERS= pulse
+GROUPS= pulse pulse-access pulse-rt
+....
+
+Die Liste mit den momentan belegten UIDs (GIDs) befindet sich in [.filename]#ports/UIDs# ([.filename]#ports/GIDs#).
+
+== Von Kernelquellen abhängige Ports
+
+Einige Ports (beispielsweise vom Kernel ladbare Module) benötigen die Kernelsourcen, damit sie gebaut werden können. Die folgenden Zeilen beschreiben den korrekten Weg, wie Sie feststellen können, ob der Benutzer die Kernelsourcen installiert hat:
+
+[.programlisting]
+....
+.if !exists(${SRC_BASE}/sys/Makefile)
+
+IGNORE= requires kernel sources to be installed
+.endif
+....
diff --git a/documentation/content/de/books/porters-handbook/testing/chapter.adoc b/documentation/content/de/books/porters-handbook/testing/chapter.adoc
new file mode 100644
index 0000000000..314fa1216a
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/testing/chapter.adoc
@@ -0,0 +1,99 @@
+---
+title: Kapitel 9. Ihren Port testen
+prev: books/porters-handbook/pkg-files
+next: books/porters-handbook/port-upgrading
+---
+
+[[testing]]
+= Ihren Port testen
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 9
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+[[make-describe]]
+== `make describe` ausführen
+
+Einige der FreeBSD-Werkzeuge zur Pflege von Ports, wie zum Beispiel man:portupgrade[1], verwenden eine Datenbank names [.filename]#/usr/ports/INDEX#, welche Eigenschaften, wie z.B. Port-Abhängigkeiten, verfolgt. [.filename]#INDEX# wird vom Makefile der höchsten Ebene, [.filename]#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 [.filename]#INDEX# nicht generiert werden und schnell werden viele Leute darüber unzufrieden sein.
+
+[NOTE]
+====
+Es ist wichtig diese Datei erzeugen zu können, unabhängig davon, welche Optionen in [.filename]#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 <<dads-dot-error>>).
+====
+
+Wenn `make describe` eine Zeichenkette anstatt einer Fehlermeldung erzeugt, sind Sie wahrscheinlich auf der sicheren Seite. Vergleichen Sie die erzeugte Zeichenkette mit [.filename]#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.
+
+[[testing-portlint]]
+== Portlint
+
+Bitte überprüfen Sie Ihre Arbeit stets mit <<porting-portlint,`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 {freebsd-ports} nach.
+
+[[testing-porttools]]
+== Port Tools
+
+Das Programm package: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 <<testing-portlint,`portlint`>>-Überprüfung, durchgeführt werden. Dieser Befehl spürt ausserdem alle nicht in [.filename]#pkg-plist# enthaltenen Dateien auf und gibt eine Liste dieser aus. Hier ein Beispiel:
+
+[source,bash]
+....
+# port test /usr/ports/net/csup
+....
+
+[[porting-prefix]]
+== `PREFIX` und `DESTDIR`
+
+`PREFIX` bestimmt, an welche Stelle der Port installiert werden soll. In der Regel ist dies [.filename]#/usr/local# oder [.filename]#/opt#, was jedoch anpassbar ist. 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 [.filename]#/# 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 [.filename]#/usr/local#). Falls `USE_LINUX_PREFIX` gesetzt ist, wird `PREFIX LINUXBASE` annehmen (Standard ist [.filename]#/compat/linux#).
+
+Die Vermeidung der hart kodierten Angaben von [.filename]#/usr/local# oder [.filename]#/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 [.filename]#/usr/local# (oder [.filename]#/usr/X11R6# für X-Ports, die nicht imake benutzen) in den verschiedenen [.filename]##Makefile##s 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 [.filename]#/usr/local# an Stelle von `PREFIX` installiert. Um dies festzustellen, können Sie folgendes machen:
+
+[source,bash]
+....
+# 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 [.filename]#/var/tmp/`make -V PORTNAME`# würde dies erledigen.
+
+Die Variable `PREFIX` kann in Ihrem [.filename]#Makefile# oder der Umgebung des Benutzers neu gesetzt werden. Allerdings wird für einzelne Ports dringend davon abgeraten diese Variable in den [.filename]##Makefile##s 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:
+
+[.programlisting]
+....
+-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 [.filename]#/usr/local#-Baum an eine andere Stelle verschoben hat.
+
+[[testing-tinderbox]]
+== 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 <<build-cluster,Pointyhat>> verwendet werden. Sie können Tinderbox installieren, indem Sie den Port package: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 http://tinderbox.marcuscom.com/[Tinderbox Homepage].
diff --git a/documentation/content/de/books/porters-handbook/why-port/chapter.adoc b/documentation/content/de/books/porters-handbook/why-port/chapter.adoc
new file mode 100644
index 0000000000..323b7a0ecc
--- /dev/null
+++ b/documentation/content/de/books/porters-handbook/why-port/chapter.adoc
@@ -0,0 +1,30 @@
+---
+title: Kapitel 1. Einführung
+prev: books/porters-handbook/
+next: books/porters-handbook/own-port
+---
+
+[[why-port]]
+= Einführung
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:source-highlighter: rouge
+:experimental:
+:skip-front-matter:
+:xrefstyle: basic
+:relfileprefix: ../
+:outfilesuffix:
+:sectnumoffset: 1
+:toc-title: Inhaltsverzeichnis
+:table-caption: Tabelle
+:figure-caption: Abbildung
+:example-caption: Beispiel
+
+toc::[]
+
+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.