- Please welcome to the german translation of the developers-handbook.

- This work was done by the FreeBSD German Documentation Project. A list of
  people involved in this translation can be found under

  https://doc.bsdgroup.de/status/developers-handbook.html
This commit is contained in:
Martin Wilke 2009-02-14 22:06:23 +00:00
parent 863ce6a488
commit 8c3cd27b1b
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=33829
18 changed files with 15715 additions and 1 deletions

View file

@ -6,7 +6,8 @@
# $FreeBSDde: de-docproj/books/Makefile,v 1.6 2007/08/20 19:11:15 jkois Exp $
#
SUBDIR = faq
SUBDIR = developers-handbook
SUBDIR+= faq
SUBDIR+= fdp-primer
SUBDIR+= handbook
SUBDIR+= porters-handbook

View file

@ -0,0 +1,50 @@
# The FreeBSD Documentation Project
# The FreeBSD German Documentation Project
#
# $FreeBSD$
# $FreeBSDde: de-docproj/books/developers-handbook/Makefile,v 1.2 2007/08/31 01:42:15 as Exp $
# basiert auf: 1.23
#
# Build the FreeBSD Developers' Handbook.
#
MAINTAINER=doc@FreeBSD.org
DOC?= book
FORMATS?= html-split
HAS_INDEX= true
INSTALL_COMPRESSED?= gz
INSTALL_ONLY_COMPRESSED?=
# Images
IMAGES_EN= sockets/layers.eps sockets/sain.eps sockets/sainfill.eps sockets/sainlsb.eps sockets/sainmsb.eps sockets/sainserv.eps sockets/serv.eps sockets/serv2.eps sockets/slayers.eps
#
# SRCS lists the individual SGML files that make up the document. Changes
# to any of these files will force a rebuild
#
# SGML content
SRCS= book.sgml
SRCS+= dma/chapter.sgml
SRCS+= introduction/chapter.sgml
SRCS+= ipv6/chapter.sgml
SRCS+= kernelbuild/chapter.sgml
SRCS+= kerneldebug/chapter.sgml
SRCS+= l10n/chapter.sgml
SRCS+= policies/chapter.sgml
SRCS+= secure/chapter.sgml
SRCS+= sockets/chapter.sgml
SRCS+= testing/chapter.sgml
SRCS+= tools/chapter.sgml
SRCS+= x86/chapter.sgml
# Entities
URL_RELPREFIX?= ../../../..
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

View file

@ -0,0 +1,238 @@
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/developers-handbook/book.sgml,v 1.10 2009/02/10 12:55:14 jkois Exp $
basiert auf: 1.55
-->
<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
<!ENTITY % books.ent PUBLIC "-//FreeBSD//ENTITIES DocBook FreeBSD Books Entity Set//DE">
%books.ent;
<!ENTITY % chapters SYSTEM "chapters.ent"> %chapters;
<!ENTITY % chap.index "IGNORE">
]>
<book lang="de">
<bookinfo>
<title>FreeBSD Developers' Handbook</title>
<corpauthor>The FreeBSD Documentation Project</corpauthor>
<pubdate>August 2000</pubdate>
<copyright>
<year>2000</year>
<year>2001</year>
<year>2002</year>
<year>2003</year>
<year>2004</year>
<year>2005</year>
<year>2006</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<copyright>
<year>2008</year>
<year>2009</year>
<holder>The FreeBSD German Documentation Project</holder>
</copyright>
&bookinfo.legalnotice;
<legalnotice id="trademarks" role="trademarks">
&tm-attrib.freebsd;
&tm-attrib.apple;
&tm-attrib.ibm;
&tm-attrib.ieee;
&tm-attrib.intel;
&tm-attrib.linux;
&tm-attrib.microsoft;
&tm-attrib.opengroup;
&tm-attrib.sun;
&tm-attrib.general;
</legalnotice>
<abstract>
<para>Willkommen zum Entwickler-Handbuch. Dieses Handbuch ist
<emphasis>jederzeit unter Bearbeitung</emphasis> und das
Ergebnis der Arbeit vieler Einzelpersonen. Dies kann
dazu f&uuml;hren, dass bestimmte Bereiche nicht mehr aktuell
sind und auf den neuesten Stand gebracht werden m&uuml;ssen.
Bei Unklarheiten empfiehlt es sich daher stets, auch die
<ulink
url="&url.base;/doc/en_US.ISO8859-1/books/developers-handbook/index.html">
englische Originalversion</ulink> des Handbuchs zu lesen.</para>
<para>Wenn Sie bei der &Uuml;bersetzung dieses Handbuchs mithelfen
m&ouml;chten, senden Sie bitte eine E-Mail an die Mailingliste
&a.de.translators;.</para>
<para>Die aktuelle Version dieses Handbuchs ist immer auf dem
<ulink url="http://www.FreeBSD.org/">&os;-Webserver</ulink>
verf&uuml;gbar und kann in verschiedenen Formaten und in
komprimierter Form vom <ulink
url="ftp://ftp.FreeBSD.org/pub/FreeBSD/doc">&os;-FTP-Server</ulink>
oder einem der zahlreichen <ulink
url="&url.base;/doc/de_DE.ISO8859-1/books/handbook/mirrors-ftp.html">Spiegel</ulink>
herunter geladen werden (&auml;ltere Versionen finden Sie hingegen
unter <ulink url="http://docs.FreeBSD.org/doc/"></ulink>).</para>
</abstract>
</bookinfo>
<part id="Basics">
<title>Grundlagen</title>
&chap.introduction;
&chap.tools;
&chap.secure;
&chap.l10n;
&chap.policies;
&chap.testing;
</part>
<part id="ipc">
<title>Interprozess-Kommunikation</title>
&chap.sockets;
&chap.ipv6;
</part>
<part id="kernel">
<title>Kernel</title>
&chap.dma;
&chap.kernelbuild;
&chap.kerneldebug;
</part>
<part id="architectures">
<title>Architekturen</title>
&chap.x86;
</part>
<part id="appendices">
<title>Anhang</title>
<bibliography>
<biblioentry id="COD" xreflabel="1">
<authorgroup>
<author>
<firstname>Dave</firstname>
<othername role="MI">A</othername>
<surname>Patterson</surname>
</author>
<author>
<firstname>John</firstname>
<othername role="MI">L</othername>
<surname>Hennessy</surname>
</author>
</authorgroup>
<copyright><year>1998</year><holder>Morgan Kaufmann Publishers,
Inc.</holder></copyright>
<isbn>1-55860-428-6</isbn>
<publisher>
<publishername>Morgan Kaufmann Publishers, Inc.</publishername>
</publisher>
<title>Computer Organization and Design</title>
<subtitle>The Hardware / Software Interface</subtitle>
<pagenums>1-2</pagenums>
</biblioentry>
<biblioentry xreflabel="2">
<authorgroup>
<author>
<firstname>W.</firstname>
<othername role="Middle">Richard</othername>
<surname>Stevens</surname>
</author>
</authorgroup>
<copyright><year>1993</year><holder>Addison Wesley Longman,
Inc.</holder></copyright>
<isbn>0-201-56317-7</isbn>
<publisher>
<publishername>Addison Wesley Longman, Inc.</publishername>
</publisher>
<title>Advanced Programming in the Unix Environment</title>
<pagenums>1-2</pagenums>
</biblioentry>
<biblioentry xreflabel="3">
<authorgroup>
<author>
<firstname>Marshall</firstname>
<othername role="Middle">Kirk</othername>
<surname>McKusick</surname>
</author>
<author>
<firstname>George</firstname>
<surname>Neville-Neil</surname>
</author>
</authorgroup>
<copyright><year>2004</year><holder>Addison-Wesley Publishing Company,
Inc.</holder></copyright>
<isbn>0-201-70245-2</isbn>
<publisher>
<publishername>Addison-Wesley</publishername>
</publisher>
<title>The Design and Implementation of the FreeBSD Operating System</title>
<pagenums>1-2</pagenums>
</biblioentry>
<biblioentry id="Phrack" xreflabel="4">
<authorgroup>
<author>
<firstname>Aleph</firstname>
<surname>One</surname>
</author>
</authorgroup>
<title>Phrack 49; "Smashing the Stack for Fun and Profit"</title>
</biblioentry>
<biblioentry id="StackGuard" xreflabel="5">
<authorgroup>
<author>
<firstname>Chrispin</firstname>
<surname>Cowan</surname>
</author>
<author>
<firstname>Calton</firstname>
<surname>Pu</surname>
</author>
<author>
<firstname>Dave</firstname>
<surname>Maier</surname>
</author>
</authorgroup>
<title>StackGuard; Automatic Adaptive Detection and Prevention of
Buffer-Overflow Attacks</title>
</biblioentry>
<biblioentry id="OpenBSD" xreflabel="6">
<authorgroup>
<author>
<firstname>Todd</firstname>
<surname>Miller</surname>
</author>
<author>
<firstname>Theo</firstname>
<surname>de Raadt</surname>
</author>
</authorgroup>
<title>strlcpy and strlcat -- consistent, safe string copy and
concatenation.</title>
</biblioentry>
</bibliography>
</part>
<![ %chap.index; [ &chap.index; ]]>
</book>

View file

