3538 lines
144 KiB
XML
3538 lines
144 KiB
XML
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
|
|
<!--
|
|
The FreeBSD Documentation Project
|
|
The FreeBSD German Documentation Project
|
|
|
|
$FreeBSD$
|
|
$FreeBSDde: de-docproj/books/handbook/config/chapter.sgml,v 1.151 2011/12/19 14:55:31 bcr Exp $
|
|
basiert auf: 1.248
|
|
-->
|
|
|
|
<chapter id="config-tuning">
|
|
<chapterinfo>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Chern</firstname>
|
|
<surname>Lee</surname>
|
|
<contrib>Geschrieben von </contrib>
|
|
</author>
|
|
</authorgroup>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Mike</firstname>
|
|
<surname>Smith</surname>
|
|
<contrib>Nach einem Tutorium von </contrib>
|
|
</author>
|
|
</authorgroup>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Matt</firstname>
|
|
<surname>Dillon</surname>
|
|
<contrib>Basiert ebenfalls auf tuning(7) von </contrib>
|
|
</author>
|
|
</authorgroup>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Martin</firstname>
|
|
<surname>Heinen</surname>
|
|
<contrib>Übersetzt von </contrib>
|
|
</author>
|
|
</authorgroup>
|
|
</chapterinfo>
|
|
|
|
<title>Konfiguration und Tuning</title>
|
|
|
|
<sect1 id="config-synopsis">
|
|
<title>Übersicht</title>
|
|
|
|
<indexterm><primary>System-Konfiguration</primary></indexterm>
|
|
<indexterm><primary>System-Optimierung</primary></indexterm>
|
|
|
|
<para>Ein korrekt konfiguriertes System kann die Arbeit,
|
|
die bei der zukünftigen Pflege und bei Migrationen des Systems
|
|
entsteht, erheblich reduzieren. Dieses Kapitel beschreibt die
|
|
Konfiguration von &os; sowie Maßnahmen zur Leistungssteigerung
|
|
von &os;-Systemen.</para>
|
|
|
|
<para>Nachdem Sie dieses Kapitel durchgearbeitet haben,
|
|
werden Sie Folgendes wissen:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>Wie Sie effizient Dateisysteme und
|
|
Swap-Partitionen auf Ihrer Festplatte einrichten.</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>Die Grundlagen der Konfiguration mit
|
|
<filename>rc.conf</filename> und des Systems zum Starten
|
|
von Anwendungen in <filename
|
|
class="directory">/usr/local/etc/rc.d</filename>.</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>Wie Sie Netzwerkkarten konfigurieren und testen.</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>Wie Sie virtuelle Hosts und Netzwerkgeräte
|
|
konfigurieren.</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>Wie Sie die verschiedenen Konfigurationsdateien
|
|
in <filename class="directory">/etc</filename> benutzen.</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>Wie Sie mit <command>sysctl</command>-Variablen &os;
|
|
einstellen können.</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>Wie Sie die Platten-Performance einstellen und Kernel-Parameter
|
|
modifizieren können.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>Bevor Sie dieses Kapitel lesen, sollten Sie</para>
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>die Grundlagen von &unix; und &os; (<xref linkend="basics"/>)
|
|
verstehen.</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>Damit vertraut sein, wie Sie einen Kernel konfigurieren
|
|
und kompilieren (<xref linkend="kernelconfig"/>).</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-initial">
|
|
<title>Vorbereitende Konfiguration</title>
|
|
|
|
<sect2>
|
|
<title>Layout von Partitionen</title>
|
|
|
|
<indexterm><primary>Layout von Partitionen</primary></indexterm>
|
|
<indexterm><primary><filename
|
|
class="directory">/etc</filename></primary></indexterm>
|
|
<indexterm><primary><filename
|
|
class="directory">/var</filename></primary></indexterm>
|
|
<indexterm><primary><filename
|
|
class="directory">/usr</filename></primary></indexterm>
|
|
|
|
<sect3>
|
|
<title>Partitionen</title>
|
|
|
|
<para>Wenn Sie Dateisysteme mit &man.bsdlabel.8; oder
|
|
&man.sysinstall.8; 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 oft benutzten
|
|
Dateisysteme, wie das Root-Dateisystem oder die Swap-Partition,
|
|
an den äußeren Rand der Platte gelegt werden.
|
|
Die größeren Partitionen wie <filename
|
|
class="directory">/usr</filename> sollten in die inneren Bereiche
|
|
gelegt werden. Es empfiehlt sich, die Partitionen in einer
|
|
ähnlichen Reihenfolge wie Root-Partition, Swap, <filename
|
|
class="directory">/var</filename> und <filename
|
|
class="directory">/usr</filename> anzulegen.</para>
|
|
|
|
<para>Die Größe der <filename
|
|
class="directory">/var</filename>-Partition ist abhängig vom
|
|
Zweck der Maschine. Das <filename
|
|
class="directory">/var</filename>-Dateisystem enthält
|
|
hauptsächlich Postfächer, den Spoolbereich zum Drucken und
|
|
Logdateien. Abhängig von der Anzahl der Systembenutzer und der
|
|
Aufbewahrungszeit für Logdateien, können gerade
|
|
die Postfächer und Logdateien zu ungeahnten Größen
|
|
wachsen. Die meisten Benutzer werden selten mehr als etwa ein
|
|
Gigabyte in <filename class="directory">/var</filename>
|
|
benötigen.</para>
|
|
|
|
<note>
|
|
<para>Ein paar Mal wird es vorkommen, dass viel Festplattenspeicher
|
|
in <filename class="directory">/var/tmp</filename> gebraucht
|
|
wird. Wenn neue Software mit &man.pkg.add.1; installiert wird,
|
|
extrahieren die Paketwerkzeuge eine vorübergehende Kopie der
|
|
Pakete unter <filename class="directory">/var/tmp</filename>. Die
|
|
Installation grosser Softwarepakete wie
|
|
<application>Firefox</application>,
|
|
<application>Openoffice</application> oder
|
|
<application>LibreOffice</application> kann sich wegen zu wenig
|
|
Speicherplatz in <filename class="directory">/var/tmp</filename>
|
|
als trickreich herausstellen.</para>
|
|
</note>
|
|
|
|
<para>Die <filename class="directory">/usr</filename>-Partition
|
|
enthält viele der Hauptbestandteile des Systems, dazu
|
|
gehöhren die &man.ports.7;-Sammlung (empfohlen) und die Quellen
|
|
(optional). Sowohl die Ports als auch die Quellen des Basissystems
|
|
sind zum Zeitpunkt der Installation optional, trotzdem sollten Sie
|
|
mindestens zwei Gigabyte für diese Partition
|
|
vorsehen.</para>
|
|
|
|
<para>Wenn Sie die Größe der Partitionen festlegen,
|
|
beachten Sie bitte das Wachstum Ihres Systems. Wenn Sie den
|
|
Platz auf einer Partition vollständig aufgebraucht haben,
|
|
eine andere Partition aber kaum benutzen, kann die Handhabung des
|
|
Systems schwierig werden.</para>
|
|
|
|
<note><para>Die automatische Partitionierung von &man.sysinstall.8;
|
|
mit <literal>Auto-defaults</literal> legt manchmal zu kleine
|
|
<filename class="directory">/</filename> und <filename
|
|
class="directory">/var</filename>-Partition an. Partitionieren Sie
|
|
weise und großzügig.</para></note>
|
|
</sect3>
|
|
|
|
<sect3 id="swap-design">
|
|
<title>Swap Partition</title>
|
|
|
|
<indexterm>
|
|
<primary>Swap-Partition</primary>
|
|
<secondary>Größe</secondary>
|
|
</indexterm>
|
|
<indexterm><primary>Swap-Partition</primary></indexterm>
|
|
|
|
<para>Als Daumenregel sollten Sie doppelt soviel Speicher
|
|
für die Swap-Partition vorsehen, als Sie Hauptspeicher
|
|
haben. Verfügt die Maschine beispielsweise über
|
|
128 Megabyte Hauptspeicher, sollten Sie 256 Megabyte
|
|
für den Swap-Bereich vorsehen. Systeme mit weniger Speicher
|
|
werden wahrscheinlich mit viel mehr Swap mehr leisten. Es
|
|
wird nicht empfohlen, weniger als 256 Megabyte Swap einzurichten.
|
|
Außerdem sollten Sie künftige Speichererweiterungen
|
|
beachten, wenn Sie die Swap-Partition einrichten. Die
|
|
VM-Paging-Algorithmen im Kernel sind so eingestellt, 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
|
|
<foreignphrase>VM page scanning</foreignphrase>
|
|
Code führen, sowie Probleme verursachen, wenn Sie später
|
|
mehr Speicher in Ihre Maschine bauen.</para>
|
|
|
|
<para>Auf größeren Systemen mit mehreren SCSI-Laufwerken
|
|
(oder mehreren IDE-Laufwerken an unterschiedlichen Controllern)
|
|
empfehlen wir Ihnen, 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.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Warum partitionieren?</title>
|
|
|
|
<para>Gegen eine einzelne Partition sprechen mehrere Gründe.
|
|
Jede Partition hat im Betrieb unterschiedliche Eigenschaften
|
|
und die Trennung der Partitionen erlaubt es, die Dateisysteme
|
|
an diese Eigenschaften anzupassen. Die Root- und <filename
|
|
class="directory">/usr</filename>-Partitionen weisen meist nur
|
|
lesende Zugriffe auf, während <filename
|
|
class="directory">/var</filename> und <filename
|
|
class="directory">/var/tmp</filename> hauptsächlich
|
|
beschrieben werden.</para>
|
|
|
|
<para>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 diesen 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
|
|
class="directory">/var</filename> an den Rand der Platte legen.
|
|
Schließlich sollten Sie noch die Stabilität des Systems
|
|
beachten. Eine kleine Root-Partition, auf die meist nur lesend
|
|
zugegriffen wird, überlebt einen schlimmen Absturz
|
|
wahrscheinlich eher als eine große Partition.</para>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-core-configuration">
|
|
<title>Basiskonfiguration</title>
|
|
|
|
<indexterm>
|
|
<primary>rc-Dateien</primary>
|
|
<secondary><filename>rc.conf</filename></secondary>
|
|
</indexterm>
|
|
|
|
<para>Informationen zur Systemkonfiguration sind hauptsächlich
|
|
in <filename>/etc/rc.conf</filename>, die meist beim Start
|
|
des Systems verwendet wird, abgelegt. Der Name der Datei zeigt
|
|
ihren Zweck an: Sie enthält die Konfigurationen für
|
|
die <filename>rc*</filename> Dateien.</para>
|
|
|
|
<para>In <filename>rc.conf</filename> werden die Vorgabewerte aus
|
|
<filename>/etc/defaults/rc.conf</filename> überschrieben.
|
|
Die Vorgabedatei sollte nicht nach <filename
|
|
class="directory">/etc</filename> kopiert werden, da sie die
|
|
Vorgabewerte und keine Beispiele enthält. Jede systemspezifische
|
|
Änderung wird in <filename>rc.conf</filename> vorgenommen.</para>
|
|
|
|
<para>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</filename>.
|
|
Zum Beispiel so:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem><para><filename>/etc/rc.conf</filename>:</para>
|
|
|
|
<programlisting>sshd_enable="YES"
|
|
keyrate="fast"
|
|
defaultrouter="10.1.1.254"</programlisting></listitem>
|
|
|
|
<listitem><para><filename>/etc/rc.conf.local</filename>:</para>
|
|
|
|
<programlisting>hostname="node1.example.org"
|
|
ifconfig_fxp0="inet 10.1.1.1/8"</programlisting></listitem>
|
|
</itemizedlist>
|
|
|
|
<para>Die <filename>rc.conf</filename> Datei kann dann auf jedes
|
|
System mit <command>rsync</command> oder einem ähnlichen Programm
|
|
verteilt werden, während die <filename>rc.conf.local</filename>
|
|
Datei dabei systemspezifisch bleibt.</para>
|
|
|
|
<para>Bei einem Upgrade des Systems mit &man.sysinstall.8; oder
|
|
<command>make world</command> wird <filename>rc.conf</filename>
|
|
nicht überschrieben, so dass die Systemkonfiguration
|
|
erhalten bleibt.</para>
|
|
|
|
<tip>
|
|
<para>Die Konfigurationsdatei <filename>/etc/rc.conf</filename> wird
|
|
von &man.sh.1; gelesen. Dies erlaubt es dem Systemadministrator,
|
|
eine bestimmte Menge an Logik dieser Datei hinzuzufügen, was
|
|
dabei helfen kann, komplexe Konfigurationsszenarien zu erstellen.
|
|
Lesen Sie dazu &man.rc.conf.5;, um weitere Informationen zu diesem
|
|
Thema zu erhalten.</para>
|
|
</tip>
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-appconfig">
|
|
<title>Konfiguration von Anwendungen</title>
|
|
|
|
<para>Installierte Anwendungen haben typischerweise
|
|
eigene Konfigurationsdateien, die eine eigene Syntax
|
|
verwenden. Damit diese Dateien leicht von der
|
|
Paketverwaltung gefunden und verwaltet werden können,
|
|
ist es wichtig, sie vom Basissystem zu trennen.</para>
|
|
|
|
<indexterm><primary>/usr/local/etc</primary></indexterm>
|
|
|
|
<para>Für gewöhnlich werden diese Dateien in <filename
|
|
class="directory">/usr/local/etc</filename> installiert. Besitzt
|
|
eine Anwendung viele Konfigurationsdateien, werden
|
|
diese in einem separaten Unterverzeichnis abgelegt.</para>
|
|
|
|
<para>Wenn ein Port oder ein Paket installiert wird, werden
|
|
normalerweise auch Beispiele für die Konfigurationsdateien
|
|
installiert. Diese erkennt man gewöhnlich an dem
|
|
Suffix <filename>.default</filename>. Wenn keine Konfigurationsdateien
|
|
für eine Anwendung existieren, werden sie durch
|
|
Kopieren der <filename>.default</filename> Dateien erstellt.</para>
|
|
|
|
<para>Als Beispiel sei <filename
|
|
class="directory">/usr/local/etc/apache</filename> gezeigt:</para>
|
|
|
|
<literallayout class="monospaced">-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf
|
|
-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf.default
|
|
-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf
|
|
-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf.default
|
|
-rw-r--r-- 1 root wheel 12205 May 20 1998 magic
|
|
-rw-r--r-- 1 root wheel 12205 May 20 1998 magic.default
|
|
-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types
|
|
-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types.default
|
|
-rw-r--r-- 1 root wheel 7980 May 20 1998 srm.conf
|
|
-rw-r--r-- 1 root wheel 7933 May 20 1998 srm.conf.default</literallayout>
|
|
|
|
<para>Anhand der Dateigröße erkennen Sie, dass sich
|
|
nur <filename>srm.conf</filename> geändert hat. Eine
|
|
spätere Aktualisierung des <application>Apache</application>-Ports
|
|
überschreibt diese Datei nicht.</para>
|
|
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-starting-services">
|
|
<sect1info>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Tom</firstname>
|
|
<surname>Rhodes</surname>
|
|
<contrib>Beigetragen von </contrib>
|
|
</author>
|
|
</authorgroup>
|
|
</sect1info>
|
|
<title>Start von Diensten</title>
|
|
|
|
<indexterm>
|
|
<primary>Dienste</primary>
|
|
</indexterm>
|
|
|
|
<para>Viele Benutzer installieren Software Dritter auf &os;
|
|
mithilfe der Ports-Sammlung. Häufig soll die
|
|
Software bei einem Systemstart mitgestartet werden.
|
|
Beispielsweise sollen die Dienste
|
|
<filename role="package">mail/postfix</filename> oder
|
|
<filename role="package">www/apache13</filename> nach
|
|
einem Systemstart laufen. Dieser Abschnitt stellt
|
|
die Startprozeduren für Software Dritter vor.</para>
|
|
|
|
<para>Unter &os; werden die meisten der im System enthaltenen
|
|
Dienste wie &man.cron.8; mithilfe von Systemskripten gestartet.
|
|
Diese Skripten sind abhängig von der &os;- oder
|
|
Hersteller-Version. Allerdings kann ein Dienst mit
|
|
einfachen Skripten gestartet werden.</para>
|
|
|
|
<sect2>
|
|
<title>Dienste über das
|
|
<filename>rc.d</filename>-System starten</title>
|
|
|
|
<para>Mit <filename>rc.d</filename> lässt sich der Start
|
|
von Anwendungen besser steuern als mit den vorher besprochenen
|
|
Startskripten. Mit den im Abschnitt
|
|
<link linkend="configtuning-rcd">rc.d</link>
|
|
besprochenen Schlüsselwörtern können
|
|
Anwendungen in einer bestimmten Reihenfolge (zum Beispiel
|
|
nach <acronym>DNS</acronym>) gestartet werden und
|
|
Optionen können in <filename>rc.conf</filename>
|
|
statt fest im Startskript der Anwendung festgelegt werden.
|
|
Ein einfaches Startskript sieht wie folgt aus:</para>
|
|
|
|
<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"</programlisting>
|
|
|
|
<para>Dieses Skript stellt sicher, dass
|
|
<application>utility</application> nach den
|
|
<literal>DAEMON</literal>-Pseudodiensten gestartet wird.
|
|
Es stellt auch eine Methode bereit, die
|
|
Prozess-<acronym>ID</acronym> (<acronym>PID</acronym>)
|
|
der Anwendung in einer Datei zu speichern.</para>
|
|
|
|
<para>In <filename>/etc/rc.conf</filename> könnte
|
|
für diese Anwendung die folgende Zeile stehen:</para>
|
|
|
|
<programlisting>utility_enable="YES"</programlisting>
|
|
|
|
<para>Die Methode erleichtert den Umgang mit
|
|
Kommandozeilenargumenten, bindet Funktionen aus
|
|
<filename>/etc/rc.subr</filename> ein, ist kompatibel
|
|
zum Werkzeug &man.rcorder.8; und lässt sich
|
|
über <filename>rc.conf</filename> leichter
|
|
konfigurieren.</para>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Andere Arten, um Dienste zu starten</title>
|
|
|
|
<para>Dienste wie <acronym>POP</acronym>3 oder
|
|
<acronym>IMAP</acronym> können über
|
|
&man.inetd.8; gestartet werden. Nach der Installation
|
|
der Anwendung aus der Ports-Sammlung muss eine
|
|
Konfigurationszeile in der Datei
|
|
<filename>/etc/inetd.conf</filename> hinzugefügt oder
|
|
in der aktuellen Konfiguration durch Entfernen der Kommentare
|
|
aktiviert werden. Der Abschnitt <xref
|
|
linkend="network-inetd"/> beschreibt den
|
|
<application>inetd</application> und dessen Konfiguration.</para>
|
|
|
|
<para>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</filename> startet, ist es möglich, dass
|
|
Dienste von nicht-<username>root</username> Benutzern gestartet
|
|
und gepflegt werden können.</para>
|
|
|
|
<para>Dies nutzt eine Eigenschaft von &man.cron.8;:
|
|
Für die Zeitangabe kann <literal>@reboot</literal>
|
|
eingesetzt werden. Damit wird das Kommando gestartet, wenn
|
|
&man.cron.8; kurz nach dem Systemboot gestartet wird.</para>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-cron">
|
|
<sect1info>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Tom</firstname>
|
|
<surname>Rhodes</surname>
|
|
<contrib>Beigetragen von </contrib>
|
|
<!-- 20 May 2003 -->
|
|
</author>
|
|
</authorgroup>
|
|
</sect1info>
|
|
<title>Programme mit <command>cron</command> starten</title>
|
|
|
|
<indexterm>
|
|
<primary><command>cron</command></primary>
|
|
</indexterm>
|
|
|
|
<para>Ein sehr nützliches Werkzeug von &os; ist &man.cron.8;.
|
|
<command>cron</command> läuft im Hintergrund und
|
|
überprüft fortlaufend die Datei
|
|
<filename>/etc/crontab</filename>. Beim Start sucht
|
|
<command>cron</command> neue <filename>crontab</filename>-Dateien
|
|
im Verzeichnis <filename class="directory">/var/cron/tabs</filename>.
|
|
In den <filename class="directory">crontab</filename>-Dateien wird
|
|
festgelegt, welche Programme zu welchem Zeitpunkt laufen sollen.</para>
|
|
|
|
<para>Das Werkzeug <command>cron</command> verwendet
|
|
zwei verschiedene Konfigurationsdateien: Die
|
|
System-<filename>crontab</filename> und die
|
|
Benutzer-<filename>crontab</filename>. Der einzige Unterschied
|
|
zwischen beiden Formaten ist das sechste Feld. In der
|
|
System-<filename>crontab</filename> gibt das sechste Feld das
|
|
Konto an, unter dem ein Kommando läuft. Aus der
|
|
System-<filename>crontab</filename> können daher
|
|
Kommandos unter beliebigen Konten gestartet werden.
|
|
In der Benutzer-<filename>crontab</filename> gibt das
|
|
sechste Feld das auszuführende Kommando an. Alle
|
|
Kommandos laufen unter dem Konto, unter dem die
|
|
<filename>crontab</filename> erstellt wurde (ein
|
|
wichtiges Sicherheitsmerkmal).</para>
|
|
|
|
<note>
|
|
<para>Benutzer können mit Benutzer-<filename>crontabs</filename>
|
|
ohne <username>root</username>-Rechte Befehle terminieren.
|
|
Die Kommandos in Benutzer-<filename>crontabs</filename> laufen
|
|
unter dem Benutzer, der die <filename>crontab</filename>
|
|
erstellt hat.</para>
|
|
|
|
<para>Der Benutzer <username>root</username> kann, wie
|
|
jeder andere Benutzer, eine Benutzer-<filename>crontab</filename>
|
|
besitzen. Die Benutzer-<filename>crontab</filename> von
|
|
<username>root</username> ist nicht mit der Datei
|
|
<filename>/etc/crontab</filename>, der
|
|
System-<filename>crontab</filename>, zu verwechseln.
|
|
Normalerweise besitzt <username>root</username>, wegen
|
|
der Existenz der System-<filename>crontab</filename>, keine
|
|
eigene Benutzer-<filename>crontab</filename>.</para>
|
|
</note>
|
|
|
|
<para>Der folgende Auszug aus der System-<filename>crontab</filename>
|
|
<filename>/etc/crontab</filename> zeigt den Aufbau
|
|
einer <filename>crontab</filename>-Datei:</para>
|
|
|
|
<programlisting># /etc/crontab - root's crontab for FreeBSD
|
|
#
|
|
# $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
|
|
# <co id="co-comments"/>
|
|
#
|
|
SHELL=/bin/sh
|
|
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin <co id="co-env"/>
|
|
HOME=/var/log
|
|
#
|
|
#
|
|
#minute hour mday month wday who command <co id="co-field-descr"/>
|
|
#
|
|
#
|
|
*/5 * * * * root /usr/libexec/atrun <co id="co-main"/></programlisting>
|
|
|
|
<calloutlist>
|
|
<callout arearefs="co-comments">
|
|
<para>Das Zeichen <literal>#</literal> leitet, wie in
|
|
den meisten Konfigurationsdateien, 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.</para>
|
|
</callout>
|
|
|
|
<callout arearefs="co-env">
|
|
<para>Umgebungsvariablen werden mit dem Gleichheits-Zeichen
|
|
(<literal>=</literal>) festgelegt. Im Beispiel werden
|
|
die Variablen <envar>SHELL</envar>, <envar>PATH</envar>
|
|
und <envar>HOME</envar> definiert. Wenn die Variable
|
|
<envar>SHELL</envar> nicht definiert wird, benutzt
|
|
<command>cron</command> die Shell <command>sh</command>.
|
|
Wird die Variable <envar>PATH</envar> nicht gesetzt,
|
|
müssen alle Pfadangaben absolut sein, da es keinen
|
|
Vorgabewert für <envar>PATH</envar> gibt. Der
|
|
Vorgabewert für <envar>HOME</envar> ist das
|
|
Heimatverzeichnis des Accounts, dem die
|
|
<filename>crontab</filename> gehört.</para>
|
|
</callout>
|
|
|
|
<callout arearefs="co-field-descr">
|
|
<para>In dieser Zeile werden sieben Felder beschrieben:
|
|
<literal>minute</literal>, <literal>hour</literal>,
|
|
<literal>mday</literal>, <literal>month</literal>,
|
|
<literal>wday</literal>, <literal>who</literal>
|
|
und <literal>command</literal>. Die ersten Felder
|
|
legen den Zeitpunkt fest, an dem ein Kommando laufen
|
|
soll. Das Feld <literal>minute</literal> legt die
|
|
Minute fest, das Feld <literal>hour</literal> die
|
|
Stunde, das Feld <literal>mday</literal> den Tag
|
|
des Monats. Im Feld <literal>month</literal>
|
|
wird der Monat und im Feld <literal>wday</literal>
|
|
der Wochentag festgelegt. Alle Felder müssen
|
|
numerische Werte enthalten und die Zeitangaben sind
|
|
im 24-Stunden-Format. Das Feld <literal>who</literal>
|
|
gibt es nur in der Datei <filename>/etc/crontab</filename>
|
|
und gibt den Account an, unter dem das Kommando laufen
|
|
soll. In den <filename>crontab</filename>-Dateien
|
|
einzelner Accounts existiert dieses Feld nicht. Im
|
|
letzten Feld wird schließlich das auszuführende
|
|
Kommando angegeben.</para>
|
|
</callout>
|
|
|
|
<callout arearefs="co-main">
|
|
<para>Diese Zeile definiert die Zeitpunkte an denen das
|
|
Kommando <command>atrun</command> laufen soll. Beachten
|
|
Sie die Zeichenfolge <literal>*/5</literal> gefolgt von
|
|
mehreren <literal>*</literal>-Zeichen. Das Zeichen
|
|
<literal>*</literal> ist ein Platzhalter und steht
|
|
für <emphasis>jede</emphasis> mögliche Zeit.
|
|
Diese Zeile führt das Kommando <command>atrun</command>
|
|
unter dem <username>root</username>-Account alle fünf
|
|
Minuten aus. Mehr über das Kommando
|
|
<command>atrun</command> erfahren Sie in der
|
|
Hilfeseite &man.atrun.8;.</para>
|
|
|
|
<para>Bei den Kommandos können beliebige 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
|
|
(<literal>\</literal>) angegeben werden.</para>
|
|
</callout>
|
|
</calloutlist>
|
|
|
|
<para>Bis auf das sechste Feld, das den Account angibt, sieht
|
|
jede <filename>crontab</filename>-Datei so wie das Beispiel
|
|
aus. Das sechste Feld existiert nur in der Systemdatei
|
|
<filename>/etc/crontab</filename>. In den restlichen
|
|
<filename>crontab</filename>-Dateien fehlt dieses Feld.</para>
|
|
|
|
<sect2 id="configtuning-installcrontab">
|
|
<title><filename>crontab</filename> installieren</title>
|
|
|
|
<important>
|
|
<para>Die nachstehende Prozedur gilt nur für
|
|
Benutzer-<filename>crontabs</filename>. Die
|
|
System-<filename>crontab</filename> können
|
|
Sie einfach mit Ihrem Lieblingseditor editieren.
|
|
Das Werkzeug <command>cron</command> bemerkt, dass
|
|
sich die Datei geändert hat und wird die neue
|
|
Version benutzen. Lesen Sie bitte auch die FAQ
|
|
zur Meldung <ulink
|
|
url="&url.books.faq;/admin.html#ROOT-NOT-FOUND-CRON-ERRORS">root: not found</ulink>.</para>
|
|
</important>
|
|
|
|
<para>Eine Benutzer-<filename>crontab</filename>, beispielsweise
|
|
die Datei <filename>crontab</filename>, können Sie mit
|
|
jedem Editor erstellen. Die Benutzer-<filename>crontab</filename>
|
|
installieren Sie mit dem nachstehenden Befehl:</para>
|
|
|
|
<screen>&prompt.root; <userinput>crontab crontab</userinput></screen>
|
|
|
|
<para>Das Argument zum Befehl <command>crontab</command>
|
|
ist die vorher erstellte Datei <filename>crontab</filename>.</para>
|
|
|
|
<para>Der Befehl <command>crontab -l</command> zeigt
|
|
die installierte <filename>crontab</filename>-Datei an.</para>
|
|
|
|
<para>Benutzer, die eine eigene <filename>crontab</filename>-Datei
|
|
ohne Vorlage erstellen wollen, können den Befehl
|
|
<command>crontab -e</command> verwenden. Dieser Befehl
|
|
ruft einen Editor auf und installiert beim Verlassen des
|
|
Editors die <filename>crontab</filename>-Datei.</para>
|
|
|
|
<para>Wollen Sie die installierte
|
|
Benutzer-<filename>crontab</filename> entfernen, rufen Sie den
|
|
Befehl <command>crontab</command> mit der Option
|
|
<option>-r</option> auf.</para>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-rcd">
|
|
<sect1info>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Tom</firstname>
|
|
<surname>Rhodes</surname>
|
|
<contrib>Beigetragen von </contrib>
|
|
<!-- 16 May 2003 -->
|
|
</author>
|
|
</authorgroup>
|
|
</sect1info>
|
|
<title>Das rc-System für Systemdienste</title>
|
|
|
|
<para>2002 wurde das <application>rc.d</application>-System von
|
|
NetBSD zum Start von Systemdiensten in &os; integriert.
|
|
Die zu diesem System gehörenden Dateien sind im
|
|
Verzeichnis <filename class="directory">/etc/rc.d</filename> abgelegt.
|
|
Die Skripten in diesem Verzeichnis akzeptieren die
|
|
Optionen <option>start</option>, <option>stop</option>
|
|
und <option>restart</option>. Beispielsweise kann
|
|
&man.sshd.8; mit dem nachstehenden Kommando neu gestartet
|
|
werden:</para>
|
|
|
|
<screen>&prompt.root; <userinput>/etc/rc.d/sshd restart</userinput></screen>
|
|
|
|
<para>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.
|
|
Der Network Address
|
|
Translation Dæmon wird zum Beispiel mit dem folgenden
|
|
Eintrag in <filename>/etc/rc.conf</filename> aktiviert:</para>
|
|
|
|
<programlisting>natd_enable="YES"</programlisting>
|
|
|
|
<para>Wenn dort bereits die Zeile <option>natd_enable="NO"</option>
|
|
existiert, ändern Sie einfach <option>NO</option> in
|
|
<option>YES</option>. Die rc-Skripten starten, wie unten
|
|
beschrieben, auch abhängige Dienste.</para>
|
|
|
|
<para>Da das <application>rcNG</application>-System primär
|
|
zum automatischen Starten und Stoppen von Systemdiensten
|
|
dient, funktionieren die Optionen <option>start</option>,
|
|
<option>stop</option> und <option>restart</option> nur,
|
|
wenn die entsprechenden Variablen in
|
|
<filename>/etc/rc.conf</filename> gesetzt sind. Beispielsweise
|
|
funktioniert das Kommando <command>sshd restart</command>
|
|
nur dann, wenn in <filename>/etc/rc.conf</filename> die
|
|
Variable <varname>sshd_enable</varname> auf <option>YES</option>
|
|
gesetzt wurde. Wenn Sie die Optionen <option>start</option>,
|
|
<option>stop</option> oder <option>restart</option>
|
|
unabhängig von den Einstellungen in
|
|
<filename>/etc/rc.conf</filename> benutzen wollen,
|
|
müssen Sie den Optionen mit dem Präfix
|
|
<quote>one</quote> verwenden. Um beispielsweise
|
|
<command>sshd</command> unabhängig von den
|
|
Einstellungen in <filename>/etc/rc.conf</filename> neu
|
|
zu starten, benutzen Sie das nachstehende Kommando:</para>
|
|
|
|
<screen>&prompt.root; <userinput>/etc/rc.d/sshd onerestart</userinput></screen>
|
|
|
|
<para>Ob ein Dienst in <filename>/etc/rc.conf</filename>
|
|
aktiviert ist, können Sie leicht herausfinden, indem
|
|
Sie das entsprechende <filename>rc.d</filename>-Skript
|
|
mit der Option <option>rcvar</option> aufrufen. Ein
|
|
Administrator kann beispielsweise wie folgt prüfen, ob
|
|
der <command>sshd</command>-Dienst in
|
|
<filename>/etc/rc.conf</filename> aktiviert ist:</para>
|
|
|
|
<screen>&prompt.root; <userinput>/etc/rc.d/sshd rcvar</userinput>
|
|
# sshd
|
|
$sshd_enable=YES</screen>
|
|
|
|
<note>
|
|
<para>Die zweite Zeile (<literal># sshd</literal>) wird
|
|
vom Kommando <command>sshd</command> ausgegeben; sie
|
|
kennzeichnet nicht die Eingabeaufforderung von
|
|
<username>root</username>.</para>
|
|
</note>
|
|
|
|
<para>Ob ein Dienst läuft, kann mit der Option
|
|
<option>status</option> abgefragt werden. Das folgende
|
|
Kommando überprüft, ob der <command>sshd</command>
|
|
auch wirklich gestartet wurde:</para>
|
|
|
|
<screen>&prompt.root; <userinput>/etc/rc.d/sshd status</userinput>
|
|
sshd is running as pid 433.</screen>
|
|
|
|
<para>Einige Dienste können über die Option
|
|
<option>reload</option> neu initialisiert werden. Dazu wird
|
|
dem Dienst über ein Signal mitgeteilt,
|
|
dass er seine Konfigurationsdateien neu einlesen soll.
|
|
Oft wird dazu das Signal <literal>SIGHUP</literal>
|
|
verwendet. Beachten Sie aber, dass nicht alle Dienste diese
|
|
Option unterstützen.</para>
|
|
|
|
<para>Die meisten Systemdienste werden beim Systemstart vom
|
|
<application>rc.d</application>-System gestartet. Zum Beispiel
|
|
aktiviert das Skript <filename>bgfsck</filename> die Prüfung
|
|
von Dateisystemen im Hintergrund. Das Skript gibt die folgende
|
|
Meldung aus, wenn es gestartet wird:</para>
|
|
|
|
<screen>Starting background file system checks in 60 seconds.</screen>
|
|
|
|
<para>Viele Systemdienste hängen von anderen Diensten
|
|
ab. NIS und andere RPC-basierende Systeme hängen
|
|
beispielsweise von dem <command>rpcbind</command>-Dienst
|
|
(portmapper) 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.</para>
|
|
|
|
<para>Folgende Schlüsselwörter müssen im Kopf aller
|
|
Startskripten verwendet werden (da sie von &man.rc.subr.8; zum
|
|
<quote>Aktivieren</quote> des Startskripts benötigt
|
|
werden:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para><literal>PROVIDE</literal>: Gibt die Namen der Dienste an,
|
|
die mit dieser Datei zur Verfügung gestellt werden.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>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;:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para><literal>REQUIRE</literal>: Gibt die Namen der Dienste an,
|
|
von denen dieser Dienst abhängt. Diese Datei wird
|
|
<emphasis>nach</emphasis> den angegebenen Diensten
|
|
ausgeführt.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para><literal>BEFORE</literal>: Zählt Dienste auf,
|
|
die auf diesen Dienst angewiesen sind. Diese Datei wird
|
|
<emphasis>vor</emphasis> den angegebenen Diensten
|
|
ausgeführt.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>Durch das Verwenden dieser Schlüsselwörter kann
|
|
ein Administrator die Startreihenfolge von Systemdiensten
|
|
feingranuliert steuern, ohne mit den
|
|
Schwierigkeiten des <quote>runlevel</quote>-Systems
|
|
anderer &unix; Systeme kämpfen zu müssen.</para>
|
|
|
|
<para>Weitere Informationen über das
|
|
<filename>rc.d</filename>-System finden sich in den
|
|
Manualpages zu &man.rc.8; sowie &man.rc.subr.8;. Wenn Sie
|
|
Ihre eigenen <filename>rc.d</filename>-Skripte schreiben
|
|
wollen, sollten Sie den Artikel
|
|
<ulink url="&url.articles.rc-scripting.en">Practical rc.d
|
|
scripting in BSD</ulink> lesen.</para>
|
|
</sect1>
|
|
|
|
<sect1 id="config-network-setup">
|
|
<sect1info>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Marc</firstname>
|
|
<surname>Fonvieille</surname>
|
|
<contrib>Beigetragen von </contrib>
|
|
<!-- 6 October 2002 -->
|
|
</author>
|
|
</authorgroup>
|
|
</sect1info>
|
|
|
|
<title>Einrichten von Netzwerkkarten</title>
|
|
|
|
<indexterm>
|
|
<primary>Netzwerkkarten</primary>
|
|
<secondary>einrichten</secondary>
|
|
</indexterm>
|
|
|
|
<para>Ein Rechner ohne Netzanschluss ist heute nicht mehr
|
|
vorstellbar. Die Konfiguration einer Netzwerkkarte gehört zu
|
|
den alltäglichen Aufgaben eines &os; Administrators.</para>
|
|
|
|
<sect2>
|
|
<title>Bestimmen des richtigen Treibers</title>
|
|
|
|
<indexterm>
|
|
<primary>Netzwerkkarten</primary>
|
|
<secondary>Treiber</secondary>
|
|
</indexterm>
|
|
|
|
<para>Bevor Sie anfangen, sollten Sie das Modell Ihrer Karte kennen,
|
|
wissen welchen Chip die Karte benutzt und bestimmen, ob es sich
|
|
um eine PCI- oder ISA-Karte handelt. Eine Aufzählung der
|
|
unterstützten PCI- und ISA-Karten finden Sie in der
|
|
Liste der unterstützen Geräte. Schauen Sie nach, ob Ihre
|
|
Karte dort aufgeführt ist.</para>
|
|
|
|
<para>Wenn Sie wissen, dass Ihre Karte unterstützt wird,
|
|
müssen Sie den Treiber für Ihre Karte bestimmen.
|
|
<filename>/usr/src/sys/conf/NOTES</filename> und
|
|
<filename>/usr/src/sys/<replaceable>arch</replaceable>/conf/NOTES</filename>
|
|
enthalten eine
|
|
Liste der verfügbaren Treiber mit Informationen zu den
|
|
unterstützten Chipsätzen und Karten. Wenn Sie sich nicht
|
|
sicher sind, ob Sie den richtigen Treiber ausgewählt haben,
|
|
lesen Sie die Hilfeseite des Treibers. Die Hilfeseite enthält
|
|
weitere Informationen über die unterstützten Geräte
|
|
und macht auch auf mögliche Probleme aufmerksam.</para>
|
|
|
|
<para>Wenn Sie eine gebräuchliche Karte besitzen, brauchen Sie
|
|
meistens nicht lange nach dem passenden Treiber zu suchen. Die
|
|
Treiber zu diesen Karten sind schon im
|
|
<filename>GENERIC</filename>-Kernel enthalten und die Karte sollte
|
|
während des Systemstarts erkannt werden:</para>
|
|
|
|
<screen>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]</screen>
|
|
|
|
<para>Im Beispiel erkennt das System zwei Karten, die den
|
|
&man.dc.4; Treiber benutzen.</para>
|
|
|
|
<para>Ist der Treiber für Ihre Netzwerkkarte nicht
|
|
in <filename>GENERIC</filename> enthalten, müssen
|
|
Sie den Treiber laden, um die Karte zu benutzen.
|
|
Sie können den Treiber auf zwei Arten laden:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>Am einfachsten ist es, das Kernelmodul für
|
|
Ihre Karte mit &man.kldload.8; zu laden. Allerdings
|
|
gibt es nicht für alle Karten Kernelmodule;
|
|
zum Beispiel gibt es keine Kernelmodule für
|
|
ISA-Karten.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Alternativ können Sie den Treiber für die
|
|
Karte fest in den Kernel einbinden. Schauen Sie sich dazu
|
|
<filename>/usr/src/sys/conf/NOTES</filename>,
|
|
<filename>/usr/src/sys/<replaceable>arch</replaceable>/conf/NOTES</filename>
|
|
und die Hilfeseite des Treibers, den Sie in den Kernel
|
|
einbinden möchten, an. Die Übersetzung des Kernels
|
|
wird in <xref linkend="kernelconfig"/> beschrieben. Wenn
|
|
Ihre Karte während des Systemstarts vom Kernel
|
|
(<filename>GENERIC</filename>) erkannt wurde, müssen
|
|
Sie den Kernel nicht neu übersetzen.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<sect3 id="config-network-ndis">
|
|
<title>&windows;-NDIS-Treiber einsetzen</title>
|
|
|
|
<indexterm><primary>NDIS</primary></indexterm>
|
|
<indexterm><primary>NDISulator</primary></indexterm>
|
|
<indexterm><primary>&windows;-Treiber</primary></indexterm>
|
|
<indexterm><primary>Microsoft Windows</primary></indexterm>
|
|
<indexterm>
|
|
<primary>Microsoft Windows</primary>
|
|
<secondary>Gerätetreiber</secondary></indexterm>
|
|
<indexterm><primary>KLD (kernel loadable object)</primary></indexterm>
|
|
|
|
<!-- Hm. Soll man den letzten Indexterm abwandeln, d.h. die
|
|
Langversion weglassen? Keine Ahnung. Wenn ja, dann muss das
|
|
auch in handbook/linuxemu/chapter.sgml passieren! -->
|
|
|
|
<para>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
|
|
<foreignphrase>Reverse Engineering</foreignphrase>
|
|
nachzubauen, oder sie versuchen, die vorhandenen
|
|
Binärtreiber der µsoft.windows;-Plattform zu
|
|
verwenden. Die meisten Entwickler, darunter auch die an
|
|
FreeBSD beteiligten, haben sich für den zweiten Ansatz
|
|
entschieden.</para>
|
|
|
|
<para>Bill Paul (wpaul) ist es zu verdanken, dass es seit
|
|
eine <quote>native</quote> Unterstützung der
|
|
<foreignphrase>Network Driver Interface
|
|
Specification</foreignphrase> (NDIS) gibt. Der
|
|
FreeBSD NDISulator (auch als Project Evil bekannt) nutzt
|
|
den binären &windows;-Treiber, indem er diesem vorgibt,
|
|
unter &windows; zu laufen. Da der &man.ndis.4;-Treiber
|
|
eine &windows;-Binärdatei nutzt, kann er nur auf
|
|
&i386;- und amd64-Systemen verwendet werden.</para>
|
|
|
|
<note>
|
|
<para>Der &man.ndis.4;-Treiber unterstützt primär
|
|
PCI-, CardBus- sowie PCMCIA-Geräte, USB-Geräte
|
|
werden hingegen noch nicht unterstützt.</para>
|
|
</note>
|
|
|
|
<para>Um den NDISulator zu verwenden, benötigen Sie drei
|
|
Dinge:</para>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para>Die Kernelquellen</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Den &windowsxp;-Binärtreiber
|
|
(mit der Erweiterung <filename>.SYS</filename>)</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Die Konfigurationsdatei des &windowsxp;-Treibers
|
|
(mit der Erweiterung <filename>.INF</filename>)</para>
|
|
</listitem>
|
|
</orderedlist>
|
|
|
|
<para>Suchen Sie die Dateien für Ihre 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</filename> und
|
|
<filename>W32DRIVER.INF</filename> verwendet.</para>
|
|
|
|
<note>
|
|
<para>Sie können einen &windows;/i386-Treiber nicht
|
|
unter &os;/amd64 einsetzen, vielmehr benötigen Sie
|
|
dafür einen &windows;/amd64-Treiber.</para>
|
|
</note>
|
|
|
|
<para>Als Nächstes kompilieren Sie den binären
|
|
Treiber, um ein Kernelmodul zu erzeugen. Dazu rufen Sie als
|
|
<username>root</username> &man.ndisgen.8; auf:</para>
|
|
|
|
<screen>&prompt.root; <userinput>ndisgen <replaceable>/path/to/W32DRIVER.INF</replaceable> <replaceable>/path/to/W32DRIVER.SYS</replaceable></userinput></screen>
|
|
|
|
<para>&man.ndisgen.8; arbeitet interaktiv, benötigt es
|
|
weitere Informationen, so fragt es Sie danach. Als Ergebnis
|
|
erhalten Sie ein Kernelmodul im Arbeitsverzeichnis, das Sie
|
|
wie folgt laden können:</para>
|
|
|
|
<screen>&prompt.root; <userinput>kldload <replaceable>./W32DRIVER.ko</replaceable></userinput></screen>
|
|
|
|
<para>Neben dem vorhin erzeugten Kernelmodul müssen Sie
|
|
auch die Kernelmodule <filename>ndis.ko</filename> und
|
|
<filename>if_ndis.ko</filename> laden. Diese Module sollten
|
|
automatisch geladen werden, wenn Sie ein von &man.ndis.4;
|
|
abhängiges Modul laden. Wollen Sie die Module hingegen
|
|
manuell laden, geben Sie die folgenden Befehle ein:</para>
|
|
|
|
<screen>&prompt.root; <userinput>kldload ndis</userinput>
|
|
&prompt.root; <userinput>kldload if_ndis</userinput></screen>
|
|
|
|
<para>Der erste Befehl lädt dabei den NDIS-Miniport-Treiber,
|
|
der zweite das tatsächliche Netzwerkgerät.</para>
|
|
|
|
<para>Überprüfen Sie nun die Ausgabe von &man.dmesg.8;
|
|
auf eventuelle Fehler während des Ladevorgangs. Gab es
|
|
dabei keine Probleme, sollten Sie eine Ausgabe ähnlich
|
|
der folgenden erhalten:</para>
|
|
|
|
<screen>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</screen>
|
|
|
|
<para>Ab jetzt können Sie mit dem Gerät
|
|
<devicename>ndis0</devicename> wie mit jeder anderen
|
|
Gerätedatei (etwa <devicename>dc0</devicename>)
|
|
arbeiten.</para>
|
|
|
|
<para>Wie jedes Kernelmodul können auch die NDIS-Module
|
|
beim Systemstart automatisch geladen werden. Dazu kopieren
|
|
Sie das erzeugte Modul (<filename>W32DRIVER_SYS.ko</filename>)
|
|
in das Verzeichnis <filename
|
|
class="directory">/boot/modules</filename>. Danach
|
|
fügen Sie die folgende Zeile in
|
|
<filename>/boot/loader.conf</filename> ein:</para>
|
|
|
|
<programlisting>W32DRIVER_SYS_load="YES"</programlisting>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Konfiguration von Netzwerkkarten</title>
|
|
|
|
<indexterm>
|
|
<primary>Netzwerkkarten</primary>
|
|
<secondary>einrichten</secondary>
|
|
</indexterm>
|
|
|
|
<para>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
|
|
<application>sysinstall</application> konfiguriert worden.</para>
|
|
|
|
<para>Das nachstehende Kommando zeigt die Konfiguration der Karten
|
|
eines Systems an:</para>
|
|
|
|
<screen>&prompt.user; <userinput>ifconfig</userinput>
|
|
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
|
|
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
|
|
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></screen>
|
|
|
|
<para>Im Beispiel werden Informationen zu den folgenden Geräten
|
|
angezeigt:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para><devicename>dc0</devicename>: Der erste
|
|
Ethernet-Adapter</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para><devicename>dc1</devicename>: Der zweite
|
|
Ethernet-Adapter</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para><devicename>plip0</devicename>: Die parallele
|
|
Schnittstelle (falls Ihr System über eine
|
|
derartige Schnittstelle verfügt)</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para><devicename>lo0</devicename>: Das Loopback-Gerät</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>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 <devicename>sis2</devicename> heißen.</para>
|
|
|
|
<para>Der Adapter <devicename>dc0</devicename> aus dem Beispiel ist
|
|
aktiv. Sie erkennen das an den folgenden Hinweisen:</para>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para><literal>UP</literal> bedeutet, dass die Karte
|
|
konfiguriert und aktiv ist.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Der Karte wurde die Internet-Adresse (<literal>inet</literal>)
|
|
<hostid role="ipaddr">192.168.1.3</hostid> zugewiesen.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Die Subnetzmaske ist richtig
|
|
(<hostid role="netmask">0xffffff00</hostid> entspricht
|
|
<hostid role="netmask">255.255.255.0</hostid>).</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Die Broadcast-Adresse <hostid
|
|
role="ipaddr">192.168.1.255</hostid> ist richtig.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Die MAC-Adresse der Karte (<literal>ether</literal>)
|
|
lautet <hostid role="mac">00:a0:cc:da:da:da</hostid>.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Die automatische Medienerkennung ist aktiviert
|
|
(<literal>media: Ethernet autoselect (100baseTX
|
|
<full-duplex>)</literal>). Der Adapter
|
|
<devicename>dc1</devicename> benutzt das Medium
|
|
<literal>10baseT/UTP</literal>. Weitere Informationen
|
|
über die einstellbaren Medien entnehmen
|
|
Sie bitte der Hilfeseite des Treibers.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Der Verbindungsstatus (<literal>status</literal>) ist
|
|
<literal>active</literal>, das heißt es wurde ein
|
|
Trägersignal entdeckt. Für
|
|
<devicename>dc1</devicename> wird <literal>status: no
|
|
carrier</literal> angezeigt. Das ist normal, wenn kein Kabel
|
|
an der Karte angeschlossen ist.</para>
|
|
</listitem>
|
|
</orderedlist>
|
|
|
|
<para>Wäre die Karte nicht konfiguriert, würde die Ausgabe
|
|
von &man.ifconfig.8; so aussehen:</para>
|
|
|
|
<screen>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</screen>
|
|
|
|
<para>Sie brauchen die Berechtigungen von <username>root</username>, um
|
|
Ihre Karte zu konfigurieren. Die Konfiguration kann auf der
|
|
Kommandozeile mit &man.ifconfig.8; erfolgen, allerdings
|
|
müsste sie dann nach jedem Neustart wiederholt werden.
|
|
Dauerhaft wird die Karte in <filename>/etc/rc.conf</filename>
|
|
konfiguriert.</para>
|
|
|
|
<para>Öffnen Sie <filename>/etc/rc.conf</filename> mit Ihrem
|
|
Lieblingseditor und fügen Sie für jede Karte Ihres
|
|
Systems eine Zeile hinzu. In dem hier diskutierten Fall wurden
|
|
die nachstehenden Zeilen eingefügt:</para>
|
|
|
|
<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"</programlisting>
|
|
|
|
<para>Ersetzen Sie <devicename>dc0</devicename>,
|
|
<devicename>dc1</devicename> usw. durch die Gerätenamen Ihrer
|
|
Karten und setzen Sie die richtigen IP-Adressen ein. Die
|
|
Hilfeseiten des Treibers und &man.ifconfig.8; enthalten weitere
|
|
Einzelheiten über verfügbare Optionen. Die Syntax von
|
|
<filename>/etc/rc.conf</filename> wird in &man.rc.conf.5;
|
|
erklärt.</para>
|
|
|
|
<para>Wenn Sie das Netz während der Installation
|
|
konfiguriert haben, existieren vielleicht schon Einträge
|
|
für Ihre Karten. Überprüfen Sie
|
|
<filename>/etc/rc.conf</filename> bevor Sie weitere Zeilen
|
|
hinzufügen.</para>
|
|
|
|
<para>In <filename>/etc/hosts</filename> können Sie die Namen
|
|
und IP-Adressen der Rechner Ihres LANs eintragen. Weitere
|
|
Informationen entnehmen Sie bitte &man.hosts.5; und
|
|
<filename>/usr/share/examples/etc/hosts</filename>.</para>
|
|
|
|
<note>
|
|
<para>Soll Ihr System sich auch mit dem Internet verbinden
|
|
können, müssen Sie Default-Gateway und
|
|
Nameserver manuell konfigurieren:</para>
|
|
|
|
<screen>&prompt.root; <userinput>echo 'defaultrouter="<replaceable>Ihr_Default_Gateway</replaceable>"' >> /etc/rc.conf</userinput>
|
|
&prompt.root; <userinput>echo 'nameserver <replaceable>Ihr_DNS_Server</replaceable>' >> /etc/resolv.conf</userinput></screen>
|
|
</note>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Test und Fehlersuche</title>
|
|
|
|
<para>Nachdem Sie die notwendigen Änderungen in
|
|
<filename>/etc/rc.conf</filename> vorgenommen haben, führen
|
|
Sie einen Neustart Ihres Systems durch. Dadurch werden die Adapter
|
|
konfiguriert und Sie stellen sicher, dass der Start ohne
|
|
Konfigurationsfehler erfolgt. Alternativ können Sie
|
|
auch lediglich die Netzwerkeinstellungen neu initialisieren:</para>
|
|
|
|
<screen>&prompt.root; <userinput>/etc/rc.d/netif restart</userinput></screen>
|
|
|
|
<note>
|
|
<para>Haben Sie ein Default-Gateway definiert (in der Datei
|
|
<filename>/etc/rc.conf</filename>), müssen Sie
|
|
auch den folgenden Befehl ausführen:</para>
|
|
|
|
<screen>&prompt.root; <userinput>/etc/rc.d/routing restart</userinput></screen>
|
|
</note>
|
|
|
|
<para>Wenn das System gestartet ist, sollten Sie die Netzwerkkarten
|
|
testen.</para>
|
|
|
|
<sect3>
|
|
<title>Test der Ethernet-Karte</title>
|
|
|
|
<indexterm>
|
|
<primary>Netzwerkkarten</primary>
|
|
<secondary>testen</secondary>
|
|
</indexterm>
|
|
|
|
<para>Mit zwei Tests können Sie prüfen, ob die
|
|
Ethernet-Karte richtig konfiguriert ist. Testen Sie zuerst mit
|
|
<command>ping</command> den Adapter selbst und sprechen Sie dann
|
|
eine andere Maschine im LAN an.</para>
|
|
|
|
<para>Zuerst, der Test des Adapters:</para>
|
|
|
|
<screen>&prompt.user; <userinput>ping -c5 192.168.1.3</userinput>
|
|
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</screen>
|
|
|
|
<para>Jetzt versuchen wir, eine andere Maschine im LAN zu
|
|
erreichen:</para>
|
|
|
|
<screen>&prompt.user; <userinput>ping -c5 192.168.1.2</userinput>
|
|
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</screen>
|
|
|
|
<para>Sie können auch den Namen der Maschine anstelle von
|
|
<hostid role="ipaddr">192.168.1.2</hostid> benutzen, wenn Sie
|
|
<filename>/etc/hosts</filename> entsprechend eingerichtet
|
|
haben.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Fehlersuche</title>
|
|
|
|
<indexterm>
|
|
<primary>Netzwerkkarten</primary>
|
|
<secondary>Fehlersuche</secondary>
|
|
</indexterm>
|
|
|
|
<para>Fehler zu beheben, ist immer sehr mühsam.
|
|
Indem Sie die einfachen Sachen zuerst prüfen,
|
|
erleichtern Sie sich die Aufgabe. Steckt das Netwerkkabel?
|
|
Sind die Netzwerkdienste richtig konfiguriert? Funktioniert
|
|
die Firewall? Wird die Netwerkkarte von &os;
|
|
unterstützt? Lesen Sie immer die Hardware-Informationen
|
|
des Releases, bevor Sie einen Fehlerbericht einsenden.
|
|
Aktualisieren Sie Ihre &os;-Version
|
|
auf -STABLE. Suchen Sie in den Archiven der Mailinglisten
|
|
oder auf dem Internet nach bekannten Lösungen.</para>
|
|
|
|
<para>Wenn die Karte funktioniert, die Verbindungen aber
|
|
zu langsam sind, lesen Sie bitte die Hilfeseite
|
|
&man.tuning.7;. Prüfen Sie auch die
|
|
Netzwerkkonfiguration, da falsche Einstellungen die
|
|
Ursache für langsame Verbindungen sein können.</para>
|
|
|
|
<para>Wenn Sie viele <errorname>device timeout</errorname>
|
|
Meldungen in den Systemprotokollen finden, prüfen
|
|
Sie, dass es keinen Konflikt zwischen der Netzwerkkarte
|
|
und anderen Geräten Ihres Systems gibt.
|
|
Überprüfen Sie nochmals die Verkabelung.
|
|
Unter Umständen benötigen Sie eine neue
|
|
Netzwerkkarte.</para>
|
|
|
|
<para>Wenn Sie in den Systemprotokollen
|
|
<errorname>watchdog timeout</errorname> Fehlermeldungen
|
|
finden, 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 Ihrer Karte und Ihres Motherboards
|
|
nach, ob das vielleicht die Ursache des Problems sein
|
|
könnte.</para>
|
|
|
|
<para>Die Meldung <errorname>No route to host</errorname>
|
|
erscheint, wenn Ihr 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 <command>netstat -rn</command> nach, ob eine
|
|
Route zu dem Zielsystem existiert. Wenn nicht, lesen
|
|
Sie bitte das <xref linkend="advanced-networking"/>.</para>
|
|
|
|
<para>Die Meldung <errorname>ping: sendto: Permission
|
|
denied</errorname> wird oft von einer falsch konfigurierten
|
|
Firewall verursacht. Wenn keine Regeln definiert wurden,
|
|
blockiert eine aktivierte Firewall alle Pakete, selbst
|
|
einfache <command>ping</command>-Pakete. Weitere
|
|
Informationen erhalten Sie in <xref linkend="firewalls"/>.</para>
|
|
|
|
<para>Falls die Leistung der Karte schlecht ist, setzen
|
|
Sie die Medienerkennung von <literal>autoselect</literal>
|
|
(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 die Hilfeseite &man.tuning.7;.</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-virtual-hosts">
|
|
<title>Virtual Hosts</title>
|
|
|
|
<indexterm><primary>virtual hosts</primary></indexterm>
|
|
<indexterm><primary>IP-Aliase</primary></indexterm>
|
|
|
|
<para>Ein gebräuchlicher Zweck von &os; 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.</para>
|
|
|
|
<para>Ein Netzwerkinterface hat eine <quote>echte</quote>
|
|
Adresse und kann beliebig viele <quote>alias</quote> Adressen
|
|
haben. Die Aliase werden durch entsprechende alias Einträge
|
|
in <filename>/etc/rc.conf</filename> festgelegt.</para>
|
|
|
|
<para>Ein alias Eintrag für das Interface
|
|
<devicename>fxp0</devicename> sieht wie folgt aus:</para>
|
|
|
|
<programlisting>ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"</programlisting>
|
|
|
|
<para>Beachten Sie, dass die Alias-Einträge mit
|
|
<literal>alias0</literal> anfangen müssen und
|
|
weiter hochgezählt werden, das heißt
|
|
<literal>_alias1</literal>, <literal>_alias2</literal>,
|
|
und so weiter. Die Konfiguration der Aliase hört
|
|
bei der ersten fehlenden Zahl auf.</para>
|
|
|
|
<para>Die Berechnung der Alias-Netzwerkmasken ist wichtig, doch
|
|
zum Glück einfach. 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 <literal>1</literal> gefüllt
|
|
ist (also <hostid role="netmask">255.255.255.255</hostid>
|
|
oder hexadezimal
|
|
<hostid role="netmask">0xffffffff</hostid>).</para>
|
|
|
|
<para>Als Beispiel betrachten wir den Fall, in dem
|
|
<devicename>fxp0</devicename> mit zwei Netzwerken verbunden
|
|
ist: dem Netzwerk <hostid role="ipaddr">10.1.1.0</hostid> mit der
|
|
Netzwerkmaske <hostid role="netmask">255.255.255.0</hostid>
|
|
und dem Netzwerk <hostid role="ipaddr">202.0.75.16</hostid> mit der
|
|
Netzwerkmaske <hostid role="netmask">255.255.255.240</hostid>.
|
|
Das System soll die Adressen <hostid role="ipaddr">10.1.1.1</hostid>
|
|
bis <hostid role="ipaddr">10.1.1.5</hostid> und
|
|
<hostid role="ipaddr">202.0.75.17</hostid> bis
|
|
<hostid role="ipaddr">202.0.75.20</hostid> belegen.
|
|
Wie eben beschrieben, hat nur die erste Adresse in einem
|
|
Netzwerk (hier <hostid role="ipaddr">10.0.1.1</hostid>
|
|
und <hostid role="ipaddr">202.0.75.17</hostid>) die
|
|
richtige Netzwerkmaske. Alle anderen Adressen
|
|
(<hostid role="ipaddr">10.1.1.2</hostid> bis <hostid
|
|
role="ipaddr">10.1.1.5</hostid> und <hostid
|
|
role="ipaddr">202.0.75.18</hostid> bis <hostid
|
|
role="ipaddr">202.0.75.20</hostid>) erhalten die Maske
|
|
<hostid role="netmask">255.255.255.255</hostid>.</para>
|
|
|
|
<para>Die folgenden Einträge in
|
|
<filename>/etc/rc.conf</filename> konfigurieren den Adapter
|
|
entsprechend dem Beispiel:</para>
|
|
|
|
<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"</programlisting>
|
|
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-configfiles">
|
|
<title>Konfigurationsdateien</title>
|
|
|
|
<sect2>
|
|
<title><filename class="directory">/etc</filename> Layout</title>
|
|
<para>Konfigurationsdateien finden sich in einigen Verzeichnissen
|
|
unter anderem in:</para>
|
|
|
|
<informaltable frame="none" pgwide="1">
|
|
<tgroup cols="2">
|
|
<colspec colwidth="1*"/>
|
|
<colspec colwidth="2*"/>
|
|
|
|
<tbody>
|
|
<row>
|
|
<entry><filename class="directory">/etc</filename></entry>
|
|
<entry>Enthält generelle Konfigurationsinformationen,
|
|
die Daten hier sind systemspezifisch.</entry>
|
|
</row>
|
|
<row>
|
|
<entry><filename
|
|
class="directory">/etc/defaults</filename></entry>
|
|
<entry>Default Versionen der Konfigurationsdateien.</entry>
|
|
</row>
|
|
<row>
|
|
<entry><filename class="directory">/etc/mail</filename></entry>
|
|
<entry>Enthält die &man.sendmail.8; Konfiguration
|
|
und weitere MTA Konfigurationsdateien.</entry>
|
|
</row>
|
|
<row>
|
|
<entry><filename class="directory">/etc/ppp</filename></entry>
|
|
<entry>Hier findet sich die Konfiguration für
|
|
die User- und Kernel-ppp Programme.</entry>
|
|
</row>
|
|
<row>
|
|
<entry><filename class="directory">/etc/namedb</filename></entry>
|
|
<entry>Das Vorgabeverzeichnis, in dem Daten von
|
|
&man.named.8; gehalten werden. Normalerweise
|
|
werden hier <filename>named.conf</filename> und Zonendaten
|
|
abgelegt.</entry>
|
|
</row>
|
|
<row>
|
|
<entry><filename
|
|
class="directory">/usr/local/etc</filename></entry>
|
|
<entry>Installierte Anwendungen legen hier ihre
|
|
Konfigurationsdateien ab. Dieses Verzeichnis kann
|
|
Unterverzeichnisse für bestimmte Anwendungen
|
|
enthalten.</entry>
|
|
</row>
|
|
<row>
|
|
<entry><filename
|
|
class="directory">/usr/local/etc/rc.d</filename></entry>
|
|
<entry>Ort für Start- und Stopskripten installierter
|
|
Anwendungen.</entry>
|
|
</row>
|
|
<row>
|
|
<entry><filename class="directory">/var/db</filename></entry>
|
|
<entry>Automatisch generierte systemspezifische Datenbanken,
|
|
wie die Paket-Datenbank oder die
|
|
<command>locate</command>-Datenbank.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Hostnamen</title>
|
|
|
|
<indexterm><primary>hostname</primary></indexterm>
|
|
<indexterm><primary>DNS</primary></indexterm>
|
|
|
|
<sect3>
|
|
<title><filename>/etc/resolv.conf</filename></title>
|
|
|
|
<indexterm><primary><filename>resolv.conf</filename></primary></indexterm>
|
|
|
|
<para>Wie der &os;-Resolver auf das Internet Domain Name
|
|
System (DNS) zugreift, wird in <filename>/etc/resolv.conf</filename>
|
|
festgelegt.</para>
|
|
|
|
<para>Die gebräuchlichsten Einträge in
|
|
<filename>/etc/resolv.conf</filename> sind:</para>
|
|
|
|
<informaltable frame="none" pgwide="1">
|
|
<tgroup cols="2">
|
|
<colspec colwidth="1*"/>
|
|
<colspec colwidth="2*"/>
|
|
|
|
<tbody>
|
|
<row>
|
|
<entry><literal>nameserver</literal></entry>
|
|
<entry>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.</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>search</literal></entry>
|
|
<entry>Suchliste mit Domain-Namen zum Auflösen von
|
|
Hostnamen. Die Liste wird normalerweise durch den
|
|
Domain-Teil des lokalen Hostnamens festgelegt.</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>domain</literal></entry>
|
|
<entry>Der lokale Domain-Name.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
<para>Beispiel für eine typische
|
|
<filename>resolv.conf</filename>:</para>
|
|
|
|
<programlisting>search example.com
|
|
nameserver 147.11.1.11
|
|
nameserver 147.11.100.30</programlisting>
|
|
|
|
<note><para>Nur eine der Anweisungen <literal>search</literal>
|
|
oder <literal>domain</literal> sollte benutzt werden.</para></note>
|
|
|
|
<para>Wenn Sie DHCP benutzen, überschreibt &man.dhclient.8;
|
|
für gewöhnlich <filename>resolv.conf</filename>
|
|
mit den Informationen vom DHCP-Server.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title><filename>/etc/hosts</filename></title>
|
|
|
|
<indexterm><primary>hosts</primary></indexterm>
|
|
|
|
<para><filename>/etc/hosts</filename> ist eine einfache textbasierte
|
|
Datenbank, die aus alten Internetzeiten stammt. 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</filename> verhindern die Abfrage eines
|
|
externen Servers und beschleunigen die Namensauflösung.</para>
|
|
|
|
<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.)
|
|
#</programlisting>
|
|
|
|
<para><filename>/etc/hosts</filename> hat ein einfaches Format:</para>
|
|
<programlisting>[Internet Adresse] [Offizieller Hostname] [Alias1] [Alias2] ...</programlisting>
|
|
|
|
<para>Zum Beispiel:</para>
|
|
|
|
<programlisting>10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2</programlisting>
|
|
|
|
<para>Weitere Informationen entnehmen Sie bitte &man.hosts.5;.</para>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Konfiguration von Logdateien</title>
|
|
|
|
<indexterm><primary>Logdateien</primary></indexterm>
|
|
|
|
<sect3>
|
|
<title><filename>syslog.conf</filename></title>
|
|
|
|
<indexterm><primary>syslog.conf</primary></indexterm>
|
|
|
|
<para><filename>syslog.conf</filename> ist die Konfigurationsdatei
|
|
von &man.syslogd.8;. Sie legt fest, welche
|
|
<application>syslog</application> Meldungen in welche
|
|
Logdateien geschrieben werden.</para>
|
|
|
|
<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.debug;auth.notice;mail.crit /dev/console
|
|
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
|
|
security.* /var/log/security
|
|
mail.info /var/log/maillog
|
|
lpr.info /var/log/lpd-errs
|
|
cron.* /var/log/cron
|
|
*.err root
|
|
*.notice;news.err root
|
|
*.alert root
|
|
*.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
|
|
#*.* /var/log/all.log
|
|
# uncomment this to enable logging to a remote log host 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
|
|
!startslip
|
|
*.* /var/log/slip.log
|
|
!ppp
|
|
*.* /var/log/ppp.log</programlisting>
|
|
|
|
<para>Weitere Informationen enthält &man.syslog.conf.5;.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title><filename>newsyslog.conf</filename></title>
|
|
|
|
<indexterm><primary>newsyslog.conf</primary></indexterm>
|
|
|
|
<para>Die Konfigurationsdatei für &man.newsyslog.8;, das
|
|
normalerweise von &man.cron.8; aufgerufen wird, ist
|
|
<filename>newsyslog.conf</filename>. &man.newsyslog.8;
|
|
stellt fest, ob Logdateien archiviert oder verschoben
|
|
werden müssen. So wird <filename>logfile</filename>
|
|
nach <filename>logfile.0</filename> geschoben und
|
|
<filename>logfile.0</filename> nach <filename>logfile.1</filename>
|
|
usw. Zudem können Logdateien mit &man.gzip.1;
|
|
komprimiert werden. Die Namen der Logdateien sind dann
|
|
<filename>logfile.0.gz</filename>, <filename>logfile.1.gz</filename>
|
|
usw.</para>
|
|
|
|
<para><filename>newsyslog.conf</filename> legt fest, welche
|
|
Logdateien wann bearbeitet und wie viele Dateien behalten werden.
|
|
Logdateien können auf Basis ihrer Größe oder zu
|
|
einem gewissen Zeitpunkt archiviert bzw. umbenannt werden.</para>
|
|
|
|
<programlisting># configuration file for newsyslog
|
|
# $FreeBSD$
|
|
#
|
|
# filename [owner:group] mode count size when [ZB] [/pid_file] [sig_num]
|
|
/var/log/cron 600 3 100 * Z
|
|
/var/log/amd.log 644 7 100 * Z
|
|
/var/log/kerberos.log 644 7 100 * Z
|
|
/var/log/lpd-errs 644 7 100 * Z
|
|
/var/log/maillog 644 7 * @T00 Z
|
|
/var/log/sendmail.st 644 10 * 168 B
|
|
/var/log/messages 644 5 100 * Z
|
|
/var/log/all.log 600 7 * @T00 Z
|
|
/var/log/slip.log 600 3 100 * Z
|
|
/var/log/ppp.log 600 3 100 * Z
|
|
/var/log/security 600 10 100 * Z
|
|
/var/log/wtmp 644 3 * @01T05 B
|
|
/var/log/daily.log 640 7 * @T00 Z
|
|
/var/log/weekly.log 640 5 1 $W6D0 Z
|
|
/var/log/monthly.log 640 12 * $M1D0 Z
|
|
/var/log/console.log 640 5 100 * Z</programlisting>
|
|
|
|
<para>Um mehr zu erfahren, lesen Sie bitte &man.newsyslog.8;.</para>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2 id="configtuning-sysctlconf">
|
|
<title><filename>sysctl.conf</filename></title>
|
|
|
|
<indexterm><primary>sysctl.conf</primary></indexterm>
|
|
<indexterm><primary>sysctl</primary></indexterm>
|
|
|
|
<para><filename>sysctl.conf</filename> sieht ähnlich
|
|
wie <filename>rc.conf</filename> aus. Werte werden in der
|
|
Form <literal>Variable=Wert</literal> gesetzt.
|
|
Die angegebenen Werte werden gesetzt, nachdem sich das
|
|
System bereits im Mehrbenutzermodus befindet. Allerdings
|
|
lassen sich im Mehrbenutzermodus nicht alle Werte
|
|
setzen.</para>
|
|
|
|
<para>Um das Protokollieren von fatalen Signalen abzustellen
|
|
und Benutzer daran zu hindern, von anderen Benutzern
|
|
gestartete Prozesse zu sehen, können Sie in der
|
|
Datei <filename>sysctl.conf</filename> die folgenden
|
|
Variablen setzen:</para>
|
|
|
|
<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</programlisting>
|
|
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-sysctl">
|
|
<title>Einstellungen mit sysctl</title>
|
|
|
|
<indexterm><primary>sysctl</primary></indexterm>
|
|
<indexterm>
|
|
<primary>Einstellungen</primary>
|
|
<secondary>mit sysctl</secondary>
|
|
</indexterm>
|
|
|
|
<para>Mit &man.sysctl.8; können Sie Änderungen an
|
|
einem laufenden &os;-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.</para>
|
|
|
|
<para>Der Hauptzweck von &man.sysctl.8; besteht darin, Systemeinstellungen
|
|
zu lesen und zu verändern.</para>
|
|
|
|
<para>Alle auslesbaren Variablen werden wie folgt angezeigt:</para>
|
|
|
|
<screen>&prompt.user; <userinput>sysctl -a</userinput></screen>
|
|
|
|
<para>Sie können auch eine spezielle Variable, z.B.
|
|
<varname>kern.maxproc</varname> lesen:</para>
|
|
|
|
<screen>&prompt.user; <userinput>sysctl kern.maxproc</userinput>
|
|
kern.maxproc: 1044</screen>
|
|
|
|
<para>Um eine Variable zu setzen, benutzen Sie die Syntax
|
|
<replaceable>Variable</replaceable>=
|
|
<replaceable>Wert</replaceable>:</para>
|
|
|
|
<screen>&prompt.root; <userinput>sysctl kern.maxfiles=5000</userinput>
|
|
kern.maxfiles: 2088 -> 5000</screen>
|
|
|
|
<para>Mit sysctl können Sie Strings, Zahlen oder
|
|
Boolean-Werte setzen. Bei Boolean-Werten setzen sie <literal>1</literal>
|
|
für wahr und <literal>0</literal> für falsch.</para>
|
|
|
|
<para>Wenn Sie Variablen automatisch während des Systemstarts
|
|
setzen wollen, fügen Sie die Variablen in die Datei
|
|
<filename>/etc/sysctl.conf</filename> ein. Weiteres
|
|
entnehmen Sie bitte der Hilfeseite &man.sysctl.conf.5;
|
|
und dem <xref linkend="configtuning-sysctlconf"/>.</para>
|
|
|
|
<sect2 id="sysctl-readonly">
|
|
<sect2info>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Tom</firstname>
|
|
<surname>Rhodes</surname>
|
|
<contrib>Contributed by </contrib>
|
|
</author>
|
|
</authorgroup>
|
|
</sect2info>
|
|
<title>Schreibgeschützte Variablen</title>
|
|
|
|
<para>Schreibgeschützte sysctl-Variablen können nur
|
|
während des Systemstarts verändert werden.</para>
|
|
|
|
<para>Beispielsweise hat &man.cardbus.4; auf einigen Laptops
|
|
Schwierigkeiten, Speicherbereiche zu erkennen. Es treten
|
|
dann Fehlermeldungen wie die folgende auf:</para>
|
|
|
|
<screen>cbb0: Could not map register memory
|
|
device_probe_and_attach: cbb0 attach returned 12</screen>
|
|
|
|
<para>Um dieses Problem zu lösen, muss eine
|
|
schreibgeschützte sysctl-Variable verändert
|
|
werden. Eine <acronym>OID</acronym> kann in der Datei
|
|
<filename>/boot/loader.conf</filename> überschrieben
|
|
werden. Die Datei <filename>/boot/defaults/loader.conf</filename>
|
|
enthält Vorgabewwerte für sysctl-Variablen.</para>
|
|
|
|
<para>Das oben erwähnte Problem wird durch die Angabe von
|
|
<option>hw.pci.allow_unsupported_io_range=1</option> in
|
|
<filename>/boot/loader.conf</filename> gelöst.
|
|
Danach sollte &man.cardbus.4; fehlerfrei funktionieren.</para>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-disk">
|
|
<title>Tuning von Laufwerken</title>
|
|
|
|
<sect2>
|
|
<title>Sysctl Variablen</title>
|
|
|
|
<sect3>
|
|
<title><varname>vfs.vmiodirenable</varname></title>
|
|
|
|
<indexterm>
|
|
<primary><varname>vfs.vmiodirenable</varname></primary>
|
|
</indexterm>
|
|
|
|
<para>Die Variable <varname>vfs.vmiodirenable</varname> besitzt
|
|
in der Voreinstellung den Wert 1. Die Variable kann auf den Wert
|
|
0 (ausgeschaltet) oder 1 (angeschaltet) 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. Im Buffer-Cache verbrauchen sie mit
|
|
512 Bytes noch weniger Platz. Ist die Variable
|
|
ausgeschaltet (auf 0) wird der Buffer-Cache nur
|
|
eine limitierte Anzahl Verzeichnisse zwischenspeichern, auch
|
|
wenn das System über sehr viel Speicher verfügt.
|
|
Ist die Variable aktiviert (auf 1), 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. Wir empfehlen,
|
|
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.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title><varname>vfs.write_behind</varname></title>
|
|
|
|
<indexterm>
|
|
<primary><varname>vfs.write_behind</varname></primary>
|
|
</indexterm>
|
|
|
|
<para>In der Voreinstellung besitzt die Variable
|
|
<varname>vfs.write_behind</varname> den Wert
|
|
<literal>1</literal> (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
|
|
(<foreignphrase>dirty buffers</foreignphrase>) 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 <varname>vfs.write_behind</varname> auf
|
|
den Wert <literal>0</literal>.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title><varname>vfs.hirunningspace</varname></title>
|
|
|
|
<indexterm>
|
|
<primary><varname>vfs.hirunningspace</varname></primary>
|
|
</indexterm>
|
|
|
|
<para>Die Variable <varname>vfs.hirunningspace</varname>
|
|
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 <emphasis>Megabyte</emphasis> erhöht werden.
|
|
Beachten Sie, dass ein zu hoher Wert (größer
|
|
als der Schreib-Schwellwert des Buffer-Caches) zu
|
|
Leistungverlusten führen kann. Setzen Sie den Wert daher
|
|
nicht zu hoch! Hohe Werte können auch Leseoperationen
|
|
verzögern, die gleichzeitig mit Schreiboperationen
|
|
ausgeführt werden.</para>
|
|
|
|
<para>Es gibt weitere Variablen, mit denen Sie den Buffer-Cache
|
|
und den VM-Page-Cache beeinflussen können. Wir raten
|
|
Ihnen allerdings davon ab, diese Variablen zu verändern,
|
|
da das VM-System den virtuellen Speicher selbst sehr gut
|
|
verwaltet.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title><varname>vm.swap_idle_enabled</varname></title>
|
|
|
|
<indexterm>
|
|
<primary><varname>vm.swap_idle_enabled</varname></primary>
|
|
</indexterm>
|
|
|
|
<para>Die Variable <varname>vm.swap_idle_enabled</varname>
|
|
ist für große Mehrbenutzer-Systeme gedacht, auf
|
|
denen sich viele Benutzer an- und abmelden und auf denen
|
|
es viele Prozesse im Leerlauf
|
|
(<foreignphrase>idle</foreignphrase>) gibt. Solche Systeme
|
|
fragen kontinuierlich freien Speicher an. Wenn Sie die
|
|
Variable <varname>vm.swap_idle_enabled</varname> aktivieren,
|
|
können Sie die Auslagerungs-Hysterese von Seiten mit
|
|
den Variablen <varname>vm.swap_idle_threshold1</varname> und
|
|
<varname>vm.swap_idle_threshold2</varname> 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 kleine Systeme
|
|
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.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title><varname>hw.ata.wc</varname></title>
|
|
|
|
<indexterm>
|
|
<primary><varname>hw.ata.wc</varname></primary>
|
|
</indexterm>
|
|
|
|
<para>In &os; 4.3 wurde versucht, den IDE-Schreib-Zwischenspeicher
|
|
abzustellen. Obwohl dies die Bandbreite zum Schreiben auf
|
|
IDE-Platten verringerte, wurde es aus Gründen der
|
|
Datenkonsistenz als notwenig angesehen. Der Kern des
|
|
Problems 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.
|
|
Wir entschieden uns daher für die sichere Variante
|
|
und stellten den Schreib-Zwischenspeicher ab. Leider war
|
|
damit auch ein großer Leistungsverlust verbunden, so
|
|
dass wir die Variable
|
|
nach dem Release wieder aktiviert haben. Sie sollten den
|
|
Wert der Variable <varname>hw.ata.wc</varname> auf Ihrem
|
|
System überprüfen. Wenn der Schreib-Zwischenspeicher
|
|
abgestellt ist, können Sie ihn aktivieren, indem Sie die
|
|
Variable auf den Wert 1 setzen. Dies muss zum Zeitpunkt
|
|
des Systemstarts im Boot-Loader geschehen. Eine Änderung
|
|
der Variable, nachdem der Kernel gestartet ist, hat keine
|
|
Auswirkungen.</para>
|
|
|
|
<para>Weitere Informationen finden Sie in &man.ata.4;.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title><literal>SCSI_DELAY</literal>
|
|
(<varname>kern.cam.scsi_delay</varname>)</title>
|
|
|
|
<indexterm>
|
|
<primary><varname>kern.cam.scsi_delay</varname></primary>
|
|
</indexterm>
|
|
|
|
<indexterm>
|
|
<primary>Kerneloptionen</primary>
|
|
<secondary><literal>SCSI_DELAY</literal></secondary>
|
|
</indexterm>
|
|
|
|
<para>Mit der Kerneloption <literal>SCSI_DELAY</literal> 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, auf 5 Sekunden heruntergesetzt
|
|
werden (durch Setzen der <command>sysctl</command>-Variable
|
|
<varname>kern.cam.scsi_delay</varname>). Die Variable
|
|
sowie die Kerneloption verwenden für die Zeitangabe
|
|
Millisekunden und <emphasis>nicht</emphasis> Sekunden.</para>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2 id="soft-updates">
|
|
<title>Soft Updates</title>
|
|
|
|
<indexterm><primary>Soft Updates</primary></indexterm>
|
|
<indexterm><primary>tunefs</primary></indexterm>
|
|
|
|
<para>Mit &man.tunefs.8; lassen sich Feineinstellungen an
|
|
Dateisystemen vornehmen. Das Programm hat verschiedene Optionen,
|
|
von denen hier nur Soft Updates betrachtet werden. Soft Updates
|
|
werden wie folgt ein- und ausgeschaltet:</para>
|
|
|
|
<screen>&prompt.root; <userinput>tunefs -n enable /filesystem</userinput>
|
|
&prompt.root; <userinput>tunefs -n disable /filesystem</userinput></screen>
|
|
|
|
<para>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.</para>
|
|
|
|
<para>Durch Einsatz eines Zwischenspeichers wird die Performance
|
|
im Bereich der Metadaten, vorwiegend beim Anlegen und Löschen
|
|
von Dateien, gesteigert. Wir empfehlen, Soft Updates auf allen
|
|
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 leicht passieren, dass
|
|
das Dateisystem über mehrere Sekunden oder gar eine Minute
|
|
nicht synchronisiert wurde. Im Fall eines Absturzes verlieren
|
|
Sie mit Soft Updates unter Umständen mehr Daten als ohne.
|
|
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 <command>make installworld</command>,
|
|
kann das Dateisystem vollaufen lassen. Dadurch würde
|
|
die Aktualisierung fehlschlagen.</para>
|
|
|
|
<sect3>
|
|
<title>Details über Soft Updates</title>
|
|
|
|
<indexterm>
|
|
<primary>Soft Updates</primary>
|
|
<secondary>Details</secondary>
|
|
</indexterm>
|
|
|
|
<para>Es gibt zwei klassische Herangehensweisen, wie
|
|
man die Metadaten des Dateisystems (also Daten
|
|
über Dateien, wie inode Bereiche oder Verzeichniseinträge)
|
|
aktualisiert auf die Platte zurückschreibt:</para>
|
|
|
|
<para>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
|
|
<emphasis>Inhalt</emphasis> der Dateien wurde im
|
|
<quote>Buffer Cache</quote> zwischengespeichert und
|
|
asynchron irgendwann später 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
|
|
<quote>Buffer Cache</quote> 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 <command>rm -r</command>
|
|
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 (<command>tar -x</command>).</para>
|
|
|
|
<para>Der zweite Fall sind asynchrone Metadaten-Updates. Das
|
|
ist z. B. der Standard bei Linux/ext2fs oder die Variante
|
|
<command>mount -o async</command> für *BSD UFS. Man
|
|
schickt die Updates der Metadaten einfach auch noch
|
|
über den <quote>Buffer Cache</quote>, 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-Tasters), 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 <command>fsck</command>
|
|
mehr implementieren, das diesen Zustand
|
|
wieder reparieren kann, da die dazu nötigen
|
|
Informationen einfach auf der Platte fehlen. Wenn ein
|
|
Dateisystem derart beschädigt worden ist, kann man es
|
|
nur neu erzeugen (&man.newfs.8;) und die Daten
|
|
vom Backup zurückspielen.
|
|
</para>
|
|
|
|
<para>Der historische Ausweg aus diesem Dilemma war ein
|
|
<emphasis>dirty region logging</emphasis> (auch als
|
|
<emphasis>Journalling</emphasis> bezeichnet, wenngleich
|
|
dieser Begriff nicht immer gleich benutzt und manchmal auch
|
|
für andere Formen von Transaktionsprotokollen gebraucht
|
|
wird). Man schreibt die Metadaten-Updates zwar synchron,
|
|
aber nur in einen kleinen Plattenbereich, die
|
|
<emphasis>logging area</emphasis>. Von da aus werden sie
|
|
dann asynchron auf ihre eigentlichen Bereiche verteilt. Da
|
|
die <emphasis>logging area</emphasis> 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
|
|
<emphasis>logging area</emphasis>, einmal an die richtige
|
|
Stelle), so dass das im Falle regulärer
|
|
Arbeit (also keine gehäuften Metadatenoperationen) eine
|
|
<quote>Pessimisierung</quote> des Falls der synchronen
|
|
Updates eintritt, es wird alles langsamer. Dafür hat man
|
|
als Vorteil, dass im Falle eines Crashes der
|
|
konsistente Zustand dadurch erzielbar ist, dass die
|
|
angefangenen Operationen aus dem <emphasis>dirty region
|
|
log</emphasis> entweder zu Ende ausgeführt oder
|
|
komplett verworfen werden, wodurch das Dateisystem schnell
|
|
wieder zur Verfügung steht.</para>
|
|
|
|
<para>Die Lösung von Kirk McKusick, dem Schöpfer von
|
|
Berkeley FFS, waren <emphasis>Soft Updates</emphasis>: die
|
|
notwendigen Updates der Metadaten werden im Speicher
|
|
gehalten und dann sortiert auf die Platte geschrieben
|
|
(<quote>ordered metadata updates</quote>). 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
|
|
<quote>einholen</quote>. 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 <quote>log
|
|
rewind</quote>: 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
|
|
<quote>belegt</quote> markiert sind, die tatsächlich
|
|
<quote>frei</quote> 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
|
|
<command>mount -f</command> zwangsweise eingebunden werden.
|
|
Um noch allozierte Ressourcen freizugeben muss
|
|
später ein &man.fsck.8; nachgeholt werden. Das ist
|
|
dann auch die Idee des <emphasis>background fsck</emphasis>:
|
|
beim Starten des Systems wird lediglich ein
|
|
<emphasis>Schnappschuss</emphasis> des Filesystems
|
|
gemacht, mit dem &man.fsck.8; dann später arbeiten
|
|
kann. Alle Dateisysteme dürfen <quote>unsauber</quote>
|
|
eingebunden werden und das System kann sofort in den
|
|
Multiuser-Modus gehen. Danach wird ein
|
|
Hintergrund-<command>fsck</command> für die
|
|
Dateisysteme gestartet, die dies benötigen, um
|
|
möglicherweise irrtümlich belegte Ressourcen
|
|
freizugeben. (Dateisysteme ohne <emphasis>Soft
|
|
Updates</emphasis> benötigen natürlich immer noch
|
|
den üblichen (Vordergrund-)<command>fsck</command>,
|
|
bevor sie eingebunden werden können.)</para>
|
|
|
|
<para>Der Vorteil ist, dass die Metadaten-Operationen
|
|
beinahe so schnell ablaufen wie im asynchronen Fall (also
|
|
durchaus auch schneller als beim <quote>logging</quote>, das
|
|
ja die Metadaten immer zweimal schreiben muss). Als
|
|
Nachteil stehen dem die Komplexität des Codes (mit
|
|
einer erhöhten Fehlerwahrscheinlichkeit in einem
|
|
bezüglich Datenverlust hoch sensiblen Bereich) und ein
|
|
erhöhter Speicherverbrauch entgegen. Außerdem
|
|
muss man sich an einige Eigenheiten
|
|
gewöhnen: Nach einem Absturz ist ein etwas älterer
|
|
Stand auf der Platte – statt einer leeren, aber bereits
|
|
angelegten Datei (wie nach einem herkömmlichen
|
|
<command>fsck</command> Lauf) ist auf einem Dateisystem mit
|
|
<emphasis>Soft Updates</emphasis> 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 <command>rm -r</command>
|
|
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
|
|
ersetzt werden, das nicht genügend Platz hat, um alle
|
|
Dateien zweimal unterzubringen.</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="configtuning-kernel-limits">
|
|
<title>Einstellungen von Kernel Limits</title>
|
|
|
|
<indexterm>
|
|
<primary>Einstellungen</primary>
|
|
<secondary>von Kernel Limits</secondary>
|
|
</indexterm>
|
|
|
|
<sect2 id="file-process-limits">
|
|
<title>Datei und Prozeß Limits</title>
|
|
|
|
<sect3 id="kern-maxfiles">
|
|
<title><varname>kern.maxfiles</varname></title>
|
|
|
|
<indexterm>
|
|
<primary><varname>kern.maxfiles</varname></primary>
|
|
</indexterm>
|
|
|
|
<para>Abhängig von den Anforderungen Ihres Systems
|
|
kann <varname>kern.maxfiles</varname> erhöht oder
|
|
erniedrigt werden. Die Variable legt die maximale
|
|
Anzahl von Dateideskriptoren auf Ihrem System fest. Wenn
|
|
die Dateideskriptoren aufgebraucht sind, werden Sie
|
|
die Meldung <errorname>file: table is full</errorname>
|
|
wiederholt im Puffer für Systemmeldungen sehen. Den
|
|
Inhalt des Puffers können Sie sich mit <command>dmesg</command>
|
|
anzeigen lassen.</para>
|
|
|
|
<para>Jede offene Datei, jedes Socket und jede FIFO verbraucht
|
|
einen Dateideskriptor. Auf <quote>dicken</quote> Produktionsservern
|
|
können leicht Tausende Dateideskriptoren benötigt
|
|
werden, abhängig von der Art und Anzahl der gleichzeitig
|
|
laufenden Dienste.</para>
|
|
|
|
<para>In älteren &os;-Versionen wurde die Voreinstellung
|
|
von <varname>kern.maxfile</varname> aus der
|
|
Kernelkonfigurationsoption <literal>maxusers</literal>
|
|
bestimmt. <varname>kern.maxfiles</varname> wächst
|
|
proportional mit dem Wert von <literal>maxusers</literal>.
|
|
Wenn Sie einen angepassten Kernel kompilieren, empfiehlt es sich
|
|
diese Option entsprechend der maximalen Benutzerzahl Ihres
|
|
Systems einzustellen. Obwohl auf einer Produktionsmaschine
|
|
vielleicht nicht 256 Benutzer gleichzeitig angemeldet sind,
|
|
können die benötigten Ressourcen ähnlich denen
|
|
eines großen Webservers sein.</para>
|
|
|
|
<para>Die Variable <varname>kern.maxusers</varname> wird beim
|
|
Systemstart automatisch aus dem zur Verfügung stehenden
|
|
Hauptspeicher bestimmt. Im laufenden Betrieb kann dieser Wert
|
|
aus der (nur lesbaren) sysctl-Variable
|
|
<varname>kern.maxusers</varname> ermittelt werden. Falls ein
|
|
System für diese Variable einen anderen Wert benötigt,
|
|
kann der Wert über den Loader angepasst werden.
|
|
Häufig verwendete Werte sind dabei 64, 128, sowie 256.
|
|
Es ist empfehlenswert, die Anzahl der Dateideskriptoren nicht
|
|
auf einen Wert größer 256 zu setzen, es sei denn,
|
|
Sie benötigen wirklich eine riesige Anzahl von ihnen.
|
|
Viele der von <varname>kern.maxusers</varname> auf einen
|
|
Standardwert gesetzten Parameter können beim Systemstart
|
|
oder im laufenden Betrieb in der Datei
|
|
<filename>/boot/loader.conf</filename> (sehen Sie sich dazu
|
|
auch &man.loader.conf.5; sowie die Datei
|
|
<filename>/boot/defaults/loader.conf</filename> an) an Ihre
|
|
Bedürfnisse angepasst werden, so wie es bereits an anderer
|
|
Stelle dieses Dokuments beschrieben ist.</para>
|
|
|
|
<para>Ältere &os;-Versionen setzen diesen Wert selbst,
|
|
wenn Sie in der Konfigurationsdatei den Wert <literal>0</literal>
|
|
<footnote><para>Der verwendete Algorithmus setzt
|
|
<literal>maxusers</literal> auf die Speichergröße
|
|
des Systems. Der minimale Wert beträgt dabei
|
|
<literal>32</literal>, das Maximum ist
|
|
<literal>384</literal>.</para></footnote>
|
|
angeben. Wenn Sie den Wert selbst bestimmen wollen,
|
|
sollten Sie <literal>maxusers</literal> mindestens auf
|
|
<literal>4</literal> setzen. Dies gilt insbesondere dann,
|
|
wenn Sie beabsichtigen, das X Window-System zu benutzen
|
|
oder Software zu kompilieren. Der Grund dafür ist, dass
|
|
der wichtigste Wert, der durch <literal>maxusers</literal>
|
|
bestimmt wird, die maximale Anzahl an Prozessen ist, die auf
|
|
<literal>20 + 16 * maxusers</literal> gesetzt wird. Wenn Sie
|
|
also <literal>maxusers</literal> 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 des
|
|
X Window-Systems. 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, <literal>maxusers</literal> auf
|
|
64 zu setzen, womit 1044 gleichzeitige Prozesse zur
|
|
Verfügung stehen. Wenn Sie allerdings den
|
|
gefürchteten Fehler <errortype>proc table full</errortype>
|
|
beim Start eines Programms oder auf einem Server mit einer
|
|
großen Benutzerzahl (wie
|
|
<hostid role="fqdn">ftp.FreeBSD.org</hostid>) sehen, dann
|
|
sollten Sie den Wert nochmals erhöhen und den Kernel
|
|
neu bauen.</para>
|
|
|
|
<note><para>Die Anzahl der Benutzer, die sich auf einem Rechner
|
|
anmelden kann, wird durch <literal>maxusers</literal>
|
|
<emphasis>nicht</emphasis> begrenzt. Der Wert dieser
|
|
Variablen legt neben der möglichen Anzahl der Prozesse
|
|
eines Benutzers weitere sinnvolle Größen für
|
|
bestimmte Systemtabellen fest.</para>
|
|
</note>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title><varname>kern.ipc.somaxconn</varname></title>
|
|
|
|
<indexterm>
|
|
<primary><varname>kern.ipc.somaxconn</varname></primary>
|
|
</indexterm>
|
|
|
|
<para>Die Variable <varname>kern.ipc.somaxconn</varname>
|
|
beschränkt die Größe der Warteschlange
|
|
(<foreignphrase>Listen-Queue</foreignphrase>) für
|
|
neue TCP-Verbindungen. Der Vorgabewert von
|
|
<literal>128</literal> ist normalerweise zu klein, um neue
|
|
Verbindungen auf einem stark ausgelasteten Webserver
|
|
zuverlässig zu handhaben. Auf solchen Servern sollte
|
|
der Wert auf <literal>1024</literal> oder höher gesetzt
|
|
werden. Ein Dienst (z.B. &man.sendmail.8;, oder
|
|
<application>Apache</application>) kann 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 (<abbrev>DoS</abbrev>).</para>
|
|
</sect3>
|
|
</sect2>
|
|
<sect2 id="nmbclusters">
|
|
<title>Netzwerk Limits</title>
|
|
|
|
<para>Die Kerneloption <literal>NMBCLUSTERS</literal> 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 &os;. 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.
|
|
Wenn Sie einen Webserver besitzen, der maximal 1000 gleichzeitige
|
|
Verbindungen servieren soll und jede der Verbindungen je einen
|
|
16 kB großen Puffer zum Senden und Empfangen braucht,
|
|
brauchen Sie ungefähr 32 MB Speicher für
|
|
Netzwerkpuffer. Als Daumenregel verdoppeln Sie diese Zahl,
|
|
so dass sich für <varname>NMBCLUSTERS</varname> der Wert
|
|
2x32 MB / 2 kB = 32768 ergibt.
|
|
Für Maschinen mit viel Speicher sollten Werte zwischen
|
|
4096 und 32768 genommen werden. Sie können diesen Wert
|
|
nicht willkürlich erhöhen, da dies bereits zu einem
|
|
Absturz beim Systemstart führen kann. Mit der Option
|
|
<option>-m</option> von &man.netstat.1; können Sie den
|
|
Gebrauch der Netzwerkpuffer kontrollieren.</para>
|
|
|
|
<para>Die Netzwerkpuffer können beim Systemstart mit der
|
|
Loader-Variablen <varname>kern.ipc.nmbclusters</varname>
|
|
eingestellt werden. Nur auf älteren &os;-Systemen
|
|
müssen Sie die Kerneloption <literal>NMBCLUSTERS</literal>
|
|
verwenden.</para>
|
|
|
|
<para>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 <literal>NSFBUFS</literal> verwenden oder die
|
|
Anzahl der Puffer in <filename>/boot/loader.conf</filename>
|
|
(siehe &man.loader.8;) setzen. Die Puffer sollten erhöht
|
|
werden, wenn Sie Prozesse im Zustand <literal>sfbufa</literal>
|
|
sehen. Die schreibgeschützte sysctl-Variable
|
|
<varname>kern.ipc.nsfbufs</varname> zeigt die Anzahl
|
|
eingerichteten Puffer im Kernel. Der Wert dieser Variablen
|
|
wird normalerweise von <varname>kern.maxusers</varname> bestimmt.
|
|
Manchmal muss die Pufferanzahl jedoch manuell eingestellt
|
|
werden.</para>
|
|
|
|
<important>
|
|
<para>Auch wenn ein Socket nicht blockierend angelegt wurde,
|
|
kann der Aufruf von &man.sendfile.2; blockieren, um auf
|
|
freie <literal>struct sf_buf</literal> Puffer zu warten.</para>
|
|
</important>
|
|
|
|
<sect3>
|
|
<title><varname>net.inet.ip.portrange.*</varname></title>
|
|
|
|
<indexterm>
|
|
<primary>net.inet.ip.portrange.*</primary>
|
|
</indexterm>
|
|
|
|
<para>Die sysctl-Variable <varname>net.inet.ip.portrange.*</varname>
|
|
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 500 bis 5000
|
|
und wird durch die Variablen
|
|
<varname>net.inet.ip.portrange.first</varname> und
|
|
<varname>net.inet.ip.portrange.last</varname> 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 Sie keine freien Portnummern mehr haben, sollten Sie
|
|
die Variable <varname>net.inet.ip.portrange.last</varname>
|
|
langsam erhöhen. Ein Wert von <literal>10000</literal>,
|
|
<literal>20000</literal> oder <literal>30000</literal> 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 <varname>net.inet.ip.portrange.first</varname>
|
|
zu erhöhen.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>TCP Bandwidth Delay Product Begrenzung</title>
|
|
|
|
<indexterm>
|
|
<primary>TCP Bandwidth Delay Product Begrenzung</primary>
|
|
<secondary>
|
|
<varname>net.inet.tcp.inflight.enable</varname>
|
|
</secondary>
|
|
</indexterm>
|
|
|
|
<para>Die TCP Bandwidth Delay Product Begrenzung gleicht
|
|
TCP/Vegas von NetBSD. Die
|
|
Begrenzung wird aktiviert, indem Sie die sysctl-Variable
|
|
<varname>net.inet.tcp.inflight.enable</varname> auf den
|
|
Wert <literal>1</literal> setzen. Das System wird dann
|
|
versuchen, für jede Verbindung, das Produkt aus der
|
|
Übertragungsrate und der Verzögerungszeit zu
|
|
bestimmen. Dieses Produkt begrenzt die Datenmenge, die
|
|
für einen optimales Durchsatz zwischengespeichert
|
|
werden muss.</para>
|
|
|
|
<para>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 TCP-Option
|
|
<foreignphrase>Window-scaling</foreignphrase> verwendet oder
|
|
große Sende-Fenster
|
|
(<foreignphrase>send window</foreignphrase>) benutzt.
|
|
Schalten Sie die Debug-Meldungen aus, wenn Sie die Begrenzung
|
|
aktiviert haben. Dazu setzen Sie die Variable
|
|
<varname>net.inet.tcp.inflight.debug</varname> auf
|
|
<literal>0</literal>. Auf Produktions-Systemen sollten Sie
|
|
zudem die Variable <varname>net.inet.tcp.inflight.min</varname>
|
|
mindestens auf den Wert <literal>6144</literal> 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
|
|
(<foreignphrase>Round Trip Time</foreignphrase>) 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.</para>
|
|
|
|
<para>Die Variable <varname>net.inet.tcp.inflight.stab</varname>
|
|
sollte <emphasis>nicht</emphasis> angepasst werden. Der
|
|
Vorgabewert der Variablen beträgt <literal>20</literal>,
|
|
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
|
|
<literal>15</literal>, <literal>10</literal> oder
|
|
<literal>5</literal> zu erniedrigen. Gleichzeitig müssen
|
|
Sie vielleicht auch <varname>net.inet.tcp.inflight.min</varname>
|
|
auf einen kleineren Wert (beispielsweise <literal>3500</literal>)
|
|
setzen. Ändern Sie diese Variablen nur ab, wenn Sie
|
|
keine anderen Möglichkeiten mehr haben.</para>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Virtueller Speicher (<foreignphrase>Virtual
|
|
Memory</foreignphrase>)</title>
|
|
|
|
<sect3>
|
|
<title><varname>kern.maxvnodes</varname></title>
|
|
|
|
<para>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
|
|
Ihre Festplatte. vnodes werden im Normalfall vom
|
|
Betriebssystem automatisch vergeben und müssen
|
|
nicht von Ihnen 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.</para>
|
|
|
|
<para>Um die Anzahl der derzeit verwendeten vnodes zu sehen,
|
|
geben Sie Folgendes ein:</para>
|
|
|
|
<screen>&prompt.root; <userinput>sysctl vfs.numvnodes</userinput>
|
|
vfs.numvnodes: 91349</screen>
|
|
|
|
<para>Die maximal mögliche Anzahl der vnodes erhalten
|
|
Sie durch die Eingabe von:</para>
|
|
|
|
<screen>&prompt.root; <userinput>sysctl kern.maxvnodes</userinput>
|
|
kern.maxvnodes: 100000</screen>
|
|
|
|
<para>Wenn sich die Anzahl der genutzten vnodes dem maximal
|
|
möglichen Wert nähert, sollten Sie den Wert
|
|
<varname>kern.maxvnodes</varname> zuerst um etwa 1.000
|
|
erhöhen. Beobachten Sie danach die Anzahl der vom
|
|
System genutzten <varname>vfs.numvnodes</varname>.
|
|
Nähert sich der Wert wiederum dem definierten
|
|
Maximum, müssen Sie <varname>kern.maxvnodes</varname>
|
|
nochmals erhöhen. Sie sollten nun eine Änderung
|
|
Ihres Speicherverbrauches (etwa über &man.top.1;)
|
|
registrieren können und über mehr aktiven
|
|
Speicher verfügen.</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="adding-swap-space">
|
|
<title>Hinzufügen von Swap-Bereichen</title>
|
|
|
|
<para>Egal wie vorausschauend Sie planen, manchmal entspricht ein System
|
|
einfach nicht Ihren Erwartungen. Es ist leicht, mehr Swap-Bereiche
|
|
hinzuzufügen. Dazu stehen Ihnen drei Wege offen: Sie
|
|
können eine neue Platte einbauen, den Swap-Bereich über NFS
|
|
ansprechen oder eine Swap-Datei auf einer existierenden Partition
|
|
einrichten.</para>
|
|
|
|
<para>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 bitte
|
|
<xref linkend="swap-encrypting"/> des Handbuchs.</para>
|
|
|
|
<sect2 id="new-drive-swap">
|
|
<title>Swap auf einer neuen Festplatte</title>
|
|
|
|
<para>Der einfachste Weg, zusätzlich einen Swap-Bereich
|
|
einzurichten, ist der Einbau einer neuen Platte, die Sie
|
|
sowieso gebrauchen können. Die Anordnung von
|
|
Swap-Bereichen wird in <xref linkend="configtuning-initial"/>
|
|
des Handbuchs besprochen.</para>
|
|
</sect2>
|
|
|
|
<sect2 id="nfs-swap">
|
|
<title>Swap-Bereiche über NFS</title>
|
|
|
|
<para>Swap-Bereiche über NFS sollten Sie nur dann einsetzen,
|
|
wenn Sie über keine lokale Platte verfügen, da es durch
|
|
die zur Verfügung stehende Bandbreite limitiert wird und
|
|
außerdem den NFS-Server zusätzlich belastet.</para>
|
|
</sect2>
|
|
|
|
<sect2 id="create-swapfile">
|
|
<title>Swap-Dateien</title>
|
|
|
|
<para>Sie können eine Datei festgelegter Größe als
|
|
Swap-Bereich nutzen. Im folgenden Beispiel werden wir eine 64 MB
|
|
große Datei mit Namen <filename>/usr/swap0</filename>
|
|
benutzen, Sie können natürlich einen beliebigen Namen
|
|
für den Swap-Bereich benutzen.</para>
|
|
|
|
<example>
|
|
<title>Erstellen einer Swap-Datei</title>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para>Der <filename>GENERIC</filename>-Kernel unterstützt
|
|
bereits RAM-Disks (&man.md.4;), welche für diese Aktion
|
|
benötigt werden. Wenn Sie einen eigenen Kernel erstellen,
|
|
vergewissern Sie sicher, dass die folgende Zeile in ihrer
|
|
Kernel-Konfigurationsdatei enthalten ist:</para>
|
|
|
|
<programlisting>device md</programlisting>
|
|
|
|
<para>Informationen, wie man einen eigenen Kernel erstellen kann,
|
|
erhalten Sie in <xref linkend="kernelconfig"/>.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Legen Sie die Swap-Datei
|
|
<filename>/usr/swap0</filename> an:</para>
|
|
|
|
<screen>&prompt.root; <userinput>dd if=/dev/zero of=/usr/swap0 bs=1024k count=64</userinput></screen>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Setzen Sie die richtigen Berechtigungen für
|
|
<filename>/usr/swap0</filename>:</para>
|
|
|
|
<screen>&prompt.root; <userinput>chmod 0600 /usr/swap0</userinput></screen>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Aktivieren Sie die Swap-Datei
|
|
<filename>/etc/rc.conf</filename>:</para>
|
|
|
|
<programlisting>swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.</programlisting>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Um die Swap-Datei zu aktivieren, führen Sie
|
|
entweder einen Neustart durch oder geben das folgende Kommando
|
|
ein:</para>
|
|
|
|
<screen>&prompt.root; <userinput>mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0</userinput></screen>
|
|
</listitem>
|
|
</orderedlist>
|
|
</example>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="acpi-overview">
|
|
<sect1info>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Hiten</firstname>
|
|
<surname>Pandya</surname>
|
|
<contrib>Verfasst von </contrib>
|
|
</author>
|
|
<author>
|
|
<firstname>Tom</firstname>
|
|
<surname>Rhodes</surname>
|
|
</author>
|
|
</authorgroup>
|
|
</sect1info>
|
|
|
|
<title>Energie- und Ressourcenverwaltung</title>
|
|
|
|
<para>Es ist wichtig, Hardware effizient einzusetzen. Vor der
|
|
Einführung des <firstterm>Advanced Configuration and Power
|
|
Interface</firstterm> (<acronym>ACPI</acronym>) konnten
|
|
Stromverbrauch und Wärmeabgabe eines Systems nur
|
|
schlecht von Betriebssystemen gesteuert werden. Die Hardware
|
|
wurde vom <acronym>BIOS</acronym> gesteuert, was die Kontrolle
|
|
der Energieverwaltung für den Anwender erschwerte. Das
|
|
<emphasis>Advanced Power Management (APM)</emphasis> erlaubte
|
|
es lediglich, einige wenige Funktionen zu steuern, obwohl die
|
|
Überwachung von Energie- und Ressourcenverbrauch zu den
|
|
wichtigsten Aufgaben eines Betriebssystems gehört, um auf
|
|
verschiedene Ereignisse, beispielsweise einen unerwarteten
|
|
Temperaturanstieg, reagieren können.</para>
|
|
|
|
<para>Dieser Abschnitt erklärt das Advanced Configuration and
|
|
Power Interface (<acronym>ACPI</acronym>).</para>
|
|
|
|
<sect2 id="acpi-intro">
|
|
<title>Was ist ACPI?</title>
|
|
|
|
<indexterm>
|
|
<primary>ACPI</primary>
|
|
</indexterm>
|
|
|
|
<indexterm>
|
|
<primary>APM</primary>
|
|
</indexterm>
|
|
|
|
<para>Advanced Configuration and Power Interface
|
|
(<acronym>ACPI</acronym>) ist ein Standard verschiedener
|
|
Hersteller, der die Verwaltung von Hardware und
|
|
Energiesparfunktionen festlegt. Die
|
|
<acronym>ACPI</acronym>-Funktionen können von einem
|
|
Betriebssystem gesteuert werden. Der Vorgänger des
|
|
<acronym>ACPI</acronym>, <quote>Advanced Power Management</quote>
|
|
(<acronym>APM</acronym>), erwies sich in modernen Systemen
|
|
als unzureichend.</para>
|
|
</sect2>
|
|
|
|
<sect2 id="acpi-old-spec">
|
|
<title>Mängel des Advanced Power Managements (APM)</title>
|
|
|
|
<para>Das <emphasis>Advanced Power Management (APM)</emphasis>
|
|
steuert den Energieverbrauch eines Systems auf Basis
|
|
der Systemaktivität. 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
|
|
<emphasis>APM Software Interface</emphasis> zu, das den
|
|
Energieverbrauch regelt. APM findet sich in der Regel
|
|
nur noch in Systemen, die vor 2001 produziert
|
|
wurden.</para>
|
|
|
|
<para>Das <acronym>APM</acronym> 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.</para>
|
|
|
|
<para>Das <emphasis>Plug and Play BIOS (PNPBIOS)</emphasis>
|
|
war ebenfalls unzureichend. Das PNPBIOS verwendet eine
|
|
16-Bit-Technik. Damit das Betriebssystem das PNPBIOS
|
|
ansprechen kann, muss es in einer 16-Bit-Emulation laufen.</para>
|
|
|
|
<para>Der <acronym>APM</acronym>-Treiber von &os; ist in
|
|
der Hilfeseite &man.apm.4; beschrieben.</para>
|
|
</sect2>
|
|
|
|
<sect2 id="acpi-config">
|
|
<title>Konfiguration des <acronym>ACPI</acronym></title>
|
|
|
|
<para>Das Modul <filename>acpi.ko</filename> wird
|
|
standardmäßig beim Systemstart vom &man.loader.8;
|
|
geladen und sollte daher <emphasis>nicht</emphasis>
|
|
fest in den Kernel eingebunden werden. Dadurch kann
|
|
<filename>acpi.ko</filename> ohne einen Neubau des Kernels ersetzt
|
|
werden und das Modul ist leichter zu testen. Wenn Sie in der
|
|
Ausgabe von &man.dmesg.8; das Wort <acronym>ACPI</acronym> sehen,
|
|
ist das Modul geladen worden. Das ACPI-Modul im laufenden
|
|
Betrieb zu laden, führt oft nicht zum gewünschten
|
|
Ergebnis. Treten bei Ihrem System Probleme auf, können
|
|
Sie <acronym>ACPI</acronym> auch komplett deaktivieren.
|
|
Dazu definieren Sie die Variable
|
|
<literal>hint.acpi.0.disabled="1"</literal> in der Datei
|
|
<filename>/boot/loader.conf</filename>. Alternativ können
|
|
Sie die Variable auch am &man.loader.8;-Prompt eingeben.
|
|
Das Modul kann im laufenden Betrieb nicht entfernt werden,
|
|
da es zur Kommunikation mit der Hardware verwendet wird.</para>
|
|
|
|
<note>
|
|
<para><acronym>ACPI</acronym> und <acronym>APM</acronym>
|
|
können nicht zusammen verwendet werden. Das zuletzt
|
|
geladene Modul beendet sich, sobald es bemerkt, dass das andere
|
|
Modul geladen ist.</para>
|
|
</note>
|
|
|
|
<para>Mit &man.acpiconf.8; können Sie das System in einen
|
|
Ruhemodus (<foreignphrase>sleep mode</foreignphrase>) versetzen.
|
|
Es gibt verschiedene Modi (von <literal>1</literal> bis
|
|
<literal>5</literal>), die Sie auf der Kommandozeile mit
|
|
<option>-s</option> angeben können. Für die meisten
|
|
Anwender sind die Modi <literal>1</literal> und
|
|
<literal>3</literal> völlig ausreichend. Der Modus
|
|
<literal>5</literal> schaltet das System
|
|
aus (<foreignphrase>Soft-off</foreignphrase>) und entspricht
|
|
dem folgenden Befehl:</para>
|
|
|
|
<screen>&prompt.root; <userinput>halt -p</userinput></screen>
|
|
|
|
<para>Verschiedene Optionen können als
|
|
&man.sysctl.8;-Variablen gesetzt werden. Lesen Sie dazu
|
|
die Manualpages zu &man.acpi.4; sowie &man.acpiconf.8;.</para>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="ACPI-debug">
|
|
<sect1info>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Nate</firstname>
|
|
<surname>Lawson</surname>
|
|
<contrib>Verfasst von </contrib>
|
|
</author>
|
|
</authorgroup>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Peter</firstname>
|
|
<surname>Schultz</surname>
|
|
<contrib>Mit Beiträgen von </contrib>
|
|
</author>
|
|
<author>
|
|
<firstname>Tom</firstname>
|
|
<surname>Rhodes</surname>
|
|
</author>
|
|
</authorgroup>
|
|
</sect1info>
|
|
|
|
<title><acronym>ACPI</acronym>-Fehlersuche</title>
|
|
|
|
<indexterm>
|
|
<primary>ACPI</primary>
|
|
<secondary>Probleme mit</secondary>
|
|
</indexterm>
|
|
|
|
<para><acronym>ACPI</acronym> ist ein gänzlich neuer
|
|
Weg, um Geräte aufzufinden und deren Stromverbrauch
|
|
zu regulieren. Weiterhin bietet <acronym>ACPI</acronym>
|
|
einen einheitlichen Zugriff auf Geräte, die vorher
|
|
vom <acronym>BIOS</acronym> verwaltet wurden. Es werden
|
|
zwar Fortschritte gemacht, dass <acronym>ACPI</acronym>
|
|
auf allen Systemen läuft, doch tauchen immer wieder
|
|
Fehler auf: fehlerhafter Bytecode der
|
|
<acronym>ACPI</acronym>-Machine-Language
|
|
(<acronym>AML</acronym>) einiger Systemplatinen,
|
|
ein unvollständiges &os;-Kernel-Subsystem oder
|
|
Fehler im <acronym>ACPI-CA</acronym>-Interpreter von &intel;.</para>
|
|
|
|
<para>Dieser Abschnitt hilft Ihnen, zusammen mit den Betreuern
|
|
des &os;-<acronym>ACPI</acronym>-Subsystems, Fehlerquellen
|
|
zu finden und Fehler zu beseitigen. Danke, dass Sie diesen
|
|
Abschnitt lesen; hoffentlich hilft er, Ihre Systemprobleme
|
|
zu lösen.</para>
|
|
|
|
<sect2 id="ACPI-submitdebug">
|
|
<title>Fehlerberichte einreichen</title>
|
|
|
|
<note>
|
|
<para>Bevor Sie einen Fehlerbericht einreichen, stellen
|
|
Sie bitte sicher, dass Ihr <acronym>BIOS</acronym>
|
|
und die Firmware Ihres Controllers aktuell sind.</para>
|
|
</note>
|
|
|
|
<para>Wenn Sie sofort einen Fehlerbericht einsenden wollen,
|
|
schicken Sie bitte die folgenden Informationen an
|
|
die Mailingliste <ulink
|
|
url="mailto:freebsd-acpi@FreeBSD.org">freebsd-acpi</ulink>:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>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.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Die Ausgabe von &man.dmesg.8; nach der Eingabe
|
|
von <command>boot -v</command>.
|
|
Geben Sie auch alle Fehlermeldungen an, die erscheinen,
|
|
wenn Sie den Fehler provozieren.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Die Ausgabe von &man.dmesg.8; nach der Eingabe
|
|
von <command>boot -v</command> und mit deaktiviertem
|
|
<acronym>ACPI</acronym>, wenn das Problem ohne
|
|
<acronym>ACPI</acronym> nicht auftritt.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Die Ausgabe von <command>sysctl hw.acpi</command>.
|
|
Dieses Kommando zeigt die vom System unterstützten
|
|
<acronym>ACPI</acronym>-Funktionen an.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Die <acronym>URL</acronym>, unter der die
|
|
<acronym>ACPI</acronym>-Source-Language
|
|
(<acronym>ASL</acronym>) liegt. Schicken Sie
|
|
bitte <emphasis>nicht</emphasis> die <acronym>ASL</acronym>
|
|
an die Mailingliste, da die <acronym>ASL</acronym>
|
|
sehr groß sein kann. Eine Kopie der
|
|
<acronym>ASL</acronym> erstellen Sie mit dem
|
|
nachstehenden Befehl:</para>
|
|
|
|
<screen>&prompt.root; <userinput>acpidump -td > <replaceable>name</replaceable>-<replaceable>system</replaceable>.asl</userinput></screen>
|
|
|
|
<para>Setzen Sie bitte für <replaceable>name</replaceable>
|
|
den Namen Ihres Kontos und für
|
|
<replaceable>system</replaceable> den Hersteller und
|
|
das Modell Ihres Systems ein. Zum Beispiel:
|
|
<filename>njl-FooCo6000.asl</filename>.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>Obwohl die meisten Entwickler die Mailingliste
|
|
&a.current.name; lesen, sollten Sie Fehlerberichte an
|
|
die Liste &a.acpi.name; 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
|
|
(<acronym>PR</acronym>) mit &man.send-pr.1; einzusenden.
|
|
Geben Sie im Fehlerbericht bitte dieselben Informationen
|
|
wie oben an. Mithilfe der <acronym>PR</acronym>s
|
|
verfolgen und lösen wir Probleme. Senden Sie
|
|
bitte keinen <acronym>PR</acronym> ein, ohne vorher
|
|
den Fehlerbericht an die Liste &a.acpi.name; zu senden.
|
|
Wir benutzen die <acronym>PR</acronym>s als Erinnerung
|
|
an bestehende Probleme und nicht zum Sammeln aller
|
|
Probleme. Es kann sein, dass der Fehler schon von
|
|
jemand anderem gemeldet wurde.</para>
|
|
</sect2>
|
|
|
|
<sect2 id="ACPI-background">
|
|
<title><acronym>ACPI</acronym>-Grundlagen</title>
|
|
|
|
<indexterm>
|
|
<primary>ACPI</primary>
|
|
</indexterm>
|
|
|
|
<para><acronym>ACPI</acronym> gibt es in allen modernen Rechnern
|
|
der ia32- (x86), ia64- (Itanium) und amd64- (AMD) Architektur.
|
|
Der vollständige Standard bietet Funktionen
|
|
zur Steuerung und Verwaltung der <acronym>CPU</acronym>-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.</para>
|
|
|
|
<para>Ein <acronym>ACPI</acronym> konformes System
|
|
besitzt verschiedene Komponenten. Die <acronym>BIOS</acronym>-
|
|
und Chipsatz-Hersteller stellen mehrere statische
|
|
Tabellen bereit (zum Beispiel die
|
|
Fixed-<acronym>ACPI</acronym>-Description-Table,
|
|
<acronym>FADT</acronym>). Die Tabellen enthalten beispielsweise
|
|
die mit <acronym>SMP</acronym>-Systemen benutzte
|
|
<acronym>APIC</acronym>-Map, Konfigurationsregister und
|
|
einfache Konfigurationen. Zusätzlich gibt es die
|
|
Differentiated-System-Description-Table (<acronym>DSDT</acronym>),
|
|
die Bytecode enthält. Die Tabelle ordnet Geräte
|
|
und Methoden in einem baumartigen Namensraum an.</para>
|
|
|
|
<para>Ein <acronym>ACPI</acronym>-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 <acronym>ACPI</acronym>-Subsystem
|
|
kommunizieren. Für &os;, Linux und NetBSD hat &intel;
|
|
den Interpreter <acronym>ACPI-CA</acronym>, zur Verfügung
|
|
gestellt. Der Quelltext zu <acronym>ACPI-CA</acronym>
|
|
befindet sich im Verzeichnis
|
|
<filename class="directory">src/sys/contrib/dev/acpica</filename>.
|
|
Die Schnittstelle von <acronym>ACPI-CA</acronym> zu &os;
|
|
befindet sich unter <filename
|
|
class="directory">src/sys/dev/acpica/Osd</filename>.
|
|
Treiber, die verschiedene <acronym>ACPI</acronym>-Geräte
|
|
implementieren, befinden sich im Verzeichnis
|
|
<filename class="directory">src/sys/dev/acpica</filename>.</para>
|
|
</sect2>
|
|
|
|
<sect2 id="ACPI-comprob">
|
|
<title>Häufige Probleme</title>
|
|
|
|
<indexterm>
|
|
<primary>ACPI</primary>
|
|
<secondary>Probleme mit</secondary>
|
|
</indexterm>
|
|
|
|
<para>Damit <acronym>ACPI</acronym> richtig funktioniert,
|
|
müssen alle Teile funktionieren. Im Folgenden
|
|
finden Sie eine Liste mit Problemen und möglichen
|
|
Umgehungen oder Fehlerbehebungen. Die Liste ist nach
|
|
der Häufigkeit, mit der die Probleme auftreten,
|
|
sortiert.</para>
|
|
|
|
<sect3>
|
|
<title>Mausprobleme</title>
|
|
|
|
<para>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
|
|
<literal>hint.psm.0.flags="0x3000"</literal> in Ihre
|
|
<filename>/boot/loader.conf</filename> aufzunehmen. Besteht
|
|
das Problem weiterhin, sollten Sie einen Fehlerbericht
|
|
an das FreeBSD Project senden.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Suspend/Resume</title>
|
|
|
|
<para><acronym>ACPI</acronym> kennt drei
|
|
Suspend-to-<acronym>RAM</acronym>-Zustände
|
|
(<acronym>STR</acronym>):
|
|
<literal>S1</literal>-<literal>S3</literal>.
|
|
Es gibt einen Suspend-to-Disk-Zustand:
|
|
<literal>S4</literal>. Der Zustand <literal>S5</literal>
|
|
wird Soft-Off genannt. In diesem Zustand befindet
|
|
sich ein Rechner, wenn die Stromversorgung angeschlossen
|
|
ist, der Rechner aber nicht hochgefahren ist. Der
|
|
Zustand <literal>S4</literal> kann auf zwei Arten
|
|
implementiert werden:
|
|
<literal>S4</literal><acronym>BIOS</acronym> und
|
|
<literal>S4</literal><acronym>OS</acronym>.
|
|
Im ersten Fall wird der Suspend-to-Disk-Zustand durch
|
|
das <acronym>BIOS</acronym> hergestellt im zweiten
|
|
Fall alleine durch das Betriebssystem.</para>
|
|
|
|
<note>
|
|
<para>Die Suspend-Zustände sind Ruhezustände,
|
|
in denen der Rechner weniger Energie als im
|
|
Normalbetrieb benötigt. Resume bezeichnet
|
|
die Rückkehr zum Normalbetrieb.</para>
|
|
</note>
|
|
|
|
<para>Die Suspend-Zustände können Sie mit
|
|
dem Kommando <command>sysctl hw.acpi</command>
|
|
ermitteln. Das Folgende könnte beispielsweise
|
|
ausgegeben werden:</para>
|
|
|
|
<screen>hw.acpi.supported_sleep_state: S3 S4 S5
|
|
hw.acpi.s4bios: 0</screen>
|
|
|
|
<para>Diese Ausgabe besagt, dass mit dem Befehl
|
|
<command>acpiconf -s</command> die Zustände
|
|
<literal>S3</literal>, <literal>S4</literal><acronym>OS</acronym>
|
|
und <literal>S5</literal> eingestellt werden können.
|
|
Hätte <option>s4bios</option> den Wert
|
|
<literal>1</literal>, gäbe es den Zustand
|
|
<literal>S4</literal><acronym>BIOS</acronym> anstelle
|
|
von <literal>S4</literal><acronym>OS</acronym>.</para>
|
|
|
|
<para>Wenn Sie die Suspend- und Resume-Funktionen
|
|
testen, fangen Sie mit dem <literal>S1</literal>-Zustand
|
|
an, wenn er angeboten wird. Dieser Zustand wird
|
|
am ehesten funktionieren, da der Zustand wenig
|
|
Treiber-Unterstützung benötigt. Der Zustand
|
|
<literal>S2</literal> ist ähnlich wie
|
|
<literal>S1</literal>, allerdings hat ihn noch niemand
|
|
implementiert. Als nächstes sollten Sie den
|
|
Zustand <literal>S3</literal> ausprobieren. Dies
|
|
ist der tiefste <acronym>STR</acronym>-Schlafzustand.
|
|
Dieser Zustand ist auf massive Treiber-Unterstützung
|
|
angewiesen, um die Geräte wieder richtig zu
|
|
initialisieren. Wenn Sie Probleme mit diesem Zustand
|
|
haben, können Sie die Mailingliste
|
|
&a.acpi.name; anschreiben. Erwarten Sie allerdings
|
|
nicht zu viel: Es gibt viele Treiber und Geräte,
|
|
an denen noch gearbeitet und getestet wird.</para>
|
|
<!-- -->
|
|
<para>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:</para>
|
|
|
|
<screen>&prompt.root; <userinput>sysctl debug.bootverbose=1</userinput>
|
|
&prompt.root; <userinput>sysctl debug.acpi.suspend_bounce=1</userinput>
|
|
&prompt.root; <userinput>acpiconf -s 3</userinput></screen>
|
|
|
|
<para>Dieser Test emuliert einen Suspend/Resume-Zyklus für
|
|
alle Geräte (ohne dass diese dabei wirklich in den Status
|
|
<literal>S3</literal> 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
|
|
<literal>S3</literal> wechseln. Es kann also vorkommen, dass
|
|
manche Geräte weiterhin mit Strom versorgt werden (dies
|
|
wäre bei einem wirklichen Wechsel in den Status
|
|
<literal>S3</literal> NICHT möglich.
|
|
Andere Geräte werden normal weiterarbeiten, weil sie
|
|
über keine Suspend/Resume-Funktionen verfügen.</para>
|
|
|
|
<para>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.</para>
|
|
|
|
<para>Um das Problem einzugrenzen, entfernen Sie soviele
|
|
Treiber wie möglich aus dem Kernel. Sie können
|
|
das Problem isolieren, indem Sie einen Treiber nach
|
|
dem anderen laden, bis der Fehler wieder auftritt.
|
|
Typischerweise verursachen binäre Treiber wie
|
|
<filename>nvidia.ko</filename>, X11-Grafiktreiber und
|
|
<acronym>USB</acronym>-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 die Dateien
|
|
<filename>/etc/rc.suspend</filename> und
|
|
<filename>/etc/rc.resume</filename> 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 bitte die
|
|
Variable <option>hw.acpi.reset_video</option> auf
|
|
<literal>0</literal>. Versuchen Sie auch, die Variable
|
|
<option>hw.acpi.sleep_delay</option> auf kürzere
|
|
Zeitspannen zu setzen.</para>
|
|
|
|
<para>Die Suspend- und Resume-Funktionen können
|
|
Sie auch auf einer neuen Linux-Distribution
|
|
mit <acronym>ACPI</acronym> testen. Wenn es mit
|
|
Linux funktioniert, liegt das Problem wahrscheinlich
|
|
bei einem &os;-Treiber. Es hilft uns, das Problem
|
|
zu lösen, wenn Sie feststellen können, welcher
|
|
Treiber das Problem verursacht. Beachten Sie bitte,
|
|
dass die <acronym>ACPI</acronym>-Entwickler normalerweise
|
|
keine anderen Treiber pflegen (beispielsweise Sound- oder
|
|
<acronym>ATA</acronym>-Treiber). Es ist wohl das beste,
|
|
die Ergebnisse der Fehlersuche an die Mailingliste
|
|
&a.current.name; und den Entwickler des Treibers
|
|
zu schicken. Wenn Ihnen danach ist, versuchen Sie,
|
|
den Fehler in der Resume-Funktion zu finden, indem
|
|
Sie einige &man.printf.3;-Anweisungen in den Code
|
|
des fehlerhaften Treibers einfügen.</para>
|
|
|
|
<para>Schließlich können Sie <acronym>ACPI</acronym>
|
|
noch abschalten und stattdessen <acronym>APM</acronym>
|
|
verwenden. Wenn die Suspend- und Resume-Funktionen mit
|
|
<acronym>APM</acronym> funktionieren, sollten Sie
|
|
vielleicht besser <acronym>APM</acronym> verwenden
|
|
(insbesondere mit alter Hardware von vor dem Jahr 2000).
|
|
Die Hersteller benötigten einige Zeit, um
|
|
<acronym>ACPI</acronym> korrekt zu implementieren, daher
|
|
gibt es mit älterer Hardware oft
|
|
<acronym>ACPI</acronym>-Probleme.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Temporäre oder permanente Systemhänger</title>
|
|
|
|
<para>Die meisten Systemhänger entstehen durch verlorene
|
|
Interrupts oder einen Interrupt-Sturm.
|
|
Probleme werden verursacht durch die Art, in der das
|
|
<acronym>BIOS</acronym> Interrupts vor dem Systemstart
|
|
konfiguriert, durch eine fehlerhafte
|
|
<acronym>APIC</acronym>-Tabelle und durch die
|
|
Zustellung des System-Control-Interrupts
|
|
(<acronym>SCI</acronym>).</para>
|
|
|
|
<indexterm>
|
|
<primary>Interrupt-Sturm</primary>
|
|
</indexterm>
|
|
|
|
<para>Anhand der Ausgabe des Befehls
|
|
<command>vmstat -i</command> können Sie verlorene
|
|
Interrupts von einem Interrupt-Sturm unterscheiden.
|
|
Untersuchen Sie die Ausgabezeile, die <literal>acpi0</literal>
|
|
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
|
|
<keycombo action="simul">
|
|
<keycap>Ctrl</keycap>
|
|
<keycap>Alt</keycap>
|
|
<keycap>Esc</keycap>
|
|
</keycombo> in den Debugger <acronym>DDB</acronym>
|
|
zu gelangen. Geben Sie dort den Befehl
|
|
<literal>show interrupts</literal> ein.</para>
|
|
|
|
<indexterm>
|
|
<primary>APIC</primary>
|
|
<secondary>deaktivieren</secondary>
|
|
</indexterm>
|
|
|
|
<para>Wenn Sie Interrupt-Probleme haben, ist es vorerst
|
|
wohl am besten, <acronym>APIC</acronym> zu deaktivieren.
|
|
Tragen Sie dazu die Zeile
|
|
<literal>hint.apic.0.disabled="1"</literal> in
|
|
<filename>loader.conf</filename> ein.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Abstürze (Panics)</title>
|
|
|
|
<para><foreignphrase>Panics</foreignphrase> werden so
|
|
schnell wie möglich behoben; mit <acronym>ACPI</acronym>
|
|
kommt es aber selten dazu. Zuerst sollten Sie
|
|
die Panic reproduzieren und dann versuchen einen
|
|
<foreignphrase>backtrace</foreignphrase> (eine
|
|
Rückverfolgung der Funktionsaufrufe) zu erstellen.
|
|
Richten Sie dazu den <acronym>DDB</acronym> über
|
|
die serielle Schnittstelle (siehe
|
|
<xref linkend="serialconsole-ddb"/>) oder eine gesonderte
|
|
&man.dump.8;-Partition ein. In <acronym>DDB</acronym>
|
|
können Sie den <foreignphrase>backtrace</foreignphrase>
|
|
mit dem Kommando <literal>tr</literal> erstellen.
|
|
Falls Sie den <foreignphrase>backtrace</foreignphrase>
|
|
vom Bildschirm abschreiben müssen, schreiben
|
|
Sie bitte mindestens die fünf ersten und die
|
|
fünf letzten Zeile der Ausgabe auf.</para>
|
|
|
|
<para>Versuchen Sie anschließend, das Problem
|
|
durch einen Neustart ohne <acronym>ACPI</acronym>
|
|
zu beseitigen. Wenn das funktioniert hat, können
|
|
Sie versuchen, das verantwortliche
|
|
<acronym>ACPI</acronym>-Subsystem durch Setzen der
|
|
Variablen <option>debug.acpi.disable</option>
|
|
herauszufinden. Die Hilfeseite &man.acpi.4; enthält
|
|
dazu einige Beispiele.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Nach einem Suspend oder einem Stopp startet
|
|
das System wieder</title>
|
|
|
|
<para>Setzen Sie zuerst in &man.loader.conf.5; die Variable
|
|
<option>hw.acpi.disable_on_poweroff</option> auf
|
|
<literal>0</literal>. Damit wird verhindert, dass
|
|
<acronym>ACPI</acronym> während des Systemabschlusses
|
|
die Bearbeitung verschiedener Ereignisse deaktiviert.
|
|
Auf manchen Systemen muss die Variable den Wert
|
|
<literal>1</literal> besitzen (die Voreinstellung).
|
|
Normalerweise wird der unerwünschte Neustart
|
|
des Systems durch Setzen dieser Variablen behoben.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Andere Probleme</title>
|
|
|
|
<para>Wenn Sie weitere Probleme mit <acronym>ACPI</acronym>
|
|
haben (Umgang mit einer Docking-Station, nicht erkannte
|
|
Geräte), schicken Sie bitte eine Beschreibung an die
|
|
Mailingliste. Allerdings kann es sein, dass einige
|
|
Probleme von noch unvollständigen Teilen des
|
|
<acronym>ACPI</acronym>-Subsystems abhängen und
|
|
es etwas dauern kann bis diese Teile fertig sind.
|
|
Seien Sie geduldig und rechnen Sie damit, dass wir
|
|
Ihnen Fehlerbehebungen zum Testen senden.</para>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2 id="ACPI-aslanddump">
|
|
<title><acronym>ASL</acronym>, <command>acpidump</command> und
|
|
<acronym>IASL</acronym></title>
|
|
|
|
<indexterm>
|
|
<primary>ACPI</primary>
|
|
<secondary>ASL</secondary>
|
|
</indexterm>
|
|
|
|
<para>Ein häufiges Problem ist fehlerhafter Bytecode
|
|
des <acronym>BIOS</acronym>-Herstellers. Dies erkennen
|
|
Sie an Kernelmeldungen auf der Konsole wie die folgende:</para>
|
|
|
|
<screen>ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
|
|
(Node 0xc3f6d160), AE_NOT_FOUND</screen>
|
|
|
|
<para>Oft können Sie das Problem dadurch lösen,
|
|
dass Sie eine aktuelle <acronym>BIOS</acronym>-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 mit der
|
|
<acronym>AML</acronym>-Machine-Language
|
|
(<acronym>AML</acronym>) suchen. Der Bytecode der
|
|
<acronym>AML</acronym> wird aus der
|
|
<acronym>ACPI</acronym>-Source-Language (<acronym>ASL</acronym>)
|
|
übersetzt und in einer Tabelle, der <acronym>DSDT</acronym>,
|
|
abgelegt. Eine Kopie der <acronym>ASL</acronym>
|
|
können Sie mit dem Befehl &man.acpidump.8; erstellen.
|
|
Verwenden Sie mit diesem Befehl sowohl die Option
|
|
<option>-t</option> (die Inhalte der statischen
|
|
Tabellen anzeigen) als auch die Option <option>-d</option>
|
|
(die <acronym>AML</acronym> in <acronym>ASL</acronym>
|
|
zurückübersetzen). Ein Beispiel für
|
|
die Syntax finden Sie im Abschnitt <link
|
|
linkend="ACPI-submitdebug">Fehlerberichte einreichen</link>.</para>
|
|
|
|
<para>Sie können einfach prüfen, ob sich die
|
|
<acronym>ASL</acronym> übersetzen lässt.
|
|
Für gewöhnlich können Sie Warnungen
|
|
während des Übersetzens ignorieren.
|
|
Fehlermeldungen führen normal dazu, dass
|
|
<acronym>ACPI</acronym> fehlerhaft arbeitet. Ihre
|
|
<acronym>ASL</acronym> übersetzen Sie mit dem
|
|
nachstehenden Kommando:</para>
|
|
|
|
<screen>&prompt.root; <userinput>iasl ihre.asl</userinput></screen>
|
|
</sect2>
|
|
|
|
<sect2 id="ACPI-fixasl">
|
|
<title>Die <acronym>ASL</acronym> reparieren</title>
|
|
|
|
<indexterm>
|
|
<primary>ACPI</primary>
|
|
<secondary>ASL</secondary>
|
|
</indexterm>
|
|
|
|
<para>Auf lange Sicht ist es unser Ziel, dass
|
|
<acronym>ACPI</acronym> ohne Eingriffe des Benutzers
|
|
läuft. Zurzeit entwickeln wir allerdings noch
|
|
Umgehungen für Fehler der <acronym>BIOS</acronym>-Hersteller.
|
|
Der µsoft;-Interpreter (<filename>acpi.sys</filename>
|
|
und <filename>acpiec.sys</filename>) prüft die
|
|
<acronym>ASL</acronym> nicht streng gegen den Standard.
|
|
Daher reparieren <acronym>BIOS</acronym>-Hersteller,
|
|
die <acronym>ACPI</acronym> nur unter &windows; testen,
|
|
ihre <acronym>ASL</acronym> nicht. Wir hoffen, dass
|
|
wir das vom Standard abweichende Verhalten des
|
|
µsoft;-Interpreters dokumentieren und in &os; replizieren
|
|
können. Dadurch müssen Benutzer ihre
|
|
<acronym>ASL</acronym> nicht selbst reparieren.
|
|
Sie können Ihre <acronym>ASL</acronym> selbst reparieren,
|
|
wenn Sie ein Problem umgehen und uns helfen möchten.
|
|
Senden Sie uns bitte die mit &man.diff.1; erstellte Differenz
|
|
zwischen alter und neuer <acronym>ASL</acronym>. Wir
|
|
werden versuchen, den Interpreter <acronym>ACPI-CA</acronym>
|
|
zu korrigieren, damit die Fehlerbehebung nicht mehr
|
|
erforderlich ist.</para>
|
|
|
|
<indexterm>
|
|
<primary>ACPI</primary>
|
|
<secondary>Fehlermeldungen</secondary>
|
|
</indexterm>
|
|
|
|
<para>Die nachfolgende Liste enthält häufige
|
|
Fehlermeldungen, deren Ursache und eine Beschreibung,
|
|
wie die Fehler korrigiert werden:</para>
|
|
|
|
<sect3>
|
|
<title>Abhängigkeiten vom Betriebssystem</title>
|
|
|
|
<para>Einige <acronym>AML</acronym>s gehen davon aus, dass
|
|
die Welt ausschließlich aus verschiedenen
|
|
&windows;-Versionen besteht. &os; kann vorgeben, irgendein
|
|
Betriebssystem zu sein. Versuchen Sie das Betriebssystem,
|
|
das Sie in der <acronym>ASL</acronym> finden, in der
|
|
Datei <filename>/boot/loader.conf</filename> anzugeben:
|
|
<literal>hw.acpi.osname="Windows 2001"</literal>.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Fehlende Return-Anweisungen</title>
|
|
|
|
<para>Einige Methoden verzichten auf die vom Standard
|
|
vorgeschriebene Rückgabe eines Wertes. Obwohl
|
|
der Interpreter <acronym>ACPI-CA</acronym> dies nicht
|
|
beheben kann, besitzt &os; die Möglichkeit, den
|
|
Rückgabewert implizit zu setzen. Wenn Sie
|
|
wissen, welcher Wert zurückgegeben werden muss,
|
|
können Sie die fehlenden Return-Anweisungen
|
|
selbst einsetzen. Die Option <option>-f</option>
|
|
zwingt <command>iasl</command>, die <acronym>ASL</acronym>
|
|
zu übersetzen.</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Überschreiben der vorgegebenen
|
|
<acronym>AML</acronym></title>
|
|
|
|
<para>Nachdem Sie Ihre <acronym>ASL</acronym> in der
|
|
Datei <filename>ihre.asl</filename> angepasst haben,
|
|
übersetzen Sie die <acronym>ASL</acronym> wie folgt:</para>
|
|
|
|
<screen>&prompt.root; <userinput>iasl ihre.asl</userinput></screen>
|
|
|
|
<para>Mit der Option <option>-f</option> erzwingen Sie das
|
|
Erstellen der <acronym>AML</acronym> auch wenn während
|
|
der Übersetzung Fehler auftreten. Beachten Sie,
|
|
dass einige Fehler, wie fehlende Return-Anweisungen,
|
|
automatisch vom Interpreter umgangen werden.</para>
|
|
|
|
<para>In der Voreinstellung erstellt der Befehl
|
|
<command>iasl</command> die Ausgabedatei
|
|
<filename>DSDT.aml</filename>. Wenn Sie diese Datei
|
|
anstelle der fehlerhaften Kopie des <acronym>BIOS</acronym>
|
|
laden wollen, editieren Sie <filename>/boot/loader.conf</filename>
|
|
wie folgt:</para>
|
|
|
|
<programlisting>acpi_dsdt_load="YES"
|
|
acpi_dsdt_name="/boot/DSDT.aml"</programlisting>
|
|
|
|
<para>Stellen Sie bitte sicher, dass sich die Datei
|
|
<filename>DSDT.aml</filename> im Verzeichnis
|
|
<filename class="directory">/boot</filename> befindet.</para>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2 id="ACPI-debugoutput">
|
|
<title><acronym>ACPI</acronym>-Meldungen zur
|
|
Fehlersuche erzeugen</title>
|
|
|
|
<indexterm>
|
|
<primary>ACPI</primary>
|
|
<secondary>Probleme mit</secondary>
|
|
</indexterm>
|
|
|
|
<indexterm>
|
|
<primary>ACPI</primary>
|
|
<secondary>Fehlersuche</secondary>
|
|
</indexterm>
|
|
|
|
<para>Der <acronym>ACPI</acronym>-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 so genannte
|
|
<quote>layers</quote> angegeben. Die Subsysteme sind in
|
|
<acronym>ACPI-CA</acronym>-Komponenten
|
|
(<literal>ACPI_ALL_COMPONENTS</literal>) und
|
|
<acronym>ACPI</acronym>-Hardware (<literal>ACPI_ALL_DRIVERS</literal>)
|
|
aufgeteilt. Welche Meldungen ausgegeben werden, wird über
|
|
<quote>level</quote> gesteuert. <quote>level</quote> reicht
|
|
von <literal>ACPI_LV_ERROR</literal> (es werden nur Fehler
|
|
ausgegeben) bis zu <literal>ACPI_LV_VERBOSE</literal> (alles
|
|
wird ausgegeben). <quote>level</quote> 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 sollten Sie die Ausgaben mithilfe einer
|
|
seriellen Konsole sichern. Die möglichen Werte
|
|
für <quote>layers</quote> und <quote>level</quote>
|
|
werden in der Hilfeseite &man.acpi.4; beschrieben.</para>
|
|
|
|
<para>Die Ausgaben zur Fehlersuche sind in der Voreinstellung
|
|
nicht aktiviert. Wenn <acronym>ACPI</acronym> im Kernel
|
|
enthalten ist, fügen Sie <literal>options ACPI_DEBUG</literal>
|
|
zur Kernelkonfigurationsdatei hinzu. Sie können die
|
|
Ausgaben zur Fehlersuche global aktivieren, indem Sie in der
|
|
Datei <filename>/etc/make.conf</filename> die Zeile
|
|
<literal>ACPI_DEBUG=1</literal> einfügen. Das Modul
|
|
<filename>acpi.ko</filename> können Sie wie folgt
|
|
neu übersetzen:</para>
|
|
|
|
<screen>&prompt.root; <userinput>cd /sys/modules/acpi/acpi
|
|
&& make clean &&
|
|
make ACPI_DEBUG=1</userinput></screen>
|
|
|
|
<para>Installieren Sie anschließend
|
|
<filename>acpi.ko</filename> im Verzeichnis
|
|
<filename class="directory">/boot/kernel</filename>.
|
|
In der Datei <filename>loader.conf</filename> stellen Sie
|
|
<quote>level</quote> und <quote>layer</quote> ein. Das
|
|
folgende Beispiel aktiviert die Ausgabe von Fehlern für
|
|
alle <acronym>ACPI-CA</acronym>-Komponenten und alle
|
|
<acronym>ACPI</acronym>-Hardwaretreiber (wie
|
|
<acronym>CPU</acronym>, <acronym>LID</acronym>):</para>
|
|
|
|
<programlisting>debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
|
|
debug.acpi.level="ACPI_LV_ERROR"</programlisting>
|
|
|
|
<para>Wenn ein Problem durch ein bestimmtes Ereignis,
|
|
beispielsweise den Start nach einem Ruhezustand, hervorgerufen
|
|
wird, können Sie die Einstellungen für
|
|
<quote>level</quote> und <quote>layer</quote> auch mit dem
|
|
Kommando <command>sysctl</command> vornehmen. In diesem
|
|
Fall müssen Sie die Datei <filename>loader.conf</filename>
|
|
nicht editieren. Auf der <command>sysctl</command>-Kommandozeile
|
|
geben Sie dieselben Variablennamen wie in
|
|
<filename>loader.conf</filename> an.</para>
|
|
</sect2>
|
|
|
|
<sect2 id="ACPI-References">
|
|
<title>ACPI-Informationsquellen</title>
|
|
|
|
<para>Weitere Informationen zu <acronym>ACPI</acronym>
|
|
erhalten Sie an den folgenden Stellen:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>die &a.acpi; Mailingliste,</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>die Archive der <acronym>ACPI</acronym>-Mailingliste:
|
|
<ulink url="http://lists.FreeBSD.org/pipermail/freebsd-acpi/"></ulink>,</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>die alten Archive der <acronym>ACPI</acronym>-Mailingliste:
|
|
<ulink url="http://home.jp.FreeBSD.org/mail-list/acpi-jp/"></ulink>,</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>die <acronym>ACPI</acronym>-Spezifikation (Version 2.0):
|
|
<ulink url="http://acpi.info/spec.htm"></ulink>,</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>in den nachstehenden &os;-Hilfeseiten:
|
|
&man.acpi.4;, &man.acpi.thermal.4;, &man.acpidump.8;,
|
|
&man.iasl.8; und &man.acpidb.8;,</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para><ulink
|
|
url="http://www.cpqlinux.com/acpi-howto.html#fix_broken_dsdt">
|
|
<acronym>DSDT</acronym> debugging resource</ulink>
|
|
(als Beispiel wird Compaq erläutert, die
|
|
Ressource ist aber dennoch nützlich).</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|