@ -0,0 +1,37 @@
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
Creates entities for each chapter in the FreeBSD Developer's
Handbook. Each entity is named chap.foo, where foo is the value
of the id attribute on that chapter, and corresponds to the name of
the directory in which that chapter's .sgml file is stored.
Chapters should be listed in the order in which they are referenced.
$FreeBSD$
$FreeBSDde: de-docproj/books/developers-handbook/chapters.ent,v 1.2 2007/08/31 01:42:15 as Exp $
-->
<!-- Part one -->
<!ENTITY chap.introduction SYSTEM "introduction/chapter.sgml">
<!ENTITY chap.tools SYSTEM "tools/chapter.sgml">
<!ENTITY chap.secure SYSTEM "secure/chapter.sgml">
<!ENTITY chap.l10n SYSTEM "l10n/chapter.sgml">
<!ENTITY chap.policies SYSTEM "policies/chapter.sgml">
<!ENTITY chap.testing SYSTEM "testing/chapter.sgml">
<!-- Part two - IPC -->
<!ENTITY chap.sockets SYSTEM "sockets/chapter.sgml">
<!ENTITY chap.ipv6 SYSTEM "ipv6/chapter.sgml">
<!-- Part three - Kernel -->
<!ENTITY chap.dma SYSTEM "dma/chapter.sgml">
<!ENTITY chap.kernelbuild SYSTEM "kernelbuild/chapter.sgml">
<!ENTITY chap.kerneldebug SYSTEM "kerneldebug/chapter.sgml">
<!-- Part five - Architectures -->
<!ENTITY chap.x86 SYSTEM "x86/chapter.sgml">
<!-- Part six - Appendices -->
<!ENTITY chap.index SYSTEM "index.sgml">

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,275 @@
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/developers-handbook/introduction/chapter.sgml,v 1.10 2008/01/24 19:34:49 seirei Exp $
basiert auf: 1.18
-->
<chapter id="introduction">
<chapterinfo>
<authorgroup>
<author>
<firstname>Murray</firstname>
<surname>Stokely</surname>
<contrib>Beigetragen von </contrib>
</author>
<author>
<firstname>Jeroen</firstname>
<surname>Ruigrok van der Werven</surname>
</author>
</authorgroup>
<authorgroup>
<author>
<firstname>Fabian</firstname>
<surname>Borschel</surname>
<contrib>&Uuml;bersetzt von </contrib>
</author>
</authorgroup>
</chapterinfo>
<title>Einf&uuml;hrung</title>
<sect1 id="introduction-devel">
<title>Unter FreeBSD entwickeln</title>
<para>Hier sind wir also. Ihr System ist vollst&auml;ndig
installiert und Sie wollen mit dem Programmieren beginnen.
Aber womit sollen Sie anfangen? Was bietet Ihnen FreeBSD?
Was kann es f&uuml;r einen Programmierer tun?</para>
<para>Dies sind einige der Fragen, welche dieses Handbuch
zu beantworten versucht. Nat&uuml;rlich gibt es, analog zu
anderen Berufen, auch bei Programmierern unterschiedliche
Leistungsniveaus. F&uuml;r die einen ist es ein Hobby,
f&uuml;r die anderen ist es der Beruf. Die Informationen
in diesem Kapitel d&uuml;rften eher f&uuml;r den
Programmieranf&auml;nger geeignet sein; allerdings k&ouml;nnte
es auch f&uuml;r Programmierer, die bisher nichts mit der
&os;-Plattform zu tun hatten, interessante Informationen
enthalten.</para>
</sect1>
<sect1 id="introduction-bsdvision">
<title>Die Vision von BSD</title>
<para>Ziel ist es, das bestm&ouml;gliche &unix;-artige
Betriebssystempaket zu erstellen, mit dem geb&uuml;hrenden
Respekt gegen&uuml;ber der Ideologie der urspr&uuml;nglichen
Software, sowie der Bedienbarkeit, Leistungsf&auml;higkeit und
Stabilit&auml;t.</para>
</sect1>
<sect1 id="introduction-archguide">
<title>Grundlegende Richtlinien</title>
<para>Unsere Ideologie kann durch die folgenden Leitf&auml;den
beschrieben werden.</para>
<itemizedlist>
<listitem>
<para>F&uuml;ge keine neue Funktionalit&auml;t hinzu, solange
ein Programmierer diese nicht zur Fertigstellung einer
realen Anwendung ben&ouml;tigt.</para>
</listitem>
<listitem>
<para>Zu entscheiden, was ein System ist, ist genauso
wichtig wie zu entscheiden, was ein System nicht ist.
Versuchen Sie nicht, alle m&ouml;glichen W&uuml;nsche zu
erf&uuml;llen; machen Sie lieber das System erweiterbar, so
dass zus&auml;tzliche Bed&uuml;rfnisse in einer
aufw&auml;rtskompatiblen Weise bedient werden
k&ouml;nnen.</para>
</listitem>
<listitem>
<para>Das Einzige, das schlimmer ist, als von einem Beispiel
auf die Allgemeinheit zu schlie&szlig;en, ist, von
&uuml;berhaupt keinem Beispiel auf die Allgemeinheit zu
schlie&szlig;en.</para>
</listitem>
<listitem>
<para>Solange ein Problem nicht vollst&auml;ndig verstanden
wurde, ist es besser, keine L&ouml;sung
bereitzustellen.</para>
</listitem>
<listitem>
<para>Wenn Sie 90% des gew&uuml;nschten Effektes bei nur 10%
des Aufwands erreichen k&ouml;nnen, sollten Sie besser die
einfachere L&ouml;sung verwenden.</para>
</listitem>
<listitem>
<para>Grenzen Sie Komplexit&auml;t so gut wie m&ouml;glich
ein.</para>
</listitem>
<listitem>
<para>Stellen Sie Mechanismen anstelle von Strategien bereit.
&Uuml;berlassen Sie insbesondere Strategien f&uuml;r die
Benutzerschnittstelle dem Benutzerprogramm.</para>
</listitem>
</itemizedlist>
<para>Aus Scheifler & Gettys: "X Window System"</para>
</sect1>
<sect1 id="introduction-layout">
<title>Der Aufbau von
<filename class="directory">/usr/src</filename></title>
<para>Der vollst&auml;ndige Quelltext von FreeBSD ist &uuml;ber
das &ouml;ffentliche CVS-Repository verf&uuml;gbar. Der
Quelltext wird normalerweise in <filename
class="directory">/usr/src</filename> abgelegt und enth&auml;lt
die folgenden Unterverzeichnisse:</para>
<para>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<thead>
<row>
<entry>Verzeichnis</entry>
<entry>Beschreibung</entry>
</row>
</thead>
<tbody>
<row>
<entry><filename
class="directory">bin/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in
<filename>/bin</filename></entry>
</row>
<row>
<entry><filename
class="directory">contrib/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien von beigesteuerter
Software</entry>
</row>
<row>
<entry><filename
class="directory">crypto/</filename></entry>
<entry>Quelldateien f&uuml;r die Kryptographie</entry>
</row>
<row>
<entry><filename
class="directory">etc/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in <filename
class="directory">/etc</filename></entry>
</row>
<row>
<entry><filename
class="directory">games/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in <filename
class="directory">/usr/games</filename></entry>
</row>
<row>
<entry><filename
class="directory">gnu/</filename></entry>
<entry>Programme, die unter der GNU Public License
stehen</entry>
</row>
<row>
<entry><filename
class="directory">include/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in <filename
class="directory">/usr/include</filename></entry>
</row>
<row>
<entry><filename
class="directory">kerberos5/</filename></entry>
<entry>Quelldateien f&uuml;r Kerberos Version 5</entry>
</row>
<row>
<entry><filename
class="directory">lib/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in <filename
class="directory">/usr/lib</filename></entry>
</row>
<row>
<entry><filename
class="directory">libexec/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in <filename
class="directory">/usr/libexec</filename></entry>
</row>
<row>
<entry><filename
class="directory">release/</filename></entry>
<entry>Dateien, die f&uuml;r die Erstellung eines
FreeBSD-Releases n&ouml;tig sind</entry>
</row>
<row>
<entry><filename
class="directory">rescue/</filename></entry>
<entry>Bausystem f&uuml;r die <filename
class="directory">/rescue</filename>-Programme</entry>
</row>
<row>
<entry><filename
class="directory">sbin/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in <filename
class="directory">/sbin</filename></entry>
</row>
<row>
<entry><filename
class="directory">secure/</filename></entry>
<entry>Quelldateien f&uuml;r FreeSec</entry>
</row>
<row>
<entry><filename
class="directory">share/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in <filename
class="directory">/usr/share</filename></entry>
</row>
<row>
<entry><filename
class="directory">sys/</filename></entry>
<entry>Kernel-Quelldateien</entry>
</row>
<row>
<entry><filename
class="directory">tools/</filename></entry>
<entry>Programme zum Verwalten und Testen von
FreeBSD</entry>
</row>
<row>
<entry><filename
class="directory">usr.bin/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in <filename
class="directory">/usr/bin</filename></entry>
</row>
<row>
<entry><filename
class="directory">usr.sbin/</filename></entry>
<entry>Quelldateien f&uuml;r Dateien in <filename
class="directory">/usr/sbin</filename></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</sect1>
</chapter>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,107 @@
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/developers-handbook/kernelbuild/chapter.sgml,v 1.4 2007/09/04 13:24:23 as Exp $
basiert auf: 1.1
-->
<chapter id="kernelbuild">
<chapterinfo>
<authorgroup>
<author>
<firstname>Johann</firstname>
<surname>Kois</surname>
<contrib>&Uuml;bersetzt von </contrib>
</author>
</authorgroup>
</chapterinfo>
<title>Einen &os;-Kernel bauen und installieren</title>
<para>Ein Kernelentwickler muss wissen, wie der Bau eines angepassten
Kernels funktioniert, da das Debuggen des &os;-Kernels nur durch den
Bau eines neuen Kernels m&ouml;glich ist. Es gibt zwei Wege, einen
angepassten Kernel zu bauen:</para>
<itemizedlist>
<listitem>
<para>Den <quote>traditionellen</quote> Weg</para>
</listitem>
<listitem>
<para>Den <quote>neuen</quote> Weg</para>
</listitem>
</itemizedlist>
<note>
<para>Die folgenden Ausf&uuml;hrungen setzen voraus, dass Sie
den Abschnitt <ulink
url="../handbook/kernelconfig-building.html">
Erstellen und Installation eines angepassten Kernels</ulink> des
FreeBSD-Handbuchs gelesen haben und daher wissen, wie man einen
FreeBSD-Kernel baut.</para>
</note>
<sect1 id="kernelbuild-traditional">
<title>Einen Kernel auf die <quote>traditionelle</quote> Art und
Weise bauen</title>
<para>Bis &os;&nbsp;4.X wurde dieser Weg zum Bau eines angepassten
Kernels empfohlen. Sie k&ouml;nnen Ihren Kernel nach wie vor
auf diese Art und Weise bauen (anstatt das Target
<quote>buildkernel</quote> der Makefiles im Verzeichnis
<filename role="directory">/usr/src/</filename> zu verwenden).
Dies kann beispielsweise sinnvoll sein, wenn Sie am
Kernel-Quellcode arbeiten. Haben Sie nur ein oder zwei Optionen
der Kernelkonfigurationsdatei ge&auml;ndert, ist dieser Weg in
der Regel schneller als der <quote>neue</quote> Weg.
Andererseits kann es aber auch zu unerwarteten Fehlern beim
Bau des Kernels kommen, wenn Sie Ihren Kernel unter aktuellen
&os;-Versionen auf diese Art und Weise bauen.</para>
<procedure>
<step>
<para>Erzeugen Sie den Kernel-Quellcode mit
&man.config.8;:</para>
<screen>&prompt.root; <userinput>/usr/sbin/config <replaceable>MYKERNEL</replaceable></userinput></screen>
</step>
<step>
<para>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.</para>
<screen>&prompt.root; <userinput>cd ../compile/<replaceable>MYKERNEL</replaceable></userinput></screen>
</step>
<step>
<para>Kompilieren Sie den neuen Kernel:</para>
<screen>&prompt.root; <userinput>make depend</userinput>
&prompt.root; <userinput>make</userinput></screen>
</step>
<step>
<para>Installieren Sie den neuen Kernel:</para>
<screen>&prompt.root; <userinput>make install</userinput></screen>
</step>
</procedure>
</sect1>
<sect1 id="kernelbuild-new">
<title>Einen Kernel auf die <quote>neue</quote> Art und Weise
bauen</title>
<para>Dieser Weg wird f&uuml;r alle aktuellen &os;-Versionen
empfohlen. Lesen Sie bitte den Abschnitt <ulink
url="../handbook/kernelconfig-building.html">Erstellen und
Installation eines angepassten Kernels</ulink> des
&os;-Handbuchs, wenn Sie Ihren Kernel auf diese Art und Weise
bauen wollen.</para>
</sect1>
</chapter>

View file

@ -0,0 +1,19 @@
# The FreeBSD Documentation Project
# The FreeBSD German Documentation Project
#
# Build the Handbook with just the content from this chapter.
#
# $FreeBSD$
# $FreeBSDde: de-docproj/books/developers-handbook/kerneldebug/Makefile,v 1.2 2007/08/31 06:13:09 as Exp $
# basiert auf: 1.1
#
CHAPTERS= kerneldebug/chapter.sgml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,104 @@
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/developers-handbook/l10n/chapter.sgml,v 1.9 2007/09/28 16:25:36 jkois Exp $
basiert auf: 1.10
-->
<chapter id="l10n">
<chapterinfo>
<authorgroup>
<author>
<firstname>Jochen</firstname>
<surname>Neumeister</surname>
<contrib>&Uuml;bersetzt von </contrib>
</author>
</authorgroup>
</chapterinfo>
<title>Lokalisierung und Internationalisierung - L10N und
I18N</title>
<sect1 id="l10n-programming">
<title>I18N-konforme Anwendungen programmieren</title>
<indexterm><primary>Qt</primary></indexterm>
<indexterm><primary>GTK</primary></indexterm>
<para>Um Ihre Anwendung verwendbarer f&uuml;r andere
Sprachen zu machen, hoffen wir, dass Sie I18N-konform
programmieren. Der GNU gcc-Compiler und Bibliotheken
f&uuml;r grafische Benutzeroberfl&auml;chen wie QT und GTK
unterst&uuml;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 &uuml;bersetzen.
Lesen Sie die Bibliothek-spezifischen I18N-Dokumentationen
f&uuml;r weitere Details.</para>
<para>Im Gegensatz zur allgemeinen Meinung ist I18N-konformer
Code einfach zu programmieren. &Uuml;blicherweise umfasst
dies nur das Einbetten Ihrer Zeichenketten in
Bibliothek-spezifische Funktionen. Stellen Sie au&szlig;erdem
bitte sicher, dass Sie Unterst&uuml;tzung f&uuml;r Unicode- und
Multibyte-Zeichen vorsehen.</para>
<sect2>
<title>Ein Aufruf, die I18N-Bem&uuml;hungen zu
vereinheitlichen</title>
<para>Wir sind darauf aufmerksam geworden, dass die
einzelnen I18N-/L10N-Bem&uuml;hungen f&uuml;r jedes Land
wiederholt wurden. Viele von uns haben somit unproduktiverweise
das Rad immer wieder neu erfunden. Wir hoffen, dass die
verschiedenen gro&szlig;en Gruppen f&uuml;r I18N Ihre
Bem&uuml;hungen in einer Gruppe vereinen k&ouml;nnen,
&auml;hnlich der Zust&auml;ndigkeit des Core-Teams.</para>
<para>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
&Auml;nderungen funktionieren.</para>
<para>Die &a.i18n;-Mailingliste ist eingerichtet worden. Wenn
Sie I18N-/L10N-Entwickler sind, schicken Sie bitte Ihre
Kommentare, Ideen, Fragen und alles, das Sie mit dem Thema in
Verbindung bringen, dorthin.</para>
</sect2>
<sect2>
<title>Perl und Python</title>
<indexterm>
<primary>Perl</primary>
</indexterm>
<indexterm>
<primary>Python</primary>
</indexterm>
<para>Perl und Python bieten Bibliotheken f&uuml;r I18N und zur
Behandlung von Unicode-Zeichen. Bitte nutzen Sie diese
f&uuml;r I18N-Konformit&auml;t.</para>
<para>Auf &auml;lteren FreeBSD-Versionen erzeugt Perl
m&ouml;glicherweise Warnmeldungen wegen nicht installierter
Unterst&uuml;tzung f&uuml;r Unicode-Zeichen auf Ihrem System.
Sie k&ouml;nnen hierf&uuml;r die Umgebungsvariable
<envar>LD_PRELOAD</envar> in ihrer Shell auf
<filename>/usr/lib/libxpg4.so</filename> setzen.</para>
<para>In <literal>sh</literal>-basierten Shells:</para>
<programlisting><envar>LD_PRELOAD=/usr/lib/libxpg4.so</envar></programlisting>
<para>In <literal>C</literal>-basierten Shells:</para>
<programlisting><envar>setenv LD_PRELOAD /usr/lib/libxpg4.so</envar></programlisting>
</sect2>
</sect1>
</chapter>

View file

@ -0,0 +1,17 @@
#
# Build the Handbook with just the content from this chapter.
#
# $FreeBSD$
# $FreeBSDde: de-docproj/books/developers-handbook/policies/Makefile,v 1.1.1.1 2007/08/01 19:18:33 as Exp $
# basiert auf: 1.1
#
CHAPTERS= policies/chapter.sgml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,522 @@
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/developers-handbook/policies/chapter.sgml,v 1.8 2007/09/21 20:30:41 as Exp $
basiert auf: 1.33
-->
<chapter id="policies">
<chapterinfo>
<authorgroup>
<author>
<firstname>Poul-Henning</firstname>
<surname>Kamp</surname>
<contrib>Beigesteuert von </contrib>
</author>
</authorgroup>
<!-- June 1996 -->
<authorgroup>
<author>
<firstname>Axel</firstname>
<surname>Gruner</surname>
<contrib>&Uuml;bersetzt von </contrib>
</author>
</authorgroup>
</chapterinfo>
<title>Vorgaben und Richtlinien f&uuml;r das
Quelltextverzeichnis</title>
<para>Dieses Kapitel dokumentiert verschiedene Vorgaben und
Richtlinien f&uuml;r das FreeBSD-Quelltextverzeichnis.</para>
<sect1 id="policies-maintainer">
<title><makevar>MAINTAINER</makevar> eines Makefiles</title>
<indexterm><primary>Ports-Maintainer</primary></indexterm>
<para>Wenn ein bestimmter Bereich der FreeBSD-Distribution von
einer Person oder Gruppe gepflegt wird, kann dies durch
Hinzuf&uuml;gen der Zeile
<programlisting>MAINTAINER= email-addresses</programlisting>
im <filename>Makefile</filename> der &Ouml;ffentlichkeit
mitgeteilt werden.</para>
<para>Dies bedeutet folgendes:</para>
<para>Der Maintainer ist verantwortlich f&uuml;r diesen Code.
Er muss einerseits f&uuml;r die Behebung von
Fehlern und das Beantworten von Problemberichten f&uuml;r diesen
Code die Verantwortung tragen und andererseits, falls es sich
um beigesteuerte Software handelt, neue Versionen verfolgen
und bereitstellen.</para>
<para>&Auml;nderungen an Verzeichnissen, die ein Maintainer
definiert hat, sollten an den Maintainer f&uuml;r eine
&Uuml;berpr&uuml;fung gesendet werden, bevor diese committet
werden. Nur wenn der Maintainer in einer inakzeptablen
Zeitspanne auf mehrere E-Mails nicht antwortet, k&ouml;nnen die
&Auml;nderungen, die mit dem Commit in Kraft treten, auch ohne
&Uuml;berpr&uuml;fung durch den Maintainer vollzogen werden.
Dennoch wird empfohlen, dass die &Auml;nderungen, falls
m&ouml;glich, von jemand anderem &uuml;berpr&uuml;ft
werden.</para>
<para>Es ist nat&uuml;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.</para>
</sect1>
<sect1 id="policies-contributed">
<sect1info>
<authorgroup>
<author>
<firstname>Poul-Henning</firstname>
<surname>Kamp</surname>
<contrib>Beigesteuert von </contrib>
</author>
<author>
<firstname>David</firstname>
<surname>O'Brien</surname>
</author>
</authorgroup>
<!-- June 1996 -->
</sect1info>
<title>Beigesteuerte Software</title>
<indexterm><primary>Beigesteuerte Software</primary></indexterm>
<para>Einige Teile der FreeBSD-Distribution enthalten Software,
die aktiv au&szlig;erhalb des FreeBSD-Projektes gepflegt wird.
Aus historischen Gr&uuml;nden nennen wir dies
<emphasis>contributed</emphasis> Software. Beispiele daf&uuml;r
sind <application>sendmail</application>,
<application>gcc</application> und
<application>patch</application>.</para>
<para>&Uuml;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.</para>
<para>Es wurde viel &uuml;ber diesen Umstand diskutiert und
eine Methode als die <quote>offizielle</quote>
vorgestellt, um in Zukunft diese Art der Software zu
importieren. Ferner wird dringend geraten, dass sich
existierende, beigesteuerte Software diesem Modell
ann&auml;hert, da es signifikante Vorteile gegen&uuml;ber der
alten Methode gibt. Dazu geh&ouml;rt auch, dass jeder
einfach Diffs bez&uuml;glich der
<quote>offiziellen</quote> Quelltext-Versionen erzeugen kann
(auch ohne CVS-Zugang). Dies wird es deutlich vereinfachen,
&Auml;nderungen an die Hauptentwickler zur&uuml;ckflie&szlig;en zu
lassen.</para>
<para>Letztendlich kommt es jedoch auf die Menschen an, welche die
Arbeit leisten. Wenn die Durchf&uuml;hrung dieses Modells bei
einem Paket mal nicht m&ouml;glich ist, k&ouml;nnen Ausnahmen
dieser Regeln nur mit Genehmigung des Core-Teams und der
&Uuml;bereinstimmung der anderen Entwickler gew&auml;hrt werden.
Die F&auml;higkeit, dieses Paket auch in Zukunft pflegen zu
k&ouml;nnen, ist eine der Schl&uuml;sselfragen bei dieser
Entscheidung.</para>
<note>
<para>Durch einige bedauernswerte Einschr&auml;nkungen
des RCS-Dateiformats und die Handhabung von Herstellerzweigen
im CVS ist von unwesentlichen, trivialen und/oder kosmetischen
&Auml;nderungen an Dateien <emphasis>dringend
abzuraten</emphasis>, die dem Herstellerzweig folgen.
<quote>Grammatikalische oder sprachliche
Fehlerbehebungen</quote> sind explizit unter der
<quote>Kosmetik</quote>-Kategorie einzuordnen und sollten bei
Dateien mit einer 1.1.x.x-Revision vermieden werden. Das
Repository kann sich durch &Auml;nderungen einzelner Zeichen
dramatisch aufbl&auml;hen.</para>
</note>
<para>Die eingebettete
<application>Tcl</application>-Programmiersprache soll als
Beispiel dienen, wie dieses Modell funktioniert:</para>
<para><filename>src/contrib/tcl</filename> enth&auml;lt den
Quelltext so, wie vom Maintainer dieses Pakets bereitgestellt.
Teile, die unter FreeBSD g&auml;nzlich unnutzbar sind,
k&ouml;nnen entfernt werden. Im Fall von Tcl wurden die
Unterverzeichnisse <filename>mac</filename>,
<filename>win</filename> und <filename>compat</filename>
vor dem Import entfernt.</para>
<para><filename>src/lib/libtcl</filename> enth&auml;lt ein
<filename>Makefile</filename> im
<application>bmake</application>-Stil, das die Regeln des
Standard-Makefiles <filename>bsd.lib.mk</filename> nutzt, um
die Bibliothek zu erstellen und die Dokumentation zu
installieren.</para>
<para><filename>src/usr.bin/tclsh</filename> enth&auml;lt ein
<filename>Makefile</filename> im
<application>bmake</application>-Stil, welches das
<command>tclsh</command>-Programm erstellt und installiert,
ebenso die dazugeh&ouml;rigen Manualpages, welche die Regeln von
<filename>bsd.prog.mk</filename> nutzen.</para>
<para><filename>src/tools/tools/tcl_bmake</filename> enth&auml;lt
einige Shell-Skripten, die hilfreich sein k&ouml;nnen, wenn die
Tcl-Software aktualisiert werden soll. Diese sind nicht Teil
des Erstellens und der Installation der Software.</para>
<para>Das Entscheidende ist hier das
<filename>src/contrib/tcl</filename>-Verzeichnis, welches nach
den folgenden Regeln erstellt wird: Es muss den
Quelltext aus dem Original enthalten (ohne
RCS-Schl&uuml;sselworte und im korrekten CVS-Herstellerzweig)
mit so wenig FreeBSD-spezifischen &Auml;nderungen wie
m&ouml;glich. Sollte es Zweifel geben, wie hier zu verfahren
ist, unbedingt zuerst nachfragen und
nicht auf gut Gl&uuml;ck etwas probieren in der vagen
Hoffnung, dass es <quote>irgendwie tut</quote>. CVS verzeiht
keine Fehler beim Importieren und ein hoher Arbeitsaufwand
w&auml;re die Folge, um diesen gro&szlig;en Fehler wieder
wettzumachen.</para>
<para>Aufgrund der eingangs schon erw&auml;hnten Einschr&auml;nkungen
bei CVS-Herstellerzweigen ist es erforderlich,
dass <quote>offizielle</quote> Fehlerbehebungen vom Hersteller
in die Originalquellen der Distribution einflie&szlig;en und als
Resultat wieder in den Herstellerzweig importiert werden.
Offizielle Fehlerbehebungen sollten nie direkt in FreeBSD
eingepflegt und <quote>committet</quote> werden, da dies
den Herstellerzweig zerst&ouml;ren w&uuml;rde und der Import
von zuk&uuml;nftigen Versionen w&auml;re um ein Vielfaches
schwerer, da es zu Konflikten kommen w&uuml;rde.</para>
<para>Da einige Pakete Dateien enthalten, die zur
Kompatibilit&auml;t mit anderen Architekturen und Umgebungen
als FreeBSD gedacht sind, ist es zul&auml;ssig, diese Teile zu
l&ouml;schen, wenn sie f&uuml;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 <emphasis>nicht</emphasis>
gel&ouml;scht werden.</para>
<para>Falls es einfacher erscheint, k&ouml;nnen die
<command>bmake</command>-<filename>Makefile</filename>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</filename> gleich mit dem Port an sich
einzuchecken, sodass es f&uuml;r zuk&uuml;nftige Maintainer
verf&uuml;gbar ist.</para>
<para>Im Verzeichnis <filename>src/contrib/tcl</filename> sollte
eine Datei mit dem Namen <filename>FREEBSD-upgrade</filename>
hinzugef&uuml;gt werden und sie sollte den Stand wie folgt
anzeigen:</para>
<itemizedlist>
<listitem>
<para>Welche Dateien ausgelassen wurden.</para>
</listitem>
<listitem>
<para>Von wo die Original-Distribution stammt und/oder wo die
offizielle Hauptseite zu finden ist.</para>
</listitem>
<listitem>
<para>Wohin Fehlerbehebungen an den Originalautor gesendet
werden k&ouml;nnen.</para>
</listitem>
<listitem>
<para>M&ouml;glicherweise eine &Uuml;bersicht, welche
FreeBSD-spezifischen &Auml;nderungen vorgenommen
wurden.</para>
</listitem>
</itemizedlist>
<para>Importieren Sie jedoch <filename>FREEBSD-upgrade</filename>
nicht mit den beigesteuerten Quelldateien. Stattdessen sollten
Sie <command>cvs add FREEBSD-upgrade ; cvs ci</command> nach
dem initialen Import nutzen. Ein Beispiel von
<filename>src/contrib/cpio</filename> sehen Sie hier:</para>
<programlisting>
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. New versions or
official-patch versions must be imported. Please remember to import with
"-ko" to prevent CVS from corrupting any vendor RCS Ids.
For the import of GNU cpio 2.4.2, the following files were removed:
INSTALL cpio.info mkdir.c
Makefile.in cpio.texi mkinstalldirs
To upgrade to a newer version of cpio, when it is available:
1. Unpack the new version into an empty directory.
[Do not make ANY changes to the files.]
2. Remove the files listed above and any others that don't apply to
FreeBSD.
3. Use the command:
cvs import -ko -m 'Virgin import of GNU cpio v&lt;version&gt;' \
src/contrib/cpio GNU cpio_&lt;version&gt;
For example, to do the import of version 2.4.2, I typed:
cvs import -ko -m 'Virgin import of GNU v2.4.2' \
src/contrib/cpio GNU cpio_2_4_2
4. Follow the instructions printed out in step 3 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 cpio, simply patch and commit to the main
branch (aka HEAD). Never make local changes on the GNU branch.
All local changes should be submitted to "cpio@gnu.ai.mit.edu" for
inclusion in the next vendor release.
obrien@FreeBSD.org - 30 March 1997</programlisting>
</sect1>
<sect1 id="policies-encumbered">
<title>Belastende Dateien</title>
<para>Es kann gelegentlich notwendig sein, belastende Dateien
in den FreeBSD-Quelltextbaum zu integrieren. Braucht ein
Ger&auml;t zum Beispiel ein St&uuml;ck bin&auml;ren Code, der
zuerst geladen werden muss, bevor das Ger&auml;t funktioniert,
und wir haben keine Quellen zu diesem Code, dann wird die
bin&auml;re Datei als belastend bezeichnet. Die folgenden
Richtlinien sind beim Aufnehmen von belastenden Dateien in den
FreeBSD-Quelltextbaum zu beachten.</para>
<orderedlist>
<listitem>
<para>Jede Datei, die durch die System-CPU(s) ausgef&uuml;hrt
wird und nicht als Quelltext vorliegt, ist belastend.</para>
</listitem>
<listitem>
<para>Jede Datei, deren Lizenz restriktiver ist als die BSD-
oder GNU-Lizenz, ist belastend.</para>
</listitem>
<listitem>
<para>Eine Datei, die herunterladbare Bin&auml;r-Daten
enth&auml;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).</para>
</listitem>
<listitem>
<para>Jede belastende Datei braucht eine spezielle
Genehmigung vom <ulink
url="&url.articles.contributors;/staff-core.html">Core-Team</ulink>,
bevor diese in das CVS-Repository aufgenommen
werden darf.</para>
</listitem>
<listitem>
<para>Belastende Dateien liegen unter
<filename>src/contrib</filename> oder
<filename>src/sys/contrib</filename>.</para>
</listitem>
<listitem>
<para>Das komplette Modul sollte auch am St&uuml;ck
aufbewahrt werden. Es gibt keinen Grund, dieses zu teilen,
au&szlig;er es gibt einen Code-Austausch mit Quelltext, der
nicht belastend ist.</para>
</listitem>
<listitem>
<para>Objekt-Dateien werden wie folgt benannt:
<filename><replaceable>arch</replaceable>/<replaceable>filename</replaceable>.o.uu></filename>.</para>
</listitem>
<listitem>
<para>Kernel-Dateien:</para>
<orderedlist>
<listitem>
<para>Sollten immer nach
<filename>conf/files.*</filename> verweisen (um den Bau
einfach zu halten).</para>
</listitem>
<listitem>
<para>Sollten sich immer in <filename>LINT</filename>
befinden, jedoch entscheidet das <ulink
url="&url.articles.contributors;/staff-core.html">Core-Team</ulink>
je nach Fall, ob es
auskommentiert wird oder nicht. Das <ulink
url="&url.articles.contributors;/staff-core.html">Core-Team</ulink>
kann sich zu einem sp&auml;teren Zeitpunkt
immer noch anders entscheiden.</para>
</listitem>
<listitem>
<para>Der <firstterm>Release-Engineer</firstterm>
entscheidet, ob es in ein Release aufgenommen wird oder
nicht.</para>
</listitem>
</orderedlist>
</listitem>
<listitem>
<para>Userland-Dateien:</para>
<orderedlist>
<listitem>
<indexterm><primary>Core-Team</primary></indexterm>
<para>Das <ulink
url="&url.articles.contributors;/staff-core.html">Core-Team</ulink>
entscheidet, ob der Code von
<command>make world</command> gebaut wird oder nicht.</para>
</listitem>
<listitem>
<indexterm><primary>Release-Engineer</primary></indexterm>
<para>Der <ulink
url="&url.articles.contributors;/staff-who.html">Release-Engineer</ulink>
entscheidet, ob es in das Release
aufgenommen wird oder nicht.</para>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
</sect1>
<sect1 id="policies-shlib">
<sect1info>
<authorgroup>
<author>
<firstname>Satoshi</firstname>
<surname>Asami</surname>
<contrib>Beigesteuert von </contrib>
</author>
<author>
<firstname>Peter</firstname>
<surname>Wemm</surname>
</author>
<author>
<firstname>David</firstname>
<surname>O'Brien</surname>
</author>
</authorgroup>
<!-- 9 Dec 1996 -->
</sect1info>
<title>Shared-Libraries</title>
<para>Sollten Sie die Unterst&uuml;tzung f&uuml;r
Shared-Libraries bei einem Port oder einem St&uuml;ck Software,
das dies nicht hat, hinzuf&uuml;gen, sollten die Versionsnummern
dessen Regeln folgen. Im Allgemeinen hat die sich daraus
resultierende Nummer nichts mit der Release-Version der Software
zu tun.</para>
<para>Die drei Grunds&auml;tze zum Erstellen von Shared-Libraries
sind:</para>
<itemizedlist>
<listitem>
<para>Sie beginnen mit <literal>1.0</literal>.</para>
</listitem>
<listitem>
<para>Gibt es eine &Auml;nderung, die
abw&auml;rtskompatibel ist, so springen Sie zur
n&auml;chsten Minor-Version (beachten Sie, dass ELF-Systeme
die Minor-Version ignorieren).</para>
</listitem>
<listitem>
<para>Gibt es eine inkompatible &Auml;nderung, so springen
Sie bitte zur n&auml;chsten Major-Version.</para>
</listitem>
</itemizedlist>
<para>Zum Beispiel wird beim Hinzuf&uuml;gen von Funktionen und
oder Fehlerbehebungen zur n&auml;chsten Minor-Version
gesprungen, beim L&ouml;schen einer Funktion, &Auml;ndern
von Funktionsaufrufen usw. &auml;ndert sich die Major-Version.</para>
<para>Bleiben Sie bei Versionsnummern in der Form major.minor
(<replaceable>x</replaceable>.<replaceable>y</replaceable>).
Unser dynamischer Linker a.out kann mit Versionsnummern
in der Form
<replaceable>x</replaceable>.<replaceable>y</replaceable>.<replaceable>z</replaceable>
nicht gut umgehen.
Jede Versionsnummer nach dem <replaceable>y</replaceable>
(die dritte Zahl) wird v&ouml;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
<quote>micro</quote>-Revision unterscheiden, so wird
<command>ld.so</command> zu der h&ouml;heren verlinken.
Dies bedeutet, dass wenn Sie mit <filename>libfoo.so.3.3.3</filename>
verlinken, der Linker nur <literal>3.3</literal> in den
Header aufnimmt und alles linkt, was mit
<replaceable>libfoo.so.3</replaceable>
.<replaceable>(irgendetwas
&gt;= 3)</replaceable>.<replaceable>(h&ouml;chste
verf&uuml;gbare Nummer)</replaceable> beginnt.</para>
<note>
<para><command>ld.so</command> wird immer die h&ouml;chste
<quote>Minor</quote>-Revision benutzen. Beispielsweise wird
es die <filename>libc.so.2.2</filename> bevorzugen
gegen&uuml;ber der <filename>libc.so.2.0</filename>, auch
dann, wenn das Programm urspr&uuml;nglich mit
<filename>libc.so.2.0</filename> verlinkt war.</para>
</note>
<para>Unser dynamischer ELF-Linker kann keine Minor-Versionen
handhaben. Dennoch sollten die Major- und Minor-Versionen genutzt
werden, da unsere <filename>Makefile</filename>s <quote>das
Richtige machen</quote> bezogen auf den Systemtyp.</para>
<para>F&uuml;r nicht-Port-Bibliotheken lautet die Richtlinie,
die Shared-Library-Versionsnummer nur einmal zwischen den
Releases zu &auml;ndern. Weiterhin ist es vorgeschrieben, die
Major-Version der Shared-Libraries nur bei Major-OS-Releases zu
&auml;ndern (beispielsweise von 3.0 auf 4.0). Wenn Sie also eine
&Auml;nderung an einer Systembibliothek vornehmen, die eine neue
Versionsnummer ben&ouml;tigt, &uuml;berpr&uuml;fen Sie die
Commit-Logs des <filename>Makefile</filename>s. Es liegt in der
Verantwortung des Committers, dass sich eine erste solche
&Auml;nderung seit dem letzten Release in der aktualisierten
Versionsnummer der Shared-Library im
<filename>Makefile</filename> &auml;u&szlig;ert, folgende
&Auml;nderungen werden nicht ber&uuml;cksichtigt.</para>
</sect1>
</chapter>
<!--
Local Variables:
mode: sgml
sgml-declaration: "../chapter.decl"
sgml-indent-data: t
sgml-omittag: nil
sgml-always-quote-attributes: t
sgml-parent-document: ("../book.sgml" "part" "chapter")
End:
-->

View file

@ -0,0 +1,667 @@
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/developers-handbook/secure/chapter.sgml,v 1.11 2009/02/02 22:24:42 miwi Exp $
basiert auf: 1.27
-->
<chapter id="secure">
<chapterinfo>
<authorgroup>
<author>
<firstname>Murray</firstname>
<surname>Stokely</surname>
<contrib>Contributed by </contrib>
</author>
</authorgroup>
<authorgroup>
<author>
<firstname>Hagen</firstname>
<surname>K&uuml;hl</surname>
<contrib>&Uuml;bersetzt von </contrib>
</author>
</authorgroup>
</chapterinfo>
<title>Sicheres Programmieren</title>
<sect1 id="secure-synopsis">
<title>Zusammenfassung</title>
<para>Dieses Kapitel beschreibt einige Sicherheitsprobleme, die
&unix;-Programmierer seit Jahrzehnten qu&auml;len, und
inzwischen verf&uuml;gbare Werkzeuge, die Programmierern helfen,
Sicherheitsl&uuml;cken in ihrem Quelltext zu vermeiden.</para>
</sect1>
<sect1 id="secure-philosophy">
<title>Methoden des sicheren Entwurfs</title>
<para>Sichere Anwendungen zu schreiben erfordert eine sehr
skeptische und pessimistische Lebenseinstellung. Anwendungen
sollten nach dem Prinzip der <quote>geringsten
Privilegien</quote> ausgef&uuml;hrt werden, sodass kein Prozess
mit mehr als dem absoluten Minimum an Zugriffsrechten arbeitet,
die er zum Erf&uuml;llen seiner Aufgabe ben&ouml;tigt. Wo es
m&ouml;glich ist, sollte Quelltext, der bereits
&uuml;berpr&uuml;ft wurde, wiederverwendet werden, um
h&auml;ufige Fehler, die andere schon korrigiert haben, zu
vermeiden.</para>
<para>Eine der Stolperfallen der &unix;-Umgebung ist, dass es
sehr einfach ist Annahmen &uuml;ber die Konsistenz der Umgebung
zu machen. Anwendungen sollten Nutzereingaben (in allen Formen)
niemals trauen, genausowenig wie den System-Ressourcen,
der Inter-Prozess-Kommunikation oder dem zeitlichen Ablauf von
Ereignissen. &unix;-Prozesse arbeiten nicht synchron. Daher sind
logische Operationen selten atomar.</para>
</sect1>
<sect1 id="secure-bufferov">
<title>Puffer-&Uuml;berl&auml;ufe</title>
<para>Puffer-&Uuml;berl&auml;ufe gibt es schon seit den
Anf&auml;ngen der Von-Neuman-Architektur <xref linkend="COD">.
<indexterm><primary>Puffer-&Uuml;berlauf</primary></indexterm>
<indexterm><primary>Von-Neuman</primary></indexterm>
Sie erlangten zum ersten Mal durch den Internetwurm Morris im
Jahre 1988 &ouml;ffentliche Bekanntheit. Ungl&uuml;cklicherweise
<indexterm><primary>Morris Internetwurm</primary></indexterm>
funktioniert der gleiche grundlegende Angriff noch heute. Von
den 17 CERT-Sicherheitsmeldungen wurden 1999 zehn
<indexterm>
<primary>CERT</primary>
<secondary>Sicheitshinweise</secondary>
</indexterm>
direkt durch Puffer-&Uuml;berl&auml;ufe in der Software
verursacht. Die bei weitem h&auml;ufigste Form eines
Puffer-&Uuml;berlauf-Angriffs basiert darauf, den Stack
zu korrumpieren.</para>
<indexterm><primary>Stack</primary></indexterm>
<indexterm><primary>Arguments</primary></indexterm>
<para>Die meisten modernen Computer-Systeme verwenden einen
Stack, um Argumente an Prozeduren zu &uuml;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
<indexterm><primary>LIFO</primary></indexterm>
<indexterm>
<primary>Prozessabbild</primary>
<secondary>Stack-Pointer</secondary>
</indexterm>
aufruft wird ein neuer "Stackframe" erzeugt. Dieser besteht aus
den Argumenten, die der Funktion &uuml;bergeben wurden und
einem variabel grossem Bereich f&uuml;r lokale Variablen. Der
"Stack-Pointer" ist ein Register, dass die
<indexterm><primary>Stack-Frame</primary></indexterm>
<indexterm><primary>Stack-Pointer</primary></indexterm>
aktuelle Adresse der Stack-Spitze enth&auml;lt.
Da sich dieser Wert oft &auml;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. <xref linkend="COD">
Die R&uuml;cksprungadresse
<indexterm><primary>Frame-Pointer</primary></indexterm>
<indexterm>
<primary>Prozessabbild</primary>
<secondary>Frame-Pointer</secondary>
</indexterm>
<indexterm><primary>R&uuml;cksprungadresse</primary></indexterm>
<indexterm><primary>Stack-&Uuml;berlauf</primary></indexterm>
der Funktionen werden ebenfalls auf dem Stack
gespeichert und das ist der Grund f&uuml;r
Stack-&Uuml;berlauf-Exploits. Denn ein b&ouml;swilliger Nutzer
kann die R&uuml;cksprungadresse der Funktion &uuml;berschreiben
indem er eine lokale Variable in der Funktion
&uuml;berlaufen l&auml;sst, wodurch es ihm m&ouml;glich ist
beliebigen Code auszuf&uuml;hren.</para>
<para>Obwohl Stack-basierte Angriffe bei weitem die
H&auml;ufigsten sind, ist es auch m&ouml;glich den Stack mit
einem Heap-basierten (malloc/free) Angriff zu
&uuml;berschreiben.</para>
<para>Die C-Programmiersprache f&uuml;hrt keine automatischen
Bereichs&uuml;pr&uuml;fungen bei Feldern oder Zeigern durch, wie
viele andere Sprachen das tun. Au&szlig;erdem enth&auml;lt
die C-Standardbibliothek eine Handvoll sehr
gef&auml;hrlicher Funktionen.</para>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<tbody>
<row>
<entry><function>strcpy</function>(char *dest, const
char *src)</entry>
<entry><simpara>Kann den Puffer dest &uuml;berlaufen
lassen</simpara></entry>
</row>
<row>
<entry><function>strcat</function>(char *dest, const
char *src)</entry>
<entry><simpara>Kann den Puffer dest &uuml;berlaufen
lassen</simpara></entry>
</row>
<row>
<entry><function>getwd</function>(char *buf)</entry>
<entry><simpara>Kann den Puffer buf &uuml;berlaufen
lassen</simpara></entry>
</row>
<row>
<entry><function>gets</function>(char *s)</entry>
<entry><simpara>Kann den Puffer s &uuml;berlaufen
lassen</simpara></entry>
</row>
<row>
<entry><function>[vf]scanf</function>(const char
*format, ...)</entry>
<entry><simpara>Kann sein Argument &uuml;berlaufen
lassen</simpara></entry>
</row>
<row>
<entry><function>realpath</function>(char *path,
char resolved_path[])</entry>
<entry><simpara>Kann den Puffer path &uuml;berlaufen
lassen</simpara></entry>
</row>
<row>
<entry><function>[v]sprintf</function>(char *str,
const char *format, ...)</entry>
<entry><simpara>Kann den Puffer str &uuml;berlaufen
lassen</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<sect2>
<title>Puffer-&Uuml;berlauf Beispiel</title>
<para>Das folgende Quellcode-Beispiel enth&auml;lt einen
Puffer-&Uuml;berlauf, der darauf ausgelegt ist die
R&uuml;cksprungadresse zu &uuml;berschreiben und die
Anweisung direkt nach dem Funktionsaufruf zu
&uuml;berspringen. (Inspiriert durch
<xref linkend="Phrack">)</para>
<programlisting>#include <sgmltag>stdio.h</sgmltag>
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;
}</programlisting>
<para>Betrachten wir nun, wie das Speicherabbild dieses
Prozesses aussehen w&uuml;rde, wenn wir 160 Leerzeichen
in unser kleines Programm eingeben, bevor wir Enter
dr&uuml;cken.</para>
<para>[XXX figure here!]</para>
<para>Offensichtlich kann man durch b&ouml;swilligere Eingaben
bereits kompilierten Programmtext ausf&uuml;hren (wie z.B.
exec(/bin/sh)).</para>
</sect2>
<sect2>
<title>Puffer-&Uuml;berl&auml;ufe vermeiden</title>
<para>Die direkteste L&ouml;sung, um
Stack-&Uuml;berl&auml;ufe zu vermeiden, ist immer
gr&ouml;ssenbegrenzten Speicher und String-Copy-Funktionen
zu verwenden.
<function>strncpy</function> und <function>strncat</function>
sind Teil der C-Standardbibliothek.
<indexterm>
<primary>Zeichenketten-Kopierfunktioen</primary>
<secondary>strncpy</secondary>
</indexterm>
<indexterm>
<primary>Zeichenketten-Kopierfunktionen</primary>
<secondary>strncat</secondary>
</indexterm>
Diese Funktionen akzeptieren einen L&auml;ngen-Parameter. Dieser
Wert sollte nicht gr&ouml;&szlig;er sein als die L&auml;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&ouml;&szlig;e
<indexterm><primary>NUL-Terminierung</primary></indexterm>
des Eingabepuffers so gro&szlig; ist wie das Ziel.
Au&szlig;erdem wird der Parameter length zwischen strncpy
und strncat inkonsistent definiert, weshalb Programmierer
leicht bez&uuml;glich der korrekten Verwendung durcheinander
kommen k&ouml;nnen. Weiterhin gibt es einen sp&uuml;rbaren
Leistungsverlust im Vergleich zu
<function>strcpy</function>, wenn eine kurze Zeichenkette in
einen gro&szlig;en Puffer kopiert wird. Denn
<function>strncpy</function> f&uuml;lt den Puffer bis zur
angegebenen L&auml;nge mit NUL auf.
</para>
<para>In OpenBSD wurde eine weitere M&ouml;glichkeit zum
<indexterm><primary>OpenBSD</primary></indexterm>
kopieren von Speicherbereichen implementiert, die dieses
Problem umgeht. Die Funktionen <function>strlcpy</function>
und <function>strlcat</function> garantieren, dass das Ziel
immer NUL-terminiert wird, wenn das Argument length ungleich
null ist. F&uuml;r weitere Informationen &uuml;ber diese
Funktionen lesen Sie bitte <xref linkend="OpenBSD">. Die
OpenBSD-Funktionen <function>strlcpy</function> und
<function>strlcat</function> sind seit Version 3.3 auch in
FreeBSD verf&uuml;gbar.</para>
<indexterm>
<primary>Zeichenketten-Kopierfunktionen</primary>
<secondary>strlcpy</secondary>
</indexterm>
<indexterm>
<primary>Zeichenketten-Kopierfunktionen</primary>
<secondary>strlcat</secondary>
</indexterm>
<sect3>
<title>Compiler-basierte Laufzeit&uuml;berpr&uuml;fung
von Grenzen</title>
<indexterm>
<primary>Pr&uuml;fung von Grenzen</primary>
<secondary>Compiler-basiert</secondary>
</indexterm>
<para>Ungl&uuml;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&uuml;tzen, zu verwenden.
Gl&uuml;cklicherweise gibt es eine weitere L&ouml;sung.
Verschiedene Compiler-Erweiterungen und Bibliotheken
&uuml;berpr&uuml;fen die Grenzen in C/C++ zur
Laufzeit.</para>
<indexterm><primary>StackGuard</primary></indexterm>
<indexterm><primary>GCC</primary></indexterm>
<para>StackGuard ist eine solche Erweiterung, die als
kleiner Patch f&uuml;r den GCC-Code-Generator
implementiert ist. Von der <ulink
url="http://immunix.org/stackguard.html">StackGuard
Webseite</ulink> (&uuml;bersetzt):
<blockquote>
<para>"StackGuard erkennt und verhindert
Stack-Smashing-Angriffe, indem es die
R&uuml;cksprungadresse auf dem Stack davor
sch&uuml;tzt, ge&auml;ndert zu werden. StackGuard
platziert ein "Canary"-Wort (Anmerkung des
&Uuml;bersetzers: Kanarienvogel, nach einer
Sicherheitsvorkehrung von Bergleuten, um Gas
fr&uuml;hzeitig zu erkennen, ein Wort ist hier
ein 32-Bit-Speicherblock) neben der
R&uuml;cksprungadresse, wenn eine Funktion aufgerufen
wird. Wenn das Canary bei der R&uuml;ckkehr der
Funktion ge&auml;ndert wurde, reagiert das Programm
auf den Versuch eines Stack-Smashing-Angriffs,
schickt eine Benachrichtigung an Syslog und
h&auml;lt dann an."</para>
</blockquote>
<blockquote>
<para>"StackGuard ist als ein kleiner Patch f&uuml;r
den GCC-Code-Generator implementiert, um genau zu
sein, f&uuml;r die Routinen function_prolog() und
function_epilog().
function_prolog() wurde erweitert, um Canaries beim
Start einer Funktion auf den Stack zu legen und
function_epilog() &uuml;berpr&uuml;ft die
Integrit&auml;t des Canaries beim Beenden der
Funktion. Jeder Versuch, die R&uuml;cksprungadresse
zu &auml;ndern, wird daher erkannt, bevor die
Funktion zur&uuml;ckkehrt."</para>
</blockquote>
</para>
<indexterm><primary>Puffer-&Uuml;berlauf</primary></indexterm>
<para>Ihre Anwendungen mit StackGuard neu zu kompilieren ist
eine effektive Ma&szlig;nahme, um sie vor den meisten
Puffer-&Uuml;berlauf-Angriffen zu sch&uuml;tzen, aber die
Programme k&ouml;nnen noch immer kompromittiert werden.</para>
</sect3>
<sect3>
<title>Bibliotheks-basierte Laufzeit&uuml;berpr&uuml;fung
von Grenzen</title>
<indexterm>
<primary>Pr&uuml;fung von Grenzen</primary>
<secondary>Bibliotheks-basiert</secondary>
</indexterm>
<para>Compiler-basierte Mechanismen sind bei Software,
die nur im Bin&auml;rformat vertrieben wird, und die somit
nicht neu kompiliert werden kann v&ouml;llig nutzlos.
F&uuml;r diesen Fall gibt es einige Bibliotheken, welche
die unsicheren Funktionen der C-Bibliothek
(<function>strcpy</function>, <function>fscanf</function>,
<function>getwd</function>, etc..) neu implementieren und
sicherstellen, dass nicht hinter den Stack-Pointer
geschrieben werden kann.</para>
<itemizedlist>
<listitem><simpara>libsafe</simpara></listitem>
<listitem><simpara>libverify</simpara></listitem>
<listitem><simpara>libparanoia</simpara></listitem>
</itemizedlist>
<para>Leider haben diese Bibliotheks-basierten
Verteidigungen mehrere Schw&auml;chen. Diese Bibliotheken
sch&uuml;tzen nur vor einer kleinen Gruppe von
Sicherheitsl&uuml;cken und sie k&ouml;nnen das
eigentliche Problem nicht l&ouml;sen. Diese
Ma&szlig;nahmen k&ouml;nnen versagen, wenn die Anwendung
mit -fomit-frame-pointer kompiliert wurde.
Au&szlig;erdem kann der Nutzer die Umgebungsvariablen
LD_PRELOAD und LD_LIBRARY_PATH &uuml;berschreiben oder
l&ouml;schen.</para>
</sect3>
</sect2>
</sect1>
<sect1 id="secure-setuid">
<title>SetUID-Themen</title>
<indexterm><primary>seteuid</primary></indexterm>
<para>Es gibt zu jedem Prozess mindestens sechs verschiedene
IDs, die diesem zugeordnet sind. Deshalb m&uuml;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&ouml;tigen.</para>
<indexterm>
<primary>Benutzer-IDs</primary>
<secondary>reale Benutzer-ID</secondary>
</indexterm>
<indexterm>
<primary>Benutzer-IDs</primary>
<secondary>effective Benutzer-ID</secondary>
</indexterm>
<para>Die reale Benutzer-ID kann nur von einem
Superuser-Prozess ge&auml;ndert werden. Das Programm
<application>login</application> setzt sie, wenn sich ein
Benutzer am System anmeldet, und sie wird nur selten
ge&auml;ndert.</para>
<para>Die effektive Benutzer-ID wird von der Funktion
<function>exec()</function> gesetzt, wenn ein Programm
das seteuid-Bit gesetzt hat. Eine Anwendung kann
<function>seteuid()</function> jederzeit aufrufen, um die
effektive Benutzer-ID entweder auf die reale Benutzer-ID oder
die gespeicherte set-user-ID zu setzen. Wenn eine der
<function>exec()</function>-Funktionen die effektive
Benutzer-ID setzt, wird der vorherige Wert als
gespeicherte set-user-ID abgelegt.</para>
</sect1>
<sect1 id="secure-chroot">
<title>Die Umgebung ihres Programme einschr&auml;nken</title>
<indexterm><primary>chroot()</primary></indexterm>
<para>Die herk&ouml;mmliche Methode, um einen Prozess
einzuschr&auml;nken, besteht in dem Systemaufruf
<function>chroot()</function>. Dieser Aufruf
&auml;ndert das Wurzelverzeichnis, auf das sich alle
Pfadangaben des Prozesses und jegliche Kind-Prozesse beziehen.
Damit dieser Systemaufruf gelingt, muss der Prozess
Ausf&uuml;hrungsrechte (Durchsuchungsrechte) f&uuml;r das
Verzeichnis haben, auf das er sich bezieht. Die neue Umgebung
wird erst wirksam, wenn Sie mittels
<function>chdir()</function> in Ihre neue Umgebung wechseln.
Es sollte erw&auml;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&auml;tedateien
anlegt, um Kernel-Speicher zu lesen, oder indem man einen
Debugger mit einem Prozess au&szlig;erhalb seines
Gef&auml;ngnisses verbindet, oder auf viele andere
kreative Wege.</para>
<para>Das Verhalten des Systemaufrufs
<function>chroot()</function> kann durch die
kern.chroot.allow_open_directories
<command>sysctl</command>-Variable beeinflusst werden. Wenn
diese auf 0 gesetzt ist, wird <function>chroot()</function>
mit EPERM fehlschlagen, wenn irgendwelche Verzeichnisse
ge&ouml;ffnet sind. Wenn die Variable auf den Standardwert 1
gesetzt ist, wird <function>chroot()</function> mit EPERM
fehlschlagen, wenn irgendwelche Verzeichnisse ge&ouml;ffnet
sind und sich der Prozess bereits in einer
<function>chroot()</function>-Umgebung befindet. Bei jedem
anderen Wert wird die &Uuml;berpr&uuml;fung auf
ge&ouml;ffnete Verzeichnisse komplett umgangen.</para>
<sect2>
<title>Die Jail-Funktionalit&auml;t in FreeBSD</title>
<indexterm><primary>Jail</primary></indexterm>
<para>Das Konzept einer Jail (Gef&auml;ngnis) erweitert
<function>chroot()</function>, indem es die Macht des
Superusers einschr&auml;nkt, um einen echten 'virtuellen
Server' zu erzeugen. Wenn ein solches Gef&auml;ngnis einmal
eingerichtet ist, muss die gesamte Netzwerkkommunikation
&uuml;ber eine bestimmte IP-Adresse erfolgen und die
"root-Privilegien" innerhalb der Jail sind sehr stark
eingeschr&auml;nkt.</para>
<para>Solange Sie sich in einer Jail befinden, werden alle
Tests auf Superuser-Rechte durch den Aufruf von
<function>suser()</function> fehlschlagen. Allerdings wurden
einige Aufrufe von <function>suser()</function>
abge&auml;ndert, um die neue
<function>suser_xxx()</function>-Schnittstelle zu
implementieren. Diese Funktion ist daf&uuml;r verantwortlich,
festzustellen, ob bestimmte Superuser-Rechte einem
eingesperrten Prozess zur Verf&uuml;gung stehen.</para>
<para>Ein Superuser-Prozess innerhalb einer Jail darf
folgendes:</para>
<itemizedlist>
<listitem>
<simpara>Berechtigungen ver&auml;ndern mittels:
<function>setuid</function>,
<function>seteuid</function>,
<function>setgid</function>,
<function>setegid</function>,
<function>setgroups</function>,
<function>setreuid</function>,
<function>setregid</function>,
<function>setlogin</function></simpara>
</listitem>
<listitem>
<simpara>Ressourcenbegrenzungen setzen mittels
<function>setrlimit</function></simpara>
</listitem>
<listitem>
<simpara>Einige sysctl-Variablen (kern.hostname)
ver&auml;ndern</simpara>
</listitem>
<listitem>
<simpara><function>chroot()</function></simpara>
</listitem>
<listitem>
<simpara>Ein Flag einer vnode setzen:
<function>chflags</function>,
<function>fchflags</function></simpara>
</listitem>
<listitem>
<simpara>Attribute einer vnode setzen wie Dateiberechtigungen,
Eigent&uuml;mer, Gruppe, Gr&ouml;&szlig;e, Zugriffszeit
und Modifikationszeit</simpara>
</listitem>
<listitem>
<simpara>Binden eines Prozesses an einen &ouml;ffentlichen
privilegierten Port (ports &lt; 1024)</simpara>
</listitem>
</itemizedlist>
<para><function>Jail</function>s sind ein m&auml;chtiges
Werkzeug, um Anwendungen in einer sicheren Umgebung
auszuf&uuml;hren, aber sie haben auch ihre Nachteile.
Derzeit wurden die IPC-Mechanismen noch nicht an
<function>suser_xxx</function> angepasst, so dass Anwendungen
wie MySQL nicht innerhalb einer Jail ausgef&uuml;hrt werden
k&ouml;nnen. Der Superuser-Zugriff hat in einer Jail nur eine
sehr eingeschr&auml;nkte Bedeutung, aber es gibt keine
M&ouml;glichkeit zu definieren was
"sehr eingeschr&auml;nkt" hei&szlig;t.</para>
</sect2>
<sect2>
<title>&posix;.1e Prozess Capabilities</title>
<indexterm><primary>POSIX.1e Process
Capabilities</primary></indexterm>
<indexterm><primary>TrustedBSD</primary></indexterm>
<para>&posix; hat einen funktionalen Entwurf (Working Draft)
herausgegeben, der Ereignis&uuml;berpr&uuml;fung,
Zugriffskontrolllisten, feiner einstellbare Privilegien,
Informationsmarkierung und verbindliche Zugriffskontrolle
enth&auml;lt.</para>
<para>Dies ist im Moment in Arbeit und das Hauptziel des <ulink
url="http://www.trustedbsd.org/">TrustedBSD</ulink>-Projekts.
Ein Teil der bisherigen Arbeit wurde in &os.current;
&uuml;bernommen (cap_set_proc(3)).</para>
</sect2>
</sect1>
<sect1 id="secure-trust">
<title>Vertrauen</title>
<para>Eine Anwendung sollte niemals davon ausgehen, dass
irgendetwas in der Nutzerumgebung vern&uuml;nftig ist.
Das beinhaltet (ist aber sicher nicht darauf
beschr&auml;nkt): Nutzereingaben, Signale,
Umgebungsvariablen, Ressourcen, IPC, mmaps, das
Arbeitsverzeichnis im Dateisystem, Dateideskriptoren,
die Anzahl ge&ouml;ffneter Dateien, etc..</para>
<indexterm><primary>positive Filterung</primary></indexterm>
<indexterm><primary>Datenvalidierung</primary></indexterm>
<para>Sie sollten niemals annehmen, dass Sie jede Art von
inkorrekten Eingaben abfangen k&ouml;nnen, die ein Nutzer
machen kann. Stattdessen sollte Ihre Anwendung positive
Filterung verwenden, um nur eine bestimmte Teilmenge an
Eingaben zuzulassen, die Sie f&uuml;r sicher halten.
Ungeeignete Daten&uuml;berpr&uuml;fung ist die Ursache
vieler Exploits, besonders f&uuml;r CGI-Skripte im Internet.
Bei Dateinamen m&uuml;ssen Sie besonders vorsichtig sein,
wenn es sich um Pfade ("../", "/"), symbolische
Verkn&uuml;pfungen und Shell-Escape-Sequenzen handelt.</para>
<indexterm><primary>Perl Taint-Modus</primary></indexterm>
<para>Perl bietet eine wirklich coole Funktion, den sogenannten
"Taint"-Modus, der verwendet werden kann, um zu verhindern,
dass Skripte Daten, die von au&szlig;erhalb des Programmes
stammen, auf unsichere Art und Weise verwenden. Dieser
Modus &uuml;berpr&uuml;ft Kommandozeilenargumente,
Umgebungsvariablen, Lokalisierungsinformationen, die
Ergebnisse von Systemaufrufen
(<function>readdir()</function>,
<function>readlink()</function>,
<function>getpwxxx()</function>)
und alle Dateieingaben.</para>
</sect1>
<sect1 id="secure-race-conditions">
<title>Race-Conditions</title>
<para>Eine Race-Condition ist ein unnormales Verhalten, das von
einer unerwarteten Abh&auml;ngigkeit beim Timing von Ereignissen
verursacht wird. Mit anderen Worten hei&szlig;t das, ein
Programmierer nimmt irrt&uuml;mlicher Weise an, dass ein
bestimmtes Ereignis immer vor einem anderen stattfindet.</para>
<indexterm><primary>Race-Conditions</primary>
<secondary>Signale</secondary></indexterm>
<indexterm><primary>Race-Conditions</primary>
<secondary>Zugriffspr&uuml;fungen</secondary></indexterm>
<indexterm><primary>Race-Conditions</primary>
<secondary>&Ouml;ffnen von Dateien</secondary></indexterm>
<para>Einige der h&auml;ufigsten Ursachen f&uuml;r
Race-Conditions sind Signale, Zugriffspr&uuml;fungen und das
&Ouml;ffnen von Dateien. Signale sind von Natur aus
asynchrone Ereignisse, deshalb ist besondere Vorsicht im
Umgang damit geboten. Das Pr&uuml;fen des Zugriffs mittels
der Aufrufe <function>access(2)</function> gefolgt von
<function>open(2)</function> ist offensichtlich nicht atomar.
Benutzer k&ouml;nnen zwischen den beiden Aufrufen Dateien
verschieben. Stattdessen sollten privilegierte Anwendungen
<function>seteuid()</function> direkt gefolgt von
<function>open()</function> aufrufen. Auf die gleiche Art
sollte eine Anwendung immer eine korrekte Umask vor dem
Aufruf von <function>open()</function> setzen, um
st&ouml;rende Aufrufe von <function>chmod()</function> zu
umgehen.</para>
</sect1>
</chapter>

View file

@ -0,0 +1,19 @@
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/developers-handbook/sockets/chapter.sgml,v 1.4 2009/02/10 11:20:38 jkois Exp $
basiert auf: 1.15
-->
<chapter id="sockets">
<title>Sockets</title>
<para>Dieses Kapitel ist noch nicht &uuml;bersetzt.
Lesen Sie bitte <ulink
url="&url.books.developers-handbook.en;/sockets.html">
das Original in englischer Sprache</ulink>. Wenn Sie helfen
wollen, dieses Kapitel zu &uuml;bersetzen, senden Sie bitte
eine E-Mail an die Mailingliste &a.de.translators;.</para>
</chapter>

View file

@ -0,0 +1,277 @@
<!--
The FreeBSD Documentation Project
The FreeBSD German Documentation Project
$FreeBSD$
$FreeBSDde: de-docproj/books/developers-handbook/testing/chapter.sgml,v 1.7 2007/11/15 11:02:51 as Exp $
basiert auf: 1.2
-->
<chapter id="testing">
<chapterinfo>
<authorgroup>
<author>
<firstname>J&uuml;rgen</firstname>
<surname>Lock</surname>
<contrib>&Uuml;bersetzt von </contrib>
</author>
</authorgroup>
</chapterinfo>
<title>Regressions- und Performance-Tests</title>
<para>Regressions-Tests werden durchgef&uuml;hrt, um zu &uuml;berpr&uuml;fen,
ob ein bestimmter Teil des Systems wie erwartet funktioniert, und
um sicherzustellen, dass bereits beseitigte Fehler nicht wieder eingebaut
werden.</para>
<para>Die &os;-Regressions-Testwerkzeuge finden Sie im
&os;-Quelltextbaum unter <filename
class="directory">src/tools/regression</filename>.</para>
<section id="testing-micro-benchmark">
<title>Mikro-Benchmark-Checkliste</title>
<para>Dieser Abschnitt enth&auml;lt Tipps, wie
ordnungsgem&auml;&szlig;e Mikro-Benchmarks unter &os; oder f&uuml;r
&os; selbst erstellt werden.</para>
<para>Es ist nicht m&ouml;glich, immer alle der folgenden
Vorschl&auml;ge zu ber&uuml;cksichtigen, aber je mehr davon,
desto besser wird der Benchmark kleine
Unterschiede nachweisen k&ouml;nnen.</para>
<itemizedlist>
<listitem>
<para>Schalten Sie <acronym>APM</acronym> und alles andere,
das den Systemtakt beeinflusst, ab
(<acronym>ACPI</acronym>?).</para>
</listitem>
<listitem>
<para>Starten Sie in den Single-User-Modus. &man.cron.8;
und andere Systemdienste verursachen nur St&ouml;rungen.
Genauso der &man.sshd.8;-Systemdienst.
Falls w&auml;hrend des Tests
SSH-Zugriff ben&ouml;tigt wird, schalten Sie entweder die
Neuerstellung des SSHv1-Schl&uuml;ssels ab oder beenden Sie
den <command>sshd</command>-Elternprozess w&auml;hrend der
Tests.</para>
</listitem>
<listitem>
<para>Beenden Sie &man.ntpd.8;.</para>
</listitem>
<listitem>
<para>Falls &man.syslog.3;-Ereignisse erzeugt werden,
starten Sie &man.syslogd.8; mit leerer
<filename>/etc/syslogd.conf</filename> oder beenden Sie
es.</para>
</listitem>
<listitem>
<para>Sorgen Sie f&uuml;r m&ouml;glichst wenig Disk-I/O;
vermeiden Sie es ganz wenn m&ouml;glich.</para>
</listitem>
<listitem>
<para>H&auml;ngen Sie keine Dateisysteme ein, die Sie nicht
ben&ouml;tigen.</para>
</listitem>
<listitem>
<para>H&auml;ngen Sie <filename
class="directory">/</filename>, <filename
class="directory">/usr</filename> und die anderen
Dateisysteme nur lesbar ein wenn m&ouml;glich. Dies
verhindert, dass atime-Aktualisierungen auf der Festplatte (usw.) das
Ergebnis verf&auml;lschen.</para>
</listitem>
<listitem>
<para>Initialisieren Sie das beschreibbare
Test-Dateisystem mit &man.newfs.8; neu und f&uuml;llen Sie es
aus einer &man.tar.1;- oder &man.dump.8;-Datei vor jedem
Lauf. H&auml;ngen Sie es aus und wieder ein, bevor Sie den
Test starten. Dies sorgt f&uuml;r einen konsistenten
Dateisystemaufbau. Bei einem <quote>worldstone</quote>-Test
bezieht sich dies auf <filename
class="directory">/usr/obj</filename> (Initialisieren Sie
es einfach mit <command>newfs</command> neu und h&auml;ngen Sie
es ein). Um absolut reproduzierbare Ergebnisse zu bekommen,
f&uuml;llen Sie das Dateisystem aus einer &man.dd.1;-Datei
(d.h. <command>dd
if=<filename>myimage</filename> of=<filename
class="devicefile">/dev/ad0s1h</filename>
bs=1m</command>).</para>
</listitem>
<listitem>
<para>Benutzen Sie malloc-gest&uuml;tzte oder vorbelastete
&man.md.4;-Partitionen.</para>
</listitem>
<listitem>
<para>Starten Sie zwischen den einzelnen
Durchl&auml;ufen neu, dies sichert einen konsistenteren
Zustand.</para>
</listitem>
<listitem>
<para>Entfernen Sie alle nicht unbedingt ben&ouml;tigten
Ger&auml;tetreiber aus dem Kernel. Wenn z.B. USB f&uuml;r
den Test nicht ben&ouml;tigt wird, entfernen Sie es aus dem
Kernel. Ger&auml;tetreiber, die sich Hardware zuteilen, haben
oft <quote>tickende</quote> Timeouts.</para>
</listitem>
<listitem>
<para>Konfigurieren Sie nicht Hardware, die
nicht benutzt wird. Entfernen Sie Festplatten
mit &man.atacontrol.8; und &man.camcontrol.8;, wenn diese
f&uuml;r den Test nicht gebraucht werden.</para>
</listitem>
<listitem>
<para>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 &uuml;bertragen
wollen.</para>
<para>Falls das System an ein &ouml;ffentliches Netzwerk
angeschlossen sein muss, achten Sie auf Spitzen im
Broadcast-Verkehr. Obwohl dieser kaum auff&auml;llt, wird
er CPU-Zyklen brauchen. &Auml;hnliches gilt f&uuml;r
Multicast.</para>
</listitem>
<listitem>
<para>Legen Sie jedes Dateisystem auf eine eigene Festplatte.
Dies minimiert Jitter durch Optimierungen von
Lesekopfbewegungen.</para>
</listitem>
<listitem>
<para>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&auml;hrend der Test
l&auml;uft, sogar <keycap>space</keycap> oder
<keycap>back-space</keycap> wirken sich auf die
Ergebnisse aus.</para>
</listitem>
<listitem>
<para>Stellen Sie sicher, dass der Test lang genug
l&auml;uft, aber nicht zu lange. Wenn er zu kurz ist, sind
Zeitstempel ein Problem. Wenn er zu lang ist, werden
Temperatur&auml;nderungen und Drift die Frequenz von
Quarzkristallen im Rechner beeinflussen. Daumenregel: mehr
als eine Minute, weniger als eine Stunde.</para>
</listitem>
<listitem>
<para>Versuchen Sie, die Temparatur in der Umgebung des
Rechners so stabil wie m&ouml;glich zu halten. Diese beeinflusst
sowohl Quarzkristalle als auch Festplatten-Algorithmen.
Um einen wirklich stabilen Takt zu erhalten, w&auml;re es auch
m&ouml;glich, einen stabilisierten Takt anzuschlie&szlig;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
&a.phk;, wenn Sie mehr Informationen hier&uuml;ber
ben&ouml;tigen.</para>
</listitem>
<listitem>
<para>Lassen Sie den Test mindestens drei Mal laufen, besser
mehr als 20 Mal, sowohl
f&uuml;r <quote>vor</quote> als auch f&uuml;r
<quote>nach</quote> dem Code. Versuchen Sie abzuwechseln
(d.h. nicht erst 20 Mal <quote>vorher</quote> und dann 20
Mal <quote>nachher</quote>), dies erm&ouml;glicht,
umgebungsbedingte Effekte zu erkennen. Wechseln Sie nicht
1:1 ab, sondern 3:3; dies erlaubt,
Wechselwirkungseffekte zu erkennen.</para>
<para>Ein gutes Muster ist:
<literal>bababa{bbbaaa}*</literal>. Dies gibt Hinweise nach
den ersten 1+1-L&auml;ufen (sodass Sie den Test stoppen
k&ouml;nnen, falls er v&ouml;llig daneben geht), Sie
k&ouml;nnen die Standardabweichung nach den ersten 3+3-L&auml;ufen
&uuml;berpr&uuml;fen (zeigt an, ob sich ein
l&auml;ngerer Lauf lohnt), sp&auml;ter
Trends und Wechselwirkungen.</para>
</listitem>
<listitem>
<para>Benutzen Sie <filename
class="directory">usr/src/tools/tools/ministat</filename>, um
festzustellen, ob Ihre Ergebnisse signifikant sind.
&Uuml;berlegen Sie sich, das Buch <quote>Cartoon guide to
statistics</quote> ISBN: 0062731025 zu kaufen. Es ist sehr
empfehlenswert, falls Sie Dinge wie Standardabweichung und
Studentsche t-Verteilung vergessen oder nie gelernt
haben.</para>
</listitem>
<listitem>
<para>Benutzen Sie keinen Hintergrund-&man.fsck.8;, wenn Sie
ihn nicht selbst testen
wollen. Schalten Sie auch <varname>background_fsck</varname>
in <filename>/etc/rc.conf</filename> aus, es sei denn der
Benchmark wird nicht mindestens 60+<quote>Laufzeit von
<command>fsck</command></quote> Sekunden nach Systemstart
gestartet, da &man.rc.8; startet und pr&uuml;ft, ob
<command>fsck</command> auf irgendeinem der Dateisysteme
laufen muss, wenn Hintergrund-<command>fsck</command>
eingeschaltet ist. Stellen Sie ebenfalls sicher, dass keine
Snapshots herumliegen, falls der Benchmark nicht ein Test
mit Snapshots ist.</para>
</listitem>
<listitem>
<para>Falls der Benchmark unerwartet schlechte Performance
zeigt, &uuml;berpr&uuml;fen Sie Dinge wie gro&szlig;e Mengen
Interrupts von unerwarteten Quellen. Es gibt Berichte, dass
einige <acronym>ACPI</acronym>-Versionen sich <quote>daneben
benehmen</quote> und ein &Uuml;berma&szlig; an Interrupts
erzeugen. Um zu helfen, ungew&ouml;hnliche Testergebnisse zu
diagnostizieren, machen Sie ein paar Momentaufnahmen von
<command>vmstat -i</command> und suchen Sie nach
Ungew&ouml;hnlichem.</para>
</listitem>
<listitem>
<para>Gehen Sie mit Parametern zur Optimierung
von Kernel, Userland und Fehlersuche vorsichtig um.
Es passiert schnell, irgendetwas durchrutschen zu
lassen und dann sp&auml;ter festzustellen, dass der Test
nicht das gleiche verglichen hat.</para>
</listitem>
<listitem>
<para>Erstellen Sie nie Benchmarks unter Verwendung der Kernel-Optionen
<literal>WITNESS</literal> und <literal>INVARIANTS</literal>,
wenn der Test nicht diese Merkmale selbst
untersuchen soll. <literal>WITNESS</literal> kann zu 400% und
mehr Performance-Abnahme f&uuml;hren. &Auml;hnliches gilt
f&uuml;r Userland-&man.malloc.3;-Parameter, Voreinstellungen
hierbei unterscheiden sich bei -CURRENT von denen bei
Production-Releases.</para>
</listitem>
</itemizedlist>
</section>
</chapter>
<!--
Local Variables:
mode: sgml
sgml-declaration: "../chapter.decl"
sgml-indent-data: t
sgml-omittag: nil
sgml-always-quote-attributes: t
sgml-parent-document: ("../book.sgml" "part" "chapter")
End:
-->

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff